summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
author(no author) <(no author)@afe2bf4a-e733-0410-8a33-86f594647bc7>2005-08-08 20:01:03 (GMT)
committer(no author) <(no author)@afe2bf4a-e733-0410-8a33-86f594647bc7>2005-08-08 20:01:03 (GMT)
commit001e27ddbb1bfaa351b5f268b22418fb0557d6c2 (patch)
treea390a2400721fd1ed137738bd2679ab33ed0306f
parent0559d5795f6e2adc993577a4dd55b5370d31677c (diff)
downloadDoxygen-001e27ddbb1bfaa351b5f268b22418fb0557d6c2.zip
Doxygen-001e27ddbb1bfaa351b5f268b22418fb0557d6c2.tar.gz
Doxygen-001e27ddbb1bfaa351b5f268b22418fb0557d6c2.tar.bz2
This commit was manufactured by cvs2svn to create tagRelease_1_4_4_20050804
'Release_1_4_4_20050804'.
-rw-r--r--.cvsignore6
-rw-r--r--CVSROOT/checkoutlist13
-rw-r--r--CVSROOT/commitinfo15
-rw-r--r--CVSROOT/config9
-rw-r--r--CVSROOT/cvswrappers23
-rw-r--r--CVSROOT/editinfo21
-rw-r--r--CVSROOT/loginfo26
-rw-r--r--CVSROOT/modules27
-rw-r--r--CVSROOT/notify12
-rw-r--r--CVSROOT/rcsinfo13
-rw-r--r--CVSROOT/taginfo20
-rw-r--r--CVSROOT/verifymsg21
-rw-r--r--Doxyfile242
-rw-r--r--INSTALL7
-rw-r--r--LANGUAGE.HOWTO49
-rw-r--r--LICENSE340
-rw-r--r--Makefile.in109
-rw-r--r--Makefile.win_make.in33
-rw-r--r--Makefile.win_nmake.in52
-rw-r--r--PLATFORMS28
-rw-r--r--README20
-rw-r--r--addon/doxmlparser/Doxyfile177
-rw-r--r--addon/doxmlparser/Doxyfile.impl179
-rw-r--r--addon/doxmlparser/examples/metrics/.cvsignore4
-rw-r--r--addon/doxmlparser/examples/metrics/Makefile.in13
-rw-r--r--addon/doxmlparser/examples/metrics/main.cpp254
-rw-r--r--addon/doxmlparser/examples/metrics/metrics.pro.in20
-rw-r--r--addon/doxmlparser/include/doxmlintf.h1101
-rw-r--r--addon/doxmlparser/src/.cvsignore3
-rw-r--r--addon/doxmlparser/src/Makefile.in13
-rw-r--r--addon/doxmlparser/src/basehandler.cpp3
-rw-r--r--addon/doxmlparser/src/basehandler.h325
-rw-r--r--addon/doxmlparser/src/baseiterator.h50
-rw-r--r--addon/doxmlparser/src/compoundhandler.cpp650
-rw-r--r--addon/doxmlparser/src/compoundhandler.h236
-rw-r--r--addon/doxmlparser/src/debug.cpp24
-rw-r--r--addon/doxmlparser/src/debug.h7
-rw-r--r--addon/doxmlparser/src/dochandler.cpp2241
-rw-r--r--addon/doxmlparser/src/dochandler.h1352
-rw-r--r--addon/doxmlparser/src/doxmlintf.h1101
-rw-r--r--addon/doxmlparser/src/doxmlparser.pro.in27
-rw-r--r--addon/doxmlparser/src/graphhandler.cpp216
-rw-r--r--addon/doxmlparser/src/graphhandler.h154
-rw-r--r--addon/doxmlparser/src/linkedtexthandler.cpp133
-rw-r--r--addon/doxmlparser/src/linkedtexthandler.h54
-rw-r--r--addon/doxmlparser/src/loamhandler.cpp75
-rw-r--r--addon/doxmlparser/src/loamhandler.h52
-rw-r--r--addon/doxmlparser/src/mainhandler.cpp299
-rw-r--r--addon/doxmlparser/src/mainhandler.h82
-rw-r--r--addon/doxmlparser/src/memberhandler.cpp600
-rw-r--r--addon/doxmlparser/src/memberhandler.h252
-rw-r--r--addon/doxmlparser/src/paramhandler.cpp158
-rw-r--r--addon/doxmlparser/src/paramhandler.h103
-rw-r--r--addon/doxmlparser/src/sectionhandler.cpp168
-rw-r--r--addon/doxmlparser/src/sectionhandler.h102
-rw-r--r--addon/doxmlparser/src/stringimpl.h28
-rw-r--r--addon/doxmlparser/test/.cvsignore3
-rw-r--r--addon/doxmlparser/test/Makefile.in13
-rw-r--r--addon/doxmlparser/test/main.cpp759
-rw-r--r--addon/doxmlparser/test/xmlparse.pro.in20
-rw-r--r--addon/doxywizard/.cvsignore8
-rw-r--r--addon/doxywizard/Makefile.in42
-rw-r--r--addon/doxywizard/Makefile.win_nmake.in38
-rw-r--r--addon/doxywizard/README3
-rw-r--r--addon/doxywizard/doxywizard.cpp1424
-rw-r--r--addon/doxywizard/doxywizard.h292
-rw-r--r--addon/doxywizard/doxywizard.pro.in59
-rwxr-xr-xaddon/doxywizard/doxywizard.resbin13464 -> 0 bytes
-rw-r--r--addon/doxywizard/doxywizard.t45
-rw-r--r--addon/doxywizard/expert.cpp276
-rw-r--r--addon/doxywizard/expert.h82
-rw-r--r--addon/doxywizard/input.h14
-rw-r--r--addon/doxywizard/inputbool.cpp59
-rw-r--r--addon/doxywizard/inputbool.h50
-rw-r--r--addon/doxywizard/inputint.cpp65
-rw-r--r--addon/doxywizard/inputint.h53
-rw-r--r--addon/doxywizard/inputstring.cpp187
-rw-r--r--addon/doxywizard/inputstring.h69
-rw-r--r--addon/doxywizard/inputstrlist.cpp210
-rw-r--r--addon/doxywizard/inputstrlist.h71
-rw-r--r--addon/doxywizard/qtbc.h45
-rw-r--r--addon/doxywizard/version.cpp1
-rw-r--r--addon/doxywizard/version.h23
-rwxr-xr-xconfigure545
-rw-r--r--doc/.cvsignore1
-rw-r--r--doc/Doxyfile50
-rw-r--r--doc/Makefile.in36
-rw-r--r--doc/Makefile.latex31
-rw-r--r--doc/Makefile.win_make.in36
-rw-r--r--doc/Makefile.win_nmake.in38
-rw-r--r--doc/arch.doc241
-rw-r--r--doc/archoverview.eps380
-rw-r--r--doc/archoverview.gifbin7822 -> 0 bytes
-rw-r--r--doc/autolink.doc121
-rw-r--r--doc/commands.doc2204
-rw-r--r--doc/config.doc1913
-rw-r--r--doc/diagrams.doc140
-rw-r--r--doc/docblocks.doc396
-rw-r--r--doc/doxygen.146
-rw-r--r--doc/doxygen.sty72
-rw-r--r--doc/doxygen_logo.eps6322
-rw-r--r--doc/doxygen_logo.gifbin29863 -> 0 bytes
-rw-r--r--doc/doxygen_logo_low.gifbin3952 -> 0 bytes
-rw-r--r--doc/doxygen_manual.tex78
-rw-r--r--doc/doxygen_usage.doc97
-rw-r--r--doc/doxysearch_usage.doc180
-rw-r--r--doc/doxytag.120
-rw-r--r--doc/doxytag_usage.doc97
-rw-r--r--doc/doxywizard.110
-rw-r--r--doc/doxywizard.gifbin18928 -> 0 bytes
-rw-r--r--doc/doxywizard_expert.pngbin30056 -> 0 bytes
-rw-r--r--doc/doxywizard_main.pngbin57204 -> 0 bytes
-rw-r--r--doc/doxywizard_menu.pngbin58661 -> 0 bytes
-rw-r--r--doc/doxywizard_page1.pngbin39646 -> 0 bytes
-rw-r--r--doc/doxywizard_page2.pngbin39048 -> 0 bytes
-rw-r--r--doc/doxywizard_page3.pngbin50904 -> 0 bytes
-rw-r--r--doc/doxywizard_page4.pngbin43718 -> 0 bytes
-rw-r--r--doc/doxywizard_usage.doc138
-rw-r--r--doc/external.doc138
-rw-r--r--doc/faq.doc320
-rw-r--r--doc/features.doc97
-rw-r--r--doc/formulas.doc107
-rw-r--r--doc/grouping.doc225
-rw-r--r--doc/history.doc126
-rw-r--r--doc/htmlcmds.doc131
-rw-r--r--doc/index.doc201
-rw-r--r--doc/infoflow.eps607
-rw-r--r--doc/infoflow.fig226
-rw-r--r--doc/infoflow.gifbin24468 -> 0 bytes
-rw-r--r--doc/install.doc592
-rw-r--r--doc/install_prefix2
-rw-r--r--doc/installdox_usage.doc62
-rw-r--r--doc/language.doc664
-rw-r--r--doc/language.tpl357
-rw-r--r--doc/lists.doc119
-rw-r--r--doc/maintainers.txt116
-rw-r--r--doc/output.doc56
-rw-r--r--doc/perlmod.doc190
-rw-r--r--doc/perlmod_tree.doc377
-rw-r--r--doc/preprocessing.doc263
-rw-r--r--doc/starting.doc287
-rw-r--r--doc/translator.py1898
-rw-r--r--doc/translator_report.txt713
-rw-r--r--doc/trouble.doc142
-rw-r--r--doc/xmlcmds.doc90
-rw-r--r--examples/.cvsignore1
-rw-r--r--examples/Makefile.in112
-rw-r--r--examples/Makefile.win.in110
-rw-r--r--examples/afterdoc.cfg9
-rw-r--r--examples/afterdoc.h18
-rw-r--r--examples/author.cfg9
-rw-r--r--examples/author.cpp14
-rw-r--r--examples/autolink.cfg9
-rw-r--r--examples/autolink.cpp99
-rw-r--r--examples/class.cfg9
-rw-r--r--examples/class.h11
-rw-r--r--examples/define.cfg10
-rw-r--r--examples/define.h18
-rw-r--r--examples/diagrams.cfg13
-rw-r--r--examples/diagrams_a.h4
-rw-r--r--examples/diagrams_b.h5
-rw-r--r--examples/diagrams_c.h6
-rw-r--r--examples/diagrams_d.h7
-rw-r--r--examples/diagrams_e.h5
-rw-r--r--examples/docstring.cfg9
-rw-r--r--examples/docstring.py26
-rw-r--r--examples/enum.cfg9
-rw-r--r--examples/enum.h24
-rw-r--r--examples/example.cfg11
-rw-r--r--examples/example.cpp19
-rw-r--r--examples/example.tag14
-rw-r--r--examples/example_test.cpp5
-rw-r--r--examples/file.cfg9
-rw-r--r--examples/file.h10
-rw-r--r--examples/func.cfg9
-rw-r--r--examples/func.h21
-rw-r--r--examples/group.cfg9
-rw-r--r--examples/group.cpp88
-rw-r--r--examples/include.cfg10
-rw-r--r--examples/include.cpp22
-rw-r--r--examples/jdstyle.cfg9
-rw-r--r--examples/jdstyle.cpp66
-rw-r--r--examples/memgrp.cfg10
-rw-r--r--examples/memgrp.cpp41
-rw-r--r--examples/overload.cfg10
-rw-r--r--examples/overload.cpp25
-rw-r--r--examples/page.cfg9
-rw-r--r--examples/page.doc14
-rw-r--r--examples/par.cfg9
-rw-r--r--examples/par.cpp20
-rw-r--r--examples/pyexample.cfg9
-rw-r--r--examples/pyexample.py29
-rw-r--r--examples/qtstyle.cfg9
-rw-r--r--examples/qtstyle.cpp65
-rw-r--r--examples/relates.cfg9
-rw-r--r--examples/relates.cpp23
-rw-r--r--examples/restypedef.cfg9
-rw-r--r--examples/restypedef.cpp25
-rw-r--r--examples/structcmd.cfg9
-rw-r--r--examples/structcmd.h57
-rw-r--r--examples/tag.cfg11
-rw-r--r--examples/tag.cpp9
-rw-r--r--examples/templ.cfg9
-rw-r--r--examples/templ.cpp35
-rw-r--r--libmd5/.cvsignore3
-rw-r--r--libmd5/Makefile.in16
-rw-r--r--libmd5/libmd5.pro.in10
-rw-r--r--libmd5/md5.c352
-rw-r--r--libmd5/md5.h52
-rw-r--r--libmd5/md5_loc.h27
-rw-r--r--libpng/.cvsignore3
-rw-r--r--libpng/LICENSE102
-rw-r--r--libpng/Makefile.in16
-rw-r--r--libpng/README2
-rw-r--r--libpng/adler32.c45
-rw-r--r--libpng/compress.c59
-rw-r--r--libpng/crc32.c159
-rw-r--r--libpng/deflate.c1306
-rw-r--r--libpng/deflate.h318
-rw-r--r--libpng/gzio.c831
-rw-r--r--libpng/infblock.c388
-rw-r--r--libpng/infblock.h39
-rw-r--r--libpng/infcodes.c246
-rw-r--r--libpng/infcodes.h27
-rw-r--r--libpng/inffast.c183
-rw-r--r--libpng/inffast.h17
-rw-r--r--libpng/inffixed.h151
-rw-r--r--libpng/inflate.c350
-rw-r--r--libpng/inftrees.c456
-rw-r--r--libpng/inftrees.h58
-rw-r--r--libpng/infutil.c84
-rw-r--r--libpng/infutil.h98
-rw-r--r--libpng/libpng.pro.in53
-rw-r--r--libpng/png.c777
-rw-r--r--libpng/png.h3200
-rw-r--r--libpng/pngasmrd.h11
-rw-r--r--libpng/pngconf.h1331
-rw-r--r--libpng/pngerror.c289
-rw-r--r--libpng/pnggccrd.c5340
-rw-r--r--libpng/pngget.c917
-rw-r--r--libpng/pngmem.c517
-rw-r--r--libpng/pngpread.c1502
-rw-r--r--libpng/pngread.c1398
-rw-r--r--libpng/pngrio.c161
-rw-r--r--libpng/pngrtran.c4137
-rw-r--r--libpng/pngrutil.c3005
-rw-r--r--libpng/pngset.c1033
-rw-r--r--libpng/pngtrans.c640
-rw-r--r--libpng/pngvcrd.c3845
-rw-r--r--libpng/pngwio.c228
-rw-r--r--libpng/pngwrite.c1432
-rw-r--r--libpng/pngwtran.c563
-rw-r--r--libpng/pngwutil.c2669
-rw-r--r--libpng/trees.c1204
-rw-r--r--libpng/trees.h128
-rw-r--r--libpng/uncompr.c54
-rw-r--r--libpng/zconf.h279
-rw-r--r--libpng/zlib.h893
-rw-r--r--libpng/zutil.c210
-rw-r--r--libpng/zutil.h220
-rw-r--r--make.bat60
-rw-r--r--packages/rpm/build.sh21
-rw-r--r--packages/rpm/doxygen.spec150
-rw-r--r--qtools/.cvsignore3
-rw-r--r--qtools/Doxyfile1144
-rw-r--r--qtools/LICENSE.GPL349
-rw-r--r--qtools/LICENSE.QPL103
-rw-r--r--qtools/Makefile.in30
-rw-r--r--qtools/README4
-rw-r--r--qtools/qarray.doc486
-rw-r--r--qtools/qarray.h110
-rw-r--r--qtools/qasciidict.h107
-rw-r--r--qtools/qbuffer.cpp465
-rw-r--r--qtools/qbuffer.h98
-rw-r--r--qtools/qcache.h148
-rw-r--r--qtools/qcollection.cpp182
-rw-r--r--qtools/qcollection.h74
-rw-r--r--qtools/qconfig.h1
-rw-r--r--qtools/qcstring.cpp1917
-rw-r--r--qtools/qcstring.h407
-rw-r--r--qtools/qdatastream.cpp951
-rw-r--r--qtools/qdatastream.h173
-rw-r--r--qtools/qdatetime.cpp1434
-rw-r--r--qtools/qdatetime.h216
-rw-r--r--qtools/qdict.doc492
-rw-r--r--qtools/qdict.h116
-rw-r--r--qtools/qdir.cpp1200
-rw-r--r--qtools/qdir.h235
-rw-r--r--qtools/qdir_unix.cpp288
-rw-r--r--qtools/qdir_win32.cpp406
-rw-r--r--qtools/qfeatures.h978
-rw-r--r--qtools/qfile.cpp550
-rw-r--r--qtools/qfile.h124
-rw-r--r--qtools/qfile_unix.cpp634
-rw-r--r--qtools/qfile_win32.cpp593
-rw-r--r--qtools/qfiledefs_p.h259
-rw-r--r--qtools/qfileinfo.cpp458
-rw-r--r--qtools/qfileinfo.h138
-rw-r--r--qtools/qfileinfo_unix.cpp425
-rw-r--r--qtools/qfileinfo_win32.cpp334
-rw-r--r--qtools/qgarray.cpp747
-rw-r--r--qtools/qgarray.h120
-rw-r--r--qtools/qgcache.cpp868
-rw-r--r--qtools/qgcache.h128
-rw-r--r--qtools/qgdict.cpp1218
-rw-r--r--qtools/qgdict.h222
-rw-r--r--qtools/qgeneric.h43
-rw-r--r--qtools/qglist.cpp1223
-rw-r--r--qtools/qglist.h257
-rw-r--r--qtools/qglobal.cpp685
-rw-r--r--qtools/qglobal.h601
-rw-r--r--qtools/qgvector.cpp638
-rw-r--r--qtools/qgvector.h120
-rw-r--r--qtools/qintdict.doc475
-rw-r--r--qtools/qintdict.h102
-rw-r--r--qtools/qiodevice.cpp638
-rw-r--r--qtools/qiodevice.h155
-rw-r--r--qtools/qlist.doc1048
-rw-r--r--qtools/qlist.h139
-rw-r--r--qtools/qmap.cpp254
-rw-r--r--qtools/qmap.h606
-rw-r--r--qtools/qmodules.h11
-rw-r--r--qtools/qptrdict.doc486
-rw-r--r--qtools/qptrdict.h103
-rw-r--r--qtools/qqueue.h70
-rw-r--r--qtools/qregexp.cpp1091
-rw-r--r--qtools/qregexp.h92
-rw-r--r--qtools/qshared.h55
-rw-r--r--qtools/qsortedlist.doc94
-rw-r--r--qtools/qsortedlist.h59
-rw-r--r--qtools/qstack.doc135
-rw-r--r--qtools/qstack.h70
-rw-r--r--qtools/qstring.cpp15222
-rw-r--r--qtools/qstring.h825
-rw-r--r--qtools/qstringlist.cpp302
-rw-r--r--qtools/qstringlist.h81
-rw-r--r--qtools/qstrlist.doc5
-rw-r--r--qtools/qstrlist.h109
-rw-r--r--qtools/qstrvec.h90
-rw-r--r--qtools/qtextcodec.cpp2071
-rw-r--r--qtools/qtextcodec.h104
-rw-r--r--qtools/qtextstream.cpp2237
-rw-r--r--qtools/qtextstream.h351
-rw-r--r--qtools/qtl.doc249
-rw-r--r--qtools/qtl.h223
-rw-r--r--qtools/qtools.pro.in83
-rw-r--r--qtools/qvaluelist.doc772
-rw-r--r--qtools/qvaluelist.h449
-rw-r--r--qtools/qvaluestack.h64
-rw-r--r--qtools/qvector.doc344
-rw-r--r--qtools/qvector.h85
-rw-r--r--qtools/qxml.cpp6046
-rw-r--r--qtools/qxml.h664
-rw-r--r--qtools/scstring.cpp785
-rw-r--r--qtools/scstring.h154
-rw-r--r--src/.cvsignore25
-rw-r--r--src/Makefile.in53
-rw-r--r--src/bufstr.h107
-rw-r--r--src/classdef.cpp3022
-rw-r--r--src/classdef.h581
-rw-r--r--src/classlist.cpp163
-rw-r--r--src/classlist.h59
-rw-r--r--src/cmdmapper.cpp188
-rw-r--r--src/cmdmapper.h204
-rw-r--r--src/code.h34
-rw-r--r--src/code.l3070
-rw-r--r--src/commentcnv.h27
-rw-r--r--src/commentcnv.l567
-rw-r--r--src/commentscan.h80
-rw-r--r--src/commentscan.l2412
-rw-r--r--src/compound.xsd774
-rw-r--r--src/compound_xsd.h774
-rw-r--r--src/config.h577
-rw-r--r--src/config.l2863
-rw-r--r--src/constexp.h33
-rw-r--r--src/constexp.l120
-rw-r--r--src/constexp.y278
-rw-r--r--src/cppvalue.cpp87
-rw-r--r--src/cppvalue.h62
-rw-r--r--src/debug.cpp116
-rw-r--r--src/debug.h49
-rw-r--r--src/declinfo.h33
-rw-r--r--src/declinfo.l355
-rw-r--r--src/defargs.h28
-rw-r--r--src/defargs.l436
-rw-r--r--src/defgen.cpp628
-rw-r--r--src/defgen.h20
-rw-r--r--src/define.cpp46
-rw-r--r--src/define.h91
-rw-r--r--src/definition.cpp853
-rw-r--r--src/definition.h277
-rw-r--r--src/diagram.cpp1291
-rw-r--r--src/diagram.h132
-rw-r--r--src/dirdef.cpp880
-rw-r--r--src/dirdef.h172
-rw-r--r--src/docparser.cpp5738
-rw-r--r--src/docparser.h1233
-rw-r--r--src/doctokenizer.h147
-rw-r--r--src/doctokenizer.l1063
-rw-r--r--src/docvisitor.h183
-rw-r--r--src/dot.cpp3097
-rw-r--r--src/dot.h318
-rw-r--r--src/doxygen.cpp8997
-rw-r--r--src/doxygen.h130
-rw-r--r--src/doxygen.pro.in40
-rw-r--r--src/doxytag.l929
-rw-r--r--src/doxytag.pro.in31
-rw-r--r--src/doxytag.t50
-rw-r--r--src/entry.cpp284
-rw-r--r--src/entry.h352
-rw-r--r--src/example.h45
-rw-r--r--src/filedef.cpp1293
-rw-r--r--src/filedef.h313
-rw-r--r--src/filename.cpp144
-rw-r--r--src/filename.h69
-rw-r--r--src/formula.cpp353
-rw-r--r--src/formula.h59
-rw-r--r--src/ftvhelp.cpp788
-rw-r--r--src/ftvhelp.h91
-rw-r--r--src/groupdef.cpp1019
-rw-r--r--src/groupdef.h168
-rw-r--r--src/htags.cpp176
-rw-r--r--src/htags.h28
-rw-r--r--src/htmlattrib.h65
-rw-r--r--src/htmldocvisitor.cpp1123
-rw-r--r--src/htmldocvisitor.h154
-rw-r--r--src/htmlgen.cpp1685
-rw-r--r--src/htmlgen.h236
-rw-r--r--src/htmlhelp.cpp566
-rw-r--r--src/htmlhelp.h96
-rw-r--r--src/image.cpp331
-rw-r--r--src/image.h52
-rwxr-xr-xsrc/increasebuffer.pl8
-rw-r--r--src/index.cpp3346
-rw-r--r--src/index.h165
-rw-r--r--src/index.xsd66
-rw-r--r--src/index_xsd.h66
-rw-r--r--src/instdox.cpp186
-rw-r--r--src/instdox.h23
-rw-r--r--src/lang_cfg.h32
-rw-r--r--src/language.cpp351
-rw-r--r--src/language.h26
-rw-r--r--src/latexdocvisitor.cpp1115
-rw-r--r--src/latexdocvisitor.h164
-rw-r--r--src/latexgen.cpp1551
-rw-r--r--src/latexgen.h224
-rw-r--r--src/libdoxycfg.pro.in27
-rw-r--r--src/libdoxycfg.t49
-rw-r--r--src/libdoxygen.pro.in208
-rw-r--r--src/libdoxygen.t96
-rw-r--r--src/logos.cpp3072
-rw-r--r--src/logos.h27
-rw-r--r--src/main.cpp40
-rw-r--r--src/mandocvisitor.cpp934
-rw-r--r--src/mandocvisitor.h155
-rw-r--r--src/mangen.cpp638
-rw-r--r--src/mangen.h281
-rw-r--r--src/memberdef.cpp2471
-rw-r--r--src/memberdef.h416
-rw-r--r--src/membergroup.cpp235
-rw-r--r--src/membergroup.h130
-rw-r--r--src/memberlist.cpp499
-rw-r--r--src/memberlist.h99
-rw-r--r--src/membername.cpp105
-rw-r--r--src/membername.h98
-rw-r--r--src/message.cpp204
-rw-r--r--src/message.h31
-rw-r--r--src/namespacedef.cpp658
-rw-r--r--src/namespacedef.h174
-rw-r--r--src/outputgen.cpp99
-rw-r--r--src/outputgen.h444
-rw-r--r--src/outputlist.cpp314
-rw-r--r--src/outputlist.h435
-rw-r--r--src/pagedef.cpp149
-rw-r--r--src/pagedef.h70
-rw-r--r--src/parserintf.h145
-rw-r--r--src/perlmodgen.cpp2784
-rw-r--r--src/perlmodgen.h23
-rw-r--r--src/pngenc.cpp170
-rw-r--r--src/pngenc.h58
-rw-r--r--src/pre.h32
-rw-r--r--src/pre.l2343
-rw-r--r--src/printdocvisitor.h665
-rw-r--r--src/pycode.h39
-rw-r--r--src/pycode.l1435
-rw-r--r--src/pyscanner.h54
-rw-r--r--src/pyscanner.l1438
-rw-r--r--src/qtbc.h45
-rw-r--r--src/reflist.cpp105
-rw-r--r--src/reflist.h70
-rw-r--r--src/rtfdocvisitor.cpp1416
-rw-r--r--src/rtfdocvisitor.h162
-rw-r--r--src/rtfgen.cpp2516
-rw-r--r--src/rtfgen.h305
-rw-r--r--src/rtfstyle.cpp522
-rw-r--r--src/rtfstyle.h83
-rw-r--r--src/scanner.h51
-rw-r--r--src/scanner.l4653
-rw-r--r--src/search.php327
-rw-r--r--src/search_php.h327
-rw-r--r--src/searchindex.cpp285
-rw-r--r--src/searchindex.h71
-rw-r--r--src/section.h63
-rw-r--r--src/sortdict.h564
-rw-r--r--src/tagreader.cpp1399
-rw-r--r--src/tagreader.h28
-rw-r--r--src/translator.cpp248
-rw-r--r--src/translator.h444
-rw-r--r--src/translator_adapter.h187
-rw-r--r--src/translator_br.h1617
-rw-r--r--src/translator_ca.h1562
-rw-r--r--src/translator_cn.h1500
-rw-r--r--src/translator_cz.h1625
-rw-r--r--src/translator_de.h1648
-rw-r--r--src/translator_dk.h1476
-rw-r--r--src/translator_en.h1624
-rw-r--r--src/translator_es.h1384
-rw-r--r--src/translator_fi.h584
-rw-r--r--src/translator_fr.h1671
-rw-r--r--src/translator_gr.h1335
-rw-r--r--src/translator_hr.h1261
-rw-r--r--src/translator_hu.h1545
-rw-r--r--src/translator_id.h1596
-rw-r--r--src/translator_it.h1529
-rw-r--r--src/translator_je.h67
-rw-r--r--src/translator_jp.h1513
-rw-r--r--src/translator_ke.h59
-rw-r--r--src/translator_kr.h1560
-rw-r--r--src/translator_lt.h1562
-rw-r--r--src/translator_nl.h1219
-rw-r--r--src/translator_no.h1552
-rw-r--r--src/translator_pl.h1575
-rw-r--r--src/translator_pt.h1480
-rw-r--r--src/translator_ro.h1621
-rw-r--r--src/translator_ru.h1580
-rw-r--r--src/translator_se.h1437
-rw-r--r--src/translator_si.h1028
-rw-r--r--src/translator_sk.h1395
-rw-r--r--src/translator_sr.h1617
-rw-r--r--src/translator_tw.h1598
-rw-r--r--src/translator_ua.h1586
-rw-r--r--src/translator_za.h1555
-rw-r--r--src/unistd.h7
-rw-r--r--src/util.cpp5616
-rw-r--r--src/util.h243
-rw-r--r--src/version.h23
-rw-r--r--src/xmldocvisitor.cpp917
-rw-r--r--src/xmldocvisitor.h156
-rw-r--r--src/xmlgen.cpp1784
-rw-r--r--src/xmlgen.h20
-rw-r--r--tmake/CHANGES49
-rw-r--r--tmake/LICENSE9
-rw-r--r--tmake/README10
-rwxr-xr-xtmake/bin/progen249
-rwxr-xr-xtmake/bin/tmake1262
-rw-r--r--tmake/doc/m-linux-gcc.html85
-rw-r--r--tmake/doc/m-win32-msvc.html89
-rw-r--r--tmake/doc/tmake.html727
-rw-r--r--tmake/doc/tmake_ref.html463
-rw-r--r--tmake/example/hello.cpp102
-rw-r--r--tmake/example/hello.h34
-rw-r--r--tmake/example/hello.pro3
-rw-r--r--tmake/example/main.cpp38
-rw-r--r--tmake/example/wc.t6
-rwxr-xr-xtmake/lib/aix-g++/app.t2
-rwxr-xr-xtmake/lib/aix-g++/lib.t2
-rwxr-xr-xtmake/lib/aix-g++/subdirs.t2
-rwxr-xr-xtmake/lib/aix-g++/tmake.conf58
-rwxr-xr-xtmake/lib/aix-xlc/app.t2
-rwxr-xr-xtmake/lib/aix-xlc/lib.t2
-rwxr-xr-xtmake/lib/aix-xlc/subdirs.t2
-rwxr-xr-xtmake/lib/aix-xlc/tmake.conf66
-rwxr-xr-xtmake/lib/beos-g++/app.t2
-rwxr-xr-xtmake/lib/beos-g++/lib.t2
-rwxr-xr-xtmake/lib/beos-g++/subdirs.t2
-rwxr-xr-xtmake/lib/beos-g++/tmake.conf51
-rwxr-xr-xtmake/lib/bsdi-g++/app.t2
-rwxr-xr-xtmake/lib/bsdi-g++/lib.t2
-rwxr-xr-xtmake/lib/bsdi-g++/subdirs.t2
-rwxr-xr-xtmake/lib/bsdi-g++/tmake.conf61
-rwxr-xr-xtmake/lib/dgux-g++/app.t2
-rwxr-xr-xtmake/lib/dgux-g++/lib.t2
-rwxr-xr-xtmake/lib/dgux-g++/subdirs.t2
-rwxr-xr-xtmake/lib/dgux-g++/tmake.conf59
-rwxr-xr-xtmake/lib/freebsd-g++/app.t2
-rwxr-xr-xtmake/lib/freebsd-g++/lib.t2
-rwxr-xr-xtmake/lib/freebsd-g++/subdirs.t2
-rwxr-xr-xtmake/lib/freebsd-g++/tmake.conf60
-rwxr-xr-xtmake/lib/gnu-g++/app.t2
-rwxr-xr-xtmake/lib/gnu-g++/lib.t2
-rwxr-xr-xtmake/lib/gnu-g++/subdirs.t2
-rwxr-xr-xtmake/lib/gnu-g++/tmake.conf58
-rwxr-xr-xtmake/lib/hpux-acc/app.t2
-rwxr-xr-xtmake/lib/hpux-acc/lib.t2
-rwxr-xr-xtmake/lib/hpux-acc/subdirs.t2
-rwxr-xr-xtmake/lib/hpux-acc/tmake.conf60
-rwxr-xr-xtmake/lib/hpux-cc/app.t2
-rwxr-xr-xtmake/lib/hpux-cc/lib.t2
-rwxr-xr-xtmake/lib/hpux-cc/subdirs.t2
-rwxr-xr-xtmake/lib/hpux-cc/tmake.conf59
-rwxr-xr-xtmake/lib/hpux-g++/app.t2
-rwxr-xr-xtmake/lib/hpux-g++/lib.t2
-rwxr-xr-xtmake/lib/hpux-g++/subdirs.t2
-rwxr-xr-xtmake/lib/hpux-g++/tmake.conf60
-rwxr-xr-xtmake/lib/irix-64/app.t2
-rwxr-xr-xtmake/lib/irix-64/lib.t2
-rwxr-xr-xtmake/lib/irix-64/subdirs.t2
-rwxr-xr-xtmake/lib/irix-64/tmake.conf60
-rwxr-xr-xtmake/lib/irix-dcc/app.t2
-rwxr-xr-xtmake/lib/irix-dcc/lib.t2
-rwxr-xr-xtmake/lib/irix-dcc/subdirs.t2
-rwxr-xr-xtmake/lib/irix-dcc/tmake.conf60
-rwxr-xr-xtmake/lib/irix-g++/app.t2
-rwxr-xr-xtmake/lib/irix-g++/lib.t2
-rwxr-xr-xtmake/lib/irix-g++/subdirs.t2
-rwxr-xr-xtmake/lib/irix-g++/tmake.conf60
-rwxr-xr-xtmake/lib/irix-n32/app.t2
-rwxr-xr-xtmake/lib/irix-n32/lib.t2
-rwxr-xr-xtmake/lib/irix-n32/subdirs.t2
-rwxr-xr-xtmake/lib/irix-n32/tmake.conf60
-rwxr-xr-xtmake/lib/irix-o32/app.t2
-rwxr-xr-xtmake/lib/irix-o32/lib.t2
-rwxr-xr-xtmake/lib/irix-o32/subdirs.t2
-rwxr-xr-xtmake/lib/irix-o32/tmake.conf60
-rwxr-xr-xtmake/lib/linux-g++/app.t2
-rwxr-xr-xtmake/lib/linux-g++/lib.t2
-rwxr-xr-xtmake/lib/linux-g++/subdirs.t2
-rwxr-xr-xtmake/lib/linux-g++/tmake.conf59
-rwxr-xr-xtmake/lib/m68k-atari-mint-g++/app.t2
-rwxr-xr-xtmake/lib/m68k-atari-mint-g++/lib.t2
-rwxr-xr-xtmake/lib/m68k-atari-mint-g++/subdirs.t2
-rwxr-xr-xtmake/lib/m68k-atari-mint-g++/tmake.conf59
-rwxr-xr-xtmake/lib/macosx-c++/app.t2
-rwxr-xr-xtmake/lib/macosx-c++/lib.t2
-rwxr-xr-xtmake/lib/macosx-c++/subdirs.t2
-rwxr-xr-xtmake/lib/macosx-c++/tmake.conf60
-rwxr-xr-xtmake/lib/netbsd-g++/app.t2
-rwxr-xr-xtmake/lib/netbsd-g++/lib.t2
-rwxr-xr-xtmake/lib/netbsd-g++/subdirs.t2
-rwxr-xr-xtmake/lib/netbsd-g++/tmake.conf61
-rwxr-xr-xtmake/lib/openbsd-g++/app.t2
-rwxr-xr-xtmake/lib/openbsd-g++/lib.t2
-rwxr-xr-xtmake/lib/openbsd-g++/subdirs.t2
-rwxr-xr-xtmake/lib/openbsd-g++/tmake.conf61
-rwxr-xr-xtmake/lib/osf1-cxx/app.t2
-rwxr-xr-xtmake/lib/osf1-cxx/lib.t2
-rwxr-xr-xtmake/lib/osf1-cxx/subdirs.t2
-rwxr-xr-xtmake/lib/osf1-cxx/tmake.conf60
-rwxr-xr-xtmake/lib/osf1-g++/app.t2
-rwxr-xr-xtmake/lib/osf1-g++/lib.t2
-rwxr-xr-xtmake/lib/osf1-g++/subdirs.t2
-rwxr-xr-xtmake/lib/osf1-g++/tmake.conf58
-rwxr-xr-xtmake/lib/qnx-g++/app.t2
-rwxr-xr-xtmake/lib/qnx-g++/lib.t2
-rwxr-xr-xtmake/lib/qnx-g++/subdirs.t2
-rwxr-xr-xtmake/lib/qnx-g++/tmake.conf58
-rwxr-xr-xtmake/lib/sco-g++/app.t2
-rwxr-xr-xtmake/lib/sco-g++/lib.t2
-rwxr-xr-xtmake/lib/sco-g++/subdirs.t2
-rwxr-xr-xtmake/lib/sco-g++/tmake.conf58
-rwxr-xr-xtmake/lib/solaris-cc-gcc/app.t2
-rwxr-xr-xtmake/lib/solaris-cc-gcc/lib.t2
-rwxr-xr-xtmake/lib/solaris-cc-gcc/subdirs.t2
-rwxr-xr-xtmake/lib/solaris-cc-gcc/tmake.conf62
-rwxr-xr-xtmake/lib/solaris-cc/app.t2
-rwxr-xr-xtmake/lib/solaris-cc/lib.t2
-rwxr-xr-xtmake/lib/solaris-cc/subdirs.t2
-rwxr-xr-xtmake/lib/solaris-cc/tmake.conf61
-rwxr-xr-xtmake/lib/solaris-g++/app.t2
-rwxr-xr-xtmake/lib/solaris-g++/lib.t2
-rwxr-xr-xtmake/lib/solaris-g++/subdirs.t2
-rwxr-xr-xtmake/lib/solaris-g++/tmake.conf59
-rwxr-xr-xtmake/lib/sunos-g++/app.t2
-rwxr-xr-xtmake/lib/sunos-g++/lib.t2
-rwxr-xr-xtmake/lib/sunos-g++/subdirs.t2
-rwxr-xr-xtmake/lib/sunos-g++/tmake.conf58
-rwxr-xr-xtmake/lib/ultrix-g++/app.t2
-rwxr-xr-xtmake/lib/ultrix-g++/lib.t2
-rwxr-xr-xtmake/lib/ultrix-g++/subdirs.t2
-rwxr-xr-xtmake/lib/ultrix-g++/tmake.conf58
-rwxr-xr-xtmake/lib/unix/app.t6
-rwxr-xr-xtmake/lib/unix/generic.t283
-rwxr-xr-xtmake/lib/unix/lib.t6
-rwxr-xr-xtmake/lib/unix/subdirs.t38
-rwxr-xr-xtmake/lib/unixware-g++/app.t2
-rwxr-xr-xtmake/lib/unixware-g++/lib.t2
-rwxr-xr-xtmake/lib/unixware-g++/subdirs.t2
-rwxr-xr-xtmake/lib/unixware-g++/tmake.conf60
-rwxr-xr-xtmake/lib/unixware7-cc/app.t2
-rwxr-xr-xtmake/lib/unixware7-cc/lib.t2
-rwxr-xr-xtmake/lib/unixware7-cc/subdirs.t2
-rwxr-xr-xtmake/lib/unixware7-cc/tmake.conf60
-rwxr-xr-xtmake/lib/unixware7-g++/app.t2
-rwxr-xr-xtmake/lib/unixware7-g++/lib.t2
-rwxr-xr-xtmake/lib/unixware7-g++/subdirs.t2
-rwxr-xr-xtmake/lib/unixware7-g++/tmake.conf60
-rwxr-xr-xtmake/lib/win32-borland/app.t6
-rwxr-xr-xtmake/lib/win32-borland/generic.t237
-rwxr-xr-xtmake/lib/win32-borland/lib.t6
-rwxr-xr-xtmake/lib/win32-borland/subdirs.t3
-rwxr-xr-xtmake/lib/win32-borland/tmake.conf56
-rwxr-xr-xtmake/lib/win32-g++/app.t6
-rwxr-xr-xtmake/lib/win32-g++/generic.t241
-rwxr-xr-xtmake/lib/win32-g++/lib.t6
-rwxr-xr-xtmake/lib/win32-g++/subdirs.t2
-rwxr-xr-xtmake/lib/win32-g++/tmake.conf56
-rwxr-xr-xtmake/lib/win32-mingw/app.t6
-rwxr-xr-xtmake/lib/win32-mingw/generic.t241
-rwxr-xr-xtmake/lib/win32-mingw/lib.t6
-rwxr-xr-xtmake/lib/win32-mingw/subdirs.t2
-rwxr-xr-xtmake/lib/win32-mingw/tmake.conf56
-rwxr-xr-xtmake/lib/win32-msvc/app.t6
-rwxr-xr-xtmake/lib/win32-msvc/generic.t229
-rwxr-xr-xtmake/lib/win32-msvc/lib.t6
-rwxr-xr-xtmake/lib/win32-msvc/subdirs.t2
-rwxr-xr-xtmake/lib/win32-msvc/tmake.conf65
-rwxr-xr-xtmake/lib/win32-msvc/vcapp.t244
-rwxr-xr-xtmake/lib/win32-msvc/vclib.t178
-rwxr-xr-xtmake/lib/win32-symantec/app.t6
-rwxr-xr-xtmake/lib/win32-symantec/generic.t211
-rwxr-xr-xtmake/lib/win32-symantec/lib.t6
-rwxr-xr-xtmake/lib/win32-symantec/subdirs.t2
-rwxr-xr-xtmake/lib/win32-symantec/tmake.conf56
-rwxr-xr-xtmake/lib/win32-visage/app.t6
-rwxr-xr-xtmake/lib/win32-visage/generic.t207
-rwxr-xr-xtmake/lib/win32-visage/lib.t6
-rwxr-xr-xtmake/lib/win32-visage/subdirs.t2
-rwxr-xr-xtmake/lib/win32-visage/tmake.conf56
-rwxr-xr-xtmake/lib/win32-watcom/app.t6
-rwxr-xr-xtmake/lib/win32-watcom/generic.t201
-rwxr-xr-xtmake/lib/win32-watcom/lib.t6
-rwxr-xr-xtmake/lib/win32-watcom/subdirs.t2
-rwxr-xr-xtmake/lib/win32-watcom/tmake.conf54
-rwxr-xr-xtmake/lib/win32/subdirs.t54
-rw-r--r--wintools/Doxygen.dsp700
-rw-r--r--wintools/Doxygen.dsw89
-rw-r--r--wintools/Doxytag.dsp163
-rw-r--r--wintools/Doxytag.dsw33
-rw-r--r--wintools/README20
-rw-r--r--wintools/libpng.dsp188
-rw-r--r--wintools/libpng.dsw29
-rwxr-xr-xwintools/make.pl39
-rw-r--r--wintools/qtools.dsp359
-rw-r--r--wintools/qtools.dsw33
-rw-r--r--wintools/zlib.dsp191
-rw-r--r--wintools/zlib.dsw33
746 files changed, 0 insertions, 299252 deletions
diff --git a/.cvsignore b/.cvsignore
deleted file mode 100644
index 4599f32..0000000
--- a/.cvsignore
+++ /dev/null
@@ -1,6 +0,0 @@
-Makefile
-.makeconfig
-.tmakeconfig
-bin
-lib
-objects
diff --git a/CVSROOT/checkoutlist b/CVSROOT/checkoutlist
deleted file mode 100644
index b04b350..0000000
--- a/CVSROOT/checkoutlist
+++ /dev/null
@@ -1,13 +0,0 @@
-# The "checkoutlist" file is used to support additional version controlled
-# administrative files in $CVSROOT/CVSROOT, such as template files.
-#
-# The first entry on a line is a filename which will be checked out from
-# the corresponding RCS file in the $CVSROOT/CVSROOT directory.
-# The remainder of the line is an error message to use if the file cannot
-# be checked out.
-#
-# File format:
-#
-# [<whitespace>]<filename><whitespace><error message><end-of-line>
-#
-# comment lines begin with '#'
diff --git a/CVSROOT/commitinfo b/CVSROOT/commitinfo
deleted file mode 100644
index b19e7b7..0000000
--- a/CVSROOT/commitinfo
+++ /dev/null
@@ -1,15 +0,0 @@
-# The "commitinfo" file is used to control pre-commit checks.
-# The filter on the right is invoked with the repository and a list
-# of files to check. A non-zero exit of the filter program will
-# cause the commit to be aborted.
-#
-# The first entry on a line is a regular expression which is tested
-# against the directory that the change is being committed to, relative
-# to the $CVSROOT. For the first match that is found, then the remainder
-# of the line is the name of the filter to run.
-#
-# If the repository name does not match any of the regular expressions in this
-# file, the "DEFAULT" line is used, if it is specified.
-#
-# If the name "ALL" appears as a regular expression it is always used
-# in addition to the first matching regex or "DEFAULT".
diff --git a/CVSROOT/config b/CVSROOT/config
deleted file mode 100644
index 8817419..0000000
--- a/CVSROOT/config
+++ /dev/null
@@ -1,9 +0,0 @@
-# Set this to "no" if pserver shouldn't check system users/passwords
-#SystemAuth=no
-
-# Set `PreservePermissions' to `yes' to save file status information
-# in the repository.
-#PreservePermissions=no
-
-TopLevelAdmin=yes
-#LockDir=/u/kp3softd/cvslocks/
diff --git a/CVSROOT/cvswrappers b/CVSROOT/cvswrappers
deleted file mode 100644
index 0c725ea..0000000
--- a/CVSROOT/cvswrappers
+++ /dev/null
@@ -1,23 +0,0 @@
-# This file affects handling of files based on their names.
-#
-# The -t/-f options allow one to treat directories of files
-# as a single file, or to transform a file in other ways on
-# its way in and out of CVS.
-#
-# The -m option specifies whether CVS attempts to merge files.
-#
-# The -k option specifies keyword expansion (e.g. -kb for binary).
-#
-# Format of wrapper file ($CVSROOT/CVSROOT/cvswrappers or .cvswrappers)
-#
-# wildcard [option value][option value]...
-#
-# where option is one of
-# -f from cvs filter value: path to filter
-# -t to cvs filter value: path to filter
-# -m update methodology value: MERGE or COPY
-# -k expansion mode value: b, o, kkv, &c
-#
-# and value is a single-quote delimited value.
-# For example:
-*.gif -k 'b' -m 'COPY'
diff --git a/CVSROOT/editinfo b/CVSROOT/editinfo
deleted file mode 100644
index d78886c..0000000
--- a/CVSROOT/editinfo
+++ /dev/null
@@ -1,21 +0,0 @@
-# The "editinfo" file is used to allow verification of logging
-# information. It works best when a template (as specified in the
-# rcsinfo file) is provided for the logging procedure. Given a
-# template with locations for, a bug-id number, a list of people who
-# reviewed the code before it can be checked in, and an external
-# process to catalog the differences that were code reviewed, the
-# following test can be applied to the code:
-#
-# Making sure that the entered bug-id number is correct.
-# Validating that the code that was reviewed is indeed the code being
-# checked in (using the bug-id number or a seperate review
-# number to identify this particular code set.).
-#
-# If any of the above test failed, then the commit would be aborted.
-#
-# Actions such as mailing a copy of the report to each reviewer are
-# better handled by an entry in the loginfo file.
-#
-# One thing that should be noted is the the ALL keyword is not
-# supported. There can be only one entry that matches a given
-# repository.
diff --git a/CVSROOT/loginfo b/CVSROOT/loginfo
deleted file mode 100644
index 5a59f0a..0000000
--- a/CVSROOT/loginfo
+++ /dev/null
@@ -1,26 +0,0 @@
-# The "loginfo" file controls where "cvs commit" log information
-# is sent. The first entry on a line is a regular expression which must match
-# the directory that the change is being made to, relative to the
-# $CVSROOT. If a match is found, then the remainder of the line is a filter
-# program that should expect log information on its standard input.
-#
-# If the repository name does not match any of the regular expressions in this
-# file, the "DEFAULT" line is used, if it is specified.
-#
-# If the name ALL appears as a regular expression it is always used
-# in addition to the first matching regex or DEFAULT.
-#
-# You may specify a format string as part of the
-# filter. The string is composed of a `%' followed
-# by a single format character, or followed by a set of format
-# characters surrounded by `{' and `}' as separators. The format
-# characters are:
-#
-# s = file name
-# V = old version number (pre-checkin)
-# v = new version number (post-checkin)
-#
-# For example:
-#DEFAULT (echo ""; id; echo %s; date; cat) >> $CVSROOT/CVSROOT/commitlog
-# or
-#DEFAULT (echo ""; id; echo %{sVv}; date; cat) >> $CVSROOT/CVSROOT/commitlog
diff --git a/CVSROOT/modules b/CVSROOT/modules
deleted file mode 100644
index 581582c..0000000
--- a/CVSROOT/modules
+++ /dev/null
@@ -1,27 +0,0 @@
-# Three different line formats are valid:
-# key -a aliases...
-# key [options] directory
-# key [options] directory files...
-#
-# Where "options" are composed of:
-# -i prog Run "prog" on "cvs commit" from top-level of module.
-# -o prog Run "prog" on "cvs checkout" of module.
-# -e prog Run "prog" on "cvs export" of module.
-# -t prog Run "prog" on "cvs rtag" of module.
-# -u prog Run "prog" on "cvs update" of module.
-# -d dir Place module in directory "dir" instead of module name.
-# -l Top-level directory only -- do not recurse.
-#
-# NOTE: If you change any of the "Run" options above, you'll have to
-# release and re-checkout any working directories of these modules.
-#
-# And "directory" is a path to a directory relative to $CVSROOT.
-#
-# The "-a" option specifies an alias. An alias is interpreted as if
-# everything on the right of the "-a" had been typed on the command line.
-#
-# You can encode a module within a module by using the special '&'
-# character to interpose another module into the current module. This
-# can be useful for creating a module that consists of many directories
-# spread out over the entire source repository.
-doxygen -a addon bin doc examples html lib objects packages qtools src tmake wintools libpng libmd5
diff --git a/CVSROOT/notify b/CVSROOT/notify
deleted file mode 100644
index 34f0bc2..0000000
--- a/CVSROOT/notify
+++ /dev/null
@@ -1,12 +0,0 @@
-# The "notify" file controls where notifications from watches set by
-# "cvs watch add" or "cvs edit" are sent. The first entry on a line is
-# a regular expression which is tested against the directory that the
-# change is being made to, relative to the $CVSROOT. If it matches,
-# then the remainder of the line is a filter program that should contain
-# one occurrence of %s for the user to notify, and information on its
-# standard input.
-#
-# "ALL" or "DEFAULT" can be used in place of the regular expression.
-#
-# For example:
-#ALL mail %s -s "CVS notification"
diff --git a/CVSROOT/rcsinfo b/CVSROOT/rcsinfo
deleted file mode 100644
index 49e59f4..0000000
--- a/CVSROOT/rcsinfo
+++ /dev/null
@@ -1,13 +0,0 @@
-# The "rcsinfo" file is used to control templates with which the editor
-# is invoked on commit and import.
-#
-# The first entry on a line is a regular expression which is tested
-# against the directory that the change is being made to, relative to the
-# $CVSROOT. For the first match that is found, then the remainder of the
-# line is the name of the file that contains the template.
-#
-# If the repository name does not match any of the regular expressions in this
-# file, the "DEFAULT" line is used, if it is specified.
-#
-# If the name "ALL" appears as a regular expression it is always used
-# in addition to the first matching regex or "DEFAULT".
diff --git a/CVSROOT/taginfo b/CVSROOT/taginfo
deleted file mode 100644
index 274a46d..0000000
--- a/CVSROOT/taginfo
+++ /dev/null
@@ -1,20 +0,0 @@
-# The "taginfo" file is used to control pre-tag checks.
-# The filter on the right is invoked with the following arguments:
-#
-# $1 -- tagname
-# $2 -- operation "add" for tag, "mov" for tag -F, and "del" for tag -d
-# $3 -- repository
-# $4-> file revision [file revision ...]
-#
-# A non-zero exit of the filter program will cause the tag to be aborted.
-#
-# The first entry on a line is a regular expression which is tested
-# against the directory that the change is being committed to, relative
-# to the $CVSROOT. For the first match that is found, then the remainder
-# of the line is the name of the filter to run.
-#
-# If the repository name does not match any of the regular expressions in this
-# file, the "DEFAULT" line is used, if it is specified.
-#
-# If the name "ALL" appears as a regular expression it is always used
-# in addition to the first matching regex or "DEFAULT".
diff --git a/CVSROOT/verifymsg b/CVSROOT/verifymsg
deleted file mode 100644
index 86f747c..0000000
--- a/CVSROOT/verifymsg
+++ /dev/null
@@ -1,21 +0,0 @@
-# The "verifymsg" file is used to allow verification of logging
-# information. It works best when a template (as specified in the
-# rcsinfo file) is provided for the logging procedure. Given a
-# template with locations for, a bug-id number, a list of people who
-# reviewed the code before it can be checked in, and an external
-# process to catalog the differences that were code reviewed, the
-# following test can be applied to the code:
-#
-# Making sure that the entered bug-id number is correct.
-# Validating that the code that was reviewed is indeed the code being
-# checked in (using the bug-id number or a seperate review
-# number to identify this particular code set.).
-#
-# If any of the above test failed, then the commit would be aborted.
-#
-# Actions such as mailing a copy of the report to each reviewer are
-# better handled by an entry in the loginfo file.
-#
-# One thing that should be noted is the the ALL keyword is not
-# supported. There can be only one entry that matches a given
-# repository.
diff --git a/Doxyfile b/Doxyfile
deleted file mode 100644
index 43ddaf8..0000000
--- a/Doxyfile
+++ /dev/null
@@ -1,242 +0,0 @@
-# Doxyfile 1.4.3
-
-#---------------------------------------------------------------------------
-# Project related configuration options
-#---------------------------------------------------------------------------
-PROJECT_NAME = Doxygen
-PROJECT_NUMBER =
-OUTPUT_DIRECTORY = doxygen_docs
-CREATE_SUBDIRS = YES
-OUTPUT_LANGUAGE = English
-USE_WINDOWS_ENCODING = NO
-BRIEF_MEMBER_DESC = YES
-REPEAT_BRIEF = YES
-ABBREVIATE_BRIEF =
-ALWAYS_DETAILED_SEC = NO
-INLINE_INHERITED_MEMB = NO
-FULL_PATH_NAMES = YES
-STRIP_FROM_PATH = $(PWD)/
-STRIP_FROM_INC_PATH =
-SHORT_NAMES = NO
-JAVADOC_AUTOBRIEF = YES
-MULTILINE_CPP_IS_BRIEF = NO
-DETAILS_AT_TOP = NO
-INHERIT_DOCS = YES
-DISTRIBUTE_GROUP_DOC = NO
-SEPARATE_MEMBER_PAGES = NO
-TAB_SIZE = 8
-ALIASES =
-OPTIMIZE_OUTPUT_FOR_C = NO
-OPTIMIZE_OUTPUT_JAVA = NO
-SUBGROUPING = YES
-#---------------------------------------------------------------------------
-# Build related configuration options
-#---------------------------------------------------------------------------
-EXTRACT_ALL = YES
-EXTRACT_PRIVATE = NO
-EXTRACT_STATIC = YES
-EXTRACT_LOCAL_CLASSES = YES
-EXTRACT_LOCAL_METHODS = NO
-HIDE_UNDOC_MEMBERS = NO
-HIDE_UNDOC_CLASSES = NO
-HIDE_FRIEND_COMPOUNDS = NO
-HIDE_IN_BODY_DOCS = NO
-INTERNAL_DOCS = NO
-CASE_SENSE_NAMES = NO
-HIDE_SCOPE_NAMES = NO
-SHOW_INCLUDE_FILES = YES
-INLINE_INFO = YES
-SORT_MEMBER_DOCS = YES
-SORT_BRIEF_DOCS = NO
-SORT_BY_SCOPE_NAME = NO
-GENERATE_TODOLIST = YES
-GENERATE_TESTLIST = YES
-GENERATE_BUGLIST = YES
-GENERATE_DEPRECATEDLIST= YES
-ENABLED_SECTIONS =
-MAX_INITIALIZER_LINES = 30
-SHOW_USED_FILES = YES
-SHOW_DIRECTORIES = YES
-FILE_VERSION_FILTER =
-#---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-QUIET = NO
-WARNINGS = YES
-WARN_IF_UNDOCUMENTED = YES
-WARN_IF_DOC_ERROR = YES
-WARN_NO_PARAMDOC = NO
-WARN_FORMAT = "$file:$line: $text"
-WARN_LOGFILE =
-#---------------------------------------------------------------------------
-# configuration options related to the input files
-#---------------------------------------------------------------------------
-INPUT = src
-FILE_PATTERNS = *.h \
- *.cpp
-RECURSIVE = NO
-EXCLUDE = src/code.cpp \
- src/config.cpp \
- src/ce_lex.cpp \
- src/ce_parse.cpp \
- src/declinfo.cpp \
- src/defargs.cpp \
- src/doxytag.cpp \
- src/pre.cpp \
- src/scanner.cpp \
- src/tag.cpp \
- src/doctokenizer.cpp \
- src/logos.cpp \
- src/suffixtree.cpp \
- src/suffixtree.h \
- src/searchindex.cpp \
- src/searchindex.h \
- src/commentcnv.cpp \
- src/commentscan.cpp \
- src/pycode.cpp \
- src/pyscanner.cpp
-EXCLUDE_SYMLINKS = NO
-EXCLUDE_PATTERNS =
-EXAMPLE_PATH =
-EXAMPLE_PATTERNS =
-EXAMPLE_RECURSIVE = NO
-IMAGE_PATH =
-INPUT_FILTER =
-FILTER_PATTERNS =
-FILTER_SOURCE_FILES = NO
-#---------------------------------------------------------------------------
-# configuration options related to source browsing
-#---------------------------------------------------------------------------
-SOURCE_BROWSER = YES
-INLINE_SOURCES = NO
-STRIP_CODE_COMMENTS = YES
-REFERENCED_BY_RELATION = YES
-REFERENCES_RELATION = YES
-USE_HTAGS = NO
-VERBATIM_HEADERS = YES
-#---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
-#---------------------------------------------------------------------------
-ALPHABETICAL_INDEX = YES
-COLS_IN_ALPHA_INDEX = 5
-IGNORE_PREFIX =
-#---------------------------------------------------------------------------
-# configuration options related to the HTML output
-#---------------------------------------------------------------------------
-GENERATE_HTML = YES
-HTML_OUTPUT =
-HTML_FILE_EXTENSION = .html
-HTML_HEADER =
-HTML_FOOTER =
-HTML_STYLESHEET =
-HTML_ALIGN_MEMBERS = YES
-GENERATE_HTMLHELP = NO
-CHM_FILE =
-HHC_LOCATION =
-GENERATE_CHI = NO
-BINARY_TOC = NO
-TOC_EXPAND = NO
-DISABLE_INDEX = NO
-ENUM_VALUES_PER_LINE = 4
-GENERATE_TREEVIEW = YES
-TREEVIEW_WIDTH = 250
-#---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-GENERATE_LATEX = NO
-LATEX_OUTPUT =
-LATEX_CMD_NAME = latex
-MAKEINDEX_CMD_NAME = makeindex
-COMPACT_LATEX = NO
-PAPER_TYPE = a4wide
-EXTRA_PACKAGES =
-LATEX_HEADER =
-PDF_HYPERLINKS = YES
-USE_PDFLATEX = NO
-LATEX_BATCHMODE = NO
-LATEX_HIDE_INDICES = NO
-#---------------------------------------------------------------------------
-# configuration options related to the RTF output
-#---------------------------------------------------------------------------
-GENERATE_RTF = NO
-RTF_OUTPUT =
-COMPACT_RTF = NO
-RTF_HYPERLINKS = NO
-RTF_STYLESHEET_FILE =
-RTF_EXTENSIONS_FILE =
-#---------------------------------------------------------------------------
-# configuration options related to the man page output
-#---------------------------------------------------------------------------
-GENERATE_MAN = NO
-MAN_OUTPUT =
-MAN_EXTENSION = .3
-MAN_LINKS = NO
-#---------------------------------------------------------------------------
-# configuration options related to the XML output
-#---------------------------------------------------------------------------
-GENERATE_XML = NO
-XML_OUTPUT = xml
-XML_SCHEMA =
-XML_DTD =
-XML_PROGRAMLISTING = YES
-#---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
-#---------------------------------------------------------------------------
-GENERATE_AUTOGEN_DEF = NO
-#---------------------------------------------------------------------------
-# configuration options related to the Perl module output
-#---------------------------------------------------------------------------
-GENERATE_PERLMOD = NO
-PERLMOD_LATEX = NO
-PERLMOD_PRETTY = YES
-PERLMOD_MAKEVAR_PREFIX =
-#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
-#---------------------------------------------------------------------------
-ENABLE_PREPROCESSING = YES
-MACRO_EXPANSION = YES
-EXPAND_ONLY_PREDEF = YES
-SEARCH_INCLUDES = YES
-INCLUDE_PATH =
-INCLUDE_FILE_PATTERNS =
-PREDEFINED =
-EXPAND_AS_DEFINED =
-SKIP_FUNCTION_MACROS = YES
-#---------------------------------------------------------------------------
-# Configuration::additions related to external references
-#---------------------------------------------------------------------------
-TAGFILES = qtools_docs/qtools.tag=../../qtools_docs/html
-GENERATE_TAGFILE =
-ALLEXTERNALS = NO
-EXTERNAL_GROUPS = YES
-PERL_PATH = /usr/bin/perl
-#---------------------------------------------------------------------------
-# Configuration options related to the dot tool
-#---------------------------------------------------------------------------
-CLASS_DIAGRAMS = NO
-HIDE_UNDOC_RELATIONS = YES
-HAVE_DOT = YES
-CLASS_GRAPH = YES
-COLLABORATION_GRAPH = YES
-GROUP_GRAPHS = YES
-UML_LOOK = NO
-TEMPLATE_RELATIONS = YES
-INCLUDE_GRAPH = YES
-INCLUDED_BY_GRAPH = NO
-CALL_GRAPH = NO
-GRAPHICAL_HIERARCHY = YES
-DIRECTORY_GRAPH = YES
-DOT_IMAGE_FORMAT = png
-DOT_PATH =
-DOTFILE_DIRS =
-MAX_DOT_GRAPH_WIDTH = 1024
-MAX_DOT_GRAPH_HEIGHT = 1024
-MAX_DOT_GRAPH_DEPTH = 0
-DOT_TRANSPARENT = NO
-DOT_MULTI_TARGETS = NO
-GENERATE_LEGEND = YES
-DOT_CLEANUP = YES
-#---------------------------------------------------------------------------
-# Configuration::additions related to the search engine
-#---------------------------------------------------------------------------
-SEARCHENGINE = YES
diff --git a/INSTALL b/INSTALL
deleted file mode 100644
index ab1c722..0000000
--- a/INSTALL
+++ /dev/null
@@ -1,7 +0,0 @@
-DOXYGEN Version 1.4.4
-
-Please read the installation section of the manual
-(http://www.doxygen.org/install.html) for instructions.
-
---------
-Dimitri van Heesch (06 August 2005)
diff --git a/LANGUAGE.HOWTO b/LANGUAGE.HOWTO
deleted file mode 100644
index 306b4bf..0000000
--- a/LANGUAGE.HOWTO
+++ /dev/null
@@ -1,49 +0,0 @@
-This short howto explains how to add support for a new language to Doxygen:
-
-Just follow these steps:
-
-1) Tell me for which language you want to add support. If no one else
- is already working on support for that language, you will be
- assigned as the maintainer for the language. I'll create a
- list on Doxygen's homepage, so everyone knows who is doing what.
-2) Create a copy of translator_en.h and name it
- translator_<your_2_letter_counter_code>.h
- I'll use xx in the rest of this document.
-3) Edit language.cpp:
- - Add a #include<translator_xx.h>
- - In setTranslator() add
-
- else if (L_EQUAL("your_language_name"))
- {
- theTranslator = new TranslatorYourLanguage;
- }
-
- after the if { ... }
-4) Edit libdoxygen.pro.in and add translator_xx.h to the HEADERS line.
-5) Edit translator_xx.h:
- - Rename TRANSLATOR_EN_H to TRANSLATOR_XX_H twice.
- - Rename TranslatorEnglish to TranslatorYourLanguage
- - In the member idLanguage() change "english" into the name of your
- language (use lower case characters only). Depending on the language you
- may also wish to change the member functions latexLanguageSupportCommand()
- and idLanguageCharset().
- - Edit all the strings that are returned by the members that start
- with tr. Try to match punctuation and capitals!
- To enter special characters (with accents) you can:
- a) Enter them directly if your keyboard supports that and you are
- using a Latin-1 font.
- Doxygen will translate the characters to proper Latex and
- leave the Html and man output for what it is (which is fine, if
- idLanguageCharset() is set correctly).
- b) Use html codes like &auml; for an a with an umlaut (i.e. ä).
- See the HTML specification for the codes.
-6) Run configure and make again from the root of the distribution,
- in order to regenerate the Makefiles.
-7) Now you can use OUTPUT_LANGUAGE = your_language_name
- in the config file to generate output in your language.
-8) Send translator_xx.h to me so I can add it to doxygen.
- Send also your name and e-mail address to be included in the
- maintainers.txt list.
-
-Good luck, and let me know if there are problems.
-
diff --git a/LICENSE b/LICENSE
deleted file mode 100644
index 219ec28..0000000
--- a/LICENSE
+++ /dev/null
@@ -1,340 +0,0 @@
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) yyyy <name of author>
-
- 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.
-
- 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.
-
- 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., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
-
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) yyyy name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
-Public License instead of this License.
diff --git a/Makefile.in b/Makefile.in
deleted file mode 100644
index 84783ea..0000000
--- a/Makefile.in
+++ /dev/null
@@ -1,109 +0,0 @@
-#all: src/version.cpp doxywizard
-# cd qtools ; $(MAKE)
-# cd src ; $(MAKE)
-
-clean: FORCE
- cd examples ; $(MAKE) clean
- cd doc ; $(MAKE) clean
- cd qtools ; $(MAKE) clean
- cd src ; $(MAKE) clean
- cd libpng ; $(MAKE) clean
- cd libmd5 ; $(MAKE) clean
- cd addon/doxywizard ; $(MAKE) clean
- cd addon/doxmlparser/src ; $(MAKE) clean
- cd addon/doxmlparser/test ; $(MAKE) clean
- cd addon/doxmlparser/examples/metrics ; $(MAKE) clean
- -rm -f bin/doxy*
- -rm -f objects/*.o
-
-distclean: clean
- cd src ; $(MAKE) distclean
- cd libpng ; $(MAKE) distclean
- cd libmd5 ; $(MAKE) distclean
- cd addon/doxywizard ; $(MAKE) distclean
- cd addon/doxmlparser/src ; $(MAKE) distclean
- cd addon/doxmlparser/test ; $(MAKE) distclean
- cd addon/doxmlparser/examples/metrics ; $(MAKE) distclean
- -rm -f lib/lib*
- -rm -f bin/doxy*
- -rm -f html
- -rm -f latex
- -rm -f objects/*.o
- -rm -f src/Makefile.doxygen src/Makefile.libdoxygen
- -rm -f src/Makefile.doxytag src/Makefile.libdoxycfg
- -rm -f libpng/Makefile.libpng
- -rm -f libmd5/Makefile.libmd5
- -rm -f Makefile qtools/Makefile src/Makefile examples/Makefile doc/Makefile
- -rm -f .makeconfig .tmakeconfig
- -rm -f src/doxygen.pro src/libdoxygen.pro src/doxytag.pro qtools/qtools.pro src/libdoxycfg.pro libpng/libpng.pro libmd5/libmd5.pro
- -rm -f src/version.cpp
- -rm -r addon/doxywizard/Makefile
- -rm -f addon/doxywizard/Makefile.doxywizard
- -rm -f addon/doxywizard/doxywizard.pro
- -rm -f addon/doxywizard/obj/*.o
- -rm -f addon/doxywizard/moc/moc_*
- -rm -f addon/doxywizard/config.cpp
-
-DATE=$(shell date "+%B %Y")
-
-MAN1DIR = man/man1
-
-install: doxywizard_install
- $(INSTTOOL) -d $(INSTALL)/bin
- $(INSTTOOL) -m 755 bin/doxygen $(INSTALL)/bin
- $(INSTTOOL) -m 755 bin/doxytag $(INSTALL)/bin
- $(INSTTOOL) -d $(INSTALL)/$(MAN1DIR)
- cat doc/doxygen.1 | sed -e "s/DATE/$(DATE)/g" -e "s/VERSION/$(VERSION)/g" > $(INSTALL)/$(MAN1DIR)/doxygen.1 ; \
- cat doc/doxytag.1 | sed -e "s/DATE/$(DATE)/g" -e "s/VERSION/$(VERSION)/g" > $(INSTALL)/$(MAN1DIR)/doxytag.1 ; \
- cat doc/doxywizard.1 | sed -e "s/DATE/$(DATE)/g" -e "s/VERSION/$(VERSION)/g" > $(INSTALL)/$(MAN1DIR)/doxywizard.1 ;
-
-install_docs:
- $(INSTTOOL) -d $(DOCDIR)
- cp -r doc $(DOCDIR)
- cp -r examples $(DOCDIR)
- echo "DOXYGEN = $(INSTALL)" > $(DOCDIR)/doc/Makefile
- echo "DOXYDOCS = .." >> $(DOCDIR)/doc/Makefile
- echo "VERSION = $(VERSION)" >> $(DOCDIR)/doc/Makefile
- echo "PERL = $(PERL)" >> $(DOCDIR)/doc/Makefile
- cat doc/Makefile.in >> $(DOCDIR)/doc/Makefile
- cd $(DOCDIR)/examples ; $(MAKE)
- cd $(DOCDIR)/doc ; $(MAKE)
- rm -rf $(DOCDIR)/doc
- cd $(DOCDIR)/latex ; $(MAKE)
- cp $(DOCDIR)/latex/doxygen_manual.pdf $(DOCDIR)
- rm -rf $(DOCDIR)/latex
-
-docs: FORCE
- cd examples ; $(MAKE)
- cd doc ; $(MAKE)
-
-pdf: docs
- cd latex ; $(MAKE)
-
-DISTFILES = Doxyfile libpng libmd5 addon tmake doc wintools examples bin lib objects \
- qtools src configure configure.bin Makefile.in Makefile.win_nmake.in \
- Makefile.win_make.in INSTALL make.bat LANGUAGE.HOWTO LICENSE PLATFORMS \
- VERSION packages
-
-archive: clean
- tar zcvf dx`date +%y%m%d`.tgz $(DISTFILES)
-
-DISTDIR = doxygen-`echo $(VERSION) | tr - _`
-
-dist: clean
- rm -rf $(DISTDIR)
- mkdir $(DISTDIR)
- cp -a $(DISTFILES) README $(DISTDIR)
- find $(DISTDIR) \( -name "CVS" -o -name ".cvsignore" \) \
- -print0 | xargs -0 rm -rf
- tar zcvf $(DISTDIR).src.tar.gz $(DISTDIR)
- rm -rf $(DISTDIR)
-
-src/version.cpp: Makefile
- echo "char versionString[]=\"$(VERSION)\";" > src/version.cpp
-
-addon/doxywizard/version.cpp: Makefile
- echo "char versionString[]=\"$(VERSION)\";" > addon/doxywizard/version.cpp
-
-FORCE:
-
diff --git a/Makefile.win_make.in b/Makefile.win_make.in
deleted file mode 100644
index 8635696..0000000
--- a/Makefile.win_make.in
+++ /dev/null
@@ -1,33 +0,0 @@
-all: src\version.cpp
- set TMAKEPATH=$(TMAKEPATH) & cd qtools & $(MAKE)
- set TMAKEPATH=$(TMAKEPATH) & cd libpng & $(MAKE)
- set TMAKEPATH=$(TMAKEPATH) & cd libmd5 & $(MAKE)
- set TMAKEPATH=$(TMAKEPATH) & cd src & $(MAKE)
-
-clean:
- cd examples & $(MAKE) clean
- cd doc & $(MAKE) clean
- cd src & $(MAKE) clean
- -del bin\doxy*.*
- -del objects\*.o
-
-distclean: clean
- -del src\Makefile.libdoxygen \
- src\Makefile.doxygen \
- src\Makefile.doxytag \
- src\Makefile.libdoxycfg
- -del Makefile src\Makefile examples\Makefile doc\Makefile
- -del src\libdoxygen.pro src\doxygen.pro src\doxytag.pro src\libdoxycfg.pro
- -del src\version.cpp
-
-docs:
- set TMAKEPATH=$(TMAKEPATH) & cd examples & $(MAKE)
- set TMAKEPATH=$(TMAKEPATH) & cd doc & $(MAKE)
-
-ps: docs
- cd latex & $(MAKE)
-
-src\version.cpp: Makefile
- echo char versionString[]="""$(VERSION)"""; > src\version.cpp
-
-FORCE:
diff --git a/Makefile.win_nmake.in b/Makefile.win_nmake.in
deleted file mode 100644
index d618b6c..0000000
--- a/Makefile.win_nmake.in
+++ /dev/null
@@ -1,52 +0,0 @@
-all: src\version.cpp
- set TMAKEPATH=$(TMAKEPATH)
- cd qtools
- $(MAKE)
- cd ..
- cd libpng
- $(MAKE)
- cd ..
- cd libmd5
- $(MAKE)
- cd ..
- cd src
- $(MAKE)
-
-clean: FORCE
- cd examples
- $(MAKE) clean
- cd ..
- cd doc
- $(MAKE) clean
- cd ..
- cd src
- $(MAKE) clean
- cd ..
- -del bin\doxy*.*
- -del objects\*.o
-
-distclean: clean
- -del src\Makefile.libdoxygen \
- src\Makefile.doxygen \
- src\Makefile.doxytag \
- src\Makefile.libdoxycfg
- -del Makefile src\Makefile examples\Makefile doc\Makefile
- -del src\libdoxygen.pro src\doxygen.pro src\doxytag.pro src\libdoxycfg.pro
- -del src\version.cpp
-
-docs: FORCE
- cd examples
- $(MAKE)
- cd ..
- cd doc
- $(MAKE)
- cd ..
-
-ps: docs
- cd latex
- $(MAKE)
-
-src\version.cpp: Makefile
- echo char versionString[]="$(VERSION)"; > src\version.cpp
-
-FORCE:
diff --git a/PLATFORMS b/PLATFORMS
deleted file mode 100644
index 8f87302..0000000
--- a/PLATFORMS
+++ /dev/null
@@ -1,28 +0,0 @@
-aix-g++
-aix-xlc
-beos-g++
-dgux-g++
-freebsd-g++
-gnu-g++
-hpux-acc
-hpux-cc
-hpux-g++
-irix-64
-irix-dcc
-irix-g++
-irix-n32
-linux-g++
-macosx-c++
-m68k-atari-mint-g++
-netbsd-g++
-openbsd-g++
-osf1-cxx
-osf1-g++
-qnx-g++
-sco-g++
-solaris-cc
-solaris-g++
-sunos-g++
-ultrix-g++
-unixware-g++
-win32-g++
diff --git a/README b/README
deleted file mode 100644
index b45591c..0000000
--- a/README
+++ /dev/null
@@ -1,20 +0,0 @@
-DOXYGEN Version 1.4.4
-
-Please read INSTALL for compilation instructions.
-
-The latest version of doxygen can be obtained at
- http://www.doxygen.org/
-
-There are two mailing lists
- doxygen-users@lists.sourceforge.net
- doxygen-develop@lists.sourceforge.net
-
-please follow the link in
-
- http://sourceforge.net/projects/doxygen
-
-to subscribe to the lists or to visit the archives.
-
-Enjoy,
-
-Dimitri van Heesch (dimitri@stack.nl) (06 August 2005)
diff --git a/addon/doxmlparser/Doxyfile b/addon/doxmlparser/Doxyfile
deleted file mode 100644
index faf4bee..0000000
--- a/addon/doxmlparser/Doxyfile
+++ /dev/null
@@ -1,177 +0,0 @@
-# Doxyfile 1.2.12-20011209
-
-#---------------------------------------------------------------------------
-# General configuration options
-#---------------------------------------------------------------------------
-PROJECT_NAME = doxmlparser
-PROJECT_NUMBER =
-OUTPUT_DIRECTORY = doc
-OUTPUT_LANGUAGE = English
-EXTRACT_ALL = YES
-EXTRACT_PRIVATE = YES
-EXTRACT_STATIC = YES
-EXTRACT_LOCAL_CLASSES = YES
-HIDE_UNDOC_MEMBERS = NO
-HIDE_UNDOC_CLASSES = NO
-BRIEF_MEMBER_DESC = YES
-REPEAT_BRIEF = YES
-ALWAYS_DETAILED_SEC = NO
-INLINE_INHERITED_MEMB = NO
-FULL_PATH_NAMES = NO
-STRIP_FROM_PATH =
-INTERNAL_DOCS = NO
-STRIP_CODE_COMMENTS = YES
-CASE_SENSE_NAMES = YES
-SHORT_NAMES = NO
-HIDE_SCOPE_NAMES = NO
-VERBATIM_HEADERS = YES
-SHOW_INCLUDE_FILES = YES
-JAVADOC_AUTOBRIEF = NO
-INHERIT_DOCS = YES
-INLINE_INFO = YES
-SORT_MEMBER_DOCS = YES
-DISTRIBUTE_GROUP_DOC = NO
-TAB_SIZE = 8
-GENERATE_TODOLIST = YES
-GENERATE_TESTLIST = YES
-GENERATE_BUGLIST = YES
-ALIASES =
-ENABLED_SECTIONS =
-MAX_INITIALIZER_LINES = 30
-OPTIMIZE_OUTPUT_FOR_C = NO
-SHOW_USED_FILES = YES
-#---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-QUIET = NO
-WARNINGS = YES
-WARN_IF_UNDOCUMENTED = YES
-WARN_FORMAT =
-WARN_LOGFILE =
-#---------------------------------------------------------------------------
-# configuration options related to the input files
-#---------------------------------------------------------------------------
-INPUT = include
-FILE_PATTERNS = *.h
-RECURSIVE = NO
-EXCLUDE =
-EXCLUDE_PATTERNS =
-EXAMPLE_PATH =
-EXAMPLE_PATTERNS =
-EXAMPLE_RECURSIVE = NO
-IMAGE_PATH =
-INPUT_FILTER =
-FILTER_SOURCE_FILES = NO
-#---------------------------------------------------------------------------
-# configuration options related to source browsing
-#---------------------------------------------------------------------------
-SOURCE_BROWSER = YES
-INLINE_SOURCES = NO
-REFERENCED_BY_RELATION = YES
-REFERENCES_RELATION = YES
-#---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
-#---------------------------------------------------------------------------
-ALPHABETICAL_INDEX = NO
-COLS_IN_ALPHA_INDEX = 5
-IGNORE_PREFIX =
-#---------------------------------------------------------------------------
-# configuration options related to the HTML output
-#---------------------------------------------------------------------------
-GENERATE_HTML = YES
-HTML_OUTPUT =
-HTML_HEADER =
-HTML_FOOTER =
-HTML_STYLESHEET =
-HTML_ALIGN_MEMBERS = YES
-GENERATE_HTMLHELP = NO
-GENERATE_CHI = NO
-BINARY_TOC = NO
-TOC_EXPAND = NO
-DISABLE_INDEX = NO
-ENUM_VALUES_PER_LINE = 4
-GENERATE_TREEVIEW = NO
-TREEVIEW_WIDTH = 250
-#---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-GENERATE_LATEX = NO
-LATEX_OUTPUT =
-COMPACT_LATEX = NO
-PAPER_TYPE = a4wide
-EXTRA_PACKAGES =
-LATEX_HEADER =
-PDF_HYPERLINKS = NO
-USE_PDFLATEX = NO
-LATEX_BATCHMODE = NO
-#---------------------------------------------------------------------------
-# configuration options related to the RTF output
-#---------------------------------------------------------------------------
-GENERATE_RTF = NO
-RTF_OUTPUT =
-COMPACT_RTF = NO
-RTF_HYPERLINKS = NO
-RTF_STYLESHEET_FILE =
-RTF_EXTENSIONS_FILE =
-#---------------------------------------------------------------------------
-# configuration options related to the man page output
-#---------------------------------------------------------------------------
-GENERATE_MAN = NO
-MAN_OUTPUT =
-MAN_EXTENSION =
-MAN_LINKS = NO
-#---------------------------------------------------------------------------
-# configuration options related to the XML output
-#---------------------------------------------------------------------------
-GENERATE_XML = YES
-#---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
-#---------------------------------------------------------------------------
-GENERATE_AUTOGEN_DEF = NO
-#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
-#---------------------------------------------------------------------------
-ENABLE_PREPROCESSING = YES
-MACRO_EXPANSION = NO
-EXPAND_ONLY_PREDEF = NO
-SEARCH_INCLUDES = YES
-INCLUDE_PATH =
-INCLUDE_FILE_PATTERNS =
-PREDEFINED =
-EXPAND_AS_DEFINED =
-SKIP_FUNCTION_MACROS = YES
-#---------------------------------------------------------------------------
-# Configuration::addtions related to external references
-#---------------------------------------------------------------------------
-TAGFILES = ../../qtools_docs/qtools.tag=../../../../qtools_docs/html
-GENERATE_TAGFILE =
-ALLEXTERNALS = NO
-PERL_PATH =
-#---------------------------------------------------------------------------
-# Configuration options related to the dot tool
-#---------------------------------------------------------------------------
-CLASS_DIAGRAMS = NO
-HAVE_DOT = NO
-CLASS_GRAPH = YES
-COLLABORATION_GRAPH = YES
-TEMPLATE_RELATIONS = YES
-HIDE_UNDOC_RELATIONS = YES
-INCLUDE_GRAPH = YES
-INCLUDED_BY_GRAPH = YES
-GRAPHICAL_HIERARCHY = YES
-DOT_PATH =
-DOTFILE_DIRS =
-MAX_DOT_GRAPH_WIDTH = 1280
-MAX_DOT_GRAPH_HEIGHT = 1024
-GENERATE_LEGEND = YES
-DOT_CLEANUP = YES
-#---------------------------------------------------------------------------
-# Configuration::addtions related to the search engine
-#---------------------------------------------------------------------------
-SEARCHENGINE = NO
-CGI_NAME =
-CGI_URL =
-DOC_URL =
-DOC_ABSPATH =
-BIN_ABSPATH =
-EXT_DOC_PATHS =
diff --git a/addon/doxmlparser/Doxyfile.impl b/addon/doxmlparser/Doxyfile.impl
deleted file mode 100644
index a954db3..0000000
--- a/addon/doxmlparser/Doxyfile.impl
+++ /dev/null
@@ -1,179 +0,0 @@
-# Doxyfile 1.2.13.1
-
-#---------------------------------------------------------------------------
-# General configuration options
-#---------------------------------------------------------------------------
-PROJECT_NAME = doxmlparser
-PROJECT_NUMBER =
-OUTPUT_DIRECTORY = doc_impl
-OUTPUT_LANGUAGE = English
-EXTRACT_ALL = YES
-EXTRACT_PRIVATE = YES
-EXTRACT_STATIC = YES
-EXTRACT_LOCAL_CLASSES = YES
-HIDE_UNDOC_MEMBERS = NO
-HIDE_UNDOC_CLASSES = NO
-BRIEF_MEMBER_DESC = YES
-REPEAT_BRIEF = YES
-ALWAYS_DETAILED_SEC = NO
-INLINE_INHERITED_MEMB = NO
-FULL_PATH_NAMES = NO
-STRIP_FROM_PATH =
-INTERNAL_DOCS = NO
-STRIP_CODE_COMMENTS = YES
-CASE_SENSE_NAMES = YES
-SHORT_NAMES = NO
-HIDE_SCOPE_NAMES = NO
-VERBATIM_HEADERS = YES
-SHOW_INCLUDE_FILES = YES
-JAVADOC_AUTOBRIEF = NO
-INHERIT_DOCS = YES
-INLINE_INFO = YES
-SORT_MEMBER_DOCS = YES
-DISTRIBUTE_GROUP_DOC = NO
-TAB_SIZE = 8
-GENERATE_TODOLIST = YES
-GENERATE_TESTLIST = YES
-GENERATE_BUGLIST = YES
-ALIASES =
-ENABLED_SECTIONS =
-MAX_INITIALIZER_LINES = 30
-OPTIMIZE_OUTPUT_FOR_C = NO
-SHOW_USED_FILES = YES
-#---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-QUIET = NO
-WARNINGS = YES
-WARN_IF_UNDOCUMENTED = YES
-WARN_FORMAT =
-WARN_LOGFILE =
-#---------------------------------------------------------------------------
-# configuration options related to the input files
-#---------------------------------------------------------------------------
-INPUT = src
-FILE_PATTERNS =
-RECURSIVE = NO
-EXCLUDE =
-EXCLUDE_SYMLINKS = NO
-EXCLUDE_PATTERNS =
-EXAMPLE_PATH =
-EXAMPLE_PATTERNS =
-EXAMPLE_RECURSIVE = NO
-IMAGE_PATH =
-INPUT_FILTER =
-FILTER_SOURCE_FILES = NO
-#---------------------------------------------------------------------------
-# configuration options related to source browsing
-#---------------------------------------------------------------------------
-SOURCE_BROWSER = NO
-INLINE_SOURCES = NO
-REFERENCED_BY_RELATION = YES
-REFERENCES_RELATION = YES
-#---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
-#---------------------------------------------------------------------------
-ALPHABETICAL_INDEX = NO
-COLS_IN_ALPHA_INDEX = 5
-IGNORE_PREFIX =
-#---------------------------------------------------------------------------
-# configuration options related to the HTML output
-#---------------------------------------------------------------------------
-GENERATE_HTML = YES
-HTML_OUTPUT =
-HTML_HEADER =
-HTML_FOOTER =
-HTML_STYLESHEET =
-HTML_ALIGN_MEMBERS = YES
-GENERATE_HTMLHELP = NO
-GENERATE_CHI = NO
-BINARY_TOC = NO
-TOC_EXPAND = NO
-DISABLE_INDEX = NO
-ENUM_VALUES_PER_LINE = 4
-GENERATE_TREEVIEW = NO
-TREEVIEW_WIDTH = 250
-#---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-GENERATE_LATEX = NO
-LATEX_OUTPUT =
-COMPACT_LATEX = NO
-PAPER_TYPE = a4wide
-EXTRA_PACKAGES =
-LATEX_HEADER =
-PDF_HYPERLINKS = NO
-USE_PDFLATEX = NO
-LATEX_BATCHMODE = NO
-#---------------------------------------------------------------------------
-# configuration options related to the RTF output
-#---------------------------------------------------------------------------
-GENERATE_RTF = NO
-RTF_OUTPUT =
-COMPACT_RTF = NO
-RTF_HYPERLINKS = NO
-RTF_STYLESHEET_FILE =
-RTF_EXTENSIONS_FILE =
-#---------------------------------------------------------------------------
-# configuration options related to the man page output
-#---------------------------------------------------------------------------
-GENERATE_MAN = NO
-MAN_OUTPUT =
-MAN_EXTENSION =
-MAN_LINKS = NO
-#---------------------------------------------------------------------------
-# configuration options related to the XML output
-#---------------------------------------------------------------------------
-GENERATE_XML = YES
-#---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
-#---------------------------------------------------------------------------
-GENERATE_AUTOGEN_DEF = NO
-#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
-#---------------------------------------------------------------------------
-ENABLE_PREPROCESSING = YES
-MACRO_EXPANSION = YES
-EXPAND_ONLY_PREDEF = YES
-SEARCH_INCLUDES = YES
-INCLUDE_PATH =
-INCLUDE_FILE_PATTERNS =
-PREDEFINED =
-EXPAND_AS_DEFINED = DEFINE_CLS_IMPL
-SKIP_FUNCTION_MACROS = YES
-#---------------------------------------------------------------------------
-# Configuration::addtions related to external references
-#---------------------------------------------------------------------------
-TAGFILES = ../../qtools_docs/qtools.tag=../../../../qtools_docs/html
-GENERATE_TAGFILE =
-ALLEXTERNALS = NO
-EXTERNAL_GROUPS = YES
-PERL_PATH =
-#---------------------------------------------------------------------------
-# Configuration options related to the dot tool
-#---------------------------------------------------------------------------
-CLASS_DIAGRAMS = NO
-HAVE_DOT = YES
-CLASS_GRAPH = YES
-COLLABORATION_GRAPH = YES
-TEMPLATE_RELATIONS = YES
-HIDE_UNDOC_RELATIONS = YES
-INCLUDE_GRAPH = YES
-INCLUDED_BY_GRAPH = YES
-GRAPHICAL_HIERARCHY = YES
-DOT_PATH =
-DOTFILE_DIRS =
-MAX_DOT_GRAPH_WIDTH = 1280
-MAX_DOT_GRAPH_HEIGHT = 1024
-GENERATE_LEGEND = YES
-DOT_CLEANUP = YES
-#---------------------------------------------------------------------------
-# Configuration::addtions related to the search engine
-#---------------------------------------------------------------------------
-SEARCHENGINE = NO
-CGI_NAME =
-CGI_URL =
-DOC_URL =
-DOC_ABSPATH =
-BIN_ABSPATH =
-EXT_DOC_PATHS =
diff --git a/addon/doxmlparser/examples/metrics/.cvsignore b/addon/doxmlparser/examples/metrics/.cvsignore
deleted file mode 100644
index 90512ec..0000000
--- a/addon/doxmlparser/examples/metrics/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-Makefile
-metrics.pro
-Makefile.metrics
-obj
diff --git a/addon/doxmlparser/examples/metrics/Makefile.in b/addon/doxmlparser/examples/metrics/Makefile.in
deleted file mode 100644
index 83cbc28..0000000
--- a/addon/doxmlparser/examples/metrics/Makefile.in
+++ /dev/null
@@ -1,13 +0,0 @@
-all clean depend: Makefile.metrics
- $(MAKE) -f Makefile.metrics $@
-
-distclean: clean
- $(RM) -rf Makefile.metrics metrics.pro Makefile obj
-
-tmake:
- $(ENV) $(PERL) $(TMAKE) metrics.pro >Makefile.metrics
-
-Makefile.metrics: metrics.pro
- $(ENV) $(PERL) $(TMAKE) metrics.pro >Makefile.metrics
-
-install:
diff --git a/addon/doxmlparser/examples/metrics/main.cpp b/addon/doxmlparser/examples/metrics/main.cpp
deleted file mode 100644
index 2c4bee3..0000000
--- a/addon/doxmlparser/examples/metrics/main.cpp
+++ /dev/null
@@ -1,254 +0,0 @@
-/******************************************************************************
- *
- * $Id$
- *
- *
- * Copyright (C) 1997-2003 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.
- *
- */
-
-/*! \mainpage Metrics
- * This is a small example that shows how to use doxygen's XML output and
- * the doxmlparser library. The example shows some very basic code metrics.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <doxmlintf.h>
-
-bool isDocumented(IDocRoot *brief,IDocRoot *detailed)
-{
- bool found=false;
- if (brief)
- {
- IDocIterator *docIt = brief->contents();
- if (docIt->current()) // method has brief description
- {
- found=true;
- }
- docIt->release();
- }
- if (detailed && !found)
- {
- IDocIterator *docIt = detailed->contents();
- if (docIt->current())
- {
- found=true;
- }
- docIt->release();
- }
- return found;
-}
-
-int main(int argc,char **argv)
-{
- if (argc!=2)
- {
- printf("Usage: %s xml_output_dir\n",argv[0]);
- exit(1);
- }
-
- int numClasses=0;
- int numDocClasses=0;
- int numStructs=0;
- int numUnions=0;
- int numInterfaces=0;
- int numExceptions=0;
- int numNamespaces=0;
- int numFiles=0;
- int numGroups=0;
- int numPages=0;
- int numPackages=0;
- int numPubMethods=0;
- int numProMethods=0;
- int numPriMethods=0;
- int numDocPubMethods=0;
- int numDocProMethods=0;
- int numDocPriMethods=0;
- int numFunctions=0;
- int numAttributes=0;
- int numVariables=0;
- int numDocFunctions=0;
- int numDocAttributes=0;
- int numDocVariables=0;
- int numParams=0;
-
- IDoxygen *dox = createObjectModel();
-
- dox->setDebugLevel(0);
-
- if (!dox->readXMLDir(argv[1]))
- {
- printf("Error reading %s/index.xml\n",argv[1]);
- exit(1);
- }
-
- ICompoundIterator *cli = dox->compounds();
- ICompound *comp;
- for (cli->toFirst();(comp=cli->current());cli->toNext())
- {
- printf("Processing %s...\n",comp->name()->latin1());
- bool hasDocs = isDocumented(comp->briefDescription(),comp->detailedDescription());
- switch (comp->kind())
- {
- case ICompound::Class:
- numClasses++;
- if (hasDocs) numDocClasses++;
- break;
- case ICompound::Struct: numStructs++; break;
- case ICompound::Union: numUnions++; break;
- case ICompound::Interface: numInterfaces++; break;
- case ICompound::Exception: numExceptions++; break;
- case ICompound::Namespace: numNamespaces++; break;
- case ICompound::File: numFiles++; break;
- case ICompound::Group: numGroups++; break;
- case ICompound::Page: numPages++; break;
- default: break;
- }
-
- ISectionIterator *sli = comp->sections();
- ISection *sec;
- for (sli->toFirst();(sec=sli->current());sli->toNext())
- {
- IMemberIterator *mli = sec->members();
- IMember *mem;
- for (mli->toFirst();(mem=mli->current());mli->toNext())
- {
- IParamIterator *pli = mem->parameters();
- IParam *par;
- if (comp->kind()==ICompound::Class ||
- comp->kind()==ICompound::Struct ||
- comp->kind()==ICompound::Interface
- )
- {
- if (mem->kind()==IMember::Function ||
- mem->kind()==IMember::Prototype ||
- mem->kind()==IMember::Signal ||
- mem->kind()==IMember::Slot ||
- mem->kind()==IMember::DCOP
- ) // is a "method"
- {
- if (mem->section()->isPublic())
- {
- numPubMethods++;
- if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
- {
- numDocPubMethods++;
- }
- }
- else if (mem->section()->isProtected())
- {
- numProMethods++;
- if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
- {
- numDocProMethods++;
- }
- }
- else if (mem->section()->isPrivate())
- {
- numPriMethods++;
- if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
- {
- numDocPriMethods++;
- }
- }
- }
- else if (mem->kind()==IMember::Variable ||
- mem->kind()==IMember::Property
- ) // is an "attribute"
- {
- numAttributes++;
- if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
- {
- numDocAttributes++;
- }
- }
- }
- else if (comp->kind()==ICompound::File ||
- comp->kind()==ICompound::Namespace
- )
- {
- if (mem->kind()==IMember::Function ||
- mem->kind()==IMember::Prototype ||
- mem->kind()==IMember::Signal ||
- mem->kind()==IMember::Slot ||
- mem->kind()==IMember::DCOP
- ) // is a "method"
- {
- numFunctions++;
- if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
- {
- numDocFunctions++;
- }
- }
- else if (mem->kind()==IMember::Variable ||
- mem->kind()==IMember::Property
- ) // is an "attribute"
- {
- numVariables++;
- if (isDocumented(mem->briefDescription(),mem->detailedDescription()))
- {
- numDocVariables++;
- }
- }
- }
-
- for (pli->toFirst();(par=pli->current());pli->toNext())
- {
- numParams++;
- }
- const char *type = mem->typeString()->latin1();
- if (type && strcmp(type, "void"))
- {
- numParams++; // count non-void return types as well
- }
- pli->release();
- }
- mli->release();
- }
- sli->release();
-
- comp->release();
- }
- cli->release();
-
- dox->release();
-
- int numMethods = numPubMethods+numProMethods+numPriMethods;
- int numDocMethods = numDocPubMethods+numDocProMethods+numDocPriMethods;
-
- printf("Metrics:\n");
- printf("-----------------------------------\n");
- if (numClasses>0) printf("Classes: %10d (%d documented)\n",numClasses,numDocClasses);
- if (numStructs>0) printf("Structs: %10d\n",numStructs);
- if (numUnions>0) printf("Unions: %10d\n",numUnions);
- if (numInterfaces>0) printf("Interfaces: %10d\n",numInterfaces);
- if (numExceptions>0) printf("Exceptions: %10d\n",numExceptions);
- if (numNamespaces>0) printf("Namespaces: %10d\n",numNamespaces);
- if (numFiles>0) printf("Files: %10d\n",numFiles);
- if (numGroups>0) printf("Groups: %10d\n",numGroups);
- if (numPages>0) printf("Pages: %10d\n",numPages);
- if (numPackages>0) printf("Packages: %10d\n",numPackages);
- if (numMethods>0) printf("Methods: %10d (%d documented)\n",numMethods,numDocMethods);
- if (numPubMethods>0) printf(" Public: %10d (%d documented)\n",numPubMethods,numDocPubMethods);
- if (numProMethods>0) printf(" Protected: %10d (%d documented)\n",numProMethods,numDocProMethods);
- if (numPriMethods>0) printf(" Private: %10d (%d documented)\n",numPriMethods,numDocPriMethods);
- if (numFunctions>0) printf("Functions: %10d (%d documented)\n",numFunctions,numDocFunctions);
- if (numAttributes>0) printf("Attributes: %10d (%d documented)\n",numAttributes,numDocAttributes);
- if (numVariables>0) printf("Variables: %10d (%d documented)\n",numVariables,numDocVariables);
- if (numParams>0) printf("Params: %10d\n",numParams);
- printf("-----------------------------------\n");
- if (numClasses>0) printf("Avg. #methods/compound: %10f\n",(double)numMethods/(double)numClasses);
- if (numMethods>0) printf("Avg. #params/method: %10f\n",(double)numParams/(double)numMethods);
- printf("-----------------------------------\n");
-
- return 0;
-}
-
diff --git a/addon/doxmlparser/examples/metrics/metrics.pro.in b/addon/doxmlparser/examples/metrics/metrics.pro.in
deleted file mode 100644
index 6dd344f..0000000
--- a/addon/doxmlparser/examples/metrics/metrics.pro.in
+++ /dev/null
@@ -1,20 +0,0 @@
-TEMPLATE = app.t
-CONFIG = console warn_on $extraopts
-HEADERS =
-SOURCES = main.cpp
-unix:LIBS += -L../../../../lib -L../../lib -ldoxmlparser -lqtools
-win32:INCLUDEPATH += .
-win32-mingw:LIBS += -L../../../../lib -L../../lib -ldoxmlparser -lqtools
-win32-msvc:LIBS += doxmlparser.lib qtools.lib shell32.lib
-win32-msvc:TMAKE_LFLAGS += /LIBPATH:..\..\..\..\lib;..\..\lib
-win32-borland:LIBS += doxmlparser.lib qtools.lib shell32.lib
-win32-borland:TMAKE_LFLAGS += -L..\..\..\..\lib -L..\..\lib
-win32:TMAKE_CXXFLAGS += -DQT_NODLL
-DESTDIR =
-OBJECTS_DIR = obj
-TARGET = metrics
-DEPENDPATH = ../../include
-INCLUDEPATH += ../../../../qtools ../../include
-unix:TARGETDEPS = ../../lib/libdoxmlparser.a
-win32:TARGETDEPS = ..\..\lib\doxmlparser.lib
-
diff --git a/addon/doxmlparser/include/doxmlintf.h b/addon/doxmlparser/include/doxmlintf.h
deleted file mode 100644
index 79dc763..0000000
--- a/addon/doxmlparser/include/doxmlintf.h
+++ /dev/null
@@ -1,1101 +0,0 @@
-/******************************************************************************
- *
- * $Id$
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#ifndef _DOXMLINTF_H
-#define _DOXMLINTF_H
-
-/*! \file
- * \brief The interface to the object model provided by the XML parser
- * library.
- *
- * To start using this library one calls createObjectModel() and then
- * uses the returned IDoxygen interface to read doxygen generated
- * XML output and navigate through the information contained in it.
- *
- * @see createObjectModel()
- */
-
-class IMember;
-class IDocIterator;
-class ICompound;
-class ISection;
-class INode;
-class IDocInternal;
-class IDocRoot;
-
-/*! \brief Read only interface to a string.
- */
-class IString
-{
- public:
- /*! Returns a latin1 character representation of the string. */
- virtual const char *latin1() const = 0;
- /*! Returns a 16-bit unicode character representation of the character at
- * position \a index in the string. The first character is at index 0.
- */
- virtual unsigned short unicodeCharAt(int index) const = 0;
- /*! Returns true if this string is empty or false otherwise */
- virtual bool isEmpty() const = 0;
- /*! Returns the number of characters in the string. */
- virtual int length() const = 0;
-};
-
-/*! \brief Base interface for hyperlinked text
- *
- * Depending on the result of kind() the interface is extended by
- * ILT_Text or ILT_Ref.
- */
-class ILinkedText
-{
- public:
- enum Kind { Kind_Text, Kind_Ref };
- virtual Kind kind() const = 0;
-};
-
-/*! \brief Plain text fragment.
- */
-class ILT_Text : public ILinkedText
-{
- public:
- virtual const IString *text() const = 0;
-};
-
-/*! \brief Reference to an object.
- */
-class ILT_Ref : public ILinkedText
-{
- public:
- enum TargetKind { Member, Compound };
- virtual const IString *id() const = 0;
- virtual TargetKind targetKind() const = 0;
- virtual const IString *external() const = 0;
- virtual const IString *text() const = 0;
-};
-
-/*! \brief Iterates over a list of ILinkedText fragments.
- */
-class ILinkedTextIterator
-{
- public:
- virtual ILinkedText *toFirst() = 0;
- virtual ILinkedText *toLast() = 0;
- virtual ILinkedText *toNext() = 0;
- virtual ILinkedText *toPrev() = 0;
- virtual ILinkedText *current() const = 0;
- virtual void release() = 0;
-};
-
-/*! \brief Representation of a parameter of a function. */
-class IParam
-{
- public:
- virtual ILinkedTextIterator *type() const = 0;
- virtual const IString * declarationName() const = 0;
- virtual const IString * definitionName() const = 0;
- virtual const IString * attrib() const = 0;
- virtual const IString * arraySpecifier() const = 0;
- virtual ILinkedTextIterator *defaultValue() const = 0;
- virtual IDocRoot *briefDescription() const = 0;
-};
-
-class IParamIterator
-{
- public:
- virtual IParam *toFirst() = 0;
- virtual IParam *toLast() = 0;
- virtual IParam *toNext() = 0;
- virtual IParam *toPrev() = 0;
- virtual IParam *current() const = 0;
- virtual void release() = 0;
-};
-
-class IMemberReference
-{
- public:
- virtual IMember *member() const = 0;
- virtual const IString * name() const = 0;
- virtual const IString * scope() const = 0;
- virtual const IString * protection() const = 0;
- virtual const IString * virtualness() const = 0;
- virtual const IString * ambiguityScope() const = 0;
-};
-
-class IMemberReferenceIterator
-{
- public:
- virtual IMemberReference *toFirst() = 0;
- virtual IMemberReference *toLast() = 0;
- virtual IMemberReference *toNext() = 0;
- virtual IMemberReference *toPrev() = 0;
- virtual IMemberReference *current() const = 0;
- virtual void release() = 0;
-};
-
-class IDoc
-{
- public:
- enum Kind
- {
- Invalid = 0, // 0
- Para, // 1 -> IDocPara
- Text, // 2 -> IDocText
- MarkupModifier, // 3 -> IDocMarkupModifier
- ItemizedList, // 4 -> IDocItemizedList
- OrderedList, // 5 -> IDocOrderedList
- ListItem, // 6 -> IDocListItem
- ParameterList, // 7 -> IDocParameterList
- Parameter, // 8 -> IDocParameter
- SimpleSect, // 9 -> IDocSimpleSect
- Title, // 10 -> IDocTitle
- Ref, // 11 -> IDocRef
- VariableList, // 12 -> IDocVariableList
- VariableListEntry, // 13 -> IDocVariableListEntry
- HRuler, // 14 -> IDocHRuler
- LineBreak, // 15 -> IDocLineBreak
- ULink, // 16 -> IDocULink
- EMail, // 17 -> IDocEMail
- Link, // 18 -> IDocLink
- ProgramListing, // 19 -> IDocProgramListing
- CodeLine, // 20 -> IDocCodeLine
- Highlight, // 21 -> IDocHighlight
- Formula, // 22 -> IDocFormula
- Image, // 23 -> IDocImage
- DotFile, // 24 -> IDocDotFile
- IndexEntry, // 25 -> IDocIndexEntry
- Table, // 26 -> IDocTable
- Row, // 27 -> IDocRow
- Entry, // 28 -> IDocEntry
- Section, // 29 -> IDocSection
- Verbatim, // 30 -> IDocVerbatim
- Copy, // 31 -> IDocCopy
- TocList, // 32 -> IDocTocList
- TocItem, // 33 -> IDocTocItem
- Anchor, // 34 -> IDocAnchor
- Symbol, // 35 -> IDocSymbol
- Internal, // 36 -> IDocInternal
- Root, // 37 -> IDocRoot
- ParameterItem // 38 -> IDocParameterItem
- };
- virtual Kind kind() const = 0;
-};
-
-class IDocMarkup : public IDoc
-{
- public:
- enum Markup
- {
- Normal = 0x000,
- Bold = 0x001,
- Emphasis = 0x002,
- ComputerOutput = 0x004,
- Subscript = 0x008,
- Superscript = 0x010,
- SmallFont = 0x020,
- Center = 0x040,
- Preformatted = 0x080,
- Heading = 0x100
- };
-};
-
-class IDocPara : public IDoc
-{
- public:
- virtual IDocIterator *contents() const = 0;
-};
-
-class IDocText : public IDocMarkup
-{
- public:
- virtual const IString * text() const = 0;
- virtual int markup() const = 0;
- virtual int headingLevel() const = 0;
-};
-
-class IDocMarkupModifier : public IDoc
-{
- public:
- virtual bool enabled() const = 0;
- virtual int markup() const = 0;
- virtual int headingLevel() const = 0;
-};
-
-class IDocItemizedList : public IDoc
-{
- public:
- virtual IDocIterator *elements() const = 0;
-};
-
-class IDocOrderedList : public IDoc
-{
- public:
- virtual IDocIterator *elements() const = 0;
-};
-
-class IDocListItem : public IDoc
-{
- public:
- virtual IDocIterator *contents() const = 0;
-};
-
-class IDocParameterList : public IDoc
-{
- public:
- enum Types { Param, RetVal, Exception };
- virtual Types sectType() const = 0;
- virtual IDocIterator *params() const = 0;
-};
-
-class IDocParameterItem : public IDoc
-{
- public:
- virtual IDocIterator *paramNames() const = 0;
- virtual IDocPara *description() const = 0;
-};
-
-class IDocParameter : public IDoc
-{
- public:
- virtual const IString * name() const = 0;
-};
-
-class IDocTitle : public IDoc
-{
- public:
- virtual IDocIterator *title() const = 0;
-};
-
-class IDocSimpleSect : public IDoc
-{
- public:
- enum Types { Invalid = 0,
- See, Return, Author, Version,
- Since, Date, Bug, Note,
- Warning, Par, Deprecated, Pre,
- Post, Invar, Remark, Attention,
- Todo, Test, RCS, EnumValues,
- Examples
- };
- virtual Types type() const = 0;
- virtual const IString * typeString() const = 0;
- virtual IDocTitle *title() const = 0;
- virtual IDocPara *description() const = 0;
-};
-
-class IDocRef : public IDoc
-{
- public:
- enum TargetKind { Member, Compound };
- virtual const IString * refId() const = 0;
- virtual TargetKind targetKind() const = 0;
- virtual const IString * external() const = 0;
- virtual const IString * text() const = 0;
-};
-
-class IDocVariableList : public IDoc
-{
- public:
- virtual IDocIterator *entries() const = 0;
-};
-
-class IDocVariableListEntry : public IDoc
-{
- public:
- virtual ILinkedTextIterator * term() const = 0;
- virtual IDocPara *description() const = 0;
-};
-
-class IDocHRuler : public IDoc
-{
-};
-
-class IDocLineBreak : public IDoc
-{
-};
-
-class IDocULink : public IDoc
-{
- public:
- virtual const IString * url() const = 0;
- virtual const IString * text() const = 0;
-};
-
-class IDocEMail : public IDoc
-{
- public:
- virtual const IString * address() const = 0;
-};
-
-class IDocLink : public IDoc
-{
- public:
- virtual const IString * refId() const = 0;
- virtual const IString * text() const = 0;
-};
-
-class IDocProgramListing : public IDoc
-{
- public:
- virtual IDocIterator *codeLines() const = 0;
-};
-
-class IDocCodeLine : public IDoc
-{
- public:
- virtual int lineNumber() const = 0;
- virtual const IString * refId() const = 0;
- virtual IDocIterator *codeElements() const = 0;
-};
-
-class IDocHighlight : public IDoc
-{
- public:
- enum HighlightKind
- { Invalid=0,
- Comment, Keyword,
- KeywordType, KeywordFlow, CharLiteral,
- StringLiteral, Preprocessor
- };
- virtual HighlightKind highlightKind() const = 0;
- virtual IDocIterator *codeElements() const = 0;
-};
-
-class IDocFormula : public IDoc
-{
- public:
- virtual const IString * id() const = 0;
- virtual const IString * text() const = 0;
-};
-
-class IDocImage : public IDoc
-{
- public:
- virtual const IString * name() const = 0;
- virtual const IString * caption() const = 0;
-};
-
-class IDocDotFile : public IDoc
-{
- public:
- virtual const IString * name() const = 0;
- virtual const IString * caption() const = 0;
-};
-
-class IDocIndexEntry : public IDoc
-{
- public:
- virtual const IString * primary() const = 0;
- virtual const IString * secondary() const = 0;
-};
-
-class IDocTable : public IDoc
-{
- public:
- virtual IDocIterator *rows() const = 0;
- virtual int numColumns() const = 0;
- virtual const IString * caption() const = 0;
-};
-
-class IDocRow : public IDoc
-{
- public:
- virtual IDocIterator *entries() const = 0;
-};
-
-class IDocEntry : public IDoc
-{
- public:
- virtual IDocIterator *contents() const = 0;
-};
-
-class IDocSection : public IDoc
-{
- public:
- virtual const IString * id() const = 0;
- virtual int level() const = 0;
- virtual IDocTitle *title() const = 0;
- virtual IDocIterator *paragraphs() const = 0;
- virtual IDocIterator *subSections() const = 0;
- virtual IDocInternal *internal() const = 0;
-};
-
-class IDocInternal : public IDoc
-{
- public:
- virtual IDocIterator *paragraphs() const = 0;
- virtual IDocIterator *subSections() const = 0;
-};
-
-class IDocTocList : public IDoc
-{
- public:
- virtual IDocIterator *elements() const = 0;
-};
-
-class IDocTocItem : public IDoc
-{
- public:
- virtual const IString *id() const = 0;
- virtual const IString *title() const = 0;
-};
-
-class IDocCopy : public IDoc
-{
- public:
- virtual IDocIterator *contents() const = 0;
-};
-
-class IDocVerbatim : public IDoc
-{
- public:
- enum Types { Invalid = 0, HtmlOnly, LatexOnly, Verbatim };
- virtual const IString *text() const = 0;
- virtual Types type() const = 0;
-};
-
-class IDocAnchor : public IDoc
-{
- public:
- virtual const IString *id() const = 0;
-};
-
-class IDocSymbol : public IDoc
-{
- public:
- enum Types
- { Invalid = 0,
- Umlaut, Acute, Grave, Circ, Tilde, Szlig, Cedil, Ring, Nbsp, Copy
- };
- virtual Types type() const = 0;
- virtual const IString * typeString() const = 0;
- virtual char letter() const = 0;
-};
-
-class IDocRoot : public IDoc
-{
- public:
- virtual IDocIterator *contents() const = 0;
- virtual IDocInternal *internal() const = 0;
-};
-
-class IDocIterator
-{
- public:
- virtual IDoc *toFirst() = 0;
- virtual IDoc *toLast() = 0;
- virtual IDoc *toNext() = 0;
- virtual IDoc *toPrev() = 0;
- virtual IDoc *current() const = 0;
- virtual void release() = 0;
-};
-
-class IEdgeLabel
-{
- public:
- virtual const IString * label() const = 0;
-};
-
-class IEdgeLabelIterator
-{
- public:
- virtual IEdgeLabel *toFirst() = 0;
- virtual IEdgeLabel *toLast() = 0;
- virtual IEdgeLabel *toNext() = 0;
- virtual IEdgeLabel *toPrev() = 0;
- virtual IEdgeLabel *current() const = 0;
- virtual void release() = 0;
-};
-
-class IChildNode
-{
- public:
- enum NodeRelation { PublicInheritance, ProtectedInheritance,
- PrivateInheritance, Usage, TemplateInstance
- };
- virtual INode * node() const = 0;
- virtual NodeRelation relation() const = 0;
- virtual const IString * relationString() const = 0;
- virtual IEdgeLabelIterator *edgeLabels() const = 0;
-};
-
-class IChildNodeIterator
-{
- public:
- virtual IChildNode *toFirst() = 0;
- virtual IChildNode *toLast() = 0;
- virtual IChildNode *toNext() = 0;
- virtual IChildNode *toPrev() = 0;
- virtual IChildNode *current() const = 0;
- virtual void release() = 0;
-};
-
-class INode
-{
- public:
- virtual const IString * id() const = 0;
- virtual const IString * label() const = 0;
- virtual const IString * linkId() const = 0;
- virtual IChildNodeIterator *children() const = 0;
-};
-
-class INodeIterator
-{
- public:
- virtual INode *toFirst() = 0;
- virtual INode *toLast() = 0;
- virtual INode *toNext() = 0;
- virtual INode *toPrev() = 0;
- virtual INode *current() const = 0;
- virtual void release() = 0;
-};
-
-class IGraph
-{
- public:
- virtual INodeIterator *nodes() const = 0;
-};
-
-class IMember
-{
- public:
- enum MemberKind { Invalid=0,
- Define, Property, Variable, Typedef, Enum,
- Function, Signal, Prototype, Friend, DCOP, Slot,
- EnumValue
- };
- virtual ICompound *compound() const = 0;
- virtual ISection *section() const = 0;
- virtual MemberKind kind() const = 0;
- virtual const IString * kindString() const = 0;
- virtual const IString * id() const = 0;
- virtual const IString * protection() const = 0;
- virtual const IString * virtualness() const = 0;
- virtual ILinkedTextIterator *type() const = 0;
- virtual const IString * typeString() const = 0;
- virtual const IString * name() const = 0;
- virtual const IString * readAccessor() const = 0;
- virtual const IString * writeAccessor() const = 0;
- virtual const IString * definition() const = 0;
- virtual const IString * argsstring() const = 0;
- virtual bool isConst() const = 0;
- virtual bool isVolatile() const = 0;
- virtual bool isStatic() const = 0;
- virtual bool isExplicit() const = 0;
- virtual bool isInline() const = 0;
- virtual bool isMutable() const = 0;
- virtual bool isReadable() const = 0;
- virtual bool isWritable() const = 0;
- virtual IParamIterator *parameters() const = 0;
- virtual IParamIterator *templateParameters() const = 0;
- virtual ILinkedTextIterator *initializer() const = 0;
- virtual ILinkedTextIterator *exceptions() const = 0;
- virtual IMemberReferenceIterator *references() const = 0;
- virtual IMemberReferenceIterator *referencedBy() const = 0;
- virtual const IString *bodyFile() const = 0;
- virtual int bodyStart() const = 0;
- virtual int bodyEnd() const = 0;
- virtual const IString * definitionFile() const = 0;
- virtual int definitionLine() const = 0;
- virtual IMemberReference *reimplements() const = 0;
- virtual IMemberReferenceIterator *reimplementedBy() const = 0;
- virtual IDocRoot *briefDescription() const = 0;
- virtual IDocRoot *detailedDescription() const = 0;
- virtual IDocRoot *inbodyDescription() const = 0;
-};
-
-class IDefine : public IMember
-{
- public:
-};
-
-class IProperty : public IMember
-{
- public:
-};
-
-class IVariable : public IMember
-{
- public:
-};
-
-class ITypedef : public IMember
-{
- public:
-};
-
-class IFunction : public IMember
-{
- public:
-};
-
-class ISignal : public IMember
-{
- public:
-};
-
-class IPrototype : public IMember
-{
- public:
-};
-
-class IFriend : public IMember
-{
- public:
-};
-
-class IDCOP : public IMember
-{
- public:
-};
-
-class ISlot : public IMember
-{
- public:
-};
-
-class IEnumValue : public IMember
-{
- public:
- virtual const IString * name() const = 0;
-};
-
-/*! \brief Include relation
- */
-class IInclude
-{
- public:
- virtual const IString * name() const = 0;
- virtual const IString * refId() const = 0;
- virtual bool isLocal() const = 0;
-};
-
-class IIncludeIterator
-{
- public:
- virtual IInclude *toFirst() = 0;
- virtual IInclude *toLast() = 0;
- virtual IInclude *toNext() = 0;
- virtual IInclude *toPrev() = 0;
- virtual IInclude *current() const = 0;
- virtual void release() = 0;
-};
-
-class IMemberIterator
-{
- public:
- virtual IMember *toFirst() = 0;
- virtual IMember *toLast() = 0;
- virtual IMember *toNext() = 0;
- virtual IMember *toPrev() = 0;
- virtual IMember *current() const = 0;
- virtual void release() = 0;
-};
-
-class IEnum : public IMember
-{
- public:
- virtual IMemberIterator *enumValues() const = 0;
-};
-
-/*! \brief The interface to a section in the object model.
- *
- * A compound can have a number of sections, where each
- * section contains a set of members with the properties implied by
- * the section kind. The kind() method returns the kind of the section.
- * The members of the section can be accessed via members(). Apart
- * from using kind(), some of the individual properties of the section can
- * also be inspected via isStatic(), isPublic(), isProtected() and
- * isPrivate().
- */
-class ISection
-{
- public:
- /*! Possible section types */
- enum SectionKind
- { Invalid=0,
- UserDefined, //!< A user defined member group
- PubTypes, //!< Public member typedefs
- PubFuncs, //!< Public member functions
- PubAttribs, //!< Public member attributes
- PubSlots, //!< Public Qt Slots
- Signals, //!< Qt Signals
- DCOPFuncs, //!< KDE-DCOP interface functions
- Properties, //!< IDL properties
- Events, //!< C# events
- PubStatFuncs, //!< Public static member functions
- PubStatAttribs, //!< Public static attributes
- ProTypes, //!< Protected member typedefs
- ProFuncs, //!< Protected member functions
- ProAttribs, //!< Protected member attributes
- ProSlots, //!< Protected slots
- ProStatFuncs, //!< Protected static member functions
- ProStatAttribs, //!< Protected static member attributes
- PacTypes, //!< Package member typedefs
- PacFuncs, //!< Package member functions
- PacAttribs, //!< Package member attributes
- PacStatFuncs, //!< Package static member functions
- PacStatAttribs, //!< Package static member attributes
- PriTypes, //!< Private member typedefs
- PriFuncs, //!< Private member functions
- PriAttribs, //!< Private member attributes
- PriSlots, //!< Private Qt slots
- PriStatFuncs, //!< Private static member functions
- PriStatAttribs, //!< Private static member attributes
- Friend, //!< Friends
- Related, //!< Function marked as related
- Defines, //!< Preprocessor defines
- Prototypes, //!< Global function prototypes
- Typedefs, //!< Global typedefs
- Enums, //!< Enumerations
- Functions, //!< Global functions
- Variables //!< Global variables
- };
-
- /*! Returns a string representation of the value returned by kind() */
- virtual const IString * kindString() const = 0;
-
- /*! Returns what kind of section this is */
- virtual SectionKind kind() const = 0;
-
- /*! Returns the description attached to this section (for user defined
- * sections, also known as member groups).
- */
- virtual IDocRoot *description() const = 0;
-
- /*! Returns an iterator for the members of this section */
- virtual IMemberIterator *members() const = 0;
-
- /*! Returns \c true if this section contains statics */
- virtual bool isStatic() const = 0;
-
- /*! Returns \c true if this section belongs to a
- * public section of a class
- */
- virtual bool isPublic() const = 0;
-
- /*! Returns \c true if this section belongs to a
- * private section of a class
- */
- virtual bool isPrivate() const = 0;
-
- /*! Returns \c true if this section belongs to a
- * protected section of a class
- * */
- virtual bool isProtected() const = 0;
-};
-
-class IUserDefined : public ISection
-{
- public:
- virtual const IString * header() const = 0;
-};
-
-class ISectionIterator
-{
- public:
- virtual ISection *toFirst() = 0;
- virtual ISection *toLast() = 0;
- virtual ISection *toNext() = 0;
- virtual ISection *toPrev() = 0;
- virtual ISection *current() const = 0;
- virtual void release() = 0;
-};
-
-/*! \brief The interface to a compound in the object model.
- *
- * A compound has a name which can be obtained via the name() method
- * and a unique id, which is return via the id() method.
- * A compound consists zero or more members which are grouped into sections.
- * The sections() method can be used to access the individual sections.
- * Alternatively, members can be obtained by name or id. There are
- * different types of compounds. The kind() method returns what kind of
- * compound this is. Depending on the return value one can dynamically
- * cast an interface pointer to an more specialised interface that provides
- * additional methods.
- * Example:
- * \code
- * ICompound *comp=...;
- * if (comp->kind()==ICompound::Class)
- * {
- * IClass *cls = dynamic_cast<IClass*>(comp);
- * // use methods of IClass
- * }
- * \endcode
- * The documentation that is provided by a compound is available via
- * the briefDescription() and detailedDescription() methods.
- * To avoid excessive memory usage, release() should be called (once) on each
- * compound interface pointer that is no longer needed.
- */
-class ICompound
-{
- public:
- /*! Represents the kind of compounds recognised by doxygen. */
- enum CompoundKind { Invalid=0,
- Class, Struct, Union, Interface, Protocol, Category,
- Exception, File, Namespace, Group, Page, Example, Dir
- };
-
- /*! Returns the name of this compound */
- virtual const IString * name() const = 0;
-
- /*! Returns the id of this compound. The id is a
- * unique string representing a specific compound object.
- */
- virtual const IString * id() const = 0;
-
- /*! Returns the kind of compound. See #CompoundKind for possible
- * values.
- */
- virtual CompoundKind kind() const = 0;
-
- /*! Returns a string representation of the compound kind.
- * @see kind()
- */
- virtual const IString * kindString() const = 0;
-
- /*! Returns an iterator for the different member sections in this
- * compound.
- */
- virtual ISectionIterator *sections() const = 0;
-
- /*! Returns a tree-structured representation of the brief
- * description that is attached to this compound.
- */
- virtual IDocRoot *briefDescription() const = 0;
-
- /*! Returns a tree-structured representation of the detailed
- * description that is attached to this compound.
- */
- virtual IDocRoot *detailedDescription() const = 0;
-
- /*! Returns an interface to a member given its id.
- * @param id The member id.
- */
- virtual IMember *memberById(const char * id) const = 0;
-
- /*! Returns a list of all members within the compound having a certain
- * name. Member overloading is the reason why there can be more than
- * one member.
- * @param name The name of the member.
- */
- virtual IMemberIterator *memberByName(const char * name) const = 0;
-
- /*! Decreases the reference counter for this compound. If it reaches
- * zero, the memory for the compound will be released.
- */
- virtual void release() = 0;
-};
-
-class ICompoundIterator
-{
- public:
- virtual void toFirst() = 0;
- virtual void toLast() = 0;
- virtual void toNext() = 0;
- virtual void toPrev() = 0;
- virtual ICompound *current() const = 0;
- virtual void release() = 0;
-};
-
-class IRelatedCompound
-{
- public:
- enum Protection { Public, Protected, Private };
- enum Kind { Normal, Virtual };
- virtual ICompound *compound() const = 0;
- virtual Protection protection() const = 0;
- virtual Kind kind() const = 0;
- virtual const IString *name() const = 0;
-
-};
-
-class IRelatedCompoundIterator
-{
- public:
- virtual IRelatedCompound *toFirst() = 0;
- virtual IRelatedCompound *toLast() = 0;
- virtual IRelatedCompound *toNext() = 0;
- virtual IRelatedCompound *toPrev() = 0;
- virtual IRelatedCompound *current() const = 0;
- virtual void release() = 0;
-};
-
-/*! \brief The interface to a class in the object model.
- */
-class IClass : public ICompound
-{
- public:
- virtual IGraph *inheritanceGraph() const = 0;
- virtual IGraph *collaborationGraph() const = 0;
- virtual IRelatedCompoundIterator *baseCompounds() const = 0;
- virtual IRelatedCompoundIterator *derivedCompounds() const = 0;
- virtual ICompoundIterator *nestedCompounds() const = 0;
- virtual IParamIterator *templateParameters() const = 0;
- virtual const IString *locationFile() const = 0;
- virtual int locationLine() const = 0;
- virtual const IString *locationBodyFile() const = 0;
- virtual int locationBodyStartLine() const = 0;
- virtual int locationBodyEndLine() const = 0;
-
- // TODO:
- // class:
- // listOfAllMembers()
- // protection()
- // isAbstract()
-};
-
-/*! \brief The interface to a struct in the object model.
- */
-class IStruct : public ICompound
-{
- public:
- virtual ICompoundIterator *nestedCompounds() const = 0;
- virtual IRelatedCompoundIterator *baseCompounds() const = 0;
- virtual IRelatedCompoundIterator *derivedCompounds() const = 0;
- virtual const IString *locationFile() const = 0;
- virtual int locationLine() const = 0;
- virtual int locationBodyStartLine() const = 0;
- virtual int locationBodyEndLine() const = 0;
-};
-
-/*! \brief The interface to a union in the object model.
- */
-class IUnion : public ICompound
-{
- public:
- virtual ICompoundIterator *nestedCompounds() const = 0;
-};
-
-/*! \brief The interface to a Java/IDL interface in the object model.
- */
-class IInterface : public ICompound
-{
- public:
- virtual IRelatedCompoundIterator *baseCompounds() const = 0;
- virtual IRelatedCompoundIterator *derivedCompounds() const = 0;
-};
-
-
-/*! \brief The interface to a Java/IDL exception in the object model.
- */
-class IException : public ICompound
-{
-};
-
-/*! \brief The interface to a namespace in the object model.
- */
-class INamespace : public ICompound
-{
- public:
- virtual ICompoundIterator *nestedCompounds() const = 0;
-};
-
-/*! \brief The interface to a file in the object model.
- */
-class IFile : public ICompound
-{
- public:
- virtual IGraph *includeDependencyGraph() const = 0;
- virtual IGraph *includedByDependencyGraph() const = 0;
- virtual IDocProgramListing *source() const = 0;
- virtual ICompoundIterator *nestedCompounds() const = 0;
-
- virtual IIncludeIterator *includes() const = 0;
- virtual IIncludeIterator *includedBy() const = 0;
-
- // ICompound *innerNamespaces()
- // ICompoundIterator *innerClasses()
-};
-
-/*! \brief The interface to a group in the object model.
- */
-class IGroup : public ICompound
-{
- public:
- virtual ICompoundIterator *nestedCompounds() const = 0;
- // group:
- // Title()
- // innerFile()
- // innerPage()
-};
-
-/*! \brief The interface to a page in the object model.
- */
-class IPage : public ICompound
-{
- public:
- virtual const IDocTitle *title() const = 0;
-};
-
-/*! Root node of the object model. */
-class IDoxygen
-{
- public:
-
- /*! Returns an iterator that can be used to iterate over the list
- * of compounds found in the project.
- */
- virtual ICompoundIterator *compounds() const = 0;
-
- /*! Returns a compound given its unique \a id. If you have a
- * compound id this function is much more efficient than iterating
- * over the compound list. Returns 0 if the id is not valid.
- */
- virtual ICompound *compoundById(const char * id) const = 0;
-
- /*! Returns a compound given its name (including the scope).
- * Returns 0 if the name is not found in the project.
- */
- virtual ICompound *compoundByName(const char * name) const = 0;
-
- /*! Returns an interface to a compound containing a member given it the
- * member's id. Given the ICompound interface one can use the same id
- * to obtain the IMember interface.
- * @param id The member id.
- */
- virtual ICompound *memberById(const char * id) const = 0;
-
- /*! Returns a list of all compounds containing at least one members
- * with a certain name. Each compound can be asked to return the
- * list of members with that name.
- * @param name The name of the member.
- */
- virtual ICompoundIterator *memberByName(const char * name) const = 0;
-
- /*! Releases the memory for the object hierarchy obtained by
- * createdObjecModelFromXML(). First release all iterators before calling
- * this function.
- */
- virtual void release() = 0;
-
- /*! Sets the debug level.
- * - 0 all debugging messages are disabled (the default).
- * - 1 display important messages only
- * - 2 display any messages.
- */
- virtual void setDebugLevel(int level) = 0;
-
- /*! Reads an XML directory produced by doxygen and builds up a data
- * structure representing the contents of the XML files in the directory.
- */
- virtual bool readXMLDir(const char *xmlDirName) = 0;
-};
-
-/*! Factory method that creates an empty object model for a doxygen generated XML file.
- * Use the readXMLDir() method to build the model from an XML output
- * directory containing doxygen output.
- */
-IDoxygen *createObjectModel();
-
-#endif
diff --git a/addon/doxmlparser/src/.cvsignore b/addon/doxmlparser/src/.cvsignore
deleted file mode 100644
index af1ea36..0000000
--- a/addon/doxmlparser/src/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-Makefile
-doxmlparser.pro
-Makefile.doxmlparser
diff --git a/addon/doxmlparser/src/Makefile.in b/addon/doxmlparser/src/Makefile.in
deleted file mode 100644
index 049f969..0000000
--- a/addon/doxmlparser/src/Makefile.in
+++ /dev/null
@@ -1,13 +0,0 @@
-all clean depend: Makefile.doxmlparser
- $(MAKE) -f Makefile.doxmlparser $@
-
-distclean: clean
- $(RM) -rf Makefile.doxmlparser doxmlparser.pro Makefile obj
-
-tmake:
- $(ENV) $(PERL) $(TMAKE) doxmlparser.pro >Makefile.doxmlparser
-
-Makefile.doxmlparser: doxmlparser.pro
- $(ENV) $(PERL) $(TMAKE) doxmlparser.pro >Makefile.doxmlparser
-
-install:
diff --git a/addon/doxmlparser/src/basehandler.cpp b/addon/doxmlparser/src/basehandler.cpp
deleted file mode 100644
index 02d98c2..0000000
--- a/addon/doxmlparser/src/basehandler.cpp
+++ /dev/null
@@ -1,3 +0,0 @@
-#include "basehandler.h"
-
-QXmlLocator * LocatorContainer::s_theLocator=0;
diff --git a/addon/doxmlparser/src/basehandler.h b/addon/doxmlparser/src/basehandler.h
deleted file mode 100644
index 446f777..0000000
--- a/addon/doxmlparser/src/basehandler.h
+++ /dev/null
@@ -1,325 +0,0 @@
-/******************************************************************************
- *
- * $Id$
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#ifndef _BASEHANDLER_H
-#define _BASEHANDLER_H
-
-#include <qxml.h>
-#include <qdict.h>
-#include <qstring.h>
-
-#include "debug.h"
-
-//-----------------------------------------------------------------------------
-
-class IBaseHandler
-{
- public:
- virtual void setDelegate(QXmlDefaultHandler *delegate) = 0;
- virtual QXmlDefaultHandler *delegate() const = 0;
- virtual ~IBaseHandler() {}
-};
-
-//-----------------------------------------------------------------------------
-
-class IFallBackHandler
-{
- public:
- virtual bool handleStartElement(const QString & name,
- const QXmlAttributes & attrib) = 0;
- virtual bool handleEndElement(const QString &name) = 0;
- virtual ~IFallBackHandler() {}
-};
-
-//-----------------------------------------------------------------------------
-
-template<class T> class ElementMapper
-{
- class StartElementHandler
- {
- typedef void (T::*Handler)(const QXmlAttributes &attrib);
- public:
- StartElementHandler() : m_parent(0) {}
- StartElementHandler(T *parent, Handler h)
- : m_parent(parent), m_handler(h) {}
- void operator()(const QXmlAttributes &attrib)
- { if (m_parent) (m_parent->*m_handler)(attrib); }
- private:
- T *m_parent;
- Handler m_handler;
- };
-
- class EndElementHandler
- {
- typedef void (T::*Handler)();
- public:
- EndElementHandler() : m_parent(0) {}
- EndElementHandler(T *parent, Handler h)
- : m_parent(parent), m_handler(h) {}
- void operator()()
- { if (m_parent) (m_parent->*m_handler)(); }
- private:
- T *m_parent;
- Handler m_handler;
- };
-
- public:
- typedef StartElementHandler StartElementHandlerT;
- typedef EndElementHandler EndElementHandlerT;
-
- ElementMapper() : m_startHandlers(67), m_endHandlers(67)
- {
- m_startHandlers.setAutoDelete(TRUE);
- m_endHandlers.setAutoDelete(TRUE);
- }
- virtual ~ElementMapper()
- {
- }
-
- void addStartHandler(const char *key)
- {
- m_startHandlers.insert(key,new StartElementHandlerT);
- }
-
- void addStartHandler(const char *key, T *obj, void (T::*handler)(const QXmlAttributes &))
- {
- m_startHandlers.insert(key,new StartElementHandlerT(obj,handler));
- }
-
- void addEndHandler(const char *key)
- {
- m_endHandlers.insert(key,new EndElementHandlerT);
- }
-
- void addEndHandler(const char *key, T *obj, void (T::*handler)())
- {
- m_endHandlers.insert(key,new EndElementHandlerT(obj,handler));
- }
-
-
- protected:
- QDict<StartElementHandlerT> m_startHandlers;
- QDict<EndElementHandlerT> m_endHandlers;
-};
-
-//-----------------------------------------------------------------------------
-
-struct LocatorContainer
-{
- static QXmlLocator *s_theLocator;
-};
-
-//-----------------------------------------------------------------------------
-
-template<class T> class BaseHandler : public QXmlDefaultHandler,
- public ElementMapper<T>,
- public LocatorContainer,
- public IBaseHandler
-{
- public:
- typedef typename ElementMapper<T>::StartElementHandlerT StartElementHandlerT;
- typedef typename ElementMapper<T>::EndElementHandlerT EndElementHandlerT;
-
- BaseHandler() : m_delegateHandler(0), m_fallBackHandler(0)
- {
- }
-
- virtual ~BaseHandler()
- {
- ASSERT(m_delegateHandler==0);
- }
-
- virtual bool startDocument()
- {
- return TRUE;
- }
-
- virtual bool startElement( const QString & namespaceURI,
- const QString & localName,
- const QString & name,
- const QXmlAttributes & attrib
- )
- {
- if (m_delegateHandler)
- {
- return m_delegateHandler->startElement(namespaceURI,localName,name,attrib);
- }
- if (!m_skipUntil.isEmpty()) // skip mode
- {
- if (m_skipUntil==name) m_skipCount++;
- debug(1,"line %d, col %d: skipping start tag %s count=%d\n",
- s_theLocator->lineNumber(),s_theLocator->columnNumber(),
- name.data(),m_skipCount);
- return TRUE;
- }
-
- StartElementHandlerT *handler = m_startHandlers[name];
- if (handler)
- {
- (*handler)(attrib);
- //printf("found start tag %s\n",name.data());
- }
- else if (!m_fallBackHandler ||
- !m_fallBackHandler->handleStartElement(name,attrib)
- )
- {
- debug(1,"line %d, col %d: found unexpected tag `%s', skipping until matching end tag\n",
- s_theLocator->lineNumber(),s_theLocator->columnNumber(),
- name.data());
- m_skipUntil = name;
- m_skipCount=1;
- }
- return TRUE;
- }
-
- virtual bool endElement( const QString& namespaceURI, const QString& localName, const QString& name )
- {
- if (m_delegateHandler)
- {
- return m_delegateHandler->endElement(namespaceURI,localName,name);
- }
-
- if (name==m_skipUntil)
- {
- m_skipCount--;
- debug(1,"line %d, col %d: skipping end tag %s count=%d\n",
- s_theLocator->lineNumber(),s_theLocator->columnNumber(),
- name.data(),m_skipCount);
- if (m_skipCount==0)
- {
- m_skipUntil="";
- }
- //printf("found end tag %s\n",name.data());
- }
- else if (m_skipUntil.isEmpty())
- {
- EndElementHandlerT *handler = m_endHandlers[name];
- if (handler)
- {
- (*handler)();
- //printf("found end tag %s\n",name.data());
- }
- else if (m_fallBackHandler)
- {
- m_fallBackHandler->handleEndElement(name);
- }
- }
- m_curString="";
- return TRUE;
- }
-
- bool skippedEntity ( const QString &s )
- {
- if (m_delegateHandler)
- {
- return m_delegateHandler->skippedEntity(s);
- }
-
- debug(1,"line %d, col %d: Skipped unhandled entity %s\n",
- s_theLocator->lineNumber(),s_theLocator->columnNumber(),
- s.data());
- return TRUE;
- }
-
- /*! called when a number of characters are received by the parser.
- * \param ch the characters.
- */
- virtual bool characters ( const QString & ch )
- {
- if (m_delegateHandler)
- {
- return m_delegateHandler->characters(ch);
- }
-
- //printf("Found characters \"%s\"\n",ch.data());
- m_curString+=ch;
- return TRUE;
- }
-
- void setDelegate(QXmlDefaultHandler *delegate)
- {
- m_delegateHandler = delegate;
- }
-
- QXmlDefaultHandler *delegate() const
- {
- return m_delegateHandler;
- }
-
- void setFallBackHandler(IFallBackHandler *h)
- {
- m_fallBackHandler = h;
- }
-
- IFallBackHandler *fallBackHandler() const
- {
- return m_fallBackHandler;
- }
-
- void setDocumentLocator( QXmlLocator * locator )
- {
- debug(2,"setDocumentLocator(%p)\n",locator);
- s_theLocator = locator;
- }
-
- protected:
- QString m_curString;
- QString m_skipUntil;
- int m_skipCount;
- QXmlDefaultHandler *m_delegateHandler;
- IFallBackHandler *m_fallBackHandler;
-};
-
-//-----------------------------------------------------------------------------
-
-template<class T> class BaseFallBackHandler : public ElementMapper<T>,
- public IFallBackHandler
-{
- public:
- typedef typename ElementMapper<T>::StartElementHandlerT StartElementHandlerT;
- typedef typename ElementMapper<T>::EndElementHandlerT EndElementHandlerT;
-
- BaseFallBackHandler()
- {
- }
- virtual ~BaseFallBackHandler()
- {
- }
-
- bool handleStartElement(const QString & name,
- const QXmlAttributes & attrib)
- {
- StartElementHandlerT *handler = m_startHandlers[name];
- if (handler)
- {
- (*handler)(attrib);
- return TRUE;
- }
- return FALSE;
- }
- bool handleEndElement(const QString &name)
- {
- EndElementHandlerT *handler = m_endHandlers[name];
- if (handler)
- {
- (*handler)();
- return TRUE;
- }
- return FALSE;
- }
-};
-
-
-#endif
diff --git a/addon/doxmlparser/src/baseiterator.h b/addon/doxmlparser/src/baseiterator.h
deleted file mode 100644
index 06a9a11..0000000
--- a/addon/doxmlparser/src/baseiterator.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/******************************************************************************
- *
- * $Id$
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-#ifndef BASEITERATOR_H
-#define BASEITERATOR_H
-
-#include <qlist.h>
-#include <doxmlintf.h>
-
-template<class Intf,class ElemIntf,class ElemImpl> class BaseIterator :
- public Intf, public QListIterator<ElemImpl>
-{
- public:
- BaseIterator(const QList<ElemImpl> &list) : QListIterator<ElemImpl>(list) {}
- virtual ~BaseIterator() {}
- virtual ElemIntf *toFirst() { return QListIterator<ElemImpl>::toFirst(); }
- virtual ElemIntf *toLast() { return QListIterator<ElemImpl>::toLast(); }
- virtual ElemIntf *toNext() { return QListIterator<ElemImpl>::operator++(); }
- virtual ElemIntf *toPrev() { return QListIterator<ElemImpl>::operator--(); }
- virtual ElemIntf *current() const { return QListIterator<ElemImpl>::current(); }
- virtual void release() { delete this; }
-};
-
-template<class Intf,class ElemIntf,class ElemImpl,class Intermediate>
- class BaseIteratorVia :
- public Intf, public QListIterator<ElemImpl>
-{
- public:
- BaseIteratorVia(const QList<ElemImpl> &list) : QListIterator<ElemImpl>(list) {}
- virtual ~BaseIteratorVia() {}
- virtual ElemIntf *toFirst() { return static_cast<Intermediate *>(QListIterator<ElemImpl>::toFirst()); }
- virtual ElemIntf *toLast() { return static_cast<Intermediate *>(QListIterator<ElemImpl>::toLast()); }
- virtual ElemIntf *toNext() { return static_cast<Intermediate *>(QListIterator<ElemImpl>::operator++()); }
- virtual ElemIntf *toPrev() { return static_cast<Intermediate *>(QListIterator<ElemImpl>::operator--()); }
- virtual ElemIntf *current() const { return static_cast<Intermediate *>(QListIterator<ElemImpl>::current()); }
- virtual void release() { delete this; }
-};
-
-#endif
diff --git a/addon/doxmlparser/src/compoundhandler.cpp b/addon/doxmlparser/src/compoundhandler.cpp
deleted file mode 100644
index 5bdf160..0000000
--- a/addon/doxmlparser/src/compoundhandler.cpp
+++ /dev/null
@@ -1,650 +0,0 @@
-/******************************************************************************
- *
- * $Id$
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#include "mainhandler.h"
-#include "compoundhandler.h"
-#include "dochandler.h"
-#include "debug.h"
-#include "graphhandler.h"
-#include "sectionhandler.h"
-#include "paramhandler.h"
-#include "loamhandler.h"
-#include "memberhandler.h"
-
-//----------------------------------------------------------------------------
-
-IncludeHandler::IncludeHandler(IBaseHandler *parent,const char *endtag) :
- m_parent(parent)
-{
- addEndHandler(endtag,this,&IncludeHandler::endInclude);
-}
-
-IncludeHandler::~IncludeHandler()
-{
-}
-
-void IncludeHandler::startInclude(const QXmlAttributes &attrib)
-{
- m_curString = "";
- m_refId = attrib.value("refid");
- m_isLocal = attrib.value("local")=="yes";
- m_parent->setDelegate(this);
-}
-
-void IncludeHandler::endInclude()
-{
- m_name = m_curString;
- m_parent->setDelegate(0);
- debug(2,"Found include %s\n",m_name.data());
-}
-
-//----------------------------------------------------------------------------
-
-class CompoundIdIterator : public ICompoundIterator,
- public QListIterator<QString>
-{
- public:
- CompoundIdIterator(const MainHandler *m,const QList<QString> &list) :
- QListIterator<QString>(list), m_mainHandler(m) {}
- virtual ~CompoundIdIterator() {}
-
- virtual void toFirst()
- {
- QListIterator<QString>::toFirst();
- }
- virtual void toLast()
- {
- QListIterator<QString>::toLast();
- }
- virtual void toNext()
- {
- QListIterator<QString>::operator++();
- }
- virtual void toPrev()
- {
- QListIterator<QString>::operator--();
- }
- virtual ICompound *current() const
- {
- QString *id = QListIterator<QString>::current();
- return id ? m_mainHandler->compoundById(*id) : 0;
- }
- virtual void release()
- { delete this; }
-
- private:
- const MainHandler *m_mainHandler;
-};
-
-//----------------------------------------------------------------------------
-
-ICompound *RelatedCompound::compound() const
-{
- return m_parent->m_mainHandler->compoundById(m_id);
-}
-
-//----------------------------------------------------------------------------
-
-class CompoundErrorHandler : public QXmlErrorHandler
-{
- public:
- virtual ~CompoundErrorHandler() {}
- bool warning( const QXmlParseException & )
- {
- return FALSE;
- }
- bool error( const QXmlParseException & )
- {
- return FALSE;
- }
- bool fatalError( const QXmlParseException &exception )
- {
- debug(1,"Fatal error at line %d column %d: %s\n",
- exception.lineNumber(),exception.columnNumber(),
- exception.message().data());
- return FALSE;
- }
- QString errorString() { return ""; }
-
- private:
- QString errorMsg;
-};
-
-//----------------------------------------------------------------------------
-
-class CompoundTypeMap
-{
- public:
- CompoundTypeMap()
- {
- m_map.setAutoDelete(TRUE);
- m_map.insert("class", new int(ICompound::Class));
- m_map.insert("struct", new int(ICompound::Struct));
- m_map.insert("union", new int(ICompound::Union));
- m_map.insert("interface",new int(ICompound::Interface));
- m_map.insert("protocol", new int(ICompound::Protocol));
- m_map.insert("category", new int(ICompound::Category));
- m_map.insert("exception",new int(ICompound::Exception));
- m_map.insert("file", new int(ICompound::File));
- m_map.insert("namespace",new int(ICompound::Namespace));
- m_map.insert("group", new int(ICompound::Group));
- m_map.insert("page", new int(ICompound::Page));
- m_map.insert("example", new int(ICompound::Example));
- m_map.insert("dir", new int(ICompound::Dir));
- }
- virtual ~CompoundTypeMap()
- {
- }
- ICompound::CompoundKind map(const QString &s)
- {
- int *val = m_map.find(s);
- if (val==0)
- {
- debug(1,"Warning: `%s' is an invalid compound type\n",s.data());
- return ICompound::Invalid;
- }
- else return (ICompound::CompoundKind)*val;
- }
- private:
- QDict<int> m_map;
-};
-
-static CompoundTypeMap *s_typeMap;
-
-void compoundhandler_init()
-{
- s_typeMap = new CompoundTypeMap;
-}
-
-void compoundhandler_exit()
-{
- delete s_typeMap;
-}
-
-//----------------------------------------------------------------------------
-
-CompoundHandler::CompoundHandler(const QString &xmlDir)
- : m_titleHandler(0),
- m_includeDependencyGraph(0),
- m_includedByDependencyGraph(0),
- m_templateParamList(0),
- m_brief(0),
- m_detailed(0),
- m_inheritanceGraph(0),
- m_collaborationGraph(0),
- m_programListing(0),
- m_members(0),
- m_xmlDir(xmlDir),
- m_refCount(1),
- m_memberDict(257),
- m_memberNameDict(257),
- m_mainHandler(0)
-{
- m_superClasses.setAutoDelete(TRUE);
- m_subClasses.setAutoDelete(TRUE);
- m_sections.setAutoDelete(TRUE);
- m_memberNameDict.setAutoDelete(TRUE);
- m_innerCompounds.setAutoDelete(TRUE);
- m_includes.setAutoDelete(TRUE);
- m_includedBy.setAutoDelete(TRUE);
-
- addStartHandler("doxygen");
- addEndHandler("doxygen");
-
- addStartHandler("compounddef",this,&CompoundHandler::startCompound);
- addEndHandler("compounddef",this,&CompoundHandler::endCompound);
-
- addStartHandler("compoundname");
- addEndHandler("compoundname",this,&CompoundHandler::endCompoundName);
-
- addStartHandler("title",this,&CompoundHandler::startTitle);
-
- addStartHandler("basecompoundref",this,&CompoundHandler::startSuperClass);
- addEndHandler("basecompoundref",this,&CompoundHandler::endSuperClass);
-
- addStartHandler("derivedcompoundref",this,&CompoundHandler::startSubClass);
- addEndHandler("derivedcompoundref",this,&CompoundHandler::endSubClass);
-
- addStartHandler("includes",this,&CompoundHandler::startIncludes);
- addStartHandler("includedby",this,&CompoundHandler::startIncludedBy);
-
- addStartHandler("incdepgraph",this,&CompoundHandler::startIncludeDependencyGraph);
-
- addStartHandler("invincdepgraph",this,&CompoundHandler::startIncludedByDependencyGraph);
-
- addStartHandler("innerdir",this,&CompoundHandler::startInnerDir);
- addEndHandler("innerdir");
-
- addStartHandler("innerfile",this,&CompoundHandler::startInnerFile);
- addEndHandler("innerfile");
-
- addStartHandler("innerclass",this,&CompoundHandler::startInnerClass);
- addEndHandler("innerclass");
-
- addStartHandler("innernamespace",this,&CompoundHandler::startInnerNamespace);
- addEndHandler("innernamespace");
-
- addStartHandler("innerpage",this,&CompoundHandler::startInnerPage);
- addEndHandler("innerpage");
-
- addStartHandler("innergroup",this,&CompoundHandler::startInnerGroup);
- addEndHandler("innergroup");
-
- addStartHandler("templateparamlist",this,&CompoundHandler::startTemplateParamList);
-
- addStartHandler("sectiondef",this,&CompoundHandler::startSection);
-
- addStartHandler("briefdescription",this,&CompoundHandler::startBriefDesc);
-
- addStartHandler("detaileddescription",this,&CompoundHandler::startDetailedDesc);
-
- addStartHandler("inheritancegraph",this,&CompoundHandler::startInheritanceGraph);
-
- addStartHandler("collaborationgraph",this,&CompoundHandler::startCollaborationGraph);
-
- addStartHandler("programlisting",this,&CompoundHandler::startProgramListing);
-
- addStartHandler("location",this,&CompoundHandler::startLocation);
- addEndHandler("location");
-
- addStartHandler("listofallmembers",this,&CompoundHandler::startListOfAllMembers);
-}
-
-CompoundHandler::~CompoundHandler()
-{
- debug(2,"CompoundHandler::~CompoundHandler()\n");
- delete m_titleHandler;
- delete m_brief;
- delete m_detailed;
- delete m_programListing;
- delete m_inheritanceGraph;
- delete m_collaborationGraph;
- delete m_includeDependencyGraph;
- delete m_includedByDependencyGraph;
- delete m_templateParamList;
- delete m_members;
-}
-
-void CompoundHandler::startSection(const QXmlAttributes& attrib)
-{
- SectionHandler *sectHandler = new SectionHandler(this);
- sectHandler->startSection(attrib);
- m_sections.append(sectHandler);
-}
-
-void CompoundHandler::startBriefDesc(const QXmlAttributes& attrib)
-{
- DocHandler *docHandler = new DocHandler(this);
- docHandler->startDoc(attrib);
- m_brief = docHandler;
-}
-
-void CompoundHandler::startDetailedDesc(const QXmlAttributes& attrib)
-{
- DocHandler *docHandler = new DocHandler(this);
- docHandler->startDoc(attrib);
- m_detailed = docHandler;
-}
-
-void CompoundHandler::startProgramListing(const QXmlAttributes& attrib)
-{
- ProgramListingHandler *plHandler = new ProgramListingHandler(this);
- plHandler->startProgramListing(attrib);
- m_programListing = plHandler;
-}
-
-void CompoundHandler::startIncludes(const QXmlAttributes& attrib)
-{
- IncludeHandler *inc = new IncludeHandler(this,"includes");
- m_includes.append(inc);
- inc->startInclude(attrib);
-}
-
-void CompoundHandler::startIncludedBy(const QXmlAttributes& attrib)
-{
- IncludeHandler *inc = new IncludeHandler(this,"includedby");
- m_includedBy.append(inc);
- inc->startInclude(attrib);
-}
-
-void CompoundHandler::startCompound(const QXmlAttributes& attrib)
-{
- m_id = attrib.value("id");
- m_kindString = attrib.value("kind");
- m_kind = s_typeMap->map(m_kindString);
- m_protection = attrib.value("prot");
- debug(2,"startCompound(id=`%s' type=`%s')\n",m_id.data(),m_kindString.data());
-}
-
-void CompoundHandler::endCompound()
-{
- debug(2,"endCompound()\n");
-}
-
-void CompoundHandler::startLocation(const QXmlAttributes& attrib)
-{
- m_defFile = attrib.value("file");
- m_defLine = attrib.value("line").toInt();
- m_defBodyFile = attrib.value("bodyfile");
- m_defBodyStart = attrib.value("bodystart").toInt();
- m_defBodyEnd = attrib.value("bodyend").toInt();
-}
-
-void CompoundHandler::endCompoundName()
-{
- m_name = m_curString.stripWhiteSpace();
- debug(2,"Compound name `%s'\n",m_name.data());
-}
-
-void CompoundHandler::startInnerClass(const QXmlAttributes& attrib)
-{
- m_innerCompounds.append(new QString(attrib.value("refid")));
-}
-
-void CompoundHandler::startInnerNamespace(const QXmlAttributes& attrib)
-{
- m_innerCompounds.append(new QString(attrib.value("refid")));
-}
-
-void CompoundHandler::startInnerFile(const QXmlAttributes& attrib)
-{
- m_innerCompounds.append(new QString(attrib.value("refid")));
-}
-
-void CompoundHandler::startInnerGroup(const QXmlAttributes& attrib)
-{
- m_innerCompounds.append(new QString(attrib.value("refid")));
-}
-
-void CompoundHandler::startInnerPage(const QXmlAttributes& attrib)
-{
- m_innerCompounds.append(new QString(attrib.value("refid")));
-}
-
-void CompoundHandler::startInnerDir(const QXmlAttributes& attrib)
-{
- m_innerCompounds.append(new QString(attrib.value("refid")));
-}
-
-void CompoundHandler::startTemplateParamList(const QXmlAttributes& attrib)
-{
- m_templateParamList = new TemplateParamListHandler(this);
- m_templateParamList->startTemplateParamList(attrib);
-}
-
-void CompoundHandler::startListOfAllMembers(const QXmlAttributes& attrib)
-{
- m_members = new ListOfAllMembersHandler(this);
- m_members->startListOfAllMembers(attrib);
-}
-
-void CompoundHandler::startSuperClass(const QXmlAttributes& attrib)
-{
- IRelatedCompound::Protection prot = IRelatedCompound::Public;
- QString protString = attrib.value("prot");
- if (protString=="protected")
- {
- prot = IRelatedCompound::Protected;
- }
- else if (protString=="private")
- {
- prot = IRelatedCompound::Private;
- }
- IRelatedCompound::Kind kind = IRelatedCompound::Normal;
- QString kindString = attrib.value("virt");
- if (kindString=="virtual") kind = IRelatedCompound::Virtual;
-
- RelatedCompound *sc=new RelatedCompound(
- this,
- attrib.value("refid"),
- prot,
- kind
- );
- debug(2,"super class id=`%s' prot=`%s' virt=`%s'\n",
- attrib.value("refid").data(),
- protString.data(),
- kindString.data());
- m_superClasses.append(sc);
- m_curString = "";
-}
-
-void CompoundHandler::endSuperClass()
-{
- m_superClasses.getLast()->setName(m_curString);
-}
-
-void CompoundHandler::startSubClass(const QXmlAttributes& attrib)
-{
- IRelatedCompound::Protection prot = IRelatedCompound::Public;
- QString protString = attrib.value("prot");
- if (protString=="protected") prot = IRelatedCompound::Protected;
- else if (protString=="private") prot = IRelatedCompound::Private;
-
- IRelatedCompound::Kind kind = IRelatedCompound::Normal;
- QString kindString = attrib.value("virt");
- if (kindString=="virtual") kind = IRelatedCompound::Virtual;
-
- RelatedCompound *sc = new RelatedCompound(
- this,
- attrib.value("refid"),
- prot,
- kind
- );
- debug(2,"sub class id=`%s' prot=`%s' virt=`%s'\n",
- attrib.value("refid").data(),
- protString.data(),
- kindString.data());
- m_subClasses.append(sc);
- m_curString = "";
-}
-
-void CompoundHandler::endSubClass()
-{
- m_subClasses.getLast()->setName(m_curString);
-}
-
-void CompoundHandler::startTitle(const QXmlAttributes& attrib)
-{
- ASSERT(m_titleHandler==0);
- m_titleHandler = new TitleHandler(this);
- m_titleHandler->startTitle(attrib);
-}
-
-bool CompoundHandler::parseXML(const char *compId)
-{
- QFile xmlFile(m_xmlDir+"/"+compId+".xml");
- if (!xmlFile.exists()) return FALSE;
- CompoundErrorHandler errorHandler;
- QXmlInputSource source( xmlFile );
- QXmlSimpleReader reader;
- reader.setContentHandler( this );
- reader.setErrorHandler( &errorHandler );
- reader.parse( source );
- return TRUE;
-}
-
-void CompoundHandler::initialize(MainHandler *mh)
-{
- m_mainHandler = mh;
- QListIterator<SectionHandler> msi(m_sections);
- SectionHandler *sec;
- for (;(sec=msi.current());++msi)
- {
- sec->initialize(this);
- }
- if (m_members)
- {
- m_members->initialize(mh);
- }
-}
-
-void CompoundHandler::insertMember(MemberHandler *mh)
-{
- m_memberDict.insert(mh->id()->latin1(),mh);
- mh->initialize(m_mainHandler);
- QList<MemberHandler> *mhl = m_memberNameDict.find(mh->id()->latin1());
- if (mhl==0)
- {
- mhl = new QList<MemberHandler>;
- m_memberNameDict.insert(mh->name()->latin1(),mhl);
- }
- mhl->append(mh);
-}
-
-ICompound *CompoundHandler::toICompound() const
-{
- switch (m_kind)
- {
- case IClass::Class: return (IClass *)this;
- case IStruct::Struct: return (IStruct *)this;
- case IUnion::Union: return (IUnion *)this;
- case IException::Exception: return (IException *)this;
- case IInterface::Interface: return (IInterface *)this;
- case INamespace::Namespace: return (INamespace *)this;
- case IFile::File: return (IFile *)this;
- case IGroup::Group: return (IGroup *)this;
- case IPage::Page: return (IPage *)this;
- default: return 0;
- }
- return 0;
-}
-
-void CompoundHandler::release()
-{
- debug(2,"CompoundHandler::release() %d->%d\n",m_refCount,m_refCount-1);
- if (--m_refCount<=0)
- {
- m_mainHandler->unloadCompound(this);
- delete this;
- }
-}
-
-ISectionIterator *CompoundHandler::sections() const
-{
- return new SectionIterator(m_sections);
-}
-
-IMemberIterator *CompoundHandler::memberByName(const char *name) const
-{
- QList<MemberHandler> *ml = m_memberNameDict[name];
- if (ml==0) return 0;
- return new MemberIterator(*ml);
-}
-
-void CompoundHandler::startInheritanceGraph(const QXmlAttributes &attrib)
-{
- m_inheritanceGraph = new GraphHandler(this,"inheritancegraph");
- m_inheritanceGraph->startGraph(attrib);
-}
-
-void CompoundHandler::startCollaborationGraph(const QXmlAttributes &attrib)
-{
- m_collaborationGraph = new GraphHandler(this,"collaborationgraph");
- m_collaborationGraph->startGraph(attrib);
-}
-
-void CompoundHandler::startIncludeDependencyGraph(const QXmlAttributes &attrib)
-{
- m_includeDependencyGraph = new GraphHandler(this,"incdepgraph");
- m_includeDependencyGraph->startGraph(attrib);
-}
-
-void CompoundHandler::startIncludedByDependencyGraph(const QXmlAttributes &attrib)
-{
- m_includedByDependencyGraph = new GraphHandler(this,"invincdepgraph");
- m_includedByDependencyGraph->startGraph(attrib);
-}
-
-IDocRoot *CompoundHandler::briefDescription() const
-{
- return m_brief;
-}
-
-IDocRoot *CompoundHandler::detailedDescription() const
-{
- return m_detailed;
-}
-
-IMember *CompoundHandler::memberById(const char *id) const
-{
- return (IFunction*)m_memberDict[id];
-}
-
-IGraph *CompoundHandler::inheritanceGraph() const
-{
- return m_inheritanceGraph;
-}
-
-IGraph *CompoundHandler::collaborationGraph() const
-{
- return m_collaborationGraph;
-}
-
-IGraph *CompoundHandler::includeDependencyGraph() const
-{
- return m_includeDependencyGraph;
-}
-
-IGraph *CompoundHandler::includedByDependencyGraph() const
-{
- return m_includedByDependencyGraph;
-}
-
-IRelatedCompoundIterator *CompoundHandler::baseCompounds() const
-{
- return new RelatedCompoundIterator(m_superClasses);
-}
-
-IRelatedCompoundIterator *CompoundHandler::derivedCompounds() const
-{
- return new RelatedCompoundIterator(m_subClasses);
-}
-
-ICompoundIterator *CompoundHandler::nestedCompounds() const
-{
- return new CompoundIdIterator(m_mainHandler,m_innerCompounds);
-}
-
-IDocProgramListing *CompoundHandler::source() const
-{
- return m_programListing;
-}
-
-IIncludeIterator *CompoundHandler::includes() const
-{
- return new IncludeIterator(m_includes);
-}
-
-IIncludeIterator *CompoundHandler::includedBy() const
-{
- return new IncludeIterator(m_includedBy);
-}
-
-IParamIterator *CompoundHandler::templateParameters() const
-{
- return m_templateParamList ? m_templateParamList->templateParams() : 0;
-}
-
-const IDocTitle *CompoundHandler::title() const
-{
- return m_titleHandler;
-}
-
-IMemberReferenceIterator *CompoundHandler::members() const
-{
- return m_members ? m_members->members() : 0;
-}
-
-
diff --git a/addon/doxmlparser/src/compoundhandler.h b/addon/doxmlparser/src/compoundhandler.h
deleted file mode 100644
index ad8e2c8..0000000
--- a/addon/doxmlparser/src/compoundhandler.h
+++ /dev/null
@@ -1,236 +0,0 @@
-/******************************************************************************
- *
- * $Id$
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-#ifndef _COMPOUNDHANDLER_H
-#define _COMPOUNDHANDLER_H
-
-#include <qstring.h>
-#include <qlist.h>
-#include <qxml.h>
-#include <doxmlintf.h>
-
-#include "stringimpl.h"
-#include "basehandler.h"
-#include "baseiterator.h"
-
-class MainHandler;
-class DocHandler;
-class ProgramListingHandler;
-class GraphHandler;
-class MemberHandler;
-class CompoundHandler;
-class SectionHandler;
-class ParamHandler;
-class TemplateParamListHandler;
-class TitleHandler;
-class ListOfAllMembersHandler;
-
-class IncludeHandler : public IInclude, public BaseHandler<IncludeHandler>
-{
- public:
- IncludeHandler(IBaseHandler *parent,const char *endtag);
- virtual ~IncludeHandler();
-
- void startInclude(const QXmlAttributes &attrib);
- void endInclude();
-
- // IInclude
- virtual const IString * name() const
- { return &m_name; }
- virtual const IString * refId() const
- { return &m_refId; }
- virtual bool isLocal() const
- { return &m_isLocal; }
-
- private:
- IBaseHandler *m_parent;
- StringImpl m_name; // element's content
- StringImpl m_refId; // refid
- bool m_isLocal; // local
-};
-
-class IncludeIterator : public BaseIterator<IIncludeIterator,IInclude,IncludeHandler>
-{
- public:
- IncludeIterator(const QList<IncludeHandler> &list) :
- BaseIterator<IIncludeIterator,IInclude,IncludeHandler>(list) {}
-};
-
-
-class RelatedCompound : public IRelatedCompound
-{
- public:
- RelatedCompound(CompoundHandler *parent,
- const QString &id,
- Protection prot,
- Kind kind
- ) :
- m_parent(parent), m_id(id), m_protection(prot), m_kind(kind) {}
- virtual ~RelatedCompound() {}
- void setName(const QString &str) { m_name = str; }
-
- virtual ICompound *compound() const;
- virtual Protection protection() const { return m_protection; }
- virtual Kind kind() const { return m_kind; }
- virtual const IString *name() const { return &m_name; }
-
- private:
- CompoundHandler *m_parent;
- QString m_id; // refid
- Protection m_protection; // prot
- Kind m_kind; // virt
- StringImpl m_name; // element's content
-};
-
-class RelatedCompoundIterator : public BaseIterator<IRelatedCompoundIterator,IRelatedCompound,RelatedCompound>
-{
- public:
- RelatedCompoundIterator(const QList<RelatedCompound> &list) :
- BaseIterator<IRelatedCompoundIterator,IRelatedCompound,RelatedCompound>(list) {}
-};
-
-
-class CompoundHandler : public IClass,
- public IStruct,
- public IUnion,
- public IException,
- public IInterface,
- public INamespace,
- public IFile,
- public IGroup,
- public IPage,
- public BaseHandler<CompoundHandler>
-{
- friend class RelatedCompound;
-
- public:
- virtual void startSection(const QXmlAttributes& attrib);
- virtual void startCompound(const QXmlAttributes& attrib);
- virtual void startSuperClass(const QXmlAttributes& attrib);
- virtual void endSuperClass();
- virtual void startSubClass(const QXmlAttributes& attrib);
- virtual void endSubClass();
- virtual void endCompound();
- virtual void endCompoundName();
- virtual void startBriefDesc(const QXmlAttributes& attrib);
- virtual void startDetailedDesc(const QXmlAttributes& attrib);
- virtual void startLocation(const QXmlAttributes& attrib);
- virtual void startProgramListing(const QXmlAttributes& attrib);
- virtual void startInheritanceGraph(const QXmlAttributes& attrib);
- virtual void startCollaborationGraph(const QXmlAttributes& attrib);
- virtual void startIncludeDependencyGraph(const QXmlAttributes& attrib);
- virtual void startIncludedByDependencyGraph(const QXmlAttributes& attrib);
- virtual void startIncludes(const QXmlAttributes& attrib);
- virtual void startIncludedBy(const QXmlAttributes& attrib);
- virtual void startInnerDir(const QXmlAttributes& attrib);
- virtual void startInnerClass(const QXmlAttributes& attrib);
- virtual void startInnerNamespace(const QXmlAttributes& attrib);
- virtual void startInnerFile(const QXmlAttributes& attrib);
- virtual void startInnerGroup(const QXmlAttributes& attrib);
- virtual void startInnerPage(const QXmlAttributes& attrib);
- virtual void startTitle(const QXmlAttributes& attrib);
- virtual void startTemplateParamList(const QXmlAttributes& attrib);
- virtual void startListOfAllMembers(const QXmlAttributes& attrib);
- virtual void addref() { m_refCount++; }
-
- CompoundHandler(const QString &dirName);
- virtual ~CompoundHandler();
- bool parseXML(const char *compId);
- void initialize(MainHandler *mh);
- void insertMember(MemberHandler *mh);
- ICompound *toICompound() const;
-
- // ICompound implementation
- const IString *name() const { return &m_name; }
- const IString *id() const { return &m_id; }
- CompoundKind kind() const { return m_kind; }
- const IString *kindString() const { return &m_kindString; }
- ISectionIterator *sections() const;
- IDocRoot *briefDescription() const;
- IDocRoot *detailedDescription() const;
- IMember *memberById(const char *id) const;
- IMemberIterator *memberByName(const char *name) const;
- IParamIterator *templateParameters() const;
- void release();
-
- // IClass implementation
- IGraph *inheritanceGraph() const;
- IGraph *collaborationGraph() const;
- IRelatedCompoundIterator *baseCompounds() const;
- IRelatedCompoundIterator *derivedCompounds() const;
- ICompoundIterator *nestedCompounds() const;
- ICompoundIterator *nestedGroup() const;
- const IString *locationFile() const { return &m_defFile; }
- int locationLine() const { return m_defLine; }
- const IString *locationBodyFile() const { return &m_defBodyFile; }
- int locationBodyStartLine() const { return m_defBodyStart; }
- int locationBodyEndLine() const { return m_defBodyEnd; }
- IMemberReferenceIterator *members() const;
-
- // IFile implementation
- IGraph *includeDependencyGraph() const;
- IGraph *includedByDependencyGraph() const;
- IDocProgramListing *source() const;
- IIncludeIterator *includes() const;
- IIncludeIterator *includedBy() const;
-
- // IPage implementation
- const IDocTitle *title() const;
-
- private:
- // XML elements:
- // -------------
- StringImpl m_name; // compoundname
- TitleHandler* m_titleHandler; // title
- QList<RelatedCompound> m_subClasses; // basecompoundref
- QList<RelatedCompound> m_superClasses; // derivedcompoundref
- QList<IncludeHandler> m_includes; // includes
- QList<IncludeHandler> m_includedBy; // includedBy
- GraphHandler* m_includeDependencyGraph; // incdepgraph
- GraphHandler* m_includedByDependencyGraph; // invincdepgraph
- QList<QString> m_innerCompounds; // innerdir/innerfile/innerclass/innernamespace/innergroup
- TemplateParamListHandler* m_templateParamList; // templateparamlist
- QList<SectionHandler> m_sections; // sectiondef
- DocHandler* m_brief; // briefdescription
- DocHandler* m_detailed; // detaileddescription
- GraphHandler* m_inheritanceGraph; // inheritancegraph
- GraphHandler* m_collaborationGraph; // collaborationgraph
- ProgramListingHandler* m_programListing; // programlisting
- // location
- StringImpl m_defFile; // - file
- int m_defLine; // - line
- StringImpl m_defBodyFile; // - bodyfile
- int m_defBodyStart; // - bodystart
- int m_defBodyEnd; // - bodyend
- ListOfAllMembersHandler* m_members; // listofallmember
-
- // XML attributes:
- // ---------------
- StringImpl m_id; // id
- CompoundKind m_kind; // kind
- StringImpl m_kindString; // kind as a string
- StringImpl m_protection; // prot
-
- // local variables
- QString m_xmlDir; // directory where the info is found
- int m_refCount; // object reference counter
- QDict<MemberHandler> m_memberDict; // id->member lookup
- QDict<QList<MemberHandler> > m_memberNameDict; // name->memberlist lookup
- MainHandler* m_mainHandler; // parent object
-};
-
-void compoundhandler_init();
-void compoundhandler_exit();
-
-#endif
diff --git a/addon/doxmlparser/src/debug.cpp b/addon/doxmlparser/src/debug.cpp
deleted file mode 100644
index a8be32c..0000000
--- a/addon/doxmlparser/src/debug.cpp
+++ /dev/null
@@ -1,24 +0,0 @@
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-
-#include "debug.h"
-
-static int s_debugLevel = 0;
-
-void debug(int level,const char *msg,...)
-{
- if (level<=s_debugLevel)
- {
- va_list args;
- va_start(args, msg);
- vfprintf(stderr, msg, args);
- va_end(args);
- }
-}
-
-void setDebugLevel(int level)
-{
- s_debugLevel = level;
-}
-
diff --git a/addon/doxmlparser/src/debug.h b/addon/doxmlparser/src/debug.h
deleted file mode 100644
index c77f7fe..0000000
--- a/addon/doxmlparser/src/debug.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef _DEBUG_H
-#define _DEBUG_H
-
-void debug(int level,const char *msg,...);
-void setDebugLevel(int level);
-
-#endif
diff --git a/addon/doxmlparser/src/dochandler.cpp b/addon/doxmlparser/src/dochandler.cpp
deleted file mode 100644
index ba562ef..0000000
--- a/addon/doxmlparser/src/dochandler.cpp
+++ /dev/null
@@ -1,2241 +0,0 @@
-/******************************************************************************
- *
- * $Id$
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#include <qmap.h>
-
-#include "dochandler.h"
-#include "debug.h"
-#include "linkedtexthandler.h"
-
-
-//----------------------------------------------------------------------
-
-class TypeNameMapper
-{
- public:
- TypeNameMapper()
- {
- m_map.insert("see", SimpleSectHandler::See);
- m_map.insert("return", SimpleSectHandler::Return);
- m_map.insert("author", SimpleSectHandler::Author);
- m_map.insert("version", SimpleSectHandler::Version);
- m_map.insert("since", SimpleSectHandler::Since);
- m_map.insert("date", SimpleSectHandler::Date);
- m_map.insert("bug", SimpleSectHandler::Bug);
- m_map.insert("note", SimpleSectHandler::Note);
- m_map.insert("warning", SimpleSectHandler::Warning);
- m_map.insert("par", SimpleSectHandler::Par);
- m_map.insert("deprecated",SimpleSectHandler::Deprecated);
- m_map.insert("pre", SimpleSectHandler::Pre);
- m_map.insert("post", SimpleSectHandler::Post);
- m_map.insert("invariant", SimpleSectHandler::Invar);
- m_map.insert("remark", SimpleSectHandler::Remark);
- m_map.insert("attention", SimpleSectHandler::Attention);
- m_map.insert("todo", SimpleSectHandler::Todo);
- m_map.insert("test", SimpleSectHandler::Test);
- m_map.insert("rcs", SimpleSectHandler::RCS);
- m_map.insert("enumvalues",SimpleSectHandler::EnumValues);
- m_map.insert("examples", SimpleSectHandler::Examples);
- }
- SimpleSectHandler::Types stringToType(const QString &typeStr)
- {
- return m_map[typeStr];
- }
- private:
- QMap<QString,SimpleSectHandler::Types> m_map;
-};
-
-class HighlightMapper
-{
- public:
- HighlightMapper()
- {
- m_map.insert("comment", HighlightHandler::Comment);
- m_map.insert("keyword", HighlightHandler::Keyword);
- m_map.insert("keywordtype", HighlightHandler::KeywordType);
- m_map.insert("keywordflow", HighlightHandler::KeywordFlow);
- m_map.insert("charliteral", HighlightHandler::CharLiteral);
- m_map.insert("stringliteral", HighlightHandler::StringLiteral);
- m_map.insert("preprocessor", HighlightHandler::Preprocessor);
- }
- HighlightHandler::HighlightKind stringToKind(const QString &kindStr)
- {
- return m_map[kindStr];
- }
- private:
- QMap<QString,HighlightHandler::HighlightKind> m_map;
-};
-
-static TypeNameMapper *s_typeMapper;
-static HighlightMapper *s_highlightMapper;
-
-void dochandler_init()
-{
- s_typeMapper = new TypeNameMapper;
- s_highlightMapper = new HighlightMapper;
-}
-
-void dochandler_exit()
-{
- delete s_typeMapper;
- delete s_highlightMapper;
-}
-
-//----------------------------------------------------------------------
-// MarkupHandler
-//----------------------------------------------------------------------
-
-MarkupHandler::MarkupHandler(QList<DocImpl> &children,QString &curString)
- : m_children(children), m_curString(curString),
- m_curMarkup(IDocMarkup::Normal), m_headingLevel(0)
-{
- addStartHandler("bold",this,&MarkupHandler::startBold);
- addEndHandler("bold",this,&MarkupHandler::endBold);
-
- addStartHandler("emphasis",this,&MarkupHandler::startEmphasis);
- addEndHandler("emphasis",this,&MarkupHandler::endEmphasis);
-
- addStartHandler("computeroutput",this,&MarkupHandler::startComputerOutput);
- addEndHandler("computeroutput",this,&MarkupHandler::endComputerOutput);
-
- addStartHandler("center",this,&MarkupHandler::startCenter);
- addEndHandler("center",this,&MarkupHandler::endCenter);
-
- addStartHandler("small",this,&MarkupHandler::startSmallFont);
- addEndHandler("small",this,&MarkupHandler::endSmallFont);
-
- addStartHandler("subscript",this,&MarkupHandler::startSubscript);
- addEndHandler("subscript",this,&MarkupHandler::endSubscript);
-
- addStartHandler("superscript",this,&MarkupHandler::startSuperscript);
- addEndHandler("superscript",this,&MarkupHandler::endSuperscript);
-
- addStartHandler("preformatted",this,&MarkupHandler::startPreformatted);
- addEndHandler("preformatted",this,&MarkupHandler::endPreformatted);
-
- addStartHandler("heading1",this,&MarkupHandler::startHeading1);
- addEndHandler("heading1",this,&MarkupHandler::endHeading1);
-
- addStartHandler("heading2",this,&MarkupHandler::startHeading2);
- addEndHandler("heading2",this,&MarkupHandler::endHeading2);
-
- addStartHandler("heading3",this,&MarkupHandler::startHeading3);
- addEndHandler("heading3",this,&MarkupHandler::endHeading3);
-
- addStartHandler("heading4",this,&MarkupHandler::startHeading4);
- addEndHandler("heading4",this,&MarkupHandler::endHeading4);
-
- addStartHandler("heading5",this,&MarkupHandler::startHeading5);
- addEndHandler("heading5",this,&MarkupHandler::endHeading5);
-
- addStartHandler("heading6",this,&MarkupHandler::startHeading6);
- addEndHandler("heading6",this,&MarkupHandler::endHeading6);
-}
-
-MarkupHandler::~MarkupHandler()
-{
-}
-
-void MarkupHandler::addTextNode()
-{
- if (!m_curString.isEmpty())
- {
- m_children.append(new TextNode(m_curString,m_curMarkup,m_headingLevel));
- debug(2,"addTextNode() text=%s markup=%x\n",m_curString.data(),m_curMarkup);
- m_curString="";
- }
-}
-
-void MarkupHandler::startBold(const QXmlAttributes & /*attrib*/)
-{
- addTextNode();
- m_children.append(new MarkupModifierNode(IDocMarkup::Bold,TRUE));
- m_curMarkup |= IDocMarkup::Bold;
-}
-
-void MarkupHandler::endBold()
-{
- addTextNode();
- m_children.append(new MarkupModifierNode(IDocMarkup::Bold,FALSE));
- m_curMarkup &= ~IDocMarkup::Bold;
-}
-
-void MarkupHandler::startEmphasis(const QXmlAttributes & /*attrib*/)
-{
- addTextNode();
- m_children.append(new MarkupModifierNode(IDocMarkup::Emphasis,TRUE));
- m_curMarkup |= IDocMarkup::Emphasis;
-}
-
-void MarkupHandler::endEmphasis()
-{
- addTextNode();
- m_children.append(new MarkupModifierNode(IDocMarkup::Emphasis,FALSE));
- m_curMarkup &= ~IDocMarkup::Emphasis;
-}
-
-void MarkupHandler::startComputerOutput(const QXmlAttributes & /*attrib*/)
-{
- addTextNode();
- m_children.append(new MarkupModifierNode(IDocMarkup::ComputerOutput,TRUE));
- m_curMarkup |= IDocMarkup::ComputerOutput;
-}
-
-void MarkupHandler::endComputerOutput()
-{
- addTextNode();
- m_children.append(new MarkupModifierNode(IDocMarkup::ComputerOutput,FALSE));
- m_curMarkup &= ~IDocMarkup::ComputerOutput;
-}
-
-void MarkupHandler::startCenter(const QXmlAttributes & /*attrib*/)
-{
- addTextNode();
- m_children.append(new MarkupModifierNode(IDocMarkup::Center,TRUE));
- m_curMarkup |= IDocMarkup::Center;
-}
-
-void MarkupHandler::endCenter()
-{
- addTextNode();
- m_children.append(new MarkupModifierNode(IDocMarkup::Center,FALSE));
- m_curMarkup &= ~IDocMarkup::Center;
-}
-
-void MarkupHandler::startSmallFont(const QXmlAttributes & /*attrib*/)
-{
- addTextNode();
- m_children.append(new MarkupModifierNode(IDocMarkup::SmallFont,TRUE));
- m_curMarkup |= IDocMarkup::SmallFont;
-}
-
-void MarkupHandler::endSmallFont()
-{
- addTextNode();
- m_children.append(new MarkupModifierNode(IDocMarkup::SmallFont,FALSE));
- m_curMarkup &= ~IDocMarkup::SmallFont;
-}
-
-void MarkupHandler::startSubscript(const QXmlAttributes & /*attrib*/)
-{
- addTextNode();
- m_children.append(new MarkupModifierNode(IDocMarkup::Subscript,TRUE));
- m_curMarkup |= IDocMarkup::Subscript;
-}
-
-void MarkupHandler::endSubscript()
-{
- addTextNode();
- m_children.append(new MarkupModifierNode(IDocMarkup::Subscript,FALSE));
- m_curMarkup &= ~IDocMarkup::Subscript;
-}
-
-void MarkupHandler::startSuperscript(const QXmlAttributes & /*attrib*/)
-{
- addTextNode();
- m_children.append(new MarkupModifierNode(IDocMarkup::Superscript,TRUE));
- m_curMarkup |= IDocMarkup::Superscript;
-}
-
-void MarkupHandler::endSuperscript()
-{
- addTextNode();
- m_children.append(new MarkupModifierNode(IDocMarkup::Superscript,FALSE));
- m_curMarkup &= ~IDocMarkup::Superscript;
-}
-
-void MarkupHandler::startPreformatted(const QXmlAttributes & /*attrib*/)
-{
- addTextNode();
- m_children.append(new MarkupModifierNode(IDocMarkup::Preformatted,TRUE));
- m_curMarkup |= IDocMarkup::Preformatted;
-}
-
-void MarkupHandler::endPreformatted()
-{
- addTextNode();
- m_children.append(new MarkupModifierNode(IDocMarkup::Preformatted,FALSE));
- m_curMarkup &= ~IDocMarkup::Preformatted;
-}
-
-void MarkupHandler::startHeading1(const QXmlAttributes & /*attrib*/)
-{
- addTextNode();
- m_children.append(new MarkupModifierNode(IDocMarkup::Heading,TRUE,1));
- m_curMarkup |= IDocMarkup::Heading;
- m_headingLevel=1;
-}
-
-void MarkupHandler::endHeading1()
-{
- addTextNode();
- m_children.append(new MarkupModifierNode(IDocMarkup::Heading,FALSE,1));
- m_curMarkup &= ~IDocMarkup::Heading;
- m_headingLevel=0;
-}
-
-void MarkupHandler::startHeading2(const QXmlAttributes & /*attrib*/)
-{
- addTextNode();
- m_children.append(new MarkupModifierNode(IDocMarkup::Heading,TRUE,2));
- m_curMarkup |= IDocMarkup::Heading;
- m_headingLevel=2;
-}
-
-void MarkupHandler::endHeading2()
-{
- addTextNode();
- m_children.append(new MarkupModifierNode(IDocMarkup::Heading,FALSE,2));
- m_curMarkup &= ~IDocMarkup::Heading;
- m_headingLevel=0;
-}
-
-void MarkupHandler::startHeading3(const QXmlAttributes & /*attrib*/)
-{
- addTextNode();
- m_children.append(new MarkupModifierNode(IDocMarkup::Heading,TRUE,3));
- m_curMarkup |= IDocMarkup::Heading;
- m_headingLevel=3;
-}
-
-void MarkupHandler::endHeading3()
-{
- addTextNode();
- m_children.append(new MarkupModifierNode(IDocMarkup::Heading,FALSE,3));
- m_curMarkup &= ~IDocMarkup::Heading;
- m_headingLevel=0;
-}
-
-void MarkupHandler::startHeading4(const QXmlAttributes & /*attrib*/)
-{
- addTextNode();
- m_children.append(new MarkupModifierNode(IDocMarkup::Heading,TRUE,4));
- m_curMarkup |= IDocMarkup::Heading;
- m_headingLevel=4;
-}
-
-void MarkupHandler::endHeading4()
-{
- addTextNode();
- m_children.append(new MarkupModifierNode(IDocMarkup::Heading,FALSE,4));
- m_curMarkup &= ~IDocMarkup::Heading;
- m_headingLevel=0;
-}
-
-void MarkupHandler::startHeading5(const QXmlAttributes & /*attrib*/)
-{
- addTextNode();
- m_children.append(new MarkupModifierNode(IDocMarkup::Heading,TRUE,5));
- m_curMarkup |= IDocMarkup::Heading;
- m_headingLevel=5;
-}
-
-void MarkupHandler::endHeading5()
-{
- addTextNode();
- m_children.append(new MarkupModifierNode(IDocMarkup::Heading,FALSE,5));
- m_curMarkup &= ~IDocMarkup::Heading;
- m_headingLevel=0;
-}
-
-void MarkupHandler::startHeading6(const QXmlAttributes & /*attrib*/)
-{
- addTextNode();
- m_children.append(new MarkupModifierNode(IDocMarkup::Heading,TRUE,6));
- m_curMarkup |= IDocMarkup::Heading;
- m_headingLevel=6;
-}
-
-void MarkupHandler::endHeading6()
-{
- addTextNode();
- m_children.append(new MarkupModifierNode(IDocMarkup::Heading,FALSE,6));
- m_curMarkup &= ~IDocMarkup::Heading;
- m_headingLevel=0;
-}
-
-
-//----------------------------------------------------------------------
-// ListItemHandler
-//----------------------------------------------------------------------
-
-ListItemHandler::ListItemHandler(IBaseHandler *parent)
- : m_parent(parent)
-{
- m_children.setAutoDelete(TRUE);
-
- addEndHandler("listitem",this,&ListItemHandler::endListItem);
-
- addStartHandler("para",this,&ListItemHandler::startParagraph);
-}
-
-ListItemHandler::~ListItemHandler()
-{
-}
-
-void ListItemHandler::startListItem(const QXmlAttributes& /*attrib*/)
-{
- m_parent->setDelegate(this);
- debug(2,"start list item handler\n");
-}
-
-void ListItemHandler::endListItem()
-{
- debug(2,"end list item handler\n");
- m_parent->setDelegate(0);
-}
-
-void ListItemHandler::startParagraph(const QXmlAttributes& attrib)
-{
- ParagraphHandler *parHandler = new ParagraphHandler(this);
- parHandler->startParagraph(attrib);
- m_children.append(parHandler);
-}
-
-IDocIterator *ListItemHandler::contents() const
-{
- return new ListItemIterator(*this);
-}
-
-//----------------------------------------------------------------------
-// OrderedListHandler
-//----------------------------------------------------------------------
-
-OrderedListHandler::OrderedListHandler(IBaseHandler *parent) : m_parent(parent)
-{
- m_children.setAutoDelete(TRUE);
- addEndHandler("orderedlist",this,&OrderedListHandler::endOrderedList);
- addStartHandler("listitem",this,&OrderedListHandler::startOrderedListItem);
-}
-
-OrderedListHandler::~OrderedListHandler()
-{
-}
-
-void OrderedListHandler::startOrderedList(const QXmlAttributes& /*attrib*/)
-{
- m_parent->setDelegate(this);
-}
-
-void OrderedListHandler::endOrderedList()
-{
- m_parent->setDelegate(0);
-}
-
-void OrderedListHandler::startOrderedListItem(const QXmlAttributes& attrib)
-{
- ListItemHandler *liHandler = new ListItemHandler(this);
- liHandler->startListItem(attrib);
- m_children.append(liHandler);
-}
-
-IDocIterator *OrderedListHandler::elements() const
-{
- return new OrderedListIterator(*this);
-}
-
-//----------------------------------------------------------------------
-// ItemizedListHandler
-//----------------------------------------------------------------------
-
-ItemizedListHandler::ItemizedListHandler(IBaseHandler *parent) : m_parent(parent)
-{
- m_children.setAutoDelete(TRUE);
- addEndHandler("itemizedlist",this,&ItemizedListHandler::endItemizedList);
- addStartHandler("listitem",this,&ItemizedListHandler::startItemizedListItem);
-}
-
-ItemizedListHandler::~ItemizedListHandler()
-{
-}
-
-void ItemizedListHandler::startItemizedList(const QXmlAttributes& /*attrib*/)
-{
- m_parent->setDelegate(this);
-}
-
-void ItemizedListHandler::endItemizedList()
-{
- m_parent->setDelegate(0);
-}
-
-void ItemizedListHandler::startItemizedListItem(const QXmlAttributes& attrib)
-{
- ListItemHandler *liHandler = new ListItemHandler(this);
- liHandler->startListItem(attrib);
- m_children.append(liHandler);
-}
-
-IDocIterator *ItemizedListHandler::elements() const
-{
- return new ItemizedListIterator(*this);
-}
-
-//----------------------------------------------------------------------
-// TocListHandler
-//----------------------------------------------------------------------
-
-TocListHandler::TocListHandler(IBaseHandler *parent) : m_parent(parent)
-{
- m_children.setAutoDelete(TRUE);
- addEndHandler("toclist",this,&TocListHandler::endTocList);
- addStartHandler("tocitem",this,&TocListHandler::startTocItem);
-}
-
-TocListHandler::~TocListHandler()
-{
-}
-
-void TocListHandler::startTocList(const QXmlAttributes& /*attrib*/)
-{
- m_parent->setDelegate(this);
-}
-
-void TocListHandler::endTocList()
-{
- m_parent->setDelegate(0);
-}
-
-void TocListHandler::startTocItem(const QXmlAttributes& attrib)
-{
- TocItemHandler *tiHandler = new TocItemHandler(this);
- tiHandler->startTocItem(attrib);
- m_children.append(tiHandler);
-}
-
-IDocIterator *TocListHandler::elements() const
-{
- return new TocListIterator(*this);
-}
-
-//----------------------------------------------------------------------
-// TocItemHandler
-//----------------------------------------------------------------------
-
-TocItemHandler::TocItemHandler(IBaseHandler *parent) : m_parent(parent)
-{
- addEndHandler("tocitem",this,&TocItemHandler::endTocItem);
-}
-
-TocItemHandler::~TocItemHandler()
-{
-}
-
-void TocItemHandler::startTocItem(const QXmlAttributes& attrib)
-{
- m_parent->setDelegate(this);
- m_id = attrib.value("id");
- m_curString="";
-}
-
-void TocItemHandler::endTocItem()
-{
- m_title = m_curString;
- m_parent->setDelegate(0);
-}
-
-//----------------------------------------------------------------------
-// ParameterHandler
-//----------------------------------------------------------------------
-
-ParameterHandler::ParameterHandler(IBaseHandler *parent) :
- m_parent(parent)
-{
- addEndHandler("parametername",this,&ParameterHandler::endParameterName);
-}
-
-ParameterHandler::~ParameterHandler()
-{
-}
-
-void ParameterHandler::startParameterName(const QXmlAttributes& /*attrib*/)
-{
- m_parent->setDelegate(this);
-}
-
-void ParameterHandler::endParameterName()
-{
- m_name = m_curString;
- debug(2,"parameter %s\n",m_name.data());
- m_curString="";
- m_parent->setDelegate(0);
-}
-
-//----------------------------------------------------------------------
-// ParameterListHandler
-//----------------------------------------------------------------------
-
-ParameterItemHandler::ParameterItemHandler(IBaseHandler *parent)
- : m_parent(parent)
-{
- addEndHandler("parameteritem",this,&ParameterItemHandler::endParameterItem);
- addStartHandler("parameternamelist");
- addEndHandler("parameternamelist");
- addStartHandler("parametername",this,&ParameterItemHandler::startParameterName);
- addStartHandler("parameterdescription");
- addEndHandler("parameterdescription");
- addStartHandler("para",this,&ParameterItemHandler::startParagraph);
- m_parameters.setAutoDelete(TRUE);
- m_description = 0;
-}
-
-ParameterItemHandler::~ParameterItemHandler()
-{
- delete m_description;
-}
-
-void ParameterItemHandler::startParameterItem(const QXmlAttributes&)
-{
- m_parent->setDelegate(this);
-}
-
-void ParameterItemHandler::endParameterItem()
-{
- m_parent->setDelegate(0);
-}
-
-void ParameterItemHandler::startParameterName(const QXmlAttributes& attrib)
-{
- ParameterHandler *param = new ParameterHandler(this);
- m_parameters.append(param);
- param->startParameterName(attrib);
-}
-
-void ParameterItemHandler::startParagraph(const QXmlAttributes& attrib)
-{
- m_description = new ParagraphHandler(this);
- m_description->startParagraph(attrib);
-}
-
-IDocIterator *ParameterItemHandler::paramNames() const
-{
- return new ParameterItemIterator(*this);
-}
-
-//----------------------------------------------------------------------
-// ParameterListHandler
-//----------------------------------------------------------------------
-
-ParameterListHandler::ParameterListHandler(IBaseHandler *parent)
- : m_parent(parent)
-{
- addEndHandler("parameterlist",this,&ParameterListHandler::endParameterList);
- addStartHandler("parameteritem",this,&ParameterListHandler::startParameterItem);
- m_paramItems.setAutoDelete(TRUE);
-}
-
-ParameterListHandler::~ParameterListHandler()
-{
-}
-
-void ParameterListHandler::startParameterList(const QXmlAttributes& attrib)
-{
- QString kind = attrib.value("kind");
- if (kind=="retval") m_type=RetVal;
- else if (kind=="exception") m_type=Exception;
- else if (kind=="param") m_type=Param;
- else
- {
- debug(1,"Error: invalid parameterlist type: %s\n",kind.data());
- }
- debug(2,"parameterlist kind=%s\n",kind.data());
- m_parent->setDelegate(this);
-}
-
-void ParameterListHandler::endParameterList()
-{
- m_parent->setDelegate(0);
-}
-
-void ParameterListHandler::startParameterItem(const QXmlAttributes& attrib)
-{
- ParameterItemHandler *paramItem = new ParameterItemHandler(this);
- m_paramItems.append(paramItem);
- paramItem->startParameterItem(attrib);
-}
-
-IDocIterator *ParameterListHandler::params() const
-{
- return new ParameterListIterator(*this);
-}
-
-//----------------------------------------------------------------------
-// LinkHandler
-//----------------------------------------------------------------------
-
-LinkHandler::LinkHandler(IBaseHandler *parent)
- : m_parent(parent)
-{
- addEndHandler("link",this,&LinkHandler::endLink);
-}
-
-LinkHandler::~LinkHandler()
-{
-}
-
-void LinkHandler::startLink(const QXmlAttributes& attrib)
-{
- m_parent->setDelegate(this);
- debug(2,"Start link\n");
- m_ref = attrib.value("linkend");
- m_curString="";
-}
-
-void LinkHandler::endLink()
-{
- m_text = m_curString;
- m_curString="";
- m_parent->setDelegate(0);
- debug(2,"End link\n");
-}
-
-//----------------------------------------------------------------------
-// EMailHandler
-//----------------------------------------------------------------------
-
-EMailHandler::EMailHandler(IBaseHandler *parent)
- : m_parent(parent)
-{
- addEndHandler("email",this,&EMailHandler::endEMail);
-}
-
-EMailHandler::~EMailHandler()
-{
-}
-
-void EMailHandler::startEMail(const QXmlAttributes& /*attrib*/)
-{
- m_parent->setDelegate(this);
- debug(2,"Start email\n");
- m_curString="";
-}
-
-void EMailHandler::endEMail()
-{
- m_address = m_curString;
- m_curString="";
- m_parent->setDelegate(0);
- debug(2,"End email\n");
-}
-
-//----------------------------------------------------------------------
-// ULinkHandler
-//----------------------------------------------------------------------
-
-ULinkHandler::ULinkHandler(IBaseHandler *parent)
- : m_parent(parent)
-{
- addEndHandler("ulink",this,&ULinkHandler::endULink);
-}
-
-ULinkHandler::~ULinkHandler()
-{
-}
-
-void ULinkHandler::startULink(const QXmlAttributes& attrib)
-{
- m_parent->setDelegate(this);
- debug(2,"Start ulink\n");
- m_url = attrib.value("url");
- m_curString="";
-}
-
-void ULinkHandler::endULink()
-{
- m_text = m_curString;
- m_curString="";
- m_parent->setDelegate(0);
- debug(2,"End ulink\n");
-}
-
-//----------------------------------------------------------------------
-// LineBreakHandler
-//----------------------------------------------------------------------
-
-LineBreakHandler::LineBreakHandler(IBaseHandler *parent)
- : m_parent(parent)
-{
- addEndHandler("linebreak",this,&LineBreakHandler::endLineBreak);
-}
-
-LineBreakHandler::~LineBreakHandler()
-{
-}
-
-void LineBreakHandler::startLineBreak(const QXmlAttributes& /*attrib*/)
-{
- m_parent->setDelegate(this);
- debug(2,"Start linebreak\n");
-}
-
-void LineBreakHandler::endLineBreak()
-{
- m_parent->setDelegate(0);
- debug(2,"End linebreak\n");
-}
-
-//----------------------------------------------------------------------
-// HRulerHandler
-//----------------------------------------------------------------------
-
-HRulerHandler::HRulerHandler(IBaseHandler *parent)
- : m_parent(parent)
-{
- addEndHandler("hruler",this,&HRulerHandler::endHRuler);
-}
-
-HRulerHandler::~HRulerHandler()
-{
-}
-
-void HRulerHandler::startHRuler(const QXmlAttributes& /*attrib*/)
-{
- m_parent->setDelegate(this);
- debug(2,"Start hruler\n");
-}
-
-void HRulerHandler::endHRuler()
-{
- m_parent->setDelegate(0);
- debug(2,"End hruler\n");
-}
-
-//----------------------------------------------------------------------
-// RefHandler
-//----------------------------------------------------------------------
-
-RefHandler::RefHandler(IBaseHandler *parent)
- : m_parent(parent)
-{
- addEndHandler("ref",this,&RefHandler::endRef);
-}
-
-RefHandler::~RefHandler()
-{
-}
-
-void RefHandler::startRef(const QXmlAttributes& attrib)
-{
- m_parent->setDelegate(this);
- m_refId = attrib.value("refid");
- m_extId = attrib.value("external");
- ASSERT(attrib.value("kindref")=="compound" ||
- attrib.value("kindref")=="member");
- m_targetKind = attrib.value("kindref")=="compound" ? Compound : Member;
- debug(2,"Start ref refId=%s\n",m_refId.data());
- m_curString="";
-}
-
-void RefHandler::endRef()
-{
- m_linkText = m_curString;
- m_parent->setDelegate(0);
- debug(2,"End ref: text=`%s'\n",m_linkText.data());
-}
-
-
-//----------------------------------------------------------------------
-// TitleHandler
-//----------------------------------------------------------------------
-
-TitleHandler::TitleHandler(IBaseHandler *parent)
- : m_parent(parent)
-{
- m_children.setAutoDelete(TRUE);
- m_markupHandler = new MarkupHandler(m_children,m_curString);
- setFallBackHandler(m_markupHandler);
- addStartHandler("ref",this,&TitleHandler::startRef);
- addEndHandler("title",this,&TitleHandler::endTitle);
-}
-
-TitleHandler::~TitleHandler()
-{
- delete m_markupHandler;
-}
-
-void TitleHandler::startTitle(const QXmlAttributes& /*attrib*/)
-{
- m_parent->setDelegate(this);
- debug(2,"Start title\n");
- m_curString="";
-}
-
-void TitleHandler::endTitle()
-{
- addTextNode();
- m_parent->setDelegate(0);
- debug(2,"End title\n");
-}
-
-void TitleHandler::addTextNode()
-{
- if (!m_curString.isEmpty())
- {
- m_children.append(
- new TextNode(
- m_curString,
- m_markupHandler->markup(),
- m_markupHandler->headingLevel()
- )
- );
- debug(2,"addTextNode() text=\"%s\" markup=%x headingLevel=%d\n",
- m_curString.data(),m_markupHandler->markup(),m_markupHandler->headingLevel());
- m_curString="";
- }
-}
-
-void TitleHandler::startRef(const QXmlAttributes& attrib)
-{
- RefHandler *ref = new RefHandler(this);
- ref->startRef(attrib);
- m_children.append(ref);
-}
-
-IDocIterator *TitleHandler::title() const
-{
- return new TitleIterator(*this);
-}
-
-//----------------------------------------------------------------------
-// SimpleSectHandler
-//----------------------------------------------------------------------
-
-SimpleSectHandler::SimpleSectHandler(IBaseHandler *parent)
- : m_parent(parent), m_paragraph(0), m_title(0)
-{
- addStartHandler("title",this,&SimpleSectHandler::startTitle);
- addStartHandler("para",this,&SimpleSectHandler::startParagraph);
- addEndHandler("simplesect",this,&SimpleSectHandler::endSimpleSect);
-}
-
-SimpleSectHandler::~SimpleSectHandler()
-{
-}
-
-void SimpleSectHandler::startSimpleSect(const QXmlAttributes& attrib)
-{
- m_typeString = attrib.value("kind");
- m_type = s_typeMapper->stringToType(m_typeString);
- debug(2,"start simple section %s\n",m_typeString.data());
- m_parent->setDelegate(this);
-}
-
-void SimpleSectHandler::endSimpleSect()
-{
- debug(2,"end simple section\n");
- m_parent->setDelegate(0);
-}
-
-void SimpleSectHandler::startTitle(const QXmlAttributes& attrib)
-{
- ASSERT(m_title==0);
- m_title = new TitleHandler(this);
- m_title->startTitle(attrib);
-}
-
-void SimpleSectHandler::startParagraph(const QXmlAttributes& attrib)
-{
- ASSERT(m_paragraph==0);
- m_paragraph = new ParagraphHandler(this);
- m_paragraph->startParagraph(attrib);
-}
-
-//----------------------------------------------------------------------
-// VariableListEntryHandler
-//----------------------------------------------------------------------
-
-VariableListEntryHandler::VariableListEntryHandler(IBaseHandler *parent)
- : m_parent(parent), m_description(0), m_linkedTextHandler(0)
-{
- addStartHandler("term",this,&VariableListEntryHandler::startTerm);
- addEndHandler("term",this,&VariableListEntryHandler::endTerm);
- addStartHandler("para",this,&VariableListEntryHandler::startParagraph);
- addEndHandler("varlistentry",this,&VariableListEntryHandler::endVarListEntry);
- addEndHandler("listitem",this,&VariableListEntryHandler::endListItem);
-}
-
-VariableListEntryHandler::~VariableListEntryHandler()
-{
- delete m_description;
-}
-
-void VariableListEntryHandler::startVarListEntry(const QXmlAttributes& /*attrib*/)
-{
- m_parent->setDelegate(this);
- debug(2,"start varlistentry\n");
-}
-
-void VariableListEntryHandler::endVarListEntry()
-{
- m_parent->setDelegate(0);
- debug(2,"end varlistentry\n");
-}
-
-void VariableListEntryHandler::startListItem(const QXmlAttributes& /*attrib*/)
-{
- m_parent->setDelegate(this);
- debug(2,"start listitem\n");
-}
-
-void VariableListEntryHandler::endListItem()
-{
- m_parent->setDelegate(0);
- debug(2,"end listitem\n");
-}
-
-void VariableListEntryHandler::startTerm(const QXmlAttributes& /*attrib*/)
-{
- m_curString="";
- m_linkedTextHandler = new LinkedTextHandler(this,m_term);
- m_linkedTextHandler->start("term");
-}
-
-void VariableListEntryHandler::endTerm()
-{
- delete m_linkedTextHandler;
-}
-
-void VariableListEntryHandler::startParagraph(const QXmlAttributes& attrib)
-{
- ASSERT(m_description==0);
- m_description = new ParagraphHandler(this);
- m_description->startParagraph(attrib);
-}
-
-ILinkedTextIterator *VariableListEntryHandler::term() const
-{
- return new LinkedTextIterator(m_term);
-}
-
-
-//----------------------------------------------------------------------
-// VariableListHandler
-//----------------------------------------------------------------------
-
-VariableListHandler::VariableListHandler(IBaseHandler *parent)
- : m_parent(parent)
-{
- m_entries.setAutoDelete(TRUE);
- addStartHandler("varlistentry",this,&VariableListHandler::startVarListEntry);
- addStartHandler("listitem",this,&VariableListHandler::startListItem);
- addEndHandler("variablelist",this,&VariableListHandler::endVariableList);
-}
-
-VariableListHandler::~VariableListHandler()
-{
-}
-
-void VariableListHandler::startVariableList(const QXmlAttributes& /*attrib*/)
-{
- m_parent->setDelegate(this);
- debug(2,"start variablelist\n");
-}
-
-void VariableListHandler::endVariableList()
-{
- debug(2,"end variablelist\n");
- m_parent->setDelegate(0);
-}
-
-void VariableListHandler::startVarListEntry(const QXmlAttributes& attrib)
-{
- VariableListEntryHandler *vle = new VariableListEntryHandler(this);
- vle->startVarListEntry(attrib);
- m_curEntry = vle;
- m_entries.append(vle);
-}
-
-void VariableListHandler::startListItem(const QXmlAttributes& attrib)
-{
- ASSERT(m_curEntry!=0);
- m_curEntry->startListItem(attrib);
-}
-
-IDocIterator *VariableListHandler::entries() const
-{
- return new VariableListIterator(*this);
-}
-
-//----------------------------------------------------------------------
-// HighlightHandler
-//----------------------------------------------------------------------
-
-HighlightHandler::HighlightHandler(IBaseHandler *parent)
- : m_parent(parent)
-{
- m_children.setAutoDelete(TRUE);
- addEndHandler("highlight",this,&HighlightHandler::endHighlight);
- addStartHandler("ref",this,&HighlightHandler::startRef);
- addStartHandler("sp",this,&HighlightHandler::startSpace);
- m_hl = IDocHighlight::Invalid;
-}
-
-HighlightHandler::~HighlightHandler()
-{
-}
-
-void HighlightHandler::startHighlight(const QXmlAttributes& attrib)
-{
- m_hlString = attrib.value("class");
- m_hl = s_highlightMapper->stringToKind(m_hlString);
- m_curString="";
- m_parent->setDelegate(this);
- debug(2,"start highlight\n");
-}
-
-void HighlightHandler::endHighlight()
-{
- addTextNode();
- debug(2,"end highlight class=`%s'\n",m_hlString.data());
- m_parent->setDelegate(0);
-}
-
-void HighlightHandler::startRef(const QXmlAttributes& attrib)
-{
- addTextNode();
- RefHandler *rh = new RefHandler(this);
- m_children.append(rh);
- rh->startRef(attrib);
-}
-
-void HighlightHandler::startSpace(const QXmlAttributes&)
-{
- m_curString=" ";
- addTextNode();
-}
-
-void HighlightHandler::addTextNode()
-{
- printf("m_curString=`%s'\n",m_curString.data());
- if (!m_curString.isEmpty())
- {
- m_children.append(new TextNode(m_curString,IDocMarkup::Normal,0));
- debug(2,"addTextNode() text=\"%s\"\n",
- m_curString.data());
- m_curString="";
- }
-}
-
-IDocIterator *HighlightHandler::codeElements() const
-{
- return new HighlightIterator(*this);
-}
-
-//----------------------------------------------------------------------
-// CodeLineHandler
-//----------------------------------------------------------------------
-
-CodeLineHandler::CodeLineHandler(IBaseHandler *parent)
- : m_parent(parent)
-{
- m_children.setAutoDelete(TRUE);
- addEndHandler("codeline",this,&CodeLineHandler::endCodeLine);
- addEndHandler("linenumber",this,&CodeLineHandler::endLineNumber);
- addStartHandler("highlight",this,&CodeLineHandler::startHighlight);
- addStartHandler("ref",this,&CodeLineHandler::startRef);
- m_lineNumber = 0;
-}
-
-CodeLineHandler::~CodeLineHandler()
-{
-}
-
-void CodeLineHandler::startCodeLine(const QXmlAttributes& /*attrib*/)
-{
- m_parent->setDelegate(this);
- debug(2,"start codeline\n");
-}
-
-void CodeLineHandler::endCodeLine()
-{
- addTextNode();
- debug(2,"end codeline\n");
- m_parent->setDelegate(0);
-}
-
-void CodeLineHandler::startLineNumber(const QXmlAttributes& attrib)
-{
- m_parent->setDelegate(this);
- debug(2,"start linenumber\n");
- m_lineNumber = attrib.value("line").toInt();
- m_refId = attrib.value("refid");
-}
-
-void CodeLineHandler::endLineNumber()
-{
- m_parent->setDelegate(0);
-}
-
-void CodeLineHandler::startHighlight(const QXmlAttributes& attrib)
-{
- addTextNode();
- HighlightHandler *hlh = new HighlightHandler(this);
- m_children.append(hlh);
- hlh->startHighlight(attrib);
-}
-
-void CodeLineHandler::startRef(const QXmlAttributes& attrib)
-{
- addTextNode();
- RefHandler *rh = new RefHandler(this);
- m_children.append(rh);
- rh->startRef(attrib);
-}
-
-void CodeLineHandler::addTextNode()
-{
- if (!m_curString.isEmpty())
- {
- m_children.append(new TextNode(m_curString,IDocMarkup::Normal,0));
- debug(2,"addTextNode() text=\"%s\"\n",
- m_curString.data());
- m_curString="";
- }
-}
-
-IDocIterator *CodeLineHandler::codeElements() const
-{
- return new CodeLineIterator(*this);
-}
-
-
-//----------------------------------------------------------------------
-// ProgramListingHandler
-//----------------------------------------------------------------------
-
-ProgramListingHandler::ProgramListingHandler(IBaseHandler *parent)
- : m_parent(parent)
-{
- m_children.setAutoDelete(TRUE);
- m_hasLineNumber=FALSE;
- addEndHandler("programlisting",this,&ProgramListingHandler::endProgramListing);
-
- addStartHandler("linenumber",this,&ProgramListingHandler::startLineNumber);
- addStartHandler("codeline",this,&ProgramListingHandler::startCodeLine);
-}
-
-ProgramListingHandler::~ProgramListingHandler()
-{
-}
-
-void ProgramListingHandler::startProgramListing(const QXmlAttributes& /*attrib*/)
-{
- m_parent->setDelegate(this);
- debug(2,"start programlisting\n");
-}
-
-void ProgramListingHandler::endProgramListing()
-{
- debug(2,"end programlisting\n");
- m_parent->setDelegate(0);
-}
-
-void ProgramListingHandler::startLineNumber(const QXmlAttributes& attrib)
-{
- CodeLineHandler *clh = new CodeLineHandler(this);
- m_children.append(clh);
- m_hasLineNumber=TRUE;
- clh->startLineNumber(attrib);
-}
-
-void ProgramListingHandler::startCodeLine(const QXmlAttributes& attrib)
-{
- CodeLineHandler *clh = 0;
- if (!m_hasLineNumber)
- {
- clh = new CodeLineHandler(this);
- m_children.append(clh);
- }
- else
- {
- clh = m_children.getLast();
- }
- ASSERT(clh!=0);
- clh->startCodeLine(attrib);
- m_hasLineNumber=FALSE;
-}
-
-IDocIterator *ProgramListingHandler::codeLines() const
-{
- return new ProgramListingIterator(*this);
-}
-
-
-
-//----------------------------------------------------------------------
-// FormulaHandler
-//----------------------------------------------------------------------
-
-FormulaHandler::FormulaHandler(IBaseHandler *parent)
- : m_parent(parent)
-{
- addEndHandler("formula",this,&FormulaHandler::endFormula);
-}
-
-FormulaHandler::~FormulaHandler()
-{
-}
-
-void FormulaHandler::startFormula(const QXmlAttributes& attrib)
-{
- m_id = attrib.value("id");
- m_curString="";
- m_parent->setDelegate(this);
-}
-
-void FormulaHandler::endFormula()
-{
- m_text = m_curString;
- debug(2,"formula id=`%s' text=`%s'\n",m_id.data(),m_text.data());
- m_parent->setDelegate(0);
-}
-
-//----------------------------------------------------------------------
-// AnchorHandler
-//----------------------------------------------------------------------
-
-AnchorHandler::AnchorHandler(IBaseHandler *parent)
- : m_parent(parent)
-{
- addEndHandler("anchor",this,&AnchorHandler::endAnchor);
-}
-
-AnchorHandler::~AnchorHandler()
-{
-}
-
-void AnchorHandler::startAnchor(const QXmlAttributes& attrib)
-{
- m_id = attrib.value("id");
- m_parent->setDelegate(this);
-}
-
-void AnchorHandler::endAnchor()
-{
- debug(2,"anchor id=`%s'\n",m_id.data());
- m_parent->setDelegate(0);
-}
-
-//----------------------------------------------------------------------
-// ImageHandler
-//----------------------------------------------------------------------
-
-ImageHandler::ImageHandler(IBaseHandler *parent)
- : m_parent(parent)
-{
- addEndHandler("image",this,&ImageHandler::endImage);
-}
-
-ImageHandler::~ImageHandler()
-{
-}
-
-void ImageHandler::startImage(const QXmlAttributes& attrib)
-{
- m_name = attrib.value("name");
- m_curString="";
- m_parent->setDelegate(this);
-}
-
-void ImageHandler::endImage()
-{
- m_caption = m_curString;
- debug(2,"image name=`%s' caption=`%s'\n",m_name.data(),m_caption.data());
- m_parent->setDelegate(0);
-}
-
-//----------------------------------------------------------------------
-// DotFileHandler
-//----------------------------------------------------------------------
-
-DotFileHandler::DotFileHandler(IBaseHandler *parent)
- : m_parent(parent)
-{
- addEndHandler("dotfile",this,&DotFileHandler::endDotFile);
-}
-
-DotFileHandler::~DotFileHandler()
-{
-}
-
-void DotFileHandler::startDotFile(const QXmlAttributes& attrib)
-{
- m_name = attrib.value("name");
- m_curString="";
- m_parent->setDelegate(this);
-}
-
-void DotFileHandler::endDotFile()
-{
- m_caption = m_curString;
- debug(2,"image name=`%s' caption=`%s'\n",m_name.data(),m_caption.data());
- m_parent->setDelegate(0);
-}
-
-//----------------------------------------------------------------------
-// IndexEntryHandler
-//----------------------------------------------------------------------
-
-IndexEntryHandler::IndexEntryHandler(IBaseHandler *parent)
- : m_parent(parent)
-{
- addEndHandler("indexentry",this,&IndexEntryHandler::endIndexEntry);
- addStartHandler("primaryie",this,&IndexEntryHandler::startPrimaryIE);
- addEndHandler("primaryie",this,&IndexEntryHandler::endPrimaryIE);
- addStartHandler("secondaryie",this,&IndexEntryHandler::startSecondaryIE);
- addEndHandler("secondaryie",this,&IndexEntryHandler::endSecondaryIE);
-}
-
-IndexEntryHandler::~IndexEntryHandler()
-{
-}
-
-void IndexEntryHandler::startIndexEntry(const QXmlAttributes& /*attrib*/)
-{
- debug(2,"start index entry\n");
- m_parent->setDelegate(this);
-}
-
-void IndexEntryHandler::endIndexEntry()
-{
- debug(2,"index entry primary=`%s' secondary=`%s'\n",
- m_primary.data(),m_secondary.data());
- m_parent->setDelegate(0);
-}
-
-void IndexEntryHandler::startPrimaryIE(const QXmlAttributes& /*attrib*/)
-{
- m_curString="";
-}
-
-void IndexEntryHandler::endPrimaryIE()
-{
- m_primary = m_curString;
-}
-
-void IndexEntryHandler::startSecondaryIE(const QXmlAttributes& /*attrib*/)
-{
- m_curString="";
-}
-
-void IndexEntryHandler::endSecondaryIE()
-{
- m_secondary = m_curString;
-}
-
-//----------------------------------------------------------------------
-// EntryHandler
-//----------------------------------------------------------------------
-
-EntryHandler::EntryHandler(IBaseHandler *parent)
- : m_parent(parent)
-{
- m_children.setAutoDelete(TRUE);
- addEndHandler("entry",this,&EntryHandler::endEntry);
- addStartHandler("para",this,&EntryHandler::startParagraph);
-}
-
-EntryHandler::~EntryHandler()
-{
-}
-
-void EntryHandler::startEntry(const QXmlAttributes&)
-{
- m_parent->setDelegate(this);
-}
-
-void EntryHandler::endEntry()
-{
- m_parent->setDelegate(0);
-}
-
-void EntryHandler::startParagraph(const QXmlAttributes& attrib)
-{
- ParagraphHandler *ph = new ParagraphHandler(this);
- ph->startParagraph(attrib);
- m_children.append(ph);
-}
-
-IDocIterator *EntryHandler::contents() const
-{
- return new EntryIterator(*this);
-}
-
-//----------------------------------------------------------------------
-// RowHandler
-//----------------------------------------------------------------------
-
-RowHandler::RowHandler(IBaseHandler *parent)
- : m_parent(parent)
-{
- m_children.setAutoDelete(TRUE);
- addEndHandler("row",this,&RowHandler::endRow);
- addStartHandler("entry",this,&RowHandler::startEntry);
-}
-
-RowHandler::~RowHandler()
-{
-}
-
-void RowHandler::startRow(const QXmlAttributes&)
-{
- m_parent->setDelegate(this);
-}
-
-void RowHandler::endRow()
-{
- m_parent->setDelegate(0);
-}
-
-void RowHandler::startEntry(const QXmlAttributes& attrib)
-{
- EntryHandler *eh = new EntryHandler(this);
- eh->startEntry(attrib);
- m_children.append(eh);
-}
-
-IDocIterator *RowHandler::entries() const
-{
- return new RowIterator(*this);
-}
-
-//----------------------------------------------------------------------
-// TableHandler
-//----------------------------------------------------------------------
-
-TableHandler::TableHandler(IBaseHandler *parent)
- : m_parent(parent)
-{
- m_children.setAutoDelete(TRUE);
- addEndHandler("table",this,&TableHandler::endTable);
- addStartHandler("row",this,&TableHandler::startRow);
- addStartHandler("caption",this,&TableHandler::startCaption);
- addEndHandler("caption",this,&TableHandler::endCaption);
-}
-
-TableHandler::~TableHandler()
-{
-}
-
-void TableHandler::startTable(const QXmlAttributes& attrib)
-{
- m_parent->setDelegate(this);
- m_numColumns = attrib.value("cols").toInt();
- debug(2,"table cols=%d\n",m_numColumns);
-}
-
-void TableHandler::endTable()
-{
- m_parent->setDelegate(0);
-}
-
-void TableHandler::startRow(const QXmlAttributes& attrib)
-{
- RowHandler *rh = new RowHandler(this);
- rh->startRow(attrib);
- m_children.append(rh);
-}
-
-void TableHandler::startCaption(const QXmlAttributes& /*attrib*/)
-{
- m_curString="";
-}
-
-void TableHandler::endCaption()
-{
- m_caption = m_curString;
-}
-
-IDocIterator *TableHandler::rows() const
-{
- return new TableIterator(*this);
-}
-
-//----------------------------------------------------------------------
-// CopyHandler
-//----------------------------------------------------------------------
-
-CopyHandler::CopyHandler(IBaseHandler *parent)
- : m_parent(parent)
-{
- m_children.setAutoDelete(TRUE);
-
- addEndHandler("copydoc",this,&CopyHandler::endCopy);
-
- addStartHandler("para",this,&CopyHandler::startParagraph);
-}
-
-CopyHandler::~CopyHandler()
-{
-}
-
-void CopyHandler::startCopy(const QXmlAttributes& /*attrib*/)
-{
- m_parent->setDelegate(this);
- debug(2,"start copy handler\n");
-}
-
-void CopyHandler::endCopy()
-{
- debug(2,"end copy handler\n");
- m_parent->setDelegate(0);
-}
-
-void CopyHandler::startParagraph(const QXmlAttributes& attrib)
-{
- ParagraphHandler *parHandler = new ParagraphHandler(this);
- parHandler->startParagraph(attrib);
- m_children.append(parHandler);
-}
-
-IDocIterator *CopyHandler::contents() const
-{
- return new CopyIterator(*this);
-}
-
-//----------------------------------------------------------------------
-// VerbatimHandler
-//----------------------------------------------------------------------
-
-VerbatimHandler::VerbatimHandler(IBaseHandler *parent)
- : m_parent(parent), m_type(IDocVerbatim::Invalid)
-{
- addEndHandler("verbatim",this,&VerbatimHandler::endVerbatim);
- addEndHandler("latexonly",this,&VerbatimHandler::endVerbatim);
- addEndHandler("htmlonly",this,&VerbatimHandler::endVerbatim);
-}
-
-VerbatimHandler::~VerbatimHandler()
-{
-}
-
-void VerbatimHandler::startVerbatim(const QXmlAttributes&,Types type)
-{
- m_type = type;
- m_parent->setDelegate(this);
- m_curString="";
-}
-
-void VerbatimHandler::endVerbatim()
-{
- m_text = m_curString;
- m_parent->setDelegate(0);
-}
-
-
-//----------------------------------------------------------------------
-// SymbolHandler
-//----------------------------------------------------------------------
-
-SymbolHandler::SymbolHandler(IBaseHandler *parent,Types type)
- : m_parent(parent), m_letter('\0'), m_type(type)
-{
- addEndHandler("symbol");
- switch (type)
- {
- case IDocSymbol::Invalid: m_typeString="invalid"; break;
- case IDocSymbol::Umlaut: m_typeString="umlaut"; break;
- case IDocSymbol::Acute: m_typeString="acute"; break;
- case IDocSymbol::Grave: m_typeString="grave"; break;
- case IDocSymbol::Circ: m_typeString="circ"; break;
- case IDocSymbol::Tilde: m_typeString="tilde"; break;
- case IDocSymbol::Szlig: m_typeString="szlig"; break;
- case IDocSymbol::Cedil: m_typeString="cedil"; break;
- case IDocSymbol::Ring: m_typeString="ring"; break;
- case IDocSymbol::Nbsp: m_typeString="nbsp"; break;
- case IDocSymbol::Copy: m_typeString="copy"; break;
- }
-}
-
-SymbolHandler::~SymbolHandler()
-{
-}
-
-void SymbolHandler::startSymbol(const QXmlAttributes& attrib)
-{
- QString ls = attrib.value("char");
- if (!ls.isEmpty()) m_letter = ls.latin1()[0];
-}
-
-//----------------------------------------------------------------------
-// ParagraphHandler
-//----------------------------------------------------------------------
-
-ParagraphHandler::ParagraphHandler(IBaseHandler *parent)
- : m_parent(parent)
-{
- m_children.setAutoDelete(TRUE);
-
- m_markupHandler = new MarkupHandler(m_children,m_curString);
-
- // preformatted
- setFallBackHandler(m_markupHandler);
-
- addEndHandler("para",this,&ParagraphHandler::endParagraph);
-
- addStartHandler("linebreak",this,&ParagraphHandler::startLineBreak);
- addStartHandler("hruler",this,&ParagraphHandler::startHRuler);
- addStartHandler("programlisting",this,&ParagraphHandler::startProgramListing);
- addStartHandler("verbatim",this,&ParagraphHandler::startVerbatim);
- addStartHandler("indexentry",this,&ParagraphHandler::startIndexEntry);
- addStartHandler("orderedlist",this,&ParagraphHandler::startOrderedList);
- addStartHandler("itemizedlist",this,&ParagraphHandler::startItemizedList);
- addStartHandler("simplesect",this,&ParagraphHandler::startSimpleSect);
- // TODO: title
- addStartHandler("variablelist",this,&ParagraphHandler::startVariableList);
- addStartHandler("table",this,&ParagraphHandler::startTable);
- // TODO: heading
- addStartHandler("image",this,&ParagraphHandler::startImage);
- addStartHandler("dotfile",this,&ParagraphHandler::startDotFile);
- addStartHandler("toclist",this,&ParagraphHandler::startTocList);
- // TODO: language???
- addStartHandler("parameterlist",this,&ParagraphHandler::startParameterList);
- // TODO: xrefsect
- addStartHandler("copydoc",this,&ParagraphHandler::startCopyDoc);
-
- addStartHandler("ref",this,&ParagraphHandler::startRef);
- addStartHandler("ulink",this,&ParagraphHandler::startULink);
- addStartHandler("email",this,&ParagraphHandler::startEMail);
- addStartHandler("link",this,&ParagraphHandler::startLink);
- addStartHandler("formula",this,&ParagraphHandler::startFormula);
- addStartHandler("latexonly",this,&ParagraphHandler::startHtmlOnly);
- addStartHandler("htmlonly",this,&ParagraphHandler::startLatexOnly);
- addStartHandler("umlaut",this,&ParagraphHandler::startUmlaut);
- addStartHandler("acute",this,&ParagraphHandler::startAcute);
- addStartHandler("grave",this,&ParagraphHandler::startGrave);
- addStartHandler("circ",this,&ParagraphHandler::startCirc);
- addStartHandler("tilde",this,&ParagraphHandler::startTilde);
- addStartHandler("szlig",this,&ParagraphHandler::startSzlig);
- addStartHandler("cedil",this,&ParagraphHandler::startCedil);
- addStartHandler("ring",this,&ParagraphHandler::startRing);
- addStartHandler("nbsp",this,&ParagraphHandler::startNbsp);
- addStartHandler("copy",this,&ParagraphHandler::startCopy);
- addStartHandler("anchor",this,&ParagraphHandler::startAnchor);
-}
-
-ParagraphHandler::~ParagraphHandler()
-{
- delete m_markupHandler;
-}
-
-void ParagraphHandler::startParagraph(const QXmlAttributes& /*attrib*/)
-{
- m_parent->setDelegate(this);
- debug(2,"para\n");
-}
-
-void ParagraphHandler::endParagraph()
-{
- addTextNode();
- debug(2,"end para\n");
- m_parent->setDelegate(0);
-}
-
-void ParagraphHandler::startItemizedList(const QXmlAttributes& attrib)
-{
- addTextNode();
- ItemizedListHandler *listHandler = new ItemizedListHandler(this);
- listHandler->startItemizedList(attrib);
- m_children.append(listHandler);
-}
-
-void ParagraphHandler::startOrderedList(const QXmlAttributes& attrib)
-{
- addTextNode();
- OrderedListHandler *listHandler = new OrderedListHandler(this);
- listHandler->startOrderedList(attrib);
- m_children.append(listHandler);
-}
-
-void ParagraphHandler::startParameterList(const QXmlAttributes& attrib)
-{
- addTextNode();
- ParameterListHandler *listHandler = new ParameterListHandler(this);
- listHandler->startParameterList(attrib);
- m_children.append(listHandler);
-}
-
-void ParagraphHandler::startSimpleSect(const QXmlAttributes& attrib)
-{
- addTextNode();
- SimpleSectHandler *sectHandler = new SimpleSectHandler(this);
- sectHandler->startSimpleSect(attrib);
- m_children.append(sectHandler);
-}
-
-void ParagraphHandler::startRef(const QXmlAttributes& attrib)
-{
- addTextNode();
- RefHandler *ref = new RefHandler(this);
- ref->startRef(attrib);
- m_children.append(ref);
-}
-
-void ParagraphHandler::startVariableList(const QXmlAttributes& attrib)
-{
- addTextNode();
- VariableListHandler *vl = new VariableListHandler(this);
- vl->startVariableList(attrib);
- m_children.append(vl);
-}
-
-void ParagraphHandler::startHRuler(const QXmlAttributes& attrib)
-{
- addTextNode();
- HRulerHandler *hr = new HRulerHandler(this);
- hr->startHRuler(attrib);
- m_children.append(hr);
-}
-
-void ParagraphHandler::startLineBreak(const QXmlAttributes& attrib)
-{
- addTextNode();
- LineBreakHandler *lb = new LineBreakHandler(this);
- lb->startLineBreak(attrib);
- m_children.append(lb);
-}
-
-void ParagraphHandler::startULink(const QXmlAttributes& attrib)
-{
- addTextNode();
- ULinkHandler *uh = new ULinkHandler(this);
- uh->startULink(attrib);
- m_children.append(uh);
-}
-
-void ParagraphHandler::startEMail(const QXmlAttributes& attrib)
-{
- addTextNode();
- EMailHandler *eh = new EMailHandler(this);
- eh->startEMail(attrib);
- m_children.append(eh);
-}
-
-void ParagraphHandler::startLink(const QXmlAttributes& attrib)
-{
- addTextNode();
- LinkHandler *lh = new LinkHandler(this);
- lh->startLink(attrib);
- m_children.append(lh);
-}
-
-void ParagraphHandler::startProgramListing(const QXmlAttributes& attrib)
-{
- addTextNode();
- ProgramListingHandler *pl = new ProgramListingHandler(this);
- pl->startProgramListing(attrib);
- m_children.append(pl);
-}
-
-void ParagraphHandler::startFormula(const QXmlAttributes& attrib)
-{
- addTextNode();
- FormulaHandler *fh = new FormulaHandler(this);
- fh->startFormula(attrib);
- m_children.append(fh);
-}
-
-void ParagraphHandler::startImage(const QXmlAttributes& attrib)
-{
- addTextNode();
- ImageHandler *ih = new ImageHandler(this);
- ih->startImage(attrib);
- m_children.append(ih);
-}
-
-void ParagraphHandler::startDotFile(const QXmlAttributes& attrib)
-{
- addTextNode();
- DotFileHandler *df = new DotFileHandler(this);
- df->startDotFile(attrib);
- m_children.append(df);
-}
-
-void ParagraphHandler::startIndexEntry(const QXmlAttributes& attrib)
-{
- addTextNode();
- IndexEntryHandler *df = new IndexEntryHandler(this);
- df->startIndexEntry(attrib);
- m_children.append(df);
-}
-
-void ParagraphHandler::startTable(const QXmlAttributes& attrib)
-{
- addTextNode();
- TableHandler *th = new TableHandler(this);
- th->startTable(attrib);
- m_children.append(th);
-}
-
-void ParagraphHandler::startVerbatim(const QXmlAttributes& attrib)
-{
- addTextNode();
- VerbatimHandler *vh = new VerbatimHandler(this);
- vh->startVerbatim(attrib,IDocVerbatim::Verbatim);
- m_children.append(vh);
-}
-
-void ParagraphHandler::startHtmlOnly(const QXmlAttributes& attrib)
-{
- addTextNode();
- VerbatimHandler *vh = new VerbatimHandler(this);
- vh->startVerbatim(attrib,IDocVerbatim::HtmlOnly);
- m_children.append(vh);
-}
-
-void ParagraphHandler::startLatexOnly(const QXmlAttributes& attrib)
-{
- addTextNode();
- VerbatimHandler *vh = new VerbatimHandler(this);
- vh->startVerbatim(attrib,IDocVerbatim::LatexOnly);
- m_children.append(vh);
-}
-
-void ParagraphHandler::startUmlaut(const QXmlAttributes& attrib)
-{
- addTextNode();
- SymbolHandler *sh = new SymbolHandler(this,IDocSymbol::Umlaut);
- sh->startSymbol(attrib);
- m_children.append(sh);
-}
-
-void ParagraphHandler::startAcute(const QXmlAttributes& attrib)
-{
- addTextNode();
- SymbolHandler *sh = new SymbolHandler(this,IDocSymbol::Acute);
- sh->startSymbol(attrib);
- m_children.append(sh);
-}
-
-void ParagraphHandler::startGrave(const QXmlAttributes& attrib)
-{
- addTextNode();
- SymbolHandler *sh = new SymbolHandler(this,IDocSymbol::Grave);
- sh->startSymbol(attrib);
- m_children.append(sh);
-}
-
-void ParagraphHandler::startCirc(const QXmlAttributes& attrib)
-{
- addTextNode();
- SymbolHandler *sh = new SymbolHandler(this,IDocSymbol::Circ);
- sh->startSymbol(attrib);
- m_children.append(sh);
-}
-
-void ParagraphHandler::startTilde(const QXmlAttributes& attrib)
-{
- addTextNode();
- SymbolHandler *sh = new SymbolHandler(this,IDocSymbol::Tilde);
- sh->startSymbol(attrib);
- m_children.append(sh);
-}
-
-void ParagraphHandler::startSzlig(const QXmlAttributes& attrib)
-{
- addTextNode();
- SymbolHandler *sh = new SymbolHandler(this,IDocSymbol::Szlig);
- sh->startSymbol(attrib);
- m_children.append(sh);
-}
-
-void ParagraphHandler::startCedil(const QXmlAttributes& attrib)
-{
- addTextNode();
- SymbolHandler *sh = new SymbolHandler(this,IDocSymbol::Cedil);
- sh->startSymbol(attrib);
- m_children.append(sh);
-}
-
-void ParagraphHandler::startRing(const QXmlAttributes& attrib)
-{
- addTextNode();
- SymbolHandler *sh = new SymbolHandler(this,IDocSymbol::Ring);
- sh->startSymbol(attrib);
- m_children.append(sh);
-}
-
-void ParagraphHandler::startNbsp(const QXmlAttributes& attrib)
-{
- addTextNode();
- SymbolHandler *sh = new SymbolHandler(this,IDocSymbol::Nbsp);
- sh->startSymbol(attrib);
- m_children.append(sh);
-}
-
-void ParagraphHandler::startCopy(const QXmlAttributes& attrib)
-{
- addTextNode();
- SymbolHandler *sh = new SymbolHandler(this,IDocSymbol::Copy);
- sh->startSymbol(attrib);
- m_children.append(sh);
-}
-
-void ParagraphHandler::startAnchor(const QXmlAttributes& attrib)
-{
- addTextNode();
- AnchorHandler *ah = new AnchorHandler(this);
- ah->startAnchor(attrib);
- m_children.append(ah);
-}
-
-void ParagraphHandler::startCopyDoc(const QXmlAttributes& attrib)
-{
- addTextNode();
- CopyHandler *ch = new CopyHandler(this);
- ch->startCopy(attrib);
- m_children.append(ch);
-}
-
-void ParagraphHandler::startTocList(const QXmlAttributes& attrib)
-{
- addTextNode();
- TocListHandler *th = new TocListHandler(this);
- th->startTocList(attrib);
- m_children.append(th);
-}
-
-void ParagraphHandler::addTextNode()
-{
- if (!m_curString.isEmpty())
- {
- m_children.append(
- new TextNode(
- m_curString,
- m_markupHandler->markup(),
- m_markupHandler->headingLevel()
- )
- );
- debug(2,"addTextNode() text=\"%s\" markup=%x headingLevel=%d\n",
- m_curString.data(),m_markupHandler->markup(),m_markupHandler->headingLevel());
- m_curString="";
- }
-}
-
-IDocIterator *ParagraphHandler::contents() const
-{
- return new ParagraphIterator(*this);
-}
-
-//----------------------------------------------------------------------
-// DocSectionHandler
-//----------------------------------------------------------------------
-
-DocSectionHandler::DocSectionHandler(IBaseHandler *parent,int level)
- : m_parent(parent), m_internal(0), m_level(level), m_title(0)
-{
- QString sectionKey;
- m_paragraphs.setAutoDelete(TRUE);
- m_subsections.setAutoDelete(TRUE);
- addStartHandler("title",this,&DocSectionHandler::startTitle);
- addStartHandler("para",this,&DocSectionHandler::startParagraph);
- if (level<6)
- {
- sectionKey.sprintf("sect%d",level+1);
- addStartHandler(sectionKey,this,&DocSectionHandler::startSubSection);
- }
- addStartHandler("internal",this,&DocSectionHandler::startInternal);
- sectionKey.sprintf("sect%d",level);
- addEndHandler(sectionKey,this,&DocSectionHandler::endDocSection);
-}
-
-DocSectionHandler::~DocSectionHandler()
-{
-}
-
-void DocSectionHandler::startDocSection(const QXmlAttributes& attrib)
-{
- m_parent->setDelegate(this);
- debug(2,"Start docsection\n");
- m_id = attrib.value("id");
-}
-
-void DocSectionHandler::endDocSection()
-{
- m_parent->setDelegate(0);
- debug(2,"End docsection\n");
-}
-
-void DocSectionHandler::startSubSection(const QXmlAttributes& attrib)
-{
- DocSectionHandler *secHandler = new DocSectionHandler(this,m_level+1);
- secHandler->startDocSection(attrib);
- m_subsections.append(secHandler);
-}
-
-void DocSectionHandler::startParagraph(const QXmlAttributes& attrib)
-{
- ParagraphHandler *parHandler = new ParagraphHandler(this);
- parHandler->startParagraph(attrib);
- m_paragraphs.append(parHandler);
-}
-
-void DocSectionHandler::startInternal(const QXmlAttributes& attrib)
-{
- m_internal = new DocInternalHandler(this,m_level);
- m_internal->startInternal(attrib);
-}
-
-void DocSectionHandler::startTitle(const QXmlAttributes& attrib)
-{
- m_title = new TitleHandler(this);
- m_title->startTitle(attrib);
-}
-
-IDocIterator *DocSectionHandler::paragraphs() const
-{
- return new DocSectionParaIterator(*this);
-}
-
-IDocIterator *DocSectionHandler::subSections() const
-{
- return new DocSectionSubIterator(*this);
-}
-
-IDocInternal *DocSectionHandler::internal() const
-{
- return m_internal;
-}
-
-//----------------------------------------------------------------------
-// DocInternal
-//----------------------------------------------------------------------
-
-DocInternalHandler::DocInternalHandler(IBaseHandler *parent,int level)
- : m_parent(parent), m_level(level)
-{
- m_paragraphs.setAutoDelete(TRUE);
- m_subsections.setAutoDelete(TRUE);
- addStartHandler("para",this,&DocInternalHandler::startParagraph);
- QString sectionKey;
- sectionKey.sprintf("sect%d",level+1);
- addStartHandler(sectionKey,this,&DocInternalHandler::startSubSection);
- addEndHandler("internal",this,&DocInternalHandler::endInternal);
-}
-
-DocInternalHandler::~DocInternalHandler()
-{
-}
-
-void DocInternalHandler::startInternal(const QXmlAttributes&)
-{
- m_parent->setDelegate(this);
- debug(2,"Start internal\n");
-}
-
-void DocInternalHandler::endInternal()
-{
- m_parent->setDelegate(0);
- debug(2,"End internal\n");
-}
-
-void DocInternalHandler::startSubSection(const QXmlAttributes& attrib)
-{
- DocSectionHandler *secHandler = new DocSectionHandler(this,m_level+1);
- secHandler->startDocSection(attrib);
- m_subsections.append(secHandler);
-}
-
-void DocInternalHandler::startParagraph(const QXmlAttributes& attrib)
-{
- ParagraphHandler *parHandler = new ParagraphHandler(this);
- parHandler->startParagraph(attrib);
- m_paragraphs.append(parHandler);
-}
-
-IDocIterator *DocInternalHandler::paragraphs() const
-{
- return new DocInternalParaIterator(*this);
-}
-
-IDocIterator *DocInternalHandler::subSections() const
-{
- return new DocInternalSubIterator(*this);
-}
-
-
-//----------------------------------------------------------------------
-// DocHandler
-//----------------------------------------------------------------------
-
-DocHandler::DocHandler(IBaseHandler *parent) : m_parent(parent)
-{
- m_children.setAutoDelete(TRUE);
-
- addEndHandler("briefdescription",this,&DocHandler::endDoc);
- addEndHandler("detaileddescription",this,&DocHandler::endDoc);
- addEndHandler("inbodydescription",this,&DocHandler::endDoc);
- //addEndHandler("internal"); // TODO: implement this as a section
- addStartHandler("internal",this,&DocHandler::startInternal);
-
- addStartHandler("para",this,&DocHandler::startParagraph);
- addStartHandler("sect1",this,&DocHandler::startSect1);
- addStartHandler("title",this,&DocHandler::startTitle);
- //addStartHandler("internal");
-}
-
-DocHandler::~DocHandler()
-{
-}
-
-void DocHandler::startDoc(const QXmlAttributes& /*attrib*/)
-{
- m_parent->setDelegate(this);
- debug(2,"start dochandler\n");
-}
-
-void DocHandler::endDoc()
-{
- debug(2,"end dochandler\n");
- m_parent->setDelegate(0);
-}
-
-void DocHandler::startParagraph(const QXmlAttributes& attrib)
-{
- ParagraphHandler *parHandler = new ParagraphHandler(this);
- parHandler->startParagraph(attrib);
- m_children.append(parHandler);
-}
-
-void DocHandler::startSect1(const QXmlAttributes& attrib)
-{
- DocSectionHandler *secHandler = new DocSectionHandler(this,1);
- secHandler->startDocSection(attrib);
- m_children.append(secHandler);
-}
-
-void DocHandler::startTitle(const QXmlAttributes& attrib)
-{
- TitleHandler *titleHandler = new TitleHandler(this);
- titleHandler->startTitle(attrib);
- m_children.append(titleHandler);
-}
-
-void DocHandler::startInternal(const QXmlAttributes& attrib)
-{
- m_internal = new DocInternalHandler(this,1);
- m_internal->startInternal(attrib);
-}
-
-IDocIterator *DocHandler::contents() const
-{
- return new DocIterator(*this);
-}
-
-IDocInternal *DocHandler::internal() const
-{
- return m_internal;
-}
-
diff --git a/addon/doxmlparser/src/dochandler.h b/addon/doxmlparser/src/dochandler.h
deleted file mode 100644
index 922624d..0000000
--- a/addon/doxmlparser/src/dochandler.h
+++ /dev/null
@@ -1,1352 +0,0 @@
-/******************************************************************************
- *
- * $Id$
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#ifndef _DOCHANDLER_H
-#define _DOCHANDLER_H
-
-#include <qstring.h>
-#include <qlist.h>
-#include <qxml.h>
-
-#include <doxmlintf.h>
-#include "stringimpl.h"
-#include "basehandler.h"
-#include "baseiterator.h"
-
-class ParagraphHandler;
-class DocInternalHandler;
-class LinkedTextImpl;
-class LinkedTextHandler;
-
-//-----------------------------------------------------------------------------
-
-class DocImpl : public IDoc { public: virtual ~DocImpl() {} };
-
-#define DEFINE_CLS_IMPL(cls) \
- class cls##Impl : public I##cls, public DocImpl { public: virtual ~cls##Impl() {} }
-
-DEFINE_CLS_IMPL(DocMarkup);
-DEFINE_CLS_IMPL(DocPara);
-DEFINE_CLS_IMPL(DocText);
-DEFINE_CLS_IMPL(DocMarkupModifier);
-DEFINE_CLS_IMPL(DocItemizedList);
-DEFINE_CLS_IMPL(DocOrderedList);
-DEFINE_CLS_IMPL(DocListItem);
-DEFINE_CLS_IMPL(DocParameterList);
-DEFINE_CLS_IMPL(DocParameterItem);
-DEFINE_CLS_IMPL(DocParameter);
-DEFINE_CLS_IMPL(DocTitle);
-DEFINE_CLS_IMPL(DocSimpleSect);
-DEFINE_CLS_IMPL(DocRef);
-DEFINE_CLS_IMPL(DocVariableList);
-DEFINE_CLS_IMPL(DocVariableListEntry);
-DEFINE_CLS_IMPL(DocHRuler);
-DEFINE_CLS_IMPL(DocLineBreak);
-DEFINE_CLS_IMPL(DocULink);
-DEFINE_CLS_IMPL(DocEMail);
-DEFINE_CLS_IMPL(DocLink);
-DEFINE_CLS_IMPL(DocProgramListing);
-DEFINE_CLS_IMPL(DocCodeLine);
-DEFINE_CLS_IMPL(DocHighlight);
-DEFINE_CLS_IMPL(DocFormula);
-DEFINE_CLS_IMPL(DocImage);
-DEFINE_CLS_IMPL(DocDotFile);
-DEFINE_CLS_IMPL(DocIndexEntry);
-DEFINE_CLS_IMPL(DocTable);
-DEFINE_CLS_IMPL(DocRow);
-DEFINE_CLS_IMPL(DocEntry);
-DEFINE_CLS_IMPL(DocSection);
-DEFINE_CLS_IMPL(DocVerbatim);
-DEFINE_CLS_IMPL(DocCopy);
-DEFINE_CLS_IMPL(DocTocList);
-DEFINE_CLS_IMPL(DocTocItem);
-DEFINE_CLS_IMPL(DocAnchor);
-DEFINE_CLS_IMPL(DocSymbol);
-DEFINE_CLS_IMPL(DocInternal);
-DEFINE_CLS_IMPL(DocRoot);
-
-//-----------------------------------------------------------------------------
-
-
-/*! \brief Node representing a piece of text.
- *
- */
-class TextNode : public DocTextImpl
-{
- public:
- TextNode(const QString &t,int markup,int level)
- : m_text(t), m_markup(markup), m_headingLevel(level) {}
- virtual ~TextNode() {}
-
- // IDocText
- virtual Kind kind() const { return DocImpl::Text; }
- virtual const IString *text() const { return &m_text; }
- virtual int markup() const { return m_markup; }
- virtual int headingLevel() const { return m_headingLevel; }
-
- private:
- StringImpl m_text;
- int m_markup;
- int m_headingLevel;
-};
-
-//-----------------------------------------------------------------------------
-
-/*! \brief Node representing a change in the markup style.
- *
- */
-class MarkupModifierNode : public DocMarkupModifierImpl
-{
- public:
- MarkupModifierNode(int markup,bool enabled,int level=0)
- : m_markup(markup), m_enabled(enabled), m_headingLevel(level) {}
- virtual ~MarkupModifierNode() {}
-
- // IDocMarkupModifier
- virtual Kind kind() const { return DocImpl::MarkupModifier; }
- virtual bool enabled() const { return m_enabled; }
- virtual int markup() const { return m_markup; }
- virtual int headingLevel() const { return m_headingLevel; }
-
- private:
- int m_markup;
- bool m_enabled;
- int m_headingLevel;
-};
-
-
-//-----------------------------------------------------------------------------
-
-/*! \brief Handles markup commands in the XML input.
- *
- */
-class MarkupHandler : public BaseFallBackHandler<MarkupHandler>
-{
- public:
- MarkupHandler(QList<DocImpl> &children,QString &curString);
- virtual ~MarkupHandler();
- int markup() const { return m_curMarkup; }
- int headingLevel() const { return m_headingLevel; }
-
- virtual void startBold(const QXmlAttributes &attrib);
- virtual void endBold();
- virtual void startEmphasis(const QXmlAttributes &attrib);
- virtual void endEmphasis();
- virtual void startComputerOutput(const QXmlAttributes &attrib);
- virtual void endComputerOutput();
- virtual void startCenter(const QXmlAttributes &attrib);
- virtual void endCenter();
- virtual void startSmallFont(const QXmlAttributes &attrib);
- virtual void endSmallFont();
- virtual void startSubscript(const QXmlAttributes &attrib);
- virtual void endSubscript();
- virtual void startSuperscript(const QXmlAttributes &attrib);
- virtual void endSuperscript();
- virtual void startPreformatted(const QXmlAttributes &attrib);
- virtual void endPreformatted();
- virtual void startHeading1(const QXmlAttributes &attrib);
- virtual void endHeading1();
- virtual void startHeading2(const QXmlAttributes &attrib);
- virtual void endHeading2();
- virtual void startHeading3(const QXmlAttributes &attrib);
- virtual void endHeading3();
- virtual void startHeading4(const QXmlAttributes &attrib);
- virtual void endHeading4();
- virtual void startHeading5(const QXmlAttributes &attrib);
- virtual void endHeading5();
- virtual void startHeading6(const QXmlAttributes &attrib);
- virtual void endHeading6();
-
-
- private:
- void addTextNode();
-
- QList<DocImpl> &m_children;
- QString &m_curString;
- int m_curMarkup;
- int m_headingLevel;
-};
-
-//-----------------------------------------------------------------------------
-
-/*! \brief Node representing a paragraph of text and commands.
- *
- */
-// children: itemizedlist, orderedlist, parameterlist, simplesect, ref,
-// variablelist, hruler, linebreak, ulink, email, link
-// programlisting, formula, image, dotfile, indexentry,
-// table
-//
-// children handled by MarkupHandler:
-// bold, computeroutput, emphasis, center,
-// small, subscript, superscript.
-//
-class ParagraphHandler : public DocParaImpl,
- public BaseHandler<ParagraphHandler>
-{
- friend class ParagraphIterator;
-
- public:
- virtual void startParagraph(const QXmlAttributes& attrib);
- virtual void endParagraph();
- virtual void startItemizedList(const QXmlAttributes& attrib);
- virtual void startOrderedList(const QXmlAttributes& attrib);
- virtual void startParameterList(const QXmlAttributes& attrib);
- virtual void startSimpleSect(const QXmlAttributes& attrib);
- virtual void startRef(const QXmlAttributes& attrib);
- virtual void startVariableList(const QXmlAttributes& attrib);
- virtual void startHRuler(const QXmlAttributes& attrib);
- virtual void startLineBreak(const QXmlAttributes& attrib);
- virtual void startULink(const QXmlAttributes& attrib);
- virtual void startEMail(const QXmlAttributes& attrib);
- virtual void startLink(const QXmlAttributes& attrib);
- virtual void startProgramListing(const QXmlAttributes& attrib);
- virtual void startFormula(const QXmlAttributes& attrib);
- virtual void startImage(const QXmlAttributes& attrib);
- virtual void startDotFile(const QXmlAttributes& attrib);
- virtual void startIndexEntry(const QXmlAttributes& attrib);
- virtual void startTable(const QXmlAttributes& attrib);
- virtual void startVerbatim(const QXmlAttributes& attrib);
- virtual void startHtmlOnly(const QXmlAttributes& attrib);
- virtual void startLatexOnly(const QXmlAttributes& attrib);
- virtual void startUmlaut(const QXmlAttributes& attrib);
- virtual void startAcute(const QXmlAttributes& attrib);
- virtual void startGrave(const QXmlAttributes& attrib);
- virtual void startCirc(const QXmlAttributes& attrib);
- virtual void startTilde(const QXmlAttributes& attrib);
- virtual void startSzlig(const QXmlAttributes& attrib);
- virtual void startCedil(const QXmlAttributes& attrib);
- virtual void startRing(const QXmlAttributes& attrib);
- virtual void startNbsp(const QXmlAttributes& attrib);
- virtual void startCopy(const QXmlAttributes& attrib);
- virtual void startAnchor(const QXmlAttributes& attrib);
- virtual void startCopyDoc(const QXmlAttributes& attrib);
- virtual void startTocList(const QXmlAttributes& attrib);
-
- ParagraphHandler(IBaseHandler *parent);
- virtual ~ParagraphHandler();
-
- // IDocPara
- virtual Kind kind() const { return DocImpl::Para; }
- virtual IDocIterator *contents() const;
-
- private:
- void addTextNode();
- IBaseHandler *m_parent;
- QList<DocImpl> m_children;
- MarkupHandler *m_markupHandler;
-};
-
-class ParagraphIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
-{
- public:
- ParagraphIterator(const ParagraphHandler &handler) :
- BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
-};
-
-//-----------------------------------------------------------------------------
-
-/*! \brief Node representing a list item.
- *
- */
-class ListItemHandler : public DocListItemImpl, public BaseHandler<ListItemHandler>
-{
- friend class ListItemIterator;
- public:
- ListItemHandler(IBaseHandler *parent);
- virtual ~ListItemHandler();
- virtual void startListItem(const QXmlAttributes& attrib);
- virtual void endListItem();
- virtual void startParagraph(const QXmlAttributes& attrib);
-
- // IDocItem
- virtual Kind kind() const { return DocImpl::ListItem; }
- virtual IDocIterator *contents() const;
-
- private:
- IBaseHandler *m_parent;
- QList<DocImpl> m_children;
-};
-
-class ListItemIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
-{
- public:
- ListItemIterator(const ListItemHandler &handler) :
- BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
-};
-
-
-//-----------------------------------------------------------------------------
-
-/*! \brief Node representing list of items.
- *
- */
-class OrderedListHandler : public DocOrderedListImpl, public BaseHandler<OrderedListHandler>
-{
- friend class OrderedListIterator;
- public:
- OrderedListHandler(IBaseHandler *parent);
- virtual ~OrderedListHandler();
- virtual void startOrderedList(const QXmlAttributes& attrib);
- virtual void endOrderedList();
- virtual void startOrderedListItem(const QXmlAttributes& attrib);
-
- // IDocOrderedList
- virtual Kind kind() const { return DocImpl::OrderedList; }
- virtual IDocIterator *elements() const;
-
- private:
- IBaseHandler *m_parent;
- QList<DocImpl> m_children;
-};
-
-class OrderedListIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
-{
- public:
- OrderedListIterator(const OrderedListHandler &handler) :
- BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
-};
-
-//-----------------------------------------------------------------------------
-
-/*! \brief Node representing table of contents list.
- *
- */
-class TocListHandler : public DocTocListImpl, public BaseHandler<TocListHandler>
-{
- friend class TocListIterator;
- public:
- TocListHandler(IBaseHandler *parent);
- virtual ~TocListHandler();
- virtual void startTocList(const QXmlAttributes& attrib);
- virtual void endTocList();
- virtual void startTocItem(const QXmlAttributes& attrib);
-
- // IDocTocList
- virtual Kind kind() const { return DocImpl::TocList; }
- virtual IDocIterator *elements() const;
-
- private:
- IBaseHandler *m_parent;
- QList<DocImpl> m_children;
-};
-
-class TocListIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
-{
- public:
- TocListIterator(const TocListHandler &handler) :
- BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
-};
-
-//-----------------------------------------------------------------------------
-
-/*! \brief Node representing a table of contents item.
- *
- */
-class TocItemHandler : public DocTocItemImpl, public BaseHandler<TocItemHandler>
-{
- friend class TocItemIterator;
- public:
- TocItemHandler(IBaseHandler *parent);
- virtual ~TocItemHandler();
- virtual void startTocItem(const QXmlAttributes& attrib);
- virtual void endTocItem();
-
- // IDocItem
- virtual Kind kind() const { return DocImpl::TocItem; }
- virtual const IString *id() const { return &m_id; }
- virtual const IString *title() const { return &m_title; }
-
- private:
- IBaseHandler *m_parent;
- StringImpl m_id;
- StringImpl m_title;
-};
-
-//-----------------------------------------------------------------------------
-
-/*! \brief Node representing list of items.
- *
- */
-class ItemizedListHandler : public DocItemizedListImpl, public BaseHandler<ItemizedListHandler>
-{
- friend class ItemizedListIterator;
- public:
- ItemizedListHandler(IBaseHandler *parent);
- virtual ~ItemizedListHandler();
- virtual void startItemizedList(const QXmlAttributes& attrib);
- virtual void endItemizedList();
- virtual void startItemizedListItem(const QXmlAttributes& attrib);
-
- // IDocItemizedList
- virtual Kind kind() const { return DocImpl::ItemizedList; }
- virtual IDocIterator *elements() const;
-
- private:
- IBaseHandler *m_parent;
- QList<DocImpl> m_children;
-};
-
-class ItemizedListIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
-{
- public:
- ItemizedListIterator(const ItemizedListHandler &handler) :
- BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
-};
-
-
-//-----------------------------------------------------------------------------
-/*! \brief Node representing a parameter.
- *
- */
-class ParameterHandler : public DocParameterImpl,
- public BaseHandler<ParameterHandler>
-{
- public:
- ParameterHandler(IBaseHandler *parent);
- virtual ~ParameterHandler();
- virtual void startParameterName(const QXmlAttributes& attrib);
- virtual void endParameterName();
-
- // IDocParameter
- virtual Kind kind() const { return DocImpl::Parameter; }
- virtual const IString *name() const { return &m_name; }
-
- private:
- IBaseHandler *m_parent;
- StringImpl m_name;
-};
-
-//-----------------------------------------------------------------------------
-
-/* \brief Node representing a list of param names with a single description.
- *
- */
-class ParameterItemHandler : public DocParameterItemImpl,
- public BaseHandler<ParameterItemHandler>
-{
- friend class ParameterItemIterator;
- public:
- ParameterItemHandler(IBaseHandler *parent);
- virtual ~ParameterItemHandler();
- virtual void startParameterItem(const QXmlAttributes& attrib);
- virtual void endParameterItem();
- virtual void startParameterName(const QXmlAttributes& attrib);
- virtual void startParagraph(const QXmlAttributes& attrib);
-
- // IDocParameterItem
- virtual Kind kind() const { return DocImpl::ParameterItem; }
- virtual IDocIterator *paramNames() const;
- virtual IDocPara *description() const { return m_description; }
-
- private:
- IBaseHandler *m_parent;
- QList<ParameterHandler> m_parameters;
- ParagraphHandler *m_description;
-};
-
-class ParameterItemIterator : public BaseIteratorVia<IDocIterator,IDoc,ParameterHandler,DocImpl>
-{
- public:
- ParameterItemIterator(const ParameterItemHandler &handler) :
- BaseIteratorVia<IDocIterator,IDoc,ParameterHandler,DocImpl>(handler.m_parameters) {}
-};
-
-//-----------------------------------------------------------------------------
-
-/* \brief Node representing a parameter section.
- *
- */
-class ParameterListHandler : public DocParameterListImpl,
- public BaseHandler<ParameterListHandler>
-{
- friend class ParameterListIterator;
- public:
- ParameterListHandler(IBaseHandler *parent);
- virtual ~ParameterListHandler();
- virtual void startParameterList(const QXmlAttributes& attrib);
- virtual void endParameterList();
- virtual void startParameterItem(const QXmlAttributes& attrib);
-
- // IDocParameterList
- virtual Kind kind() const { return DocImpl::ParameterList; }
- virtual Types sectType() const { return m_type; }
- virtual IDocIterator *params() const;
-
- private:
- IBaseHandler *m_parent;
- QList<ParameterItemHandler> m_paramItems;
- Types m_type;
-};
-
-class ParameterListIterator : public BaseIteratorVia<IDocIterator,IDoc,ParameterItemHandler,DocImpl>
-{
- public:
- ParameterListIterator(const ParameterListHandler &handler) :
- BaseIteratorVia<IDocIterator,IDoc,ParameterItemHandler,DocImpl>(handler.m_paramItems) {}
-};
-
-//-----------------------------------------------------------------------------
-
-/* \brief Node representing a horizontal ruler
- *
- */
-class LineBreakHandler : public DocLineBreakImpl, public BaseHandler<LineBreakHandler>
-{
- public:
- LineBreakHandler(IBaseHandler *parent);
- virtual ~LineBreakHandler();
-
- void startLineBreak(const QXmlAttributes& attrib);
- void endLineBreak();
-
- // IDocLineBreak
- virtual Kind kind() const { return DocImpl::LineBreak; }
-
- private:
- IBaseHandler *m_parent;
-};
-
-//-----------------------------------------------------------------------------
-
-/* \brief Node representing a link to section
- *
- */
-class LinkHandler : public DocLinkImpl, public BaseHandler<LinkHandler>
-{
- public:
- LinkHandler(IBaseHandler *parent);
- virtual ~LinkHandler();
-
- void startLink(const QXmlAttributes& attrib);
- void endLink();
-
- // IDocLink
- virtual Kind kind() const { return DocImpl::Link; }
- virtual const IString *refId() const { return &m_ref; }
- virtual const IString *text() const { return &m_text; }
-
- private:
- IBaseHandler *m_parent;
- StringImpl m_ref;
- StringImpl m_text;
-};
-
-
-//-----------------------------------------------------------------------------
-
-/* \brief Node representing a link to an email address
- *
- */
-class EMailHandler : public DocEMailImpl, public BaseHandler<EMailHandler>
-{
- public:
- EMailHandler(IBaseHandler *parent);
- virtual ~EMailHandler();
-
- void startEMail(const QXmlAttributes& attrib);
- void endEMail();
-
- // IDocEMail
- virtual Kind kind() const { return DocImpl::EMail; }
- virtual const IString *address() const { return &m_address; }
-
- private:
- IBaseHandler *m_parent;
- StringImpl m_address;
-};
-
-
-//-----------------------------------------------------------------------------
-
-/* \brief Node representing a link to an URL
- *
- */
-class ULinkHandler : public DocULinkImpl, public BaseHandler<ULinkHandler>
-{
- public:
- ULinkHandler(IBaseHandler *parent);
- virtual ~ULinkHandler();
-
- void startULink(const QXmlAttributes& attrib);
- void endULink();
-
- // IDocULink
- virtual Kind kind() const { return DocImpl::ULink; }
- virtual const IString * url() const { return &m_url; }
- virtual const IString * text() const { return &m_text; }
-
- private:
- IBaseHandler *m_parent;
- StringImpl m_url;
- StringImpl m_text;
-};
-
-//-----------------------------------------------------------------------------
-
-/* \brief Node representing a horizontal ruler
- *
- */
-class HRulerHandler : public DocHRulerImpl, public BaseHandler<HRulerHandler>
-{
- public:
- HRulerHandler(IBaseHandler *parent);
- virtual ~HRulerHandler();
-
- void startHRuler(const QXmlAttributes& attrib);
- void endHRuler();
-
- // IDocHRuler
- virtual Kind kind() const { return DocImpl::HRuler; }
-
- private:
- IBaseHandler *m_parent;
-};
-
-//-----------------------------------------------------------------------------
-
-/* \brief Node representing a reference to another item
- *
- */
-class RefHandler : public DocRefImpl, public BaseHandler<RefHandler>
-{
- public:
- RefHandler(IBaseHandler *parent);
- virtual ~RefHandler();
- void startRef(const QXmlAttributes& attrib);
- void endRef();
-
- // IDocRef
- virtual Kind kind() const { return DocImpl::Ref; }
- virtual const IString *refId() const { return &m_refId; }
- virtual TargetKind targetKind() const { return m_targetKind; }
- virtual const IString *external() const { return &m_extId; }
- virtual const IString *text() const { return &m_linkText; }
-
- private:
- IBaseHandler *m_parent;
- StringImpl m_refId;
- StringImpl m_extId;
- StringImpl m_linkText;
- TargetKind m_targetKind;
-};
-
-//-----------------------------------------------------------------------------
-
-/* \brief Node representing the title of a section
- *
- */
-// children: text, ref
-// children handled by MarkupHandler:
-// bold, computeroutput, emphasis, center,
-// small, subscript, superscript.
-class TitleHandler : public DocTitleImpl, public BaseHandler<TitleHandler>
-{
- friend class TitleIterator;
- public:
- TitleHandler(IBaseHandler *parent);
- virtual ~TitleHandler();
- virtual void startTitle(const QXmlAttributes& attrib);
- virtual void endTitle();
- virtual void startRef(const QXmlAttributes& attrib);
- void addTextNode();
-
- // IDocTitle
- virtual Kind kind() const { return DocImpl::Title; }
- virtual IDocIterator *title() const;
-
- private:
- IBaseHandler *m_parent;
- QList<DocImpl> m_children;
- MarkupHandler *m_markupHandler;
-};
-
-class TitleIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
-{
- public:
- TitleIterator(const TitleHandler &handler) :
- BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
-};
-
-//-----------------------------------------------------------------------------
-
-/* \brief Node representing a simple section with an unnumbered header.
- *
- */
-// children: title, para
-class SimpleSectHandler : public DocSimpleSectImpl,
- public BaseHandler<SimpleSectHandler>
-{
- public:
- SimpleSectHandler(IBaseHandler *parent);
- virtual ~SimpleSectHandler();
- virtual void startSimpleSect(const QXmlAttributes& attrib);
- virtual void endSimpleSect();
- virtual void startTitle(const QXmlAttributes& attrib);
- virtual void startParagraph(const QXmlAttributes& attrib);
-
- // IDocSimpleSect
- virtual Kind kind() const { return DocImpl::SimpleSect; }
- virtual Types type() const { return m_type; }
- virtual const IString *typeString() const { return &m_typeString; }
- virtual IDocTitle *title() const { return m_title; }
- virtual IDocPara *description() const { return m_paragraph; }
-
- private:
- IBaseHandler *m_parent;
- ParagraphHandler *m_paragraph;
- Types m_type;
- StringImpl m_typeString;
- TitleHandler *m_title;
-};
-
-//-----------------------------------------------------------------------------
-
-/* \brief Node representing an named item of a VariableList.
- *
- */
-class VariableListEntryHandler : public DocVariableListEntryImpl,
- public BaseHandler<VariableListEntryHandler>
-{
- public:
- virtual void startVarListEntry(const QXmlAttributes& attrib);
- virtual void endVarListEntry();
- virtual void startListItem(const QXmlAttributes& attrib);
- virtual void endListItem();
- virtual void startTerm(const QXmlAttributes& attrib);
- virtual void endTerm();
- virtual void startParagraph(const QXmlAttributes& attrib);
-
- VariableListEntryHandler(IBaseHandler *parent);
- virtual ~VariableListEntryHandler();
-
- // IDocVariableListEntry
- virtual Kind kind() const { return DocImpl::VariableListEntry; }
- virtual ILinkedTextIterator *term() const;
- virtual IDocPara *description() const { return m_description; }
-
- private:
- IBaseHandler* m_parent;
- QList<LinkedTextImpl> m_term;
- ParagraphHandler* m_description;
- LinkedTextHandler* m_linkedTextHandler;
-};
-
-//-----------------------------------------------------------------------------
-
-/*! \brief Node representing a list of named items.
- *
- */
-// children: varlistentry, listitem
-class VariableListHandler : public DocVariableListImpl,
- public BaseHandler<VariableListHandler>
-{
- friend class VariableListIterator;
-
- public:
- virtual void startVariableList(const QXmlAttributes& attrib);
- virtual void endVariableList();
- virtual void startVarListEntry(const QXmlAttributes& attrib);
- virtual void startListItem(const QXmlAttributes& attrib);
-
- VariableListHandler(IBaseHandler *parent);
- virtual ~VariableListHandler();
-
- // IDocVariableList
- virtual Kind kind() const { return DocImpl::VariableList; }
- virtual IDocIterator *entries() const;
-
- private:
- IBaseHandler *m_parent;
- QList<VariableListEntryHandler> m_entries;
- VariableListEntryHandler *m_curEntry;
-};
-
-class VariableListIterator : public BaseIteratorVia<IDocIterator,IDoc,VariableListEntryHandler,DocImpl>
-{
- public:
- VariableListIterator(const VariableListHandler &handler) :
- BaseIteratorVia<IDocIterator,IDoc,VariableListEntryHandler,DocImpl>(handler.m_entries) {}
-};
-
-//-----------------------------------------------------------------------------
-
-/*! \brief Node representing a highlighted text fragment.
- *
- */
-// children: ref
-class HighlightHandler : public DocHighlightImpl, public BaseHandler<HighlightHandler>
-{
- friend class HighlightIterator;
- public:
- HighlightHandler(IBaseHandler *parent);
- virtual ~HighlightHandler();
- void startHighlight(const QXmlAttributes& attrib);
- void endHighlight();
- virtual void startRef(const QXmlAttributes&);
- virtual void startSpace(const QXmlAttributes&);
-
- // IDocHighlight
- virtual Kind kind() const { return DocImpl::Highlight; }
- virtual HighlightKind highlightKind() const { return m_hl; }
- virtual IDocIterator *codeElements() const;
-
- private:
- void addTextNode();
-
- IBaseHandler *m_parent;
- HighlightKind m_hl;
- QString m_hlString;
- QList<DocImpl> m_children;
-};
-
-class HighlightIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
-{
- public:
- HighlightIterator(const HighlightHandler &handler) :
- BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
-};
-
-//-----------------------------------------------------------------------------
-
-/*! \brief Node representing a line of code.
- *
- */
-// children: linenumber, highlight, anchor, ref
-class CodeLineHandler : public DocCodeLineImpl, public BaseHandler<CodeLineHandler>
-{
- friend class CodeLineIterator;
- public:
-
- virtual void startCodeLine(const QXmlAttributes&);
- virtual void endCodeLine();
- virtual void startLineNumber(const QXmlAttributes&);
- virtual void endLineNumber();
- virtual void startHighlight(const QXmlAttributes&);
- virtual void startRef(const QXmlAttributes&);
-
- CodeLineHandler(IBaseHandler *parent);
- virtual ~CodeLineHandler();
-
- // IDocCodeLine
- virtual Kind kind() const { return DocImpl::CodeLine; }
- virtual int lineNumber() const { return m_lineNumber; }
- virtual const IString *refId() const { return &m_refId; }
- virtual IDocIterator *codeElements() const;
-
- private:
- void addTextNode();
-
- IBaseHandler *m_parent;
- int m_lineNumber;
- StringImpl m_refId;
- QList<DocImpl> m_children;
-};
-
-class CodeLineIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
-{
- public:
- CodeLineIterator(const CodeLineHandler &handler) :
- BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
-};
-
-//-----------------------------------------------------------------------------
-
-/*! \brief Node representing a program listing
- *
- */
-// children: codeline, linenumber
-class ProgramListingHandler : public DocProgramListingImpl, public BaseHandler<ProgramListingHandler>
-{
- friend class ProgramListingIterator;
- public:
- virtual void startProgramListing(const QXmlAttributes& attrib);
- virtual void endProgramListing();
- virtual void startCodeLine(const QXmlAttributes&);
- virtual void startLineNumber(const QXmlAttributes&);
-
- ProgramListingHandler(IBaseHandler *parent);
- virtual ~ProgramListingHandler();
-
- // IDocProgramListing
- virtual Kind kind() const { return DocImpl::ProgramListing; }
- virtual IDocIterator *codeLines() const;
-
- private:
- IBaseHandler *m_parent;
- QList<CodeLineHandler> m_children;
- bool m_hasLineNumber;
-};
-
-//-----------------------------------------------------------------------------
-
-class ProgramListingIterator : public BaseIteratorVia<IDocIterator,IDoc,CodeLineHandler,DocImpl>
-{
- public:
- ProgramListingIterator(const ProgramListingHandler &handler) :
- BaseIteratorVia<IDocIterator,IDoc,CodeLineHandler,DocImpl>(handler.m_children) {}
-};
-
-//-----------------------------------------------------------------------------
-
-/*! \brief Node representing a formula.
- *
- */
-// children: -
-class FormulaHandler : public DocFormulaImpl, public BaseHandler<FormulaHandler>
-{
- public:
- FormulaHandler(IBaseHandler *parent);
- virtual ~FormulaHandler();
- void startFormula(const QXmlAttributes& attrib);
- void endFormula();
-
- // IDocFormula
- virtual Kind kind() const { return DocImpl::Formula; }
- virtual const IString *id() const { return &m_id; }
- virtual const IString *text() const { return &m_text; }
-
- private:
- IBaseHandler *m_parent;
- StringImpl m_id;
- StringImpl m_text;
-};
-
-//-----------------------------------------------------------------------------
-
-/*! \brief Node representing an image.
- *
- */
-// children: -
-class ImageHandler : public DocImageImpl, public BaseHandler<ImageHandler>
-{
- public:
- ImageHandler(IBaseHandler *parent);
- virtual ~ImageHandler();
- void startImage(const QXmlAttributes& attrib);
- void endImage();
-
- // IDocImage
- virtual Kind kind() const { return DocImpl::Image; }
- virtual const IString *name() const { return &m_name; }
- virtual const IString *caption() const { return &m_caption; }
-
- private:
- IBaseHandler *m_parent;
- StringImpl m_name;
- StringImpl m_caption;
-};
-
-
-//-----------------------------------------------------------------------------
-/*! \brief Node representing an anchor.
- *
- */
-// children: -
-class AnchorHandler : public DocAnchorImpl, public BaseHandler<AnchorHandler>
-{
- public:
- AnchorHandler(IBaseHandler *parent);
- virtual ~AnchorHandler();
- void startAnchor(const QXmlAttributes& attrib);
- void endAnchor();
-
- // IDocAnchor
- virtual Kind kind() const { return DocImpl::Anchor; }
- virtual const IString *id() const { return &m_id; }
-
- private:
- IBaseHandler *m_parent;
- StringImpl m_id;
-};
-
-//-----------------------------------------------------------------------------
-
-/*! \brief Node representing a dot file.
- *
- */
-// children: -
-class DotFileHandler : public DocDotFileImpl, public BaseHandler<DotFileHandler>
-{
- public:
- DotFileHandler(IBaseHandler *parent);
- virtual ~DotFileHandler();
- void startDotFile(const QXmlAttributes& attrib);
- void endDotFile();
-
- // IDocDotFile
- virtual Kind kind() const { return DocImpl::DotFile; }
- virtual const IString *name() const { return &m_name; }
- virtual const IString *caption() const { return &m_caption; }
-
- private:
- IBaseHandler *m_parent;
- StringImpl m_name;
- StringImpl m_caption;
-};
-
-//-----------------------------------------------------------------------------
-
-/*! \brief Node representing an entry in the index.
- *
- */
-// children: -
-class IndexEntryHandler : public DocIndexEntryImpl, public BaseHandler<IndexEntryHandler>
-{
- public:
- IndexEntryHandler(IBaseHandler *parent);
- virtual ~IndexEntryHandler();
- void startIndexEntry(const QXmlAttributes& attrib);
- void endIndexEntry();
- void startPrimaryIE(const QXmlAttributes& attrib);
- void endPrimaryIE();
- void startSecondaryIE(const QXmlAttributes& attrib);
- void endSecondaryIE();
-
- // IDocIndexEntry
- virtual Kind kind() const { return DocImpl::IndexEntry; }
- virtual const IString *primary() const { return &m_primary; }
- virtual const IString *secondary() const { return &m_secondary; }
-
- private:
- IBaseHandler *m_parent;
- StringImpl m_primary;
- StringImpl m_secondary;
-};
-
-//-----------------------------------------------------------------------------
-
-/*! \brief Node representing an entry in the table entry.
- *
- */
-// children: para
-class EntryHandler : public DocEntryImpl, public BaseHandler<EntryHandler>
-{
- friend class EntryIterator;
- public:
- EntryHandler(IBaseHandler *parent);
- virtual ~EntryHandler();
- void startEntry(const QXmlAttributes& attrib);
- void endEntry();
- void startParagraph(const QXmlAttributes& attrib);
-
- // IDocEntry
- virtual Kind kind() const { return DocImpl::Entry; }
- virtual IDocIterator *contents() const;
-
- private:
- IBaseHandler *m_parent;
- QList<DocImpl> m_children;
-};
-
-class EntryIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
-{
- public:
- EntryIterator(const EntryHandler &handler) :
- BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
-};
-
-//-----------------------------------------------------------------------------
-
-/*! \brief Node representing an entry in the table row.
- *
- */
-// children: entry
-class RowHandler : public DocRowImpl, public BaseHandler<RowHandler>
-{
- friend class RowIterator;
- public:
- RowHandler(IBaseHandler *parent);
- virtual ~RowHandler();
- void startRow(const QXmlAttributes& attrib);
- void endRow();
- void startEntry(const QXmlAttributes& attrib);
-
- // IDocRow
- virtual Kind kind() const { return DocImpl::Row; }
- virtual IDocIterator *entries() const;
-
- private:
- IBaseHandler *m_parent;
- QList<EntryHandler> m_children;
-};
-
-class RowIterator : public BaseIteratorVia<IDocIterator,IDoc,EntryHandler,DocImpl>
-{
- public:
- RowIterator(const RowHandler &handler) :
- BaseIteratorVia<IDocIterator,IDoc,EntryHandler,DocImpl>(handler.m_children) {}
-};
-
-//-----------------------------------------------------------------------------
-
-/*! \brief Node representing an entry in the table.
- *
- */
-// children: row, caption
-class TableHandler : public DocTableImpl, public BaseHandler<TableHandler>
-{
- friend class TableIterator;
- public:
- TableHandler(IBaseHandler *parent);
- virtual ~TableHandler();
- void startTable(const QXmlAttributes& attrib);
- void endTable();
- void startRow(const QXmlAttributes& attrib);
- void startCaption(const QXmlAttributes& attrib);
- void endCaption();
-
- // IDocTable
- virtual Kind kind() const { return DocImpl::Table; }
- virtual IDocIterator *rows() const;
- virtual int numColumns() const { return m_numColumns; }
- virtual const IString *caption() const { return &m_caption; }
-
- private:
- IBaseHandler *m_parent;
- QList<RowHandler> m_children;
- int m_numColumns;
- StringImpl m_caption;
-};
-
-class TableIterator : public BaseIteratorVia<IDocIterator,IDoc,RowHandler,DocImpl>
-{
- public:
- TableIterator(const TableHandler &handler) :
- BaseIteratorVia<IDocIterator,IDoc,RowHandler,DocImpl>(handler.m_children) {}
-};
-
-//-----------------------------------------------------------------------------
-
-/*! \brief Node representing a copied piece of documentation.
- *
- */
-class CopyHandler : public DocCopyImpl, public BaseHandler<CopyHandler>
-{
- friend class CopyIterator;
- public:
- CopyHandler(IBaseHandler *parent);
- virtual ~CopyHandler();
- virtual void startCopy(const QXmlAttributes& attrib);
- virtual void endCopy();
- virtual void startParagraph(const QXmlAttributes& attrib);
-
- // IDocCopy
- virtual Kind kind() const { return DocImpl::Copy; }
- virtual IDocIterator *contents() const;
-
- private:
- IBaseHandler *m_parent;
- QList<DocImpl> m_children;
-};
-
-class CopyIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
-{
- public:
- CopyIterator(const CopyHandler &handler) :
- BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
-};
-
-//-----------------------------------------------------------------------------
-
-/*! \brief Node representing an preformatted section
- */
-class VerbatimHandler : public DocVerbatimImpl,
- public BaseHandler<VerbatimHandler>
-{
- public:
- VerbatimHandler(IBaseHandler *parent);
- virtual ~VerbatimHandler();
- void startVerbatim(const QXmlAttributes& attrib,Types type);
- void endVerbatim();
-
- // IDocVerbatim
- virtual Kind kind() const { return DocImpl::Verbatim; }
- virtual const IString *text() const { return &m_text; }
- virtual Types type() const { return m_type; }
-
- private:
- IBaseHandler *m_parent;
- StringImpl m_text;
- Types m_type;
-};
-
-
-//-----------------------------------------------------------------------------
-
-/*! \brief Node representing an special symbol.
- *
- */
-// children: -
-class SymbolHandler : public DocSymbolImpl, public BaseHandler<SymbolHandler>
-{
- public:
- SymbolHandler(IBaseHandler *parent,Types type);
- virtual ~SymbolHandler();
- void startSymbol(const QXmlAttributes& attrib);
- void endSymbol();
-
- // IDocSymbol
- virtual Kind kind() const { return DocImpl::Symbol; }
- virtual Types type() const { return m_type; }
- virtual const IString *typeString() const { return &m_typeString; }
- virtual char letter() const { return m_letter; }
-
- private:
- IBaseHandler *m_parent;
- char m_letter;
- Types m_type;
- StringImpl m_typeString;
-};
-
-
-//-----------------------------------------------------------------------------
-
-/*! \brief Node representing a section.
- *
- */
-// children: title, para, sect(n+1)
-class DocSectionHandler : public DocSectionImpl, public BaseHandler<DocSectionHandler>
-{
- friend class DocSectionParaIterator;
- friend class DocSectionSubIterator;
- public:
- DocSectionHandler(IBaseHandler *parent,int level);
- virtual ~DocSectionHandler();
- virtual void startDocSection(const QXmlAttributes& attrib);
- virtual void endDocSection();
- virtual void startTitle(const QXmlAttributes& attrib);
- virtual void startSubSection(const QXmlAttributes& attrib);
- virtual void startParagraph(const QXmlAttributes& attrib);
- virtual void startInternal(const QXmlAttributes& attrib);
-
- // IDocSection
- virtual Kind kind() const { return DocImpl::Section; }
- virtual const IString *id() const { return &m_id; }
- virtual int level() const { return m_level; }
- virtual IDocTitle *title() const { return m_title; }
- virtual IDocIterator *paragraphs() const;
- virtual IDocIterator *subSections() const;
- virtual IDocInternal *internal() const;
-
- private:
- IBaseHandler *m_parent;
- QList<DocImpl> m_paragraphs;
- QList<DocImpl> m_subsections;
- DocInternalHandler *m_internal;
- StringImpl m_id;
- int m_level;
- TitleHandler *m_title;
-};
-
-class DocSectionParaIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
-{
- public:
- DocSectionParaIterator(const DocSectionHandler &handler) :
- BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_paragraphs) {}
-};
-
-class DocSectionSubIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
-{
- public:
- DocSectionSubIterator(const DocSectionHandler &handler) :
- BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_subsections) {}
-};
-
-//-----------------------------------------------------------------------------
-
-class DocInternalHandler : public DocInternalImpl, public BaseHandler<DocInternalHandler>
-{
- public:
- friend class DocInternalParaIterator;
- friend class DocInternalSubIterator;
- DocInternalHandler(IBaseHandler *parent,int level);
- virtual ~DocInternalHandler();
- virtual void startInternal(const QXmlAttributes& attrib);
- virtual void endInternal();
- virtual void startSubSection(const QXmlAttributes& attrib);
- virtual void startParagraph(const QXmlAttributes& attrib);
-
- // IDocInternal
- virtual Kind kind() const { return DocImpl::Internal; }
- virtual IDocIterator *paragraphs() const;
- virtual IDocIterator *subSections() const;
-
- private:
- IBaseHandler *m_parent;
- QList<DocImpl> m_paragraphs;
- QList<DocImpl> m_subsections;
- int m_level;
-};
-
-class DocInternalParaIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
-{
- public:
- DocInternalParaIterator(const DocInternalHandler &handler) :
- BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_paragraphs) {}
-};
-
-class DocInternalSubIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
-{
- public:
- DocInternalSubIterator(const DocInternalHandler &handler) :
- BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_subsections) {}
-};
-
-
-//-----------------------------------------------------------------------------
-
-/*! \brief Node representing a documentation block.
- *
- */
-// children: para, title, sect1, internal
-class DocHandler : public DocRootImpl, public BaseHandler<DocHandler>
-{
- friend class DocIterator;
- public:
- virtual void startDoc(const QXmlAttributes& attrib);
- virtual void endDoc();
- virtual void startParagraph(const QXmlAttributes& attrib);
- virtual void startSect1(const QXmlAttributes& attrib);
- virtual void startTitle(const QXmlAttributes& attrib);
- virtual void startInternal(const QXmlAttributes& attrib);
-
- DocHandler(IBaseHandler *parent);
- virtual ~DocHandler();
-
- // IDocRoot
- virtual Kind kind() const { return DocImpl::Root; }
- virtual IDocIterator *contents() const;
- virtual IDocInternal *internal() const;
-
- private:
- IBaseHandler *m_parent;
- QList<DocImpl> m_children;
- DocInternalHandler *m_internal;
-};
-
-class DocIterator : public BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>
-{
- public:
- DocIterator(const DocHandler &handler) :
- BaseIteratorVia<IDocIterator,IDoc,DocImpl,DocImpl>(handler.m_children) {}
-};
-
-//-----------------------------------------------------------------------------
-
-void dochandler_init();
-void dochandler_exit();
-
-#endif
diff --git a/addon/doxmlparser/src/doxmlintf.h b/addon/doxmlparser/src/doxmlintf.h
deleted file mode 100644
index 79dc763..0000000
--- a/addon/doxmlparser/src/doxmlintf.h
+++ /dev/null
@@ -1,1101 +0,0 @@
-/******************************************************************************
- *
- * $Id$
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#ifndef _DOXMLINTF_H
-#define _DOXMLINTF_H
-
-/*! \file
- * \brief The interface to the object model provided by the XML parser
- * library.
- *
- * To start using this library one calls createObjectModel() and then
- * uses the returned IDoxygen interface to read doxygen generated
- * XML output and navigate through the information contained in it.
- *
- * @see createObjectModel()
- */
-
-class IMember;
-class IDocIterator;
-class ICompound;
-class ISection;
-class INode;
-class IDocInternal;
-class IDocRoot;
-
-/*! \brief Read only interface to a string.
- */
-class IString
-{
- public:
- /*! Returns a latin1 character representation of the string. */
- virtual const char *latin1() const = 0;
- /*! Returns a 16-bit unicode character representation of the character at
- * position \a index in the string. The first character is at index 0.
- */
- virtual unsigned short unicodeCharAt(int index) const = 0;
- /*! Returns true if this string is empty or false otherwise */
- virtual bool isEmpty() const = 0;
- /*! Returns the number of characters in the string. */
- virtual int length() const = 0;
-};
-
-/*! \brief Base interface for hyperlinked text
- *
- * Depending on the result of kind() the interface is extended by
- * ILT_Text or ILT_Ref.
- */
-class ILinkedText
-{
- public:
- enum Kind { Kind_Text, Kind_Ref };
- virtual Kind kind() const = 0;
-};
-
-/*! \brief Plain text fragment.
- */
-class ILT_Text : public ILinkedText
-{
- public:
- virtual const IString *text() const = 0;
-};
-
-/*! \brief Reference to an object.
- */
-class ILT_Ref : public ILinkedText
-{
- public:
- enum TargetKind { Member, Compound };
- virtual const IString *id() const = 0;
- virtual TargetKind targetKind() const = 0;
- virtual const IString *external() const = 0;
- virtual const IString *text() const = 0;
-};
-
-/*! \brief Iterates over a list of ILinkedText fragments.
- */
-class ILinkedTextIterator
-{
- public:
- virtual ILinkedText *toFirst() = 0;
- virtual ILinkedText *toLast() = 0;
- virtual ILinkedText *toNext() = 0;
- virtual ILinkedText *toPrev() = 0;
- virtual ILinkedText *current() const = 0;
- virtual void release() = 0;
-};
-
-/*! \brief Representation of a parameter of a function. */
-class IParam
-{
- public:
- virtual ILinkedTextIterator *type() const = 0;
- virtual const IString * declarationName() const = 0;
- virtual const IString * definitionName() const = 0;
- virtual const IString * attrib() const = 0;
- virtual const IString * arraySpecifier() const = 0;
- virtual ILinkedTextIterator *defaultValue() const = 0;
- virtual IDocRoot *briefDescription() const = 0;
-};
-
-class IParamIterator
-{
- public:
- virtual IParam *toFirst() = 0;
- virtual IParam *toLast() = 0;
- virtual IParam *toNext() = 0;
- virtual IParam *toPrev() = 0;
- virtual IParam *current() const = 0;
- virtual void release() = 0;
-};
-
-class IMemberReference
-{
- public:
- virtual IMember *member() const = 0;
- virtual const IString * name() const = 0;
- virtual const IString * scope() const = 0;
- virtual const IString * protection() const = 0;
- virtual const IString * virtualness() const = 0;
- virtual const IString * ambiguityScope() const = 0;
-};
-
-class IMemberReferenceIterator
-{
- public:
- virtual IMemberReference *toFirst() = 0;
- virtual IMemberReference *toLast() = 0;
- virtual IMemberReference *toNext() = 0;
- virtual IMemberReference *toPrev() = 0;
- virtual IMemberReference *current() const = 0;
- virtual void release() = 0;
-};
-
-class IDoc
-{
- public:
- enum Kind
- {
- Invalid = 0, // 0
- Para, // 1 -> IDocPara
- Text, // 2 -> IDocText
- MarkupModifier, // 3 -> IDocMarkupModifier
- ItemizedList, // 4 -> IDocItemizedList
- OrderedList, // 5 -> IDocOrderedList
- ListItem, // 6 -> IDocListItem
- ParameterList, // 7 -> IDocParameterList
- Parameter, // 8 -> IDocParameter
- SimpleSect, // 9 -> IDocSimpleSect
- Title, // 10 -> IDocTitle
- Ref, // 11 -> IDocRef
- VariableList, // 12 -> IDocVariableList
- VariableListEntry, // 13 -> IDocVariableListEntry
- HRuler, // 14 -> IDocHRuler
- LineBreak, // 15 -> IDocLineBreak
- ULink, // 16 -> IDocULink
- EMail, // 17 -> IDocEMail
- Link, // 18 -> IDocLink
- ProgramListing, // 19 -> IDocProgramListing
- CodeLine, // 20 -> IDocCodeLine
- Highlight, // 21 -> IDocHighlight
- Formula, // 22 -> IDocFormula
- Image, // 23 -> IDocImage
- DotFile, // 24 -> IDocDotFile
- IndexEntry, // 25 -> IDocIndexEntry
- Table, // 26 -> IDocTable
- Row, // 27 -> IDocRow
- Entry, // 28 -> IDocEntry
- Section, // 29 -> IDocSection
- Verbatim, // 30 -> IDocVerbatim
- Copy, // 31 -> IDocCopy
- TocList, // 32 -> IDocTocList
- TocItem, // 33 -> IDocTocItem
- Anchor, // 34 -> IDocAnchor
- Symbol, // 35 -> IDocSymbol
- Internal, // 36 -> IDocInternal
- Root, // 37 -> IDocRoot
- ParameterItem // 38 -> IDocParameterItem
- };
- virtual Kind kind() const = 0;
-};
-
-class IDocMarkup : public IDoc
-{
- public:
- enum Markup
- {
- Normal = 0x000,
- Bold = 0x001,
- Emphasis = 0x002,
- ComputerOutput = 0x004,
- Subscript = 0x008,
- Superscript = 0x010,
- SmallFont = 0x020,
- Center = 0x040,
- Preformatted = 0x080,
- Heading = 0x100
- };
-};
-
-class IDocPara : public IDoc
-{
- public:
- virtual IDocIterator *contents() const = 0;
-};
-
-class IDocText : public IDocMarkup
-{
- public:
- virtual const IString * text() const = 0;
- virtual int markup() const = 0;
- virtual int headingLevel() const = 0;
-};
-
-class IDocMarkupModifier : public IDoc
-{
- public:
- virtual bool enabled() const = 0;
- virtual int markup() const = 0;
- virtual int headingLevel() const = 0;
-};
-
-class IDocItemizedList : public IDoc
-{
- public:
- virtual IDocIterator *elements() const = 0;
-};
-
-class IDocOrderedList : public IDoc
-{
- public:
- virtual IDocIterator *elements() const = 0;
-};
-
-class IDocListItem : public IDoc
-{
- public:
- virtual IDocIterator *contents() const = 0;
-};
-
-class IDocParameterList : public IDoc
-{
- public:
- enum Types { Param, RetVal, Exception };
- virtual Types sectType() const = 0;
- virtual IDocIterator *params() const = 0;
-};
-
-class IDocParameterItem : public IDoc
-{
- public:
- virtual IDocIterator *paramNames() const = 0;
- virtual IDocPara *description() const = 0;
-};
-
-class IDocParameter : public IDoc
-{
- public:
- virtual const IString * name() const = 0;
-};
-
-class IDocTitle : public IDoc
-{
- public:
- virtual IDocIterator *title() const = 0;
-};
-
-class IDocSimpleSect : public IDoc
-{
- public:
- enum Types { Invalid = 0,
- See, Return, Author, Version,
- Since, Date, Bug, Note,
- Warning, Par, Deprecated, Pre,
- Post, Invar, Remark, Attention,
- Todo, Test, RCS, EnumValues,
- Examples
- };
- virtual Types type() const = 0;
- virtual const IString * typeString() const = 0;
- virtual IDocTitle *title() const = 0;
- virtual IDocPara *description() const = 0;
-};
-
-class IDocRef : public IDoc
-{
- public:
- enum TargetKind { Member, Compound };
- virtual const IString * refId() const = 0;
- virtual TargetKind targetKind() const = 0;
- virtual const IString * external() const = 0;
- virtual const IString * text() const = 0;
-};
-
-class IDocVariableList : public IDoc
-{
- public:
- virtual IDocIterator *entries() const = 0;
-};
-
-class IDocVariableListEntry : public IDoc
-{
- public:
- virtual ILinkedTextIterator * term() const = 0;
- virtual IDocPara *description() const = 0;
-};
-
-class IDocHRuler : public IDoc
-{
-};
-
-class IDocLineBreak : public IDoc
-{
-};
-
-class IDocULink : public IDoc
-{
- public:
- virtual const IString * url() const = 0;
- virtual const IString * text() const = 0;
-};
-
-class IDocEMail : public IDoc
-{
- public:
- virtual const IString * address() const = 0;
-};
-
-class IDocLink : public IDoc
-{
- public:
- virtual const IString * refId() const = 0;
- virtual const IString * text() const = 0;
-};
-
-class IDocProgramListing : public IDoc
-{
- public:
- virtual IDocIterator *codeLines() const = 0;
-};
-
-class IDocCodeLine : public IDoc
-{
- public:
- virtual int lineNumber() const = 0;
- virtual const IString * refId() const = 0;
- virtual IDocIterator *codeElements() const = 0;
-};
-
-class IDocHighlight : public IDoc
-{
- public:
- enum HighlightKind
- { Invalid=0,
- Comment, Keyword,
- KeywordType, KeywordFlow, CharLiteral,
- StringLiteral, Preprocessor
- };
- virtual HighlightKind highlightKind() const = 0;
- virtual IDocIterator *codeElements() const = 0;
-};
-
-class IDocFormula : public IDoc
-{
- public:
- virtual const IString * id() const = 0;
- virtual const IString * text() const = 0;
-};
-
-class IDocImage : public IDoc
-{
- public:
- virtual const IString * name() const = 0;
- virtual const IString * caption() const = 0;
-};
-
-class IDocDotFile : public IDoc
-{
- public:
- virtual const IString * name() const = 0;
- virtual const IString * caption() const = 0;
-};
-
-class IDocIndexEntry : public IDoc
-{
- public:
- virtual const IString * primary() const = 0;
- virtual const IString * secondary() const = 0;
-};
-
-class IDocTable : public IDoc
-{
- public:
- virtual IDocIterator *rows() const = 0;
- virtual int numColumns() const = 0;
- virtual const IString * caption() const = 0;
-};
-
-class IDocRow : public IDoc
-{
- public:
- virtual IDocIterator *entries() const = 0;
-};
-
-class IDocEntry : public IDoc
-{
- public:
- virtual IDocIterator *contents() const = 0;
-};
-
-class IDocSection : public IDoc
-{
- public:
- virtual const IString * id() const = 0;
- virtual int level() const = 0;
- virtual IDocTitle *title() const = 0;
- virtual IDocIterator *paragraphs() const = 0;
- virtual IDocIterator *subSections() const = 0;
- virtual IDocInternal *internal() const = 0;
-};
-
-class IDocInternal : public IDoc
-{
- public:
- virtual IDocIterator *paragraphs() const = 0;
- virtual IDocIterator *subSections() const = 0;
-};
-
-class IDocTocList : public IDoc
-{
- public:
- virtual IDocIterator *elements() const = 0;
-};
-
-class IDocTocItem : public IDoc
-{
- public:
- virtual const IString *id() const = 0;
- virtual const IString *title() const = 0;
-};
-
-class IDocCopy : public IDoc
-{
- public:
- virtual IDocIterator *contents() const = 0;
-};
-
-class IDocVerbatim : public IDoc
-{
- public:
- enum Types { Invalid = 0, HtmlOnly, LatexOnly, Verbatim };
- virtual const IString *text() const = 0;
- virtual Types type() const = 0;
-};
-
-class IDocAnchor : public IDoc
-{
- public:
- virtual const IString *id() const = 0;
-};
-
-class IDocSymbol : public IDoc
-{
- public:
- enum Types
- { Invalid = 0,
- Umlaut, Acute, Grave, Circ, Tilde, Szlig, Cedil, Ring, Nbsp, Copy
- };
- virtual Types type() const = 0;
- virtual const IString * typeString() const = 0;
- virtual char letter() const = 0;
-};
-
-class IDocRoot : public IDoc
-{
- public:
- virtual IDocIterator *contents() const = 0;
- virtual IDocInternal *internal() const = 0;
-};
-
-class IDocIterator
-{
- public:
- virtual IDoc *toFirst() = 0;
- virtual IDoc *toLast() = 0;
- virtual IDoc *toNext() = 0;
- virtual IDoc *toPrev() = 0;
- virtual IDoc *current() const = 0;
- virtual void release() = 0;
-};
-
-class IEdgeLabel
-{
- public:
- virtual const IString * label() const = 0;
-};
-
-class IEdgeLabelIterator
-{
- public:
- virtual IEdgeLabel *toFirst() = 0;
- virtual IEdgeLabel *toLast() = 0;
- virtual IEdgeLabel *toNext() = 0;
- virtual IEdgeLabel *toPrev() = 0;
- virtual IEdgeLabel *current() const = 0;
- virtual void release() = 0;
-};
-
-class IChildNode
-{
- public:
- enum NodeRelation { PublicInheritance, ProtectedInheritance,
- PrivateInheritance, Usage, TemplateInstance
- };
- virtual INode * node() const = 0;
- virtual NodeRelation relation() const = 0;
- virtual const IString * relationString() const = 0;
- virtual IEdgeLabelIterator *edgeLabels() const = 0;
-};
-
-class IChildNodeIterator
-{
- public:
- virtual IChildNode *toFirst() = 0;
- virtual IChildNode *toLast() = 0;
- virtual IChildNode *toNext() = 0;
- virtual IChildNode *toPrev() = 0;
- virtual IChildNode *current() const = 0;
- virtual void release() = 0;
-};
-
-class INode
-{
- public:
- virtual const IString * id() const = 0;
- virtual const IString * label() const = 0;
- virtual const IString * linkId() const = 0;
- virtual IChildNodeIterator *children() const = 0;
-};
-
-class INodeIterator
-{
- public:
- virtual INode *toFirst() = 0;
- virtual INode *toLast() = 0;
- virtual INode *toNext() = 0;
- virtual INode *toPrev() = 0;
- virtual INode *current() const = 0;
- virtual void release() = 0;
-};
-
-class IGraph
-{
- public:
- virtual INodeIterator *nodes() const = 0;
-};
-
-class IMember
-{
- public:
- enum MemberKind { Invalid=0,
- Define, Property, Variable, Typedef, Enum,
- Function, Signal, Prototype, Friend, DCOP, Slot,
- EnumValue
- };
- virtual ICompound *compound() const = 0;
- virtual ISection *section() const = 0;
- virtual MemberKind kind() const = 0;
- virtual const IString * kindString() const = 0;
- virtual const IString * id() const = 0;
- virtual const IString * protection() const = 0;
- virtual const IString * virtualness() const = 0;
- virtual ILinkedTextIterator *type() const = 0;
- virtual const IString * typeString() const = 0;
- virtual const IString * name() const = 0;
- virtual const IString * readAccessor() const = 0;
- virtual const IString * writeAccessor() const = 0;
- virtual const IString * definition() const = 0;
- virtual const IString * argsstring() const = 0;
- virtual bool isConst() const = 0;
- virtual bool isVolatile() const = 0;
- virtual bool isStatic() const = 0;
- virtual bool isExplicit() const = 0;
- virtual bool isInline() const = 0;
- virtual bool isMutable() const = 0;
- virtual bool isReadable() const = 0;
- virtual bool isWritable() const = 0;
- virtual IParamIterator *parameters() const = 0;
- virtual IParamIterator *templateParameters() const = 0;
- virtual ILinkedTextIterator *initializer() const = 0;
- virtual ILinkedTextIterator *exceptions() const = 0;
- virtual IMemberReferenceIterator *references() const = 0;
- virtual IMemberReferenceIterator *referencedBy() const = 0;
- virtual const IString *bodyFile() const = 0;
- virtual int bodyStart() const = 0;
- virtual int bodyEnd() const = 0;
- virtual const IString * definitionFile() const = 0;
- virtual int definitionLine() const = 0;
- virtual IMemberReference *reimplements() const = 0;
- virtual IMemberReferenceIterator *reimplementedBy() const = 0;
- virtual IDocRoot *briefDescription() const = 0;
- virtual IDocRoot *detailedDescription() const = 0;
- virtual IDocRoot *inbodyDescription() const = 0;
-};
-
-class IDefine : public IMember
-{
- public:
-};
-
-class IProperty : public IMember
-{
- public:
-};
-
-class IVariable : public IMember
-{
- public:
-};
-
-class ITypedef : public IMember
-{
- public:
-};
-
-class IFunction : public IMember
-{
- public:
-};
-
-class ISignal : public IMember
-{
- public:
-};
-
-class IPrototype : public IMember
-{
- public:
-};
-
-class IFriend : public IMember
-{
- public:
-};
-
-class IDCOP : public IMember
-{
- public:
-};
-
-class ISlot : public IMember
-{
- public:
-};
-
-class IEnumValue : public IMember
-{
- public:
- virtual const IString * name() const = 0;
-};
-
-/*! \brief Include relation
- */
-class IInclude
-{
- public:
- virtual const IString * name() const = 0;
- virtual const IString * refId() const = 0;
- virtual bool isLocal() const = 0;
-};
-
-class IIncludeIterator
-{
- public:
- virtual IInclude *toFirst() = 0;
- virtual IInclude *toLast() = 0;
- virtual IInclude *toNext() = 0;
- virtual IInclude *toPrev() = 0;
- virtual IInclude *current() const = 0;
- virtual void release() = 0;
-};
-
-class IMemberIterator
-{
- public:
- virtual IMember *toFirst() = 0;
- virtual IMember *toLast() = 0;
- virtual IMember *toNext() = 0;
- virtual IMember *toPrev() = 0;
- virtual IMember *current() const = 0;
- virtual void release() = 0;
-};
-
-class IEnum : public IMember
-{
- public:
- virtual IMemberIterator *enumValues() const = 0;
-};
-
-/*! \brief The interface to a section in the object model.
- *
- * A compound can have a number of sections, where each
- * section contains a set of members with the properties implied by
- * the section kind. The kind() method returns the kind of the section.
- * The members of the section can be accessed via members(). Apart
- * from using kind(), some of the individual properties of the section can
- * also be inspected via isStatic(), isPublic(), isProtected() and
- * isPrivate().
- */
-class ISection
-{
- public:
- /*! Possible section types */
- enum SectionKind
- { Invalid=0,
- UserDefined, //!< A user defined member group
- PubTypes, //!< Public member typedefs
- PubFuncs, //!< Public member functions
- PubAttribs, //!< Public member attributes
- PubSlots, //!< Public Qt Slots
- Signals, //!< Qt Signals
- DCOPFuncs, //!< KDE-DCOP interface functions
- Properties, //!< IDL properties
- Events, //!< C# events
- PubStatFuncs, //!< Public static member functions
- PubStatAttribs, //!< Public static attributes
- ProTypes, //!< Protected member typedefs
- ProFuncs, //!< Protected member functions
- ProAttribs, //!< Protected member attributes
- ProSlots, //!< Protected slots
- ProStatFuncs, //!< Protected static member functions
- ProStatAttribs, //!< Protected static member attributes
- PacTypes, //!< Package member typedefs
- PacFuncs, //!< Package member functions
- PacAttribs, //!< Package member attributes
- PacStatFuncs, //!< Package static member functions
- PacStatAttribs, //!< Package static member attributes
- PriTypes, //!< Private member typedefs
- PriFuncs, //!< Private member functions
- PriAttribs, //!< Private member attributes
- PriSlots, //!< Private Qt slots
- PriStatFuncs, //!< Private static member functions
- PriStatAttribs, //!< Private static member attributes
- Friend, //!< Friends
- Related, //!< Function marked as related
- Defines, //!< Preprocessor defines
- Prototypes, //!< Global function prototypes
- Typedefs, //!< Global typedefs
- Enums, //!< Enumerations
- Functions, //!< Global functions
- Variables //!< Global variables
- };
-
- /*! Returns a string representation of the value returned by kind() */
- virtual const IString * kindString() const = 0;
-
- /*! Returns what kind of section this is */
- virtual SectionKind kind() const = 0;
-
- /*! Returns the description attached to this section (for user defined
- * sections, also known as member groups).
- */
- virtual IDocRoot *description() const = 0;
-
- /*! Returns an iterator for the members of this section */
- virtual IMemberIterator *members() const = 0;
-
- /*! Returns \c true if this section contains statics */
- virtual bool isStatic() const = 0;
-
- /*! Returns \c true if this section belongs to a
- * public section of a class
- */
- virtual bool isPublic() const = 0;
-
- /*! Returns \c true if this section belongs to a
- * private section of a class
- */
- virtual bool isPrivate() const = 0;
-
- /*! Returns \c true if this section belongs to a
- * protected section of a class
- * */
- virtual bool isProtected() const = 0;
-};
-
-class IUserDefined : public ISection
-{
- public:
- virtual const IString * header() const = 0;
-};
-
-class ISectionIterator
-{
- public:
- virtual ISection *toFirst() = 0;
- virtual ISection *toLast() = 0;
- virtual ISection *toNext() = 0;
- virtual ISection *toPrev() = 0;
- virtual ISection *current() const = 0;
- virtual void release() = 0;
-};
-
-/*! \brief The interface to a compound in the object model.
- *
- * A compound has a name which can be obtained via the name() method
- * and a unique id, which is return via the id() method.
- * A compound consists zero or more members which are grouped into sections.
- * The sections() method can be used to access the individual sections.
- * Alternatively, members can be obtained by name or id. There are
- * different types of compounds. The kind() method returns what kind of
- * compound this is. Depending on the return value one can dynamically
- * cast an interface pointer to an more specialised interface that provides
- * additional methods.
- * Example:
- * \code
- * ICompound *comp=...;
- * if (comp->kind()==ICompound::Class)
- * {
- * IClass *cls = dynamic_cast<IClass*>(comp);
- * // use methods of IClass
- * }
- * \endcode
- * The documentation that is provided by a compound is available via
- * the briefDescription() and detailedDescription() methods.
- * To avoid excessive memory usage, release() should be called (once) on each
- * compound interface pointer that is no longer needed.
- */
-class ICompound
-{
- public:
- /*! Represents the kind of compounds recognised by doxygen. */
- enum CompoundKind { Invalid=0,
- Class, Struct, Union, Interface, Protocol, Category,
- Exception, File, Namespace, Group, Page, Example, Dir
- };
-
- /*! Returns the name of this compound */
- virtual const IString * name() const = 0;
-
- /*! Returns the id of this compound. The id is a
- * unique string representing a specific compound object.
- */
- virtual const IString * id() const = 0;
-
- /*! Returns the kind of compound. See #CompoundKind for possible
- * values.
- */
- virtual CompoundKind kind() const = 0;
-
- /*! Returns a string representation of the compound kind.
- * @see kind()
- */
- virtual const IString * kindString() const = 0;
-
- /*! Returns an iterator for the different member sections in this
- * compound.
- */
- virtual ISectionIterator *sections() const = 0;
-
- /*! Returns a tree-structured representation of the brief
- * description that is attached to this compound.
- */
- virtual IDocRoot *briefDescription() const = 0;
-
- /*! Returns a tree-structured representation of the detailed
- * description that is attached to this compound.
- */
- virtual IDocRoot *detailedDescription() const = 0;
-
- /*! Returns an interface to a member given its id.
- * @param id The member id.
- */
- virtual IMember *memberById(const char * id) const = 0;
-
- /*! Returns a list of all members within the compound having a certain
- * name. Member overloading is the reason why there can be more than
- * one member.
- * @param name The name of the member.
- */
- virtual IMemberIterator *memberByName(const char * name) const = 0;
-
- /*! Decreases the reference counter for this compound. If it reaches
- * zero, the memory for the compound will be released.
- */
- virtual void release() = 0;
-};
-
-class ICompoundIterator
-{
- public:
- virtual void toFirst() = 0;
- virtual void toLast() = 0;
- virtual void toNext() = 0;
- virtual void toPrev() = 0;
- virtual ICompound *current() const = 0;
- virtual void release() = 0;
-};
-
-class IRelatedCompound
-{
- public:
- enum Protection { Public, Protected, Private };
- enum Kind { Normal, Virtual };
- virtual ICompound *compound() const = 0;
- virtual Protection protection() const = 0;
- virtual Kind kind() const = 0;
- virtual const IString *name() const = 0;
-
-};
-
-class IRelatedCompoundIterator
-{
- public:
- virtual IRelatedCompound *toFirst() = 0;
- virtual IRelatedCompound *toLast() = 0;
- virtual IRelatedCompound *toNext() = 0;
- virtual IRelatedCompound *toPrev() = 0;
- virtual IRelatedCompound *current() const = 0;
- virtual void release() = 0;
-};
-
-/*! \brief The interface to a class in the object model.
- */
-class IClass : public ICompound
-{
- public:
- virtual IGraph *inheritanceGraph() const = 0;
- virtual IGraph *collaborationGraph() const = 0;
- virtual IRelatedCompoundIterator *baseCompounds() const = 0;
- virtual IRelatedCompoundIterator *derivedCompounds() const = 0;
- virtual ICompoundIterator *nestedCompounds() const = 0;
- virtual IParamIterator *templateParameters() const = 0;
- virtual const IString *locationFile() const = 0;
- virtual int locationLine() const = 0;
- virtual const IString *locationBodyFile() const = 0;
- virtual int locationBodyStartLine() const = 0;
- virtual int locationBodyEndLine() const = 0;
-
- // TODO:
- // class:
- // listOfAllMembers()
- // protection()
- // isAbstract()
-};
-
-/*! \brief The interface to a struct in the object model.
- */
-class IStruct : public ICompound
-{
- public:
- virtual ICompoundIterator *nestedCompounds() const = 0;
- virtual IRelatedCompoundIterator *baseCompounds() const = 0;
- virtual IRelatedCompoundIterator *derivedCompounds() const = 0;
- virtual const IString *locationFile() const = 0;
- virtual int locationLine() const = 0;
- virtual int locationBodyStartLine() const = 0;
- virtual int locationBodyEndLine() const = 0;
-};
-
-/*! \brief The interface to a union in the object model.
- */
-class IUnion : public ICompound
-{
- public:
- virtual ICompoundIterator *nestedCompounds() const = 0;
-};
-
-/*! \brief The interface to a Java/IDL interface in the object model.
- */
-class IInterface : public ICompound
-{
- public:
- virtual IRelatedCompoundIterator *baseCompounds() const = 0;
- virtual IRelatedCompoundIterator *derivedCompounds() const = 0;
-};
-
-
-/*! \brief The interface to a Java/IDL exception in the object model.
- */
-class IException : public ICompound
-{
-};
-
-/*! \brief The interface to a namespace in the object model.
- */
-class INamespace : public ICompound
-{
- public:
- virtual ICompoundIterator *nestedCompounds() const = 0;
-};
-
-/*! \brief The interface to a file in the object model.
- */
-class IFile : public ICompound
-{
- public:
- virtual IGraph *includeDependencyGraph() const = 0;
- virtual IGraph *includedByDependencyGraph() const = 0;
- virtual IDocProgramListing *source() const = 0;
- virtual ICompoundIterator *nestedCompounds() const = 0;
-
- virtual IIncludeIterator *includes() const = 0;
- virtual IIncludeIterator *includedBy() const = 0;
-
- // ICompound *innerNamespaces()
- // ICompoundIterator *innerClasses()
-};
-
-/*! \brief The interface to a group in the object model.
- */
-class IGroup : public ICompound
-{
- public:
- virtual ICompoundIterator *nestedCompounds() const = 0;
- // group:
- // Title()
- // innerFile()
- // innerPage()
-};
-
-/*! \brief The interface to a page in the object model.
- */
-class IPage : public ICompound
-{
- public:
- virtual const IDocTitle *title() const = 0;
-};
-
-/*! Root node of the object model. */
-class IDoxygen
-{
- public:
-
- /*! Returns an iterator that can be used to iterate over the list
- * of compounds found in the project.
- */
- virtual ICompoundIterator *compounds() const = 0;
-
- /*! Returns a compound given its unique \a id. If you have a
- * compound id this function is much more efficient than iterating
- * over the compound list. Returns 0 if the id is not valid.
- */
- virtual ICompound *compoundById(const char * id) const = 0;
-
- /*! Returns a compound given its name (including the scope).
- * Returns 0 if the name is not found in the project.
- */
- virtual ICompound *compoundByName(const char * name) const = 0;
-
- /*! Returns an interface to a compound containing a member given it the
- * member's id. Given the ICompound interface one can use the same id
- * to obtain the IMember interface.
- * @param id The member id.
- */
- virtual ICompound *memberById(const char * id) const = 0;
-
- /*! Returns a list of all compounds containing at least one members
- * with a certain name. Each compound can be asked to return the
- * list of members with that name.
- * @param name The name of the member.
- */
- virtual ICompoundIterator *memberByName(const char * name) const = 0;
-
- /*! Releases the memory for the object hierarchy obtained by
- * createdObjecModelFromXML(). First release all iterators before calling
- * this function.
- */
- virtual void release() = 0;
-
- /*! Sets the debug level.
- * - 0 all debugging messages are disabled (the default).
- * - 1 display important messages only
- * - 2 display any messages.
- */
- virtual void setDebugLevel(int level) = 0;
-
- /*! Reads an XML directory produced by doxygen and builds up a data
- * structure representing the contents of the XML files in the directory.
- */
- virtual bool readXMLDir(const char *xmlDirName) = 0;
-};
-
-/*! Factory method that creates an empty object model for a doxygen generated XML file.
- * Use the readXMLDir() method to build the model from an XML output
- * directory containing doxygen output.
- */
-IDoxygen *createObjectModel();
-
-#endif
diff --git a/addon/doxmlparser/src/doxmlparser.pro.in b/addon/doxmlparser/src/doxmlparser.pro.in
deleted file mode 100644
index 841a46c..0000000
--- a/addon/doxmlparser/src/doxmlparser.pro.in
+++ /dev/null
@@ -1,27 +0,0 @@
-TEMPLATE = lib.t
-CONFIG = console staticlib warn_on $extraopts
-HEADERS = basehandler.h mainhandler.h \
- compoundhandler.h sectionhandler.h \
- memberhandler.h paramhandler.h \
- dochandler.h linkedtexthandler.h \
- debug.h graphhandler.h stringimpl.h \
- loamhandler.h
-SOURCES = mainhandler.cpp \
- compoundhandler.cpp sectionhandler.cpp \
- memberhandler.cpp paramhandler.cpp \
- dochandler.cpp linkedtexthandler.cpp \
- basehandler.cpp debug.cpp graphhandler.cpp \
- loamhandler.cpp
-unix:LIBS += -L../../../lib -lqtools
-win32:INCLUDEPATH += .
-win32-mingw:LIBS += -L../../../lib -lqtools
-win32-msvc:LIBS += qtools.lib shell32.lib
-win32-msvc:TMAKE_LFLAGS += /LIBPATH:....\\..\lib
-win32-borland:LIBS += qtools.lib doxycfg.lib shell32.lib
-win32-borland:TMAKE_LFLAGS += -L..\..\..\lib
-win32:TMAKE_CXXFLAGS += -DQT_NODLL
-DESTDIR = ../lib
-OBJECTS_DIR = ../objects
-TARGET = doxmlparser
-INCLUDEPATH += ../../../qtools ../include
-
diff --git a/addon/doxmlparser/src/graphhandler.cpp b/addon/doxmlparser/src/graphhandler.cpp
deleted file mode 100644
index 7816970..0000000
--- a/addon/doxmlparser/src/graphhandler.cpp
+++ /dev/null
@@ -1,216 +0,0 @@
-#include "graphhandler.h"
-
-class EdgeRelationMapper
-{
- public:
- EdgeRelationMapper()
- {
- m_map.insert("public-inheritance", IChildNode::PublicInheritance);
- m_map.insert("protected-inheritance", IChildNode::ProtectedInheritance);
- m_map.insert("private-inheritance", IChildNode::PrivateInheritance);
- m_map.insert("usage", IChildNode::Usage);
- m_map.insert("template-instance", IChildNode::TemplateInstance);
- }
- IChildNode::NodeRelation stringToNodeRelation(const QString &nrStr)
- {
- return m_map[nrStr];
- }
- private:
- QMap<QString,IChildNode::NodeRelation> m_map;
-};
-
-static EdgeRelationMapper *s_edgeRelationMapper;
-
-void graphhandler_init()
-{
- s_edgeRelationMapper = new EdgeRelationMapper;
-}
-
-void graphhandler_exit()
-{
- delete s_edgeRelationMapper;
-}
-
-//------------------------------------------------------------------------
-
-GraphHandler::GraphHandler(IBaseHandler *parent,const char *endTag)
- : m_parent(parent)
-{
- addEndHandler(endTag,this,&GraphHandler::endGraph);
- addStartHandler("node",this,&GraphHandler::startNode);
- m_nodes.setAutoDelete(TRUE);
- m_nodeDict = new QDict<NodeHandler>(1009);
-}
-
-GraphHandler::~GraphHandler()
-{
- delete m_nodeDict;
-}
-
-void GraphHandler::startGraph(const QXmlAttributes &)
-{
- debug(2,"startGraph\n");
- m_parent->setDelegate(this);
-}
-
-void GraphHandler::endGraph()
-{
- debug(2,"endGraph\n");
- m_parent->setDelegate(0);
-}
-
-void GraphHandler::startNode(const QXmlAttributes &attrib)
-{
- NodeHandler *n = new NodeHandler(this);
- n->startNode(attrib);
- m_nodes.append(n);
- m_nodeDict->insert(attrib.value("id"),n);
-}
-
-INodeIterator *GraphHandler::nodes() const
-{
- return new NodeIterator(*this);
-}
-
-NodeHandler *GraphHandler::getNodeById(const QString &id) const
-{
- return m_nodeDict->find(id);
-}
-
-//------------------------------------------------------------------------
-
-NodeHandler::NodeHandler(GraphHandler *gh)
- : m_parent(gh), m_graph(gh)
-{
- addEndHandler("node",this,&NodeHandler::endNode);
- addStartHandler("link",this,&NodeHandler::startLink);
- addEndHandler("link",this,&NodeHandler::endLink);
- addStartHandler("label",this,&NodeHandler::startLabel);
- addEndHandler("label",this,&NodeHandler::endLabel);
- addStartHandler("childnode",this,&NodeHandler::startChildNode);
- m_children.setAutoDelete(TRUE);
-}
-
-NodeHandler::~NodeHandler()
-{
-}
-
-void NodeHandler::startNode(const QXmlAttributes &attrib)
-{
- debug(2,"startNode\n");
- m_parent->setDelegate(this);
- m_id = attrib.value("id");
-}
-
-void NodeHandler::endNode()
-{
- debug(2,"endNode\n");
- m_parent->setDelegate(0);
-}
-
-void NodeHandler::startLink(const QXmlAttributes &attrib)
-{
- m_link = attrib.value("refid");
-}
-
-void NodeHandler::endLink()
-{
-}
-
-void NodeHandler::startLabel(const QXmlAttributes &/*attrib*/)
-{
- m_curString="";
-}
-
-void NodeHandler::endLabel()
-{
- m_label = m_curString;
-}
-
-void NodeHandler::startChildNode(const QXmlAttributes &attrib)
-{
- ChildNodeHandler *cnh = new ChildNodeHandler(this,m_graph);
- cnh->startChildNode(attrib);
- m_children.append(cnh);
-}
-
-IChildNodeIterator *NodeHandler::children() const
-{
- return new ChildNodeIterator(*this);
-}
-
-//------------------------------------------------------------------------
-
-ChildNodeHandler::ChildNodeHandler(IBaseHandler *parent,GraphHandler *gh)
- : m_parent(parent), m_graph(gh)
-{
- addEndHandler("childnode",this,&ChildNodeHandler::endChildNode);
- addStartHandler("edgelabel",this,&ChildNodeHandler::startEdgeLabel);
- m_edgeLabels.setAutoDelete(TRUE);
-}
-
-ChildNodeHandler::~ChildNodeHandler()
-{
-}
-
-void ChildNodeHandler::startChildNode(const QXmlAttributes &attrib)
-{
- debug(2,"startChildNode\n");
- m_id = attrib.value("refid");
- m_relationString = attrib.value("relation");
- m_relation = s_edgeRelationMapper->stringToNodeRelation(m_relationString);
- m_parent->setDelegate(this);
-}
-
-void ChildNodeHandler::endChildNode()
-{
- debug(2,"endChildNode\n");
- m_parent->setDelegate(0);
-}
-
-
-void ChildNodeHandler::startEdgeLabel(const QXmlAttributes &attrib)
-{
- EdgeLabelHandler *elh = new EdgeLabelHandler(this);
- elh->startEdgeLabel(attrib);
- m_edgeLabels.append(elh);
-}
-
-IEdgeLabelIterator *ChildNodeHandler::edgeLabels() const
-{
- return new EdgeLabelIterator(*this);
-}
-
-INode *ChildNodeHandler::node() const
-{
- return m_graph->getNodeById(m_id);
-}
-
-//-----------------------------------------------------------------------
-
-EdgeLabelHandler::EdgeLabelHandler(IBaseHandler *parent)
- : m_parent(parent)
-{
- addEndHandler("edgelabel",this,&EdgeLabelHandler::endEdgeLabel);
-}
-
-EdgeLabelHandler::~EdgeLabelHandler()
-{
-}
-
-void EdgeLabelHandler::startEdgeLabel(const QXmlAttributes &)
-{
- m_parent->setDelegate(this);
- m_curString="";
-}
-
-void EdgeLabelHandler::endEdgeLabel()
-{
- m_label=m_curString;
- m_parent->setDelegate(0);
-}
-
-
-
-
-
diff --git a/addon/doxmlparser/src/graphhandler.h b/addon/doxmlparser/src/graphhandler.h
deleted file mode 100644
index 24a33d3..0000000
--- a/addon/doxmlparser/src/graphhandler.h
+++ /dev/null
@@ -1,154 +0,0 @@
-/******************************************************************************
- *
- * $Id$
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#ifndef _GRAPHHANDLER_H
-#define _GRAPHHANDLER_H
-
-#include "stringimpl.h"
-#include "doxmlintf.h"
-#include "basehandler.h"
-#include "baseiterator.h"
-
-class NodeHandler;
-class ChildNodeHandler;
-class EdgeLabelHandler;
-
-class GraphHandler : public IGraph, public BaseHandler<GraphHandler>
-{
- friend class NodeIterator;
- public:
- GraphHandler(IBaseHandler *parent,const char *endTag);
- virtual ~GraphHandler();
-
- void startGraph(const QXmlAttributes &attrib);
- void endGraph();
- void startNode(const QXmlAttributes &attrib);
- NodeHandler *getNodeById(const QString &id) const;
-
- // IGraph
- virtual INodeIterator *nodes() const;
-
- private:
- IBaseHandler *m_parent;
- QList<NodeHandler> m_nodes;
- QDict<NodeHandler> *m_nodeDict;
-};
-
-//----------------------------------------------------------------------
-
-class NodeHandler : public INode, public BaseHandler<NodeHandler>
-{
- friend class ChildNodeIterator;
- public:
- NodeHandler(GraphHandler *gh);
- virtual ~NodeHandler();
-
- void startNode(const QXmlAttributes &attrib);
- void endNode();
- void startLabel(const QXmlAttributes &attrib);
- void endLabel();
- void startLink(const QXmlAttributes &attrib);
- void endLink();
- void startChildNode(const QXmlAttributes &attrib);
-
- // INode
- virtual const IString *id() const { return &m_id; }
- virtual const IString *label() const { return &m_label; }
- virtual const IString *linkId() const { return &m_link; }
- virtual IChildNodeIterator *children() const;
-
- private:
- IBaseHandler *m_parent;
- StringImpl m_id;
- StringImpl m_label;
- StringImpl m_link;
- QList<ChildNodeHandler> m_children;
- GraphHandler *m_graph;
-};
-
-class NodeIterator : public BaseIterator<INodeIterator,INode,NodeHandler>
-{
- public:
- NodeIterator(const GraphHandler &handler) :
- BaseIterator<INodeIterator,INode,NodeHandler>(handler.m_nodes) {}
-};
-
-//----------------------------------------------------------------------
-
-class ChildNodeHandler : public IChildNode, public BaseHandler<ChildNodeHandler>
-{
- friend class EdgeLabelIterator;
- public:
- ChildNodeHandler(IBaseHandler *parent,GraphHandler *gh);
- virtual ~ChildNodeHandler();
-
- void startChildNode(const QXmlAttributes &attrib);
- void endChildNode();
- void startEdgeLabel(const QXmlAttributes &attrib);
-
- // IChildNode
- virtual INode *node() const;
- virtual NodeRelation relation() const { return m_relation; }
- virtual const IString * relationString() const { return &m_relationString; }
- virtual IEdgeLabelIterator *edgeLabels() const;
-
- private:
- IBaseHandler *m_parent;
- QString m_id;
- NodeRelation m_relation;
- StringImpl m_relationString;
- QList<EdgeLabelHandler> m_edgeLabels;
- GraphHandler *m_graph;
-};
-
-class ChildNodeIterator : public BaseIterator<IChildNodeIterator,IChildNode,ChildNodeHandler>
-{
- public:
- ChildNodeIterator(const NodeHandler &handler) :
- BaseIterator<IChildNodeIterator,IChildNode,ChildNodeHandler>(handler.m_children) {}
-};
-
-//----------------------------------------------------------------------
-
-class EdgeLabelHandler : public IEdgeLabel, public BaseHandler<EdgeLabelHandler>
-{
- friend class EdgeLabelIterator;
- public:
- EdgeLabelHandler(IBaseHandler *parent);
- virtual ~EdgeLabelHandler();
-
- void startEdgeLabel(const QXmlAttributes &attrib);
- void endEdgeLabel();
-
- // IEdgeLabel
- virtual const IString *label() const { return &m_label; }
-
- private:
- IBaseHandler *m_parent;
- StringImpl m_label;
-};
-
-class EdgeLabelIterator : public BaseIterator<IEdgeLabelIterator,IEdgeLabel,EdgeLabelHandler>
-{
- public:
- EdgeLabelIterator(const ChildNodeHandler &handler) :
- BaseIterator<IEdgeLabelIterator,IEdgeLabel,EdgeLabelHandler>(handler.m_edgeLabels) {}
-};
-
-void graphhandler_init();
-void graphhandler_exit();
-
-#endif
-
diff --git a/addon/doxmlparser/src/linkedtexthandler.cpp b/addon/doxmlparser/src/linkedtexthandler.cpp
deleted file mode 100644
index d27adcc..0000000
--- a/addon/doxmlparser/src/linkedtexthandler.cpp
+++ /dev/null
@@ -1,133 +0,0 @@
-/******************************************************************************
- *
- * $Id$
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-#include "linkedtexthandler.h"
-#include "debug.h"
-#include <doxmlintf.h>
-#include "stringimpl.h"
-
-class LT_Text : public LinkedTextImpl, public ILT_Text
-{
- public:
- LT_Text(const QString &text) : m_text(text) {}
- virtual ~LT_Text() {}
-
- // ILT_Text
- virtual const IString *text() const { return &m_text; }
- virtual Kind kind() const { return LinkedTextImpl::Kind_Text; }
- private:
- StringImpl m_text;
-};
-
-class LT_Ref : public LinkedTextImpl, public ILT_Ref
-{
- public:
- LT_Ref() {}
- virtual ~LT_Ref() {}
- void setRefId(const QString &refId) { m_refId=refId; }
- void setText(const QString &text) { m_text=text; }
- void setExtId(const QString &extId) { m_extId=extId; }
- void setTargetKind(TargetKind k) { m_targetKind=k; }
-
- // ILT_Ref
- virtual const IString *text() const { return &m_text; }
- virtual const IString * id() const { return &m_refId; }
- virtual TargetKind targetKind() const { return m_targetKind; }
- virtual const IString *external() const { return &m_extId; }
- virtual Kind kind() const { return LinkedTextImpl::Kind_Ref; }
-
- private:
- StringImpl m_refId;
- StringImpl m_extId;
- StringImpl m_text;
- TargetKind m_targetKind;
-};
-
-LinkedTextHandler::LinkedTextHandler(IBaseHandler *parent,
- QList<LinkedTextImpl> &children
- )
- : m_parent(parent), m_children(children)
-{
- addStartHandler("ref",this,&LinkedTextHandler::startRef);
- addEndHandler("ref",this,&LinkedTextHandler::endRef);
- m_children.setAutoDelete(TRUE);
- m_ref=0;
-}
-
-LinkedTextHandler::~LinkedTextHandler()
-{
-}
-
-void LinkedTextHandler::start(const char *endTag)
-{
- addEndHandler(endTag,this,&LinkedTextHandler::end);
- m_parent->setDelegate(this);
- m_curString="";
-}
-
-void LinkedTextHandler::end()
-{
- if (!m_curString.isEmpty())
- {
- m_children.append(new LT_Text(m_curString));
- debug(2,"LinkedTextHandler: add text `%s'\n",m_curString.data());
- m_curString="";
- }
- m_parent->setDelegate(0);
-}
-
-void LinkedTextHandler::startRef(const QXmlAttributes& attrib)
-{
- if (!m_curString.isEmpty())
- {
- m_children.append(new LT_Text(m_curString));
- debug(2,"LinkedTextHandler: add text `%s'\n",m_curString.data());
- m_curString="";
- }
- ASSERT(m_ref==0);
- m_ref = new LT_Ref;
- m_ref->setRefId(attrib.value("refid"));
- m_ref->setExtId(attrib.value("external"));
- ASSERT(attrib.value("kindref")=="compound" || attrib.value("kindref")=="member");
- m_ref->setTargetKind(attrib.value("kindref")=="compound" ? ILT_Ref::Compound : ILT_Ref::Member);
-}
-
-void LinkedTextHandler::endRef()
-{
- m_ref->setText(m_curString);
- m_children.append(m_ref);
- debug(2,"LinkedTextHandler: add ref `%s'\n",m_ref->text()->latin1());
- m_ref=0;
-}
-
-QString LinkedTextHandler::toString(const QList<LinkedTextImpl> &list)
-{
- QListIterator<LinkedTextImpl> li(list);
- QString result;
- LinkedTextImpl *lt;
- for (li.toFirst();(lt=li.current());++li)
- {
- switch(lt->kind())
- {
- case ILinkedText::Kind_Text:
- result+=dynamic_cast<ILT_Text*>(lt)->text()->latin1();
- break;
- case ILinkedText::Kind_Ref:
- result+=dynamic_cast<ILT_Ref *>(lt)->text()->latin1();
- break;
- }
- }
- return result;
-}
-
diff --git a/addon/doxmlparser/src/linkedtexthandler.h b/addon/doxmlparser/src/linkedtexthandler.h
deleted file mode 100644
index 01dbf4a..0000000
--- a/addon/doxmlparser/src/linkedtexthandler.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/******************************************************************************
- *
- * $Id$
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-#ifndef LINKEDTEXTHANDLER_H
-#define LINKEDTEXTHANDLER_H
-
-#include "baseiterator.h"
-#include "basehandler.h"
-
-class LT_Ref;
-class LinkedTextImpl : public ILinkedText
-{
- public:
- virtual ~LinkedTextImpl() {}
-};
-
-class LinkedTextHandler : public BaseHandler<LinkedTextHandler>
-{
- public:
- LinkedTextHandler(IBaseHandler *parent,QList<LinkedTextImpl> &children);
- virtual ~LinkedTextHandler();
- virtual void start(const char *endTag);
- virtual void end();
- virtual void startRef(const QXmlAttributes& attrib);
- virtual void endRef();
- static QString toString(const QList<LinkedTextImpl> &list);
-
- // ILinkedText
-
- private:
- IBaseHandler *m_parent;
- QList<LinkedTextImpl> &m_children;
- LT_Ref *m_ref;
-};
-
-class LinkedTextIterator : public BaseIterator<ILinkedTextIterator,ILinkedText,LinkedTextImpl>
-{
- public:
- LinkedTextIterator(const QList<LinkedTextImpl> &list) :
- BaseIterator<ILinkedTextIterator,ILinkedText,LinkedTextImpl>(list) {}
-};
-
-#endif
diff --git a/addon/doxmlparser/src/loamhandler.cpp b/addon/doxmlparser/src/loamhandler.cpp
deleted file mode 100644
index a939b7b..0000000
--- a/addon/doxmlparser/src/loamhandler.cpp
+++ /dev/null
@@ -1,75 +0,0 @@
-#include "loamhandler.h"
-#include "memberhandler.h"
-
-
-ListOfAllMembersHandler::ListOfAllMembersHandler(IBaseHandler *parent) : m_parent(parent)
-{
- m_members.setAutoDelete(TRUE);
-
- addStartHandler("member",this,&ListOfAllMembersHandler::startMember);
- addStartHandler("name",this,&ListOfAllMembersHandler::startName);
- addEndHandler("name",this,&ListOfAllMembersHandler::endName);
- addStartHandler("scope",this,&ListOfAllMembersHandler::startScope);
- addEndHandler("scope",this,&ListOfAllMembersHandler::endScope);
-
- addEndHandler("listofallmembers",this,&ListOfAllMembersHandler::endListOfAllMembers);
-}
-
-void ListOfAllMembersHandler::initialize(MainHandler *mh)
-{
- QListIterator<MemberReference> mli(m_members);
- MemberReference *mr;
- for (;(mr=mli.current());++mli)
- {
- mr->initialize(mh);
- }
-}
-
-void ListOfAllMembersHandler::startMember(const QXmlAttributes& attrib)
-{
- MemberReference *mr = new MemberReference;
- mr->m_memId = attrib.value("refid");
- mr->m_virtualness = attrib.value("virt");
- mr->m_protection = attrib.value("prot");
- mr->m_ambiguityScope = attrib.value("ambiguityscope");
- m_members.append(new MemberReference);
-}
-
-void ListOfAllMembersHandler::startName(const QXmlAttributes&)
-{
- m_curString="";
-}
-
-void ListOfAllMembersHandler::endName()
-{
- ASSERT(m_members.getLast());
- m_members.getLast()->m_name = m_curString;
-}
-
-void ListOfAllMembersHandler::startScope(const QXmlAttributes&)
-{
- m_curString="";
-}
-
-void ListOfAllMembersHandler::endScope()
-{
- ASSERT(m_members.getLast());
- m_members.getLast()->m_scope = m_curString;
-}
-
-void ListOfAllMembersHandler::startListOfAllMembers(const QXmlAttributes& /*attrib*/)
-{
- m_parent->setDelegate(this);
- debug(2,"listofallmembers start\n");
-}
-
-void ListOfAllMembersHandler::endListOfAllMembers()
-{
- m_parent->setDelegate(0);
- debug(2,"listofallmembers end\n");
-}
-
-IMemberReferenceIterator *ListOfAllMembersHandler::members() const
-{
- return new MemberReferenceIterator(m_members);
-}
diff --git a/addon/doxmlparser/src/loamhandler.h b/addon/doxmlparser/src/loamhandler.h
deleted file mode 100644
index 2cff8d4..0000000
--- a/addon/doxmlparser/src/loamhandler.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/******************************************************************************
- *
- * $Id$
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#ifndef _LOAMHANDLER_H
-#define _LOAMHANDLER_H
-
-#include <qstring.h>
-#include <qlist.h>
-#include <doxmlintf.h>
-
-#include "basehandler.h"
-
-class MainHandler;
-class MemberReference;
-
-class ListOfAllMembersHandler : public BaseHandler<ListOfAllMembersHandler>
-{
- public:
- virtual void startMember(const QXmlAttributes& attrib);
- virtual void startName(const QXmlAttributes& attrib);
- virtual void endName();
- virtual void startScope(const QXmlAttributes& attrib);
- virtual void endScope();
- virtual void startListOfAllMembers(const QXmlAttributes& attrib);
- virtual void endListOfAllMembers();
-
- ListOfAllMembersHandler(IBaseHandler *parent);
- virtual ~ListOfAllMembersHandler() {}
-
- void initialize(MainHandler *mh);
-
- virtual IMemberReferenceIterator *members() const;
-
- protected:
- IBaseHandler *m_parent;
- QList<MemberReference> m_members;
-};
-
-#endif
-
diff --git a/addon/doxmlparser/src/mainhandler.cpp b/addon/doxmlparser/src/mainhandler.cpp
deleted file mode 100644
index a0a1b07..0000000
--- a/addon/doxmlparser/src/mainhandler.cpp
+++ /dev/null
@@ -1,299 +0,0 @@
-/******************************************************************************
- *
- * $Id$
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#include <qxml.h>
-#include "mainhandler.h"
-#include "compoundhandler.h"
-#include "sectionhandler.h"
-#include "graphhandler.h"
-#include "dochandler.h"
-#include "memberhandler.h"
-#include "debug.h"
-
-
-class ErrorHandler : public QXmlErrorHandler
-{
- public:
- virtual ~ErrorHandler() {}
- bool warning( const QXmlParseException & )
- {
- return FALSE;
- }
- bool error( const QXmlParseException & )
- {
- return FALSE;
- }
- bool fatalError( const QXmlParseException &exception )
- {
- debug(1,"Fatal error at line %d column %d: %s\n",
- exception.lineNumber(),exception.columnNumber(),
- exception.message().data());
- return FALSE;
- }
- QString errorString() { return ""; }
-
- private:
- QString errorMsg;
-};
-
-//--------------------------------------------------------------------------
-
-class CompoundEntryIterator : public ICompoundIterator,
- public QListIterator<CompoundEntry>
-{
- public:
- CompoundEntryIterator(const MainHandler *m,const QList<CompoundEntry> &list) :
- QListIterator<CompoundEntry>(list), m_mainHandler(m) {}
- virtual ~CompoundEntryIterator() {}
-
- virtual void toFirst()
- {
- QListIterator<CompoundEntry>::toFirst();
- }
- virtual void toLast()
- {
- QListIterator<CompoundEntry>::toLast();
- }
- virtual void toNext()
- {
- QListIterator<CompoundEntry>::operator++();
- }
- virtual void toPrev()
- {
- QListIterator<CompoundEntry>::operator--();
- }
- virtual ICompound *current() const
- {
- CompoundEntry *ch = QListIterator<CompoundEntry>::current();
- return ch ? m_mainHandler->compoundById(ch->id) : 0;
- }
- virtual void release()
- { delete this; }
-
- private:
- const MainHandler *m_mainHandler;
-};
-
-//--------------------------------------------------------------------------
-
-MainHandler::MainHandler() : m_compoundDict(2999), m_compoundNameDict(2999),
- m_memberDict(12251), m_memberNameDict(12251),
- m_compoundsLoaded(1009)
-{
- m_compounds.setAutoDelete(TRUE);
- m_memberNameDict.setAutoDelete(TRUE);
- addStartHandler("doxygenindex");
- addEndHandler("doxygenindex");
- addStartHandler("compound",this,&MainHandler::startCompound);
- addEndHandler("compound");
- addStartHandler("member",this,&MainHandler::startMember);
- addEndHandler("member",this,&MainHandler::endMember);
- addStartHandler("name",this,&MainHandler::startName);
- addEndHandler("name",this,&MainHandler::endName);
- m_curCompound = 0;
- m_insideMember = FALSE;
-}
-
-MainHandler::~MainHandler()
-{
- debug(2,"MainHandler::~MainHandler()\n");
-}
-
-void MainHandler::startCompound(const QXmlAttributes& attrib)
-{
- m_curCompound = new CompoundEntry(257);
- m_curCompound->id = attrib.value("refid");
- m_compounds.append(m_curCompound);
- m_compoundDict.insert(m_curCompound->id,m_curCompound);
-}
-
-void MainHandler::startName(const QXmlAttributes& /*attrib*/)
-{
- m_curString = "";
-}
-
-void MainHandler::endName()
-{
- if (m_insideMember)
- {
- m_curMember->name = m_curString;
- }
- else
- {
- m_curCompound->name = m_curString;
- m_compoundNameDict.insert(m_curString,m_curCompound);
- }
-}
-
-void MainHandler::startMember(const QXmlAttributes& attrib)
-{
- m_insideMember = TRUE;
- m_curMember = new MemberEntry;
- m_curMember->id = attrib.value("refid");
- m_curMember->compound = m_curCompound;
- m_memberDict.insert(m_curMember->id,m_curMember);
-}
-
-void MainHandler::endMember()
-{
- m_curCompound->memberDict.insert(m_curString,m_curMember);
- QList<CompoundEntry> *cel=0;
- if ((cel=m_memberNameDict.find(m_curString))==0)
- {
- cel = new QList<CompoundEntry>;
- m_memberNameDict.insert(m_curString,cel);
- }
- cel->append(m_curCompound);
- m_insideMember = FALSE;
-}
-
-void MainHandler::setDebugLevel(int level)
-{
- ::setDebugLevel(level);
-}
-
-void MainHandler::dump()
-{
- QListIterator<CompoundEntry> cli(m_compounds);
- CompoundEntry *ce;
- for (cli.toFirst();(ce=cli.current());++cli)
- {
- debug(2,"compound id=`%s' name=`%s'\n",ce->id.data(),ce->name.data());
- QDictIterator<MemberEntry> mdi(ce->memberDict);
- MemberEntry *me;
- for (mdi.toFirst();(me=mdi.current());++mdi)
- {
- debug(2," member id=`%s' name=`%s'\n",me->id.data(),me->name.data());
- }
- }
-}
-
-bool MainHandler::readXMLDir(const char * xmlDirName)
-{
- m_xmlDirName = xmlDirName;
- QString xmlFileName=m_xmlDirName+"/index.xml";
- QFile xmlFile(xmlFileName);
- //printf("Trying %s xmlFile.exists()=%d isReadable()=%d\n",
- // xmlFileName.data(),xmlFile.exists(),xmlFile.isReadable());
- if (xmlFile.exists())
- {
- ErrorHandler errorHandler;
- QXmlInputSource source( xmlFile );
- QXmlSimpleReader reader;
- reader.setContentHandler( this );
- reader.setErrorHandler( &errorHandler );
- reader.parse( source );
- dump();
- return TRUE;
- }
- return FALSE;
-}
-
-ICompoundIterator *MainHandler::compounds() const
-{
- return new CompoundEntryIterator(this,m_compounds);
-}
-
-ICompound *MainHandler::compoundById(const char *id) const
-{
- QString ids = id;
- if (ids.isEmpty()) return 0;
- CompoundHandler *ch = m_compoundsLoaded[ids];
- if (ch) // compound already in memory
- {
- ch->addref(); // returning alias -> increase reference counter
- return ch->toICompound();
- }
- CompoundEntry *ce = m_compoundDict.find(ids);
- if (ce==0) return 0; // id not found
- // create and load a new compound
- ch = new CompoundHandler(m_xmlDirName);
- if (!ch->parseXML(id))
- {
- // compound could not be initialized.
- delete ch;
- return 0;
- }
-
- // we disregard the constness here, because the object stays conceptually
- // unchanged.
- MainHandler *that = (MainHandler *)this;
- ch->initialize(that);
- //printf("loading compound %s in memory\n",id);
- that->m_compoundsLoaded.insert(id,ch);
- return ch->toICompound();
-}
-
-void MainHandler::unloadCompound(CompoundHandler *ch)
-{
- //printf("unloading compound %s from memory\n",ch->id()->latin1());
- bool result = m_compoundsLoaded.remove(ch->id()->latin1());
- if (!result) debug(1,"Failed to unload component!\n");
-}
-
-ICompound *MainHandler::compoundByName(const char *name) const
-{
- QString nameStr = name;
- if (nameStr.isEmpty()) return 0;
- CompoundEntry *ce = m_compoundNameDict[name];
- if (ce==0) return 0; // name not found
- return compoundById(ce->id);
-}
-
-ICompound *MainHandler::memberById(const char *id) const
-{
- QString ids = id;
- if (ids.isEmpty()) return 0;
- MemberEntry *me = m_memberDict[id];
- if (me==0) return 0; // id not found
- return compoundById(me->compound->id);
-}
-
-ICompoundIterator *MainHandler::memberByName(const char *name) const
-{
- QString nameStr = name;
- if (nameStr.isEmpty()) return 0;
- QList<CompoundEntry> *cel = m_memberNameDict[name];
- if (cel==0) return 0; // name not found
- return new CompoundEntryIterator(this,*cel);
-}
-
-IDoxygen *createObjectModel()
-{
- compoundhandler_init();
- sectionhandler_init();
- memberhandler_init();
- dochandler_init();
- graphhandler_init();
- return new MainHandler;
-}
-
-void MainHandler::release()
-{
- //printf("MainHandler::release()\n");
- QDictIterator<CompoundHandler> chi(m_compoundsLoaded);
- CompoundHandler *ch;
- for (chi.toFirst();(ch=chi.current());++chi)
- {
- debug(1,"Compound %s not released\n",ch->name()->latin1());
- }
- graphhandler_exit();
- dochandler_exit();
- memberhandler_exit();
- sectionhandler_exit();
- compoundhandler_exit();
- delete this;
-}
-
diff --git a/addon/doxmlparser/src/mainhandler.h b/addon/doxmlparser/src/mainhandler.h
deleted file mode 100644
index a9f68b0..0000000
--- a/addon/doxmlparser/src/mainhandler.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/******************************************************************************
- *
- * $Id$
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#ifndef _MAINHANDLER_H
-#define _MAINHANDLER_H
-
-#include <qlist.h>
-
-#include <doxmlintf.h>
-#include "basehandler.h"
-
-class CompoundHandler;
-struct CompoundEntry;
-
-struct IndexEntry
-{
- QString id;
- QString name;
-};
-
-struct MemberEntry : public IndexEntry
-{
- CompoundEntry *compound;
-};
-
-struct CompoundEntry : public IndexEntry
-{
- CompoundEntry(int size) : memberDict(size)
- { memberDict.setAutoDelete(TRUE); }
- QDict<MemberEntry> memberDict;
-};
-
-class MainHandler : public IDoxygen, public BaseHandler<MainHandler>
-{
- public:
- virtual void startCompound(const QXmlAttributes& attrib);
- virtual void startMember(const QXmlAttributes& attrib);
- virtual void endMember();
- virtual void startName(const QXmlAttributes& attrib);
- virtual void endName();
- MainHandler();
- virtual ~MainHandler();
-
- // IDoxygen
- ICompoundIterator *compounds() const;
- ICompound *compoundById(const char *id) const;
- virtual ICompound *compoundByName(const char *name) const;
- virtual ICompound *memberById(const char *id) const;
- virtual ICompoundIterator *memberByName(const char *name) const;
-
- virtual void release();
- void setDebugLevel(int level);
- bool readXMLDir(const char *dirName);
- void dump();
- void unloadCompound(CompoundHandler *ch);
-
- private:
- CompoundEntry *m_curCompound;
- MemberEntry *m_curMember;
- QList<CompoundEntry> m_compounds;
- QDict<CompoundEntry> m_compoundDict;
- QDict<CompoundEntry> m_compoundNameDict;
- QDict<MemberEntry> m_memberDict;
- QDict<QList<CompoundEntry> > m_memberNameDict;
- QString m_xmlDirName;
- QDict<CompoundHandler> m_compoundsLoaded;
- bool m_insideMember;
-};
-
-#endif
diff --git a/addon/doxmlparser/src/memberhandler.cpp b/addon/doxmlparser/src/memberhandler.cpp
deleted file mode 100644
index 74d1347..0000000
--- a/addon/doxmlparser/src/memberhandler.cpp
+++ /dev/null
@@ -1,600 +0,0 @@
-/******************************************************************************
- *
- * $Id$
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#include "memberhandler.h"
-#include "sectionhandler.h"
-#include "dochandler.h"
-#include "mainhandler.h"
-#include "linkedtexthandler.h"
-#include "paramhandler.h"
-#include "compoundhandler.h"
-#include "debug.h"
-
-//------------------------------------------------------------------------------
-
-class MemberTypeMap
-{
- public:
- MemberTypeMap()
- {
- m_map.setAutoDelete(TRUE);
- m_map.insert("define",new int(IMember::Define));
- m_map.insert("property",new int(IMember::Property));
- m_map.insert("variable",new int(IMember::Variable));
- m_map.insert("typedef",new int(IMember::Typedef));
- m_map.insert("enum",new int(IMember::Enum));
- m_map.insert("function",new int(IMember::Function));
- m_map.insert("signal",new int(IMember::Signal));
- m_map.insert("prototype",new int(IMember::Prototype));
- m_map.insert("friend",new int(IMember::Friend));
- m_map.insert("dcop",new int(IMember::DCOP));
- m_map.insert("slot",new int(IMember::Slot));
- m_map.insert("enumvalue",new int(IMember::EnumValue));
- }
- IMember::MemberKind map(const QString &s)
- {
- int *val = m_map.find(s);
- if (val==0)
- {
- debug(1,"Warning: `%s' is an invalid member type\n",s.data());
- return IMember::Invalid;
- }
- else return (IMember::MemberKind)*val;
- }
- private:
- QDict<int> m_map;
-};
-
-static MemberTypeMap *s_typeMap;
-
-void memberhandler_init()
-{
- s_typeMap = new MemberTypeMap;
-}
-
-void memberhandler_exit()
-{
- delete s_typeMap;
-}
-
-//------------------------------------------------------------------------------
-
-void MemberReference::initialize(MainHandler *mh)
-{
- m_mainHandler = mh;
-}
-
-IMember *MemberReference::member() const
-{
- //return m_mainHandler->memberById(m_memId);
- return 0;
-}
-
-//------------------------------------------------------------------------------
-
-
-#if 0
-EnumValueHandler::EnumValueHandler(IBaseHandler *parent) :
- m_parent(parent), m_brief(0), m_detailed(0), m_linkedTextHandler(0)
-{
- addEndHandler("enumvalue",this,&EnumValueHandler::endEnumValue);
-
- addStartHandler("name",this,&EnumValueHandler::startName);
- addEndHandler("name",this,&EnumValueHandler::endName);
- addStartHandler("initializer",this,&EnumValueHandler::startInitializer);
-
- addStartHandler("briefdescription",this,&EnumValueHandler::startBriefDesc);
-
- addStartHandler("detaileddescription",this,&EnumValueHandler::startDetailedDesc);
-
- m_initializer.setAutoDelete(TRUE);
-}
-
-EnumValueHandler::~EnumValueHandler()
-{
- delete m_brief;
- delete m_detailed;
- delete m_linkedTextHandler;
-}
-
-void EnumValueHandler::startEnumValue(const QXmlAttributes& /*attrib*/)
-{
- m_parent->setDelegate(this);
-}
-
-void EnumValueHandler::endEnumValue()
-{
- m_parent->setDelegate(0);
-}
-
-void EnumValueHandler::startName(const QXmlAttributes& /*attrib*/)
-{
- m_curString="";
-}
-
-void EnumValueHandler::endName()
-{
- m_name = m_curString;
-}
-
-void EnumValueHandler::startInitializer(const QXmlAttributes& /*attrib*/)
-{
- delete m_linkedTextHandler;
- m_linkedTextHandler = new LinkedTextHandler(this,m_initializer);
- m_linkedTextHandler->start("initializer");
-}
-
-void EnumValueHandler::startBriefDesc(const QXmlAttributes& attrib)
-{
- DocHandler *docHandler = new DocHandler(this);
- docHandler->startDoc(attrib);
- m_brief = docHandler;
-}
-
-void EnumValueHandler::startDetailedDesc(const QXmlAttributes& attrib)
-{
- DocHandler *docHandler = new DocHandler(this);
- docHandler->startDoc(attrib);
- m_detailed = docHandler;
-}
-#endif
-
-//------------------------------------------------------------------------------
-
-MemberHandler::MemberHandler(IBaseHandler *parent)
- : m_brief(0), m_detailed(0), m_inbody(0),
- m_compound(0), m_section(0), m_parent(parent)
-{
- //printf("MemberHandler::MemberHandler() %p\n",this);
- addEndHandler("memberdef",this,&MemberHandler::endMember);
-
- addStartHandler("templateparamlist",this,&MemberHandler::startTemplateParamList);
- addEndHandler("templateparamlist",this,&MemberHandler::endTemplateParamList);
-
- addStartHandler("type",this,&MemberHandler::startType);
-
- addStartHandler("definition",this,&MemberHandler::startDefinition);
- addEndHandler("definition",this,&MemberHandler::endDefinition);
-
- addStartHandler("argsstring",this,&MemberHandler::startArgsString);
- addEndHandler("argsstring",this,&MemberHandler::endArgsString);
-
- addStartHandler("name",this,&MemberHandler::startName);
- addEndHandler("name",this,&MemberHandler::endName);
-
- addStartHandler("read",this,&MemberHandler::startRead);
- addEndHandler("read",this,&MemberHandler::endRead);
-
- addStartHandler("write",this,&MemberHandler::startWrite);
- addEndHandler("write",this,&MemberHandler::endWrite);
-
- addStartHandler("reimplements",this,&MemberHandler::startReimplements);
- addEndHandler("reimplements",this,&MemberHandler::endReimplements);
-
- addStartHandler("reimplementedby",this,&MemberHandler::startReimplementedBy);
- addEndHandler("reimplementedby",this,&MemberHandler::endReimplementedBy);
-
- addStartHandler("param",this,&MemberHandler::startParam);
-
- addStartHandler("enumvalue",this,&MemberHandler::startEnumValue2);
- addEndHandler("enumvalue",this,&MemberHandler::endMember);
-
- addStartHandler("initializer",this,&MemberHandler::startInitializer);
- addStartHandler("exceptions",this,&MemberHandler::startException);
-
- addStartHandler("briefdescription",this,&MemberHandler::startBriefDesc);
-
- addStartHandler("detaileddescription",this,&MemberHandler::startDetailedDesc);
-
- addStartHandler("inbodydescription",this,&MemberHandler::startInbodyDesc);
-
- addStartHandler("location",this,&MemberHandler::startLocation);
- addEndHandler("location");
-
- addStartHandler("references",this,&MemberHandler::startReferences);
- addEndHandler("references",this,&MemberHandler::endReferences);
-
- addStartHandler("referencedby",this,&MemberHandler::startReferencedBy);
- addEndHandler("referencedby",this,&MemberHandler::endReferencedBy);
-
- m_type.setAutoDelete(TRUE);
- m_initializer.setAutoDelete(TRUE);
- m_exception.setAutoDelete(TRUE);
- m_params.setAutoDelete(TRUE);
- m_references.setAutoDelete(TRUE);
- m_referencedBy.setAutoDelete(TRUE);
- m_reimplements = 0;
- m_reimplementedBy.setAutoDelete(TRUE);
- m_enumValues.setAutoDelete(TRUE);
- m_linkedTextHandler = 0;
- m_defLine=0;
- m_bodyStart=0;
- m_bodyEnd=0;
- m_insideTemplateParamList=FALSE;
- m_hasTemplateParamList=FALSE;
-}
-
-MemberHandler::~MemberHandler()
-{
- debug(2,"MemberHandler::~MemberHandler() %p\n",this);
- delete m_brief;
- delete m_detailed;
- delete m_inbody;
- delete m_linkedTextHandler;
- delete m_reimplements;
-}
-
-void MemberHandler::startMember(const QXmlAttributes& attrib)
-{
- m_parent->setDelegate(this);
- m_kindString = attrib.value("kind");
- //printf("startMember kindString=`%s'\n",m_kindString.data());
- m_kind = s_typeMap->map(m_kindString);
- m_id = attrib.value("id");
- m_protection = attrib.value("prot");
- m_isStatic = attrib.value("static")=="yes";
- m_isConst = attrib.value("const")=="yes";
- m_isExplicit = attrib.value("explicit")=="yes";
- m_isInline = attrib.value("inline")=="yes";
- m_virtualness = attrib.value("virt");
- m_isVolatile = attrib.value("volatile")=="yes";
- m_isMutable = attrib.value("mutable")=="yes";
- m_isReadable = attrib.value("readable")=="yes";
- m_isWritable = attrib.value("writable")=="yes";
-
- debug(2,"member kind=`%s' id=`%s' prot=`%s' virt=`%s'\n",
- m_kindString.data(),m_id.data(),m_protection.data(),m_virtualness.data());
-}
-
-void MemberHandler::startEnumValue(const QXmlAttributes& attrib)
-{
- m_parent->setDelegate(this);
- m_kindString = "enumvalue";
- //printf("startEnumValue kindString=`%s'\n",m_kindString.data());
- m_kind = s_typeMap->map(m_kindString);
- m_id = attrib.value("id");
- m_protection = attrib.value("prot");
- m_isStatic = FALSE;
- m_isConst = FALSE;
- m_isExplicit = FALSE;
- m_isInline = FALSE;
- m_virtualness = "non-virtual";
- m_isVolatile = FALSE;
- m_isMutable = FALSE;
- m_isReadable = FALSE;
- m_isWritable = FALSE;
- debug(2,"member kind=`%s' id=`%s' prot=`%s' virt=`%s'\n",
- m_kindString.data(),m_id.data(),m_protection.data(),m_virtualness.data());
-}
-
-void MemberHandler::startEnumValue2(const QXmlAttributes& attrib)
-{
- MemberHandler *mh = new MemberHandler(this);
- mh->startEnumValue(attrib);
- m_enumValues.append(mh);
-}
-
-
-void MemberHandler::startBriefDesc(const QXmlAttributes& attrib)
-{
- DocHandler *docHandler = new DocHandler(this);
- docHandler->startDoc(attrib);
- m_brief = docHandler;
-}
-
-void MemberHandler::startDetailedDesc(const QXmlAttributes& attrib)
-{
- DocHandler *docHandler = new DocHandler(this);
- docHandler->startDoc(attrib);
- m_detailed = docHandler;
-}
-
-void MemberHandler::startInbodyDesc(const QXmlAttributes& attrib)
-{
- DocHandler *docHandler = new DocHandler(this);
- docHandler->startDoc(attrib);
- m_inbody = docHandler;
-}
-
-void MemberHandler::startLocation(const QXmlAttributes& attrib)
-{
- m_defFile = attrib.value("file");
- m_bodyFile = attrib.value("bodyfile");
- QCString s;
- s = attrib.value("line");
- if (!s.isEmpty()) m_defLine=s.toInt();
- s = attrib.value("bodystart");
- if (!s.isEmpty()) m_bodyStart=s.toInt();
- s = attrib.value("bodyend");
- if (!s.isEmpty()) m_bodyEnd=s.toInt();
-}
-
-void MemberHandler::startReferences(const QXmlAttributes& attrib)
-{
- MemberReference *mr = new MemberReference;
- mr->m_memId = attrib.value("refid");
- m_references.append(mr);
- m_curString="";
-}
-
-void MemberHandler::endReferences()
-{
- m_references.getLast()->m_name = m_curString;
-}
-
-void MemberHandler::startReferencedBy(const QXmlAttributes& attrib)
-{
- MemberReference *mr = new MemberReference;
- mr->m_memId = attrib.value("refid");
- m_referencedBy.append(mr);
- m_curString="";
-}
-
-void MemberHandler::endReferencedBy()
-{
- m_referencedBy.getLast()->m_name = m_curString;
-}
-
-void MemberHandler::startReimplements(const QXmlAttributes& attrib)
-{
- m_reimplements = new MemberReference;
- m_reimplements->m_memId = attrib.value("refid");
- m_curString="";
-}
-
-void MemberHandler::endReimplements()
-{
- m_reimplements->m_name = m_curString;
-}
-
-void MemberHandler::startReimplementedBy(const QXmlAttributes& attrib)
-{
- MemberReference *mr = new MemberReference;
- mr->m_memId = attrib.value("refid");
- m_reimplementedBy.append(mr);
- m_curString="";
-}
-
-void MemberHandler::endReimplementedBy()
-{
- m_reimplementedBy.getLast()->m_name = m_curString;
-}
-
-void MemberHandler::endMember()
-{
- m_parent->setDelegate(0);
-}
-
-void MemberHandler::startType(const QXmlAttributes &)
-{
- debug(2,"startType!\n");
- delete m_linkedTextHandler;
- m_linkedTextHandler = new LinkedTextHandler(this,m_type);
- m_linkedTextHandler->start("type");
-}
-
-void MemberHandler::startInitializer(const QXmlAttributes &)
-{
- debug(2,"startInitializer!\n");
- delete m_linkedTextHandler;
- m_linkedTextHandler = new LinkedTextHandler(this,m_initializer);
- m_linkedTextHandler->start("initializer");
-}
-
-void MemberHandler::startException(const QXmlAttributes &)
-{
- debug(2,"startException!\n");
- delete m_linkedTextHandler;
- m_linkedTextHandler = new LinkedTextHandler(this,m_exception);
- m_linkedTextHandler->start("exceptions");
-}
-
-void MemberHandler::startName(const QXmlAttributes &)
-{
- m_curString="";
-}
-
-void MemberHandler::endName()
-{
- m_name = m_curString.stripWhiteSpace();
- debug(2,"member name=`%s'\n",m_name.data());
-}
-
-void MemberHandler::startRead(const QXmlAttributes &)
-{
- m_curString="";
-}
-
-void MemberHandler::endRead()
-{
- m_read = m_curString.stripWhiteSpace();
- debug(2,"member read=`%s'\n",m_read.data());
-}
-
-void MemberHandler::startWrite(const QXmlAttributes &)
-{
- m_curString="";
-}
-
-void MemberHandler::endWrite()
-{
- m_write = m_curString.stripWhiteSpace();
- debug(2,"member write=`%s'\n",m_write.data());
-}
-
-void MemberHandler::startDefinition(const QXmlAttributes&)
-{
- m_curString="";
-}
-
-void MemberHandler::endDefinition()
-{
- m_definition = m_curString.stripWhiteSpace();
- debug(2,"definition=%s\n",m_definition.data());
-}
-
-void MemberHandler::startArgsString(const QXmlAttributes&)
-{
- m_curString="";
-}
-
-void MemberHandler::endArgsString()
-{
- m_argsstring = m_curString.stripWhiteSpace();
- debug(2,"arggstring=%s\n",m_argsstring.data());
-}
-
-void MemberHandler::startParam(const QXmlAttributes& attrib)
-{
- ParamHandler *paramHandler = new ParamHandler(this);
- paramHandler->startParam(attrib);
- if (m_insideTemplateParamList)
- {
- m_templateParams.append(paramHandler);
- }
- else
- {
- m_params.append(paramHandler);
- }
-}
-
-void MemberHandler::startTemplateParamList(const QXmlAttributes&)
-{
- m_insideTemplateParamList = TRUE;
- m_hasTemplateParamList = TRUE;
-}
-
-void MemberHandler::endTemplateParamList()
-{
- m_insideTemplateParamList = FALSE;
-}
-
-void MemberHandler::initialize(MainHandler *mh)
-{
- {
- QListIterator<MemberReference> mli(m_references);
- MemberReference *mr;
- for (;(mr=mli.current());++mli)
- {
- mr->initialize(mh);
- }
- }
- {
- QListIterator<MemberReference> mli(m_referencedBy);
- MemberReference *mr;
- for (;(mr=mli.current());++mli)
- {
- mr->initialize(mh);
- }
- }
- {
- QListIterator<MemberReference> mli(m_reimplementedBy);
- MemberReference *mr;
- for (;(mr=mli.current());++mli)
- {
- mr->initialize(mh);
- }
- }
- if (m_reimplements) m_reimplements->initialize(mh);
-}
-
-void MemberHandler::setCompoundHandler(CompoundHandler *c)
-{
- m_compound = c;
-}
-
-ICompound *MemberHandler::compound() const
-{
- m_compound->addref();
- return m_compound->toICompound();
-}
-
-void MemberHandler::setSectionHandler(SectionHandler *c)
-{
- m_section = c;
-}
-
-ISection *MemberHandler::section() const
-{
- return m_section;
-}
-
-IMemberIterator *MemberHandler::enumValues() const
-{
- return new MemberIterator(m_enumValues);
-}
-
-ILinkedTextIterator *MemberHandler::type() const
-{
- return new LinkedTextIterator(m_type);
-}
-
-const IString *MemberHandler::typeString() const
-{
- MemberHandler *that = (MemberHandler *)this;
- that->m_typeString = LinkedTextHandler::toString(m_type);
- return &m_typeString;
-}
-
-IParamIterator *MemberHandler::parameters() const
-{
- return new ParamIterator(m_params);
-}
-
-IParamIterator *MemberHandler::templateParameters() const
-{
- return m_hasTemplateParamList ? new ParamIterator(m_templateParams) : 0;
-}
-
-IMemberReferenceIterator *MemberHandler::references() const
-{
- return new MemberReferenceIterator(m_references);
-}
-
-IMemberReferenceIterator *MemberHandler::referencedBy() const
-{
- return new MemberReferenceIterator(m_referencedBy);
-}
-
-ILinkedTextIterator *MemberHandler::initializer() const
-{
- return new LinkedTextIterator(m_initializer);
-}
-
-ILinkedTextIterator *MemberHandler::exceptions() const
-{
- return new LinkedTextIterator(m_exception);
-}
-
-IMemberReferenceIterator *MemberHandler::reimplementedBy() const
-{
- return new MemberReferenceIterator(m_reimplementedBy);
-}
-
-IDocRoot *MemberHandler::briefDescription() const
-{
- return m_brief;
-}
-
-IDocRoot *MemberHandler::detailedDescription() const
-{
- return m_detailed;
-}
-
-IDocRoot *MemberHandler::inbodyDescription() const
-{
- return m_inbody;
-}
-
diff --git a/addon/doxmlparser/src/memberhandler.h b/addon/doxmlparser/src/memberhandler.h
deleted file mode 100644
index 19eacbd..0000000
--- a/addon/doxmlparser/src/memberhandler.h
+++ /dev/null
@@ -1,252 +0,0 @@
-/******************************************************************************
- *
- * $Id$
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#ifndef _MEMBERHANDLER_H
-#define _MEMBERHANDLER_H
-
-#include <qstring.h>
-#include <qlist.h>
-#include <qxml.h>
-#include <doxmlintf.h>
-
-#include "basehandler.h"
-#include "baseiterator.h"
-#include "stringimpl.h"
-
-class MainHandler;
-class CompoundHandler;
-class SectionHandler;
-class ParamHandler;
-class LinkedTextImpl;
-class LinkedTextHandler;
-class DocHandler;
-
-class MemberReference : public IMemberReference
-{
- public:
- virtual ~MemberReference() {}
- virtual IMember *member() const;
- virtual const IString *name() const { return &m_name; }
- virtual const IString *scope() const { return &m_scope; }
- virtual const IString *protection() const { return &m_protection; }
- virtual const IString *virtualness() const { return &m_virtualness; }
- virtual const IString *ambiguityScope() const { return &m_ambiguityScope; }
- void initialize(MainHandler *m);
-
- QString m_memId;
- StringImpl m_name;
- StringImpl m_scope;
- StringImpl m_virtualness;
- StringImpl m_protection;
- StringImpl m_ambiguityScope;
- MainHandler *m_mainHandler;
-};
-
-class MemberReferenceIterator : public BaseIterator<IMemberReferenceIterator,IMemberReference,MemberReference>
-{
- public:
- MemberReferenceIterator(const QList<MemberReference> &list) :
- BaseIterator<IMemberReferenceIterator,IMemberReference,MemberReference>(list) {}
-};
-
-class MemberHandler : public IDefine,
- public IProperty,
- public IVariable,
- public ITypedef,
- public IFunction,
- public ISignal,
- public IPrototype,
- public IFriend,
- public IDCOP,
- public ISlot,
- public IEnum,
- public IEnumValue,
- public BaseHandler<MemberHandler>
-{
- public:
- virtual void startMember(const QXmlAttributes& attrib);
- virtual void endMember();
- virtual void startParam(const QXmlAttributes& attrib);
- virtual void startType(const QXmlAttributes& attrib);
- virtual void startName(const QXmlAttributes& attrib);
- virtual void endName();
- virtual void startRead(const QXmlAttributes& attrib);
- virtual void endRead();
- virtual void startWrite(const QXmlAttributes& attrib);
- virtual void endWrite();
- virtual void startDefinition(const QXmlAttributes& attrib);
- virtual void endDefinition();
- virtual void startArgsString(const QXmlAttributes& attrib);
- virtual void endArgsString();
- virtual void startBriefDesc(const QXmlAttributes& attrib);
- virtual void startDetailedDesc(const QXmlAttributes& attrib);
- virtual void startInbodyDesc(const QXmlAttributes& attrib);
- virtual void startLocation(const QXmlAttributes& attrib);
- virtual void startReferences(const QXmlAttributes& attrib);
- virtual void endReferences();
- virtual void startReferencedBy(const QXmlAttributes& attrib);
- virtual void endReferencedBy();
- virtual void startReimplements(const QXmlAttributes& attrib);
- virtual void endReimplements();
- virtual void startReimplementedBy(const QXmlAttributes& attrib);
- virtual void endReimplementedBy();
- virtual void startInitializer(const QXmlAttributes& attrib);
- virtual void startException(const QXmlAttributes& attrib);
- virtual void startEnumValue(const QXmlAttributes& attrib);
- virtual void startEnumValue2(const QXmlAttributes& attrib);
- virtual void startTemplateParamList(const QXmlAttributes &attrib);
- virtual void endTemplateParamList();
-
- MemberHandler(IBaseHandler *parent);
- virtual ~MemberHandler();
-
- // IMember implementation
- virtual ICompound *compound() const;
- virtual ISection *section() const;
- virtual MemberKind kind() const
- { return m_kind; }
- virtual const IString *kindString() const
- { return &m_kindString; }
- virtual const IString *id() const
- { return &m_id; }
- virtual const IString *protection() const
- { return &m_protection; }
- virtual const IString *virtualness() const
- { return &m_virtualness; }
- virtual const IString *name() const
- { return &m_name; }
- virtual const IString *readAccessor() const
- { return &m_read; }
- virtual const IString *writeAccessor() const
- { return &m_write; }
- virtual const IString *definition() const
- { return &m_definition; }
- virtual const IString *argsstring() const
- { return &m_argsstring; }
- virtual bool isConst() const
- { return m_isConst; }
- virtual bool isVolatile() const
- { return m_isVolatile; }
- virtual bool isStatic() const
- { return m_isStatic; }
- virtual bool isExplicit() const
- { return m_isExplicit; }
- virtual bool isInline() const
- { return m_isInline; }
- virtual bool isMutable() const
- { return m_isMutable; }
- virtual bool isReadable() const
- { return m_isReadable; }
- virtual bool isWritable() const
- { return m_isWritable; }
- virtual ILinkedTextIterator *type() const;
- virtual const IString *typeString() const;
- virtual IParamIterator *parameters() const;
- virtual IParamIterator *templateParameters() const;
- virtual IMemberReferenceIterator *references() const;
- virtual IMemberReferenceIterator *referencedBy() const;
- virtual ILinkedTextIterator *initializer() const;
- virtual ILinkedTextIterator *exceptions() const;
- virtual const IString *bodyFile() const
- { return &m_bodyFile; }
- virtual int bodyStart() const
- { return m_bodyStart; }
- virtual int bodyEnd() const
- { return m_bodyEnd; }
- virtual const IString *definitionFile() const
- { return &m_defFile; }
- virtual int definitionLine() const
- { return m_defLine; }
- virtual IMemberReference *reimplements() const
- { return m_reimplements; }
- virtual IMemberReferenceIterator *reimplementedBy() const;
- virtual IDocRoot *briefDescription() const;
- virtual IDocRoot *detailedDescription() const;
- virtual IDocRoot *inbodyDescription() const;
-
- // IEnum
- virtual IMemberIterator *enumValues() const;
-
- void initialize(MainHandler *m);
- void setCompoundHandler(CompoundHandler *c);
- void setSectionHandler(SectionHandler *s);
-
- private:
- // XML elements:
- // -----------------
- QList<ParamHandler> m_templateParams; // templateparamlist
- QList<LinkedTextImpl> m_type; // type
- StringImpl m_definition; // definition
- StringImpl m_argsstring; // argsstring
- StringImpl m_name; // name
- StringImpl m_read; // read
- StringImpl m_write; // write
- MemberReference *m_reimplements; // reimplements
- QList<MemberReference> m_reimplementedBy; // reimplementedby
- QList<ParamHandler> m_params; // param
- QList<MemberHandler> m_enumValues; // enumvalue
- QList<LinkedTextImpl> m_initializer; // initializer
- QList<LinkedTextImpl> m_exception; // exceptions
- DocHandler *m_brief; // briefdescription
- DocHandler *m_detailed; // detaileddescription
- DocHandler *m_inbody; // inbodydescription
- // location
- StringImpl m_defFile; // - file
- int m_defLine; // - line
- StringImpl m_bodyFile; // - bodyfile
- int m_bodyStart; // - bodystart
- int m_bodyEnd; // - bodyend
- QList<MemberReference> m_references; // references
- QList<MemberReference> m_referencedBy; // referencedby
-
- // XML attributes:
- // ---------------
- MemberKind m_kind; // kind
- StringImpl m_kindString; // kind as a string
- StringImpl m_id; // id
- StringImpl m_protection; // prot
- bool m_isStatic; // static
- bool m_isConst; // const
- bool m_isExplicit; // explicit
- bool m_isInline; // inline
- StringImpl m_virtualness; // virt
- bool m_isVolatile; // volatile
- bool m_isMutable; // mutable
- bool m_isReadable; // readable
- bool m_isWritable; // writable
-
- CompoundHandler *m_compound;
- SectionHandler *m_section;
- StringImpl m_typeString;
- LinkedTextHandler *m_linkedTextHandler;
- bool m_insideTemplateParamList;
- bool m_hasTemplateParamList;
- IBaseHandler *m_parent;
-};
-
-class MemberIterator : public BaseIteratorVia<IMemberIterator,
- IMember,
- MemberHandler,
- IFunction>
-{
- public:
- MemberIterator(const QList<MemberHandler> &list) :
- BaseIteratorVia<IMemberIterator,IMember,MemberHandler,IFunction>(list) {}
-};
-
-void memberhandler_init();
-void memberhandler_exit();
-
-#endif
diff --git a/addon/doxmlparser/src/paramhandler.cpp b/addon/doxmlparser/src/paramhandler.cpp
deleted file mode 100644
index 0084c80..0000000
--- a/addon/doxmlparser/src/paramhandler.cpp
+++ /dev/null
@@ -1,158 +0,0 @@
-/******************************************************************************
- *
- * $Id$
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#include "paramhandler.h"
-#include "memberhandler.h"
-#include "linkedtexthandler.h"
-#include "debug.h"
-#include "dochandler.h"
-
-TemplateParamListHandler::TemplateParamListHandler(IBaseHandler *parent) : m_parent(parent)
-{
- addStartHandler("param",this,&TemplateParamListHandler::startParam);
-
- addEndHandler("templateparamlist",this,&TemplateParamListHandler::endTemplateParamList);
-}
-
-void TemplateParamListHandler::startParam(const QXmlAttributes& attrib)
-{
- ParamHandler *ph = new ParamHandler(this);
- ph->startParam(attrib);
- m_templateParams.append(ph);
-}
-
-void TemplateParamListHandler::endParam()
-{
-}
-
-void TemplateParamListHandler::startTemplateParamList(const QXmlAttributes& /*attrib*/)
-{
- m_parent->setDelegate(this);
- debug(2,"templateparamlist\n");
-}
-
-void TemplateParamListHandler::endTemplateParamList()
-{
- m_parent->setDelegate(0);
-}
-
-///////////////////////////////////////////////////////////////////////////////////////////////////////
-
-ParamHandler::ParamHandler(IBaseHandler *parent) : m_brief(0), m_parent(parent)
-{
- addEndHandler("param",this,&ParamHandler::endParam);
-
- addStartHandler("type",this,&ParamHandler::startType);
-
- addStartHandler("declname");
- addEndHandler("declname",this,&ParamHandler::endDeclName);
-
- addStartHandler("defname");
- addEndHandler("defname",this,&ParamHandler::endDefName);
-
- addStartHandler("array");
- addEndHandler("array",this,&ParamHandler::endArray);
-
- addStartHandler("attribute");
- addEndHandler("attribute",this,&ParamHandler::endAttrib);
-
- addStartHandler("briefdescription",this,&ParamHandler::startBriefDesc);
-
- addStartHandler("defval",this,&ParamHandler::startDefVal);
-
- m_linkedTextHandler = 0;
-}
-
-ParamHandler::~ParamHandler()
-{
- delete m_brief;
- delete m_linkedTextHandler;
-}
-
-void ParamHandler::startParam(const QXmlAttributes& /*attrib*/)
-{
- m_parent->setDelegate(this);
- debug(2,"param\n");
-}
-
-void ParamHandler::endParam()
-{
- m_parent->setDelegate(0);
-}
-
-void ParamHandler::startType(const QXmlAttributes& /*attrib*/)
-{
- delete m_linkedTextHandler;
- m_linkedTextHandler = new LinkedTextHandler(this,m_type);
- m_linkedTextHandler->start("type");
- debug(2,"param type\n");
-}
-
-void ParamHandler::endDeclName()
-{
- m_declName = m_curString.stripWhiteSpace();
- debug(2,"member declName=`%s'\n",m_declName.data());
-}
-
-void ParamHandler::endDefName()
-{
- m_defName = m_curString.stripWhiteSpace();
- debug(2,"member defName=`%s'\n",m_defName.data());
-}
-
-void ParamHandler::endAttrib()
-{
- m_attrib = m_curString.stripWhiteSpace();
- debug(2,"member attrib=`%s'\n",m_attrib.data());
-}
-
-void ParamHandler::endArray()
-{
- m_array = m_curString.stripWhiteSpace();
- debug(2,"member array=`%s'\n",m_array.data());
-}
-
-void ParamHandler::startDefVal(const QXmlAttributes& /*attrib*/)
-{
- delete m_linkedTextHandler;
- m_linkedTextHandler = new LinkedTextHandler(this,m_defVal);
- m_linkedTextHandler->start("defval");
- debug(2,"member defVal\n");
-}
-
-void ParamHandler::startBriefDesc(const QXmlAttributes& attrib)
-{
- DocHandler *docHandler = new DocHandler(this);
- docHandler->startDoc(attrib);
- m_brief = docHandler;
-}
-
-ILinkedTextIterator *ParamHandler::type() const
-{
- return new LinkedTextIterator(m_type);
-}
-
-ILinkedTextIterator *ParamHandler::defaultValue() const
-{
- return new LinkedTextIterator(m_defVal);
-}
-
-IDocRoot *ParamHandler::briefDescription() const
-{
- return m_brief;
-}
-
-
-
diff --git a/addon/doxmlparser/src/paramhandler.h b/addon/doxmlparser/src/paramhandler.h
deleted file mode 100644
index d1194ac..0000000
--- a/addon/doxmlparser/src/paramhandler.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/******************************************************************************
- *
- * $Id$
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#ifndef _PARAMHANDLER_H
-#define _PARAMHANDLER_H
-
-#include <qstring.h>
-#include <qlist.h>
-#include <qxml.h>
-#include <doxmlintf.h>
-
-#include "stringimpl.h"
-#include "basehandler.h"
-#include "baseiterator.h"
-
-class LinkedTextImpl;
-class LinkedTextHandler;
-class DocHandler;
-
-
-class ParamHandler : public IParam, public BaseHandler<ParamHandler>
-{
- public:
- virtual void startParam(const QXmlAttributes& attrib);
- virtual void endParam();
- virtual void startType(const QXmlAttributes& attrib);
- virtual void endDeclName();
- virtual void endDefName();
- virtual void endAttrib();
- virtual void endArray();
- virtual void startDefVal(const QXmlAttributes& attrib);
- virtual void startBriefDesc(const QXmlAttributes& attrib);
-
- ParamHandler(IBaseHandler *parent);
- virtual ~ParamHandler();
-
- // IParam
- virtual ILinkedTextIterator *type() const;
- virtual const IString * declarationName() const { return &m_declName; }
- virtual const IString * definitionName() const { return &m_defName; }
- virtual const IString * attrib() const { return &m_attrib; }
- virtual const IString * arraySpecifier() const { return &m_array; }
- virtual ILinkedTextIterator *defaultValue() const;
- virtual IDocRoot *briefDescription() const;
-
- private:
-
- // XML elements:
- // -------------
- QList<LinkedTextImpl> m_type; // type
- StringImpl m_declName; // declname
- StringImpl m_defName; // defname
- StringImpl m_array; // array
- QList<LinkedTextImpl> m_defVal; // defval
- DocHandler *m_brief; // briefdescription
-
- StringImpl m_attrib; // TODO: not yet in XML output
-
- IBaseHandler *m_parent;
- LinkedTextHandler *m_linkedTextHandler;
-};
-
-class ParamIterator : public BaseIterator<IParamIterator,IParam,ParamHandler>
-{
- public:
- ParamIterator(const QList<ParamHandler> &list) :
- BaseIterator<IParamIterator,IParam,ParamHandler>(list) {}
-};
-
-class TemplateParamListHandler : public BaseHandler<TemplateParamListHandler>
-{
- public:
-
- virtual void startParam(const QXmlAttributes& attrib);
- virtual void endParam();
-
- virtual void startTemplateParamList(const QXmlAttributes& attrib);
- virtual void endTemplateParamList();
-
- TemplateParamListHandler(IBaseHandler *parent);
- virtual ~TemplateParamListHandler() {}
-
- ParamIterator* templateParams() { return new ParamIterator(m_templateParams); }
-
- protected:
- IBaseHandler *m_parent;
- QList<ParamHandler> m_templateParams;
-};
-
-
-#endif
diff --git a/addon/doxmlparser/src/sectionhandler.cpp b/addon/doxmlparser/src/sectionhandler.cpp
deleted file mode 100644
index 973d990..0000000
--- a/addon/doxmlparser/src/sectionhandler.cpp
+++ /dev/null
@@ -1,168 +0,0 @@
-/******************************************************************************
- *
- * $Id$
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#include "mainhandler.h"
-#include "compoundhandler.h"
-#include "sectionhandler.h"
-#include "memberhandler.h"
-#include "dochandler.h"
-#include "debug.h"
-
-class SectionTypeMap
-{
- public:
- SectionTypeMap() : m_map(37)
- {
- m_map.setAutoDelete(TRUE);
- m_map.insert("user-defined",new int(ISection::UserDefined));
- m_map.insert("public-type",new int(ISection::PubTypes));
- m_map.insert("public-func",new int(ISection::PubFuncs));
- m_map.insert("public-attrib",new int(ISection::PubAttribs));
- m_map.insert("public-slot",new int(ISection::PubSlots));
- m_map.insert("signal",new int(ISection::Signals));
- m_map.insert("dcop-func",new int(ISection::DCOPFuncs));
- m_map.insert("property",new int(ISection::Properties));
- m_map.insert("event",new int(ISection::Events));
- m_map.insert("public-static-func",new int(ISection::PubStatFuncs));
- m_map.insert("public-static-attrib",new int(ISection::PubStatAttribs));
- m_map.insert("protected-type",new int(ISection::ProTypes));
- m_map.insert("protected-func",new int(ISection::ProFuncs));
- m_map.insert("protected-attrib",new int(ISection::ProAttribs));
- m_map.insert("protected-slot",new int(ISection::ProSlots));
- m_map.insert("protected-static-func",new int(ISection::ProStatFuncs));
- m_map.insert("protected-static-attrib",new int(ISection::ProStatAttribs));
- m_map.insert("package-type",new int(ISection::PacTypes));
- m_map.insert("package-func",new int(ISection::PacFuncs));
- m_map.insert("package-attrib",new int(ISection::PacAttribs));
- m_map.insert("package-static-func",new int(ISection::PacStatFuncs));
- m_map.insert("package-static-attrib",new int(ISection::PacStatAttribs));
- m_map.insert("private-type",new int(ISection::PriTypes));
- m_map.insert("private-func",new int(ISection::PriFuncs));
- m_map.insert("private-attrib",new int(ISection::PriAttribs));
- m_map.insert("private-slot",new int(ISection::PriSlots));
- m_map.insert("private-static-func",new int(ISection::PriStatFuncs));
- m_map.insert("private-static-attrib",new int(ISection::PriStatAttribs));
- m_map.insert("friend",new int(ISection::Friend));
- m_map.insert("related",new int(ISection::Related));
- m_map.insert("define",new int(ISection::Defines));
- m_map.insert("prototype",new int(ISection::Prototypes));
- m_map.insert("typedef",new int(ISection::Typedefs));
- m_map.insert("enum",new int(ISection::Enums));
- m_map.insert("func",new int(ISection::Functions));
- m_map.insert("var",new int(ISection::Variables));
- }
- ISection::SectionKind map(const QString &s)
- {
- int *val = m_map.find(s);
- if (val==0)
- {
- debug(1,"Warning: `%s' is an invalid section type\n",s.data());
- return ISection::Invalid;
- }
- else return (ISection::SectionKind)*val;
- }
- private:
- QDict<int> m_map;
-};
-
-static SectionTypeMap *s_typeMap;
-
-void sectionhandler_init()
-{
- s_typeMap = new SectionTypeMap;
-}
-
-void sectionhandler_exit()
-{
- delete s_typeMap;
-}
-
-SectionHandler::SectionHandler(IBaseHandler *parent) : m_parent(parent)
-{
- //printf("SectionHandler::SectionHandler()\n");
- m_members.setAutoDelete(TRUE);
- addEndHandler("sectiondef",this,&SectionHandler::endSection);
- addStartHandler("memberdef",this,&SectionHandler::startMember);
- addStartHandler("header",this,&SectionHandler::startHeader);
- addEndHandler("header",this,&SectionHandler::endHeader);
- addStartHandler("description",this,&SectionHandler::startDescription);
-}
-
-SectionHandler::~SectionHandler()
-{
- debug(2,"SectionHandler::~SectionHandler()\n");
-}
-
-void SectionHandler::startSection(const QXmlAttributes& attrib)
-{
- m_parent->setDelegate(this);
- m_kindString = attrib.value("kind");
- m_kind = s_typeMap->map(m_kindString);
- debug(2,"section kind=`%s'\n",m_kindString.data());
-}
-
-void SectionHandler::startDescription(const QXmlAttributes& attrib)
-{
- DocHandler *docHandler = new DocHandler(this);
- docHandler->startDoc(attrib);
- m_description = docHandler;
-}
-
-void SectionHandler::endSection()
-{
- m_parent->setDelegate(0);
-}
-
-void SectionHandler::startMember(const QXmlAttributes& attrib)
-{
- MemberHandler *memHandler = new MemberHandler(this);
- memHandler->startMember(attrib);
- m_members.append(memHandler);
-}
-
-void SectionHandler::startHeader(const QXmlAttributes&)
-{
- m_header="";
- m_curString="";
-}
-
-void SectionHandler::endHeader()
-{
- m_header = m_curString.stripWhiteSpace();
- debug(2,"member header=`%s'\n",m_header.data());
-}
-
-void SectionHandler::initialize(CompoundHandler *ch)
-{
- QListIterator<MemberHandler> mli(m_members);
- MemberHandler *mh;
- for (;(mh=mli.current());++mli)
- {
- mh->setCompoundHandler(ch);
- ch->insertMember(mh);
- mh->setSectionHandler(this);
- }
-}
-
-IDocRoot *SectionHandler::description() const
-{
- return m_description;
-}
-
-IMemberIterator *SectionHandler::members() const
-{
- return new MemberIterator(m_members);
-}
-
diff --git a/addon/doxmlparser/src/sectionhandler.h b/addon/doxmlparser/src/sectionhandler.h
deleted file mode 100644
index 46a072f..0000000
--- a/addon/doxmlparser/src/sectionhandler.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/******************************************************************************
- *
- * $Id$
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#ifndef _SECTIONHANDLER_H
-#define _SECTIONHANDLER_H
-
-#include <qstring.h>
-#include <qlist.h>
-#include <qxml.h>
-#include <doxmlintf.h>
-
-#include "basehandler.h"
-
-class SectionIterator :
- public BaseIterator<ISectionIterator,ISection,SectionHandler>
-{
- public:
- SectionIterator(const QList<SectionHandler> &list) :
- BaseIterator<ISectionIterator,ISection,SectionHandler>(list) {}
-};
-
-
-class SectionHandler : public IUserDefined, public BaseHandler<SectionHandler>
-{
- public:
- virtual void startMember(const QXmlAttributes& attrib);
- virtual void startHeader(const QXmlAttributes& attrib);
- virtual void startSection(const QXmlAttributes& attrib);
- virtual void startDescription(const QXmlAttributes& attrib);
- virtual void endSection();
- virtual void endHeader();
-
- SectionHandler(IBaseHandler *parent);
- virtual ~SectionHandler();
-
- // ISection
- virtual const IString *kindString() const
- { return &m_kindString; }
- virtual SectionKind kind() const
- { return m_kind; }
- IDocRoot *description() const;
- virtual IMemberIterator *members() const;
- virtual bool isStatic() const
- {
- return m_kind==PubStatFuncs || m_kind==PubStatAttribs ||
- m_kind==ProStatFuncs || m_kind==ProStatAttribs ||
- m_kind==PriStatFuncs || m_kind==PriStatAttribs;
- }
- virtual bool isPublic() const
- {
- return !isProtected() && !isPrivate();
- }
- virtual bool isProtected() const
- {
- return m_kind==ProTypes || m_kind==ProFuncs || m_kind==ProAttribs ||
- m_kind==ProSlots || m_kind==ProStatFuncs || m_kind==ProStatAttribs;
- }
- virtual bool isPrivate() const
- {
- return m_kind==PriTypes || m_kind==PriFuncs || m_kind==PriAttribs ||
- m_kind==PriSlots || m_kind==PriStatFuncs || m_kind==PriStatAttribs;
- }
-
- void initialize(CompoundHandler *c);
-
- // IUserDefined implementation
- virtual const IString *header() const
- {
- return &m_header;
- }
-
- private:
- IBaseHandler *m_parent;
-
- // XML elements:
- // -------------
- StringImpl m_header; // header
- DocHandler* m_description; // description
- QList<MemberHandler> m_members; // memberdef
-
- // XML attributes:
- // ---------------
- SectionKind m_kind; // kind
- StringImpl m_kindString; // kind as a string
-};
-
-void sectionhandler_init();
-void sectionhandler_exit();
-
-#endif
diff --git a/addon/doxmlparser/src/stringimpl.h b/addon/doxmlparser/src/stringimpl.h
deleted file mode 100644
index ac4ee12..0000000
--- a/addon/doxmlparser/src/stringimpl.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef STRINGIMPL_H
-#define STRINGIMPL_H
-
-#include <qstring.h>
-#include "doxmlintf.h"
-
-class StringImpl : public QString, public IString
-{
- public:
- StringImpl() {}
- StringImpl(const QString &str) : QString(str) {}
- StringImpl &operator=(const QString &str)
- { QString::operator=(str); return *this; }
- virtual ~StringImpl() {}
-
- // IString
- const char *latin1() const
- { return QString::latin1(); }
- unsigned short unicodeCharAt(int index) const
- { return QString::unicode()[index].unicode(); }
- bool isEmpty() const
- { return QString::isEmpty(); }
- int length() const
- { return QString::length(); }
-};
-
-#endif
-
diff --git a/addon/doxmlparser/test/.cvsignore b/addon/doxmlparser/test/.cvsignore
deleted file mode 100644
index dd07649..0000000
--- a/addon/doxmlparser/test/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-Makefile
-xmlparse.pro
-Makefile.xmlparse
diff --git a/addon/doxmlparser/test/Makefile.in b/addon/doxmlparser/test/Makefile.in
deleted file mode 100644
index 1dfbd17..0000000
--- a/addon/doxmlparser/test/Makefile.in
+++ /dev/null
@@ -1,13 +0,0 @@
-all clean depend: Makefile.xmlparse
- $(MAKE) -f Makefile.xmlparse $@
-
-distclean: clean
- $(RM) -rf Makefile.xmlparse xmlparse.pro Makefile obj
-
-tmake:
- $(ENV) $(PERL) $(TMAKE) xmlparse.pro >Makefile.xmlparse
-
-Makefile.xmlparse: xmlparse.pro
- $(ENV) $(PERL) $(TMAKE) xmlparse.pro >Makefile.xmlparse
-
-install:
diff --git a/addon/doxmlparser/test/main.cpp b/addon/doxmlparser/test/main.cpp
deleted file mode 100644
index 8bf9dd2..0000000
--- a/addon/doxmlparser/test/main.cpp
+++ /dev/null
@@ -1,759 +0,0 @@
-/******************************************************************************
- *
- * $Id$
- *
- *
- * Copyright (C) 1997-2003 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <doxmlintf.h>
-#include <qstring.h>
-
-/*! Dumps the contents of a hyperlinked text fragment as plain text to the
- * output.
- */
-QString linkedTextToString(ILinkedTextIterator *ti)
-{
- QString result;
- ILinkedText *lt=0;
- for (ti->toFirst();(lt=ti->current());ti->toNext())
- {
- switch (lt->kind())
- {
- case ILinkedText::Kind_Text: // plain text
- result+=dynamic_cast<ILT_Text*>(lt)->text()->latin1(); break;
- case ILinkedText::Kind_Ref: // a link
- result+=dynamic_cast<ILT_Ref *>(lt)->text()->latin1(); break;
- }
- }
- return result;
-}
-
-/*! Macro for printing an indented message. */
-#define InPrint(x) printf("%s",indent.latin1()), printf x;
-
-/*! Dumps the contents of a documentation block to stdout.
- * @note This function will call itself recursively.
- * @param doc The root of the documentation tree.
- * @param level The indent level.
- */
-void DumpDoc(IDoc *doc,int level)
-{
- if (doc==0) return;
- QString indent;
- indent.fill(' ',level);
- //printf(" doc node kind=`%d'\n",doc->kind());
- switch (doc->kind())
- {
- case IDoc::Para:
- {
- InPrint(("<para>\n"));
- IDocPara *par = dynamic_cast<IDocPara*>(doc);
- ASSERT(par!=0);
- IDocIterator *di = par->contents();
- IDoc *pdoc;
- for (di->toFirst();(pdoc=di->current());di->toNext())
- {
- DumpDoc(pdoc,level+1);
- }
- di->release();
- InPrint(("</para>\n"));
- }
- break;
- case IDoc::Text:
- {
- IDocText *txt = dynamic_cast<IDocText*>(doc);
- ASSERT(txt!=0);
- InPrint(("<text value=`%s' markup=%d headingLevel=%d/>\n",
- txt->text()->latin1(),txt->markup(),txt->headingLevel()));
- }
- break;
- case IDoc::MarkupModifier:
- {
- IDocMarkupModifier *md = dynamic_cast<IDocMarkupModifier*>(doc);
- ASSERT(md!=0);
- InPrint(("<markup modifier enabled=%d markup=%d headingLevel=%d/>\n",
- md->enabled(),md->markup(),md->headingLevel()));
- }
- break;
- case IDoc::ItemizedList:
- {
- InPrint(("<itemized list>\n"));
- IDocItemizedList *list = dynamic_cast<IDocItemizedList*>(doc);
- ASSERT(list!=0);
- IDocIterator *di = list->elements();
- IDoc *pdoc;
- for (di->toFirst();(pdoc=di->current());di->toNext())
- {
- DumpDoc(pdoc,level+1);
- }
- di->release();
- InPrint(("</itemized list>\n"));
- }
- break;
- case IDoc::OrderedList:
- {
- InPrint(("<ordered list>\n"));
- IDocOrderedList *list = dynamic_cast<IDocOrderedList*>(doc);
- ASSERT(list!=0);
- IDocIterator *di = list->elements();
- IDoc *pdoc;
- for (di->toFirst();(pdoc=di->current());di->toNext())
- {
- DumpDoc(pdoc,level+1);
- }
- di->release();
- InPrint(("</ordered list>\n"));
- }
- break;
- case IDoc::ListItem:
- {
- InPrint(("<list item>\n"));
- IDocListItem *li = dynamic_cast<IDocListItem*>(doc);
- ASSERT(li!=0);
- IDocIterator *di = li->contents();
- IDoc *pdoc;
- for (di->toFirst();(pdoc=di->current());di->toNext())
- {
- DumpDoc(pdoc,level+1);
- }
- di->release();
- InPrint(("</list item>\n"));
- }
- break;
- case IDoc::ParameterItem:
- {
- IDocParameterItem *item = dynamic_cast<IDocParameterItem*>(doc);
- InPrint(("<parameter item>\n"));
- IDocIterator *di = item->paramNames();
- IDoc *pdoc;
- for (di->toFirst();(pdoc=di->current());di->toNext())
- {
- DumpDoc(pdoc,level+1);
- }
- di->release();
- DumpDoc(item->description(),level+1);
- InPrint(("</parameter item>\n"));
- }
- break;
- case IDoc::ParameterList:
- {
- IDocParameterList *list = dynamic_cast<IDocParameterList*>(doc);
- InPrint(("<parameter list type=%d>\n",list->sectType()));
- IDocIterator *di = list->params();
- IDoc *pdoc;
- for (di->toFirst();(pdoc=di->current());di->toNext())
- {
- DumpDoc(pdoc,level+1);
- }
- di->release();
- InPrint(("</parameter list>\n"));
- ASSERT(list!=0);
- }
- break;
- case IDoc::Parameter:
- {
- IDocParameter *par = dynamic_cast<IDocParameter*>(doc);
- ASSERT(par!=0);
- InPrint(("<parameter name=%s/>\n",par->name()->latin1()));
- }
- break;
- case IDoc::SimpleSect:
- {
- IDocSimpleSect *ss = dynamic_cast<IDocSimpleSect*>(doc);
- ASSERT(ss!=0);
- InPrint(("<simplesect type=%s>\n",ss->typeString()->latin1()));
- DumpDoc(ss->title(),level+1);
- DumpDoc(ss->description(),level+1);
- InPrint(("<simplesect/>\n"));
- }
- break;
- case IDoc::Title:
- {
- InPrint(("<title>\n"));
- IDocTitle *t = dynamic_cast<IDocTitle*>(doc);
- ASSERT(t!=0);
- IDocIterator *di = t->title();
- IDoc *pdoc;
- for (di->toFirst();(pdoc=di->current());di->toNext())
- {
- DumpDoc(pdoc,level+1);
- }
- InPrint(("<title/>\n"));
- }
- break;
- case IDoc::Ref:
- {
- IDocRef *ref = dynamic_cast<IDocRef*>(doc);
- ASSERT(ref!=0);
- InPrint(("<ref id=%s text=%s/>\n",
- ref->refId()->latin1(),ref->text()->latin1()));
- }
- break;
- case IDoc::VariableList:
- {
- InPrint(("<variablelist>\n"));
- IDocVariableList *vl = dynamic_cast<IDocVariableList*>(doc);
- ASSERT(vl!=0);
- IDocIterator *di = vl->entries();
- IDoc *pdoc;
- for (di->toFirst();(pdoc=di->current());di->toNext())
- {
- DumpDoc(pdoc,level+1);
- }
- di->release();
- InPrint(("<variablelist/>\n"));
- }
- break;
- case IDoc::VariableListEntry:
- {
- IDocVariableListEntry *vle = dynamic_cast<IDocVariableListEntry*>(doc);
- ASSERT(vle!=0);
- ILinkedTextIterator *lti = vle->term();
- QString term = linkedTextToString(lti);
- lti->release();
- InPrint(("<variablelistentry term=%s>\n",term.latin1()));
- DumpDoc(vle->description(),level+1);
- InPrint(("<variablelistentry/>\n"));
- }
- break;
- case IDoc::HRuler:
- {
- IDocHRuler *hr = dynamic_cast<IDocHRuler*>(doc);
- ASSERT(hr!=0);
- InPrint(("<hruler/>\n"));
- }
- break;
- case IDoc::LineBreak:
- {
- IDocLineBreak *lb = dynamic_cast<IDocLineBreak*>(doc);
- ASSERT(lb!=0);
- InPrint(("<linebreak/>\n"));
- }
- break;
- case IDoc::ULink:
- {
- IDocULink *ul = dynamic_cast<IDocULink*>(doc);
- ASSERT(ul!=0);
- InPrint(("<ulink url=`%s' text=`%s'/>\n",ul->url()->latin1(),ul->text()->latin1()));
- }
- break;
- case IDoc::EMail:
- {
- IDocEMail *em = dynamic_cast<IDocEMail*>(doc);
- ASSERT(em!=0);
- InPrint(("<email address=`%s'/>\n",em->address()->latin1()));
- }
- break;
- case IDoc::Link:
- {
- IDocLink *lk = dynamic_cast<IDocLink*>(doc);
- ASSERT(lk!=0);
- InPrint(("<link refid=`%s' text=`%s'/>\n",lk->refId()->latin1(),lk->text()->latin1()));
- }
- break;
- case IDoc::ProgramListing:
- {
- IDocProgramListing *pl = dynamic_cast<IDocProgramListing*>(doc);
- ASSERT(pl!=0);
- InPrint(("<programlisting>\n"));
- IDocIterator *cli = pl->codeLines();
- IDoc *cl;
- for (cli->toFirst();(cl=cli->current());cli->toNext())
- {
- DumpDoc(cl,level+1);
- }
- cli->release();
- InPrint(("</programlisting>\n"));
- }
- break;
- case IDoc::CodeLine:
- {
- IDocCodeLine *cl = dynamic_cast<IDocCodeLine*>(doc);
- ASSERT(cl!=0);
- InPrint(("<codeline lineNumber=%d refId=`%s'>\n",cl->lineNumber(),cl->refId()->latin1()));
- IDocIterator *cei = cl->codeElements();
- IDoc *ce;
- for (cei->toFirst();(ce=cei->current());cei->toNext())
- {
- DumpDoc(ce,level+1);
- }
- cei->release();
- InPrint(("</codeline>\n"));
- }
- break;
- case IDoc::Highlight:
- {
- IDocHighlight *hl = dynamic_cast<IDocHighlight*>(doc);
- ASSERT(hl!=0);
- InPrint(("<highlight kind=%d>\n",hl->kind()));
- IDocIterator *cei = hl->codeElements();
- IDoc *ce;
- for (cei->toFirst();(ce=cei->current());cei->toNext())
- {
- DumpDoc(ce,level+1);
- }
- cei->release();
- InPrint(("</highlight>\n"));
- }
- break;
- case IDoc::Formula:
- {
- IDocFormula *fm = dynamic_cast<IDocFormula*>(doc);
- ASSERT(fm!=0);
- InPrint(("<formula id=`%s' text=`%s'/>\n",fm->id()->latin1(),fm->text()->latin1()));
- }
- break;
- case IDoc::Image:
- {
- IDocImage *img = dynamic_cast<IDocImage*>(doc);
- ASSERT(img!=0);
- InPrint(("<image name=`%s' caption=`%s'/>\n",img->name()->latin1(),img->caption()->latin1()));
- }
- break;
- case IDoc::DotFile:
- {
- IDocDotFile *df = dynamic_cast<IDocDotFile*>(doc);
- ASSERT(df!=0);
- InPrint(("<dotfile name=`%s' caption=`%s'/>\n",df->name()->latin1(),df->caption()->latin1()));
- }
- break;
- case IDoc::IndexEntry:
- {
- IDocIndexEntry *ie = dynamic_cast<IDocIndexEntry*>(doc);
- ASSERT(ie!=0);
- InPrint(("<indexentry primary=`%s' secondary=`%s'/>\n",ie->primary()->latin1(),ie->secondary()->latin1()));
- }
- break;
- case IDoc::Table:
- {
- IDocTable *tbl = dynamic_cast<IDocTable*>(doc);
- ASSERT(tbl!=0);
- InPrint(("<table numcols=%d caption=`%s'>\n",tbl->numColumns(),tbl->caption()->latin1()));
- IDocIterator *ri = tbl->rows();
- IDoc *row;
- for (ri->toFirst();(row=ri->current());ri->toNext())
- {
- DumpDoc(row,level+1);
- }
- ri->release();
- InPrint(("</table>\n"));
- }
- break;
- case IDoc::Row:
- {
- IDocRow *row = dynamic_cast<IDocRow*>(doc);
- ASSERT(row!=0);
- InPrint(("<row>\n"));
- IDocIterator *ei = row->entries();
- IDoc *e;
- for (ei->toFirst();(e=ei->current());ei->toNext())
- {
- DumpDoc(e,level+1);
- }
- ei->release();
- InPrint(("</row>\n"));
- }
- break;
- case IDoc::Entry:
- {
- IDocEntry *ent = dynamic_cast<IDocEntry*>(doc);
- ASSERT(ent!=0);
- InPrint(("<entry>\n"));
- IDocIterator *di = ent->contents();
- IDoc *pdoc;
- for (di->toFirst();(pdoc=di->current());di->toNext())
- {
- DumpDoc(pdoc,level+1);
- }
- di->release();
- InPrint(("</entry>\n"));
- }
- break;
- case IDoc::Section:
- {
- IDocSection *sec = dynamic_cast<IDocSection*>(doc);
- ASSERT(sec!=0);
- InPrint(("<section id=`%s' level=%d>\n",
- sec->id()->latin1(),sec->level()));
- DumpDoc(sec->title(),level+1);
- IDocIterator *di = sec->paragraphs();
- IDoc *pdoc;
- for (di->toFirst();(pdoc=di->current());di->toNext())
- {
- DumpDoc(pdoc,level+1);
- }
- di=sec->subSections();
- for (di->toFirst();(pdoc=di->current());di->toNext())
- {
- DumpDoc(pdoc,level+1);
- }
- IDocInternal *intern = sec->internal();
- if (intern)
- {
- DumpDoc(intern,level+1);
- }
- InPrint(("</section>\n"));
- }
- break;
- case IDoc::Internal:
- {
- IDocInternal *intern = dynamic_cast<IDocInternal*>(doc);
- ASSERT(intern!=0);
- InPrint(("<internal>\n"));
- IDocIterator *di = intern->paragraphs();
- IDoc *pdoc;
- for (di->toFirst();(pdoc=di->current());di->toNext())
- {
- DumpDoc(pdoc,level+1);
- }
- di=intern->subSections();
- for (di->toFirst();(pdoc=di->current());di->toNext())
- {
- DumpDoc(pdoc,level+1);
- }
- InPrint(("</internal>\n"));
- }
- break;
- case IDoc::Copy:
- {
- IDocCopy *cpy = dynamic_cast<IDocCopy*>(doc);
- ASSERT(cpy!=0);
- InPrint(("<copydoc>\n"));
- IDocIterator *di = cpy->contents();
- IDoc *pdoc;
- for (di->toFirst();(pdoc=di->current());di->toNext())
- {
- DumpDoc(pdoc,level+1);
- }
- di->release();
- InPrint(("<copydoc/>\n"));
- }
- break;
- case IDoc::TocItem:
- {
- IDocTocItem *ti = dynamic_cast<IDocTocItem*>(doc);
- ASSERT(ti!=0);
- InPrint(("<tocitem id=\"%s\" title=\"%s\"/>\n",
- ti->id()->latin1(),ti->title()->latin1()));
- }
- break;
- case IDoc::TocList:
- {
- IDocTocList *tl = dynamic_cast<IDocTocList*>(doc);
- ASSERT(tl!=0);
- InPrint(("<toclist>\n"));
- IDocIterator *di = tl->elements();
- IDoc *pdoc;
- for (di->toFirst();(pdoc=di->current());di->toNext())
- {
- DumpDoc(pdoc,level+1);
- }
- di->release();
- InPrint(("<toclist/>\n"));
- }
- break;
- case IDoc::Verbatim:
- {
- IDocVerbatim *vt = dynamic_cast<IDocVerbatim*>(doc);
- ASSERT(vt!=0);
- const char *s=0;
- switch (vt->type())
- {
- case IDocVerbatim::Verbatim: s="verbatim"; break;
- case IDocVerbatim::HtmlOnly: s="htmlonly"; break;
- case IDocVerbatim::LatexOnly: s="latexonly"; break;
- default:
- printf("Invalid verbatim type!\n");
- }
- InPrint(("<verbatim %s>\n",s));
- InPrint(("%s",vt->text()->latin1()));
- InPrint(("</verbatim>\n"));
- }
- break;
- case IDoc::Anchor:
- {
- IDocAnchor *anc = dynamic_cast<IDocAnchor*>(doc);
- ASSERT(anc!=0);
- InPrint(("<anchor id='%s'/>\n",anc->id()->latin1()));
- }
- break;
- case IDoc::Symbol:
- {
- IDocSymbol *sym = dynamic_cast<IDocSymbol*>(doc);
- ASSERT(sym!=0);
- InPrint(("<symbol type=%s letter=%c/>\n",
- sym->typeString()->latin1(),sym->letter()));
- }
- break;
- case IDoc::Root:
- {
- InPrint(("<root>\n"));
- IDocRoot *root = dynamic_cast<IDocRoot*>(doc);
- ASSERT(root!=0);
- IDocIterator *di = root->contents();
- IDoc *pdoc;
- for (di->toFirst();(pdoc=di->current());di->toNext())
- {
- DumpDoc(pdoc,level+1);
- }
- di->release();
- InPrint(("</root>\n"));
- }
- break;
-
- default:
- printf("Found unsupported node type %d!\n",doc->kind());
- break;
- }
-}
-
-void DumpGraph(IGraph *graph)
-{
- if (graph==0) { printf(" --- no graph ---\n"); return; }
- printf(" --- graph ----\n");
- INodeIterator *ni = graph->nodes();
- INode *node;
- for (ni->toFirst();(node=ni->current());ni->toNext())
- {
- printf(" --- node id=%s label=%s linkId=%s\n",
- node->id()->latin1(),
- node->label()->latin1(),
- node->linkId()->latin1()
- );
- IChildNodeIterator *cni = node->children();
- IChildNode *cn;
- for (cni->toFirst();(cn=cni->current());cni->toNext())
- {
- printf(" + child id=%s label=%s relation=%s\n",
- cn->node()->id()->latin1(),
- cn->node()->label()->latin1(),
- cn->relationString()->latin1()
- );
- IEdgeLabelIterator *eli = cn->edgeLabels();
- IEdgeLabel *el;
- for (eli->toFirst();(el=eli->current());eli->toNext())
- {
- printf(" edgeLabel=%s\n",el->label()->latin1());
- }
- eli->release();
- }
- cni->release();
- }
- ni->release();
- printf(" --- end graph ----\n");
-
-}
-
-void DumpParamList(IParamIterator *pli,int indent)
-{
- QString indentStr;
- indentStr.fill(' ',indent);
- IParam *par;
- for (pli->toFirst();(par=pli->current());pli->toNext())
- {
- ILinkedTextIterator *lti = par->type();
- QString parType = linkedTextToString(lti);
- lti->release();
- lti = par->defaultValue();
- QString defVal = linkedTextToString(lti);
- lti->release();
- printf("%sParam type=%s decl_name=%s def_name=%s defvalue=%s\n",
- indentStr.data(), parType.latin1(),
- par->declarationName()->latin1(),
- par->definitionName()->latin1(),
- defVal.latin1());
- }
-}
-
-int main(int argc,char **argv)
-{
- if (argc!=2)
- {
- printf("Usage: %s xmldir\n",argv[0]);
- exit(1);
- }
-
- IDoxygen *dox = createObjectModel();
-
- dox->setDebugLevel(4);
-
- if (!dox->readXMLDir(argv[1]))
- {
- printf("Error reading %s/index.xml\n",argv[1]);
- exit(1);
- }
-
- ICompoundIterator *cli = dox->compounds();
- ICompound *comp;
- printf("--- compound list ---------\n");
- for (cli->toFirst();(comp=cli->current());cli->toNext())
- {
- printf("Compound name=%s id=%s kind=%s\n",
- comp->name()->latin1(),comp->id()->latin1(),comp->kindString()->latin1());
-
- ISectionIterator *sli = comp->sections();
- ISection *sec;
- for (sli->toFirst();(sec=sli->current());sli->toNext())
- {
- printf(" Section kind=%s\n",sec->kindString()->latin1());
- IMemberIterator *mli = sec->members();
- IMember *mem;
- if( sec->kind() == ISection::UserDefined )
- {
- IUserDefined *group = dynamic_cast<IUserDefined*>(sec);
- printf(" Title=%s\n", group->header()->latin1() );
- }
- for (mli->toFirst();(mem=mli->current());mli->toNext())
- {
- ILinkedTextIterator *lti = mem->type();
- printf(" Member type=%s name=%s\n",
- linkedTextToString(lti).latin1(),mem->name()->latin1());
- lti->release();
-
- IParamIterator *pli = mem->parameters();
- DumpParamList(pli,6);
- pli->release();
- IMemberReferenceIterator *mri = mem->references();
- IMemberReference *mr;
- for (mri->toFirst();(mr=mri->current());mri->toNext())
- {
- IMember *memr = mr->member();
- printf(" References %s at line %d\n",
- mr->name()->latin1(),memr->bodyStart());
- }
-
- mri->release();
- mri = mem->referencedBy();
- for (mri->toFirst();(mr=mri->current());mri->toNext())
- {
- IMember *memr = mr->member();
- printf(" ReferencedBy %s at line %d\n",
- mr->name()->latin1(),memr->bodyStart());
- }
- mri->release();
-
- if (mem->kind()==IMember::Enum) // we have found an enum
- {
- IEnum *e = dynamic_cast<IEnum*>(mem);
- IMemberIterator *evi = e->enumValues(); // get the enum values
- IMember *mev;
- for (evi->toFirst();(mev=evi->current());evi->toNext())
- {
- IEnumValue *ev = dynamic_cast<IEnumValue*>(mev);
- ILinkedTextIterator *lti = ev->initializer();
- QString init = linkedTextToString(lti);
- lti->release();
- printf(" Enum value `%s' init=`%s'\n",
- ev->name()->latin1(),init.latin1());
- }
- evi->release();
- }
-
- pli = mem->templateParameters();
- if (pli)
- {
- printf(" Template parameters\n");
- DumpParamList(pli,8);
- pli->release();
- }
-
- IDoc *doc = mem->briefDescription();
- if (doc)
- {
- printf("===== brief description ==== \n");
- DumpDoc(doc,0);
- }
-
- doc = mem->detailedDescription();
- if (doc)
- {
- printf("===== detailed description ==== \n");
- DumpDoc(doc,0);
- }
- }
- mli->release();
- }
- sli->release();
-
- IDoc *doc = comp->briefDescription();
- if (doc)
- {
- printf("===== brief description ==== \n");
- DumpDoc(doc,0);
- }
-
- doc = comp->detailedDescription();
- if (doc)
- {
- printf("===== detailed description ==== \n");
- DumpDoc(doc,0);
- }
-
- if (comp->kind()==ICompound::Class)
- {
- IClass *cls = dynamic_cast<IClass*>(comp);
- ASSERT(cls!=0);
-
- printf("==== inheritance graph ==== \n");
- DumpGraph(cls->inheritanceGraph());
-
- printf("==== collabration graph ==== \n");
- DumpGraph(cls->collaborationGraph());
-
- printf("==== base classes ==== \n");
- IRelatedCompoundIterator *bcli = cls->baseCompounds();
- IRelatedCompound *bClass;
- for (bcli->toFirst();(bClass=bcli->current());bcli->toNext())
- {
- ICompound *bc = bClass->compound();
- printf(" + class %s\n",bc->name()->latin1());
- bc->release();
- }
- bcli->release();
-
- printf("==== derived classes ==== \n");
- IRelatedCompoundIterator *dcli = cls->derivedCompounds();
- IRelatedCompound *dClass;
- for (dcli->toFirst();(dClass=dcli->current());dcli->toNext())
- {
- ICompound *dc = dClass->compound();
- printf(" + class %s\n",dc->name()->latin1());
- dc->release();
- }
- dcli->release();
- }
- else if (comp->kind()==ICompound::File)
- {
- IFile *file = dynamic_cast<IFile*>(comp);
- ASSERT(file!=0);
-
- printf("==== include dependency graph ==== \n");
- DumpGraph(file->includeDependencyGraph());
-
- printf("==== included by dependency graph ==== \n");
- DumpGraph(file->includedByDependencyGraph());
-
- printf("==== source ====\n");
- DumpDoc(file->source(),0);
- }
-
- comp->release();
- }
- cli->release();
- printf("---------------------------\n");
-
- dox->release();
-
- return 0;
-}
-
diff --git a/addon/doxmlparser/test/xmlparse.pro.in b/addon/doxmlparser/test/xmlparse.pro.in
deleted file mode 100644
index cfb95be..0000000
--- a/addon/doxmlparser/test/xmlparse.pro.in
+++ /dev/null
@@ -1,20 +0,0 @@
-TEMPLATE = app.t
-CONFIG = console warn_on $extraopts
-HEADERS =
-SOURCES = main.cpp
-unix:LIBS += -L../../../lib -L../lib -ldoxmlparser -lqtools
-win32:INCLUDEPATH += .
-win32-mingw:LIBS += -L../../../lib -L../lib -ldoxmlparser -lqtools
-win32-msvc:LIBS += doxmlparser.lib qtools.lib shell32.lib
-win32-msvc:TMAKE_LFLAGS += /LIBPATH:..\..\..\lib;..\lib
-win32-borland:LIBS += doxmlparser.lib qtools.lib shell32.lib
-win32-borland:TMAKE_LFLAGS += -L..\..\..\lib -L..\lib
-win32:TMAKE_CXXFLAGS += -DQT_NODLL
-DESTDIR =
-OBJECTS_DIR = ../objects
-TARGET = xmlparse
-INCLUDEPATH += ../../../qtools ../include
-DEPENDPATH += ../include
-unix:TARGETDEPS = ../lib/libdoxmlparser.a
-win32:TARGETDEPS = ..\lib\doxmlparser.lib
-
diff --git a/addon/doxywizard/.cvsignore b/addon/doxywizard/.cvsignore
deleted file mode 100644
index 75ae21b..0000000
--- a/addon/doxywizard/.cvsignore
+++ /dev/null
@@ -1,8 +0,0 @@
-Makefile
-doxywizard.pro
-Makefile.doxywizard
-config.cpp
-config.h
-config.l
-moc
-obj
diff --git a/addon/doxywizard/Makefile.in b/addon/doxywizard/Makefile.in
deleted file mode 100644
index 42d5871..0000000
--- a/addon/doxywizard/Makefile.in
+++ /dev/null
@@ -1,42 +0,0 @@
-#
-#
-#
-# Copyright (C) 1997-2005 by Dimitri van Heesch.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation under the terms of the GNU General Public License is hereby
-# granted. No representations are made about the suitability of this software
-# for any purpose. It is provided "as is" without express or implied warranty.
-# See the GNU General Public License for more details.
-#
-
-all: config.h config.l version.cpp Makefile.doxywizard
- $(MAKE) -f Makefile.doxywizard QTDIR=$(QTDIR) $@
-
-config.h: ../../src/config.h
- $(CP) ../../src/config.h config.h
-
-config.l: ../../src/config.l
- $(CP) ../../src/config.l config.l
-
-version.cpp:
- $(CP) ../../src/version.cpp version.cpp
-
-Makefile.doxywizard: doxywizard.pro
- $(ENV) $(PERL) $(TMAKE) doxywizard.pro >Makefile.doxywizard
-
-tmake:
- $(ENV) $(PERL) $(TMAKE) doxywizard.pro >Makefile.doxywizard
-
-clean: Makefile.doxywizard
- $(MAKE) -f Makefile.doxywizard clean
- $(RM) config.cpp
-
-distclean: clean
- $(RM) Makefile.doxywizard config.l config.h version.cpp
-
-install:
- $(INSTTOOL) -d $(INSTALL)/bin
- $(INSTTOOL) -m 755 ../../bin/doxywizard $(INSTALL)/bin
-
-FORCE:
diff --git a/addon/doxywizard/Makefile.win_nmake.in b/addon/doxywizard/Makefile.win_nmake.in
deleted file mode 100644
index 7ebcdf8..0000000
--- a/addon/doxywizard/Makefile.win_nmake.in
+++ /dev/null
@@ -1,38 +0,0 @@
-#
-#
-#
-# Copyright (C) 1997-2005 by Dimitri van Heesch.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation under the terms of the GNU General Public License is hereby
-# granted. No representations are made about the suitability of this software
-# for any purpose. It is provided "as is" without express or implied warranty.
-# See the GNU General Public License for more details.
-#
-
-all: config.h config.l unistd.h Makefile.doxywizard
- $(MAKE) -f Makefile.doxywizard $@
-
-unistd.h:
- $(CP) ..\..\src\unistd.h unistd.h
-
-config.h:
- $(CP) ..\..\src\config.h config.h
-
-config.l:
- $(CP) ..\..\src\config.l config.l
-
-Makefile.doxywizard: doxywizard.pro
- $(ENV) $(PERL) $(TMAKE) doxywizard.pro >Makefile.doxywizard
-
-tmake:
- $(ENV) $(PERL) $(TMAKE) doxywizard.pro >Makefile.doxywizard
-
-clean: Makefile.doxywizard
- $(MAKE) -f Makefile.doxywizard clean
- $(RM) config.cpp
-
-distclean: clean
- $(RM) Makefile.doxywizard config.l config.h
-
-FORCE:
diff --git a/addon/doxywizard/README b/addon/doxywizard/README
deleted file mode 100644
index fc9c5aa..0000000
--- a/addon/doxywizard/README
+++ /dev/null
@@ -1,3 +0,0 @@
-Doxywizard is a graphical front-end to read/edit/write doxygen configuration
-files. It requires Qt version 3.x or higher.
-
diff --git a/addon/doxywizard/doxywizard.cpp b/addon/doxywizard/doxywizard.cpp
deleted file mode 100644
index b221530..0000000
--- a/addon/doxywizard/doxywizard.cpp
+++ /dev/null
@@ -1,1424 +0,0 @@
-#include <qlabel.h>
-#include <qhbox.h>
-#include <qvbox.h>
-#include <qlineedit.h>
-#include <qapplication.h>
-#include <qcheckbox.h>
-#include <qpushbutton.h>
-#include <qbuttongroup.h>
-#include <qradiobutton.h>
-#include <qlayout.h>
-#include <qcombobox.h>
-#include <qfiledialog.h>
-#include <qmessagebox.h>
-#include <qtextedit.h>
-#include <qprocess.h>
-#include <qtimer.h>
-#include <qstatusbar.h>
-#include <qfileinfo.h>
-#include <qpopupmenu.h>
-#include <qmenubar.h>
-#include <qtooltip.h>
-
-#include <stdlib.h>
-
-#if defined(Q_OS_MACX)
-#include <CoreFoundation/CFBundle.h>
-#include <ApplicationServices/ApplicationServices.h>
-#undef check
-#endif
-
-#include "doxywizard.h"
-#include "expert.h"
-#include "config.h"
-#include "version.h"
-
-const int messageTimeout = 5000; //!< status bar message timeout in millisec.
-
-#if defined(Q_OS_MACX)
-QCString getResourcePath()
-{
- // todo: use qApp->applicationDirPath()
- QCString result;
- CFURLRef pluginRef = CFBundleCopyBundleURL(CFBundleGetMainBundle());
- CFStringRef macPath = CFURLCopyFileSystemPath(pluginRef, kCFURLPOSIXPathStyle);
- result = CFStringGetCStringPtr(macPath, CFStringGetSystemEncoding());
- result+="/Contents/Resources/";
- return result;
-}
-
-#define GRAPHVIZ_PATH "/Applications/Graphviz.app"
-#define DOT_PATH GRAPHVIZ_PATH "/Contents/MacOS"
-#define DOT_LOCATION DOT_PATH "/dot"
-
-bool checkIfDotInstalled()
-{
- QFileInfo fi(GRAPHVIZ_PATH);
- if (fi.exists() && fi.isDir())
- {
- fi.setFile(DOT_LOCATION);
- if (fi.exists() && fi.isFile())
- {
- return TRUE;
- }
- }
- return FALSE;
-}
-
-void setDotPath()
-{
- if (checkIfDotInstalled())
- {
- Config_getString("DOT_PATH")=DOT_PATH;
- Config_getBool("HAVE_DOT")=TRUE;
- }
-}
-
-#endif
-
-
-//==========================================================================
-
-Step1::Step1(QWidget *parent) : QWidget(parent,"Step1")
-{
- QVBoxLayout *layout = new QVBoxLayout(this);
- layout->setMargin(4);
- layout->setSpacing(8);
- layout->addWidget(new QLabel( "Provide some information "
- "about the project you are documenting",this));
- QWidget *w = new QWidget( this );
- QHBoxLayout *bl = new QHBoxLayout(w,10);
-
- QVBox *col1 = new QVBox( w );
- col1->setSpacing(8);
- (new QLabel("Project name:",col1))->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
- (new QLabel("Project version or id:",col1))->setAlignment(Qt::AlignRight|Qt::AlignVCenter);
-
- QVBox *col2 = new QVBox( w );
- col2->setSpacing(8);
- m_projName = new QLineEdit(col2);
- m_projNumber = new QLineEdit(col2);
-
- bl->addWidget(col1);
- bl->addWidget(col2);
-
- layout->addWidget(w);
-
- //---------------------------------------------------
- QFrame *f = new QFrame( this );
- f->setFrameStyle( QFrame::HLine | QFrame::Sunken );
- layout->addWidget(f);
-
- layout->addWidget(new QLabel( "Specify the directory to "
- "scan for source code", this));
- QHBox *row = new QHBox( this );
- row->setSpacing(10);
- new QLabel("Source code directory:",row);
- m_sourceDir = new QLineEdit(row);
- m_srcSelectDir = new QPushButton("Select...",row);
- layout->addWidget(row);
-
- m_recursive = new QCheckBox("Scan recursively",this);
- m_recursive->setChecked(TRUE);
- layout->addWidget(m_recursive);
-
- //---------------------------------------------------
- f = new QFrame( this );
- f->setFrameStyle( QFrame::HLine | QFrame::Sunken );
- layout->addWidget(f);
-
- layout->addWidget(new QLabel(
- "Specify the directory where doxygen should "
- "put the generated documentation",this
- ));
- row = new QHBox( this );
- row->setSpacing(10);
- new QLabel("Destination directory:",row);
- m_destDir = new QLineEdit(row);
- m_dstSelectDir = new QPushButton("Select...",row);
- layout->addWidget(row);
- layout->addStretch(1);
-
- connect(m_srcSelectDir,SIGNAL(clicked()),
- this,SLOT(selectSourceDir()));
- connect(m_dstSelectDir,SIGNAL(clicked()),
- this,SLOT(selectDestinationDir()));
-}
-
-void Step1::selectSourceDir()
-{
- m_sourceDir->setText(QFileDialog::getExistingDirectory(m_sourceDir->text(),this));
-}
-
-void Step1::selectDestinationDir()
-{
- m_destDir->setText(QFileDialog::getExistingDirectory(m_destDir->text(),this));
-}
-
-QString Step1::getProjectName() const
-{
- return m_projName->text();
-}
-
-QString Step1::getProjectNumber() const
-{
- return m_projNumber->text();
-}
-
-QString Step1::getSourceDir() const
-{
- return m_sourceDir->text();
-}
-
-bool Step1::scanRecursively() const
-{
- return m_recursive->isChecked();
-}
-
-QString Step1::getDestinationDir() const
-{
- return m_destDir->text();
-}
-
-void Step1::setProjectName(const QString &name)
-{
- m_projName->setText(name);
-}
-
-void Step1::setProjectNumber(const QString &num)
-{
- m_projNumber->setText(num);
-}
-
-void Step1::setSourceDir(const QString &dir)
-{
- m_sourceDir->setText(dir);
-}
-
-void Step1::setRecursiveScan(bool enable)
-{
- m_recursive->setChecked(enable);
-}
-
-void Step1::setDestinationDir(const QString &dir)
-{
- m_destDir->setText(dir);
-}
-
-
-//==========================================================================
-
-Step2::Step2(QWidget *parent) : QWidget(parent,"Step2")
-{
- QVBoxLayout *layout = new QVBoxLayout(this);
- layout->setSpacing(8);
-
- m_extractMode = new QButtonGroup("Select the desired extraction mode:",this);
- QGridLayout *gbox = new QGridLayout( m_extractMode, 4, 1, 8, 0 );
- gbox->addRowSpacing( 0, fontMetrics().lineSpacing()+2 );
- gbox->addWidget(new QRadioButton("Documented entities only",m_extractMode),1,0);
- gbox->addWidget(new QRadioButton("All entities",m_extractMode),2,0);
- gbox->addWidget(m_crossRef = new QCheckBox("Include cross-referenced source code in the output",m_extractMode),3,0);
- m_extractMode->setButton(0);
- layout->addWidget(m_extractMode);
-
- //---------------------------------------------------
- QFrame *f = new QFrame( this );
- f->setFrameStyle( QFrame::HLine | QFrame::Sunken );
- layout->addWidget(f);
-
- m_optimizeLang = new QButtonGroup("Select programming language to optimize the results for",this);
- gbox = new QGridLayout( m_optimizeLang, 4, 1, 8, 0 );
- gbox->addRowSpacing( 0, fontMetrics().lineSpacing()+2 );
- gbox->addWidget(new QRadioButton("Optimize for C++ output",m_optimizeLang),1,0);
- gbox->addWidget(new QRadioButton("Optimize for Java output",m_optimizeLang),2,0);
- gbox->addWidget(new QRadioButton("Optimize for C output",m_optimizeLang),3,0);
- m_optimizeLang->setButton(0);
- layout->addWidget(m_optimizeLang);
-
- layout->addStretch(1);
-
- connect(m_crossRef,SIGNAL(stateChanged(int)),
- parent,SLOT(changeCrossRefState(int)));
-}
-
-bool Step2::crossReferencingEnabled() const
-{
- //printf("Step2::crossReferencingEnabled()=%d\n",m_crossRef->isOn());
- return m_crossRef->isOn();
-}
-
-void Step2::enableCrossReferencing()
-{
- //printf("Step2::enableCrossReferencing()\n");
- m_crossRef->setChecked(TRUE);
-}
-
-bool Step2::extractAll() const
-{
- //printf("Step2::extractAll()=%d\n",m_extractMode->find(1)->isOn());
- return m_extractMode->find(1)->isOn();
-}
-
-bool Step2::crossReferencing() const
-{
- return m_crossRef->isChecked();
-}
-
-OptLang Step2::optimizeFor() const
-{
- switch (m_optimizeLang->selectedId())
- {
- case 0: return Lang_Cpp;
- case 1: return Lang_Java;
- case 2: return Lang_C;
- }
- return Lang_Cpp;
-}
-
-void Step2::setExtractAll(bool enable)
-{
- //printf("Step2::setExtractAll(%d)\n",enable);
- m_extractMode->setButton(enable?1:0);
-}
-
-void Step2::setCrossReferencing(bool enable)
-{
- //printf("Step2::setCrossReferencing(%d)\n",enable);
- m_crossRef->setChecked(enable);
-}
-
-void Step2::setOptimizeFor(OptLang lang)
-{
- switch (lang)
- {
- case Lang_Cpp: m_optimizeLang->setButton(0); break;
- case Lang_Java: m_optimizeLang->setButton(1); break;
- case Lang_C: m_optimizeLang->setButton(2); break;
- }
-}
-
-//==========================================================================
-
-Step3::Step3(QWidget *parent) : QWidget(parent,"Step3")
-{
- QVBoxLayout *layout = new QVBoxLayout(this);
- QButtonGroup *bg = new QButtonGroup("Output format(s) to generate",this);
- QGridLayout *gbox = new QGridLayout( bg, 8, 1, 8, 0 );
- gbox->addRowSpacing( 0, fontMetrics().lineSpacing()+2 );
- gbox->addWidget(m_htmlEnabled=new QCheckBox("HTML",bg),1,0);
- QWidget *w = new QWidget(bg);
- QHBoxLayout *bl = new QHBoxLayout(w);
- m_htmlOptions = new QButtonGroup(w);
- m_htmlOptions->hide();
- m_htmlOptionBox = new QVBox(w);
- m_htmlOptions->insert(new QRadioButton("plain HTML",m_htmlOptionBox));
- m_htmlOptions->insert(new QRadioButton("with frames and a navigation tree",m_htmlOptionBox));
- m_htmlOptions->insert(new QRadioButton("prepare for compressed HTML (.chm)",m_htmlOptionBox));
- m_htmlOptions->insert(m_searchEnabled=new QCheckBox("With search function (requires PHP enabled web server)",m_htmlOptionBox));
- bl->addSpacing(30);
- bl->addWidget(m_htmlOptionBox);
- m_htmlOptions->setButton(0);
- m_htmlOptionBox->setEnabled(TRUE);
- gbox->addWidget(w,2,0);
-
- gbox->addWidget(m_latexEnabled=new QCheckBox("LaTeX",bg),3,0);
- w = new QWidget(bg);
- bl = new QHBoxLayout(w);
- m_texOptions = new QButtonGroup(w);
- m_texOptions->hide();
- m_texOptionBox = new QVBox(w);
- m_texOptions->insert(new QRadioButton("as intermediate format for hyperlinked PDF",m_texOptionBox));
- m_texOptions->insert(new QRadioButton("as intermediate format for PDF",m_texOptionBox));
- m_texOptions->insert(new QRadioButton("as intermediate format for PostScript",m_texOptionBox));
- bl->addSpacing(30);
- bl->addWidget(m_texOptionBox);
- m_texOptions->setButton(0);
- m_texOptionBox->setEnabled(FALSE);
- gbox->addWidget(w,4,0);
-
- gbox->addWidget(m_manEnabled=new QCheckBox("Man pages",bg),5,0);
- gbox->addWidget(m_rtfEnabled=new QCheckBox("Rich Text Format (RTF)",bg),6,0);
- gbox->addWidget(m_xmlEnabled=new QCheckBox("XML",bg),7,0);
- bg->setButton(0);
- layout->addWidget(bg);
-
- layout->addStretch(1);
-
- connect(m_latexEnabled,SIGNAL(stateChanged(int)),
- this,SLOT(latexStateChange(int)));
- connect(m_htmlEnabled,SIGNAL(stateChanged(int)),
- this,SLOT(htmlStateChange(int)));
-}
-
-void Step3::latexStateChange(int state)
-{
- if (state==QButton::On)
- {
- m_texOptionBox->setEnabled(TRUE);
- }
- else if (state==QButton::Off)
- {
- m_texOptionBox->setEnabled(FALSE);
- }
-}
-
-void Step3::htmlStateChange(int state)
-{
- if (state==QButton::On)
- {
- m_htmlOptionBox->setEnabled(TRUE);
- }
- else if (state==QButton::Off)
- {
- m_htmlOptionBox->setEnabled(FALSE);
- }
-}
-
-bool Step3::htmlEnabled() const
-{
- return m_htmlEnabled->isChecked();
-}
-
-bool Step3::latexEnabled() const
-{
- return m_latexEnabled->isChecked();
-}
-
-bool Step3::manEnabled() const
-{
- return m_manEnabled->isChecked();
-}
-
-bool Step3::rtfEnabled() const
-{
- return m_rtfEnabled->isChecked();
-}
-
-bool Step3::xmlEnabled() const
-{
- return m_xmlEnabled->isChecked();
-}
-
-bool Step3::searchEnabled() const
-{
- return m_searchEnabled->isChecked();
-}
-
-HtmlStyle Step3::htmlStyle() const
-{
- if (m_htmlOptions->find(0)->isOn())
- {
- return HS_Plain;
- }
- else if (m_htmlOptions->find(1)->isOn())
- {
- return HS_TreeView;
- }
- else if (m_htmlOptions->find(2)->isOn())
- {
- return HS_CHM;
- }
- // broken radio button logic
- return HS_Plain;
-}
-
-TexStyle Step3::texStyle() const
-{
- switch (m_texOptions->selectedId())
- {
- case 0: return TS_PDFHyper;
- case 1: return TS_PDF;
- case 2: return TS_PS;
- }
- return TS_PDFHyper;
-}
-
-void Step3::setHtmlEnabled(bool enable)
-{
- m_htmlEnabled->setChecked(enable);
-}
-
-void Step3::setLatexEnabled(bool enable)
-{
- m_latexEnabled->setChecked(enable);
-}
-
-void Step3::setManEnabled(bool enable)
-{
- m_manEnabled->setChecked(enable);
-}
-
-void Step3::setRtfEnabled(bool enable)
-{
- m_rtfEnabled->setChecked(enable);
-}
-
-void Step3::setXmlEnabled(bool enable)
-{
- m_xmlEnabled->setChecked(enable);
-}
-
-void Step3::setSearchEnabled(bool enable)
-{
- m_searchEnabled->setChecked(enable);
-}
-
-void Step3::setHtmlStyle(HtmlStyle style)
-{
- switch(style)
- {
- case HS_Plain: m_htmlOptions->setButton(0); break;
- case HS_TreeView: m_htmlOptions->setButton(1); break;
- case HS_CHM: m_htmlOptions->setButton(2); break;
- }
-}
-
-void Step3::setTexStyle(TexStyle style)
-{
- switch(style)
- {
- case TS_PDFHyper: m_texOptions->setButton(0); break;
- case TS_PDF: m_texOptions->setButton(1); break;
- case TS_PS: m_texOptions->setButton(2); break;
- }
-}
-
-
-//==========================================================================
-
-Step4::Step4(QWidget *parent) : QWidget(parent,"Step4")
-{
- QVBoxLayout *layout = new QVBoxLayout(this);
- m_diagramMode = new QButtonGroup("Diagrams to generate",this);
- QGridLayout *gbox = new QGridLayout( m_diagramMode, 5, 1, 8, 0 );
- gbox->addRowSpacing( 0, fontMetrics().lineSpacing()+2 );
- gbox->addWidget(new QRadioButton("No diagrams",m_diagramMode),1,0);
- gbox->addWidget(new QRadioButton("Use built-in class diagram generator",m_diagramMode),2,0);
- gbox->addWidget(new QRadioButton("Use dot tool from the GraphViz package to generate",m_diagramMode),3,0);
- QWidget *w = new QWidget(m_diagramMode);
- QHBoxLayout *bl = new QHBoxLayout(w);
- QButtonGroup *dotGroup = new QButtonGroup(w);
- dotGroup->hide();
- m_dotOptions = new QVBox(w);
- dotGroup->insert(m_dotClass=new QCheckBox("Class diagrams",m_dotOptions));
- dotGroup->insert(m_dotCollaboration=new QCheckBox("Collaboration diagrams",m_dotOptions));
- dotGroup->insert(m_dotInclude=new QCheckBox("Include dependency graphs",m_dotOptions));
- dotGroup->insert(m_dotIncludedBy=new QCheckBox("Included by dependency graphs",m_dotOptions));
- dotGroup->insert(m_dotInheritance=new QCheckBox("Overall Class hierarchy",m_dotOptions));
- dotGroup->insert(m_dotCall=new QCheckBox("Call graphs",m_dotOptions));
- bl->addSpacing(30);
- bl->addWidget(m_dotOptions);
- dotGroup->setButton(0);
- m_dotOptions->setEnabled(FALSE);
- gbox->addWidget(w,4,0);
- m_diagramMode->setButton(1);
- layout->addWidget(m_diagramMode);
- layout->addStretch(1);
-
- connect(m_diagramMode,SIGNAL(clicked(int)),
- this,SLOT(diagramModeChanged(int)));
- connect(m_dotCall,SIGNAL(stateChanged(int)),
- parent,SLOT(changeCallGraphState(int)));
-}
-
-void Step4::diagramModeChanged(int buttonId)
-{
- m_dotOptions->setEnabled(buttonId==2);
-}
-
-void Step4::disableCallGraphs()
-{
- m_dotCall->setChecked(FALSE);
-}
-
-bool Step4::callGraphEnabled() const
-{
- return m_dotCall->isOn();
-}
-
-DiagramMode Step4::diagramMode() const
-{
- switch(m_diagramMode->selectedId())
- {
- case 0: return DM_None;
- case 1: return DM_Builtin;
- case 2: return DM_Dot;
- }
- return DM_None;
-}
-
-bool Step4::classDiagram() const
-{
- return m_dotClass->isChecked();
-}
-
-bool Step4::collaborationDiagram() const
-{
- return m_dotCollaboration->isChecked();
-}
-
-bool Step4::includeGraph() const
-{
- return m_dotInclude->isChecked();
-}
-
-bool Step4::includedByGraph() const
-{
- return m_dotIncludedBy->isChecked();
-}
-
-bool Step4::inheritanceGraph() const
-{
- return m_dotInheritance->isChecked();
-}
-
-bool Step4::callGraph() const
-{
- return m_dotCall->isChecked();
-}
-
-void Step4::setDiagramMode(DiagramMode mode)
-{
- switch(mode)
- {
- case DM_None: m_diagramMode->setButton(0); diagramModeChanged(0); break;
- case DM_Builtin: m_diagramMode->setButton(1); diagramModeChanged(1); break;
- case DM_Dot: m_diagramMode->setButton(2); diagramModeChanged(2); break;
- }
-}
-
-void Step4::setClassDiagram(bool enable)
-{
- m_dotClass->setChecked(enable);
-}
-
-void Step4::setCollaborationDiagram(bool enable)
-{
- m_dotCollaboration->setChecked(enable);
-}
-
-void Step4::setIncludeGraph(bool enable)
-{
- m_dotInclude->setChecked(enable);
-}
-
-void Step4::setIncludedByGraph(bool enable)
-{
- m_dotIncludedBy->setChecked(enable);
-}
-
-void Step4::setInheritanceGraph(bool enable)
-{
- m_dotInheritance->setChecked(enable);
-}
-
-void Step4::setCallGraph(bool enable)
-{
- m_dotCall->setChecked(enable);
-}
-
-
-//==========================================================================
-
-Wizard::Wizard(QWidget *parent=0) : QTabDialog(parent)
-{
- addTab( m_step1 = new Step1(this),"Project");
- addTab( m_step2 = new Step2(this),"Mode");
- addTab( m_step3 = new Step3(this),"Output");
- addTab( m_step4 = new Step4(this),"Diagrams");
- setCancelButton();
-}
-
-void Wizard::changeCallGraphState(int state)
-{
- if (state==QButton::On && !m_step2->crossReferencingEnabled())
- {
- if (QMessageBox::question(this,"This option depends on another option",
- "The call graph option requires that cross-referencing "
- "of source code is enabled.\nDo you want to enable this "
- "option?",QMessageBox::Yes,QMessageBox::No)==QMessageBox::Yes)
- {
- m_step2->enableCrossReferencing();
- }
- else
- {
- m_step4->disableCallGraphs();
- }
- }
-}
-
-void Wizard::changeCrossRefState(int state)
-{
- if (state==QButton::Off && m_step4->callGraphEnabled())
- {
- if (QMessageBox::question(this,"Another option depends on this one",
- "The call graph option requires that cross-referencing "
- "of source code is enabled.\nDo you want to disable the call "
- "graph option?",QMessageBox::Yes,QMessageBox::No
- )==QMessageBox::Yes
- )
- {
- m_step4->disableCallGraphs();
- }
- else
- {
- m_step2->enableCrossReferencing();
- }
- }
-}
-
-//==========================================================================
-
-MainWidget::MainWidget(QWidget *parent)
- : QMainWindow(parent,"MainWidget")
-{
- setCaption("Doxygen GUI frontend");
-
- // initialize config settings
- Config::instance()->init();
- Config::instance()->check();
-#if defined(Q_OS_MACX)
- setDotPath();
-#endif
-
- QWidget *w = new QWidget(this);
- setCentralWidget(w);
- QVBoxLayout *layout = new QVBoxLayout(w);
- layout->setMargin(10);
-
- QPopupMenu *file = new QPopupMenu(this);
- file->insertItem("Open...", this, SLOT(loadConfigFile()), CTRL+Key_O);
- file->insertItem("Save As...", this, SLOT(saveConfigFile()), CTRL+Key_S);
- m_recentMenu = new QPopupMenu;
- file->insertItem( "&Recent configurations", m_recentMenu );
- connect(m_recentMenu,SIGNAL(activated(int)),this,SLOT(openRecent(int)));
- file->insertItem("Set as default...",this,SLOT(saveDefaults()) );
- file->insertItem("Reset...",this,SLOT(resetConfig()) );
- file->insertItem("Quit", this, SLOT(quit()), CTRL+Key_Q);
- QPopupMenu *help = new QPopupMenu(this);
-#if defined(Q_OS_MACX)
- help->insertItem("Online manual", this, SLOT(manual()), Key_F1);
-#endif
- help->insertItem("About", this, SLOT(about()) );
- menuBar()->insertItem("File",file);
- menuBar()->insertItem("Help",help);
-
- //---------------------------------------------------
- QVBox *heading = new QVBox(w);
- QLabel *l = new QLabel("Step 1: Configure doxygen",heading);
- QFrame *f = new QFrame( heading );
- f->setFrameStyle( QFrame::HLine | QFrame::Sunken );
- //f->setFixedSize(l->sizeHint().width(),f->sizeHint().height());
- layout->addWidget(heading);
- layout->addSpacing(10);
-
- l = new QLabel("Choose one of the following ways to configure doxygen",w);
- layout->addWidget(l);
- layout->addSpacing(5);
- QHBoxLayout *hbl = new QHBoxLayout(layout);
- hbl->setSpacing(8);
-
- m_wizard = new QPushButton("Wizard...",w);
- QToolTip::add(m_wizard,"Quickly configure the most important settings");
- hbl->addWidget(m_wizard);
-
- m_expert = new QPushButton("Expert...",w);
- QToolTip::add(m_expert,"Determine all configuration settings in detail");
- hbl->addWidget(m_expert);
-
- m_load = new QPushButton("Load...",w);
- QToolTip::add(m_load,"Load the configuration settings from file");
- hbl->addWidget(m_load);
-
- hbl->addStretch(1);
-
- //---------------------------------------------------
- heading = new QVBox(w);
- l = new QLabel("Step 2: Save the configuration file",heading);
- f = new QFrame( heading );
- f->setFrameStyle( QFrame::HLine | QFrame::Sunken );
- //f->setFixedSize(l->sizeHint().width(),f->sizeHint().height());
- layout->addSpacing(15);
- layout->addWidget(heading);
- layout->addSpacing(5);
-
- QGridLayout *grid = new QGridLayout(layout,1,2,10);
- m_save = new QPushButton("Save...",w);
- m_save->setFixedSize(m_save->sizeHint());
- grid->addWidget(m_save,0,0);
- grid->addWidget(m_saveStatus=new QLabel(w),0,1);
- m_saveStatus->setTextFormat(Qt::RichText);
-
- //---------------------------------------------------
- heading = new QVBox(w);
- l = new QLabel("Step 3: Specify the directory from which to run doxygen",heading);
- f = new QFrame( heading );
- f->setFrameStyle( QFrame::HLine | QFrame::Sunken );
- //f->setFixedSize(l->sizeHint().width(),f->sizeHint().height());
- layout->addSpacing(15);
- layout->addWidget(heading);
- layout->addSpacing(5);
-
- QHBoxLayout *row = new QHBoxLayout( layout );
- row->setSpacing(10);
- row->addWidget(new QLabel("Working directory:",w));
- m_workingDir = new QLineEdit(w);
- m_selWorkingDir = new QPushButton("Select...",w);
- row->addWidget(m_workingDir,1);
- row->addWidget(m_selWorkingDir);
-
- //---------------------------------------------------
- heading = new QVBox(w);
- l = new QLabel("Step 4: Run doxygen",heading);
- f = new QFrame( heading );
- f->setFrameStyle( QFrame::HLine | QFrame::Sunken );
- //f->setFixedSize(l->sizeHint().width(),f->sizeHint().height());
- layout->addSpacing(15);
- layout->addWidget(heading);
- layout->addSpacing(5);
-
- row = new QHBoxLayout( layout );
- row->setSpacing(10);
- m_run = new QPushButton("Start",w);
- row->addWidget(m_run);
- row->addWidget(m_runStatus = new QLabel("Status: not running",w));
- row->addStretch(1);
- m_run->setEnabled(FALSE);
- m_runStatus->setEnabled(FALSE);
-
- m_saveLog = new QPushButton("Save log...",w);
- m_saveLog->setEnabled(FALSE);
- row->addWidget(m_saveLog);
-
- layout->addSpacing(8);
- layout->addWidget(m_outputHeading=new QLabel("Output produced by doxygen",w));
- grid = new QGridLayout(layout,1,1,3);
- m_outputLog = new QTextEdit(w);
- m_outputLog->setReadOnly(TRUE);
- m_outputLog->setMinimumWidth(600);
- grid->addWidget(m_outputLog,0,0);
- grid->setColStretch(0,1);
- grid->setRowStretch(0,1);
- m_outputLog->setEnabled(FALSE);
- m_outputHeading->setEnabled(FALSE);
-
- // make connections
- connect(m_wizard,SIGNAL(clicked()),
- this,SLOT(launchWizard()));
- connect(m_expert,SIGNAL(clicked()),
- this,SLOT(launchExpert()));
- connect(m_load,SIGNAL(clicked()),
- this,SLOT(loadConfigFile()));
- connect(m_save,SIGNAL(clicked()),
- this,SLOT(saveConfigFile()));
- connect(m_selWorkingDir,SIGNAL(clicked()),
- this,SLOT(selectWorkingDir()));
- connect(m_workingDir,SIGNAL(textChanged(const QString&)),
- this,SLOT(updateRunnable(const QString&)));
- connect(m_run,SIGNAL(clicked()),
- this,SLOT(runDoxygen()));
- connect(m_saveLog,SIGNAL(clicked()),
- this,SLOT(saveLog()));
-
- // load default settings
- m_settings.setPath("www.doxygen.org","Doxygen GUI");
- bool ok;
- QString config = m_settings.readEntry("/doxywizard/config/default",QString::null,&ok);
- if (ok && !config.isEmpty())
- {
- Config::instance()->parseString("default settings",config);
- }
- QString workingDir = m_settings.readEntry("/doxywizard/config/workingdir",QString::null,&ok);
- if (ok && !workingDir.isEmpty())
- {
- m_workingDir->setText(workingDir);
- }
- setConfigSaved(FALSE);
- for (int i=0;i<10;i++)
- {
- QString entry = m_settings.readEntry(QString().sprintf("/doxywizard/recent/config%d",i));
- if (!entry.isEmpty())
- {
- addRecentFile(entry);
- }
- }
-
- m_runProcess = new QProcess;
- connect(m_runProcess,SIGNAL(readyReadStdout()),this,SLOT(readStdout()));
- connect(m_runProcess,SIGNAL(processExited()),this,SLOT(runComplete()));
- m_running = FALSE;
- m_timer = new QTimer;
- connect(m_timer,SIGNAL(timeout()),this,SLOT(readStdout()));
-
- statusBar()->message("Welcome to Doxygen",messageTimeout);
-}
-
-MainWidget::~MainWidget()
-{
- delete m_runProcess;
-}
-
-void MainWidget::selectWorkingDir()
-{
- QString selectedDir = QFileDialog::getExistingDirectory(m_workingDir->text());
- if (!selectedDir.isEmpty())
- {
- m_workingDir->setText(selectedDir);
- }
-}
-
-void MainWidget::updateRunnable(const QString &newDirName)
-{
- if (m_running) return;
- QFileInfo fi(newDirName);
- bool isRunnable = fi.exists() && fi.isDir() && m_configSaved;
- m_run->setEnabled(isRunnable);
- m_runStatus->setEnabled(isRunnable);
- m_outputHeading->setEnabled(isRunnable);
- m_outputLog->setEnabled(isRunnable);
- m_saveLog->setEnabled(isRunnable && !m_outputLog->text().isEmpty());
-}
-
-void MainWidget::launchWizard()
-{
- Wizard wizard(this);
-
- // -------- Initialize the dialog ----------------
-
- // step1
- wizard.setProjectName(Config_getString("PROJECT_NAME"));
- wizard.setProjectNumber(Config_getString("PROJECT_NUMBER"));
- if (Config_getList("INPUT").count()>0)
- {
- QString dirName=Config_getList("INPUT").getFirst();
- QFileInfo fi(dirName);
- if (fi.exists() && fi.isDir())
- {
- wizard.setSourceDir(dirName);
- }
- }
- wizard.setRecursiveScan(Config_getBool("RECURSIVE"));
- wizard.setDestinationDir(Config_getString("OUTPUT_DIRECTORY"));
-
- // step2
- wizard.setExtractAll(Config_getBool("EXTRACT_ALL"));
- wizard.setCrossReferencing(Config_getBool("SOURCE_BROWSER"));
- if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
- {
- wizard.setOptimizeFor(Lang_Java);
- }
- else if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- wizard.setOptimizeFor(Lang_C);
- }
- else
- {
- wizard.setOptimizeFor(Lang_Cpp);
- }
-
- // step3
- wizard.setHtmlEnabled(Config_getBool("GENERATE_HTML"));
- wizard.setLatexEnabled(Config_getBool("GENERATE_LATEX"));
- wizard.setManEnabled(Config_getBool("GENERATE_MAN"));
- wizard.setRtfEnabled(Config_getBool("GENERATE_RTF"));
- wizard.setXmlEnabled(Config_getBool("GENERATE_XML"));
- wizard.setSearchEnabled(Config_getBool("SEARCHENGINE"));
- if (Config_getBool("GENERATE_HTMLHELP"))
- {
- wizard.setHtmlStyle(HS_CHM);
- }
- else if (Config_getBool("GENERATE_TREEVIEW"))
- {
- wizard.setHtmlStyle(HS_TreeView);
- }
- else
- {
- wizard.setHtmlStyle(HS_Plain);
- }
- if (Config_getBool("USE_PDFLATEX"))
- {
- if (Config_getBool("PDF_HYPERLINKS"))
- {
- wizard.setTexStyle(TS_PDFHyper);
- }
- else
- {
- wizard.setTexStyle(TS_PDF);
- }
- }
- else
- {
- wizard.setTexStyle(TS_PS);
- }
-
- // step4
- if (Config_getBool("HAVE_DOT"))
- {
- wizard.setDiagramMode(DM_Dot);
- }
- else if (Config_getBool("CLASS_DIAGRAMS"))
- {
- wizard.setDiagramMode(DM_Builtin);
- }
- else
- {
- wizard.setDiagramMode(DM_None);
- }
- wizard.setClassDiagram(Config_getBool("CLASS_GRAPH"));
- wizard.setCollaborationDiagram(Config_getBool("COLLABORATION_GRAPH"));
- wizard.setIncludeGraph(Config_getBool("INCLUDE_GRAPH"));
- wizard.setIncludedByGraph(Config_getBool("INCLUDED_BY_GRAPH"));
- wizard.setInheritanceGraph(Config_getBool("GRAPHICAL_HIERARCHY"));
- wizard.setCallGraph(Config_getBool("CALL_GRAPH"));
-
- // -------- Run the dialog ----------------
-
- if (wizard.exec()==QDialog::Accepted)
- {
- // -------- Store the results ----------------
-
- // step1
- Config_getString("PROJECT_NAME")=wizard.getProjectName();
- Config_getString("PROJECT_NUMBER")=wizard.getProjectNumber();
- Config_getList("INPUT").clear();
- Config_getList("INPUT").append(wizard.getSourceDir());
- Config_getBool("RECURSIVE")=wizard.scanRecursively();
- Config_getString("OUTPUT_DIRECTORY")=wizard.getDestinationDir();
-
- // step2
- if (wizard.extractAll())
- {
- Config_getBool("EXTRACT_ALL")=TRUE;
- Config_getBool("EXTRACT_PRIVATE")=TRUE;
- Config_getBool("EXTRACT_STATIC")=TRUE;
- Config_getBool("EXTRACT_LOCAL_CLASSES")=TRUE;
- Config_getBool("HIDE_UNDOC_MEMBERS")=FALSE;
- Config_getBool("HIDE_UNDOC_CLASSES")=FALSE;
- }
- else
- {
- Config_getBool("EXTRACT_ALL")=FALSE;
- Config_getBool("EXTRACT_PRIVATE")=FALSE;
- Config_getBool("EXTRACT_STATIC")=FALSE;
- Config_getBool("EXTRACT_LOCAL_CLASSES")=TRUE;
- Config_getBool("HIDE_UNDOC_MEMBERS")=TRUE;
- Config_getBool("HIDE_UNDOC_CLASSES")=TRUE;
- }
-
- if (wizard.crossReferencing())
- {
- Config_getBool("SOURCE_BROWSER")=TRUE;
- Config_getBool("REFERENCED_BY_RELATION")=TRUE;
- Config_getBool("REFERENCES_RELATION")=TRUE;
- Config_getBool("VERBATIM_HEADERS")=TRUE;
- }
- else
- {
- Config_getBool("SOURCE_BROWSER")=FALSE;
- Config_getBool("REFERENCED_BY_RELATION")=FALSE;
- Config_getBool("REFERENCES_RELATION")=FALSE;
- Config_getBool("VERBATIM_HEADERS")=FALSE;
- }
-
- switch(wizard.optimizeFor())
- {
- case Lang_Cpp:
- Config_getBool("OPTIMIZE_OUTPUT_FOR_C")=FALSE;
- Config_getBool("OPTIMIZE_OUTPUT_JAVA")=FALSE;
- break;
- case Lang_Java:
- Config_getBool("OPTIMIZE_OUTPUT_FOR_C")=FALSE;
- Config_getBool("OPTIMIZE_OUTPUT_JAVA")=TRUE;
- break;
- case Lang_C:
- Config_getBool("OPTIMIZE_OUTPUT_FOR_C")=TRUE;
- Config_getBool("OPTIMIZE_OUTPUT_JAVA")=FALSE;
- break;
- }
-
- // step3
- Config_getBool("GENERATE_HTML")=wizard.htmlEnabled();
- Config_getBool("GENERATE_LATEX")=wizard.latexEnabled();
- Config_getBool("GENERATE_MAN")=wizard.manEnabled();
- Config_getBool("GENERATE_RTF")=wizard.rtfEnabled();
- Config_getBool("GENERATE_XML")=wizard.xmlEnabled();
- Config_getBool("SEARCHENGINE")=wizard.searchEnabled();
- if (wizard.htmlEnabled())
- {
- switch (wizard.htmlStyle())
- {
- case HS_Plain:
- Config_getBool("GENERATE_HTMLHELP")=FALSE;
- Config_getBool("GENERATE_TREEVIEW")=FALSE;
- break;
- case HS_TreeView:
- Config_getBool("GENERATE_HTMLHELP")=FALSE;
- Config_getBool("GENERATE_TREEVIEW")=TRUE;
- break;
- case HS_CHM:
- Config_getBool("GENERATE_HTMLHELP")=TRUE;
- Config_getBool("GENERATE_TREEVIEW")=FALSE;
- break;
- }
- }
- if (wizard.latexEnabled())
- {
- switch (wizard.texStyle())
- {
- case TS_PDFHyper:
- Config_getBool("USE_PDFLATEX")=TRUE;
- Config_getBool("PDF_HYPERLINKS")=TRUE;
- break;
- case TS_PDF:
- Config_getBool("USE_PDFLATEX")=TRUE;
- Config_getBool("PDF_HYPERLINKS")=FALSE;
- break;
- case TS_PS:
- Config_getBool("USE_PDFLATEX")=FALSE;
- Config_getBool("PDF_HYPERLINKS")=FALSE;
- break;
- }
- }
-
- // step4
- switch (wizard.diagramMode())
- {
- case DM_None:
- Config_getBool("CLASS_DIAGRAMS")=FALSE;
- Config_getBool("HAVE_DOT")=FALSE;
- break;
- case DM_Builtin:
- Config_getBool("CLASS_DIAGRAMS")=TRUE;
- Config_getBool("HAVE_DOT")=FALSE;
- break;
- case DM_Dot:
- Config_getBool("CLASS_DIAGRAMS")=FALSE;
- Config_getBool("HAVE_DOT")=TRUE;
- Config_getBool("CLASS_GRAPH")=wizard.classDiagram();
- Config_getBool("COLLABORATION_GRAPH")=wizard.collaborationDiagram();
- Config_getBool("INCLUDE_GRAPH")=wizard.includeGraph();
- Config_getBool("INCLUDED_BY_GRAPH")=wizard.includedByGraph();
- Config_getBool("GRAPHICAL_HIERARCHY")=wizard.inheritanceGraph();
- Config_getBool("CALL_GRAPH")=wizard.callGraph();
- break;
- }
-#if defined(Q_OS_MACX)
- if (Config_getBool("HAVE_DOT"))
- {
- setDotPath();
- }
-#endif
- setConfigSaved(FALSE);
- }
-}
-
-void MainWidget::loadConfigFromFile(const QString &fn)
-{
- if (!Config::instance()->parse(fn))
- {
- QMessageBox::warning(0,"Warning",
- "Could not open or read config file "+fn+"!",
- "abort"
- );
- }
- else
- {
- Config::instance()->convertStrToVal();
-#if defined(Q_OS_MACX)
- if (checkIfDotInstalled() &&
- qstricmp(Config_getString("DOT_PATH"),DOT_PATH)!=0
- )
- {
- Config_getString("DOT_PATH")=DOT_PATH;
- setConfigSaved(FALSE);
- }
- else
- {
- setConfigSaved(TRUE);
- }
-#else
- setConfigSaved(TRUE);
-#endif
- addRecentFile(fn);
- m_workingDir->setText(QFileInfo(fn).dirPath(TRUE));
- m_configFileName = fn;
- statusBar()->message("New configuration loaded",messageTimeout);
- }
-}
-
-void MainWidget::loadConfigFile()
-{
- QString fn = QFileDialog::getOpenFileName(m_workingDir->text(),QString::null,this);
- if (!fn.isEmpty())
- {
- loadConfigFromFile(fn);
- // set current dir to where the config file is located
- QDir::setCurrent(QFileInfo(fn).dirPath(TRUE));
- }
-}
-
-void MainWidget::launchExpert()
-{
- Expert expert(this);
- expert.init();
- expert.exec();
-#if defined(Q_OS_MACX)
- setDotPath();
-#endif
- if (expert.hasChanged()) setConfigSaved(FALSE);
-}
-
-void MainWidget::saveDefaults()
-{
- if (QMessageBox::question(this,"Store settings as defaults",
- "Do you wish to use the "
- "current configuration settings as the default settings?",
- QMessageBox::Yes, QMessageBox::No)==QMessageBox::Yes)
- {
- QString newConfig;
- QTextStream t(&newConfig,IO_WriteOnly);
- Config::instance()->writeTemplate(t,TRUE,FALSE);
- m_settings.writeEntry("/doxywizard/config/default",newConfig);
- m_settings.writeEntry("/doxywizard/config/workingdir",m_workingDir->text());
- statusBar()->message("Current configuration saved as default",messageTimeout);
- }
-}
-
-void MainWidget::saveConfigFile()
-{
- QString fn = QFileDialog::getSaveFileName(m_workingDir->text()+"/Doxyfile",QString::null,this);
- if (!fn.isEmpty())
- {
- QFile f(fn);
- if (f.open(IO_WriteOnly))
- {
- QTextStream t(&f);
- Config::instance()->writeTemplate(t,TRUE,FALSE);
- m_configFileName = fn;
- setConfigSaved(TRUE);
- addRecentFile(fn);
- statusBar()->message("Configuration saved",messageTimeout);
- }
- else
- {
- QMessageBox::warning(0,"Warning",
- "Cannot open file "+fn+" for writing. Nothing saved!","ok");
- }
- }
-}
-
-void MainWidget::resetConfig()
-{
- if (QMessageBox::question(this,"Reset settings to their defaults",
- "Do you wish to reset the "
- "current configuration settings to their factory defaults?",
- QMessageBox::Yes, QMessageBox::No)==QMessageBox::Yes)
- {
- // initialize config settings
- Config::instance()->init();
-#if defined(Q_OS_MACX)
- setDotPath();
-#endif
-
- m_configFileName = "";
- setConfigSaved(FALSE);
- statusBar()->message("Configuration settings reset to their defaults",messageTimeout);
- }
-}
-
-void MainWidget::setConfigSaved(bool enable)
-{
- m_configSaved=enable;
- if (m_configSaved)
- {
- m_saveStatus->setText("Status: saved");
- }
- else
- {
- m_saveStatus->setText("Status: <font color=\"red\">not saved</font>");
- }
- updateRunnable(m_workingDir->text());
-}
-
-void MainWidget::runDoxygen()
-{
- if (!m_running)
- {
- QString doxygenPath;
-#if defined(Q_OS_MACX)
- doxygenPath = getResourcePath();
-#else
- // TODO: get the right value if not in the search path
-#endif
- //printf("Trying to run doxygen from path %s\n",doxygenPath.data());
-
- m_runProcess->setCommunication(QProcess::Stdout|
- QProcess::Stderr|
- QProcess::DupStderr
- );
- m_runProcess->setWorkingDirectory(QDir(m_workingDir->text()));
- m_runProcess->clearArguments();
- m_runProcess->addArgument(doxygenPath+"doxygen");
- m_runProcess->addArgument("-b");
- m_runProcess->addArgument(m_configFileName);
- m_outputLog->clear();
- if (!m_runProcess->start())
- {
- m_outputLog->append(QString("*** Failed to run doxygen\n"));
- }
- else
- {
- m_running=TRUE;
- m_run->setText("Cancel");
- m_runStatus->setText("Status: running");
- m_timer->start(1000);
- }
- }
- else
- {
- m_running=FALSE;
- m_run->setText("Start");
- m_runStatus->setText("Status: not running");
- m_runProcess->kill();
- m_timer->stop();
- updateRunnable(m_workingDir->text());
- }
-}
-
-void MainWidget::readStdout()
-{
- m_outputLog->append(QString(m_runProcess->readStdout()));
-}
-
-void MainWidget::runComplete()
-{
- if (m_running)
- {
- m_outputLog->append(QString("*** Doxygen has finished\n"));
- }
- else
- {
- m_outputLog->append(QString("*** Cancelled by user\n"));
- }
- m_run->setText("Start");
- m_runStatus->setText("Status: not running");
- m_running=FALSE;
- updateRunnable(m_workingDir->text());
-}
-
-void MainWidget::about()
-{
- QString msg;
- QTextStream t(&msg,IO_WriteOnly);
- t << QString("<qt><center>A tool to configure and run doxygen version ")+versionString+
- " on your source files.</center><p><br>"
- "<center>Written by<br> Dimitri van Heesch<br>&copy; 2000-2005</center><p>"
- "</qt>";
- QMessageBox::about(this,"Doxygen GUI",msg);
-}
-
-void MainWidget::manual()
-{
-#if defined(Q_OS_MACX)
- const char *urlBytes = "http://www.doxygen.org/manual.html";
- CFURLRef url = CFURLCreateWithBytes (
- NULL, // allocator
- (UInt8*)urlBytes, // bytes
- strlen(urlBytes), // length
- kCFStringEncodingASCII, // encoding
- NULL // baseURL
- );
- LSOpenCFURLRef(url,0);
- CFRelease(url);
-#endif
-}
-
-void MainWidget::addRecentFile(const QString &file)
-{
- QStringList::Iterator it = m_recentFiles.find(file);
- if (it!=m_recentFiles.end())
- {
- // already found => move to top
- m_recentFiles.remove(it);
- m_recentFiles.prepend(file);
- }
- else
- {
- // not found
- if (m_recentFiles.count() < 10) // append
- {
- m_recentFiles.prepend(file);
- }
- else // add + drop last item
- {
- m_recentFiles.remove(m_recentFiles.last());
- m_recentFiles.prepend(file);
- }
- }
-
- m_recentMenu->clear();
- int i=0;
- for ( it = m_recentFiles.begin(); it != m_recentFiles.end(); ++it, ++i )
- {
- m_recentMenu->insertItem(*it);
- m_settings.writeEntry(QString().sprintf("/doxywizard/recent/config%d",i),*it);
- }
-}
-
-
-void MainWidget::openRecent(int id)
-{
- loadConfigFromFile(m_recentMenu->text(id));
-}
-
-void MainWidget::quit()
-{
- if (!m_configSaved &&
- QMessageBox::warning( this, "DoxyWizard", "Quit and lose changes?",
- QMessageBox::Yes, QMessageBox::No)==QMessageBox::No
- ) return; // Quit cancelled by user
-
- qApp->quit();
-}
-
-void MainWidget::saveLog()
-{
- QString fn = QFileDialog::getSaveFileName(m_workingDir->text()+"/doxygen_log.txt",QString::null,this);
- if (!fn.isEmpty())
- {
- QFile f(fn);
- if (f.open(IO_WriteOnly))
- {
- QTextStream t(&f);
- t << m_outputLog->text();
- statusBar()->message("Output log saved",messageTimeout);
- }
- else
- {
- QMessageBox::warning(0,"Warning",
- "Cannot open file "+fn+" for writing. Nothing saved!","ok");
- }
- }
-}
-
-//==========================================================================
-
-int main(int argc,char **argv)
-{
- QApplication a(argc,argv);
- MainWidget main;
- if (argc==2 && argv[1][0]!='-') // name of config file as an argument
- {
- main.loadConfigFromFile(argv[1]);
- }
- else if (argc>1)
- {
- printf("Usage: %s [config file]\n",argv[0]);
- exit(1);
- }
- a.setMainWidget(&main);
- main.show();
- return a.exec();
-}
-
diff --git a/addon/doxywizard/doxywizard.h b/addon/doxywizard/doxywizard.h
deleted file mode 100644
index c937dae..0000000
--- a/addon/doxywizard/doxywizard.h
+++ /dev/null
@@ -1,292 +0,0 @@
-#ifndef DOXYWIZARD_H
-#define DOXYWIZARD_H
-
-#include <qvbox.h>
-#include <qtabdialog.h>
-#include <qmainwindow.h>
-#include <qsettings.h>
-#include <qstringlist.h>
-
-class QLineEdit;
-class QCheckBox;
-class QPushButton;
-class QComboBox;
-class QButtonGroup;
-class QTextEdit;
-class QLabel;
-class QProcess;
-class QTimer;
-class QPopupMenu;
-
-enum OptLang { Lang_Cpp, Lang_C, Lang_Java };
-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 Step1 : public QWidget
-{
- Q_OBJECT
-
- public:
- Step1(QWidget *parent);
-
- QString getProjectName() const;
- QString getProjectNumber() const;
- QString getSourceDir() const;
- bool scanRecursively() const;
- QString getDestinationDir() const;
-
- void setProjectName(const QString &name);
- void setProjectNumber(const QString &num);
- void setSourceDir(const QString &dir);
- void setRecursiveScan(bool enable);
- void setDestinationDir(const QString &dir);
-
- private slots:
- void selectSourceDir();
- void selectDestinationDir();
-
- private:
- QLineEdit *m_projName;
- QLineEdit *m_projNumber;
- QLineEdit *m_sourceDir;
- QLineEdit *m_destDir;
- QCheckBox *m_recursive;
- QPushButton *m_srcSelectDir;
- QPushButton *m_dstSelectDir;
-};
-
-class Step2 : public QWidget
-{
- public:
- Step2(QWidget *parent);
- bool crossReferencingEnabled() const;
- void enableCrossReferencing();
-
- bool extractAll() const;
- bool crossReferencing() const;
- OptLang optimizeFor() const;
-
- void setExtractAll(bool enable);
- void setCrossReferencing(bool enable);
- void setOptimizeFor(OptLang lang);
-
- private:
- QButtonGroup *m_extractMode;
- QButtonGroup *m_optimizeLang;
- QCheckBox *m_crossRef;
-};
-
-class Step3 : public QWidget
-{
- Q_OBJECT
-
- public:
- Step3(QWidget *parent);
-
- bool htmlEnabled() const;
- bool latexEnabled() const;
- bool manEnabled() const;
- bool rtfEnabled() const;
- bool xmlEnabled() const;
- bool searchEnabled() const;
- HtmlStyle htmlStyle() const;
- TexStyle texStyle() const;
-
- void setHtmlEnabled(bool);
- void setLatexEnabled(bool);
- void setManEnabled(bool);
- void setRtfEnabled(bool);
- void setXmlEnabled(bool);
- void setSearchEnabled(bool);
- void setHtmlStyle(HtmlStyle);
- void setTexStyle(TexStyle);
-
-
- private slots:
- void latexStateChange(int state);
- void htmlStateChange(int state);
-
- private:
- QButtonGroup *m_texOptions;
- QVBox *m_texOptionBox;
- QButtonGroup *m_htmlOptions;
- QVBox *m_htmlOptionBox;
- QCheckBox *m_htmlEnabled;
- QCheckBox *m_latexEnabled;
- QCheckBox *m_manEnabled;
- QCheckBox *m_rtfEnabled;
- QCheckBox *m_xmlEnabled;
- QCheckBox *m_searchEnabled;
-};
-
-class Step4 : public QWidget
-{
- Q_OBJECT
-
- public:
- Step4(QWidget *parent);
- void disableCallGraphs();
- bool callGraphEnabled() const;
-
- DiagramMode diagramMode() const;
- bool classDiagram() const;
- bool collaborationDiagram() const;
- bool includeGraph() const;
- bool includedByGraph() const;
- bool inheritanceGraph() const;
- bool callGraph() const;
-
- void setDiagramMode(DiagramMode mode);
- void setClassDiagram(bool enable);
- void setCollaborationDiagram(bool enable);
- void setIncludeGraph(bool enable);
- void setIncludedByGraph(bool enable);
- void setInheritanceGraph(bool enable);
- void setCallGraph(bool enable);
-
- private slots:
- void diagramModeChanged(int);
-
- private:
- QButtonGroup *m_diagramMode;
- QVBox *m_dotOptions;
- QCheckBox *m_dotClass;
- QCheckBox *m_dotCollaboration;
- QCheckBox *m_dotInclude;
- QCheckBox *m_dotIncludedBy;
- QCheckBox *m_dotInheritance;
- QCheckBox *m_dotCall;
-};
-
-class Wizard : public QTabDialog
-{
- Q_OBJECT
-
- public:
- Wizard(QWidget *parent);
- void disableCallGraphs();
-
- // step1
- QString getProjectName() const { return m_step1->getProjectName(); }
- QString getProjectNumber() const { return m_step1->getProjectNumber(); }
- QString getSourceDir() const { return m_step1->getSourceDir(); }
- bool scanRecursively() const { return m_step1->scanRecursively(); }
- QString getDestinationDir() const { return m_step1->getDestinationDir(); }
-
- void setProjectName(const QString &name) { m_step1->setProjectName(name); }
- void setProjectNumber(const QString &num) { m_step1->setProjectNumber(num); }
- void setSourceDir(const QString &dir) { m_step1->setSourceDir(dir); }
- void setRecursiveScan(bool enable) { m_step1->setRecursiveScan(enable); }
- void setDestinationDir(const QString &dir) { m_step1->setDestinationDir(dir); }
-
- // step2
- bool extractAll() const { return m_step2->extractAll(); }
- bool crossReferencing() const { return m_step2->crossReferencing(); }
- OptLang optimizeFor() const { return m_step2->optimizeFor(); }
-
- void setExtractAll(bool enable) { m_step2->setExtractAll(enable); }
- void setCrossReferencing(bool enable) { m_step2->setCrossReferencing(enable); }
- void setOptimizeFor(OptLang lang) { m_step2->setOptimizeFor(lang); }
-
- // step3
- bool htmlEnabled() const { return m_step3->htmlEnabled(); }
- bool latexEnabled() const { return m_step3->latexEnabled(); }
- bool manEnabled() const { return m_step3->manEnabled(); }
- bool rtfEnabled() const { return m_step3->rtfEnabled(); }
- bool xmlEnabled() const { return m_step3->xmlEnabled(); }
- bool searchEnabled() const { return m_step3->searchEnabled(); }
- HtmlStyle htmlStyle() const { return m_step3->htmlStyle(); }
- TexStyle texStyle() const { return m_step3->texStyle(); }
-
- void setHtmlEnabled(bool enable) { m_step3->setHtmlEnabled(enable); }
- void setLatexEnabled(bool enable) { m_step3->setLatexEnabled(enable); }
- void setManEnabled(bool enable) { m_step3->setManEnabled(enable); }
- void setRtfEnabled(bool enable) { m_step3->setRtfEnabled(enable); }
- void setXmlEnabled(bool enable) { m_step3->setXmlEnabled(enable); }
- void setSearchEnabled(bool enable) { m_step3->setSearchEnabled(enable); }
- void setHtmlStyle(HtmlStyle style) { m_step3->setHtmlStyle(style); }
- void setTexStyle(TexStyle style) { m_step3->setTexStyle(style); }
-
- // step4
- DiagramMode diagramMode() const { return m_step4->diagramMode(); }
- bool classDiagram() const { return m_step4->classDiagram(); }
- bool collaborationDiagram() const { return m_step4->collaborationDiagram(); }
- bool includeGraph() const { return m_step4->includeGraph(); }
- bool includedByGraph() const { return m_step4->includedByGraph(); }
- bool inheritanceGraph() const { return m_step4->inheritanceGraph(); }
- bool callGraph() const { return m_step4->callGraph(); }
-
- void setDiagramMode(DiagramMode mode) { m_step4->setDiagramMode(mode); }
- void setClassDiagram(bool enable) { m_step4->setClassDiagram(enable); }
- void setCollaborationDiagram(bool enable) { m_step4->setCollaborationDiagram(enable); }
- void setIncludeGraph(bool enable) { m_step4->setIncludeGraph(enable); }
- void setIncludedByGraph(bool enable) { m_step4->setIncludedByGraph(enable); }
- void setInheritanceGraph(bool enable) { m_step4->setInheritanceGraph(enable); }
- void setCallGraph(bool enable) { m_step4->setCallGraph(enable); }
-
- public slots:
- void changeCallGraphState(int state);
- void changeCrossRefState(int state);
-
- private:
- Step1 *m_step1;
- Step2 *m_step2;
- Step3 *m_step3;
- Step4 *m_step4;
-};
-
-class MainWidget : public QMainWindow
-{
- Q_OBJECT
- public:
- MainWidget(QWidget *parent=0);
- ~MainWidget();
- void loadConfigFromFile(const QString &);
-
- private slots:
- void launchWizard();
- void launchExpert();
- void loadConfigFile();
- void selectWorkingDir();
- void updateRunnable(const QString &newDirName);
- void saveDefaults();
- void saveConfigFile();
- void runDoxygen();
- void readStdout();
- void runComplete();
- void about();
- void manual();
- void resetConfig();
- void openRecent(int);
- void quit();
- void saveLog();
-
- private:
- void setConfigSaved(bool);
- void addRecentFile(const QString &);
-
- QPushButton *m_wizard;
- QPushButton *m_expert;
- QPushButton *m_load;
- QPushButton *m_save;
- QPushButton *m_defaults;
- QLineEdit *m_workingDir;
- QPushButton *m_selWorkingDir;
- QPushButton *m_run;
- QPushButton *m_saveLog;
- QLabel *m_runStatus;
- QProcess *m_runProcess;
- QLabel *m_saveStatus;
- QLabel *m_outputHeading;
- QTextEdit *m_outputLog;
- QTimer *m_timer;
- QSettings m_settings;
- QPopupMenu *m_recentMenu;
- bool m_configSaved;
- bool m_running;
- QString m_configFileName;
- QStringList m_recentFiles;
-};
-
-#endif
diff --git a/addon/doxywizard/doxywizard.pro.in b/addon/doxywizard/doxywizard.pro.in
deleted file mode 100644
index ae83cb8..0000000
--- a/addon/doxywizard/doxywizard.pro.in
+++ /dev/null
@@ -1,59 +0,0 @@
-#
-#
-#
-# Copyright (C) 1997-2005 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.
-#
-# project file for the doxywizard project
-
-# special template configuration file because we use flex
-TEMPLATE = doxywizard.t
-
-# executable to generate
-TARGET = ../../bin/doxywizard
-
-# configure options
-CONFIG = qt warn_on $extraopts
-
-# header file for the project
-HEADERS = doxywizard.h \
- version.h \
- inputstring.h \
- inputbool.h \
- inputstrlist.h \
- inputint.h \
- expert.h \
- config.h
-
-# source flle for the project
-SOURCES = doxywizard.cpp \
- version.cpp \
- inputstring.cpp \
- inputbool.cpp \
- inputstrlist.cpp \
- inputint.cpp \
- expert.cpp \
- config.cpp
-
-# where to put the objects
-OBJECTS_DIR = obj
-
-# where to put the intermediate moc stuff
-MOC_DIR = moc
-
-# extra C++ compiler options
-INCLUDEPATH += ../../src
-win32:TMAKE_CXXFLAGS += -DQT_DLL
-win32:INCLUDEPATH += .
-macosx-c++:LIBS+=-framework CoreFoundation -framework ApplicationServices
-
-# extra link options
-win32:TMAKE_LFLAGS = /NODEFAULTLIB:msvcrt.lib doxywizard.res
-win32:TMAKE_LIBS = $(QTDIR)\lib\qtmain.lib $(QTDIR)\lib\qt-mt332.lib user32.lib gdi32.lib comdlg32.lib imm32.lib ole32.lib uuid.lib wsock32.lib
-win32:TMAKE_LIBS_QT =
-
diff --git a/addon/doxywizard/doxywizard.res b/addon/doxywizard/doxywizard.res
deleted file mode 100755
index 283b8bb..0000000
--- a/addon/doxywizard/doxywizard.res
+++ /dev/null
Binary files differ
diff --git a/addon/doxywizard/doxywizard.t b/addon/doxywizard/doxywizard.t
deleted file mode 100644
index c7576de..0000000
--- a/addon/doxywizard/doxywizard.t
+++ /dev/null
@@ -1,45 +0,0 @@
-#
-#
-#
-# Copyright (C) 1997-2004 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.
-#!
-#! wizard.t: This is a custom template for building doxywizard
-#!
-#$ IncludeTemplate("app.t");
-
-LEX = flex
-YACC = bison
-
-#${
-sub GenerateDep {
- my($obj,$src,$dep) = @_;
- my(@objv,$srcv,$i,$s,$o,$d,$c);
- @objv = split(/\s+/,$obj);
- @srcv = split(/\s+/,$src);
- for $i ( 0..$#objv ) {
- $s = $srcv[$i];
- $o = $objv[$i];
- next if $s eq "";
- $text .= $o . ": " . $s;
- $text .= " ${linebreak}\n\t\t" . $dep if $dep ne "";
- if ( $moc_output{$s} ne "" ) {
- $text .= " ${linebreak}\n\t\t" . $moc_output{$s};
- }
- $d = &make_depend($s);
- $text .= " ${linebreak}\n\t\t" . $d if $d ne "";
- $text .= "\n";
- }
- chop $text;
-}
-#$}
-
-####################
-
-#$ GenerateDep("config.cpp","config.l");
- $(LEX) -PconfigYY -t config.l >config.cpp
diff --git a/addon/doxywizard/expert.cpp b/addon/doxywizard/expert.cpp
deleted file mode 100644
index a9d4028..0000000
--- a/addon/doxywizard/expert.cpp
+++ /dev/null
@@ -1,276 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <qmainwindow.h>
-#include <qpopupmenu.h>
-#include <qfileinfo.h>
-#include <qmenubar.h>
-#include <qstatusbar.h>
-#include <qfiledialog.h>
-#include <qmessagebox.h>
-#include <qapplication.h>
-#include <qwhatsthis.h>
-#include <qlayout.h>
-#include <qtabwidget.h>
-#include <qtoolbar.h>
-#include <qtoolbutton.h>
-#include <qscrollview.h>
-#include <qlayout.h>
-#include <qtooltip.h>
-
-#include "expert.h"
-#include "inputbool.h"
-#include "inputstring.h"
-#include "inputstrlist.h"
-#include "inputint.h"
-#include "config.h"
-#include "version.h"
-
-//-------------------------------------------------------------------------
-
-Expert::Expert( QWidget *parent ) : QTabDialog( parent )
-{
-
- m_dependencies = new QDict< QList<IInput> >(257);
- m_dependencies->setAutoDelete(TRUE);
- m_inputWidgets = new QDict< IInput >;
- m_switches = new QDict< QObject >;
- m_changed = FALSE;
-
- setHelpButton();
-
- QListIterator<ConfigOption> options = Config::instance()->iterator();
- QVBoxLayout *pageLayout = 0;
- QFrame *page = 0;
- ConfigOption *option = 0;
- for (options.toFirst();(option=options.current());++options)
- {
- switch(option->kind())
- {
- case ConfigOption::O_Info:
- {
- if (pageLayout) pageLayout->addStretch(1);
- QScrollView *view = new QScrollView(this);
- view->setVScrollBarMode(QScrollView::Auto);
- view->setHScrollBarMode(QScrollView::AlwaysOff);
- view->setResizePolicy(QScrollView::AutoOneFit);
- page = new QFrame( view->viewport(), option->name() );
- pageLayout = new QVBoxLayout(page);
- pageLayout->setMargin(10);
- view->addChild(page);
- addTab(view,option->name());
- QWhatsThis::add(page, option->docs().simplifyWhiteSpace() );
- QToolTip::add(page, option->docs() );
- }
- break;
- case ConfigOption::O_String:
- {
- ASSERT(page!=0);
- InputString::StringMode sm=InputString::StringFree;
- switch(((ConfigString *)option)->widgetType())
- {
- case ConfigString::String: sm=InputString::StringFree; break;
- case ConfigString::File: sm=InputString::StringFile; break;
- case ConfigString::Dir: sm=InputString::StringDir; break;
- }
- InputString *inputString = new InputString(
- option->name(), // name
- page, // widget
- *((ConfigString *)option)->valueRef(), // variable
- sm // type
- );
- pageLayout->addWidget(inputString);
- QWhatsThis::add(inputString, option->docs().simplifyWhiteSpace() );
- QToolTip::add(inputString,option->docs());
- connect(inputString,SIGNAL(changed()),SLOT(changed()));
- m_inputWidgets->insert(option->name(),inputString);
- addDependency(m_switches,option->dependsOn(),option->name());
- }
- break;
- case ConfigOption::O_Enum:
- {
- ASSERT(page!=0);
- InputString *inputString = new InputString(
- option->name(), // name
- page, // widget
- *((ConfigEnum *)option)->valueRef(), // variable
- InputString::StringFixed // type
- );
- pageLayout->addWidget(inputString);
- QStrListIterator sli=((ConfigEnum *)option)->iterator();
- for (sli.toFirst();sli.current();++sli)
- {
- inputString->addValue(sli.current());
- }
- inputString->init();
- QWhatsThis::add(inputString, option->docs().simplifyWhiteSpace() );
- QToolTip::add(inputString, option->docs());
- connect(inputString,SIGNAL(changed()),SLOT(changed()));
- m_inputWidgets->insert(option->name(),inputString);
- addDependency(m_switches,option->dependsOn(),option->name());
- }
- break;
- case ConfigOption::O_List:
- {
- ASSERT(page!=0);
- InputStrList::ListMode lm=InputStrList::ListString;
- switch(((ConfigList *)option)->widgetType())
- {
- case ConfigList::String: lm=InputStrList::ListString; break;
- case ConfigList::File: lm=InputStrList::ListFile; break;
- case ConfigList::Dir: lm=InputStrList::ListDir; break;
- case ConfigList::FileAndDir: lm=InputStrList::ListFileDir; break;
- }
- InputStrList *inputStrList = new InputStrList(
- option->name(), // name
- page, // widget
- *((ConfigList *)option)->valueRef(), // variable
- lm // type
- );
- pageLayout->addWidget(inputStrList);
- QWhatsThis::add(inputStrList, option->docs().simplifyWhiteSpace() );
- QToolTip::add(inputStrList, option->docs());
- connect(inputStrList,SIGNAL(changed()),SLOT(changed()));
- m_inputWidgets->insert(option->name(),inputStrList);
- addDependency(m_switches,option->dependsOn(),option->name());
- }
- break;
- break;
- case ConfigOption::O_Bool:
- {
- ASSERT(page!=0);
- InputBool *inputBool = new InputBool(
- option->name(), // name
- page, // widget
- *((ConfigBool *)option)->valueRef() // variable
- );
- pageLayout->addWidget(inputBool);
- QWhatsThis::add(inputBool, option->docs().simplifyWhiteSpace() );
- QToolTip::add(inputBool, option->docs() );
- connect(inputBool,SIGNAL(changed()),SLOT(changed()));
- m_inputWidgets->insert(option->name(),inputBool);
- addDependency(m_switches,option->dependsOn(),option->name());
- }
- break;
- case ConfigOption::O_Int:
- {
- ASSERT(page!=0);
- InputInt *inputInt = new InputInt(
- option->name(), // name
- page, // widget
- *((ConfigInt *)option)->valueRef(), // variable
- ((ConfigInt *)option)->minVal(), // min value
- ((ConfigInt *)option)->maxVal() // max value
- );
- pageLayout->addWidget(inputInt);
- QWhatsThis::add(inputInt, option->docs().simplifyWhiteSpace() );
- QToolTip::add(inputInt, option->docs() );
- connect(inputInt,SIGNAL(changed()),SLOT(changed()));
- m_inputWidgets->insert(option->name(),inputInt);
- addDependency(m_switches,option->dependsOn(),option->name());
- }
- break;
- case ConfigOption::O_Obsolete:
- break;
- }
- }
- if (pageLayout) pageLayout->addStretch(1);
-
- QDictIterator<QObject> di(*m_switches);
- QObject *obj = 0;
- for (di.toFirst();(obj=di.current());++di)
- {
- connect(obj,SIGNAL(toggle(const char *,bool)),SLOT(toggle(const char *,bool)));
- // UGLY HACK: assumes each item depends on a boolean without checking!
- emit toggle(di.currentKey(),((InputBool *)obj)->getState());
- }
-
- connect(this,SIGNAL(helpButtonPressed()),this,SLOT(handleHelp()));
-
-}
-
-Expert::~Expert()
-{
- delete m_dependencies;
- delete m_inputWidgets;
- delete m_switches;
-}
-
-void Expert::handleHelp()
-{
- QWhatsThis::enterWhatsThisMode();
-}
-
-void Expert::addDependency(QDict<QObject> *switches,
- const QCString &dep,const QCString &name)
-{
- if (!dep.isEmpty())
- {
- //printf("Expert::addDependency(%s)\n",name.data());
- IInput *parent = m_inputWidgets->find(dep);
- ASSERT(parent!=0);
- IInput *child = m_inputWidgets->find(name);
- ASSERT(child!=0);
- if (switches->find(dep)==0)
- {
- switches->insert(dep,parent->qobject());
- }
- QList<IInput> *list = m_dependencies->find(dep);
- if (list==0)
- {
- list = new QList<IInput>;
- m_dependencies->insert(dep,list);
- }
- list->append(child);
- }
-}
-
-void Expert::toggle(const char *name,bool state)
-{
- QList<IInput> *inputs = m_dependencies->find(name);
- ASSERT(inputs!=0);
- IInput *input = inputs->first();
- while (input)
- {
- input->setEnabled(state);
- input = inputs->next();
- }
-}
-
-void Expert::init()
-{
- QDictIterator<IInput> di(*m_inputWidgets);
- IInput *input = 0;
- for (di.toFirst();(input=di.current());++di)
- {
- input->init();
- }
- QDictIterator<QObject> dio(*m_switches);
- QObject *obj = 0;
- for (dio.toFirst();(obj=dio.current());++dio)
- {
- connect(obj,SIGNAL(toggle(const char *,bool)),SLOT(toggle(const char *,bool)));
- // UGLY HACK: assumes each item depends on a boolean without checking!
- emit toggle(dio.currentKey(),((InputBool *)obj)->getState());
- }
-
-}
-
-void Expert::changed()
-{
- m_changed=TRUE;
-}
-
diff --git a/addon/doxywizard/expert.h b/addon/doxywizard/expert.h
deleted file mode 100644
index 4fdaea1..0000000
--- a/addon/doxywizard/expert.h
+++ /dev/null
@@ -1,82 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#ifndef EXPERT_H
-#define EXPERT_H
-
-#include <qtabdialog.h>
-#include <qlist.h>
-#include <qdict.h>
-
-class IInput;
-class QWidget;
-class QObject;
-class InputBool;
-class InputString;
-class InputStrList;
-class InputFile;
-class InputDir;
-class InputInt;
-
-class ConfigWidget
-{
- public:
- enum Kind { Int, String, StrList, Bool };
-
- ConfigWidget(QWidget *w,Kind k) : m_widget(w), m_kind(k) {}
-
- Kind kind() const { return m_kind; }
-
- InputString *getString() const
- { return m_kind==String ? (InputString *)m_widget : 0; }
-
- InputBool *getBool() const
- { return m_kind==Bool ? (InputBool *)m_widget : 0; }
-
- InputStrList *getStrList() const
- { return m_kind==StrList ? (InputStrList *)m_widget : 0; }
-
- InputInt *getInt() const
- { return m_kind==Int ? (InputInt *)m_widget : 0; }
-
- private:
- QWidget *m_widget;
- Kind m_kind;
-};
-
-class Expert : public QTabDialog
-{
- Q_OBJECT
-
- public:
- Expert(QWidget *parent=0);
- ~Expert();
- void init();
- void addDependency(QDict<QObject> *switches,
- const QCString &dep,const QCString &name);
- bool hasChanged() const { return m_changed; }
-
- private slots:
- void toggle(const char *,bool);
- void handleHelp();
- void changed();
-
- private:
- QDict<IInput> *m_inputWidgets;
- QDict< QList<IInput> > *m_dependencies;
- QDict<QObject> *m_switches;
- bool m_changed;
-};
-
-#endif
diff --git a/addon/doxywizard/input.h b/addon/doxywizard/input.h
deleted file mode 100644
index ab9bcf5..0000000
--- a/addon/doxywizard/input.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef _INPUT_H
-#define _INPUT_H
-
-class QObject;
-
-class IInput
-{
- public:
- virtual void init() = 0;
- virtual void setEnabled(bool) = 0;
- virtual QObject *qobject() = 0;
-};
-
-#endif
diff --git a/addon/doxywizard/inputbool.cpp b/addon/doxywizard/inputbool.cpp
deleted file mode 100644
index 554c228..0000000
--- a/addon/doxywizard/inputbool.cpp
+++ /dev/null
@@ -1,59 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#include "inputbool.h"
-//#if QT_VERSION >= 300
-//#include <qstylefactory.h>
-//#else
-//#include <qwindowsstyle.h>
-//#endif
-#include <qlayout.h>
-
-InputBool::InputBool( const QString & text, QWidget * parent, bool &flag )
- : QWidget(parent), state(flag)
-{
- QBoxLayout *layout = new QHBoxLayout(this);
- cb = new QCheckBox(text,this);
- layout->addWidget(cb);
- layout->addStretch(10);
-
-//#if QT_VERSION >= 300
-// QStyle *winStyle = QStyleFactory::create("windows");
-//#else
-// QWindowsStyle *winStyle = new QWindowsStyle();
-//#endif
- cb->setChecked( flag );
-// if (winStyle) cb->setStyle( winStyle );
- cb->setMinimumSize( sizeHint() );
-
- connect( cb, SIGNAL(toggled(bool)), SLOT(setState(bool)) );
-
- layout->activate();
-}
-
-void InputBool::init()
-{
- cb->setChecked(state);
-}
-
-void InputBool::setState( bool s )
-{
- if (state!=s)
- {
- emit changed();
- emit toggle(cb->text(),s);
- }
- state=s;
-}
-
diff --git a/addon/doxywizard/inputbool.h b/addon/doxywizard/inputbool.h
deleted file mode 100644
index ee76ba9..0000000
--- a/addon/doxywizard/inputbool.h
+++ /dev/null
@@ -1,50 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#ifndef _INPUTBOOL_H
-#define _INPUTBOOL_H
-
-#include <qwidget.h>
-#include <qcheckbox.h>
-
-#include "input.h"
-
-class PageWidget;
-
-class InputBool : public QWidget, /*QCheckBox,*/ public IInput
-{
- Q_OBJECT
-
- public:
- InputBool( const QString &text, QWidget *parent, bool &flag );
- ~InputBool(){};
- void init();
- void setEnabled(bool b) { cb->setEnabled(b); }
- QObject *qobject() { return this; }
- bool getState() const { return state; }
-
- signals:
- void changed();
- void toggle(const char *,bool);
-
- private slots:
- void setState(bool);
-
- private:
- bool &state;
- QCheckBox *cb;
-
-};
-
-#endif
diff --git a/addon/doxywizard/inputint.cpp b/addon/doxywizard/inputint.cpp
deleted file mode 100644
index 4398f31..0000000
--- a/addon/doxywizard/inputint.cpp
+++ /dev/null
@@ -1,65 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#include "inputint.h"
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <qlabel.h>
-#include <qlayout.h>
-#include <qwindowsstyle.h>
-#include <qspinbox.h>
-
-InputInt::InputInt( const QString & label, QWidget *parent, int &val, int minVal,int maxVal )
- : QWidget( parent), m_val(val), m_minVal(minVal), m_maxVal(maxVal)
-{
- QHBoxLayout *layout = new QHBoxLayout( this, 5 );
-
- lab = new QLabel( label, this );
- lab->setMinimumSize( lab->sizeHint() );
-
- sp = new QSpinBox( minVal,maxVal,1,this );
- sp->setMinimumSize( sp->sizeHint() );
-
- init();
-
- layout->addWidget( lab );
- layout->addWidget( sp );
- layout->addStretch(1);
- layout->activate();
- setMinimumSize( sizeHint() );
-
- connect(sp, SIGNAL(valueChanged(int)),
- this, SLOT(valueChanged(int)) );
-
-}
-
-void InputInt::valueChanged(int val)
-{
- if (val!=m_val) emit changed();
- m_val = val;
-}
-
-void InputInt::setEnabled(bool state)
-{
- lab->setEnabled(state);
- sp->setEnabled(state);
-}
-
-void InputInt::init()
-{
- m_val = QMAX(m_minVal,m_val);
- m_val = QMIN(m_maxVal,m_val);
- sp->setValue(m_val);
-}
diff --git a/addon/doxywizard/inputint.h b/addon/doxywizard/inputint.h
deleted file mode 100644
index 92435b7..0000000
--- a/addon/doxywizard/inputint.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#ifndef _INPUTINT_H
-#define _INPUTINT_H
-
-#include <qwidget.h>
-#include <qstring.h>
-
-#include "input.h"
-
-class QLabel;
-class QSpinBox;
-
-class InputInt : public QWidget, public IInput
-{
- Q_OBJECT
-
- public:
- InputInt( const QString &text, QWidget *parent, int &val,
- int minVal, int maxVal );
- ~InputInt(){};
- void setEnabled(bool);
- void init();
- QObject *qobject() { return this; }
-
- private:
- QLabel *lab;
- QSpinBox *sp;
- int &m_val;
- int m_minVal;
- int m_maxVal;
-
- signals:
- void changed();
-
- private slots:
- void valueChanged(int val);
-
-};
-
-#endif
diff --git a/addon/doxywizard/inputstring.cpp b/addon/doxywizard/inputstring.cpp
deleted file mode 100644
index f301384..0000000
--- a/addon/doxywizard/inputstring.cpp
+++ /dev/null
@@ -1,187 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#include "inputstring.h"
-//#include "pixmaps.h"
-
-#include <qlabel.h>
-#include <qlayout.h>
-#include <qlineedit.h>
-#include <qwindowsstyle.h>
-#include <qcstring.h>
-#include <qpushbutton.h>
-#include <qfiledialog.h>
-#include <qcombobox.h>
-#include <qtooltip.h>
-
-
-InputString::InputString( const QString & label,
- QWidget *parent, QCString &s, StringMode m )
- : QWidget( parent ), str(s), sm(m), m_values(0), m_index(0)
-{
- if (m==StringFixed)
- {
- QHBoxLayout *layout = new QHBoxLayout( this, 5);
- lab = new QLabel( label, this );
- lab->setMinimumSize( lab->sizeHint() );
- layout->addWidget( lab );
- com = new QComboBox( this );
- com->setMinimumSize(com->sizeHint());
- layout->addWidget( com );
- layout->addStretch( 1 );
- le=0;
- br=0;
- layout->activate();
- setMinimumSize( sizeHint() );
- }
- else
- {
- QGridLayout *layout = new QGridLayout( this, 1, m==StringFree ? 1 : 3, 5 );
- lab = new QLabel( label, this );
- lab->setMinimumSize( lab->sizeHint() );
- layout->addWidget( lab,0,0 );
- le = new QLineEdit( this );
- le->setMinimumSize( le->sizeHint() );
- le->setText( s );
- layout->addWidget( le,0,1 );
- if (m==StringFile || m==StringDir)
- {
- //QPixmap pixmap = QPixmap(m==StringFile ?
- // file_xpm :
- // folder_xpm );
- br = new QPushButton( this );
- br->setMinimumSize( br->sizeHint() );
- if (m==StringFile)
- {
- br->setText("File...");
- QToolTip::add(br,"Browse to a file");
- }
- else
- {
- br->setText("Folder...");
- QToolTip::add(br,"Browse to a folder");
- }
- layout->addWidget( br,0,2 );
- }
- else
- {
- br=0;
- }
- com=0;
- layout->activate();
- setMinimumSize( sizeHint() );
- }
-
- if (le) connect( le, SIGNAL(textChanged(const QString&)),
- this, SLOT(textChanged(const QString&)) );
- if (br) connect( br, SIGNAL(clicked()), this, SLOT(browse()) );
- if (com) connect( com, SIGNAL(activated(const QString &)),
- this, SLOT(textChanged(const QString &)) );
-}
-
-InputString::~InputString()
-{
- if (m_values) delete m_values;
-}
-
-
-void InputString::textChanged(const QString &s)
-{
- if (str!=(const char *)s)
- {
- str = s;
- emit changed();
- }
-}
-
-void InputString::setEnabled(bool state)
-{
- lab->setEnabled(state);
- if (le) le->setEnabled(state);
- if (br) br->setEnabled(state);
- if (com) com->setEnabled(state);
-}
-
-void InputString::browse()
-{
- if (sm==StringFile)
- {
- QString fileName = QFileDialog::getOpenFileName();
-
- if (!fileName.isNull())
- {
- le->setText( fileName );
- if (str!=(const char *)le->text())
- {
- str = le->text();
- emit changed();
- }
- }
- }
- else // sm==StringDir
- {
- QString dirName = QFileDialog::getExistingDirectory();
-
- if (!dirName.isNull())
- {
- le->setText( dirName );
- if (str!=(const char *)le->text())
- {
- str = le->text();
- emit changed();
- }
- }
- }
-}
-
-void InputString::clear()
-{
- le->setText("");
- if (!str.isEmpty())
- {
- emit changed();
- str = "";
- }
-}
-
-void InputString::addValue(const char *s)
-{
- if (sm==StringFixed)
- {
- if (m_values==0) m_values = new QDict<int>;
- m_values->setAutoDelete(TRUE);
- m_values->insert(s,new int(m_index++));
- com->insertItem(s);
- }
-}
-
-void InputString::init()
-{
- if (sm==StringFixed)
- {
- int *itemIndex = m_values->find(str);
- if (itemIndex)
- {
- com->setCurrentItem(*itemIndex);
- }
- else
- {
- com->setCurrentItem(0);
- }
- }
- else
- {
- le->setText(str);
- }
-}
diff --git a/addon/doxywizard/inputstring.h b/addon/doxywizard/inputstring.h
deleted file mode 100644
index ddcdfea..0000000
--- a/addon/doxywizard/inputstring.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#ifndef _INPUTSTRING_H
-#define _INPUTSTRING_H
-
-#include <qwidget.h>
-#include <qstring.h>
-#include <qdict.h>
-
-#include "qtbc.h"
-#include "input.h"
-
-class QLabel;
-class QLineEdit;
-class QPushButton;
-class QComboBox;
-
-class InputString : public QWidget, public IInput
-{
- Q_OBJECT
-
- public:
- enum StringMode { StringFree=0,
- StringFile=1,
- StringDir=2,
- StringFixed=3
- };
-
- InputString( const QString &text, QWidget *parent, QCString &s,
- StringMode m=StringFree );
- ~InputString();
- void setEnabled(bool);
- void addValue(const char *s);
- void init();
- QObject *qobject() { return this; }
-
- private:
- QLabel *lab;
- QLineEdit *le;
- QPushButton *br;
- QComboBox *com;
- QCString &str;
- StringMode sm;
- QDict<int> *m_values;
- int m_index;
-
- signals:
- void changed();
-
- private slots:
- void textChanged(const QString&);
- void browse();
- void clear();
-
-};
-
-#endif
diff --git a/addon/doxywizard/inputstrlist.cpp b/addon/doxywizard/inputstrlist.cpp
deleted file mode 100644
index fc8cf50..0000000
--- a/addon/doxywizard/inputstrlist.cpp
+++ /dev/null
@@ -1,210 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#include "inputstrlist.h"
-//#include "pixmaps.h"
-
-#include <qlabel.h>
-#include <qlayout.h>
-#include <qlineedit.h>
-#include <qpushbutton.h>
-#include <qlistbox.h>
-#include <qstrlist.h>
-#include <qstringlist.h>
-#include <qfiledialog.h>
-#include <qtooltip.h>
-
-InputStrList::InputStrList( const QString & label,
- QWidget *parent, QStrList &sl, ListMode lm)
- : QWidget(parent), strList(sl)
-{
- QGridLayout *layout = new QGridLayout( this, 2, 2, 5 );
- lab = new QLabel( label, this );
- lab->setMinimumSize( lab->sizeHint() );
- layout->addWidget( lab,0,0 );
-
- QWidget *dw = new QWidget(this); /* dummy widget used for layouting */
- QHBoxLayout *boxlayout = new QHBoxLayout( dw, 0, 5 );
- le = new QLineEdit( dw );
- le->setMinimumSize( le->sizeHint() );
- boxlayout->addWidget( le, 1 );
-
- add = new QPushButton( dw );
- //add->setPixmap( QPixmap( add_xpm ));
- add->setText( "+" );
- add->setMinimumSize( add->sizeHint() );
- QToolTip::add(add,"Add item");
- boxlayout->addWidget( add );
-
- del = new QPushButton( dw );
- //del->setPixmap( QPixmap( del_xpm ));
- del->setText( "-" );
- del->setMinimumSize( del->sizeHint() );
- QToolTip::add(del,"Delete selected item");
- boxlayout->addWidget( del );
-
- upd = new QPushButton( dw );
- //upd->setPixmap( QPixmap( update_xpm ));
- upd->setText( "*" );
- upd->setMinimumSize( upd->sizeHint() );
- QToolTip::add(upd,"Update selected item");
- boxlayout->addWidget( upd );
-
- lb = new QListBox( this );
- lb->setMinimumSize(400,100);
- init();
- lb->setVScrollBarMode(QScrollView::Auto);
- lb->setHScrollBarMode(QScrollView::Auto);
-
- brFile=0;
- brDir=0;
- if (lm!=ListString)
- {
- if (lm&ListFile)
- {
- brFile = new QPushButton(dw);
- //brFile->setPixmap( QPixmap(file_xpm) );
- brFile->setText("Select...");
- brFile->setMinimumSize(brFile->sizeHint());
- QToolTip::add(brFile,"Browse to a file");
- boxlayout->addWidget( brFile );
- }
- if (lm&ListDir)
- {
- brDir = new QPushButton(dw);
- //brDir->setPixmap( QPixmap(folder_xpm) );
- brDir->setText("Select...");
- brDir->setMinimumSize(brDir->sizeHint());
- QToolTip::add(brDir,"Browse to a folder");
- boxlayout->addWidget( brDir );
- }
- }
- layout->addWidget( dw, 0,1 );
- layout->addWidget( lb,1,1 );
- layout->activate();
- setMinimumSize( sizeHint() );
-
- connect(le, SIGNAL(returnPressed()),
- this, SLOT(addString()) );
- connect(add, SIGNAL(clicked()),
- this, SLOT(addString()) );
- connect(del, SIGNAL(clicked()),
- this, SLOT(delString()) );
- connect(upd, SIGNAL(clicked()),
- this, SLOT(updateString()) );
- if (brFile)
- {
- connect(brFile, SIGNAL(clicked()),
- this, SLOT(browseFiles()));
- }
- if (brDir)
- {
- connect(brDir, SIGNAL(clicked()),
- this, SLOT(browseDir()));
- }
- connect(lb, SIGNAL(selected(const QString &)),
- this, SLOT(selectText(const QString &)));
-}
-
-void InputStrList::addString()
-{
- if (!le->text().isEmpty())
- {
- lb->insertItem(le->text());
- strList.append(le->text());
- emit changed();
- le->clear();
- }
-}
-
-void InputStrList::delString()
-{
- if (lb->currentItem()!=-1)
- {
- int itemIndex = lb->currentItem();
- lb->removeItem(itemIndex);
- strList.remove(itemIndex);
- emit changed();
- }
-}
-
-void InputStrList::updateString()
-{
- if (lb->currentItem()!=-1 && !le->text().isEmpty())
- {
- lb->changeItem(le->text(),lb->currentItem());
- strList.insert(lb->currentItem(),le->text());
- strList.remove(lb->currentItem()+1);
- emit changed();
- }
-}
-
-void InputStrList::selectText(const QString &s)
-{
- le->setText(s);
-}
-
-void InputStrList::setEnabled(bool state)
-{
- lab->setEnabled(state);
- le->setEnabled(state);
- add->setEnabled(state);
- del->setEnabled(state);
- upd->setEnabled(state);
- lb->setEnabled(state);
- if (brFile) brFile->setEnabled(state);
- if (brDir) brDir->setEnabled(state);
-}
-
-void InputStrList::browseFiles()
-{
- QStringList fileNames = QFileDialog::getOpenFileNames();
-
- if (!fileNames.isEmpty())
- {
- QStringList::Iterator it;
- for ( it= fileNames.begin(); it != fileNames.end(); ++it )
- {
- lb->insertItem(*it);
- strList.append(*it);
- emit changed();
- }
- le->setText(*fileNames.begin());
- }
-}
-
-void InputStrList::browseDir()
-{
- QString dirName = QFileDialog::getExistingDirectory();
-
- if (!dirName.isNull())
- {
- lb->insertItem(dirName);
- strList.append(dirName);
- emit changed();
- le->setText(dirName);
- }
-}
-
-void InputStrList::init()
-{
- le->clear();
- lb->clear();
- char *s = strList.first();
- while (s)
- {
- lb->insertItem(s);
- s = strList.next();
- }
-}
diff --git a/addon/doxywizard/inputstrlist.h b/addon/doxywizard/inputstrlist.h
deleted file mode 100644
index 0156c20..0000000
--- a/addon/doxywizard/inputstrlist.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#ifndef _INPUTSTRLIST_H
-#define _INPUTSTRLIST_H
-
-#include <qwidget.h>
-#include <qstring.h>
-
-#include "input.h"
-
-class QLabel;
-class QLineEdit;
-class QPushButton;
-class QListBox;
-class QStrList;
-
-class InputStrList : public QWidget, public IInput
-{
- Q_OBJECT
-
- public:
- enum ListMode { ListString=0,
- ListFile=1,
- ListDir=2,
- ListFileDir=ListFile|ListDir
- };
-
- InputStrList( const QString &text, QWidget *parent,
- QStrList &sl, ListMode v=ListString );
- ~InputStrList() {};
- void setEnabled(bool);
- void init();
- QObject *qobject() { return this; }
-
- private:
- QLabel *lab;
- QLineEdit *le;
- QPushButton *add;
- QPushButton *del;
- QPushButton *upd;
- QPushButton *brFile;
- QPushButton *brDir;
- QListBox *lb;
- QStrList &strList;
-
- signals:
- void changed();
-
- private slots:
- void addString();
- void delString();
- void updateString();
- void selectText(const QString &s);
- void browseFiles();
- void browseDir();
-
-};
-
-#endif
diff --git a/addon/doxywizard/qtbc.h b/addon/doxywizard/qtbc.h
deleted file mode 100644
index 452974c..0000000
--- a/addon/doxywizard/qtbc.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 QTBC_H
-#define QTBC_H
-
-/*! This file contains some hacks to make Doxygen work with
- * Qt version 2.00 and Qt version 1.xx
- */
-
-#include <qglobal.h>
-
-#if QT_VERSION >= 200
-
-#include <locale.h>
-
-#define GCI QCollection::Item
-
-#include <qcstring.h>
-#include <qstring.h>
-inline QCString convertToQCString(const QString &s) { return s.latin1(); }
-
-#else /* QT_VERSION < 200 */
-
-#include <qstring.h>
-#define QCString QString
-inline QCString convertToQCString(const QCString &s) { return s; }
-
-#endif
-
-#endif
diff --git a/addon/doxywizard/version.cpp b/addon/doxywizard/version.cpp
deleted file mode 100644
index 5a00b3e..0000000
--- a/addon/doxywizard/version.cpp
+++ /dev/null
@@ -1 +0,0 @@
-char versionString[]="0.1";
diff --git a/addon/doxywizard/version.h b/addon/doxywizard/version.h
deleted file mode 100644
index 0cbe12a..0000000
--- a/addon/doxywizard/version.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 VERSION_H
-#define VERSION_H
-
-extern char versionString[];
-
-#endif
diff --git a/configure b/configure
deleted file mode 100755
index 720ac72..0000000
--- a/configure
+++ /dev/null
@@ -1,545 +0,0 @@
-#!/bin/sh
-#
-# $Id$
-#
-# Copyright (C) 1997-2005 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.
-#
-# shell script to configure doxygen
-
-bin_dirs=`echo $PATH | sed -e "s/:/ /g"`
-
-f_debug=NO
-f_shared=YES
-f_make=NO
-f_dot=NO
-f_perl=NO
-f_plf_auto=NO
-f_prefix=/usr/local
-f_insttool=NO
-f_english=NO
-f_wizard=NO
-f_thread=NO
-f_langs=nl,se,cz,fr,id,it,de,jp,je,es,fi,ru,hr,pl,pt,hu,kr,ke,ro,si,cn,no,br,dk,sk,ua,gr,tw,sr,ca,lt,za
-
-while test -n "$1"; do
- case $1 in
- --prefix | -prefix)
- shift; f_prefix=$1
- ;;
- --docdir | -docdir)
- shift; f_docdir=$1/doxygen
- ;;
- --shared | -shared)
- f_shared=YES
- ;;
- --static | -static)
- f_shared=NO
- ;;
- --release | -release)
- f_debug=NO
- ;;
- --debug | -debug)
- f_debug=YES
- ;;
- --english-only | -english-only)
- f_english=YES
- ;;
- --enable-langs | -enable-langs)
- shift; f_langs=$1
- ;;
- --platform | -platform)
- shift; f_platform=$1
- ;;
- --make | -make)
- shift; f_make=$1
- ;;
- --dot | -dot)
- shift; f_dot=$1
- ;;
- --perl | -perl)
- shift; f_perl=$1
- ;;
- --install | -install)
- shift; f_insttool=$1
- ;;
- --with-doxywizard | -with-doxywizard)
- f_wizard=YES
- ;;
- -h | -help | --help)
- f_help=y
- ;;
- *)
- echo $1: unknown argument
- f_help=y
- f_error=y
- ;;
- esac
- shift
-done
-
-if test "$f_help" = y; then
- cat <<EOF
-Usage: $0 [--help] [--shared] [--static] [--release] [--debug]
- [--perl name] [--make name] [--dot name] [--platform target]
- [--prefix dir] [--docdir dir] [--install name] [--english-only]
- [----enable-langs list] [--with-doxywizard]
-
-Options:
-
- --help Print this help
- --shared | --static Build using shared or static linking
- [default: shared]
- --release | --debug Build for release or debug
- [default: release]
- --perl name Use \`name' as the name of the perl interpreter
- [default: autodetect]
- --make name Use \`name' as the name of the GNU make tool
- [default: autodetect]
- --dot name Use \`name' as the name of the dot tool that
- is part of the Graphviz package.
- [default: autodetect]
- --platform target Do not detect platform but use \`target' instead.
- See PLATFORMS for a list of possibilities
- --prefix dir Installation prefix directory (doxygen will be
- put in PREFIX/bin/doxygen)
- [default: $f_prefix]
- --docdir dir Documentation is installed in DOCDIR/doxygen/
- [default: PREFIX/share/doc/packages]
- --install name Use \`name' as the name of the GNU install tool
- [default: autodetect]
- --english-only Include support for English only.
- --enable-langs list Include support for output languages listed in list.
- [default: $f_langs]
- --with-doxywizard Build the GUI frontend for doxygen. This
- requires Qt 2.x.x
-
-EOF
- test "$f_error" = y && exit 1
- exit 0;
-fi
-
-u_release=`(uname -r) 2>/dev/null` || u_release=unknown
-u_system=`(uname -s) 2>/dev/null` || u_system=unknown
-
-if test -z "$f_platform"; then
- f_platforms="`cat PLATFORMS`"
-
- case "$u_system:$u_release" in
- AIX*)
- f_platform=aix-xlc
- ;;
- BeOS*)
- f_platform=beos-g++
- ;;
- dgux:*)
- f_platform=dgux-g++
- ;;
- Darwin:*)
- f_platform=macosx-c++
- if test "$f_insttool" = NO; then
- f_insttool=/usr/bin/install
- fi
- ;;
- FreeBSD:*)
- f_platform=freebsd-g++
- ;;
- HP-UX:*)
- f_platform=hpux-g++
- if test "$f_insttool" = NO; then
- f_insttool=/usr/bin/install
- fi
- ;;
- IRIX64:*)
- f_platform=irix-64
- ;;
- IRIX:*)
- f_platform=irix-n32
- ;;
- Linux:*|GNU:*|GNU/*:*)
- f_platform=linux-g++
- ;;
- NetBSD:*)
- f_platform=netbsd-g++
- ;;
- OpenBSD:*)
- f_platform=openbsd-g++
- ;;
- OSF1:*)
- f_platform=osf1-g++
- ;;
- QNX:*)
- f_platform=qnx-g++
- ;;
- *:3.2)
- f_platform=sco-g++
- ;;
- SunOS:4*)
- f_platform=sunos-g++
- ;;
- SunOS:5*)
- f_platform=solaris-g++
- if test "$f_insttool" = NO; then
- f_insttool=/usr/bin/install
- fi
- ;;
- ULTRIX:*)
- f_platform=ultrix-g++
- ;;
- UNIX_SV:4.2*)
- f_platform=unixware-g++
- ;;
- Cygwin:*)
- f_platform=win32-g++
- ;;
- *MiNT:*)
- f_platform=m68k-atari-mint-g++
- ;;
- *)
- echo
- echo "Your platform was not recognised by this configure script"
- echo "Please use the -platform option to specify one of platforms"
- echo "in this list:"
- echo
- for p in $f_platforms
- do
- echo " $0 $* -platform $p"
- done
- echo
- exit 2
- esac
- echo " Autodetected platform $f_platform... "
- f_plf_auto=YES
-fi
-
-if test -z "$f_docdir"; then
- f_docdir=$f_prefix/share/doc/packages/doxygen
-fi
-
-if test "$f_plf_auto" = NO; then
- echo -n " Checking for platform $f_platform... "
- if test '!' -d tmake/lib/$f_platform; then
- echo "not supported!"
- echo
- exit 2
- fi
- echo "supported"
-fi
-
-#- check for qt --------------------------------------------------------------
-
-if test "$f_wizard" = YES; then
- if test -z "$QTDIR"; then
- echo " QTDIR environment variable not set!"
- echo -n " Checking for Qt..."
- for d in /usr/{lib,share,qt}/{qt-3,qt3,qt,qt*,3}; do
- if test -d "$d/lib" -a -d "$d/include" -a -x "$d/bin/moc"; then
- QTDIR=$d
- fi
- done
- else
- echo " Detected Qt via the QTDIR environment variable..."
- echo -n " "
- fi
- if test -z "$QTDIR"; then
- echo "QTDIR not set and Qt not found at standard locations!"
- echo
- echo "tmake requires the QTDIR environment variable to be set."
- echo "check the Qt installation instructions!"
- exit 2
- else
- if test ! -d "$QTDIR/lib"; then
- echo "QTDIR is set to $QTDIR, but library directory $QTDIR/lib does not exist!"
- exit 2
- fi
- if test ! -d "$QTDIR/include"; then
- echo "QTDIR is set to $QTDIR, but include directory $QTDIR/include does not exist!"
- exit 2
- fi
- if test ! -x "$QTDIR/bin/moc"; then
- echo "QTDIR is set to $QTDIR, but the moc tool could not be found in $QTDIR/bin!"
- exit 2
- fi
- echo " headers $QTDIR/include,"
- echo " libraries $QTDIR/lib"
- if test -n "`ls $QTDIR/lib/* | grep qt-mt`"; then
- f_thread=YES
- fi
- fi
-fi
-
-# - check for make ------------------------------------------------------------
-
-echo -n " Checking for GNU make tool... "
-if test "$f_make" = NO; then
- make_names="gmake make"
- make_dirs="/usr/bin /usr/local/bin /bin /sbin $bin_dirs"
- make_prog=NO
- for i in $make_names; do
- for j in $make_dirs; do
- if test -x "$j/$i"; then
- if test -n "`$j/$i --version 2>/dev/null | grep GNU`"; then
- make_prog="$j/$i"
- break 2
- fi
- fi
- done
- done
- f_make="$make_prog"
-fi
-
-if test "$f_make" = NO; then
- echo "not found!";
- echo
- exit 2
-fi
-echo "using $f_make"
-
-# - check for install ------------------------------------------------------------
-
-echo -n " Checking for GNU install tool... "
-if test "$f_insttool" = NO; then
- install_names="ginstall install"
- install_dirs="/usr/bin /usr/local/bin /bin /sbin $bin_dirs"
- install_prog=NO
- install_found=NO
- for i in $install_names; do
- for j in $install_dirs; do
- if test -x "$j/$i"; then
- if test -n "`$j/$i --version 2>/dev/null | grep utils`"; then
- install_found=YES
- install_prog="$j/$i"
- break 2
- fi
- fi
- done
- done
- f_insttool="$install_prog"
-fi
-
-if test "$f_insttool" = NO; then
- if test "$install_found" = YES; then
- echo;
- else
- echo "not found!";
- echo
- fi
- echo "GNU version of install is required: this is part of the fileutils/coreutils package: "
- echo "see http://www.gnu.org/software/fileutils/fileutils.html"
- echo
- exit 2
-fi
-echo "using $f_insttool";
-
-
-# - check for dot ------------------------------------------------------------
-
-echo -n " Checking for dot (part of GraphViz)... "
-if test "$f_dot" = NO; then
- dot_dirs="$bin_dirs"
- dot_prog=NO
- for j in $dot_dirs; do
- if test -x "$j/dot"; then
- dot_prog="$j/dot"
- break 2
- fi
- done
- f_dot="$dot_prog"
-fi
-
-if test "$f_dot" = NO; then
- echo "not found!";
-else
- echo "using $f_dot"
-fi
-
-# - check for perl ------------------------------------------------------------
-
-echo -n " Checking for perl... "
-if test "$f_perl" = NO; then
- perl_names="perl perl5"
- perl_dirs="/usr/bin /usr/local/bin /bin /sbin $bin_dirs"
- perl_prog=NO
- perl_found=NO
- for i in $perl_names; do
- for j in $perl_dirs; do
- if test -x "$j/$i"; then
- perl_found=YES
- if $j/$i -e 'require 5.000;' 2>/dev/null ; then
- perl_prog="$j/$i"
- break 2
- fi
- fi
- done
- done
- f_perl="$perl_prog"
-fi
-
-if test "$f_perl" = NO; then
- if test "$perl_found" = YES; then
- echo "version is too old (5.000 or higher is required)."
- else
- echo "not found!";
- fi
- echo
- exit 2
-fi
-echo "using $f_perl";
-
-
-# -----------------------------------------------------------------------------
-
-test -f .makeconfig && rm .makeconfig
-test -f .tmakeconfig && rm .tmakeconfig
-
-if test -z $PWD; then
- PWD=`pwd`
-fi
-
-cat > .makeconfig <<EOF
-DOXYGEN = $PWD
-TMAKEPATH = $PWD/tmake/lib/$f_platform
-ENV = env TMAKEPATH=\$(TMAKEPATH)
-TMAKE = $PWD/tmake/bin/tmake
-MAKE = $f_make
-PERL = $f_perl
-RM = rm -f
-CP = cp
-VERSION = `cat VERSION`
-INSTALL = $f_prefix
-INSTTOOL = $f_insttool
-DOXYDOCS = ..
-DOCDIR = $f_docdir
-QTDIR = $QTDIR
-EOF
-
-if test "$f_dot" != NO; then
- cat >> .makeconfig <<EOF
-HAVE_DOT = $f_dot
-EOF
-fi
-
-if test "$f_platform" = "m68k-atari-mint-g++"; then
- cat >> .makeconfig <<EOF
-TMAKE += -unix
-EOF
-fi
-
-
-touch .tmakeconfig
-if test "$f_shared" = NO; then
- if test "$f_platform" = "osf1-cxx" -o "$f_platform" = "irix-n32"; then
- cat >> .tmakeconfig <<EOF
- TMAKE_LFLAGS += -non_shared
-EOF
- elif test "$f_platform" = "solaris-cc"; then
- cat >> .tmakeconfig <<EOF
- TMAKE_LFLAGS += -Bstatic
-EOF
- elif test "$f_platform" = "hpux-cc"; then
- cat >> .tmakeconfig <<EOF
- TMAKE_LFLAGS += -noshared
-EOF
- else
- cat >> .tmakeconfig <<EOF
- TMAKE_LFLAGS += -static
-EOF
- fi
-fi
-if test "$f_wizard" = YES; then
- cat >> .tmakeconfig <<EOF
-TMAKE_MOC = $QTDIR/bin/moc
-EOF
-fi
-
-if test "$f_english" = YES; then
- cat >> .tmakeconfig <<EOF
-TMAKE_CXXFLAGS += -DENGLISH_ONLY
-EOF
-fi
-
-f_inmakefiles="Makefile.in qtools/Makefile.in src/Makefile.in examples/Makefile.in doc/Makefile.in addon/doxywizard/Makefile.in addon/doxmlparser/src/Makefile.in addon/doxmlparser/test/Makefile.in addon/doxmlparser/examples/metrics/Makefile.in libpng/Makefile.in libmd5/Makefile.in"
-
-for i in $f_inmakefiles ; do
- SRC=$i
- DST=`echo $i|sed 's%\(.*\).in$%\1%'`
- TIME=`date`
- cat > $DST <<EOF
-#
-# This file was generated from `basename $i` on $TIME
-#
-
-EOF
- cat .makeconfig >> $DST
- if test $i = Makefile.in; then
- echo "" >> $DST
- echo "all: src/version.cpp " >> $DST
- echo " \$(MAKE) -C qtools" >> $DST
- echo " \$(MAKE) -C libpng" >> $DST
- echo " \$(MAKE) -C libmd5" >> $DST
- echo " \$(MAKE) -C src" >> $DST
- if test $f_wizard = YES; then
- echo " \$(MAKE) -C addon/doxywizard" >> $DST
- fi
- echo "" >> $DST
- echo "doxywizard_install:" >> $DST
- if test $f_wizard = YES; then
- echo " \$(MAKE) -C addon/doxywizard install" >> $DST
- fi
- echo "" >> $DST
- fi
- cat $SRC >> $DST
- echo " Created $DST from $SRC..."
-done
-
-f_inprofiles="qtools/qtools.pro.in src/libdoxygen.pro.in src/libdoxycfg.pro.in src/doxygen.pro.in src/doxytag.pro.in addon/doxywizard/doxywizard.pro.in addon/doxmlparser/src/doxmlparser.pro.in addon/doxmlparser/test/xmlparse.pro.in addon/doxmlparser/examples/metrics/metrics.pro.in libpng/libpng.pro.in libmd5/libmd5.pro.in"
-
-for i in $f_inprofiles ; do
- SRC=$i
- DST=`echo $i|sed 's%\(.*\).in$%\1%'`
- TIME=`date`
- cat > $DST <<EOF
-#
-# This file was generated from `basename $i` on $TIME
-#
-
-EOF
- if test "$f_debug" = NO; then
- realopts="release"
- else
- realopts="debug"
- fi
- if test "$f_thread" = YES; then
- realopts="$realopts thread"
- fi
- cat $SRC .tmakeconfig | sed -e "s/\$extraopts/$realopts/g" >> $DST
- echo " Created $DST from $SRC..."
-done
-
-# - generating src/lang_cfg.h
-
-if test -e "src/lang_cfg.h"; then
- chmod u+w src/lang_cfg.h # make sure file can be overwritten
-fi
-echo -n " Generating src/lang_cfg.h..."
-echo $f_langs | $f_perl -e '@l=split(/,/,<STDIN>);
- chomp @l;
- @allowed=(split(/,/,"NL,SE,CZ,FR,ID,IT,DE,JP,JE,ES,FI,RU,HR,PL,PT,HU,KR,KE,RO,SI,CN,NO,BR,DK,SK,UA,GR,TW,SR,CA,LT,ZA"));
- foreach my $elem (@l){
- $elem =~ tr/a-z/A-Z/;
- $r=0;
- foreach my $tst (@allowed){
- if ($tst eq $elem) { $r=1; last; }
- }
- if ($r!=1) { die "ERROR: Invalid language $elem was selected!\n"; }
- print "#define LANG_$elem\n";
- };' > ./src/lang_cfg.h
-echo
diff --git a/doc/.cvsignore b/doc/.cvsignore
deleted file mode 100644
index f3c7a7c..0000000
--- a/doc/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-Makefile
diff --git a/doc/Doxyfile b/doc/Doxyfile
deleted file mode 100644
index ee3eb96..0000000
--- a/doc/Doxyfile
+++ /dev/null
@@ -1,50 +0,0 @@
-#
-#
-#
-# Copyright (C) 1997-1999 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.
-
-PROJECT_NAME = "Doxygen manual"
-OUTPUT_DIRECTORY = ..
-HTML_HEADER =
-HTML_FOOTER =
-QUIET = NO
-WARNINGS = YES
-DISABLE_INDEX = YES
-EXTRACT_ALL = NO
-EXTRACT_PRIVATE = NO
-GENERATE_MAN = NO
-GENERATE_LATEX = YES
-GENERATE_HTML = YES
-GENERATE_HTMLHELP = YES
-GENERATE_RTF = NO
-GENERATE_XML = NO
-ENABLED_SECTIONS = logo_on
-ENABLE_PREPROCESSING = NO
-CASE_SENSE_NAMES = NO
-IMAGE_PATH = .
-INPUT = index.doc install.doc starting.doc docblocks.doc lists.doc \
- grouping.doc formulas.doc diagrams.doc preprocessing.doc \
- autolink.doc output.doc external.doc faq.doc trouble.doc history.doc features.doc \
- doxygen_usage.doc doxytag_usage.doc \
- doxywizard_usage.doc installdox_usage.doc \
- config.doc commands.doc htmlcmds.doc xmlcmds.doc language.doc \
- perlmod.doc perlmod_tree.doc arch.doc
-FILE_PATTERNS = *.cpp *.h *.doc
-EXAMPLE_PATH = ../examples
-RECURSIVE = NO
-TAGFILES =
-ALLEXTERNALS = NO
-PERL_PATH = /usr/local/bin/perl
-SEARCHENGINE = NO
-PDF_HYPERLINKS = YES
-USE_PDFLATEX = YES
-STRIP_CODE_COMMENTS = NO
diff --git a/doc/Makefile.in b/doc/Makefile.in
deleted file mode 100644
index a43ad24..0000000
--- a/doc/Makefile.in
+++ /dev/null
@@ -1,36 +0,0 @@
-#
-#
-#
-# Copyright (C) 1997-2004 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.
-
-all: language FORCE
- DOXYGEN_DOCDIR=$(DOXYDOCS); \
- export DOXYGEN_DOCDIR; \
- VERSION=$(VERSION) ; \
- export VERSION; \
- $(DOXYGEN)/bin/doxygen
- @rm -f ../latex/refman.tex
- @cp doxygen_logo*.gif ../html
- @cp Makefile.latex ../latex/Makefile
- @sed -e "s/\$$VERSION/$(VERSION)/g" doxygen_manual.tex >../latex/doxygen_manual.tex
- @sed -e "s/\$$VERSION/$(VERSION)/g" doxygen.sty >../latex/doxygen.sty
- @epstopdf doxygen_logo.eps --outfile=../latex/doxygen_logo.pdf
-
-clean:
- rm -rf ../html ../latex *.bak
-
-language: language.doc
-
-language.doc: $(wildcard ../src/translator*.h) maintainers.txt language.tpl translator.py
- python translator.py
-
-FORCE:
diff --git a/doc/Makefile.latex b/doc/Makefile.latex
deleted file mode 100644
index 8a47094..0000000
--- a/doc/Makefile.latex
+++ /dev/null
@@ -1,31 +0,0 @@
-#
-#
-#
-# Copyright (C) 1997-2004 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.
-
-all: doxygen_manual.pdf
-
-#doxygen_manual.pdf: doxygen_manual.ps
-# ps2pdf doxygen_manual.ps doxygen_manual.pdf
-
-#doxygen_manual.ps: doxygen_manual.dvi
-# dvips -o doxygen_manual.ps doxygen_manual.dvi
-
-doxygen_manual.pdf: doxygen_manual.tex doxygen.sty
- echo "Running latex..."
- pdflatex doxygen_manual.tex
- echo "Running makeindex..."
- makeindex doxygen_manual.idx
- echo "Rerunning latex...."
- pdflatex doxygen_manual.tex
-clean:
- rm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log doxygen_manual.pdf
diff --git a/doc/Makefile.win_make.in b/doc/Makefile.win_make.in
deleted file mode 100644
index 3d5248e..0000000
--- a/doc/Makefile.win_make.in
+++ /dev/null
@@ -1,36 +0,0 @@
-#
-#
-#
-# Copyright (C) 1997-2004 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.
-
-all: language FORCE
- @xcopy /s /q /i ..\examples ..\html\examples
- set DOXYGEN_DOCDIR=. & \
- set VERSION=$(VERSION) & \
- $(DOXYGEN)\bin\doxygen
- @del ..\latex\refman.tex
- @copy doxygen_logo*.gif ..\html
- @copy Makefile.latex ..\latex\Makefile
- @sed -e "s/\$$VERSION/$(VERSION)/g" doxygen_manual.tex >..\latex\doxygen_manual.tex
- @sed -e "s/\$$VERSION/$(VERSION)/g" doxygen.sty >..\latex\doxygen.sty
- @epstopdf doxygen_logo.eps --outfile=..\latex\doxygen_logo.pdf
-
-clean:
- del /s /q ..\html ..\latex
- del translator_report.txt *.bak
-
-language: language.doc
-
-language.doc: maintainers.txt language.tpl translator.py
- set DOXYGEN_DOCDIR=. & set VERSION=$(VERSION) & python translator.py
-
-FORCE:
diff --git a/doc/Makefile.win_nmake.in b/doc/Makefile.win_nmake.in
deleted file mode 100644
index b20bee9..0000000
--- a/doc/Makefile.win_nmake.in
+++ /dev/null
@@ -1,38 +0,0 @@
-#
-#
-#
-# Copyright (C) 1997-2004 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.
-
-all: language FORCE
- @xcopy /s /q /i ..\examples ..\html\examples
- set DOXYGEN_DOCDIR=.
- set VERSION=$(VERSION)
- $(DOXYGEN)\bin\doxygen
- @del ..\latex\refman.tex
- @copy doxygen_logo*.gif ..\html
- @copy Makefile.latex ..\latex\Makefile
- @sed -e "s/\$$VERSION/$(VERSION)/g" doxygen_manual.tex >..\latex\doxygen_manual.tex
- @sed -e "s/\$$VERSION/$(VERSION)/g" doxygen.sty >..\latex\doxygen.sty
- @epstopdf doxygen_logo.eps --outfile=..\latex\doxygen_logo.pdf
-
-clean:
- del /s /q ..\html ..\latex
- del translator_report.txt *.bak
-
-language: language.doc
-
-language.doc: maintainers.txt language.tpl translator.py
- set DOXYGEN_DOCDIR=.
- set VERSION=$(VERSION)
- python translator.py
-
-FORCE:
diff --git a/doc/arch.doc b/doc/arch.doc
deleted file mode 100644
index a5ace10..0000000
--- a/doc/arch.doc
+++ /dev/null
@@ -1,241 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-/*! \page arch Doxygen's Internals
-
-<h3>Doxygen's internals</h3>
-
-<B>Note that this section is still under construction!</B>
-
-The following picture shows how source files are processed by doxygen.
-
-\image html archoverview.gif "Data flow overview"
-\image latex archoverview.eps "Data flow overview" width=14cm
-
-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
-directly by \c doxywizard, so it is put in a separate library.
-
-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:
-\c Config_getBool("GENERATE_TESTLIST") returns a reference to a boolean
-value that is \c TRUE if the test list was enabled in the config file.
-
-The function \c readConfiguration() in \c src/doxygen.cpp
-reads the command line options and then calls the configuration parser.
-
-<h3>C Preprocessor</h3>
-
-The input files mentioned in the config file are (by default) fed to the
-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
-function parameters for instance.
-
-Another difference is that the preprocessor parses, but not actually includes
-code when it encounters a \#include (with the exception of \#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.
-
-The preprocessor is written using \c flex and can be found in
-\c src/pre.l. For condition blocks (\#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
-to a character buffer. The format of the character buffer is
-
-\verbatim
-0x06 file name 1
-0x06 preprocessed contents of file 1
-...
-0x06 file name n
-0x06 preprocessed contents of file n
-\endverbatim
-
-<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 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.
- - Parse defines (these are currently gathered by the preprocessor, and
- ignored by the language parser).
-
-<h3>Data organizer</h3>
-
-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.
-
-Each step has a function defined in \c src/doxygen.cpp, which operates
-on the tree of entries, built during language parsing. Look at the
-"Gathering information" part of \c parseInput() for details.
-
-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 ),
-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.
-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.
-
-<h3>Documentation parser</h3>
-
-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
-generators.
-
-The parser is written in C++ and can be found in src/docparser.cpp. The
-tokens that are eaten by the parser come from 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
-commands \c validatingParseText() is used.
-
-<h3>Source parser</h3>
-
-If source browsing is enabled or if code fragments are encountered in the
-documentation, the source parser is invoked.
-
-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()
-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
-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,
-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
-\c OutputList::popGeneratorState() are used to temporarily save the
-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,
-could extract information from the XML output. Possible tools could be:
-- an interactive source browser
-- a class diagram generator
-- computing code metrics.
-
-<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 man page)
-and to understand what it is doing when \c flex is parsing some input.
-Fortunately, when 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.
-
-To make it easier to toggle debug information for a given flex file I
-wrote the following perl script, which automatically adds or removes -d
-from the correct line in the Makefile:
-
-\verbatim
-#!/usr/local/bin/perl
-
-$file = shift @ARGV;
-print "Toggle debugging mode for $file\n";
-
-# add or remove the -d flex flag in the makefile
-unless (rename "Makefile.libdoxygen","Makefile.libdoxygen.old") {
- print STDERR "Error: cannot rename Makefile.libdoxygen!\n";
- exit 1;
-}
-if (open(F,"<Makefile.libdoxygen.old")) {
- unless (open(G,">Makefile.libdoxygen")) {
- print STDERR "Error: opening file Makefile.libdoxygen for writing\n";
- exit 1;
- }
- print "Processing Makefile.libdoxygen...\n";
- while (<F>) {
- if ( s/\(LEX\) -P([a-zA-Z]+)YY -t $file/(LEX) -d -P\1YY -t $file/g ) {
- print "Enabling debug info for $file\n";
- }
- elsif ( s/\(LEX\) -d -P([a-zA-Z]+)YY -t $file/(LEX) -P\1YY -t $file/g ) {
- print "Disabling debug info for $file\n";
- }
- print G "$_";
- }
- close F;
- unlink "Makefile.libdoxygen.old";
-}
-else {
- print STDERR "Warning file Makefile.libdoxygen.old does not exist!\n";
-}
-
-# touch the file
-$now = time;
-utime $now, $now, $file
-\endverbatim
-
-*/
-
-
diff --git a/doc/archoverview.eps b/doc/archoverview.eps
deleted file mode 100644
index b41d36c..0000000
--- a/doc/archoverview.eps
+++ /dev/null
@@ -1,380 +0,0 @@
-%!PS-Adobe-2.0 EPSF-2.0
-%%Title: archoverview.eps
-%%Creator: fig2dev Version 3.2 Patchlevel 1
-%%CreationDate: Sat Sep 8 19:41:40 2001
-%%For: root@blizzard (root)
-%%Orientation: Portrait
-%%BoundingBox: 0 0 733 511
-%%Pages: 0
-%%BeginSetup
-%%EndSetup
-%%Magnification: 1.0000
-%%EndComments
-/$F2psDict 200 dict def
-$F2psDict begin
-$F2psDict /mtrx matrix put
-/col-1 {0 setgray} bind def
-/col0 {0.000 0.000 0.000 srgb} bind def
-/col1 {0.000 0.000 1.000 srgb} bind def
-/col2 {0.000 1.000 0.000 srgb} bind def
-/col3 {0.000 1.000 1.000 srgb} bind def
-/col4 {1.000 0.000 0.000 srgb} bind def
-/col5 {1.000 0.000 1.000 srgb} bind def
-/col6 {1.000 1.000 0.000 srgb} bind def
-/col7 {1.000 1.000 1.000 srgb} bind def
-/col8 {0.000 0.000 0.560 srgb} bind def
-/col9 {0.000 0.000 0.690 srgb} bind def
-/col10 {0.000 0.000 0.820 srgb} bind def
-/col11 {0.530 0.810 1.000 srgb} bind def
-/col12 {0.000 0.560 0.000 srgb} bind def
-/col13 {0.000 0.690 0.000 srgb} bind def
-/col14 {0.000 0.820 0.000 srgb} bind def
-/col15 {0.000 0.560 0.560 srgb} bind def
-/col16 {0.000 0.690 0.690 srgb} bind def
-/col17 {0.000 0.820 0.820 srgb} bind def
-/col18 {0.560 0.000 0.000 srgb} bind def
-/col19 {0.690 0.000 0.000 srgb} bind def
-/col20 {0.820 0.000 0.000 srgb} bind def
-/col21 {0.560 0.000 0.560 srgb} bind def
-/col22 {0.690 0.000 0.690 srgb} bind def
-/col23 {0.820 0.000 0.820 srgb} bind def
-/col24 {0.500 0.190 0.000 srgb} bind def
-/col25 {0.630 0.250 0.000 srgb} bind def
-/col26 {0.750 0.380 0.000 srgb} bind def
-/col27 {1.000 0.500 0.500 srgb} bind def
-/col28 {1.000 0.630 0.630 srgb} bind def
-/col29 {1.000 0.750 0.750 srgb} bind def
-/col30 {1.000 0.880 0.880 srgb} bind def
-/col31 {1.000 0.840 0.000 srgb} bind def
-
-end
-save
--31.0 537.0 translate
-1 -1 scale
-
-/cp {closepath} bind def
-/ef {eofill} bind def
-/gr {grestore} bind def
-/gs {gsave} bind def
-/sa {save} bind def
-/rs {restore} bind def
-/l {lineto} bind def
-/m {moveto} bind def
-/rm {rmoveto} bind def
-/n {newpath} bind def
-/s {stroke} bind def
-/sh {show} bind def
-/slc {setlinecap} bind def
-/slj {setlinejoin} bind def
-/slw {setlinewidth} bind def
-/srgb {setrgbcolor} bind def
-/rot {rotate} bind def
-/sc {scale} bind def
-/sd {setdash} bind def
-/ff {findfont} bind def
-/sf {setfont} bind def
-/scf {scalefont} bind def
-/sw {stringwidth} bind def
-/tr {translate} bind def
-/tnt {dup dup currentrgbcolor
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
- bind def
-/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
- 4 -2 roll mul srgb} bind def
- /DrawEllipse {
- /endangle exch def
- /startangle exch def
- /yrad exch def
- /xrad exch def
- /y exch def
- /x exch def
- /savematrix mtrx currentmatrix def
- x y tr xrad yrad sc 0 0 1 startangle endangle arc
- closepath
- savematrix setmatrix
- } def
-
-/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
-/$F2psEnd {$F2psEnteredState restore end} def
-%%EndProlog
-
-$F2psBegin
-10 setmiterlimit
-n -1000 9949 m -1000 -1000 l 13719 -1000 l 13719 9949 l cp clip
- 0.06000 0.06000 sc
-7.500 slw
-% Ellipse
-n 4425 1725 900 900 0 360 DrawEllipse gs col0 s gr
-
-% Ellipse
-n 5100 4200 900 900 0 360 DrawEllipse gs col0 s gr
-
-% Ellipse
-n 10500 4275 900 900 0 360 DrawEllipse gs col0 s gr
-
-% Ellipse
-n 2402 4198 900 900 0 360 DrawEllipse gs col0 s gr
-
-% Ellipse
-n 7863 8104 837 837 0 360 DrawEllipse gs col0 s gr
-
-% Ellipse
-n 5113 6622 887 887 0 360 DrawEllipse gs col0 s gr
-
-% Ellipse
-n 9375 6450 837 837 0 360 DrawEllipse gs col0 s gr
-
-% Ellipse
-n 7800 4200 900 900 0 360 DrawEllipse gs col0 s gr
-
-% Polyline
-gs clippath
-1380 4170 m 1500 4200 l 1380 4230 l 1515 4230 l 1515 4170 l cp
-clip
-n 600 4200 m 1500 4200 l gs col0 s gr gr
-
-% arrowhead
-n 1380 4170 m 1500 4200 l 1380 4230 l 1380 4200 l 1380 4170 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-4080 4170 m 4200 4200 l 4080 4230 l 4215 4230 l 4215 4170 l cp
-clip
-n 3300 4200 m 4200 4200 l gs col0 s gr gr
-
-% arrowhead
-n 4080 4170 m 4200 4200 l 4080 4230 l 4080 4200 l 4080 4170 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-9480 4170 m 9600 4200 l 9480 4230 l 9615 4230 l 9615 4170 l cp
-clip
-n 8700 4200 m 9600 4200 l gs col0 s gr gr
-
-% arrowhead
-n 9480 4170 m 9600 4200 l 9480 4230 l 9480 4200 l 9480 4170 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-11881 3482 m 12000 3450 l 11910 3535 l 12028 3469 l 11999 3416 l cp
-clip
-n 11325 3825 m 12000 3450 l gs col0 s gr gr
-
-% arrowhead
-n 11881 3482 m 12000 3450 l 11910 3535 l 11895 3508 l 11881 3482 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-11876 4050 m 12000 4050 l 11891 4108 l 12022 4075 l 12007 4017 l cp
-clip
-n 11400 4200 m 12000 4050 l gs col0 s gr gr
-
-% arrowhead
-n 11876 4050 m 12000 4050 l 11891 4108 l 11884 4079 l 11876 4050 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-11900 5028 m 12000 5100 l 11877 5083 l 12003 5133 l 12025 5078 l cp
-clip
-n 11250 4800 m 12000 5100 l gs col0 s gr gr
-
-% arrowhead
-n 11900 5028 m 12000 5100 l 11877 5083 l 11889 5055 l 11900 5028 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-11891 4517 m 12000 4575 l 11876 4575 l 12007 4608 l 12022 4550 l cp
-clip
-n 11400 4425 m 12000 4575 l gs col0 s gr gr
-
-% arrowhead
-n 11891 4517 m 12000 4575 l 11876 4575 l 11884 4546 l 11891 4517 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-11880 2820 m 12000 2850 l 11880 2880 l 12015 2880 l 12015 2820 l cp
-clip
-n 7800 3300 m 7800 2850 l 12000 2850 l gs col0 s gr gr
-
-% arrowhead
-n 11880 2820 m 12000 2850 l 11880 2880 l 11880 2850 l 11880 2820 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-10470 5295 m 10500 5175 l 10530 5295 l 10530 5160 l 10470 5160 l cp
-clip
-n 8700 8100 m 10500 8100 l 10500 5175 l gs col0 s gr gr
-
-% arrowhead
-n 10470 5295 m 10500 5175 l 10530 5295 l 10500 5295 l 10470 5295 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-4455 705 m 4425 825 l 4395 705 l 4395 840 l 4455 840 l cp
-clip
-n 4425 450 m 4425 825 l gs col0 s gr gr
-
-% arrowhead
-n 4455 705 m 4425 825 l 4395 705 l 4425 705 l 4455 705 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
- [60] 0 sd
-gs clippath
-3405 1695 m 3525 1725 l 3405 1755 l 3540 1755 l 3540 1695 l cp
-clip
-n 3525 1725 m 2400 1725 l 2400 3300 l gs col0 s gr gr
- [] 0 sd
-% arrowhead
-n 3405 1695 m 3525 1725 l 3405 1755 l 3405 1725 l 3405 1695 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
- [60] 0 sd
-gs clippath
-5445 1680 m 5325 1650 l 5445 1620 l 5310 1620 l 5310 1680 l cp
-clip
-n 5325 1650 m 7575 1650 l 7575 3300 l gs col0 s gr gr
- [] 0 sd
-% arrowhead
-n 5445 1680 m 5325 1650 l 5445 1620 l 5445 1650 l 5445 1680 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
- [60] 0 sd
-gs clippath
-4845 2670 m 4875 2550 l 4905 2670 l 4905 2535 l 4845 2535 l cp
-clip
-n 4875 2550 m 4875 3300 l gs col0 s gr gr
- [] 0 sd
-% arrowhead
-n 4845 2670 m 4875 2550 l 4905 2670 l 4875 2670 l 4845 2670 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
- [60] 0 sd
-n 7575 1650 m 10500 1650 l 10500 3375 l gs col0 s gr [] 0 sd
-% Polyline
-gs clippath
-6930 8070 m 7050 8100 l 6930 8130 l 7065 8130 l 7065 8070 l cp
-clip
-n 2400 5100 m 2400 8100 l 7050 8100 l gs col0 s gr gr
-
-% arrowhead
-n 6930 8070 m 7050 8100 l 6930 8130 l 6930 8100 l 6930 8070 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-6780 4170 m 6900 4200 l 6780 4230 l 6915 4230 l 6915 4170 l cp
-clip
-n 6000 4200 m 6900 4200 l gs col0 s gr gr
-
-% arrowhead
-n 6780 4170 m 6900 4200 l 6780 4230 l 6780 4200 l 6780 4170 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-7090 4932 m 7200 4875 l 7130 4977 l 7231 4887 l 7191 4843 l cp
-clip
-n 5850 6075 m 7200 4875 l gs col0 s gr gr
-
-% arrowhead
-n 7090 4932 m 7200 4875 l 7130 4977 l 7110 4955 l 7090 4932 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-7830 7155 m 7800 7275 l 7770 7155 l 7770 7290 l 7830 7290 l cp
-clip
-n 7800 7275 m 7800 5100 l gs col0 s gr gr
-
-% arrowhead
-n 7830 7155 m 7800 7275 l 7770 7155 l 7800 7155 l 7830 7155 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-8886 5583 m 8925 5700 l 8835 5615 l 8908 5729 l 8958 5697 l cp
-clip
-n 8400 4875 m 8925 5700 l gs col0 s gr gr
-
-% arrowhead
-n 8886 5583 m 8925 5700 l 8835 5615 l 8861 5599 l 8886 5583 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-8575 7427 m 8475 7500 l 8529 7389 l 8442 7492 l 8488 7531 l cp
-clip
-n 8850 7050 m 8475 7500 l gs col0 s gr gr
-
-% arrowhead
-n 8575 7427 m 8475 7500 l 8529 7389 l 8552 7408 l 8575 7427 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-10106 5255 m 10200 5175 l 10155 5290 l 10233 5180 l 10184 5145 l cp
-clip
-n 9825 5700 m 10200 5175 l gs col0 s gr gr
-
-% arrowhead
-n 10106 5255 m 10200 5175 l 10155 5290 l 10130 5273 l 10106 5255 l cp gs 0.00 setgray ef gr col0 s
-/Helvetica ff 180.00 scf sf
-3900 1725 m
-gs 1 -1 sc (Config parser) col0 sh gr
-/Helvetica ff 180.00 scf sf
-4425 4275 m
-gs 1 -1 sc (Language parser) col0 sh gr
-/Helvetica ff 180.00 scf sf
-1725 4275 m
-gs 1 -1 sc (C Preprocessor) col0 sh gr
-/Helvetica ff 180.00 scf sf
-12150 3525 m
-gs 1 -1 sc (HTML) col0 sh gr
-/Helvetica ff 180.00 scf sf
-12150 4125 m
-gs 1 -1 sc (LaTeX) col0 sh gr
-/Helvetica ff 180.00 scf sf
-12150 4650 m
-gs 1 -1 sc (RTF) col0 sh gr
-/Helvetica ff 180.00 scf sf
-12150 2925 m
-gs 1 -1 sc (XML) col0 sh gr
-/Helvetica ff 180.00 scf sf
-3450 4500 m
-gs 1 -1 sc (input) col0 sh gr
-/Helvetica ff 180.00 scf sf
-3450 4725 m
-gs 1 -1 sc (string) col0 sh gr
-/Helvetica ff 180.00 scf sf
-6150 4500 m
-gs 1 -1 sc (entry) col0 sh gr
-/Helvetica ff 180.00 scf sf
-6150 4725 m
-gs 1 -1 sc (tree) col0 sh gr
-/Helvetica ff 180.00 scf sf
-525 3975 m
-gs 1 -1 sc (input files) col0 sh gr
-/Helvetica ff 180.00 scf sf
-12150 5175 m
-gs 1 -1 sc (Man) col0 sh gr
-/Helvetica ff 180.00 scf sf
-4650 750 m
-gs 1 -1 sc (config file) col0 sh gr
-/Helvetica ff 180.00 scf sf
-7950 5475 m
-gs 1 -1 sc (drives) col0 sh gr
-/Helvetica ff 180.00 scf sf
-8850 4050 m
-gs 1 -1 sc (drives) col0 sh gr
-/Helvetica ff 180.00 scf sf
-2475 3150 m
-gs 1 -1 sc (get settings) col0 sh gr
-/Helvetica ff 180.00 scf sf
-6675 5550 m
-gs 1 -1 sc (entry) col0 sh gr
-/Helvetica ff 180.00 scf sf
-6675 5775 m
-gs 1 -1 sc (tree) col0 sh gr
-/Helvetica ff 180.00 scf sf
-9525 5325 m
-gs 1 -1 sc (drives) col0 sh gr
-/Helvetica ff 180.00 scf sf
-8700 7500 m
-gs 1 -1 sc (drives) col0 sh gr
-/Helvetica ff 180.00 scf sf
-4575 6675 m
-gs 1 -1 sc (tag file parser) col0 sh gr
-/Helvetica ff 180.00 scf sf
-8925 6525 m
-gs 1 -1 sc (Doc Parser) col0 sh gr
-/Helvetica ff 180.00 scf sf
-7275 8175 m
-gs 1 -1 sc (Source Parser) col0 sh gr
-/Helvetica ff 180.00 scf sf
-7200 4275 m
-gs 1 -1 sc (Data organiser) col0 sh gr
-/Helvetica ff 180.00 scf sf
-9750 4275 m
-gs 1 -1 sc (Output generators) col0 sh gr
-/Helvetica ff 180.00 scf sf
-8775 8325 m
-gs 1 -1 sc (drives) col0 sh gr
-$F2psEnd
-rs
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/autolink.doc b/doc/autolink.doc
deleted file mode 100644
index 1dbeda7..0000000
--- a/doc/autolink.doc
+++ /dev/null
@@ -1,121 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-/*! \page autolink Automatic link generation
-
- Most documentation systems have special `see also' sections where links
- to other pieces of documentation can be inserted.
- Although doxygen also has a command to start such a section (See section
- \ref cmdsa "\\sa"), it does allow you to put these kind of links anywhere in the
- documentation.
- For \f$\mbox{\LaTeX}\f$ documentation a reference to the page number
- is written instead of a link. Furthermore, the index at the end of the
- document can be used to quickly find the documentation of a member, class,
- namespace or file.
- For man pages no reference information is generated.
-
- The next sections show how to generate links to the various documented
- entities in a source file.
-
- \section linkurl Links to web pages and mail addresses
-
- Doxygen will automatically replace any URLs and mail addresses found in the
- documentation by links (in HTML).
-
- \section linkclass Links to classes.
-
- All words in the documentation that correspond to a documented class
- will automatically be replaced by a link to the page containing the
- documentation of the class. If you want to prevent that a word
- that corresponds to a documented class is replaced by a link you
- should put a \% in front of the word.
-
- \section linkfile Links to files.
-
- All words that contain a dot (<tt>.</tt>) that is not the last character
- in the word are considered to be file names.
- If the word is indeed the name of a documented input file, a link will
- automatically be created to the documentation of that file.
-
- \section linkfunc Links to functions.
-
- Links to functions are created if one of the following patterns is
- encountered:
- <ol>
- <li><tt>\<functionName\>"("\<argument-list\>")"</tt>
- <li><tt>\<functionName\>"()"</tt>
- <li><tt>"::"\<functionName\></tt>
- <li><tt>(\<className\>"::")<sup>n</sup>\<functionName\>"("\<argument-list\>")"</tt>
- <li><tt>(\<className\>"::")<sup>n</sup>\<functionName\>"()"</tt>
- <li><tt>(\<className\>"::")<sup>n</sup>\<functionName\></tt>
- </ol>
- where n\>0.
-
- \par Note 1:
- The patterns above should not contain spaces, tabs or newlines.
- \par Note 2:
- For JavaDoc compatibility a \# may be used instead of a :: in
- the patterns above.
- \par Note 3:
- In the documentation of a class containing a member foo,
- a reference to a global variable is made using ::foo, whereas \#foo
- will link to the member.
-
- For non overloaded members the argument list may be omitted.
-
- If a function is overloaded and no matching argument list is specified
- (i.e. pattern 2 or 5 is used), a link will be created to the
- documentation of one of the overloaded members.
-
- For member functions the class scope (as used in patterns 4 to 6) may
- be omitted, if:
- <ol>
- <li>The pattern points to a documented member that belongs to the same class
- as the documentation block that contains the pattern.
- <li>The class that corresponds to the documentation blocks that contains
- the pattern has a base class that contains a documented member
- that matches the pattern.
- </ol>
-
- \section linkother Links to variables, typedefs, enum types, enum values and defines.
-
- All of these entities can be linked to in the same way as described in the
- previous section. For sake of clarity it is advised to only use
- patterns 3 and 6 in this case.
-
- \par Example:
- \verbinclude autolink.cpp
- \htmlonly
- Click <a href="$(DOXYGEN_DOCDIR)/examples/autolink/html/index.html">here</a>
- for the corresponding HTML documentation that is generated by Doxygen.
- \endhtmlonly
-
- \section resolving typedefs.
-
- Typedefs that involve classes, structs and unions, like
-\verbatim
-typedef struct StructName TypeName
-\endverbatim
- create an alias for StructName, so links will be generated to StructName,
- when either StructName itself or TypeName is encountered.
-
- \par Example:
- \verbinclude restypedef.cpp
- \htmlonly
- Click <a href="$(DOXYGEN_DOCDIR)/examples/restypedef/html/restypedef_8cpp.html">here</a>
- for the corresponding HTML documentation that is generated by Doxygen.
- \endhtmlonly
-*/
diff --git a/doc/commands.doc b/doc/commands.doc
deleted file mode 100644
index 391e4f7..0000000
--- a/doc/commands.doc
+++ /dev/null
@@ -1,2204 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-/*! \page commands Special Commands
-
-\section cmd_intro Introduction
-
-All commands in the documentation start with a backslash (<b>\\</b>) or an
-at-sign (<b>\@</b>). If you prefer you can replace all commands starting with a
-backslash below by their counterparts that start with an at-sign.
-
-Some commands have one or more arguments.
-Each argument has a certain range:
-<ul>
-<li>If \<sharp\> braces are used the argument is a single word.
-<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.
-</ul>
-If [square] brackets are used the argument is optional.
-
-Here is an alphabetically sorted list of all commands with references to their
-documentation:
-\secreflist
-\refitem cmda \\a
-\refitem cmdaddindex \\addindex
-\refitem cmdaddtogroup \\addtogroup
-\refitem cmdanchor \\anchor
-\refitem cmdarg \\arg
-\refitem cmdattention \\attention
-\refitem cmdauthor \\author
-\refitem cmdb \\b
-\refitem cmdbrief \\brief
-\refitem cmdbug \\bug
-\refitem cmdc \\c
-\refitem cmdcallgraph \\callgraph
-\refitem cmdcategory \\category
-\refitem cmdclass \\class
-\refitem cmdcode \\code
-\refitem cmdcond \\cond
-\refitem cmdcopydoc \\copydoc
-\refitem cmddate \\date
-\refitem cmddef \\def
-\refitem cmddefgroup \\defgroup
-\refitem cmddeprecated \\deprecated
-\refitem cmddir \\dir
-\refitem cmddontinclude \\dontinclude
-\refitem cmddot \\dot
-\refitem cmddotfile \\dotfile
-\refitem cmde \\e
-\refitem cmdelse \\else
-\refitem cmdelseif \\elseif
-\refitem cmdem \\em
-\refitem cmdendcode \\endcode
-\refitem cmdendcond \\endcond
-\refitem cmdenddot \\enddot
-\refitem cmdendhtmlonly \\endhtmlonly
-\refitem cmdendif \\endif
-\refitem cmdendlatexonly \\endlatexonly
-\refitem cmdendlink \\endlink
-\refitem cmdendmanonly \\endmanonly
-\refitem cmdendverbatim \\endverbatim
-\refitem cmdendxmlonly \\endxmlonly
-\refitem cmdenum \\enum
-\refitem cmdexample \\example
-\refitem cmdexception \\exception
-\refitem cmdfdollar \\f\$
-\refitem cmdfbropen \\f[
-\refitem cmdfbrclose \\f]
-\refitem cmdfile \\file
-\refitem cmdfn \\fn
-\refitem cmdhideinitializer \\hideinitializer
-\refitem cmdhtmlinclude \\htmlinclude
-\refitem cmdhtmlonly \\htmlonly
-\refitem cmdif \\if
-\refitem cmdifnot \\ifnot
-\refitem cmdimage \\image
-\refitem cmdinclude \\include
-\refitem cmdincludelineno \\includelineno
-\refitem cmdingroup \\ingroup
-\refitem cmdinternal \\internal
-\refitem cmdinvariant \\invariant
-\refitem cmdinterface \\interface
-\refitem cmdlatexonly \\latexonly
-\refitem cmdli \\li
-\refitem cmdline \\line
-\refitem cmdlink \\link
-\refitem cmdmainpage \\mainpage
-\refitem cmdmanonly \\manonly
-\refitem cmdn \\n
-\refitem cmdname \\name
-\refitem cmdnamespace \\namespace
-\refitem cmdnosubgrouping \\nosubgrouping
-\refitem cmdnote \\note
-\refitem cmdoverload \\overload
-\refitem cmdp \\p
-\refitem cmdpackage \\package
-\refitem cmdpage \\page
-\refitem cmdpar \\par
-\refitem cmdparagraph \\paragraph
-\refitem cmdparam \\param
-\refitem cmdpost \\post
-\refitem cmdpre \\pre
-\refitem cmd_php_only \\private (PHP only)
-\refitem cmd_php_only \\privatesection (PHP only)
-\refitem cmdproperty \\property
-\refitem cmd_php_only \\protected (PHP only)
-\refitem cmd_php_only \\protectedsection (PHP only)
-\refitem cmdprotocol \\protocol
-\refitem cmd_php_only \\public (PHP only)
-\refitem cmd_php_only \\publicsection (PHP only)
-\refitem cmdref \\ref
-\refitem cmdrelates \\relates
-\refitem cmdrelatesalso \\relatesalso
-\refitem cmdremarks \\remarks
-\refitem cmdreturn \\return
-\refitem cmdretval \\retval
-\refitem cmdsa \\sa
-\refitem cmdsection \\section
-\refitem cmdsee \\see
-\refitem cmdshowinitializer \\showinitializer
-\refitem cmdsince \\since
-\refitem cmdskip \\skip
-\refitem cmdskipline \\skipline
-\refitem cmdstruct \\struct
-\refitem cmdsubpage \\subpage
-\refitem cmdsubsection \\subsection
-\refitem cmdsubsubsection \\subsubsection
-\refitem cmdtest \\test
-\refitem cmdthrow \\throw
-\refitem cmdtodo \\todo
-\refitem cmdtypedef \\typedef
-\refitem cmdunion \\union
-\refitem cmduntil \\until
-\refitem cmdvar \\var
-\refitem cmdverbatim \\verbatim
-\refitem cmdverbinclude \\verbinclude
-\refitem cmdversion \\version
-\refitem cmdwarning \\warning
-\refitem cmdweakgroup \\weakgroup
-\refitem cmdxmlonly \\xmlonly
-\refitem cmdxrefitem \\xrefitem
-\refitem cmddollar \\\$
-\refitem cmdat \\\@
-\refitem cmdbackslash \\\\
-\refitem cmdamp \\\&
-\refitem cmdtilde \\~
-\refitem cmdlt \\\<
-\refitem cmdgt \\\>
-\refitem cmdhash \\\#
-\refitem cmdperc \\\%
-\endsecreflist
-
-The following subsections provide a list of all commands that are recognized by
-doxygen. Unrecognized commands are treated as normal text.
-
-<h2>\htmlonly <center> --- \endhtmlonly
- Structural indicators
- \htmlonly --- </center>\endhtmlonly</h2>
-
-\section cmdaddtogroup \\addtogroup <name> [(title)]
- \addindex \\addtogroup
- Defines a group just like \ref cmddefgroup "\\defgroup", but in contrast to
- that command using the same \<name\> more than once will not result in a warning,
- but rather one group with a merged documentation and the first title found in
- any of the commands.
-
- The title is optional, so this command can also be used to add a number of
- entities to an existing group using \@{ and \@} like this:
-
-\verbatim
- /*! \addtogroup mygrp
- * Additional documentation for group `mygrp'
- * @{
- */
-
- /*!
- * A function
- */
- void func1()
- {
- }
-
- /*! Another function */
- void func2()
- {
- }
-
- /*! @} */
-\endverbatim
-
- \sa page \ref grouping "Grouping", sections \ref cmddefgroup "\\defgroup", \ref cmdingroup "\\ingroup" and
- \ref cmdweakgroup "\\weakgroup".
-
-\section cmdcallgraph \\callgraph
-
- \addindex \\callgraph
- When this command is put in a comment block of a function or method
- and \ref cfg_have_dot "HAVE_DOT" is set to YES, then doxygen will
- generate a call graph for that function (provided the implementation of the
- function or method calls other documented functions). The call graph will
- generated regardless of the value of \ref cfg_call_graph "CALL_GRAPH".
- \note The completeness (and correctness) of the call graph depends on the
- doxygen code parser which is not perfect.
-
-<hr>
-\section cmdcategory \\category <name> [<header-file>] [<header-name>]
-
- \addindex \\category
- For Objective-C only: Indicates that a comment block contains documentation
- for a class category with name \<name\>. The arguments are
- equal to the \\class command.
-
- \sa section \ref cmdclass "\\class".
-
-<hr>
-\section cmdclass \\class <name> [<header-file>] [<header-name>]
-
- \addindex \\class
- Indicates that a comment block contains documentation for a
- class with name \<name\>. Optionally a header file and a header name
- can be specified. If the header-file is specified, a link to a verbatim copy
- of the header will be included in the HTML documentation.
- The \<header-name\> argument can be used to overwrite the
- name of the link that is used in the class documentation to something other
- than \<header-file\>. This can be useful if the include name is not located
- on the default include path (like \<X11/X.h\>). With the \<header-name\>
- argument you can also specify how the include statement should look like,
- by adding either quotes or sharp brackets around the name.
- Sharp brackets are used if just the name is given.
-
- \par Example:
- \verbinclude class.h
- \htmlonly
- Click <a href="$(DOXYGEN_DOCDIR)/examples/class/html/index.html">here</a>
- for the corresponding HTML documentation that is generated by doxygen.
- \endhtmlonly
-
-<hr>
-\section cmddef \\def <name>
-
- \addindex \\def
- Indicates that a comment block contains documentation for a
- \c \#define macro.
-
- \par Example:
- \verbinclude define.h
- \htmlonly
- Click <a href="$(DOXYGEN_DOCDIR)/examples/define/html/define_8h.html">here</a>
- for the corresponding HTML documentation that is generated by doxygen.
- \endhtmlonly
-
-<hr>
-\section cmddefgroup \\defgroup <name> (group title)
-
- \addindex \\defgroup
- Indicates that a comment block contains documentation for a
- \ref modules "group" of classes, files or namespaces. This can be used to
- categorize classes, files or namespaces, and document those
- categories. You can also use groups as members of other groups,
- thus building a hierarchy of groups.
-
- The \<name\> argument should be a single-word identifier.
-
- \sa page \ref grouping "Grouping", sections \ref cmdingroup "\\ingroup", \ref cmdaddtogroup "\\addtogroup",
- \ref cmdweakgroup "\\weakgroup".
-
-<hr>
-\section cmddir \\dir [<path fragment>]
-
- \addindex \\dir
- Indicates that a comment block contains documentation for a directory.
- The "path fragment" argument should include the directory name and
- enough of the path to be unique w.r.t. the other directories in the project.
- The \ref cfg_show_dirs "SHOW_DIRECTORIES" option determines whether
- or not the directory information is shown and the
- \ref cfg_strip_from_path "STRIP_FROM_PATH" option determines what is
- stripped from the full path before it appears in the output.
-
-<hr>
-
-\section cmdenum \\enum <name>
-
- \addindex \\enum
- Indicates that a comment block contains documentation for an
- enumeration, with name \<name\>. If the enum is a member of a class and
- the documentation block is located outside the class definition,
- the scope of the class should be specified as well.
- If a comment block is located directly in front of an enum declaration,
- the \\enum comment may be omitted.
-
- \par Note:
- The type of an anonymous enum cannot be documented, but the values
- of an anonymous enum can.
-
- \par Example:
- \verbinclude enum.h
- \htmlonly
- Click <a href="$(DOXYGEN_DOCDIR)/examples/enum/html/class_test.html">here</a>
- for the corresponding HTML documentation that is generated by doxygen.
- \endhtmlonly
-
-<hr>
-\section cmdexample \\example <file-name>
-
- \addindex \\example
- Indicates that a comment block contains documentation for a source code
- example. The name of the source file is \<file-name\>. The text of
- this file will be included in the documentation, just after the
- documentation contained in the comment block. All examples are placed
- in a list. The source code is scanned for documented members and classes.
- If any are found, the names are cross-referenced with the documentation.
- Source files or directories can be specified using the
- \ref cfg_example_path "EXAMPLE_PATH"
- tag of doxygen's configuration file.
-
- If \<file-name\> itself is not unique for the set of example files specified
- by the
- \ref cfg_example_path "EXAMPLE_PATH" tag, you can include part of the absolute path
- to disambiguate it.
-
- If more that one source file is needed for the example,
- the \\include command can be used.
-
- \par Example:
- \verbinclude example.cpp
- Where the example file \c example_test.cpp looks as follows:
- \verbinclude example_test.cpp
- \htmlonly
- Click <a href="$(DOXYGEN_DOCDIR)/examples/example/html/examples.html">here</a>
- for the corresponding HTML documentation that is generated by doxygen.
- \endhtmlonly
-
- \sa section \ref cmdinclude "\\include".
-
-<hr>
-\section cmdfile \\file [<name>]
-
- \addindex \\file
- Indicates that a comment block contains documentation for a source or
- header file with name \<name\>. The file name may include (part of) the
- path if the file-name alone is not unique. If the file name is omitted
- (i.e. the line after \\file is left blank) then the documentation block that
- contains the \\file command will belong to the file it is located in.
-
- \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.
-
- \par Example:
- \verbinclude file.h
- \htmlonly
- Click <a href="$(DOXYGEN_DOCDIR)/examples/file/html/file_8h.html">here</a>
- for the corresponding HTML documentation that is generated by doxygen.
- \endhtmlonly
-
- \note In the above example \ref cfg_javadoc_autobrief "JAVADOC_AUTOBRIEF"
- has been set to YES in the configuration file.
-
-<hr>
-\section cmdfn \\fn (function declaration)
-
- \addindex \\fn
- Indicates that a comment block contains documentation for a function
- (either global or as a member of a class). This command is \em only
- needed if a comment block is \e not placed in front (or behind)
- the function declaration or definition.
-
- If your comment block \e is in front of the function
- declaration or definition this command can (and to avoid redundancy
- should) be omitted.
-
- A full function declaration including arguments should be specified after the
- \\fn command on a \e single line, since the argument ends at the end
- of the line!
-
- \warning Do not use this command
- if it is not absolutely needed, since it will lead to duplication of
- information and thus to errors.
-
- \par Example:
- \verbinclude func.h
- \htmlonly
- Click <a href="$(DOXYGEN_DOCDIR)/examples/func/html/class_test.html">here</a>
- for the corresponding HTML documentation that is generated by doxygen.
- \endhtmlonly
-
-
- \sa section \ref cmdvar "\\var" and \ref cmdtypedef "\\typedef".
-
-<hr>
-\section cmdhideinitializer \\hideinitializer
-
- \addindex \\hideinitializer
- By default the value of a define and the initializer of a variable
- are displayed unless they are longer than 30 lines. By putting
- this command in a comment block of a define or variable, the
- initializer is always hidden.
-
- \sa section \ref cmdshowinitializer "\\showinitializer".
-
-<hr>
-\section cmdingroup \\ingroup (<groupname> [<groupname> <groupname>])
-
- \addindex \\ingroup
- If the \\ingroup command is placed in a comment block of a
- class, file or namespace, then it will be added to the group or
- groups identified by \<groupname\>.
-
- \sa page \ref grouping "Grouping", sections \ref cmddefgroup "\\defgroup",
- \ref cmdaddtogroup "\\addtogroup" and \ref cmdweakgroup "\\weakgroup"
-
-<hr>
-\section cmdinterface \\interface <name> [<header-file>] [<header-name>]
-
- \addindex \\interface
- Indicates that a comment block contains documentation for an
- interface with name \<name\>. The arguments are equal to the \\class
- command.
-
- \sa section \ref cmdclass "\\class".
-
-<hr>
-\section cmdinternal \\internal
-
- \addindex \\internal
- This command writes the message `For internal use only' to the output and
- all text \e after an \c \\internal command until the end of the
- comment block or the end of the section (whichever comes first) is
- marked as "internal".
-
- If the \\internal command is put inside a section
- (see for example \ref cmdsection "\\section") all subsection after the
- command are considered to be internal as well. Only a new section at the
- same level will be visible again.
-
- You can use \ref cfg_internal_docs "INTERNAL_DOCS" in the config file
- to show or hide the internal documentation.
-
-<hr>
-\section cmdmainpage \\mainpage [(title)]
-
- \addindex \\mainpage
-
- If the \\mainpage command is placed in a comment block the
- block is used to customize the index page (in HTML) or
- the first chapter (in \f$\mbox{\LaTeX}\f$).
-
- The title argument is optional and replaces the default title that
- doxygen normally generates. If you do not want any title you can
- specify \c notitle as the argument of \\mainpage.
-
- Here is an example:
-\verbatim
-/*! \mainpage My Personal Index Page
- *
- * \section intro_sec Introduction
- *
- * This is the introduction.
- *
- * \section install_sec Installation
- *
- * \subsection step1 Step 1: Opening the box
- *
- * etc...
- */
-\endverbatim
-
- You can refer to the main page using \\ref index (if the treeview
- is disabled, otherwise you should use \\ref main).
-
- \sa section \ref cmdsection "\\section",
- section \ref cmdsubsection "\\subsection" and
- section \ref cmdpage "\\page".
-
-<hr>
-\section cmdname \\name (header)
-
-This command turns a comment block into a header
-definition of a member group. The
-comment block should be followed by a
-<code>//\@{ ... //\@}</code> block containing the
-members of the group.
-
-See section \ref memgroup for an example.
-
-<hr>
-\section cmdnamespace \\namespace <name>
-
- \addindex \\namespace
- Indicates that a comment block contains documentation for a
- namespace with name \<name\>.
-
-<hr>
-\section cmdnosubgrouping \\nosubgrouping
-
- \addindex \\nosubgrouping
- This command can be put in the documentation
- of a class. It can be used in combination with member grouping
- to avoid that doxygen puts a member group as a subgroup of a
- Public/Protected/Private/... section.
-
-<hr>
-\section cmdoverload \\overload [(function declaration)]
-
- \addindex \\overload
- This command can be used to generate the following
- standard text for an overloaded member function:
-
- `This is an overloaded member function, provided for convenience.
- It differs from the above function only in what argument(s) it accepts.'
-
- If the documentation for the overloaded member function is not located
- in front of the function declaration or definition, the optional
- argument should be used to specify the correct function.
-
- Any other documentation that is inside the documentation block will
- by appended after the generated message.
-
- \par Note 1:
- You are responsible that there is indeed an
- earlier documented member that is overloaded by this one.
- To prevent that document reorders the documentation you should set
- \ref cfg_sort_member_docs "SORT_MEMBER_DOCS" to NO in this case.
- \par Note 2:
- The \\overload command does not work inside a one-line comment.
- \par Example:
- \verbinclude examples/overload.cpp
- \htmlonly
- Click <a href="$(DOXYGEN_DOCDIR)/examples/overload/html/class_test.html">here</a>
- for the corresponding HTML documentation that is generated by doxygen.
- \endhtmlonly
-
-<hr>
-\section cmdpackage \\package <name>
-
- \addindex \\package
- Indicates that a comment block contains documentation for a
- Java package with name \<name\>.
-
-<hr>
-\section cmdpage \\page <name> (title)
-
- \addindex \\page
- Indicates that a comment block contains a piece of documentation that is
- not directly related to one specific class, file or member.
- The HTML generator creates a page containing the documentation. The
- \f$\mbox{\LaTeX}\f$ generator
- starts a new section in the chapter `Page documentation'.
-
- \par Example:
- \verbinclude page.doc
- \htmlonly
- Click <a href="$(DOXYGEN_DOCDIR)/examples/page/html/pages.html">here</a>
- for the corresponding HTML documentation that is generated by doxygen.
- \endhtmlonly
-
- \par Note:
- The \<name\> argument consists of a combination of letters and number
- digits. If you wish to use upper case letters (e.g. \c MYPAGE1), or
- mixed case letters (e.g. \c MyPage1) in the \<name\> argument, you
- should set \c CASE_SENSE_NAMES to \c YES. However, this is advisable
- only if your file system is case sensitive. Otherwise (and for better
- portability) you should use all lower case letters (e.g. \c mypage1)
- for \<name\> in all references to the page.
-
- \sa section \ref cmdsection "\\section", section
- \ref cmdsubsection "\\subsection", and section
- \ref cmdref "\\ref".
-
-<hr>
-\section cmdproperty \\property (qualified property name)
-
- \addindex \\property
- Indicates that a comment block contains documentation for a
- property (either global or as a member of a class).
- This command is equivalent to \\var and \\fn.
-
- \sa section \ref cmdfn "\\fn" and \ref cmdvar "\\var".
-
-<hr>
-\section cmdprotocol \\protocol <name> [<header-file>] [<header-name>]
-
- \addindex \\protocol
- Indicates that a comment block contains documentation for a
- protocol in Objective-C with name \<name\>. The arguments are equal
- to the \\class command.
-
- \sa section \ref cmdclass "\\class".
-
-<hr>
-\section cmdrelates \\relates <name>
-
- \addindex \\relates
- This command can be used in the documentation of a non-member function
- \<name\>. It puts the function inside the `related function' section
- of the class documentation. This command is useful for documenting
- non-friend functions that are nevertheless strongly coupled to a certain
- class. It prevents the need of having to document a file, but
- only works for functions.
-
- \par Example:
- \verbinclude relates.cpp
- \htmlonly
- Click <a href="$(DOXYGEN_DOCDIR)/examples/relates/html/class_string.html">here</a>
- for the corresponding HTML documentation that is generated by doxygen.
- \endhtmlonly
-
-<hr>
-\section cmdrelatesalso \\relatesalso <name>
-
- \addindex \\relatesalso
- This command can be used in the documentation of a non-member function
- \<name\>. It puts the function both inside the `related function' section
- of the class documentation as well as leaving its normal file documentation
- location. This command is useful for documenting
- non-friend functions that are nevertheless strongly coupled to a certain
- class. It only works for functions.
-
-<hr>
-\section cmdshowinitializer \\showinitializer
-
- \addindex \\showinitializer
- By default the value of a define and the initializer of a variable
- are only displayed if they are less than 30 lines long. By putting
- this command in a comment block of a define or variable, the
- initializer is shown unconditionally.
-
- \sa section \ref cmdhideinitializer "\\hideinitializer".
-
-<hr>
-\section cmdstruct \\struct <name> [<header-file>] [<header-name>]
-
- \addindex \\struct
- Indicates that a comment block contains documentation for a
- struct with name \<name\>. The arguments are equal to the \\class
- command.
-
- \sa section \ref cmdclass "\\class".
-
-<hr>
-\section cmdtypedef \\typedef (typedef declaration)
-
- \addindex \\typedef
- Indicates that a comment block contains documentation for a
- typedef (either global or as a member of a class).
- This command is equivalent to \\var and \\fn.
-
- \sa section \ref cmdfn "\\fn" and \ref cmdvar "\\var".
-
-<hr>
-\section cmdunion \\union <name> [<header-file>] [<header-name>]
-
- \addindex \\union
- Indicates that a comment block contains documentation for a
- union with name \<name\>. The arguments are equal to the \\class
- command.
-
- \sa section \ref cmdclass "\\class".
-
-<hr>
-\section cmdvar \\var (variable declaration)
-
- \addindex \\var
- Indicates that a comment block contains documentation for a variable or
- enum value (either global or as a member of a class).
- This command is equivalent to \\typedef and \\fn.
-
- \sa section \ref cmdfn "\\fn" and \ref cmdtypedef "\\typedef".
-
-<hr>
-\section cmdweakgroup \\weakgroup <name> [(title)]
- \addindex \\addtogroup
- Can be used exactly like \ref cmdaddtogroup "\\addtogroup", but has
- a lower priority when it comes to resolving conflicting grouping
- definitions.
-
- \sa page \ref grouping "Grouping" and \ref cmdaddtogroup "\\addtogroup".
-
-<hr>
-
-<h2>\htmlonly <center> --- \endhtmlonly
- Section indicators
- \htmlonly --- </center>\endhtmlonly</h2>
-
-<hr>
-\section cmdattention \\attention { attention text }
-
- \addindex \\attention
- Starts a paragraph where a message that needs attention may be entered.
- The paragraph will be indented.
- The text of the paragraph has no special internal structure. All visual
- enhancement commands may be used inside the paragraph.
- Multiple adjacent \\attention commands will be joined into a single paragraph.
- The \\attention command ends when a blank line or some other
- sectioning command is encountered.
-
-\section cmdauthor \\author { list of authors }
-
- \addindex \\author
- Starts a paragraph where one or more author names may be entered.
- The paragraph will be indented.
- The text of the paragraph has no special internal structure. All visual
- enhancement commands may be used inside the paragraph.
- Multiple adjacent \\author commands will be joined into a single paragraph
- and separated by commas. Alternatively, one \\author command may mention
- several authors. The \\author command ends when a blank line or some other
- sectioning command is encountered.
-
- \par Example:
- \verbinclude author.cpp
- \htmlonly
- Click <a href="$(DOXYGEN_DOCDIR)/examples/author/html/class_windows_n_t.html">here</a>
- for the corresponding HTML documentation that is generated by doxygen.
- \endhtmlonly
-
-<hr>
-\section cmdbrief \\brief {brief description}
-
- \addindex \\brief
- Starts a paragraph that serves as a brief description. For classes and files
- the brief description will be used in lists and at the start of the
- documentation page. For class and file members, the brief description
- will be placed at the declaration of the member and prepended to the
- detailed description. A brief description may span several lines (although
- it is advised to keep it brief!). A brief description ends when a
- blank line or another sectioning command is encountered. If multiple
- \\brief commands are present they will be joined. See section
- \ref cmdauthor "\\author" for an example.
-
- Synonymous to \\short.
-
-<hr>
-\section cmdbug \\bug { bug description }
-
- \addindex \\bug
- Starts a paragraph where one or more bugs may be reported.
- The paragraph will be indented.
- The text of the paragraph has no special internal structure. All visual
- enhancement commands may be used inside the paragraph.
- Multiple adjacent \\bug commands will be joined into a single paragraph.
- Each bug description will start on a new line.
- Alternatively, one \\bug command may mention
- several bugs. The \\bug command ends when a blank line or some other
- sectioning command is encountered. See section \ref cmdauthor "\\author"
- for an example.
-
-<hr>
-\section cmdcond \\cond [<section-label>]
-
- \addindex \\cond
- Starts a conditional section that ends with a corresponding
- \ref cmdendcond "\\endcond" command, which is typically found in
- another comment block. The main purpose of this pair of
- commands is to (conditionally) exclude part of a file from processing
- (traditionally this could only be achieved using C processor commands).
-
- The section between \\cond and \\endcond commands 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.
-
- For conditional sections within a comment block one should
- use a \ref cmdif "\\if" ... \ref cmdendif "\\endif" block.
-
- Conditional sections can be nested. In this case a nested section will only
- be shown if it and its containing section are included.
-
- Here is an example showing the commands in action:
-
-\verbatim
-/** An interface */
-class Intf
-{
- public:
- /** A method */
- virtual void func() = 0;
-
- /// @cond TEST
-
- /** A method used for testing */
- virtual void test() = 0;
-
- /// @endcond
-};
-
-/// @cond DEV
-/*
- * The implementation of the interface
- */
-class Implementation : public Intf
-{
- public:
- void func();
-
- /// @cond TEST
- void test();
- /// @endcond
-
- /// @cond
- /** This method is obsolete and does
- * not show up in the documentation.
- */
- void obsolete();
- /// @endcond
-};
-
-/// @endcond
-\endverbatim
-
-The output will be different depending on whether \c ENABLED_SECTIONS
-is empty, \c TEST, \c DEV, or \c DEV \c TEST.
-
-<hr>
-\section cmddate \\date { date description }
-
- \addindex \\date
- Starts a paragraph where one or more dates may be entered.
- The paragraph will be indented.
- The text of the paragraph has no special internal structure. All visual
- enhancement commands may be used inside the paragraph.
- Multiple adjacent \\date commands will be joined into a single paragraph.
- Each date description will start on a new line.
- Alternatively, one \\date command may mention
- several dates. The \\date command ends when a blank line or some other
- sectioning command is encountered. See section \ref cmdauthor "\\author"
- for an example.
-
-<hr>
-\section cmddeprecated \\deprecated { description }
-
- \addindex \\deprecated
- Starts a paragraph indicating that this documentation block belongs to
- a deprecated entity. Can be used to describe alternatives,
- expected life span, etc.
-
-<hr>
-\section cmdelse \\else
-
- \addindex \\else
- Starts a conditional section if the previous conditional section
- was not enabled. The previous section should have been started with
- a \c \\if, \c \\ifnot, or \c \\elseif command.
-
- \sa \ref cmdif "\\if", \ref cmdifnot "\\ifnot", \ref cmdelseif "\\elseif",
- \ref cmdendif "\\endif."
-
-<hr>
-\section cmdelseif \\elseif <section-label>
-
- \addindex \\elseif
- Starts a conditional documentation section if the previous section
- was not enabled. 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. Conditional blocks can be nested. A nested section is
- only enabled if all enclosing sections are enabled as well.
-
- \sa sections \ref cmdendif "\\endif", \ref cmdifnot "\\ifnot",
- \ref cmdelse "\\else", and \ref cmdelseif "\\elseif".
-
-<hr>
-\section cmdendcond \\endcond
-
- \addindex \\endcond
- Ends a conditional section that was started by \ref cmdcond "\\cond".
-
- \sa \ref cmdcond "\\cond".
-
-<hr>
-\section cmdendif \\endif
-
- \addindex \\endif
- Ends a conditional section that was started by \c \\if or \c \\ifnot
- For each \c \\if or \c \\ifnot one and only one matching \c \\endif must follow.
-
- \sa \ref cmdif "\\if", and \ref cmdifnot "\\ifnot".
-
-<hr>
-\section cmdexception \\exception <exception-object> { exception description }
-
- \addindex \\exception
- Starts an exception description for an exception object with name
- \<exception-object\>. Followed by a description of the exception.
- The existence of the exception object is not checked.
- The text of the paragraph has no special internal structure. All visual
- enhancement commands may be used inside the paragraph.
- Multiple adjacent \\exception commands will be joined into a single paragraph.
- Each parameter description will start on a new line.
- The \\exception description ends when a blank line or some other
- sectioning command is encountered. See section \ref cmdfn "\\fn" for an
- example.
-
- \par Note:
- the tag \\exceptions is a synonym for this tag.
-
-<hr>
-\section cmdif \\if <section-label>
-
- \addindex \\if
- Starts a conditional documentation section. The section ends
- with a matching \c \\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. Conditional blocks can be nested. A nested section is
- only enabled if all enclosing sections are enabled as well.
-
- \par Example:
-\verbatim
- /*! Unconditionally shown documentation.
- * \if Cond1
- * Only included if Cond1 is set.
- * \endif
- * \if Cond2
- * Only included if Cond2 is set.
- * \if Cond3
- * Only included if Cond2 and Cond3 are set.
- * \endif
- * More text.
- * \endif
- * Unconditional text.
- */
-\endverbatim
-
- You can also use conditional commands inside aliases. To
- document a class in two languages you could for instance use:
-
-\par Example 2:
-\verbatim
-/*! \english
- * This is English.
- * \endenglish
- * \dutch
- * Dit is Nederlands.
- * \enddutch
- */
-class Example
-{
-};
-\endverbatim
- <p>Where the following aliases are defined in the configuration file:<p>
-\verbatim
-ALIASES = "english=\if english" \
- "endenglish=\endif" \
- "dutch=\if dutch" \
- "enddutch=\endif"
-\endverbatim
-
- and \c ENABLED_SECTIONS can be used to enable either \c english or \c dutch.
-
- \sa sections \ref cmdendif "\\endif", \ref cmdifnot "\\ifnot",
- \ref cmdelse "\\else", and \ref cmdelseif "\\elseif".
-
-<hr>
-\section cmdifnot \\ifnot <section-label>
-
- \addindex \\ifnot
- Starts a conditional documentation section. The section ends
- with a matching \c \\endif command. This conditional section is
- enabled by default. To disable it you must put the
- section-label after the \ref cfg_enabled_sections "ENABLED_SECTIONS"
- tag in the configuration
- file.
-
- \sa sections \ref cmdendif "\\endif", \ref cmdif "\\if",
- \ref cmdelse "\\else", and \ref cmdelseif "\\elseif".
-
-<hr>
-\section cmdinvariant \\invariant { description of invariant }
-
- \addindex \\invariant
- Starts a paragraph where the invariant of an entity can be described.
- The paragraph will be indented.
- The text of the paragraph has no special internal structure. All visual
- enhancement commands may be used inside the paragraph.
- Multiple adjacent \\invariant commands will be joined into a single paragraph.
- Each invariant description will start on a new line.
- Alternatively, one \\invariant command may mention
- several invariants. The \\invariant command ends when a blank line or some other
- sectioning command is encountered.
-
-<hr>
-\section cmdnote \\note { text }
-
- \addindex \\note
- Starts a paragraph where a note can be entered. The paragraph will be
- indented. The text of the paragraph has no special internal structure.
- All visual enhancement commands may be used inside the paragraph.
- Multiple adjacent \\note commands will be joined into a single paragraph.
- Each note description will start on a new line.
- Alternatively, one \\note command may mention
- several notes. The \\note command ends when a blank line or some other
- sectioning command is encountered. See section \ref cmdpar "\\par"
- for an example.
-
-<hr>
-\section cmdpar \\par [(paragraph title)] { paragraph }
-
- \addindex \\par
- If a paragraph title is given this command starts a paragraph with a
- user defined heading. The heading extends until the end of the
- line. The paragraph following the command will be indented.
-
- If no paragraph title is given this command will start a new paragraph.
- This will also work inside other paragraph commands
- (like \\param or \\warning) without ending the that command.
-
- The text of the paragraph has no special internal structure. All visual
- enhancement commands may be used inside the paragraph.
- The \\par command ends when a blank line or some other
- sectioning command is encountered.
-
- \par Example:
- \verbinclude par.cpp
- \htmlonly
- Click <a href="$(DOXYGEN_DOCDIR)/examples/par/html/class_test.html">here</a>
- for the corresponding HTML documentation that is generated by doxygen.
- \endhtmlonly
-
-<hr>
-\section cmdparam \\param <parameter-name> { parameter description }
-
- \addindex \\param
- Starts a parameter description for a function parameter with name
- \<parameter-name\>. Followed by a description of the parameter.
- The existence of the parameter is checked and a warning is given if
- the documentation of this (or any other) parameter is missing or not
- present in the function declaration or definition.
-
- The \\param command has an optional attribute specifying the direction
- of the attribute. Possible values are "in" and "out". Here is an example
- for the function memcpy:
- \code
-/*!
- * Copies bytes from a source memory area to a destination memory area,
- * where both areas may not overlap.
- * @param[out] dest The memory area to copy to.
- * @param[in] src The memory area to copy from.
- * @param[in] n The number of bytes to copy
- */
-void memcpy(void *dest, const void *src, size_t n);
- \endcode
- If a parameter is both input and output, use [in,out] as an attribute.
-
- The parameter description is a paragraph with no special internal structure.
- All visual enhancement commands may be used inside the paragraph.
-
- Multiple adjacent \\param commands will be joined into a single paragraph.
- Each parameter description will start on a new line.
- The \\param description ends when a blank line or some other
- sectioning command is encountered. See section \ref cmdfn "\\fn" for an
- example.
-
-<hr>
-\section cmdpost \\post { description of the postcondition }
-
- \addindex \\post
- Starts a paragraph where the postcondition of an entity can be described.
- The paragraph will be indented.
- The text of the paragraph has no special internal structure. All visual
- enhancement commands may be used inside the paragraph.
- Multiple adjacent \\post commands will be joined into a single paragraph.
- Each postcondition will start on a new line.
- Alternatively, one \\post command may mention
- several postconditions. The \\post command ends when a blank line or some other
- sectioning command is encountered.
-
-<hr>
-\section cmdpre \\pre { description of the precondition }
-
- \addindex \\pre
- Starts a paragraph where the precondition of an entity can be described.
- The paragraph will be indented.
- The text of the paragraph has no special internal structure. All visual
- enhancement commands may be used inside the paragraph.
- Multiple adjacent \\pre commands will be joined into a single paragraph.
- Each precondition will start on a new line.
- Alternatively, one \\pre command may mention
- several preconditions. The \\pre command ends when a blank line or some other
- sectioning command is encountered.
-
-<hr>
-\section cmdremarks \\remarks { remark text }
-
- \addindex \\remarks
- Starts a paragraph where one or more remarks may be entered.
- The paragraph will be indented.
- The text of the paragraph has no special internal structure. All visual
- enhancement commands may be used inside the paragraph.
- Multiple adjacent \\remark commands will be joined into a single paragraph.
- Each remark will start on a new line.
- Alternatively, one \\remark command may mention
- several remarks. The \\remark command ends when a blank line or some other
- sectioning command is encountered.
-
-<hr>
-\section cmdreturn \\return { description of the return value }
-
- \addindex \\return
- Starts a return value description for a function.
- The text of the paragraph has no special internal structure. All visual
- enhancement commands may be used inside the paragraph.
- Multiple adjacent \\return commands will be joined into a single paragraph.
- The \\return description ends when a blank line or some other
- sectioning command is encountered. See section \ref cmdfn "\\fn" for an
- example.
-
-<hr>
-\section cmdretval \\retval <return value> { description }
-
- \addindex \\retval
- Starts a return value description for a function with name
- \<return value\>. Followed by a description of the return value.
- The text of the paragraph that forms the description has no special
- internal structure. All visual enhancement commands may be used inside the
- paragraph.
- Multiple adjacent \\retval commands will be joined into a single paragraph.
- Each return value description will start on a new line.
- The \\retval description ends when a blank line or some other
- sectioning command is encountered.
-
-<hr>
-\section cmdsa \\sa { references }
-
- \addindex \\sa
- Starts a paragraph where one or more cross-references to classes,
- functions, methods, variables, files or URL may be specified.
- Two names joined by either <code>::</code> or <code>\#</code>
- are understood as referring to a class and one of its members.
- One of several overloaded methods or constructors
- may be selected by including a parenthesized list of argument types after
- the method name.
-
- Synonymous to \\see.
-
- \sa section \ref autolink "autolink" for information on how to create links
- to objects.
-
-<hr>
-\section cmdsee \\see { references }
-
- \addindex \\see
- Equivalent to \ref cmdsa "\\sa". Introduced for compatibility with Javadoc.
-
-<hr>
-\section cmdsince \\since { text }
-
- \addindex \\since
- This tag can be used to specify since when (version or time) an
- entity is available. The paragraph that follows \\since does not have any
- special internal structure. All visual enhancement commands may be
- used inside the paragraph. The \\since description ends when a blank
- line or some other sectioning command is encountered.
-
-<hr>
-\section cmdtest \\test { paragraph describing a test case }
-
- \addindex \\test
- Starts a paragraph where a test case can be described.
- The description will also add the test case to a separate test list.
- The two instances of the description will be cross-referenced.
- Each test case in the test list will be preceded by a header that
- indicates the origin of the test case.
-
-<hr>
-\section cmdthrow \\throw <exception-object> { exception description }
-
- \addindex \\throw
- Synonymous to \\exception (see section \ref cmdexception "\\exception").
-
- \par Note:
- the tag \\throws is a synonym for this tag.
-
-<hr>
-\section cmdtodo \\todo { paragraph describing what is to be done }
-
- \addindex \\todo
- Starts a paragraph where a TODO item is described.
- The description will also add an item to a separate TODO list.
- The two instances of the description will be cross-referenced.
- Each item in the TODO list will be preceded by a header that
- indicates the origin of the item.
-
-<hr>
-\section cmdversion \\version { version number }
-
- \addindex \\version
- Starts a paragraph where one or more version strings may be entered.
- The paragraph will be indented.
- The text of the paragraph has no special internal structure. All visual
- enhancement commands may be used inside the paragraph.
- Multiple adjacent \\version commands will be joined into a single paragraph.
- Each version description will start on a new line.
- Alternatively, one \\version command may mention
- several version strings.
- The \\version command ends when a blank line or some other
- sectioning command is encountered. See section \ref cmdauthor "\\author"
- for an example.
-
-<hr>
-\section cmdwarning \\warning { warning message }
-
- \addindex \\warning
- Starts a paragraph where one or more warning messages may be entered.
- The paragraph will be indented.
- The text of the paragraph has no special internal structure. All visual
- enhancement commands may be used inside the paragraph.
- Multiple adjacent \\warning commands will be joined into a single paragraph.
- Each warning description will start on a new line.
- Alternatively, one \\warning command may mention
- several warnings. The \\warning command ends when a blank line or some other
- sectioning command is encountered. See section \ref cmdauthor "\\author"
- for an example.
-
-\section cmdxrefitem \\xrefitem <key> "(heading)" "(list title)" {text}
-
- \addindex \\xrefitem
- This command is a generalization of commands such as \ref cmdtodo "\\todo"
- and \ref cmdbug "\\bug".
- It can be used to create user-defined text sections which are automatically
- cross-referenced between the place of occurrence and a related page,
- which will be generated. On the related page all sections of
- the same type will be collected.
-
- The first argument \<key\> is a
- identifier uniquely representing the type of the section. The second argument
- is a quoted string representing the heading of the section under which
- text passed as the forth argument is put. The third argument (list title)
- is used as the title for the related page containing all items with the
- same key. The keys "todo", "test", "bug", and "deprecated" are predefined.
-
- To get an idea on how to use the \\xrefitem command and what its effect
- is, consider the todo list, which (for English output) can be seen an
- alias for the command
- \verbatim \xrefitem todo "Todo" "Todo List" \endverbatim
-
- Since it is very tedious and error-prone to repeat the first three
- parameters of the command for each section, the command is meant to
- be used in combination with the \ref cfg_aliases "ALIASES" option in the
- configuration file.
- To define a new command \\reminder, for instance, one should add the following
- line to the configuration file:
- \verbatim ALIASES += "reminder=\xrefitem reminders \"Reminder\" \"Reminders\"" \endverbatim
- Note the use of escaped quotes for the second and third argument of the
- \\xrefitem command.
-
-<hr>
-<h2>\htmlonly <center> --- \endhtmlonly
- Commands to create links
- \htmlonly --- </center>\endhtmlonly</h2>
-
-\section cmdaddindex \\addindex (text)
-
- \addindex \\addindex
- This command adds (text) to the \f$\mbox{\LaTeX}\f$ index.
-
-<hr>
-\section cmdanchor \\anchor <word>
-
- \addindex \\anchor
- This command places an invisible, named anchor into the documentation
- to which you can refer with the \\ref command.
-
- \note Anchors can currently only be put into a comment block
- that is marked as a page (using \ref cmdpage "\\page") or mainpage
- (\ref cmdmainpage "\\mainpage").
-
- \sa section \ref cmdref "\\ref".
-
-<hr>
-\section cmdendlink \\endlink
-
- \addindex \\endlink
- This command ends a link that is started with the \\link command.
-
- \sa section \ref cmdlink "\\link".
-
-<hr>
-\section cmdlink \\link <link-object>
-
- \addindex \\link
- The links that are automatically generated by doxygen always have the
- name of the object they point to as link-text.
-
- The \\link command can be used to create a link to an object (a file,
- class, or member) with a user specified link-text.
- The link command should end with an \\endlink command. All text between
- the \\link and \\endlink commands serves as text for a link to
- the \<link-object\> specified as the first argument of \\link.
-
- See section \ref autolink "autolink" for more information on automatically
- generated links and valid link-objects.
-
-<hr>
-\section cmdref \\ref <name> ["(text)"]
-
- \addindex \\ref
- Creates a reference to a named section, subsection, page or anchor.
- For HTML documentation the reference command will generate a link to
- the section. For a sections or subsections the title of the section will be
- used as the text of the link. For anchor the optional text between quotes
- will be used or \<name\> if no text is specified.
- For \f$\mbox{\LaTeX}\f$ documentation the reference command will
- generate a section number for sections or the text followed by a
- page number if \<name\> refers to an anchor.
-
- \sa
- Section \ref cmdpage "\\page" for an example of the \\ref command.
-
-<hr>
-\section cmdsubpage \\subpage <name> ["(text)"]
-
- \addindex \\subpage
- This command can be used to create a hierarchy of pages. The
- same structure can be made using the \ref cmddefgroup "\\defgroup" and
- \ref cmdingroup "\\ingroup" commands, but for pages the \\subpage command
- is often more convenient. The main page (see \ref cmdmainpage "\\mainpage")
- is typically the root of hierarchy.
-
- This command behaves similar as \ref cmdref "\\ref" in the sense that
- it creates a reference to a page labeled \<name\> with the optional
- link text as specified in the second argument.
-
- It differs from the \\ref command in that it only works for pages,
- and creates a parent-child relation between pages, where the
- child page (or sub page) is identified by label \<name\>.
-
- See the \ref cmdsection "\\section"
- and \ref cmdsubsection "\\subsection" commands if you want to add structure
- without creating multiple pages.
-
- \note Each page can be the sub page of only one other page and
- no cyclic relations are allowed, i.e. the page hierarchy must have a tree
- structure.
-
- Here is an example:
-\verbatim
-/*! \mainpage A simple manual
-
-Some general info.
-
-This manual is divided in the following sections:
-- \subpage intro
-- \subpage advanced "Advanced usage"
-*/
-
-//-----------------------------------------------------------
-
-/*! \page intro Introduction
-This page introduces the user to the topic.
-Now you can proceed to the \ref advanced "advanced section".
-*/
-
-//-----------------------------------------------------------
-
-/*! \page advanced Advanced Usage
-This page is for advanced users.
-Make sure you have first read \ref intro "the introduction".
-*/
-\endverbatim
-
-<hr>
-\section cmdsection \\section <section-name> (section title)
-
- \addindex \\section
- Creates a section with name \<section-name\>. The title of the
- section should be specified as the second argument of the \\section
- command.
-
- \warning This command only works inside related page documentation and
- \e not in other documentation blocks!
-
-<hr>
-\section cmdsubsection \\subsection <subsection-name> (subsection title)
-
- \addindex \\subsection
- Creates a subsection with name \<subsection-name\>. The title of the
- subsection should be specified as the second argument of the \\subsection
- command.
-
- \warning This command only works inside a section of a related page
- documentation block and
- \e not in other documentation blocks!
-
- \sa
- Section \ref cmdpage "\\page" for an example of the
- \ref cmdsubsection "\\subsection" command.
-
-<hr>
-\section cmdsubsubsection \\subsubsection <subsubsection-name> (subsubsection title)
-
- \addindex \\subsubsection
- Creates a subsubsection with name \<subsubsection-name\>. The title of the
- subsubsection should be specified as the second argument of the
- \\subsubsection command.
-
- \warning This command only works inside a subsection of a
- related page documentation block and
- \e not in other documentation blocks!
-
- \sa
- Section \ref cmdpage "\\page" for an example of the
- \ref cmdsubsubsection "\\subsubsection" command.
-
-<hr>
-\section cmdparagraph \\paragraph <paragraph-name> (paragraph title)
-
- \addindex \\paragraph
- Creates a named paragraph with name \<paragraph-name\>. The title of the
- paragraph should be specified as the second argument of the
- \\paragraph command.
-
- \warning This command only works inside a subsubsection of a
- related page documentation block and
- \e not in other documentation blocks!
-
- \sa
- Section \ref cmdpage "\\page" for an example of the
- \ref cmdparagraph "\\paragraph" command.
-
-<hr>
-
-<h2>\htmlonly <center> --- \endhtmlonly
- Commands for displaying examples
- \htmlonly --- </center>\endhtmlonly</h2>
-
-\section cmddontinclude \\dontinclude <file-name>
-
- \addindex \\dontinclude
- This command can be used to parse a source file without actually
- verbatim including it in the documentation (as the \\include command does).
- This is useful if you want to divide the source file into smaller pieces and
- add documentation between the pieces.
- Source files or directories can be specified using the
- \ref cfg_example_path "EXAMPLE_PATH"
- tag of doxygen's configuration file.
-
- The class and member declarations and definitions inside the code fragment
- are `remembered' during the parsing of the comment block that contained
- the \\dontinclude command.
-
- For line by line descriptions of source files, one or more lines
- of the example can be displayed using the \\line, \\skip, \\skipline, and
- \\until commands. An internal pointer is used for these commands. The
- \\dontinclude command sets the pointer to the first line of the example.
-
- \par Example:
- \verbinclude include.cpp
- Where the example file \c example_test.cpp looks as follows:
- \verbinclude example_test.cpp
- \htmlonly
- Click <a href="$(DOXYGEN_DOCDIR)/examples/include/html/example.html">here</a>
- for the corresponding HTML documentation that is generated by doxygen.
- \endhtmlonly
-
- \sa sections \ref cmdline "\\line", \ref cmdskip "\\skip",
- \ref cmdskipline "\\skipline", and \ref cmduntil "\\until".
-
-<hr>
-\section cmdinclude \\include <file-name>
-
- \addindex \\include
- This command can be used to include a source file as a block of code.
- The command takes the name of an include file as an argument.
- Source files or directories can be specified using the
- \ref cfg_example_path "EXAMPLE_PATH"
- tag of doxygen's configuration file.
-
- If \<file-name\> itself is not unique for the set of example files specified
- by the \ref cfg_example_path "EXAMPLE_PATH" tag, you can include part
- of the absolute path to disambiguate it.
-
- Using the \\include command is equivalent to inserting the file into
- the documentation block and surrounding it
- with \ref cmdcode "\\code" and \ref cmdendcode "\\endcode" commands.
-
- The main purpose of the \\include command is to avoid code
- duplication in case of example blocks that consist of multiple
- source and header files.
-
- For a line by line description of a source files use the
- \ref cmddontinclude "\\dontinclude" command in combination with
- the \ref cmdline "\\line", \ref cmdskip "\\skip",
- \ref cmdskipline "\\skipline",
- and \\until commands.
-
- \note Doxygen's special commands do not work inside blocks of code.
- It is allowed to nest C-style comments inside a code block though.
-
- \sa section \ref cmdexample "\\example", \ref cmddontinclude "\\dontinclude", and
- section \ref cmdverbatim "\\verbatim".
-
-<hr>
-\section cmdincludelineno \\includelineno <file-name>
-
- \addindex \\includelineno
- This command works the same way as \\include, but will add line
- numbers to the included file.
-
- \sa section \ref cmdinclude "\\include".
-
-<hr>
-\section cmdline \\line ( pattern )
-
- \addindex \\line
- This command searches line by line through the example that was last
- included using \\include or \\dontinclude until it finds a non-blank
- line. If that line contains the specified pattern, it is written
- to the output.
-
- The internal pointer that is used to keep track of the current line in
- the example, is set to the start of the line following the non-blank
- line that was found (or to the end of the example if no such line could
- be found).
-
- See section \ref cmddontinclude "\\dontinclude" for an example.
-
-<hr>
-\section cmdskip \\skip ( pattern )
-
- \addindex \\skip
- This command searches line by line through the example that was last
- included using \\include or \\dontinclude until it finds a line that contains
- the specified pattern.
-
- The internal pointer that is used to keep track of the current line in
- the example, is set to the start of the line that contains the specified
- pattern (or to the end of the example if the pattern could not be found).
-
- See section \ref cmddontinclude "\\dontinclude" for an example.
-
-<hr>
-\section cmdskipline \\skipline ( pattern )
-
- \addindex \\skipline
- This command searches line by line through the example that was last
- included using \\include or \\dontinclude until it finds a line that contains
- the specified pattern. It then writes the line to the output.
-
- The internal pointer that is used to keep track of the current line in
- the example, is set to the start of the line following the line that is
- written (or to the end of the example if the pattern could not be found).
-
- \par Note:
- The command:
- \verbatim\skipline pattern\endverbatim
- is equivalent to:
-\verbatim
-\skip pattern
-\line pattern\endverbatim
-
- See section \ref cmddontinclude "\\dontinclude" for an example.
-
-<hr>
-\section cmduntil \\until ( pattern )
-
- \addindex \\until
- This command writes all lines of the example that was last
- included using \\include or \\dontinclude to the output, until it finds
- a line containing the specified pattern. The line containing the pattern
- will be written as well.
-
- The internal pointer that is used to keep track of the current line in
- the example, is set to the start of the line following last written
- line (or to the end of the example if the pattern could not be found).
-
- See section \ref cmddontinclude "\\dontinclude" for an example.
-
-<hr>
-\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
- placing \\verbatim and \\endverbatim 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.
-
-<hr>
-\section cmdhtmlinclude \\htmlinclude <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
- placing \\htmlonly and \\endhtmlonly 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.
-
-<hr>
-<h2>\htmlonly <center> --- \endhtmlonly
- Commands for visual enhancements
- \htmlonly --- </center>\endhtmlonly</h2>
-
-\section cmda \\a <word>
-
- \addindex \\a
- Displays the argument \<word\> using a special font.
- Use this command to refer to member arguments in the running text.
-
- \par Example:
- \verbatim
- ... the \a x and \a y coordinates are used to ...
- \endverbatim
- This will result in the following text:<br><br>
- ... the \a x and \a y coordinates are used to ...
-
-<hr>
-\section cmdarg \\arg { item-description }
-
- \addindex \\arg
- This command has one argument that continues until the first
- blank line or until another \\arg is encountered.
- The command can be used to generate a simple, not nested list of
- arguments.
- Each argument should start with a \\arg command.
-
- \par Example:
- Typing:
- \verbatim
- \arg \c AlignLeft left alignment.
- \arg \c AlignCenter center alignment.
- \arg \c AlignRight right alignment
-
- No other types of alignment are supported.
- \endverbatim
- will result in the following text:<br><br>
- <ul>
- <li> \c AlignLeft left alignment.
- <li> \c AlignCenter center alignment.
- <li> \c AlignRight right alignment
- </ul><br>
- No other types of alignment are supported.
-
- \par Note:
- For nested lists, HTML commands should be used.
-
- Equivalent to \ref cmdli "\\li"
-
-
-<hr>
-\section cmdb \\b <word>
-
- \addindex \\b
- Displays the argument \<word\> using a bold font.
- Equivalent to \<b\>word\</b\>.
- To put multiple words in bold use \<b\>multiple words\</b\>.
-
-<hr>
-\section cmdc \\c <word>
-
- \addindex \\c
- Displays the argument \<word\> using a typewriter font.
- Use this to refer to a word of code.
- Equivalent to \<tt\>word\</tt\>.
-
- \par Example:
- Typing:
- \verbatim
- ... This function returns \c void and not \c int ...
- \endverbatim
- will result in the following text:<br><br>
- ... This function returns \c void and not \c int ...
-
- Equivalent to \ref cmdp "\\p"
- To have multiple words in typewriter font use \<tt\>multiple words\</tt\>.
-
-<hr>
-\section cmdcode \\code
-
- \addindex \\code
- Starts a block of code. A code block is treated differently
- from ordinary text. It is interpreted as C/C++ code. The names of the
- classes and members that are documented are automatically replaced by
- links to the documentation.
-
- \sa section \ref cmdendcode "\\endcode", section \ref cmdverbatim "\\verbatim".
-
-<hr>
-\section cmdcopydoc \\copydoc <link-object>
-
- \addindex \\copydoc
- Copies a documentation block from the object specified by \<link-object\>
- and pastes it at the location of the command. This command can be useful
- to avoid cases where a documentation block would otherwise have to be
- duplicated or it can be used to extend the documentation of an inherited
- member.
-
- The link object can point to a member (of a class, file or group),
- a class, a namespace, a group, a page, or a file (checked in that order).
- Note that if the object pointed to is a member (function, variable,
- typedef, etc), the compound (class, file, or group) containing it
- should also be documented for the copying to work.
-
- To copy the documentation for a member of a
- class for instance one can put the following in the documentation
-
-\verbatim
- /*! @copydoc MyClass::myfunction()
- * More documentation.
- */
-\endverbatim
-
- if the member is overloaded, you should specify the argument types
- explicitly (without spaces!), like in the following:
-
-\verbatim
- /*! @copydoc MyClass::myfunction(type1,type2) */
-\endverbatim
-
- Qualified names are only needed if the context in which the documentation
- block is found requires them.
-
- The copydoc command can be used recursively, but cycles in the copydoc
- relation will be broken and flagged as an error.
-
-<hr>
-\section cmddot \\dot
-
- \addindex \\dot
- Starts a text fragment which should contain a valid description of a
- dot graph. The text fragment ends with \ref cmdenddot "\\enddot".
- Doxygen will pass the text on to dot and include the resulting
- image (and image map) into the output.
- The nodes of a graph can be made clickable by using the URL attribute.
- By using the command \\ref inside the URL value you can conveniently
- link to an item inside doxygen. Here is an example:
-\code
-/*! class B */
-class B {};
-
-/*! class C */
-class C {};
-
-/*! \mainpage
- *
- * Class relations expressed via an inline dot graph:
- * \dot
- * digraph example {
- * node [shape=record, fontname=Helvetica, fontsize=10];
- * b [ label="class B" URL="\ref B"];
- * c [ label="class C" URL="\ref C"];
- * b -> c [ arrowhead="open", style="dashed" ];
- * }
- * \enddot
- * Note that the classes in the above graph are clickable
- * (in the HTML output).
- */
-\endcode
-
-<hr>
-\section cmddotfile \\dotfile <file> ["caption"]
-
- \addindex \\dotfile
- Inserts an image generated by dot from \<file\> into the documentation.
-
- The first argument specifies the file name of the image.
- doxygen will look for files in the paths (or files) that you specified
- after the \ref cfg_dotfile_dirs "DOTFILE_DIRS" tag.
- If the dot file is found it will be used as an input file to the dot tool.
- The resulting image will be put into the correct output directory.
- If the dot file name contains spaces you'll have to put quotes (") around it.
-
- The second argument is optional and can be used to specify the caption
- that is displayed below the image. This argument has to be specified
- between quotes even if it does not contain any spaces. The quotes are
- stripped before the caption is displayed.
-
-<hr>
-\section cmde \\e <word>
-
- \addindex \\e
- Displays the argument \<word\> in italics.
- Use this command to emphasize words.
-
- \par Example:
- Typing:
- \verbatim
- ... this is a \e really good example ...
- \endverbatim
- will result in the following text:<br><br>
- ... this is a \e really good example ...
-
- Equivalent to \ref cmdem "\\em".
- To emphasis multiple words use \<em\>multiple words\</em\>.
-
-<hr>
-\section cmdem \\em <word>
-
- \addindex \\em
- Displays the argument \<word\> in italics.
- Use this command to emphasize words.
-
- \par Example:
- Typing:
- \verbatim
- ... this is a \em really good example ...
- \endverbatim
- will result in the following text:<br><br>
- ... this is a \em really good example ...
-
- Equivalent to \ref cmde "\\e"
-
-<hr>
-\section cmdendcode \\endcode
-
- \addindex \\endcode
- Ends a block of code.
- \sa section \ref cmdcode "\\code"
-
-<hr>
-\section cmdenddot \\enddot
-
- \addindex \\enddot
- Ends a blocks that was started with \ref cmddot "\\dot".
-
-<hr>
-\section cmdendhtmlonly \\endhtmlonly
-
- \addindex \\endhtmlonly
- Ends a block of text that was started with a \\htmlonly command.
-
- \sa section \ref cmdhtmlonly "\\htmlonly".
-
-<hr>
-\section cmdendlatexonly \\endlatexonly
-
- \addindex \\endlatexonly
- Ends a block of text that was started with a \\latexonly command.
-
- \sa section \ref cmdlatexonly "\\latexonly".
-
-<hr>
-\section cmdendmanonly \\endmanonly
-
- \addindex \\endmanonly
- Ends a block of text that was started with a \\manonly command.
-
- \sa section \ref cmdmanonly "\\manonly".
-
-<hr>
-\section cmdendverbatim \\endverbatim
-
- \addindex \\endverbatim
- Ends a block of text that was started with a \\verbatim command.
-
- \sa section \ref cmdendcode "\\endcode", section \ref cmdverbatim "\\verbatim".
-
-<hr>
-\section cmdendxmlonly \\endxmlonly
-
- \addindex \\endxmlonly
- Ends a block of text that was started with a \\xmlonly command.
-
- \sa section \ref cmdxmlonly "\\xmlonly".
-
-<hr>
-\section cmdfdollar \\f$
-
- \addindex \\f\$
-
- Marks the start and end of an in-text formula.
- \sa section \ref formulas "formulas" for an example.
-
-<hr>
-\section cmdfbropen \\f[
-
- \addindex \\f[
-
- Marks the start of a long formula that is displayed
- centered on a separate line.
- \sa section \ref cmdfbrclose "\\f]" and section \ref formulas "formulas".
-
-<hr>
-\section cmdfbrclose \\f]
-
- \addindex \\f]
-
- Marks the end of a long formula that is displayed
- centered on a separate line.
- \sa section \ref cmdfbropen "\\f[" and section \ref formulas "formulas".
-
-<hr>
-\section cmdhtmlonly \\htmlonly
-
- \addindex \\htmlonly
- Starts a block of text that will be verbatim included in the
- generated HTML documentation only. The block ends with a
- endhtmlonly command.
-
- This command can be used to include HTML code that is too complex
- for doxygen (i.e. applets, java-scripts, and HTML tags that
- require attributes). You can use the \\latexonly and \\endlatexonly
- pair to provide a proper \f$\mbox{\LaTeX}\f$ alternative.
-
- \b Note:
- environment variables (like \$(HOME) ) are resolved inside a
- HTML-only block.
-
- \sa section \ref cmdmanonly "\\manonly" and section
- \ref cmdlatexonly "\\latexonly".
-
-<hr>
-\section cmdimage \\image <format> <file> ["caption"] [<sizeindication>=<size>]
-
- \addindex \\image
- Inserts an image into the documentation. This command is format
- specific, so if you want to insert an image for more than one
- format you'll have to repeat this command for each format.
-
- The first argument specifies the output format. Currently, the
- following values are supported: \c html and \c latex.
-
- The second argument specifies the file name of the image.
- doxygen will look for files in the paths (or files) that you specified
- after the \ref cfg_image_path "IMAGE_PATH" tag.
- If the image is found it will be copied to the correct output directory.
- If the image name contains spaces you'll have to put quotes (") around it.
- You can also specify an absolute URL instead of a file name, but then
- doxygen does not copy the image nor check its existance.
-
- The third argument is optional and can be used to specify the caption
- that is displayed below the image. This argument has to be specified
- on a single line and between quotes even if it does not contain any
- spaces. The quotes are stripped before the caption is displayed.
-
- The fourth argument is also optional and can be used to specify the
- width or height of the image. This is only useful
- for \f$\mbox{\LaTeX}\f$ output
- (i.e. format=<code>latex</code>). The \c sizeindication can be
- either \c width or \c height. The size should be a valid
- size specifier in \f$\mbox{\LaTeX}\f$ (for example <code>10cm</code> or
- <code>6in</code> or a symbolic width like <code>\\textwidth</code>).
-
- Here is example of a comment block:
-
-\verbatim
- /*! Here is a snapshot of my new application:
- * \image html application.jpg
- * \image latex application.eps "My application" width=10cm
- */
-\endverbatim
-
- And this is an example of how the relevant part of the configuration file
- may look:
-
-\verbatim
- IMAGE_PATH = my_image_dir
-\endverbatim
-
- \warning The image format for HTML is limited to what your
- browser supports. For \f$\mbox{\LaTeX}\f$, the image format
- must be Encapsulated PostScript (eps).
- <br><br>
- Doxygen does not check if the image is in the correct format.
- So \e you have to make sure this is the case!
-
-<hr>
-\section cmdlatexonly \\latexonly
-
- \addindex \\latexonly
- Starts a block of text that will be verbatim included in the
- generated \f$\mbox{\LaTeX}\f$ documentation only. The block ends with a
- endlatexonly command.
-
- This command can be used to include \f$\mbox{\LaTeX}\f$ code that is too
- complex for doxygen (i.e. images, formulas, special characters). You can
- use the \\htmlonly and \\endhtmlonly pair to provide a proper HTML
- alternative.
-
- \b Note:
- environment variables (like \$(HOME) ) are resolved inside a
- \f$\mbox{\LaTeX}\f$-only block.
-
- \sa section \ref cmdlatexonly "\\latexonly"
- and section \ref cmdhtmlonly "\\htmlonly".
-
-<hr>
-\section cmdmanonly \\manonly
-
- \addindex \\manonly
- Starts a block of text that will be verbatim included in the
- generated MAN documentation only. The block ends with a
- endmanonly command.
-
- This command can be used to include groff code directly into
- MAN pages. You can use the \\htmlonly and \\latexonly and
- \\endhtmlonly and \\endlatexonly pairs to provide proper
- HTML and \f$\mbox{\LaTeX}\f$ alternatives.
-
- \sa section \ref cmdhtmlonly "\\htmlonly" and section
- \ref cmdlatexonly "\\latexonly".
-
-<hr>
-\section cmdli \\li { item-description }
-
- \addindex \\li
- This command has one argument that continues until the first
- blank line or until another \\li is encountered.
- The command can be used to generate a simple, not nested list of
- arguments.
- Each argument should start with a \\li command.
-
- \par Example:
- Typing:
- \verbatim
- \li \c AlignLeft left alignment.
- \li \c AlignCenter center alignment.
- \li \c AlignRight right alignment
-
- No other types of alignment are supported.
- \endverbatim
- will result in the following text:<br><br>
- <ul>
- <li> \c AlignLeft left alignment.
- <li> \c AlignCenter center alignment.
- <li> \c AlignRight right alignment
- </ul><br>
- No other types of alignment are supported.
-
- \par Note:
- For nested lists, HTML commands should be used.
-
- Equivalent to \ref cmdarg "\\arg"
-
-<hr>
-\section cmdn \\n
-
- \addindex \\n
- Forces a new line. Equivalent to \<br\> and inspired by
- the printf function.
-
-<hr>
-\section cmdp \\p <word>
-
- \addindex \\p
- Displays the parameter \<word\> using a typewriter font.
- You can use this command to refer to member function parameters in
- the running text.
-
- \par Example:
- \verbatim
- ... the \p x and \p y coordinates are used to ...
- \endverbatim
- This will result in the following text:<br><br>
- ... the \p x and \p y coordinates are used to ...
-
- Equivalent to \ref cmdc "\\c"
-
-<hr>
-\section cmdverbatim \\verbatim
-
- \addindex \\verbatim
- Starts a block of text that will be verbatim included in both the
- HTML and the
- \f$\mbox{\LaTeX}\f$ documentation. The block should end with a
- \\endverbatim block. All commands are disabled in a verbatim block.
-
- \warning Make sure you include a \\endverbatim command for each
- \\verbatim command or the parser will get confused!
-
- \sa section \ref cmdcode "\\code", and section \ref cmdverbinclude "\\verbinclude".
-
-<hr>
-\section cmdxmlonly \\xmlonly
-
- \addindex \\xmlonly
- Starts a block of text that will be verbatim included in the
- generated XML output only. The block ends with a
- endxmlonly command.
-
- This command can be used to include custom XML tags.
-
- \sa section \ref cmdhtmlonly "\\htmlonly" and section
- \ref cmdlatexonly "\\latexonly".
-
-<hr>
-\section cmdbackslash \\\\
-
- \addindex \\\\
- This command writes a backslash character (\\) to the HTML and
- \f$\mbox{\LaTeX}\f$ output. The backslash has to be escaped in some
- cases because doxygen uses it to detect commands.
-
-<hr>
-\section cmdat \\\@
-
- \addindex \\\@
- This command writes an at-sign (\@) to the HTML and
- \f$\mbox{\LaTeX}\f$ output. The at-sign has to be escaped in some cases
- because doxygen uses it to detect JavaDoc commands.
-
-<hr>
-\section cmdtilde \\~[LanguageId]
- \addindex \\~
- This command enables/disables a language specific filter. This can be
- used to put documentation for different language into one comment block
- and use the \c OUTPUT_LANGUAGE tag to filter out only a specific language.
- Use \\~language_id to enable output for a specific language only and
- \\~ to enable output for all languages (this is also the default mode).
-
- Example:
-\verbatim
-/*! \~english This is english \~dutch Dit is Nederlands \~german Dieses ist
- deutsch. \~ output for all languages.
- */
-\endverbatim
-
-
-<hr>
-\section cmdamp \\\&
-
- \addindex \\\&
- This command writes the \& character to output.
- This character has to be escaped because it has a special meaning in HTML.
-
-<hr>
-\section cmddollar \\\$
-
- \addindex \\\$
- This command writes the \$ character to the output.
- This character has to be escaped in some cases, because it is used to expand
- environment variables.
-
-<hr>
-\section cmdhash \\\#
-
- \addindex \\\#
- This command writes the \# character to the output. This
- character has to be escaped in some cases, because it is used to refer
- to documented entities.
-
-<hr>
-\section cmdlt \\\<
-
- \addindex \\\<
- This command writes the \< character to the output.
- This character has to be escaped because it has a special meaning in HTML.
-
-<hr>
-\section cmdgt \\\>
-
- \addindex \\\>
- This command writes the \> character to the output. This
- character has to be escaped because it has a special meaning in HTML.
-
-\section cmdperc \\\%
-
- \addindex \\\%
- This command writes the \% character to the output. This
- character has to be escaped in some cases, because it is used to
- prevent auto-linking to word that is also a documented class or struct.
-
-<hr>
-\section cmd_php_only PHP only commands
-For PHP files there are a number of additional commands, that can be
-used inside classes to make members public, private, or protected even
-though the language itself doesn't support this notion.
-
-To mark a single item use one of \\private, \\protected, \\public.
-For starting a section with a certain protection level use one of:
-\\privatesection, \\protectedsection, \\publicsection.
-The latter commands are similar to
-"private:", "protected:", and "public:" in C++.
-
-<h2>\htmlonly <center> --- \endhtmlonly
- Commands included for Qt compatibility
- \htmlonly --- </center>\endhtmlonly</h2>
-<hr>
-
-The following commands are supported to remain compatible to the Qt class
-browser generator. Do \e not use these commands in your own documentation.
-<ul>
-<li>\\annotatedclasslist
-<li>\\classhierarchy
-<li>\\define
-<li>\\functionindex
-<li>\\header
-<li>\\headerfilelist
-<li>\\inherit
-<li>\\l
-<li>\\postheader
-</ul>
-<hr>
-
-*/
-
diff --git a/doc/config.doc b/doc/config.doc
deleted file mode 100644
index 891f148..0000000
--- a/doc/config.doc
+++ /dev/null
@@ -1,1913 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-/*! \page config Configuration
-
-\section config_format Format
-
-A configuration file is a free-form ASCII text file with a structure
-that is similar to that of a Makefile, with the default name \c Doxyfile. It is
-parsed by \c doxygen. The file may contain tabs and newlines for
-formatting purposes. The statements in the file are case-sensitive.
-Comments may be placed anywhere within the file (except within quotes).
-Comments begin with the \# character and end at the end of the line.
-
-The file essentially consists of a list of assignment statements.
-Each statement consists of a \c TAG_NAME written in capitals,
-followed by the <code>=</code> character and one or more values. If the same tag
-is assigned more than once, the last assignment overwrites any earlier
-assignment. For options that take a list as their argument,
-the <code>+=</code> operator can be used instead of <code>=</code> to append
-new values to the list. Values are sequences of non-blanks. If the value should
-contain one or more blanks it must be surrounded by quotes (&quot;...&quot;).
-Multiple lines can be concatenated by inserting a backslash (\\)
-as the last character of a line. Environment variables can be expanded
-using the pattern <code>\$(ENV_VARIABLE_NAME)</code>.
-
-You can also include part of a configuration file from another configuration
-file using a <code>\@INCLUDE</code> tag as follows:
-\verbatim
-@INCLUDE = config_file_name
-\endverbatim
-The include file is searched in the current working directory. You can
-also specify a list of directories that should be searched before looking
-in the current working directory. Do this by putting a <code>\@INCLUDE_PATH</code> tag
-with these paths before the <code>\@INCLUDE</code> tag, e.g:
-\verbatim
-@INCLUDE_PATH = my_config_dir
-\endverbatim
-
-The configuration options can be divided into several categories.
-Below is an alphabetical index of the tags that are recognized
-followed by the descriptions of the tags grouped by category.
-
-\secreflist
-\refitem cfg_abbreviate_brief ABBREVIATE_BRIEF
-\refitem cfg_aliases ALIASES
-\refitem cfg_allexternals ALLEXTERNALS
-\refitem cfg_alphabetical_index ALPHABETICAL_INDEX
-\refitem cfg_always_detailed_sec ALWAYS_DETAILED_SEC
-\refitem cfg_binary_toc BINARY_TOC
-\refitem cfg_builtin_stl_support BUILTIN_STL_SUPPORT
-\refitem cfg_brief_member_desc BRIEF_MEMBER_DESC
-\refitem cfg_call_graph CALL_GRAPH
-\refitem cfg_case_sense_names CASE_SENSE_NAMES
-\refitem cfg_chm_file CHM_FILE
-\refitem cfg_class_diagrams CLASS_DIAGRAMS
-\refitem cfg_class_graph CLASS_GRAPH
-\refitem cfg_collaboration_graph COLLABORATION_GRAPH
-\refitem cfg_cols_in_alpha_index COLS_IN_ALPHA_INDEX
-\refitem cfg_compact_latex COMPACT_LATEX
-\refitem cfg_compact_rtf COMPACT_RTF
-\refitem cfg_create_subdirs CREATE_SUBDIRS
-\refitem cfg_details_at_top DETAILS_AT_TOP
-\refitem cfg_directory_graph DIRECTORY_GRAPH
-\refitem cfg_disable_index DISABLE_INDEX
-\refitem cfg_distribute_group_doc DISTRIBUTE_GROUP_DOC
-\refitem cfg_dot_image_format DOT_IMAGE_FORMAT
-\refitem cfg_dot_multi_targets DOT_MULTI_TARGETS
-\refitem cfg_dot_path DOT_PATH
-\refitem cfg_dot_transparent DOT_TRANSPARENT
-\refitem cfg_dotfile_dirs DOTFILE_DIRS
-\refitem cfg_enable_preprocessing ENABLE_PREPROCESSING
-\refitem cfg_enum_values_per_line ENUM_VALUES_PER_LINE
-\refitem cfg_enabled_sections ENABLED_SECTIONS
-\refitem cfg_example_path EXAMPLE_PATH
-\refitem cfg_example_patterns EXAMPLE_PATTERNS
-\refitem cfg_example_recursive EXAMPLE_RECURSIVE
-\refitem cfg_exclude EXCLUDE
-\refitem cfg_exclude_patterns EXCLUDE_PATTERNS
-\refitem cfg_exclude_symlinks EXCLUDE_SYMLINKS
-\refitem cfg_expand_as_defined EXPAND_AS_DEFINED
-\refitem cfg_expand_only_predef EXPAND_ONLY_PREDEF
-\refitem cfg_external_groups EXTERNAL_GROUPS
-\refitem cfg_extra_packages EXTRA_PACKAGES
-\refitem cfg_extract_all EXTRACT_ALL
-\refitem cfg_extract_local_classes EXTRACT_LOCAL_CLASSES
-\refitem cfg_extract_local_methods EXTRACT_LOCAL_METHODS
-\refitem cfg_extract_private EXTRACT_PRIVATE
-\refitem cfg_extract_static EXTRACT_STATIC
-\refitem cfg_file_patterns FILE_PATTERNS
-\refitem cfg_file_version_filter FILE_VERSION_FILTER
-\refitem cfg_filter_patterns FILTER_PATTERNS
-\refitem cfg_filter_source_files FILTER_SOURCE_FILES
-\refitem cfg_full_path_names FULL_PATH_NAMES
-\refitem cfg_generate_autogen_def GENERATE_AUTOGEN_DEF
-\refitem cfg_generate_buglist GENERATE_BUGLIST
-\refitem cfg_generate_chi GENERATE_CHI
-\refitem cfg_generate_deprecatedlist GENERATE_DEPRECIATEDLIST
-\refitem cfg_generate_html GENERATE_HTML
-\refitem cfg_generate_htmlhelp GENERATE_HTMLHELP
-\refitem cfg_generate_latex GENERATE_LATEX
-\refitem cfg_generate_legend GENERATE_LEGEND
-\refitem cfg_generate_man GENERATE_MAN
-\refitem cfg_generate_perlmod GENERATE_PERLMOD
-\refitem cfg_generate_rtf GENERATE_RTF
-\refitem cfg_generate_tagfile GENERATE_TAGFILE
-\refitem cfg_generate_testlist GENERATE_TESTLIST
-\refitem cfg_generate_todolist GENERATE_TODOLIST
-\refitem cfg_generate_treeview GENERATE_TREEVIEW
-\refitem cfg_generate_xml GENERATE_XML
-\refitem cfg_graphical_hierarchy GRAPHICAL_HIERARCHY
-\refitem cfg_group_graphs GROUP_GRAPHS
-\refitem cfg_have_dot HAVE_DOT
-\refitem cfg_hhc_location HHC_LOCATION
-\refitem cfg_hide_friend_compounds HIDE_FRIEND_COMPOUNDS
-\refitem cfg_hide_in_body_docs HIDE_IN_BODY_DOCS
-\refitem cfg_hide_scope_names HIDE_SCOPE_NAMES
-\refitem cfg_hide_undoc_classes HIDE_UNDOC_CLASSES
-\refitem cfg_hide_undoc_members HIDE_UNDOC_MEMBERS
-\refitem cfg_hide_undoc_relations HIDE_UNDOC_RELATIONS
-\refitem cfg_html_align_members HTML_ALIGN_MEMBERS
-\refitem cfg_html_footer HTML_FOOTER
-\refitem cfg_html_header HTML_HEADER
-\refitem cfg_html_output HTML_OUTPUT
-\refitem cfg_html_stylesheet HTML_STYLESHEET
-\refitem cfg_ignore_prefix IGNORE_PREFIX
-\refitem cfg_image_path IMAGE_PATH
-\refitem cfg_include_graph INCLUDE_GRAPH
-\refitem cfg_include_path INCLUDE_PATH
-\refitem cfg_inherit_docs INHERIT_DOCS
-\refitem cfg_inline_info INLINE_INFO
-\refitem cfg_inline_inherited_memb INLINE_INHERITED_MEMB
-\refitem cfg_inline_sources INLINE_SOURCES
-\refitem cfg_input INPUT
-\refitem cfg_input_filter INPUT_FILTER
-\refitem cfg_internal_docs INTERNAL_DOCS
-\refitem cfg_javadoc_autobrief JAVADOC_AUTOBRIEF
-\refitem cfg_latex_batchmode LATEX_BATCHMODE
-\refitem cfg_latex_cmd_name LATEX_CMD_NAME
-\refitem cfg_latex_header LATEX_HEADER
-\refitem cfg_latex_hide_indices LATEX_HIDE_INDICES
-\refitem cfg_latex_output LATEX_OUTPUT
-\refitem cfg_macro_expansion MACRO_EXPANSION
-\refitem cfg_makeindex_cmd_name MAKEINDEX_CMD_NAME
-\refitem cfg_man_extension MAN_EXTENSION
-\refitem cfg_man_links MAN_LINKS
-\refitem cfg_man_output MAN_OUTPUT
-\refitem cfg_max_dot_graph_depth MAX_DOT_GRAPH_DEPTH
-\refitem cfg_max_dot_graph_height MAX_DOT_GRAPH_HEIGHT
-\refitem cfg_max_dot_graph_width MAX_DOT_GRAPH_WIDTH
-\refitem cfg_max_initializer_lines MAX_INITIALIZER_LINES
-\refitem cfg_multiline_cpp_is_brief MULTILINE_CPP_IS_BRIEF
-\refitem cfg_optimize_output_for_c OPTIMIZE_OUTPUT_FOR_C
-\refitem cfg_optimize_output_java OPTIMIZE_OUTPUT_JAVA
-\refitem cfg_output_directory OUTPUT_DIRECTORY
-\refitem cfg_output_language OUTPUT_LANGUAGE
-\refitem cfg_paper_type PAPER_TYPE
-\refitem cfg_pdf_hyperlinks PDF_HYPERLINKS
-\refitem cfg_perl_path PERL_PATH
-\refitem cfg_perlmod_latex PERLMOD_LATEX
-\refitem cfg_perlmod_pretty PERLMOD_PRETTY
-\refitem cfg_perlmod_makevar_prefix PERLMOD_MAKEVAR_PREFIX
-\refitem cfg_predefined PREDEFINED
-\refitem cfg_project_name PROJECT_NAME
-\refitem cfg_project_number PROJECT_NUMBER
-\refitem cfg_quiet QUIET
-\refitem cfg_recursive RECURSIVE
-\refitem cfg_referenced_by_relation REFERENCED_BY_RELATION
-\refitem cfg_references_relation REFERENCES_RELATION
-\refitem cfg_repeat_brief REPEAT_BRIEF
-\refitem cfg_rtf_extensions_file RTF_EXTENSIONS_FILE
-\refitem cfg_rtf_hyperlinks RTF_HYPERLINKS
-\refitem cfg_rtf_output RTF_OUTPUT
-\refitem cfg_rtf_stylesheet_file RTF_STYLESHEET_FILE
-\refitem cfg_search_includes SEARCH_INCLUDES
-\refitem cfg_searchengine SEARCHENGINE
-\refitem cfg_separate_member_pages SEPARATE_MEMBER_PAGES
-\refitem cfg_short_names SHORT_NAMES
-\refitem cfg_show_dirs SHOW_DIRECTORIES
-\refitem cfg_show_include_files SHOW_INCLUDE_FILES
-\refitem cfg_show_used_files SHOW_USED_FILES
-\refitem cfg_skip_function_macros SKIP_FUNCTION_MACROS
-\refitem cfg_sort_brief_docs SORT_BRIEF_DOCS
-\refitem cfg_sort_member_docs SORT_MEMBER_DOCS
-\refitem cfg_source_browser SOURCE_BROWSER
-\refitem cfg_strip_code_comments STRIP_CODE_COMMENTS
-\refitem cfg_strip_from_inc_path STRIP_FROM_INC_PATH
-\refitem cfg_strip_from_path STRIP_FROM_PATH
-\refitem cfg_subgrouping SUBGROUPING
-\refitem cfg_tab_size TAB_SIZE
-\refitem cfg_tagfiles TAGFILES
-\refitem cfg_template_relations TEMPLATE_RELATIONS
-\refitem cfg_toc_expand TOC_EXPAND
-\refitem cfg_treeview_width TREEVIEW_WIDTH
-\refitem cfg_uml_look UML_LOOK
-\refitem cfg_use_htags USE_HTAGS
-\refitem cfg_use_pdflatex USE_PDFLATEX
-\refitem cfg_use_windows_encoding USE_WINDOWS_ENCODING
-\refitem cfg_verbatim_headers VERBATIM_HEADERS
-\refitem cfg_warn_format WARN_FORMAT
-\refitem cfg_warn_if_doc_error WARN_IF_DOC_ERROR
-\refitem cfg_warn_if_undocumented WARN_IF_UNDOCUMENTED
-\refitem cfg_warn_logfile WARN_LOGFILE
-\refitem cfg_warn_no_paramdoc WARN_NO_PARAMDOC
-\refitem cfg_warnings WARNINGS
-\refitem cfg_xml_dtd XML_DTD
-\refitem cfg_xml_output XML_OUTPUT
-\refitem cfg_xml_programlisting XML_PROGRAMLISTING
-\refitem cfg_xml_schema XML_SCHEMA
-\endsecreflist
-
-\section config_project Project related options
-\anchor cfg_project_name
-<dl>
-
-<dt>\c PROJECT_NAME <dd>
- \addindex PROJECT_NAME
- The \c PROJECT_NAME tag is a single word (or a sequence of words
- surrounded by double-quotes) that should identify the project for which the
- documentation is generated. This name is used in the title of most
- generated pages and in a few other places.
-
-\anchor cfg_project_number
-<dt>\c PROJECT_NUMBER <dd>
- \addindex PROJECT_NUMBER
- The \c PROJECT_NUMBER tag can be used to enter a project or revision number.
- This could be handy for archiving the generated documentation or
- if some version control system is used.
-
-\anchor cfg_output_directory
-<dt>\c OUTPUT_DIRECTORY <dd>
- \addindex OUTPUT_DIRECTORY
- The \c OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
- path into which the generated documentation will be written.
- If a relative path is entered, it will be relative to the location
- where doxygen was started. If left blank the current directory will be used.
-
-\anchor cfg_create_subdirs
-<dt>\c CREATE_SUBDIRS <dd>
- \addindex CREATE_SUBDIRS
- If the \c CREATE_SUBDIRS tag is set to \c YES, then doxygen will create
- 4096 sub-directories (in 2 levels) under the output directory of each output
- format and will distribute the generated files over these directories.
- Enabling this option can be useful when feeding doxygen a huge amount of source
- files, where putting all generated files in the same directory would otherwise
- causes performance problems for the file system.
-
-\anchor cfg_output_language
-<dt>\c OUTPUT_LANGUAGE <dd>
- \addindex OUTPUT_LANGUAGE
- The \c OUTPUT_LANGUAGE tag is used to specify the language in which all
- documentation generated by doxygen is written. Doxygen will use this
- information to generate all constant output in the proper language.
- The default language is English, other supported languages are:
- Brazilian, Catalan, Chinese, Croatian, Czech, Danish, Dutch, Finnish, French,
- German, Greek, Hungarian, Italian, Japanese, Korean, Lithuanian, Norwegian,
- Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish,
- Swedish, and Ukrainian.
-
-\anchor cfg_use_windows_encoding
-<dt>\c USE_WINDOWS_ENCODING <dd>
- \addindex USE_WINDOWS_ENCODING
- This tag can be used to specify the encoding used in the generated output.
- The encoding is not always determined by the language that is chosen,
- but also whether or not the output is meant for Windows or non-Windows users.
- In case there is a difference, setting the \c USE_WINDOWS_ENCODING tag to \c YES
- forces the Windows encoding, (this is the default for the Windows binary),
- whereas setting the tag to \c NO uses a Unix-style encoding (the default for
- all platforms other than Windows).
-
-\anchor cfg_brief_member_desc
-<dt>\c BRIEF_MEMBER_DESC <dd>
- \addindex BRIEF_MEMBER_DESC
- If the \c BRIEF_MEMBER_DESC tag is set to \c YES (the default) doxygen will
- include brief member descriptions after the members that are listed in
- the file and class documentation (similar to JavaDoc).
- Set to NO to disable this.
-
-\anchor cfg_repeat_brief
-<dt>\c REPEAT_BRIEF <dd>
- \addindex REPEAT_BRIEF
- If the \c REPEAT_BRIEF tag is set to \c YES (the default) doxygen will
- prepend the brief description of a member or function before the detailed
- description
-
- \par Note:
- If both \c HIDE_UNDOC_MEMBERS and \c BRIEF_MEMBER_DESC are set to \c NO, the
- brief descriptions will be completely suppressed.
-
-\anchor cfg_abbreviate_brief
-<dt>\c ABBREVIATE_BRIEF <dd>
- \addindex ABBREVIATE_BRIEF
- This tag implements a quasi-intelligent brief description abbreviator
- that is used to form the text in various listings. Each string
- in this list, if found as the leading text of the brief description, will be
- stripped from the text and the result after processing the whole list, is used
- as the annotated text. Otherwise, the brief description is used as-is. If left
- blank, the following values are used ("\$name" is automatically replaced with the
- name of the entity): "The $name class" "The $name widget" "The $name file"
- "is" "provides" "specifies" "contains" "represents" "a" "an" "the".
-
-\anchor cfg_always_detailed_sec
-<dt>\c ALWAYS_DETAILED_SEC <dd>
- \addindex ALWAYS_DETAILED_SEC
- If the \c ALWAYS_DETAILED_SEC and \c REPEAT_BRIEF tags are both set to \c YES then
- doxygen will generate a detailed section even if there is only a brief
- description.
-
-\anchor cfg_inline_inherited_memb
-<dt>\c INLINE_INHERITED_MEMB <dd>
-\addindex INLINE_INHERITED_MEMB
- If the \c INLINE_INHERITED_MEMB tag is set to \c YES, doxygen will show all inherited
- members of a class in the documentation of that class as if those members were
- ordinary class members. Constructors, destructors and assignment operators of
- the base classes will not be shown.
-
-\anchor cfg_full_path_names
-<dt>\c FULL_PATH_NAMES <dd>
- \addindex FULL_PATH_NAMES
- If the \c FULL_PATH_NAMES tag is set to \c YES doxygen will prepend the full
- path before files name in the file list and in the header files. If set
- to NO the shortest path that makes the file name unique will be used
-
-\anchor cfg_strip_from_path
-<dt>\c STRIP_FROM_PATH <dd>
- \addindex STRIP_FROM_PATH
- If the \c FULL_PATH_NAMES tag is set to \c YES then the \c STRIP_FROM_PATH tag
- can be used to strip a user-defined part of the path. Stripping is
- only done if one of the specified strings matches the left-hand part of the
- path. The tag can be used to show relative paths in the file list.
- If left blank the directory from which doxygen is run is used as the
- path to strip.
-
-\anchor cfg_strip_from_inc_path
-<dt>\c STRIP_FROM_INC_PATH <dd>
- \addindex STRIP_FROM_INC_PATH
- The \c STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
- the path mentioned in the documentation of a class, which tells
- the reader which header file to include in order to use a class.
- If left blank only the name of the header file containing the class
- definition is used. Otherwise one should specify the include paths that
- are normally passed to the compiler using the -I flag.
-
-
-
-\anchor cfg_case_sense_names
-<dt>\c CASE_SENSE_NAMES <dd>
- \addindex CASE_SENSE_NAMES
- 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 users are advised to set this
- option to NO.
-
-\anchor cfg_short_names
-<dt>\c SHORT_NAMES <dd>
- \addindex SHORT_NAMES
- If the \c SHORT_NAMES tag is set to \c YES, doxygen will generate much shorter
- (but less readable) file names. This can be useful is your file systems
- doesn't support long names like on DOS, Mac, or CD-ROM.
-
-\anchor cfg_javadoc_autobrief
-<dt>\c JAVADOC_AUTOBRIEF <dd>
- \addindex JAVADOC_AUTOBRIEF
- If the \c JAVADOC_AUTOBRIEF is set to \c YES then doxygen
- will interpret the first line (until the first dot) of a JavaDoc-style
- comment as the brief description. If set to NO (the default), the
- Javadoc-style will behave just like the Qt-style comments.
-
-\anchor cfg_builtin_stl_support
-<dt>\c BUILTIN_STL_SUPPORT <dd>
- \addindex BUILTIN_STL_SUPPORT
- If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to
- include (a tag file for) the STL sources as input, then you should
- set this tag to \c YES in order to let doxygen match functions declarations and
- definitions whose arguments contain STL classes (e.g. func(std::string); v.s.
- func(std::string) {}). This also make the inheritance and collaboration
- diagrams that involve STL classes more complete and accurate.
-
-\anchor cfg_distribute_group_doc
-<dt>\c DISTRIBUTE_GROUP_DOC <dd>
- \addindex DISTRIBUTE_GROUP_DOC
- If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
- tag is set to YES, then doxygen will reuse the documentation of the first
- member in the group (if any) for the other members of the group. By default
- all members of a group must be documented explicitly.
-
-\anchor cfg_multiline_cpp_is_brief
-<dt>\c MULTILINE_CPP_IS_BRIEF <dd>
- \addindex MULTILINE_CPP_IS_BRIEF
- The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
- treat a multi-line C++ special comment block (i.e. a block of //! or ///
- comments) as a brief description. This used to be the default behaviour.
- The new default is to treat a multi-line C++ comment block as a detailed
- description. Set this tag to YES if you prefer the old behaviour instead.
- Note that setting this tag to YES also means that rational rose comments
- are not recognized any more.
-
-\anchor cfg_details_at_top
-<dt>\c DETAILS_AT_TOP <dd>
- \addindex DETAILS_AT_TOP
- If the DETAILS_AT_TOP tag is set to YES then Doxygen
- will output the detailed description near the top, like JavaDoc.
- If set to NO, the detailed description appears after the member
- documentation.
-
-\anchor cfg_inherit_docs
-<dt>\c INHERIT_DOCS <dd>
- \addindex INHERIT_DOCS
- If the \c INHERIT_DOCS tag is set to \c YES (the default) then an undocumented
- member inherits the documentation from any documented member that it
- re-implements.
-
-\anchor cfg_separate_member_pages
-<dt>\c SEPARATE_MEMBER_PAGES <dd>
- \addindex SEPARATE_MEMBER_PAGES
- If the \c SEPARATE_MEMBER_PAGES tag is set to \c YES, then doxygen will produce
- a new page for each member. If set to \c NO, the documentation of a member will
- be part of the file/class/namespace that contains it.
-
-\anchor cfg_tab_size
-<dt>\c TAB_SIZE <dd>
- \addindex TAB_SIZE
- the \c TAB_SIZE tag can be used to set the number of spaces in a tab.
- Doxygen uses this value to replace tabs by spaces in code fragments.
-
-\anchor cfg_aliases
-<dt>\c ALIASES <dd>
- \addindex ALIASES
- This tag can be used to specify a number of aliases that acts
- as commands in the documentation. An alias has the form
-\verbatim
- name=value
-\endverbatim
- For example adding
-\verbatim
- "sideeffect=\par Side Effects:\n"
-\endverbatim
- will allow you to
- put the command \\sideeffect (or \@sideeffect) in the documentation, which
- will result in a user-defined paragraph with heading "Side Effects:".
- You can put \\n's in the value part of an alias to insert newlines.
-
-\anchor cfg_optimize_output_for_c
-<dt>\c OPTIMIZE_OUTPUT_FOR_C <dd>
- \addindex OPTIMIZE_OUTPUT_FOR_C
- Set the \c OPTIMIZE_OUTPUT_FOR_C tag to \c YES if your project consists
- of C sources only. Doxygen will then generate output that is more tailored
- for C. For instance, some of the names that are used will be different.
- The list of all members will be omitted, etc.
-
-\anchor cfg_optimize_output_java
-<dt>\c OPTIMIZE_OUTPUT_JAVA <dd>
- \addindex OPTIMIZE_OUTPUT_JAVA
- Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java or
- Python sources only. Doxygen will then generate output that is more tailored
- for that language. For instance, namespaces will be presented as packages,
- qualified scopes will look different, etc.
-
-\anchor cfg_subgrouping
-<dt>\c SUBGROUPING <dd>
- \addindex SUBGROUPING
- Set the \c SUBGROUPING tag to \c YES (the default) to allow class member groups of
- the same type (for instance a group of public functions) to be put as a
- subgroup of that type (e.g. under the Public Functions section). Set it to
- \c NO to prevent subgrouping. Alternatively, this can be done per class using
- the \ref cmdnosubgrouping "\\nosubgrouping" command.
-
-</dl>
-
-\section config_build Build related options
-\anchor cfg_extract_all
-<dl>
-
-<dt>\c EXTRACT_ALL <dd>
- \addindex EXTRACT_ALL
- If the \c EXTRACT_ALL tag is set to \c YES doxygen will assume all
- entities in documentation are documented, even if no documentation was
- available. Private class members and static file members will be hidden
- unless the \c EXTRACT_PRIVATE and \c EXTRACT_STATIC tags are set to \c YES
-
- \par Note:
- This will also disable the warnings about undocumented members
- that are normally produced when \c WARNINGS is set to \c YES
-
-\anchor cfg_extract_private
-<dt>\c EXTRACT_PRIVATE <dd>
- \addindex EXTRACT_PRIVATE
- If the \c EXTRACT_PRIVATE tag is set to \c YES all private members of a
- class will be included in the documentation.
-
-\anchor cfg_extract_static
-<dt>\c EXTRACT_STATIC <dd>
- \addindex EXTRACT_STATIC
- If the \c EXTRACT_STATIC tag is set to \c YES all static members of a file
- will be included in the documentation.
-
-\anchor cfg_extract_local_classes
-<dt>\c EXTRACT_LOCAL_CLASSES <dd>
- \addindex EXTRACT_LOCAL_CLASSES
- If the \c EXTRACT_LOCAL_CLASSES tag is set to \c YES classes (and structs)
- defined locally in source files will be included in the documentation.
- If set to NO only classes defined in header files are included. Does not
- have any effect for Java sources.
-
-\anchor cfg_extract_local_methods
-<dt>\c EXTRACT_LOCAL_METHODS <dd>
- \addindex EXTRACT_LOCAL_METHODS
- This flag is only useful for Objective-C code. When set to \c YES local
- methods, which are defined in the implementation section but not in
- the interface are included in the documentation.
- If set to \c NO (the default) only methods in the interface are included.
-
-\anchor cfg_hide_undoc_members
-<dt>\c HIDE_UNDOC_MEMBERS <dd>
- \addindex HIDE_UNDOC_MEMBERS
- If the \c HIDE_UNDOC_MEMBERS tag is set to \c YES, doxygen will hide all
- undocumented members inside documented classes or files.
- If set to \c NO (the default) these members will be included in the
- various overviews, but no documentation section is generated.
- This option has no effect if \c EXTRACT_ALL is enabled.
-
-\anchor cfg_hide_undoc_classes
-<dt>\c HIDE_UNDOC_CLASSES <dd>
- \addindex HIDE_UNDOC_CLASSES
- If the \c HIDE_UNDOC_CLASSESS tag is set to \c YES, doxygen will hide all
- undocumented classes.
- If set to \c NO (the default) these classes will be included in the
- various overviews.
- This option has no effect if \c EXTRACT_ALL is enabled.
-
-\anchor cfg_hide_friend_compounds
-<dt>\c HIDE_FRIEND_COMPOUNDS <dd>
- \addindex HIDE_FRIEND_COMPOUNDS
- If the \c HIDE_FRIEND_COMPOUNDS tag is set to \c YES, Doxygen will hide all
- friend (class|struct|union) declarations.
- If set to \c NO (the default) these declarations will be included in the
- documentation.
-
-\anchor cfg_hide_in_body_docs
-<dt>\c HIDE_IN_BODY_DOCS <dd>
- \addindex HIDE_IN_BODY_DOCS
-If the \c HIDE_IN_BODY_DOCS tag is set to \c YES, Doxygen will hide any
-documentation blocks found inside the body of a function.
-If set to \c NO (the default) these blocks will be appended to the
-function's detailed documentation block.
-
-\anchor cfg_internal_docs
-<dt>\c INTERNAL_DOCS <dd>
- \addindex INTERNAL_DOCS
- The \c INTERNAL_DOCS tag determines if documentation
- that is typed after a \ref cmdinternal "\\internal" command is included. If the tag is set
- to \c NO (the default) then the documentation will be excluded.
- Set it to \c YES to include the internal documentation.
-
-\anchor cfg_hide_scope_names
-<dt>\c HIDE_SCOPE_NAMES <dd>
- \addindex HIDE_SCOPE_NAMES
- If the \c HIDE_SCOPE_NAMES tag is set to \c NO (the default) then doxygen
- will show members with their full class and namespace scopes in the
- documentation. If set to \c YES the scope will be hidden.
-
-\anchor cfg_show_include_files
-<dt>\c SHOW_INCLUDE_FILES <dd>
- \addindex SHOW_INCLUDE_FILES
- If the SHOW_INCLUDE_FILES tag is set to YES (the default) then doxygen
- will put a list of the files that are included by a file in the documentation
- of that file.
-
-\anchor cfg_inline_info
-<dt>\c INLINE_INFO <dd>
- \addindex INLINE_INFO
- If the \c INLINE_INFO tag is set to \c YES (the default) then a tag [inline]
- is inserted in the documentation for inline members.
-
-\anchor cfg_sort_member_docs
-<dt>\c SORT_MEMBER_DOCS <dd>
- \addindex SORT_MEMBER_DOCS
- If the \c SORT_MEMBER_DOCS tag is set to \c YES (the default) then doxygen
- will sort the (detailed) documentation of file and class members
- alphabetically by member name. If set to \c NO the members will appear in
- declaration order.
-
-\anchor cfg_sort_brief_docs
-<dt>\c SORT_BRIEF_DOCS <dd>
- \addindex SORT_BRIEF_DOCS
- If the \c SORT_BRIEF_DOCS tag is set to \c YES then doxygen will sort the
- brief descriptions of file, namespace and class members alphabetically
- by member name. If set to \c NO (the default) the members will appear in
- declaration order.
-
-\anchor cfg_generate_deprecatedlist
-<dt>\c GENERATE_DEPRECATEDLIST <dd>
- \addindex GENERATE_DEPRECATEDLIST
- The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
- disable (NO) the deprecated list. This list is created by
- putting \ref cmddeprecated "\\deprecated"
- commands in the documentation.
-
-\anchor cfg_generate_todolist
-<dt>\c GENERATE_TODOLIST <dd>
- \addindex GENERATE_TODOLIST
- The GENERATE_TODOLIST tag can be used to enable (YES) or
- disable (NO) the todo list. This list is created by
- putting \ref cmdtodo "\\todo"
- commands in the documentation.
-
-\anchor cfg_generate_testlist
-<dt>\c GENERATE_TESTLIST <dd>
- \addindex GENERATE_TESTLIST
- The GENERATE_TESTLIST tag can be used to enable (YES) or
- disable (NO) the test list. This list is created by
- putting \ref cmdtest "\\test" commands in the documentation.
-
-\anchor cfg_generate_buglist
-<dt>\c GENERATE_BUGLIST <dd>
- \addindex GENERATE_BUGLIST
- The GENERATE_BUGLIST tag can be used to enable (YES) or
- disable (NO) the bug list. This list is created by
- putting \ref cmdbug "\\bug" commands in the documentation.
-
-\anchor cfg_enabled_sections
-<dt>\c ENABLED_SECTIONS <dd>
- \addindex ENABLED_SECTIONS
- The \c ENABLED_SECTIONS tag can be used to enable conditional
- documentation sections, marked by \ref cmdif "\\if" \<section-label\> ...
- \ref cmdendif "\\endif" and \ref cmdcond "\\cond" \<section-label\> ...
- \ref cmdendcond "\\endcond" blocks.
-
-\anchor cfg_max_initializer_lines
-<dt>\c MAX_INITIALIZER_LINES <dd>
- \addindex MAX_INITIALIZER_LINES
- The \c MAX_INITIALIZER_LINES tag determines the maximum number of lines
- that the initial value of a variable or define can be. If the initializer
- consists of more lines than specified here it will be hidden. Use a value
- of 0 to hide initializers completely. The appearance of the value of
- individual variables and defines can be controlled using \ref cmdshowinitializer "\\showinitializer"
- or \ref cmdhideinitializer "\\hideinitializer" command in the documentation.
-
-\anchor cfg_show_used_files
-<dt>\c SHOW_USED_FILES <dd>
- \addindex SHOW_USED_FILES
- Set the \c SHOW_USED_FILES tag to \c NO to disable the list of files generated
- at the bottom of the documentation of classes and structs. If set to \c YES the
- list will mention the files that were used to generate the documentation.
-
-\anchor cfg_show_dirs
-<dt>\c SHOW_DIRECTORIES <dd>
- \addindex SHOW_DIRECTORIES
- If the sources in your project are distributed over multiple directories
- then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy
- in the documentation.
-
-</dl>
-
-\section messages_input Options related to warning and progress messages
-\anchor cfg_quiet
-<dl>
-
-<dt>\c QUIET <dd>
- \addindex QUIET
- The \c QUIET tag can be used to turn on/off the messages that are generated
- to standard output by doxygen. Possible values are \c YES and \c NO,
- where \c YES implies that the messages are off.
- If left blank \c NO is used.
-
-\anchor cfg_warnings
-<dt>\c WARNINGS <dd>
- \addindex WARNINGS
- The \c WARNINGS tag can be used to turn on/off the warning messages that are
- generated to standard error by doxygen. Possible values are \c YES and \c NO,
- where \c YES implies that the warnings are on. If left blank \c NO is used.
-
- \b Tip: Turn warnings on while writing the documentation.
-
-\anchor cfg_warn_if_undocumented
-<dt>\c WARN_IF_UNDOCUMENTED <dd>
- \addindex WARN_IF_UNDOCUMENTED
- If \c WARN_IF_UNDOCUMENTED is set to \c YES, then doxygen will generate warnings
- for undocumented members. If \c EXTRACT_ALL is set to \c YES then this flag will
- automatically be disabled.
-
-\anchor cfg_warn_if_doc_error
-<dt>\c WARN_IF_DOC_ERROR <dd>
- \addindex WARN_IF_DOC_ERROR
- If \c WARN_IF_DOC_ERROR is set to \c YES, doxygen will generate warnings for
- potential errors in the documentation, such as not documenting some
- parameters in a documented function, or documenting parameters that
- don't exist or using markup commands wrongly.
-
-\anchor cfg_warn_no_paramdoc
-<dt>\c WARN_NO_PARAMDOC <dd>
- \addindex WARN_NO_PARAMDOC
- This \c WARN_NO_PARAMDOC option can be abled to get warnings for
- functions that are documented, but have no documentation for their parameters
- or return value. If set to \c NO (the default) doxygen will only warn about
- wrong or incomplete parameter documentation, but not about the absence of
- documentation.
-
-\anchor cfg_warn_format
-<dt>\c WARN_FORMAT <dd>
- \addindex WARN_FORMAT
- The \c WARN_FORMAT tag determines the format of the warning messages that
- doxygen can produce. The string should contain the <code>\$file</code>,
- <code>\$line</code>, and <code>\$text</code>
- tags, which will be replaced by the file and line number from which the
- warning originated and the warning text.
-
-\anchor cfg_warn_logfile
-<dt>\c WARN_LOGFILE <dd>
- \addindex WARN_LOGFILE
- The \c WARN_LOGFILE tag can be used to specify a file to which warning
- and error messages should be written. If left blank the output is written
- to stderr.
-
-</dl>
-
-\section config_input Input related options
-\anchor cfg_input
-<dl>
-
-<dt>\c INPUT <dd>
- \addindex INPUT
- The \c INPUT tag is used to specify the files and/or directories that contain
- documented source files. You may enter file names like
- \c myfile.cpp or directories like \c /usr/src/myproject.
- Separate the files or directories with spaces.<br>
-
- \b Note:
- If this tag is empty the current directory is searched.
-
-\anchor cfg_file_patterns
-<dt>\c FILE_PATTERNS <dd>
- \addindex FILE_PATTERNS
- If the value of the \c INPUT tag contains directories, you can use the
- \c FILE_PATTERNS tag to specify one or more wildcard patterns
- (like \c *.cpp and \c *.h ) to filter out the source-files
- in the directories. If left blank the following patterns are tested:
- <code>
- *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp
- *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm
- </code>
-
-\anchor cfg_file_version_filter
-<dt>\c FILE_VERSION_FILTER <dd>
- \addindex FILE_VERSION_FILTER
- The \c FILE_VERSION_FILTER tag can be used to specify a program or script that
- doxygen should invoke to get the current version for each file (typically from the
- version control system). Doxygen will invoke the program by executing (via
- popen()) the command <code>command input-file</code>, where \c command is
- the value of the \c FILE_VERSION_FILTER tag, and \c input-file is the name
- of an input file provided by doxygen.
- Whatever the program writes to standard output is used as the file version.
-
-Example of using a shell script as a filter for Unix:
-\verbatim
- FILE_VERSION_FILTER = "/bin/sh versionfilter.sh"
-\endverbatim
-
-Example shell script for CVS:
-\verbatim
-#!/bin/sh
-cvs status $1 | sed -n 's/^[ \]*Working revision:[ \t]*\([0-9][0-9\.]*\).*/\1/p'
-\endverbatim
-
-Example shell script for Subversion:
-\verbatim
-#!/bin/sh
-svn stat -v $1 | sed -n 's/^[ A-Z?\*|!]\{1,15\}/r/;s/ \{1,15\}/\/r/;s/ .*//p'
-\endverbatim
-
-Example filter for ClearCase:
-\verbatim
-FILE_VERSION_INFO = "cleartool desc -fmt \%Vn"
-\endverbatim
-
-\anchor cfg_recursive
-<dt>\c RECURSIVE <dd>
- \addindex RECURSIVE
- The \c RECURSIVE tag can be used to specify whether or not subdirectories
- should be searched for input files as well. Possible values are \c YES
- and \c NO. If left blank \c NO is used.
-
-\anchor cfg_exclude
-<dt>\c EXCLUDE <dd>
- \addindex EXCLUDE
- The \c EXCLUDE tag can be used to specify files and/or directories that should
- excluded from the \c INPUT source files. This way you can easily exclude a
- subdirectory from a directory tree whose root is specified with the \c INPUT tag.
-
-\anchor cfg_exclude_symlinks
-<dt>\c EXCLUDE_SYMLINKS <dd>
- \addindex EXCLUDE_SYMLINKS
- The \c EXCLUDE_SYMLINKS tag can be used select whether or not files or directories
- that are symbolic links (a Unix filesystem feature) are excluded from the input.
-
-\anchor cfg_exclude_patterns
-<dt>\c EXCLUDE_PATTERNS <dd>
- \addindex EXCLUDE_PATTERNS
- If the value of the \c INPUT tag contains directories, you can use the
- \c EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
- certain files from those directories.
-
- Note that the wildcards are matched against the file with absolute path,
- so to exclude all test directories use the pattern
- <code>*</code><code>/test/</code><code>*</code>
-
-\anchor cfg_example_path
-<dt>\c EXAMPLE_PATH <dd>
- \addindex EXAMPLE_PATH
- The \c EXAMPLE_PATH tag can be used to specify one or more files or
- directories that contain example code fragments that are included (see
- the \\include command in section \ref cmdinclude "\\include").
-
-\anchor cfg_example_recursive
-<dt>\c EXAMPLE_RECURSIVE <dd>
- \addindex EXAMPLE_RECURSIVE
- If the \c EXAMPLE_RECURSIVE tag is set to \c YES then subdirectories will be
- searched for input files to be used with the \\include or \\dontinclude
- commands irrespective of the value of the \c RECURSIVE tag.
- Possible values are \c YES and \c NO. If left blank \c NO is used.
-
-\anchor cfg_example_patterns
-<dt>\c EXAMPLE_PATTERNS <dd>
- \addindex EXAMPLE_PATTERNS
- If the value of the \c EXAMPLE_PATH tag contains directories, you can use the
- \c EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
- and *.h) to filter out the source-files in the directories. If left
- blank all files are included.
-
-\anchor cfg_image_path
-<dt>\c IMAGE_PATH <dd>
- \addindex IMAGE_PATH
- The \c IMAGE_PATH tag can be used to specify one or more files or
- directories that contain images that are to be included in the
- documentation (see the \ref cmdimage "\\image" command).
-
-\anchor cfg_input_filter
-<dt>\c INPUT_FILTER <dd>
- \addindex INPUT_FILTER
- The \c INPUT_FILTER tag can be used to specify a program that doxygen should
- invoke to filter for each input file. Doxygen will invoke the filter program
- by executing (via popen()) the command:
-\verbatim <filter> <input-file>
-\endverbatim
-
- where \<filter\>
- is the value of the \c INPUT_FILTER tag, and \<input-file\> is the name of an
- input file. Doxygen will then use the output that the filter program writes
- to standard output.
-
-\anchor cfg_filter_patterns
-<dt>\c FILTER_PATTERNS <dd>
- \addindex FILTER_PATTERNS
- The \c FILTER_PATTERNS tag can be used to specify filters on a per file pattern
- basis. Doxygen will compare the file name with each pattern and apply the
- filter if there is a match. The filters are a list of the form:
- pattern=filter (like <code>*.cpp=my_cpp_filter</code>). See \c INPUT_FILTER for further
- info on how filters are used. If \c FILTER_PATTERNS is empty, \c INPUT_FILTER
- is applied to all files.
-
-\anchor cfg_filter_source_files
-<dt>\c FILTER_SOURCE_FILES <dd>
- \addindex FILTER_SOURCE_FILES
- If the \c FILTER_SOURCE_FILES tag is set to \c YES, the input filter (if set using
- \ref cfg_input_filter "INPUT_FILTER" ) will also be used to filter the input
- files that are used for producing the source files to browse
- (i.e. when SOURCE_BROWSER is set to YES).
-
-</dl>
-
-\section sourcebrowser_index Source browsing related options
-\anchor cfg_source_browser
-<dl>
-
-<dt>\c SOURCE_BROWSER <dd>
- \addindex SOURCE_BROWSER
- If the \c SOURCE_BROWSER tag is set to \c YES then a list of source files will
- be generated. Documented entities will be cross-referenced with these sources.
-
-\anchor cfg_inline_sources
-<dt>\c INLINE_SOURCES <dd>
- \addindex INLINE_SOURCES
- Setting the \c INLINE_SOURCES tag to \c YES will include the body
- of functions, classes and enums directly into the documentation.
-
-\anchor cfg_strip_code_comments
-<dt>\c STRIP_CODE_COMMENTS <dd>
- \addindex STRIP_CODE_COMMENTS
- Setting the \c STRIP_CODE_COMMENTS tag to \c YES (the default) will instruct
- doxygen to hide any special comment blocks from generated source code
- fragments. Normal C and C++ comments will always remain visible.
-
-\anchor cfg_referenced_by_relation
-<dt>\c REFERENCED_BY_RELATION <dd>
- \addindex REFERENCED_BY_RELATION
- If the \c REFERENCED_BY_RELATION tag is set to \c YES (the default)
- then for each documented function all documented
- functions referencing it will be listed.
-
-\anchor cfg_references_relation
-<dt>\c REFERENCES_RELATION <dd>
- \addindex REFERENCES_RELATION
- If the \c REFERENCES_RELATION tag is set to \c YES (the default)
- then for each documented function all documented entities
- called/used by that function will be listed.
-
-\anchor cfg_verbatim_headers
-<dt>\c VERBATIM_HEADERS <dd>
- \addindex VERBATIM_HEADERS
- If the \c VERBATIM_HEADERS tag is set the \c YES (the default) then doxygen
- will generate a verbatim copy of the header file for each class for
- which an include is specified. Set to NO to disable this.
- \sa Section \ref cmdclass "\\class".
-
-\anchor cfg_use_htags
-<dt>\c USE_HTAGS <dd>
- \addindex USE_HTAGS
- If the \c USE_HTAGS tag is set to \c YES then the references to source code
- will point to the HTML generated by the htags(1) tool instead of doxygen
- built-in source browser. The htags tool is part of GNU's global source
- tagging system (see http://www.gnu.org/software/global/global.html).
- The use it do the following:
-
- -# Install the latest version of global (i.e. 4.8.6 or better)
- -# Enable SOURCE_BROWSER and USE_HTAGS in the config file
- -# Make sure the INPUT points to the root of the source tree
- -# Run doxygen as normal
-
- Doxygen will invoke htags (and that will in turn invoke gtags), so these tools
- must be available from the command line (i.e. in the search path).
-
- The result: instead of the source browser generated by doxygen, the links to
- source code will now point to the output of htags.
-
-</dl>
-
-\section alphabetical_index Alphabetical index options
-\anchor cfg_alphabetical_index
-<dl>
-
-<dt>\c ALPHABETICAL_INDEX <dd>
- \addindex ALPHABETICAL_INDEX
- If the \c ALPHABETICAL_INDEX tag is set to \c YES, an alphabetical index
- of all compounds will be generated. Enable this if the project contains
- a lot of classes, structs, unions or interfaces.
-
-\anchor cfg_cols_in_alpha_index
-<dt>\c COLS_IN_ALPHA_INDEX <dd>
- \addindex COLS_IN_ALPHA_INDEX
- If the alphabetical index is enabled
- (see \c ALPHABETICAL_INDEX) then the \c COLS_IN_ALPHA_INDEX tag can be
- used to specify the number of columns in which this list will be split (can be a number in the range [1..20])
-
-\anchor cfg_ignore_prefix
-<dt>\c IGNORE_PREFIX <dd>
- \addindex IGNORE_PREFIX
- In case all classes in a project start with a common prefix, all classes will
- be put under the same header in the alphabetical index.
- The \c IGNORE_PREFIX tag can be used to specify a prefix
- (or a list of prefixes) that should be ignored while generating the index
- headers.
-
-</dl>
-\section html_output HTML related options
-\anchor cfg_generate_html
-<dl>
-
-<dt>\c GENERATE_HTML <dd>
- \addindex GENERATE_HTML
- If the \c GENERATE_HTML tag is set to \c YES (the default) doxygen will
- generate HTML output
-
-\anchor cfg_html_output
-<dt>\c HTML_OUTPUT <dd>
- \addindex HTML_OUTPUT
- The \c HTML_OUTPUT tag is used to specify where the HTML docs will be put.
- If a relative path is entered the value of \c OUTPUT_DIRECTORY will be
- put in front of it. If left blank `html' will be used as the default path.
-
-\anchor cfg_html_file_extension
-<dt>\c HTML_FILE_EXTENSION <dd>
- \addindex HTML_FILE_EXTENSION
- The \c HTML_FILE_EXTENSION tag can be used to specify the file extension for
- each generated HTML page (for example: .htm, .php, .asp). If it is left blank
- doxygen will generate files with .html extension.
-
-\anchor cfg_html_header
-<dt>\c HTML_HEADER <dd>
- \addindex HTML_HEADER
- The \c HTML_HEADER tag can be used to specify a user-defined HTML
- header file for each generated HTML page. To get valid HTML the header file
- should contain at least a \c \<HTML\> and a \c \<BODY\> tag, but it is
- good idea to include the style sheet that is generated by doxygen as well.
- Minimal example:
-\verbatim
- <HTML>
- <HEAD>
- <TITLE>My title</TITLE>
- <LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
- </HEAD>
- <BODY BGCOLOR="#FFFFFF">
-\endverbatim
- If the tag is left blank doxygen will generate a
- standard header.
-
- The following commands have a special meaning inside the header:
- <code>\$title</code>, <code>\$datetime</code>, <code>\$date</code>,
- <code>\$doxygenversion</code>, <code>\$projectname</code>, and
- <code>\$projectnumber</code>.
- Doxygen will replace them by respectively
- the title of the page, the current date and time, only the current date,
- the version number of doxygen, the project name (see \c PROJECT_NAME), or the
- project number (see \c PROJECT_NUMBER).
-
- If \c CREATE_SUBDIRS is enabled, the command <code>\$relpath\$</code> can be
- used to produce a relative path to the root of the HTML output directory,
- e.g. use \$relpath\$doxygen.css, to refer to the standard style sheet.
-
- See also section \ref doxygen_usage for information on how to generate
- the default header that doxygen normally uses.
-
-\anchor cfg_html_footer
-<dt>\c HTML_FOOTER <dd>
- \addindex HTML_FOOTER
- The \c HTML_FOOTER tag can be used to specify a user-defined HTML footer for
- each generated HTML page. To get valid HTML the footer file should contain
- at least a \c \</BODY\> and a \c \</HTML\> tag. A minimal example:
-\verbatim
- </BODY>
- </HTML>
-\endverbatim
- If the tag is left blank doxygen will generate a standard footer.
-
- The following commands have a special meaning inside the footer:
- <code>\$title</code>, <code>\$datetime</code>, <code>\$date</code>,
- <code>\$doxygenversion</code>, <code>\$projectname</code>,
- <code>\$projectnumber</code>.
- Doxygen will replace them by respectively
- the title of the page, the current date and time, only the current date,
- the version number of doxygen, the project name (see \c PROJECT_NAME), or the
- project number (see \c PROJECT_NUMBER).
-
- See also section \ref doxygen_usage for information on how to generate
- the default footer that doxygen normally uses.
-
-\anchor cfg_html_stylesheet
-<dt>\c HTML_STYLESHEET <dd>
- \addindex HTML_STYLESHEET
- The \c HTML_STYLESHEET tag can be used to specify a user-defined cascading
- style sheet that is used by each HTML page. It can be used to
- fine-tune the look of the HTML output. If the tag is left blank doxygen
- will generate a default style sheet.
-
- See also section \ref doxygen_usage for information on how to generate
- the style sheet that doxygen normally uses.
-
-\anchor cfg_html_align_members
-<dt>\c HTML_ALIGN_MEMBERS <dd>
- \addindex HTML_ALIGN_MEMBERS
- If the \c HTML_ALIGN_MEMBERS tag is set to \c YES, the members of classes,
- files or namespaces will be aligned in HTML using tables. If set to
- \c NO a bullet list will be used.
-
- <b>Note:</b>
- Setting this tag to \c NO will become obsolete in the future, since I only
- intent to support and test the aligned representation.
-
-\anchor cfg_generate_htmlhelp
-<dt>\c GENERATE_HTMLHELP <dd>
- \addindex GENERATE_HTMLHELP
- If the \c GENERATE_HTMLHELP tag is set to \c YES then
- doxygen generates three additional HTML index files:
- \c index.hhp, \c index.hhc, and \c index.hhk. The \c index.hhp is a
- project file that can be read by
- <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/htmlhelp/html/vsconHH1Start.asp">
- Microsoft's HTML Help Workshop</a>
- on Windows.
-
- The HTML Help Workshop contains a compiler that can convert all HTML output
- generated by doxygen into a single compressed HTML file (.chm). Compressed
- HTML files are now used as the Windows 98 help format, and will replace
- the old Windows help format (.hlp) on all Windows platforms in the future.
- Compressed HTML files also contain an index, a table of contents,
- and you can search for words in the documentation.
- The HTML workshop also contains a viewer for compressed HTML files.
-
-\anchor cfg_chm_file
-<dt>\c CHM_FILE <dd>
- \addindex CHM_FILE
- If the \c GENERATE_HTMLHELP tag is set to \c YES, the \c CHM_FILE tag can
- be used to specify the file name of the resulting .chm file. You
- can add a path in front of the file if the result should not be
- written to the html output directory.
-
-\anchor cfg_hhc_location
-<dt>\c HHC_LOCATION <dd>
- \addindex HHC_LOCATION
- If the \c GENERATE_HTMLHELP tag is set to \c YES, the \c HHC_LOCATION tag can
- be used to specify the location (absolute path including file name) of
- the HTML help compiler (hhc.exe). If non empty doxygen will try to run
- the HTML help compiler on the generated index.hhp.
-
-\anchor cfg_generate_chi
-<dt>\c GENERATE_CHI <dd>
- \addindex GENERATE_CHI
- If the \c GENERATE_HTMLHELP tag is set to \c YES, the \c GENERATE_CHI flag
- controls if a separate .chi index file is generated (<code>YES</code>) or that
- it should be included in the master .chm file (<code>NO</code>).
-
-\anchor cfg_binary_toc
-<dt>\c BINARY_TOC <dd>
- \addindex BINARY_TOC
- If the \c GENERATE_HTMLHELP tag is set to \c YES, the \c BINARY_TOC flag
- controls whether a binary table of contents is generated (<code>YES</code>) or a
- normal table of contents (<code>NO</code>) in the .chm file.
-
-\anchor cfg_toc_expand
-<dt>\c TOC_EXPAND <dd>
- \addindex TOC_EXPAND
- The \c TOC_EXPAND flag can be set to YES to add extra items for
- group members to the table of contents of the HTML help documentation
- and to the tree view.
-
-\anchor cfg_disable_index
-<dt>\c DISABLE_INDEX <dd>
- \addindex DISABLE_INDEX
- If you want full control over the layout of the generated HTML pages it
- might be necessary to disable the index and replace it with your own.
- The \c DISABLE_INDEX tag can be used to turn on/off the condensed index at
- top of each page. A value of NO (the default) enables the index and the
- value YES disables it.
-
-\anchor cfg_enum_values_per_line
-<dt>\c ENUM_VALUES_PER_LINE <dd>
- \addindex ENUM_VALUES_PER_LINE
- This tag can be used to set the number of enum values (range [1..20])
- that doxygen will group on one line in the generated HTML documentation.
-
-\anchor cfg_generate_treeview
-<dt>\c GENERATE_TREEVIEW <dd>
- \addindex GENERATE_TREEVIEW
- If the \c GENERATE_TREEVIEW tag is set to YES, a side panel will be
- generated containing a tree-like index structure (just like the one that
- is generated for HTML Help). For this to work a browser that supports
- JavaScript and frames is required (for instance Mozilla 1.0+, Netscape 6.0+
- or Internet explorer 5.0+ or Konqueror).
-
-\anchor cfg_treeview_width
-<dt>\c TREEVIEW_WIDTH <dd>
- \addindex TREEVIEW_WIDTH
- If the treeview is enabled (see \c GENERATE_TREEVIEW) then this tag can be
- used to set the initial width (in pixels) of the frame in which the tree
- is shown.
-
-</dl>
-\section latex_output LaTeX related options
-\anchor cfg_generate_latex
-<dl>
-
-<dt>\c GENERATE_LATEX <dd>
- \addindex GENERATE_LATEX
- If the \c GENERATE_LATEX tag is set to \c YES (the default) doxygen will
- generate \f$\mbox{\LaTeX}\f$ output.
-
-\anchor cfg_latex_output
-<dt>\c LATEX_OUTPUT <dd>
- \addindex LATEX_OUTPUT
- The \c LATEX_OUTPUT tag is used to specify where the \f$\mbox{\LaTeX}\f$
- docs will be put.
- If a relative path is entered the value of \c OUTPUT_DIRECTORY will be
- put in front of it. If left blank `latex' will be used as the default path.
-
-\anchor cfg_latex_cmd_name
-<dt>\c LATEX_CMD_NAME <dd>
- \addindex LATEX_CMD_NAME
- The \c LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be invoked.
- If left blank `latex' will be used as the default command name.
-
-\anchor cfg_makeindex_cmd_name
-<dt>\c MAKEINDEX_CMD_NAME <dd>
- \addindex MAKEINDEX_CMD_NAME
- The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
- generate index for LaTeX. If left blank `makeindex' will be used as the
- default command name.
-
-\anchor cfg_compact_latex
-<dt>\c COMPACT_LATEX <dd>
- \addindex COMPACT_LATEX
- If the \c COMPACT_LATEX tag is set to \c YES doxygen generates more compact
- \f$\mbox{\LaTeX}\f$ documents. This may be useful for small projects and may help to
- save some trees in general.
-
-\anchor cfg_paper_type
-<dt>\c PAPER_TYPE <dd>
- \addindex PAPER_TYPE
- The \c PAPER_TYPE tag can be used to set the paper type that is used
- by the printer. Possible values are:
- <ul>
- <li><code>a4</code> (210 x 297 mm).
- <li><code>a4wide</code> (same as a4, but including the a4wide package).
- <li><code>letter</code> (8.5 x 11 inches).
- <li><code>legal</code> (8.5 x 14 inches).
- <li><code>executive</code> (7.25 x 10.5 inches)
- </ul>
- If left blank a4wide will be used.
-
-\anchor cfg_extra_packages
-<dt>\c EXTRA_PACKAGES <dd>
- \addindex EXTRA_PACKAGES
- The \c EXTRA_PACKAGES tag can be used to specify one or more \f$\mbox{\LaTeX}\f$
- package names that should be included in the \f$\mbox{\LaTeX}\f$ output.
- To get the times font for instance you can specify
-\verbatim
-EXTRA_PACKAGES = times
-\endverbatim
- If left blank no extra packages will be included.
-
-\anchor cfg_latex_header
-<dt>\c LATEX_HEADER <dd>
- \addindex LATEX_HEADER
- The \c LATEX_HEADER tag can be used to specify a personal \f$\mbox{\LaTeX}\f$
- header for the generated \f$\mbox{\LaTeX}\f$ document.
- The header should contain everything until the first chapter.
-
- If it is left blank doxygen will generate a
- standard header. See section \ref doxygen_usage for information on how to
- let doxygen write the default header to a separate file.
-
- \par Note:
- Only use a user-defined header if you know what you are doing!
-
- The following commands have a special meaning inside the header:
- <code>\$title</code>, <code>\$datetime</code>, <code>\$date</code>,
- <code>\$doxygenversion</code>, <code>\$projectname</code>,
- <code>\$projectnumber</code>.
- Doxygen will replace them by respectively
- the title of the page, the current date and time, only the current date,
- the version number of doxygen, the project name (see \c PROJECT_NAME), or the
- project number (see \c PROJECT_NUMBER).
-
-\anchor cfg_pdf_hyperlinks
-<dt>\c PDF_HYPERLINKS <dd>
- \addindex PDF_HYPERLINKS
-
- If the \c PDF_HYPERLINKS tag is set to \c YES, the \f$\mbox{\LaTeX}\f$ that
- is generated is prepared for conversion to PDF (using ps2pdf or pdflatex).
- The PDF file will
- contain links (just like the HTML output) instead of page references.
- This makes the output suitable for online browsing using a PDF viewer.
-
-\anchor cfg_use_pdflatex
-<dt>\c USE_PDFLATEX <dd>
- \addindex LATEX_PDFLATEX
-
- If the \c LATEX_PDFLATEX tag is set to \c YES, doxygen will use
- pdflatex to generate the PDF file directly from the \f$\mbox{\LaTeX}\f$
- files.
-
-\anchor cfg_latex_batchmode
-<dt>\c LATEX_BATCHMODE <dd>
- \addindex LATEX_BATCHMODE
-
- If the \c LATEX_BATCHMODE tag is set to \c YES, doxygen will add the \\batchmode.
- command to the generated \f$\mbox{\LaTeX}\f$ files. This will
- instruct \f$\mbox{\LaTeX}\f$ to keep running if errors occur, instead of
- asking the user for help. This option is also used when generating formulas
- in HTML.
-
-\anchor cfg_latex_hide_indices
-<dt>\c LATEX_HIDE_INDICES <dd>
- \addindex LATEX_HIDE_INDICES
-
- If \c LATEX_HIDE_INDICES is set to \c YES then doxygen will not
- include the index chapters (such as File Index, Compound Index, etc.)
- in the output.
-
-</dl>
-\section rtf_output RTF related options
-\anchor cfg_generate_rtf
-<dl>
-
-<dt>\c GENERATE_RTF <dd>
- \addindex GENERATE_RTF
- If the \c GENERATE_RTF tag is set to \c YES doxygen will generate RTF output.
- The RTF output is optimized for Word 97 and may not look too pretty with
- other readers/editors.
-
-\anchor cfg_rtf_output
-<dt>\c RTF_OUTPUT <dd>
- \addindex RTF_OUTPUT
- The \c RTF_OUTPUT tag is used to specify where the RTF docs will be put.
- If a relative path is entered the value of \c OUTPUT_DIRECTORY will be
- put in front of it. If left blank \c rtf will be used as the default path.
-
-\anchor cfg_compact_rtf
-<dt>\c COMPACT_RTF <dd>
- \addindex COMPACT_RTF
- If the \c COMPACT_RTF tag is set to \c YES doxygen generates more compact
- RTF documents. This may be useful for small projects and may help to
- save some trees in general.
-
-\anchor cfg_rtf_hyperlinks
-<dt>\c RTF_HYPERLINKS <dd>
- \addindex RTF_HYPERLINKS
- If the \c RTF_HYPERLINKS tag is set to \c YES, the RTF that is generated
- will contain hyperlink fields. The RTF file will
- contain links (just like the HTML output) instead of page references.
- This makes the output suitable for online browsing using Word or some other
- Word compatible reader that support those fields.
-
- \par note:
- WordPad (write) and others do not support links.
-
-\anchor cfg_rtf_stylesheet_file
-<dt>\c RTF_STYLESHEET_FILE <dd>
- \addindex RTF_STYLESHEET_FILE
- Load stylesheet definitions from file. Syntax is similar to doxygen's
- config file, i.e. a series of assignments. You only have to provide
- replacements, missing definitions are set to their default value.
-
- See also section \ref doxygen_usage for information on how to generate
- the default style sheet that doxygen normally uses.
-
-\anchor cfg_rtf_extensions_file
-<dt>\c RTF_EXTENSIONS_FILE <dd>
- Set optional variables used in the generation of an RTF document.
- Syntax is similar to doxygen's config file.
- A template extensions file can be generated using
- <code>doxygen -e rtf extensionFile</code>.
-
-</dl>
-
-\section man_output Man page related options
-\anchor cfg_generate_man
-<dl>
-
-<dt>\c GENERATE_MAN <dd>
- \addindex GENERATE_MAN
- If the \c GENERATE_MAN tag is set to \c YES (the default) doxygen will
- generate man pages for classes and files.
-
-\anchor cfg_man_output
-<dt>\c MAN_OUTPUT <dd>
- \addindex MAN_OUTPUT
- The \c MAN_OUTPUT tag is used to specify where the man pages will be put.
- If a relative path is entered the value of \c OUTPUT_DIRECTORY will be
- put in front of it. If left blank `man' will be used as the default path.
- A directory man3 will be created inside the directory specified by
- \c MAN_OUTPUT.
-
-\anchor cfg_man_extension
-<dt>\c MAN_EXTENSION <dd>
- \addindex MAX_EXTENSION
- The \c MAN_EXTENSION tag determines the extension that is added to
- the generated man pages (default is the subroutine's section .3)
-
-\anchor cfg_man_links
-<dt>\c MAN_LINKS <dd>
- \addindex MAN_LINKS
- If the \c MAN_LINKS tag is set to \c YES and doxygen generates man output,
- then it will generate one additional man file for each entity documented in
- the real man page(s). These additional files only source the real man page,
- but without them the man command would be unable to find the correct page.
- The default is \c NO.
-
-</dl>
-
-\section xml_output XML related options
-\anchor cfg_generate_xml
-<dl>
-
-<dt>\c GENERATE_XML <dd>
- \addindex GENERATE_XML
- If the \c GENERATE_XML tag is set to \c YES Doxygen will
- generate an XML file that captures the structure of
- the code including all documentation.
-
-\anchor cfg_xml_output
-<dt>\c XML_OUTPUT <dd>
- \addindex XML_OUTPUT
- The \c XML_OUTPUT tag is used to specify where the XML pages will be put.
- If a relative path is entered the value of \c OUTPUT_DIRECTORY will be
- put in front of it. If left blank \c xml will be used as the default path.
-
-\anchor cfg_xml_schema
-<dt>\c XML_SCHEMA <dd>
- \addindex XML_SCHEMA
- The \c XML_SCHEMA tag can be used to specify an XML schema,
- which can be used by a validating XML parser to check the
- syntax of the XML files.
-
-\anchor cfg_xml_dtd
-<dt>\c XML_DTD <dd>
- \addindex XML_DTD
- The \c XML_DTD tag can be used to specify an XML DTD,
- which can be used by a validating XML parser to check the
- syntax of the XML files.
-
-\anchor cfg_xml_programlisting
-<dt>\c XML_PROGRAMLISTING <dd>
- \addindex XML_PROGRAMLISTING
- If the \c XML_PROGRAMLISTING tag is set to \c YES Doxygen will
- dump the program listings (including syntax highlighting
- and cross-referencing information) to the XML output. Note that
- enabling this will significantly increase the size of the XML output.
-
-</dl>
-
-\section autogen_output AUTOGEN_DEF related options
-\anchor cfg_generate_autogen_def
-<dl>
-
-<dt>\c GENERATE_AUTOGEN_DEF <dd>
- \addindex GENERATE_AUTOGEN_DEF
- If the \c GENERATE_AUTOGEN_DEF tag is set to \c YES Doxygen will
- generate an AutoGen Definitions (see http://autogen.sf.net) file
- that captures the structure of the code including all
- documentation. Note that this feature is still experimental
- and incomplete at the moment.
-
-</dl>
-
-\section perlmod_output PERLMOD related options
-\anchor cfg_generate_perlmod
-<dl>
-
-<dt>\c GENERATE_PERLMOD <dd>
- \addindex GENERATE_PERLMOD
- If the \c GENERATE_PERLMOD tag is set to \c YES Doxygen will
- generate a Perl module file that captures the structure of
- the code including all documentation. Note that this
- feature is still experimental and incomplete at the
- moment.
-
-\anchor cfg_perlmod_latex
-<dt>\c PERLMOD_LATEX <dd>
- \addindex PERLMOD_LATEX
- If the \c PERLMOD_LATEX tag is set to \c YES Doxygen will generate
- the necessary Makefile rules, Perl scripts and LaTeX code to be able
- to generate PDF and DVI output from the Perl module output.
-
-\anchor cfg_perlmod_pretty
-<dt>\c PERLMOD_PRETTY <dd>
- \addindex PERLMOD_PRETTY
- If the \c PERLMOD_PRETTY tag is set to \c YES the Perl module output will be
- nicely formatted so it can be parsed by a human reader. This is useful
- if you want to understand what is going on. On the other hand, if this
- tag is set to \c NO the size of the Perl module output will be much smaller
- and Perl will parse it just the same.
-
-\anchor cfg_perlmod_makevar_prefix
-<dt>\c PERLMOD_MAKEVAR_PREFIX <dd>
- \addindex PERLMOD_MAKEVAR_PREFIX
- The names of the make variables in the generated doxyrules.make file
- are prefixed with the string contained in \c PERLMOD_MAKEVAR_PREFIX.
- This is useful so different doxyrules.make files included by the same
- Makefile don't overwrite each other's variables.
-
-</dl>
-
-\section config_prepro Preprocessor related options
-\anchor cfg_enable_preprocessing
-<dl>
-
-<dt>\c ENABLE_PREPROCESSING <dd>
- \addindex ENABLE_PREPROCESSING
- If the \c ENABLE_PREPROCESSING tag is set to \c YES (the default) doxygen will
- evaluate all C-preprocessor directives found in the sources and include
- files.
-
-\anchor cfg_macro_expansion
-<dt>\c MACRO_EXPANSION <dd>
- \addindex MACRO_EXPANSION
- If the \c MACRO_EXPANSION tag is set to \c YES doxygen will expand all macro
- names in the source code. If set to \c NO (the default) only conditional
- compilation will be performed. Macro expansion can be done in a controlled
- way by setting \c EXPAND_ONLY_PREDEF to \c YES.
-
-\anchor cfg_expand_only_predef
-<dt>\c EXPAND_ONLY_PREDEF <dd>
- \addindex EXPAND_ONLY_PREDEF
- If the \c EXPAND_ONLY_PREDEF and \c MACRO_EXPANSION tags are both set to YES
- then the macro expansion is limited to the macros specified with the
- \c PREDEFINED and \c EXPAND_AS_DEFINED tags.
-
-\anchor cfg_search_includes
-<dt>\c SEARCH_INCLUDES <dd>
- \addindex SEARCH_INCLUDES
- If the \c SEARCH_INCLUDES tag is set to \c YES (the default) the includes files
- in the \c INCLUDE_PATH (see below) will be searched if a \#include is found.
-
-\anchor cfg_include_path
-<dt>\c INCLUDE_PATH <dd>
- \addindex INCLUDE_PATH
- The \c INCLUDE_PATH tag can be used to specify one or more directories that
- contain include files that are not input files but should be processed by
- the preprocessor.
-
-\anchor cfg_predefined
-<dt>\c PREDEFINED <dd>
- \addindex PREDEFINED
- The \c PREDEFINED tag can be used to specify one or more macro names that
- are defined before the preprocessor is started (similar to the -D option of
- gcc). The argument of the tag is a list of macros of the form:
- <code>name</code> or <code>name=definition</code> (no spaces).
- If the definition and the "=" are omitted, "=1" is assumed. To prevent
- a macro definition from being undefined via \#undef or recursively expanded
- use the := operator instead of the = operator.
-
-\anchor cfg_expand_as_defined
-<dt>\c EXPAND_AS_DEFINED <dd>
- \addindex EXPAND_AS_DEFINED
- If the \c MACRO_EXPANSION and \c EXPAND_ONLY_PREDEF tags are set to \c YES then
- this tag can be used to specify a list of macro names that should be expanded.
- The macro definition that is found in the sources will be used.
- Use the \c PREDEFINED tag if you want to use a different macro definition.
-
-\anchor cfg_skip_function_macros
-<dt>\c SKIP_FUNCTION_MACROS <dd>
- \addindex SKIP_FUNCTION_MACROS
- If the \c SKIP_FUNCTION_MACROS tag is set to \c YES (the default) then
- doxygen's preprocessor will remove all function-like macros that are alone
- on a line, have an all uppercase name, and do not end with a semicolon.
- Such function macros are typically
- used for boiler-plate code, and will confuse the parser if not removed.
-
-</dl>
-\section config_extref External reference options
-\anchor cfg_tagfiles
-<dl>
-
-<dt>\c TAGFILES <dd>
- \addindex TAGFILES
- The \c TAGFILES tag can be used to specify one or more tagfiles.
-
- See section \ref doxytag_usage for more information about the usage of
- tag files.
-
- Optionally an initial location of the external documentation
- can be added for each tagfile.
- The format of a tag file without this location is as follows:
- <pre>
-TAGFILES = file1 file2 ... </pre>
- Adding location for the tag files is done as follows:
- <pre>
-TAGFILES = file1=loc1 "file2 = loc2" ... </pre>
- where \c loc1 and \c loc2 can be relative or absolute paths or URLs,
- If a location is present for each tag, the installdox tool (see
- section \ref installdox_usage for more information) does not
- have to be run to correct the links.
-
- \par Note:
- Each tag file must have a unique name
- (where the name does \e not include the path)
- If a tag file is not located in the directory in which doxygen
- is run, you must also specify the path to the tagfile here.
-
-\anchor cfg_generate_tagfile
-<dt>\c GENERATE_TAGFILE <dd>
- \addindex GENERATE_TAGFILE
- When a file name is specified after \c GENERATE_TAGFILE, doxygen will create
- a tag file that is based on the input files it reads.
- See section \ref doxytag_usage for more information about the usage of
- tag files.
-
-\anchor cfg_allexternals
-<dt>\c ALLEXTERNALS <dd>
- \addindex ALLEXTERNALS
- If the \c ALLEXTERNALS tag is set to \c YES all external class will be listed
- in the class index. If set to \c NO only the inherited external classes
- will be listed.
-
-\anchor cfg_external_groups
-<dt>\c EXTERNAL_GROUPS <dd>
- \addindex EXTERNAL_GROUPS
- If the \c EXTERNAL_GROUPS tag is set to \c YES all external groups will be listed
- in the modules index. If set to \c NO, only the current project's groups will
- be listed.
-
-\anchor cfg_perl_path
-<dt>\c PERL_PATH <dd>
- \addindex PERL_PATH
- The \c PERL_PATH should be the absolute path and name of the perl script
- interpreter (i.e. the result of `<tt>which perl</tt>').
-
-</dl>
-\section config_dot Dot options
-\anchor cfg_class_diagrams
-<dl>
-
-<dt>\c CLASS_DIAGRAMS <dd>
- \addindex CLASS_DIAGRAMS
- If the \c CLASS_DIAGRAMS tag is set to \c YES (the default) doxygen will
- generate a class diagram (in HTML and \f$\mbox{\LaTeX}\f$) for classes with base or
- super classes. Setting the tag to \c NO turns the diagrams off.
- Note that this option is superseded by the HAVE_DOT option below.
- This is only a fallback. It is recommended to install and use dot,
- since it yields more powerful graphs.
-
-\anchor cfg_have_dot
-<dt>\c HAVE_DOT <dd>
- \addindex HAVE_DOT
- If you set the \c HAVE_DOT tag to \c YES then doxygen will assume the dot tool is
- available from the path. This tool is part of
- <a href="http://www.research.att.com/sw/tools/graphviz/">Graphviz</a>, a graph
- visualization toolkit from AT\&T and Lucent Bell Labs. The other options in
- this section have no effect if this option is set to \c NO (the default)
-
-\anchor cfg_class_graph
-<dt>\c CLASS_GRAPH <dd>
- \addindex CLASS_GRAPH
- If the \c CLASS_GRAPH and \c HAVE_DOT tags are set to \c YES then doxygen
- will generate a graph for each documented class showing the direct and
- indirect inheritance relations. Setting this tag to \c YES will force the
- the \c CLASS_DIAGRAMS tag to NO.
-
-\anchor cfg_collaboration_graph
-<dt>\c COLLABORATION_GRAPH <dd>
- \addindex COLLABORATION_GRAPH
- If the \c COLLABORATION_GRAPH and \c HAVE_DOT tags are set to \c YES then doxygen
- will generate a graph for each documented class showing the direct and
- indirect implementation dependencies (inheritance, containment, and
- class references variables) of the class with other documented classes.
-
-\anchor cfg_group_graphs
-<dt>\c GROUP_GRAPHS <dd>
- \addindex GROUP_GRAPHS
- If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen
- will generate a graph for groups, showing the direct groups dependencies.
-
-\anchor cfg_uml_look
-<dt>\c UML_LOOK <dd>
- \addindex UML_LOOK
- If the UML_LOOK tag is set to YES doxygen will generate inheritance and
- collaboration diagrams in a style similar to the OMG's Unified Modeling
- Language.
-
-\anchor cfg_template_relations
-<dt>\c TEMPLATE_RELATIONS <dd>
- \addindex TEMPLATE_RELATIONS
- If the \c TEMPLATE_RELATIONS and \c HAVE_DOT tags are set to \c YES then
- doxygen will show the relations between templates and their instances.
-
-\anchor cfg_hide_undoc_relations
-<dt>\c HIDE_UNDOC_RELATIONS <dd>
- \addindex HIDE_UNDOC_RELATIONS
- If set to YES, the inheritance and collaboration graphs will hide
- inheritance and usage relations if the target is undocumented
- or is not a class.
-
-\anchor cfg_include_graph
-<dt>\c INCLUDE_GRAPH <dd>
- \addindex INCLUDE_GRAPH
- If the \c ENABLE_PREPROCESSING, \c SEARCH_INCLUDES, \c INCLUDE_GRAPH, and \c HAVE_DOT
- tags are set to \c YES then doxygen will generate a graph for each documented file
- showing the direct and indirect include dependencies of the file with other
- documented files.
-
-\anchor cfg_included_by_graph
-<dt>\c INCLUDED_BY_GRAPH <dd>
- \addindex INCLUDED_BY_GRAPH
- If the \c ENABLE_PREPROCESSING, \c SEARCH_INCLUDES, \c INCLUDED_BY_GRAPH, and
- \c HAVE_DOT tags are set to \c YES then doxygen will generate a graph for each
- documented header file showing the documented files that directly or indirectly
- include this file.
-
-\anchor cfg_call_graph
-<dt>\c CALL_GRAPH <dd>
- \addindex CALL_GRAPH
- If the \c CALL_GRAPH and \c HAVE_DOT tags are set to \c YES then doxygen will
- generate a call dependency graph for every global function or class method.
- Note that enabling this option will significantly increase the time of a run.
- So in most cases it will be better to enable call graphs for selected
- functions only using the \\callgraph command.
-
-\anchor cfg_graphical_hierarchy
-<dt>\c GRAPHICAL_HIERARCHY <dd>
- \addindex GRAPHICAL_HIERARCHY
- If the \c GRAPHICAL_HIERARCHY and \c HAVE_DOT tags are set to \c YES then
- doxygen will graphical hierarchy of all classes instead of a textual one.
-
-\anchor cfg_directory_graph
-<dt>\c DIRECTORY_GRAPH <dd>
- \addindex DIRECTORY_GRAPH
- If the \c DIRECTORY_GRAPH, \c SHOW_DIRECTORIES and \c HAVE_DOT options are set
- to \c YES then doxygen will show the dependencies a directory has on other directories
- in a graphical way. The dependency relations are determined by the \#include
- relations between the files in the directories.
-
-\anchor cfg_dot_image_format
-<dt>\c DOT_IMAGE_FORMAT <dd>
- \addindex DOT_IMAGE_FORMAT
- The \c DOT_IMAGE_FORMAT tag can be used to set the image format of the images
- generated by dot. Possible values are gif, jpg, and png.
- If left blank png will be used.
-
-\anchor cfg_dot_path
-<dt>\c DOT_PATH <dd>
- \addindex DOT_PATH
- This tag can be used to specify the path where the dot tool can be found.
- If left blank, it is assumed the dot tool can be found on the path.
-
-\anchor cfg_dotfile_dirs
-<dt>\c DOTFILE_DIRS <dd>
- \addindex DOTFILE_DIRS
- This tag can be used to specify one or more directories that
- contain dot files that are included in the documentation (see the
- \\dotfile command).
-
-\anchor cfg_max_dot_graph_height
-<dt>\c MAX_DOT_GRAPH_HEIGHT <dd>
- \addindex MAX_DOT_GRAPH_HEIGHT
- The \c MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
- (in pixels) of the graphs generated by dot. If a graph becomes larger than
- this value, doxygen will try to truncate the graph, so that it fits within
- the specified constraint. Beware that most browsers cannot cope with very
- large images.
-
-\anchor cfg_max_dot_graph_depth
-<dt>\c MAX_DOT_GRAPH_DEPTH <dd>
-\addindex MAX_DOT_GRAPH_DEPTH
-The \c MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
-graphs generated by dot. A depth value of 3 means that only nodes reachable
-from the root by following a path via at most 3 edges will be shown. Nodes that
-lay further from the root node will be omitted. Note that setting this option to
-1 or 2 may greatly reduce the computation time needed for large code bases. Also
-note that a graph may be further truncated if the graph's image dimensions are
-not sufficient to fit the graph (see
-\ref cfg_max_dot_graph_width "MAX_DOT_GRAPH_WIDTH" and
-\ref cfg_max_dot_graph_height "MAX_DOT_GRAPH_HEIGHT").
-If 0 is used for the depth value (the default), the graph is
-not depth-constraint.
-
-\anchor cfg_max_dot_graph_width
-<dt>\c MAX_DOT_GRAPH_WIDTH <dd>
- \addindex MAX_DOT_GRAPH_WIDTH
- The \c MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
- (in pixels) of the graphs generated by dot. If a graph becomes larger than
- this value, doxygen will try to truncate the graph, so that it fits within
- the specified constraint. Beware that most browsers cannot cope with very
- large images.
-
-\anchor cfg_dot_transparent
-<dt>\c DOT_TRANSPARENT <dd>
- \addindex DOT_TRANSPARENT
- Set the \c DOT_TRANSPARENT tag to \c YES to generate images with a transparent
- background. This is disabled by default, which results in a white background.
- Warning: Depending on the platform used, enabling this option may lead to badly
- anti-aliased labels on the edges of a graph (i.e. they become hard to read).
-
-\anchor cfg_dot_multi_targets
-<dt>\c DOT_MULTI_TARGETS <dd>
- \addindex DOT_MULTI_TARGET
- Set the \c DOT_MULTI_TARGETS tag to \c YES allow dot to generate multiple output
- files in one run (i.e. multiple -o and -T options on the command line). This
- makes dot run faster, but since only newer versions of dot (>1.8.10)
- support this, this feature is disabled by default.
-
-\anchor cfg_generate_legend
-<dt>\c GENERATE_LEGEND <dd>
- \addindex GENERATE_LEGEND
- If the \c GENERATE_LEGEND tag is set to \c YES (the default) doxygen will
- generate a legend page explaining the meaning of the various boxes and
- arrows in the dot generated graphs.
-
-\anchor cfg_dot_cleanup
-<dt>\c DOT_CLEANUP <dd>
- \addindex DOT_CLEANUP
-If the \c DOT_CLEANUP tag is set to \c YES (the default) doxygen will
-remove the intermediate dot files that are used to generate the various graphs.
-
-
-</dl>
-\section config_search Search engine options
-\anchor cfg_searchengine
-<dl>
-
-<dt>\c SEARCHENGINE <dd>
- \addindex SEARCHENGINE
- The \c SEARCHENGINE tag specifies whether or not the HTML output should
- contain a search facility. Possible values are \c YES and \c NO.
- If set to YES, doxygen will produce a search index and a PHP script
- to search through the index. For this to work the documentation should
- be viewed via a web-server running PHP version 4.1.0 or higher.
- (See http://www.php.net/manual/en/installation.php for installation
- instructions).
-
-</dl>
-<h2>Examples</h2>
-
-Suppose you have a simple project consisting of two files: a source file
-\c example.cc and a header file \c example.h.
-Then a minimal configuration file is as simple as:
-\verbatim
-INPUT = example.cc example.h
-\endverbatim
-
-Assuming the example makes use of Qt classes and perl is located
-in <code>/usr/bin</code>, a more realistic configuration file would be:
-\verbatim
-PROJECT_NAME = Example
-INPUT = example.cc example.h
-WARNINGS = YES
-TAGFILES = qt.tag
-PERL_PATH = /usr/bin/perl
-SEARCHENGINE = NO
-\endverbatim
-
-To generate the documentation for the
-<a href="http://www.stack.nl/~dimitri/qdbttabular/index.html">QdbtTabular</a> package
-I have used the following configuration file:
-\verbatim
-PROJECT_NAME = QdbtTabular
-OUTPUT_DIRECTORY = html
-WARNINGS = YES
-INPUT = examples/examples.doc src
-FILE_PATTERNS = *.cc *.h
-INCLUDE_PATH = examples
-TAGFILES = qt.tag
-PERL_PATH = /usr/local/bin/perl
-SEARCHENGINE = YES
-\endverbatim
-
-To regenerate the Qt-1.44 documentation from the sources, you could use the
-following config file:
-\verbatim
-PROJECT_NAME = Qt
-OUTPUT_DIRECTORY = qt_docs
-HIDE_UNDOC_MEMBERS = YES
-HIDE_UNDOC_CLASSES = YES
-ENABLE_PREPROCESSING = YES
-MACRO_EXPANSION = YES
-EXPAND_ONLY_PREDEF = YES
-SEARCH_INCLUDES = YES
-FULL_PATH_NAMES = YES
-STRIP_FROM_PATH = $(QTDIR)/
-PREDEFINED = USE_TEMPLATECLASS Q_EXPORT= \
- QArrayT:=QArray \
- QListT:=QList \
- QDictT:=QDict \
- QQueueT:=QQueue \
- QVectorT:=QVector \
- QPtrDictT:=QPtrDict \
- QIntDictT:=QIntDict \
- QStackT:=QStack \
- QDictIteratorT:=QDictIterator \
- QListIteratorT:=QListIterator \
- QCacheT:=QCache \
- QCacheIteratorT:=QCacheIterator \
- QIntCacheT:=QIntCache \
- QIntCacheIteratorT:=QIntCacheIterator \
- QIntDictIteratorT:=QIntDictIterator \
- QPtrDictIteratorT:=QPtrDictIterator
-INPUT = $(QTDIR)/doc \
- $(QTDIR)/src/widgets \
- $(QTDIR)/src/kernel \
- $(QTDIR)/src/dialogs \
- $(QTDIR)/src/tools
-FILE_PATTERNS = *.cpp *.h q*.doc
-INCLUDE_PATH = $(QTDIR)/include
-RECURSIVE = YES
-\endverbatim
-
-For the Qt-2.1 sources I recommend to use the following settings:
-\verbatim
-PROJECT_NAME = Qt
-PROJECT_NUMBER = 2.1
-HIDE_UNDOC_MEMBERS = YES
-HIDE_UNDOC_CLASSES = YES
-SOURCE_BROWSER = YES
-INPUT = $(QTDIR)/src
-FILE_PATTERNS = *.cpp *.h q*.doc
-RECURSIVE = YES
-EXCLUDE_PATTERNS = *codec.cpp moc_* */compat/* */3rdparty/*
-ALPHABETICAL_INDEX = YES
-COLS_IN_ALPHA_INDEX = 3
-IGNORE_PREFIX = Q
-ENABLE_PREPROCESSING = YES
-MACRO_EXPANSION = YES
-INCLUDE_PATH = $(QTDIR)/include
-PREDEFINED = Q_PROPERTY(x)= \
- Q_OVERRIDE(x)= \
- Q_EXPORT= \
- Q_ENUMS(x)= \
- "QT_STATIC_CONST=static const " \
- _WS_X11_ \
- INCLUDE_MENUITEM_DEF
-EXPAND_ONLY_PREDEF = YES
-EXPAND_AS_DEFINED = Q_OBJECT_FAKE Q_OBJECT ACTIVATE_SIGNAL_WITH_PARAM \
- Q_VARIANT_AS
-\endverbatim
-
-Here doxygen's preprocessor is used to substitute some
-macro names that are normally substituted by the C preprocessor,
-but without doing full macro expansion.
-
-*/
-
diff --git a/doc/diagrams.doc b/doc/diagrams.doc
deleted file mode 100644
index 7b3c46e..0000000
--- a/doc/diagrams.doc
+++ /dev/null
@@ -1,140 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-/*! \page diagrams Graphs and diagrams
-
- Doxygen has built-in support to generate inheritance diagrams for C++
- classes.
-
- Doxygen can use the "dot" tool from graphviz 1.5 to generate
- more advanced diagrams and graphs. Graphviz is an "open-sourced",
- cross-platform graph drawing toolkit from AT\&T and Lucent Bell Labs and
- can be found at http://www.research.att.com/sw/tools/graphviz/
-
- If you have the "dot" tool available in the path, you can set
- \ref cfg_have_dot "HAVE_DOT" to \c YES in the configuration file to
- let doxygen use it.
-
- Doxygen uses the "dot" tool to generate the following graphs:
- <ul>
- <li>if \ref cfg_graphical_hierarchy "GRAPHICAL_HIERARCHY" is set to \c YES,
- a graphical representation of the class hierarchy will be drawn, along
- with the textual one. Currently this feature is supported for HTML only.\n
- <b>Warning:</b> When you have a very large class hierarchy where many
- classes derive from a common base class, the resulting image may become
- too big to handle for some browsers.
- <li>if \ref cfg_class_graph "CLASS_GRAPH" is set to \c YES,
- a graph will be generated for each documented class showing the
- direct and indirect inheritance relations. This disables the
- generation of the built-in class inheritance diagrams.
- <li>if \ref cfg_include_graph "INCLUDE_GRAPH" is set to \c YES, an include
- dependency graph is generated for each documented file that includes at
- least one other file. This feature is currently supported for HTML and RTF
- only.
- <li>if \ref cfg_collaboration_graph "COLLABORATION_GRAPH" is set to YES, a
- graph is drawn for each documented class and struct that shows:
- <ul>
- <li> the inheritance relations with base classes.
- <li> the usage relations with other structs and classes (e.g.
- class \c A has a member variable \c m_a of type class \c B, then
- \c A has an arrow to \c B with \c m_a as label).
- </ul>
- <li>if \ref cfg_call_graph "CALL_GRAPH" is set to YES, a
- graphical call graph is drawn for each function showing the
- functions that the function directly or indirectly calls.
- </ul>
-
- The elements in the class diagrams in HTML and RTF
- have the following meaning:
- <ul>
- <li> A \b yellow box indicates a class. A box can have a
- little marker in the lower right corner to indicate that the class
- contains base classes that are hidden.
- For the class diagrams the maximum tree width is currently 8 elements.
- If a tree is wider some nodes will be hidden.
- If the box is filled with a
- dashed pattern the inheritance relation is virtual.
- <li> A \b white box indicates that the documentation of the class
- is currently shown.
- <li> A \b grey box indicates an undocumented class.
- <li> A <b>solid dark blue</b> arrow indicates public inheritance.
- <li> A <b>dashed dark green</b> arrow indicates protected inheritance.
- <li> A <b>dotted dark green</b> arrow indicates private inheritance.
- </ul>
-
- The elements in the class diagram in \f$\mbox{\LaTeX}\f$ have the
- following meaning:
- <ul>
- <li> A \b white box indicates a class.
- A \b marker in the lower right corner of the box indicates that the
- class has base classes that are hidden.
- If the box has a \b dashed border this indicates virtual inheritance.
- <li> A \b solid arrow indicates public inheritance.
- <li> A \b dashed arrow indicates protected inheritance.
- <li> A \b dotted arrow indicates private inheritance.
- </ul>
-
- The elements in the graphs generated by the dot tool have the following
- meaning:
- <ul>
- <li> A \b white box indicates a class or struct or file.
- <li> A box with a \b red border indicates a node that has
- \e more arrows than are shown!
- In other words: the graph is \e truncated with respect to this node.
- The reason why a graph is sometimes truncated is to prevent images
- from becoming too large.
- For the graphs generated with dot doxygen tries
- to limit the width of the resulting image to 1024 pixels.
- <li> A \b black box indicates that the class' documentation is currently shown.
- <li> A <b>dark blue</b> arrow indicates an include relation (for the
- include dependency graph) or public inheritance (for the other graphs).
- <li> A <b>dark green</b> arrow indicates protected inheritance.
- <li> A <b>dark red</b> arrow indicates private inheritance.
- <li> A <b>purple dashed</b> arrow indicated a "usage" relation, the
- edge of the arrow is labled with the variable(s) responsible for the
- relation.
- Class \c A uses class \c B, if class \c A has a member variable \c m
- of type C, where B is a subtype of C (e.g. C could be \c B, \c B*, <code>T\<B\>*</code> ).
- </ul>
-
-
-Here are a couple of header files that together show the various diagrams
-that doxygen can generate:
-
-<code>diagrams_a.h</code>
-\verbinclude diagrams_a.h
-<code>diagrams_b.h</code>
-\verbinclude diagrams_b.h
-<code>diagrams_c.h</code>
-\verbinclude diagrams_c.h
-<code>diagrams_d.h</code>
-\verbinclude diagrams_d.h
-<code>diagrams_e.h</code>
-\verbinclude diagrams_e.h
-
- \htmlonly
- Click <a href="$(DOXYGEN_DOCDIR)/examples/diagrams/html/index.html">here</a>
- for the corresponding HTML documentation that is generated by doxygen<br>
- (<code>EXTRACT_ALL</code> = <code>YES</code> is used here).
- \endhtmlonly
-
-\htmlonly
-Go to the <a href="preprocessing.html">next</a> section or return to the
- <a href="index.html">index</a>.
-\endhtmlonly
-
-*/
-
diff --git a/doc/docblocks.doc b/doc/docblocks.doc
deleted file mode 100644
index a0132d8..0000000
--- a/doc/docblocks.doc
+++ /dev/null
@@ -1,396 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-/*! \page docblocks Documenting the code
-
-\section specialblock Special documentation blocks
-
-A special documentation block is a C or C++ style comment block with some
-additional markings, so doxygen knows it is a piece of documentation that
-needs to end up in the generated documentation. For Python code there is
-a different comment convention, which can be found in section
-\ref pythonblocks
-
-For each code item there are two types of descriptions, which together
-form the documentation: a \e brief description and \e detailed
-description, both are optional.
-Having more than one brief or detailed description however, is
-not allowed.
-
-As the name suggest, a brief description is
-a short one-liner, whereas the detailed description provides longer,
-more detailed documentation.
-
-There are several ways to mark a comment block as a detailed description:
-<ol>
-<li> You can use the JavaDoc style, which consist of a C-style comment
-block starting with two *'s, like this:
-
-\verbatim
-/**
- * ... text ...
- */
-\endverbatim
-
-<li> or you can use the Qt style and add an exclamation mark (!)
-after the opening of a C-style comment block, as shown in this example:
-
-\verbatim
-/*!
- * ... text ...
- */
-\endverbatim
-
-In both cases the intermediate *'s are optional, so
-
-\verbatim
-/*!
- ... text ...
-*/
-\endverbatim
-
-is also valid.
-
-<li> A third alternative is to use a block of at least two C++ comment
-lines, where each line starts with an additional slash or an
-exclamation mark. Here are examples of the two cases:
-
-\verbatim
-///
-/// ... text ...
-///
-\endverbatim
-
-or
-
-\verbatim
-//!
-//!... text ...
-//!
-\endverbatim
-
-<li>
-
-Some people like to make their comment blocks more visible in the
-documentation. For this purpose you can use the following:
-
-\verbatim
-/////////////////////////////////////////////////
-/// ... text ...
-/////////////////////////////////////////////////
-\endverbatim
-
-</ol>
-
-For the brief description there are also several posibilities:
-<ol>
-<li>One could use the \ref cmdbrief "\\brief" command with one of the
-above comment blocks. This command ends at the end of a paragraph,
-so the detailed description follows after an empty line.
-
-Here is an example:
-
-\verbatim
-/*! \brief Brief description.
- * Brief description continued.
- *
- * Detailed description starts here.
- */
-\endverbatim
-
-<li>If \ref cfg_javadoc_autobrief "JAVADOC_AUTOBRIEF" is set to \c YES
- in the configuration file,
- then using JavaDoc style comment
- blocks will automatically start a brief description which ends at the
- first dot followed by a space or new line. Here is an example:
-
-\verbatim
-/** Brief description which ends at this dot. Details follow
- * here.
- */
-\endverbatim
-The option has the same effect for multi-line special C++ comments:
-\verbatim
-/// Brief description which ends at this dot. Details follow
-/// here.
-\endverbatim
-
-<li>A third option is to use a special C++ style comment which does not
- span more than one line. Here are two examples:
-\verbatim
-/// Brief description.
-/** Detailed description. */
-\endverbatim
-
-or
-
-\verbatim
-//! Brief descripion.
-
-//! Detailed description
-//! starts here.
-\endverbatim
-
-Note the blank line in the last example, which is required to separate the
-brief description from the block containing the detailed description. The
-\ref cfg_javadoc_autobrief "JAVADOC_AUTOBRIEF" should also be set to \c NO
-for this case.
-
-</ol>
-
-As you can see doxygen is quite flexible. The following however is
-not legal
-
-\verbatim
-//! Brief description, which is
-//! really a detailed description since it spans multiple lines.
-/*! Oops, another detailed description!
- */
-\endverbatim
-
-because doxygen only allows one brief and one detailed description.
-
-Furthermore, if there is one brief description before a declaration
-and one before a definition of a code item, only the one before
-the \e declaration will be used. If the same situation occurs for a
-detailed description, the one before the \e definition is preferred
-and the one before the declaration will be ignored.
-
-Here is an example of a documented piece of C++ code using the Qt style:
-\include qtstyle.cpp
- \htmlonly
- Click <a href="$(DOXYGEN_DOCDIR)/examples/qtstyle/html/class_test.html">here</a>
- for the corresponding HTML documentation that is generated by doxygen.
- \endhtmlonly
-
-The one-line comments contain a brief description,
-whereas the multi-line comment blocks contain a more detailed description.
-
-The brief descriptions are included in the member overview of a
-class, namespace or file and are printed using a small italic font
-(this description can be hidden by setting
-\ref cfg_brief_member_desc "BRIEF_MEMBER_DESC" to \c NO in
-the config file). By default the brief descriptions become the first
-sentence of the detailed descriptions
-(but this can be changed by setting the \ref cfg_repeat_brief "REPEAT_BRIEF"
-tag to \c NO). Both the brief and the detailed descriptions are optional
-for the Qt style.
-
-By default a JavaDoc style documentation block behaves the same way as a
-Qt style documentation block. This is not according the JavaDoc specification
-however, where the first sentence of the documentation block is automatically
-treated as a brief description. To enable this behaviour you should set
-\ref cfg_javadoc_autobrief "JAVADOC_AUTOBRIEF" to YES in the configuration
-file. If you enable this option and want to put a dot in the middle of a
-sentence without ending it, you should put a backslash and a space after it.
-Here is an example:
-\verbatim
- /** Brief description (e.g.\ using only a few words). Details follow. */
-\endverbatim
-
-Here is the same piece of code as shown above, this time documented using the
-JavaDoc style and \ref cfg_javadoc_autobrief "JAVADOC_AUTOBRIEF" set to YES:
-\include jdstyle.cpp
- \htmlonly
- Click <a href="$(DOXYGEN_DOCDIR)/examples/jdstyle/html/class_test.html">here</a>
- for the corresponding HTML documentation that is generated by doxygen.
- \endhtmlonly
-
-Unlike most other documentation systems, doxygen also allows you to put
-the documentation of members (including global functions) in front of
-the \e definition. This way the documentation can be placed in the source
-file instead of the header file. This keeps the header file compact, and allows the
-implementer of the members more direct access to the documentation.
-As a compromise the brief description could be placed before the
-declaration and the detailed description before the member definition.
-
-\section memberdoc Putting documentation after members
-
-If you want to document the members of a file, struct, union, class, or enum,
-and you want to put the documentation for these members inside the compound,
-it is sometimes desired to place the documentation block after the member
-instead of before. For this purpose you should put an additional \< marker
-in the comment block.
-
-Here are some examples:
-\verbatim
-int var; /*!< Detailed description after the member */
-\endverbatim
-This block can be used to put a Qt style detailed
-documentation block \e after a member. Other ways to do the
-same are:
-\verbatim
-int var; /**< Detailed description after the member */
-\endverbatim
-or
-\verbatim
-int var; //!< Detailed description after the member
- //!<
-\endverbatim
-or
-\verbatim
-int var; ///< Detailed description after the member
- ///<
-\endverbatim
-
-Most often one only wants to put a brief description after a member.
-This is done as follows:
-\verbatim
-int var; //!< Brief description after the member
-\endverbatim
-or
-\verbatim
-int var; ///< Brief description after the member
-\endverbatim
-
-Note that these blocks have the same structure and meaning as the
-special comment blocks in the previous section
-only the \< indicates that the member is
-located in front of the block instead of after the block.
-
-Here is an example of the use of these comment blocks:
-\include afterdoc.h
- \htmlonly
- Click <a href="$(DOXYGEN_DOCDIR)/examples/afterdoc/html/class_test.html">here</a>
- for the corresponding HTML documentation that is generated by doxygen.
- \endhtmlonly
-
-\warning These blocks can only be used to document \e members and \e parameters.
- They cannot be used to document files, classes, unions, structs,
- groups, namespaces and enums themselves. Furthermore, the structural
- commands mentioned in the next section
- (like <code>\\class</code>) are ignored inside these comment blocks.
-
-\section structuralcommands Documentation at other places
-
-So far we have assumed that the documentation blocks are always located in
-front of the declaration or definition of a file, class or namespace or in
-front or after one of its members.
-Although this is often comfortable, there may sometimes be reasons to put the
-documentation somewhere else. For documenting a file this is even
-required since there is no such thing as "in front of a file".
-Doxygen allows you to put your documentation blocks practically
-anywhere (the exception is inside the body of a function or inside a
-normal C style comment block).
-
-The price you pay for not putting the
-documentation block before (or after) an item is the need to put a
-structural command inside the documentation block, which leads to some
-duplication of information.
-
-Structural commands (like all other commands) start with a backslash
-(<tt>\\</tt>), or an at-sign (<tt>\@</tt>) if you prefer JavaDoc style,
-followed by a command name and one or more parameters.
-For instance, if you want to document the class \c Test in the example
-above, you could have also put the following documentation block somewhere
-in the input that is read by doxygen:
-\verbatim
-/*! \class Test
- \brief A test class.
-
- A more detailed class description.
-*/
-\endverbatim
-
-Here the special command \c \\class is used to indicate that the
-comment block contains documentation for the class \c Test.
-Other structural commands are:
-<ul>
-<li>\c \\struct to document a C-struct.
-<li>\c \\union to document a union.
-<li>\c \\enum to document an enumeration type.
-<li>\c \\fn to document a function.
-<li>\c \\var to document a variable or typedef or enum value.
-<li>\c \\def to document a \#define.
-<li>\c \\typedef to document a type definition.
-<li>\c \\file to document a file.
-<li>\c \\namespace to document a namespace.
-<li>\c \\package to document a Java package.
-<li>\c \\interface to document an IDL interface.
-</ul>
-See section \ref commands for detailed information about these and many other
-commands.
-
-To document a member of a C++ class, you must also document the class
-itself. The same holds for namespaces. To document a global C function,
-typedef, enum or preprocessor definition you must first document the file
-that contains it (usually this will be a header file, because that file
-contains the information that is exported to other source files).
-
-Let's repeat that, because it is often overlooked:
-to document global objects (functions, typedefs, enum, macros, etc), you
-<em>must</em> document the file in which they are defined. In other words,
-there <em>must</em> at least be a \verbatim /*! \file */ \endverbatim
-or a \verbatim /** @file */ \endverbatim line in this file.
-
-Here is an example of a C header named \c structcmd.h that is documented
-using structural commands:
-\include structcmd.h
- \htmlonly
- Click <a href="$(DOXYGEN_DOCDIR)/examples/structcmd/html/structcmd_8h.html">here</a>
- for the corresponding HTML documentation that is generated by doxygen.
- \endhtmlonly
-
- Because each comment block in the example above contains a structural command, all
- the comment blocks could be moved to another location or input file
- (the source file for instance), without affecting the generated
- documentation. The disadvantage of this approach is that prototypes are
- duplicated, so all changes have to be made twice! Because of this you
- should first consider if this is really needed, and avoid structural
- commands if possible. I often receive examples that contain \\fn command
- in comment blocks which are place in front of a function. This is clearly
- a case where the \\fn command is redundant and will only lead to problems.
-
-\section pythonblocks Special documentation 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__
-and can be retrieved at runtime. Doxygen will extract such comments
-and assume they have to be represented in a preformatted way.
-
-\include docstring.py
- \htmlonly
- Click <a href="$(DOXYGEN_DOCDIR)/examples/docstring/html/index.html">here</a>
- for the corresponding HTML documentation that is generated by doxygen.
- \endhtmlonly
-
-Note that in this case none of doxygen's \ref cmd_intro "special commands"
-are supported.
-
-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
-way documentation blocks work for the other languages support doxygen
-and this also allows the use of special commands.
-
-Here is the same example again but now using doxygen style comments:
-
-\include pyexample.py
- \htmlonly
- Click <a href="$(DOXYGEN_DOCDIR)/examples/pyexample/html/index.html">here</a>
- for the corresponding HTML documentation that is generated by doxygen.
- \endhtmlonly
-
-Since python looks more like Java than like C or C++, you should set
-\ref cfg_optimize_output_java "OPTMIZE_OUTPUT_JAVA" to \c YES in the
-config file.
-
-
-\htmlonly
-Go to the <a href="lists.html">next</a> section or return to the
- <a href="index.html">index</a>.
-\endhtmlonly
-
-*/
diff --git a/doc/doxygen.1 b/doc/doxygen.1
deleted file mode 100644
index fc4ccd8..0000000
--- a/doc/doxygen.1
+++ /dev/null
@@ -1,46 +0,0 @@
-.TH DOXYGEN "1" "DATE" "doxygen VERSION" "User Commands"
-.SH NAME
-doxygen \- documentation system for various programming languages
-.SH DESCRIPTION
-Doxygen is a documentation system for C++, C, Java, Objective-C, IDL
-(Corba and Microsoft flavors) and to some extent PHP, C#, and D.
-.PP
-You can use doxygen in a number of ways:
-.TP
-1) Use doxygen to generate a template configuration file:
-.IP
-doxygen [-s] \fB\-g\fR [configName]
-.IP
-If - is used for configName doxygen will write to standard output.
-.TP
-2) Use doxygen to update an old configuration file:
-.IP
-doxygen [-s] \fB\-u\fR [configName]
-.TP
-3) Use doxygen to generate documentation using an existing configuration file:
-.IP
-doxygen [configName]
-.IP
-If - is used for configName doxygen will read from standard input.
-.TP
-4) Use doxygen to generate a template style sheet file for RTF, HTML or Latex.
-.TP
-RTF:
-doxygen \fB\-w\fR rtf styleSheetFile
-.TP
-HTML:
-doxygen \fB\-w\fR html headerFile footerFile styleSheetFile [configFile]
-.TP
-LaTeX: doxygen \fB\-w\fR latex headerFile styleSheetFile [configFile]
-.TP
-5) Use doxygen to generate an rtf extensions file
-.TP
-RTF:
-doxygen \fB\-e\fR rtf extensionsFile
-.PP
-If \fB\-s\fR is specified the comments in the config file will be omitted.
-If configName is omitted `Doxyfile' will be used as a default.
-.SH AUTHOR
-Doxygen version VERSION, Copyright Dimitri van Heesch 1997-2005
-.SH SEE ALSO
-doxytag(1), doxywizard(1).
diff --git a/doc/doxygen.sty b/doc/doxygen.sty
deleted file mode 100644
index 7c24e26..0000000
--- a/doc/doxygen.sty
+++ /dev/null
@@ -1,72 +0,0 @@
-%
-%
-%
-% Copyright (C) 1997-2004 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.
-
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{doxygen}
-\RequirePackage{calc}
-\RequirePackage{array}
-\pagestyle{fancyplain}
-\addtolength{\headwidth}{\marginparsep}
-\addtolength{\headwidth}{\marginparwidth}
-\newcommand{\clearemptydoublepage}{\newpage{\pagestyle{empty}\cleardoublepage}}
-\lhead[\fancyplain{}{\bfseries\thepage}]
- {\fancyplain{}{\bfseries\rightmark}}
-\rhead[\fancyplain{}{\bfseries\leftmark}]
- {\fancyplain{}{\bfseries\thepage}}
-\rfoot[\fancyplain{}{\bfseries\scriptsize User Manual for Doxygen $VERSION, written by Dimitri van Heesch \copyright 1997-2004}]{}
-\lfoot[]{\fancyplain{}{\bfseries\scriptsize User Manual for Doxygen $VERSION, written by Dimitri van Heesch \copyright 1997-2004}}
-\cfoot{}
-\newenvironment{CompactList}
-{\begin{list}{}{
- \setlength{\leftmargin}{0.5cm}
- \setlength{\itemsep}{0pt}
- \setlength{\parsep}{0pt}
- \setlength{\topsep}{0pt}
- \renewcommand{\makelabel}{}}}
-{\end{list}}
-\newenvironment{CompactItemize}
-{
- \begin{itemize}
- \setlength{\itemsep}{-4pt}
- \setlength{\parsep}{0pt}
- \setlength{\topsep}{0pt}
- \setlength{\partopsep}{0pt}
-}
-{\end{itemize}}
-\newcommand{\PBS}[1]{\let\temp=\\#1\let\\=\temp}
-\newlength{\tmplength}
-\newenvironment{TabularC}[1]
-{
-\setlength{\tmplength}
- {\linewidth/(#1)-\tabcolsep*2-\arrayrulewidth*(#1+1)/(#1)}
- \par\begin{tabular*}{\linewidth}
- {*{#1}{|>{\PBS\raggedright\hspace{0pt}}p{\the\tmplength}}|}
-}
-{\end{tabular*}\par}
-\newcommand{\entrylabel}[1]{
- {\parbox[b]{\labelwidth-4pt}{\makebox[0pt][l]{\textbf{#1}}\\}}}
-\newenvironment{Desc}
-{\begin{list}{}
- {
- \settowidth{\labelwidth}{40pt}
- \setlength{\leftmargin}{\labelwidth}
- \setlength{\parsep}{0pt}
- \setlength{\itemsep}{-4pt}
- \renewcommand{\makelabel}{\entrylabel}
- }
-}
-{\end{list}}
-\setlength{\parindent}{0cm}
-\setlength{\parskip}{0.2cm}
-\sloppy
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_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
deleted file mode 100644
index 0514222..0000000
--- a/doc/doxygen_manual.tex
+++ /dev/null
@@ -1,78 +0,0 @@
-%
-%
-%
-% Copyright (C) 1997-2004 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.
-
-\documentclass[a4paper]{article}
-\usepackage{a4wide}
-\usepackage{makeidx}
-\usepackage{fancyhdr}
-\usepackage{float}
-\usepackage{graphicx}
-\usepackage{epsf}
-\usepackage{doxygen}
-\usepackage{multicol}
-\usepackage{times}
-\usepackage{alltt}
-\usepackage[pdftex,
- pagebackref=true,
- colorlinks=true,
- linkcolor=blue
- ]{hyperref}
-\makeindex
-\setcounter{tocdepth}{1}
-\renewcommand{\footrulewidth}{0.4pt}
-\begin{document}
-\begin{titlepage}
-\includegraphics[width=\textwidth]{doxygen_logo}
-\begin{center}
-Manual for version $VERSION\\[2ex]
-Written by Dimitri van Heesch\\[2ex]
-\copyright 1997-2004
-\end{center}
-\end{titlepage}
-\clearemptydoublepage
-\tableofcontents
-\clearemptydoublepage
-\pagenumbering{arabic}
-\include{index}
-\part{User Manual}
-\input{install}
-\input{starting}
-\input{docblocks}
-\input{lists}
-\input{grouping}
-\input{formulas}
-\input{diagrams}
-\input{preprocessing}
-\input{autolink}
-\input{output}
-\input{external}
-\input{faq}
-\input{trouble}
-\part{Reference Manual}
-\input{features}
-\input{history}
-\input{doxygen_usage}
-\input{doxytag_usage}
-\input{doxywizard_usage}
-\input{installdox_usage}
-\input{config}
-\input{commands}
-\input{htmlcmds}
-\part{Developers Manual}
-\input{arch}
-\input{perlmod}
-%\input{perlmod_tree}
-\input{langhowto}
-\printindex
-\end{document}
diff --git a/doc/doxygen_usage.doc b/doc/doxygen_usage.doc
deleted file mode 100644
index 18773e5..0000000
--- a/doc/doxygen_usage.doc
+++ /dev/null
@@ -1,97 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-/*! \page doxygen_usage Doxygen usage
-
-Doxygen is a command line based utility. Calling \c doxygen with the
-\c --help option at the command line will give you a brief description of the
-usage of the program.
-
-All options consist of a leading character <tt>-</tt>,
-followed by one character and one or more arguments depending on the option.
-
-To generate a manual for your project you typically
-need to follow these steps:
-<ol>
-<li> You document your source code with
- special documentation blocks (see section \ref specialblock).
-<li> You generate a configuration file (see section \ref config) by
- calling doxygen with the \c -g option:
-\verbatim
-doxygen -g <config_file>
-\endverbatim
-<li> You edit the configuration file so it matches your project.
- In the configuration file you can specify the input files and
- a lot of optional information.
-<li> You let doxygen generate the documentation, based on the settings in the
- configuration file:
-\verbatim
-doxygen <config_file>
-\endverbatim
-</ol>
-
-If you have a configuration file generated with an older version of
-doxygen, you can upgrade it to the current version by running doxygen
-with the -u option.
-\verbatim
-doxygen -u <config_file>
-\endverbatim
-All configuration settings in the orginal configuration file will be copied
-to the new configuration file. Any new options will have their default value.
-Note that comments that you may have added in the original configuration file
-will be lost.
-
-If you want to fine-tune the way the output looks, doxygen allows you
-generate default style sheet, header, and footer files that you can edit
-afterwards:
-<ul>
-<li>For HTML output, you can generate the default header file
- (see \ref cfg_html_header "HTML_HEADER"), the default footer
- (see \ref cfg_html_footer "HTML_FOOTER"), and the default style
- sheet (see \ref cfg_html_stylesheet "HTML_STYLESHEET"), using the
- following command:
-\verbatim
-doxygen -w html header.html footer.html stylesheet.css
-\endverbatim
-<li>For LaTeX output, you can generate the first part of \c refman.tex
- (see \ref cfg_latex_header "LATEX_HEADER") and the style sheet included
- by that header (normally <code>doxygen.sty</code>), using:
-\verbatim
-doxygen -w latex header.tex doxygen.sty
-\endverbatim
-If you need non-default options (for instance to use pdflatex) you need
-to make a config file with those options set correctly and then specify
-that config file as the forth argument.
-<li>For RTF output, you can generate the default style sheet file (see
- \ref cfg_rtf_stylesheet_file "RTF_STYLESHEET_FILE") using:
-\verbatim
-doxygen -w rtf rtfstyle.cfg
-\endverbatim
-</ul>
-
-<b>Note:</b><br>
-<ul>
-<li> If you do not want documentation for each item inside the configuration
- file then you can use the optional \c -s option. This can use be
- used in combination with the \c -u option, to add or strip the
- documentation from an existing configuration file.
- Please use the \c -s option if you send me a configuration file
- as part of a bug report!
-<li> To make doxygen read/write to standard input/output instead of from/to
- a file, use \c - for the file name.
-</ul>
-
-*/
diff --git a/doc/doxysearch_usage.doc b/doc/doxysearch_usage.doc
deleted file mode 100644
index 3310d0a..0000000
--- a/doc/doxysearch_usage.doc
+++ /dev/null
@@ -1,180 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2003 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-/*! \page doxysearch_usage Doxysearch usage
-
-Doxysearch is a small, fast and highly portable search engine that allows
-you to search for strings or words in the documentation generated by
-<a href="doxygen_usage.html">doxygen</a> or
-in the Qt documentation (see <a href="#searchqt">below</a>).
-Doxysearch must be run as a CGI binary. This implies the following:
-<ul>
-<li> There must be a HTTP daemon running on the system where you want to
- install the documentation (the <em>target</em>)
-<li> You must have permission to install and execute a CGI binary on the
- target.
-</ul>
-Ask your system administrator or provider if you are unsure if this is possible.
-
-In order to be able to search fast and efficient, doxysearch does not
-search the generated documentation directly. Instead, it uses an
-<em>index file</em>, that should be generated with
-<a href="doxytag_usage.html">doxytag</a>. The index file is extracted from
-the generated HTML files and contains all words and substrings of words
-present in the HTML files, in a compact form, together with their
-frequencies and links. Although I tried to store all information
-as compactly as possible, the size of the index is still quite large.
-Usually it is about the same size as the original HTML files.
-
-I have tried to make the search engine highly portable, because it
-must run on the target system. As a result doxysearch does not require the
-Qt library. All that is required to build doxysearch is a C++ compiler.
-If you are using \c g++ for example, you can build the search engine manually,
-by typing:
-\verbatim
- g++ doxysearch.cpp -o doxysearch
-\endverbatim
-
-<a name="se"></a>
-<h3>Generating the search engine</h3>
-
-To include a search engine in the documentation generated by doxygen
-follow these steps:
-<ol>
-<li>Generate a configuration file with
- <a href="doxygen_usage.html">doxygen</a> using the
- <code>-g</code> option, if you haven't done this already.
-
-<li>Edit the search engine section (see section \ref config_search of
- the configuration file).
- Make sure the \c SEARCHENGINE tag is set to \c YES
- and that all paths are correct.
-
-<li>Use <a href="doxygen_usage.html">doxygen</a> to generate the
- documentation. Apart from the documentation, Doxygen will create the
- following files:
- <ul>
- <li>A small shell script. The name of the script is determined by the
- \c CGI_NAME tag in the configuration file.
- The script is a small wrapper that calls \c doxysearch with
- the correct parameters. Using this script allows multiple
- search engines for different projects to be present in one directory.
- <li>\c search.cfg: this file is a small configuration file
- for the search engine. It contains two lines of text. The first line
- should be the absolute URL to the documentation. The second line should
- be the absolute URL to the CGI script. This information is taken from
- the configuration file.
- <li>\c search.gif: this is the image that is used for the search button.
- </ul>
-
- \par Note:
- On the Windows platform Unix shell scripts cannot be used.
- In fact the HTTP daemon that I tried (apache for Windows) only
- recognized <code>.cgi</code> files that were renamed
- executables (so DOS batch files do not seem to work either). Therefore,
- on Windows a small C program will be generated by doxygen.
- You should compile and link the program with your favourite
- compiler and change the extension of the executable from
- <code>.exe</code> to <code>.cgi</code>.
-
-<li>Copy (or move) the CGI script to the directory where the CGI binaries
- are located.
- This is usually a special directory on your system or in your
- home directory.
- Consult the manual of your HTTP daemon or your system administrator to
- find out where this directory resides on your system.
-
-<li>Go to the directory where the generated HTML files are located and run
- doxytag as follows:
- <pre>doxytag -s search.idx</pre>
- This will create a search index with the name <code>search.idx</code>.
- Currently the index file <em>must</em> be called like this.
-
-<li>If you change the location of the search engine or the documentation
- and you do not want to regenerate the HTML output, you can simply edit
- the generated search.cfg file and run the generated
- <a href="installdox_usage.html">installdox</a> script to correct
- the links in the documentation.
-
-</ol>
-
-<a name="searchqt">
-<h3>Creating a search engine to search in the Qt documentation</h3>
-</a>
-
-Using <code>doxytag</code> and <code>doxysearch</code> it is possible to create a search engine for
-the Qt documentation, without needing the sources!
-This can be done by carefully following these steps:
-<ol>
-<li>Go to the html directory of the Qt-distribution:
- <pre>cd \$QTDIR/html</pre>
-<li>Generate the search index by typing:
- <pre>doxytag -s search.idx</pre>
- in the directory where the HTML files are located.
- This will parse all files and build a search index.
- Apart from the file <code>search.idx</code> two other files
- will be generated: <code>search.gif</code> and <code>search.cgi</code>
-
- \par Note:
- Doxytag requires quite a large amount of memory to
- generate the search index (about 30 MB on my Linux box)!
- The resulting index file requires about 3 MB of space on your disk.
-
-<li>Edit the shell script <code>search.cgi</code> with a text editor.
-
- Fill in the absolute path to the <code>doxysearch</code> binary after
- the <code>DOXYSEARCH=</code> tag.
- On my system this becomes:
- <pre>DOXYSEARCH=/usr/local/bin/doxysearch</pre>
-
- Fill in the absolute path to the qt documentation after the
- <code>DOXYPATH=</code> tag.
- On my system this becomes:
- <pre>DOXYPATH=/usr/local/qt/html</pre>
-<li>
- CGI binaries are usually located in a special directory.
- Consult the manual of your HTTP daemon or your system administrator to
- find out, where this directory resides on your system.
- Copy (or move) the <code>search.cgi</code> script to this directory.
- If needed you may change the name of the script.
- On my system, this becomes:
- <pre>cp search.cgi /usr/local/lib/httpd/cgi-bin/</pre>
-
-<li>Create a text-file with the name <code>search.cfg</code>.
- On the first line, you must put the <em>absolute</em> URL to the Qt
- documentation.
- Since, I only use the search engine on my own standalone system, I use
- the <code>file:</code> protocol.
- On the second line, you must put the <em>absolute</em> URL to the
- cgi script.
- On my system the resulting file looks like this:
-\verbatim
-file:///usr/local/qt/html
-http://blizzard/cgi-bin/search.cgi
-\endverbatim
-
-<li>Add a link to the search engine in the Qt documentation.
- On my system, I have put a line
-\verbatim
-<li><a href="http://blizzard/cgi-bin/search.cgi">Search the documentation<a>
-\endverbatim
- in the additional information section of the <code>index.html</code> file.
-<li>Start your favourite web browser and click on the link.
- If everything is OK, you should get a page where you can enter
- search terms.
-</ol>
-
-*/
diff --git a/doc/doxytag.1 b/doc/doxytag.1
deleted file mode 100644
index fcaa84b..0000000
--- a/doc/doxytag.1
+++ /dev/null
@@ -1,20 +0,0 @@
-.TH DOXYTAG "1" "DATE" "doxytag VERSION" "User Commands"
-.SH NAME
-doxytag \- generates a tag file and/or a search index for a set of HTML files
-.SH SYNOPSIS
-.B doxytag
-[\fI-t tag_file\fR] [\fI-s index_file\fR] [ \fIhtml_file \fR[\fIhtml_file\fR...] ]
-.SH DESCRIPTION
-Generates a tag file and/or a search index for a set of HTML files. Use
-doxysearch as a CGI program to search the tag file generated by doxytag.
-.SH OPTIONS
-.TP
-\fB\-t\fR <tag_file>
-Generate tag file <tag_file>.
-.TP
-\fB\-s\fR <index_file> Generate search index <index_file>.
-.PP
-If no HTML files are given all files in the current dir that
-have a .html extension are parsed.
-.SH SEE ALSO
-doxygen(1), doxywizard(1).
diff --git a/doc/doxytag_usage.doc b/doc/doxytag_usage.doc
deleted file mode 100644
index 2d5d5ea..0000000
--- a/doc/doxytag_usage.doc
+++ /dev/null
@@ -1,97 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-/*! \page doxytag_usage Doxytag usage
-
-Doxytag is a small command line based utility.
-It can generate <em>tag files</em>.
-These tag files can be used with <a href="doxygen_usage.html">doxygen</a>
-to generate references to external documentation
-(i.e. documentation not contained in the input files that are used by
-doxygen).
-
-A tag file contains information about files, classes and members
-documented in external documentation. Doxytag extracts this information
-directly from the HTML files. This has the advantage that you do not need
-to have the sources from which the documentation was extracted.
-
-If you \e do have the sources it is better to let \c doxygen generate the
-tag file by putting the name of the tag file after
-\ref cfg_generate_tagfile "GENERATE_TAGFILE" in
-the configuration file.
-
-The input of doxytag consists of a set of HTML files.
-
-\par Important:
- If you use tag files, the links that
- are generated by doxygen will contain \e dummy links. You have to run
- the \c installdox script to change these dummy links into real links.
- See \ref installdox_usage for more information.
- The use of dummy links may seem redundant, but it is really useful,
- if you want to move the external documentation to another location.
- Then the documentation does not need to be regenerated by \c doxygen,
- only \c installdox has to be run.
-
-\par Note:
- Because the HTML files are expected to have a certain
- structure, only HTML files generated with doxygen or with Qt's class
- browser generator can be used. Doxytag only <em>reads</em> the HTML files,
- they are not altered in any way.
-
-Doxytag expects a list of all HTML files that form the documentation
-or a directory that contains all HTML files. If neither is present doxytag
-will read all files with a <tt>.html</tt> extension from the current directory.
-If doxytag is used with the <code>-t</code> flag it generates a tag file.
-
-\par Example 1:
- Suppose the file \c example.cpp from the \c examples directory that is listed
- below is included in some package for which you do not have the sources.
- Fortunately, the distributor of the packages included the HTML documentation
- that was generated by doxygen in the package.
- \verbinclude example.cpp
- Now you can create a tag file from the HTML files in the package by
- typing:
-\verbatim
-doxytag -t example.tag example/html
-\endverbatim
- from the examples directory.
- Finally you can use this tag file with your own piece of code, such
- as done in the following example:
- \verbinclude tag.cpp
- Doxygen will now include links to the external package in your own
- documentation. Because the tag file does not specify where the
- documentation is located, you will have to specify that by running the
- installdox script that doxygen generates
- (See section \ref installdox_usage for more information).
-
- Note that this is actually a feature because if you (or someone else)
- moves the external documentation to a different
- directory or URL you can simply run the script again and all links in
- the HTML files will be updated.
-
- \htmlonly
- Click <a href="$(DOXYGEN_DOCDIR)/examples/tag/html/index.html">here</a>
- for the corresponding HTML documentation that is generated by Doxygen using
- only the tag file and second piece of code.
- \endhtmlonly
-
-\par Example 2:
- To generate a tag file of the Qt documentation you can do the following:
-\verbatim
-doxytag -t qt.tag $QTDIR/doc/html
-\endverbatim
-
-*/
diff --git a/doc/doxywizard.1 b/doc/doxywizard.1
deleted file mode 100644
index 4195cbb..0000000
--- a/doc/doxywizard.1
+++ /dev/null
@@ -1,10 +0,0 @@
-.TH DOXYWIZARD "1" "DATE" "doxywizard VERSION" "User Commands"
-.SH NAME
-doxywizard \- a tool to configure and run doxygen on your source files
-.SH SYNOPSIS
-.B doxywizard
-.SH DESCRIPTION
-Doxywizard is an interactive frontend to the doxygen tool to configure
-and run doxygen on your source files.
-.SH SEE ALSO
-doxygen(1), doxytag(1).
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
deleted file mode 100644
index 93fd4ee..0000000
--- a/doc/doxywizard_expert.png
+++ /dev/null
Binary files differ
diff --git a/doc/doxywizard_main.png b/doc/doxywizard_main.png
deleted file mode 100644
index e57c144..0000000
--- a/doc/doxywizard_main.png
+++ /dev/null
Binary files differ
diff --git a/doc/doxywizard_menu.png b/doc/doxywizard_menu.png
deleted file mode 100644
index 37adc46..0000000
--- a/doc/doxywizard_menu.png
+++ /dev/null
Binary files differ
diff --git a/doc/doxywizard_page1.png b/doc/doxywizard_page1.png
deleted file mode 100644
index ee3181d..0000000
--- a/doc/doxywizard_page1.png
+++ /dev/null
Binary files differ
diff --git a/doc/doxywizard_page2.png b/doc/doxywizard_page2.png
deleted file mode 100644
index dc9b5a8..0000000
--- a/doc/doxywizard_page2.png
+++ /dev/null
Binary files differ
diff --git a/doc/doxywizard_page3.png b/doc/doxywizard_page3.png
deleted file mode 100644
index f75e63f..0000000
--- a/doc/doxywizard_page3.png
+++ /dev/null
Binary files differ
diff --git a/doc/doxywizard_page4.png b/doc/doxywizard_page4.png
deleted file mode 100644
index e4f4361..0000000
--- a/doc/doxywizard_page4.png
+++ /dev/null
Binary files differ
diff --git a/doc/doxywizard_usage.doc b/doc/doxywizard_usage.doc
deleted file mode 100644
index c678c81..0000000
--- a/doc/doxywizard_usage.doc
+++ /dev/null
@@ -1,138 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-/*! \page doxywizard_usage Doxywizard usage
-
-Doxywizard is a GUI front-end for configuring and running doxygen.
-
-When you start doxywizard it will display the main window
-(the actual look depends on the OS used).
-
-\image html doxywizard_main.png "Main window"
-
-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.
-<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 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.
-</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.
-
-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.
-
-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.
-
-<h3>The Wizard Dialog</h3>
-
-If you select the Wizard button in step 1, then a dialog with
-a number of tabs will appear.
-
-\image html doxywizard_page1.png "Wizard dialog: Project settings"
-
-The fields in the project tab 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.
-
-\image html doxywizard_page2.png "Wizard dialog: Mode of operating"
-
-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.
-
-You can also select how doxygen should present the results.
-The latter does not affect the way doxygen parses your source code.
-
-\image html doxywizard_page3.png "Wizard dialog: Output to produce"
-
-You can select one or more of the output formats that doxygen should
-produce. For HTML and LaTeX there are additional options.
-
-\image html doxywizard_page4.png "Wizard dialog: Diagrams to generate"
-
-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 Mac or Windows this
-tool is already included).
-
-<h3>Expert dialog</h3>
-
-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 kind of input widget depends on the type of the configuration option.
-<ul>
-<li>For each boolean option (those options that are answered with YES or
- NO in the configuration file) there is a check-box.
-<li>For items taking one of a fixed set of values (like
- \ref cfg_output_language "OUTPUT_LANGUAGE") a combo box is used.
-<li>For items taking an integer value from a range, a spinbox is used.
-<li>For free form string-type options there is a one line edit field
-<li>For options taking a lists of strings, a one line edit field is
- available, with a `+' button to add this string to the list and
- a `-' button to remove the selected string from the list. There
- is also a `*' button 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.
-</ul>
-
-\image html doxywizard_expert.png "Some options from the Expert dialog"
-
-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.
-
-<h3>Menu options</h3>
-
-The GUI front-end has a menu with a couple of useful items
-
-\image html doxywizard_menu.png "File menu"
-
-<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
- 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.
-</dl>
-
-*/
diff --git a/doc/external.doc b/doc/external.doc
deleted file mode 100644
index 9e156d1..0000000
--- a/doc/external.doc
+++ /dev/null
@@ -1,138 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-/*! \page external Linking to external documentation
-
-If your project depends on external libraries or tools, there are several
-reasons to not include all sources for these with every run of doxygen:
-
-<dl>
-<dt>Disk space:<dd> Some documentation may be available outside of the output
- directory of doxygen already, for instance somewhere on the web.
- You may want to link to these pages instead of generating the documentation
- in your local output directory.
-<dt>Compilation speed:<dd> External projects typically have a different update
- frequency from your own project. It does not make much sense to let doxygen
- parse the sources for these external project over and over again, even if
- nothing has changed.
-<dt>Memory:<dd> For very large source trees, letting doxygen parse all sources
- may simply take too much of your system's memory. By dividing the sources
- into several "packages", the sources of one package can be parsed by
- doxygen, while all other packages that this package depends on, are
- linked in externally. This saves a lot of memory.
-<dt>Availability:<dd> For some projects that are documented with doxygen,
- the sources may just not be available.
-<dt>Copyright issues:<dd>If the external
- package and its documentation are copyright someone else, it may be
- better - or even necessary - to reference it rather than include a
- copy of it with your project's documentation. When the author forbids
- redistribution, this is necessary. If the author requires compliance
- with some license condition as a precondition of redistribution, and
- you do not want to be bound by those conditions, referring to their
- copy of their documentation is preferable to including a copy.
-
-</dl>
-
-If any of the above apply, you can use doxygen's tag file mechanism.
-A tag file is basically a compact representation of the entities found in the
-external sources. Doxygen can both generate and read tag files.
-
-To generate a tag file for your project, simply put the name of the
-tag file after the \ref cfg_generate_tagfile "GENERATE_TAGFILE" option in
-the configuration file.
-
-To combine the output of one or more external projects with your own project
-you should specify the name of the tag files after
-the \ref cfg_tagfiles "TAGFILES" option in the configuration file.
-
-A tag file does not contain information about where the external documentation
-is located. This could be a directory or an URL. So when you include a tag
-file you have to specify where the external documentation is located.
-There are two ways to do this:
-<dl>
-<dt>At configuration time:<dd> just assign the location of the output to the
- tag files specified after the \ref cfg_tagfiles "TAGFILES" configuration
- option. If you use a relative path it should be relative with respect to
- the directory where the HTML output of your project is generated.
-<dt>After compile time:<dd> if you do not assign a location to a tag file,
- doxygen will generate dummy links for all external HTML references. It will
- also generate a perl script called \ref installdox_usage "installdox" in
- the HTML output directory. This script should be run to replace the
- dummy links with real links for all generated HTML files.
-</dl>
-
-\par Example:
-Suppose you have a project \c proj that uses two external
-projects called \c ext1 and \c ext2.
-The directory structure looks as follows:
-
-\par
-\verbatim
-<root>
- +- proj
- | +- html HTML output directory for proj
- | +- src sources for proj
- | |- proj.cpp
- +- ext1
- | +- html HTML output directory for ext1
- | |- ext1.tag tag file for ext1
- +- ext2
- | +- html HTML output directory for ext2
- | |- ext2.tag tag file for ext2
- |- proj.cfg doxygen configuration file for proj
- |- ext1.cfg doxygen configuration file for ext1
- |- ext2.cfg doxygen configuration file for ext2
-\endverbatim
-
-\par
-Then the relevant parts of the configuration files look as follows:
-\par
-proj.cfg:
-\verbatim
-OUTPUT_DIRECTORY = proj
-INPUT = proj/src
-TAGFILES = ext1/ext1.tag=../../ext1/html \
- ext2/ext2.tag=../../ext2/html
-\endverbatim
-ext1.cfg:
-\verbatim
-OUTPUT_DIRECTORY = ext1
-GENERATE_TAGFILE = ext1/ext1.tag
-\endverbatim
-ext2.cfg:
-\verbatim
-OUTPUT_DIRECTORY = ext2
-GENERATE_TAGFILE = ext2/ext2.tag
-\endverbatim
-
-In some (hopefully exceptional) cases you may have the documentation
-generated by doxygen, but not the sources nor a tag file. In this case you
-can use the \ref doxytag_usage "doxytag" tool to extract a tag file from
-the generated HTML sources. Another case where you should use doxytag is
-if you want to create a tag file for the Qt documentation.
-
-The tool \c doxytag depends on the particular structure
-of the generated output and on some special markers that are generated by
-doxygen. Since this type of extraction is brittle and error-prone I
-suggest you only use this approach if there is no alternative. The
-doxytag tool may even become obsolete in the future.
-
-\htmlonly
-Go to the <a href="faq.html">next</a> section or return to the
- <a href="index.html">index</a>.
-\endhtmlonly
-
-*/
diff --git a/doc/faq.doc b/doc/faq.doc
deleted file mode 100644
index 98fe635..0000000
--- a/doc/faq.doc
+++ /dev/null
@@ -1,320 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-/*! \page faq Frequently Asked Questions
-
-<ol>
-<li><b>How to get information on the index page in HTML?</b>
-<p>
-You should use the \\mainpage command inside a comment block like this:
-\verbatim
-/*! \mainpage My Personal Index Page
- *
- * \section intro_sec Introduction
- *
- * This is the introduction.
- *
- * \section install_sec Installation
- *
- * \subsection step1 Step 1: Opening the box
- *
- * etc...
- */
-\endverbatim
-
-<li><b>Help, some/all of the members of my class / file / namespace
- are not documented?</b>
-
- Check the following:
- <ol>
- <li>Is your class / file / namespace documented? If not, it will not
- be extracted from the sources unless \c EXTRACT_ALL is set to \c YES
- in the config file.
- <li>Are the members private? If so, you must set \c 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
- doxygen's preprocessor to remove it.
-
- This typically boils down to the following settings in the config file:
-
- \verbatim
-ENABLE_PREPROCESSING = YES
-MACRO_EXPANSION = YES
-EXPAND_ONLY_PREDEF = YES
-PREDEFINED = MY_MACRO()=
- \endverbatim
-
- Please read the \ref preprocessing "preprocessing" section of the
- manual for more information.
- </ol>
-
-<li><b>When I set EXTRACT_ALL to NO none of my functions are shown in the
- documentation.</b>
-
-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 \\file (or \@file)
-command.
-
-Alternatively, you can put all members in a group (or module)
-using the \\ingroup command and then document the group using a comment
-block containing the \\defgroup command.
-
-For member functions or functions that are part of a namespace you should
-document either the class or namespace.
-
-<li><b>How can I make doxygen ignore some code fragment?</b>
-
-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:
-If you put
-\verbatim
-#ifndef DOXYGEN_SHOULD_SKIP_THIS
-
- /* code that must be skipped by Doxygen */
-
-#endif /* DOXYGEN_SHOULD_SKIP_THIS */
-\endverbatim
-around the blocks that should be hidden and put:
-\verbatim
- PREDEFINED = DOXYGEN_SHOULD_SKIP_THIS
-\endverbatim
-in the config file then all blocks should be skipped by Doxygen as long
-as <code>PREPROCESSING = YES</code>.
-
-<li><b>How can I change what is after the <code>\#include</code> in the class documentation?</b>
-
-In most cases you can use STRIP_FROM_INC_PATH to strip a user defined
-part of a path.
-
-You can also document your class as follows
-
-\verbatim
-/*! \class MyClassName include.h path/include.h
- *
- * Docs for MyClassName
- */
-\endverbatim
-
-To make doxygen put <br><br>
-<code>
-\#include \<path/include.h\>
-</code>
-
-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
-quotes instead of angle brackets you should type:
-\verbatim
-/*! \class MyClassName myhdr.h "path/myhdr.h"
- *
- * Docs for MyClassName
- */
-\endverbatim
-
-<li><b>How can I use tag files in combination with compressed HTML?</b>
-
-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
-directory.
-
-As a result you must rename the generated \c index.chm files for all projects
-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
-configuration file for project \e a you write:
-\verbatim
-TAGFILES = b.tag=b.chm::
-\endverbatim
-or you can use \c installdox to set the links as follows:
-\verbatim
-installdox -lb.tag@b.chm::
-\endverbatim
-
-<li><b>I don't like the quick index that is put above each HTML page, what do I do?</b>
-
-You can disable the index by setting DISABLE_INDEX to YES. Then you can
-put in your own header file by writing your own header and feed that to
-HTML_HEADER.
-
-<li><b>The overall HTML output looks different, while I only wanted to
- use my own html header file</b>
-
-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">
-\endverbatim
-in the HEAD section of the HTML page.
-
-<li><b>Why does doxygen use Qt?</b>
-
-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!
-
-<li><b>How can I exclude all test directories from my directory tree?</b>
-
-Simply put an exclude pattern like this in the configuration file:
-
-\verbatim
-EXCLUDE_PATTERNS = */test/*
-\endverbatim
-
-<li><b>Doxygen automatically generates a link to the
- class MyClass somewhere in the running text.
- How do I prevent that at a certain place?</b>
-
-Put a \% in front of the class name. Like this: \%MyClass. Doxygen will then
-remove the % and keep the word unlinked.
-
-<li><b>My favourite programming language is X. Can I still use doxygen?</b>
-
-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 src/scanner.l a bit so the language is supported. This is done
- 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.stack.nl/~dimitri/doxygen/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
- src/scanner.l (and also by src/tagreader.cpp while reading tag files).
-
-<li><b>Help! I get the cryptic message
- "input buffer overflow, can't enlarge buffer because scanner uses REJECT"</b>
-
-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
-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.
-
-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
-parts, or exclude it from the input using EXCLUDE.
-
-<li><b>When running make in the latex dir I get "TeX capacity exceeded". Now what?</b>
-
-You can edit the texmf.cfg file to increase the default values of the
-various buffers and then run "texconfig init".
-
-<li><b>Why are dependencies via STL classes not shown in the dot graphs?</b>
-
-Doxygen is unware of the STL classes, so it does not know that class A relates
-to class B in the following example
-
-\code
-#include <vector>
-
-using namespace std;
-
-class B {};
-
-class A
-{
- public:
- vector<B> m_bvec;
-};
-\endcode
-
-To overcome this problem you could provide the definition of the vector
-class to doxygen (by including the file that defines it at the INPUT tag
-in the config file). Since STL header files are often messy, a
-(possibly) better approach is to include a dummy definition of a vector
-class to the input. Here is an example of a dummy STL file for the vector
-class:
-
-\code
-namespace std {
- /*! STL vector class */
- template<class T> class vector { public: T element; };
-}
-\endcode
-
-I'm still looking for someone who can provide me with definitions
-for all (relevant) STL classes.
-
-<li><b>Can I configure doxygen from the command line?</b>
-
-Not via command line options, but doxygen can read from <code>stdin</code>,
-so you can pipe things through it. Here's an example how to override an option
-in a configuration file from the command line (assuming a unix environment):
-
-\verbatim
-( cat 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.
-
-<li><b>How did doxygen get its name?</b>
-
-Doxygen got its name from playing with the words
-documentation and generator.
-
-\verbatim
-documentation -> docs -> dox
-generator -> gen
-\endverbatim
-
-At the time I was looking into lex and yacc, where a lot of things start with
-"yy", so the "y" slipped in and made things pronounceable
-(the proper pronouncement is Docs-ee-gen, so with a long "e").
-
-<li><b>What was the reason to develop doxygen?</b>
-
-I once wrote a GUI widget based on the Qt library (it is still available at
-http://qdbttabular.sourceforge.net/ and maintained by Sven Meyer).
-Qt had nicely generated documentation (using an internal tool which
-they didn't want to release) 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),
-so I started to write my own tool...
-
-</ol>
-
-\htmlonly
-Go to the <a href="trouble.html">next</a> section or return to the
- <a href="index.html">index</a>.
-\endhtmlonly
-
-*/
-
diff --git a/doc/features.doc b/doc/features.doc
deleted file mode 100644
index 871242d..0000000
--- a/doc/features.doc
+++ /dev/null
@@ -1,97 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-/*! \page features Features
-
-\addindex features
-<UL>
-<li>Requires very little overhead from the writer of the documentation.
- Plain text will do, but for more fancy or structured output HTML tags
- and/or some of doxygen's special commands can be used.
-<li>Supports C/C++, Java, (Corba and Microsoft) Java, Python,
- IDL, C#, Objective-C and to some extent D and PHP sources.
-<li>Supports documentation of files, namespaces, packages, classes,
- structs, unions, templates, variables, functions, typedefs, enums and
- defines.
-<li>JavaDoc (1.1), Qt-Doc, and ECMA-334 (C# spec.) compatible.
-<li>Automatically generates class and collaboration diagrams in HTML (as clickable
- image maps) and \f$\mbox{\LaTeX}\f$ (as Encapsulated PostScript images).
-<li>Uses the dot tool of the Graphviz tool kit to generate
- include dependency graphs, collaboration diagrams, and
- graphical class hierarchy graphs.
-<li>Flexible comment placement: Allows you to put documentation in the
- header file (before the
- declaration of an entity), source file (before the definition of an entity)
- or in a separate file.
-<li>Generates a list of all members of a class (including any inherited
- members) along with their protection level.
-<li>Outputs documentation in on-line format (HTML and UNIX man page) and
- off-line format (\f$\mbox{\LaTeX}\f$ and RTF) simultaneously
- (any of these can be disabled if desired). All formats are optimized for
- ease of reading. <br>
- Furthermore, compressed HTML can be generated from HTML output using
- Microsoft's HTML Help Workshop (Windows only) and PDF can be generated
- from the \f$\mbox{\LaTeX}\f$ output.
-<li>Includes a full C preprocessor to allow proper parsing of conditional
- code fragments and to allow expansion of all or part of macros definitions.
-<li>Automatically detects public, protected and private sections, as well as
- the Qt specific signal and slots sections. Extraction of private class
- members is optional.
-<li>Automatically generates references to documented classes, files, namespaces
- and members. Documentation of global functions, globals variables,
- typedefs, defines and enumerations is also supported.
-<li>References to base/super classes and inherited/overridden members are
- generated automatically.
-<li>Includes a fast, rank based search engine to search for strings or words
- in the class and member documentation.
-<li>You can type normal HTML tags in your documentation. Doxygen will convert
- them to their equivalent \f$\mbox{\LaTeX}\f$, RTF, and man-page
- counterparts automatically.
-<li>Allows references to documentation generated for other projects
- (or another part of the same project) in a location independent way.
-<li>Allows inclusion of source code examples that are automatically
- cross-referenced with the documentation.
-<li>Inclusion of undocumented classes is also supported, allowing to quickly
- learn the structure and interfaces of a (large) piece of code without
- looking into the implementation details.
-<li>Allows automatic cross-referencing of (documented) entities with their
- definition in the source code.
-<li>All source code fragments are syntax highlighted for ease of reading.
-<li>Allows inclusion of function/member/class definitions in the documentation.
-<li>All options are read from an easy to edit and (optionally) annotated
- configuration file.
-<li>Documentation and search engine can be transferred to another
- location or machine without regenerating the documentation.
-<li>Can cope with large projects easily.
-</UL>
-
-Although doxygen can be used in any C or C++ project,
-initially it was specifically designed to be used for projects that make
-use of Troll Tech's
-<A HREF="http://www.trolltech.com/products/qt.html">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 very similar to the
-one that is generated by Troll Tech. Doxygen understands the C++ extensions
-used by Qt such as signals and slots.
-
-Doxygen can also automatically generate links to existing documentation
-that was generated with Doxygen or with Qt's non-public class browser
-generator. For a Qt based project this means that whenever you refer to
-members or classes belonging to the Qt toolkit, a link will be generated to
-the Qt documentation. This is done independent of where this documentation
-is located!
-
-*/
diff --git a/doc/formulas.doc b/doc/formulas.doc
deleted file mode 100644
index be6438c..0000000
--- a/doc/formulas.doc
+++ /dev/null
@@ -1,107 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-/*! \page formulas Including formulas
-
-Doxygen allows you to put \f$\mbox{\LaTeX}\f$ formulas in the
-output (this works only for the HTML and \f$\mbox{\LaTeX}\f$ output,
-not for the RTF nor for the man page output). To be able to include
-formulas (as images) in the HTML documentation, you will also need to
-have the following tools installed
-<ul>
-<li>\c latex: the \f$\mbox{\LaTeX}\f$ compiler, needed to parse the formulas.
- To test I have used the teTeX 1.0 distribution.
-<li>\c dvips: a tool to convert DVI files to PostScript files
- I have used version 5.92b from Radical Eye software for testing.
-<li>\c gs: the GhostScript interpreter for converting PostScript files
- to bitmaps. I have used Aladdin GhostScript 8.0 for testing.
-</ul>
-
-There are three ways to include formulas in the documentation.
-<ol>
-<li>Using in-text formulas that appear in the running text.
- These formulas should be put between a pair of \\f\$
- commands, so
-\verbatim
- The distance between \f$(x_1,y_1)\f$ and \f$(x_2,y_2)\f$ is
- \f$\sqrt{(x_2-x_1)^2+(y_2-y_1)^2}\f$.
-\endverbatim results in:
-
- The distance between \f$(x_1,y_1)\f$ and \f$(x_2,y_2)\f$ is
- \f$\sqrt{(x_2-x_1)^2+(y_2-y_1)^2}\f$.
-<br>
-<li>Unnumbered displayed formulas that are centered on a separate line.
- These formulas should be put between \\f[ and \\f] commands.
- An example:
-\verbatim
- \f[
- |I_2|=\left| \int_{0}^T \psi(t)
- \left\{
- u(a,t)-
- \int_{\gamma(t)}^a
- \frac{d\theta}{k(\theta,t)}
- \int_{a}^\theta c(\xi)u_t(\xi,t)\,d\xi
- \right\} dt
- \right|
- \f]
-\endverbatim
- results in:
- \f[
- |I_2|=\left| \int_{0}^T \psi(t)
- \left\{
- u(a,t)-
- \int_{\gamma(t)}^a
- \frac{d\theta}{k(\theta,t)}
- \int_{a}^\theta c(\xi)u_t(\xi,t)\,d\xi
- \right\} dt
- \right|
- \f]
-<li>Formulas or other latex elements that are not in a math
- environment can be specified using \\f{environment}, where
- \c environment is the name of the \f$\mbox{\LaTeX}\f$ environment,
- the corresponding end command is \\f}. Here is an example for an
- equation array
-\verbatim
- \f{eqnarray*}
- g &=& \frac{Gm_2}{r^2} \\
- &=& \frac{(6.673 \times 10^{-11}\,\mbox{m}^3\,\mbox{kg}^{-1}\,
- \mbox{s}^{-2})(5.9736 \times 10^{24}\,\mbox{kg})}{(6371.01\,\mbox{km})^2} \\
- &=& 9.82066032\,\mbox{m/s}^2
- \f}
-\endverbatim
- which results in:
- \f{eqnarray*}
- g &=& \frac{Gm_2}{r^2} \\
- &=& \frac{(6.673 \times 10^{-11}\,\mbox{m}^3\,\mbox{kg}^{-1}\,
- \mbox{s}^{-2})(5.9736 \times 10^{24}\,\mbox{kg})}{(6371.01\,\mbox{km})^2} \\
- &=& 9.82066032\,\mbox{m/s}^2
- \f}
-</ol>
-For the first two commands one should make sure formulas contain
-valid commands in \f$\mbox{\LaTeX}\f$'s math-mode. For the third command
-the section should contain valid command for the specific environment.
-
-\warning Currently, doxygen is not very fault tolerant in recovering
-from typos in formulas. It may have to be necessary to remove the
-file <code>formula.repository</code> that is written to the html directory to
-a rid of an incorrect formula
-
-\htmlonly
-Go to the <a href="diagrams.html">next</a> section or return to the
- <a href="index.html">index</a>.
-\endhtmlonly
-
-*/
diff --git a/doc/grouping.doc b/doc/grouping.doc
deleted file mode 100644
index 6e942ce..0000000
--- a/doc/grouping.doc
+++ /dev/null
@@ -1,225 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-/*! \page grouping Grouping
-
-Doxygen has three mechanisms to group things together.
-One mechanism works at a global level, creating a new page
-for each group. These groups are called \ref modules "'modules'" in the documentation.
-The second mechanism works within a member list of some compound entity,
-and is refered to as a \ref memgroup "'member groups'".
-For \ref cmdpage "pages" there is a third grouping mechanism referred to
-as \ref subpaging "subpaging".
-
-\section modules Modules
-
-Modules are a way to group things together on a separate page. You
-can document a group as a whole, as well as all individual members.
-Members of a group can be files, namespaces, classes, functions,
-variables, enums, typedefs, and defines, but also other groups.
-
-To define a group, you should put the \ref cmddefgroup "\\defgroup"
-command in a special comment block. The first argument of the command
-is a label that should uniquely identify the group.
-The second argument is the name or title of the group as it should appear
-in the documentation.
-
-You can make an entity a member of a specific group by putting
-a \ref cmdingroup "\\ingroup" command inside its documentation block.
-
-To avoid putting \ref cmdingroup "\\ingroup" commands in the documentation
-for each member you can also group members together by the
-open marker <code>\@{</code> before the group and the
-closing marker <code>\@}</code> after the group. The markers can
-be put in the documentation of the group definition or in a separate
-documentation block.
-
-Groups themselves can also be nested using these grouping markers.
-
-You will get an error message when you use the same group label more than once.
-If you don't want doxygen to enforce unique labels, then you can
-use \ref cmdaddtogroup "\\addtogroup" instead of
-\ref cmddefgroup "\\defgroup".
-It can be used exactly like \ref cmddefgroup "\\defgroup",
-but when the group has been defined already, then it silently merges the
-existing documentation with the new one.
-The title of the group is optional for this command, so you can use
-\verbatim
-/** \addtogroup <label> */
-/*\@{*/
-/*\@}*/
-\endverbatim
-to add additional members to a group that is defined in more detail elsewhere.
-
-Note that compound entities (like classes, files and namespaces) can
-be put into multiple groups, but members (like variable, functions, typedefs
-and enums) can only be a member of one group
-(this restriction is in place to avoid ambiguous linking targets in case
-a member is not documented in the context of its class, namespace
-or file, but only visible as part of a group).
-
-Doxygen will put members into the group whose definition has
-the highest "priority": e.g. An explicit \ref cmdingroup "\\ingroup" overrides
-an implicit grouping definition via <code>\@{</code> <code>\@}</code>.
-Conflicting grouping definitions with the same priority trigger a warning,
-unless one definition was for a member without any explicit documentation.
-
-The following example puts VarInA into group A and silently resolves
-the conflict for IntegerVariable by putting it into group IntVariables,
-because the second instance of IntegerVariable
-is undocumented:
-
-\verbatim
-
-/**
- * \ingroup A
- */
-extern int VarInA;
-
-/**
- * \defgroup IntVariables Global integer variables
- */
-/*@{*/
-
-/** an integer variable */
-extern int IntegerVariable;
-
-/*@}*/
-
-....
-
-/**
- * \defgroup Variables Global variables
- */
-/*@{*/
-
-/** a variable in group A */
-int VarInA;
-
-int IntegerVariable;
-
-/*@}*/
-\endverbatim
-
-The \ref cmdref "\\ref" command can be used to refer to a group.
-The first argument of the \\ref command should be group's label.
-To use a custom link name, you can put the name of the links in
-double quotes after the label, as shown by the following example
-\verbatim
-This is the \ref group_label "link" to this group.
-\endverbatim
-
-The priorities of grouping definitions are (from highest to lowest):
-\ref cmdingroup "\\ingroup", \ref cmddefgroup "\\defgroup",
-\ref cmdaddtogroup "\\addtogroup", \ref cmdweakgroup "\\weakgroup".
-The last command is exactly like \ref cmdaddtogroup "\\addtogroup"
-with a lower priority. It was added to allow "lazy" grouping
-definitions: you can use commands with a higher priority in your .h
-files to define the hierarchy and \ref cmdweakgroup "\\weakgroup"
-in .c files without having to duplicate the hierarchy exactly.
-
-\par Example:
-\verbinclude group.cpp
-
-\htmlonly
-Click <a href="$(DOXYGEN_DOCDIR)/examples/group/html/modules.html">here</a>
-for the corresponding HTML documentation that is generated by Doxygen.
-\endhtmlonly
-
-\section memgroup Member Groups
-
-If a compound (e.g. a class or file) has many members, it is often
-desired to group them together. Doxygen already automatically groups
-things together on type and protection level, but maybe you feel that
-this is not enough or that that default grouping is wrong.
-For instance, because you feel that members of different (syntactic)
-types belong to the same (semantic) group.
-
-A member group is defined by
-a
-\verbatim
-//@{
- ...
-//@}
-\endverbatim
-block or a
-\verbatim
-/*@{*/
- ...
-/*@}*/
-\endverbatim
-block if you prefer C style
-comments. Note that the members of the group should be
-physcially inside the member group's body.
-
-Before the opening marker of a block a separate comment block may be
-placed. This block should contain the \ref cmdname "@@name"
-(or \ref cmdname "\\name") command and is used to specify the header
-of the group. Optionally, the comment block may also contain more
-detailed information about the group.
-
-Nesting of member groups is not allowed.
-
-If all members of a member group inside a class have the same type
-and protection level (for instance all are static public members),
-then the whole member group is displayed as a subgroup of
-the type/protection level group (the group is displayed as a
-subsection of the "Static Public Members" section for instance).
-If two or more members have different types, then the group is put
-at the same level as the automatically generated groups.
-If you want to force all member-groups of a class to be at the top level,
-you should put a \ref cmdnosubgrouping "\\nosubgrouping" command inside the
-documentation of the class.
-
-\par Example:
-\verbinclude memgrp.cpp
-
-\htmlonly
-Click <a href="$(DOXYGEN_DOCDIR)/examples/memgrp/html/class_test.html">here</a>
-for the corresponding HTML documentation that is generated by Doxygen.
-\endhtmlonly
-
-Here Group1 is displayed as a subsection of the "Public Members". And
-Group2 is a separate section because it contains members with
-different protection levels (i.e. public and protected).
-
-\htmlonly
-Go to the <a href="formulas.html">next</a> section or return to the
- <a href="index.html">index</a>.
-\endhtmlonly
-
-\section subpaging Subpaging
-
-Information can be grouped into pages using the \ref cmdpage "\\page" and
-\ref cmdsubpage "\\mainpage" commands. Normally, this results in a
-flat list of pages, where the "main" page is the first in the list.
-
-Instead of adding structure using the approach decribed in section
-\ref modules "modules" it is often more natural and convienent to add
-additional structure to the pages using the \ref cmdsubpage "\\subpage"
-command.
-
-For a page A the \\subpage command adds a link to another page B and at
-the same time makes page B a subpage of A. This has the effect of making
-two groups GA and GB, where GB is part of GA, page A is put in group GA,
-and page B is put in group GB.
-
-\htmlonly
-Go to the <a href="formulas.html">next</a> section or return to the
- <a href="index.html">index</a>.
-\endhtmlonly
-
-*/
diff --git a/doc/history.doc b/doc/history.doc
deleted file mode 100644
index 6c241e5..0000000
--- a/doc/history.doc
+++ /dev/null
@@ -1,126 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-
-/*! \page history Doxygen History
-
-<h2>Version 1.2.0</h2>
-<h3>Major new features:</h3>
-<ul>
-<li>Support for RTF output.
-<li>Using the dot tool of the AT\&T's GraphViz package, doxygen can now
- generate inheritance diagrams, collaboration diagrams, include
- dependency graphs, included by graphs and graphical inheritance overviews.
-<li>Function arguments can now be documented with separate comment blocks.
-<li>Initializers and macro definitions are now included in the documentation.
-<li>Variables and typedefs are now put in their own section.
-<li>Old configuration files can be upgraded using the -u option without
- loosing any changes.
-<li>Using the \\if and \\endif commands, doxygen can conditionally
- include documentation blocks.
-<li>Added Doc++ like support for member grouping.
-<li>Doxygen now has a GUI front-end called doxywizard (based on Qt-2.1)
-<li>All info about configuration options is now concentrated in a new
- tool called configgen. This tool can generate the configuration
- parser and GUI front-end from source templates.
-<li>Better support for the using keyword.
-<li>New transparent mini logo that is put in the footer of all HTML pages.
-<li>Internationalization support for the Polish, Portuguese and Croatian language.
-<li>Todo list support.
-<li>If the source browser is enabled, for a function, a list of function whose
- implementation calls that function, is generated.
-<li>All source code fragments are now syntax highlighted in the HTML output.
- The colors can be changed using cascading style sheets.
-</ul>
-
-<h2>Version 1.0.0</h2>
-
-<h3>Major new features:</h3>
-<ul>
-<li>Support for templates and namespaces.
-<li>Internationalization support. Currently supported languages are:
- English, Czech, German, Spanish, Finnish, French, Italian, Japanese,
- Dutch, and Swedish.
-<li>Automatic generation of inheritance diagrams for sub and super classes.
-<li>Support for man page, compressed HTML help, and hyperlinked PDF output.
-<li>Cross-referencing documentation with source code and source inlining.
-<li>LaTeX formulas can be included in the documentation.
-<li>Support for parsing Corba and Microsoft IDL.
-<li>Images can be included in the documentation.
-<li>Improved parsing and preprocessing.
-</ul>
-
-<h2>Version 0.4</h2>
-
-<h3>Major new features:</h3>
-<ul>
-<li>LaTeX output generation.
-<li>Full JavaDoc support.
-<li>Build-in C-preprocessor for correct conditional parsing of source code
- that is read by Doxygen.
-<li>Build-in HTML to LaTeX converter. This allows you to use HTML tags in
- your documentation, while doxygen still generates proper LaTeX output.
-<li>Many new commands (there are now more than 60!) to document
- more entities, to make the documentation look nicer, and to include
- examples or pieces of examples.
-<li>Enum types, enum values, typedefs, \#defines, and files can now be
- documented.
-<li>Completely new documentation, that is now generated by Doxygen.
-<li>A lot of small examples are now included.
-</ul>
-
-<h2>Version 0.3</h2>
-<h3>Major new features:</h3>
-<ul>
-<li>A PHP based search engine that allows you to search through the generated
- documentation.
-<li>A configuration file instead of command-line options. A default
- configuration file can be generated
- by <a href="doxygen_usage.html">doxygen</a>.
-<li>Added an option to generate output for undocumented classes.
-<li>Added an option to generate output for private members.
-<li>Every page now contains a condensed index page, allowing much faster
- navigation through the documentation.
-<li>Global and member variables can now be documented.
-<li>A project name can now given, which will be included in the
- documentation.
-</ul>
-
-<h2>Version 0.2</h2>
-<h3>Major new features:</h3>
-<ul>
-<li>Blocks of code are now parsed. Function calls and variables are
- replaced by links to their documentation if possible.
-<li>Special example documentation block added. This can be used to
- provide cross references between the documentation and some example code.
-<li>Documentation blocks can now be placed inside the body of a class.
-<li>Documentation blocks with line range may now be created using
- special <code>//!</code> C++ line comments.
-<li>Unrelated members can now be documented. A page containing a
- list of these members is generated.
-<li>Added an <code>\\include</code> command to insert blocks of source code
- into the documentation.
-<li>Warnings are generated for members that are undocumented.
-<li>You can now specify your own HTML headers and footers for the
- generated pages.
-<li>Option added to generated indices containing all external classes
- instead of only the used ones.
-</ul>
-
-<h2>Version 0.1</h2>
-Initial version.
-
-*/
diff --git a/doc/htmlcmds.doc b/doc/htmlcmds.doc
deleted file mode 100644
index 0c8cd3b..0000000
--- a/doc/htmlcmds.doc
+++ /dev/null
@@ -1,131 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-/*! \page htmlcmds HTML Commands
-
-Here is a list of all HTML commands that may be used inside the
-documentation. Note that although these HTML tags are translated to the
-proper commands for outer formats other than HTML, all attributes
-of a HTML tag are passed on to the HTML output only
-(the HREF and NAME attributes for the A tag are the only exception).
-
-<ul>
-<li><tt>\<A HREF="..."\></tt> Starts a HTML hyper-link (HTML only).
-<li><tt>\<A NAME="..."\></tt> Starts an named anchor (HTML only).
-<li><tt>\</A\></tt> Ends a link or anchor (HTML only).
-<li><tt>\<B\></tt> Starts a piece of text displayed in a bold font.
-<li><tt>\</B\></tt> Ends a <tt>\<B\></tt> section.
-<li><tt>\<BODY\></tt> Does not generate any output.
-<li><tt>\</BODY\></tt> Does not generate any output.
-<li><tt>\<BR\></tt> Forces a line break.
-<li><tt>\<CENTER\></tt> starts a section of centered text.
-<li><tt>\</CENTER\></tt> ends a section of centered text.
-<li><tt>\<CAPTION\></tt> Starts a caption. Use within a table only.
-<li><tt>\</CAPTION\></tt> Ends a caption. Use within a table only.
-<li><tt>\<CODE\></tt> Starts a piece of text displayed in a typewriter font.
-<li><tt>\</CODE\></tt> End a <tt>\<CODE\></tt> section.
-<li><tt>\<DD\></tt> Starts an item description.
-<li><tt>\<DFN\></tt> Starts a piece of text displayed in a typewriter font.
-<li><tt>\</DFN\></tt> Ends a <tt>\<DFN\></tt> section.
-<li><tt>\<DIV></tt> Starts a section with a specific style (HTML only)
-<li><tt>\</DIV></tt> Ends a section with a specific style (HTML only)
-<li><tt>\<DL\></tt> Starts a description list.
-<li><tt>\</DL\></tt> Ends a description list.
-<li><tt>\<DT\></tt> Starts an item title.
-<li><tt>\</DT\></tt> Ends an item title.
-<li><tt>\<EM\></tt> Starts a piece of text displayed in an italic font.
-<li><tt>\</EM\></tt> Ends a <tt>\<EM\></tt> section.
-<li><tt>\<FORM\></tt> Does not generate any output.
-<li><tt>\</FORM\></tt> Does not generate any output.
-<li><tt>\<HR\></tt> Writes a horizontal ruler.
-<li><tt>\<H1\></tt> Starts an unnumbered section.
-<li><tt>\</H1\></tt> Ends an unnumberd section.
-<li><tt>\<H2\></tt> Starts an unnumbered subsection.
-<li><tt>\</H2\></tt> Ends an unnumbered subsection.
-<li><tt>\<H3\></tt> Starts an unnumbered subsubsection.
-<li><tt>\</H3\></tt> Ends an unnumbered subsubsection.
-<li><tt>\<I\></tt> Starts a piece of text displayed in an italic font.
-<li><tt>\<INPUT\></tt> Does not generate any output.
-<li><tt>\</I\></tt> Ends a <tt>\<I\></tt> section.
-<li><tt>\<IMG\></tt> This command is written with attributes to the HTML output only.
-<li><tt>\<LI\></tt> Starts a new list item.
-<li><tt>\</LI\></tt> Ends a list item.
-<li><tt>\<META\></tt> Does not generate any output.
-<li><tt>\<MULTICOL\></tt> ignored by doxygen.
-<li><tt>\</MUTLICOL\></tt> ignored by doxygen.
-<li><tt>\<OL\></tt> Starts a numbered item list.
-<li><tt>\</OL\></tt> Ends a numbered item list.
-<li><tt>\<P\></tt> Starts a new paragraph.
-<li><tt>\</P\></tt> Ends a paragraph.
-<li><tt>\<PRE\></tt> Starts a preformatted fragment.
-<li><tt>\</PRE\></tt> Ends a preformatted fragment.
-<li><tt>\<SMALL\></tt> Starts a section of text displayed in a smaller font.
-<li><tt>\</SMALL\></tt> Ends a <tt>\<SMALL\></tt> section.
-<li><tt>\<SPAN></tt> Starts an inline text fragment with a specific style (HTML only)
-<li><tt>\</SPAN></tt> Ends an inline text fragment with a specific style (HTML only)
-<li><tt>\<STRONG\></tt> Starts a section of bold text.
-<li><tt>\</STRONG\></tt> Ends a section of bold text.
-<li><tt>\<SUB\></tt> Starts a piece of text displayed in subscript.
-<li><tt>\</SUB\></tt> Ends a <tt>\<SUB\></tt> section.
-<li><tt>\<SUP\></tt> Starts a piece of text displayed in superscript.
-<li><tt>\</SUP\></tt> Ends a <tt>\</SUP\></tt> section.
-<li><tt>\<TABLE\></tt> starts a table.
-<li><tt>\</TABLE\></tt> ends a table.
-<li><tt>\<TD\></tt> Starts a new table data element.
-<li><tt>\</TD\></tt> Ends a table data element.
-<li><tt>\<TR\></tt> Starts a new table row.
-<li><tt>\</TR\></tt> Ends a table row.
-<li><tt>\<TT\></tt> Starts a piece of text displayed in a typewriter font.
-<li><tt>\</TT\></tt> Ends a <tt>\<TT\></tt> section.
-<li><tt>\<KBD\></tt> Starts a piece of text displayed in a typewriter font.
-<li><tt>\</KBD\></tt> Ends a <tt>\<KBD\></tt> section.
-<li><tt>\<UL\></tt> Starts an unnumbered item list.
-<li><tt>\</UL\></tt> Ends an unnumbered item list.
-<li><tt>\<VAR\></tt> Starts a piece of text displayed in an italic font.
-<li><tt>\</VAR\></tt> Ends a <tt>\</VAR\></tt> section.
-</ul>
-
-The special HTML character entities that are recognized by Doxygen:
-
-<ul>
-<li><tt>\&copy;</tt> the copyright symbol
-<li><tt>\&quot;</tt> a double quote
-<li><tt>\&?uml;</tt> where ? is one of {A,E,I,O,U,Y,a,e,i,o,u,y},
- writes a character with a diaeresis accent (like &auml;).
-<li><tt>\&?acute;</tt> where ? is one of {A,E,I,O,U,Y,a,e,i,o,u,y},
- writes a character with a acute accent (like &aacute;).
-<li><tt>\&?grave;</tt> where ? is one of {A,E,I,O,U,a,e,i,o,u,y},
- writes a character with a grave accent (like &agrave;).
-<li><tt>\&?circ;</tt> where ? is one of {A,E,I,O,U,a,e,i,o,u,y},
- writes a character with a circumflex accent (like &acirc;).
-<li><tt>\&?tilde;</tt> where ? is one of {A,N,O,a,n,o},
- writes a character with a tilde accent (like &atilde;).
-<li><tt>\&szlig;</tt> write a sharp s (i.e. &szlig;) to the output.
-<li><tt>\&?cedil;</tt> where ? is one of {c,C},
- writes a c-cedille (like &ccedil;).
-<li><tt>\&?ring;</tt> where ? is one of {a,A},
- writes an <tt>a</tt> with a ring (like &aring;).
-<li><tt>\&nbsp;</tt> a non breakable space.
-</ul>
-
-Finally, to put invisible comments inside comment blocks, HTML style
-comments can be used:
-\verbatim
-/*! <!-- This is a comment with a comment block --> Visible text */
-\endverbatim
-
-*/
-
diff --git a/doc/index.doc b/doc/index.doc
deleted file mode 100644
index 42f1444..0000000
--- a/doc/index.doc
+++ /dev/null
@@ -1,201 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-/*! \page index
-\if logo_on
-<center>
-\htmlonly
-<img align=center lowsrc="doxygen_logo_low.gif" src="doxygen_logo.gif"
- width=634 height=197 alt="doxygen"><br>
-Version: $(VERSION)
-\endhtmlonly
-</center>
-\endif
-
-<h2>Introduction</h2>
-Doxygen is a documentation system for C++, C, Java, Objective-C, Python, IDL
-(Corba and Microsoft flavors) and to some extent PHP, C#, and D.
-
-It 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 \f$\mbox{\LaTeX}\f$) 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.
- You 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 even `abuse' doxygen for creating normal documentation (as I did
- for this manual).
-</ol>
-
-Doxygen is developed under <a href="http://www.linux.org">Linux</a>
-and Mac OS X, 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 This manual is divided into three parts, each of which is divided into several
-sections.
-
-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
- doxygen for your platform.
-<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 lists show various ways to create lists.
-<li>Section \ref grouping shows how to group things together.
-<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,
- and members in the documentation.
-<li>Section \ref output shows how to generate the various output formats
- supported by doxygen.
-<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 trouble tells you what to do when you have problems.
-</ul>
-
-The second part forms a reference manual:
-
-<ul>
-<li>Section \ref features presents an overview of what doxygen can do.
-<li>Section \ref history shows what has changed during the development
- of doxygen and what still has to be done.
-<li>Section \ref doxygen_usage shows how to use the \c doxygen program.
-<li>Section \ref doxytag_usage shows how to use the \c doxytag program.
-<li>Section \ref doxywizard_usage shows how to use the \c doxywizard program.
-<li>Section \ref installdox_usage shows how to use the \c installdox
- script that is generated by doxygen if you use tag files.
-<li>Section \ref 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
- used within the documentation.
-<li>Section \ref htmlcmds shows an overview of the HTML commands that
- can be used within the documentation.
-<li>Section \ref xmlcmds shows an overview of the XML commands that
- can be used within the documentation.
-</ul>
-
-The third part provides information for developers:
-
-<ul>
-<li>Section \ref arch gives a global overview of how doxygen is internally
- structured.
-<li>Section \ref perlmod shows how to use the PerlMod output.
-<li>Section \ref langhowto explains how to add support for new
- output languages.
-</ul>
-
-\n<h2>Doxygen license</h2>
-\addindex license
-\addindex GPL
-
-Copyright &copy; 1997-2005 by
-<a href="mailto:dimitri@stack.nl">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
-for any purpose. It is provided "as is" without express or implied warranty.
-See the
-<a href="http://www.gnu.org/copyleft/gpl.html">
-GNU General Public License</a>
-for more details.
-<p>
-Documents produced by doxygen are derivative works derived from the
-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
-\htmlonly
-<a href="http://www.doxygen.org/results.html">some nice examples</a>
-\endhtmlonly
-\latexonly
-some nice examples (see {\tt http://www.doxygen.org/results.html})
-\endlatexonly
-of real-life projects using doxygen.
-
-These are part of a larger
-\htmlonly
-<a href="http://www.doxygen.org/projects.html">list of projects</a>
-that use doxygen.
-\endhtmlonly
-\latexonly
-list of projects that use doxygen (see {\tt http://www.doxygen.org/projects.html}).
-\endlatexonly
-If you know other projects, let me know and I'll add them.
-
-<h2>Future work</h2>
-Although doxygen is used successfully by a lot of people already,
-there is always room for improvement. Therefore, I have compiled a
-\htmlonly
-<a href="http://www.doxygen.org/todo.html">todo/wish list</a>
-\endhtmlonly
-\latexonly
-todo/wish list (see {\tt http://www.doxygen.org/todo.html})
-\endlatexonly
-of possible and/or requested enhancements.
-
-<h2>Acknowledgements</h2>
-\addindex acknowledgements
-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
- given me a good start in writing doxygen.
-<li>All people at Troll Tech, for creating a beautiful GUI Toolkit
- (which is very useful as a Windows/Unix platform abstraction layer :-)
-<li>My brother <a href="http://www.stack.nl/~fidget/index.html">Frank</a>
- 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>
- for registering the www.doxygen.org domain.
-<li>Parker Waechter for adding the RTF output generator.
-<li>Joerg Baumann, for adding conditional documentation blocks,
- PDF links, and the configuration generator.
-<li>Matthias Andree for providing a .spec script for building rpms from the
- sources.
-<li>Tim Mensch for adding the todo command.
-<li>Christian Hammond for redesigning the web-site.
-<li>Ken Wong for providing the HTML tree view code.
-<li>Talin for adding support for C# style comments with XML markup.
-<li>Petr Prikryl for coordinating the internationalisation support.
- All language maintainers for providing translations into many languages.
-<li>Gerald Steffens of <a href="http://www.e-trend.de">E-trend</a>
- for financial support.
-<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/infoflow.eps b/doc/infoflow.eps
deleted file mode 100644
index 740c1e4..0000000
--- a/doc/infoflow.eps
+++ /dev/null
@@ -1,607 +0,0 @@
-%!PS-Adobe-2.0 EPSF-2.0
-%%Title: infoflow.eps
-%%Creator: fig2dev Version 3.2 Patchlevel 3c
-%%CreationDate: Fri Aug 8 17:06:41 2003
-%%For: dimitri@pandora.home.nl (Dimitri van Heesch)
-%%BoundingBox: 0 0 659 583
-%%Magnification: 1.0000
-%%EndComments
-/$F2psDict 200 dict def
-$F2psDict begin
-$F2psDict /mtrx matrix put
-/col-1 {0 setgray} bind def
-/col0 {0.000 0.000 0.000 srgb} bind def
-/col1 {0.000 0.000 1.000 srgb} bind def
-/col2 {0.000 1.000 0.000 srgb} bind def
-/col3 {0.000 1.000 1.000 srgb} bind def
-/col4 {1.000 0.000 0.000 srgb} bind def
-/col5 {1.000 0.000 1.000 srgb} bind def
-/col6 {1.000 1.000 0.000 srgb} bind def
-/col7 {1.000 1.000 1.000 srgb} bind def
-/col8 {0.000 0.000 0.560 srgb} bind def
-/col9 {0.000 0.000 0.690 srgb} bind def
-/col10 {0.000 0.000 0.820 srgb} bind def
-/col11 {0.530 0.810 1.000 srgb} bind def
-/col12 {0.000 0.560 0.000 srgb} bind def
-/col13 {0.000 0.690 0.000 srgb} bind def
-/col14 {0.000 0.820 0.000 srgb} bind def
-/col15 {0.000 0.560 0.560 srgb} bind def
-/col16 {0.000 0.690 0.690 srgb} bind def
-/col17 {0.000 0.820 0.820 srgb} bind def
-/col18 {0.560 0.000 0.000 srgb} bind def
-/col19 {0.690 0.000 0.000 srgb} bind def
-/col20 {0.820 0.000 0.000 srgb} bind def
-/col21 {0.560 0.000 0.560 srgb} bind def
-/col22 {0.690 0.000 0.690 srgb} bind def
-/col23 {0.820 0.000 0.820 srgb} bind def
-/col24 {0.500 0.190 0.000 srgb} bind def
-/col25 {0.630 0.250 0.000 srgb} bind def
-/col26 {0.750 0.380 0.000 srgb} bind def
-/col27 {1.000 0.500 0.500 srgb} bind def
-/col28 {1.000 0.630 0.630 srgb} bind def
-/col29 {1.000 0.750 0.750 srgb} bind def
-/col30 {1.000 0.880 0.880 srgb} bind def
-/col31 {1.000 0.840 0.000 srgb} bind def
-/col32 {0.878 0.878 0.878 srgb} bind def
-/col33 {0.000 0.000 0.000 srgb} bind def
-
-end
-save
-newpath 0 583 moveto 0 0 lineto 659 0 lineto 659 583 lineto closepath clip newpath
--53.0 600.0 translate
-1 -1 scale
-
-/cp {closepath} bind def
-/ef {eofill} bind def
-/gr {grestore} bind def
-/gs {gsave} bind def
-/sa {save} bind def
-/rs {restore} bind def
-/l {lineto} bind def
-/m {moveto} bind def
-/rm {rmoveto} bind def
-/n {newpath} bind def
-/s {stroke} bind def
-/sh {show} bind def
-/slc {setlinecap} bind def
-/slj {setlinejoin} bind def
-/slw {setlinewidth} bind def
-/srgb {setrgbcolor} bind def
-/rot {rotate} bind def
-/sc {scale} bind def
-/sd {setdash} bind def
-/ff {findfont} bind def
-/sf {setfont} bind def
-/scf {scalefont} bind def
-/sw {stringwidth} bind def
-/tr {translate} bind def
-/tnt {dup dup currentrgbcolor
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add
- 4 -2 roll dup 1 exch sub 3 -1 roll mul add srgb}
- bind def
-/shd {dup dup currentrgbcolor 4 -2 roll mul 4 -2 roll mul
- 4 -2 roll mul srgb} bind def
-/reencdict 12 dict def /ReEncode { reencdict begin
-/newcodesandnames exch def /newfontname exch def /basefontname exch def
-/basefontdict basefontname findfont def /newfont basefontdict maxlength dict def
-basefontdict { exch dup /FID ne { dup /Encoding eq
-{ exch dup length array copy newfont 3 1 roll put }
-{ exch newfont 3 1 roll put } ifelse } { pop pop } ifelse } forall
-newfont /FontName newfontname put newcodesandnames aload pop
-128 1 255 { newfont /Encoding get exch /.notdef put } for
-newcodesandnames length 2 idiv { newfont /Encoding get 3 1 roll put } repeat
-newfontname newfont definefont pop end } def
-/isovec [
-8#055 /minus 8#200 /grave 8#201 /acute 8#202 /circumflex 8#203 /tilde
-8#204 /macron 8#205 /breve 8#206 /dotaccent 8#207 /dieresis
-8#210 /ring 8#211 /cedilla 8#212 /hungarumlaut 8#213 /ogonek 8#214 /caron
-8#220 /dotlessi 8#230 /oe 8#231 /OE
-8#240 /space 8#241 /exclamdown 8#242 /cent 8#243 /sterling
-8#244 /currency 8#245 /yen 8#246 /brokenbar 8#247 /section 8#250 /dieresis
-8#251 /copyright 8#252 /ordfeminine 8#253 /guillemotleft 8#254 /logicalnot
-8#255 /hyphen 8#256 /registered 8#257 /macron 8#260 /degree 8#261 /plusminus
-8#262 /twosuperior 8#263 /threesuperior 8#264 /acute 8#265 /mu 8#266 /paragraph
-8#267 /periodcentered 8#270 /cedilla 8#271 /onesuperior 8#272 /ordmasculine
-8#273 /guillemotright 8#274 /onequarter 8#275 /onehalf
-8#276 /threequarters 8#277 /questiondown 8#300 /Agrave 8#301 /Aacute
-8#302 /Acircumflex 8#303 /Atilde 8#304 /Adieresis 8#305 /Aring
-8#306 /AE 8#307 /Ccedilla 8#310 /Egrave 8#311 /Eacute
-8#312 /Ecircumflex 8#313 /Edieresis 8#314 /Igrave 8#315 /Iacute
-8#316 /Icircumflex 8#317 /Idieresis 8#320 /Eth 8#321 /Ntilde 8#322 /Ograve
-8#323 /Oacute 8#324 /Ocircumflex 8#325 /Otilde 8#326 /Odieresis 8#327 /multiply
-8#330 /Oslash 8#331 /Ugrave 8#332 /Uacute 8#333 /Ucircumflex
-8#334 /Udieresis 8#335 /Yacute 8#336 /Thorn 8#337 /germandbls 8#340 /agrave
-8#341 /aacute 8#342 /acircumflex 8#343 /atilde 8#344 /adieresis 8#345 /aring
-8#346 /ae 8#347 /ccedilla 8#350 /egrave 8#351 /eacute
-8#352 /ecircumflex 8#353 /edieresis 8#354 /igrave 8#355 /iacute
-8#356 /icircumflex 8#357 /idieresis 8#360 /eth 8#361 /ntilde 8#362 /ograve
-8#363 /oacute 8#364 /ocircumflex 8#365 /otilde 8#366 /odieresis 8#367 /divide
-8#370 /oslash 8#371 /ugrave 8#372 /uacute 8#373 /ucircumflex
-8#374 /udieresis 8#375 /yacute 8#376 /thorn 8#377 /ydieresis] def
-/Times-Roman /Times-Roman-iso isovec ReEncode
-/$F2psBegin {$F2psDict begin /$F2psEnteredState save def} def
-/$F2psEnd {$F2psEnteredState restore end} def
-
-$F2psBegin
-%%Page: 1 1
-10 setmiterlimit
- 0.06000 0.06000 sc
-%
-% Fig objects follow
-%
-% Polyline
-7.500 slw
-n 3600 1950 m 3900 1650 l 4800 1650 l 4800 3150 l 3600 3150 l 3600 1950 l
- 3900 1950 l
- 3900 1650 l gs col0 s gr
-/Times-Roman-iso ff 180.00 scf sf
-3900 2250 m
-gs 1 -1 sc (Config file) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-3900 2550 m
-gs 1 -1 sc (Doxyfile) col0 sh gr
-% Polyline
-n 900 3675 m 1200 3375 l 2100 3375 l 2100 4875 l 900 4875 l 900 3675 l
- 1200 3675 l
- 1200 3375 l gs col0 s gr
-% Polyline
-n 975 3600 m 975 3300 l 2175 3300 l 2175 4800 l
- 2100 4800 l gs col0 s gr
-% Polyline
-n 1050 3300 m 1050 3225 l 2250 3225 l 2250 4725 l
- 2175 4725 l gs col0 s gr
-% Polyline
-n 1125 3225 m 1125 3150 l 2325 3150 l 2325 4650 l
- 2250 4650 l gs col0 s gr
-% Polyline
-n 900 5700 m 1200 5400 l 2100 5400 l 2100 6900 l 900 6900 l 900 5700 l
- 1200 5700 l
- 1200 5400 l gs col0 s gr
-% Polyline
-n 975 5625 m 975 5325 l 2175 5325 l 2175 6825 l
- 2100 6825 l gs col0 s gr
-% Polyline
-n 1050 5325 m 1050 5250 l 2250 5250 l 2250 6750 l
- 2175 6750 l gs col0 s gr
-% Polyline
-n 1125 5250 m 1125 5175 l 2325 5175 l 2325 6675 l
- 2250 6675 l gs col0 s gr
-/Times-Roman-iso ff 180.00 scf sf
-1275 6075 m
-gs 1 -1 sc (- headers) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-1275 6675 m
-gs 1 -1 sc (- images) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-1275 6375 m
-gs 1 -1 sc (- footers) col0 sh gr
-% Polyline
-n 6675 8775 m 6975 8475 l 7875 8475 l 7875 9975 l 6675 9975 l 6675 8775 l
- 6975 8775 l
- 6975 8475 l gs col0 s gr
-% Polyline
-n 6750 8700 m 6750 8400 l 7950 8400 l 7950 9900 l
- 7875 9900 l gs col0 s gr
-% Polyline
-n 6825 8400 m 6825 8325 l 8025 8325 l 8025 9825 l
- 7950 9825 l gs col0 s gr
-% Polyline
-n 6900 8325 m 6900 8250 l 8100 8250 l 8100 9750 l
- 8025 9750 l gs col0 s gr
-% Polyline
-n 6600 4950 m 6900 4650 l 7800 4650 l 7800 6150 l 6600 6150 l 6600 4950 l
- 6900 4950 l
- 6900 4650 l gs col0 s gr
-% Polyline
-n 6675 4875 m 6675 4575 l 7875 4575 l 7875 6075 l
- 7800 6075 l gs col0 s gr
-% Polyline
-n 6750 4575 m 6750 4500 l 7950 4500 l 7950 6000 l
- 7875 6000 l gs col0 s gr
-% Polyline
-n 6825 4500 m 6825 4425 l 8025 4425 l 8025 5925 l
- 7950 5925 l gs col0 s gr
-% Polyline
-n 6600 2925 m 6900 2625 l 7800 2625 l 7800 4125 l 6600 4125 l 6600 2925 l
- 6900 2925 l
- 6900 2625 l gs col0 s gr
-% Polyline
-n 6675 2850 m 6675 2550 l 7875 2550 l 7875 4050 l
- 7800 4050 l gs col0 s gr
-% Polyline
-n 6750 2550 m 6750 2475 l 7950 2475 l 7950 3975 l
- 7875 3975 l gs col0 s gr
-% Polyline
-n 6825 2475 m 6825 2400 l 8025 2400 l 8025 3900 l
- 7950 3900 l gs col0 s gr
-% Polyline
-n 6600 900 m 6900 600 l 7800 600 l 7800 2100 l 6600 2100 l 6600 900 l
- 6900 900 l
- 6900 600 l gs col0 s gr
-% Polyline
-n 6675 825 m 6675 525 l 7875 525 l 7875 2025 l
- 7800 2025 l gs col0 s gr
-% Polyline
-n 6750 525 m 6750 450 l 7950 450 l 7950 1950 l
- 7875 1950 l gs col0 s gr
-% Polyline
-n 6825 450 m 6825 375 l 8025 375 l 8025 1875 l
- 7950 1875 l gs col0 s gr
-% Polyline
-gs clippath
-4020 3765 m 4080 3765 l 4080 3614 l 4050 3734 l 4020 3614 l cp
-eoclip
-n 4050 3150 m
- 4050 3750 l gs col0 s gr gr
-
-% arrowhead
-n 4020 3614 m 4050 3734 l 4080 3614 l 4020 3614 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-3315 4155 m 3315 4095 l 3164 4095 l 3284 4125 l 3164 4155 l cp
-eoclip
-n 2100 4125 m
- 3300 4125 l gs col0 s gr gr
-
-% arrowhead
-n 3164 4155 m 3284 4125 l 3164 4095 l 3164 4155 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-3315 4380 m 3315 4320 l 3164 4320 l 3284 4350 l 3164 4380 l cp
-eoclip
-n 2100 6225 m 2700 6225 l 2700 4350 l
- 3300 4350 l gs col0 s gr gr
-
-% arrowhead
-n 3164 4380 m 3284 4350 l 3164 4320 l 3164 4380 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-4380 3135 m 4320 3135 l 4320 3286 l 4350 3166 l 4380 3286 l cp
-eoclip
-n 4350 3150 m
- 4350 3750 l gs col0 s gr gr
-
-% arrowhead
-n 4380 3286 m 4350 3166 l 4320 3286 l 4380 3286 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-n 3675 5925 m 3975 5625 l 4875 5625 l 4875 7125 l 3675 7125 l 3675 5925 l
- 3975 5925 l
- 3975 5625 l gs col0 s gr
-% Polyline
-n 3300 300 m 5100 300 l 5100 1050 l 3300 1050 l
- cp gs col32 1.00 shd ef gr gs col0 s gr
-% Polyline
-gs clippath
-4155 4635 m 4095 4635 l 4095 4786 l 4125 4666 l 4155 4786 l cp
-eoclip
-n 4125 5625 m
- 4125 4650 l gs col0 s gr gr
-
-% arrowhead
-n 4155 4786 m 4125 4666 l 4095 4786 l 4155 4786 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-4320 5640 m 4380 5640 l 4380 5489 l 4350 5609 l 4320 5489 l cp
-eoclip
-n 4350 5625 m
- 4350 4650 l gs col0 s gr gr
-
-% arrowhead
-n 4320 5489 m 4350 5609 l 4380 5489 l 4320 5489 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-4170 1665 m 4230 1665 l 4230 1514 l 4200 1634 l 4170 1514 l cp
-4230 1035 m 4170 1035 l 4170 1186 l 4200 1066 l 4230 1186 l cp
-eoclip
-n 4200 1050 m
- 4200 1650 l gs col0 s gr gr
-
-% arrowhead
-n 4230 1186 m 4200 1066 l 4170 1186 l 4230 1186 l cp gs 0.00 setgray ef gr col0 s
-% arrowhead
-n 4170 1514 m 4200 1634 l 4230 1514 l 4170 1514 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-6615 1455 m 6615 1395 l 6464 1395 l 6584 1425 l 6464 1455 l cp
-eoclip
-n 5100 3900 m 6000 3900 l 6000 1425 l
- 6600 1425 l gs col0 s gr gr
-
-% arrowhead
-n 6464 1455 m 6584 1425 l 6464 1395 l 6464 1455 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-6615 3480 m 6615 3420 l 6464 3420 l 6584 3450 l 6464 3480 l cp
-eoclip
-n 5100 4050 m 6300 4050 l 6300 3450 l
- 6600 3450 l gs col0 s gr gr
-
-% arrowhead
-n 6464 3480 m 6584 3450 l 6464 3420 l 6464 3480 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-6615 5580 m 6615 5520 l 6464 5520 l 6584 5550 l 6464 5580 l cp
-eoclip
-n 5100 4200 m 6300 4200 l 6300 5550 l
- 6600 5550 l gs col0 s gr gr
-
-% arrowhead
-n 6464 5580 m 6584 5550 l 6464 5520 l 6464 5580 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-6690 7380 m 6690 7320 l 6539 7320 l 6659 7350 l 6539 7380 l cp
-eoclip
-n 5100 4350 m 6000 4350 l 6000 7350 l
- 6675 7350 l gs col0 s gr gr
-
-% arrowhead
-n 6539 7380 m 6659 7350 l 6539 7320 l 6539 7380 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-6690 9180 m 6690 9120 l 6539 9120 l 6659 9150 l 6539 9180 l cp
-eoclip
-n 5100 4500 m 5700 4500 l 5700 9150 l
- 6675 9150 l gs col0 s gr gr
-
-% arrowhead
-n 6539 9180 m 6659 9150 l 6539 9120 l 6539 9180 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-n 6675 6675 m 6975 6375 l 7875 6375 l 7875 7875 l 6675 7875 l 6675 6675 l
- 6975 6675 l
- 6975 6375 l gs col0 s gr
-% Polyline
-n 3300 3750 m 5100 3750 l 5100 4650 l 3300 4650 l
- cp gs col32 1.00 shd ef gr gs col0 s gr
-% Polyline
-n 8775 450 m 10800 450 l 10800 1575 l 8775 1575 l
- cp gs col32 1.00 shd ef gr gs col0 s gr
-% Polyline
-n 9075 900 m 10650 900 l 10650 1425 l 9075 1425 l
- cp gs col0 s gr
-% Polyline
-gs clippath
-8790 1380 m 8790 1320 l 8639 1320 l 8759 1350 l 8639 1380 l cp
-eoclip
-n 7800 1350 m
- 8775 1350 l gs col0 s gr gr
-
-% arrowhead
-n 8639 1380 m 8759 1350 l 8639 1320 l 8639 1380 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-11490 1380 m 11490 1320 l 11339 1320 l 11459 1350 l 11339 1380 l cp
-eoclip
-n 10800 1350 m
- 11475 1350 l gs col0 s gr gr
-
-% arrowhead
-n 11339 1380 m 11459 1350 l 11339 1320 l 11339 1380 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-9015 3180 m 9015 3120 l 8864 3120 l 8984 3150 l 8864 3180 l cp
-eoclip
-n 7800 3150 m
- 9000 3150 l gs col0 s gr gr
-
-% arrowhead
-n 8864 3180 m 8984 3150 l 8864 3120 l 8864 3180 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-9015 3555 m 9015 3495 l 8864 3495 l 8984 3525 l 8864 3555 l cp
-eoclip
-n 7800 3525 m
- 9000 3525 l gs col0 s gr gr
-
-% arrowhead
-n 8864 3555 m 8984 3525 l 8864 3495 l 8864 3555 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-n 9000 2925 m 10800 2925 l 10800 3675 l 9000 3675 l
- cp gs col32 1.00 shd ef gr gs col0 s gr
-% Polyline
-gs clippath
-11490 3180 m 11490 3120 l 11339 3120 l 11459 3150 l 11339 3180 l cp
-eoclip
-n 10800 3150 m
- 11475 3150 l gs col0 s gr gr
-
-% arrowhead
-n 11339 3180 m 11459 3150 l 11339 3120 l 11339 3180 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-11490 3555 m 11490 3495 l 11339 3495 l 11459 3525 l 11339 3555 l cp
-eoclip
-n 10800 3525 m
- 11475 3525 l gs col0 s gr gr
-
-% arrowhead
-n 11339 3555 m 11459 3525 l 11339 3495 l 11339 3555 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-n 9000 6900 m 10800 6900 l 10800 7650 l 9000 7650 l
- cp gs col32 1.00 shd ef gr gs col0 s gr
-% Polyline
-gs clippath
-9015 7305 m 9015 7245 l 8864 7245 l 8984 7275 l 8864 7305 l cp
-eoclip
-n 7875 7275 m
- 9000 7275 l gs col0 s gr gr
-
-% arrowhead
-n 8864 7305 m 8984 7275 l 8864 7245 l 8864 7305 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-11415 7305 m 11415 7245 l 11264 7245 l 11384 7275 l 11264 7305 l cp
-eoclip
-n 10800 7275 m
- 11400 7275 l gs col0 s gr gr
-
-% arrowhead
-n 11264 7305 m 11384 7275 l 11264 7245 l 11264 7305 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-gs clippath
-9015 9180 m 9015 9120 l 8864 9120 l 8984 9150 l 8864 9180 l cp
-eoclip
-n 7875 9150 m
- 9000 9150 l gs col0 s gr gr
-
-% arrowhead
-n 8864 9180 m 8984 9150 l 8864 9120 l 8864 9180 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-n 9000 8775 m 10875 8775 l 10875 9525 l 9000 9525 l
- cp gs col32 1.00 shd ef gr gs col0 s gr
-% Polyline
-gs clippath
-11415 9180 m 11415 9120 l 11264 9120 l 11384 9150 l 11264 9180 l cp
-eoclip
-n 10875 9150 m
- 11400 9150 l gs col0 s gr gr
-
-% arrowhead
-n 11264 9180 m 11384 9150 l 11264 9120 l 11264 9180 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
-n 3300 8850 m 5100 8850 l 5100 9525 l 3300 9525 l
- cp gs col32 1.00 shd ef gr gs col0 s gr
-% Polyline
-gs clippath
-5085 9270 m 5085 9330 l 5236 9330 l 5116 9300 l 5236 9270 l cp
-eoclip
-n 6675 9300 m
- 5100 9300 l gs col0 s gr gr
-
-% arrowhead
-n 5236 9270 m 5116 9300 l 5236 9330 l 5236 9270 l cp gs 0.00 setgray ef gr col0 s
-% Polyline
- [60] 0 sd
-n 8700 6450 m 11850 6450 l 11850 9975 l 8700 9975 l
- cp gs col0 s gr [] 0 sd
-% Polyline
-gs clippath
-4305 7110 m 4245 7110 l 4245 7261 l 4275 7141 l 4305 7261 l cp
-eoclip
-n 4275 8850 m
- 4275 7125 l gs col0 s gr gr
-
-% arrowhead
-n 4305 7261 m 4275 7141 l 4245 7261 l 4305 7261 l cp gs 0.00 setgray ef gr col0 s
-/Times-Roman-iso ff 180.00 scf sf
-4500 3525 m
-gs 1 -1 sc (generate/update) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-3600 3525 m
-gs 1 -1 sc (read) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-2850 3975 m
-gs 1 -1 sc (read) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-2850 4650 m
-gs 1 -1 sc (read) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-3975 6450 m
-gs 1 -1 sc (Tag file\(s\)) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-3750 750 m
-gs 1 -1 sc (Doxywizard) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-4425 5175 m
-gs 1 -1 sc (generate) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-3675 5175 m
-gs 1 -1 sc (read) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-4350 1425 m
-gs 1 -1 sc (generate/edit) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-6900 1350 m
-gs 1 -1 sc (XML files) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-6900 3300 m
-gs 1 -1 sc (Latex files) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-6900 3750 m
-gs 1 -1 sc (Makefile) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-7200 3525 m
-gs 1 -1 sc (+) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-3900 4275 m
-gs 1 -1 sc (Doxygen) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-9225 750 m
-gs 1 -1 sc (Your application) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-9300 1275 m
-gs 1 -1 sc (doxmlparser lib) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-8175 3750 m
-gs 1 -1 sc (make pdf) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-8175 3000 m
-gs 1 -1 sc (make ps) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-9675 3375 m
-gs 1 -1 sc (latex) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-11025 825 m
-gs 1 -1 sc (custom) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-11025 1050 m
-gs 1 -1 sc (output) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-11025 3000 m
-gs 1 -1 sc (postscript) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-11025 3825 m
-gs 1 -1 sc (PDF) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-6900 7350 m
-gs 1 -1 sc (refman.rtf) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-9525 7350 m
-gs 1 -1 sc (MS-Word) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-11100 7200 m
-gs 1 -1 sc (doc) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-8175 7200 m
-gs 1 -1 sc (import) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-6975 9075 m
-gs 1 -1 sc (HTML) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-6975 9300 m
-gs 1 -1 sc (pages) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-9075 9225 m
-gs 1 -1 sc (HTML Help Workshop) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-11100 9000 m
-gs 1 -1 sc (chm) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-6825 5625 m
-gs 1 -1 sc (Man pages) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-5475 9525 m
-gs 1 -1 sc (parse) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-3825 9300 m
-gs 1 -1 sc (Doxytag) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-8325 9075 m
-gs 1 -1 sc (read) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-8775 6675 m
-gs 1 -1 sc (Windows only) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-8250 1200 m
-gs 1 -1 sc (read) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-1200 4200 m
-gs 1 -1 sc (Sources) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-1275 5775 m
-gs 1 -1 sc (Custom) col0 sh gr
-/Times-Roman-iso ff 180.00 scf sf
-4350 8175 m
-gs 1 -1 sc (generate) col0 sh gr
-$F2psEnd
-rs
diff --git a/doc/infoflow.fig b/doc/infoflow.fig
deleted file mode 100644
index 501b81b..0000000
--- a/doc/infoflow.fig
+++ /dev/null
@@ -1,226 +0,0 @@
-#FIG 3.2
-Landscape
-Center
-Inches
-Letter
-100.00
-Single
--2
-1200 2
-0 32 #e0e0e0
-0 33 #000000
-6 3600 1650 4800 3150
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
- 3600 1950 3900 1650 4800 1650 4800 3150 3600 3150 3600 1950
- 3900 1950 3900 1650
-4 0 0 50 0 0 12 0.0000 4 180 780 3900 2250 Config file\001
-4 0 0 50 0 0 12 0.0000 4 180 645 3900 2550 Doxyfile\001
--6
-6 900 3150 2325 4875
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
- 900 3675 1200 3375 2100 3375 2100 4875 900 4875 900 3675
- 1200 3675 1200 3375
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
- 975 3600 975 3300 2175 3300 2175 4800 2100 4800
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
- 1050 3300 1050 3225 2250 3225 2250 4725 2175 4725
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
- 1125 3225 1125 3150 2325 3150 2325 4650 2250 4650
--6
-6 900 5175 2325 6900
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
- 900 5700 1200 5400 2100 5400 2100 6900 900 6900 900 5700
- 1200 5700 1200 5400
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
- 975 5625 975 5325 2175 5325 2175 6825 2100 6825
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
- 1050 5325 1050 5250 2250 5250 2250 6750 2175 6750
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
- 1125 5250 1125 5175 2325 5175 2325 6675 2250 6675
--6
-6 1275 5925 2025 6750
-4 0 0 50 0 0 12 0.0000 4 135 750 1275 6075 - headers\001
-4 0 0 50 0 0 12 0.0000 4 180 690 1275 6675 - images\001
-4 0 0 50 0 0 12 0.0000 4 135 690 1275 6375 - footers\001
--6
-6 6675 8250 8100 9975
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
- 6675 8775 6975 8475 7875 8475 7875 9975 6675 9975 6675 8775
- 6975 8775 6975 8475
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
- 6750 8700 6750 8400 7950 8400 7950 9900 7875 9900
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
- 6825 8400 6825 8325 8025 8325 8025 9825 7950 9825
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
- 6900 8325 6900 8250 8100 8250 8100 9750 8025 9750
--6
-6 6600 4425 8025 6150
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
- 6600 4950 6900 4650 7800 4650 7800 6150 6600 6150 6600 4950
- 6900 4950 6900 4650
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
- 6675 4875 6675 4575 7875 4575 7875 6075 7800 6075
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
- 6750 4575 6750 4500 7950 4500 7950 6000 7875 6000
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
- 6825 4500 6825 4425 8025 4425 8025 5925 7950 5925
--6
-6 6600 2400 8025 4125
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
- 6600 2925 6900 2625 7800 2625 7800 4125 6600 4125 6600 2925
- 6900 2925 6900 2625
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
- 6675 2850 6675 2550 7875 2550 7875 4050 7800 4050
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
- 6750 2550 6750 2475 7950 2475 7950 3975 7875 3975
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
- 6825 2475 6825 2400 8025 2400 8025 3900 7950 3900
--6
-6 6600 375 8025 2100
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
- 6600 900 6900 600 7800 600 7800 2100 6600 2100 6600 900
- 6900 900 6900 600
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
- 6675 825 6675 525 7875 525 7875 2025 7800 2025
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
- 6750 525 6750 450 7950 450 7950 1950 7875 1950
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
- 6825 450 6825 375 8025 375 8025 1875 7950 1875
--6
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 4050 3150 4050 3750
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 2100 4125 3300 4125
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
- 1 1 1.00 60.00 120.00
- 2100 6225 2700 6225 2700 4350 3300 4350
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 1 2
- 1 1 1.00 60.00 120.00
- 4350 3150 4350 3750
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
- 3675 5925 3975 5625 4875 5625 4875 7125 3675 7125 3675 5925
- 3975 5925 3975 5625
-2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
- 3300 300 5100 300 5100 1050 3300 1050 3300 300
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 4125 5625 4125 4650
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 1 2
- 1 1 1.00 60.00 120.00
- 4350 5625 4350 4650
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 1 2
- 1 1 1.00 60.00 120.00
- 1 1 1.00 60.00 120.00
- 4200 1050 4200 1650
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
- 1 1 1.00 60.00 120.00
- 5100 3900 6000 3900 6000 1425 6600 1425
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
- 1 1 1.00 60.00 120.00
- 5100 4050 6300 4050 6300 3450 6600 3450
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
- 1 1 1.00 60.00 120.00
- 5100 4200 6300 4200 6300 5550 6600 5550
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
- 1 1 1.00 60.00 120.00
- 5100 4350 6000 4350 6000 7350 6675 7350
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 4
- 1 1 1.00 60.00 120.00
- 5100 4500 5700 4500 5700 9150 6675 9150
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 8
- 6675 6675 6975 6375 7875 6375 7875 7875 6675 7875 6675 6675
- 6975 6675 6975 6375
-2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
- 3300 3750 5100 3750 5100 4650 3300 4650 3300 3750
-2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
- 8775 450 10800 450 10800 1575 8775 1575 8775 450
-2 2 0 1 0 7 50 0 -1 0.000 0 0 -1 0 0 5
- 9075 900 10650 900 10650 1425 9075 1425 9075 900
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 7800 1350 8775 1350
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 10800 1350 11475 1350
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 7800 3150 9000 3150
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 7800 3525 9000 3525
-2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
- 9000 2925 10800 2925 10800 3675 9000 3675 9000 2925
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 10800 3150 11475 3150
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 10800 3525 11475 3525
-2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
- 9000 6900 10800 6900 10800 7650 9000 7650 9000 6900
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 7875 7275 9000 7275
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 10800 7275 11400 7275
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 7875 9150 9000 9150
-2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
- 9000 8775 10875 8775 10875 9525 9000 9525 9000 8775
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 10875 9150 11400 9150
-2 2 0 1 0 32 50 0 20 0.000 0 0 -1 0 0 5
- 3300 8850 5100 8850 5100 9525 3300 9525 3300 8850
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 6675 9300 5100 9300
-2 2 1 1 0 7 50 0 -1 4.000 0 0 -1 0 0 5
- 8700 6450 11850 6450 11850 9975 8700 9975 8700 6450
-2 1 0 1 0 7 50 0 -1 0.000 0 0 -1 1 0 2
- 1 1 1.00 60.00 120.00
- 4275 8850 4275 7125
-4 0 0 50 0 0 12 0.0000 4 180 1215 4500 3525 generate/update\001
-4 0 0 50 0 0 12 0.0000 4 135 330 3600 3525 read\001
-4 0 0 50 0 0 12 0.0000 4 135 330 2850 3975 read\001
-4 0 0 50 0 0 12 0.0000 4 135 330 2850 4650 read\001
-4 0 0 50 0 0 12 0.0000 4 180 810 3975 6450 Tag file(s)\001
-4 0 0 50 0 0 12 0.0000 4 180 915 3750 750 Doxywizard\001
-4 0 0 50 0 0 12 0.0000 4 150 660 4425 5175 generate\001
-4 0 0 50 0 0 12 0.0000 4 135 330 3675 5175 read\001
-4 0 0 50 0 0 12 0.0000 4 180 990 4350 1425 generate/edit\001
-4 0 0 50 0 0 12 0.0000 4 135 780 6900 1350 XML files\001
-4 0 0 50 0 0 12 0.0000 4 135 810 6900 3300 Latex files\001
-4 0 0 50 0 0 12 0.0000 4 135 675 6900 3750 Makefile\001
-4 0 0 50 0 0 12 0.0000 4 75 105 7200 3525 +\001
-4 0 0 50 0 0 12 0.0000 4 180 675 3900 4275 Doxygen\001
-4 0 0 50 0 0 12 0.0000 4 180 1245 9225 750 Your application\001
-4 0 0 50 0 0 12 0.0000 4 180 1155 9300 1275 doxmlparser lib\001
-4 0 0 50 0 0 12 0.0000 4 180 690 8175 3750 make pdf\001
-4 0 0 50 0 0 12 0.0000 4 180 630 8175 3000 make ps\001
-4 0 0 50 0 0 12 0.0000 4 135 375 9675 3375 latex\001
-4 0 0 50 0 0 12 0.0000 4 105 555 11025 825 custom\001
-4 0 0 50 0 0 12 0.0000 4 150 480 11025 1050 output\001
-4 0 0 50 0 0 12 0.0000 4 180 765 11025 3000 postscript\001
-4 0 0 50 0 0 12 0.0000 4 135 345 11025 3825 PDF\001
-4 0 0 50 0 0 12 0.0000 4 135 750 6900 7350 refman.rtf\001
-4 0 0 50 0 0 12 0.0000 4 135 795 9525 7350 MS-Word\001
-4 0 0 50 0 0 12 0.0000 4 135 270 11100 7200 doc\001
-4 0 0 50 0 0 12 0.0000 4 180 480 8175 7200 import\001
-4 0 0 50 0 0 12 0.0000 4 135 510 6975 9075 HTML\001
-4 0 0 50 0 0 12 0.0000 4 135 450 6975 9300 pages\001
-4 0 0 50 0 0 12 0.0000 4 180 1740 9075 9225 HTML Help Workshop\001
-4 0 0 50 0 0 12 0.0000 4 135 315 11100 9000 chm\001
-4 0 0 50 0 0 12 0.0000 4 180 840 6825 5625 Man pages\001
-4 0 0 50 0 0 12 0.0000 4 135 420 5475 9525 parse\001
-4 0 0 50 0 0 12 0.0000 4 180 645 3825 9300 Doxytag\001
-4 0 0 50 0 0 12 0.0000 4 135 330 8325 9075 read\001
-4 0 0 50 0 0 12 0.0000 4 180 1080 8775 6675 Windows only\001
-4 0 0 50 0 0 12 0.0000 4 135 330 8250 1200 read\001
-4 0 0 50 0 0 12 0.0000 4 135 615 1200 4200 Sources\001
-4 0 0 50 0 0 12 0.0000 4 135 585 1275 5775 Custom\001
-4 0 0 50 0 0 12 0.0000 4 150 660 4350 8175 generate\001
diff --git a/doc/infoflow.gif b/doc/infoflow.gif
deleted file mode 100644
index 7b4468b..0000000
--- a/doc/infoflow.gif
+++ /dev/null
Binary files differ
diff --git a/doc/install.doc b/doc/install.doc
deleted file mode 100644
index 8fb1f6a..0000000
--- a/doc/install.doc
+++ /dev/null
@@ -1,592 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-/*! \page install Installation
-
-\addindex installation
-First go to the
-<a href="http://www.doxygen.org/download.html">download</a> page
-\latexonly({\tt http://www.doxygen.org/download.html})\endlatexonly
-to get the latest distribution, if you did not have it already.
-
-This section is divided into the following sections:
-<ul>
-<li>\ref install_src_unix "Compiling from source on Unix"
-<li>\ref install_bin_unix "Installing the binaries on Unix"
-<li>\ref unix_problems "Known compilation problems for Unix"
-<li>\ref install_src_windows "Compiling from source on Windows"
-<li>\ref install_bin_windows "Installing the binaries on Windows"
-<li>\ref build_tools "Tools used to develop doxygen"
-</ul>
-
-\section install_src_unix Compiling from source on Unix
-
-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
- flex, bison and make
- \addindex flex
- \addindex bison
- \addindex make
-<li>In order to generate a Makefile for your platform, you need
- <a href="http://www.perl.com/">perl</a>
- \latexonly(see {\tt http://www.perl.com/})\endlatexonly.
- \addindex perl
-</ul>
-
-To take full advantage of doxygen's features the following additional
-tools should be installed.
-
-<ul>
-<li>Troll Tech's GUI toolkit
- <A HREF="http://www.trolltech.com/products/qt.html">Qt</A>
- \latexonly(see {\tt http://www.trolltech.com/products/qt.html})\endlatexonly
- \addindex Qt
- version 3.2 or higher.
- This is needed to build the GUI front-end doxywizard.
-<li>A \f$\mbox{\LaTeX}\f$ distribution: for instance
- <a href="http://www.tug.org/interest.html#free">teTeX 1.0</a>
- \latexonly \\par (see {\tt http://www.tug.org/interest.html\#free})\endlatexonly.
- This is needed for generating LaTeX, Postscript, and PDF output.
-<li><a href="http://www.research.att.com/sw/tools/graphviz/">
- the Graph visualization toolkit version 1.8.10 or higher</a>
- \latexonly \\par (see {\tt http://www.research.att.com/sw/tools/graphviz/})\endlatexonly.
- 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),
- otherwise the graphs will not render proper text labels.
-<li>The ghostscript interpreter. To be found at
- <a href="http://www.ghostscript.com/">www.ghostscript.com</a>.
-</ul>
-
-Compilation is now done by performing the following steps:
-
-<ol>
-<li> Unpack the archive, unless you already have done that:
-
-\verbatim
- gunzip doxygen-$VERSION.src.tar.gz # uncompress the archive
- tar xf doxygen-$VERSION.src.tar # unpack it
-\endverbatim
-
-<li>Run the configure script:
-
-\verbatim
- sh ./configure
-\endverbatim
-
- The script tries to determine the platform you use, the make tool
- (which \e must be GNU make) and the perl
- interpreter. It will report what it finds.
-
- To override the auto detected platform and compiler you can run
- configure as follows:
-
-\verbatim
- configure --platform platform-type
-\endverbatim
-
- See the <code>PLATFORMS</code> file for a list of possible platform
- options.
-
- If you have Qt-3.2.x or higher installed and want to build the GUI
- front-end, you should run the configure script with
- the <code>--with-doxywizard</code> option:
-
-\verbatim
- configure --with-doxywizard
-\endverbatim
-
- For an overview of other configuration options use
-
-\verbatim
- configure --help
-\endverbatim
-
-<li>Compile the program by running make:
-
-\verbatim
- make
-\endverbatim
-
- The program should compile without problems and three binaries
- (<code>doxygen</code> and <code>doxytag</code>)
- should be available in the bin directory of the distribution.
-
-<li>Optional: Generate the user manual.
-
-\verbatim
- make docs
-\endverbatim
-
- To let doxygen generate the HTML documentation.
-
- \note You will need the stream editor <code>sed</code> for this,
- but this should be available on any Unix platform.
-
- The HTML directory of the distribution will now contain the html
- documentation (just point a HTML browser to the file
- <code>index.html</code> in the
- html directory).
-
-<li>Optional: Generate a PDF version of the manual
- (you will need <code>pdflatex</code>, <code>makeindex</code>, and
- <code>egrep</code> for this).
-
-\verbatim
- make pdf
-\endverbatim
-
- The PDF manual <code>doxygen_manual.pdf</code> will be located
- in the latex directory of the distribution. Just
- view and print it via the acrobat reader.
-
-</ol>
-
-\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,
- type:
-
-\verbatim
- ./configure
- make install
-\endverbatim
-
- 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</code> but can be changed with
- the <code>--prefix</code> option of the configure script.
- The default <code>\<docdir\></code> directory is
- <code>\<prefix\>/share/doc/packages</code> and can be changed with
- the <code>--docdir</code> 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.
-
- \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 wrong directory!
-
- If you have a RPM or DEP package, then please follow the
- standard installation procedure that is required for these packages.
-
-\section unix_problems Known compilation problems for Unix
-
-<b>Qt problems</b>
-
-The Qt include files and libraries are not a subdirectory of the
-directory pointed to by QTDIR on some systems
-(for instance on Red Hat 6.0 includes are in /usr/include/qt and
-libs are in /usr/lib).
-
-The solution: go to the root of the doxygen distribution and do:
-\verbatim
- mkdir qt
- cd qt
- ln -s your-qt-include-dir-here include
- ln -s your-qt-lib-dir-here lib
- export QTDIR=$PWD
-\endverbatim
-
-If you have a csh-like shell you should use <code>setenv QTDIR \$PWD</code>
-instead of the <code>export</code> command above.
-
-Now install doxygen as described above.
-
-<b>Bison problems</b>
-
-Versions 1.31 to 1.34 of bison contain a "bug" that results in a
-compiler errors like this:
-
-ce_parse.cpp:348: member `class CPPValue yyalloc::yyvs' with
-constructor not allowed in union
-
-This problem has been solved in version 1.35 (versions before 1.31
-will also work).
-
-<b>Latex problems</b>
-
-The file <code>a4wide.sty</code> is not available for all distributions. If
-your distribution does not have it please select another paper type
-in the config file (see the \ref cfg_paper_type "PAPER_TYPE" tag in the
-config file).
-
-<b>HP-UX \& Digital Unix problems</b>
-
-If you are compiling for HP-UX with aCC and you get this error:
-\verbatim
- /opt/aCC/lbin/ld: Unsatisfied symbols:
- alloca (code)
-\endverbatim
- then you should (according to Anke Selig) edit <code>ce_parse.cpp</code>
- and replace
-\verbatim
- extern "C" {
- void *alloca (unsigned int);
- };
-\endverbatim
- with
-\verbatim
- #include <alloca.h>
-\endverbatim
-
- If that does not help, try removing <code>ce_parse.cpp</code> and let
- bison rebuild it (this worked for me).
-
-If you are compiling for Digital Unix, the same problem can be solved
-(according to Barnard Schmallhof) by replacing the following in
-ce_parse.cpp:
-
-\verbatim
- #else /* not GNU C. */
- #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) \
- || defined (__sparc) || defined (__sgi)
- #include <alloca.h>
-\endverbatim
-
- with
-
-\verbatim
- #else /* not GNU C. */
- #if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) \
- || defined (__sparc) || defined (__sgi) || defined (__osf__)
- #include <alloca.h>
-\endverbatim
-
- Alternatively, one could fix the problem at the bison side.
- Here is patch for bison.simple (provided by Andre Johansen):
-
-\verbatim
---- bison.simple~ Tue Nov 18 11:45:53 1997
-+++ bison.simple Mon Jan 26 15:10:26 1998
-@@ -27,7 +27,7 @@
- #ifdef __GNUC__
- #define alloca __builtin_alloca
- #else /* not GNU C. */
--#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) \
- || defined (__sparc) || defined (__sgi)
-+#if (!defined (__STDC__) && defined (sparc)) || defined (__sparc__) \
- || defined (__sparc) || defined (__sgi) || defined (__alpha)
- #include <alloca.h>
- #else /* not sparc */
- #if defined (MSDOS) && !defined (__TURBOC__)
-\endverbatim
-
- The generated scanner.cpp that comes with doxygen is build with this
- patch applied.
-
-<b>Sun compiler problems</b>
-
-It appears that doxygen doesn't work properly if it is compiled
-with Sun's C++ WorkShop Compiler. I cannot verify this myself as I do
-not have access to a Solaris machine with this compiler. With GNU compiler
-it does work.
-
-when configuring with <code>--static</code> I got:
-
-\verbatim
-Undefined first referenced
- symbol in file
-dlclose /usr/lib/libc.a(nss_deffinder.o)
-dlsym /usr/lib/libc.a(nss_deffinder.o)
-dlopen /usr/lib/libc.a(nss_deffinder.o)
-\endverbatim
-
-Manually adding <code>-Bdynamic</code> after the target rule in
-<code>Makefile.doxygen</code> and <code>Makefile.doxytag</code>
-will fix this:
-
-\verbatim
-$(TARGET): $(OBJECTS) $(OBJMOC)
- $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS) -Bdynamic
-\endverbatim
-
-<b>GCC compiler problems</b>
-
-Older versions of the GNU compiler have problems with constant strings
-containing characters with character codes larger than 127. Therefore
-the compiler will fail to compile some of the translator_xx.h files.
-A workaround, if you are planning to use the English translation only,
-is to configure doxygen with the <code>--english-only</code> option.
-
-On some platforms (such as OpenBSD) using some versions of gcc with
--O2 can lead to eating all memory during the compilation of files
-such as config.cpp. As a workaround use --debug as a configure option
-or omit the -O2 for the particular files in the Makefile.
-
-Gcc versions before 2.95 may produce broken binaries due to bugs in
-these compilers.
-
-<b>Dot problems</b>
-
-Due to a change in the way image maps are generated, older versions
-of doxygen (\<=1.2.17) will not work correctly with newer versions of
-graphviz (\>=1.8.8). The effect of this incompatibility is that
-generated graphs in HTML are not properly clickable. For doxygen 1.3
-it is recommended to use at least graphviz 1.8.10 or higher.
-
-<b>Red Hat 9.0 problems</b>
-
-If you get the following error after running make
-\verbatim
-tmake error: qtools.pro:70: Syntax error
-\endverbatim
-then first type
-\verbatim
-export LANG=
-\endverbatim
-before running make.
-
-\section install_src_windows Compiling from source on Windows
-
-Currently, I have only compiled doxygen for Windows using Microsoft's
-Visual C++ (version 6.0). For other compilers you may need to edit the
-perl script in <code>wintools/make.pl</code> a bit.
-Let me know what you had to change if you got Doxygen working with another
-compiler. If you have Visual Studio you can also use the .dsw file found in
-the <code>wintools</code> directory. Note that this file is not maintained
-by me, so it might be outdated a little.
-
-If you have Visual C++ 6.0, and the source distribution, you can easily
-build doxygen using the project files in the \c wintools directory. If
-you want to build the CVS sources, or want to build from the command line,
-or with another compiler, you have to follow the steps below.
-
-Thomas Baust reported that if you have Visual Studio.NET (2003) then
-you should be aware that there is a problem with the _popen() and _pclose()
-implementation, which currently leaks handles, so if you build doxygen with
-it and use the INPUT_FILTER, you will run to risk of crashing Windows!
-The problem is reported to and confirmed by Microsoft so maybe it will
-fixed in the next service pack.
-
-Since Windows comes without all the nice tools that Unix users are
-used to, you'll need to install a number of these tools before you can compile
-doxygen for Windows from the command-line.
-
-Here is what is required:
-<ul>
-<li>An unzip/untar tool like WinZip to unpack the tar source distribution.
- This can be found at http://www.winzip.com/
-
- The good, tested, and free alternative is the <code>tar</code> utility
- supplied with <a href="http://sourceware.cygnus.com/cygwin/">cygwin
- tools</a>. Anyway, the cygwin's flex, bison, and sed are also
- recommended below.
-
-<li>Microsoft Visual C++ (I only tested with version 6.0).
- Use the <code>vcvars32.bat</code> batch file to set the environment
- variables (if you did not select to do this automatically during
- installation).
-
- Borland C++ or MINGW (see http://www.mingw.org/) are also supported.
-
-<li>Perl 5.0 or higher for Windows. This can be downloaded from:
- http://www.ActiveState.com/Products/ActivePerl/
-
-<li>The GNU tools flex, bison, and sed.
- To get these working on Windows you should install the
- <a href="http://sources.redhat.com/cygwin/">cygwin tools</a>
- \latexonly(see {\tt http://sources.redhat.com/cygwin/})\endlatexonly
-
- Alternatively, you can also choose to
- download only a <a href="http://www.doxygen.org/dl/cygwin_tools.zip">small subset</a>
- \latexonly(see {\tt http://www.doxygen.org/dl/cygwin\_tools.zip})\endlatexonly
- of the cygwin tools that I put together just to compile doxygen.
-
- As a third alternative one could use the GNUWin32 tools that can be
- found at http://gnuwin32.sourceforge.net/
-
- Make sure the <code>BISON_SIMPLE</code> environment variable points to the
- location where the files <code>bison.simple</code> and
- is located. For instance if these file is in
- <code>c:\\tools\\cygwin\\usr\\share</code> then BISON_SIMPLE should
- be set to <code>c:/tools/cygwin/usr/share/bison.simple</code>
-
- Also make sure the tools are available from a dos box, by adding
- the directory they are in to the search path.
-
- For those of you who are very new to cygwin (if you are going to
- install it from scratch), you should notice that there is an
- archive file <code>bootstrap.zip</code> which also contains the
- <code>tar</code> utility (<code>tar.exe</code>), <code>gzip</code>
- utilities, and the <code>cygwin1.dll</code> core. This also means
- that you have the <code>tar</code> in hands from the start. It
- can be used to unpack the tar source distribution instead of
- using WinZip -- as mentioned at the beginning of this list of
- steps.
-
-<li>From Doxygen-1.2.2-20001015 onwards, the distribution includes the part
- of Qt-2.x.y that is needed for to compile doxygen and doxytag,
- The Windows specific part were also created.
- As a result doxygen can be compiled on systems without X11 or the
- commerical version of Qt.
-
- For doxywizard, a complete Qt library is
- still a requirement however. A commercial license to build
- doxywizard with the latest Qt library was kindly donated to me
- by the nice people at <a href="http://www.trolltech.com">TrollTech</a>.
- See doxygen download page for a link.
-
-<li>If you used WinZip to extract the tar archive it will (apparently) not
- create empty folders, so you have to add the folders
- <code>objects</code> and <code>bin</code> manually in the root of the
- distribution before compiling.
-
-</ul>
-
-
-Compilation is now done by performing the following steps:
-
-<ol>
-<li>Open a dos box.
- Make sure all tools (i.e. <code>nmake</code>, <code>latex</code>,
- <code>gswin32</code>, <code>dvips</code>, <code>sed</code>,
- <code>flex</code>, <code>bison</code>, <code>cl</code>,
- <code>rm</code>, and <code>perl</code>), are accessible from
- the command-line (add them to the PATH environment variable if
- needed).
-
- Notice: The use of LaTeX is optional and only needed for compilation
- of the documentation into PostScript or PDF.
- It is \e not needed for compiling the doxygen's binaries.
-
-<li>Go to the doxygen root dir and type:
-
-\verbatim
- make.bat msvc
-\endverbatim
-
- This should build the executables
- <code>doxygen.exe</code> and <code>doxytag.exe</code>
- using Microsoft's Visual C++ compiler
- (The compiler should not produce any serious warnings or errors).
-
- You can use also the <code>bcc</code> argument to build
- executables using the Borland C++ compiler, or
- <code>mingw</code> argument to compile using GNU gcc.
-
-<li>To build the examples, go to the <code>examples</code> subdirectory
- and type:
-
-\verbatim
- nmake
-\endverbatim
-
-<li>To generate the doxygen documentation, go to the <code>doc</code>
- subdirectory and type:
-
-\verbatim
- nmake
-\endverbatim
-
- The generated HTML docs are located in the <code>..\\html</code>
- subdirectory.
-
- The sources for LaTeX documentation are located in the <code>..\\latex</code>
- subdirectory. From those sources, the DVI, PostScript, and PDF
- documentation can be generated.
-</ol>
-
-\section install_bin_windows Installing the binaries on Windows
-
-There is no fancy installation procedure at the moment (if anyone can
-add it in a location independent way please let me know).
-
-To install doxygen, just copy the binaries from the <code>bin</code> directory
-to a location somewhere in the path. Alternatively, you can include
-the <code>bin</code> directory of the distribution to the path.
-
-There are a couple of tools you may want to install to use all of doxygen's
-features:
-
-<ul>
-<li>To generate LaTeX documentation or formulas in HTML you need the tools:
- <code>latex</code>, <code>dvips</code> and <code>gswin32</code>.
- To get these working under Windows
- install the fpTeX distribution. You can find more info at:
- http://www.fptex.org/ and download it from CTAN or one of its mirrors.
- In the Netherlands for example this would be:
- ftp://ftp.easynet.nl/mirror/CTAN/systems/win32/fptex/
-
- Make sure the tools are available from a dos box, by adding the
- directory they are in to the search path.
-
- For your information, the LaTeX is freely available set of so
- called macros and styles on the top of the famous TeX program
- (by famous Donald Knuth) and the accompanied utilities (all
- available for free). It is used for high quality
- typesetting. The result -- in the form of so called
- <code>DVI</code> (DeVice Independent) file -- can be printed or
- displayed on various devices preserving exactly the same look up
- to the capability of the device. The <code>dvips</code> allows you
- to convert the <code>dvi</code> to the high quality PostScript
- (i.e. PostScript that can be processed by utilities like
- <code>psnup</code>, <code>psbook</code>, <code>psselect</code>,
- and others). The derived version of TeX (the pdfTeX) can be used
- to produce PDF output instead of DVI, or the PDF can be produced
- from PostScript using the utility <code>ps2pdf</code>.
-
- If you want to use MikTeX then you need to select at least the
- medium size installation. For really old versions of MikTex or minimal
- installations, you may need to download the fancyhdr package separately.
- You can find it in the
- <a href="ftp://ftp.tex.ac.uk/tex-archive/macros/latex/contrib/supported/fancyhdr/">
- contrib/supported</a> directory of the tex archives.
-
-<li>If you want to generate compressed HTML help
- (see \ref cfg_generate_htmlhelp "GENERATE_HTMLHELP") in the
- config file, then you need the Microsoft HTML help workshop.
- You can download it from
- <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/htmlhelp/html/vsconHH1Start.asp">Microsoft</a>.
-
-<li><a href="http://www.research.att.com/sw/tools/graphviz/">
- the Graph visualization toolkit version 1.8.10</a><br>
- \latexonly(see {\tt http://www.research.att.com/sw/tools/graphviz/})\endlatexonly.
- Needed for the include dependency graphs, the graphical inheritance graphs,
- and the collaboration graphs.
-</ul>
-
-\section build_tools Tools used to develop doxygen
-
-Doxygen was developed and tested under Linux using the following
-open-source tools:
-<ul>
-<li>GCC version 3.3.1
-<li>GNU flex version 2.5.4
-<li>GNU bison version 1.75
-<li>GNU make version 3.80
-<li>Perl version 5.8.1
-<li>VIM version 6.2
-<li>Mozilla 1.0
-<li>Troll Tech's tmake version 1.3 (included in the distribution)
-<li>teTeX version 1.0
-<li>CVS 1.10.7
-</ul>
-
-\htmlonly
-Go to the <a href="starting.html">next</a> section or return to the
- <a href="index.html">index</a>.
-\endhtmlonly
-
-*/
-
diff --git a/doc/install_prefix b/doc/install_prefix
deleted file mode 100644
index 681eca9..0000000
--- a/doc/install_prefix
+++ /dev/null
@@ -1,2 +0,0 @@
-VERSION = $(VERSION)
-
diff --git a/doc/installdox_usage.doc b/doc/installdox_usage.doc
deleted file mode 100644
index 4f05d45..0000000
--- a/doc/installdox_usage.doc
+++ /dev/null
@@ -1,62 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-/*! \page installdox_usage Installdox usage
-
-Installdox is a perl script that is generated by doxygen whenever
-tag files are used (See \c TAGFILES
-in section \ref config_extref)
-or the search engine is enabled (See \c SEARCHENGINE
-in section \ref config_search). The script is
-located in the same directory where the HTML files are located.
-
-Its purpose is to set the location of the external documentation
-for each tag file and to set the correct links to the search engine
-at install time.
-
-Calling \c installdox with option <b>-h</b> at the command line
-will give you a brief description of the usage of the program.
-
-The following options are available:
-<dl>
-<dt><b>-l <tt>\<tagfile\>\@\<location\></tt></b><dd>
- Each tag file contains information about the files, classes and members
- documented in a set of HTML files. A user can install these
- HTML files anywhere on his/her hard disk or web site.
- Therefore installdox \e requires the location of the
- documentation for each tag file <tt>\<tagfile\></tt>
- that is used by doxygen. The location <tt>\<location\></tt> can be
- an absolute path or a URL.
-
- \par Note:
- Each \<tagfile\> must be unique and should only be the name of the
- file, not including the path.
-
-<dt><b>-q</b><dd>
- When this option is specified, installdox will generate no output other
- than fatal errors.
-</dl>
-Optionally a list of HTML files may be given.
-These files are scanned and modified if needed.
-If this list is omitted all files in the current directory
-that end with \c .html are used.
-
-The \c installdox script is unique for each generated class browser
-in the sense that it `knows' what tag files are used. It will generate an error if
-the <b>-l</b> option is missing for a tag file or if an invalid tag file
-is given.
-
-*/
diff --git a/doc/language.doc b/doc/language.doc
deleted file mode 100644
index 061c788..0000000
--- a/doc/language.doc
+++ /dev/null
@@ -1,664 +0,0 @@
-/******************************************************************************
- * Do not edit this file. It was generated by the translator.py script.
- *
- * Copyright (C) 1997-2004 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.
- *
- * $Id$
- */
-/*! \page langhowto Internationalization
-
-<h3>Support for multiple languages</h3>
-
-Doxygen has built-in support for multiple languages. This means that the
-text fragments, generated by doxygen, can be produced in languages other
-than English (the default). The output language is chosen through the
-configuration file (with default name and known as Doxyfile).
-
-Currently (version 1.4.4), 31 languages
-are supported (sorted alphabetically):
-Afrikaans, Brazilian Portuguese, Catalan, Chinese, Chinese
-Traditional, Croatian, Czech, Danish, Dutch, English, Finnish, French,
-German, Greek, Hungarian, Indonesian, Italian, Japanese (+En), Korean
-(+En), Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian,
-Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian..
-
-The table of information related to the supported languages follows.
-It is sorted by language alphabetically. The <b>Status</b> column
-was generated from sources and shows approximately the last version
-when the translator was updated.
-
-\htmlonly
-<table align=center cellspacing=0 cellpadding=0 border=0>
-<tr bgcolor="#000000">
-<td>
- <table cellspacing=1 cellpadding=2 border=0>
- <tr bgcolor="#4040c0">
- <td ><b><font size=+1 color="#ffffff"> Language </font></b></td>
- <td ><b><font size=+1 color="#ffffff"> Maintainer </font></b></td>
- <td ><b><font size=+1 color="#ffffff"> Contact address </font>
- <font size=-2 color="#ffffff">(replace the at and dot)</font></b></td>
- <td ><b><font size=+1 color="#ffffff"> Status </font></b></td>
- </tr>
- <!-- table content begin -->
-
- <tr bgcolor="#ffffff">
- <td>Afrikaans</td>
- <td>Johan Prinsloo</td>
- <td>johan at zippysnoek dot com</td>
- <td>up-to-date</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>Brazilian Portuguese</td>
- <td>Fabio "FJTC" Jun Takada Chino</td>
- <td>jun-chino at uol dot com dot br</td>
- <td>up-to-date</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>Catalan</td>
- <td>Maximiliano Pin<br>Albert Mora</td>
- <td>mcpin at emtesistemas dot com<br>amora at iua dot upf dot es</td>
- <td>up-to-date</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>Chinese</td>
- <td>Li Daobing<br>Wei Liu</td>
- <td>lidaobing at gmail dot com<br>liuwei at asiainfo dot com</td>
- <td>1.4.1</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>Chinese Traditional</td>
- <td>Daniel YC Lin<br>Gary Lee</td>
- <td>daniel at twpda dot com<br>garylee at ecosine dot com dot tw</td>
- <td>up-to-date</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>Croatian</td>
- <td>Boris Bralo</td>
- <td>boris.bralo at zg dot htnet dot hr</td>
- <td>up-to-date</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>Czech</td>
- <td>Petr P&#x0159;ikryl</td>
- <td>prikrylp at skil dot cz</td>
- <td>up-to-date</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>Danish</td>
- <td>Erik S&oslash;e S&oslash;rensen</td>
- <td>eriksoe+doxygen at daimi dot au dot dk</td>
- <td>1.3.9</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>Dutch</td>
- <td>Dimitri van Heesch</td>
- <td>dimitri at stack dot nl</td>
- <td>up-to-date</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>English</td>
- <td>Dimitri van Heesch</td>
- <td>dimitri at stack dot nl</td>
- <td>up-to-date</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>Finnish</td>
- <td>Olli Korhonen</td>
- <td>olli.korhonen lost at cyberspace</td>
- <td>obsolete</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>French</td>
- <td>Xavier Outhier</td>
- <td>xouthier at yahoo dot fr</td>
- <td>up-to-date</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>German</td>
- <td>Jens Seidel</td>
- <td>jensseidel at users dot sf dot net</td>
- <td>up-to-date</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>Greek</td>
- <td>Harry Kalogirou</td>
- <td>harkal at rainbow dot cs dot unipi dot gr</td>
- <td>1.2.11</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>Hungarian</td>
- <td>&Aacute;kos Kiss<br>F&ouml;ldv&aacute;ri Gy&ouml;rgy</td>
- <td>akiss at users dot sourceforge dot net<br>foldvari lost at cyberspace</td>
- <td>up-to-date</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>Indonesian</td>
- <td>Hendy Irawan</td>
- <td>ceefour at gauldong dot net</td>
- <td>up-to-date</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>Italian</td>
- <td>Alessandro Falappa<br>Ahmed Aldo Faisal</td>
- <td>alessandro at falappa dot net<br>aaf23 at cam dot ac dot uk</td>
- <td>up-to-date</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>Japanese</td>
- <td>Ryunosuke Satoh<br>Kenji Nagamatsu<br>Iwasa Kazmi</td>
- <td>sun594 at hotmail dot com<br>naga at joyful dot club dot ne dot jp<br>iwasa at cosmo-system dot jp</td>
- <td>1.3.9</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>JapaneseEn</td>
- <td>see the Japanese language</td>
- <td>&nbsp;</td>
- <td>English based</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>Korean</td>
- <td>SooYoung Jung<br>Richard Kim</td>
- <td>jung5000 at gmail dot com<br>ryk at dspwiz dot com</td>
- <td>up-to-date</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>KoreanEn</td>
- <td>see the Korean language</td>
- <td>&nbsp;</td>
- <td>English based</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>Lithuanian</td>
- <td>Tomas Simonaitis<br>Mindaugas Radzius<br>Aidas Berukstis</td>
- <td>haden at homelan dot lt<br>mindaugasradzius at takas dot lt<br>aidasber at takas dot lt</td>
- <td>up-to-date</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>Norwegian</td>
- <td>Lars Erik Jordet</td>
- <td>lejordet at gmail dot com</td>
- <td>1.3.9</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>Polish</td>
- <td>Piotr Kaminski<br>Grzegorz Kowal</td>
- <td>Piotr.Kaminski at ctm dot gdynia dot pl<br>g_kowal at poczta dot onet dot pl</td>
- <td>up-to-date</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>Portuguese</td>
- <td>Rui Godinho Lopes</td>
- <td>ruiglopes at yahoo dot com</td>
- <td>1.3.3</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>Romanian</td>
- <td>Alexandru Iosup</td>
- <td>aiosup at yahoo dot com</td>
- <td>1.4.1</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>Russian</td>
- <td>Alexandr Chelpanov</td>
- <td>cav at cryptopro dot ru</td>
- <td>up-to-date</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>Serbian</td>
- <td>Dejan Milosavljevic</td>
- <td>dmilos at email dot com</td>
- <td>1.4.1</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>Slovak</td>
- <td>Stanislav Kudl&aacute;&#x010d;</td>
- <td>skudlac at pobox dot sk</td>
- <td>1.2.18</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>Slovene</td>
- <td>Matja&#x017e; Ostrover&#x0161;nik</td>
- <td>matjaz.ostroversnik at ztm dot si</td>
- <td>1.2.16</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>Spanish</td>
- <td>Francisco Oltra Thennet</td>
- <td>foltra at puc dot cl</td>
- <td>1.3.8</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>Swedish</td>
- <td>Mikael Hallin</td>
- <td>mikaelhallin at yahoo dot se</td>
- <td>up-to-date</td>
- </tr>
- <tr bgcolor="#ffffff">
- <td>Ukrainian</td>
- <td>Olexij Tkatchenko</td>
- <td>olexij.tkatchenko at parcs dot de</td>
- <td>1.4.1</td>
- </tr>
- <!-- table content end -->
- </table>
-</td>
-</tr>
-</table>
-\endhtmlonly
-
-
-\latexonly
-\begin{tabular}{|l|l|l|l|}
- \hline
- {\bf Language} & {\bf Maintainer} & {\bf Contact address} & {\bf Status} \\
- \hline
-
- \hline
- Afrikaans & Johan Prinsloo & {\tt\tiny johan@zippysnoek.com} & up-to-date \\
- \hline
- Brazilian Portuguese & Fabio "FJTC" Jun Takada Chino & {\tt\tiny jun-chino@uol.com.br} & up-to-date \\
- \hline
- Catalan & Maximiliano Pin & {\tt\tiny mcpin@emtesistemas.com} & up-to-date \\
- ~ & Albert Mora & {\tt\tiny amora@iua.upf.es} & ~ \\
- \hline
- Chinese & Li Daobing & {\tt\tiny lidaobing@gmail.com} & 1.4.1 \\
- ~ & Wei Liu & {\tt\tiny liuwei@asiainfo.com} & ~ \\
- \hline
- Chinese Traditional & Daniel YC Lin & {\tt\tiny daniel@twpda.com} & up-to-date \\
- ~ & Gary Lee & {\tt\tiny garylee@ecosine.com.tw} & ~ \\
- \hline
- Croatian & Boris Bralo & {\tt\tiny boris.bralo@zg.htnet.hr} & up-to-date \\
- \hline
- Czech & Petr P\v{r}ikryl & {\tt\tiny prikrylp@skil.cz} & up-to-date \\
- \hline
- Danish & Erik S\o{}e S\o{}rensen & {\tt\tiny eriksoe+doxygen@daimi.au.dk} & 1.3.9 \\
- \hline
- Dutch & Dimitri van Heesch & {\tt\tiny dimitri@stack.nl} & up-to-date \\
- \hline
- English & Dimitri van Heesch & {\tt\tiny dimitri@stack.nl} & up-to-date \\
- \hline
- Finnish & Olli Korhonen & {\tt\tiny olli.korhonen lost@cyberspace} & obsolete \\
- \hline
- French & Xavier Outhier & {\tt\tiny xouthier@yahoo.fr} & up-to-date \\
- \hline
- German & Jens Seidel & {\tt\tiny jensseidel@users.sf.net} & up-to-date \\
- \hline
- Greek & Harry Kalogirou & {\tt\tiny harkal@rainbow.cs.unipi.gr} & 1.2.11 \\
- \hline
- Hungarian & \'{A}kos Kiss & {\tt\tiny akiss@users.sourceforge.net} & up-to-date \\
- ~ & F\"{o}ldv\'{a}ri Gy\"{o}rgy & {\tt\tiny foldvari lost@cyberspace} & ~ \\
- \hline
- Indonesian & Hendy Irawan & {\tt\tiny ceefour@gauldong.net} & up-to-date \\
- \hline
- Italian & Alessandro Falappa & {\tt\tiny alessandro@falappa.net} & up-to-date \\
- ~ & Ahmed Aldo Faisal & {\tt\tiny aaf23@cam.ac.uk} & ~ \\
- \hline
- Japanese & Ryunosuke Satoh & {\tt\tiny sun594@hotmail.com} & 1.3.9 \\
- ~ & Kenji Nagamatsu & {\tt\tiny naga@joyful.club.ne.jp} & ~ \\
- ~ & Iwasa Kazmi & {\tt\tiny iwasa@cosmo-system.jp} & ~ \\
- \hline
- JapaneseEn & see the Japanese language & {\tt\tiny ~} & English based \\
- \hline
- Korean & SooYoung Jung & {\tt\tiny jung5000@gmail.com} & up-to-date \\
- ~ & Richard Kim & {\tt\tiny ryk@dspwiz.com} & ~ \\
- \hline
- KoreanEn & see the Korean language & {\tt\tiny ~} & English based \\
- \hline
- Lithuanian & Tomas Simonaitis & {\tt\tiny haden@homelan.lt} & up-to-date \\
- ~ & Mindaugas Radzius & {\tt\tiny mindaugasradzius@takas.lt} & ~ \\
- ~ & Aidas Berukstis & {\tt\tiny aidasber@takas.lt} & ~ \\
- \hline
- Norwegian & Lars Erik Jordet & {\tt\tiny lejordet@gmail.com} & 1.3.9 \\
- \hline
- Polish & Piotr Kaminski & {\tt\tiny Piotr.Kaminski@ctm.gdynia.pl} & up-to-date \\
- ~ & Grzegorz Kowal & {\tt\tiny g\_kowal@poczta.onet.pl} & ~ \\
- \hline
- Portuguese & Rui Godinho Lopes & {\tt\tiny ruiglopes@yahoo.com} & 1.3.3 \\
- \hline
- Romanian & Alexandru Iosup & {\tt\tiny aiosup@yahoo.com} & 1.4.1 \\
- \hline
- Russian & Alexandr Chelpanov & {\tt\tiny cav@cryptopro.ru} & up-to-date \\
- \hline
- Serbian & Dejan Milosavljevic & {\tt\tiny dmilos@email.com} & 1.4.1 \\
- \hline
- Slovak & Stanislav Kudl\'{a}\v{c} & {\tt\tiny skudlac@pobox.sk} & 1.2.18 \\
- \hline
- Slovene & Matja\v{z} Ostrover\v{s}nik & {\tt\tiny matjaz.ostroversnik@ztm.si} & 1.2.16 \\
- \hline
- Spanish & Francisco Oltra Thennet & {\tt\tiny foltra@puc.cl} & 1.3.8 \\
- \hline
- Swedish & Mikael Hallin & {\tt\tiny mikaelhallin@yahoo.se} & up-to-date \\
- \hline
- Ukrainian & Olexij Tkatchenko & {\tt\tiny olexij.tkatchenko@parcs.de} & 1.4.1 \\
- \hline
-\end{tabular}
-\endlatexonly
-
-
-Most people on the list have indicated that they were also busy
-doing other things, so if you want to help to speed things up please
-let them (or me) know.
-
-If you want to add support for a language that is not yet listed
-please read the next section.
-
-
-<h3>Adding a new language to doxygen</h3>
-
-This short HOWTO explains how to add support for the new language to Doxygen:
-
-Just follow these steps:
-<ol>
-<li>Tell me for which language you want to add support. If no one else
- is already working on support for that language, you will be
- assigned as the maintainer for the language.
-<li>Create a copy of translator_en.h and name it
- translator_\<your_2_letter_country_code\>.h
- I'll use xx in the rest of this document.
-<li>Add definition of the symbol for your language into lang_cfg.h:
-\verbatim
-#define LANG_xx
-\endverbatim
- Use capital letters for your \c xx (to be consistent). The \c lang_cfg.h
- defines which language translators will be compiled into doxygen
- executable. It is a kind of configuration file. If you are sure that
- you do not need some of the languages, you can remove (comment out)
- definitions of symbols for the languages, or you can say \c \#undef
- instead of \c \#define for them.
-<li>Edit language.cpp:
- Add a
-\verbatim
-#ifdef LANG_xx
-#include<translator_xx.h>
-#endif
-\endverbatim
- Remember to use the same symbol LANG_xx that you added to \c lang_cfg.h.
- I.e., the \c xx should be capital letters that identify your language.
- On the other hand, the \c xx inside your \c translator_xx.h should use
- lower case.
- <p>Now, in <code>setTranslator()</code> add
-\verbatim
-#ifdef LANG_xx
- else if (L_EQUAL("your_language_name"))
- {
- theTranslator = new TranslatorYourLanguage;
- }
-#endif
-\endverbatim
- after the <code>if { ... }</code>. I.e., it must be placed after the code
- for creating the English translator at the beginning, and before the
- <code>else { ... }</code> part that creates the translator for the
- default language (English again).
-<li>Edit libdoxygen.pro.in and add \c translator_xx.h to
- the \c HEADERS line.
-<li>Edit <code>translator_xx.h</code>:
- <ul>
- <li>Rename <code>TRANSLATOR_EN_H</code> to <code>TRANSLATOR_XX_H</code>
- twice (i.e. in the \c \#ifndef and \c \#define preprocessor commands at
- the beginning of the file).
- <li>Rename TranslatorEnglish to TranslatorYourLanguage
- <li>In the member <code>idLanguage()</code> change "english" into the
- name of your language (use lower case characters only). Depending
- on the language you may also wish to change the member functions
- latexLanguageSupportCommand(), idLanguageCharset() and others
- (you will recognize them when you start the work).
- <li>Edit all the strings that are returned by the member functions that
- start with tr.
- Try to match punctuation and capitals!
- To enter special characters (with accents) you can:
- <ul>
- <li> Enter them directly if your keyboard supports that and you are
- using a Latin-1 font. Doxygen will translate the
- characters to proper \f$\mbox{\LaTeX}\f$ and leave the
- HTML and man output for what it is (which is fine, if
- idLanguageCharset() is set correctly).
- <li> Use html codes like \&auml; for an a with an umlaut (i.e. &auml;).
- See the HTML specification for the codes.
- </ul>
- </ul>
-<li>Run configure and make again from the root of the distribution,
- in order to regenerated the Makefiles.
-<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.
- Send also your name and e-mail address to be included in the
- \c maintainers.txt list.
-</ol>
-
-
-<h3>Maintaining a language</h3>
-
-New versions of doxygen may use new translated sentences. In such
-situation, the \c Translator class requires implementation of new
-methods -- its interface changes. Of course, the English
-sentences need to be translated to the other languages. At least,
-new methods have to be implemented by the language-related
-translator class; otherwise, doxygen wouldn't even compile. Waiting
-until all language maintainers have translated the new sentences and
-sent the results would not be very practical. The following text
-describes the usage of translator adapters to solve the problem.
-
-<b>The role of Translator Adapters.</b>
-Whenever the \c Translator class interface changes in the new
-release, the new class \c TranslatorAdapter_x_y_z is added to the \c
-translator_adapter.h file (here x, y, and z are numbers that
-correspond to the current official version of doxygen). All
-translators that previously derived from the \c Translator class now
-derive from this adapter class.
-
-The \c TranslatorAdapter_x_y_z class implements the new, required
-methods. If the new method replaces some similar but obsolete
-method(s) (e.g. if the number of arguments changed and/or the
-functionality of the older method was changed or enriched), the \c
-TranslatorAdapter_x_y_z class may use the obsolete method to get the
-result which is as close as possible to the older result in the
-target language. If it is not possible, the result (the default
-translation) is obtained using the English translator, which is (by
-definition) always up-to-date.
-
-<b>For example,</b> when the new \c trFile() method with
-parameters (to determine the capitalization of the first letter and
-the singular/plural form) was introduced to replace the older method
-\c trFiles() without arguments, the following code appeared in one
-of the translator adapter classes:
-
-\verbatim
- /*! This is the default implementation of the obsolete method
- * used in the documentation of a group before the list of
- * links to documented files. This is possibly localized.
- */
- virtual QCString trFiles()
- { return "Files"; }
-
- /*! This is the localized implementation of newer equivalent
- * using the obsolete method trFiles().
- */
- virtual QCString trFile(bool first_capital, bool singular)
- {
- if (first_capital && !singular)
- return trFiles(); // possibly localized, obsolete method
- else
- return english.trFile(first_capital, singular);
- }
-\endverbatim
-
-The \c trFiles() is not present in the \c TranslatorEnglish class,
-because it was removed as obsolete. However, it was used until now
-and its call was replaced by
-
-\verbatim
- trFile(true, false)
-\endverbatim
-
-in the doxygen source files. Probably, many language translators
-implemented the obsolete method, so it perfectly makes sense to use
-the same language dependent result in those cases. The \c
-TranslatorEnglish does not implement the old method. It derives
-from the abstract \c Translator class. On the other hand, the old
-translator for a different language does not implement the new \c
-trFile() method. Because of that it is derived from another base
-class -- \c TranslatorAdapter_x_y_z. The \c TranslatorAdapter_x_y_z
-class have to implement the new, required \c trFile() method.
-However, the translator adapter would not be compiled if the \c
-trFiles() method was not implemented. This is the reason for
-implementing the old method in the translator adapter class (using
-the same code, that was removed from the TranslatorEnglish).
-
-The simplest way would be to pass the arguments to the English
-translator and to return its result. Instead, the adapter uses the
-old \c trFiles() in one special case -- when the new
-<code>trFile(true,&nbsp;false)</code> is called. This is the
-mostly used case at the time of introducing the new method -- see
-above. While this may look too complicated, the technique allows
-the developers of the core sources to change the Translator
-interface, while the users may not even notice the change. Of
-course, when the new \c trFile() is used with different arguments,
-the English result is returned and it will be noticed by non English
-users. Here the maintainer of the language translator should
-implement at least that one particular method.
-
-<b>What says the base class of a language translator?</b>
-If the language translator class inherits from any adapter class the
-maintenance is needed. In such case, the language translator is not
-considered up-to-date. On the other hand, if the language
-translator derives directly from the abstract class \c Translator, the
-language translator is up-to-date.
-
-The translator adapter classes are chained so that the older
-translator adapter class uses the one-step-newer translator adapter
-as the base class. The newer adapter does less \e adapting work
-than the older one. The oldest adapter class derives (indirectly)
-from all of the adapter classes. The name of the adapter class is
-chosen so that its suffix is derived from the previous official
-version of doxygen that did not need the adapter. This way, one can
-say approximately, when the language translator class was last
-updated -- see details below.
-
-The newest translator adapter derives from the abstract \c
-TranslatorAdapterBase class that derives directly from the abstract
-\c Translator class. It adds only the private English-translator
-member for easy implementation of the default translation inside the
-adapter classes, and it also enforces implementation of one method
-for noticing the user that the language translation is not up-to-date
-(because of that some sentences in the generated files may appear in
-English).
-
-Once the oldest adapter class is not used by any of the language
-translators, it can be removed from the doxygen project. The
-maintainers should try to reach the state with the minimal number of
-translator adapter classes.
-
-<b>To simplify the maintenance of the language translator classes</b>
-for the supported languages, the \c translator.py Python
-script was developed (located in \c doxygen/doc directory).
-It extracts the important information about obsolete and
-new methods from the source files for each of the languages.
-The information is stored in the <em>translator report</em> ASCII file
-(translator_report.txt). \htmlonly If you compiled this documentation
-from sources and if you have also doxygen sources available the
-link <a href="../doc/translator_report.txt"
-><code>doxygen/doc/translator_report.txt</code></a> should be valid.\endhtmlonly
-
-Looking at the base class of the language translator, the script
-guesses also the status of the translator -- see the last column of
-the table with languages above. The \c translator.py is called
-automatically when the doxygen documentation is generated. You can
-also run the script manualy whenever you feel that it can help you.
-Of course, you are not forced to use the results of the script. You
-can find the same information by looking at the adapter class and
-its base classes.
-
-<b>How should I update my language translator?</b> Firstly, you
-should be the language maintainer, or you should let him/her know
-about the changes. The following text was written for the language
-maintainers as the primary audience.
-
-There are several approaches to be taken when updating your
-language. If you are not extremely busy, you should always chose
-the most radical one. When the update takes much more time than you
-expected, you can always decide use some suitable translator adapter to
-finish the changes later and still make your translator working.
-
-<b>The most radical way of updating the language translator</b> is
-to make your translator class derive directly
-from the abstract class \c Translator and provide translations for the
-methods that are required to be implemented -- the compiler will
-tell you if you forgot to implement some of them. If you are in
-doubt, have a look at the \c TranslatorEnglish class to recognize the
-purpose of the implemented method. Looking at the previously used
-adapter class may help you sometimes, but it can also be misleading
-because the adapter classes do implement also the obsolete methods
-(see the previous \c trFiles() example).
-
-In other words, the up-to-date language translators do not need the
-\c TranslatorAdapter_x_y_z classes at all, and you do not need to
-implement anything else than the methods required by the Translator
-class (i.e. the pure virtual methods of the \c Translator -- they
-end with <code>=0;</code>).
-
-If everything compiles fine, try to run \c translator.py, and have a
-look at the translator report (ASCII file) at the \c doxygen/doc
-directory. Even if your translator is marked as up-to-date, there
-still may be some remarks related to your souce code. Namely, the
-obsolete methods--that are not used at all--may be listed in the
-section for your language. Simply, remove their code (and run the \c
-translator.py again). Also, you will be informed when you forgot to
-change the base class of your translator class to some newer adapter
-class or directly to the Translator class.
-
-<b>If you do not have time to finish all the updates</b> you should
-still start with <em>the most radical approach</em> as described
-above. You can always change the base class to the translator
-adapter class that implements all of the not-yet-implemented methods.
-
-<b>If you prefer to update your translator gradually</b>, have a look
-at \c TranslatorEnglish (the \c translator_en.h file). Inside, you
-will find the comments like <code>new since 1.2.4</code> that separate
-always a number of methods that were implemented in the stated
-version. Do implement the group of methods that are placed below the
-comment that uses the same version numbers as your translator adapter
-class. (For example, your translator class have to use the \c
-TranslatorAdapter_1_2_4, if it does not implement the methods below
-the comment <code>new since 1.2.4</code>. When you implement them,
-your class should use newer translator adapter.
-
-Run the \c translator.py script occasionaly and give it your \c xx
-identification (from \c translator_xx.h) to create the translator
-report shorter (also produced faster) -- it will contain only the
-information related to your translator. Once you reach the state when
-the base class should be changed to some newer adapter, you will see
-the note in the translator report.
-
-Warning: Don't forget to compile Doxygen to discover, whether it is
-compilable. The \c translator.py does not check if everything is
-correct with respect to the compiler. Because of that, it may lie
-sometimes about the necessary base class.
-
-<b>The most obsolete language translators</b> would lead to
-implementation of too complicated adapters. Because of that, doxygen
-developers may decide to derive such translators from the \c
-TranslatorEnglish class, which is by definition always up-to-date.
-
-When doing so, all the missing methods will be replaced by the
-English translation. This means that not-implemented methods will
-always return the English result. Such translators are marked using
-word \c obsolete. You should read it <b>really obsolete</b>. No
-guess about the last update can be done.
-
-Often, it is possible to construct better result from the obsolete
-methods. Because of that, the translator adapter classes should be
-used if possible. On the other hand, implementation of adapters for
-really obsolete translators brings too much maintenance and
-run-time overhead.
-
-*/
-
diff --git a/doc/language.tpl b/doc/language.tpl
deleted file mode 100644
index d8cc0d3..0000000
--- a/doc/language.tpl
+++ /dev/null
@@ -1,357 +0,0 @@
-
-ATTENTION! This is the template for generating language.doc. If you want to
-change the language.doc, make the changes here and inside maintainers.txt.
-
-/******************************************************************************
- * %(editnote)s
- *
- * Copyright (C) 1997-2004 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.
- *
- * $Id$
- */
-/*! \page langhowto Internationalization
-
-<h3>Support for multiple languages</h3>
-
-Doxygen has built-in support for multiple languages. This means that the
-text fragments, generated by doxygen, can be produced in languages other
-than English (the default). The output language is chosen through the
-configuration file (with default name and known as Doxyfile).
-
-Currently (version %(doxVersion)s), %(numLangStr)s languages
-are supported (sorted alphabetically):
-%(supportedLangReadableStr)s.
-
-The table of information related to the supported languages follows.
-It is sorted by language alphabetically. The <b>Status</b> column
-was generated from sources and shows approximately the last version
-when the translator was updated.
-
-%(informationTable)s
-
-Most people on the list have indicated that they were also busy
-doing other things, so if you want to help to speed things up please
-let them (or me) know.
-
-If you want to add support for a language that is not yet listed
-please read the next section.
-
-
-<h3>Adding a new language to doxygen</h3>
-
-This short HOWTO explains how to add support for the new language to Doxygen:
-
-Just follow these steps:
-<ol>
-<li>Tell me for which language you want to add support. If no one else
- is already working on support for that language, you will be
- assigned as the maintainer for the language.
-<li>Create a copy of translator_en.h and name it
- translator_\<your_2_letter_country_code\>.h
- I'll use xx in the rest of this document.
-<li>Add definition of the symbol for your language into lang_cfg.h:
-\verbatim
-#define LANG_xx
-\endverbatim
- Use capital letters for your \c xx (to be consistent). The \c lang_cfg.h
- defines which language translators will be compiled into doxygen
- executable. It is a kind of configuration file. If you are sure that
- you do not need some of the languages, you can remove (comment out)
- definitions of symbols for the languages, or you can say \c \#undef
- instead of \c \#define for them.
-<li>Edit language.cpp:
- Add a
-\verbatim
-#ifdef LANG_xx
-#include<translator_xx.h>
-#endif
-\endverbatim
- Remember to use the same symbol LANG_xx that you added to \c lang_cfg.h.
- I.e., the \c xx should be capital letters that identify your language.
- On the other hand, the \c xx inside your \c translator_xx.h should use
- lower case.
- <p>Now, in <code>setTranslator()</code> add
-\verbatim
-#ifdef LANG_xx
- else if (L_EQUAL("your_language_name"))
- {
- theTranslator = new TranslatorYourLanguage;
- }
-#endif
-\endverbatim
- after the <code>if { ... }</code>. I.e., it must be placed after the code
- for creating the English translator at the beginning, and before the
- <code>else { ... }</code> part that creates the translator for the
- default language (English again).
-<li>Edit libdoxygen.pro.in and add \c translator_xx.h to
- the \c HEADERS line.
-<li>Edit <code>translator_xx.h</code>:
- <ul>
- <li>Rename <code>TRANSLATOR_EN_H</code> to <code>TRANSLATOR_XX_H</code>
- twice (i.e. in the \c \#ifndef and \c \#define preprocessor commands at
- the beginning of the file).
- <li>Rename TranslatorEnglish to TranslatorYourLanguage
- <li>In the member <code>idLanguage()</code> change "english" into the
- name of your language (use lower case characters only). Depending
- on the language you may also wish to change the member functions
- latexLanguageSupportCommand(), idLanguageCharset() and others
- (you will recognize them when you start the work).
- <li>Edit all the strings that are returned by the member functions that
- start with tr.
- Try to match punctuation and capitals!
- To enter special characters (with accents) you can:
- <ul>
- <li> Enter them directly if your keyboard supports that and you are
- using a Latin-1 font. Doxygen will translate the
- characters to proper \f$\mbox{\LaTeX}\f$ and leave the
- HTML and man output for what it is (which is fine, if
- idLanguageCharset() is set correctly).
- <li> Use html codes like \&auml; for an a with an umlaut (i.e. &auml;).
- See the HTML specification for the codes.
- </ul>
- </ul>
-<li>Run configure and make again from the root of the distribution,
- in order to regenerated the Makefiles.
-<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.
- Send also your name and e-mail address to be included in the
- \c maintainers.txt list.
-</ol>
-
-
-<h3>Maintaining a language</h3>
-
-New versions of doxygen may use new translated sentences. In such
-situation, the \c Translator class requires implementation of new
-methods -- its interface changes. Of course, the English
-sentences need to be translated to the other languages. At least,
-new methods have to be implemented by the language-related
-translator class; otherwise, doxygen wouldn't even compile. Waiting
-until all language maintainers have translated the new sentences and
-sent the results would not be very practical. The following text
-describes the usage of translator adapters to solve the problem.
-
-<b>The role of Translator Adapters.</b>
-Whenever the \c Translator class interface changes in the new
-release, the new class \c TranslatorAdapter_x_y_z is added to the \c
-translator_adapter.h file (here x, y, and z are numbers that
-correspond to the current official version of doxygen). All
-translators that previously derived from the \c Translator class now
-derive from this adapter class.
-
-The \c TranslatorAdapter_x_y_z class implements the new, required
-methods. If the new method replaces some similar but obsolete
-method(s) (e.g. if the number of arguments changed and/or the
-functionality of the older method was changed or enriched), the \c
-TranslatorAdapter_x_y_z class may use the obsolete method to get the
-result which is as close as possible to the older result in the
-target language. If it is not possible, the result (the default
-translation) is obtained using the English translator, which is (by
-definition) always up-to-date.
-
-<b>For example,</b> when the new \c trFile() method with
-parameters (to determine the capitalization of the first letter and
-the singular/plural form) was introduced to replace the older method
-\c trFiles() without arguments, the following code appeared in one
-of the translator adapter classes:
-
-\verbatim
- /*! This is the default implementation of the obsolete method
- * used in the documentation of a group before the list of
- * links to documented files. This is possibly localized.
- */
- virtual QCString trFiles()
- { return "Files"; }
-
- /*! This is the localized implementation of newer equivalent
- * using the obsolete method trFiles().
- */
- virtual QCString trFile(bool first_capital, bool singular)
- {
- if (first_capital && !singular)
- return trFiles(); // possibly localized, obsolete method
- else
- return english.trFile(first_capital, singular);
- }
-\endverbatim
-
-The \c trFiles() is not present in the \c TranslatorEnglish class,
-because it was removed as obsolete. However, it was used until now
-and its call was replaced by
-
-\verbatim
- trFile(true, false)
-\endverbatim
-
-in the doxygen source files. Probably, many language translators
-implemented the obsolete method, so it perfectly makes sense to use
-the same language dependent result in those cases. The \c
-TranslatorEnglish does not implement the old method. It derives
-from the abstract \c Translator class. On the other hand, the old
-translator for a different language does not implement the new \c
-trFile() method. Because of that it is derived from another base
-class -- \c TranslatorAdapter_x_y_z. The \c TranslatorAdapter_x_y_z
-class have to implement the new, required \c trFile() method.
-However, the translator adapter would not be compiled if the \c
-trFiles() method was not implemented. This is the reason for
-implementing the old method in the translator adapter class (using
-the same code, that was removed from the TranslatorEnglish).
-
-The simplest way would be to pass the arguments to the English
-translator and to return its result. Instead, the adapter uses the
-old \c trFiles() in one special case -- when the new
-<code>trFile(true,&nbsp;false)</code> is called. This is the
-mostly used case at the time of introducing the new method -- see
-above. While this may look too complicated, the technique allows
-the developers of the core sources to change the Translator
-interface, while the users may not even notice the change. Of
-course, when the new \c trFile() is used with different arguments,
-the English result is returned and it will be noticed by non English
-users. Here the maintainer of the language translator should
-implement at least that one particular method.
-
-<b>What says the base class of a language translator?</b>
-If the language translator class inherits from any adapter class the
-maintenance is needed. In such case, the language translator is not
-considered up-to-date. On the other hand, if the language
-translator derives directly from the abstract class \c Translator, the
-language translator is up-to-date.
-
-The translator adapter classes are chained so that the older
-translator adapter class uses the one-step-newer translator adapter
-as the base class. The newer adapter does less \e adapting work
-than the older one. The oldest adapter class derives (indirectly)
-from all of the adapter classes. The name of the adapter class is
-chosen so that its suffix is derived from the previous official
-version of doxygen that did not need the adapter. This way, one can
-say approximately, when the language translator class was last
-updated -- see details below.
-
-The newest translator adapter derives from the abstract \c
-TranslatorAdapterBase class that derives directly from the abstract
-\c Translator class. It adds only the private English-translator
-member for easy implementation of the default translation inside the
-adapter classes, and it also enforces implementation of one method
-for noticing the user that the language translation is not up-to-date
-(because of that some sentences in the generated files may appear in
-English).
-
-Once the oldest adapter class is not used by any of the language
-translators, it can be removed from the doxygen project. The
-maintainers should try to reach the state with the minimal number of
-translator adapter classes.
-
-<b>To simplify the maintenance of the language translator classes</b>
-for the supported languages, the \c translator.py Python
-script was developed (located in \c doxygen/doc directory).
-It extracts the important information about obsolete and
-new methods from the source files for each of the languages.
-The information is stored in the <em>translator report</em> ASCII file
-(%(translatorReportFileName)s). \htmlonly If you compiled this documentation
-from sources and if you have also doxygen sources available the
-link %(translatorReportLink)s should be valid.\endhtmlonly
-
-Looking at the base class of the language translator, the script
-guesses also the status of the translator -- see the last column of
-the table with languages above. The \c translator.py is called
-automatically when the doxygen documentation is generated. You can
-also run the script manualy whenever you feel that it can help you.
-Of course, you are not forced to use the results of the script. You
-can find the same information by looking at the adapter class and
-its base classes.
-
-<b>How should I update my language translator?</b> Firstly, you
-should be the language maintainer, or you should let him/her know
-about the changes. The following text was written for the language
-maintainers as the primary audience.
-
-There are several approaches to be taken when updating your
-language. If you are not extremely busy, you should always chose
-the most radical one. When the update takes much more time than you
-expected, you can always decide use some suitable translator adapter to
-finish the changes later and still make your translator working.
-
-<b>The most radical way of updating the language translator</b> is
-to make your translator class derive directly
-from the abstract class \c Translator and provide translations for the
-methods that are required to be implemented -- the compiler will
-tell you if you forgot to implement some of them. If you are in
-doubt, have a look at the \c TranslatorEnglish class to recognize the
-purpose of the implemented method. Looking at the previously used
-adapter class may help you sometimes, but it can also be misleading
-because the adapter classes do implement also the obsolete methods
-(see the previous \c trFiles() example).
-
-In other words, the up-to-date language translators do not need the
-\c TranslatorAdapter_x_y_z classes at all, and you do not need to
-implement anything else than the methods required by the Translator
-class (i.e. the pure virtual methods of the \c Translator -- they
-end with <code>=0;</code>).
-
-If everything compiles fine, try to run \c translator.py, and have a
-look at the translator report (ASCII file) at the \c doxygen/doc
-directory. Even if your translator is marked as up-to-date, there
-still may be some remarks related to your souce code. Namely, the
-obsolete methods--that are not used at all--may be listed in the
-section for your language. Simply, remove their code (and run the \c
-translator.py again). Also, you will be informed when you forgot to
-change the base class of your translator class to some newer adapter
-class or directly to the Translator class.
-
-<b>If you do not have time to finish all the updates</b> you should
-still start with <em>the most radical approach</em> as described
-above. You can always change the base class to the translator
-adapter class that implements all of the not-yet-implemented methods.
-
-<b>If you prefer to update your translator gradually</b>, have a look
-at \c TranslatorEnglish (the \c translator_en.h file). Inside, you
-will find the comments like <code>new since 1.2.4</code> that separate
-always a number of methods that were implemented in the stated
-version. Do implement the group of methods that are placed below the
-comment that uses the same version numbers as your translator adapter
-class. (For example, your translator class have to use the \c
-TranslatorAdapter_1_2_4, if it does not implement the methods below
-the comment <code>new since 1.2.4</code>. When you implement them,
-your class should use newer translator adapter.
-
-Run the \c translator.py script occasionaly and give it your \c xx
-identification (from \c translator_xx.h) to create the translator
-report shorter (also produced faster) -- it will contain only the
-information related to your translator. Once you reach the state when
-the base class should be changed to some newer adapter, you will see
-the note in the translator report.
-
-Warning: Don't forget to compile Doxygen to discover, whether it is
-compilable. The \c translator.py does not check if everything is
-correct with respect to the compiler. Because of that, it may lie
-sometimes about the necessary base class.
-
-<b>The most obsolete language translators</b> would lead to
-implementation of too complicated adapters. Because of that, doxygen
-developers may decide to derive such translators from the \c
-TranslatorEnglish class, which is by definition always up-to-date.
-
-When doing so, all the missing methods will be replaced by the
-English translation. This means that not-implemented methods will
-always return the English result. Such translators are marked using
-word \c obsolete. You should read it <b>really obsolete</b>. No
-guess about the last update can be done.
-
-Often, it is possible to construct better result from the obsolete
-methods. Because of that, the translator adapter classes should be
-used if possible. On the other hand, implementation of adapters for
-really obsolete translators brings too much maintenance and
-run-time overhead.
-
-*/
-
diff --git a/doc/lists.doc b/doc/lists.doc
deleted file mode 100644
index 649d83c..0000000
--- a/doc/lists.doc
+++ /dev/null
@@ -1,119 +0,0 @@
-/*! \page lists Lists
-
-Doxygen provides a number of ways to create lists of items.
-
-<b>Using dashes</b>
-
- By putting a number of column-aligned minus signs at the start of a
- line, a bullet list will automatically be generated.
- Numbered lists can also be generated by using a minus followed by a hash.
- Nesting of lists is allowed and is based on indentation of the items.<p>
- Here is an example:
-\verbatim
- /*!
- * A list of events:
- * - mouse events
- * -# mouse move event
- * -# mouse click event\n
- * More info about the click event.
- * -# mouse double click event
- * - keyboard events
- * -# key down event
- * -# key up event
- *
- * More text here.
- */
-\endverbatim
- The result will be:
-
- A list of events:
- - mouse events
- -# mouse move event
- -# mouse click event\n
- More info about the click event.
- -# mouse double click event
- - keyboard events
- -# key down event
- -# key up event
-
- More text here.
-
-If you use tabs for indentation within lists, please make sure
-that \ref cfg_tab_size "TAB_SIZE" in the configuration file is set to
-the correct tab size.
-
-You can end a list by starting a new paragraph or
-by putting a dot (.) on an empty line at the same indent level as the
-list you would like to end.
-
-Here is an example that speaks for itself:
-
-\verbatim
-/**
- * Text before the list
- * - list item 1
- * - sub item 1
- * - sub sub item 1
- * - sub sub item 2
- * .
- * The dot above ends the sub sub item list.
- * More text for the first sub item
- * .
- * The dot above ends the first sub item.
- * More text for the first list item
- * - sub item 2
- * - sub item 3
- * - list item 2
- * .
- * More text in the same paragraph.
- *
- * More text in a new paragraph.
- */
-\endverbatim
-
-<b>Using HTML commands</b>
-
-If you like you can also use HTML commands inside the documentation
-blocks. Using these commands has the advantage that it is more natural
-for list items that consist of multiple paragraphs.
-
-Here is the above example with HTML commands:
-\verbatim
- /*!
- * A list of events:
- * <ul>
- * <li> mouse events
- * <ol>
- * <li>mouse move event
- * <li>mouse click event\n
- * More info about the click event.
- * <li>mouse double click event
- * </ol>
- * <li> keyboard events
- * <ol>
- * <li>key down event
- * <li>key up event
- * </ol>
- * </ul>
- * More text here.
- */
-\endverbatim
-
-\note In this case the indentation is not important.
-
-<b>Using \\arg or \@li</b>
-
-For compatibility with the Troll Tech's internal documentation tool and
-with KDoc, doxygen has two commands that can be used to create simple
-unnested lists.
-
-See \ref cmdarg "\\arg" and \ref cmdli "\\li" for more info.
-
-\htmlonly
-Go to the <a href="grouping.html">next</a> section or return to the
- <a href="index.html">index</a>.
-\endhtmlonly
-
-*/
-
-
diff --git a/doc/maintainers.txt b/doc/maintainers.txt
deleted file mode 100644
index bbb36f2..0000000
--- a/doc/maintainers.txt
+++ /dev/null
@@ -1,116 +0,0 @@
-% $Id$
-%
-% Comments start with % sign at the beginning.
-% XML entities like &auml; are used for special characters.
-% There is one record for each language. The records are separated
-% by the empty line and they do not contain empty lines.
-% First line of the record identifies the translator class for the language.
-% The following one or more lines contain information about
-% the maintainer(s) for the language (one line, one maintainer)
-% in the form: <readable name><colon><e-mail>
-
-TranslatorAfrikaans
-Johan Prinsloo: johan@zippysnoek.com
-
-TranslatorBrazilian
-Fabio "FJTC" Jun Takada Chino: jun-chino@uol.com.br
-
-TranslatorCatalan
-Maximiliano Pin: mcpin@emtesistemas.com
-Albert Mora: amora@iua.upf.es
-
-TranslatorChinese
-Li Daobing: lidaobing@gmail.com
-Wei Liu: liuwei@asiainfo.com
-
-TranslatorChinesetraditional
-Daniel YC Lin: daniel@twpda.com
-Gary Lee: garylee@ecosine.com.tw
-
-TranslatorCroatian
-Boris Bralo: boris.bralo@zg.htnet.hr
-
-TranslatorCzech
-Petr P&rcaron;ikryl: prikrylp@skil.cz
-
-TranslatorDanish
-Erik S&oslash;e S&oslash;rensen: eriksoe+doxygen@daimi.au.dk
-
-TranslatorDutch
-Dimitri van Heesch: dimitri@stack.nl
-
-TranslatorEnglish
-Dimitri van Heesch: dimitri@stack.nl
-
-TranslatorFinnish
-Olli Korhonen: olli.korhonen lost@cyberspace
-
-TranslatorFrench
-Xavier Outhier: xouthier@yahoo.fr
-
-TranslatorGerman
-Jens Seidel: jensseidel@users.sf.net
-
-TranslatorGreek
-Harry Kalogirou: harkal@rainbow.cs.unipi.gr
-
-TranslatorHungarian
-&Aacute;kos Kiss: akiss@users.sourceforge.net
-F&ouml;ldv&aacute;ri Gy&ouml;rgy: foldvari lost@cyberspace
-
-TranslatorIndonesian
-Hendy Irawan: ceefour@gauldong.net
-
-TranslatorItalian
-Alessandro Falappa: alessandro@falappa.net
-Ahmed Aldo Faisal: aaf23@cam.ac.uk
-
-TranslatorJapanese
-Ryunosuke Satoh: sun594@hotmail.com
-Kenji Nagamatsu: naga@joyful.club.ne.jp
-Iwasa Kazmi: iwasa@cosmo-system.jp
-
-TranslatorKorean
-SooYoung Jung: jung5000@gmail.com
-Richard Kim: ryk@dspwiz.com
-
-TranslatorLithuanian
-Tomas Simonaitis: haden@homelan.lt
-Mindaugas Radzius: mindaugasradzius@takas.lt
-Aidas Berukstis: aidasber@takas.lt
-
-TranslatorNorwegian
-Lars Erik Jordet: lejordet@gmail.com
-
-TranslatorPolish
-Piotr Kaminski: Piotr.Kaminski@ctm.gdynia.pl
-Grzegorz Kowal: g_kowal@poczta.onet.pl
-
-TranslatorPortuguese
-Rui Godinho Lopes: ruiglopes@yahoo.com
-
-TranslatorRomanian
-Alexandru Iosup: aiosup@yahoo.com
-
-TranslatorRussian
-Alexandr Chelpanov: cav@cryptopro.ru
-
-TranslatorSerbian
-Dejan Milosavljevic: dmilos@email.com
-
-TranslatorSlovak
-Stanislav Kudl&aacute;&ccaron;: skudlac@pobox.sk
-
-TranslatorSlovene
-Matja&zcaron; Ostrover&scaron;nik: matjaz.ostroversnik@ztm.si
-
-TranslatorSpanish
-Francisco Oltra Thennet: foltra@puc.cl
-
-TranslatorSwedish
-Mikael Hallin: mikaelhallin@yahoo.se
-
-TranslatorUkrainian
-Olexij Tkatchenko: olexij.tkatchenko@parcs.de
-
-
diff --git a/doc/output.doc b/doc/output.doc
deleted file mode 100644
index 73e6916..0000000
--- a/doc/output.doc
+++ /dev/null
@@ -1,56 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-/*! \page output.html Output Formats
-
-\section output Output Formats
-
-\addindex output formats
-
-The following output formats are \e directly supported by doxygen:
-<dl>
-<dt><b>HTML</b>
-<dd>Generated if \c GENERATE_HTML is set to \c YES in the configuration file.
-<dt>\f$\mbox{\LaTeX}\f$
-<dd>Generated if \c GENERATE_LATEX is set to \c YES in the configuration file.
-<dt><b>Man pages</b>
-<dd>Generated if \c GENERATE_MAN is set to \c YES in the configuration file.
-<dt><b>RTF</b>
-<dd>Generated if \c GENERATE_RTF is set to \c YES in the configuration file.<p>
- Note that the RTF output probably only looks nice with Microsoft's
- Word 97. If you have success with other programs, please let me know.
-<dt><b>XML</b>
-<dd>Generated if \c GENERATE_XML is set to \c YES in the configuration file.<p>
- Note that the XML output is still under development.
-</dl>
-
-The following output formats are \e indirectly supported by doxygen:
-<dl>
-<dt><b>Compressed HTML</b> (a.k.a. Windows 98 help)
-<dd>Generated by Microsoft's HTML Help workshop from the HTML output if
- \c GENERATE_HTMLHELP is set to \c YES.
-<dt><b>PostScript</b>
-<dd>Generated from the \f$\mbox{\LaTeX}\f$ output by
- running <code>make ps</code> in the output directory.
- For the best results \c PDF_HYPERLINKS should be set to \c NO.
-<dt><b>PDF</b>\htmlonly &nbsp;&nbsp;&nbsp;\endhtmlonly
-<dd>Generated from the \f$\mbox{\LaTeX}\f$ output by
- running <code>make pdf</code> in the output directory.
- In order to get hyperlinks in the PDF file,
- \c PDF_HYPERLINKS should be set to \c YES in the configuration file.
-</dl>
-
-*/
diff --git a/doc/perlmod.doc b/doc/perlmod.doc
deleted file mode 100644
index becbdf2..0000000
--- a/doc/perlmod.doc
+++ /dev/null
@@ -1,190 +0,0 @@
-/*! \page perlmod Perl Module output format documentation
-
-\addindex perlmod
-
-<p>Since version 1.2.18, Doxygen can generate a new output format we
-have called the &quot;Perl Module output format&quot;. It has been
-designed as an intermediate format that can be used to generate new
-and customized output without having to modify the Doxygen source.
-Therefore, its purpose is similar to the XML output format that can be
-also generated by Doxygen. The XML output format is more standard,
-but the Perl Module output format is possibly simpler and easier to
-use.
-
-<p>The Perl Module output format is still experimental at the moment
-and could be changed in incompatible ways in future versions, although
-this should not be very probable. It is also lacking some features of
-other Doxygen backends. However, it can be already used to generate
-useful output, as shown by the Perl Module-based LaTeX generator.
-
-<p>Please report any bugs or problems you find in the Perl Module
-backend or the Perl Module-based LaTeX generator to the
-doxygen-develop mailing list. Suggestions are welcome as well.
-
-\section using_perlmod_fmt Using the Perl Module output format.
-
-<p>When the <b>GENERATE_PERLMOD</b> tag is enabled in the Doxyfile,
-running Doxygen generates a number of files in the <b>perlmod/</b>
-subdirectory of your output directory. These files are the following:
-
-<ul>
-
-<li><b>DoxyDocs.pm</b>. This is the Perl module that actually
-contains the documentation, in the Perl Module format described
-\ref doxydocs_format "below".
-
-<li><b>DoxyModel.pm</b>. This Perl module describes the structure of
-<b>DoxyDocs.pm</b>, independently of the actual documentation. See
-\ref doxymodel_format "below" for details.
-
-<li><b>doxyrules.make</b>. This file contains the make rules to build
-and clean the files that are generated from the Doxyfile. Also
-contains the paths to those files and other relevant information. This
-file is intended to be included by your own Makefile.
-
-<li><b>Makefile</b>. This is a simple Makefile including
-<b>doxyrules.make</b>.
-
-</ul>
-
-<p>To make use of the documentation stored in DoxyDocs.pm you can use
-one of the default Perl Module-based generators provided by Doxygen
-(at the moment this includes the Perl Module-based LaTeX generator,
-see \ref perlmod_latex "below") or write your own customized
-generator. This should not be too hard if you have some knowledge of
-Perl and it's the main purpose of including the Perl Module backend in
-Doxygen. See \ref doxydocs_format "below" for details on how
-to do this.
-
-\section perlmod_latex Using the Perl Module-based LaTeX generator.
-
-<p>The Perl Module-based LaTeX generator is pretty experimental and
-incomplete at the moment, but you could find it useful nevertheless.
-It can generate documentation for functions, typedefs and variables
-within files and classes and can be customized quite a lot by
-redefining TeX macros. However, there is still no documentation on
-how to do this.
-
-<p>Setting the <b>PERLMOD_LATEX</b> tag to <b>YES</b> in the Doxyfile
-enables the creation of some additional files in the <b>perlmod/</b>
-subdirectory of your output directory. These files contain the Perl
-scripts and LaTeX code necessary to generate PDF and DVI output from
-the Perl Module output, using PDFLaTeX and LaTeX respectively. Rules
-to automate the use of these files are also added to
-<b>doxyrules.make</b> and the <b>Makefile</b>.
-
-<p>The additional generated files are the following:
-
-<ul>
-
-<li><b>doxylatex.pl</b>. This Perl script uses DoxyDocs.pm and
-DoxyModel.pm to generate <b>doxydocs.tex</b>, a TeX file containing
-the documentation in a format that can be accessed by LaTeX code. This
-file is not directly LaTeXable.
-
-<li><b>doxyformat.tex</b>. This file contains the LaTeX code that
-transforms the documentation from doxydocs.tex into LaTeX text
-suitable to be LaTeX'ed and presented to the user.
-
-<li><b>doxylatex-template.pl</b>. This Perl script uses DoxyModel.pm
-to generate <b>doxytemplate.tex</b>, a TeX file defining default
-values for some macros. doxytemplate.tex is included by
-doxyformat.tex to avoid the need of explicitly defining some macros.
-
-<li><b>doxylatex.tex</b>. This is a very simple LaTeX document that
-loads some packages and includes doxyformat.tex and doxydocs.tex. This
-document is LaTeX'ed to produce the PDF and DVI documentation by the
-rules added to <b>doxyrules.make</b>.
-
-</ul>
-
-\subsection pm_pdf_gen Simple creation of PDF and DVI output using the Perl Module-based LaTeX generator.
-
-<p>To try this you need to have installed LaTeX, PDFLaTeX and the
-packages used by <b>doxylatex.tex</b>.
-
-<ol>
-
-<li>Update your Doxyfile to the latest version using:
-
-<pre>doxygen -u Doxyfile</pre>
-
-<li>Set both <b>GENERATE_PERLMOD</b> and <b>PERLMOD_LATEX</b> tags to
-YES in your Doxyfile.
-
-<li>Run Doxygen on your Doxyfile:
-
-<pre>doxygen Doxyfile</pre>
-
-<li>A <b>perlmod/</b> subdirectory should have appeared in your output
-directory. Enter the <b>perlmod/</b> subdirectory and run:
-
-<pre>make pdf</pre>
-
-<p>This should generate a <b>doxylatex.pdf</b> with the documentation
-in PDF format.
-
-<li>Run:
-
-<pre>make dvi</pre>
-
-<p>This should generate a <b>doxylatex.dvi</b> with the documentation
-in DVI format.
-
-</ol>
-
-\section doxydocs_format Perl Module documentation format.
-
-<p>The Perl Module documentation generated by Doxygen is stored in
-<b>DoxyDocs.pm</b>. This is a very simple Perl module that contains
-only two statements: an assigment to the variable <b>$doxydocs</b> and
-the customary <b>1;</b> statement which usually ends Perl modules.
-The documentation is stored in the variable <b>$doxydocs</b>, which
-can then be accessed by a Perl script using <b>DoxyDocs.pm</b>.
-
-<p><b>$doxydocs</b> contains a tree-like structure composed of three
-types of nodes: strings, hashes and lists.
-
-<ul>
-
-<li><b>Strings</b>. These are normal Perl strings. They can be of
-any length can contain any character. Their semantics depends on
-their location within the tree. This type of node has no children.
-
-<li><b>Hashes</b>. These are references to anonymous Perl hashes. A
-hash can have multiple fields, each with a different key. The value
-of a hash field can be a string, a hash or a list, and its semantics
-depends on the key of the hash field and the location of the hash
-within the tree. The values of the hash fields are the children of
-the node.
-
-<li><b>Lists</b>. These are references to anonymous Perl lists. A
-list has an undefined number of elements, which are the children of
-the node. Each element has the same type (string, hash or list) and
-the same semantics, depending on the location of the list within the
-tree.
-
-</ul>
-
-<p>As you can see, the documentation contained in <b>$doxydocs</b>
-does not present any special impediment to be processed by a simple
-Perl script. To be able to generate meaningful output using the
-documentation contained in <b>$doxydocs</b> you'll probably need to
-know the semantics of the nodes of the documentation tree, which we
-present in \ref perlmod_tree "this page".
-
-\section doxymodel_format Data structure describing the Perl Module documentation tree.
-
-<p>You might be interested in processing the documentation contained
-in <b>DoxyDocs.pm</b> without needing to take into account the
-semantics of each node of the documentation tree. For this purpose,
-Doxygen generates a <b>DoxyModel.pm</b> file which contains a data
-structure describing the type and children of each node in the
-documentation tree.
-
-<p>The rest of this section is to be written yet, but in the meantime
-you can look at the Perl scripts generated by Doxygen (such as
-<b>doxylatex.pl</b> or <b>doxytemplate-latex.pl</b>) to get an idea on
-how to use <b>DoxyModel.pm</b>.
-
-*/
diff --git a/doc/perlmod_tree.doc b/doc/perlmod_tree.doc
deleted file mode 100644
index 0d412ba..0000000
--- a/doc/perlmod_tree.doc
+++ /dev/null
@@ -1,377 +0,0 @@
-/*! \page perlmod_tree Nodes in the documentation tree of the Perl Module output format
-
-<h2>Nodes in the documentation tree of the Perl Module output
-format.</h2>
-
-This is a description of the structure of the documentation tree in
-<b>DoxyDocs.pm</b>. Each item in the list below describes a node in
-the tree, and the format of the description is as follows:
-
-<ul>
-<li>[ key =&gt; ] <b>Name</b> <i>(type)</i>. Explanation of the content.
-</ul>
-
-Where
-
-<ul>
-
-<li>The "key =&gt;" part only appears if the parent node is a hash.
-"key" is the key for this node.
-
-<li><b>"Name"</b> is a unique name for the node, defined in
-DoxyModel.pm.
-
-<li><i>"(type)"</i> is the type of the node: "string" for string
-nodes, "hash" for hash nodes, "list" for list nodes, and "doc" for
-documentation subtrees. The structure of documentation subtrees is
-not described anywhere yet, but you can look for example at
-<b>doxylatex.pl</b> to see how to process it.
-
-</ul>
-
-The meaning of each node in the documentation tree is as follows:
-<ul>
-<li> <b>Root</b> <i>(hash)</i>. Root node.
-<ul>
-<li>classes =&gt; <b>Classes</b> <i>(list)</i>. Documented classes.
-<ul>
-<li> <b>Class</b> <i>(hash)</i>. A documented class.
-<ul>
-<li>protected_members =&gt; <b>ClassProtectedMembers</b> <i>(hash)</i>. Information about the protected members in the class.
-<ul>
-<li>members =&gt; <b>ClassProtectedMemberList</b> <i>(list)</i>. protected member list.
-<ul>
-<li> <b>ClassProtectedMember</b> <i>(hash)</i>. A protected member.
-<ul>
-<li>protection =&gt; <b>ClassProtectedMemberProtection</b> <i>(string)</i>. Protection of the protected member.
-<li>detailed =&gt; <b>ClassProtectedMemberDetailed</b> <i>(hash)</i>. Detailed information about the protected member.
-<ul>
-<li>doc =&gt; <b>ClassProtectedMemberDetailedDoc</b> <i>(doc)</i>. Detailed documentation for the protected member.
-<li>see =&gt; <b>ClassProtectedMemberSee</b> <i>(doc)</i>. "See also" documentation for the protected member.
-</ul>
-<li>kind =&gt; <b>ClassProtectedMemberKind</b> <i>(string)</i>. Kind of protected member (usually "variable").
-<li>name =&gt; <b>ClassProtectedMemberName</b> <i>(string)</i>. Name of the protected member.
-<li>type =&gt; <b>ClassProtectedMemberType</b> <i>(string)</i>. Data type of the protected member.
-</ul>
-</ul>
-</ul>
-<li>detailed =&gt; <b>ClassDetailed</b> <i>(hash)</i>. Detailed information about the class.
-<ul>
-<li>doc =&gt; <b>ClassDetailedDoc</b> <i>(doc)</i>. Detailed documentation block for the class.
-</ul>
-<li>protected_typedefs =&gt; <b>ClassProtectedTypedefs</b> <i>(hash)</i>. Information about the protected typedefs in the class.
-<ul>
-<li>members =&gt; <b>ClassProtectedTypedefList</b> <i>(list)</i>. protected typedef list.
-<ul>
-<li> <b>ClassProtectedTypedef</b> <i>(hash)</i>. A protected typedef.
-<ul>
-<li>protection =&gt; <b>ClassProtectedTypedefProtection</b> <i>(string)</i>. Protection of the protected typedef.
-<li>detailed =&gt; <b>ClassProtectedTypedefDetailed</b> <i>(hash)</i>. Detailed information about the protected typedef.
-<ul>
-<li>doc =&gt; <b>ClassProtectedTypedefDetailedDoc</b> <i>(doc)</i>. Detailed documentation for the protected typedef.
-<li>see =&gt; <b>ClassProtectedTypedefSee</b> <i>(doc)</i>. "See also" documentation for the protected typedef.
-</ul>
-<li>kind =&gt; <b>ClassProtectedTypedefKind</b> <i>(string)</i>. Kind of protected typedef (usually "typedef").
-<li>name =&gt; <b>ClassProtectedTypedefName</b> <i>(string)</i>. Name of the protected typedef.
-<li>type =&gt; <b>ClassProtectedTypedefType</b> <i>(string)</i>. Data type of the protected typedef.
-</ul>
-</ul>
-</ul>
-<li>name =&gt; <b>ClassName</b> <i>(string)</i>. Name of the class.
-<li>private_members =&gt; <b>ClassPrivateMembers</b> <i>(hash)</i>. Information about the private members in the class.
-<ul>
-<li>members =&gt; <b>ClassPrivateMemberList</b> <i>(list)</i>. private member list.
-<ul>
-<li> <b>ClassPrivateMember</b> <i>(hash)</i>. A private member.
-<ul>
-<li>protection =&gt; <b>ClassPrivateMemberProtection</b> <i>(string)</i>. Protection of the private member.
-<li>detailed =&gt; <b>ClassPrivateMemberDetailed</b> <i>(hash)</i>. Detailed information about the private member.
-<ul>
-<li>doc =&gt; <b>ClassPrivateMemberDetailedDoc</b> <i>(doc)</i>. Detailed documentation for the private member.
-<li>see =&gt; <b>ClassPrivateMemberSee</b> <i>(doc)</i>. "See also" documentation for the private member.
-</ul>
-<li>kind =&gt; <b>ClassPrivateMemberKind</b> <i>(string)</i>. Kind of private member (usually "variable").
-<li>name =&gt; <b>ClassPrivateMemberName</b> <i>(string)</i>. Name of the private member.
-<li>type =&gt; <b>ClassPrivateMemberType</b> <i>(string)</i>. Data type of the private member.
-</ul>
-</ul>
-</ul>
-<li>private_typedefs =&gt; <b>ClassPrivateTypedefs</b> <i>(hash)</i>. Information about the private typedefs in the class.
-<ul>
-<li>members =&gt; <b>ClassPrivateTypedefList</b> <i>(list)</i>. private typedef list.
-<ul>
-<li> <b>ClassPrivateTypedef</b> <i>(hash)</i>. A private typedef.
-<ul>
-<li>protection =&gt; <b>ClassPrivateTypedefProtection</b> <i>(string)</i>. Protection of the private typedef.
-<li>detailed =&gt; <b>ClassPrivateTypedefDetailed</b> <i>(hash)</i>. Detailed information about the private typedef.
-<ul>
-<li>doc =&gt; <b>ClassPrivateTypedefDetailedDoc</b> <i>(doc)</i>. Detailed documentation for the private typedef.
-<li>see =&gt; <b>ClassPrivateTypedefSee</b> <i>(doc)</i>. "See also" documentation for the private typedef.
-</ul>
-<li>kind =&gt; <b>ClassPrivateTypedefKind</b> <i>(string)</i>. Kind of private typedef (usually "typedef").
-<li>name =&gt; <b>ClassPrivateTypedefName</b> <i>(string)</i>. Name of the private typedef.
-<li>type =&gt; <b>ClassPrivateTypedefType</b> <i>(string)</i>. Data type of the private typedef.
-</ul>
-</ul>
-</ul>
-<li>protected_methods =&gt; <b>ClassProtectedMethods</b> <i>(hash)</i>. Information about the protected methods in the class.
-<ul>
-<li>members =&gt; <b>ClassProtectedMethodList</b> <i>(list)</i>. protected method list.
-<ul>
-<li> <b>ClassProtectedMethod</b> <i>(hash)</i>. A protected method.
-<ul>
-<li>parameters =&gt; <b>ClassProtectedMethodParams</b> <i>(list)</i>. List of the parameters of the protected method.
-<ul>
-<li> <b>ClassProtectedMethodParam</b> <i>(hash)</i>. A parameter of the protected method.
-<ul>
-<li>declaration_name =&gt; <b>ClassProtectedMethodParamName</b> <i>(string)</i>. The name of the parameter.
-<li>type =&gt; <b>ClassProtectedMethodParamType</b> <i>(string)</i>. The data type of the parameter.
-</ul>
-</ul>
-<li>protection =&gt; <b>ClassProtectedMethodProtection</b> <i>(string)</i>. Protection of the protected method.
-<li>virtualness =&gt; <b>ClassProtectedMethodVirtualness</b> <i>(string)</i>. Virtualness of the protected method.
-<li>detailed =&gt; <b>ClassProtectedMethodDetailed</b> <i>(hash)</i>. Detailed information about the protected method.
-<ul>
-<li>params =&gt; <b>ClassProtectedMethodPDBlocks</b> <i>(list)</i>. List of parameter documentation blocks for the protected method.
-<ul>
-<li> <b>ClassProtectedMethodPDBlock</b> <i>(hash)</i>. A parameter documentation block for the protected method.
-<ul>
-<li>parameters =&gt; <b>ClassProtectedMethodPDParams</b> <i>(list)</i>. Parameter list for this parameter documentation block.
-<ul>
-<li> <b>ClassProtectedMethodPDParam</b> <i>(hash)</i>. A parameter documented by this documentation block.
-<ul>
-<li>name =&gt; <b>ClassProtectedMethodPDParamName</b> <i>(string)</i>. Name of the parameter.
-</ul>
-</ul>
-<li>doc =&gt; <b>ClassProtectedMethodPDDoc</b> <i>(doc)</i>. Documentation for this parameter documentation block.
-</ul>
-</ul>
-<li>doc =&gt; <b>ClassProtectedMethodDetailedDoc</b> <i>(doc)</i>. Detailed documentation for the protected method.
-<li>see =&gt; <b>ClassProtectedMethodSee</b> <i>(doc)</i>. "See also" documentation for the protected method.
-<li>return =&gt; <b>ClassProtectedMethodReturn</b> <i>(doc)</i>. Documentation about the return value of the protected method.
-</ul>
-<li>kind =&gt; <b>ClassProtectedMethodKind</b> <i>(string)</i>. Kind of protected method (usually "function").
-<li>name =&gt; <b>ClassProtectedMethodName</b> <i>(string)</i>. Name of the protected method.
-<li>type =&gt; <b>ClassProtectedMethodType</b> <i>(string)</i>. Data type returned by the protected method.
-<li>static =&gt; <b>ClassProtectedMethodStatic</b> <i>(string)</i>. Whether the protected method is static.
-</ul>
-</ul>
-</ul>
-<li>public_typedefs =&gt; <b>ClassPublicTypedefs</b> <i>(hash)</i>. Information about the public typedefs in the class.
-<ul>
-<li>members =&gt; <b>ClassPublicTypedefList</b> <i>(list)</i>. public typedef list.
-<ul>
-<li> <b>ClassPublicTypedef</b> <i>(hash)</i>. A public typedef.
-<ul>
-<li>protection =&gt; <b>ClassPublicTypedefProtection</b> <i>(string)</i>. Protection of the public typedef.
-<li>detailed =&gt; <b>ClassPublicTypedefDetailed</b> <i>(hash)</i>. Detailed information about the public typedef.
-<ul>
-<li>doc =&gt; <b>ClassPublicTypedefDetailedDoc</b> <i>(doc)</i>. Detailed documentation for the public typedef.
-<li>see =&gt; <b>ClassPublicTypedefSee</b> <i>(doc)</i>. "See also" documentation for the public typedef.
-</ul>
-<li>kind =&gt; <b>ClassPublicTypedefKind</b> <i>(string)</i>. Kind of public typedef (usually "typedef").
-<li>name =&gt; <b>ClassPublicTypedefName</b> <i>(string)</i>. Name of the public typedef.
-<li>type =&gt; <b>ClassPublicTypedefType</b> <i>(string)</i>. Data type of the public typedef.
-</ul>
-</ul>
-</ul>
-<li>public_members =&gt; <b>ClassPublicMembers</b> <i>(hash)</i>. Information about the public members in the class.
-<ul>
-<li>members =&gt; <b>ClassPublicMemberList</b> <i>(list)</i>. public member list.
-<ul>
-<li> <b>ClassPublicMember</b> <i>(hash)</i>. A public member.
-<ul>
-<li>protection =&gt; <b>ClassPublicMemberProtection</b> <i>(string)</i>. Protection of the public member.
-<li>detailed =&gt; <b>ClassPublicMemberDetailed</b> <i>(hash)</i>. Detailed information about the public member.
-<ul>
-<li>doc =&gt; <b>ClassPublicMemberDetailedDoc</b> <i>(doc)</i>. Detailed documentation for the public member.
-<li>see =&gt; <b>ClassPublicMemberSee</b> <i>(doc)</i>. "See also" documentation for the public member.
-</ul>
-<li>kind =&gt; <b>ClassPublicMemberKind</b> <i>(string)</i>. Kind of public member (usually "variable").
-<li>name =&gt; <b>ClassPublicMemberName</b> <i>(string)</i>. Name of the public member.
-<li>type =&gt; <b>ClassPublicMemberType</b> <i>(string)</i>. Data type of the public member.
-</ul>
-</ul>
-</ul>
-<li>private_methods =&gt; <b>ClassPrivateMethods</b> <i>(hash)</i>. Information about the private methods in the class.
-<ul>
-<li>members =&gt; <b>ClassPrivateMethodList</b> <i>(list)</i>. private method list.
-<ul>
-<li> <b>ClassPrivateMethod</b> <i>(hash)</i>. A private method.
-<ul>
-<li>parameters =&gt; <b>ClassPrivateMethodParams</b> <i>(list)</i>. List of the parameters of the private method.
-<ul>
-<li> <b>ClassPrivateMethodParam</b> <i>(hash)</i>. A parameter of the private method.
-<ul>
-<li>declaration_name =&gt; <b>ClassPrivateMethodParamName</b> <i>(string)</i>. The name of the parameter.
-<li>type =&gt; <b>ClassPrivateMethodParamType</b> <i>(string)</i>. The data type of the parameter.
-</ul>
-</ul>
-<li>protection =&gt; <b>ClassPrivateMethodProtection</b> <i>(string)</i>. Protection of the private method.
-<li>virtualness =&gt; <b>ClassPrivateMethodVirtualness</b> <i>(string)</i>. Virtualness of the private method.
-<li>detailed =&gt; <b>ClassPrivateMethodDetailed</b> <i>(hash)</i>. Detailed information about the private method.
-<ul>
-<li>params =&gt; <b>ClassPrivateMethodPDBlocks</b> <i>(list)</i>. List of parameter documentation blocks for the private method.
-<ul>
-<li> <b>ClassPrivateMethodPDBlock</b> <i>(hash)</i>. A parameter documentation block for the private method.
-<ul>
-<li>parameters =&gt; <b>ClassPrivateMethodPDParams</b> <i>(list)</i>. Parameter list for this parameter documentation block.
-<ul>
-<li> <b>ClassPrivateMethodPDParam</b> <i>(hash)</i>. A parameter documented by this documentation block.
-<ul>
-<li>name =&gt; <b>ClassPrivateMethodPDParamName</b> <i>(string)</i>. Name of the parameter.
-</ul>
-</ul>
-<li>doc =&gt; <b>ClassPrivateMethodPDDoc</b> <i>(doc)</i>. Documentation for this parameter documentation block.
-</ul>
-</ul>
-<li>doc =&gt; <b>ClassPrivateMethodDetailedDoc</b> <i>(doc)</i>. Detailed documentation for the private method.
-<li>see =&gt; <b>ClassPrivateMethodSee</b> <i>(doc)</i>. "See also" documentation for the private method.
-<li>return =&gt; <b>ClassPrivateMethodReturn</b> <i>(doc)</i>. Documentation about the return value of the private method.
-</ul>
-<li>kind =&gt; <b>ClassPrivateMethodKind</b> <i>(string)</i>. Kind of private method (usually "function").
-<li>name =&gt; <b>ClassPrivateMethodName</b> <i>(string)</i>. Name of the private method.
-<li>type =&gt; <b>ClassPrivateMethodType</b> <i>(string)</i>. Data type returned by the private method.
-<li>static =&gt; <b>ClassPrivateMethodStatic</b> <i>(string)</i>. Whether the private method is static.
-</ul>
-</ul>
-</ul>
-<li>public_methods =&gt; <b>ClassPublicMethods</b> <i>(hash)</i>. Information about the public methods in the class.
-<ul>
-<li>members =&gt; <b>ClassPublicMethodList</b> <i>(list)</i>. public method list.
-<ul>
-<li> <b>ClassPublicMethod</b> <i>(hash)</i>. A public method.
-<ul>
-<li>parameters =&gt; <b>ClassPublicMethodParams</b> <i>(list)</i>. List of the parameters of the public method.
-<ul>
-<li> <b>ClassPublicMethodParam</b> <i>(hash)</i>. A parameter of the public method.
-<ul>
-<li>declaration_name =&gt; <b>ClassPublicMethodParamName</b> <i>(string)</i>. The name of the parameter.
-<li>type =&gt; <b>ClassPublicMethodParamType</b> <i>(string)</i>. The data type of the parameter.
-</ul>
-</ul>
-<li>protection =&gt; <b>ClassPublicMethodProtection</b> <i>(string)</i>. Protection of the public method.
-<li>virtualness =&gt; <b>ClassPublicMethodVirtualness</b> <i>(string)</i>. Virtualness of the public method.
-<li>detailed =&gt; <b>ClassPublicMethodDetailed</b> <i>(hash)</i>. Detailed information about the public method.
-<ul>
-<li>params =&gt; <b>ClassPublicMethodPDBlocks</b> <i>(list)</i>. List of parameter documentation blocks for the public method.
-<ul>
-<li> <b>ClassPublicMethodPDBlock</b> <i>(hash)</i>. A parameter documentation block for the public method.
-<ul>
-<li>parameters =&gt; <b>ClassPublicMethodPDParams</b> <i>(list)</i>. Parameter list for this parameter documentation block.
-<ul>
-<li> <b>ClassPublicMethodPDParam</b> <i>(hash)</i>. A parameter documented by this documentation block.
-<ul>
-<li>name =&gt; <b>ClassPublicMethodPDParamName</b> <i>(string)</i>. Name of the parameter.
-</ul>
-</ul>
-<li>doc =&gt; <b>ClassPublicMethodPDDoc</b> <i>(doc)</i>. Documentation for this parameter documentation block.
-</ul>
-</ul>
-<li>doc =&gt; <b>ClassPublicMethodDetailedDoc</b> <i>(doc)</i>. Detailed documentation for the public method.
-<li>see =&gt; <b>ClassPublicMethodSee</b> <i>(doc)</i>. "See also" documentation for the public method.
-<li>return =&gt; <b>ClassPublicMethodReturn</b> <i>(doc)</i>. Documentation about the return value of the public method.
-</ul>
-<li>kind =&gt; <b>ClassPublicMethodKind</b> <i>(string)</i>. Kind of public method (usually "function").
-<li>name =&gt; <b>ClassPublicMethodName</b> <i>(string)</i>. Name of the public method.
-<li>type =&gt; <b>ClassPublicMethodType</b> <i>(string)</i>. Data type returned by the public method.
-<li>static =&gt; <b>ClassPublicMethodStatic</b> <i>(string)</i>. Whether the public method is static.
-</ul>
-</ul>
-</ul>
-</ul>
-</ul>
-<li>files =&gt; <b>Files</b> <i>(list)</i>. Documented files.
-<ul>
-<li> <b>File</b> <i>(hash)</i>. A documented file.
-<ul>
-<li>detailed =&gt; <b>FileDetailed</b> <i>(hash)</i>. Detailed information about the file.
-<ul>
-<li>doc =&gt; <b>FileDetailedDoc</b> <i>(doc)</i>. Detailed documentation block for the file.
-</ul>
-<li>functions =&gt; <b>FileFunctions</b> <i>(hash)</i>. Information about the functions in the file.
-<ul>
-<li>members =&gt; <b>FileFunctionList</b> <i>(list)</i>. function list.
-<ul>
-<li> <b>FileFunction</b> <i>(hash)</i>. A function.
-<ul>
-<li>parameters =&gt; <b>FileFunctionParams</b> <i>(list)</i>. List of the parameters of the function.
-<ul>
-<li> <b>FileFunctionParam</b> <i>(hash)</i>. A parameter of the function.
-<ul>
-<li>declaration_name =&gt; <b>FileFunctionParamName</b> <i>(string)</i>. The name of the parameter.
-<li>type =&gt; <b>FileFunctionParamType</b> <i>(string)</i>. The data type of the parameter.
-</ul>
-</ul>
-<li>protection =&gt; <b>FileFunctionProtection</b> <i>(string)</i>. Protection of the function.
-<li>virtualness =&gt; <b>FileFunctionVirtualness</b> <i>(string)</i>. Virtualness of the function.
-<li>detailed =&gt; <b>FileFunctionDetailed</b> <i>(hash)</i>. Detailed information about the function.
-<ul>
-<li>params =&gt; <b>FileFunctionPDBlocks</b> <i>(list)</i>. List of parameter documentation blocks for the function.
-<ul>
-<li> <b>FileFunctionPDBlock</b> <i>(hash)</i>. A parameter documentation block for the function.
-<ul>
-<li>parameters =&gt; <b>FileFunctionPDParams</b> <i>(list)</i>. Parameter list for this parameter documentation block.
-<ul>
-<li> <b>FileFunctionPDParam</b> <i>(hash)</i>. A parameter documented by this documentation block.
-<ul>
-<li>name =&gt; <b>FileFunctionPDParamName</b> <i>(string)</i>. Name of the parameter.
-</ul>
-</ul>
-<li>doc =&gt; <b>FileFunctionPDDoc</b> <i>(doc)</i>. Documentation for this parameter documentation block.
-</ul>
-</ul>
-<li>doc =&gt; <b>FileFunctionDetailedDoc</b> <i>(doc)</i>. Detailed documentation for the function.
-<li>see =&gt; <b>FileFunctionSee</b> <i>(doc)</i>. "See also" documentation for the function.
-<li>return =&gt; <b>FileFunctionReturn</b> <i>(doc)</i>. Documentation about the return value of the function.
-</ul>
-<li>kind =&gt; <b>FileFunctionKind</b> <i>(string)</i>. Kind of function (usually "function").
-<li>name =&gt; <b>FileFunctionName</b> <i>(string)</i>. Name of the function.
-<li>type =&gt; <b>FileFunctionType</b> <i>(string)</i>. Data type returned by the function.
-<li>static =&gt; <b>FileFunctionStatic</b> <i>(string)</i>. Whether the function is static.
-</ul>
-</ul>
-</ul>
-<li>name =&gt; <b>FileName</b> <i>(string)</i>. Name of the file.
-<li>variables =&gt; <b>FileVariables</b> <i>(hash)</i>. Information about the variables in the file.
-<ul>
-<li>members =&gt; <b>FileVariableList</b> <i>(list)</i>. variable list.
-<ul>
-<li> <b>FileVariable</b> <i>(hash)</i>. A variable.
-<ul>
-<li>protection =&gt; <b>FileVariableProtection</b> <i>(string)</i>. Protection of the variable.
-<li>detailed =&gt; <b>FileVariableDetailed</b> <i>(hash)</i>. Detailed information about the variable.
-<ul>
-<li>doc =&gt; <b>FileVariableDetailedDoc</b> <i>(doc)</i>. Detailed documentation for the variable.
-<li>see =&gt; <b>FileVariableSee</b> <i>(doc)</i>. "See also" documentation for the variable.
-</ul>
-<li>kind =&gt; <b>FileVariableKind</b> <i>(string)</i>. Kind of variable (usually "variable").
-<li>name =&gt; <b>FileVariableName</b> <i>(string)</i>. Name of the variable.
-<li>type =&gt; <b>FileVariableType</b> <i>(string)</i>. Data type of the variable.
-</ul>
-</ul>
-</ul>
-<li>typedefs =&gt; <b>FileTypedefs</b> <i>(hash)</i>. Information about the typedefs in the file.
-<ul>
-<li>members =&gt; <b>FileTypedefList</b> <i>(list)</i>. typedef list.
-<ul>
-<li> <b>FileTypedef</b> <i>(hash)</i>. A typedef.
-<ul>
-<li>protection =&gt; <b>FileTypedefProtection</b> <i>(string)</i>. Protection of the typedef.
-<li>detailed =&gt; <b>FileTypedefDetailed</b> <i>(hash)</i>. Detailed information about the typedef.
-<ul>
-<li>doc =&gt; <b>FileTypedefDetailedDoc</b> <i>(doc)</i>. Detailed documentation for the typedef.
-<li>see =&gt; <b>FileTypedefSee</b> <i>(doc)</i>. "See also" documentation for the typedef.
-</ul>
-<li>kind =&gt; <b>FileTypedefKind</b> <i>(string)</i>. Kind of typedef (usually "typedef").
-<li>name =&gt; <b>FileTypedefName</b> <i>(string)</i>. Name of the typedef.
-<li>type =&gt; <b>FileTypedefType</b> <i>(string)</i>. Data type of the typedef.
-</ul>
-</ul>
-</ul>
-</ul>
-</ul>
-</ul>
-</ul>
-
-*/
diff --git a/doc/preprocessing.doc b/doc/preprocessing.doc
deleted file mode 100644
index 08b2a33..0000000
--- a/doc/preprocessing.doc
+++ /dev/null
@@ -1,263 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-/*! \page preprocessing Preprocessing
-
-Source files that are used as input to doxygen can be parsed by doxygen's
-built-in C-preprocessor.
-
-By default doxygen does only partial preprocessing. That is, it
-evaluates conditional compilation statements (like \#if) and
-evaluates macro definitions, but it does not perform macro expansion.
-
-So if you have the following code fragment
-\verbatim
-#define VERSION 200
-#define CONST_STRING const char *
-
-#if VERSION >= 200
- static CONST_STRING version = "2.xx";
-#else
- static CONST_STRING version = "1.xx";
-#endif
-\endverbatim
-
-Then by default doxygen will feed the following to its parser:
-
-\verbatim
-#define VERSION
-#define CONST_STRING
-
- static CONST_STRING version = "2.xx";
-\endverbatim
-
-You can disable all preprocessing by setting
-\ref cfg_enable_preprocessing "ENABLE_PREPROCESSING" to \c
-NO in the configuation file. In the case above doxygen will then read
-both statements, i.e:
-
-\verbatim
- static CONST_STRING version = "2.xx";
- static CONST_STRING version = "1.xx";
-\endverbatim
-
-In case you want to expand the \c CONST_STRING macro, you should set the
-\ref cfg_macro_expansion "MACRO_EXPANSION" tag in the config file
-to \c YES. Then the result after preprocessing becomes:
-
-\verbatim
-#define VERSION
-#define CONST_STRING
-
- static const char * version = "1.xx";
-\endverbatim
-
-Note that doxygen will now expand \e all macro definitions
-(recursively if needed). This is often too much. Therefore, doxygen also
-allows you to expand only those defines that you explicitly
-specify. For this you have to set the
-\ref cfg_expand_only_predef "EXPAND_ONLY_PREDEF" tag to \c YES
-and specify the macro definitions after
-the \ref cfg_predefined "PREDEFINED" or
-\ref cfg_expand_as_defined "EXPAND_AS_DEFINED" tag.
-
-A typically example where some help from the preprocessor is needed is
-when dealing with Microsoft's __declspec language extension. Here is an
-example function.
-
-\verbatim
-extern "C" void __declspec(dllexport) ErrorMsg( String aMessage,...);
-\endverbatim
-
-When nothing is done, doxygen will be confused and see __declspec as
-some sort of function. To help doxygen one typically uses the following
-preprocessor settings:
-
-\verbatim
-ENABLE_PREPROCESSING = YES
-MACRO_EXPANSION = YES
-EXPAND_ONLY_PREDEF = YES
-PREDEFINED = __declspec(x)=
-\endverbatim
-
-This will make sure the __declspec(dllexport) is removed before doxygen
-parses the source code.
-
-For a more complex example, suppose you have the following obfuscated
-code fragment of an abstract base class called \c IUnknown:
-
-\verbatim
-/*! A reference to an IID */
-#ifdef __cplusplus
-#define REFIID const IID &
-#else
-#define REFIID const IID *
-#endif
-
-
-/*! The IUnknown interface */
-DECLARE_INTERFACE(IUnknown)
-{
- STDMETHOD(HRESULT,QueryInterface) (THIS_ REFIID iid, void **ppv) PURE;
- STDMETHOD(ULONG,AddRef) (THIS) PURE;
- STDMETHOD(ULONG,Release) (THIS) PURE;
-};
-\endverbatim
-
-without macro expansion doxygen will get confused, but we may not want to
-expand the REFIID macro, because it is documented and the user that reads
-the documentation should use it when implementing the interface.
-
-By setting the following in the config file:
-
-\verbatim
-ENABLE_PREPROCESSING = YES
-MACRO_EXPANSION = YES
-EXPAND_ONLY_PREDEF = YES
-PREDEFINED = "DECLARE_INTERFACE(name)=class name" \
- "STDMETHOD(result,name)=virtual result name" \
- "PURE= = 0" \
- THIS_= \
- THIS= \
- __cplusplus
-\endverbatim
-
-we can make sure that the proper result is fed to doxygen's parser:
-\verbatim
-/*! A reference to an IID */
-#define REFIID
-
-/*! The IUnknown interface */
-class IUnknown
-{
- virtual HRESULT QueryInterface ( REFIID iid, void **ppv) = 0;
- virtual ULONG AddRef () = 0;
- virtual ULONG Release () = 0;
-};
-\endverbatim
-
-Note that the \ref cfg_predefined "PREDEFINED" tag accepts function
-like macro definitions
-(like \c DECLARE_INTERFACE ), normal macro
-substitutions (like \c PURE and \c THIS) and plain
-defines (like \c __cplusplus).
-
-Note also that preprocessor definitions that are normally defined
-automatically by the preprocessor (like \c __cplusplus), have to be defined
-by hand with doxygen's parser (this is done because these defines
-are often platform/compiler specific).
-
-In some cases you may want to substitute a macro name or function by
-something else without exposing the result to further macro substitution.
-You can do this but using the <code>:=</code> operator instead of
-<code>=</code>
-
-As an example suppose we have the following piece of code:
-\verbatim
-#define QList QListT
-class QListT
-{
-};
-\endverbatim
-
-Then the only way to get doxygen interpret this as a class definition
-for class QList is to define:
-\verbatim
-PREDEFINED = QListT:=QList
-\endverbatim
-
-Here is an example provided by Valter Minute and Reyes Ponce that helps
-doxygen to wade through the boilerplate code in Microsoft's ATL \& MFC
-libraries:
-
-\verbatim
-PREDEFINED = "DECLARE_INTERFACE(name)=class name" \
- "STDMETHOD(result,name)=virtual result name" \
- "PURE= = 0" \
- THIS_= \
- THIS= \
- DECLARE_REGISTRY_RESOURCEID=// \
- DECLARE_PROTECT_FINAL_CONSTRUCT=// \
- "DECLARE_AGGREGATABLE(Class)= " \
- "DECLARE_REGISTRY_RESOURCEID(Id)= " \
- DECLARE_MESSAGE_MAP = \
- BEGIN_MESSAGE_MAP=/* \
- END_MESSAGE_MAP=*/// \
- BEGIN_COM_MAP=/* \
- END_COM_MAP=*/// \
- BEGIN_PROP_MAP=/* \
- END_PROP_MAP=*/// \
- BEGIN_MSG_MAP=/* \
- END_MSG_MAP=*/// \
- BEGIN_PROPERTY_MAP=/* \
- END_PROPERTY_MAP=*/// \
- BEGIN_OBJECT_MAP=/* \
- END_OBJECT_MAP()=*/// \
- DECLARE_VIEW_STATUS=// \
- "STDMETHOD(a)=HRESULT a" \
- "ATL_NO_VTABLE= " \
- "__declspec(a)= " \
- BEGIN_CONNECTION_POINT_MAP=/* \
- END_CONNECTION_POINT_MAP=*/// \
- "DECLARE_DYNAMIC(class)= " \
- "IMPLEMENT_DYNAMIC(class1, class2)= " \
- "DECLARE_DYNCREATE(class)= " \
- "IMPLEMENT_DYNCREATE(class1, class2)= " \
- "IMPLEMENT_SERIAL(class1, class2, class3)= " \
- "DECLARE_MESSAGE_MAP()= " \
- TRY=try \
- "CATCH_ALL(e)= catch(...)" \
- END_CATCH_ALL= \
- "THROW_LAST()= throw"\
- "RUNTIME_CLASS(class)=class" \
- "MAKEINTRESOURCE(nId)=nId" \
- "IMPLEMENT_REGISTER(v, w, x, y, z)= " \
- "ASSERT(x)=assert(x)" \
- "ASSERT_VALID(x)=assert(x)" \
- "TRACE0(x)=printf(x)" \
- "OS_ERR(A,B)={ #A, B }" \
- __cplusplus \
- "DECLARE_OLECREATE(class)= " \
- "BEGIN_DISPATCH_MAP(class1, class2)= " \
- "BEGIN_INTERFACE_MAP(class1, class2)= " \
- "INTERFACE_PART(class, id, name)= " \
- "END_INTERFACE_MAP()=" \
- "DISP_FUNCTION(class, name, function, result, id)=" \
- "END_DISPATCH_MAP()=" \
- "IMPLEMENT_OLECREATE2(class, name, id1, id2, id3, id4,\
- id5, id6, id7, id8, id9, id10, id11)="
-\endverbatim
-
-As you can see doxygen's preprocessor is quite powerful, but if you want
-even more flexibility you can always write an input filter and specify it
-after the \ref cfg_input_filter "INPUT_FILTER" tag.
-
-If you are unsure what the effect of doxygen's preprocessing will be
-you can run doxygen as follows:
-\verbatim
- doxygen -d Preprocessor
-\endverbatim
-This will instruct doxygen to dump the input sources to standard output after
-preprocessing has been done (Hint: set <code>QUIET = YES</code> and
-<code>WARNINGS = NO</code> in the configuration file to disable any other
-output).
-
-\htmlonly
-Go to the <a href="external.html">next</a> section or return to the
- <a href="index.html">index</a>.
-\endhtmlonly
-
-*/
diff --git a/doc/starting.doc b/doc/starting.doc
deleted file mode 100644
index d0af1ec..0000000
--- a/doc/starting.doc
+++ /dev/null
@@ -1,287 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-/*! \page starting Getting started
-
-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.
-
-The executable \c doxytag is only needed if you want to generate references
-to external documentation (i.e. documentation that was generated by doxygen)
-for which you do not have the sources. See section \ref doxytag_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
-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.
-
-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.gif "Doxygen information flow"
-\image latex infoflow.eps "Doxygen information flow" width=14cm
-
-\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
-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
-from the command line with the \c -g option:
-\verbatim
-doxygen -g <config-file>
-\endverbatim
-
-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
-\<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
-input (<code>stdin</code>), which can be useful for scripting.
-
-The configuration file has a format that is similar to that of a (simple)
-Makefile. It contains 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.
-
-If you do not wish to edit the config 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
-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 <code>*.cpp *.h</code>). Only files that match one of the
-patterns will be parsed (if the patterns are omitted a list of
-source extensions is used).
-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/*
-\endverbatim
-
-Doxygen looking at the file's extension to determine how to parse a file.
-If a file has an <code>.idl</code> or <code>.odl</code> extension it is
-treated as an IDL file. If it has a <code>.java</code> extension it is
-treated as a file written in Java. Files ending with <code>.cs</code> are
-treated as C# files and the <code>.py</code> extension selects the
-Python parser. Finally, files with the extensions <code>.php</code>, <code>.php4</code>,
-<code>.inc</code> or <code>.phtml</code> are treated as PHP sources.
-Any other extension is parsed as if it is a C/C++ file, where files that
-end with <code>.m</code> are treated as Objective-C source files.
-
-\anchor extract_all
-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
-set to \c YES.
-
-To analyse 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.
-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
-code reviews for instance).
-
-\section step2 Step 2: Running doxygen
-
-To generate the documentation you can now enter:
-\verbatim
-doxygen <config-file>
-\endverbatim
-
-Depending on your settings doxygen will create \c html, \c rtf,
-\c latex, \c xml and/or \c man directories inside the output directory.
-As the names suggest these directories contain the
-generated documentation in HTML, RTF, \f$\mbox{\LaTeX}\f$, XML and
-Unix-Man page 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
-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",
-and \ref cfg_man_output "MAN_OUTPUT"
-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).
-
-\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, Safari, Konqueror, and sometimes IE6 to test the
-generated output).
-
-Some of the features the HTML section (such as
-\ref cfg_generate_treeview "GENERATE_TREEVIEW") require a browser that
-supports DHTML and Javascript.
-
-If you plan to use the search engine (see
-\ref cfg_searchengine "SEARCHENGINE"), you should view the HTML output
-via a PHP enable web server (e.g. apache with the PHP module installed).
-
-\subsection latex_out LaTeX output
-\addindex LaTeX
-The generated \f$\mbox{\LaTeX}\f$ documentation must first be compiled by
-a \f$\mbox{\LaTeX}\f$ compiler (I use a recent teTeX distribution).
-To simplify the process of compiling the generated
-documentation, \c doxygen writes a \c Makefile into the \c latex directory.
-By typing \c make in the \c latex directory the dvi file \c refman.dvi
-will be generated (provided that you have a make tool called
-<code>make</code> of course). This file can then be viewed using \c xdvi or
-converted into a PostScript file \c refman.ps by
-typing <code>make ps</code> (this requires <code>dvips</code>).
-
-To put 2 pages on one physical page use <code>make ps_2on1</code> instead.
-The resulting PostScript file can be send to a PostScript
-printer. If you do not have a PostScript printer, you can try to use
-ghostscript to convert PostScript into something your printer understands.
-
-Conversion to PDF is also possible if you have installed the ghostscript
-interpreter; just type <code>make pdf</code> (or <code>make pdf_2on1</code>).
-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.
-
-\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 field. 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.
-
-A file called combine.xslt
-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
-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
-(see addon/doxmlparser/include/doxmlintf.h for the interface of the library)
-
-\subsection man_out Man page output
-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
-(like class diagrams, cross references and formulas) will be lost.
-
-\section step3 Step 3: Documenting the sources
-
-Although documenting the source 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
-describing the API and maybe the internals 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 members, files, classes and namespaces. So
-how do you document these? For members, classes and namespaces there are
-basically two options:
-<ol>
-<li>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 documention directly after the
- member. See section \ref specialblock to learn more about special
- documentation blocks.
-<li>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.
-</ol>
-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, variable, typedefs, defines) do not need an explicit
-structural command; just putting a special documentation block in front or
-behind them will do.
-
-The text inside a special documentation block is parsed
-before it is written to the HTML and/or \f$\mbox{\LaTeX}\f$ output files.
-
-\addindex parsing
-During parsing the following steps take place:
-<ul>
-<li> The special commands inside the documentation are executed. See
- section \ref commands for an overview of all commands.
-<li> If a line starts with some whitespace followed by one or more asterisks
- (<tt>*</tt>) and then optionally more whitespace,
- then all whitespace and asterisks are removed.
-<li> All resulting blank lines are treated as a paragraph separators.
- This saves you from placing new-paragraph commands yourself
- in order to make the generated documentation readable.
-<li> 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).
-<li> 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.
-<li> HTML tags that are in the documentation are interpreted and converted
- to \f$\mbox{\LaTeX}\f$ equivalents for the \f$\mbox{\LaTeX}\f$ output.
- See section \ref htmlcmds for an overview of all supported HTML tags.
-</ul>
-
-\htmlonly
-Go to the <a href="docblocks.html">next</a> section or return to the
- <a href="index.html">index</a>.
-\endhtmlonly
-
-*/
-
diff --git a/doc/translator.py b/doc/translator.py
deleted file mode 100644
index f7219f7..0000000
--- a/doc/translator.py
+++ /dev/null
@@ -1,1898 +0,0 @@
-"""Script to generate reports on translator classes from Doxygen sources.
-
- The main purpose of the script is to extract the information from sources
- related to internationalization (the translator classes). It uses the
- information to generate documentation (language.doc,
- translator_report.txt) from templates (language.tpl, maintainers.txt).
-
- Simply run the script without parameters to get the reports and
- documentation for all supported languages. If you want to generate the
- translator report only for some languages, pass their codes as arguments
- to the script. In that case, the language.doc will not be generated.
- Example:
-
- python translator.py en nl cz
-
- Originally, the script was written in Perl and was known as translator.pl.
- The last Perl version was dated 2002/05/21 (plus some later corrections)
-
- $Id$
-
- Petr Prikryl (prikrylp@skil.cz)
-
- History:
- --------
- 2002/05/21 - This was the last Perl version.
- 2003/05/16 - List of language marks can be passed as arguments.
- 2004/01/24 - Total reimplementation started: classes TrManager, and Transl.
- 2004/02/05 - First version that produces translator report. No language.doc yet.
- 2004/02/10 - First fully functional version that generates both the translator
- report and the documentation. It is a bit slower than the
- Perl version, but is much less tricky and much more flexible.
- It also solves some problems that were not solved by the Perl
- version. The translator report content should be more useful
- for developers.
- 2004/02/11 - Some tuning-up to provide more useful information.
- 2004/04/16 - Added new tokens to the tokenizer (to remove some warnings).
- 2004/05/25 - Added from __future__ import generators not to force Python 2.3.
- 2004/06/03 - Removed dependency on textwrap module.
- 2004/07/07 - Fixed the bug in the fill() function.
- 2004/07/21 - Better e-mail mangling for HTML part of language.doc.
- - Plural not used for reporting a single missing method.
- - Removal of not used translator adapters is suggested only
- when the report is not restricted to selected languages
- explicitly via script arguments.
- 2004/07/26 - Better reporting of not-needed adapters.
- 2004/10/04 - Reporting of not called translator methods added.
- 2004/10/05 - Modified to check only doxygen/src sources for the previous report.
- 2005/02/28 - Slight modification to generate "mailto.txt" auxiliary file.
- """
-
-from __future__ import generators
-import os, re, sys
-
-
-def fill(s):
- """Returns string formated to the wrapped paragraph multiline string.
-
- Replaces whitespaces by one space and then uses he textwrap.fill()."""
-
- # Replace all whitespace by spaces, remove whitespaces that are not
- # necessary, strip the left and right whitespaces, and break the string
- # to list of words.
- rexWS = re.compile(r'\s+')
- lst = rexWS.sub(' ', s).strip().split()
-
- # If the list is not empty, put the words together and form the lines
- # of maximum 70 characters. Build the list of lines.
- lines = []
- if lst:
- line = lst.pop(0) # no separation space in front of the first word
- for word in lst:
- if len(line) + len(word) < 70:
- line += ' ' + word
- else:
- lines.append(line) # another full line formed
- line = word # next line started
- lines.append(line) # the last line
- return '\n'.join(lines)
-
-
-# The following function dedent() is the verbatim copy from the textwrap.py
-# module. The textwrap.py was introduced in Python 2.3. To make this script
-# working also in older Python versions, I have decided to copy it.
-# Notice that the textwrap.py is copyrighted:
-#
-# Copyright (C) 1999-2001 Gregory P. Ward.
-# Copyright (C) 2002, 2003 Python Software Foundation.
-# Written by Greg Ward <gward@python.net>
-#
-# The explicit permission to use the code here was sent by Guido van Rossum
-# (4th June, 2004).
-#
-def dedent(text):
- """dedent(text : string) -> string
-
- Remove any whitespace than can be uniformly removed from the left
- of every line in `text`.
-
- This can be used e.g. to make triple-quoted strings line up with
- the left edge of screen/whatever, while still presenting it in the
- source code in indented form.
-
- For example:
-
- def test():
- # end first line with \ to avoid the empty line!
- s = '''\
- hello
- world
- '''
- print repr(s) # prints ' hello\n world\n '
- print repr(dedent(s)) # prints 'hello\n world\n'
- """
- lines = text.expandtabs().split('\n')
- margin = None
- for line in lines:
- content = line.lstrip()
- if not content:
- continue
- indent = len(line) - len(content)
- if margin is None:
- margin = indent
- else:
- margin = min(margin, indent)
-
- if margin is not None and margin > 0:
- for i in range(len(lines)):
- lines[i] = lines[i][margin:]
-
- return '\n'.join(lines)
-
-
-class Transl:
- """One instance is build for each translator.
-
- The abbreviation of the source file--part after 'translator_'--is used as
- the identification of the object. The empty string is used for the
- abstract Translator class from translator.h. The other information is
- extracted from inside the source file."""
-
- def __init__(self, fname, manager):
- """Bind to the manager and initialize."""
-
- # Store the filename and the reference to the manager object.
- self.fname = fname
- self.manager = manager
-
- # The instance is responsible for loading the source file, so it checks
- # for its existence and quits if something goes wrong.
- if not os.path.isfile(fname):
- sys.stderr.write("\a\nFile '%s' not found!\n" % fname)
- sys.exit(1)
-
- # Initialize the other collected information.
- self.classId = None
- self.baseClassId = None
- self.readableStatus = None # 'up-to-date', '1.2.3', '1.3', etc.
- self.status = None # '', '1.2.03', '1.3.00', etc.
- self.lang = None # like 'Brasilian'
- self.langReadable = None # like 'Brasilian Portuguese'
- self.note = None # like 'should be cleaned up'
- self.prototypeDic = {} # uniPrototype -> prototype
- self.obsoleteMethods = None # list of prototypes to be removed
- self.missingMethods = None # list of prototypes to be implemented
- self.implementedMethods = None # list of implemented required methods
- self.adaptMinClass = None # The newest adapter class that can be used
-
- def __tokenGenerator(self):
- """Generator that reads the file and yields tokens as 4-tuples.
-
- The tokens have the form (tokenId, tokenString, lineNo). The
- last returned token has the form ('eof', None, None). When trying
- to access next token afer that, the exception would be raised."""
-
- # Set the dictionary for recognizing tokenId for keywords, separators
- # and the similar categories. The key is the string to be recognized,
- # the value says its token identification.
- tokenDic = { 'class': 'class',
- 'const': 'const',
- 'public': 'public',
- 'protected': 'protected',
- 'private': 'private',
- 'static': 'static',
- 'virtual': 'virtual',
- ':': 'colon',
- ';': 'semic',
- ',': 'comma',
- '[': 'lsqbra',
- ']': 'rsqbra',
- '(': 'lpar',
- ')': 'rpar',
- '{': 'lcurly',
- '}': 'rcurly',
- '=': 'assign',
- '*': 'star',
- '&': 'amp',
- '+': 'plus',
- '-': 'minus',
- '!': 'excl',
- '?': 'qmark',
- '<': 'lt',
- '>': 'gt',
- "'": 'quot',
- '"': 'dquot',
- '.': 'dot',
- '%': 'perc',
- '~': 'tilde',
- '^': 'caret',
- }
-
- # Regular expression for recognizing identifiers.
- rexId = re.compile(r'^[a-zA-Z]\w*$')
-
- # Open the file for reading and extracting tokens until the eof.
- # Initialize the finite automaton.
- f = file(self.fname)
- lineNo = 0
- line = '' # init -- see the pos initialization below
- linelen = 0 # init
- pos = 100 # init -- pos after the end of line
- status = 0
-
- tokenId = None # init
- tokenStr = '' # init -- the characters will be appended.
- tokenLineNo = 0
-
- while status != 777:
-
- # Get the next character. Read next line first, if necessary.
- if pos < linelen:
- c = line[pos]
- else:
- lineNo += 1
- line = f.readline()
- linelen = len(line)
- pos = 0
- if line == '': # eof
- status = 777
- else:
- c = line[pos]
-
- # Consume the character based on the status
-
- if status == 0: # basic status
-
- # This is the initial status. If tokenId is set, yield the
- # token here and only here (except when eof is found).
- # Initialize the token variables after the yield.
- if tokenId:
- # If it is an unknown item, it can still be recognized
- # here. Keywords and separators are the example.
- if tokenId == 'unknown':
- if tokenDic.has_key(tokenStr):
- tokenId = tokenDic[tokenStr]
- elif tokenStr.isdigit():
- tokenId = 'num'
- elif rexId.match(tokenStr):
- tokenId = 'id'
- else:
- msg = '\aWarning: unknown token "' + tokenStr + '"'
- msg += '\tfound on line %d' % tokenLineNo
- msg += ' in "' + self.fname + '".\n'
- sys.stderr.write(msg)
-
- yield (tokenId, tokenStr, tokenLineNo)
- tokenId = None
- tokenStr = ''
- tokenLineNo = 0
-
- # Now process the character. When we just skip it (spaces),
- # stay in this status. All characters that will be part of
- # some token cause moving to the specific status. And only
- # when moving to the status == 0 (or the final state 777),
- # the token is yielded. With respect to that the automaton
- # behaves as Moore's one (output bound to status). When
- # collecting tokens, the automaton is the Mealy's one
- # (actions bound to transitions).
- if c.isspace():
- pass # just skip whitespace characters
- elif c == '/': # Possibly comment starts here, but
- tokenId = 'unknown' # it could be only a slash in code.
- tokenStr = c
- tokenLineNo = lineNo
- status = 1
- elif c == '#':
- tokenId = 'preproc' # preprocessor directive
- tokenStr = c
- tokenLineNo = lineNo
- status = 5
- elif c == '"': # string starts here
- tokenId = 'string'
- tokenStr = c
- tokenLineNo = lineNo
- status = 6
- elif c == "'": # char literal starts here
- tokenId = 'charlit'
- tokenStr = c
- tokenLineNo = lineNo
- status = 8
- elif tokenDic.has_key(c): # known one-char token
- tokenId = tokenDic[c]
- tokenStr = c
- tokenLineNo = lineNo
- # stay in this state to yield token immediately
- else:
- tokenId = 'unknown' # totally unknown
- tokenStr = c
- tokenLineNo = lineNo
- status = 333
-
- pos += 1 # move position in any case
-
- elif status == 1: # possibly a comment
- if c == '/': # ... definitely the C++ comment
- tokenId = 'comment'
- tokenStr += c
- pos += 1
- status = 2
- elif c == '*': # ... definitely the C comment
- tokenId = 'comment'
- tokenStr += c
- pos += 1
- status = 3
- else:
- status = 0 # unrecognized, don't move pos
-
- elif status == 2: # inside the C++ comment
- if c == '\n': # the end of C++ comment
- status = 0 # yield the token
- else:
- tokenStr += c # collect the C++ comment
- pos += 1
-
- elif status == 3: # inside the C comment
- if c == '*': # possibly the end of the C comment
- tokenStr += c
- status = 4
- else:
- tokenStr += c # collect the C comment
- pos += 1
-
- elif status == 4: # possibly the end of the C comment
- if c == '/': # definitely the end of the C comment
- tokenStr += c
- status = 0 # yield the token
- elif c == '*': # more stars inside the comment
- tokenStr += c
- else:
- tokenStr += c # this cannot be the end of comment
- status = 3
- pos += 1
-
- elif status == 5: # inside the preprocessor directive
- if c == '\n': # the end of the preproc. command
- status = 0 # yield the token
- else:
- tokenStr += c # collect the preproc
- pos += 1
-
- elif status == 6: # inside the string
- if c == '\\': # escaped char inside the string
- tokenStr += c
- status = 7
- elif c == '"': # end of the string
- tokenStr += c
- status = 0
- else:
- tokenStr += c # collect the chars of the string
- pos += 1
-
- elif status == 7: # escaped char inside the string
- tokenStr += c # collect the char of the string
- status = 6
- pos += 1
-
- elif status == 8: # inside the char literal
- tokenStr += c # collect the char of the literal
- status = 9
- pos += 1
-
- elif status == 9: # end of char literal expected
- if c == "'": # ... and found
- tokenStr += c
- status = 0
- pos += 1
- else:
- tokenId = 'error' # end of literal was expected
- tokenStr += c
- status = 0
-
- elif status == 333: # start of the unknown token
- if c.isspace():
- pos += 1
- status = 0 # tokenId may be determined later
- elif tokenDic.has_key(c): # separator, don't move pos
- status = 0
- else:
- tokenStr += c # collect
- pos += 1
-
- # We should have finished in the final status. If some token
- # have been extracted, yield it first.
- assert(status == 777)
- if tokenId:
- yield (tokenId, tokenStr, tokenLineNo)
- tokenId = None
- tokenStr = ''
- tokenLineNo = 0
-
- # The file content is processed. Close the file. Then always yield
- # the eof token.
- f.close()
- yield ('eof', None, None)
-
-
- def __collectClassInfo(self, tokenIterator):
- """Collect the information about the class and base class.
-
- The tokens including the opening left curly brace of the class are
- consumed."""
-
- status = 0 # initial state
-
- while status != 777: # final state
-
- # Always assume that the previous tokens were processed. Get
- # the next one.
- tokenId, tokenStr, tokenLineNo = tokenIterator.next()
-
- # Process the token and never return back.
- if status == 0: # waiting for the 'class' keyword.
- if tokenId == 'class':
- status = 1
-
- elif status == 1: # expecting the class identification
- if tokenId == 'id':
- self.classId = tokenStr
- status = 2
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 2: # expecting the curly brace or base class info
- if tokenId == 'lcurly':
- status = 777 # correctly finished
- elif tokenId == 'colon':
- status = 3
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 3: # expecting the 'public' in front of base class id
- if tokenId == 'public':
- status = 4
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 4: # expecting the base class id
- if tokenId == 'id':
- self.baseClassId = tokenStr
- status = 5
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 5: # expecting the curly brace and quitting
- if tokenId == 'lcurly':
- status = 777 # correctly finished
- elif tokenId == 'comment':
- pass
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- # Extract the status of the TranslatorXxxx class. The readable form
- # will be used in reports the status form is a string that can be
- # compared lexically (unified length, padding with zeros, etc.).
- if self.baseClassId:
- lst = self.baseClassId.split('_')
- if lst[0] == 'Translator':
- self.readableStatus = 'up-to-date'
- self.status = ''
- elif lst[0] == 'TranslatorAdapter':
- self.status = lst[1] + '.' + lst[2]
- self.readableStatus = self.status
- if len(lst) > 3: # add the last part of the number
- self.status += '.' + ('%02d' % int(lst[3]))
- self.readableStatus += '.' + lst[3]
- else:
- self.status += '.00'
- elif lst[0] == 'TranslatorEnglish':
- # Obsolete or Based on English.
- if self.classId[-2:] == 'En':
- self.readableStatus = 'English based'
- self.status = 'En'
- else:
- self.readableStatus = 'obsolete'
- self.status = '0.0.00'
-
- # Check whether status was set, or set 'strange'.
- if self.status == None:
- self.status = 'strange'
- if not self.readableStatus:
- self.readableStatus = 'strange'
-
- # Extract the name of the language and the readable form.
- self.lang = self.classId[10:] # without 'Translator'
- if self.lang == 'Brazilian':
- self.langReadable = 'Brazilian Portuguese'
- elif self.lang == 'Chinesetraditional':
- self.langReadable = 'Chinese Traditional'
- else:
- self.langReadable = self.lang
-
-
-
- def __unexpectedToken(self, status, tokenId, tokenLineNo):
- """Reports unexpected token and quits with exit code 1."""
-
- import inspect
- calledFrom = inspect.stack()[1][3]
- msg = "\a\nUnexpected token '%s' on the line %d in '%s'.\n"
- msg = msg % (tokenId, tokenLineNo, self.fname)
- msg += 'status = %d in %s()\n' % (status, calledFrom)
- sys.stderr.write(msg)
- sys.exit(1)
-
-
- def collectPureVirtualPrototypes(self):
- """Returns dictionary 'unified prototype' -> 'full prototype'.
-
- The method is expected to be called only for the translator.h. It
- extracts only the pure virtual method and build the dictionary where
- key is the unified prototype without argument identifiers."""
-
- # Prepare empty dictionary that will be returned.
- resultDic = {}
-
- # Start the token generator which parses the class source file.
- tokenIterator = self.__tokenGenerator()
-
- # Collect the class and the base class identifiers.
- self.__collectClassInfo(tokenIterator)
- assert(self.classId == 'Translator')
-
- # Let's collect readable form of the public virtual pure method
- # prototypes in the readable form -- as defined in translator.h.
- # Let's collect also unified form of the same prototype that omits
- # everything that can be omitted, namely 'virtual' and argument
- # identifiers.
- prototype = '' # readable prototype (with everything)
- uniPrototype = '' # unified prototype (without arg. identifiers)
-
- # Collect the pure virtual method prototypes. Stop on the closing
- # curly brace followed by the semicolon (end of class).
- status = 0
- curlyCnt = 0 # counter for the level of curly braces
-
- # Loop until the final state 777 is reached. The errors are processed
- # immediately. In this implementation, it always quits the application.
- while status != 777:
-
- # Get the next token.
- tokenId, tokenStr, tokenLineNo = tokenIterator.next()
-
- if status == 0: # waiting for 'public:'
- if tokenId == 'public':
- status = 1
-
- elif status == 1: # colon after the 'public'
- if tokenId == 'colon':
- status = 2
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 2: # waiting for 'virtual'
- if tokenId == 'virtual':
- prototype = tokenStr # but not to unified prototype
- status = 3
- elif tokenId == 'comment':
- pass
- elif tokenId == 'rcurly':
- status = 11 # expected end of class
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 3: # return type of the method expected
- if tokenId == 'id':
- prototype += ' ' + tokenStr
- uniPrototype = tokenStr # start collecting the unified prototype
- status = 4
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 4: # method identifier expected
- if tokenId == 'id':
- prototype += ' ' + tokenStr
- uniPrototype += ' ' + tokenStr
- status = 5
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 5: # left bracket of the argument list expected
- if tokenId == 'lpar':
- prototype += tokenStr
- uniPrototype += tokenStr
- status = 6
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 6: # collecting arguments of the method
- if tokenId == 'rpar':
- prototype += tokenStr
- uniPrototype += tokenStr
- status = 7
- elif tokenId == 'const':
- prototype += tokenStr
- uniPrototype += tokenStr
- status = 12
- elif tokenId == 'id': # type identifier
- prototype += tokenStr
- uniPrototype += tokenStr
- status = 13
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 7: # assignment expected or left curly brace
- if tokenId == 'assign':
- status = 8
- elif tokenId == 'lcurly':
- curlyCnt = 1 # method body entered
- status = 10
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 8: # zero expected
- if tokenId == 'num' and tokenStr == '0':
- status = 9
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 9: # after semicolon, produce the dic item
- if tokenId == 'semic':
- assert(not resultDic.has_key(uniPrototype))
- resultDic[uniPrototype] = prototype
- status = 2
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 10: # consuming the body of the method
- if tokenId == 'rcurly':
- curlyCnt -= 1
- if curlyCnt == 0:
- status = 2 # body consumed
- elif tokenId == 'lcurly':
- curlyCnt += 1
-
- elif status == 11: # probably the end of class
- if tokenId == 'semic':
- status = 777
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 12: # type id for argument expected
- if tokenId == 'id':
- prototype += ' ' + tokenStr
- uniPrototype += ' ' + tokenStr
- status = 13
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 13: # namespace qualification or * or & expected
- if tokenId == 'colon': # was namespace id
- prototype += tokenStr
- uniPrototype += tokenStr
- status = 14
- elif tokenId == 'star' or tokenId == 'amp': # pointer or reference
- prototype += ' ' + tokenStr
- uniPrototype += ' ' + tokenStr
- status = 16
- elif tokenId == 'id': # argument identifier
- prototype += ' ' + tokenStr
- # don't put this into unified prototype
- status = 17
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 14: # second colon for namespace:: expected
- if tokenId == 'colon':
- prototype += tokenStr
- uniPrototype += tokenStr
- status = 15
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 15: # type after namespace:: expected
- if tokenId == 'id':
- prototype += tokenStr
- uniPrototype += tokenStr
- status = 13
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 16: # argument identifier expected
- if tokenId == 'id':
- prototype += ' ' + tokenStr
- # don't put this into unified prototype
- status = 17
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 17: # comma or ')' after argument identifier expected
- if tokenId == 'comma':
- prototype += ', '
- uniPrototype += ', '
- status = 6
- elif tokenId == 'rpar':
- prototype += tokenStr
- uniPrototype += tokenStr
- status = 7
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- # Eat the rest of the source to cause closing the file.
- while tokenId != 'eof':
- tokenId, tokenStr, tokenLineNo = tokenIterator.next()
-
- # Return the resulting dictionary with 'uniPrototype -> prototype'.
- return resultDic
-
-
- def __collectPublicMethodPrototypes(self, tokenIterator):
- """Collects prototypes of public methods and fills self.prototypeDic.
-
- The dictionary is filled by items: uniPrototype -> prototype.
- The method is expected to be called only for TranslatorXxxx classes,
- i.e. for the classes that implement translation to some language.
- It assumes that the openning curly brace of the class was already
- consumed. The source is consumed until the end of the class.
- The caller should consume the source until the eof to cause closing
- the source file."""
-
- assert(self.classId != 'Translator')
- assert(self.baseClassId != None)
-
- # The following finite automaton slightly differs from the one
- # inside self.collectPureVirtualPrototypes(). It produces the
- # dictionary item just after consuming the body of the method
- # (transition from from state 10 to state 2). It also does not allow
- # definitions of public pure virtual methods, except for
- # TranslatorAdapterBase (states 8 and 9). Argument identifier inside
- # method argument lists can be omitted or commented.
- #
- # Let's collect readable form of all public method prototypes in
- # the readable form -- as defined in the source file.
- # Let's collect also unified form of the same prototype that omits
- # everything that can be omitted, namely 'virtual' and argument
- # identifiers.
- prototype = '' # readable prototype (with everything)
- uniPrototype = '' # unified prototype (without arg. identifiers)
-
- # Collect the method prototypes. Stop on the closing
- # curly brace followed by the semicolon (end of class).
- status = 0
- curlyCnt = 0 # counter for the level of curly braces
-
- # Loop until the final state 777 is reached. The errors are processed
- # immediately. In this implementation, it always quits the application.
- while status != 777:
-
- # Get the next token.
- tokenId, tokenStr, tokenLineNo = tokenIterator.next()
-
- if status == 0: # waiting for 'public:'
- if tokenId == 'public':
- status = 1
- elif tokenId == 'eof': # non-public things until the eof
- status = 777
-
- elif status == 1: # colon after the 'public'
- if tokenId == 'colon':
- status = 2
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 2: # waiting for 'virtual' (can be omitted)
- if tokenId == 'virtual':
- prototype = tokenStr # but not to unified prototype
- status = 3
- elif tokenId == 'id': # 'virtual' was omitted
- prototype = tokenStr
- uniPrototype = tokenStr # start collecting the unified prototype
- status = 4
- elif tokenId == 'comment':
- pass
- elif tokenId == 'protected' or tokenId == 'private':
- status = 0
- elif tokenId == 'rcurly':
- status = 11 # expected end of class
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 3: # return type of the method expected
- if tokenId == 'id':
- prototype += ' ' + tokenStr
- uniPrototype = tokenStr # start collecting the unified prototype
- status = 4
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 4: # method identifier expected
- if tokenId == 'id':
- prototype += ' ' + tokenStr
- uniPrototype += ' ' + tokenStr
- status = 5
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 5: # left bracket of the argument list expected
- if tokenId == 'lpar':
- prototype += tokenStr
- uniPrototype += tokenStr
- status = 6
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 6: # collecting arguments of the method
- if tokenId == 'rpar':
- prototype += tokenStr
- uniPrototype += tokenStr
- status = 7
- elif tokenId == 'const':
- prototype += tokenStr
- uniPrototype += tokenStr
- status = 12
- elif tokenId == 'id': # type identifier
- prototype += tokenStr
- uniPrototype += tokenStr
- status = 13
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 7: # left curly brace expected
- if tokenId == 'lcurly':
- curlyCnt = 1 # method body entered
- status = 10
- elif tokenId == 'comment':
- pass
- elif tokenId == 'assign': # allowed only for TranslatorAdapterBase
- assert(self.classId == 'TranslatorAdapterBase')
- status = 8
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 8: # zero expected (TranslatorAdapterBase)
- assert(self.classId == 'TranslatorAdapterBase')
- if tokenId == 'num' and tokenStr == '0':
- status = 9
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 9: # after semicolon (TranslatorAdapterBase)
- assert(self.classId == 'TranslatorAdapterBase')
- if tokenId == 'semic':
- status = 2
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 10: # consuming the body of the method, then dic item
- if tokenId == 'rcurly':
- curlyCnt -= 1
- if curlyCnt == 0:
- # Insert new dictionary item.
- assert(not self.prototypeDic.has_key(uniPrototype))
- self.prototypeDic[uniPrototype] = prototype
- status = 2 # body consumed
- elif tokenId == 'lcurly':
- curlyCnt += 1
- elif status == 11: # probably the end of class
- if tokenId == 'semic':
- status = 777
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 12: # type id for argument expected
- if tokenId == 'id':
- prototype += ' ' + tokenStr
- uniPrototype += ' ' + tokenStr
- status = 13
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 13: # :: or * or & or id or ) expected
- if tokenId == 'colon': # was namespace id
- prototype += tokenStr
- uniPrototype += tokenStr
- status = 14
- elif tokenId == 'star' or tokenId == 'amp': # pointer or reference
- prototype += ' ' + tokenStr
- uniPrototype += ' ' + tokenStr
- status = 16
- elif tokenId == 'id': # argument identifier
- prototype += ' ' + tokenStr
- # don't put this into unified prototype
- status = 17
- elif tokenId == 'comment': # probably commented-out identifier
- prototype += tokenStr
- elif tokenId == 'rpar':
- prototype += tokenStr
- uniPrototype += tokenStr
- status = 7
- elif tokenId == 'comma':
- prototype += ', '
- uniPrototype += ', '
- status = 6
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 14: # second colon for namespace:: expected
- if tokenId == 'colon':
- prototype += tokenStr
- uniPrototype += tokenStr
- status = 15
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 15: # type after namespace:: expected
- if tokenId == 'id':
- prototype += tokenStr
- uniPrototype += tokenStr
- status = 13
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 16: # argument identifier or ) expected
- if tokenId == 'id':
- prototype += ' ' + tokenStr
- # don't put this into unified prototype
- status = 17
- elif tokenId == 'rpar':
- prototype += tokenStr
- uniPrototype += tokenStr
- status = 7
- elif tokenId == 'comment':
- prototype += tokenStr
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
- elif status == 17: # comma or ')' after argument identifier expected
- if tokenId == 'comma':
- prototype += ', '
- uniPrototype += ', '
- status = 6
- elif tokenId == 'rpar':
- prototype += tokenStr
- uniPrototype += tokenStr
- status = 7
- else:
- self.__unexpectedToken(status, tokenId, tokenLineNo)
-
-
-
- def collectAdapterPrototypes(self):
- """Returns the dictionary of prototypes implemented by adapters.
-
- It is created to process the translator_adapter.h. The returned
- dictionary has the form: unifiedPrototype -> (version, classId)
- thus by looking for the prototype, we get the information what is
- the newest (least adapting) adapter that is sufficient for
- implementing the method."""
-
- # Start the token generator which parses the class source file.
- assert(os.path.split(self.fname)[1] == 'translator_adapter.h')
- tokenIterator = self.__tokenGenerator()
-
- # Get the references to the involved dictionaries.
- reqDic = self.manager.requiredMethodsDic
-
- # Create the empty dictionary that will be returned.
- adaptDic = {}
-
-
- # Loop through the source of the adapter file until no other adapter
- # class is found.
- while True:
- try:
- # Collect the class and the base class identifiers.
- self.__collectClassInfo(tokenIterator)
-
- # Extract the comparable version of the adapter class.
- # Note: The self.status as set by self.__collectClassInfo()
- # contains similar version, but is related to the base class,
- # not to the class itself.
- lst = self.classId.split('_')
- version = ''
- if lst[0] == 'TranslatorAdapter': # TranslatorAdapterBase otherwise
- version = lst[1] + '.' + lst[2]
- if len(lst) > 3: # add the last part of the number
- version += '.' + ('%02d' % int(lst[3]))
- else:
- version += '.00'
-
- # Collect the prototypes of implemented public methods.
- self.__collectPublicMethodPrototypes(tokenIterator)
-
- # For the required methods, update the dictionary of methods
- # implemented by the adapter.
- for protoUni in self.prototypeDic:
- if reqDic.has_key(protoUni):
- # This required method will be marked as implemented
- # by this adapter class. This implementation assumes
- # that newer adapters do not reimplement any required
- # methods already implemented by older adapters.
- assert(not adaptDic.has_key(protoUni))
- adaptDic[protoUni] = (version, self.classId)
-
- # Clear the dictionary object and the information related
- # to the class as the next adapter class is to be processed.
- self.prototypeDic.clear()
- self.classId = None
- self.baseClassId = None
-
- except StopIteration:
- break
-
- # Return the result dictionary.
- return adaptDic
-
-
- def processing(self):
- """Processing of the source file -- only for TranslatorXxxx classes."""
-
- # Start the token generator which parses the class source file.
- tokenIterator = self.__tokenGenerator()
-
- # Collect the class and the base class identifiers.
- self.__collectClassInfo(tokenIterator)
- assert(self.classId != 'Translator')
- assert(self.classId[:17] != 'TranslatorAdapter')
-
- # Collect the prototypes of implemented public methods.
- self.__collectPublicMethodPrototypes(tokenIterator)
-
- # Eat the rest of the source to cause closing the file.
- while True:
- try:
- t = tokenIterator.next()
- except StopIteration:
- break
-
- # Shorthands for the used dictionaries.
- reqDic = self.manager.requiredMethodsDic
- adaptDic = self.manager.adaptMethodsDic
- myDic = self.prototypeDic
-
- # Build the list of obsolete methods.
- self.obsoleteMethods = []
- for p in myDic:
- if not reqDic.has_key(p):
- self.obsoleteMethods.append(p)
-
- # Build the list of missing methods and the list of implemented
- # required methods.
- self.missingMethods = []
- self.implementedMethods = []
- for p in reqDic:
- if myDic.has_key(p):
- self.implementedMethods.append(p)
- else:
- self.missingMethods.append(p)
-
- # Check whether adapter must be used or suggest the newest one.
- # Change the status and set the note accordingly.
- if self.baseClassId != 'Translator':
- if not self.missingMethods:
- self.note = 'Change the base class to Translator.'
- self.status = ''
- self.readableStatus = 'up-to-date'
- elif self.baseClassId != 'TranslatorEnglish':
- # The translator uses some of the adapters.
- # Look at the missing methods and check what adapter
- # implements them. Remember the one with the lowest version.
- adaptMinVersion = '9.9.99'
- adaptMinClass = 'TranslatorAdapter_9_9_99'
- for uniProto in self.missingMethods:
- if adaptDic.has_key(uniProto):
- version, cls = adaptDic[uniProto]
- if version < adaptMinVersion:
- adaptMinVersion = version
- adaptMinClass = cls
-
- # Test against the current status -- preserve the self.status.
- # Possibly, the translator implements enough methods to
- # use some newer adapter.
- status = self.status
-
- # If the version of the used adapter is smaller than
- # the required, set the note and update the status as if
- # the newer adapter was used.
- if adaptMinVersion > status:
- self.note = 'Change the base class to %s.' % adaptMinClass
- self.status = adaptMinVersion
- self.adaptMinClass = adaptMinClass
- self.readableStatus = adaptMinVersion # simplified
-
- # If everything seems OK, but there are obsolete methods, set
- # the note to clean-up source. This note will be used only when
- # the previous code did not set another note (priority).
- if not self.note and self.status == '' and self.obsoleteMethods:
- self.note = 'Remove the obsolete methods (never used).'
-
- def report(self, fout):
- """Returns the report part for the source as a multiline string.
-
- No output for up-to-date translators without problem."""
-
- # If there is nothing to report, return immediately.
- if self.status == '' and not self.note:
- return
-
- # Report the number of not implemented methods.
- fout.write('\n\n\n')
- fout.write(self.classId + ' (' + self.baseClassId + ')')
- if self.missingMethods:
- num = len(self.missingMethods)
- fout.write(' %d' % num)
- fout.write(' method')
- if num > 1:
- fout.write('s')
- fout.write(' to implement')
- fout.write('\n' + '-' * len(self.classId))
-
- # Write the info about the implemented required methods.
- fout.write('\n\n Implements %d' % len(self.implementedMethods))
- fout.write(' of the required methods.')
-
- # Report the missing method, but only when it is not English-based
- # translator.
- if self.missingMethods and self.status != 'En':
- fout.write('\n\n Missing methods (should be implemented):\n')
- reqDic = self.manager.requiredMethodsDic
- for p in self.missingMethods:
- fout.write('\n ' + reqDic[p])
-
- # Always report obsolete methods.
- if self.obsoleteMethods:
- fout.write('\n\n Obsolete methods (should be removed, never used):\n')
- myDic = self.prototypeDic
- for p in self.obsoleteMethods:
- fout.write('\n ' + myDic[p])
-
- # For English-based translator, report the implemented methods.
- if self.status == 'En' and self.implementedMethods:
- fout.write('\n\n This English-based translator implements ')
- fout.write('the following methods:\n')
- reqDic = self.manager.requiredMethodsDic
- for p in self.implementedMethods:
- fout.write('\n ' + reqDic[p])
-
-
- def getmtime(self):
- """Returns the last modification time of the source file."""
- assert(os.path.isfile(self.fname))
- return os.path.getmtime(self.fname)
-
-
-class TrManager:
- """Collects basic info and builds subordinate Transl objects."""
-
- def __init__(self):
- """Determines paths, creates and initializes structures.
-
- The arguments of the script may explicitly say what languages should
- be processed. Write the two letter identifications that are used
- for composing the source filenames, so...
-
- python translator.py cz
-
- this will process only translator_cz.h source.
- """
-
- # Determine the path to the script and the absolute path to the
- # Doxygen's root subdirectory.
- self.script = os.path.abspath(sys.argv[0])
- self.script_path, self.script_name = os.path.split(self.script)
- self.script_path = os.path.abspath(self.script_path)
- self.doxy_path = os.path.abspath(os.path.join(self.script_path, '..'))
-
- # Get the explicit arguments of the script.
- self.script_argLst = sys.argv[1:]
-
- # Build the path names based on the Doxygen's root knowledge.
- self.doc_path = os.path.join(self.doxy_path, 'doc')
- self.src_path = os.path.join(self.doxy_path, 'src')
-
- # Create the empty dictionary for Transl object identitied by the
- # class identifier of the translator.
- self.__translDic = {}
-
- # Create the None dictionary of required methods. The key is the
- # unified prototype, the value is the full prototype. Set inside
- # the self.__build().
- self.requiredMethodsDic = None
-
- # Create the empty dictionary that says what method is implemented
- # by what adapter.
- self.adaptMethodsDic = {}
-
- # The last modification time will capture the modification of this
- # script, of the translator.h, of the translator_adapter.h (see the
- # self.__build() for the last two) of all the translator_xx.h files
- # and of the template for generating the documentation. So, this
- # time can be compared with modification time of the generated
- # documentation to decide, whether the doc should be re-generated.
- self.lastModificationTime = os.path.getmtime(self.script)
-
- # Set the names of the translator report text file, of the template
- # for generating "Internationalization" document, for the generated
- # file itself, and for the maintainers list.
- self.translatorReportFileName = 'translator_report.txt'
- self.maintainersFileName = 'maintainers.txt'
- self.languageTplFileName = 'language.tpl'
- self.languageDocFileName = 'language.doc'
-
- # The information about the maintainers will be stored
- # in the dictionary with the following name.
- self.__maintainersDic = None
-
- # Define the other used structures and variables for information.
- self.langLst = None # including English based
- self.supportedLangReadableStr = None # coupled En-based as a note
- self.numLang = None # excluding coupled En-based
- self.doxVersion = None # Doxygen version
-
- # Build objects where each one is responsible for one translator.
- self.__build()
-
-
- def __build(self):
- """Find the translator files and build the objects for translators."""
-
- # 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)
- self.requiredMethodsDic = tr.collectPureVirtualPrototypes()
- tim = tr.getmtime()
- if tim > self.lastModificationTime:
- self.lastModificationTime = tim
-
- # 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)
- self.adaptMethodsDic = tr.collectAdapterPrototypes()
- tim = tr.getmtime()
- if tim > self.lastModificationTime:
- self.lastModificationTime = tim
-
- # Create the list of the filenames with language translator sources.
- # If the explicit arguments of the script were typed, process only
- # those files.
- 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)):
- sys.stderr.write("\a\nFile '%s' not found!\n" % fname)
- sys.exit(1)
- else:
- lst = os.listdir(self.src_path)
- lst = filter(lambda x: x[:11] == 'translator_'
- and x[-2:] == '.h'
- and x != 'translator_adapter.h', lst)
-
- # Build the object for the translator_xx.h files, and process the
- # 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)
- tr = Transl(fullname, self)
- tr.processing()
- assert(tr.classId != 'Translator')
- self.__translDic[tr.classId] = tr
-
- # Extract the global information of the processed info.
- self.__extractProcessedInfo()
-
-
- def __extractProcessedInfo(self):
- """Build lists and strings of the processed info."""
-
- # Build the auxiliary list with strings compound of the status,
- # readable form of the language, and classId.
- statLst = []
- for obj in self.__translDic.values():
- assert(obj.classId != 'Translator')
- s = obj.status + '|' + obj.langReadable + '|' + obj.classId
- statLst.append(s)
-
- # Sort the list and extract the object identifiers (classId's) for
- # the up-to-date translators and English-based translators.
- statLst.sort()
- self.upToDateIdLst = [x.split('|')[2] for x in statLst if x[0] == '|']
- self.EnBasedIdLst = [x.split('|')[2] for x in statLst if x[:2] == 'En']
-
- # Reverse the list and extract the TranslatorAdapter based translators.
- statLst.reverse()
- self.adaptIdLst = [x.split('|')[2] for x in statLst if x[0].isdigit()]
-
- # Build the list of tuples that contain (langReadable, obj).
- # Sort it by readable name.
- self.langLst = []
- for obj in self.__translDic.values():
- self.langLst.append((obj.langReadable, obj))
- self.langLst.sort(lambda a, b: cmp(a[0], b[0]))
-
- # Create the list with readable language names. If the language has
- # also the English-based version, modify the item by appending
- # the note. Number of the supported languages is equal to the length
- # of the list.
- langReadableLst = []
- for name, obj in self.langLst:
- if obj.status == 'En': continue
-
- # Append the 'En' to the classId to possibly obtain the classId
- # of the English-based object. If the object exists, modify the
- # name for the readable list of supported languages.
- classIdEn = obj.classId + 'En'
- if self.__translDic.has_key(classIdEn):
- name += ' (+En)'
-
- # Append the result name of the language, possibly with note.
- langReadableLst.append(name)
-
- # Create the multiline string of readable language names,
- # with punctuation, wrapped to paragraph.
- if len(langReadableLst) == 1:
- s = langReadableLst[0]
- elif len(langReadableLst) == 2:
- s = ' and '.join(langReadableLst)
- else:
- s = ', '.join(langReadableLst[:-1]) + ', and '
- s += langReadableLst[-1]
-
- self.supportedLangReadableStr = fill(s + '.')
-
- # Find the number of the supported languages. The English based
- # languages are not counted if the non-English based also exists.
- self.numLang = len(self.langLst)
- for name, obj in self.langLst:
- if obj.status == 'En':
- classId = obj.classId[:-2]
- if self.__translDic.has_key(classId):
- self.numLang -= 1 # the couple will be counted as one
-
- # Extract the version of Doxygen.
- f = file(os.path.join(self.doxy_path, 'VERSION'))
- self.doxVersion = f.readline().strip()
- f.close()
-
- # Update the last modification time.
- for tr in self.__translDic.values():
- tim = tr.getmtime()
- if tim > self.lastModificationTime:
- self.lastModificationTime = tim
-
-
- def __getNoTrSourceFilesLst(self):
- """Returns the list of sources to be checked.
-
- All .cpp files and also .h files that do not declare or define
- the translator methods are included in the list. The file names
- are searched in doxygen/src directory.
- """
- srcdir = os.path.join(self.doxy_path, 'src')
- files = []
- for item in os.listdir(srcdir):
- # Split the bare name to get the extension.
- name, ext = os.path.splitext(item)
- ext = ext.lower()
-
- # Include only .cpp and .h files (case independent) and exclude
- # the files where the checked identifiers are defined.
- if ext == '.cpp' or (ext == '.h' and name.find('translator') == -1):
- fname = os.path.join(srcdir, item)
- assert os.path.isfile(fname) # assumes no directory with the ext
- files.append(fname) # full name
- return files
-
-
- def __removeUsedInFiles(self, fname, dic):
- """Removes items for method identifiers that are found in fname.
-
- The method reads the content of the file as one string and searches
- for all identifiers from dic. The identifiers that were found in
- the file are removed from the dictionary.
-
- Note: If more files is to be checked, the files where most items are
- probably used should be checked first and the resulting reduced
- dictionary should be used for checking the next files (speed up).
- """
- lst_in = dic.keys() # identifiers to be searched for
-
- # Read content of the file as one string.
- assert os.path.isfile(fname)
- f = file(fname)
- cont = f.read()
- f.close()
-
- # Remove the items for identifiers that were found in the file.
- while lst_in:
- item = lst_in.pop(0)
- if cont.find(item) != -1:
- del dic[item]
-
-
- def __checkForNotUsedTrMethods(self):
- """Returns the dictionary of not used translator methods.
-
- The method can be called only after self.requiredMethodsDic has been
- built. The stripped prototypes are the values, the method identifiers
- are the keys.
- """
- # Build the dictionary of the required method prototypes with
- # method identifiers used as keys.
- trdic = {}
- for prototype in self.requiredMethodsDic.keys():
- ri = prototype.split('(')[0]
- identifier = ri.split()[1].strip()
- trdic[identifier] = prototype
-
- # Build the list of source files where translator method identifiers
- # can be used.
- files = self.__getNoTrSourceFilesLst()
-
- # Loop through the files and reduce the dictionary of id -> proto.
- for fname in files:
- self.__removeUsedInFiles(fname, trdic)
-
- # Return the dictionary of not used translator methods.
- return trdic
-
-
-
-
- def __email(self, classId):
- """Returns the first maintainer for the translator class"""
- return self.__maintainersDic[classId][0][1]
-
-
- def generateTranslatorReport(self):
- """Generates the translator report."""
-
- output = os.path.join(self.doc_path, self.translatorReportFileName)
-
- # Open the textual report file for the output.
- f = file(output, 'w')
-
- # Output the information about the version.
- f.write('(' + self.doxVersion + ')\n\n')
-
- # Output the information about the number of the supported languages
- # and the list of the languages, or only the note about the explicitly
- # given languages to process.
- if self.script_argLst:
- f.write('The report was generated for the following, explicitly')
- f.write(' identified languages:\n\n')
- f.write(self.supportedLangReadableStr + '\n\n')
- else:
- f.write('Doxygen supports the following ')
- f.write(str(self.numLang))
- f.write(' languages (sorted alphabetically):\n\n')
- f.write(self.supportedLangReadableStr + '\n\n')
-
- # Write the summary about the status of language translators (how
- # many translators) are up-to-date, etc.
- s = 'Of them, %d translators are up-to-date, ' % len(self.upToDateIdLst)
- s += '%d translators are based on some adapter class, ' % len(self.adaptIdLst)
- s += 'and %d are English based.' % len(self.EnBasedIdLst)
- f.write(fill(s) + '\n\n')
-
- # 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 = file('mailto.txt', 'w')
-
- # Write the list of up-to-date translator classes.
- if self.upToDateIdLst:
- s = '''The following translator classes are up-to-date (sorted
- alphabetically). This means that they derive from the
- Translator class and they implement all %d of the required
- methods. Anyway, there still may be some details listed even
- for them:'''
- s = s % len(self.requiredMethodsDic)
- f.write('-' * 70 + '\n')
- f.write(fill(s) + '\n\n')
-
- mailtoLst = []
- for x in self.upToDateIdLst:
- obj = self.__translDic[x]
- f.write(' ' + obj.classId)
- if obj.note:
- f.write(' -- ' + obj.note)
- f.write('\n')
- mailtoLst.append(self.__email(obj.classId))
-
- fmail.write('up-to-date\n')
- fmail.write('; '.join(mailtoLst))
-
- # Write the list of the adapter based classes. The very obsolete
- # translators that derive from TranslatorEnglish are included.
- if self.adaptIdLst:
- s = '''The following translator classes need some maintenance
- (the most obsolete at the end). The other info shows the
- estimation of Doxygen version when the class was last
- updated and number of methods that must be implemented to
- become up-to-date:'''
- f.write('\n' + '-' * 70 + '\n')
- f.write(fill(s) + '\n\n')
-
- # Find also whether some adapter classes may be removed.
- adaptMinVersion = '9.9.99'
-
- mailtoLst = []
- for x in self.adaptIdLst:
- obj = self.__translDic[x]
- f.write(' %-30s' % obj.classId)
- f.write(' %-6s' % obj.readableStatus)
- numimpl = len(obj.missingMethods)
- pluralS = ''
- if numimpl > 1: pluralS = 's'
- f.write('\t%2d method%s to implement' % (numimpl, pluralS))
- if obj.note:
- f.write('\n\tNote: ' + obj.note + '\n')
- f.write('\n')
- mailtoLst.append(self.__email(obj.classId)) # to maintainer
-
- # Check the level of required adapter classes.
- if obj.status != '0.0.00' and obj.status < adaptMinVersion:
- adaptMinVersion = obj.status
-
- fmail.write('\n\ntranslator based\n')
- fmail.write('; '.join(mailtoLst))
-
- # Set the note if some old translator adapters are not needed
- # any more. Do it only when the script is called without arguments,
- # i.e. all languages were checked against the needed translator
- # adapters.
- if not self.script_argLst:
- to_remove = {}
- for version, adaptClassId in self.adaptMethodsDic.values():
- if version < adaptMinVersion:
- to_remove[adaptClassId] = True
-
- if to_remove:
- lst = to_remove.keys()
- lst.sort()
- plural = len(lst) > 1
- note = 'Note: The adapter class'
- if plural: note += 'es'
- note += ' ' + ', '.join(lst)
- if not plural:
- note += ' is'
- else:
- note += ' are'
- note += ' not used and can be removed.'
- f.write('\n' + fill(note) + '\n')
-
- # Write the list of the English-based classes.
- if self.EnBasedIdLst:
- s = '''The following translator classes derive directly from the
- TranslatorEnglish. The class identifier has the suffix 'En'
- that says that this is intentional. Usually, there is also
- a non-English based version of the translator for
- the language:'''
- f.write('\n' + '-' * 70 + '\n')
- f.write(fill(s) + '\n\n')
-
- for x in self.EnBasedIdLst:
- obj = self.__translDic[x]
- f.write(' ' + obj.classId)
- f.write('\timplements %d methods' % len(obj.implementedMethods))
- if obj.note:
- f.write(' -- ' + obj.note)
- f.write('\n')
-
- # Check for not used translator methods and generate warning if found.
- # The check is rather time consuming, so it is not done when report
- # is restricted to explicitly given language identifiers.
- if not self.script_argLst:
- dic = self.__checkForNotUsedTrMethods()
- if dic:
- s = '''WARNING: The following translator methods are declared
- in the Translator class but their identifiers do not appear
- in source files. The situation should be checked. The .cpp
- files and .h files excluding the '*translator*' files
- in doxygen/src directory were simply searched for occurence
- of the method identifiers:'''
- f.write('\n' + '=' * 70 + '\n')
- f.write(fill(s) + '\n\n')
-
- keys = dic.keys()
- keys.sort()
- for key in keys:
- f.write(' ' + dic[key] + '\n')
- f.write('\n')
-
- # Write the details for the translators.
- f.write('\n' + '=' * 70)
- f.write('\nDetails for translators (classes sorted alphabetically):\n')
-
- cls = self.__translDic.keys()
- cls.sort()
-
- for c in cls:
- obj = self.__translDic[c]
- assert(obj.classId != 'Translator')
- obj.report(f)
-
- # Close the report file and the auxiliary file with e-mails.
- f.close()
- fmail.close()
-
-
- def __loadMaintainers(self):
- """Load and process the file with the maintainers.
-
- Fills the dictionary classId -> [(name, e-mail), ...]."""
-
- fname = os.path.join(self.script_path, self.maintainersFileName)
-
- # Include the maintainers file to the group of files checked with
- # respect to the modification time.
- tim = os.path.getmtime(fname)
- if tim > self.lastModificationTime:
- self.lastModificationTime = tim
-
- # Process the content of the maintainers file.
- f = file(fname)
- inside = False # inside the record for the language
- lineReady = True
- classId = None
- maintainersLst = None
- self.__maintainersDic = {}
- while lineReady:
- line = f.readline() # next line
- lineReady = line != '' # when eof, then line == ''
-
- line = line.strip() # eof should also behave as separator
- if line != '' and line[0] == '%': # skip the comment line
- continue
-
- if not inside: # if outside of the record
- if line != '': # should be language identifier
- classId = line
- maintainersLst = []
- inside = True
- # Otherwise skip empty line that do not act as separator.
-
- else: # if inside the record
- if line == '': # separator found
- inside = False
- else:
- # If it is the first maintainer, create the empty list.
- if not self.__maintainersDic.has_key(classId):
- self.__maintainersDic[classId] = []
-
- # Split the information about the maintainer and append
- # the tuple.
- lst = line.split(':', 1)
- assert(len(lst) == 2)
- t = (lst[0].strip(), lst[1].strip())
- self.__maintainersDic[classId].append(t)
- f.close()
-
-
- def generateLanguageDoc(self):
- """Checks the modtime of files and generates language.doc."""
- self.__loadMaintainers()
-
- # 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.script_path, self.languageTplFileName)
- tim = os.path.getmtime(fTplName)
- if tim > self.lastModificationTime:
- self.lastModificationTime = tim
-
- # If the generated documentation exists and is newer than any of
- # the source files from the group, do not generate it and quit
- # quietly.
- fDocName = os.path.join(self.doc_path, self.languageDocFileName)
- if os.path.isfile(fDocName):
- if os.path.getmtime(fDocName) > self.lastModificationTime:
- return
-
- # The document or does not exist or is older than some of the
- # sources. It must be generated again.
- #
- # Read the template of the documentation, and remove the first
- # attention lines.
- f = file(fTplName)
- line = f.readline()
- while line[0] != '/':
- line = f.readline()
- doctpl = line + f.read()
- f.close()
-
- # Fill the tplDic by symbols that will be inserted into the
- # document template.
- tplDic = {}
-
- s = 'Do not edit this file. It was generated by the %s script.' % self.script_name
- tplDic['editnote'] = s
-
- tplDic['doxVersion'] = self.doxVersion
- tplDic['supportedLangReadableStr'] = self.supportedLangReadableStr
- tplDic['translatorReportFileName'] = self.translatorReportFileName
-
- ahref = '<a href="../doc/' + self.translatorReportFileName
- ahref += '"\n><code>doxygen/doc/' + self.translatorReportFileName
- ahref += '</code></a>'
- tplDic['translatorReportLink'] = ahref
- tplDic['numLangStr'] = str(self.numLang)
-
- # Define templates for HTML table parts of the documentation.
- htmlTableTpl = '''\
- \\htmlonly
- <table align=center cellspacing=0 cellpadding=0 border=0>
- <tr bgcolor="#000000">
- <td>
- <table cellspacing=1 cellpadding=2 border=0>
- <tr bgcolor="#4040c0">
- <td ><b><font size=+1 color="#ffffff"> Language </font></b></td>
- <td ><b><font size=+1 color="#ffffff"> Maintainer </font></b></td>
- <td ><b><font size=+1 color="#ffffff"> Contact address </font>
- <font size=-2 color="#ffffff">(replace the at and dot)</font></b></td>
- <td ><b><font size=+1 color="#ffffff"> Status </font></b></td>
- </tr>
- <!-- table content begin -->
- %s
- <!-- table content end -->
- </table>
- </td>
- </tr>
- </table>
- \\endhtmlonly
- '''
- htmlTableTpl = dedent(htmlTableTpl)
- htmlTrTpl = '\n <tr bgcolor="#ffffff">%s\n </tr>'
- htmlTdTpl = '\n <td>%s</td>'
-
- # Loop through transl objects in the order of sorted readable names
- # and add generate the content of the HTML table.
- trlst = []
- for name, obj in self.langLst:
- # Fill the table data elements for one row. The first element
- # contains the readable name of the language.
- lst = [ htmlTdTpl % obj.langReadable ]
-
- # The next two elements contain the list of maintainers
- # and the list of their mangled e-mails. For English-based
- # translators that are coupled with the non-English based,
- # insert the 'see' note.
- mm = None # init
- ee = None # init
- if obj.status == 'En':
- # Check whether there is the coupled non-English.
- classId = obj.classId[:-2]
- if self.__translDic.has_key(classId):
- lang = self.__translDic[classId].langReadable
- mm = 'see the %s language' % lang
- ee = '&nbsp;'
-
- if not mm and self.__maintainersDic.has_key(obj.classId):
- lm = [ m[0] for m in self.__maintainersDic[obj.classId] ]
- mm = '<br>'.join(lm)
- le = [ m[1] for m in self.__maintainersDic[obj.classId] ]
- ee = '<br>'.join(le)
-
- # Mangle the e-mail and replace the entity references.
- if ee and ee != '&nbsp;':
- # More than one maintainer address separated by <br> can be used.
- emails = ee.split('<br>')
- mangled_list = []
- for email in emails:
- name, domain = email.split('@')
- domain = domain.replace('.', ' dot ')
- mangled_list.append(name + ' at ' + domain)
- ee = '<br>'.join(mangled_list)
-
- if mm:
- mm = mm.replace('&ccaron;', '&#x010d;')
- mm = mm.replace('&rcaron;', '&#x0159;')
- mm = mm.replace('&scaron;', '&#x0161;')
- mm = mm.replace('&zcaron;', '&#x017e;')
-
- # Append the maintainer and e-mail elements.
- lst.append(htmlTdTpl % mm)
- lst.append(htmlTdTpl % ee)
-
- # The last element contains the readable form of the status.
- lst.append(htmlTdTpl % obj.readableStatus)
-
- # Join the table data to one table row.
- trlst.append(htmlTrTpl % (''.join(lst)))
-
- # Join the table rows and insert into the template.
- htmlTable = htmlTableTpl % (''.join(trlst))
-
- # Define templates for LaTeX table parts of the documentation.
- latexTableTpl = r'''
- \latexonly
- \begin{tabular}{|l|l|l|l|}
- \hline
- {\bf Language} & {\bf Maintainer} & {\bf Contact address} & {\bf Status} \\
- \hline
- %s
- \hline
- \end{tabular}
- \endlatexonly
- '''
- latexTableTpl = dedent(latexTableTpl)
- latexLineTpl = '\n' + r' %s & %s & {\tt\tiny %s} & %s \\'
-
- # Loop through transl objects in the order of sorted readable names
- # and add generate the content of the LaTeX table.
- trlst = []
- for name, obj in self.langLst:
- # For LaTeX, more maintainers for the same language are
- # placed on separate rows in the table. The line separator
- # in the table is placed explicitly above the first
- # maintainer. Prepare the arguments for the LaTeX row template.
- maintainers = []
- if self.__maintainersDic.has_key(obj.classId):
- maintainers = self.__maintainersDic[obj.classId]
-
- lang = obj.langReadable
- maintainer = None # init
- email = None # init
- if obj.status == 'En':
- # Check whether there is the coupled non-English.
- classId = obj.classId[:-2]
- if self.__translDic.has_key(classId):
- langNE = self.__translDic[classId].langReadable
- maintainer = 'see the %s language' % langNE
- email = '~'
-
- if not maintainer and self.__maintainersDic.has_key(obj.classId):
- lm = [ m[0] for m in self.__maintainersDic[obj.classId] ]
- maintainer = maintainers[0][0]
- email = maintainers[0][1]
-
- status = obj.readableStatus
-
- # Use the template to produce the line of the table and insert
- # the hline plus the constructed line into the table content.
- trlst.append('\n \\hline')
- trlst.append(latexLineTpl % (lang, maintainer, email, status))
-
- # List the other maintainers for the language. Do not set
- # lang and status for them.
- lang = '~'
- status = '~'
- for m in maintainers[1:]:
- maintainer = m[0]
- email = m[1]
- trlst.append(latexLineTpl % (lang, maintainer, email, status))
-
- # Join the table lines and insert into the template.
- latexTable = latexTableTpl % (''.join(trlst))
-
- # Do the LaTeX replacements.
- latexTable = latexTable.replace('&aacute;', "\\'{a}")
- latexTable = latexTable.replace('&Aacute;', "\\'{A}")
- latexTable = latexTable.replace('&auml;', '\\"{a}')
- latexTable = latexTable.replace('&ouml;', '\\"{o}')
- latexTable = latexTable.replace('&oslash;', '\\o{}')
- latexTable = latexTable.replace('&ccaron;', '\\v{c}')
- latexTable = latexTable.replace('&rcaron;', '\\v{r}')
- latexTable = latexTable.replace('&scaron;', '\\v{s}')
- latexTable = latexTable.replace('&zcaron;', '\\v{z}')
- latexTable = latexTable.replace('_', '\\_')
-
- # Put the HTML and LaTeX parts together and define the dic item.
- tplDic['informationTable'] = htmlTable + '\n' + latexTable
-
- # Insert the symbols into the document template and write it down.
- f = file(fDocName, 'w')
- f.write(doctpl % tplDic)
- f.close()
-
-if __name__ == '__main__':
-
- # Create the manager, build the transl objects, and parse the related
- # sources.
- trMan = TrManager()
-
- # Generate the language.doc.
- trMan.generateLanguageDoc()
-
- # Generate the translator report.
- trMan.generateTranslatorReport()
diff --git a/doc/translator_report.txt b/doc/translator_report.txt
deleted file mode 100644
index dc2c164..0000000
--- a/doc/translator_report.txt
+++ /dev/null
@@ -1,713 +0,0 @@
-(1.4.4)
-
-Doxygen supports the following 31 languages (sorted alphabetically):
-
-Afrikaans, Brazilian Portuguese, Catalan, Chinese, Chinese
-Traditional, Croatian, Czech, Danish, Dutch, English, Finnish, French,
-German, Greek, Hungarian, Indonesian, Italian, Japanese (+En), Korean
-(+En), Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian,
-Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
-
-Of them, 18 translators are up-to-date, 13 translators are based on
-some adapter class, and 2 are English based.
-
-----------------------------------------------------------------------
-The following translator classes are up-to-date (sorted
-alphabetically). This means that they derive from the Translator class
-and they implement all 192 of the required methods. Anyway, there
-still may be some details listed even for them:
-
- TranslatorAfrikaans
- TranslatorBrazilian -- Remove the obsolete methods (never used).
- TranslatorCatalan
- TranslatorChinesetraditional -- Remove the obsolete methods (never used).
- TranslatorCroatian
- TranslatorCzech
- TranslatorDutch -- Remove the obsolete methods (never used).
- TranslatorEnglish -- Remove the obsolete methods (never used).
- TranslatorFrench -- Remove the obsolete methods (never used).
- TranslatorGerman
- TranslatorHungarian
- TranslatorIndonesian -- Remove the obsolete methods (never used).
- TranslatorItalian
- TranslatorKorean
- TranslatorLithuanian
- TranslatorPolish -- Remove the obsolete methods (never used).
- TranslatorRussian
- TranslatorSwedish
-
-----------------------------------------------------------------------
-The following translator classes need some maintenance (the most
-obsolete at the end). The other info shows the estimation of Doxygen
-version when the class was last updated and number of methods that
-must be implemented to become up-to-date:
-
- TranslatorUkrainian 1.4.1 1 method to implement
- TranslatorSerbian 1.4.1 1 method to implement
- TranslatorRomanian 1.4.1 1 method to implement
- TranslatorChinese 1.4.1 1 method to implement
- TranslatorNorwegian 1.3.9 7 methods to implement
- TranslatorJapanese 1.3.9 7 methods to implement
- TranslatorDanish 1.3.9 7 methods to implement
- TranslatorSpanish 1.3.8 8 methods to implement
- TranslatorPortuguese 1.3.3 12 methods to implement
- TranslatorSlovak 1.2.18 21 methods to implement
- TranslatorSlovene 1.2.16 23 methods to implement
- TranslatorGreek 1.2.11 26 methods to implement
- TranslatorFinnish obsolete 95 methods to implement
-
-----------------------------------------------------------------------
-The following translator classes derive directly from the
-TranslatorEnglish. The class identifier has the suffix 'En' that says
-that this is intentional. Usually, there is also a non-English based
-version of the translator for the language:
-
- TranslatorJapaneseEn implements 5 methods
- TranslatorKoreanEn implements 5 methods
-
-======================================================================
-Details for translators (classes sorted alphabetically):
-
-
-
-TranslatorBrazilian (Translator)
--------------------
-
- Implements 192 of the required methods.
-
- Obsolete methods (should be removed, never used):
-
- virtual QCString trHeaderFilesDescription()
- virtual QCString trField(bool first_capital, bool singular)
- virtual QCString trPackageDocumentation()
- virtual QCString trSources()
- virtual QCString trReimplementedForInternalReasons()
- virtual QCString trInterfaces()
- virtual QCString trHeaderFiles()
- virtual QCString trBugsAndLimitations()
- virtual QCString trEnumerationValueDocumentation()
- virtual QCString trNoDescriptionAvailable()
-
-
-TranslatorChinese (TranslatorAdapter_1_4_1) 1 method to implement
------------------
-
- Implements 191 of the required methods.
-
- Missing methods (should be implemented):
-
- virtual QCString trOverloadText()
-
-
-TranslatorChinesetraditional (Translator)
-----------------------------
-
- Implements 192 of the required methods.
-
- Obsolete methods (should be removed, never used):
-
- virtual QCString trHeaderFilesDescription()
- virtual QCString trField(bool/*first_capital*/, bool/*singular*/)
- virtual QCString trPackageDocumentation()
- virtual QCString trSources()
- virtual QCString trReimplementedForInternalReasons()
- virtual QCString trInterfaces()
- virtual QCString trHeaderFiles()
- virtual QCString trBugsAndLimitations()
- virtual QCString trEnumerationValueDocumentation()
- virtual QCString trNoDescriptionAvailable()
-
-
-TranslatorDanish (TranslatorAdapter_1_3_9) 7 methods to implement
-----------------
-
- Implements 185 of the required methods.
-
- Missing methods (should be implemented):
-
- virtual QCString trOverloadText()
- virtual QCString trDirIndex()
- virtual QCString trDirDocumentation()
- virtual QCString trDirectories()
- virtual QCString trDirDescription()
- virtual QCString trDirReference(const char * dirName)
- virtual QCString trDir(bool first_capital, bool singular)
-
- Obsolete methods (should be removed, never used):
-
- virtual QCString trHeaderFilesDescription()
- virtual QCString trField(bool first_capital, bool singular)
- virtual QCString trPackageDocumentation()
- virtual QCString trSources()
- virtual QCString trReimplementedForInternalReasons()
- virtual QCString trInterfaces()
- virtual QCString trHeaderFiles()
- virtual QCString trBugsAndLimitations()
- virtual QCString trEnumerationValueDocumentation()
- virtual QCString trNoDescriptionAvailable()
-
-
-TranslatorDutch (Translator)
----------------
-
- Implements 192 of the required methods.
-
- Obsolete methods (should be removed, never used):
-
- QCString trHeaderFilesDescription()
- virtual QCString trField(bool first_capital, bool singular)
- QCString trPackageDocumentation()
- QCString trSources()
- QCString trReimplementedForInternalReasons()
- QCString trInterfaces()
- QCString trHeaderFiles()
- QCString trBugsAndLimitations()
- QCString trEnumerationValueDocumentation()
- QCString trNoDescriptionAvailable()
-
-
-TranslatorEnglish (Translator)
------------------
-
- Implements 192 of the required methods.
-
- Obsolete methods (should be removed, never used):
-
- virtual QCString trHeaderFilesDescription()
- virtual QCString trField(bool first_capital, bool singular)
- virtual QCString trPackageDocumentation()
- virtual QCString trSources()
- virtual QCString trReimplementedForInternalReasons()
- virtual QCString trInterfaces()
- virtual QCString trHeaderFiles()
- virtual QCString trBugsAndLimitations()
- virtual QCString trEnumerationValueDocumentation()
- virtual QCString trNoDescriptionAvailable()
-
-
-TranslatorFinnish (TranslatorEnglish) 95 methods to implement
------------------
-
- Implements 97 of the required methods.
-
- Missing methods (should be implemented):
-
- virtual QCString trPublicAttribs()
- virtual QCString trPropertyDocumentation()
- virtual QCString trMember(bool first_capital, bool singular)
- virtual QCString trPageIndex()
- virtual QCString trOverloadText()
- virtual QCString trSince()
- virtual QCString trEventDocumentation()
- virtual QCString trDirIndex()
- virtual QCString trRemarks()
- virtual QCString trProtectedTypes()
- virtual QCString trFile(bool first_capital, bool singular)
- virtual QCString trPackages()
- virtual QCString trInclByDepGraph()
- virtual QCString trRTFansicp()
- virtual QCString trImplementedFromList(int numEntries)
- virtual QCString trCollaborationDiagram(const char * clName)
- virtual QCString trPackageListDescription()
- virtual QCString trDefineValue()
- virtual QCString trPackageMembers()
- virtual QCString trStaticPackageMembers()
- virtual QCString trDirDocumentation()
- virtual QCString trPackage(const char * name)
- virtual QCString trPublicTypes()
- virtual QCString trSearchResultsTitle()
- virtual QCString trDirectories()
- virtual QCString trTest()
- virtual QCString trInvariant()
- virtual QCString trDeprecatedList()
- virtual QCString trGraphicalHierarchy()
- virtual QCString trPostcondition()
- virtual QCString trGotoGraphicalHierarchy()
- virtual QCString trPageAbbreviation()
- virtual QCString trDirDescription()
- virtual QCString trGotoSourceCode()
- virtual QCString trStaticPackageAttribs()
- virtual QCString trCallGraph()
- virtual QCString trStaticPublicAttribs()
- virtual QCString trCode()
- virtual QCString trTodo()
- virtual QCString trRTFCharSet()
- virtual QCString trInitialValue()
- virtual QCString trAlphabeticalList()
- virtual QCString trBug()
- virtual QCString trNote()
- virtual QCString trStaticPrivateAttribs()
- virtual QCString trAttention()
- virtual QCString trGotoTextualHierarchy()
- virtual QCString trPackageTypes()
- virtual QCString trMainPage()
- virtual QCString trDeprecated()
- virtual QCString trClass(bool first_capital, bool singular)
- virtual QCString trImplementedInList(int numEntries)
- virtual QCString trPrivateTypes()
- virtual QCString trInclDepGraph(const char * fName)
- virtual QCString trSearchResults(int numDocuments)
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType, bool single)
- virtual QCString trNamespaces()
- virtual QCString trPrivateAttribs()
- virtual QCString idLanguageCharset()
- virtual QCString trDefinedInSourceFile()
- virtual QCString trConstructorDocumentation()
- virtual QCString trLegend()
- virtual QCString trPackageAttribs()
- virtual QCString trSearchMatches()
- virtual QCString trClasses()
- virtual QCString trProtectedAttribs()
- virtual QCString trLegendTitle()
- virtual QCString trEvents()
- virtual QCString trGlobal(bool first_capital, bool singular)
- virtual QCString trDCOPMethods()
- virtual QCString latexLanguageSupportCommand()
- virtual QCString trBugList()
- virtual QCString trRTFGeneralIndex()
- virtual QCString trNamespace(bool first_capital, bool singular)
- virtual QCString trTestList()
- virtual QCString trPrecondition()
- virtual QCString trReturnValues()
- virtual QCString trReferences()
- virtual QCString trAuthor(bool first_capital, bool singular)
- virtual QCString trLegendDocs()
- virtual QCString trPackageList()
- virtual QCString trTodoList()
- virtual QCString trPage(bool first_capital, bool singular)
- virtual QCString trSourceFile(QCString & filename)
- virtual QCString trGotoDocumentation()
- virtual QCString trDefinedAtLineInSourceFile()
- virtual QCString trDirReference(const char * dirName)
- virtual QCString trDir(bool first_capital, bool singular)
- virtual QCString trSearchForIndex()
- virtual QCString trAll()
- virtual QCString trRTFTableOfContents()
- virtual QCString trGroup(bool first_capital, bool singular)
- virtual QCString trReferencedBy()
- virtual QCString trStaticProtectedAttribs()
- virtual QCString trProperties()
-
- Obsolete methods (should be removed, never used):
-
- QCString trHeaderFilesDescription()
- QCString trReimplementedForInternalReasons()
- QCString trFiles()
- virtual QCString updateNeededMessage()
- QCString trHeaderFiles()
- QCString trAuthors()
- QCString trBugsAndLimitations()
- QCString trEnumerationValueDocumentation()
- QCString trNoDescriptionAvailable()
-
-
-TranslatorFrench (Translator)
-----------------
-
- Implements 192 of the required methods.
-
- Obsolete methods (should be removed, never used):
-
- virtual QCString trHeaderFilesDescription()
- virtual QCString trField(bool first_capital, bool singular)
- virtual QCString trPackageDocumentation()
- virtual QCString trSources()
- virtual QCString trReimplementedForInternalReasons()
- virtual QCString trInterfaces()
- virtual QCString trHeaderFiles()
- virtual QCString trBugsAndLimitations()
- virtual QCString trEnumerationValueDocumentation()
- virtual QCString trNoDescriptionAvailable()
-
-
-TranslatorGreek (TranslatorAdapter_1_2_11) 26 methods to implement
----------------
-
- Implements 166 of the required methods.
-
- Missing methods (should be implemented):
-
- virtual QCString trOverloadText()
- virtual QCString trEventDocumentation()
- virtual QCString trDirIndex()
- virtual QCString trImplementedFromList(int numEntries)
- virtual QCString trPackageMembers()
- virtual QCString trStaticPackageMembers()
- virtual QCString trDirDocumentation()
- virtual QCString trSearchResultsTitle()
- virtual QCString trDirectories()
- virtual QCString trDeprecatedList()
- virtual QCString trDirDescription()
- virtual QCString trStaticPackageAttribs()
- virtual QCString trCallGraph()
- virtual QCString trPackageTypes()
- virtual QCString trImplementedInList(int numEntries)
- virtual QCString trSearchResults(int numDocuments)
- virtual QCString trPackageAttribs()
- virtual QCString trSearchMatches()
- virtual QCString trEvents()
- virtual QCString trReferences()
- virtual QCString trSourceFile(QCString & filename)
- virtual QCString trDirReference(const char * dirName)
- virtual QCString trDir(bool first_capital, bool singular)
- virtual QCString trSearchForIndex()
- virtual QCString trAll()
- virtual QCString trRTFTableOfContents()
-
- Obsolete methods (should be removed, never used):
-
- virtual QCString trHeaderFilesDescription()
- virtual QCString trField(bool first_capital, bool singular)
- virtual QCString trPackageDocumentation()
- virtual QCString trSources()
- virtual QCString trReimplementedForInternalReasons()
- virtual QCString trInterfaces()
- virtual QCString trHeaderFiles()
- virtual QCString trBugsAndLimitations()
- virtual QCString trEnumerationValueDocumentation()
- virtual QCString trNoDescriptionAvailable()
-
-
-TranslatorIndonesian (Translator)
---------------------
-
- Implements 192 of the required methods.
-
- Obsolete methods (should be removed, never used):
-
- virtual QCString trHeaderFilesDescription()
- virtual QCString trField(bool first_capital, bool)
- virtual QCString trPackageDocumentation()
- virtual QCString trSources()
- virtual QCString trReimplementedForInternalReasons()
- virtual QCString trInterfaces()
- virtual QCString trHeaderFiles()
- virtual QCString trBugsAndLimitations()
- virtual QCString trEnumerationValueDocumentation()
- virtual QCString trNoDescriptionAvailable()
-
-
-TranslatorJapanese (TranslatorAdapter_1_3_9) 7 methods to implement
-------------------
-
- Implements 185 of the required methods.
-
- Missing methods (should be implemented):
-
- virtual QCString trOverloadText()
- virtual QCString trDirIndex()
- virtual QCString trDirDocumentation()
- virtual QCString trDirectories()
- virtual QCString trDirDescription()
- virtual QCString trDirReference(const char * dirName)
- virtual QCString trDir(bool first_capital, bool singular)
-
- Obsolete methods (should be removed, never used):
-
- virtual QCString trHeaderFilesDescription()
- virtual QCString trField(bool first_capital, bool singular)
- virtual QCString trPackageDocumentation()
- virtual QCString trSources()
- virtual QCString trReimplementedForInternalReasons()
- virtual QCString trInterfaces()
- virtual QCString trHeaderFiles()
- virtual QCString trBugsAndLimitations()
- virtual QCString trEnumerationValueDocumentation()
- virtual QCString trNoDescriptionAvailable()
-
-
-TranslatorJapaneseEn (TranslatorEnglish) 187 methods to implement
---------------------
-
- Implements 5 of the required methods.
-
- This English-based translator implements the following methods:
-
- virtual QCString trRTFansicp()
- virtual QCString idLanguage()
- virtual QCString trRTFCharSet()
- virtual QCString idLanguageCharset()
- virtual QCString latexLanguageSupportCommand()
-
-
-TranslatorKoreanEn (TranslatorEnglish) 187 methods to implement
-------------------
-
- Implements 5 of the required methods.
-
- This English-based translator implements the following methods:
-
- virtual QCString trRTFansicp()
- virtual QCString idLanguage()
- virtual QCString trRTFCharSet()
- virtual QCString idLanguageCharset()
- virtual QCString latexLanguageSupportCommand()
-
-
-TranslatorNorwegian (TranslatorAdapter_1_3_9) 7 methods to implement
--------------------
-
- Implements 185 of the required methods.
-
- Missing methods (should be implemented):
-
- virtual QCString trOverloadText()
- virtual QCString trDirIndex()
- virtual QCString trDirDocumentation()
- virtual QCString trDirectories()
- virtual QCString trDirDescription()
- virtual QCString trDirReference(const char * dirName)
- virtual QCString trDir(bool first_capital, bool singular)
-
- Obsolete methods (should be removed, never used):
-
- virtual QCString trHeaderFilesDescription()
- virtual QCString trField(bool first_capital, bool singular)
- virtual QCString trPackageDocumentation()
- virtual QCString trSources()
- virtual QCString trReimplementedForInternalReasons()
- virtual QCString trInterfaces()
- virtual QCString trHeaderFiles()
- virtual QCString trBugsAndLimitations()
- virtual QCString trEnumerationValueDocumentation()
- virtual QCString trNoDescriptionAvailable()
-
-
-TranslatorPolish (Translator)
-----------------
-
- Implements 192 of the required methods.
-
- Obsolete methods (should be removed, never used):
-
- QCString trHeaderFilesDescription()
- virtual QCString trField(bool first_capital, bool singular)
- virtual QCString trPackageDocumentation()
- QCString trSources()
- QCString trReimplementedForInternalReasons()
- virtual QCString trInterfaces()
- QCString trHeaderFiles()
- QCString trBugsAndLimitations()
- QCString trEnumerationValueDocumentation()
- QCString trNoDescriptionAvailable()
-
-
-TranslatorPortuguese (TranslatorAdapter_1_3_3) 12 methods to implement
---------------------
-
- Implements 180 of the required methods.
-
- Missing methods (should be implemented):
-
- virtual QCString trOverloadText()
- virtual QCString trDirIndex()
- virtual QCString trDirDocumentation()
- virtual QCString trSearchResultsTitle()
- virtual QCString trDirectories()
- virtual QCString trDirDescription()
- virtual QCString trSearchResults(int numDocuments)
- virtual QCString trSearchMatches()
- virtual QCString trSourceFile(QCString & filename)
- virtual QCString trDirReference(const char * dirName)
- virtual QCString trDir(bool first_capital, bool singular)
- virtual QCString trSearchForIndex()
-
- Obsolete methods (should be removed, never used):
-
- QCString trHeaderFilesDescription()
- virtual QCString trField(bool first_capital, bool singular)
- virtual QCString trPackageDocumentation()
- virtual QCString trSources()
- QCString trReimplementedForInternalReasons()
- virtual QCString trInterfaces()
- QCString trHeaderFiles()
- QCString trBugsAndLimitations()
- QCString trEnumerationValueDocumentation()
- QCString trNoDescriptionAvailable()
-
-
-TranslatorRomanian (TranslatorAdapter_1_4_1) 1 method to implement
-------------------
-
- Implements 191 of the required methods.
-
- Missing methods (should be implemented):
-
- virtual QCString trOverloadText()
-
- Obsolete methods (should be removed, never used):
-
- virtual QCString trHeaderFilesDescription()
- virtual QCString trField(bool first_capital, bool singular)
- virtual QCString trPackageDocumentation()
- virtual QCString trSources()
- virtual QCString trReimplementedForInternalReasons()
- virtual QCString trInterfaces()
- virtual QCString trHeaderFiles()
- virtual QCString trBugsAndLimitations()
- virtual QCString trEnumerationValueDocumentation()
- virtual QCString trNoDescriptionAvailable()
-
-
-TranslatorSerbian (TranslatorAdapter_1_4_1) 1 method to implement
------------------
-
- Implements 191 of the required methods.
-
- Missing methods (should be implemented):
-
- virtual QCString trOverloadText()
-
- Obsolete methods (should be removed, never used):
-
- virtual QCString trHeaderFilesDescription()
- virtual QCString trField(bool first_capital, bool singular)
- virtual QCString trPackageDocumentation()
- virtual QCString trSources()
- virtual QCString trReimplementedForInternalReasons()
- virtual QCString trInterfaces()
- virtual QCString trHeaderFiles()
- virtual QCString trBugsAndLimitations()
- virtual QCString trEnumerationValueDocumentation()
- virtual QCString trNoDescriptionAvailable()
-
-
-TranslatorSlovak (TranslatorAdapter_1_2_18) 21 methods to implement
-----------------
-
- Implements 171 of the required methods.
-
- Missing methods (should be implemented):
-
- virtual QCString trOverloadText()
- virtual QCString trEventDocumentation()
- virtual QCString trDirIndex()
- virtual QCString trPackageMembers()
- virtual QCString trStaticPackageMembers()
- virtual QCString trDirDocumentation()
- virtual QCString trSearchResultsTitle()
- virtual QCString trDirectories()
- virtual QCString trDirDescription()
- virtual QCString trStaticPackageAttribs()
- virtual QCString trCallGraph()
- virtual QCString trPackageTypes()
- virtual QCString trSearchResults(int numDocuments)
- virtual QCString trPackageAttribs()
- virtual QCString trSearchMatches()
- virtual QCString trEvents()
- virtual QCString trSourceFile(QCString & filename)
- virtual QCString trDirReference(const char * dirName)
- virtual QCString trDir(bool first_capital, bool singular)
- virtual QCString trSearchForIndex()
- virtual QCString trAll()
-
- Obsolete methods (should be removed, never used):
-
- virtual QCString trHeaderFilesDescription()
- virtual QCString trField(bool first_capital, bool singular)
- virtual QCString trPackageDocumentation()
- virtual QCString trSources()
- virtual QCString trReimplementedForInternalReasons()
- virtual QCString trInterfaces()
- virtual QCString trHeaderFiles()
- virtual QCString trBugsAndLimitations()
- virtual QCString trEnumerationValueDocumentation()
- virtual QCString trNoDescriptionAvailable()
-
-
-TranslatorSlovene (TranslatorAdapter_1_2_16) 23 methods to implement
------------------
-
- Implements 169 of the required methods.
-
- Missing methods (should be implemented):
-
- virtual QCString trOverloadText()
- virtual QCString trEventDocumentation()
- virtual QCString trDirIndex()
- virtual QCString trPackageMembers()
- virtual QCString trStaticPackageMembers()
- virtual QCString trDirDocumentation()
- virtual QCString trSearchResultsTitle()
- virtual QCString trDirectories()
- virtual QCString trDeprecatedList()
- virtual QCString trDirDescription()
- virtual QCString trStaticPackageAttribs()
- virtual QCString trCallGraph()
- virtual QCString trPackageTypes()
- virtual QCString trSearchResults(int numDocuments)
- virtual QCString trPackageAttribs()
- virtual QCString trSearchMatches()
- virtual QCString trEvents()
- virtual QCString trSourceFile(QCString & filename)
- virtual QCString trDirReference(const char * dirName)
- virtual QCString trDir(bool first_capital, bool singular)
- virtual QCString trSearchForIndex()
- virtual QCString trAll()
- virtual QCString trRTFTableOfContents()
-
- Obsolete methods (should be removed, never used):
-
- QCString trHeaderFilesDescription()
- virtual QCString trField(bool first_capital, bool singular)
- virtual QCString trPackageDocumentation()
- QCString trSources()
- QCString trReimplementedForInternalReasons()
- virtual QCString trInterfaces()
- QCString trHeaderFiles()
- QCString trBugsAndLimitations()
- QCString trEnumerationValueDocumentation()
- QCString trNoDescriptionAvailable()
-
-
-TranslatorSpanish (TranslatorAdapter_1_3_8) 8 methods to implement
------------------
-
- Implements 184 of the required methods.
-
- Missing methods (should be implemented):
-
- virtual QCString trOverloadText()
- virtual QCString trDirIndex()
- virtual QCString trDirDocumentation()
- virtual QCString trDirectories()
- virtual QCString trDirDescription()
- virtual QCString trSourceFile(QCString & filename)
- virtual QCString trDirReference(const char * dirName)
- virtual QCString trDir(bool first_capital, bool singular)
-
- Obsolete methods (should be removed, never used):
-
- virtual QCString trHeaderFilesDescription()
- virtual QCString trField(bool first_capital, bool singular)
- virtual QCString trPackageDocumentation()
- virtual QCString trSources()
- virtual QCString trReimplementedForInternalReasons()
- virtual QCString trInterfaces()
- virtual QCString trHeaderFiles()
- virtual QCString trBugsAndLimitations()
- virtual QCString trEnumerationValueDocumentation()
- virtual QCString trNoDescriptionAvailable()
-
-
-TranslatorUkrainian (TranslatorAdapter_1_4_1) 1 method to implement
--------------------
-
- Implements 191 of the required methods.
-
- Missing methods (should be implemented):
-
- virtual QCString trOverloadText()
-
- Obsolete methods (should be removed, never used):
-
- virtual QCString trHeaderFilesDescription()
- virtual QCString trField(bool first_capital, bool singular)
- virtual QCString trPackageDocumentation()
- virtual QCString trSources()
- virtual QCString trReimplementedForInternalReasons()
- virtual QCString trInterfaces()
- virtual QCString trHeaderFiles()
- virtual QCString trBugsAndLimitations()
- virtual QCString trEnumerationValueDocumentation()
- virtual QCString trNoDescriptionAvailable() \ No newline at end of file
diff --git a/doc/trouble.doc b/doc/trouble.doc
deleted file mode 100644
index 312c163..0000000
--- a/doc/trouble.doc
+++ /dev/null
@@ -1,142 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-/*! \page trouble Troubleshooting
-
-<h2>Known problems:</h2>
-<ul>
-<li>If you have problems building doxygen from sources, please
- read \ref unix_problems "this section" first.
-<li>Doxygen is <em>not</em> a real compiler, it is only a lexical scanner.
- This means that it can and will not detect errors in your source code.
-<li>Since it impossible to test all possible code fragments, it is
- very well possible, that some valid piece of C/C++ code is not handled
- properly. If you find such a piece, please send it to me, so I can
- improve doxygen's parsing capabilities. Try to make the piece of code
- you send as small as possible, to help me narrow down the search.
-<li>Doxygen does not work properly if there are multiple classes, structs
- or unions with the same name in your code. It should not crash however,
- rather it should ignore all of the classes with the same name except one.
-<li>Some commands do not work inside the arguments of other commands.
- Inside a HTML link (i.e \<a href="..."\>...\<a\>) for instance
- other commands (including other HTML commands) do not work!
- The sectioning commands are an important exception.
-<li>Redundant braces can confuse doxygen in some cases.
- For example:
-\verbatim
- void f (int);
-\endverbatim
- is properly parsed as a function declaration, but
-\verbatim
- const int (a);
-\endverbatim
- is also seen as a function declaration with name
- <code>int</code>, because only the syntax is analysed,
- not the semantics. If the redundant braces can be detected, as in
-\verbatim
- int *(a[20]);
-\endverbatim
- then doxygen will remove the braces and correctly parse the result.
-<li>Not all names in code fragments that are included in the documentation
- are replaced by links (for instance when using \c SOURCE_BROWSER = \c YES)
- and links to overloaded members may point to the wrong member.
- This also holds for the "Referenced by" list that is generated for
- each function.
-
- For a part this is because the code parser isn't smart enough at the
- moment. I'll try to improve this in the future. But even with these
- improvements not everthing can be properly linked to the corresponding
- documentation, because of possible ambiguities or lack of
- information about the context in which the code fragment is found.
-<li>It is not possible to insert a non-member function f in a class A
- using the \\relates or \\relatesalso command, if class A already
- has a member with name f and the same argument list.
-<li>There is only very limited support for member specialization at the
- moment. It only works if there is a specialized template class as
- well.
-<li>Not all special commands are properly translated to RTF.
-<li>Version 1.8.6 of dot (and maybe earlier versions too) do not
- generate proper map files, causing the graphs that doxygen generates
- not to be properly clickable.
-<li>PHP only: Doxygen requires that all PHP statements (i.e. code) is
- wrapped in a functions/methods, otherwise you may run into parse problems.
-</ul>
-
-
-<h2>How to help</h2>
-The development of Doxygen highly depends on your input!
-
-If you are trying Doxygen let me know what you think of it (do you
-miss certain features?). Even if you decide not to use it, please let me
-know why.
-
-\anchor bug_reports
-<h2>How to report a bug</h2>
-
-Bugs are tracked in GNOME's <a href="http://bugzilla.gnome.org">bugzilla</a> database.
-Before submitting a
-<a href="http://bugzilla.gnome.org/enter_bug.cgi?product=doxygen">new bug</a>,
-first
-<a href="http://bugzilla.gnome.org/buglist.cgi?product=doxygen&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=NEEDINFO&bug_status=REOPENED&bug_status=VERIFIED&email1=&emailtype1=substring&emailassigned_to1=1&email2=&emailtype2=substring&emailreporter2=1&changedin=&chfieldfrom=&chfieldto=Now&chfieldvalue=&short_desc=&short_desc_type=substring&long_desc=&long_desc_type=substring&bug_file_loc=&bug_file_loc_type=substring&status_whiteboard=&status_whiteboard_type=substring&keywords=&keywords_type=anywords&op_sys_details=&op_sys_details_type=substring&version_details=&version_details_type=substring&cmdtype=doit&namedcmd=gnome-libs+past+20+days&newqueryname=&order=Reuse+same+sort+as+last+time&form_name=query">
-check</a> if the same bug has already been submitted by others.
-If you believe you have found a new bug,
-please <a href="http://bugzilla.gnome.org/enter_bug.cgi?product=doxygen">file it</a>.
-
-If you are unsure whether or not something is a bug, please ask help
-on the <a href="http://sourceforge.net/mail/?group_id=5971">users mailing list</a>
-first (subscription is required).
-
-If you send only a (vague) description of a bug, you are usually not very
-helpful and it will cost me much more time to figure out what you mean.
-In the worst-case your bug report may even be completely ignored by me, so
-always try to include the following information in your bug report:
-- The version of doxygen you are using (for instance 1.2.4, use
- <code>doxygen --version</code> if you are not sure).
-- The name and version number of your operating system (for instance
- SuSE Linux 6.4)
-- It is usually a good idea to send along the configuation file as well,
- but please use doxygen with the <code>-s</code> flag while generating it
- to keep it small (use <code>doxygen -s -u [configName]</code> to strip
- the comments from an existing config file).
-- The easiest (and often the only) way for me to fix bugs is if you can
- send me a small example demonstrating the problem you have, so I can
- reproduce it on my machine. Please make sure the example is valid
- source code (could potentially compile) and that the problem is really
- captured by the example (I often get examples that do not trigger the
- actual bug!). If you intend to send more than one file please zip or tar
- the files together into a single file for easier processing.
- When reporting a new bug you'll get a chance to attach a file to it
- immediately \e after opening the bug.
-
-You can (and are encouraged to) add a patch for a bug. If you do so
-please use PATCH as a keyword in the bug entry form.
-
-If you have ideas how to fix existing bugs and limitations please discuss them on
-the <a href="http://sourceforge.net/mail/?group_id=5971">developers mailing list</a>
-(subscription required). Patches can also be sent directly to dimitri@stack.nl if
-you prefer not to send them via the bug tracker or mailing list.
-
-For patches please use
-"diff -uN" or include the files you modified. If you send more than
-one file please tar or zip everything, so I only have to save and download
-one file.
-
-\htmlonly
-Return to the <a href="index.html">index</a>.
-\endhtmlonly
-
-*/
-
diff --git a/doc/xmlcmds.doc b/doc/xmlcmds.doc
deleted file mode 100644
index f6440ef..0000000
--- a/doc/xmlcmds.doc
+++ /dev/null
@@ -1,90 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-/*! \page 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
-<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.
-
-Here is the list of tags supported by doxygen:
-
-<ul>
-<li><tt>\<c\></tt> Identifies inline text that should be rendered as a
- piece of code. Similar to using <tt>\<tt\></tt>text<tt>\</tt\></tt>.
-<li><tt>\<code\></tt> Set one or more lines of source code or program output.
- Note that this command behaves like <tt>\\code ... \\endcode</tt>
- for C# code, but it behaves like the HTML equivalent
- <tt>\<code\>...\</code\></tt> for other languages.
-<li><tt>\<description\></tt> Part of a <tt>\<list\></tt> command, describes an item.
-<li><tt>\<example\></tt> Marks a block of text as an example, ignored by doxygen.
-<li><tt>\<exception cref="member"\></tt> Identifies the exception a
- method can throw.
-<li><tt>\<include\></tt> Can be used to import a piece of XML from an external
- file. Ignored by doxygen at the moment.
-<li><tt>\<item\></tt> List item. Can only be used inside a <tt>\<list\></tt> context.
-<li><tt>\<list type="type"\></tt> Starts a list, supported types are <tt>bullet</tt>
- or <tt>number</tt>. A list consists of a number of <tt>\<item\></tt> tags.
-<li><tt>\<para\></tt> Identifies a paragraph of text.
-<li><tt>\<param name="paramName"\></tt> Marks a piece of text as the documentation
- for parameter "paramName". Similar to
- using \ref cmdparam "\\param".
-<li><tt>\<paramref name="paramName"\></tt> Refers to a parameter with name
- "paramName". Similar to using \ref cmda "\\a".
-<li><tt>\<permission\></tt> Identifies the security accessibility of a member.
- Ignored by doygen.
-<li><tt>\<remarks\></tt> Identifies the detailed description.
-<li><tt>\<returns\></tt> Marks a piece of text as the return value of a
- function or method. Similar to using \ref cmdreturn "\\return".
-<li><tt>\<see cref="member"\></tt> Refers to a member. Similar to \ref cmdref "\\ref".
-<li><tt>\<seealso cref="member"\></tt> Starts a "See also" section referring
- to "member". Similar to using \ref cmdsa "\\sa" member.
-<li><tt>\<summary\></tt> Identifies the brief description.
- Similar to using \ref cmdbrief "\\brief".
-<li><tt>\<value\></tt> Identifies a property. Ignored by doxygen.
-</ul>
-
-Here is an example of a typical piece of code using some of the above commands:
-
-\code
-/// <summary>
-/// A search engine.
-/// </summary>
-class Engine
-{
- /// <summary>
- /// The Search method takes a series of parameters to specify the search criterion
- /// and returns a dataset containing the result set.
- /// </summary>
- /// <param name="connectionString">the connection string to connect to the
- /// database holding the content to search</param>
- /// <param name="maxRows">The maximum number of rows to
- /// return in the result set</param>
- /// <param name="searchString">The text that we are searching for</param>
- /// <returns>A DataSet instance containing the matching rows. It contains a maximum
- /// number of rows specified by the maxRows parameter</returns>
- public DataSet Search(string connectionString, int maxRows, int searchString)
- {
- DataSet ds = new DataSet();
- return ds;
- }
-}
-\endcode
-
-*/
-
diff --git a/examples/.cvsignore b/examples/.cvsignore
deleted file mode 100644
index f3c7a7c..0000000
--- a/examples/.cvsignore
+++ /dev/null
@@ -1 +0,0 @@
-Makefile
diff --git a/examples/Makefile.in b/examples/Makefile.in
deleted file mode 100644
index e0c591f..0000000
--- a/examples/Makefile.in
+++ /dev/null
@@ -1,112 +0,0 @@
-
-all: class/html/index.html \
- define/html/index.html \
- enum/html/index.html \
- file/html/index.html \
- func/html/index.html \
- page/html/index.html \
- relates/html/index.html \
- author/html/index.html \
- par/html/index.html \
- overload/html/index.html \
- example/html/index.html \
- include/html/index.html \
- qtstyle/html/index.html \
- jdstyle/html/index.html \
- structcmd/html/index.html \
- autolink/html/index.html \
- restypedef/html/index.html \
- afterdoc/html/index.html \
- template/html/index.html \
- tag/html/index.html \
- group/html/index.html \
- diagrams/html/index.html \
- memgrp/html/index.html \
- docstring/html/index.html \
- pyexample/html/index.html
-
-clean:
- rm -rf class define enum file func page relates author \
- par overload example include qtstyle jdstyle structcmd \
- autolink tag restypedef afterdoc template tag group diagrams \
- memgrp docstring pyexample
-
-class/html/index.html: class.h class.cfg
- $(DOXYGEN)/bin/doxygen class.cfg
-
-define/html/index.html: define.h define.cfg
- $(DOXYGEN)/bin/doxygen define.cfg
-
-enum/html/index.html: enum.h enum.cfg
- $(DOXYGEN)/bin/doxygen enum.cfg
-
-file/html/index.html: file.h file.cfg
- $(DOXYGEN)/bin/doxygen file.cfg
-
-func/html/index.html: func.h func.cfg
- $(DOXYGEN)/bin/doxygen func.cfg
-
-page/html/index.html: page.doc page.cfg
- $(DOXYGEN)/bin/doxygen page.cfg
-
-relates/html/index.html: relates.cpp relates.cfg
- $(DOXYGEN)/bin/doxygen relates.cfg
-
-author/html/index.html: author.cpp author.cfg
- $(DOXYGEN)/bin/doxygen author.cfg
-
-par/html/index.html: par.cpp par.cfg
- $(DOXYGEN)/bin/doxygen par.cfg
-
-overload/html/index.html: overload.cpp overload.cfg
- $(DOXYGEN)/bin/doxygen overload.cfg
-
-example/html/index.html: example.cpp example_test.cpp example.cfg
- $(DOXYGEN)/bin/doxygen example.cfg
-
-include/html/index.html: include.cpp example_test.cpp include.cfg
- $(DOXYGEN)/bin/doxygen include.cfg
-
-qtstyle/html/index.html: qtstyle.cpp qtstyle.cfg
- $(DOXYGEN)/bin/doxygen qtstyle.cfg
-
-jdstyle/html/index.html: jdstyle.cpp jdstyle.cfg
- $(DOXYGEN)/bin/doxygen jdstyle.cfg
-
-structcmd/html/index.html: structcmd.h structcmd.cfg
- $(DOXYGEN)/bin/doxygen structcmd.cfg
-
-autolink/html/index.html: autolink.cpp autolink.cfg
- $(DOXYGEN)/bin/doxygen autolink.cfg
-
-tag/html/index.html: tag.cpp tag.cfg example/html/index.html
- $(DOXYGEN)/bin/doxygen tag.cfg
-# sed -e "1,1s#perl#$(PERL)#g" tag/html/installdox >tag/html/installdox.perl
-# cd tag/html ; $(PERL) installdox.perl -lexample.tag@../../example/html
-
-restypedef/html/index.html: restypedef.cpp restypedef.cfg
- $(DOXYGEN)/bin/doxygen restypedef.cfg
-
-afterdoc/html/index.html: afterdoc.h afterdoc.cfg
- $(DOXYGEN)/bin/doxygen afterdoc.cfg
-
-template/html/index.html: templ.cpp templ.cfg
- $(DOXYGEN)/bin/doxygen templ.cfg
-
-group/html/index.html: group.cpp group.cfg
- $(DOXYGEN)/bin/doxygen group.cfg
-
-memgrp/html/index.html: memgrp.cpp memgrp.cfg
- $(DOXYGEN)/bin/doxygen memgrp.cfg
-
-pyexample/html/index.html: pyexample.py pyexample.cfg
- $(DOXYGEN)/bin/doxygen pyexample.cfg
-
-docstring/html/index.html: docstring.py docstring.cfg
- $(DOXYGEN)/bin/doxygen docstring.cfg
-
-diagrams/html/index.html: diagrams_a.h diagrams_b.h diagrams_c.h diagrams_d.h diagrams_e.h diagrams.cfg
-ifneq ($(HAVE_DOT),)
- $(DOXYGEN)/bin/doxygen diagrams.cfg
-endif
-
diff --git a/examples/Makefile.win.in b/examples/Makefile.win.in
deleted file mode 100644
index 86e2a94..0000000
--- a/examples/Makefile.win.in
+++ /dev/null
@@ -1,110 +0,0 @@
-DOXYDIR = ..\bin
-
-all: class/html/index.html \
- define/html/index.html \
- enum/html/index.html \
- file/html/index.html \
- func/html/index.html \
- page/html/index.html \
- relates/html/index.html \
- author/html/index.html \
- par/html/index.html \
- overload/html/index.html \
- example/html/index.html \
- include/html/index.html \
- qtstyle/html/index.html \
- jdstyle/html/index.html \
- structcmd/html/index.html \
- autolink/html/index.html \
- restypedef/html/index.html \
- afterdoc/html/index.html \
- template/html/index.html \
- tag/html/index.html \
- group/html/index.html \
- diagrams/html/index.html \
- memgrp/html/index.html \
- docstring/html/index.html \
- pyexample/html/index.html
-
-clean:
- deltree /y class define enum file pyexample docstring
- deltree /y func page relates author
- deltree /y par overload example include qtstyle
- deltree /y jdstyle structcmd autolink resdefine
- deltree /y restypedef afterdoc template tag group diagrams memgrp
-
-class/html/index.html: class.h class.cfg
- $(DOXYDIR)\doxygen class.cfg
-
-define/html/index.html: define.h define.cfg
- $(DOXYDIR)\doxygen define.cfg
-
-enum/html/index.html: enum.h enum.cfg
- $(DOXYDIR)\doxygen enum.cfg
-
-file/html/index.html: file.h file.cfg
- $(DOXYDIR)\doxygen file.cfg
-
-func/html/index.html: func.h func.cfg
- $(DOXYDIR)\doxygen func.cfg
-
-page/html/index.html: page.doc page.cfg
- $(DOXYDIR)\doxygen page.cfg
-
-relates/html/index.html: relates.cpp relates.cfg
- $(DOXYDIR)\doxygen relates.cfg
-
-author/html/index.html: author.cpp author.cfg
- $(DOXYDIR)\doxygen author.cfg
-
-par/html/index.html: par.cpp par.cfg
- $(DOXYDIR)\doxygen par.cfg
-
-overload/html/index.html: overload.cpp overload.cfg
- $(DOXYDIR)\doxygen overload.cfg
-
-example/html/index.html: example.cpp example_test.cpp example.cfg
- $(DOXYDIR)\doxygen example.cfg
-
-include/html/index.html: include.cpp example_test.cpp include.cfg
- $(DOXYDIR)\doxygen include.cfg
-
-qtstyle/html/index.html: qtstyle.cpp qtstyle.cfg
- $(DOXYDIR)\doxygen qtstyle.cfg
-
-jdstyle/html/index.html: jdstyle.cpp jdstyle.cfg
- $(DOXYDIR)\doxygen jdstyle.cfg
-
-structcmd/html/index.html: structcmd.h structcmd.cfg
- $(DOXYDIR)\doxygen structcmd.cfg
-
-autolink/html/index.html: autolink.cpp autolink.cfg
- $(DOXYDIR)\doxygen autolink.cfg
-
-tag/html/index.html: tag.cpp tag.cfg
- $(DOXYDIR)\doxygen tag.cfg
-
-restypedef/html/index.html: restypedef.cpp restypedef.cfg
- $(DOXYDIR)\doxygen restypedef.cfg
-
-afterdoc/html/index.html: afterdoc.h afterdoc.cfg
- $(DOXYDIR)\doxygen afterdoc.cfg
-
-template/html/index.html: templ.cpp templ.cfg
- $(DOXYDIR)\doxygen templ.cfg
-
-group/html/index.html: group.cpp group.cfg
- $(DOXYDIR)\doxygen group.cfg
-
-memgrp/html/index.html: memgrp.cpp memgrp.cfg
- $(DOXYDIR)\doxygen memgrp.cfg
-
-pyexample/html/index.html: pyexample.py pyexample.cfg
- $(DOXYDIR)\doxygen pyexample.cfg
-
-docstring/html/index.html: docstring.py docstring.cfg
- $(DOXYDIR)\doxygen docstring.cfg
-
-diagrams/html/index.html: diagrams_a.h diagrams_b.h diagrams_c.h diagrams_d.h diagrams_e.h diagrams.cfg
- $(DOXYDIR)\doxygen diagrams.cfg
-
diff --git a/examples/afterdoc.cfg b/examples/afterdoc.cfg
deleted file mode 100644
index 25e1358..0000000
--- a/examples/afterdoc.cfg
+++ /dev/null
@@ -1,9 +0,0 @@
-PROJECT_NAME = "AfterDocs"
-OUTPUT_DIRECTORY = afterdoc
-GENERATE_LATEX = NO
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
-INPUT = afterdoc.h
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
diff --git a/examples/afterdoc.h b/examples/afterdoc.h
deleted file mode 100644
index 907dabe..0000000
--- a/examples/afterdoc.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/*! A test class */
-
-class Test
-{
- public:
- /** An enum type.
- * The documentation block cannot be put after the enum!
- */
- enum EnumType
- {
- int EVal1, /**< enum value 1 */
- int EVal2 /**< enum value 2 */
- };
- void member(); //!< a member function.
-
- protected:
- int value; /*!< an integer value */
-};
diff --git a/examples/author.cfg b/examples/author.cfg
deleted file mode 100644
index f1db227..0000000
--- a/examples/author.cfg
+++ /dev/null
@@ -1,9 +0,0 @@
-PROJECT_NAME = "Author Command"
-OUTPUT_DIRECTORY = author
-GENERATE_LATEX = NO
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
-INPUT = author.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
diff --git a/examples/author.cpp b/examples/author.cpp
deleted file mode 100644
index 59cc7ab..0000000
--- a/examples/author.cpp
+++ /dev/null
@@ -1,14 +0,0 @@
-/*! \class WindowsNT
- * \brief Windows Nice Try.
- * \author Bill Gates
- * \author Several species of small furry animals gathered together
- * in a cave and grooving with a pict.
- * \version 4.0
- * \date 1996-1998
- * \bug It crashes a lot and requires huge amounts of memory.
- * \bug The class introduces the more bugs, the longer it is used.
- * \warning This class may explode in your face.
- * \warning If you inherit anything from this class, you're doomed.
- */
-
-class WindowsNT {};
diff --git a/examples/autolink.cfg b/examples/autolink.cfg
deleted file mode 100644
index 49367fc..0000000
--- a/examples/autolink.cfg
+++ /dev/null
@@ -1,9 +0,0 @@
-PROJECT_NAME = "Automatic link generation"
-OUTPUT_DIRECTORY = autolink
-GENERATE_LATEX = NO
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
-INPUT = autolink.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
diff --git a/examples/autolink.cpp b/examples/autolink.cpp
deleted file mode 100644
index e028f22..0000000
--- a/examples/autolink.cpp
+++ /dev/null
@@ -1,99 +0,0 @@
-/*! \file autolink.cpp
- Testing automatic link generation.
-
- A link to a member of the Test class: Test::member,
-
- More specific links to the each of the overloaded members:
- Test::member(int) and Test#member(int,int)
-
- A link to a protected member variable of Test: Test#var,
-
- A link to the global enumeration type #GlobEnum.
-
- A link to the define #ABS(x).
-
- A link to the destructor of the Test class: Test::~Test,
-
- A link to the typedef ::B.
-
- A link to the enumeration type Test::EType
-
- A link to some enumeration values Test::Val1 and ::GVal2
-*/
-
-/*!
- Since this documentation block belongs to the class Test no link to
- Test is generated.
-
- Two ways to link to a constructor are: #Test and Test().
-
- Links to the destructor are: #~Test and ~Test().
-
- A link to a member in this class: member().
-
- More specific links to the each of the overloaded members:
- member(int) and member(int,int).
-
- A link to the variable #var.
-
- A link to the global typedef ::B.
-
- A link to the global enumeration type #GlobEnum.
-
- A link to the define ABS(x).
-
- A link to a variable \link #var using another text\endlink as a link.
-
- A link to the enumeration type #EType.
-
- A link to some enumeration values: \link Test::Val1 Val1 \endlink and ::GVal1.
-
- And last but not least a link to a file: autolink.cpp.
-
- \sa Inside a see also section any word is checked, so EType,
- Val1, GVal1, ~Test and member will be replaced by links in HTML.
-*/
-
-class Test
-{
- public:
- Test(); //!< constructor
- ~Test(); //!< destructor
- void member(int); /**< A member function. Details. */
- void member(int,int); /**< An overloaded member function. Details */
-
- /** An enum type. More details */
- enum EType {
- Val1, /**< enum value 1 */
- Val2 /**< enum value 2 */
- };
-
- protected:
- int var; /**< A member variable */
-};
-
-/*! details. */
-Test::Test() { }
-
-/*! details. */
-Test::~Test() { }
-
-/*! A global variable. */
-int globVar;
-
-/*! A global enum. */
-enum GlobEnum {
- GVal1, /*!< global enum value 1 */
- GVal2 /*!< global enum value 2 */
- };
-
-/*!
- * A macro definition.
- */
-#define ABS(x) (((x)>0)?(x):-(x))
-
-typedef Test B;
-
-/*! \fn typedef Test B
- * A type definition.
- */
diff --git a/examples/class.cfg b/examples/class.cfg
deleted file mode 100644
index 99570b8..0000000
--- a/examples/class.cfg
+++ /dev/null
@@ -1,9 +0,0 @@
-PROJECT_NAME = "Class Command"
-OUTPUT_DIRECTORY = class
-GENERATE_LATEX = NO
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
-INPUT = class.h
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
diff --git a/examples/class.h b/examples/class.h
deleted file mode 100644
index e5a9121..0000000
--- a/examples/class.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/* A dummy class */
-
-class Test
-{
-};
-
-/*! \class Test class.h "inc/class.h"
- * \brief This is a test class.
- *
- * Some details about the Test class
- */
diff --git a/examples/define.cfg b/examples/define.cfg
deleted file mode 100644
index 30ed03f..0000000
--- a/examples/define.cfg
+++ /dev/null
@@ -1,10 +0,0 @@
-PROJECT_NAME = "Define Command"
-OUTPUT_DIRECTORY = define
-GENERATE_LATEX = NO
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
-INPUT = define.h
-ENABLE_PREPROCESSING = YES
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
diff --git a/examples/define.h b/examples/define.h
deleted file mode 100644
index c330447..0000000
--- a/examples/define.h
+++ /dev/null
@@ -1,18 +0,0 @@
-/*! \file define.h
- \brief testing defines
-
- This is to test the documentation of defines.
-*/
-
-/*!
- \def MAX(x,y)
- Computes the maximum of \a x and \a y.
-*/
-
-/*!
- Computes the absolute value of its argument \a x.
-*/
-#define ABS(x) (((x)>0)?(x):-(x))
-#define MAX(x,y) ((x)>(y)?(x):(y))
-#define MIN(x,y) ((x)>(y)?(y):(x))
- /*!< Computes the minimum of \a x and \a y. */
diff --git a/examples/diagrams.cfg b/examples/diagrams.cfg
deleted file mode 100644
index d343a66..0000000
--- a/examples/diagrams.cfg
+++ /dev/null
@@ -1,13 +0,0 @@
-PROJECT_NAME = "Diagrams"
-OUTPUT_DIRECTORY = diagrams
-HAVE_DOT = YES
-EXTRACT_ALL = YES
-GENERATE_LATEX = NO
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
-ENABLE_PREPROCESSING = YES
-INPUT = .
-FILE_PATTERNS = diagrams_*.h
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
diff --git a/examples/diagrams_a.h b/examples/diagrams_a.h
deleted file mode 100644
index 047a8ab..0000000
--- a/examples/diagrams_a.h
+++ /dev/null
@@ -1,4 +0,0 @@
-#ifndef _DIAGRAMS_A_H
-#define _DIAGRAMS_A_H
-class A { public: A *m_self; };
-#endif
diff --git a/examples/diagrams_b.h b/examples/diagrams_b.h
deleted file mode 100644
index 5fcd247..0000000
--- a/examples/diagrams_b.h
+++ /dev/null
@@ -1,5 +0,0 @@
-#ifndef _DIAGRAMS_B_H
-#define _DIAGRAMS_B_H
-class A;
-class B { public: A *m_a; };
-#endif
diff --git a/examples/diagrams_c.h b/examples/diagrams_c.h
deleted file mode 100644
index e4ec11d..0000000
--- a/examples/diagrams_c.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef _DIAGRAMS_C_H
-#define _DIAGRAMS_C_H
-#include "diagrams_c.h"
-class D;
-class C : public A { public: D *m_d; };
-#endif
diff --git a/examples/diagrams_d.h b/examples/diagrams_d.h
deleted file mode 100644
index 3e635ce..0000000
--- a/examples/diagrams_d.h
+++ /dev/null
@@ -1,7 +0,0 @@
-#ifndef _DIAGRAM_D_H
-#define _DIAGRAM_D_H
-#include "diagrams_a.h"
-#include "diagrams_b.h"
-class C;
-class D : virtual protected A, private B { public: C m_c; };
-#endif
diff --git a/examples/diagrams_e.h b/examples/diagrams_e.h
deleted file mode 100644
index 5282388..0000000
--- a/examples/diagrams_e.h
+++ /dev/null
@@ -1,5 +0,0 @@
-#ifndef _DIAGRAM_E_H
-#define _DIAGRAM_E_H
-#include "diagrams_d.h"
-class E : public D {};
-#endif
diff --git a/examples/docstring.cfg b/examples/docstring.cfg
deleted file mode 100644
index d185998..0000000
--- a/examples/docstring.cfg
+++ /dev/null
@@ -1,9 +0,0 @@
-PROJECT_NAME = "Python"
-OUTPUT_DIRECTORY = docstring
-GENERATE_LATEX = NO
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-OPTIMIZE_OUTPUT_JAVA = YES
-INPUT = docstring.py
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
diff --git a/examples/docstring.py b/examples/docstring.py
deleted file mode 100644
index ab185b6..0000000
--- a/examples/docstring.py
+++ /dev/null
@@ -1,26 +0,0 @@
-"""Documentation for this module.
-
-More details.
-"""
-
-def func():
- """Documentation for a function.
-
- More details.
- """
- pass
-
-class PyClass:
- """Documentation for a class.
-
- More details.
- """
-
- def __init__(self):
- """The constructor."""
- self._memVar = 0;
-
- def PyMethod(self):
- """Documentation for a method."""
- pass
-
diff --git a/examples/enum.cfg b/examples/enum.cfg
deleted file mode 100644
index 05703cc..0000000
--- a/examples/enum.cfg
+++ /dev/null
@@ -1,9 +0,0 @@
-PROJECT_NAME = "Enum Command"
-OUTPUT_DIRECTORY = enum
-GENERATE_LATEX = NO
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
-INPUT = enum.h
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
diff --git a/examples/enum.h b/examples/enum.h
deleted file mode 100644
index 4c54fab..0000000
--- a/examples/enum.h
+++ /dev/null
@@ -1,24 +0,0 @@
-class Test
-{
- public:
- enum TEnum { Val1, Val2 };
-
- /*! Another enum, with inline docs */
- enum AnotherEnum
- {
- V1, /*!< value 1 */
- V2 /*!< value 2 */
- };
-};
-
-/*! \class Test
- * The class description.
- */
-
-/*! \enum Test::TEnum
- * A description of the enum type.
- */
-
-/*! \var Test::TEnum Test::Val1
- * The description of the first enum value.
- */
diff --git a/examples/example.cfg b/examples/example.cfg
deleted file mode 100644
index 1815a76..0000000
--- a/examples/example.cfg
+++ /dev/null
@@ -1,11 +0,0 @@
-PROJECT_NAME = "Example Command"
-OUTPUT_DIRECTORY = example
-GENERATE_TAGFILE = example.tag
-GENERATE_LATEX = NO
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
-INPUT = example.cpp
-EXAMPLE_PATH = example_test.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
diff --git a/examples/example.cpp b/examples/example.cpp
deleted file mode 100644
index 230d6ec..0000000
--- a/examples/example.cpp
+++ /dev/null
@@ -1,19 +0,0 @@
-/** A Test class.
- * More details about this class.
- */
-
-class Test
-{
- public:
- /** An example member function.
- * More details about this function.
- */
- void example();
-};
-
-void Test::example() {}
-
-/** \example example_test.cpp
- * This is an example of how to use the Test class.
- * More details about this example.
- */
diff --git a/examples/example.tag b/examples/example.tag
deleted file mode 100644
index c67e49a..0000000
--- a/examples/example.tag
+++ /dev/null
@@ -1,14 +0,0 @@
-<?xml version='1.0' encoding='ISO-8859-1' standalone='yes' ?>
-<tagfile>
- <compound kind="class">
- <name>Test</name>
- <filename>class_test.html</filename>
- <member kind="function">
- <type>void</type>
- <name>example</name>
- <anchorfile>class_test.html</anchorfile>
- <anchor>example_28_29</anchor>
- <arglist>()</arglist>
- </member>
- </compound>
-</tagfile>
diff --git a/examples/example_test.cpp b/examples/example_test.cpp
deleted file mode 100644
index a7e1643..0000000
--- a/examples/example_test.cpp
+++ /dev/null
@@ -1,5 +0,0 @@
-void main()
-{
- Test t;
- t.example();
-}
diff --git a/examples/file.cfg b/examples/file.cfg
deleted file mode 100644
index be0ecfb..0000000
--- a/examples/file.cfg
+++ /dev/null
@@ -1,9 +0,0 @@
-PROJECT_NAME = "File Command"
-OUTPUT_DIRECTORY = file
-GENERATE_LATEX = NO
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
-INPUT = file.h
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
diff --git a/examples/file.h b/examples/file.h
deleted file mode 100644
index 8dff6cb..0000000
--- a/examples/file.h
+++ /dev/null
@@ -1,10 +0,0 @@
-/** \file file.h
- * A brief file description.
- * A more elaborated file description.
- */
-
-/**
- * A global integer value.
- * More details about this value.
- */
-extern int globalValue;
diff --git a/examples/func.cfg b/examples/func.cfg
deleted file mode 100644
index 6071ac7..0000000
--- a/examples/func.cfg
+++ /dev/null
@@ -1,9 +0,0 @@
-PROJECT_NAME = "Fn Command"
-OUTPUT_DIRECTORY = func
-GENERATE_LATEX = NO
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
-INPUT = func.h
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
diff --git a/examples/func.h b/examples/func.h
deleted file mode 100644
index b335448..0000000
--- a/examples/func.h
+++ /dev/null
@@ -1,21 +0,0 @@
-class Test
-{
- public:
- const char *member(char,int) throw(std::out_of_range);
-};
-
-const char *Test::member(char c,int n) throw(std::out_of_range) {}
-
-/*! \class Test
- * \brief Test class.
- *
- * Details about Test.
- */
-
-/*! \fn const char *Test::member(char c,int n)
- * \brief A member function.
- * \param c a character.
- * \param n an integer.
- * \exception std::out_of_range parameter is out of range.
- * \return a character pointer.
- */
diff --git a/examples/group.cfg b/examples/group.cfg
deleted file mode 100644
index f37ebd6..0000000
--- a/examples/group.cfg
+++ /dev/null
@@ -1,9 +0,0 @@
-PROJECT_NAME = "Grouping"
-OUTPUT_DIRECTORY = group
-GENERATE_LATEX = NO
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
-INPUT = group.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
diff --git a/examples/group.cpp b/examples/group.cpp
deleted file mode 100644
index b120b90..0000000
--- a/examples/group.cpp
+++ /dev/null
@@ -1,88 +0,0 @@
-/** @defgroup group1 The First Group
- * This is the first group
- * @{
- */
-
-/** @brief class C1 in group 1 */
-class C1 {};
-
-/** @brief class C2 in group 1 */
-class C2 {};
-
-/** function in group 1 */
-void func() {}
-
-/** @} */ // end of group1
-
-/**
- * @defgroup group2 The Second Group
- * This is the second group
- */
-
-/** @defgroup group3 The Third Group
- * This is the third group
- */
-
-/** @defgroup group4 The Fourth Group
- * @ingroup group3
- * Group 4 is a subgroup of group 3
- */
-
-/**
- * @ingroup group2
- * @brief class C3 in group 2
- */
-class C3 {};
-
-/** @ingroup group2
- * @brief class C4 in group 2
- */
-class C4 {};
-
-/** @ingroup group3
- * @brief class C5 in @link group3 the third group@endlink.
- */
-class C5 {};
-
-/** @ingroup group1 group2 group3 group4
- * namespace N1 is in four groups
- * @sa @link group1 The first group@endlink, group2, group3, group4
- *
- * Also see @ref mypage2
- */
-namespace N1 {};
-
-/** @file
- * @ingroup group3
- * @brief this file in group 3
- */
-
-/** @defgroup group5 The Fifth Group
- * This is the fifth group
- * @{
- */
-
-/** @page mypage1 This is a section in group 5
- * Text of the first section
- */
-
-/** @page mypage2 This is another section in group 5
- * Text of the second section
- */
-
-/** @} */ // end of group5
-
-/** @addtogroup group1
- *
- * More documentation for the first group.
- * @{
- */
-
-/** another function in group 1 */
-void func2() {}
-
-/** yet another function in group 1 */
-void func3() {}
-
-/** @} */ // end of group1
-
diff --git a/examples/include.cfg b/examples/include.cfg
deleted file mode 100644
index 20c11c0..0000000
--- a/examples/include.cfg
+++ /dev/null
@@ -1,10 +0,0 @@
-PROJECT_NAME = "Include Command"
-OUTPUT_DIRECTORY = include
-GENERATE_LATEX = NO
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
-INPUT = include.cpp
-EXAMPLE_PATH = example_test.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
diff --git a/examples/include.cpp b/examples/include.cpp
deleted file mode 100644
index c50ab96..0000000
--- a/examples/include.cpp
+++ /dev/null
@@ -1,22 +0,0 @@
-
-/*! A test class. */
-
-class Test
-{
- public:
- /// a member function
- void example();
-};
-
-/*! \page example
- * \dontinclude example_test.cpp
- * Our main function starts like this:
- * \skip main
- * \until {
- * First we create a object \c t of the Test class.
- * \skipline Test
- * Then we call the example member function
- * \line example
- * After that our little test routine ends.
- * \line }
- */
diff --git a/examples/jdstyle.cfg b/examples/jdstyle.cfg
deleted file mode 100644
index c79a551..0000000
--- a/examples/jdstyle.cfg
+++ /dev/null
@@ -1,9 +0,0 @@
-PROJECT_NAME = "JavaDoc Style"
-OUTPUT_DIRECTORY = jdstyle
-GENERATE_LATEX = NO
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
-INPUT = jdstyle.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
diff --git a/examples/jdstyle.cpp b/examples/jdstyle.cpp
deleted file mode 100644
index bd8b9a7..0000000
--- a/examples/jdstyle.cpp
+++ /dev/null
@@ -1,66 +0,0 @@
-/**
- * A test class. A more elaborate class description.
- */
-
-class Test
-{
- public:
-
- /**
- * An enum.
- * More detailed enum description.
- */
-
- enum TEnum {
- TVal1, /**< enum value TVal1. */
- TVal2, /**< enum value TVal2. */
- TVal3 /**< enum value TVal3. */
- }
- *enumPtr, /**< enum pointer. Details. */
- enumVar; /**< enum variable. Details. */
-
- /**
- * A constructor.
- * A more elaborate description of the constructor.
- */
- Test();
-
- /**
- * A destructor.
- * A more elaborate description of the destructor.
- */
- ~Test();
-
- /**
- * a normal member taking two arguments and returning an integer value.
- * @param a an integer argument.
- * @param s a constant character pointer.
- * @see Test()
- * @see ~Test()
- * @see testMeToo()
- * @see publicVar()
- * @return The test results
- */
- int testMe(int a,const char *s);
-
- /**
- * A pure virtual member.
- * @see testMe()
- * @param c1 the first argument.
- * @param c2 the second argument.
- */
- virtual void testMeToo(char c1,char c2) = 0;
-
- /**
- * a public variable.
- * Details.
- */
- int publicVar;
-
- /**
- * a function variable.
- * Details.
- */
- int (*handler)(int a,int b);
-};
-
diff --git a/examples/memgrp.cfg b/examples/memgrp.cfg
deleted file mode 100644
index ee7545b..0000000
--- a/examples/memgrp.cfg
+++ /dev/null
@@ -1,10 +0,0 @@
-PROJECT_NAME = "Member Grouping"
-OUTPUT_DIRECTORY = memgrp
-GENERATE_LATEX = NO
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
-INPUT = memgrp.cpp
-QUIET = YES
-DISTRIBUTE_GROUP_DOC = YES
-JAVADOC_AUTOBRIEF = YES
diff --git a/examples/memgrp.cpp b/examples/memgrp.cpp
deleted file mode 100644
index 394cdbc..0000000
--- a/examples/memgrp.cpp
+++ /dev/null
@@ -1,41 +0,0 @@
-/** A class. Details */
-class Test
-{
- public:
- //@{
- /** Same documentation for both members. Details */
- void func1InGroup1();
- void func2InGroup1();
- //@}
-
- /** Function without group. Details. */
- void ungroupedFunction();
- void func1InGroup2();
- protected:
- void func2InGroup2();
-};
-
-void Test::func1InGroup1() {}
-void Test::func2InGroup1() {}
-
-/** @name Group2
- * Description of group 2.
- */
-//@{
-/** Function 2 in group 2. Details. */
-void Test::func2InGroup2() {}
-/** Function 1 in group 2. Details. */
-void Test::func1InGroup2() {}
-//@}
-
-/*! \file
- * docs for this file
- */
-
-//@{
-//! one description for all members of this group
-//! (because DISTRIBUTE_GROUP_DOC is YES in the config file)
-#define A 1
-#define B 2
-void glob_func();
-//@}
diff --git a/examples/overload.cfg b/examples/overload.cfg
deleted file mode 100644
index ee6cfc9..0000000
--- a/examples/overload.cfg
+++ /dev/null
@@ -1,10 +0,0 @@
-PROJECT_NAME = "Overloaded Command"
-OUTPUT_DIRECTORY = overload
-GENERATE_LATEX = NO
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
-SORT_MEMBER_DOCS = NO
-INPUT = overload.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
diff --git a/examples/overload.cpp b/examples/overload.cpp
deleted file mode 100644
index 02bcced..0000000
--- a/examples/overload.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-class Test
-{
- public:
- void drawRect(int,int,int,int);
- void drawRect(const Rect &r);
-};
-
-void Test::drawRect(int x,int y,int w,int h) {}
-void Test::drawRect(const Rect &r) {}
-
-/*! \class Test
- * \brief A short description.
- *
- * More text.
- */
-
-/*! \fn void Test::drawRect(int x,int y,int w,int h)
- * This command draws a rectangle with a left upper corner at ( \a x , \a y ),
- * width \a w and height \a h.
- */
-
-/*!
- * \overload void Test::drawRect(const Rect &r)
- */
-
diff --git a/examples/page.cfg b/examples/page.cfg
deleted file mode 100644
index 7dd9ee2..0000000
--- a/examples/page.cfg
+++ /dev/null
@@ -1,9 +0,0 @@
-PROJECT_NAME = "Page Command"
-OUTPUT_DIRECTORY = page
-GENERATE_LATEX = NO
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
-INPUT = page.doc
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
diff --git a/examples/page.doc b/examples/page.doc
deleted file mode 100644
index 747a4b8..0000000
--- a/examples/page.doc
+++ /dev/null
@@ -1,14 +0,0 @@
-/*! \page page1 A documentation page
- Leading text.
- \section sec An example section
- This page contains the subsections \ref subsection1 and \ref subsection2.
- For more info see page \ref page2.
- \subsection subsection1 The first subsection
- Text.
- \subsection subsection2 The second subsection
- More text.
-*/
-
-/*! \page page2 Another page
- Even more info.
-*/
diff --git a/examples/par.cfg b/examples/par.cfg
deleted file mode 100644
index 299eee8..0000000
--- a/examples/par.cfg
+++ /dev/null
@@ -1,9 +0,0 @@
-PROJECT_NAME = "Par Command"
-OUTPUT_DIRECTORY = par
-GENERATE_LATEX = NO
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
-INPUT = par.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
diff --git a/examples/par.cpp b/examples/par.cpp
deleted file mode 100644
index 6fd2c4e..0000000
--- a/examples/par.cpp
+++ /dev/null
@@ -1,20 +0,0 @@
-/*! \class Test
- * Normal text.
- *
- * \par User defined paragraph:
- * Contents of the paragraph.
- *
- * \par
- * New paragraph under the same heading.
- *
- * \note
- * This note consists of two paragraphs.
- * This is the first paragraph.
- *
- * \par
- * And this is the second paragraph.
- *
- * More normal text.
- */
-
-class Test {};
diff --git a/examples/pyexample.cfg b/examples/pyexample.cfg
deleted file mode 100644
index c6fc3fa..0000000
--- a/examples/pyexample.cfg
+++ /dev/null
@@ -1,9 +0,0 @@
-PROJECT_NAME = "Python"
-OUTPUT_DIRECTORY = pyexample
-GENERATE_LATEX = NO
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-OPTIMIZE_OUTPUT_JAVA = YES
-INPUT = pyexample.py
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
diff --git a/examples/pyexample.py b/examples/pyexample.py
deleted file mode 100644
index de04c28..0000000
--- a/examples/pyexample.py
+++ /dev/null
@@ -1,29 +0,0 @@
-## Documentation for this module.
-#
-# More details.
-
-## Documentation for a function.
-#
-# More details.
-def func():
- pass
-
-## Documentation for a class.
-#
-# More details.
-class PyClass:
-
- ## The constructor.
- def __init__(self):
- self._memVar = 0;
-
- ## Documentation for a method.
- # @param self The object pointer.
- def PyMethod(self):
- pass
-
- ## A class variable.
- classVar = 0;
-
- ## @var _memVar
- # a member variable
diff --git a/examples/qtstyle.cfg b/examples/qtstyle.cfg
deleted file mode 100644
index 741b42b..0000000
--- a/examples/qtstyle.cfg
+++ /dev/null
@@ -1,9 +0,0 @@
-PROJECT_NAME = "Qt Style"
-OUTPUT_DIRECTORY = qtstyle
-GENERATE_LATEX = NO
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
-INPUT = qtstyle.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
diff --git a/examples/qtstyle.cpp b/examples/qtstyle.cpp
deleted file mode 100644
index e24d541..0000000
--- a/examples/qtstyle.cpp
+++ /dev/null
@@ -1,65 +0,0 @@
-//! A test class.
-/*!
- A more elaborate class description.
-*/
-
-class Test
-{
- public:
-
- //! An enum.
- /*! More detailed enum description. */
- enum TEnum {
- TVal1, /*!< Enum value TVal1. */
- TVal2, /*!< Enum value TVal2. */
- TVal3 /*!< Enum value TVal3. */
- }
- //! Enum pointer.
- /*! Details. */
- *enumPtr,
- //! Enum variable.
- /*! Details. */
- enumVar;
-
- //! A constructor.
- /*!
- A more elaborate description of the constructor.
- */
- Test();
-
- //! A destructor.
- /*!
- A more elaborate description of the destructor.
- */
- ~Test();
-
- //! A normal member taking two arguments and returning an integer value.
- /*!
- \param a an integer argument.
- \param s a constant character pointer.
- \return The test results
- \sa Test(), ~Test(), testMeToo() and publicVar()
- */
- int testMe(int a,const char *s);
-
- //! A pure virtual member.
- /*!
- \sa testMe()
- \param c1 the first argument.
- \param c2 the second argument.
- */
- virtual void testMeToo(char c1,char c2) = 0;
-
- //! A public variable.
- /*!
- Details.
- */
- int publicVar;
-
- //! A function variable.
- /*!
- Details.
- */
- int (*handler)(int a,int b);
-};
-
diff --git a/examples/relates.cfg b/examples/relates.cfg
deleted file mode 100644
index 7eb8f22..0000000
--- a/examples/relates.cfg
+++ /dev/null
@@ -1,9 +0,0 @@
-PROJECT_NAME = "Relates Command"
-OUTPUT_DIRECTORY = relates
-GENERATE_LATEX = NO
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
-INPUT = relates.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
diff --git a/examples/relates.cpp b/examples/relates.cpp
deleted file mode 100644
index c6f7dc9..0000000
--- a/examples/relates.cpp
+++ /dev/null
@@ -1,23 +0,0 @@
-/*!
- * A String class.
- */
-
-class String
-{
- friend int strcmp(const String &,const String &);
-};
-
-/*!
- * Compares two strings.
- */
-
-int strcmp(const String &s1,const String &s2)
-{
-}
-
-/*! \relates String
- * A string debug function.
- */
-void stringDebug()
-{
-}
diff --git a/examples/restypedef.cfg b/examples/restypedef.cfg
deleted file mode 100644
index 5c2214f..0000000
--- a/examples/restypedef.cfg
+++ /dev/null
@@ -1,9 +0,0 @@
-PROJECT_NAME = "Resolving Typedefs"
-OUTPUT_DIRECTORY = restypedef
-GENERATE_LATEX = NO
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
-INPUT = restypedef.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
diff --git a/examples/restypedef.cpp b/examples/restypedef.cpp
deleted file mode 100644
index 923cf70..0000000
--- a/examples/restypedef.cpp
+++ /dev/null
@@ -1,25 +0,0 @@
-/*! \file restypedef.cpp
- * An example of resolving typedefs.
- */
-
-/*! \struct CoordStruct
- * A coordinate pair.
- */
-struct CoordStruct
-{
- /*! The x coordinate */
- float x;
- /*! The y coordinate */
- float y;
-};
-
-/*! Creates a type name for CoordStruct */
-typedef CoordStruct Coord;
-
-/*!
- * This function returns the addition of \a c1 and \a c2, i.e:
- * (c1.x+c2.x,c1.y+c2.y)
- */
-Coord add(Coord c1,Coord c2)
-{
-}
diff --git a/examples/structcmd.cfg b/examples/structcmd.cfg
deleted file mode 100644
index a3d70bf..0000000
--- a/examples/structcmd.cfg
+++ /dev/null
@@ -1,9 +0,0 @@
-PROJECT_NAME = "Structural commands"
-OUTPUT_DIRECTORY = structcmd
-GENERATE_LATEX = NO
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
-INPUT = structcmd.h
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
diff --git a/examples/structcmd.h b/examples/structcmd.h
deleted file mode 100644
index 3e27029..0000000
--- a/examples/structcmd.h
+++ /dev/null
@@ -1,57 +0,0 @@
-/*! \file structcmd.h
- \brief A Documented file.
-
- Details.
-*/
-
-/*! \def MAX(a,b)
- \brief A macro that returns the maximum of \a a and \a b.
-
- Details.
-*/
-
-/*! \var typedef unsigned int UINT32
- \brief A type definition for a .
-
- Details.
-*/
-
-/*! \var int errno
- \brief Contains the last error code.
-
- \warning Not thread safe!
-*/
-
-/*! \fn int open(const char *pathname,int flags)
- \brief Opens a file descriptor.
-
- \param pathname The name of the descriptor.
- \param flags Opening flags.
-*/
-
-/*! \fn int close(int fd)
- \brief Closes the file descriptor \a fd.
- \param fd The descriptor to close.
-*/
-
-/*! \fn size_t write(int fd,const char *buf, size_t count)
- \brief Writes \a count bytes from \a buf to the filedescriptor \a fd.
- \param fd The descriptor to write to.
- \param buf The data buffer to write.
- \param count The number of bytes to write.
-*/
-
-/*! \fn int read(int fd,char *buf,size_t count)
- \brief Read bytes from a file descriptor.
- \param fd The descriptor to read from.
- \param buf The buffer to read into.
- \param count The number of bytes to read.
-*/
-
-#define MAX(a,b) (((a)>(b))?(a):(b))
-typedef unsigned int UINT32;
-int errno;
-int open(const char *,int);
-int close(int);
-size_t write(int,const char *, size_t);
-int read(int,char *,size_t);
diff --git a/examples/tag.cfg b/examples/tag.cfg
deleted file mode 100644
index 9e79152..0000000
--- a/examples/tag.cfg
+++ /dev/null
@@ -1,11 +0,0 @@
-PROJECT_NAME = "Tag Files"
-OUTPUT_DIRECTORY = tag
-GENERATE_LATEX = NO
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
-INPUT = tag.cpp
-TAGFILES = example.tag=../../example/html
-PERL_PATH = perl
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
diff --git a/examples/tag.cpp b/examples/tag.cpp
deleted file mode 100644
index 6497dd4..0000000
--- a/examples/tag.cpp
+++ /dev/null
@@ -1,9 +0,0 @@
-/*! A class that is inherited from the external class Test.
-*/
-
-class Tag : public Test
-{
- public:
- /*! an overloaded member. */
- void example();
-};
diff --git a/examples/templ.cfg b/examples/templ.cfg
deleted file mode 100644
index 4d85734..0000000
--- a/examples/templ.cfg
+++ /dev/null
@@ -1,9 +0,0 @@
-PROJECT_NAME = "Template Test"
-OUTPUT_DIRECTORY = template
-GENERATE_LATEX = NO
-GENERATE_MAN = NO
-GENERATE_RTF = NO
-CASE_SENSE_NAMES = NO
-INPUT = templ.cpp
-QUIET = YES
-JAVADOC_AUTOBRIEF = YES
diff --git a/examples/templ.cpp b/examples/templ.cpp
deleted file mode 100644
index 9ed48fb..0000000
--- a/examples/templ.cpp
+++ /dev/null
@@ -1,35 +0,0 @@
-
-/*! A template class */
-template<class T,int i=100> class Test
-{
- public:
- Test();
- Test(const Test &);
-};
-
-/*! complete specialization */
-template<> class Test<void *,200>
-{
- public:
- Test();
-};
-
-/*! A partial template specialization */
-template<class T> class Test<T *> : public Test<void *,200>
-{
- public:
- Test();
-};
-
-/*! The constructor of the template class*/
-template<class T,int i> Test<T,i>::Test() {}
-
-/*! The copy constructor */
-template<class T,int i> Test<T,i>::Test(const Test &t) {}
-
-/*! The constructor of the partial specilization */
-template<class T> Test<T *>::Test() {}
-
-/*! The constructor of the specilization */
-template<> Test<void *,200>::Test() {}
-
diff --git a/libmd5/.cvsignore b/libmd5/.cvsignore
deleted file mode 100644
index 24c74d2..0000000
--- a/libmd5/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-Makefile
-libmd5.pro
-Makefile.libmd5
diff --git a/libmd5/Makefile.in b/libmd5/Makefile.in
deleted file mode 100644
index 5f71b11..0000000
--- a/libmd5/Makefile.in
+++ /dev/null
@@ -1,16 +0,0 @@
-all: Makefile.libmd5
- $(MAKE) -f Makefile.libmd5
-
-clean: Makefile.libmd5
- $(MAKE) -f Makefile.libmd5 clean
-
-distclean: clean
- $(RM) -f Makefile.libmd5 libmd5.pro Makefile
-
-tmake:
- $(ENV) $(PERL) $(TMAKE) libmd5.pro >Makefile.libmd5
-
-Makefile.libmd5: libmd5.pro
- $(ENV) $(PERL) $(TMAKE) libmd5.pro >Makefile.libmd5
-
-install:
diff --git a/libmd5/libmd5.pro.in b/libmd5/libmd5.pro.in
deleted file mode 100644
index 8cf7118..0000000
--- a/libmd5/libmd5.pro.in
+++ /dev/null
@@ -1,10 +0,0 @@
-TEMPLATE = lib
-CONFIG = warn_on staticlib $extraopts
-HEADERS = md5.h md5_loc.h
-SOURCES = md5.c
-win32:INCLUDEPATH += .
-win32-g++:TMAKE_CFLAGS += -D__CYGWIN__ -DALL_STATIC
-DESTDIR = ../lib
-TARGET = md5
-OBJECTS_DIR = ../objects
-
diff --git a/libmd5/md5.c b/libmd5/md5.c
deleted file mode 100644
index 0945b28..0000000
--- a/libmd5/md5.c
+++ /dev/null
@@ -1,352 +0,0 @@
-/* MD5C.C - RSA Data Security, Inc., MD5 message-digest algorithm
- */
-
-/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
- rights reserved.
-
- License to copy and use this software is granted provided that it
- is identified as the "RSA Data Security, Inc. MD5 Message-Digest
- Algorithm" in all material mentioning or referencing this software
- or this function.
-
- License is also granted to make and use derivative works provided
- that such works are identified as "derived from the RSA Data
- Security, Inc. MD5 Message-Digest Algorithm" in all material
- mentioning or referencing the derived work.
-
- RSA Data Security, Inc. makes no representations concerning either
- the merchantability of this software or the suitability of this
- software for any particular purpose. It is provided "as is"
- without express or implied warranty of any kind.
-
- These notices must be retained in any copies of any part of this
- documentation and/or software.
- */
-
-#include "md5_loc.h"
-#include "md5.h"
-
-/* Constants for MD5Transform routine.
- */
-#define S11 7
-#define S12 12
-#define S13 17
-#define S14 22
-#define S21 5
-#define S22 9
-#define S23 14
-#define S24 20
-#define S31 4
-#define S32 11
-#define S33 16
-#define S34 23
-#define S41 6
-#define S42 10
-#define S43 15
-#define S44 21
-
-static void MD5Transform (UINT4 [4], const unsigned char [64]);
-static void Encode(unsigned char *, UINT4 *, unsigned int);
-static void Decode (UINT4 *, const unsigned char *, unsigned int);
-static void MD5_memcpy (POINTER, POINTER, unsigned int);
-static void MD5_memset (POINTER, int, unsigned int);
-
-static unsigned char PADDING[64] = {
- 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
-
-/* F, G, H and I are basic MD5 functions.
- */
-#define F(x, y, z) (((x) & (y)) | ((~x) & (z)))
-#define G(x, y, z) (((x) & (z)) | ((y) & (~z)))
-#define H(x, y, z) ((x) ^ (y) ^ (z))
-#define I(x, y, z) ((y) ^ ((x) | (~z)))
-
-/* ROTATE_LEFT rotates x left n bits.
- */
-#define ROTATE_LEFT(x, n) (((x) << (n)) | ((x) >> (32-(n))))
-
-/* FF, GG, HH, and II transformations for rounds 1, 2, 3, and 4.
- Rotation is separate from addition to prevent recomputation.
- */
-#define FF(a, b, c, d, x, s, ac) { \
- (a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
- }
-#define GG(a, b, c, d, x, s, ac) { \
- (a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
- }
-#define HH(a, b, c, d, x, s, ac) { \
- (a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
- }
-#define II(a, b, c, d, x, s, ac) { \
- (a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \
- (a) = ROTATE_LEFT ((a), (s)); \
- (a) += (b); \
- }
-
-/* MD5 initialization. Begins an MD5 operation, writing a new context.
- */
-void MD5Init (MD5_CTX *context)
-{
- context->count[0] = context->count[1] = 0;
-
- /* Load magic initialization constants.
- */
- context->state[0] = 0x67452301;
- context->state[1] = 0xefcdab89;
- context->state[2] = 0x98badcfe;
- context->state[3] = 0x10325476;
-}
-
-/* MD5 block update operation. Continues an MD5 message-digest
- operation, processing another message block, and updating the
- context.
- */
-void MD5Update (MD5_CTX *context, const unsigned char *input, unsigned int inputLen)
-{
- unsigned int i, index, partLen;
-
- /* Compute number of bytes mod 64 */
- index = (unsigned int)((context->count[0] >> 3) & 0x3F);
-
- /* Update number of bits */
- if ((context->count[0] += ((UINT4)inputLen << 3))
- < ((UINT4)inputLen << 3))
- context->count[1]++;
- context->count[1] += ((UINT4)inputLen >> 29);
-
- partLen = 64 - index;
-
- /* Transform as many times as possible.
- */
- if (inputLen >= partLen) {
- MD5_memcpy
- ((POINTER)&context->buffer[index], (POINTER)input, partLen);
- MD5Transform (context->state, context->buffer);
-
- for (i = partLen; i + 63 < inputLen; i += 64)
- MD5Transform (context->state, &input[i]);
-
- index = 0;
- }
- else
- i = 0;
-
- /* Buffer remaining input */
- MD5_memcpy
- ((POINTER)&context->buffer[index], (POINTER)&input[i],
- inputLen-i);
-}
-
-/* MD5 finalization. Ends an MD5 message-digest operation, writing the
- the message digest and zeroizing the context.
- */
-void MD5Final (MD5_CTX *context, unsigned char digest[16])
-{
- unsigned char bits[8];
- unsigned int index, padLen;
-
- /* Save number of bits */
- Encode (bits, context->count, 8);
-
- /* Pad out to 56 mod 64.
- */
- index = (unsigned int)((context->count[0] >> 3) & 0x3f);
- padLen = (index < 56) ? (56 - index) : (120 - index);
- MD5Update (context, PADDING, padLen);
-
- /* Append length (before padding) */
- MD5Update (context, bits, 8);
-
- /* Store state in digest */
- Encode (digest, context->state, 16);
-
- /* Zeroize sensitive information.
- */
- MD5_memset ((POINTER)context, 0, sizeof (*context));
-}
-
-void MD5Buffer (const unsigned char *buf,unsigned int len,unsigned char sig[16])
-{
- MD5_CTX md5;
- MD5Init(&md5);
- MD5Update(&md5,buf,len);
- MD5Final(&md5,sig);
-}
-
-#define HEX_STRING "0123456789abcdef" /* to convert to hex */
-
-void MD5SigToString(unsigned char signature[16],char *str,int len)
-{
- unsigned char *sig_p;
- char *str_p, *max_p;
- unsigned int high, low;
-
- str_p = str;
- max_p = str + len;
-
- for (sig_p = (unsigned char *)signature;
- sig_p < (unsigned char *)signature + 16;
- sig_p++)
- {
- high = *sig_p / 16;
- low = *sig_p % 16;
- /* account for 2 chars */
- if (str_p + 1 >= max_p) {
- break;
- }
- *str_p++ = HEX_STRING[high];
- *str_p++ = HEX_STRING[low];
- }
- /* account for 2 chars */
- if (str_p < max_p) {
- *str_p++ = '\0';
- }
-}
-
-/* MD5 basic transformation. Transforms state based on block.
- */
-static void MD5Transform (UINT4 state[4], const unsigned char block[64])
-{
- UINT4 a = state[0], b = state[1], c = state[2], d = state[3], x[16];
-
- Decode (x, block, 64);
-
- /* Round 1 */
- FF (a, b, c, d, x[ 0], S11, 0xd76aa478); /* 1 */
- FF (d, a, b, c, x[ 1], S12, 0xe8c7b756); /* 2 */
- FF (c, d, a, b, x[ 2], S13, 0x242070db); /* 3 */
- FF (b, c, d, a, x[ 3], S14, 0xc1bdceee); /* 4 */
- FF (a, b, c, d, x[ 4], S11, 0xf57c0faf); /* 5 */
- FF (d, a, b, c, x[ 5], S12, 0x4787c62a); /* 6 */
- FF (c, d, a, b, x[ 6], S13, 0xa8304613); /* 7 */
- FF (b, c, d, a, x[ 7], S14, 0xfd469501); /* 8 */
- FF (a, b, c, d, x[ 8], S11, 0x698098d8); /* 9 */
- FF (d, a, b, c, x[ 9], S12, 0x8b44f7af); /* 10 */
- FF (c, d, a, b, x[10], S13, 0xffff5bb1); /* 11 */
- FF (b, c, d, a, x[11], S14, 0x895cd7be); /* 12 */
- FF (a, b, c, d, x[12], S11, 0x6b901122); /* 13 */
- FF (d, a, b, c, x[13], S12, 0xfd987193); /* 14 */
- FF (c, d, a, b, x[14], S13, 0xa679438e); /* 15 */
- FF (b, c, d, a, x[15], S14, 0x49b40821); /* 16 */
-
- /* Round 2 */
- GG (a, b, c, d, x[ 1], S21, 0xf61e2562); /* 17 */
- GG (d, a, b, c, x[ 6], S22, 0xc040b340); /* 18 */
- GG (c, d, a, b, x[11], S23, 0x265e5a51); /* 19 */
- GG (b, c, d, a, x[ 0], S24, 0xe9b6c7aa); /* 20 */
- GG (a, b, c, d, x[ 5], S21, 0xd62f105d); /* 21 */
- GG (d, a, b, c, x[10], S22, 0x2441453); /* 22 */
- GG (c, d, a, b, x[15], S23, 0xd8a1e681); /* 23 */
- GG (b, c, d, a, x[ 4], S24, 0xe7d3fbc8); /* 24 */
- GG (a, b, c, d, x[ 9], S21, 0x21e1cde6); /* 25 */
- GG (d, a, b, c, x[14], S22, 0xc33707d6); /* 26 */
- GG (c, d, a, b, x[ 3], S23, 0xf4d50d87); /* 27 */
- GG (b, c, d, a, x[ 8], S24, 0x455a14ed); /* 28 */
- GG (a, b, c, d, x[13], S21, 0xa9e3e905); /* 29 */
- GG (d, a, b, c, x[ 2], S22, 0xfcefa3f8); /* 30 */
- GG (c, d, a, b, x[ 7], S23, 0x676f02d9); /* 31 */
- GG (b, c, d, a, x[12], S24, 0x8d2a4c8a); /* 32 */
-
- /* Round 3 */
- HH (a, b, c, d, x[ 5], S31, 0xfffa3942); /* 33 */
- HH (d, a, b, c, x[ 8], S32, 0x8771f681); /* 34 */
- HH (c, d, a, b, x[11], S33, 0x6d9d6122); /* 35 */
- HH (b, c, d, a, x[14], S34, 0xfde5380c); /* 36 */
- HH (a, b, c, d, x[ 1], S31, 0xa4beea44); /* 37 */
- HH (d, a, b, c, x[ 4], S32, 0x4bdecfa9); /* 38 */
- HH (c, d, a, b, x[ 7], S33, 0xf6bb4b60); /* 39 */
- HH (b, c, d, a, x[10], S34, 0xbebfbc70); /* 40 */
- HH (a, b, c, d, x[13], S31, 0x289b7ec6); /* 41 */
- HH (d, a, b, c, x[ 0], S32, 0xeaa127fa); /* 42 */
- HH (c, d, a, b, x[ 3], S33, 0xd4ef3085); /* 43 */
- HH (b, c, d, a, x[ 6], S34, 0x4881d05); /* 44 */
- HH (a, b, c, d, x[ 9], S31, 0xd9d4d039); /* 45 */
- HH (d, a, b, c, x[12], S32, 0xe6db99e5); /* 46 */
- HH (c, d, a, b, x[15], S33, 0x1fa27cf8); /* 47 */
- HH (b, c, d, a, x[ 2], S34, 0xc4ac5665); /* 48 */
-
- /* Round 4 */
- II (a, b, c, d, x[ 0], S41, 0xf4292244); /* 49 */
- II (d, a, b, c, x[ 7], S42, 0x432aff97); /* 50 */
- II (c, d, a, b, x[14], S43, 0xab9423a7); /* 51 */
- II (b, c, d, a, x[ 5], S44, 0xfc93a039); /* 52 */
- II (a, b, c, d, x[12], S41, 0x655b59c3); /* 53 */
- II (d, a, b, c, x[ 3], S42, 0x8f0ccc92); /* 54 */
- II (c, d, a, b, x[10], S43, 0xffeff47d); /* 55 */
- II (b, c, d, a, x[ 1], S44, 0x85845dd1); /* 56 */
- II (a, b, c, d, x[ 8], S41, 0x6fa87e4f); /* 57 */
- II (d, a, b, c, x[15], S42, 0xfe2ce6e0); /* 58 */
- II (c, d, a, b, x[ 6], S43, 0xa3014314); /* 59 */
- II (b, c, d, a, x[13], S44, 0x4e0811a1); /* 60 */
- II (a, b, c, d, x[ 4], S41, 0xf7537e82); /* 61 */
- II (d, a, b, c, x[11], S42, 0xbd3af235); /* 62 */
- II (c, d, a, b, x[ 2], S43, 0x2ad7d2bb); /* 63 */
- II (b, c, d, a, x[ 9], S44, 0xeb86d391); /* 64 */
-
- state[0] += a;
- state[1] += b;
- state[2] += c;
- state[3] += d;
-
- /* Zeroize sensitive information.
- */
- MD5_memset ((POINTER)x, 0, sizeof (x));
-}
-
-/* Encodes input (UINT4) into output (unsigned char). Assumes len is
- a multiple of 4.
- */
-static void Encode (unsigned char *output, UINT4 *input, unsigned int len)
-{
- unsigned int i, j;
-
- for (i = 0, j = 0; j < len; i++, j += 4) {
- output[j] = (unsigned char)(input[i] & 0xff);
- output[j+1] = (unsigned char)((input[i] >> 8) & 0xff);
- output[j+2] = (unsigned char)((input[i] >> 16) & 0xff);
- output[j+3] = (unsigned char)((input[i] >> 24) & 0xff);
- }
-}
-
-/* Decodes input (unsigned char) into output (UINT4). Assumes len is
- a multiple of 4.
- */
-static void Decode (UINT4 *output, const unsigned char *input, unsigned int len)
-{
- unsigned int i, j;
-
- for (i = 0, j = 0; j < len; i++, j += 4)
- output[i] = ((UINT4)input[j]) | (((UINT4)input[j+1]) << 8) |
- (((UINT4)input[j+2]) << 16) | (((UINT4)input[j+3]) << 24);
-}
-
-/* Note: Replace "for loop" with standard memcpy if possible.
- */
-static void MD5_memcpy (POINTER output, POINTER input, unsigned int len)
-{
- unsigned int i;
-
- for (i = 0; i < len; i++)
- output[i] = input[i];
-}
-
-/* Note: Replace "for loop" with standard memset if possible.
- */
-static void MD5_memset (POINTER output, int value, unsigned int len)
-{
- unsigned int i;
-
- for (i = 0; i < len; i++)
- ((char *)output)[i] = (char)value;
-}
-
-
diff --git a/libmd5/md5.h b/libmd5/md5.h
deleted file mode 100644
index 8e85a8a..0000000
--- a/libmd5/md5.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/* MD5.H - header file for MD5C.C
- */
-
-/* Copyright (C) 1991-2, RSA Data Security, Inc. Created 1991. All
- rights reserved.
-
- License to copy and use this software is granted provided that it
- is identified as the "RSA Data Security, Inc. MD5 Message-Digest
- Algorithm" in all material mentioning or referencing this software
- or this function.
-
- License is also granted to make and use derivative works provided
- that such works are identified as "derived from the RSA Data
- Security, Inc. MD5 Message-Digest Algorithm" in all material
- mentioning or referencing the derived work.
-
- RSA Data Security, Inc. makes no representations concerning either
- the merchantability of this software or the suitability of this
- software for any particular purpose. It is provided "as is"
- without express or implied warranty of any kind.
-
- These notices must be retained in any copies of any part of this
- documentation and/or software.
- */
-
-#ifndef _MD5_H_
-#define _MD5_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "md5_loc.h"
-
-/* MD5 context. */
-typedef struct {
- UINT4 state[4]; /* state (ABCD) */
- UINT4 count[2]; /* number of bits, modulo 2^64 (lsb first) */
- unsigned char buffer[64]; /* input buffer */
-} MD5_CTX;
-
-void MD5Init(MD5_CTX *ctx);
-void MD5Update (MD5_CTX *ctx, const unsigned char *buf, unsigned int len);
-void MD5Final (MD5_CTX *ctx, unsigned char sig[16]);
-void MD5Buffer (const unsigned char *buf,unsigned int len,unsigned char sig[16]);
-void MD5SigToString(unsigned char sig[16],char *str,int len);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/libmd5/md5_loc.h b/libmd5/md5_loc.h
deleted file mode 100644
index 464e3d1..0000000
--- a/libmd5/md5_loc.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* GLOBAL.H - RSAREF types and constants */
-
-/* Copyright (C) RSA Laboratories, a division of RSA Data Security,
- Inc., created 1991. All rights reserved.
- */
-
-#ifndef _MD5LOC_H
-#define _MD5LOC_H
-
-/* POINTER defines a generic pointer type */
-typedef unsigned char *POINTER;
-
-/* UINT2 defines a two byte word */
-typedef unsigned short int UINT2;
-
-/* UINT4 defines a four byte word */
-typedef unsigned long int UINT4;
-
-#ifndef NULL_PTR
-#define NULL_PTR ((POINTER)0)
-#endif
-
-#ifndef UNUSED_ARG
-#define UNUSED_ARG(x) x = *(&x);
-#endif
-
-#endif /* end _GLOBAL_H_ */
diff --git a/libpng/.cvsignore b/libpng/.cvsignore
deleted file mode 100644
index 27fdac7..0000000
--- a/libpng/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-Makefile
-libpng.pro
-Makefile.libpng
diff --git a/libpng/LICENSE b/libpng/LICENSE
deleted file mode 100644
index c11dd4f..0000000
--- a/libpng/LICENSE
+++ /dev/null
@@ -1,102 +0,0 @@
-
-This copy of the libpng notices is provided for your convenience. In case of
-any discrepancy between this copy and the notices in the file png.h that is
-included in the libpng distribution, the latter shall prevail.
-
-COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:
-
-If you modify libpng you may insert additional notices immediately following
-this sentence.
-
-libpng versions 1.0.7, July 1, 2000, through 1.2.1, December 12, 2001, are
-Copyright (c) 2000 Glenn Randers-Pehrson
-and are distributed according to the same disclaimer and license as libpng-1.0.6
-with the following individuals added to the list of Contributing Authors
-
- Simon-Pierre Cadieux
- Eric S. Raymond
- Gilles Vollant
-
-and with the following additions to the disclaimer:
-
- There is no warranty against interference with your enjoyment of the
- library or against infringement. There is no warranty that our
- efforts or the library will fulfill any of your particular purposes
- or needs. This library is provided with all faults, and the entire
- risk of satisfactory quality, performance, accuracy, and effort is with
- the user.
-
-libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
-Copyright (c) 1998, 1999 Glenn Randers-Pehrson, and are
-distributed according to the same disclaimer and license as libpng-0.96,
-with the following individuals added to the list of Contributing Authors:
-
- Tom Lane
- Glenn Randers-Pehrson
- Willem van Schaik
-
-libpng versions 0.89, June 1996, through 0.96, May 1997, are
-Copyright (c) 1996, 1997 Andreas Dilger
-Distributed according to the same disclaimer and license as libpng-0.88,
-with the following individuals added to the list of Contributing Authors:
-
- John Bowler
- Kevin Bracey
- Sam Bushell
- Magnus Holmgren
- Greg Roelofs
- Tom Tanner
-
-libpng versions 0.5, May 1995, through 0.88, January 1996, are
-Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
-
-For the purposes of this copyright and license, "Contributing Authors"
-is defined as the following set of individuals:
-
- Andreas Dilger
- Dave Martindale
- Guy Eric Schalnat
- Paul Schmidt
- Tim Wegner
-
-The PNG Reference Library is supplied "AS IS". The Contributing Authors
-and Group 42, Inc. disclaim all warranties, expressed or implied,
-including, without limitation, the warranties of merchantability and of
-fitness for any purpose. The Contributing Authors and Group 42, Inc.
-assume no liability for direct, indirect, incidental, special, exemplary,
-or consequential damages, which may result from the use of the PNG
-Reference Library, even if advised of the possibility of such damage.
-
-Permission is hereby granted to use, copy, modify, and distribute this
-source code, or portions hereof, for any purpose, without fee, subject
-to the following restrictions:
-
-1. The origin of this source code must not be misrepresented.
-
-2. Altered versions must be plainly marked as such and must not
- be misrepresented as being the original source.
-
-3. This Copyright notice may not be removed or altered from any
- source or altered source distribution.
-
-The Contributing Authors and Group 42, Inc. specifically permit, without
-fee, and encourage the use of this source code as a component to
-supporting the PNG file format in commercial products. If you use this
-source code in a product, acknowledgment is not required but would be
-appreciated.
-
-
-A "png_get_copyright" function is available, for convenient use in "about"
-boxes and the like:
-
- printf("%s",png_get_copyright(NULL));
-
-Also, the PNG logo (in PNG format, of course) is supplied in the
-files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
-
-Libpng is OSI Certified Open Source Software. OSI Certified Open Source is a
-certification mark of the Open Source Initiative.
-
-Glenn Randers-Pehrson
-randeg@alum.rpi.edu
-December 12, 2001
diff --git a/libpng/Makefile.in b/libpng/Makefile.in
deleted file mode 100644
index 88c0b2a..0000000
--- a/libpng/Makefile.in
+++ /dev/null
@@ -1,16 +0,0 @@
-all: Makefile.libpng
- $(MAKE) -f Makefile.libpng
-
-clean: Makefile.libpng
- $(MAKE) -f Makefile.libpng clean
-
-distclean: clean
- $(RM) -f Makefile.libpng libpng.pro Makefile
-
-tmake:
- $(ENV) $(PERL) $(TMAKE) libpng.pro >Makefile.libpng
-
-Makefile.libpng: libpng.pro
- $(ENV) $(PERL) $(TMAKE) libpng.pro >Makefile.libpng
-
-install:
diff --git a/libpng/README b/libpng/README
deleted file mode 100644
index 9e08311..0000000
--- a/libpng/README
+++ /dev/null
@@ -1,2 +0,0 @@
-This dir contains the for doxygen relavant parts of libpng-1.2.1
-and zlib-1.1.3. See http://www.libpng.org/pub/png/
diff --git a/libpng/adler32.c b/libpng/adler32.c
deleted file mode 100644
index 8990fd6..0000000
--- a/libpng/adler32.c
+++ /dev/null
@@ -1,45 +0,0 @@
-/* adler32.c -- compute the Adler-32 checksum of a data stream
- * Copyright (C) 1995-2002 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* @(#) $Id$ */
-
-#include "zlib.h"
-
-#define BASE 65521L /* largest prime smaller than 65536 */
-#define NMAX 5552
-/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
-
-#define DO1(buf,i) {s1 += buf[i]; s2 += s1;}
-#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1);
-#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2);
-#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4);
-#define DO16(buf) DO8(buf,0); DO8(buf,8);
-
-/* ========================================================================= */
-uLong ZEXPORT adler32(uLong adler, const Bytef *buf, uInt len)
-{
- unsigned long s1 = adler & 0xffff;
- unsigned long s2 = (adler >> 16) & 0xffff;
- int k;
-
- if (buf == Z_NULL) return 1L;
-
- while (len > 0) {
- k = len < NMAX ? len : NMAX;
- len -= k;
- while (k >= 16) {
- DO16(buf);
- buf += 16;
- k -= 16;
- }
- if (k != 0) do {
- s1 += *buf++;
- s2 += s1;
- } while (--k);
- s1 %= BASE;
- s2 %= BASE;
- }
- return (s2 << 16) | s1;
-}
diff --git a/libpng/compress.c b/libpng/compress.c
deleted file mode 100644
index fcd0fa8..0000000
--- a/libpng/compress.c
+++ /dev/null
@@ -1,59 +0,0 @@
-/* compress.c -- compress a memory buffer
- * Copyright (C) 1995-2002 Jean-loup Gailly.
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* @(#) $Id$ */
-
-#include "zlib.h"
-
-/* ===========================================================================
- Compresses the source buffer into the destination buffer. The level
- parameter has the same meaning as in deflateInit. sourceLen is the byte
- length of the source buffer. Upon entry, destLen is the total size of the
- destination buffer, which must be at least 0.1% larger than sourceLen plus
- 12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
-
- compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
- memory, Z_BUF_ERROR if there was not enough room in the output buffer,
- Z_STREAM_ERROR if the level parameter is invalid.
-*/
-int ZEXPORT compress2 (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level)
-{
- z_stream stream;
- int err;
-
- stream.next_in = (Bytef*)source;
- stream.avail_in = (uInt)sourceLen;
-#ifdef MAXSEG_64K
- /* Check for source > 64K on 16-bit machine: */
- if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
-#endif
- stream.next_out = dest;
- stream.avail_out = (uInt)*destLen;
- if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
-
- stream.zalloc = (alloc_func)0;
- stream.zfree = (free_func)0;
- stream.opaque = (voidpf)0;
-
- err = deflateInit(&stream, level);
- if (err != Z_OK) return err;
-
- err = deflate(&stream, Z_FINISH);
- if (err != Z_STREAM_END) {
- deflateEnd(&stream);
- return err == Z_OK ? Z_BUF_ERROR : err;
- }
- *destLen = stream.total_out;
-
- err = deflateEnd(&stream);
- return err;
-}
-
-/* ===========================================================================
- */
-int ZEXPORT compress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)
-{
- return compress2(dest, destLen, source, sourceLen, Z_DEFAULT_COMPRESSION);
-}
diff --git a/libpng/crc32.c b/libpng/crc32.c
deleted file mode 100644
index 50fa876..0000000
--- a/libpng/crc32.c
+++ /dev/null
@@ -1,159 +0,0 @@
-/* crc32.c -- compute the CRC-32 of a data stream
- * Copyright (C) 1995-2002 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* @(#) $Id$ */
-
-#include "zlib.h"
-
-#define local static
-
-#ifdef DYNAMIC_CRC_TABLE
-
-local int crc_table_empty = 1;
-local uLongf crc_table[256];
-local void make_crc_table OF((void));
-
-/*
- Generate a table for a byte-wise 32-bit CRC calculation on the polynomial:
- x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.
-
- Polynomials over GF(2) are represented in binary, one bit per coefficient,
- with the lowest powers in the most significant bit. Then adding polynomials
- is just exclusive-or, and multiplying a polynomial by x is a right shift by
- one. If we call the above polynomial p, and represent a byte as the
- polynomial q, also with the lowest power in the most significant bit (so the
- byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,
- where a mod b means the remainder after dividing a by b.
-
- This calculation is done using the shift-register method of multiplying and
- taking the remainder. The register is initialized to zero, and for each
- incoming bit, x^32 is added mod p to the register if the bit is a one (where
- x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by
- x (which is shifting right by one and adding x^32 mod p if the bit shifted
- out is a one). We start with the highest power (least significant bit) of
- q and repeat for all eight bits of q.
-
- The table is simply the CRC of all possible eight bit values. This is all
- the information needed to generate CRC's on data a byte at a time for all
- combinations of CRC register values and incoming bytes.
-*/
-local void make_crc_table()
-{
- uLong c;
- int n, k;
- uLong poly; /* polynomial exclusive-or pattern */
- /* terms of polynomial defining this crc (except x^32): */
- static const Byte p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
-
- /* make exclusive-or pattern from polynomial (0xedb88320L) */
- poly = 0L;
- for (n = 0; n < sizeof(p)/sizeof(Byte); n++)
- poly |= 1L << (31 - p[n]);
-
- for (n = 0; n < 256; n++)
- {
- c = (uLong)n;
- for (k = 0; k < 8; k++)
- c = c & 1 ? poly ^ (c >> 1) : c >> 1;
- crc_table[n] = c;
- }
- crc_table_empty = 0;
-}
-#else
-/* ========================================================================
- * Table of CRC-32's of all single-byte values (made by make_crc_table)
- */
-local const uLongf crc_table[256] = {
- 0x00000000L, 0x77073096L, 0xee0e612cL, 0x990951baL, 0x076dc419L,
- 0x706af48fL, 0xe963a535L, 0x9e6495a3L, 0x0edb8832L, 0x79dcb8a4L,
- 0xe0d5e91eL, 0x97d2d988L, 0x09b64c2bL, 0x7eb17cbdL, 0xe7b82d07L,
- 0x90bf1d91L, 0x1db71064L, 0x6ab020f2L, 0xf3b97148L, 0x84be41deL,
- 0x1adad47dL, 0x6ddde4ebL, 0xf4d4b551L, 0x83d385c7L, 0x136c9856L,
- 0x646ba8c0L, 0xfd62f97aL, 0x8a65c9ecL, 0x14015c4fL, 0x63066cd9L,
- 0xfa0f3d63L, 0x8d080df5L, 0x3b6e20c8L, 0x4c69105eL, 0xd56041e4L,
- 0xa2677172L, 0x3c03e4d1L, 0x4b04d447L, 0xd20d85fdL, 0xa50ab56bL,
- 0x35b5a8faL, 0x42b2986cL, 0xdbbbc9d6L, 0xacbcf940L, 0x32d86ce3L,
- 0x45df5c75L, 0xdcd60dcfL, 0xabd13d59L, 0x26d930acL, 0x51de003aL,
- 0xc8d75180L, 0xbfd06116L, 0x21b4f4b5L, 0x56b3c423L, 0xcfba9599L,
- 0xb8bda50fL, 0x2802b89eL, 0x5f058808L, 0xc60cd9b2L, 0xb10be924L,
- 0x2f6f7c87L, 0x58684c11L, 0xc1611dabL, 0xb6662d3dL, 0x76dc4190L,
- 0x01db7106L, 0x98d220bcL, 0xefd5102aL, 0x71b18589L, 0x06b6b51fL,
- 0x9fbfe4a5L, 0xe8b8d433L, 0x7807c9a2L, 0x0f00f934L, 0x9609a88eL,
- 0xe10e9818L, 0x7f6a0dbbL, 0x086d3d2dL, 0x91646c97L, 0xe6635c01L,
- 0x6b6b51f4L, 0x1c6c6162L, 0x856530d8L, 0xf262004eL, 0x6c0695edL,
- 0x1b01a57bL, 0x8208f4c1L, 0xf50fc457L, 0x65b0d9c6L, 0x12b7e950L,
- 0x8bbeb8eaL, 0xfcb9887cL, 0x62dd1ddfL, 0x15da2d49L, 0x8cd37cf3L,
- 0xfbd44c65L, 0x4db26158L, 0x3ab551ceL, 0xa3bc0074L, 0xd4bb30e2L,
- 0x4adfa541L, 0x3dd895d7L, 0xa4d1c46dL, 0xd3d6f4fbL, 0x4369e96aL,
- 0x346ed9fcL, 0xad678846L, 0xda60b8d0L, 0x44042d73L, 0x33031de5L,
- 0xaa0a4c5fL, 0xdd0d7cc9L, 0x5005713cL, 0x270241aaL, 0xbe0b1010L,
- 0xc90c2086L, 0x5768b525L, 0x206f85b3L, 0xb966d409L, 0xce61e49fL,
- 0x5edef90eL, 0x29d9c998L, 0xb0d09822L, 0xc7d7a8b4L, 0x59b33d17L,
- 0x2eb40d81L, 0xb7bd5c3bL, 0xc0ba6cadL, 0xedb88320L, 0x9abfb3b6L,
- 0x03b6e20cL, 0x74b1d29aL, 0xead54739L, 0x9dd277afL, 0x04db2615L,
- 0x73dc1683L, 0xe3630b12L, 0x94643b84L, 0x0d6d6a3eL, 0x7a6a5aa8L,
- 0xe40ecf0bL, 0x9309ff9dL, 0x0a00ae27L, 0x7d079eb1L, 0xf00f9344L,
- 0x8708a3d2L, 0x1e01f268L, 0x6906c2feL, 0xf762575dL, 0x806567cbL,
- 0x196c3671L, 0x6e6b06e7L, 0xfed41b76L, 0x89d32be0L, 0x10da7a5aL,
- 0x67dd4accL, 0xf9b9df6fL, 0x8ebeeff9L, 0x17b7be43L, 0x60b08ed5L,
- 0xd6d6a3e8L, 0xa1d1937eL, 0x38d8c2c4L, 0x4fdff252L, 0xd1bb67f1L,
- 0xa6bc5767L, 0x3fb506ddL, 0x48b2364bL, 0xd80d2bdaL, 0xaf0a1b4cL,
- 0x36034af6L, 0x41047a60L, 0xdf60efc3L, 0xa867df55L, 0x316e8eefL,
- 0x4669be79L, 0xcb61b38cL, 0xbc66831aL, 0x256fd2a0L, 0x5268e236L,
- 0xcc0c7795L, 0xbb0b4703L, 0x220216b9L, 0x5505262fL, 0xc5ba3bbeL,
- 0xb2bd0b28L, 0x2bb45a92L, 0x5cb36a04L, 0xc2d7ffa7L, 0xb5d0cf31L,
- 0x2cd99e8bL, 0x5bdeae1dL, 0x9b64c2b0L, 0xec63f226L, 0x756aa39cL,
- 0x026d930aL, 0x9c0906a9L, 0xeb0e363fL, 0x72076785L, 0x05005713L,
- 0x95bf4a82L, 0xe2b87a14L, 0x7bb12baeL, 0x0cb61b38L, 0x92d28e9bL,
- 0xe5d5be0dL, 0x7cdcefb7L, 0x0bdbdf21L, 0x86d3d2d4L, 0xf1d4e242L,
- 0x68ddb3f8L, 0x1fda836eL, 0x81be16cdL, 0xf6b9265bL, 0x6fb077e1L,
- 0x18b74777L, 0x88085ae6L, 0xff0f6a70L, 0x66063bcaL, 0x11010b5cL,
- 0x8f659effL, 0xf862ae69L, 0x616bffd3L, 0x166ccf45L, 0xa00ae278L,
- 0xd70dd2eeL, 0x4e048354L, 0x3903b3c2L, 0xa7672661L, 0xd06016f7L,
- 0x4969474dL, 0x3e6e77dbL, 0xaed16a4aL, 0xd9d65adcL, 0x40df0b66L,
- 0x37d83bf0L, 0xa9bcae53L, 0xdebb9ec5L, 0x47b2cf7fL, 0x30b5ffe9L,
- 0xbdbdf21cL, 0xcabac28aL, 0x53b39330L, 0x24b4a3a6L, 0xbad03605L,
- 0xcdd70693L, 0x54de5729L, 0x23d967bfL, 0xb3667a2eL, 0xc4614ab8L,
- 0x5d681b02L, 0x2a6f2b94L, 0xb40bbe37L, 0xc30c8ea1L, 0x5a05df1bL,
- 0x2d02ef8dL
-};
-#endif
-
-/* =========================================================================
- * This function can be used by asm versions of crc32()
- */
-const uLongf * ZEXPORT get_crc_table(void)
-{
-#ifdef DYNAMIC_CRC_TABLE
- if (crc_table_empty) make_crc_table();
-#endif
- return (const uLongf *)crc_table;
-}
-
-/* ========================================================================= */
-#define DO1(buf) crc = crc_table[((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8);
-#define DO2(buf) DO1(buf); DO1(buf);
-#define DO4(buf) DO2(buf); DO2(buf);
-#define DO8(buf) DO4(buf); DO4(buf);
-
-/* ========================================================================= */
-uLong ZEXPORT crc32(uLong crc, const Bytef *buf, uInt len)
-{
- if (buf == Z_NULL) return 0L;
-#ifdef DYNAMIC_CRC_TABLE
- if (crc_table_empty)
- make_crc_table();
-#endif
- crc = crc ^ 0xffffffffL;
- while (len >= 8)
- {
- DO8(buf);
- len -= 8;
- }
- if (len) do {
- DO1(buf);
- } while (--len);
- return crc ^ 0xffffffffL;
-}
diff --git a/libpng/deflate.c b/libpng/deflate.c
deleted file mode 100644
index bb39139..0000000
--- a/libpng/deflate.c
+++ /dev/null
@@ -1,1306 +0,0 @@
-/* deflate.c -- compress data using the deflation algorithm
- * Copyright (C) 1995-2002 Jean-loup Gailly.
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/*
- * ALGORITHM
- *
- * The "deflation" process depends on being able to identify portions
- * of the input text which are identical to earlier input (within a
- * sliding window trailing behind the input currently being processed).
- *
- * The most straightforward technique turns out to be the fastest for
- * most input files: try all possible matches and select the longest.
- * The key feature of this algorithm is that insertions into the string
- * dictionary are very simple and thus fast, and deletions are avoided
- * completely. Insertions are performed at each input character, whereas
- * string matches are performed only when the previous match ends. So it
- * is preferable to spend more time in matches to allow very fast string
- * insertions and avoid deletions. The matching algorithm for small
- * strings is inspired from that of Rabin & Karp. A brute force approach
- * is used to find longer strings when a small match has been found.
- * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze
- * (by Leonid Broukhis).
- * A previous version of this file used a more sophisticated algorithm
- * (by Fiala and Greene) which is guaranteed to run in linear amortized
- * time, but has a larger average cost, uses more memory and is patented.
- * However the F&G algorithm may be faster for some highly redundant
- * files if the parameter max_chain_length (described below) is too large.
- *
- * ACKNOWLEDGEMENTS
- *
- * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and
- * I found it in 'freeze' written by Leonid Broukhis.
- * Thanks to many people for bug reports and testing.
- *
- * REFERENCES
- *
- * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification".
- * Available in ftp://ds.internic.net/rfc/rfc1951.txt
- *
- * A description of the Rabin and Karp algorithm is given in the book
- * "Algorithms" by R. Sedgewick, Addison-Wesley, p252.
- *
- * Fiala,E.R., and Greene,D.H.
- * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595
- *
- */
-
-/* @(#) $Id$ */
-
-#include "deflate.h"
-
-const char deflate_copyright[] =
- " deflate 1.1.4 Copyright 1995-2002 Jean-loup Gailly ";
-/*
- If you use the zlib library in a product, an acknowledgment is welcome
- in the documentation of your product. If for some reason you cannot
- include such an acknowledgment, I would appreciate that you keep this
- copyright string in the executable of your product.
- */
-
-/* ===========================================================================
- * Function prototypes.
- */
-typedef enum {
- need_more, /* block not completed, need more input or more output */
- block_done, /* block flush performed */
- finish_started, /* finish started, need only more output at next deflate */
- finish_done /* finish done, accept no more input or output */
-} block_state;
-
-typedef block_state (*compress_func) OF((deflate_state *s, int flush));
-/* Compression function. Returns the block state after the call. */
-
-local void fill_window OF((deflate_state *s));
-local block_state deflate_stored OF((deflate_state *s, int flush));
-local block_state deflate_fast OF((deflate_state *s, int flush));
-local block_state deflate_slow OF((deflate_state *s, int flush));
-local void lm_init OF((deflate_state *s));
-local void putShortMSB OF((deflate_state *s, uInt b));
-local void flush_pending OF((z_streamp strm));
-local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size));
-#ifdef ASMV
- void match_init OF((void)); /* asm code initialization */
- uInt longest_match OF((deflate_state *s, IPos cur_match));
-#else
-local uInt longest_match OF((deflate_state *s, IPos cur_match));
-#endif
-
-#ifdef DEBUG
-local void check_match OF((deflate_state *s, IPos start, IPos match,
- int length));
-#endif
-
-/* ===========================================================================
- * Local data
- */
-
-#define NIL 0
-/* Tail of hash chains */
-
-#ifndef TOO_FAR
-# define TOO_FAR 4096
-#endif
-/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */
-
-#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)
-/* Minimum amount of lookahead, except at the end of the input file.
- * See deflate.c for comments about the MIN_MATCH+1.
- */
-
-/* Values for max_lazy_match, good_match and max_chain_length, depending on
- * the desired pack level (0..9). The values given below have been tuned to
- * exclude worst case performance for pathological files. Better values may be
- * found for specific files.
- */
-typedef struct config_s {
- ush good_length; /* reduce lazy search above this match length */
- ush max_lazy; /* do not perform lazy search above this match length */
- ush nice_length; /* quit search above this match length */
- ush max_chain;
- compress_func func;
-} config;
-
-local const config configuration_table[10] = {
-/* good lazy nice chain */
-/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */
-/* 1 */ {4, 4, 8, 4, deflate_fast}, /* maximum speed, no lazy matches */
-/* 2 */ {4, 5, 16, 8, deflate_fast},
-/* 3 */ {4, 6, 32, 32, deflate_fast},
-
-/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */
-/* 5 */ {8, 16, 32, 32, deflate_slow},
-/* 6 */ {8, 16, 128, 128, deflate_slow},
-/* 7 */ {8, 32, 128, 256, deflate_slow},
-/* 8 */ {32, 128, 258, 1024, deflate_slow},
-/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* maximum compression */
-
-/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4
- * For deflate_fast() (levels <= 3) good is ignored and lazy has a different
- * meaning.
- */
-
-#define EQUAL 0
-/* result of memcmp for equal strings */
-
-struct static_tree_desc_s {int dummy;}; /* for buggy compilers */
-
-/* ===========================================================================
- * Update a hash value with the given input byte
- * IN assertion: all calls to to UPDATE_HASH are made with consecutive
- * input characters, so that a running hash key can be computed from the
- * previous key instead of complete recalculation each time.
- */
-#define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask)
-
-
-/* ===========================================================================
- * Insert string str in the dictionary and set match_head to the previous head
- * of the hash chain (the most recent string with same hash key). Return
- * the previous length of the hash chain.
- * If this file is compiled with -DFASTEST, the compression level is forced
- * to 1, and no hash chains are maintained.
- * IN assertion: all calls to to INSERT_STRING are made with consecutive
- * input characters and the first MIN_MATCH bytes of str are valid
- * (except for the last MIN_MATCH-1 bytes of the input file).
- */
-#ifdef FASTEST
-#define INSERT_STRING(s, str, match_head) \
- (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
- match_head = s->head[s->ins_h], \
- s->head[s->ins_h] = (Pos)(str))
-#else
-#define INSERT_STRING(s, str, match_head) \
- (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
- s->prev[(str) & s->w_mask] = match_head = s->head[s->ins_h], \
- s->head[s->ins_h] = (Pos)(str))
-#endif
-
-/* ===========================================================================
- * Initialize the hash table (avoiding 64K overflow for 16 bit systems).
- * prev[] will be initialized on the fly.
- */
-#define CLEAR_HASH(s) \
- s->head[s->hash_size-1] = NIL; \
- zmemzero((Bytef *)s->head, (unsigned)(s->hash_size-1)*sizeof(*s->head));
-
-/* ========================================================================= */
-int ZEXPORT deflateInit_(z_streamp strm, int level, const char *version, int stream_size)
-{
- return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL,
- Z_DEFAULT_STRATEGY, version, stream_size);
- /* To do: ignore strm->next_in if we use it as window */
-}
-
-/* ========================================================================= */
-int ZEXPORT deflateInit2_(z_streamp strm, int level, int method, int windowBits, int memLevel, int strategy, const char *version, int stream_size)
-{
- deflate_state *s;
- int noheader = 0;
- static const char* my_version = ZLIB_VERSION;
-
- ushf *overlay;
- /* We overlay pending_buf and d_buf+l_buf. This works since the average
- * output size for (length,distance) codes is <= 24 bits.
- */
-
- if (version == Z_NULL || version[0] != my_version[0] ||
- stream_size != sizeof(z_stream)) {
- return Z_VERSION_ERROR;
- }
- if (strm == Z_NULL) return Z_STREAM_ERROR;
-
- strm->msg = Z_NULL;
- if (strm->zalloc == Z_NULL) {
- strm->zalloc = zcalloc;
- strm->opaque = (voidpf)0;
- }
- if (strm->zfree == Z_NULL) strm->zfree = zcfree;
-
- if (level == Z_DEFAULT_COMPRESSION) level = 6;
-#ifdef FASTEST
- level = 1;
-#endif
-
- if (windowBits < 0) { /* undocumented feature: suppress zlib header */
- noheader = 1;
- windowBits = -windowBits;
- }
- if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED ||
- windowBits < 9 || windowBits > 15 || level < 0 || level > 9 ||
- strategy < 0 || strategy > Z_HUFFMAN_ONLY) {
- return Z_STREAM_ERROR;
- }
- s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state));
- if (s == Z_NULL) return Z_MEM_ERROR;
- strm->state = (struct internal_state FAR *)s;
- s->strm = strm;
-
- s->noheader = noheader;
- s->w_bits = windowBits;
- s->w_size = 1 << s->w_bits;
- s->w_mask = s->w_size - 1;
-
- s->hash_bits = memLevel + 7;
- s->hash_size = 1 << s->hash_bits;
- s->hash_mask = s->hash_size - 1;
- s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH);
-
- s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte));
- s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos));
- s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos));
-
- s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
-
- overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);
- s->pending_buf = (uchf *) overlay;
- s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L);
-
- if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||
- s->pending_buf == Z_NULL) {
- strm->msg = (char*)ERR_MSG(Z_MEM_ERROR);
- deflateEnd (strm);
- return Z_MEM_ERROR;
- }
- s->d_buf = overlay + s->lit_bufsize/sizeof(ush);
- s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;
-
- s->level = level;
- s->strategy = strategy;
- s->method = (Byte)method;
-
- return deflateReset(strm);
-}
-
-/* ========================================================================= */
-int ZEXPORT deflateSetDictionary (z_streamp strm, const Bytef *dictionary, uInt dictLength)
-{
- deflate_state *s;
- uInt length = dictLength;
- uInt n;
- IPos hash_head = 0;
-
- if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL ||
- strm->state->status != INIT_STATE) return Z_STREAM_ERROR;
-
- s = strm->state;
- strm->adler = adler32(strm->adler, dictionary, dictLength);
-
- if (length < MIN_MATCH) return Z_OK;
- if (length > MAX_DIST(s)) {
- length = MAX_DIST(s);
-#ifndef USE_DICT_HEAD
- dictionary += dictLength - length; /* use the tail of the dictionary */
-#endif
- }
- zmemcpy(s->window, dictionary, length);
- s->strstart = length;
- s->block_start = (long)length;
-
- /* Insert all strings in the hash table (except for the last two bytes).
- * s->lookahead stays null, so s->ins_h will be recomputed at the next
- * call of fill_window.
- */
- s->ins_h = s->window[0];
- UPDATE_HASH(s, s->ins_h, s->window[1]);
- for (n = 0; n <= length - MIN_MATCH; n++) {
- INSERT_STRING(s, n, hash_head);
- }
- if (hash_head) hash_head = 0; /* to make compiler happy */
- return Z_OK;
-}
-
-/* ========================================================================= */
-int ZEXPORT deflateReset (z_streamp strm)
-{
- deflate_state *s;
-
- if (strm == Z_NULL || strm->state == Z_NULL ||
- strm->zalloc == Z_NULL || strm->zfree == Z_NULL) return Z_STREAM_ERROR;
-
- strm->total_in = strm->total_out = 0;
- strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */
- strm->data_type = Z_UNKNOWN;
-
- s = (deflate_state *)strm->state;
- s->pending = 0;
- s->pending_out = s->pending_buf;
-
- if (s->noheader < 0) {
- s->noheader = 0; /* was set to -1 by deflate(..., Z_FINISH); */
- }
- s->status = s->noheader ? BUSY_STATE : INIT_STATE;
- strm->adler = 1;
- s->last_flush = Z_NO_FLUSH;
-
- _tr_init(s);
- lm_init(s);
-
- return Z_OK;
-}
-
-/* ========================================================================= */
-int ZEXPORT deflateParams(z_streamp strm, int level, int strategy)
-{
- deflate_state *s;
- compress_func func;
- int err = Z_OK;
-
- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
- s = strm->state;
-
- if (level == Z_DEFAULT_COMPRESSION) {
- level = 6;
- }
- if (level < 0 || level > 9 || strategy < 0 || strategy > Z_HUFFMAN_ONLY) {
- return Z_STREAM_ERROR;
- }
- func = configuration_table[s->level].func;
-
- if (func != configuration_table[level].func && strm->total_in != 0) {
- /* Flush the last buffer: */
- err = deflate(strm, Z_PARTIAL_FLUSH);
- }
- if (s->level != level) {
- s->level = level;
- s->max_lazy_match = configuration_table[level].max_lazy;
- s->good_match = configuration_table[level].good_length;
- s->nice_match = configuration_table[level].nice_length;
- s->max_chain_length = configuration_table[level].max_chain;
- }
- s->strategy = strategy;
- return err;
-}
-
-/* =========================================================================
- * Put a short in the pending buffer. The 16-bit value is put in MSB order.
- * IN assertion: the stream state is correct and there is enough room in
- * pending_buf.
- */
-local void putShortMSB (deflate_state *s, uInt b)
-{
- put_byte(s, (Byte)(b >> 8));
- put_byte(s, (Byte)(b & 0xff));
-}
-
-/* =========================================================================
- * Flush as much pending output as possible. All deflate() output goes
- * through this function so some applications may wish to modify it
- * to avoid allocating a large strm->next_out buffer and copying into it.
- * (See also read_buf()).
- */
-local void flush_pending(z_streamp strm)
-{
- unsigned len = strm->state->pending;
-
- if (len > strm->avail_out) len = strm->avail_out;
- if (len == 0) return;
-
- zmemcpy(strm->next_out, strm->state->pending_out, len);
- strm->next_out += len;
- strm->state->pending_out += len;
- strm->total_out += len;
- strm->avail_out -= len;
- strm->state->pending -= len;
- if (strm->state->pending == 0) {
- strm->state->pending_out = strm->state->pending_buf;
- }
-}
-
-/* ========================================================================= */
-int ZEXPORT deflate (z_streamp strm, int flush)
-{
- int old_flush; /* value of flush param for previous deflate call */
- deflate_state *s;
-
- if (strm == Z_NULL || strm->state == Z_NULL ||
- flush > Z_FINISH || flush < 0) {
- return Z_STREAM_ERROR;
- }
- s = strm->state;
-
- if (strm->next_out == Z_NULL ||
- (strm->next_in == Z_NULL && strm->avail_in != 0) ||
- (s->status == FINISH_STATE && flush != Z_FINISH)) {
- ERR_RETURN(strm, Z_STREAM_ERROR);
- }
- if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR);
-
- s->strm = strm; /* just in case */
- old_flush = s->last_flush;
- s->last_flush = flush;
-
- /* Write the zlib header */
- if (s->status == INIT_STATE) {
-
- uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8;
- uInt level_flags = (s->level-1) >> 1;
-
- if (level_flags > 3) level_flags = 3;
- header |= (level_flags << 6);
- if (s->strstart != 0) header |= PRESET_DICT;
- header += 31 - (header % 31);
-
- s->status = BUSY_STATE;
- putShortMSB(s, header);
-
- /* Save the adler32 of the preset dictionary: */
- if (s->strstart != 0) {
- putShortMSB(s, (uInt)(strm->adler >> 16));
- putShortMSB(s, (uInt)(strm->adler & 0xffff));
- }
- strm->adler = 1L;
- }
-
- /* Flush as much pending output as possible */
- if (s->pending != 0) {
- flush_pending(strm);
- if (strm->avail_out == 0) {
- /* Since avail_out is 0, deflate will be called again with
- * more output space, but possibly with both pending and
- * avail_in equal to zero. There won't be anything to do,
- * but this is not an error situation so make sure we
- * return OK instead of BUF_ERROR at next call of deflate:
- */
- s->last_flush = -1;
- return Z_OK;
- }
-
- /* Make sure there is something to do and avoid duplicate consecutive
- * flushes. For repeated and useless calls with Z_FINISH, we keep
- * returning Z_STREAM_END instead of Z_BUFF_ERROR.
- */
- } else if (strm->avail_in == 0 && flush <= old_flush &&
- flush != Z_FINISH) {
- ERR_RETURN(strm, Z_BUF_ERROR);
- }
-
- /* User must not provide more input after the first FINISH: */
- if (s->status == FINISH_STATE && strm->avail_in != 0) {
- ERR_RETURN(strm, Z_BUF_ERROR);
- }
-
- /* Start a new block or continue the current one.
- */
- if (strm->avail_in != 0 || s->lookahead != 0 ||
- (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) {
- block_state bstate;
-
- bstate = (*(configuration_table[s->level].func))(s, flush);
-
- if (bstate == finish_started || bstate == finish_done) {
- s->status = FINISH_STATE;
- }
- if (bstate == need_more || bstate == finish_started) {
- if (strm->avail_out == 0) {
- s->last_flush = -1; /* avoid BUF_ERROR next call, see above */
- }
- return Z_OK;
- /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
- * of deflate should use the same flush parameter to make sure
- * that the flush is complete. So we don't have to output an
- * empty block here, this will be done at next call. This also
- * ensures that for a very small output buffer, we emit at most
- * one empty block.
- */
- }
- if (bstate == block_done) {
- if (flush == Z_PARTIAL_FLUSH) {
- _tr_align(s);
- } else { /* FULL_FLUSH or SYNC_FLUSH */
- _tr_stored_block(s, (char*)0, 0L, 0);
- /* For a full flush, this empty block will be recognized
- * as a special marker by inflate_sync().
- */
- if (flush == Z_FULL_FLUSH) {
- CLEAR_HASH(s); /* forget history */
- }
- }
- flush_pending(strm);
- if (strm->avail_out == 0) {
- s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */
- return Z_OK;
- }
- }
- }
- Assert(strm->avail_out > 0, "bug2");
-
- if (flush != Z_FINISH) return Z_OK;
- if (s->noheader) return Z_STREAM_END;
-
- /* Write the zlib trailer (adler32) */
- putShortMSB(s, (uInt)(strm->adler >> 16));
- putShortMSB(s, (uInt)(strm->adler & 0xffff));
- flush_pending(strm);
- /* If avail_out is zero, the application will call deflate again
- * to flush the rest.
- */
- s->noheader = -1; /* write the trailer only once! */
- return s->pending != 0 ? Z_OK : Z_STREAM_END;
-}
-
-/* ========================================================================= */
-int ZEXPORT deflateEnd (z_streamp strm)
-{
- int status;
-
- if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
-
- status = strm->state->status;
- if (status != INIT_STATE && status != BUSY_STATE &&
- status != FINISH_STATE) {
- return Z_STREAM_ERROR;
- }
-
- /* Deallocate in reverse order of allocations: */
- TRY_FREE(strm, strm->state->pending_buf);
- TRY_FREE(strm, strm->state->head);
- TRY_FREE(strm, strm->state->prev);
- TRY_FREE(strm, strm->state->window);
-
- ZFREE(strm, strm->state);
- strm->state = Z_NULL;
-
- return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK;
-}
-
-/* =========================================================================
- * Copy the source state to the destination state.
- * To simplify the source, this is not supported for 16-bit MSDOS (which
- * doesn't have enough memory anyway to duplicate compression states).
- */
-int ZEXPORT deflateCopy (z_streamp dest, z_streamp source)
-{
-#ifdef MAXSEG_64K
- return Z_STREAM_ERROR;
-#else
- deflate_state *ds;
- deflate_state *ss;
- ushf *overlay;
-
-
- if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) {
- return Z_STREAM_ERROR;
- }
-
- ss = source->state;
-
- *dest = *source;
-
- ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state));
- if (ds == Z_NULL) return Z_MEM_ERROR;
- dest->state = (struct internal_state FAR *) ds;
- *ds = *ss;
- ds->strm = dest;
-
- ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));
- ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos));
- ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos));
- overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2);
- ds->pending_buf = (uchf *) overlay;
-
- if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL ||
- ds->pending_buf == Z_NULL) {
- deflateEnd (dest);
- return Z_MEM_ERROR;
- }
- /* following zmemcpy do not work for 16-bit MSDOS */
- zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte));
- zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos));
- zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos));
- zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size);
-
- ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);
- ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush);
- ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize;
-
- ds->l_desc.dyn_tree = ds->dyn_ltree;
- ds->d_desc.dyn_tree = ds->dyn_dtree;
- ds->bl_desc.dyn_tree = ds->bl_tree;
-
- return Z_OK;
-#endif
-}
-
-/* ===========================================================================
- * Read a new buffer from the current input stream, update the adler32
- * and total number of bytes read. All deflate() input goes through
- * this function so some applications may wish to modify it to avoid
- * allocating a large strm->next_in buffer and copying from it.
- * (See also flush_pending()).
- */
-local int read_buf(z_streamp strm, Bytef *buf, unsigned int size)
-{
- unsigned len = strm->avail_in;
-
- if (len > size) len = size;
- if (len == 0) return 0;
-
- strm->avail_in -= len;
-
- if (!strm->state->noheader) {
- strm->adler = adler32(strm->adler, strm->next_in, len);
- }
- zmemcpy(buf, strm->next_in, len);
- strm->next_in += len;
- strm->total_in += len;
-
- return (int)len;
-}
-
-/* ===========================================================================
- * Initialize the "longest match" routines for a new zlib stream
- */
-local void lm_init (deflate_state *s)
-{
- s->window_size = (ulg)2L*s->w_size;
-
- CLEAR_HASH(s);
-
- /* Set the default configuration parameters:
- */
- s->max_lazy_match = configuration_table[s->level].max_lazy;
- s->good_match = configuration_table[s->level].good_length;
- s->nice_match = configuration_table[s->level].nice_length;
- s->max_chain_length = configuration_table[s->level].max_chain;
-
- s->strstart = 0;
- s->block_start = 0L;
- s->lookahead = 0;
- s->match_length = s->prev_length = MIN_MATCH-1;
- s->match_available = 0;
- s->ins_h = 0;
-#ifdef ASMV
- match_init(); /* initialize the asm code */
-#endif
-}
-
-/* ===========================================================================
- * Set match_start to the longest match starting at the given string and
- * return its length. Matches shorter or equal to prev_length are discarded,
- * in which case the result is equal to prev_length and match_start is
- * garbage.
- * IN assertions: cur_match is the head of the hash chain for the current
- * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
- * OUT assertion: the match length is not greater than s->lookahead.
- */
-#ifndef ASMV
-/* For 80x86 and 680x0, an optimized version will be provided in match.asm or
- * match.S. The code will be functionally equivalent.
- */
-#ifndef FASTEST
-local uInt longest_match(deflate_state *s, IPos cur_match)
-
- /* current match */
-{
- unsigned chain_length = s->max_chain_length;/* max hash chain length */
- register Bytef *scan = s->window + s->strstart; /* current string */
- register Bytef *match; /* matched string */
- register int len; /* length of current match */
- int best_len = s->prev_length; /* best match length so far */
- int nice_match = s->nice_match; /* stop if match long enough */
- IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
- s->strstart - (IPos)MAX_DIST(s) : NIL;
- /* Stop when cur_match becomes <= limit. To simplify the code,
- * we prevent matches with the string of window index 0.
- */
- Posf *prev = s->prev;
- uInt wmask = s->w_mask;
-
-#ifdef UNALIGNED_OK
- /* Compare two bytes at a time. Note: this is not always beneficial.
- * Try with and without -DUNALIGNED_OK to check.
- */
- register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;
- register ush scan_start = *(ushf*)scan;
- register ush scan_end = *(ushf*)(scan+best_len-1);
-#else
- register Bytef *strend = s->window + s->strstart + MAX_MATCH;
- register Byte scan_end1 = scan[best_len-1];
- register Byte scan_end = scan[best_len];
-#endif
-
- /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
- * It is easy to get rid of this optimization if necessary.
- */
- Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
-
- /* Do not waste too much time if we already have a good match: */
- if (s->prev_length >= s->good_match) {
- chain_length >>= 2;
- }
- /* Do not look for matches beyond the end of the input. This is necessary
- * to make deflate deterministic.
- */
- if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
-
- Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
-
- do {
- Assert(cur_match < s->strstart, "no future");
- match = s->window + cur_match;
-
- /* Skip to next match if the match length cannot increase
- * or if the match length is less than 2:
- */
-#if (defined(UNALIGNED_OK) && MAX_MATCH == 258)
- /* This code assumes sizeof(unsigned short) == 2. Do not use
- * UNALIGNED_OK if your compiler uses a different size.
- */
- if (*(ushf*)(match+best_len-1) != scan_end ||
- *(ushf*)match != scan_start) continue;
-
- /* It is not necessary to compare scan[2] and match[2] since they are
- * always equal when the other bytes match, given that the hash keys
- * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at
- * strstart+3, +5, ... up to strstart+257. We check for insufficient
- * lookahead only every 4th comparison; the 128th check will be made
- * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is
- * necessary to put more guard bytes at the end of the window, or
- * to check more often for insufficient lookahead.
- */
- Assert(scan[2] == match[2], "scan[2]?");
- scan++, match++;
- do {
- } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
- *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
- *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
- *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
- scan < strend);
- /* The funny "do {}" generates better code on most compilers */
-
- /* Here, scan <= window+strstart+257 */
- Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
- if (*scan == *match) scan++;
-
- len = (MAX_MATCH - 1) - (int)(strend-scan);
- scan = strend - (MAX_MATCH-1);
-
-#else /* UNALIGNED_OK */
-
- if (match[best_len] != scan_end ||
- match[best_len-1] != scan_end1 ||
- *match != *scan ||
- *++match != scan[1]) continue;
-
- /* The check at best_len-1 can be removed because it will be made
- * again later. (This heuristic is not always a win.)
- * It is not necessary to compare scan[2] and match[2] since they
- * are always equal when the other bytes match, given that
- * the hash keys are equal and that HASH_BITS >= 8.
- */
- scan += 2, match++;
- Assert(*scan == *match, "match[2]?");
-
- /* We check for insufficient lookahead only every 8th comparison;
- * the 256th check will be made at strstart+258.
- */
- do {
- } while (*++scan == *++match && *++scan == *++match &&
- *++scan == *++match && *++scan == *++match &&
- *++scan == *++match && *++scan == *++match &&
- *++scan == *++match && *++scan == *++match &&
- scan < strend);
-
- Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
-
- len = MAX_MATCH - (int)(strend - scan);
- scan = strend - MAX_MATCH;
-
-#endif /* UNALIGNED_OK */
-
- if (len > best_len) {
- s->match_start = cur_match;
- best_len = len;
- if (len >= nice_match) break;
-#ifdef UNALIGNED_OK
- scan_end = *(ushf*)(scan+best_len-1);
-#else
- scan_end1 = scan[best_len-1];
- scan_end = scan[best_len];
-#endif
- }
- } while ((cur_match = prev[cur_match & wmask]) > limit
- && --chain_length != 0);
-
- if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
- return s->lookahead;
-}
-
-#else /* FASTEST */
-/* ---------------------------------------------------------------------------
- * Optimized version for level == 1 only
- */
-local uInt longest_match(deflate_state *s, IPos cur_match)
-{
- register Bytef *scan = s->window + s->strstart; /* current string */
- register Bytef *match; /* matched string */
- register int len; /* length of current match */
- register Bytef *strend = s->window + s->strstart + MAX_MATCH;
-
- /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
- * It is easy to get rid of this optimization if necessary.
- */
- Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
-
- Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
-
- Assert(cur_match < s->strstart, "no future");
-
- match = s->window + cur_match;
-
- /* Return failure if the match length is less than 2:
- */
- if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1;
-
- /* The check at best_len-1 can be removed because it will be made
- * again later. (This heuristic is not always a win.)
- * It is not necessary to compare scan[2] and match[2] since they
- * are always equal when the other bytes match, given that
- * the hash keys are equal and that HASH_BITS >= 8.
- */
- scan += 2, match += 2;
- Assert(*scan == *match, "match[2]?");
-
- /* We check for insufficient lookahead only every 8th comparison;
- * the 256th check will be made at strstart+258.
- */
- do {
- } while (*++scan == *++match && *++scan == *++match &&
- *++scan == *++match && *++scan == *++match &&
- *++scan == *++match && *++scan == *++match &&
- *++scan == *++match && *++scan == *++match &&
- scan < strend);
-
- Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
-
- len = MAX_MATCH - (int)(strend - scan);
-
- if (len < MIN_MATCH) return MIN_MATCH - 1;
-
- s->match_start = cur_match;
- return len <= s->lookahead ? len : s->lookahead;
-}
-#endif /* FASTEST */
-#endif /* ASMV */
-
-#ifdef DEBUG
-/* ===========================================================================
- * Check that the match at match_start is indeed a match.
- */
-local void check_match(default_state *s, IPos start, IPos match, int length)
-{
- /* check that the match is indeed a match */
- if (zmemcmp(s->window + match,
- s->window + start, length) != EQUAL) {
- fprintf(stderr, " start %u, match %u, length %d\n",
- start, match, length);
- do {
- fprintf(stderr, "%c%c", s->window[match++], s->window[start++]);
- } while (--length != 0);
- z_error("invalid match");
- }
- if (z_verbose > 1) {
- fprintf(stderr,"\\[%d,%d]", start-match, length);
- do { putc(s->window[start++], stderr); } while (--length != 0);
- }
-}
-#else
-# define check_match(s, start, match, length)
-#endif
-
-/* ===========================================================================
- * Fill the window when the lookahead becomes insufficient.
- * Updates strstart and lookahead.
- *
- * IN assertion: lookahead < MIN_LOOKAHEAD
- * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
- * At least one byte has been read, or avail_in == 0; reads are
- * performed for at least two bytes (required for the zip translate_eol
- * option -- not supported here).
- */
-local void fill_window(deflate_state *s)
-{
- register unsigned n, m;
- register Posf *p;
- unsigned more; /* Amount of free space at the end of the window. */
- uInt wsize = s->w_size;
-
- do {
- more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);
-
- /* Deal with !@#$% 64K limit: */
- if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
- more = wsize;
-
- } else if (more == (unsigned)(-1)) {
- /* Very unlikely, but possible on 16 bit machine if strstart == 0
- * and lookahead == 1 (input done one byte at time)
- */
- more--;
-
- /* If the window is almost full and there is insufficient lookahead,
- * move the upper half to the lower one to make room in the upper half.
- */
- } else if (s->strstart >= wsize+MAX_DIST(s)) {
-
- zmemcpy(s->window, s->window+wsize, (unsigned)wsize);
- s->match_start -= wsize;
- s->strstart -= wsize; /* we now have strstart >= MAX_DIST */
- s->block_start -= (long) wsize;
-
- /* Slide the hash table (could be avoided with 32 bit values
- at the expense of memory usage). We slide even when level == 0
- to keep the hash table consistent if we switch back to level > 0
- later. (Using level 0 permanently is not an optimal usage of
- zlib, so we don't care about this pathological case.)
- */
- n = s->hash_size;
- p = &s->head[n];
- do {
- m = *--p;
- *p = (Pos)(m >= wsize ? m-wsize : NIL);
- } while (--n);
-
- n = wsize;
-#ifndef FASTEST
- p = &s->prev[n];
- do {
- m = *--p;
- *p = (Pos)(m >= wsize ? m-wsize : NIL);
- /* If n is not on any hash chain, prev[n] is garbage but
- * its value will never be used.
- */
- } while (--n);
-#endif
- more += wsize;
- }
- if (s->strm->avail_in == 0) return;
-
- /* If there was no sliding:
- * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
- * more == window_size - lookahead - strstart
- * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
- * => more >= window_size - 2*WSIZE + 2
- * In the BIG_MEM or MMAP case (not yet supported),
- * window_size == input_size + MIN_LOOKAHEAD &&
- * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
- * Otherwise, window_size == 2*WSIZE so more >= 2.
- * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
- */
- Assert(more >= 2, "more < 2");
-
- n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);
- s->lookahead += n;
-
- /* Initialize the hash value now that we have some input: */
- if (s->lookahead >= MIN_MATCH) {
- s->ins_h = s->window[s->strstart];
- UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
-#if MIN_MATCH != 3
- Call UPDATE_HASH() MIN_MATCH-3 more times
-#endif
- }
- /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
- * but this is not important since only literal bytes will be emitted.
- */
-
- } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);
-}
-
-/* ===========================================================================
- * Flush the current block, with given end-of-file flag.
- * IN assertion: strstart is set to the end of the current match.
- */
-#define FLUSH_BLOCK_ONLY(s, eof) { \
- _tr_flush_block(s, (s->block_start >= 0L ? \
- (charf *)&s->window[(unsigned)s->block_start] : \
- (charf *)Z_NULL), \
- (ulg)((long)s->strstart - s->block_start), \
- (eof)); \
- s->block_start = s->strstart; \
- flush_pending(s->strm); \
- Tracev((stderr,"[FLUSH]")); \
-}
-
-/* Same but force premature exit if necessary. */
-#define FLUSH_BLOCK(s, eof) { \
- FLUSH_BLOCK_ONLY(s, eof); \
- if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \
-}
-
-/* ===========================================================================
- * Copy without compression as much as possible from the input stream, return
- * the current block state.
- * This function does not insert new strings in the dictionary since
- * uncompressible data is probably not useful. This function is used
- * only for the level=0 compression option.
- * NOTE: this function should be optimized to avoid extra copying from
- * window to pending_buf.
- */
-local block_state deflate_stored(deflate_state *s, int flush)
-{
- /* Stored blocks are limited to 0xffff bytes, pending_buf is limited
- * to pending_buf_size, and each stored block has a 5 byte header:
- */
- ulg max_block_size = 0xffff;
- ulg max_start;
-
- if (max_block_size > s->pending_buf_size - 5) {
- max_block_size = s->pending_buf_size - 5;
- }
-
- /* Copy as much as possible from input to output: */
- for (;;) {
- /* Fill the window as much as possible: */
- if (s->lookahead <= 1) {
-
- Assert(s->strstart < s->w_size+MAX_DIST(s) ||
- s->block_start >= (long)s->w_size, "slide too late");
-
- fill_window(s);
- if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more;
-
- if (s->lookahead == 0) break; /* flush the current block */
- }
- Assert(s->block_start >= 0L, "block gone");
-
- s->strstart += s->lookahead;
- s->lookahead = 0;
-
- /* Emit a stored block if pending_buf will be full: */
- max_start = s->block_start + max_block_size;
- if (s->strstart == 0 || (ulg)s->strstart >= max_start) {
- /* strstart == 0 is possible when wraparound on 16-bit machine */
- s->lookahead = (uInt)(s->strstart - max_start);
- s->strstart = (uInt)max_start;
- FLUSH_BLOCK(s, 0);
- }
- /* Flush if we may have to slide, otherwise block_start may become
- * negative and the data will be gone:
- */
- if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) {
- FLUSH_BLOCK(s, 0);
- }
- }
- FLUSH_BLOCK(s, flush == Z_FINISH);
- return flush == Z_FINISH ? finish_done : block_done;
-}
-
-/* ===========================================================================
- * Compress as much as possible from the input stream, return the current
- * block state.
- * This function does not perform lazy evaluation of matches and inserts
- * new strings in the dictionary only for unmatched strings or for short
- * matches. It is used only for the fast compression options.
- */
-local block_state deflate_fast(deflate_state *s, int flush)
-{
- IPos hash_head = NIL; /* head of the hash chain */
- int bflush; /* set if current block must be flushed */
-
- for (;;) {
- /* Make sure that we always have enough lookahead, except
- * at the end of the input file. We need MAX_MATCH bytes
- * for the next match, plus MIN_MATCH bytes to insert the
- * string following the next match.
- */
- if (s->lookahead < MIN_LOOKAHEAD) {
- fill_window(s);
- if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
- return need_more;
- }
- if (s->lookahead == 0) break; /* flush the current block */
- }
-
- /* Insert the string window[strstart .. strstart+2] in the
- * dictionary, and set hash_head to the head of the hash chain:
- */
- if (s->lookahead >= MIN_MATCH) {
- INSERT_STRING(s, s->strstart, hash_head);
- }
-
- /* Find the longest match, discarding those <= prev_length.
- * At this point we have always match_length < MIN_MATCH
- */
- if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) {
- /* To simplify the code, we prevent matches with the string
- * of window index 0 (in particular we have to avoid a match
- * of the string with itself at the start of the input file).
- */
- if (s->strategy != Z_HUFFMAN_ONLY) {
- s->match_length = longest_match (s, hash_head);
- }
- /* longest_match() sets match_start */
- }
- if (s->match_length >= MIN_MATCH) {
- check_match(s, s->strstart, s->match_start, s->match_length);
-
- _tr_tally_dist(s, s->strstart - s->match_start,
- s->match_length - MIN_MATCH, bflush);
-
- s->lookahead -= s->match_length;
-
- /* Insert new strings in the hash table only if the match length
- * is not too large. This saves time but degrades compression.
- */
-#ifndef FASTEST
- if (s->match_length <= s->max_insert_length &&
- s->lookahead >= MIN_MATCH) {
- s->match_length--; /* string at strstart already in hash table */
- do {
- s->strstart++;
- INSERT_STRING(s, s->strstart, hash_head);
- /* strstart never exceeds WSIZE-MAX_MATCH, so there are
- * always MIN_MATCH bytes ahead.
- */
- } while (--s->match_length != 0);
- s->strstart++;
- } else
-#endif
- {
- s->strstart += s->match_length;
- s->match_length = 0;
- s->ins_h = s->window[s->strstart];
- UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
-#if MIN_MATCH != 3
- Call UPDATE_HASH() MIN_MATCH-3 more times
-#endif
- /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
- * matter since it will be recomputed at next deflate call.
- */
- }
- } else {
- /* No match, output a literal byte */
- Tracevv((stderr,"%c", s->window[s->strstart]));
- _tr_tally_lit (s, s->window[s->strstart], bflush);
- s->lookahead--;
- s->strstart++;
- }
- if (bflush) FLUSH_BLOCK(s, 0);
- }
- FLUSH_BLOCK(s, flush == Z_FINISH);
- return flush == Z_FINISH ? finish_done : block_done;
-}
-
-/* ===========================================================================
- * Same as above, but achieves better compression. We use a lazy
- * evaluation for matches: a match is finally adopted only if there is
- * no better match at the next window position.
- */
-local block_state deflate_slow(deflate_state *s, int flush)
-{
- IPos hash_head = NIL; /* head of hash chain */
- int bflush; /* set if current block must be flushed */
-
- /* Process the input block. */
- for (;;) {
- /* Make sure that we always have enough lookahead, except
- * at the end of the input file. We need MAX_MATCH bytes
- * for the next match, plus MIN_MATCH bytes to insert the
- * string following the next match.
- */
- if (s->lookahead < MIN_LOOKAHEAD) {
- fill_window(s);
- if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
- return need_more;
- }
- if (s->lookahead == 0) break; /* flush the current block */
- }
-
- /* Insert the string window[strstart .. strstart+2] in the
- * dictionary, and set hash_head to the head of the hash chain:
- */
- if (s->lookahead >= MIN_MATCH) {
- INSERT_STRING(s, s->strstart, hash_head);
- }
-
- /* Find the longest match, discarding those <= prev_length.
- */
- s->prev_length = s->match_length, s->prev_match = s->match_start;
- s->match_length = MIN_MATCH-1;
-
- if (hash_head != NIL && s->prev_length < s->max_lazy_match &&
- s->strstart - hash_head <= MAX_DIST(s)) {
- /* To simplify the code, we prevent matches with the string
- * of window index 0 (in particular we have to avoid a match
- * of the string with itself at the start of the input file).
- */
- if (s->strategy != Z_HUFFMAN_ONLY) {
- s->match_length = longest_match (s, hash_head);
- }
- /* longest_match() sets match_start */
-
- if (s->match_length <= 5 && (s->strategy == Z_FILTERED ||
- (s->match_length == MIN_MATCH &&
- s->strstart - s->match_start > TOO_FAR))) {
-
- /* If prev_match is also MIN_MATCH, match_start is garbage
- * but we will ignore the current match anyway.
- */
- s->match_length = MIN_MATCH-1;
- }
- }
- /* If there was a match at the previous step and the current
- * match is not better, output the previous match:
- */
- if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) {
- uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;
- /* Do not insert strings in hash table beyond this. */
-
- check_match(s, s->strstart-1, s->prev_match, s->prev_length);
-
- _tr_tally_dist(s, s->strstart -1 - s->prev_match,
- s->prev_length - MIN_MATCH, bflush);
-
- /* Insert in hash table all strings up to the end of the match.
- * strstart-1 and strstart are already inserted. If there is not
- * enough lookahead, the last two strings are not inserted in
- * the hash table.
- */
- s->lookahead -= s->prev_length-1;
- s->prev_length -= 2;
- do {
- if (++s->strstart <= max_insert) {
- INSERT_STRING(s, s->strstart, hash_head);
- }
- } while (--s->prev_length != 0);
- s->match_available = 0;
- s->match_length = MIN_MATCH-1;
- s->strstart++;
-
- if (bflush) FLUSH_BLOCK(s, 0);
-
- } else if (s->match_available) {
- /* If there was no match at the previous position, output a
- * single literal. If there was a match but the current match
- * is longer, truncate the previous match to a single literal.
- */
- Tracevv((stderr,"%c", s->window[s->strstart-1]));
- _tr_tally_lit(s, s->window[s->strstart-1], bflush);
- if (bflush) {
- FLUSH_BLOCK_ONLY(s, 0);
- }
- s->strstart++;
- s->lookahead--;
- if (s->strm->avail_out == 0) return need_more;
- } else {
- /* There is no previous match to compare with, wait for
- * the next step to decide.
- */
- s->match_available = 1;
- s->strstart++;
- s->lookahead--;
- }
- }
- Assert (flush != Z_NO_FLUSH, "no flush?");
- if (s->match_available) {
- Tracevv((stderr,"%c", s->window[s->strstart-1]));
- _tr_tally_lit(s, s->window[s->strstart-1], bflush);
- s->match_available = 0;
- }
- FLUSH_BLOCK(s, flush == Z_FINISH);
- return flush == Z_FINISH ? finish_done : block_done;
-}
diff --git a/libpng/deflate.h b/libpng/deflate.h
deleted file mode 100644
index b99a48a..0000000
--- a/libpng/deflate.h
+++ /dev/null
@@ -1,318 +0,0 @@
-/* deflate.h -- internal compression state
- * Copyright (C) 1995-2002 Jean-loup Gailly
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* WARNING: this file should *not* be used by applications. It is
- part of the implementation of the compression library and is
- subject to change. Applications should only use zlib.h.
- */
-
-/* @(#) $Id$ */
-
-#ifndef _DEFLATE_H
-#define _DEFLATE_H
-
-#include "zutil.h"
-
-/* ===========================================================================
- * Internal compression state.
- */
-
-#define LENGTH_CODES 29
-/* number of length codes, not counting the special END_BLOCK code */
-
-#define LITERALS 256
-/* number of literal bytes 0..255 */
-
-#define L_CODES (LITERALS+1+LENGTH_CODES)
-/* number of Literal or Length codes, including the END_BLOCK code */
-
-#define D_CODES 30
-/* number of distance codes */
-
-#define BL_CODES 19
-/* number of codes used to transfer the bit lengths */
-
-#define HEAP_SIZE (2*L_CODES+1)
-/* maximum heap size */
-
-#define MAX_BITS 15
-/* All codes must not exceed MAX_BITS bits */
-
-#define INIT_STATE 42
-#define BUSY_STATE 113
-#define FINISH_STATE 666
-/* Stream status */
-
-
-/* Data structure describing a single value and its code string. */
-typedef struct ct_data_s {
- union {
- ush freq; /* frequency count */
- ush code; /* bit string */
- } fc;
- union {
- ush dad; /* father node in Huffman tree */
- ush len; /* length of bit string */
- } dl;
-} FAR ct_data;
-
-#define Freq fc.freq
-#define Code fc.code
-#define Dad dl.dad
-#define Len dl.len
-
-typedef struct static_tree_desc_s static_tree_desc;
-
-typedef struct tree_desc_s {
- ct_data *dyn_tree; /* the dynamic tree */
- int max_code; /* largest code with non zero frequency */
- static_tree_desc *stat_desc; /* the corresponding static tree */
-} FAR tree_desc;
-
-typedef ush Pos;
-typedef Pos FAR Posf;
-typedef unsigned IPos;
-
-/* A Pos is an index in the character window. We use short instead of int to
- * save space in the various tables. IPos is used only for parameter passing.
- */
-
-typedef struct internal_state {
- z_streamp strm; /* pointer back to this zlib stream */
- int status; /* as the name implies */
- Bytef *pending_buf; /* output still pending */
- ulg pending_buf_size; /* size of pending_buf */
- Bytef *pending_out; /* next pending byte to output to the stream */
- int pending; /* nb of bytes in the pending buffer */
- int noheader; /* suppress zlib header and adler32 */
- Byte data_type; /* UNKNOWN, BINARY or ASCII */
- Byte method; /* STORED (for zip only) or DEFLATED */
- int last_flush; /* value of flush param for previous deflate call */
-
- /* used by deflate.c: */
-
- uInt w_size; /* LZ77 window size (32K by default) */
- uInt w_bits; /* log2(w_size) (8..16) */
- uInt w_mask; /* w_size - 1 */
-
- Bytef *window;
- /* Sliding window. Input bytes are read into the second half of the window,
- * and move to the first half later to keep a dictionary of at least wSize
- * bytes. With this organization, matches are limited to a distance of
- * wSize-MAX_MATCH bytes, but this ensures that IO is always
- * performed with a length multiple of the block size. Also, it limits
- * the window size to 64K, which is quite useful on MSDOS.
- * To do: use the user input buffer as sliding window.
- */
-
- ulg window_size;
- /* Actual size of window: 2*wSize, except when the user input buffer
- * is directly used as sliding window.
- */
-
- Posf *prev;
- /* Link to older string with same hash index. To limit the size of this
- * array to 64K, this link is maintained only for the last 32K strings.
- * An index in this array is thus a window index modulo 32K.
- */
-
- Posf *head; /* Heads of the hash chains or NIL. */
-
- uInt ins_h; /* hash index of string to be inserted */
- uInt hash_size; /* number of elements in hash table */
- uInt hash_bits; /* log2(hash_size) */
- uInt hash_mask; /* hash_size-1 */
-
- uInt hash_shift;
- /* Number of bits by which ins_h must be shifted at each input
- * step. It must be such that after MIN_MATCH steps, the oldest
- * byte no longer takes part in the hash key, that is:
- * hash_shift * MIN_MATCH >= hash_bits
- */
-
- long block_start;
- /* Window position at the beginning of the current output block. Gets
- * negative when the window is moved backwards.
- */
-
- uInt match_length; /* length of best match */
- IPos prev_match; /* previous match */
- int match_available; /* set if previous match exists */
- uInt strstart; /* start of string to insert */
- uInt match_start; /* start of matching string */
- uInt lookahead; /* number of valid bytes ahead in window */
-
- uInt prev_length;
- /* Length of the best match at previous step. Matches not greater than this
- * are discarded. This is used in the lazy match evaluation.
- */
-
- uInt max_chain_length;
- /* To speed up deflation, hash chains are never searched beyond this
- * length. A higher limit improves compression ratio but degrades the
- * speed.
- */
-
- uInt max_lazy_match;
- /* Attempt to find a better match only when the current match is strictly
- * smaller than this value. This mechanism is used only for compression
- * levels >= 4.
- */
-# define max_insert_length max_lazy_match
- /* Insert new strings in the hash table only if the match length is not
- * greater than this length. This saves time but degrades compression.
- * max_insert_length is used only for compression levels <= 3.
- */
-
- int level; /* compression level (1..9) */
- int strategy; /* favor or force Huffman coding*/
-
- uInt good_match;
- /* Use a faster search when the previous match is longer than this */
-
- int nice_match; /* Stop searching when current match exceeds this */
-
- /* used by trees.c: */
- /* Didn't use ct_data typedef below to supress compiler warning */
- struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */
- struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
- struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */
-
- struct tree_desc_s l_desc; /* desc. for literal tree */
- struct tree_desc_s d_desc; /* desc. for distance tree */
- struct tree_desc_s bl_desc; /* desc. for bit length tree */
-
- ush bl_count[MAX_BITS+1];
- /* number of codes at each bit length for an optimal tree */
-
- int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */
- int heap_len; /* number of elements in the heap */
- int heap_max; /* element of largest frequency */
- /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
- * The same heap array is used to build all trees.
- */
-
- uch depth[2*L_CODES+1];
- /* Depth of each subtree used as tie breaker for trees of equal frequency
- */
-
- uchf *l_buf; /* buffer for literals or lengths */
-
- uInt lit_bufsize;
- /* Size of match buffer for literals/lengths. There are 4 reasons for
- * limiting lit_bufsize to 64K:
- * - frequencies can be kept in 16 bit counters
- * - if compression is not successful for the first block, all input
- * data is still in the window so we can still emit a stored block even
- * when input comes from standard input. (This can also be done for
- * all blocks if lit_bufsize is not greater than 32K.)
- * - if compression is not successful for a file smaller than 64K, we can
- * even emit a stored file instead of a stored block (saving 5 bytes).
- * This is applicable only for zip (not gzip or zlib).
- * - creating new Huffman trees less frequently may not provide fast
- * adaptation to changes in the input data statistics. (Take for
- * example a binary file with poorly compressible code followed by
- * a highly compressible string table.) Smaller buffer sizes give
- * fast adaptation but have of course the overhead of transmitting
- * trees more frequently.
- * - I can't count above 4
- */
-
- uInt last_lit; /* running index in l_buf */
-
- ushf *d_buf;
- /* Buffer for distances. To simplify the code, d_buf and l_buf have
- * the same number of elements. To use different lengths, an extra flag
- * array would be necessary.
- */
-
- ulg opt_len; /* bit length of current block with optimal trees */
- ulg static_len; /* bit length of current block with static trees */
- uInt matches; /* number of string matches in current block */
- int last_eob_len; /* bit length of EOB code for last block */
-
-#ifdef DEBUG
- ulg compressed_len; /* total bit length of compressed file mod 2^32 */
- ulg bits_sent; /* bit length of compressed data sent mod 2^32 */
-#endif
-
- ush bi_buf;
- /* Output buffer. bits are inserted starting at the bottom (least
- * significant bits).
- */
- int bi_valid;
- /* Number of valid bits in bi_buf. All bits above the last valid bit
- * are always zero.
- */
-
-} FAR deflate_state;
-
-/* Output a byte on the stream.
- * IN assertion: there is enough room in pending_buf.
- */
-#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);}
-
-
-#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)
-/* Minimum amount of lookahead, except at the end of the input file.
- * See deflate.c for comments about the MIN_MATCH+1.
- */
-
-#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD)
-/* In order to simplify the code, particularly on 16 bit machines, match
- * distances are limited to MAX_DIST instead of WSIZE.
- */
-
- /* in trees.c */
-void _tr_init OF((deflate_state *s));
-int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc));
-void _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len,
- int eof));
-void _tr_align OF((deflate_state *s));
-void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len,
- int eof));
-
-#define d_code(dist) \
- ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)])
-/* Mapping from a distance to a distance code. dist is the distance - 1 and
- * must not have side effects. _dist_code[256] and _dist_code[257] are never
- * used.
- */
-
-#ifndef DEBUG
-/* Inline versions of _tr_tally for speed: */
-
-#if defined(GEN_TREES_H) || !defined(STDC)
- extern uch _length_code[];
- extern uch _dist_code[];
-#else
- extern const uch _length_code[];
- extern const uch _dist_code[];
-#endif
-
-# define _tr_tally_lit(s, c, flush) \
- { uch cc = (c); \
- s->d_buf[s->last_lit] = 0; \
- s->l_buf[s->last_lit++] = cc; \
- s->dyn_ltree[cc].Freq++; \
- flush = (s->last_lit == s->lit_bufsize-1); \
- }
-# define _tr_tally_dist(s, distance, length, flush) \
- { uch len = (length); \
- ush dist = (distance); \
- s->d_buf[s->last_lit] = dist; \
- s->l_buf[s->last_lit++] = len; \
- dist--; \
- s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \
- s->dyn_dtree[d_code(dist)].Freq++; \
- flush = (s->last_lit == s->lit_bufsize-1); \
- }
-#else
-# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c)
-# define _tr_tally_dist(s, distance, length, flush) \
- flush = _tr_tally(s, distance, length)
-#endif
-
-#endif
diff --git a/libpng/gzio.c b/libpng/gzio.c
deleted file mode 100644
index 2723a0e..0000000
--- a/libpng/gzio.c
+++ /dev/null
@@ -1,831 +0,0 @@
-/* gzio.c -- IO on .gz files
- * Copyright (C) 1995-2002 Jean-loup Gailly.
- * For conditions of distribution and use, see copyright notice in zlib.h
- *
- * Compile this file with -DNO_DEFLATE to avoid the compression code.
- */
-
-/* @(#) $Id$ */
-
-#include <stdio.h>
-
-#include "zutil.h"
-
-struct internal_state {int dummy;}; /* for buggy compilers */
-
-#ifndef Z_BUFSIZE
-# ifdef MAXSEG_64K
-# define Z_BUFSIZE 4096 /* minimize memory usage for 16-bit DOS */
-# else
-# define Z_BUFSIZE 16384
-# endif
-#endif
-#ifndef Z_PRINTF_BUFSIZE
-# define Z_PRINTF_BUFSIZE 4096
-#endif
-
-#define ALLOC(size) malloc(size)
-#define TRYFREE(p) {if (p) free(p);}
-
-static int gz_magic[2] = {0x1f, 0x8b}; /* gzip magic header */
-
-/* gzip flag byte */
-#define ASCII_FLAG 0x01 /* bit 0 set: file probably ascii text */
-#define HEAD_CRC 0x02 /* bit 1 set: header CRC present */
-#define EXTRA_FIELD 0x04 /* bit 2 set: extra field present */
-#define ORIG_NAME 0x08 /* bit 3 set: original file name present */
-#define COMMENT 0x10 /* bit 4 set: file comment present */
-#define RESERVED 0xE0 /* bits 5..7: reserved */
-
-typedef struct gz_stream {
- z_stream stream;
- int z_err; /* error code for last stream operation */
- int z_eof; /* set if end of input file */
- FILE *file; /* .gz file */
- Byte *inbuf; /* input buffer */
- Byte *outbuf; /* output buffer */
- uLong crc; /* crc32 of uncompressed data */
- char *msg; /* error message */
- char *path; /* path name for debugging only */
- int transparent; /* 1 if input file is not a .gz file */
- char mode; /* 'w' or 'r' */
- long startpos; /* start of compressed data in file (header skipped) */
-} gz_stream;
-
-
-local gzFile gz_open OF((const char *path, const char *mode, int fd));
-local int do_flush OF((gzFile file, int flush));
-local int get_byte OF((gz_stream *s));
-local void check_header OF((gz_stream *s));
-local int destroy OF((gz_stream *s));
-local void putLong OF((FILE *file, uLong x));
-local uLong getLong OF((gz_stream *s));
-
-/* ===========================================================================
- Opens a gzip (.gz) file for reading or writing. The mode parameter
- is as in fopen ("rb" or "wb"). The file is given either by file descriptor
- or path name (if fd == -1).
- gz_open return NULL if the file could not be opened or if there was
- insufficient memory to allocate the (de)compression state; errno
- can be checked to distinguish the two cases (if errno is zero, the
- zlib error is Z_MEM_ERROR).
-*/
-local gzFile gz_open (const char *path, const char *mode, int fd)
-{
- int err;
- int level = Z_DEFAULT_COMPRESSION; /* compression level */
- int strategy = Z_DEFAULT_STRATEGY; /* compression strategy */
- char *p = (char*)mode;
- gz_stream *s;
- char fmode[80]; /* copy of mode, without the compression level */
- char *m = fmode;
-
- if (!path || !mode) return Z_NULL;
-
- s = (gz_stream *)ALLOC(sizeof(gz_stream));
- if (!s) return Z_NULL;
-
- s->stream.zalloc = (alloc_func)0;
- s->stream.zfree = (free_func)0;
- s->stream.opaque = (voidpf)0;
- s->stream.next_in = s->inbuf = Z_NULL;
- s->stream.next_out = s->outbuf = Z_NULL;
- s->stream.avail_in = s->stream.avail_out = 0;
- s->file = NULL;
- s->z_err = Z_OK;
- s->z_eof = 0;
- s->crc = crc32(0L, Z_NULL, 0);
- s->msg = NULL;
- s->transparent = 0;
-
- s->path = (char*)ALLOC(strlen(path)+1);
- if (s->path == NULL) {
- return destroy(s), (gzFile)Z_NULL;
- }
- strcpy(s->path, path); /* do this early for debugging */
-
- s->mode = '\0';
- do {
- if (*p == 'r') s->mode = 'r';
- if (*p == 'w' || *p == 'a') s->mode = 'w';
- if (*p >= '0' && *p <= '9') {
- level = *p - '0';
- } else if (*p == 'f') {
- strategy = Z_FILTERED;
- } else if (*p == 'h') {
- strategy = Z_HUFFMAN_ONLY;
- } else {
- *m++ = *p; /* copy the mode */
- }
- } while (*p++ && m != fmode + sizeof(fmode));
- if (s->mode == '\0') return destroy(s), (gzFile)Z_NULL;
-
- if (s->mode == 'w') {
-#ifdef NO_DEFLATE
- err = Z_STREAM_ERROR;
-#else
- err = deflateInit2(&(s->stream), level,
- Z_DEFLATED, -MAX_WBITS, DEF_MEM_LEVEL, strategy);
- /* windowBits is passed < 0 to suppress zlib header */
-
- s->stream.next_out = s->outbuf = (Byte*)ALLOC(Z_BUFSIZE);
-#endif
- if (err != Z_OK || s->outbuf == Z_NULL) {
- return destroy(s), (gzFile)Z_NULL;
- }
- } else {
- s->stream.next_in = s->inbuf = (Byte*)ALLOC(Z_BUFSIZE);
-
- err = inflateInit2(&(s->stream), -MAX_WBITS);
- /* windowBits is passed < 0 to tell that there is no zlib header.
- * Note that in this case inflate *requires* an extra "dummy" byte
- * after the compressed stream in order to complete decompression and
- * return Z_STREAM_END. Here the gzip CRC32 ensures that 4 bytes are
- * present after the compressed stream.
- */
- if (err != Z_OK || s->inbuf == Z_NULL) {
- return destroy(s), (gzFile)Z_NULL;
- }
- }
- s->stream.avail_out = Z_BUFSIZE;
-
- errno = 0;
- s->file = fd < 0 ? F_OPEN(path, fmode) : (FILE*)fdopen(fd, fmode);
-
- if (s->file == NULL) {
- return destroy(s), (gzFile)Z_NULL;
- }
- if (s->mode == 'w') {
- /* Write a very simple .gz header:
- */
- fprintf(s->file, "%c%c%c%c%c%c%c%c%c%c", gz_magic[0], gz_magic[1],
- Z_DEFLATED, 0 /*flags*/, 0,0,0,0 /*time*/, 0 /*xflags*/, OS_CODE);
- s->startpos = 10L;
- /* We use 10L instead of ftell(s->file) to because ftell causes an
- * fflush on some systems. This version of the library doesn't use
- * startpos anyway in write mode, so this initialization is not
- * necessary.
- */
- } else {
- check_header(s); /* skip the .gz header */
- s->startpos = (ftell(s->file) - s->stream.avail_in);
- }
-
- return (gzFile)s;
-}
-
-/* ===========================================================================
- Opens a gzip (.gz) file for reading or writing.
-*/
-gzFile ZEXPORT gzopen (const char *path, const char *mode)
-{
- return gz_open (path, mode, -1);
-}
-
-/* ===========================================================================
- Associate a gzFile with the file descriptor fd. fd is not dup'ed here
- to mimic the behavio(u)r of fdopen.
-*/
-gzFile ZEXPORT gzdopen (int fd, const char *mode)
-{
- char name[20];
-
- if (fd < 0) return (gzFile)Z_NULL;
- sprintf(name, "<fd:%d>", fd); /* for debugging */
-
- return gz_open (name, mode, fd);
-}
-
-/* ===========================================================================
- * Update the compression level and strategy
- */
-int ZEXPORT gzsetparams (gzFile file, int level, int strategy)
-{
- gz_stream *s = (gz_stream*)file;
-
- if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR;
-
- /* Make room to allow flushing */
- if (s->stream.avail_out == 0) {
-
- s->stream.next_out = s->outbuf;
- if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) {
- s->z_err = Z_ERRNO;
- }
- s->stream.avail_out = Z_BUFSIZE;
- }
-
- return deflateParams (&(s->stream), level, strategy);
-}
-
-/* ===========================================================================
- Read a byte from a gz_stream; update next_in and avail_in. Return EOF
- for end of file.
- IN assertion: the stream s has been sucessfully opened for reading.
-*/
-local int get_byte(gz_stream *s)
-{
- if (s->z_eof) return EOF;
- if (s->stream.avail_in == 0) {
- errno = 0;
- s->stream.avail_in = fread(s->inbuf, 1, Z_BUFSIZE, s->file);
- if (s->stream.avail_in == 0) {
- s->z_eof = 1;
- if (ferror(s->file)) s->z_err = Z_ERRNO;
- return EOF;
- }
- s->stream.next_in = s->inbuf;
- }
- s->stream.avail_in--;
- return *(s->stream.next_in)++;
-}
-
-/* ===========================================================================
- Check the gzip header of a gz_stream opened for reading. Set the stream
- mode to transparent if the gzip magic header is not present; set s->err
- to Z_DATA_ERROR if the magic header is present but the rest of the header
- is incorrect.
- IN assertion: the stream s has already been created sucessfully;
- s->stream.avail_in is zero for the first time, but may be non-zero
- for concatenated .gz files.
-*/
-local void check_header(gz_stream *s)
-{
- int method; /* method byte */
- int flags; /* flags byte */
- uInt len;
- int c;
-
- /* Check the gzip magic header */
- for (len = 0; len < 2; len++) {
- c = get_byte(s);
- if (c != gz_magic[len]) {
- if (len != 0) s->stream.avail_in++, s->stream.next_in--;
- if (c != EOF) {
- s->stream.avail_in++, s->stream.next_in--;
- s->transparent = 1;
- }
- s->z_err = s->stream.avail_in != 0 ? Z_OK : Z_STREAM_END;
- return;
- }
- }
- method = get_byte(s);
- flags = get_byte(s);
- if (method != Z_DEFLATED || (flags & RESERVED) != 0) {
- s->z_err = Z_DATA_ERROR;
- return;
- }
-
- /* Discard time, xflags and OS code: */
- for (len = 0; len < 6; len++) (void)get_byte(s);
-
- if ((flags & EXTRA_FIELD) != 0) { /* skip the extra field */
- len = (uInt)get_byte(s);
- len += ((uInt)get_byte(s))<<8;
- /* len is garbage if EOF but the loop below will quit anyway */
- while (len-- != 0 && get_byte(s) != EOF) ;
- }
- if ((flags & ORIG_NAME) != 0) { /* skip the original file name */
- while ((c = get_byte(s)) != 0 && c != EOF) ;
- }
- if ((flags & COMMENT) != 0) { /* skip the .gz file comment */
- while ((c = get_byte(s)) != 0 && c != EOF) ;
- }
- if ((flags & HEAD_CRC) != 0) { /* skip the header crc */
- for (len = 0; len < 2; len++) (void)get_byte(s);
- }
- s->z_err = s->z_eof ? Z_DATA_ERROR : Z_OK;
-}
-
- /* ===========================================================================
- * Cleanup then free the given gz_stream. Return a zlib error code.
- Try freeing in the reverse order of allocations.
- */
-local int destroy (gz_stream *s)
-{
- int err = Z_OK;
-
- if (!s) return Z_STREAM_ERROR;
-
- TRYFREE(s->msg);
-
- if (s->stream.state != NULL) {
- if (s->mode == 'w') {
-#ifdef NO_DEFLATE
- err = Z_STREAM_ERROR;
-#else
- err = deflateEnd(&(s->stream));
-#endif
- } else if (s->mode == 'r') {
- err = inflateEnd(&(s->stream));
- }
- }
- if (s->file != NULL && fclose(s->file)) {
-#ifdef ESPIPE
- if (errno != ESPIPE) /* fclose is broken for pipes in HP/UX */
-#endif
- err = Z_ERRNO;
- }
- if (s->z_err < 0) err = s->z_err;
-
- TRYFREE(s->inbuf);
- TRYFREE(s->outbuf);
- TRYFREE(s->path);
- TRYFREE(s);
- return err;
-}
-
-/* ===========================================================================
- Reads the given number of uncompressed bytes from the compressed file.
- gzread returns the number of bytes actually read (0 for end of file).
-*/
-int ZEXPORT gzread (gzFile file, voidp buf, unsigned int len)
-{
- gz_stream *s = (gz_stream*)file;
- Bytef *start = (Bytef*)buf; /* starting point for crc computation */
- Byte *next_out; /* == stream.next_out but not forced far (for MSDOS) */
-
- if (s == NULL || s->mode != 'r') return Z_STREAM_ERROR;
-
- if (s->z_err == Z_DATA_ERROR || s->z_err == Z_ERRNO) return -1;
- if (s->z_err == Z_STREAM_END) return 0; /* EOF */
-
- next_out = (Byte*)buf;
- s->stream.next_out = (Bytef*)buf;
- s->stream.avail_out = len;
-
- while (s->stream.avail_out != 0) {
-
- if (s->transparent) {
- /* Copy first the lookahead bytes: */
- uInt n = s->stream.avail_in;
- if (n > s->stream.avail_out) n = s->stream.avail_out;
- if (n > 0) {
- zmemcpy(s->stream.next_out, s->stream.next_in, n);
- next_out += n;
- s->stream.next_out = next_out;
- s->stream.next_in += n;
- s->stream.avail_out -= n;
- s->stream.avail_in -= n;
- }
- if (s->stream.avail_out > 0) {
- s->stream.avail_out -= fread(next_out, 1, s->stream.avail_out,
- s->file);
- }
- len -= s->stream.avail_out;
- s->stream.total_in += (uLong)len;
- s->stream.total_out += (uLong)len;
- if (len == 0) s->z_eof = 1;
- return (int)len;
- }
- if (s->stream.avail_in == 0 && !s->z_eof) {
-
- errno = 0;
- s->stream.avail_in = fread(s->inbuf, 1, Z_BUFSIZE, s->file);
- if (s->stream.avail_in == 0) {
- s->z_eof = 1;
- if (ferror(s->file)) {
- s->z_err = Z_ERRNO;
- break;
- }
- }
- s->stream.next_in = s->inbuf;
- }
- s->z_err = inflate(&(s->stream), Z_NO_FLUSH);
-
- if (s->z_err == Z_STREAM_END) {
- /* Check CRC and original size */
- s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start));
- start = s->stream.next_out;
-
- if (getLong(s) != s->crc) {
- s->z_err = Z_DATA_ERROR;
- } else {
- (void)getLong(s);
- /* The uncompressed length returned by above getlong() may
- * be different from s->stream.total_out) in case of
- * concatenated .gz files. Check for such files:
- */
- check_header(s);
- if (s->z_err == Z_OK) {
- uLong total_in = s->stream.total_in;
- uLong total_out = s->stream.total_out;
-
- inflateReset(&(s->stream));
- s->stream.total_in = total_in;
- s->stream.total_out = total_out;
- s->crc = crc32(0L, Z_NULL, 0);
- }
- }
- }
- if (s->z_err != Z_OK || s->z_eof) break;
- }
- s->crc = crc32(s->crc, start, (uInt)(s->stream.next_out - start));
-
- return (int)(len - s->stream.avail_out);
-}
-
-
-/* ===========================================================================
- Reads one byte from the compressed file. gzgetc returns this byte
- or -1 in case of end of file or error.
-*/
-int ZEXPORT gzgetc(gzFile file)
-{
- unsigned char c;
-
- return gzread(file, &c, 1) == 1 ? c : -1;
-}
-
-
-/* ===========================================================================
- Reads bytes from the compressed file until len-1 characters are
- read, or a newline character is read and transferred to buf, or an
- end-of-file condition is encountered. The string is then terminated
- with a null character.
- gzgets returns buf, or Z_NULL in case of error.
-
- The current implementation is not optimized at all.
-*/
-char * ZEXPORT gzgets(gzFile file, char *buf, int len)
-{
- char *b = buf;
- if (buf == Z_NULL || len <= 0) return Z_NULL;
-
- while (--len > 0 && gzread(file, buf, 1) == 1 && *buf++ != '\n') ;
- *buf = '\0';
- return b == buf && len > 0 ? Z_NULL : b;
-}
-
-
-#ifndef NO_DEFLATE
-/* ===========================================================================
- Writes the given number of uncompressed bytes into the compressed file.
- gzwrite returns the number of bytes actually written (0 in case of error).
-*/
-int ZEXPORT gzwrite (gzFile file, const voidp buf, unsigned int len)
-{
- gz_stream *s = (gz_stream*)file;
-
- if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR;
-
- s->stream.next_in = (Bytef*)buf;
- s->stream.avail_in = len;
-
- while (s->stream.avail_in != 0) {
-
- if (s->stream.avail_out == 0) {
-
- s->stream.next_out = s->outbuf;
- if (fwrite(s->outbuf, 1, Z_BUFSIZE, s->file) != Z_BUFSIZE) {
- s->z_err = Z_ERRNO;
- break;
- }
- s->stream.avail_out = Z_BUFSIZE;
- }
- s->z_err = deflate(&(s->stream), Z_NO_FLUSH);
- if (s->z_err != Z_OK) break;
- }
- s->crc = crc32(s->crc, (const Bytef *)buf, len);
-
- return (int)(len - s->stream.avail_in);
-}
-
-/* ===========================================================================
- Converts, formats, and writes the args to the compressed file under
- control of the format string, as in fprintf. gzprintf returns the number of
- uncompressed bytes actually written (0 in case of error).
-*/
-#ifdef STDC
-#include <stdarg.h>
-
-int ZEXPORTVA gzprintf (gzFile file, const char *format, /* args */ ...)
-{
- char buf[Z_PRINTF_BUFSIZE];
- va_list va;
- int len;
-
- va_start(va, format);
-#ifdef HAS_vsnprintf
- (void)vsnprintf(buf, sizeof(buf), format, va);
-#else
- (void)vsprintf(buf, format, va);
-#endif
- va_end(va);
- len = strlen(buf); /* some *sprintf don't return the nb of bytes written */
- if (len <= 0) return 0;
-
- return gzwrite(file, buf, (unsigned)len);
-}
-#else /* not ANSI C */
-
-int ZEXPORTVA gzprintf (gzFile file, const char *format,
- int a1, int a2, int a3, int a4, int a5,
- int a6, int a7, int a8, int a9, int a10,
- int a11, int a12, int a13, int a14, int a15,
- int a16, int a17, int a18, int a19, int a20)
-{
- char buf[Z_PRINTF_BUFSIZE];
- int len;
-
-#ifdef HAS_snprintf
- snprintf(buf, sizeof(buf), format, a1, a2, a3, a4, a5, a6, a7, a8,
- a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
-#else
- sprintf(buf, format, a1, a2, a3, a4, a5, a6, a7, a8,
- a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20);
-#endif
- len = strlen(buf); /* old sprintf doesn't return the nb of bytes written */
- if (len <= 0) return 0;
-
- return gzwrite(file, buf, len);
-}
-#endif
-
-/* ===========================================================================
- Writes c, converted to an unsigned char, into the compressed file.
- gzputc returns the value that was written, or -1 in case of error.
-*/
-int ZEXPORT gzputc(gzFile file, int c)
-{
- unsigned char cc = (unsigned char) c; /* required for big endian systems */
-
- return gzwrite(file, &cc, 1) == 1 ? (int)cc : -1;
-}
-
-
-/* ===========================================================================
- Writes the given null-terminated string to the compressed file, excluding
- the terminating null character.
- gzputs returns the number of characters written, or -1 in case of error.
-*/
-int ZEXPORT gzputs(gzFile file, const char *s)
-{
- return gzwrite(file, (char*)s, (unsigned)strlen(s));
-}
-
-
-/* ===========================================================================
- Flushes all pending output into the compressed file. The parameter
- flush is as in the deflate() function.
-*/
-local int do_flush (gzFile file, int flush)
-{
- uInt len;
- int done = 0;
- gz_stream *s = (gz_stream*)file;
-
- if (s == NULL || s->mode != 'w') return Z_STREAM_ERROR;
-
- s->stream.avail_in = 0; /* should be zero already anyway */
-
- for (;;) {
- len = Z_BUFSIZE - s->stream.avail_out;
-
- if (len != 0) {
- if ((uInt)fwrite(s->outbuf, 1, len, s->file) != len) {
- s->z_err = Z_ERRNO;
- return Z_ERRNO;
- }
- s->stream.next_out = s->outbuf;
- s->stream.avail_out = Z_BUFSIZE;
- }
- if (done) break;
- s->z_err = deflate(&(s->stream), flush);
-
- /* Ignore the second of two consecutive flushes: */
- if (len == 0 && s->z_err == Z_BUF_ERROR) s->z_err = Z_OK;
-
- /* deflate has finished flushing only when it hasn't used up
- * all the available space in the output buffer:
- */
- done = (s->stream.avail_out != 0 || s->z_err == Z_STREAM_END);
-
- if (s->z_err != Z_OK && s->z_err != Z_STREAM_END) break;
- }
- return s->z_err == Z_STREAM_END ? Z_OK : s->z_err;
-}
-
-int ZEXPORT gzflush (gzFile file, int flush)
-{
- gz_stream *s = (gz_stream*)file;
- int err = do_flush (file, flush);
-
- if (err) return err;
- fflush(s->file);
- return s->z_err == Z_STREAM_END ? Z_OK : s->z_err;
-}
-#endif /* NO_DEFLATE */
-
-/* ===========================================================================
- Sets the starting position for the next gzread or gzwrite on the given
- compressed file. The offset represents a number of bytes in the
- gzseek returns the resulting offset location as measured in bytes from
- the beginning of the uncompressed stream, or -1 in case of error.
- SEEK_END is not implemented, returns error.
- In this version of the library, gzseek can be extremely slow.
-*/
-z_off_t ZEXPORT gzseek (gzFile file, long int offset, int whence)
-{
- gz_stream *s = (gz_stream*)file;
-
- if (s == NULL || whence == SEEK_END ||
- s->z_err == Z_ERRNO || s->z_err == Z_DATA_ERROR) {
- return -1L;
- }
-
- if (s->mode == 'w') {
-#ifdef NO_DEFLATE
- return -1L;
-#else
- if (whence == SEEK_SET) {
- offset -= s->stream.total_in;
- }
- if (offset < 0) return -1L;
-
- /* At this point, offset is the number of zero bytes to write. */
- if (s->inbuf == Z_NULL) {
- s->inbuf = (Byte*)ALLOC(Z_BUFSIZE); /* for seeking */
- zmemzero(s->inbuf, Z_BUFSIZE);
- }
- while (offset > 0) {
- uInt size = Z_BUFSIZE;
- if (offset < Z_BUFSIZE) size = (uInt)offset;
-
- size = gzwrite(file, s->inbuf, size);
- if (size == 0) return -1L;
-
- offset -= size;
- }
- return (z_off_t)s->stream.total_in;
-#endif
- }
- /* Rest of function is for reading only */
-
- /* compute absolute position */
- if (whence == SEEK_CUR) {
- offset += s->stream.total_out;
- }
- if (offset < 0) return -1L;
-
- if (s->transparent) {
- /* map to fseek */
- s->stream.avail_in = 0;
- s->stream.next_in = s->inbuf;
- if (fseek(s->file, offset, SEEK_SET) < 0) return -1L;
-
- s->stream.total_in = s->stream.total_out = (uLong)offset;
- return offset;
- }
-
- /* For a negative seek, rewind and use positive seek */
- if ((uLong)offset >= s->stream.total_out) {
- offset -= s->stream.total_out;
- } else if (gzrewind(file) < 0) {
- return -1L;
- }
- /* offset is now the number of bytes to skip. */
-
- if (offset != 0 && s->outbuf == Z_NULL) {
- s->outbuf = (Byte*)ALLOC(Z_BUFSIZE);
- }
- while (offset > 0) {
- int size = Z_BUFSIZE;
- if (offset < Z_BUFSIZE) size = (int)offset;
-
- size = gzread(file, s->outbuf, (uInt)size);
- if (size <= 0) return -1L;
- offset -= size;
- }
- return (z_off_t)s->stream.total_out;
-}
-
-/* ===========================================================================
- Rewinds input file.
-*/
-int ZEXPORT gzrewind (gzFile file)
-{
- gz_stream *s = (gz_stream*)file;
-
- if (s == NULL || s->mode != 'r') return -1;
-
- s->z_err = Z_OK;
- s->z_eof = 0;
- s->stream.avail_in = 0;
- s->stream.next_in = s->inbuf;
- s->crc = crc32(0L, Z_NULL, 0);
-
- if (s->startpos == 0) { /* not a compressed file */
- rewind(s->file);
- return 0;
- }
-
- (void) inflateReset(&s->stream);
- return fseek(s->file, s->startpos, SEEK_SET);
-}
-
-/* ===========================================================================
- Returns the starting position for the next gzread or gzwrite on the
- given compressed file. This position represents a number of bytes in the
- uncompressed data stream.
-*/
-z_off_t ZEXPORT gztell (gzFile file)
-{
- return gzseek(file, 0L, SEEK_CUR);
-}
-
-/* ===========================================================================
- Returns 1 when EOF has previously been detected reading the given
- input stream, otherwise zero.
-*/
-int ZEXPORT gzeof (gzFile file)
-{
- gz_stream *s = (gz_stream*)file;
-
- return (s == NULL || s->mode != 'r') ? 0 : s->z_eof;
-}
-
-/* ===========================================================================
- Outputs a long in LSB order to the given file
-*/
-local void putLong (FILE *file, uLong x)
-{
- int n;
- for (n = 0; n < 4; n++) {
- fputc((int)(x & 0xff), file);
- x >>= 8;
- }
-}
-
-/* ===========================================================================
- Reads a long in LSB order from the given gz_stream. Sets z_err in case
- of error.
-*/
-local uLong getLong (gz_stream *s)
-{
- uLong x = (uLong)get_byte(s);
- int c;
-
- x += ((uLong)get_byte(s))<<8;
- x += ((uLong)get_byte(s))<<16;
- c = get_byte(s);
- if (c == EOF) s->z_err = Z_DATA_ERROR;
- x += ((uLong)c)<<24;
- return x;
-}
-
-/* ===========================================================================
- Flushes all pending output if necessary, closes the compressed file
- and deallocates all the (de)compression state.
-*/
-int ZEXPORT gzclose (gzFile file)
-{
- int err;
- gz_stream *s = (gz_stream*)file;
-
- if (s == NULL) return Z_STREAM_ERROR;
-
- if (s->mode == 'w') {
-#ifdef NO_DEFLATE
- return Z_STREAM_ERROR;
-#else
- err = do_flush (file, Z_FINISH);
- if (err != Z_OK) return destroy((gz_stream*)file);
-
- putLong (s->file, s->crc);
- putLong (s->file, s->stream.total_in);
-#endif
- }
- return destroy((gz_stream*)file);
-}
-
-/* ===========================================================================
- Returns the error message for the last error which occured on the
- given compressed file. errnum is set to zlib error number. If an
- error occured in the file system and not in the compression library,
- errnum is set to Z_ERRNO and the application may consult errno
- to get the exact error code.
-*/
-const char* ZEXPORT gzerror (gzFile file, int *errnum)
-{
- char *m;
- gz_stream *s = (gz_stream*)file;
-
- if (s == NULL) {
- *errnum = Z_STREAM_ERROR;
- return (const char*)ERR_MSG(Z_STREAM_ERROR);
- }
- *errnum = s->z_err;
- if (*errnum == Z_OK) return (const char*)"";
-
- m = (char*)(*errnum == Z_ERRNO ? zstrerror(errno) : s->stream.msg);
-
- if (m == NULL || *m == '\0') m = (char*)ERR_MSG(s->z_err);
-
- TRYFREE(s->msg);
- s->msg = (char*)ALLOC(strlen(s->path) + strlen(m) + 3);
- strcpy(s->msg, s->path);
- strcat(s->msg, ": ");
- strcat(s->msg, m);
- return (const char*)s->msg;
-}
diff --git a/libpng/infblock.c b/libpng/infblock.c
deleted file mode 100644
index 62f3b6e..0000000
--- a/libpng/infblock.c
+++ /dev/null
@@ -1,388 +0,0 @@
-/* infblock.c -- interpret and process block types to last block
- * Copyright (C) 1995-2002 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-#include "zutil.h"
-#include "infblock.h"
-#include "inftrees.h"
-#include "infcodes.h"
-#include "infutil.h"
-
-struct inflate_codes_state {int dummy;}; /* for buggy compilers */
-
-/* simplify the use of the inflate_huft type with some defines */
-#define exop word.what.Exop
-#define bits word.what.Bits
-
-/* Table for deflate from PKZIP's appnote.txt. */
-local const uInt border[] = { /* Order of the bit length code lengths */
- 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
-
-/*
- Notes beyond the 1.93a appnote.txt:
-
- 1. Distance pointers never point before the beginning of the output
- stream.
- 2. Distance pointers can point back across blocks, up to 32k away.
- 3. There is an implied maximum of 7 bits for the bit length table and
- 15 bits for the actual data.
- 4. If only one code exists, then it is encoded using one bit. (Zero
- would be more efficient, but perhaps a little confusing.) If two
- codes exist, they are coded using one bit each (0 and 1).
- 5. There is no way of sending zero distance codes--a dummy must be
- sent if there are none. (History: a pre 2.0 version of PKZIP would
- store blocks with no distance codes, but this was discovered to be
- too harsh a criterion.) Valid only for 1.93a. 2.04c does allow
- zero distance codes, which is sent as one code of zero bits in
- length.
- 6. There are up to 286 literal/length codes. Code 256 represents the
- end-of-block. Note however that the static length tree defines
- 288 codes just to fill out the Huffman codes. Codes 286 and 287
- cannot be used though, since there is no length base or extra bits
- defined for them. Similarily, there are up to 30 distance codes.
- However, static trees define 32 codes (all 5 bits) to fill out the
- Huffman codes, but the last two had better not show up in the data.
- 7. Unzip can check dynamic Huffman blocks for complete code sets.
- The exception is that a single code would not be complete (see #4).
- 8. The five bits following the block type is really the number of
- literal codes sent minus 257.
- 9. Length codes 8,16,16 are interpreted as 13 length codes of 8 bits
- (1+6+6). Therefore, to output three times the length, you output
- three codes (1+1+1), whereas to output four times the same length,
- you only need two codes (1+3). Hmm.
- 10. In the tree reconstruction algorithm, Code = Code + Increment
- only if BitLength(i) is not zero. (Pretty obvious.)
- 11. Correction: 4 Bits: # of Bit Length codes - 4 (4 - 19)
- 12. Note: length code 284 can represent 227-258, but length code 285
- really is 258. The last length deserves its own, short code
- since it gets used a lot in very redundant files. The length
- 258 is special since 258 - 3 (the min match length) is 255.
- 13. The literal/length and distance code bit lengths are read as a
- single stream of lengths. It is possible (and advantageous) for
- a repeat code (16, 17, or 18) to go across the boundary between
- the two sets of lengths.
- */
-
-
-void inflate_blocks_reset(inflate_blocks_statef *s, z_streamp z, uLongf *c)
-{
- if (c != Z_NULL)
- *c = s->check;
- if (s->mode == BTREE || s->mode == DTREE)
- ZFREE(z, s->sub.trees.blens);
- if (s->mode == CODES)
- inflate_codes_free(s->sub.decode.codes, z);
- s->mode = TYPE;
- s->bitk = 0;
- s->bitb = 0;
- s->read = s->write = s->window;
- if (s->checkfn != Z_NULL)
- z->adler = s->check = (*s->checkfn)(0L, (const Bytef *)Z_NULL, 0);
- Tracev((stderr, "inflate: blocks reset\n"));
-}
-
-
-inflate_blocks_statef *inflate_blocks_new(z_streamp z, check_func c, uInt w)
-{
- inflate_blocks_statef *s;
-
- if ((s = (inflate_blocks_statef *)ZALLOC
- (z,1,sizeof(struct inflate_blocks_state))) == Z_NULL)
- return s;
- if ((s->hufts =
- (inflate_huft *)ZALLOC(z, sizeof(inflate_huft), MANY)) == Z_NULL)
- {
- ZFREE(z, s);
- return Z_NULL;
- }
- if ((s->window = (Bytef *)ZALLOC(z, 1, w)) == Z_NULL)
- {
- ZFREE(z, s->hufts);
- ZFREE(z, s);
- return Z_NULL;
- }
- s->end = s->window + w;
- s->checkfn = c;
- s->mode = TYPE;
- Tracev((stderr, "inflate: blocks allocated\n"));
- inflate_blocks_reset(s, z, Z_NULL);
- return s;
-}
-
-
-int inflate_blocks(inflate_blocks_statef *s, z_streamp z, int r)
-{
- uInt t; /* temporary storage */
- uLong b; /* bit buffer */
- uInt k; /* bits in bit buffer */
- Bytef *p; /* input data pointer */
- uInt n; /* bytes available there */
- Bytef *q; /* output window write pointer */
- uInt m; /* bytes to end of window or read pointer */
-
- /* copy input/output information to locals (UPDATE macro restores) */
- LOAD
-
- /* process input based on current state */
- while (1) switch (s->mode)
- {
- case TYPE:
- NEEDBITS(3)
- t = (uInt)b & 7;
- s->last = t & 1;
- switch (t >> 1)
- {
- case 0: /* stored */
- Tracev((stderr, "inflate: stored block%s\n",
- s->last ? " (last)" : ""));
- DUMPBITS(3)
- t = k & 7; /* go to byte boundary */
- DUMPBITS(t)
- s->mode = LENS; /* get length of stored block */
- break;
- case 1: /* fixed */
- Tracev((stderr, "inflate: fixed codes block%s\n",
- s->last ? " (last)" : ""));
- {
- uInt bl, bd;
- inflate_huft *tl, *td;
-
- inflate_trees_fixed(&bl, &bd, &tl, &td, z);
- s->sub.decode.codes = inflate_codes_new(bl, bd, tl, td, z);
- if (s->sub.decode.codes == Z_NULL)
- {
- r = Z_MEM_ERROR;
- LEAVE
- }
- }
- DUMPBITS(3)
- s->mode = CODES;
- break;
- case 2: /* dynamic */
- Tracev((stderr, "inflate: dynamic codes block%s\n",
- s->last ? " (last)" : ""));
- DUMPBITS(3)
- s->mode = TABLE;
- break;
- case 3: /* illegal */
- DUMPBITS(3)
- s->mode = BAD;
- z->msg = (char*)"invalid block type";
- r = Z_DATA_ERROR;
- LEAVE
- }
- break;
- case LENS:
- NEEDBITS(32)
- if ((((~b) >> 16) & 0xffff) != (b & 0xffff))
- {
- s->mode = BAD;
- z->msg = (char*)"invalid stored block lengths";
- r = Z_DATA_ERROR;
- LEAVE
- }
- s->sub.left = (uInt)b & 0xffff;
- b = k = 0; /* dump bits */
- Tracev((stderr, "inflate: stored length %u\n", s->sub.left));
- s->mode = s->sub.left ? STORED : (s->last ? DRY : TYPE);
- break;
- case STORED:
- if (n == 0)
- LEAVE
- NEEDOUT
- t = s->sub.left;
- if (t > n) t = n;
- if (t > m) t = m;
- zmemcpy(q, p, t);
- p += t; n -= t;
- q += t; m -= t;
- if ((s->sub.left -= t) != 0)
- break;
- Tracev((stderr, "inflate: stored end, %lu total out\n",
- z->total_out + (q >= s->read ? q - s->read :
- (s->end - s->read) + (q - s->window))));
- s->mode = s->last ? DRY : TYPE;
- break;
- case TABLE:
- NEEDBITS(14)
- s->sub.trees.table = t = (uInt)b & 0x3fff;
-#ifndef PKZIP_BUG_WORKAROUND
- if ((t & 0x1f) > 29 || ((t >> 5) & 0x1f) > 29)
- {
- s->mode = BAD;
- z->msg = (char*)"too many length or distance symbols";
- r = Z_DATA_ERROR;
- LEAVE
- }
-#endif
- t = 258 + (t & 0x1f) + ((t >> 5) & 0x1f);
- if ((s->sub.trees.blens = (uIntf*)ZALLOC(z, t, sizeof(uInt))) == Z_NULL)
- {
- r = Z_MEM_ERROR;
- LEAVE
- }
- DUMPBITS(14)
- s->sub.trees.index = 0;
- Tracev((stderr, "inflate: table sizes ok\n"));
- s->mode = BTREE;
- case BTREE:
- while (s->sub.trees.index < 4 + (s->sub.trees.table >> 10))
- {
- NEEDBITS(3)
- s->sub.trees.blens[border[s->sub.trees.index++]] = (uInt)b & 7;
- DUMPBITS(3)
- }
- while (s->sub.trees.index < 19)
- s->sub.trees.blens[border[s->sub.trees.index++]] = 0;
- s->sub.trees.bb = 7;
- t = inflate_trees_bits(s->sub.trees.blens, &s->sub.trees.bb,
- &s->sub.trees.tb, s->hufts, z);
- if (t != Z_OK)
- {
- r = t;
- if (r == Z_DATA_ERROR)
- {
- ZFREE(z, s->sub.trees.blens);
- s->mode = BAD;
- }
- LEAVE
- }
- s->sub.trees.index = 0;
- Tracev((stderr, "inflate: bits tree ok\n"));
- s->mode = DTREE;
- case DTREE:
- while (t = s->sub.trees.table,
- s->sub.trees.index < 258 + (t & 0x1f) + ((t >> 5) & 0x1f))
- {
- inflate_huft *h;
- uInt i, j, c;
-
- t = s->sub.trees.bb;
- NEEDBITS(t)
- h = s->sub.trees.tb + ((uInt)b & inflate_mask[t]);
- t = h->bits;
- c = h->base;
- if (c < 16)
- {
- DUMPBITS(t)
- s->sub.trees.blens[s->sub.trees.index++] = c;
- }
- else /* c == 16..18 */
- {
- i = c == 18 ? 7 : c - 14;
- j = c == 18 ? 11 : 3;
- NEEDBITS(t + i)
- DUMPBITS(t)
- j += (uInt)b & inflate_mask[i];
- DUMPBITS(i)
- i = s->sub.trees.index;
- t = s->sub.trees.table;
- if (i + j > 258 + (t & 0x1f) + ((t >> 5) & 0x1f) ||
- (c == 16 && i < 1))
- {
- ZFREE(z, s->sub.trees.blens);
- s->mode = BAD;
- z->msg = (char*)"invalid bit length repeat";
- r = Z_DATA_ERROR;
- LEAVE
- }
- c = c == 16 ? s->sub.trees.blens[i - 1] : 0;
- do {
- s->sub.trees.blens[i++] = c;
- } while (--j);
- s->sub.trees.index = i;
- }
- }
- s->sub.trees.tb = Z_NULL;
- {
- uInt bl, bd;
- inflate_huft *tl, *td;
- inflate_codes_statef *c;
-
- bl = 9; /* must be <= 9 for lookahead assumptions */
- bd = 6; /* must be <= 9 for lookahead assumptions */
- t = s->sub.trees.table;
- t = inflate_trees_dynamic(257 + (t & 0x1f), 1 + ((t >> 5) & 0x1f),
- s->sub.trees.blens, &bl, &bd, &tl, &td,
- s->hufts, z);
- if (t != Z_OK)
- {
- if (t == (uInt)Z_DATA_ERROR)
- {
- ZFREE(z, s->sub.trees.blens);
- s->mode = BAD;
- }
- r = t;
- LEAVE
- }
- Tracev((stderr, "inflate: trees ok\n"));
- if ((c = inflate_codes_new(bl, bd, tl, td, z)) == Z_NULL)
- {
- r = Z_MEM_ERROR;
- LEAVE
- }
- s->sub.decode.codes = c;
- }
- ZFREE(z, s->sub.trees.blens);
- s->mode = CODES;
- case CODES:
- UPDATE
- if ((r = inflate_codes(s, z, r)) != Z_STREAM_END)
- return inflate_flush(s, z, r);
- r = Z_OK;
- inflate_codes_free(s->sub.decode.codes, z);
- LOAD
- Tracev((stderr, "inflate: codes end, %lu total out\n",
- z->total_out + (q >= s->read ? q - s->read :
- (s->end - s->read) + (q - s->window))));
- if (!s->last)
- {
- s->mode = TYPE;
- break;
- }
- s->mode = DRY;
- case DRY:
- FLUSH
- if (s->read != s->write)
- LEAVE
- s->mode = DONE;
- case DONE:
- r = Z_STREAM_END;
- LEAVE
- case BAD:
- r = Z_DATA_ERROR;
- LEAVE
- default:
- r = Z_STREAM_ERROR;
- LEAVE
- }
-}
-
-
-int inflate_blocks_free(inflate_blocks_statef *s, z_streamp z)
-{
- inflate_blocks_reset(s, z, Z_NULL);
- ZFREE(z, s->window);
- ZFREE(z, s->hufts);
- ZFREE(z, s);
- Tracev((stderr, "inflate: blocks freed\n"));
- return Z_OK;
-}
-
-
-void inflate_set_dictionary(inflate_blocks_statef *s, const Bytef *d, uInt n)
-{
- zmemcpy(s->window, d, n);
- s->read = s->write = s->window + n;
-}
-
-
-/* Returns true if inflate is currently at the end of a block generated
- * by Z_SYNC_FLUSH or Z_FULL_FLUSH.
- * IN assertion: s != Z_NULL
- */
-int inflate_blocks_sync_point(inflate_blocks_statef *s)
-{
- return s->mode == LENS;
-}
diff --git a/libpng/infblock.h b/libpng/infblock.h
deleted file mode 100644
index 173b226..0000000
--- a/libpng/infblock.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/* infblock.h -- header to use infblock.c
- * Copyright (C) 1995-2002 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* WARNING: this file should *not* be used by applications. It is
- part of the implementation of the compression library and is
- subject to change. Applications should only use zlib.h.
- */
-
-struct inflate_blocks_state;
-typedef struct inflate_blocks_state FAR inflate_blocks_statef;
-
-extern inflate_blocks_statef * inflate_blocks_new OF((
- z_streamp z,
- check_func c, /* check function */
- uInt w)); /* window size */
-
-extern int inflate_blocks OF((
- inflate_blocks_statef *,
- z_streamp ,
- int)); /* initial return code */
-
-extern void inflate_blocks_reset OF((
- inflate_blocks_statef *,
- z_streamp ,
- uLongf *)); /* check value on output */
-
-extern int inflate_blocks_free OF((
- inflate_blocks_statef *,
- z_streamp));
-
-extern void inflate_set_dictionary OF((
- inflate_blocks_statef *s,
- const Bytef *d, /* dictionary */
- uInt n)); /* dictionary length */
-
-extern int inflate_blocks_sync_point OF((
- inflate_blocks_statef *s));
diff --git a/libpng/infcodes.c b/libpng/infcodes.c
deleted file mode 100644
index a6e6f9f..0000000
--- a/libpng/infcodes.c
+++ /dev/null
@@ -1,246 +0,0 @@
-/* infcodes.c -- process literals and length/distance pairs
- * Copyright (C) 1995-2002 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-#include "zutil.h"
-#include "inftrees.h"
-#include "infblock.h"
-#include "infcodes.h"
-#include "infutil.h"
-#include "inffast.h"
-
-/* simplify the use of the inflate_huft type with some defines */
-#define exop word.what.Exop
-#define bits word.what.Bits
-
-typedef enum { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */
- START, /* x: set up for LEN */
- LEN, /* i: get length/literal/eob next */
- LENEXT, /* i: getting length extra (have base) */
- DIST, /* i: get distance next */
- DISTEXT, /* i: getting distance extra */
- COPY, /* o: copying bytes in window, waiting for space */
- LIT, /* o: got literal, waiting for output space */
- WASH, /* o: got eob, possibly still output waiting */
- END, /* x: got eob and all data flushed */
- BADCODE} /* x: got error */
-inflate_codes_mode;
-
-/* inflate codes private state */
-struct inflate_codes_state {
-
- /* mode */
- inflate_codes_mode mode; /* current inflate_codes mode */
-
- /* mode dependent information */
- uInt len;
- union {
- struct {
- inflate_huft *tree; /* pointer into tree */
- uInt need; /* bits needed */
- } code; /* if LEN or DIST, where in tree */
- uInt lit; /* if LIT, literal */
- struct {
- uInt get; /* bits to get for extra */
- uInt dist; /* distance back to copy from */
- } copy; /* if EXT or COPY, where and how much */
- } sub; /* submode */
-
- /* mode independent information */
- Byte lbits; /* ltree bits decoded per branch */
- Byte dbits; /* dtree bits decoder per branch */
- inflate_huft *ltree; /* literal/length/eob tree */
- inflate_huft *dtree; /* distance tree */
-
-};
-
-
-inflate_codes_statef *inflate_codes_new(uInt bl, uInt bd, inflate_huft *tl, inflate_huft *td, z_streamp z)
-
-
- /* need separate declaration for Borland C++ */
-
-{
- inflate_codes_statef *c;
-
- if ((c = (inflate_codes_statef *)
- ZALLOC(z,1,sizeof(struct inflate_codes_state))) != Z_NULL)
- {
- c->mode = START;
- c->lbits = (Byte)bl;
- c->dbits = (Byte)bd;
- c->ltree = tl;
- c->dtree = td;
- Tracev((stderr, "inflate: codes new\n"));
- }
- return c;
-}
-
-
-int inflate_codes(inflate_blocks_statef *s, z_streamp z, int r)
-{
- uInt j; /* temporary storage */
- inflate_huft *t; /* temporary pointer */
- uInt e; /* extra bits or operation */
- uLong b; /* bit buffer */
- uInt k; /* bits in bit buffer */
- Bytef *p; /* input data pointer */
- uInt n; /* bytes available there */
- Bytef *q; /* output window write pointer */
- uInt m; /* bytes to end of window or read pointer */
- Bytef *f; /* pointer to copy strings from */
- inflate_codes_statef *c = s->sub.decode.codes; /* codes state */
-
- /* copy input/output information to locals (UPDATE macro restores) */
- LOAD
-
- /* process input and output based on current state */
- while (1) switch (c->mode)
- { /* waiting for "i:"=input, "o:"=output, "x:"=nothing */
- case START: /* x: set up for LEN */
-#ifndef SLOW
- if (m >= 258 && n >= 10)
- {
- UPDATE
- r = inflate_fast(c->lbits, c->dbits, c->ltree, c->dtree, s, z);
- LOAD
- if (r != Z_OK)
- {
- c->mode = r == Z_STREAM_END ? WASH : BADCODE;
- break;
- }
- }
-#endif /* !SLOW */
- c->sub.code.need = c->lbits;
- c->sub.code.tree = c->ltree;
- c->mode = LEN;
- case LEN: /* i: get length/literal/eob next */
- j = c->sub.code.need;
- NEEDBITS(j)
- t = c->sub.code.tree + ((uInt)b & inflate_mask[j]);
- DUMPBITS(t->bits)
- e = (uInt)(t->exop);
- if (e == 0) /* literal */
- {
- c->sub.lit = t->base;
- Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
- "inflate: literal '%c'\n" :
- "inflate: literal 0x%02x\n", t->base));
- c->mode = LIT;
- break;
- }
- if (e & 16) /* length */
- {
- c->sub.copy.get = e & 15;
- c->len = t->base;
- c->mode = LENEXT;
- break;
- }
- if ((e & 64) == 0) /* next table */
- {
- c->sub.code.need = e;
- c->sub.code.tree = t + t->base;
- break;
- }
- if (e & 32) /* end of block */
- {
- Tracevv((stderr, "inflate: end of block\n"));
- c->mode = WASH;
- break;
- }
- c->mode = BADCODE; /* invalid code */
- z->msg = (char*)"invalid literal/length code";
- r = Z_DATA_ERROR;
- LEAVE
- case LENEXT: /* i: getting length extra (have base) */
- j = c->sub.copy.get;
- NEEDBITS(j)
- c->len += (uInt)b & inflate_mask[j];
- DUMPBITS(j)
- c->sub.code.need = c->dbits;
- c->sub.code.tree = c->dtree;
- Tracevv((stderr, "inflate: length %u\n", c->len));
- c->mode = DIST;
- case DIST: /* i: get distance next */
- j = c->sub.code.need;
- NEEDBITS(j)
- t = c->sub.code.tree + ((uInt)b & inflate_mask[j]);
- DUMPBITS(t->bits)
- e = (uInt)(t->exop);
- if (e & 16) /* distance */
- {
- c->sub.copy.get = e & 15;
- c->sub.copy.dist = t->base;
- c->mode = DISTEXT;
- break;
- }
- if ((e & 64) == 0) /* next table */
- {
- c->sub.code.need = e;
- c->sub.code.tree = t + t->base;
- break;
- }
- c->mode = BADCODE; /* invalid code */
- z->msg = (char*)"invalid distance code";
- r = Z_DATA_ERROR;
- LEAVE
- case DISTEXT: /* i: getting distance extra */
- j = c->sub.copy.get;
- NEEDBITS(j)
- c->sub.copy.dist += (uInt)b & inflate_mask[j];
- DUMPBITS(j)
- Tracevv((stderr, "inflate: distance %u\n", c->sub.copy.dist));
- c->mode = COPY;
- case COPY: /* o: copying bytes in window, waiting for space */
- f = q - c->sub.copy.dist;
- while (f < s->window) /* modulo window size-"while" instead */
- f += s->end - s->window; /* of "if" handles invalid distances */
- while (c->len)
- {
- NEEDOUT
- OUTBYTE(*f++)
- if (f == s->end)
- f = s->window;
- c->len--;
- }
- c->mode = START;
- break;
- case LIT: /* o: got literal, waiting for output space */
- NEEDOUT
- OUTBYTE(c->sub.lit)
- c->mode = START;
- break;
- case WASH: /* o: got eob, possibly more output */
- if (k > 7) /* return unused byte, if any */
- {
- Assert(k < 16, "inflate_codes grabbed too many bytes")
- k -= 8;
- n++;
- p--; /* can always return one */
- }
- FLUSH
- if (s->read != s->write)
- LEAVE
- c->mode = END;
- case END:
- r = Z_STREAM_END;
- LEAVE
- case BADCODE: /* x: got error */
- r = Z_DATA_ERROR;
- LEAVE
- default:
- r = Z_STREAM_ERROR;
- LEAVE
- }
-#ifdef NEED_DUMMY_RETURN
- return Z_STREAM_ERROR; /* Some dumb compilers complain without this */
-#endif
-}
-
-
-void inflate_codes_free(inflate_codes_statef *c, z_streamp z)
-{
- ZFREE(z, c);
- Tracev((stderr, "inflate: codes free\n"));
-}
diff --git a/libpng/infcodes.h b/libpng/infcodes.h
deleted file mode 100644
index 46821a0..0000000
--- a/libpng/infcodes.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/* infcodes.h -- header to use infcodes.c
- * Copyright (C) 1995-2002 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* WARNING: this file should *not* be used by applications. It is
- part of the implementation of the compression library and is
- subject to change. Applications should only use zlib.h.
- */
-
-struct inflate_codes_state;
-typedef struct inflate_codes_state FAR inflate_codes_statef;
-
-extern inflate_codes_statef *inflate_codes_new OF((
- uInt, uInt,
- inflate_huft *, inflate_huft *,
- z_streamp ));
-
-extern int inflate_codes OF((
- inflate_blocks_statef *,
- z_streamp ,
- int));
-
-extern void inflate_codes_free OF((
- inflate_codes_statef *,
- z_streamp ));
-
diff --git a/libpng/inffast.c b/libpng/inffast.c
deleted file mode 100644
index 1f0d650..0000000
--- a/libpng/inffast.c
+++ /dev/null
@@ -1,183 +0,0 @@
-/* inffast.c -- process literals and length/distance pairs fast
- * Copyright (C) 1995-2002 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-#include "zutil.h"
-#include "inftrees.h"
-#include "infblock.h"
-#include "infcodes.h"
-#include "infutil.h"
-#include "inffast.h"
-
-struct inflate_codes_state {int dummy;}; /* for buggy compilers */
-
-/* simplify the use of the inflate_huft type with some defines */
-#define exop word.what.Exop
-#define bits word.what.Bits
-
-/* macros for bit input with no checking and for returning unused bytes */
-#define GRABBITS(j) {while(k<(j)){b|=((uLong)NEXTBYTE)<<k;k+=8;}}
-#define UNGRAB {c=z->avail_in-n;c=(k>>3)<c?k>>3:c;n+=c;p-=c;k-=c<<3;}
-
-/* Called with number of bytes left to write in window at least 258
- (the maximum string length) and number of input bytes available
- at least ten. The ten bytes are six bytes for the longest length/
- distance pair plus four bytes for overloading the bit buffer. */
-
-int inflate_fast(uInt bl, uInt bd, inflate_huft *tl, inflate_huft *td, inflate_blocks_statef *s, z_streamp z)
-
-
- /* need separate declaration for Borland C++ */
-
-
-{
- inflate_huft *t; /* temporary pointer */
- uInt e; /* extra bits or operation */
- uLong b; /* bit buffer */
- uInt k; /* bits in bit buffer */
- Bytef *p; /* input data pointer */
- uInt n; /* bytes available there */
- Bytef *q; /* output window write pointer */
- uInt m; /* bytes to end of window or read pointer */
- uInt ml; /* mask for literal/length tree */
- uInt md; /* mask for distance tree */
- uInt c; /* bytes to copy */
- uInt d; /* distance back to copy from */
- Bytef *r; /* copy source pointer */
-
- /* load input, output, bit values */
- LOAD
-
- /* initialize masks */
- ml = inflate_mask[bl];
- md = inflate_mask[bd];
-
- /* do until not enough input or output space for fast loop */
- do { /* assume called with m >= 258 && n >= 10 */
- /* get literal/length code */
- GRABBITS(20) /* max bits for literal/length code */
- if ((e = (t = tl + ((uInt)b & ml))->exop) == 0)
- {
- DUMPBITS(t->bits)
- Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
- "inflate: * literal '%c'\n" :
- "inflate: * literal 0x%02x\n", t->base));
- *q++ = (Byte)t->base;
- m--;
- continue;
- }
- do {
- DUMPBITS(t->bits)
- if (e & 16)
- {
- /* get extra bits for length */
- e &= 15;
- c = t->base + ((uInt)b & inflate_mask[e]);
- DUMPBITS(e)
- Tracevv((stderr, "inflate: * length %u\n", c));
-
- /* decode distance base of block to copy */
- GRABBITS(15); /* max bits for distance code */
- e = (t = td + ((uInt)b & md))->exop;
- do {
- DUMPBITS(t->bits)
- if (e & 16)
- {
- /* get extra bits to add to distance base */
- e &= 15;
- GRABBITS(e) /* get extra bits (up to 13) */
- d = t->base + ((uInt)b & inflate_mask[e]);
- DUMPBITS(e)
- Tracevv((stderr, "inflate: * distance %u\n", d));
-
- /* do the copy */
- m -= c;
- r = q - d;
- if (r < s->window) /* wrap if needed */
- {
- do {
- r += s->end - s->window; /* force pointer in window */
- } while (r < s->window); /* covers invalid distances */
- e = s->end - r;
- if (c > e)
- {
- c -= e; /* wrapped copy */
- do {
- *q++ = *r++;
- } while (--e);
- r = s->window;
- do {
- *q++ = *r++;
- } while (--c);
- }
- else /* normal copy */
- {
- *q++ = *r++; c--;
- *q++ = *r++; c--;
- do {
- *q++ = *r++;
- } while (--c);
- }
- }
- else /* normal copy */
- {
- *q++ = *r++; c--;
- *q++ = *r++; c--;
- do {
- *q++ = *r++;
- } while (--c);
- }
- break;
- }
- else if ((e & 64) == 0)
- {
- t += t->base;
- e = (t += ((uInt)b & inflate_mask[e]))->exop;
- }
- else
- {
- z->msg = (char*)"invalid distance code";
- UNGRAB
- UPDATE
- return Z_DATA_ERROR;
- }
- } while (1);
- break;
- }
- if ((e & 64) == 0)
- {
- t += t->base;
- if ((e = (t += ((uInt)b & inflate_mask[e]))->exop) == 0)
- {
- DUMPBITS(t->bits)
- Tracevv((stderr, t->base >= 0x20 && t->base < 0x7f ?
- "inflate: * literal '%c'\n" :
- "inflate: * literal 0x%02x\n", t->base));
- *q++ = (Byte)t->base;
- m--;
- break;
- }
- }
- else if (e & 32)
- {
- Tracevv((stderr, "inflate: * end of block\n"));
- UNGRAB
- UPDATE
- return Z_STREAM_END;
- }
- else
- {
- z->msg = (char*)"invalid literal/length code";
- UNGRAB
- UPDATE
- return Z_DATA_ERROR;
- }
- } while (1);
- } while (m >= 258 && n >= 10);
-
- /* not enough input or output--restore pointers and return */
- UNGRAB
- UPDATE
- return Z_OK;
-}
diff --git a/libpng/inffast.h b/libpng/inffast.h
deleted file mode 100644
index a31a4bb..0000000
--- a/libpng/inffast.h
+++ /dev/null
@@ -1,17 +0,0 @@
-/* inffast.h -- header to use inffast.c
- * Copyright (C) 1995-2002 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* WARNING: this file should *not* be used by applications. It is
- part of the implementation of the compression library and is
- subject to change. Applications should only use zlib.h.
- */
-
-extern int inflate_fast OF((
- uInt,
- uInt,
- inflate_huft *,
- inflate_huft *,
- inflate_blocks_statef *,
- z_streamp ));
diff --git a/libpng/inffixed.h b/libpng/inffixed.h
deleted file mode 100644
index 77f7e76..0000000
--- a/libpng/inffixed.h
+++ /dev/null
@@ -1,151 +0,0 @@
-/* inffixed.h -- table for decoding fixed codes
- * Generated automatically by the maketree.c program
- */
-
-/* WARNING: this file should *not* be used by applications. It is
- part of the implementation of the compression library and is
- subject to change. Applications should only use zlib.h.
- */
-
-local uInt fixed_bl = 9;
-local uInt fixed_bd = 5;
-local inflate_huft fixed_tl[] = {
- {{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115},
- {{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},192},
- {{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},160},
- {{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},224},
- {{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},144},
- {{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},208},
- {{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},176},
- {{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},240},
- {{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227},
- {{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},200},
- {{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},168},
- {{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},232},
- {{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},152},
- {{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},216},
- {{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},184},
- {{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},248},
- {{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163},
- {{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},196},
- {{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},164},
- {{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},228},
- {{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},148},
- {{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},212},
- {{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},180},
- {{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},244},
- {{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0},
- {{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},204},
- {{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},172},
- {{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},236},
- {{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},156},
- {{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},220},
- {{{82,7}},27}, {{{0,8}},110}, {{{0,8}},46}, {{{0,9}},188},
- {{{0,8}},14}, {{{0,8}},142}, {{{0,8}},78}, {{{0,9}},252},
- {{{96,7}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131},
- {{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},194},
- {{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},162},
- {{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},226},
- {{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},146},
- {{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},210},
- {{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},178},
- {{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},242},
- {{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258},
- {{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},202},
- {{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},170},
- {{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},234},
- {{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},154},
- {{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},218},
- {{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},186},
- {{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},250},
- {{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195},
- {{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},198},
- {{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},166},
- {{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},230},
- {{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},150},
- {{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},214},
- {{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},182},
- {{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},246},
- {{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0},
- {{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},206},
- {{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},174},
- {{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},238},
- {{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},158},
- {{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},222},
- {{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},190},
- {{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},254},
- {{{96,7}},256}, {{{0,8}},80}, {{{0,8}},16}, {{{84,8}},115},
- {{{82,7}},31}, {{{0,8}},112}, {{{0,8}},48}, {{{0,9}},193},
- {{{80,7}},10}, {{{0,8}},96}, {{{0,8}},32}, {{{0,9}},161},
- {{{0,8}},0}, {{{0,8}},128}, {{{0,8}},64}, {{{0,9}},225},
- {{{80,7}},6}, {{{0,8}},88}, {{{0,8}},24}, {{{0,9}},145},
- {{{83,7}},59}, {{{0,8}},120}, {{{0,8}},56}, {{{0,9}},209},
- {{{81,7}},17}, {{{0,8}},104}, {{{0,8}},40}, {{{0,9}},177},
- {{{0,8}},8}, {{{0,8}},136}, {{{0,8}},72}, {{{0,9}},241},
- {{{80,7}},4}, {{{0,8}},84}, {{{0,8}},20}, {{{85,8}},227},
- {{{83,7}},43}, {{{0,8}},116}, {{{0,8}},52}, {{{0,9}},201},
- {{{81,7}},13}, {{{0,8}},100}, {{{0,8}},36}, {{{0,9}},169},
- {{{0,8}},4}, {{{0,8}},132}, {{{0,8}},68}, {{{0,9}},233},
- {{{80,7}},8}, {{{0,8}},92}, {{{0,8}},28}, {{{0,9}},153},
- {{{84,7}},83}, {{{0,8}},124}, {{{0,8}},60}, {{{0,9}},217},
- {{{82,7}},23}, {{{0,8}},108}, {{{0,8}},44}, {{{0,9}},185},
- {{{0,8}},12}, {{{0,8}},140}, {{{0,8}},76}, {{{0,9}},249},
- {{{80,7}},3}, {{{0,8}},82}, {{{0,8}},18}, {{{85,8}},163},
- {{{83,7}},35}, {{{0,8}},114}, {{{0,8}},50}, {{{0,9}},197},
- {{{81,7}},11}, {{{0,8}},98}, {{{0,8}},34}, {{{0,9}},165},
- {{{0,8}},2}, {{{0,8}},130}, {{{0,8}},66}, {{{0,9}},229},
- {{{80,7}},7}, {{{0,8}},90}, {{{0,8}},26}, {{{0,9}},149},
- {{{84,7}},67}, {{{0,8}},122}, {{{0,8}},58}, {{{0,9}},213},
- {{{82,7}},19}, {{{0,8}},106}, {{{0,8}},42}, {{{0,9}},181},
- {{{0,8}},10}, {{{0,8}},138}, {{{0,8}},74}, {{{0,9}},245},
- {{{80,7}},5}, {{{0,8}},86}, {{{0,8}},22}, {{{192,8}},0},
- {{{83,7}},51}, {{{0,8}},118}, {{{0,8}},54}, {{{0,9}},205},
- {{{81,7}},15}, {{{0,8}},102}, {{{0,8}},38}, {{{0,9}},173},
- {{{0,8}},6}, {{{0,8}},134}, {{{0,8}},70}, {{{0,9}},237},
- {{{80,7}},9}, {{{0,8}},94}, {{{0,8}},30}, {{{0,9}},157},
- {{{84,7}},99}, {{{0,8}},126}, {{{0,8}},62}, {{{0,9}},221},
- {{{82,7}},27}, {{{0,8}},110}, {{{0,8}},46}, {{{0,9}},189},
- {{{0,8}},14}, {{{0,8}},142}, {{{0,8}},78}, {{{0,9}},253},
- {{{96,7}},256}, {{{0,8}},81}, {{{0,8}},17}, {{{85,8}},131},
- {{{82,7}},31}, {{{0,8}},113}, {{{0,8}},49}, {{{0,9}},195},
- {{{80,7}},10}, {{{0,8}},97}, {{{0,8}},33}, {{{0,9}},163},
- {{{0,8}},1}, {{{0,8}},129}, {{{0,8}},65}, {{{0,9}},227},
- {{{80,7}},6}, {{{0,8}},89}, {{{0,8}},25}, {{{0,9}},147},
- {{{83,7}},59}, {{{0,8}},121}, {{{0,8}},57}, {{{0,9}},211},
- {{{81,7}},17}, {{{0,8}},105}, {{{0,8}},41}, {{{0,9}},179},
- {{{0,8}},9}, {{{0,8}},137}, {{{0,8}},73}, {{{0,9}},243},
- {{{80,7}},4}, {{{0,8}},85}, {{{0,8}},21}, {{{80,8}},258},
- {{{83,7}},43}, {{{0,8}},117}, {{{0,8}},53}, {{{0,9}},203},
- {{{81,7}},13}, {{{0,8}},101}, {{{0,8}},37}, {{{0,9}},171},
- {{{0,8}},5}, {{{0,8}},133}, {{{0,8}},69}, {{{0,9}},235},
- {{{80,7}},8}, {{{0,8}},93}, {{{0,8}},29}, {{{0,9}},155},
- {{{84,7}},83}, {{{0,8}},125}, {{{0,8}},61}, {{{0,9}},219},
- {{{82,7}},23}, {{{0,8}},109}, {{{0,8}},45}, {{{0,9}},187},
- {{{0,8}},13}, {{{0,8}},141}, {{{0,8}},77}, {{{0,9}},251},
- {{{80,7}},3}, {{{0,8}},83}, {{{0,8}},19}, {{{85,8}},195},
- {{{83,7}},35}, {{{0,8}},115}, {{{0,8}},51}, {{{0,9}},199},
- {{{81,7}},11}, {{{0,8}},99}, {{{0,8}},35}, {{{0,9}},167},
- {{{0,8}},3}, {{{0,8}},131}, {{{0,8}},67}, {{{0,9}},231},
- {{{80,7}},7}, {{{0,8}},91}, {{{0,8}},27}, {{{0,9}},151},
- {{{84,7}},67}, {{{0,8}},123}, {{{0,8}},59}, {{{0,9}},215},
- {{{82,7}},19}, {{{0,8}},107}, {{{0,8}},43}, {{{0,9}},183},
- {{{0,8}},11}, {{{0,8}},139}, {{{0,8}},75}, {{{0,9}},247},
- {{{80,7}},5}, {{{0,8}},87}, {{{0,8}},23}, {{{192,8}},0},
- {{{83,7}},51}, {{{0,8}},119}, {{{0,8}},55}, {{{0,9}},207},
- {{{81,7}},15}, {{{0,8}},103}, {{{0,8}},39}, {{{0,9}},175},
- {{{0,8}},7}, {{{0,8}},135}, {{{0,8}},71}, {{{0,9}},239},
- {{{80,7}},9}, {{{0,8}},95}, {{{0,8}},31}, {{{0,9}},159},
- {{{84,7}},99}, {{{0,8}},127}, {{{0,8}},63}, {{{0,9}},223},
- {{{82,7}},27}, {{{0,8}},111}, {{{0,8}},47}, {{{0,9}},191},
- {{{0,8}},15}, {{{0,8}},143}, {{{0,8}},79}, {{{0,9}},255}
- };
-local inflate_huft fixed_td[] = {
- {{{80,5}},1}, {{{87,5}},257}, {{{83,5}},17}, {{{91,5}},4097},
- {{{81,5}},5}, {{{89,5}},1025}, {{{85,5}},65}, {{{93,5}},16385},
- {{{80,5}},3}, {{{88,5}},513}, {{{84,5}},33}, {{{92,5}},8193},
- {{{82,5}},9}, {{{90,5}},2049}, {{{86,5}},129}, {{{192,5}},24577},
- {{{80,5}},2}, {{{87,5}},385}, {{{83,5}},25}, {{{91,5}},6145},
- {{{81,5}},7}, {{{89,5}},1537}, {{{85,5}},97}, {{{93,5}},24577},
- {{{80,5}},4}, {{{88,5}},769}, {{{84,5}},49}, {{{92,5}},12289},
- {{{82,5}},13}, {{{90,5}},3073}, {{{86,5}},193}, {{{192,5}},24577}
- };
diff --git a/libpng/inflate.c b/libpng/inflate.c
deleted file mode 100644
index 5425855..0000000
--- a/libpng/inflate.c
+++ /dev/null
@@ -1,350 +0,0 @@
-/* inflate.c -- zlib interface to inflate modules
- * Copyright (C) 1995-2002 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-#include "zutil.h"
-#include "infblock.h"
-
-struct inflate_blocks_state {int dummy;}; /* for buggy compilers */
-
-typedef enum {
- METHOD, /* waiting for method byte */
- FLAG, /* waiting for flag byte */
- DICT4, /* four dictionary check bytes to go */
- DICT3, /* three dictionary check bytes to go */
- DICT2, /* two dictionary check bytes to go */
- DICT1, /* one dictionary check byte to go */
- DICT0, /* waiting for inflateSetDictionary */
- BLOCKS, /* decompressing blocks */
- CHECK4, /* four check bytes to go */
- CHECK3, /* three check bytes to go */
- CHECK2, /* two check bytes to go */
- CHECK1, /* one check byte to go */
- DONE, /* finished check, done */
- BAD} /* got an error--stay here */
-inflate_mode;
-
-/* inflate private state */
-struct internal_state {
-
- /* mode */
- inflate_mode mode; /* current inflate mode */
-
- /* mode dependent information */
- union {
- uInt method; /* if FLAGS, method byte */
- struct {
- uLong was; /* computed check value */
- uLong need; /* stream check value */
- } check; /* if CHECK, check values to compare */
- uInt marker; /* if BAD, inflateSync's marker bytes count */
- } sub; /* submode */
-
- /* mode independent information */
- int nowrap; /* flag for no wrapper */
- uInt wbits; /* log2(window size) (8..15, defaults to 15) */
- inflate_blocks_statef
- *blocks; /* current inflate_blocks state */
-
-};
-
-
-int ZEXPORT inflateReset(z_streamp z)
-{
- if (z == Z_NULL || z->state == Z_NULL)
- return Z_STREAM_ERROR;
- z->total_in = z->total_out = 0;
- z->msg = Z_NULL;
- z->state->mode = z->state->nowrap ? BLOCKS : METHOD;
- inflate_blocks_reset(z->state->blocks, z, Z_NULL);
- Tracev((stderr, "inflate: reset\n"));
- return Z_OK;
-}
-
-
-int ZEXPORT inflateEnd(z_streamp z)
-{
- if (z == Z_NULL || z->state == Z_NULL || z->zfree == Z_NULL)
- return Z_STREAM_ERROR;
- if (z->state->blocks != Z_NULL)
- inflate_blocks_free(z->state->blocks, z);
- ZFREE(z, z->state);
- z->state = Z_NULL;
- Tracev((stderr, "inflate: end\n"));
- return Z_OK;
-}
-
-
-int ZEXPORT inflateInit2_(z_streamp z, int w, const char *version, int stream_size)
-{
- if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
- stream_size != sizeof(z_stream))
- return Z_VERSION_ERROR;
-
- /* initialize state */
- if (z == Z_NULL)
- return Z_STREAM_ERROR;
- z->msg = Z_NULL;
- if (z->zalloc == Z_NULL)
- {
- z->zalloc = zcalloc;
- z->opaque = (voidpf)0;
- }
- if (z->zfree == Z_NULL) z->zfree = zcfree;
- if ((z->state = (struct internal_state FAR *)
- ZALLOC(z,1,sizeof(struct internal_state))) == Z_NULL)
- return Z_MEM_ERROR;
- z->state->blocks = Z_NULL;
-
- /* handle undocumented nowrap option (no zlib header or check) */
- z->state->nowrap = 0;
- if (w < 0)
- {
- w = - w;
- z->state->nowrap = 1;
- }
-
- /* set window size */
- if (w < 8 || w > 15)
- {
- inflateEnd(z);
- return Z_STREAM_ERROR;
- }
- z->state->wbits = (uInt)w;
-
- /* create inflate_blocks state */
- if ((z->state->blocks =
- inflate_blocks_new(z, z->state->nowrap ? Z_NULL : adler32, (uInt)1 << w))
- == Z_NULL)
- {
- inflateEnd(z);
- return Z_MEM_ERROR;
- }
- Tracev((stderr, "inflate: allocated\n"));
-
- /* reset state */
- inflateReset(z);
- return Z_OK;
-}
-
-
-int ZEXPORT inflateInit_(z_streamp z, const char *version, int stream_size)
-{
- return inflateInit2_(z, DEF_WBITS, version, stream_size);
-}
-
-
-#define NEEDBYTE {if(z->avail_in==0)return r;r=f;}
-#define NEXTBYTE (z->avail_in--,z->total_in++,*z->next_in++)
-
-int ZEXPORT inflate(z_streamp z, int f)
-{
- int r;
- uInt b;
-
- if (z == Z_NULL || z->state == Z_NULL || z->next_in == Z_NULL)
- return Z_STREAM_ERROR;
- f = f == Z_FINISH ? Z_BUF_ERROR : Z_OK;
- r = Z_BUF_ERROR;
- while (1) switch (z->state->mode)
- {
- case METHOD:
- NEEDBYTE
- if (((z->state->sub.method = NEXTBYTE) & 0xf) != Z_DEFLATED)
- {
- z->state->mode = BAD;
- z->msg = (char*)"unknown compression method";
- z->state->sub.marker = 5; /* can't try inflateSync */
- break;
- }
- if ((z->state->sub.method >> 4) + 8 > z->state->wbits)
- {
- z->state->mode = BAD;
- z->msg = (char*)"invalid window size";
- z->state->sub.marker = 5; /* can't try inflateSync */
- break;
- }
- z->state->mode = FLAG;
- case FLAG:
- NEEDBYTE
- b = NEXTBYTE;
- if (((z->state->sub.method << 8) + b) % 31)
- {
- z->state->mode = BAD;
- z->msg = (char*)"incorrect header check";
- z->state->sub.marker = 5; /* can't try inflateSync */
- break;
- }
- Tracev((stderr, "inflate: zlib header ok\n"));
- if (!(b & PRESET_DICT))
- {
- z->state->mode = BLOCKS;
- break;
- }
- z->state->mode = DICT4;
- case DICT4:
- NEEDBYTE
- z->state->sub.check.need = (uLong)NEXTBYTE << 24;
- z->state->mode = DICT3;
- case DICT3:
- NEEDBYTE
- z->state->sub.check.need += (uLong)NEXTBYTE << 16;
- z->state->mode = DICT2;
- case DICT2:
- NEEDBYTE
- z->state->sub.check.need += (uLong)NEXTBYTE << 8;
- z->state->mode = DICT1;
- case DICT1:
- NEEDBYTE
- z->state->sub.check.need += (uLong)NEXTBYTE;
- z->adler = z->state->sub.check.need;
- z->state->mode = DICT0;
- return Z_NEED_DICT;
- case DICT0:
- z->state->mode = BAD;
- z->msg = (char*)"need dictionary";
- z->state->sub.marker = 0; /* can try inflateSync */
- return Z_STREAM_ERROR;
- case BLOCKS:
- r = inflate_blocks(z->state->blocks, z, r);
- if (r == Z_DATA_ERROR)
- {
- z->state->mode = BAD;
- z->state->sub.marker = 0; /* can try inflateSync */
- break;
- }
- if (r == Z_OK)
- r = f;
- if (r != Z_STREAM_END)
- return r;
- r = f;
- inflate_blocks_reset(z->state->blocks, z, &z->state->sub.check.was);
- if (z->state->nowrap)
- {
- z->state->mode = DONE;
- break;
- }
- z->state->mode = CHECK4;
- case CHECK4:
- NEEDBYTE
- z->state->sub.check.need = (uLong)NEXTBYTE << 24;
- z->state->mode = CHECK3;
- case CHECK3:
- NEEDBYTE
- z->state->sub.check.need += (uLong)NEXTBYTE << 16;
- z->state->mode = CHECK2;
- case CHECK2:
- NEEDBYTE
- z->state->sub.check.need += (uLong)NEXTBYTE << 8;
- z->state->mode = CHECK1;
- case CHECK1:
- NEEDBYTE
- z->state->sub.check.need += (uLong)NEXTBYTE;
-
- if (z->state->sub.check.was != z->state->sub.check.need)
- {
- z->state->mode = BAD;
- z->msg = (char*)"incorrect data check";
- z->state->sub.marker = 5; /* can't try inflateSync */
- break;
- }
- Tracev((stderr, "inflate: zlib check ok\n"));
- z->state->mode = DONE;
- case DONE:
- return Z_STREAM_END;
- case BAD:
- return Z_DATA_ERROR;
- default:
- return Z_STREAM_ERROR;
- }
-#ifdef NEED_DUMMY_RETURN
- return Z_STREAM_ERROR; /* Some dumb compilers complain without this */
-#endif
-}
-
-
-int ZEXPORT inflateSetDictionary(z_streamp z, const Bytef *dictionary, uInt dictLength)
-{
- uInt length = dictLength;
-
- if (z == Z_NULL || z->state == Z_NULL || z->state->mode != DICT0)
- return Z_STREAM_ERROR;
-
- if (adler32(1L, dictionary, dictLength) != z->adler) return Z_DATA_ERROR;
- z->adler = 1L;
-
- if (length >= ((uInt)1<<z->state->wbits))
- {
- length = (1<<z->state->wbits)-1;
- dictionary += dictLength - length;
- }
- inflate_set_dictionary(z->state->blocks, dictionary, length);
- z->state->mode = BLOCKS;
- return Z_OK;
-}
-
-
-int ZEXPORT inflateSync(z_streamp z)
-{
- uInt n; /* number of bytes to look at */
- Bytef *p; /* pointer to bytes */
- uInt m; /* number of marker bytes found in a row */
- uLong r, w; /* temporaries to save total_in and total_out */
-
- /* set up */
- if (z == Z_NULL || z->state == Z_NULL)
- return Z_STREAM_ERROR;
- if (z->state->mode != BAD)
- {
- z->state->mode = BAD;
- z->state->sub.marker = 0;
- }
- if ((n = z->avail_in) == 0)
- return Z_BUF_ERROR;
- p = z->next_in;
- m = z->state->sub.marker;
-
- /* search */
- while (n && m < 4)
- {
- static const Byte mark[4] = {0, 0, 0xff, 0xff};
- if (*p == mark[m])
- m++;
- else if (*p)
- m = 0;
- else
- m = 4 - m;
- p++, n--;
- }
-
- /* restore */
- z->total_in += p - z->next_in;
- z->next_in = p;
- z->avail_in = n;
- z->state->sub.marker = m;
-
- /* return no joy or set up to restart on a new block */
- if (m != 4)
- return Z_DATA_ERROR;
- r = z->total_in; w = z->total_out;
- inflateReset(z);
- z->total_in = r; z->total_out = w;
- z->state->mode = BLOCKS;
- return Z_OK;
-}
-
-
-/* Returns true if inflate is currently at the end of a block generated
- * by Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP
- * implementation to provide an additional safety check. PPP uses Z_SYNC_FLUSH
- * but removes the length bytes of the resulting empty stored block. When
- * decompressing, PPP checks that at the end of input packet, inflate is
- * waiting for these length bytes.
- */
-int ZEXPORT inflateSyncPoint(z_streamp z)
-{
- if (z == Z_NULL || z->state == Z_NULL || z->state->blocks == Z_NULL)
- return Z_STREAM_ERROR;
- return inflate_blocks_sync_point(z->state->blocks);
-}
diff --git a/libpng/inftrees.c b/libpng/inftrees.c
deleted file mode 100644
index ca38111..0000000
--- a/libpng/inftrees.c
+++ /dev/null
@@ -1,456 +0,0 @@
-/* inftrees.c -- generate Huffman trees for efficient decoding
- * Copyright (C) 1995-2002 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-#include "zutil.h"
-#include "inftrees.h"
-
-#if !defined(BUILDFIXED) && !defined(STDC)
-# define BUILDFIXED /* non ANSI compilers may not accept inffixed.h */
-#endif
-
-const char inflate_copyright[] =
- " inflate 1.1.4 Copyright 1995-2002 Mark Adler ";
-/*
- If you use the zlib library in a product, an acknowledgment is welcome
- in the documentation of your product. If for some reason you cannot
- include such an acknowledgment, I would appreciate that you keep this
- copyright string in the executable of your product.
- */
-struct internal_state {int dummy;}; /* for buggy compilers */
-
-/* simplify the use of the inflate_huft type with some defines */
-#define exop word.what.Exop
-#define bits word.what.Bits
-
-
-local int huft_build OF((
- uIntf *, /* code lengths in bits */
- uInt, /* number of codes */
- uInt, /* number of "simple" codes */
- const uIntf *, /* list of base values for non-simple codes */
- const uIntf *, /* list of extra bits for non-simple codes */
- inflate_huft * FAR*,/* result: starting table */
- uIntf *, /* maximum lookup bits (returns actual) */
- inflate_huft *, /* space for trees */
- uInt *, /* hufts used in space */
- uIntf * )); /* space for values */
-
-/* Tables for deflate from PKZIP's appnote.txt. */
-local const uInt cplens[31] = { /* Copy lengths for literal codes 257..285 */
- 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
- 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
- /* see note #13 above about 258 */
-local const uInt cplext[31] = { /* Extra bits for literal codes 257..285 */
- 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
- 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 112, 112}; /* 112==invalid */
-local const uInt cpdist[30] = { /* Copy offsets for distance codes 0..29 */
- 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
- 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
- 8193, 12289, 16385, 24577};
-local const uInt cpdext[30] = { /* Extra bits for distance codes */
- 0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6,
- 7, 7, 8, 8, 9, 9, 10, 10, 11, 11,
- 12, 12, 13, 13};
-
-/*
- Huffman code decoding is performed using a multi-level table lookup.
- The fastest way to decode is to simply build a lookup table whose
- size is determined by the longest code. However, the time it takes
- to build this table can also be a factor if the data being decoded
- is not very long. The most common codes are necessarily the
- shortest codes, so those codes dominate the decoding time, and hence
- the speed. The idea is you can have a shorter table that decodes the
- shorter, more probable codes, and then point to subsidiary tables for
- the longer codes. The time it costs to decode the longer codes is
- then traded against the time it takes to make longer tables.
-
- This results of this trade are in the variables lbits and dbits
- below. lbits is the number of bits the first level table for literal/
- length codes can decode in one step, and dbits is the same thing for
- the distance codes. Subsequent tables are also less than or equal to
- those sizes. These values may be adjusted either when all of the
- codes are shorter than that, in which case the longest code length in
- bits is used, or when the shortest code is *longer* than the requested
- table size, in which case the length of the shortest code in bits is
- used.
-
- There are two different values for the two tables, since they code a
- different number of possibilities each. The literal/length table
- codes 286 possible values, or in a flat code, a little over eight
- bits. The distance table codes 30 possible values, or a little less
- than five bits, flat. The optimum values for speed end up being
- about one bit more than those, so lbits is 8+1 and dbits is 5+1.
- The optimum values may differ though from machine to machine, and
- possibly even between compilers. Your mileage may vary.
- */
-
-
-/* If BMAX needs to be larger than 16, then h and x[] should be uLong. */
-#define BMAX 15 /* maximum bit length of any code */
-
-local int huft_build(uIntf *b, uInt n, uInt s, const uIntf *d, const uIntf *e, inflate_huft **t, uIntf *m, inflate_huft *hp, uInt *hn, uIntf *v)
- /* code lengths in bits (all assumed <= BMAX) */
- /* number of codes (assumed <= 288) */
- /* number of simple-valued codes (0..s-1) */
- /* list of base values for non-simple codes */
- /* list of extra bits for non-simple codes */
- /* result: starting table */
- /* maximum lookup bits, returns actual */
- /* space for trees */
- /* hufts used in space */
- /* working area: values in order of bit length */
-/* Given a list of code lengths and a maximum table size, make a set of
- tables to decode that set of codes. Return Z_OK on success, Z_BUF_ERROR
- if the given code set is incomplete (the tables are still built in this
- case), or Z_DATA_ERROR if the input is invalid. */
-{
-
- uInt a; /* counter for codes of length k */
- uInt c[BMAX+1]; /* bit length count table */
- uInt f; /* i repeats in table every f entries */
- int g; /* maximum code length */
- int h; /* table level */
- register uInt i; /* counter, current code */
- register uInt j; /* counter */
- register int k; /* number of bits in current code */
- int l; /* bits per table (returned in m) */
- uInt mask; /* (1 << w) - 1, to avoid cc -O bug on HP */
- register uIntf *p; /* pointer into c[], b[], or v[] */
- inflate_huft *q; /* points to current table */
- struct inflate_huft_s r; /* table entry for structure assignment */
- inflate_huft *u[BMAX]; /* table stack */
- register int w; /* bits before this table == (l * h) */
- uInt x[BMAX+1]; /* bit offsets, then code stack */
- uIntf *xp; /* pointer into x */
- int y; /* number of dummy codes added */
- uInt z; /* number of entries in current table */
-
-
- /* Generate counts for each bit length */
- p = c;
-#define C0 *p++ = 0;
-#define C2 C0 C0 C0 C0
-#define C4 C2 C2 C2 C2
- C4 /* clear c[]--assume BMAX+1 is 16 */
- p = b; i = n;
- do {
- c[*p++]++; /* assume all entries <= BMAX */
- } while (--i);
- if (c[0] == n) /* null input--all zero length codes */
- {
- *t = (inflate_huft *)Z_NULL;
- *m = 0;
- return Z_OK;
- }
-
-
- /* Find minimum and maximum length, bound *m by those */
- l = *m;
- for (j = 1; j <= BMAX; j++)
- if (c[j])
- break;
- k = j; /* minimum code length */
- if ((uInt)l < j)
- l = j;
- for (i = BMAX; i; i--)
- if (c[i])
- break;
- g = i; /* maximum code length */
- if ((uInt)l > i)
- l = i;
- *m = l;
-
-
- /* Adjust last length count to fill out codes, if needed */
- for (y = 1 << j; j < i; j++, y <<= 1)
- if ((y -= c[j]) < 0)
- return Z_DATA_ERROR;
- if ((y -= c[i]) < 0)
- return Z_DATA_ERROR;
- c[i] += y;
-
-
- /* Generate starting offsets into the value table for each length */
- x[1] = j = 0;
- p = c + 1; xp = x + 2;
- while (--i) { /* note that i == g from above */
- *xp++ = (j += *p++);
- }
-
-
- /* Make a table of values in order of bit lengths */
- p = b; i = 0;
- do {
- if ((j = *p++) != 0)
- v[x[j]++] = i;
- } while (++i < n);
- n = x[g]; /* set n to length of v */
-
-
- /* Generate the Huffman codes and for each, make the table entries */
- x[0] = i = 0; /* first Huffman code is zero */
- p = v; /* grab values in bit order */
- h = -1; /* no tables yet--level -1 */
- w = -l; /* bits decoded == (l * h) */
- u[0] = (inflate_huft *)Z_NULL; /* just to keep compilers happy */
- q = (inflate_huft *)Z_NULL; /* ditto */
- z = 0; /* ditto */
-
- /* go through the bit lengths (k already is bits in shortest code) */
- for (; k <= g; k++)
- {
- a = c[k];
- while (a--)
- {
- /* here i is the Huffman code of length k bits for value *p */
- /* make tables up to required level */
- while (k > w + l)
- {
- h++;
- w += l; /* previous table always l bits */
-
- /* compute minimum size table less than or equal to l bits */
- z = g - w;
- z = z > (uInt)l ? (uInt)l : z; /* table size upper limit */
- if ((f = 1 << (j = k - w)) > a + 1) /* try a k-w bit table */
- { /* too few codes for k-w bit table */
- f -= a + 1; /* deduct codes from patterns left */
- xp = c + k;
- if (j < z)
- while (++j < z) /* try smaller tables up to z bits */
- {
- if ((f <<= 1) <= *++xp)
- break; /* enough codes to use up j bits */
- f -= *xp; /* else deduct codes from patterns */
- }
- }
- z = 1 << j; /* table entries for j-bit table */
-
- /* allocate new table */
- if (*hn + z > MANY) /* (note: doesn't matter for fixed) */
- return Z_DATA_ERROR; /* overflow of MANY */
- u[h] = q = hp + *hn;
- *hn += z;
-
- /* connect to last table, if there is one */
- if (h)
- {
- x[h] = i; /* save pattern for backing up */
- r.bits = (Byte)l; /* bits to dump before this table */
- r.exop = (Byte)j; /* bits in this table */
- j = i >> (w - l);
- r.base = (uInt)(q - u[h-1] - j); /* offset to this table */
- u[h-1][j] = r; /* connect to last table */
- }
- else
- *t = q; /* first table is returned result */
- }
-
- /* set up table entry in r */
- r.bits = (Byte)(k - w);
- if (p >= v + n)
- r.exop = 128 + 64; /* out of values--invalid code */
- else if (*p < s)
- {
- r.exop = (Byte)(*p < 256 ? 0 : 32 + 64); /* 256 is end-of-block */
- r.base = *p++; /* simple code is just the value */
- }
- else
- {
- r.exop = (Byte)(e[*p - s] + 16 + 64);/* non-simple--look up in lists */
- r.base = d[*p++ - s];
- }
-
- /* fill code-like entries with r */
- f = 1 << (k - w);
- for (j = i >> w; j < z; j += f)
- q[j] = r;
-
- /* backwards increment the k-bit code i */
- for (j = 1 << (k - 1); i & j; j >>= 1)
- i ^= j;
- i ^= j;
-
- /* backup over finished tables */
- mask = (1 << w) - 1; /* needed on HP, cc -O bug */
- while ((i & mask) != x[h])
- {
- h--; /* don't need to update q */
- w -= l;
- mask = (1 << w) - 1;
- }
- }
- }
-
-
- /* Return Z_BUF_ERROR if we were given an incomplete table */
- return y != 0 && g != 1 ? Z_BUF_ERROR : Z_OK;
-}
-
-
-int inflate_trees_bits(uIntf *c, uIntf *bb, inflate_huft **tb, inflate_huft *hp, z_streamp z)
- /* 19 code lengths */
- /* bits tree desired/actual depth */
- /* bits tree result */
- /* space for trees */
- /* for messages */
-{
- int r;
- uInt hn = 0; /* hufts used in space */
- uIntf *v; /* work area for huft_build */
-
- if ((v = (uIntf*)ZALLOC(z, 19, sizeof(uInt))) == Z_NULL)
- return Z_MEM_ERROR;
- r = huft_build(c, 19, 19, (uIntf*)Z_NULL, (uIntf*)Z_NULL,
- tb, bb, hp, &hn, v);
- if (r == Z_DATA_ERROR)
- z->msg = (char*)"oversubscribed dynamic bit lengths tree";
- else if (r == Z_BUF_ERROR || *bb == 0)
- {
- z->msg = (char*)"incomplete dynamic bit lengths tree";
- r = Z_DATA_ERROR;
- }
- ZFREE(z, v);
- return r;
-}
-
-
-int inflate_trees_dynamic(uInt nl, uInt nd, uIntf *c, uIntf *bl, uIntf *bd, inflate_huft **tl, inflate_huft **td, inflate_huft *hp, z_streamp z)
- /* number of literal/length codes */
- /* number of distance codes */
- /* that many (total) code lengths */
- /* literal desired/actual bit depth */
- /* distance desired/actual bit depth */
- /* literal/length tree result */
- /* distance tree result */
- /* space for trees */
- /* for messages */
-{
- int r;
- uInt hn = 0; /* hufts used in space */
- uIntf *v; /* work area for huft_build */
-
- /* allocate work area */
- if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL)
- return Z_MEM_ERROR;
-
- /* build literal/length tree */
- r = huft_build(c, nl, 257, cplens, cplext, tl, bl, hp, &hn, v);
- if (r != Z_OK || *bl == 0)
- {
- if (r == Z_DATA_ERROR)
- z->msg = (char*)"oversubscribed literal/length tree";
- else if (r != Z_MEM_ERROR)
- {
- z->msg = (char*)"incomplete literal/length tree";
- r = Z_DATA_ERROR;
- }
- ZFREE(z, v);
- return r;
- }
-
- /* build distance tree */
- r = huft_build(c + nl, nd, 0, cpdist, cpdext, td, bd, hp, &hn, v);
- if (r != Z_OK || (*bd == 0 && nl > 257))
- {
- if (r == Z_DATA_ERROR)
- z->msg = (char*)"oversubscribed distance tree";
- else if (r == Z_BUF_ERROR) {
-#ifdef PKZIP_BUG_WORKAROUND
- r = Z_OK;
- }
-#else
- z->msg = (char*)"incomplete distance tree";
- r = Z_DATA_ERROR;
- }
- else if (r != Z_MEM_ERROR)
- {
- z->msg = (char*)"empty distance tree with lengths";
- r = Z_DATA_ERROR;
- }
- ZFREE(z, v);
- return r;
-#endif
- }
-
- /* done */
- ZFREE(z, v);
- return Z_OK;
-}
-
-
-/* build fixed tables only once--keep them here */
-#ifdef BUILDFIXED
-local int fixed_built = 0;
-#define FIXEDH 544 /* number of hufts used by fixed tables */
-local inflate_huft fixed_mem[FIXEDH];
-local uInt fixed_bl;
-local uInt fixed_bd;
-local inflate_huft *fixed_tl;
-local inflate_huft *fixed_td;
-#else
-#include "inffixed.h"
-#endif
-
-
-int inflate_trees_fixed(uIntf *bl, uIntf *bd, inflate_huft **tl, inflate_huft **td, z_streamp z)
- /* literal desired/actual bit depth */
- /* distance desired/actual bit depth */
- /* literal/length tree result */
- /* distance tree result */
- /* for memory allocation */
-{
-#ifdef BUILDFIXED
- /* build fixed tables if not already */
- if (!fixed_built)
- {
- int k; /* temporary variable */
- uInt f = 0; /* number of hufts used in fixed_mem */
- uIntf *c; /* length list for huft_build */
- uIntf *v; /* work area for huft_build */
-
- /* allocate memory */
- if ((c = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL)
- return Z_MEM_ERROR;
- if ((v = (uIntf*)ZALLOC(z, 288, sizeof(uInt))) == Z_NULL)
- {
- ZFREE(z, c);
- return Z_MEM_ERROR;
- }
-
- /* literal table */
- for (k = 0; k < 144; k++)
- c[k] = 8;
- for (; k < 256; k++)
- c[k] = 9;
- for (; k < 280; k++)
- c[k] = 7;
- for (; k < 288; k++)
- c[k] = 8;
- fixed_bl = 9;
- huft_build(c, 288, 257, cplens, cplext, &fixed_tl, &fixed_bl,
- fixed_mem, &f, v);
-
- /* distance table */
- for (k = 0; k < 30; k++)
- c[k] = 5;
- fixed_bd = 5;
- huft_build(c, 30, 0, cpdist, cpdext, &fixed_td, &fixed_bd,
- fixed_mem, &f, v);
-
- /* done */
- ZFREE(z, v);
- ZFREE(z, c);
- fixed_built = 1;
- }
-#else
- z=z; /* DvH: added to avoid compiler warning */
-#endif
- *bl = fixed_bl;
- *bd = fixed_bd;
- *tl = fixed_tl;
- *td = fixed_td;
- return Z_OK;
-}
diff --git a/libpng/inftrees.h b/libpng/inftrees.h
deleted file mode 100644
index 04b73b7..0000000
--- a/libpng/inftrees.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/* inftrees.h -- header to use inftrees.c
- * Copyright (C) 1995-2002 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* WARNING: this file should *not* be used by applications. It is
- part of the implementation of the compression library and is
- subject to change. Applications should only use zlib.h.
- */
-
-/* Huffman code lookup table entry--this entry is four bytes for machines
- that have 16-bit pointers (e.g. PC's in the small or medium model). */
-
-typedef struct inflate_huft_s FAR inflate_huft;
-
-struct inflate_huft_s {
- union {
- struct {
- Byte Exop; /* number of extra bits or operation */
- Byte Bits; /* number of bits in this code or subcode */
- } what;
- uInt pad; /* pad structure to a power of 2 (4 bytes for */
- } word; /* 16-bit, 8 bytes for 32-bit int's) */
- uInt base; /* literal, length base, distance base,
- or table offset */
-};
-
-/* Maximum size of dynamic tree. The maximum found in a long but non-
- exhaustive search was 1004 huft structures (850 for length/literals
- and 154 for distances, the latter actually the result of an
- exhaustive search). The actual maximum is not known, but the
- value below is more than safe. */
-#define MANY 1440
-
-extern int inflate_trees_bits OF((
- uIntf *, /* 19 code lengths */
- uIntf *, /* bits tree desired/actual depth */
- inflate_huft * FAR *, /* bits tree result */
- inflate_huft *, /* space for trees */
- z_streamp)); /* for messages */
-
-extern int inflate_trees_dynamic OF((
- uInt, /* number of literal/length codes */
- uInt, /* number of distance codes */
- uIntf *, /* that many (total) code lengths */
- uIntf *, /* literal desired/actual bit depth */
- uIntf *, /* distance desired/actual bit depth */
- inflate_huft * FAR *, /* literal/length tree result */
- inflate_huft * FAR *, /* distance tree result */
- inflate_huft *, /* space for trees */
- z_streamp)); /* for messages */
-
-extern int inflate_trees_fixed OF((
- uIntf *, /* literal desired/actual bit depth */
- uIntf *, /* distance desired/actual bit depth */
- inflate_huft * FAR *, /* literal/length tree result */
- inflate_huft * FAR *, /* distance tree result */
- z_streamp)); /* for memory allocation */
diff --git a/libpng/infutil.c b/libpng/infutil.c
deleted file mode 100644
index 537c8c7..0000000
--- a/libpng/infutil.c
+++ /dev/null
@@ -1,84 +0,0 @@
-/* inflate_util.c -- data and routines common to blocks and codes
- * Copyright (C) 1995-2002 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-#include "zutil.h"
-#include "infblock.h"
-#include "inftrees.h"
-#include "infcodes.h"
-#include "infutil.h"
-
-struct inflate_codes_state {int dummy;}; /* for buggy compilers */
-
-/* And'ing with mask[n] masks the lower n bits */
-uInt inflate_mask[17] = {
- 0x0000,
- 0x0001, 0x0003, 0x0007, 0x000f, 0x001f, 0x003f, 0x007f, 0x00ff,
- 0x01ff, 0x03ff, 0x07ff, 0x0fff, 0x1fff, 0x3fff, 0x7fff, 0xffff
-};
-
-
-/* copy as much as possible from the sliding window to the output area */
-int inflate_flush(inflate_blocks_statef *s, z_streamp z, int r)
-{
- uInt n;
- Bytef *p;
- Bytef *q;
-
- /* local copies of source and destination pointers */
- p = z->next_out;
- q = s->read;
-
- /* compute number of bytes to copy as far as end of window */
- n = (uInt)((q <= s->write ? s->write : s->end) - q);
- if (n > z->avail_out) n = z->avail_out;
- if (n && r == Z_BUF_ERROR) r = Z_OK;
-
- /* update counters */
- z->avail_out -= n;
- z->total_out += n;
-
- /* update check information */
- if (s->checkfn != Z_NULL)
- z->adler = s->check = (*s->checkfn)(s->check, q, n);
-
- /* copy as far as end of window */
- zmemcpy(p, q, n);
- p += n;
- q += n;
-
- /* see if more to copy at beginning of window */
- if (q == s->end)
- {
- /* wrap pointers */
- q = s->window;
- if (s->write == s->end)
- s->write = s->window;
-
- /* compute bytes to copy */
- n = (uInt)(s->write - q);
- if (n > z->avail_out) n = z->avail_out;
- if (n && r == Z_BUF_ERROR) r = Z_OK;
-
- /* update counters */
- z->avail_out -= n;
- z->total_out += n;
-
- /* update check information */
- if (s->checkfn != Z_NULL)
- z->adler = s->check = (*s->checkfn)(s->check, q, n);
-
- /* copy */
- zmemcpy(p, q, n);
- p += n;
- q += n;
- }
-
- /* update pointers */
- z->next_out = p;
- s->read = q;
-
- /* done */
- return r;
-}
diff --git a/libpng/infutil.h b/libpng/infutil.h
deleted file mode 100644
index 4401df8..0000000
--- a/libpng/infutil.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/* infutil.h -- types and macros common to blocks and codes
- * Copyright (C) 1995-2002 Mark Adler
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* WARNING: this file should *not* be used by applications. It is
- part of the implementation of the compression library and is
- subject to change. Applications should only use zlib.h.
- */
-
-#ifndef _INFUTIL_H
-#define _INFUTIL_H
-
-typedef enum {
- TYPE, /* get type bits (3, including end bit) */
- LENS, /* get lengths for stored */
- STORED, /* processing stored block */
- TABLE, /* get table lengths */
- BTREE, /* get bit lengths tree for a dynamic block */
- DTREE, /* get length, distance trees for a dynamic block */
- CODES, /* processing fixed or dynamic block */
- DRY, /* output remaining window bytes */
- DONE, /* finished last block, done */
- BAD} /* got a data error--stuck here */
-inflate_block_mode;
-
-/* inflate blocks semi-private state */
-struct inflate_blocks_state {
-
- /* mode */
- inflate_block_mode mode; /* current inflate_block mode */
-
- /* mode dependent information */
- union {
- uInt left; /* if STORED, bytes left to copy */
- struct {
- uInt table; /* table lengths (14 bits) */
- uInt index; /* index into blens (or border) */
- uIntf *blens; /* bit lengths of codes */
- uInt bb; /* bit length tree depth */
- inflate_huft *tb; /* bit length decoding tree */
- } trees; /* if DTREE, decoding info for trees */
- struct {
- inflate_codes_statef
- *codes;
- } decode; /* if CODES, current state */
- } sub; /* submode */
- uInt last; /* true if this block is the last block */
-
- /* mode independent information */
- uInt bitk; /* bits in bit buffer */
- uLong bitb; /* bit buffer */
- inflate_huft *hufts; /* single malloc for tree space */
- Bytef *window; /* sliding window */
- Bytef *end; /* one byte after sliding window */
- Bytef *read; /* window read pointer */
- Bytef *write; /* window write pointer */
- check_func checkfn; /* check function */
- uLong check; /* check on output */
-
-};
-
-
-/* defines for inflate input/output */
-/* update pointers and return */
-#define UPDBITS {s->bitb=b;s->bitk=k;}
-#define UPDIN {z->avail_in=n;z->total_in+=p-z->next_in;z->next_in=p;}
-#define UPDOUT {s->write=q;}
-#define UPDATE {UPDBITS UPDIN UPDOUT}
-#define LEAVE {UPDATE return inflate_flush(s,z,r);}
-/* get bytes and bits */
-#define LOADIN {p=z->next_in;n=z->avail_in;b=s->bitb;k=s->bitk;}
-#define NEEDBYTE {if(n)r=Z_OK;else LEAVE}
-#define NEXTBYTE (n--,*p++)
-#define NEEDBITS(j) {while(k<(j)){NEEDBYTE;b|=((uLong)NEXTBYTE)<<k;k+=8;}}
-#define DUMPBITS(j) {b>>=(j);k-=(j);}
-/* output bytes */
-#define WAVAIL (uInt)(q<s->read?s->read-q-1:s->end-q)
-#define LOADOUT {q=s->write;m=(uInt)WAVAIL;}
-#define WRAP {if(q==s->end&&s->read!=s->window){q=s->window;m=(uInt)WAVAIL;}}
-#define FLUSH {UPDOUT r=inflate_flush(s,z,r); LOADOUT}
-#define NEEDOUT {if(m==0){WRAP if(m==0){FLUSH WRAP if(m==0) LEAVE}}r=Z_OK;}
-#define OUTBYTE(a) {*q++=(Byte)(a);m--;}
-/* load local pointers */
-#define LOAD {LOADIN LOADOUT}
-
-/* masks for lower bits (size given to avoid silly warnings with Visual C++) */
-extern uInt inflate_mask[17];
-
-/* copy as much as possible from the sliding window to the output area */
-extern int inflate_flush OF((
- inflate_blocks_statef *,
- z_streamp ,
- int));
-
-struct internal_state {int dummy;}; /* for buggy compilers */
-
-#endif
diff --git a/libpng/libpng.pro.in b/libpng/libpng.pro.in
deleted file mode 100644
index 34bfd32..0000000
--- a/libpng/libpng.pro.in
+++ /dev/null
@@ -1,53 +0,0 @@
-TEMPLATE = lib
-CONFIG = warn_on staticlib $extraopts
-HEADERS = deflate.h \
- infblock.h \
- infcodes.h \
- inffast.h \
- inffixed.h \
- inftrees.h \
- infutil.h \
- png.h \
- pngasmrd.h \
- pngconf.h \
- trees.h \
- zconf.h \
- zlib.h \
- zutil.h
-SOURCES = adler32.c \
- compress.c \
- crc32.c \
- deflate.c \
- gzio.c \
- infblock.c \
- infcodes.c \
- inffast.c \
- inflate.c \
- inftrees.c \
- infutil.c \
- png.c \
- pngerror.c \
- pnggccrd.c \
- pngget.c \
- pngmem.c \
- pngpread.c \
- pngread.c \
- pngrio.c \
- pngrtran.c \
- pngrutil.c \
- pngset.c \
- pngtrans.c \
- pngvcrd.c \
- pngwio.c \
- pngwrite.c \
- pngwtran.c \
- pngwutil.c \
- trees.c \
- uncompr.c \
- zutil.c
-win32:INCLUDEPATH += .
-win32-g++:TMAKE_CFLAGS += -D__CYGWIN__ -DALL_STATIC
-DESTDIR = ../lib
-TARGET = png
-OBJECTS_DIR = ../objects
-
diff --git a/libpng/png.c b/libpng/png.c
deleted file mode 100644
index 72bd00e..0000000
--- a/libpng/png.c
+++ /dev/null
@@ -1,777 +0,0 @@
-
-/* png.c - location for general purpose libpng functions
- *
- * libpng version 1.2.1 - December 12, 2001
- * Copyright (c) 1998-2001 Glenn Randers-Pehrson
- * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
- * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
- *
- */
-
-#define PNG_INTERNAL
-#define PNG_NO_EXTERN
-#include "png.h"
-
-/* Generate a compiler error if there is an old png.h in the search path. */
-typedef version_1_2_1 Your_png_h_is_not_version_1_2_1;
-
-/* Version information for C files. This had better match the version
- * string defined in png.h. */
-
-#ifdef PNG_USE_GLOBAL_ARRAYS
-/* png_libpng_ver was changed to a function in version 1.0.5c */
-const char png_libpng_ver[18] = "1.2.1";
-
-/* png_sig was changed to a function in version 1.0.5c */
-/* Place to hold the signature string for a PNG file. */
-const png_byte FARDATA png_sig[8] = {137, 80, 78, 71, 13, 10, 26, 10};
-
-/* Invoke global declarations for constant strings for known chunk types */
-PNG_IHDR;
-PNG_IDAT;
-PNG_IEND;
-PNG_PLTE;
-PNG_bKGD;
-PNG_cHRM;
-PNG_gAMA;
-PNG_hIST;
-PNG_iCCP;
-PNG_iTXt;
-PNG_oFFs;
-PNG_pCAL;
-PNG_sCAL;
-PNG_pHYs;
-PNG_sBIT;
-PNG_sPLT;
-PNG_sRGB;
-PNG_tEXt;
-PNG_tIME;
-PNG_tRNS;
-PNG_zTXt;
-
-/* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
-
-/* start of interlace block */
-const int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};
-
-/* offset to next interlace block */
-const int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};
-
-/* start of interlace block in the y direction */
-const int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1};
-
-/* offset to next interlace block in the y direction */
-const int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};
-
-/* width of interlace block (used in assembler routines only) */
-#ifdef PNG_HAVE_ASSEMBLER_COMBINE_ROW
-const int FARDATA png_pass_width[] = {8, 4, 4, 2, 2, 1, 1};
-#endif
-
-/* Height of interlace block. This is not currently used - if you need
- * it, uncomment it here and in png.h
-const int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1};
-*/
-
-/* Mask to determine which pixels are valid in a pass */
-const int FARDATA png_pass_mask[] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff};
-
-/* Mask to determine which pixels to overwrite while displaying */
-const int FARDATA png_pass_dsp_mask[]
- = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff};
-
-#endif
-
-/* Tells libpng that we have already handled the first "num_bytes" bytes
- * of the PNG file signature. If the PNG data is embedded into another
- * stream we can set num_bytes = 8 so that libpng will not attempt to read
- * or write any of the magic bytes before it starts on the IHDR.
- */
-
-void PNGAPI
-png_set_sig_bytes(png_structp png_ptr, int num_bytes)
-{
- png_debug(1, "in png_set_sig_bytes\n");
- if (num_bytes > 8)
- png_error(png_ptr, "Too many bytes for PNG signature.");
-
- png_ptr->sig_bytes = (png_byte)(num_bytes < 0 ? 0 : num_bytes);
-}
-
-/* Checks whether the supplied bytes match the PNG signature. We allow
- * checking less than the full 8-byte signature so that those apps that
- * already read the first few bytes of a file to determine the file type
- * can simply check the remaining bytes for extra assurance. Returns
- * an integer less than, equal to, or greater than zero if sig is found,
- * respectively, to be less than, to match, or be greater than the correct
- * PNG signature (this is the same behaviour as strcmp, memcmp, etc).
- */
-int PNGAPI
-png_sig_cmp(png_bytep sig, png_size_t start, png_size_t num_to_check)
-{
- png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10};
- if (num_to_check > 8)
- num_to_check = 8;
- else if (num_to_check < 1)
- return (0);
-
- if (start > 7)
- return (0);
-
- if (start + num_to_check > 8)
- num_to_check = 8 - start;
-
- return ((int)(png_memcmp(&sig[start], &png_signature[start], num_to_check)));
-}
-
-/* (Obsolete) function to check signature bytes. It does not allow one
- * to check a partial signature. This function might be removed in the
- * future - use png_sig_cmp(). Returns true (nonzero) if the file is a PNG.
- */
-int PNGAPI
-png_check_sig(png_bytep sig, int num)
-{
- return ((int)!png_sig_cmp(sig, (png_size_t)0, (png_size_t)num));
-}
-
-/* Function to allocate memory for zlib and clear it to 0. */
-voidpf /* PRIVATE */
-png_zalloc(voidpf png_ptr, uInt items, uInt size)
-{
- png_uint_32 num_bytes = (png_uint_32)items * size;
- png_voidp ptr = (png_voidp)png_malloc((png_structp)png_ptr, num_bytes);
-
-#ifndef PNG_NO_ZALLOC_ZERO
- if (num_bytes > (png_uint_32)0x8000L)
- {
- png_memset(ptr, 0, (png_size_t)0x8000L);
- png_memset((png_bytep)ptr + (png_size_t)0x8000L, 0,
- (png_size_t)(num_bytes - (png_uint_32)0x8000L));
- }
- else
- {
- png_memset(ptr, 0, (png_size_t)num_bytes);
- }
-#endif
- return ((voidpf)ptr);
-}
-
-/* function to free memory for zlib */
-void /* PRIVATE */
-png_zfree(voidpf png_ptr, voidpf ptr)
-{
- png_free((png_structp)png_ptr, (png_voidp)ptr);
-}
-
-/* Reset the CRC variable to 32 bits of 1's. Care must be taken
- * in case CRC is > 32 bits to leave the top bits 0.
- */
-void /* PRIVATE */
-png_reset_crc(png_structp png_ptr)
-{
- png_ptr->crc = crc32(0, Z_NULL, 0);
-}
-
-/* Calculate the CRC over a section of data. We can only pass as
- * much data to this routine as the largest single buffer size. We
- * also check that this data will actually be used before going to the
- * trouble of calculating it.
- */
-void /* PRIVATE */
-png_calculate_crc(png_structp png_ptr, png_bytep ptr, png_size_t length)
-{
- int need_crc = 1;
-
- if (png_ptr->chunk_name[0] & 0x20) /* ancillary */
- {
- if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) ==
- (PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN))
- need_crc = 0;
- }
- else /* critical */
- {
- if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE)
- need_crc = 0;
- }
-
- if (need_crc)
- png_ptr->crc = crc32(png_ptr->crc, ptr, (uInt)length);
-}
-
-/* Allocate the memory for an info_struct for the application. We don't
- * really need the png_ptr, but it could potentially be useful in the
- * future. This should be used in favour of malloc(sizeof(png_info))
- * and png_info_init() so that applications that want to use a shared
- * libpng don't have to be recompiled if png_info changes size.
- */
-png_infop PNGAPI
-png_create_info_struct(png_structp png_ptr)
-{
- png_infop info_ptr;
-
- png_debug(1, "in png_create_info_struct\n");
- if(png_ptr == NULL) return (NULL);
-#ifdef PNG_USER_MEM_SUPPORTED
- info_ptr = (png_infop)png_create_struct_2(PNG_STRUCT_INFO,
- png_ptr->malloc_fn, png_ptr->mem_ptr);
-#else
- info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO);
-#endif
- if (info_ptr != NULL)
- png_info_init_3(&info_ptr, sizeof(png_info));
-
- return (info_ptr);
-}
-
-/* This function frees the memory associated with a single info struct.
- * Normally, one would use either png_destroy_read_struct() or
- * png_destroy_write_struct() to free an info struct, but this may be
- * useful for some applications.
- */
-void PNGAPI
-png_destroy_info_struct(png_structp png_ptr, png_infopp info_ptr_ptr)
-{
- png_infop info_ptr = NULL;
-
- png_debug(1, "in png_destroy_info_struct\n");
- if (info_ptr_ptr != NULL)
- info_ptr = *info_ptr_ptr;
-
- if (info_ptr != NULL)
- {
- png_info_destroy(png_ptr, info_ptr);
-
-#ifdef PNG_USER_MEM_SUPPORTED
- png_destroy_struct_2((png_voidp)info_ptr, png_ptr->free_fn,
- png_ptr->mem_ptr);
-#else
- png_destroy_struct((png_voidp)info_ptr);
-#endif
- *info_ptr_ptr = NULL;
- }
-}
-
-/* Initialize the info structure. This is now an internal function (0.89)
- * and applications using it are urged to use png_create_info_struct()
- * instead.
- */
-#undef png_info_init
-void PNGAPI
-png_info_init(png_infop info_ptr)
-{
- /* We only come here via pre-1.0.12-compiled applications */
- png_info_init_3(&info_ptr, 0);
-}
-
-void PNGAPI
-png_info_init_3(png_infopp ptr_ptr, png_size_t png_info_struct_size)
-{
- png_infop info_ptr = *ptr_ptr;
-
- png_debug(1, "in png_info_init_3\n");
-
- if(sizeof(png_info) > png_info_struct_size)
- {
- png_destroy_struct(info_ptr);
- info_ptr = (png_infop)png_create_struct(PNG_STRUCT_INFO);
- *ptr_ptr = info_ptr;
- }
-
- /* set everything to 0 */
- png_memset(info_ptr, 0, sizeof (png_info));
-}
-
-#ifdef PNG_FREE_ME_SUPPORTED
-void PNGAPI
-png_data_freer(png_structp png_ptr, png_infop info_ptr,
- int freer, png_uint_32 mask)
-{
- png_debug(1, "in png_data_freer\n");
- if (png_ptr == NULL || info_ptr == NULL)
- return;
- if(freer == PNG_DESTROY_WILL_FREE_DATA)
- info_ptr->free_me |= mask;
- else if(freer == PNG_USER_WILL_FREE_DATA)
- info_ptr->free_me &= ~mask;
- else
- png_warning(png_ptr,
- "Unknown freer parameter in png_data_freer.");
-}
-#endif
-
-void PNGAPI
-png_free_data(png_structp png_ptr, png_infop info_ptr, png_uint_32 mask,
- int num)
-{
- png_debug(1, "in png_free_data\n");
- if (png_ptr == NULL || info_ptr == NULL)
- return;
-
-#if defined(PNG_TEXT_SUPPORTED)
-/* free text item num or (if num == -1) all text items */
-#ifdef PNG_FREE_ME_SUPPORTED
-if ((mask & PNG_FREE_TEXT) & info_ptr->free_me)
-#else
-if (mask & PNG_FREE_TEXT)
-#endif
-{
- if (num != -1)
- {
- if (info_ptr->text && info_ptr->text[num].key)
- {
- png_free(png_ptr, info_ptr->text[num].key);
- info_ptr->text[num].key = NULL;
- }
- }
- else
- {
- int i;
- for (i = 0; i < info_ptr->num_text; i++)
- png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, i);
- png_free(png_ptr, info_ptr->text);
- info_ptr->text = NULL;
- info_ptr->num_text=0;
- }
-}
-#endif
-
-#if defined(PNG_tRNS_SUPPORTED)
-/* free any tRNS entry */
-#ifdef PNG_FREE_ME_SUPPORTED
-if ((mask & PNG_FREE_TRNS) & info_ptr->free_me)
-#else
-if ((mask & PNG_FREE_TRNS) && (png_ptr->flags & PNG_FLAG_FREE_TRNS))
-#endif
-{
- png_free(png_ptr, info_ptr->trans);
- info_ptr->valid &= ~PNG_INFO_tRNS;
- info_ptr->trans = NULL;
-}
-#endif
-
-#if defined(PNG_sCAL_SUPPORTED)
-/* free any sCAL entry */
-#ifdef PNG_FREE_ME_SUPPORTED
-if ((mask & PNG_FREE_SCAL) & info_ptr->free_me)
-#else
-if (mask & PNG_FREE_SCAL)
-#endif
-{
-#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED)
- png_free(png_ptr, info_ptr->scal_s_width);
- png_free(png_ptr, info_ptr->scal_s_height);
- info_ptr->scal_s_width = NULL;
- info_ptr->scal_s_height = NULL;
-#endif
- info_ptr->valid &= ~PNG_INFO_sCAL;
-}
-#endif
-
-#if defined(PNG_pCAL_SUPPORTED)
-/* free any pCAL entry */
-#ifdef PNG_FREE_ME_SUPPORTED
-if ((mask & PNG_FREE_PCAL) & info_ptr->free_me)
-#else
-if (mask & PNG_FREE_PCAL)
-#endif
-{
- png_free(png_ptr, info_ptr->pcal_purpose);
- png_free(png_ptr, info_ptr->pcal_units);
- info_ptr->pcal_purpose = NULL;
- info_ptr->pcal_units = NULL;
- if (info_ptr->pcal_params != NULL)
- {
- int i;
- for (i = 0; i < (int)info_ptr->pcal_nparams; i++)
- {
- png_free(png_ptr, info_ptr->pcal_params[i]);
- info_ptr->pcal_params[i]=NULL;
- }
- png_free(png_ptr, info_ptr->pcal_params);
- info_ptr->pcal_params = NULL;
- }
- info_ptr->valid &= ~PNG_INFO_pCAL;
-}
-#endif
-
-#if defined(PNG_iCCP_SUPPORTED)
-/* free any iCCP entry */
-#ifdef PNG_FREE_ME_SUPPORTED
-if ((mask & PNG_FREE_ICCP) & info_ptr->free_me)
-#else
-if (mask & PNG_FREE_ICCP)
-#endif
-{
- png_free(png_ptr, info_ptr->iccp_name);
- png_free(png_ptr, info_ptr->iccp_profile);
- info_ptr->iccp_name = NULL;
- info_ptr->iccp_profile = NULL;
- info_ptr->valid &= ~PNG_INFO_iCCP;
-}
-#endif
-
-#if defined(PNG_sPLT_SUPPORTED)
-/* free a given sPLT entry, or (if num == -1) all sPLT entries */
-#ifdef PNG_FREE_ME_SUPPORTED
-if ((mask & PNG_FREE_SPLT) & info_ptr->free_me)
-#else
-if (mask & PNG_FREE_SPLT)
-#endif
-{
- if (num != -1)
- {
- if(info_ptr->splt_palettes)
- {
- png_free(png_ptr, info_ptr->splt_palettes[num].name);
- png_free(png_ptr, info_ptr->splt_palettes[num].entries);
- info_ptr->splt_palettes[num].name = NULL;
- info_ptr->splt_palettes[num].entries = NULL;
- }
- }
- else
- {
- if(info_ptr->splt_palettes_num)
- {
- int i;
- for (i = 0; i < (int)info_ptr->splt_palettes_num; i++)
- png_free_data(png_ptr, info_ptr, PNG_FREE_SPLT, i);
-
- png_free(png_ptr, info_ptr->splt_palettes);
- info_ptr->splt_palettes = NULL;
- info_ptr->splt_palettes_num = 0;
- }
- info_ptr->valid &= ~PNG_INFO_sPLT;
- }
-}
-#endif
-
-#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
-#ifdef PNG_FREE_ME_SUPPORTED
-if ((mask & PNG_FREE_UNKN) & info_ptr->free_me)
-#else
-if (mask & PNG_FREE_UNKN)
-#endif
-{
- if (num != -1)
- {
- if(info_ptr->unknown_chunks)
- {
- png_free(png_ptr, info_ptr->unknown_chunks[num].data);
- info_ptr->unknown_chunks[num].data = NULL;
- }
- }
- else
- {
- int i;
-
- if(info_ptr->unknown_chunks_num)
- {
- for (i = 0; i < (int)info_ptr->unknown_chunks_num; i++)
- png_free_data(png_ptr, info_ptr, PNG_FREE_UNKN, i);
-
- png_free(png_ptr, info_ptr->unknown_chunks);
- info_ptr->unknown_chunks = NULL;
- info_ptr->unknown_chunks_num = 0;
- }
- }
-}
-#endif
-
-#if defined(PNG_hIST_SUPPORTED)
-/* free any hIST entry */
-#ifdef PNG_FREE_ME_SUPPORTED
-if ((mask & PNG_FREE_HIST) & info_ptr->free_me)
-#else
-if ((mask & PNG_FREE_HIST) && (png_ptr->flags & PNG_FLAG_FREE_HIST))
-#endif
-{
- png_free(png_ptr, info_ptr->hist);
- info_ptr->hist = NULL;
- info_ptr->valid &= ~PNG_INFO_hIST;
-}
-#endif
-
-/* free any PLTE entry that was internally allocated */
-#ifdef PNG_FREE_ME_SUPPORTED
-if ((mask & PNG_FREE_PLTE) & info_ptr->free_me)
-#else
-if ((mask & PNG_FREE_PLTE) && (png_ptr->flags & PNG_FLAG_FREE_PLTE))
-#endif
-{
- png_zfree(png_ptr, info_ptr->palette);
- info_ptr->palette = NULL;
- info_ptr->valid &= ~PNG_INFO_PLTE;
- info_ptr->num_palette = 0;
-}
-
-#if defined(PNG_INFO_IMAGE_SUPPORTED)
-/* free any image bits attached to the info structure */
-#ifdef PNG_FREE_ME_SUPPORTED
-if ((mask & PNG_FREE_ROWS) & info_ptr->free_me)
-#else
-if (mask & PNG_FREE_ROWS)
-#endif
-{
- if(info_ptr->row_pointers)
- {
- int row;
- for (row = 0; row < (int)info_ptr->height; row++)
- {
- png_free(png_ptr, info_ptr->row_pointers[row]);
- info_ptr->row_pointers[row]=NULL;
- }
- png_free(png_ptr, info_ptr->row_pointers);
- info_ptr->row_pointers=NULL;
- }
- info_ptr->valid &= ~PNG_INFO_IDAT;
-}
-#endif
-
-#ifdef PNG_FREE_ME_SUPPORTED
- if(num == -1)
- info_ptr->free_me &= ~mask;
- else
- info_ptr->free_me &= ~(mask & ~PNG_FREE_MUL);
-#endif
-}
-
-/* This is an internal routine to free any memory that the info struct is
- * pointing to before re-using it or freeing the struct itself. Recall
- * that png_free() checks for NULL pointers for us.
- */
-void /* PRIVATE */
-png_info_destroy(png_structp png_ptr, png_infop info_ptr)
-{
- png_debug(1, "in png_info_destroy\n");
-
- png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1);
-
-#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
- if (png_ptr->num_chunk_list)
- {
- png_free(png_ptr, png_ptr->chunk_list);
- png_ptr->chunk_list=NULL;
- png_ptr->num_chunk_list=0;
- }
-#endif
-
- png_info_init_3(&info_ptr, sizeof(png_info));
-}
-
-/* This function returns a pointer to the io_ptr associated with the user
- * functions. The application should free any memory associated with this
- * pointer before png_write_destroy() or png_read_destroy() are called.
- */
-png_voidp PNGAPI
-png_get_io_ptr(png_structp png_ptr)
-{
- return (png_ptr->io_ptr);
-}
-
-#if !defined(PNG_NO_STDIO)
-/* Initialize the default input/output functions for the PNG file. If you
- * use your own read or write routines, you can call either png_set_read_fn()
- * or png_set_write_fn() instead of png_init_io(). If you have defined
- * PNG_NO_STDIO, you must use a function of your own because "FILE *" isn't
- * necessarily available.
- */
-void PNGAPI
-png_init_io(png_structp png_ptr, png_FILE_p fp)
-{
- png_debug(1, "in png_init_io\n");
- png_ptr->io_ptr = (png_voidp)fp;
-}
-#endif
-
-#if defined(PNG_TIME_RFC1123_SUPPORTED)
-/* Convert the supplied time into an RFC 1123 string suitable for use in
- * a "Creation Time" or other text-based time string.
- */
-png_charp PNGAPI
-png_convert_to_rfc1123(png_structp png_ptr, png_timep ptime)
-{
- static PNG_CONST char short_months[12][4] =
- {"Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
-
- if (png_ptr->time_buffer == NULL)
- {
- png_ptr->time_buffer = (png_charp)png_malloc(png_ptr, (png_uint_32)(29*
- sizeof(char)));
- }
-
-#if defined(_WIN32_WCE)
- {
- wchar_t time_buf[29];
- wsprintf(time_buf, TEXT("%d %S %d %02d:%02d:%02d +0000"),
- ptime->day % 32, short_months[(ptime->month - 1) % 12],
- ptime->year, ptime->hour % 24, ptime->minute % 60,
- ptime->second % 61);
- WideCharToMultiByte(CP_ACP, 0, time_buf, -1, png_ptr->time_buffer, 29,
- NULL, NULL);
- }
-#else
-#ifdef USE_FAR_KEYWORD
- {
- char near_time_buf[29];
- sprintf(near_time_buf, "%d %s %d %02d:%02d:%02d +0000",
- ptime->day % 32, short_months[(ptime->month - 1) % 12],
- ptime->year, ptime->hour % 24, ptime->minute % 60,
- ptime->second % 61);
- png_memcpy(png_ptr->time_buffer, near_time_buf,
- 29*sizeof(char));
- }
-#else
- sprintf(png_ptr->time_buffer, "%d %s %d %02d:%02d:%02d +0000",
- ptime->day % 32, short_months[(ptime->month - 1) % 12],
- ptime->year, ptime->hour % 24, ptime->minute % 60,
- ptime->second % 61);
-#endif
-#endif /* _WIN32_WCE */
- return ((png_charp)png_ptr->time_buffer);
-}
-#endif /* PNG_TIME_RFC1123_SUPPORTED */
-
-#if 0
-/* Signature string for a PNG file. */
-png_bytep PNGAPI
-png_sig_bytes(void)
-{
- return ((png_bytep)"\211\120\116\107\015\012\032\012");
-}
-#endif
-
-png_charp PNGAPI
-png_get_copyright(png_structp png_ptr)
-{
- if (png_ptr != NULL || png_ptr == NULL) /* silence compiler warning */
- return ((png_charp) "\n libpng version 1.2.1 - December 12, 2001\n\
- Copyright (c) 1998-2001 Glenn Randers-Pehrson\n\
- Copyright (c) 1996, 1997 Andreas Dilger\n\
- Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.\n");
- return ((png_charp) "");
-}
-
-/* The following return the library version as a short string in the
- * format 1.0.0 through 99.99.99zz. To get the version of *.h files used
- * with your application, print out PNG_LIBPNG_VER_STRING, which is defined
- * in png.h.
- */
-
-png_charp PNGAPI
-png_get_libpng_ver(png_structp png_ptr)
-{
- /* Version of *.c files used when building libpng */
- if(png_ptr != NULL) /* silence compiler warning about unused png_ptr */
- return((png_charp) "1.2.1");
- return((png_charp) "1.2.1");
-}
-
-png_charp PNGAPI
-png_get_header_ver(png_structp png_ptr)
-{
- /* Version of *.h files used when building libpng */
- if(png_ptr != NULL) /* silence compiler warning about unused png_ptr */
- return((png_charp) PNG_LIBPNG_VER_STRING);
- return((png_charp) PNG_LIBPNG_VER_STRING);
-}
-
-png_charp PNGAPI
-png_get_header_version(png_structp png_ptr)
-{
- /* Returns longer string containing both version and date */
- if(png_ptr != NULL) /* silence compiler warning about unused png_ptr */
- return((png_charp) PNG_HEADER_VERSION_STRING);
- return((png_charp) PNG_HEADER_VERSION_STRING);
-}
-
-#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
-int /* PRIVATE */
-png_handle_as_unknown(png_structp png_ptr, png_bytep chunk_name)
-{
- /* check chunk_name and return "keep" value if it's on the list, else 0 */
- int i;
- png_bytep p;
- if((png_ptr == NULL && chunk_name == NULL) || png_ptr->num_chunk_list<=0)
- return 0;
- p=png_ptr->chunk_list+png_ptr->num_chunk_list*5-5;
- for (i = png_ptr->num_chunk_list; i; i--, p-=5)
- if (!png_memcmp(chunk_name, p, 4))
- return ((int)*(p+4));
- return 0;
-}
-#endif
-
-/* This function, added to libpng-1.0.6g, is untested. */
-int PNGAPI
-png_reset_zstream(png_structp png_ptr)
-{
- return (inflateReset(&png_ptr->zstream));
-}
-
-/* This function was added to libpng-1.0.7 */
-png_uint_32 PNGAPI
-png_access_version_number(void)
-{
- /* Version of *.c files used when building libpng */
- return((png_uint_32) 10201L);
-}
-
-
-#if defined(PNG_ASSEMBLER_CODE_SUPPORTED)
- /* GRR: could add this: && defined(PNG_MMX_CODE_SUPPORTED) */
-/* this INTERNAL function was added to libpng 1.2.0 */
-void /* PRIVATE */
-png_init_mmx_flags (png_structp png_ptr)
-{
- png_ptr->mmx_rowbytes_threshold = 0;
- png_ptr->mmx_bitdepth_threshold = 0;
-
-# if (defined(PNG_USE_PNGVCRD) || defined(PNG_USE_PNGGCCRD))
-
- png_ptr->asm_flags |= PNG_ASM_FLAG_MMX_SUPPORT_COMPILED;
-
- if (png_mmx_support()) {
- png_ptr->asm_flags |= PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU
-# ifdef PNG_HAVE_ASSEMBLER_COMBINE_ROW
- | PNG_ASM_FLAG_MMX_READ_COMBINE_ROW
-# endif
-# ifdef PNG_HAVE_ASSEMBLER_READ_INTERLACE
- | PNG_ASM_FLAG_MMX_READ_INTERLACE
-# endif
-# ifndef PNG_HAVE_ASSEMBLER_READ_FILTER_ROW
- ;
-# else
- | PNG_ASM_FLAG_MMX_READ_FILTER_SUB
- | PNG_ASM_FLAG_MMX_READ_FILTER_UP
- | PNG_ASM_FLAG_MMX_READ_FILTER_AVG
- | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ;
-
- png_ptr->mmx_rowbytes_threshold = PNG_MMX_ROWBYTES_THRESHOLD_DEFAULT;
- png_ptr->mmx_bitdepth_threshold = PNG_MMX_BITDEPTH_THRESHOLD_DEFAULT;
-# endif
- } else {
- png_ptr->asm_flags &= ~( PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU
- | PNG_MMX_READ_FLAGS
- | PNG_MMX_WRITE_FLAGS );
- }
-
-# else /* !((PNGVCRD || PNGGCCRD) && PNG_ASSEMBLER_CODE_SUPPORTED)) */
-
- /* clear all MMX flags; no support is compiled in */
- png_ptr->asm_flags &= ~( PNG_MMX_FLAGS );
-
-# endif /* ?(PNGVCRD || PNGGCCRD) */
-}
-
-#endif /* !(PNG_ASSEMBLER_CODE_SUPPORTED) */
-
-/* this function was added to libpng 1.2.0 */
-#if !defined(PNG_USE_PNGGCCRD) && \
- !(defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_USE_PNGVCRD))
-int PNGAPI
-png_mmx_support(void)
-{
- return -1;
-}
-#endif
diff --git a/libpng/png.h b/libpng/png.h
deleted file mode 100644
index 77fc420..0000000
--- a/libpng/png.h
+++ /dev/null
@@ -1,3200 +0,0 @@
-
-/* png.h - header file for PNG reference library
- *
- * libpng version 1.2.1 - December 12, 2001
- * Copyright (c) 1998-2001 Glenn Randers-Pehrson
- * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
- * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
- *
- * Authors and maintainers:
- * libpng versions 0.71, May 1995, through 0.88, January 1996: Guy Schalnat
- * libpng versions 0.89c, June 1996, through 0.96, May 1997: Andreas Dilger
- * libpng versions 0.97, January 1998, through 1.2.1 - December 12, 2001: Glenn
- * See also "Contributing Authors", below.
- *
- * Note about libpng version numbers:
- *
- * Due to various miscommunications, unforeseen code incompatibilities
- * and occasional factors outside the authors' control, version numbering
- * on the library has not always been consistent and straightforward.
- * The following table summarizes matters since version 0.89c, which was
- * the first widely used release:
- *
- * source png.h png.h shared-lib
- * version string int version
- * ------- ------ ----- ----------
- * 0.89c "1.0 beta 3" 0.89 89 1.0.89
- * 0.90 "1.0 beta 4" 0.90 90 0.90 [should have been 2.0.90]
- * 0.95 "1.0 beta 5" 0.95 95 0.95 [should have been 2.0.95]
- * 0.96 "1.0 beta 6" 0.96 96 0.96 [should have been 2.0.96]
- * 0.97b "1.00.97 beta 7" 1.00.97 97 1.0.1 [should have been 2.0.97]
- * 0.97c 0.97 97 2.0.97
- * 0.98 0.98 98 2.0.98
- * 0.99 0.99 98 2.0.99
- * 0.99a-m 0.99 99 2.0.99
- * 1.00 1.00 100 2.1.0 [100 should be 10000]
- * 1.0.0 (from here on, the 100 2.1.0 [100 should be 10000]
- * 1.0.1 png.h string is 10001 2.1.0
- * 1.0.1a-e identical to the 10002 from here on, the shared library
- * 1.0.2 source version) 10002 is 2.V where V is the source code
- * 1.0.2a-b 10003 version, except as noted.
- * 1.0.3 10003
- * 1.0.3a-d 10004
- * 1.0.4 10004
- * 1.0.4a-f 10005
- * 1.0.5 (+ 2 patches) 10005
- * 1.0.5a-d 10006
- * 1.0.5e-r 10100 (not source compatible)
- * 1.0.5s-v 10006 (not binary compatible)
- * 1.0.6 (+ 3 patches) 10006 (still binary incompatible)
- * 1.0.6d-f 10007 (still binary incompatible)
- * 1.0.6g 10007
- * 1.0.6h 10007 10.6h (testing xy.z so-numbering)
- * 1.0.6i 10007 10.6i
- * 1.0.6j 10007 2.1.0.6j (incompatible with 1.0.0)
- * 1.0.7beta11-14 DLLNUM 10007 2.1.0.7beta11-14 (binary compatible)
- * 1.0.7beta15-18 1 10007 2.1.0.7beta15-18 (binary compatible)
- * 1.0.7rc1-2 1 10007 2.1.0.7rc1-2 (binary compatible)
- * 1.0.7 1 10007 (still compatible)
- * 1.0.8beta1-4 1 10008 2.1.0.8beta1-4
- * 1.0.8rc1 1 10008 2.1.0.8rc1
- * 1.0.8 1 10008 2.1.0.8
- * 1.0.9beta1-6 1 10009 2.1.0.9beta1-6
- * 1.0.9rc1 1 10009 2.1.0.9rc1
- * 1.0.9beta7-10 1 10009 2.1.0.9beta7-10
- * 1.0.9rc2 1 10009 2.1.0.9rc2
- * 1.0.9 1 10009 2.1.0.9
- * 1.0.10beta1 1 10010 2.1.0.10beta1
- * 1.0.10rc1 1 10010 2.1.0.10rc1
- * 1.0.10 1 10010 2.1.0.10
- * 1.0.11beta1-3 1 10011 2.1.0.11beta1-3
- * 1.0.11rc1 1 10011 2.1.0.11rc1
- * 1.0.11 1 10011 2.1.0.11
- * 1.0.12beta1-2 2 10012 2.1.0.12beta1-2
- * 1.0.12rc1 2 10012 2.1.0.12rc1
- * 1.0.12 2 10012 2.1.0.12
- * 1.1.0a-f - 10100 2.1.1.0a-f (branch abandoned)
- * 1.2.0beta1-2 2 10200 2.1.2.0beta1-2
- * 1.2.0beta3-5 3 10200 3.1.2.0beta3-5
- * 1.2.0rc1 3 10200 3.1.2.0rc1
- * 1.2.0 3 10200 3.1.2.0
- * 1.2.1beta1-4 3 10201 3.1.2.1beta1-4
- * 1.2.1rc1-2 3 10201 3.1.2.1rc1-2
- * 1.2.1 3 10201 3.1.2.1
- *
- * Henceforth the source version will match the shared-library major
- * and minor numbers; the shared-library major version number will be
- * used for changes in backward compatibility, as it is intended. The
- * PNG_LIBPNG_VER macro, which is not used within libpng but is available
- * for applications, is an unsigned integer of the form xyyzz corresponding
- * to the source version x.y.z (leading zeros in y and z). Beta versions
- * were given the previous public release number plus a letter, until
- * version 1.0.6j; from then on they were given the upcoming public
- * release number plus "betaNN" or "rcN".
- *
- * Binary incompatibility exists only when applications make direct access
- * to the info_ptr or png_ptr members through png.h, and the compiled
- * application is loaded with a different version of the library.
- *
- * DLLNUM will change each time there are forward or backward changes
- * in binary compatibility (e.g., when a new feature is added).
- *
- * See libpng.txt or libpng.3 for more information. The PNG specification
- * is available as RFC 2083 <ftp://ftp.uu.net/graphics/png/documents/>
- * and as a W3C Recommendation <http://www.w3.org/TR/REC.png.html>
- */
-
-/*
- * COPYRIGHT NOTICE, DISCLAIMER, and LICENSE:
- *
- * If you modify libpng you may insert additional notices immediately following
- * this sentence.
- *
- * libpng versions 1.0.7, July 1, 2000, through 1.2.1, December 12, 2001, are
- * Copyright (c) 2000, 2001 Glenn Randers-Pehrson, and are
- * distributed according to the same disclaimer and license as libpng-1.0.6
- * with the following individuals added to the list of Contributing Authors
- *
- * Simon-Pierre Cadieux
- * Eric S. Raymond
- * Gilles Vollant
- *
- * and with the following additions to the disclaimer:
- *
- * There is no warranty against interference with your enjoyment of the
- * library or against infringement. There is no warranty that our
- * efforts or the library will fulfill any of your particular purposes
- * or needs. This library is provided with all faults, and the entire
- * risk of satisfactory quality, performance, accuracy, and effort is with
- * the user.
- *
- * libpng versions 0.97, January 1998, through 1.0.6, March 20, 2000, are
- * Copyright (c) 1998, 1999, 2000 Glenn Randers-Pehrson
- * Distributed according to the same disclaimer and license as libpng-0.96,
- * with the following individuals added to the list of Contributing Authors:
- *
- * Tom Lane
- * Glenn Randers-Pehrson
- * Willem van Schaik
- *
- * libpng versions 0.89, June 1996, through 0.96, May 1997, are
- * Copyright (c) 1996, 1997 Andreas Dilger
- * Distributed according to the same disclaimer and license as libpng-0.88,
- * with the following individuals added to the list of Contributing Authors:
- *
- * John Bowler
- * Kevin Bracey
- * Sam Bushell
- * Magnus Holmgren
- * Greg Roelofs
- * Tom Tanner
- *
- * libpng versions 0.5, May 1995, through 0.88, January 1996, are
- * Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.
- *
- * For the purposes of this copyright and license, "Contributing Authors"
- * is defined as the following set of individuals:
- *
- * Andreas Dilger
- * Dave Martindale
- * Guy Eric Schalnat
- * Paul Schmidt
- * Tim Wegner
- *
- * The PNG Reference Library is supplied "AS IS". The Contributing Authors
- * and Group 42, Inc. disclaim all warranties, expressed or implied,
- * including, without limitation, the warranties of merchantability and of
- * fitness for any purpose. The Contributing Authors and Group 42, Inc.
- * assume no liability for direct, indirect, incidental, special, exemplary,
- * or consequential damages, which may result from the use of the PNG
- * Reference Library, even if advised of the possibility of such damage.
- *
- * Permission is hereby granted to use, copy, modify, and distribute this
- * source code, or portions hereof, for any purpose, without fee, subject
- * to the following restrictions:
- *
- * 1. The origin of this source code must not be misrepresented.
- *
- * 2. Altered versions must be plainly marked as such and
- * must not be misrepresented as being the original source.
- *
- * 3. This Copyright notice may not be removed or altered from
- * any source or altered source distribution.
- *
- * The Contributing Authors and Group 42, Inc. specifically permit, without
- * fee, and encourage the use of this source code as a component to
- * supporting the PNG file format in commercial products. If you use this
- * source code in a product, acknowledgment is not required but would be
- * appreciated.
- */
-
-/*
- * A "png_get_copyright" function is available, for convenient use in "about"
- * boxes and the like:
- *
- * printf("%s",png_get_copyright(NULL));
- *
- * Also, the PNG logo (in PNG format, of course) is supplied in the
- * files "pngbar.png" and "pngbar.jpg (88x31) and "pngnow.png" (98x31).
- */
-
-/*
- * Libpng is OSI Certified Open Source Software. OSI Certified is a
- * certification mark of the Open Source Initiative.
- */
-
-/*
- * The contributing authors would like to thank all those who helped
- * with testing, bug fixes, and patience. This wouldn't have been
- * possible without all of you.
- *
- * Thanks to Frank J. T. Wojcik for helping with the documentation.
- */
-
-/*
- * Y2K compliance in libpng:
- * =========================
- *
- * December 12, 2001
- *
- * Since the PNG Development group is an ad-hoc body, we can't make
- * an official declaration.
- *
- * This is your unofficial assurance that libpng from version 0.71 and
- * upward through 1.2.1 are Y2K compliant. It is my belief that earlier
- * versions were also Y2K compliant.
- *
- * Libpng only has three year fields. One is a 2-byte unsigned integer
- * that will hold years up to 65535. The other two hold the date in text
- * format, and will hold years up to 9999.
- *
- * The integer is
- * "png_uint_16 year" in png_time_struct.
- *
- * The strings are
- * "png_charp time_buffer" in png_struct and
- * "near_time_buffer", which is a local character string in png.c.
- *
- * There are seven time-related functions:
- * png.c: png_convert_to_rfc_1123() in png.c
- * (formerly png_convert_to_rfc_1152() in error)
- * png_convert_from_struct_tm() in pngwrite.c, called in pngwrite.c
- * png_convert_from_time_t() in pngwrite.c
- * png_get_tIME() in pngget.c
- * png_handle_tIME() in pngrutil.c, called in pngread.c
- * png_set_tIME() in pngset.c
- * png_write_tIME() in pngwutil.c, called in pngwrite.c
- *
- * All handle dates properly in a Y2K environment. The
- * png_convert_from_time_t() function calls gmtime() to convert from system
- * clock time, which returns (year - 1900), which we properly convert to
- * the full 4-digit year. There is a possibility that applications using
- * libpng are not passing 4-digit years into the png_convert_to_rfc_1123()
- * function, or that they are incorrectly passing only a 2-digit year
- * instead of "year - 1900" into the png_convert_from_struct_tm() function,
- * but this is not under our control. The libpng documentation has always
- * stated that it works with 4-digit years, and the APIs have been
- * documented as such.
- *
- * The tIME chunk itself is also Y2K compliant. It uses a 2-byte unsigned
- * integer to hold the year, and can hold years as large as 65535.
- *
- * zlib, upon which libpng depends, is also Y2K compliant. It contains
- * no date-related code.
- *
- * Glenn Randers-Pehrson
- * libpng maintainer
- * PNG Development Group
- */
-
-#ifndef PNG_H
-#define PNG_H
-
-/* This is not the place to learn how to use libpng. The file libpng.txt
- * describes how to use libpng, and the file example.c summarizes it
- * with some code on which to build. This file is useful for looking
- * at the actual function definitions and structure components.
- */
-
-/* Version information for png.h - this should match the version in png.c */
-#define PNG_LIBPNG_VER_STRING "1.2.1"
-
-#define PNG_LIBPNG_VER_SONUM 3
-#define PNG_LIBPNG_VER_DLLNUM %DLLNUM%
-
-/* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */
-#define PNG_LIBPNG_VER_MAJOR 1
-#define PNG_LIBPNG_VER_MINOR 2
-#define PNG_LIBPNG_VER_RELEASE 1
-/* This should match the numeric part of the final component of
- * PNG_LIBPNG_VER_STRING, omitting any leading zero: */
-
-#define PNG_LIBPNG_VER_BUILD 0
-
-#define PNG_LIBPNG_BUILD_ALPHA 1
-#define PNG_LIBPNG_BUILD_BETA 2
-#define PNG_LIBPNG_BUILD_RC 3
-#define PNG_LIBPNG_BUILD_STABLE 4
-#define PNG_LIBPNG_BUILD_TYPEMASK 7
-#define PNG_LIBPNG_BUILD_PATCH 8 /* Can be OR'ed with STABLE only */
-#define PNG_LIBPNG_BUILD_TYPE 4
-
-/* Careful here. At one time, Guy wanted to use 082, but that would be octal.
- * We must not include leading zeros.
- * Versions 0.7 through 1.0.0 were in the range 0 to 100 here (only
- * version 1.0.0 was mis-numbered 100 instead of 10000). From
- * version 1.0.1 it's xxyyzz, where x=major, y=minor, z=release */
-#define PNG_LIBPNG_VER 10201 /* 1.2.1 */
-
-#ifndef PNG_VERSION_INFO_ONLY
-
-/* include the compression library's header */
-#include "zlib.h"
-
-/* include all user configurable info, including optional assembler routines */
-#include "pngconf.h"
-
-/* Inhibit C++ name-mangling for libpng functions but not for system calls. */
-#ifdef __cplusplus
-extern "C" {
-#endif /* __cplusplus */
-
-/* This file is arranged in several sections. The first section contains
- * structure and type definitions. The second section contains the external
- * library functions, while the third has the internal library functions,
- * which applications aren't expected to use directly.
- */
-
-#ifndef PNG_NO_TYPECAST_NULL
-#define int_p_NULL (int *)NULL
-#define png_bytep_NULL (png_bytep)NULL
-#define png_bytepp_NULL (png_bytepp)NULL
-#define png_doublep_NULL (png_doublep)NULL
-#define png_error_ptr_NULL (png_error_ptr)NULL
-#define png_flush_ptr_NULL (png_flush_ptr)NULL
-#define png_free_ptr_NULL (png_free_ptr)NULL
-#define png_infopp_NULL (png_infopp)NULL
-#define png_malloc_ptr_NULL (png_malloc_ptr)NULL
-#define png_read_status_ptr_NULL (png_read_status_ptr)NULL
-#define png_rw_ptr_NULL (png_rw_ptr)NULL
-#define png_structp_NULL (png_structp)NULL
-#define png_uint_16p_NULL (png_uint_16p)NULL
-#define png_voidp_NULL (png_voidp)NULL
-#define png_write_status_ptr_NULL (png_write_status_ptr)NULL
-#else
-#define int_p_NULL NULL
-#define png_bytep_NULL NULL
-#define png_bytepp_NULL NULL
-#define png_doublep_NULL NULL
-#define png_error_ptr_NULL NULL
-#define png_flush_ptr_NULL NULL
-#define png_free_ptr_NULL NULL
-#define png_infopp_NULL NULL
-#define png_malloc_ptr_NULL NULL
-#define png_read_status_ptr_NULL NULL
-#define png_rw_ptr_NULL NULL
-#define png_structp_NULL NULL
-#define png_uint_16p_NULL NULL
-#define png_voidp_NULL NULL
-#define png_write_status_ptr_NULL NULL
-#endif
-
-/* variables declared in png.c - only it needs to define PNG_NO_EXTERN */
-#if !defined(PNG_NO_EXTERN) || defined(PNG_ALWAYS_EXTERN)
-/* Version information for C files, stored in png.c. This had better match
- * the version above.
- */
-#ifdef PNG_USE_GLOBAL_ARRAYS
-PNG_EXPORT_VAR (const char) png_libpng_ver[18];
- /* need room for 99.99.99beta99z*/
-#else
-#define png_libpng_ver png_get_header_ver(NULL)
-#endif
-
-#ifdef PNG_USE_GLOBAL_ARRAYS
-/* This was removed in version 1.0.5c */
-/* Structures to facilitate easy interlacing. See png.c for more details */
-PNG_EXPORT_VAR (const int FARDATA) png_pass_start[7];
-PNG_EXPORT_VAR (const int FARDATA) png_pass_inc[7];
-PNG_EXPORT_VAR (const int FARDATA) png_pass_ystart[7];
-PNG_EXPORT_VAR (const int FARDATA) png_pass_yinc[7];
-PNG_EXPORT_VAR (const int FARDATA) png_pass_mask[7];
-PNG_EXPORT_VAR (const int FARDATA) png_pass_dsp_mask[7];
-#ifdef PNG_HAVE_ASSEMBLER_COMBINE_ROW
-PNG_EXPORT_VAR (const int FARDATA) png_pass_width[7];
-#endif
-/* This isn't currently used. If you need it, see png.c for more details.
-PNG_EXPORT_VAR (const int FARDATA) png_pass_height[7];
-*/
-#endif
-
-#endif /* PNG_NO_EXTERN */
-
-/* Three color definitions. The order of the red, green, and blue, (and the
- * exact size) is not important, although the size of the fields need to
- * be png_byte or png_uint_16 (as defined below).
- */
-typedef struct png_color_struct
-{
- png_byte red;
- png_byte green;
- png_byte blue;
-} png_color;
-typedef png_color FAR * png_colorp;
-typedef png_color FAR * FAR * png_colorpp;
-
-typedef struct png_color_16_struct
-{
- png_byte index; /* used for palette files */
- png_uint_16 red; /* for use in red green blue files */
- png_uint_16 green;
- png_uint_16 blue;
- png_uint_16 gray; /* for use in grayscale files */
-} png_color_16;
-typedef png_color_16 FAR * png_color_16p;
-typedef png_color_16 FAR * FAR * png_color_16pp;
-
-typedef struct png_color_8_struct
-{
- png_byte red; /* for use in red green blue files */
- png_byte green;
- png_byte blue;
- png_byte gray; /* for use in grayscale files */
- png_byte alpha; /* for alpha channel files */
-} png_color_8;
-typedef png_color_8 FAR * png_color_8p;
-typedef png_color_8 FAR * FAR * png_color_8pp;
-
-/*
- * The following two structures are used for the in-core representation
- * of sPLT chunks.
- */
-typedef struct png_sPLT_entry_struct
-{
- png_uint_16 red;
- png_uint_16 green;
- png_uint_16 blue;
- png_uint_16 alpha;
- png_uint_16 frequency;
-} png_sPLT_entry;
-typedef png_sPLT_entry FAR * png_sPLT_entryp;
-typedef png_sPLT_entry FAR * FAR * png_sPLT_entrypp;
-
-/* When the depth of the sPLT palette is 8 bits, the color and alpha samples
- * occupy the LSB of their respective members, and the MSB of each member
- * is zero-filled. The frequency member always occupies the full 16 bits.
- */
-
-typedef struct png_sPLT_struct
-{
- png_charp name; /* palette name */
- png_byte depth; /* depth of palette samples */
- png_sPLT_entryp entries; /* palette entries */
- png_int_32 nentries; /* number of palette entries */
-} png_sPLT_t;
-typedef png_sPLT_t FAR * png_sPLT_tp;
-typedef png_sPLT_t FAR * FAR * png_sPLT_tpp;
-
-#ifdef PNG_TEXT_SUPPORTED
-/* png_text holds the contents of a text/ztxt/itxt chunk in a PNG file,
- * and whether that contents is compressed or not. The "key" field
- * points to a regular zero-terminated C string. The "text", "lang", and
- * "lang_key" fields can be regular C strings, empty strings, or NULL pointers.
- * However, the * structure returned by png_get_text() will always contain
- * regular zero-terminated C strings (possibly empty), never NULL pointers,
- * so they can be safely used in printf() and other string-handling functions.
- */
-typedef struct png_text_struct
-{
- int compression; /* compression value:
- -1: tEXt, none
- 0: zTXt, deflate
- 1: iTXt, none
- 2: iTXt, deflate */
- png_charp key; /* keyword, 1-79 character description of "text" */
- png_charp text; /* comment, may be an empty string (ie "")
- or a NULL pointer */
- png_size_t text_length; /* length of the text string */
-#ifdef PNG_iTXt_SUPPORTED
- png_size_t itxt_length; /* length of the itxt string */
- png_charp lang; /* language code, 0-79 characters
- or a NULL pointer */
- png_charp lang_key; /* keyword translated UTF-8 string, 0 or more
- chars or a NULL pointer */
-#endif
-} png_text;
-typedef png_text FAR * png_textp;
-typedef png_text FAR * FAR * png_textpp;
-#endif
-
-/* Supported compression types for text in PNG files (tEXt, and zTXt).
- * The values of the PNG_TEXT_COMPRESSION_ defines should NOT be changed. */
-#define PNG_TEXT_COMPRESSION_NONE_WR -3
-#define PNG_TEXT_COMPRESSION_zTXt_WR -2
-#define PNG_TEXT_COMPRESSION_NONE -1
-#define PNG_TEXT_COMPRESSION_zTXt 0
-#define PNG_ITXT_COMPRESSION_NONE 1
-#define PNG_ITXT_COMPRESSION_zTXt 2
-#define PNG_TEXT_COMPRESSION_LAST 3 /* Not a valid value */
-
-/* png_time is a way to hold the time in an machine independent way.
- * Two conversions are provided, both from time_t and struct tm. There
- * is no portable way to convert to either of these structures, as far
- * as I know. If you know of a portable way, send it to me. As a side
- * note - PNG has always been Year 2000 compliant!
- */
-typedef struct png_time_struct
-{
- png_uint_16 year; /* full year, as in, 1995 */
- png_byte month; /* month of year, 1 - 12 */
- png_byte day; /* day of month, 1 - 31 */
- png_byte hour; /* hour of day, 0 - 23 */
- png_byte minute; /* minute of hour, 0 - 59 */
- png_byte second; /* second of minute, 0 - 60 (for leap seconds) */
-} png_time;
-typedef png_time FAR * png_timep;
-typedef png_time FAR * FAR * png_timepp;
-
-#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
-/* png_unknown_chunk is a structure to hold queued chunks for which there is
- * no specific support. The idea is that we can use this to queue
- * up private chunks for output even though the library doesn't actually
- * know about their semantics.
- */
-typedef struct png_unknown_chunk_t
-{
- png_byte name[5];
- png_byte *data;
- png_size_t size;
-
- /* libpng-using applications should NOT directly modify this byte. */
- png_byte location; /* mode of operation at read time */
-}
-png_unknown_chunk;
-typedef png_unknown_chunk FAR * png_unknown_chunkp;
-typedef png_unknown_chunk FAR * FAR * png_unknown_chunkpp;
-#endif
-
-/* png_info is a structure that holds the information in a PNG file so
- * that the application can find out the characteristics of the image.
- * If you are reading the file, this structure will tell you what is
- * in the PNG file. If you are writing the file, fill in the information
- * you want to put into the PNG file, then call png_write_info().
- * The names chosen should be very close to the PNG specification, so
- * consult that document for information about the meaning of each field.
- *
- * With libpng < 0.95, it was only possible to directly set and read the
- * the values in the png_info_struct, which meant that the contents and
- * order of the values had to remain fixed. With libpng 0.95 and later,
- * however, there are now functions that abstract the contents of
- * png_info_struct from the application, so this makes it easier to use
- * libpng with dynamic libraries, and even makes it possible to use
- * libraries that don't have all of the libpng ancillary chunk-handing
- * functionality.
- *
- * In any case, the order of the parameters in png_info_struct should NOT
- * be changed for as long as possible to keep compatibility with applications
- * that use the old direct-access method with png_info_struct.
- *
- * The following members may have allocated storage attached that should be
- * cleaned up before the structure is discarded: palette, trans, text,
- * pcal_purpose, pcal_units, pcal_params, hist, iccp_name, iccp_profile,
- * splt_palettes, scal_unit, row_pointers, and unknowns. By default, these
- * are automatically freed when the info structure is deallocated, if they were
- * allocated internally by libpng. This behavior can be changed by means
- * of the png_data_freer() function.
- *
- * More allocation details: all the chunk-reading functions that
- * change these members go through the corresponding png_set_*
- * functions. A function to clear these members is available: see
- * png_free_data(). The png_set_* functions do not depend on being
- * able to point info structure members to any of the storage they are
- * passed (they make their own copies), EXCEPT that the png_set_text
- * functions use the same storage passed to them in the text_ptr or
- * itxt_ptr structure argument, and the png_set_rows and png_set_unknowns
- * functions do not make their own copies.
- */
-typedef struct png_info_struct
-{
- /* the following are necessary for every PNG file */
- png_uint_32 width; /* width of image in pixels (from IHDR) */
- png_uint_32 height; /* height of image in pixels (from IHDR) */
- png_uint_32 valid; /* valid chunk data (see PNG_INFO_ below) */
- png_uint_32 rowbytes; /* bytes needed to hold an untransformed row */
- png_colorp palette; /* array of color values (valid & PNG_INFO_PLTE) */
- png_uint_16 num_palette; /* number of color entries in "palette" (PLTE) */
- png_uint_16 num_trans; /* number of transparent palette color (tRNS) */
- png_byte bit_depth; /* 1, 2, 4, 8, or 16 bits/channel (from IHDR) */
- png_byte color_type; /* see PNG_COLOR_TYPE_ below (from IHDR) */
- /* The following three should have been named *_method not *_type */
- png_byte compression_type; /* must be PNG_COMPRESSION_TYPE_BASE (IHDR) */
- png_byte filter_type; /* must be PNG_FILTER_TYPE_BASE (from IHDR) */
- png_byte interlace_type; /* One of PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */
-
- /* The following is informational only on read, and not used on writes. */
- png_byte channels; /* number of data channels per pixel (1, 2, 3, 4)*/
- png_byte pixel_depth; /* number of bits per pixel */
- png_byte spare_byte; /* to align the data, and for future use */
- png_byte signature[8]; /* magic bytes read by libpng from start of file */
-
- /* The rest of the data is optional. If you are reading, check the
- * valid field to see if the information in these are valid. If you
- * are writing, set the valid field to those chunks you want written,
- * and initialize the appropriate fields below.
- */
-
-#if defined(PNG_gAMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED)
- /* The gAMA chunk describes the gamma characteristics of the system
- * on which the image was created, normally in the range [1.0, 2.5].
- * Data is valid if (valid & PNG_INFO_gAMA) is non-zero.
- */
- float gamma; /* gamma value of image, if (valid & PNG_INFO_gAMA) */
-#endif
-
-#if defined(PNG_sRGB_SUPPORTED)
- /* GR-P, 0.96a */
- /* Data valid if (valid & PNG_INFO_sRGB) non-zero. */
- png_byte srgb_intent; /* sRGB rendering intent [0, 1, 2, or 3] */
-#endif
-
-#if defined(PNG_TEXT_SUPPORTED)
- /* The tEXt, and zTXt chunks contain human-readable textual data in
- * uncompressed, compressed, and optionally compressed forms, respectively.
- * The data in "text" is an array of pointers to uncompressed,
- * null-terminated C strings. Each chunk has a keyword that describes the
- * textual data contained in that chunk. Keywords are not required to be
- * unique, and the text string may be empty. Any number of text chunks may
- * be in an image.
- */
- int num_text; /* number of comments read/to write */
- int max_text; /* current size of text array */
- png_textp text; /* array of comments read/to write */
-#endif /* PNG_TEXT_SUPPORTED */
-
-#if defined(PNG_tIME_SUPPORTED)
- /* The tIME chunk holds the last time the displayed image data was
- * modified. See the png_time struct for the contents of this struct.
- */
- png_time mod_time;
-#endif
-
-#if defined(PNG_sBIT_SUPPORTED)
- /* The sBIT chunk specifies the number of significant high-order bits
- * in the pixel data. Values are in the range [1, bit_depth], and are
- * only specified for the channels in the pixel data. The contents of
- * the low-order bits is not specified. Data is valid if
- * (valid & PNG_INFO_sBIT) is non-zero.
- */
- png_color_8 sig_bit; /* significant bits in color channels */
-#endif
-
-#if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_EXPAND_SUPPORTED) || \
-defined(PNG_READ_BACKGROUND_SUPPORTED)
- /* The tRNS chunk supplies transparency data for paletted images and
- * other image types that don't need a full alpha channel. There are
- * "num_trans" transparency values for a paletted image, stored in the
- * same order as the palette colors, starting from index 0. Values
- * for the data are in the range [0, 255], ranging from fully transparent
- * to fully opaque, respectively. For non-paletted images, there is a
- * single color specified that should be treated as fully transparent.
- * Data is valid if (valid & PNG_INFO_tRNS) is non-zero.
- */
- png_bytep trans; /* transparent values for paletted image */
- png_color_16 trans_values; /* transparent color for non-palette image */
-#endif
-
-#if defined(PNG_bKGD_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
- /* The bKGD chunk gives the suggested image background color if the
- * display program does not have its own background color and the image
- * is needs to composited onto a background before display. The colors
- * in "background" are normally in the same color space/depth as the
- * pixel data. Data is valid if (valid & PNG_INFO_bKGD) is non-zero.
- */
- png_color_16 background;
-#endif
-
-#if defined(PNG_oFFs_SUPPORTED)
- /* The oFFs chunk gives the offset in "offset_unit_type" units rightwards
- * and downwards from the top-left corner of the display, page, or other
- * application-specific co-ordinate space. See the PNG_OFFSET_ defines
- * below for the unit types. Valid if (valid & PNG_INFO_oFFs) non-zero.
- */
- png_int_32 x_offset; /* x offset on page */
- png_int_32 y_offset; /* y offset on page */
- png_byte offset_unit_type; /* offset units type */
-#endif
-
-#if defined(PNG_pHYs_SUPPORTED)
- /* The pHYs chunk gives the physical pixel density of the image for
- * display or printing in "phys_unit_type" units (see PNG_RESOLUTION_
- * defines below). Data is valid if (valid & PNG_INFO_pHYs) is non-zero.
- */
- png_uint_32 x_pixels_per_unit; /* horizontal pixel density */
- png_uint_32 y_pixels_per_unit; /* vertical pixel density */
- png_byte phys_unit_type; /* resolution type (see PNG_RESOLUTION_ below) */
-#endif
-
-#if defined(PNG_hIST_SUPPORTED)
- /* The hIST chunk contains the relative frequency or importance of the
- * various palette entries, so that a viewer can intelligently select a
- * reduced-color palette, if required. Data is an array of "num_palette"
- * values in the range [0,65535]. Data valid if (valid & PNG_INFO_hIST)
- * is non-zero.
- */
- png_uint_16p hist;
-#endif
-
-#ifdef PNG_cHRM_SUPPORTED
- /* The cHRM chunk describes the CIE color characteristics of the monitor
- * on which the PNG was created. This data allows the viewer to do gamut
- * mapping of the input image to ensure that the viewer sees the same
- * colors in the image as the creator. Values are in the range
- * [0.0, 0.8]. Data valid if (valid & PNG_INFO_cHRM) non-zero.
- */
-#ifdef PNG_FLOATING_POINT_SUPPORTED
- float x_white;
- float y_white;
- float x_red;
- float y_red;
- float x_green;
- float y_green;
- float x_blue;
- float y_blue;
-#endif
-#endif
-
-#if defined(PNG_pCAL_SUPPORTED)
- /* The pCAL chunk describes a transformation between the stored pixel
- * values and original physical data values used to create the image.
- * The integer range [0, 2^bit_depth - 1] maps to the floating-point
- * range given by [pcal_X0, pcal_X1], and are further transformed by a
- * (possibly non-linear) transformation function given by "pcal_type"
- * and "pcal_params" into "pcal_units". Please see the PNG_EQUATION_
- * defines below, and the PNG-Group's PNG extensions document for a
- * complete description of the transformations and how they should be
- * implemented, and for a description of the ASCII parameter strings.
- * Data values are valid if (valid & PNG_INFO_pCAL) non-zero.
- */
- png_charp pcal_purpose; /* pCAL chunk description string */
- png_int_32 pcal_X0; /* minimum value */
- png_int_32 pcal_X1; /* maximum value */
- png_charp pcal_units; /* Latin-1 string giving physical units */
- png_charpp pcal_params; /* ASCII strings containing parameter values */
- png_byte pcal_type; /* equation type (see PNG_EQUATION_ below) */
- png_byte pcal_nparams; /* number of parameters given in pcal_params */
-#endif
-
-/* New members added in libpng-1.0.6 */
-#ifdef PNG_FREE_ME_SUPPORTED
- png_uint_32 free_me; /* flags items libpng is responsible for freeing */
-#endif
-
-#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
- /* storage for unknown chunks that the library doesn't recognize. */
- png_unknown_chunkp unknown_chunks;
- png_size_t unknown_chunks_num;
-#endif
-
-#if defined(PNG_iCCP_SUPPORTED)
- /* iCCP chunk data. */
- png_charp iccp_name; /* profile name */
- png_charp iccp_profile; /* International Color Consortium profile data */
- /* Note to maintainer: should be png_bytep */
- png_uint_32 iccp_proflen; /* ICC profile data length */
- png_byte iccp_compression; /* Always zero */
-#endif
-
-#if defined(PNG_sPLT_SUPPORTED)
- /* data on sPLT chunks (there may be more than one). */
- png_sPLT_tp splt_palettes;
- png_uint_32 splt_palettes_num;
-#endif
-
-#if defined(PNG_sCAL_SUPPORTED)
- /* The sCAL chunk describes the actual physical dimensions of the
- * subject matter of the graphic. The chunk contains a unit specification
- * a byte value, and two ASCII strings representing floating-point
- * values. The values are width and height corresponsing to one pixel
- * in the image. This external representation is converted to double
- * here. Data values are valid if (valid & PNG_INFO_sCAL) is non-zero.
- */
- png_byte scal_unit; /* unit of physical scale */
-#ifdef PNG_FLOATING_POINT_SUPPORTED
- double scal_pixel_width; /* width of one pixel */
- double scal_pixel_height; /* height of one pixel */
-#endif
-#ifdef PNG_FIXED_POINT_SUPPORTED
- png_charp scal_s_width; /* string containing height */
- png_charp scal_s_height; /* string containing width */
-#endif
-#endif
-
-#if defined(PNG_INFO_IMAGE_SUPPORTED)
- /* Memory has been allocated if (valid & PNG_ALLOCATED_INFO_ROWS) non-zero */
- /* Data valid if (valid & PNG_INFO_IDAT) non-zero */
- png_bytepp row_pointers; /* the image bits */
-#endif
-
-#if defined(PNG_FIXED_POINT_SUPPORTED) && defined(PNG_gAMA_SUPPORTED)
- png_fixed_point int_gamma; /* gamma of image, if (valid & PNG_INFO_gAMA) */
-#endif
-
-#if defined(PNG_cHRM_SUPPORTED) && defined(PNG_FIXED_POINT_SUPPORTED)
- png_fixed_point int_x_white;
- png_fixed_point int_y_white;
- png_fixed_point int_x_red;
- png_fixed_point int_y_red;
- png_fixed_point int_x_green;
- png_fixed_point int_y_green;
- png_fixed_point int_x_blue;
- png_fixed_point int_y_blue;
-#endif
-
-} png_info;
-
-typedef png_info FAR * png_infop;
-typedef png_info FAR * FAR * png_infopp;
-
-/* Maximum positive integer used in PNG is (2^31)-1 */
-#define PNG_MAX_UINT ((png_uint_32)0x7fffffffL)
-
-/* These describe the color_type field in png_info. */
-/* color type masks */
-#define PNG_COLOR_MASK_PALETTE 1
-#define PNG_COLOR_MASK_COLOR 2
-#define PNG_COLOR_MASK_ALPHA 4
-
-/* color types. Note that not all combinations are legal */
-#define PNG_COLOR_TYPE_GRAY 0
-#define PNG_COLOR_TYPE_PALETTE (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_PALETTE)
-#define PNG_COLOR_TYPE_RGB (PNG_COLOR_MASK_COLOR)
-#define PNG_COLOR_TYPE_RGB_ALPHA (PNG_COLOR_MASK_COLOR | PNG_COLOR_MASK_ALPHA)
-#define PNG_COLOR_TYPE_GRAY_ALPHA (PNG_COLOR_MASK_ALPHA)
-/* aliases */
-#define PNG_COLOR_TYPE_RGBA PNG_COLOR_TYPE_RGB_ALPHA
-#define PNG_COLOR_TYPE_GA PNG_COLOR_TYPE_GRAY_ALPHA
-
-/* This is for compression type. PNG 1.0-1.2 only define the single type. */
-#define PNG_COMPRESSION_TYPE_BASE 0 /* Deflate method 8, 32K window */
-#define PNG_COMPRESSION_TYPE_DEFAULT PNG_COMPRESSION_TYPE_BASE
-
-/* This is for filter type. PNG 1.0-1.2 only define the single type. */
-#define PNG_FILTER_TYPE_BASE 0 /* Single row per-byte filtering */
-#define PNG_INTRAPIXEL_DIFFERENCING 64 /* Used only in MNG datastreams */
-#define PNG_FILTER_TYPE_DEFAULT PNG_FILTER_TYPE_BASE
-
-/* These are for the interlacing type. These values should NOT be changed. */
-#define PNG_INTERLACE_NONE 0 /* Non-interlaced image */
-#define PNG_INTERLACE_ADAM7 1 /* Adam7 interlacing */
-#define PNG_INTERLACE_LAST 2 /* Not a valid value */
-
-/* These are for the oFFs chunk. These values should NOT be changed. */
-#define PNG_OFFSET_PIXEL 0 /* Offset in pixels */
-#define PNG_OFFSET_MICROMETER 1 /* Offset in micrometers (1/10^6 meter) */
-#define PNG_OFFSET_LAST 2 /* Not a valid value */
-
-/* These are for the pCAL chunk. These values should NOT be changed. */
-#define PNG_EQUATION_LINEAR 0 /* Linear transformation */
-#define PNG_EQUATION_BASE_E 1 /* Exponential base e transform */
-#define PNG_EQUATION_ARBITRARY 2 /* Arbitrary base exponential transform */
-#define PNG_EQUATION_HYPERBOLIC 3 /* Hyperbolic sine transformation */
-#define PNG_EQUATION_LAST 4 /* Not a valid value */
-
-/* These are for the sCAL chunk. These values should NOT be changed. */
-#define PNG_SCALE_UNKNOWN 0 /* unknown unit (image scale) */
-#define PNG_SCALE_METER 1 /* meters per pixel */
-#define PNG_SCALE_RADIAN 2 /* radians per pixel */
-#define PNG_SCALE_LAST 3 /* Not a valid value */
-
-/* These are for the pHYs chunk. These values should NOT be changed. */
-#define PNG_RESOLUTION_UNKNOWN 0 /* pixels/unknown unit (aspect ratio) */
-#define PNG_RESOLUTION_METER 1 /* pixels/meter */
-#define PNG_RESOLUTION_LAST 2 /* Not a valid value */
-
-/* These are for the sRGB chunk. These values should NOT be changed. */
-#define PNG_sRGB_INTENT_PERCEPTUAL 0
-#define PNG_sRGB_INTENT_RELATIVE 1
-#define PNG_sRGB_INTENT_SATURATION 2
-#define PNG_sRGB_INTENT_ABSOLUTE 3
-#define PNG_sRGB_INTENT_LAST 4 /* Not a valid value */
-
-/* This is for text chunks */
-#define PNG_KEYWORD_MAX_LENGTH 79
-
-/* Maximum number of entries in PLTE/sPLT/tRNS arrays */
-#define PNG_MAX_PALETTE_LENGTH 256
-
-/* These determine if an ancillary chunk's data has been successfully read
- * from the PNG header, or if the application has filled in the corresponding
- * data in the info_struct to be written into the output file. The values
- * of the PNG_INFO_<chunk> defines should NOT be changed.
- */
-#define PNG_INFO_gAMA 0x0001
-#define PNG_INFO_sBIT 0x0002
-#define PNG_INFO_cHRM 0x0004
-#define PNG_INFO_PLTE 0x0008
-#define PNG_INFO_tRNS 0x0010
-#define PNG_INFO_bKGD 0x0020
-#define PNG_INFO_hIST 0x0040
-#define PNG_INFO_pHYs 0x0080
-#define PNG_INFO_oFFs 0x0100
-#define PNG_INFO_tIME 0x0200
-#define PNG_INFO_pCAL 0x0400
-#define PNG_INFO_sRGB 0x0800 /* GR-P, 0.96a */
-#define PNG_INFO_iCCP 0x1000 /* ESR, 1.0.6 */
-#define PNG_INFO_sPLT 0x2000 /* ESR, 1.0.6 */
-#define PNG_INFO_sCAL 0x4000 /* ESR, 1.0.6 */
-#define PNG_INFO_IDAT 0x8000L /* ESR, 1.0.6 */
-
-/* This is used for the transformation routines, as some of them
- * change these values for the row. It also should enable using
- * the routines for other purposes.
- */
-typedef struct png_row_info_struct
-{
- png_uint_32 width; /* width of row */
- png_uint_32 rowbytes; /* number of bytes in row */
- png_byte color_type; /* color type of row */
- png_byte bit_depth; /* bit depth of row */
- png_byte channels; /* number of channels (1, 2, 3, or 4) */
- png_byte pixel_depth; /* bits per pixel (depth * channels) */
-} png_row_info;
-
-typedef png_row_info FAR * png_row_infop;
-typedef png_row_info FAR * FAR * png_row_infopp;
-
-/* These are the function types for the I/O functions and for the functions
- * that allow the user to override the default I/O functions with his or her
- * own. The png_error_ptr type should match that of user-supplied warning
- * and error functions, while the png_rw_ptr type should match that of the
- * user read/write data functions.
- */
-typedef struct png_struct_def png_struct;
-typedef png_struct FAR * png_structp;
-
-typedef void (PNGAPI *png_error_ptr) PNGARG((png_structp, png_const_charp));
-typedef void (PNGAPI *png_rw_ptr) PNGARG((png_structp, png_bytep, png_size_t));
-typedef void (PNGAPI *png_flush_ptr) PNGARG((png_structp));
-typedef void (PNGAPI *png_read_status_ptr) PNGARG((png_structp, png_uint_32,
- int));
-typedef void (PNGAPI *png_write_status_ptr) PNGARG((png_structp, png_uint_32,
- int));
-
-#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
-typedef void (PNGAPI *png_progressive_info_ptr) PNGARG((png_structp, png_infop));
-typedef void (PNGAPI *png_progressive_end_ptr) PNGARG((png_structp, png_infop));
-typedef void (PNGAPI *png_progressive_row_ptr) PNGARG((png_structp, png_bytep,
- png_uint_32, int));
-#endif
-
-#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
- defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \
- defined(PNG_LEGACY_SUPPORTED)
-typedef void (PNGAPI *png_user_transform_ptr) PNGARG((png_structp,
- png_row_infop, png_bytep));
-#endif
-
-#if defined(PNG_USER_CHUNKS_SUPPORTED)
-typedef int (PNGAPI *png_user_chunk_ptr) PNGARG((png_structp, png_unknown_chunkp));
-#endif
-#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
-typedef void (PNGAPI *png_unknown_chunk_ptr) PNGARG((png_structp));
-#endif
-
-/* Transform masks for the high-level interface */
-#define PNG_TRANSFORM_IDENTITY 0x0000 /* read and write */
-#define PNG_TRANSFORM_STRIP_16 0x0001 /* read only */
-#define PNG_TRANSFORM_STRIP_ALPHA 0x0002 /* read only */
-#define PNG_TRANSFORM_PACKING 0x0004 /* read and write */
-#define PNG_TRANSFORM_PACKSWAP 0x0008 /* read and write */
-#define PNG_TRANSFORM_EXPAND 0x0010 /* read only */
-#define PNG_TRANSFORM_INVERT_MONO 0x0020 /* read and write */
-#define PNG_TRANSFORM_SHIFT 0x0040 /* read and write */
-#define PNG_TRANSFORM_BGR 0x0080 /* read and write */
-#define PNG_TRANSFORM_SWAP_ALPHA 0x0100 /* read and write */
-#define PNG_TRANSFORM_SWAP_ENDIAN 0x0200 /* read and write */
-#define PNG_TRANSFORM_INVERT_ALPHA 0x0400 /* read and write */
-#define PNG_TRANSFORM_STRIP_FILLER 0x0800 /* WRITE only */
-
-/* Flags for MNG supported features */
-#define PNG_FLAG_MNG_EMPTY_PLTE 0x01
-#define PNG_FLAG_MNG_FILTER_64 0x04
-#define PNG_ALL_MNG_FEATURES 0x05
-
-typedef png_voidp (*png_malloc_ptr) PNGARG((png_structp, png_size_t));
-typedef void (*png_free_ptr) PNGARG((png_structp, png_voidp));
-
-/* The structure that holds the information to read and write PNG files.
- * The only people who need to care about what is inside of this are the
- * people who will be modifying the library for their own special needs.
- * It should NOT be accessed directly by an application, except to store
- * the jmp_buf.
- */
-
-struct png_struct_def
-{
-#ifdef PNG_SETJMP_SUPPORTED
- jmp_buf jmpbuf; /* used in png_error */
-#endif
- png_error_ptr error_fn; /* function for printing errors and aborting */
- png_error_ptr warning_fn; /* function for printing warnings */
- png_voidp error_ptr; /* user supplied struct for error functions */
- png_rw_ptr write_data_fn; /* function for writing output data */
- png_rw_ptr read_data_fn; /* function for reading input data */
- png_voidp io_ptr; /* ptr to application struct for I/O functions*/
-
-#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
- png_user_transform_ptr read_user_transform_fn; /* user read transform */
-#endif
-
-#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
- png_user_transform_ptr write_user_transform_fn; /* user write transform */
-#endif
-
-/* These were added in libpng-1.0.2 */
-#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
-#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
- defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
- png_voidp user_transform_ptr; /* user supplied struct for user transform */
- png_byte user_transform_depth; /* bit depth of user transformed pixels */
- png_byte user_transform_channels; /* channels in user transformed pixels */
-#endif
-#endif
-
- png_uint_32 mode; /* tells us where we are in the PNG file */
- png_uint_32 flags; /* flags indicating various things to libpng */
- png_uint_32 transformations; /* which transformations to perform */
-
- z_stream zstream; /* pointer to decompression structure (below) */
- png_bytep zbuf; /* buffer for zlib */
- png_size_t zbuf_size; /* size of zbuf */
- int zlib_level; /* holds zlib compression level */
- int zlib_method; /* holds zlib compression method */
- int zlib_window_bits; /* holds zlib compression window bits */
- int zlib_mem_level; /* holds zlib compression memory level */
- int zlib_strategy; /* holds zlib compression strategy */
-
- png_uint_32 width; /* width of image in pixels */
- png_uint_32 height; /* height of image in pixels */
- png_uint_32 num_rows; /* number of rows in current pass */
- png_uint_32 usr_width; /* width of row at start of write */
- png_uint_32 rowbytes; /* size of row in bytes */
- png_uint_32 irowbytes; /* size of current interlaced row in bytes */
- png_uint_32 iwidth; /* width of current interlaced row in pixels */
- png_uint_32 row_number; /* current row in interlace pass */
- png_bytep prev_row; /* buffer to save previous (unfiltered) row */
- png_bytep row_buf; /* buffer to save current (unfiltered) row */
- png_bytep sub_row; /* buffer to save "sub" row when filtering */
- png_bytep up_row; /* buffer to save "up" row when filtering */
- png_bytep avg_row; /* buffer to save "avg" row when filtering */
- png_bytep paeth_row; /* buffer to save "Paeth" row when filtering */
- png_row_info row_info; /* used for transformation routines */
-
- png_uint_32 idat_size; /* current IDAT size for read */
- png_uint_32 crc; /* current chunk CRC value */
- png_colorp palette; /* palette from the input file */
- png_uint_16 num_palette; /* number of color entries in palette */
- png_uint_16 num_trans; /* number of transparency values */
- png_byte chunk_name[5]; /* null-terminated name of current chunk */
- png_byte compression; /* file compression type (always 0) */
- png_byte filter; /* file filter type (always 0) */
- png_byte interlaced; /* PNG_INTERLACE_NONE, PNG_INTERLACE_ADAM7 */
- png_byte pass; /* current interlace pass (0 - 6) */
- png_byte do_filter; /* row filter flags (see PNG_FILTER_ below ) */
- png_byte color_type; /* color type of file */
- png_byte bit_depth; /* bit depth of file */
- png_byte usr_bit_depth; /* bit depth of users row */
- png_byte pixel_depth; /* number of bits per pixel */
- png_byte channels; /* number of channels in file */
- png_byte usr_channels; /* channels at start of write */
- png_byte sig_bytes; /* magic bytes read/written from start of file */
-
-#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
-#ifdef PNG_LEGACY_SUPPORTED
- png_byte filler; /* filler byte for pixel expansion */
-#else
- png_uint_16 filler; /* filler bytes for pixel expansion */
-#endif
-#endif
-
-#if defined(PNG_bKGD_SUPPORTED)
- png_byte background_gamma_type;
-# ifdef PNG_FLOATING_POINT_SUPPORTED
- float background_gamma;
-# endif
- png_color_16 background; /* background color in screen gamma space */
-#if defined(PNG_READ_GAMMA_SUPPORTED)
- png_color_16 background_1; /* background normalized to gamma 1.0 */
-#endif
-#endif /* PNG_bKGD_SUPPORTED */
-
-#if defined(PNG_WRITE_FLUSH_SUPPORTED)
- png_flush_ptr output_flush_fn;/* Function for flushing output */
- png_uint_32 flush_dist; /* how many rows apart to flush, 0 - no flush */
- png_uint_32 flush_rows; /* number of rows written since last flush */
-#endif
-
-#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
- int gamma_shift; /* number of "insignificant" bits 16-bit gamma */
-#ifdef PNG_FLOATING_POINT_SUPPORTED
- float gamma; /* file gamma value */
- float screen_gamma; /* screen gamma value (display_exponent) */
-#endif
-#endif
-
-#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
- png_bytep gamma_table; /* gamma table for 8-bit depth files */
- png_bytep gamma_from_1; /* converts from 1.0 to screen */
- png_bytep gamma_to_1; /* converts from file to 1.0 */
- png_uint_16pp gamma_16_table; /* gamma table for 16-bit depth files */
- png_uint_16pp gamma_16_from_1; /* converts from 1.0 to screen */
- png_uint_16pp gamma_16_to_1; /* converts from file to 1.0 */
-#endif
-
-#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_sBIT_SUPPORTED)
- png_color_8 sig_bit; /* significant bits in each available channel */
-#endif
-
-#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
- png_color_8 shift; /* shift for significant bit tranformation */
-#endif
-
-#if defined(PNG_tRNS_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED) \
- || defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
- png_bytep trans; /* transparency values for paletted files */
- png_color_16 trans_values; /* transparency values for non-paletted files */
-#endif
-
- png_read_status_ptr read_row_fn; /* called after each row is decoded */
- png_write_status_ptr write_row_fn; /* called after each row is encoded */
-#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
- png_progressive_info_ptr info_fn; /* called after header data fully read */
- png_progressive_row_ptr row_fn; /* called after each prog. row is decoded */
- png_progressive_end_ptr end_fn; /* called after image is complete */
- png_bytep save_buffer_ptr; /* current location in save_buffer */
- png_bytep save_buffer; /* buffer for previously read data */
- png_bytep current_buffer_ptr; /* current location in current_buffer */
- png_bytep current_buffer; /* buffer for recently used data */
- png_uint_32 push_length; /* size of current input chunk */
- png_uint_32 skip_length; /* bytes to skip in input data */
- png_size_t save_buffer_size; /* amount of data now in save_buffer */
- png_size_t save_buffer_max; /* total size of save_buffer */
- png_size_t buffer_size; /* total amount of available input data */
- png_size_t current_buffer_size; /* amount of data now in current_buffer */
- int process_mode; /* what push library is currently doing */
- int cur_palette; /* current push library palette index */
-
-# if defined(PNG_TEXT_SUPPORTED)
- png_size_t current_text_size; /* current size of text input data */
- png_size_t current_text_left; /* how much text left to read in input */
- png_charp current_text; /* current text chunk buffer */
- png_charp current_text_ptr; /* current location in current_text */
-# endif /* PNG_PROGRESSIVE_READ_SUPPORTED && PNG_TEXT_SUPPORTED */
-
-#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
-
-#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__)
-/* for the Borland special 64K segment handler */
- png_bytepp offset_table_ptr;
- png_bytep offset_table;
- png_uint_16 offset_table_number;
- png_uint_16 offset_table_count;
- png_uint_16 offset_table_count_free;
-#endif
-
-#if defined(PNG_READ_DITHER_SUPPORTED)
- png_bytep palette_lookup; /* lookup table for dithering */
- png_bytep dither_index; /* index translation for palette files */
-#endif
-
-#if defined(PNG_READ_DITHER_SUPPORTED) || defined(PNG_hIST_SUPPORTED)
- png_uint_16p hist; /* histogram */
-#endif
-
-#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
- png_byte heuristic_method; /* heuristic for row filter selection */
- png_byte num_prev_filters; /* number of weights for previous rows */
- png_bytep prev_filters; /* filter type(s) of previous row(s) */
- png_uint_16p filter_weights; /* weight(s) for previous line(s) */
- png_uint_16p inv_filter_weights; /* 1/weight(s) for previous line(s) */
- png_uint_16p filter_costs; /* relative filter calculation cost */
- png_uint_16p inv_filter_costs; /* 1/relative filter calculation cost */
-#endif
-
-#if defined(PNG_TIME_RFC1123_SUPPORTED)
- png_charp time_buffer; /* String to hold RFC 1123 time text */
-#endif
-
-/* New members added in libpng-1.0.6 */
-
-#ifdef PNG_FREE_ME_SUPPORTED
- png_uint_32 free_me; /* flags items libpng is responsible for freeing */
-#endif
-
-#if defined(PNG_USER_CHUNKS_SUPPORTED)
- png_voidp user_chunk_ptr;
- png_user_chunk_ptr read_user_chunk_fn; /* user read chunk handler */
-#endif
-
-#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
- int num_chunk_list;
- png_bytep chunk_list;
-#endif
-
-/* New members added in libpng-1.0.3 */
-#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
- png_byte rgb_to_gray_status;
- /* These were changed from png_byte in libpng-1.0.6 */
- png_uint_16 rgb_to_gray_red_coeff;
- png_uint_16 rgb_to_gray_green_coeff;
- png_uint_16 rgb_to_gray_blue_coeff;
-#endif
-
-/* New member added in libpng-1.0.4 (renamed in 1.0.9) */
-#if defined(PNG_MNG_FEATURES_SUPPORTED) || \
- defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \
- defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED)
-/* changed from png_byte to png_uint_32 at version 1.2.0 */
- png_uint_32 mng_features_permitted;
-#endif
-
-/* New member added in libpng-1.0.7 */
-#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
- png_fixed_point int_gamma;
-#endif
-
-/* New member added in libpng-1.0.9, ifdef'ed out in 1.0.12, enabled in 1.2.0 */
-#if defined(PNG_MNG_FEATURES_SUPPORTED)
- png_byte filter_type;
-#endif
-
-#if defined(PNG_DEBUG) && defined(PNG_USE_PNGGCCRD)
-/* New member added in libpng-1.0.10, ifdef'ed out in 1.2.0 */
- png_uint_32 row_buf_size;
-#endif
-
-/* New members added in libpng-1.2.0 */
-#if defined(PNG_ASSEMBLER_CODE_SUPPORTED)
- png_byte mmx_bitdepth_threshold;
- png_uint_32 mmx_rowbytes_threshold;
- png_uint_32 asm_flags;
-#endif
-
-/* New members added in libpng-1.0.2 but first enabled by default in 1.2.0 */
-#ifdef PNG_USER_MEM_SUPPORTED
- png_voidp mem_ptr; /* user supplied struct for mem functions */
- png_malloc_ptr malloc_fn; /* function for allocating memory */
- png_free_ptr free_fn; /* function for freeing memory */
-#endif
-
- png_bytep big_row_buf; /* buffer to save current (unfiltered) row */
-
-};
-
-
-/* This prevents a compiler error in png_get_copyright() in png.c if png.c
- and png.h are both at version 1.2.1
- */
-typedef png_structp version_1_2_1;
-
-typedef png_struct FAR * FAR * png_structpp;
-
-/* Here are the function definitions most commonly used. This is not
- * the place to find out how to use libpng. See libpng.txt for the
- * full explanation, see example.c for the summary. This just provides
- * a simple one line description of the use of each function.
- */
-
-/* Returns the version number of the library */
-extern PNG_EXPORT(png_uint_32,png_access_version_number) PNGARG((void));
-
-/* Tell lib we have already handled the first <num_bytes> magic bytes.
- * Handling more than 8 bytes from the beginning of the file is an error.
- */
-extern PNG_EXPORT(void,png_set_sig_bytes) PNGARG((png_structp png_ptr,
- int num_bytes));
-
-/* Check sig[start] through sig[start + num_to_check - 1] to see if it's a
- * PNG file. Returns zero if the supplied bytes match the 8-byte PNG
- * signature, and non-zero otherwise. Having num_to_check == 0 or
- * start > 7 will always fail (ie return non-zero).
- */
-extern PNG_EXPORT(int,png_sig_cmp) PNGARG((png_bytep sig, png_size_t start,
- png_size_t num_to_check));
-
-/* Simple signature checking function. This is the same as calling
- * png_check_sig(sig, n) := !png_sig_cmp(sig, 0, n).
- */
-extern PNG_EXPORT(int,png_check_sig) PNGARG((png_bytep sig, int num));
-
-/* Allocate and initialize png_ptr struct for reading, and any other memory. */
-extern PNG_EXPORT(png_structp,png_create_read_struct)
- PNGARG((png_const_charp user_png_ver, png_voidp error_ptr,
- png_error_ptr error_fn, png_error_ptr warn_fn));
-
-/* Allocate and initialize png_ptr struct for writing, and any other memory */
-extern PNG_EXPORT(png_structp,png_create_write_struct)
- PNGARG((png_const_charp user_png_ver, png_voidp error_ptr,
- png_error_ptr error_fn, png_error_ptr warn_fn));
-
-extern PNG_EXPORT(png_uint_32,png_get_compression_buffer_size)
- PNGARG((png_structp png_ptr));
-
-extern PNG_EXPORT(void,png_set_compression_buffer_size)
- PNGARG((png_structp png_ptr, png_uint_32 size));
-
-/* Reset the compression stream */
-extern PNG_EXPORT(int,png_reset_zstream) PNGARG((png_structp png_ptr));
-
-/* New functions added in libpng-1.0.2 (not enabled by default until 1.2.0) */
-#ifdef PNG_USER_MEM_SUPPORTED
-extern PNG_EXPORT(png_structp,png_create_read_struct_2)
- PNGARG((png_const_charp user_png_ver, png_voidp error_ptr,
- png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr,
- png_malloc_ptr malloc_fn, png_free_ptr free_fn));
-extern PNG_EXPORT(png_structp,png_create_write_struct_2)
- PNGARG((png_const_charp user_png_ver, png_voidp error_ptr,
- png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr,
- png_malloc_ptr malloc_fn, png_free_ptr free_fn));
-#endif
-
-/* Write a PNG chunk - size, type, (optional) data, CRC. */
-extern PNG_EXPORT(void,png_write_chunk) PNGARG((png_structp png_ptr,
- png_bytep chunk_name, png_bytep data, png_size_t length));
-
-/* Write the start of a PNG chunk - length and chunk name. */
-extern PNG_EXPORT(void,png_write_chunk_start) PNGARG((png_structp png_ptr,
- png_bytep chunk_name, png_uint_32 length));
-
-/* Write the data of a PNG chunk started with png_write_chunk_start(). */
-extern PNG_EXPORT(void,png_write_chunk_data) PNGARG((png_structp png_ptr,
- png_bytep data, png_size_t length));
-
-/* Finish a chunk started with png_write_chunk_start() (includes CRC). */
-extern PNG_EXPORT(void,png_write_chunk_end) PNGARG((png_structp png_ptr));
-
-/* Allocate and initialize the info structure */
-extern PNG_EXPORT(png_infop,png_create_info_struct)
- PNGARG((png_structp png_ptr));
-
-/* Initialize the info structure (old interface - DEPRECATED) */
-extern PNG_EXPORT(void,png_info_init) PNGARG((png_infop info_ptr));
-#define png_info_init(info_ptr) png_info_init_3(&info_ptr, sizeof(png_info));
-extern PNG_EXPORT(void,png_info_init_3) PNGARG((png_infopp info_ptr,
- png_size_t png_info_struct_size));
-
-/* Writes all the PNG information before the image. */
-extern PNG_EXPORT(void,png_write_info_before_PLTE) PNGARG((png_structp png_ptr,
- png_infop info_ptr));
-extern PNG_EXPORT(void,png_write_info) PNGARG((png_structp png_ptr,
- png_infop info_ptr));
-
-/* read the information before the actual image data. */
-extern PNG_EXPORT(void,png_read_info) PNGARG((png_structp png_ptr,
- png_infop info_ptr));
-
-#if defined(PNG_TIME_RFC1123_SUPPORTED)
-extern PNG_EXPORT(png_charp,png_convert_to_rfc1123)
- PNGARG((png_structp png_ptr, png_timep ptime));
-#endif
-
-#if !defined(_WIN32_WCE)
-/* "time.h" functions are not supported on WindowsCE */
-#if defined(PNG_WRITE_tIME_SUPPORTED)
-/* convert from a struct tm to png_time */
-extern PNG_EXPORT(void,png_convert_from_struct_tm) PNGARG((png_timep ptime,
- struct tm FAR * ttime));
-
-/* convert from time_t to png_time. Uses gmtime() */
-extern PNG_EXPORT(void,png_convert_from_time_t) PNGARG((png_timep ptime,
- time_t ttime));
-#endif /* PNG_WRITE_tIME_SUPPORTED */
-#endif /* _WIN32_WCE */
-
-#if defined(PNG_READ_EXPAND_SUPPORTED)
-/* Expand data to 24-bit RGB, or 8-bit grayscale, with alpha if available. */
-extern PNG_EXPORT(void,png_set_expand) PNGARG((png_structp png_ptr));
-extern PNG_EXPORT(void,png_set_gray_1_2_4_to_8) PNGARG((png_structp png_ptr));
-extern PNG_EXPORT(void,png_set_palette_to_rgb) PNGARG((png_structp png_ptr));
-extern PNG_EXPORT(void,png_set_tRNS_to_alpha) PNGARG((png_structp png_ptr));
-#endif
-
-#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
-/* Use blue, green, red order for pixels. */
-extern PNG_EXPORT(void,png_set_bgr) PNGARG((png_structp png_ptr));
-#endif
-
-#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)
-/* Expand the grayscale to 24-bit RGB if necessary. */
-extern PNG_EXPORT(void,png_set_gray_to_rgb) PNGARG((png_structp png_ptr));
-#endif
-
-#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
-/* Reduce RGB to grayscale. */
-#ifdef PNG_FLOATING_POINT_SUPPORTED
-extern PNG_EXPORT(void,png_set_rgb_to_gray) PNGARG((png_structp png_ptr,
- int error_action, double red, double green ));
-#endif
-extern PNG_EXPORT(void,png_set_rgb_to_gray_fixed) PNGARG((png_structp png_ptr,
- int error_action, png_fixed_point red, png_fixed_point green ));
-extern PNG_EXPORT(png_byte,png_get_rgb_to_gray_status) PNGARG((png_structp
- png_ptr));
-#endif
-
-extern PNG_EXPORT(void,png_build_grayscale_palette) PNGARG((int bit_depth,
- png_colorp palette));
-
-#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
-extern PNG_EXPORT(void,png_set_strip_alpha) PNGARG((png_structp png_ptr));
-#endif
-
-#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \
- defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
-extern PNG_EXPORT(void,png_set_swap_alpha) PNGARG((png_structp png_ptr));
-#endif
-
-#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \
- defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
-extern PNG_EXPORT(void,png_set_invert_alpha) PNGARG((png_structp png_ptr));
-#endif
-
-#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
-/* Add a filler byte to 24-bit RGB images. */
-extern PNG_EXPORT(void,png_set_filler) PNGARG((png_structp png_ptr,
- png_uint_32 filler, int flags));
-/* The values of the PNG_FILLER_ defines should NOT be changed */
-#define PNG_FILLER_BEFORE 0
-#define PNG_FILLER_AFTER 1
-#endif /* PNG_READ_FILLER_SUPPORTED || PNG_WRITE_FILLER_SUPPORTED */
-
-#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
-/* Swap bytes in 16-bit depth files. */
-extern PNG_EXPORT(void,png_set_swap) PNGARG((png_structp png_ptr));
-#endif
-
-#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
-/* Use 1 byte per pixel in 1, 2, or 4-bit depth files. */
-extern PNG_EXPORT(void,png_set_packing) PNGARG((png_structp png_ptr));
-#endif
-
-#if defined(PNG_READ_PACKSWAP_SUPPORTED) || defined(PNG_WRITE_PACKSWAP_SUPPORTED)
-/* Swap packing order of pixels in bytes. */
-extern PNG_EXPORT(void,png_set_packswap) PNGARG((png_structp png_ptr));
-#endif
-
-#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
-/* Converts files to legal bit depths. */
-extern PNG_EXPORT(void,png_set_shift) PNGARG((png_structp png_ptr,
- png_color_8p true_bits));
-#endif
-
-#if defined(PNG_READ_INTERLACING_SUPPORTED) || \
- defined(PNG_WRITE_INTERLACING_SUPPORTED)
-/* Have the code handle the interlacing. Returns the number of passes. */
-extern PNG_EXPORT(int,png_set_interlace_handling) PNGARG((png_structp png_ptr));
-#endif
-
-#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
-/* Invert monochrome files */
-extern PNG_EXPORT(void,png_set_invert_mono) PNGARG((png_structp png_ptr));
-#endif
-
-#if defined(PNG_READ_BACKGROUND_SUPPORTED)
-/* Handle alpha and tRNS by replacing with a background color. */
-#ifdef PNG_FLOATING_POINT_SUPPORTED
-extern PNG_EXPORT(void,png_set_background) PNGARG((png_structp png_ptr,
- png_color_16p background_color, int background_gamma_code,
- int need_expand, double background_gamma));
-#endif
-#define PNG_BACKGROUND_GAMMA_UNKNOWN 0
-#define PNG_BACKGROUND_GAMMA_SCREEN 1
-#define PNG_BACKGROUND_GAMMA_FILE 2
-#define PNG_BACKGROUND_GAMMA_UNIQUE 3
-#endif
-
-#if defined(PNG_READ_16_TO_8_SUPPORTED)
-/* strip the second byte of information from a 16-bit depth file. */
-extern PNG_EXPORT(void,png_set_strip_16) PNGARG((png_structp png_ptr));
-#endif
-
-#if defined(PNG_READ_DITHER_SUPPORTED)
-/* Turn on dithering, and reduce the palette to the number of colors available. */
-extern PNG_EXPORT(void,png_set_dither) PNGARG((png_structp png_ptr,
- png_colorp palette, int num_palette, int maximum_colors,
- png_uint_16p histogram, int full_dither));
-#endif
-
-#if defined(PNG_READ_GAMMA_SUPPORTED)
-/* Handle gamma correction. Screen_gamma=(display_exponent) */
-#ifdef PNG_FLOATING_POINT_SUPPORTED
-extern PNG_EXPORT(void,png_set_gamma) PNGARG((png_structp png_ptr,
- double screen_gamma, double default_file_gamma));
-#endif
-#endif
-
-#if defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \
- defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED)
-/* Permit or disallow empty PLTE (0: not permitted, 1: permitted) */
-/* Deprecated and will be removed. Use png_permit_mng_features() instead. */
-extern PNG_EXPORT(void,png_permit_empty_plte) PNGARG((png_structp png_ptr,
- int empty_plte_permitted));
-#endif
-
-#if defined(PNG_WRITE_FLUSH_SUPPORTED)
-/* Set how many lines between output flushes - 0 for no flushing */
-extern PNG_EXPORT(void,png_set_flush) PNGARG((png_structp png_ptr, int nrows));
-/* Flush the current PNG output buffer */
-extern PNG_EXPORT(void,png_write_flush) PNGARG((png_structp png_ptr));
-#endif
-
-/* optional update palette with requested transformations */
-extern PNG_EXPORT(void,png_start_read_image) PNGARG((png_structp png_ptr));
-
-/* optional call to update the users info structure */
-extern PNG_EXPORT(void,png_read_update_info) PNGARG((png_structp png_ptr,
- png_infop info_ptr));
-
-/* read a one or more rows of image data.*/
-extern PNG_EXPORT(void,png_read_rows) PNGARG((png_structp png_ptr,
- png_bytepp row, png_bytepp display_row, png_uint_32 num_rows));
-
-/* read a row of data.*/
-extern PNG_EXPORT(void,png_read_row) PNGARG((png_structp png_ptr,
- png_bytep row,
- png_bytep display_row));
-
-/* read the whole image into memory at once. */
-extern PNG_EXPORT(void,png_read_image) PNGARG((png_structp png_ptr,
- png_bytepp image));
-
-/* write a row of image data */
-extern PNG_EXPORT(void,png_write_row) PNGARG((png_structp png_ptr,
- png_bytep row));
-
-/* write a few rows of image data */
-extern PNG_EXPORT(void,png_write_rows) PNGARG((png_structp png_ptr,
- png_bytepp row, png_uint_32 num_rows));
-
-/* write the image data */
-extern PNG_EXPORT(void,png_write_image) PNGARG((png_structp png_ptr,
- png_bytepp image));
-
-/* writes the end of the PNG file. */
-extern PNG_EXPORT(void,png_write_end) PNGARG((png_structp png_ptr,
- png_infop info_ptr));
-
-/* read the end of the PNG file. */
-extern PNG_EXPORT(void,png_read_end) PNGARG((png_structp png_ptr,
- png_infop info_ptr));
-
-/* free any memory associated with the png_info_struct */
-extern PNG_EXPORT(void,png_destroy_info_struct) PNGARG((png_structp png_ptr,
- png_infopp info_ptr_ptr));
-
-/* free any memory associated with the png_struct and the png_info_structs */
-extern PNG_EXPORT(void,png_destroy_read_struct) PNGARG((png_structpp
- png_ptr_ptr, png_infopp info_ptr_ptr, png_infopp end_info_ptr_ptr));
-
-/* free all memory used by the read (old method - NOT DLL EXPORTED) */
-extern void png_read_destroy PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_infop end_info_ptr));
-
-/* free any memory associated with the png_struct and the png_info_structs */
-extern PNG_EXPORT(void,png_destroy_write_struct)
- PNGARG((png_structpp png_ptr_ptr, png_infopp info_ptr_ptr));
-
-/* free any memory used in info_ptr struct (old method - NOT DLL EXPORTED) */
-extern void png_write_destroy_info PNGARG((png_infop info_ptr));
-
-/* free any memory used in png_ptr struct (old method - NOT DLL EXPORTED) */
-extern void png_write_destroy PNGARG((png_structp png_ptr));
-
-/* set the libpng method of handling chunk CRC errors */
-extern PNG_EXPORT(void,png_set_crc_action) PNGARG((png_structp png_ptr,
- int crit_action, int ancil_action));
-
-/* Values for png_set_crc_action() to say how to handle CRC errors in
- * ancillary and critical chunks, and whether to use the data contained
- * therein. Note that it is impossible to "discard" data in a critical
- * chunk. For versions prior to 0.90, the action was always error/quit,
- * whereas in version 0.90 and later, the action for CRC errors in ancillary
- * chunks is warn/discard. These values should NOT be changed.
- *
- * value action:critical action:ancillary
- */
-#define PNG_CRC_DEFAULT 0 /* error/quit warn/discard data */
-#define PNG_CRC_ERROR_QUIT 1 /* error/quit error/quit */
-#define PNG_CRC_WARN_DISCARD 2 /* (INVALID) warn/discard data */
-#define PNG_CRC_WARN_USE 3 /* warn/use data warn/use data */
-#define PNG_CRC_QUIET_USE 4 /* quiet/use data quiet/use data */
-#define PNG_CRC_NO_CHANGE 5 /* use current value use current value */
-
-/* These functions give the user control over the scan-line filtering in
- * libpng and the compression methods used by zlib. These functions are
- * mainly useful for testing, as the defaults should work with most users.
- * Those users who are tight on memory or want faster performance at the
- * expense of compression can modify them. See the compression library
- * header file (zlib.h) for an explination of the compression functions.
- */
-
-/* set the filtering method(s) used by libpng. Currently, the only valid
- * value for "method" is 0.
- */
-extern PNG_EXPORT(void,png_set_filter) PNGARG((png_structp png_ptr, int method,
- int filters));
-
-/* Flags for png_set_filter() to say which filters to use. The flags
- * are chosen so that they don't conflict with real filter types
- * below, in case they are supplied instead of the #defined constants.
- * These values should NOT be changed.
- */
-#define PNG_NO_FILTERS 0x00
-#define PNG_FILTER_NONE 0x08
-#define PNG_FILTER_SUB 0x10
-#define PNG_FILTER_UP 0x20
-#define PNG_FILTER_AVG 0x40
-#define PNG_FILTER_PAETH 0x80
-#define PNG_ALL_FILTERS (PNG_FILTER_NONE | PNG_FILTER_SUB | PNG_FILTER_UP | \
- PNG_FILTER_AVG | PNG_FILTER_PAETH)
-
-/* Filter values (not flags) - used in pngwrite.c, pngwutil.c for now.
- * These defines should NOT be changed.
- */
-#define PNG_FILTER_VALUE_NONE 0
-#define PNG_FILTER_VALUE_SUB 1
-#define PNG_FILTER_VALUE_UP 2
-#define PNG_FILTER_VALUE_AVG 3
-#define PNG_FILTER_VALUE_PAETH 4
-#define PNG_FILTER_VALUE_LAST 5
-
-#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) /* EXPERIMENTAL */
-/* The "heuristic_method" is given by one of the PNG_FILTER_HEURISTIC_
- * defines, either the default (minimum-sum-of-absolute-differences), or
- * the experimental method (weighted-minimum-sum-of-absolute-differences).
- *
- * Weights are factors >= 1.0, indicating how important it is to keep the
- * filter type consistent between rows. Larger numbers mean the current
- * filter is that many times as likely to be the same as the "num_weights"
- * previous filters. This is cumulative for each previous row with a weight.
- * There needs to be "num_weights" values in "filter_weights", or it can be
- * NULL if the weights aren't being specified. Weights have no influence on
- * the selection of the first row filter. Well chosen weights can (in theory)
- * improve the compression for a given image.
- *
- * Costs are factors >= 1.0 indicating the relative decoding costs of a
- * filter type. Higher costs indicate more decoding expense, and are
- * therefore less likely to be selected over a filter with lower computational
- * costs. There needs to be a value in "filter_costs" for each valid filter
- * type (given by PNG_FILTER_VALUE_LAST), or it can be NULL if you aren't
- * setting the costs. Costs try to improve the speed of decompression without
- * unduly increasing the compressed image size.
- *
- * A negative weight or cost indicates the default value is to be used, and
- * values in the range [0.0, 1.0) indicate the value is to remain unchanged.
- * The default values for both weights and costs are currently 1.0, but may
- * change if good general weighting/cost heuristics can be found. If both
- * the weights and costs are set to 1.0, this degenerates the WEIGHTED method
- * to the UNWEIGHTED method, but with added encoding time/computation.
- */
-#ifdef PNG_FLOATING_POINT_SUPPORTED
-extern PNG_EXPORT(void,png_set_filter_heuristics) PNGARG((png_structp png_ptr,
- int heuristic_method, int num_weights, png_doublep filter_weights,
- png_doublep filter_costs));
-#endif
-#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */
-
-/* Heuristic used for row filter selection. These defines should NOT be
- * changed.
- */
-#define PNG_FILTER_HEURISTIC_DEFAULT 0 /* Currently "UNWEIGHTED" */
-#define PNG_FILTER_HEURISTIC_UNWEIGHTED 1 /* Used by libpng < 0.95 */
-#define PNG_FILTER_HEURISTIC_WEIGHTED 2 /* Experimental feature */
-#define PNG_FILTER_HEURISTIC_LAST 3 /* Not a valid value */
-
-/* Set the library compression level. Currently, valid values range from
- * 0 - 9, corresponding directly to the zlib compression levels 0 - 9
- * (0 - no compression, 9 - "maximal" compression). Note that tests have
- * shown that zlib compression levels 3-6 usually perform as well as level 9
- * for PNG images, and do considerably fewer caclulations. In the future,
- * these values may not correspond directly to the zlib compression levels.
- */
-extern PNG_EXPORT(void,png_set_compression_level) PNGARG((png_structp png_ptr,
- int level));
-
-extern PNG_EXPORT(void,png_set_compression_mem_level)
- PNGARG((png_structp png_ptr, int mem_level));
-
-extern PNG_EXPORT(void,png_set_compression_strategy)
- PNGARG((png_structp png_ptr, int strategy));
-
-extern PNG_EXPORT(void,png_set_compression_window_bits)
- PNGARG((png_structp png_ptr, int window_bits));
-
-extern PNG_EXPORT(void,png_set_compression_method) PNGARG((png_structp png_ptr,
- int method));
-
-/* These next functions are called for input/output, memory, and error
- * handling. They are in the file pngrio.c, pngwio.c, and pngerror.c,
- * and call standard C I/O routines such as fread(), fwrite(), and
- * fprintf(). These functions can be made to use other I/O routines
- * at run time for those applications that need to handle I/O in a
- * different manner by calling png_set_???_fn(). See libpng.txt for
- * more information.
- */
-
-#if !defined(PNG_NO_STDIO)
-/* Initialize the input/output for the PNG file to the default functions. */
-extern PNG_EXPORT(void,png_init_io) PNGARG((png_structp png_ptr, png_FILE_p fp));
-#endif
-
-/* Replace the (error and abort), and warning functions with user
- * supplied functions. If no messages are to be printed you must still
- * write and use replacement functions. The replacement error_fn should
- * still do a longjmp to the last setjmp location if you are using this
- * method of error handling. If error_fn or warning_fn is NULL, the
- * default function will be used.
- */
-
-extern PNG_EXPORT(void,png_set_error_fn) PNGARG((png_structp png_ptr,
- png_voidp error_ptr, png_error_ptr error_fn, png_error_ptr warning_fn));
-
-/* Return the user pointer associated with the error functions */
-extern PNG_EXPORT(png_voidp,png_get_error_ptr) PNGARG((png_structp png_ptr));
-
-/* Replace the default data output functions with a user supplied one(s).
- * If buffered output is not used, then output_flush_fn can be set to NULL.
- * If PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile time
- * output_flush_fn will be ignored (and thus can be NULL).
- */
-extern PNG_EXPORT(void,png_set_write_fn) PNGARG((png_structp png_ptr,
- png_voidp io_ptr, png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn));
-
-/* Replace the default data input function with a user supplied one. */
-extern PNG_EXPORT(void,png_set_read_fn) PNGARG((png_structp png_ptr,
- png_voidp io_ptr, png_rw_ptr read_data_fn));
-
-/* Return the user pointer associated with the I/O functions */
-extern PNG_EXPORT(png_voidp,png_get_io_ptr) PNGARG((png_structp png_ptr));
-
-extern PNG_EXPORT(void,png_set_read_status_fn) PNGARG((png_structp png_ptr,
- png_read_status_ptr read_row_fn));
-
-extern PNG_EXPORT(void,png_set_write_status_fn) PNGARG((png_structp png_ptr,
- png_write_status_ptr write_row_fn));
-
-#ifdef PNG_USER_MEM_SUPPORTED
-/* Replace the default memory allocation functions with user supplied one(s). */
-extern PNG_EXPORT(void,png_set_mem_fn) PNGARG((png_structp png_ptr,
- png_voidp mem_ptr, png_malloc_ptr malloc_fn, png_free_ptr free_fn));
-/* Return the user pointer associated with the memory functions */
-extern PNG_EXPORT(png_voidp,png_get_mem_ptr) PNGARG((png_structp png_ptr));
-#endif
-
-#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
- defined(PNG_LEGACY_SUPPORTED)
-extern PNG_EXPORT(void,png_set_read_user_transform_fn) PNGARG((png_structp
- png_ptr, png_user_transform_ptr read_user_transform_fn));
-#endif
-
-#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \
- defined(PNG_LEGACY_SUPPORTED)
-extern PNG_EXPORT(void,png_set_write_user_transform_fn) PNGARG((png_structp
- png_ptr, png_user_transform_ptr write_user_transform_fn));
-#endif
-
-#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
- defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \
- defined(PNG_LEGACY_SUPPORTED)
-extern PNG_EXPORT(void,png_set_user_transform_info) PNGARG((png_structp
- png_ptr, png_voidp user_transform_ptr, int user_transform_depth,
- int user_transform_channels));
-/* Return the user pointer associated with the user transform functions */
-extern PNG_EXPORT(png_voidp,png_get_user_transform_ptr)
- PNGARG((png_structp png_ptr));
-#endif
-
-#ifdef PNG_USER_CHUNKS_SUPPORTED
-extern PNG_EXPORT(void,png_set_read_user_chunk_fn) PNGARG((png_structp png_ptr,
- png_voidp user_chunk_ptr, png_user_chunk_ptr read_user_chunk_fn));
-extern PNG_EXPORT(png_voidp,png_get_user_chunk_ptr) PNGARG((png_structp
- png_ptr));
-#endif
-
-#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
-/* Sets the function callbacks for the push reader, and a pointer to a
- * user-defined structure available to the callback functions.
- */
-extern PNG_EXPORT(void,png_set_progressive_read_fn) PNGARG((png_structp png_ptr,
- png_voidp progressive_ptr,
- png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn,
- png_progressive_end_ptr end_fn));
-
-/* returns the user pointer associated with the push read functions */
-extern PNG_EXPORT(png_voidp,png_get_progressive_ptr)
- PNGARG((png_structp png_ptr));
-
-/* function to be called when data becomes available */
-extern PNG_EXPORT(void,png_process_data) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_bytep buffer, png_size_t buffer_size));
-
-/* function that combines rows. Not very much different than the
- * png_combine_row() call. Is this even used?????
- */
-extern PNG_EXPORT(void,png_progressive_combine_row) PNGARG((png_structp png_ptr,
- png_bytep old_row, png_bytep new_row));
-#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
-
-extern PNG_EXPORT(png_voidp,png_malloc) PNGARG((png_structp png_ptr,
- png_uint_32 size));
-
-/* frees a pointer allocated by png_malloc() */
-extern PNG_EXPORT(void,png_free) PNGARG((png_structp png_ptr, png_voidp ptr));
-
-/* Free data that was allocated internally */
-extern PNG_EXPORT(void,png_free_data) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_uint_32 free_me, int num));
-#ifdef PNG_FREE_ME_SUPPORTED
-/* Reassign responsibility for freeing existing data, whether allocated
- * by libpng or by the application */
-extern PNG_EXPORT(void,png_data_freer) PNGARG((png_structp png_ptr,
- png_infop info_ptr, int freer, png_uint_32 mask));
-#endif
-/* assignments for png_data_freer */
-#define PNG_DESTROY_WILL_FREE_DATA 1
-#define PNG_SET_WILL_FREE_DATA 1
-#define PNG_USER_WILL_FREE_DATA 2
-/* Flags for png_ptr->free_me and info_ptr->free_me */
-#define PNG_FREE_HIST 0x0008
-#define PNG_FREE_ICCP 0x0010
-#define PNG_FREE_SPLT 0x0020
-#define PNG_FREE_ROWS 0x0040
-#define PNG_FREE_PCAL 0x0080
-#define PNG_FREE_SCAL 0x0100
-#define PNG_FREE_UNKN 0x0200
-#define PNG_FREE_LIST 0x0400
-#define PNG_FREE_PLTE 0x1000
-#define PNG_FREE_TRNS 0x2000
-#define PNG_FREE_TEXT 0x4000
-#define PNG_FREE_ALL 0x7fff
-#define PNG_FREE_MUL 0x4220 /* PNG_FREE_SPLT|PNG_FREE_TEXT|PNG_FREE_UNKN */
-
-#ifdef PNG_USER_MEM_SUPPORTED
-extern PNG_EXPORT(png_voidp,png_malloc_default) PNGARG((png_structp png_ptr,
- png_uint_32 size));
-extern PNG_EXPORT(void,png_free_default) PNGARG((png_structp png_ptr,
- png_voidp ptr));
-#endif
-
-extern PNG_EXPORT(png_voidp,png_memcpy_check) PNGARG((png_structp png_ptr,
- png_voidp s1, png_voidp s2, png_uint_32 size));
-
-extern PNG_EXPORT(png_voidp,png_memset_check) PNGARG((png_structp png_ptr,
- png_voidp s1, int value, png_uint_32 size));
-
-#if defined(USE_FAR_KEYWORD) /* memory model conversion function */
-extern void *png_far_to_near PNGARG((png_structp png_ptr,png_voidp ptr,
- int check));
-#endif /* USE_FAR_KEYWORD */
-
-/* Fatal error in PNG image of libpng - can't continue */
-extern PNG_EXPORT(void,png_error) PNGARG((png_structp png_ptr,
- png_const_charp error));
-
-/* The same, but the chunk name is prepended to the error string. */
-extern PNG_EXPORT(void,png_chunk_error) PNGARG((png_structp png_ptr,
- png_const_charp error));
-
-/* Non-fatal error in libpng. Can continue, but may have a problem. */
-extern PNG_EXPORT(void,png_warning) PNGARG((png_structp png_ptr,
- png_const_charp message));
-
-/* Non-fatal error in libpng, chunk name is prepended to message. */
-extern PNG_EXPORT(void,png_chunk_warning) PNGARG((png_structp png_ptr,
- png_const_charp message));
-
-/* The png_set_<chunk> functions are for storing values in the png_info_struct.
- * Similarly, the png_get_<chunk> calls are used to read values from the
- * png_info_struct, either storing the parameters in the passed variables, or
- * setting pointers into the png_info_struct where the data is stored. The
- * png_get_<chunk> functions return a non-zero value if the data was available
- * in info_ptr, or return zero and do not change any of the parameters if the
- * data was not available.
- *
- * These functions should be used instead of directly accessing png_info
- * to avoid problems with future changes in the size and internal layout of
- * png_info_struct.
- */
-/* Returns "flag" if chunk data is valid in info_ptr. */
-extern PNG_EXPORT(png_uint_32,png_get_valid) PNGARG((png_structp png_ptr,
-png_infop info_ptr, png_uint_32 flag));
-
-/* Returns number of bytes needed to hold a transformed row. */
-extern PNG_EXPORT(png_uint_32,png_get_rowbytes) PNGARG((png_structp png_ptr,
-png_infop info_ptr));
-
-#if defined(PNG_INFO_IMAGE_SUPPORTED)
-/* Returns row_pointers, which is an array of pointers to scanlines that was
-returned from png_read_png(). */
-extern PNG_EXPORT(png_bytepp,png_get_rows) PNGARG((png_structp png_ptr,
-png_infop info_ptr));
-/* Set row_pointers, which is an array of pointers to scanlines for use
-by png_write_png(). */
-extern PNG_EXPORT(void,png_set_rows) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_bytepp row_pointers));
-#endif
-
-/* Returns number of color channels in image. */
-extern PNG_EXPORT(png_byte,png_get_channels) PNGARG((png_structp png_ptr,
-png_infop info_ptr));
-
-#ifdef PNG_EASY_ACCESS_SUPPORTED
-/* Returns image width in pixels. */
-extern PNG_EXPORT(png_uint_32, png_get_image_width) PNGARG((png_structp
-png_ptr, png_infop info_ptr));
-
-/* Returns image height in pixels. */
-extern PNG_EXPORT(png_uint_32, png_get_image_height) PNGARG((png_structp
-png_ptr, png_infop info_ptr));
-
-/* Returns image bit_depth. */
-extern PNG_EXPORT(png_byte, png_get_bit_depth) PNGARG((png_structp
-png_ptr, png_infop info_ptr));
-
-/* Returns image color_type. */
-extern PNG_EXPORT(png_byte, png_get_color_type) PNGARG((png_structp
-png_ptr, png_infop info_ptr));
-
-/* Returns image filter_type. */
-extern PNG_EXPORT(png_byte, png_get_filter_type) PNGARG((png_structp
-png_ptr, png_infop info_ptr));
-
-/* Returns image interlace_type. */
-extern PNG_EXPORT(png_byte, png_get_interlace_type) PNGARG((png_structp
-png_ptr, png_infop info_ptr));
-
-/* Returns image compression_type. */
-extern PNG_EXPORT(png_byte, png_get_compression_type) PNGARG((png_structp
-png_ptr, png_infop info_ptr));
-
-/* Returns image resolution in pixels per meter, from pHYs chunk data. */
-extern PNG_EXPORT(png_uint_32, png_get_pixels_per_meter) PNGARG((png_structp
-png_ptr, png_infop info_ptr));
-extern PNG_EXPORT(png_uint_32, png_get_x_pixels_per_meter) PNGARG((png_structp
-png_ptr, png_infop info_ptr));
-extern PNG_EXPORT(png_uint_32, png_get_y_pixels_per_meter) PNGARG((png_structp
-png_ptr, png_infop info_ptr));
-
-/* Returns pixel aspect ratio, computed from pHYs chunk data. */
-#ifdef PNG_FLOATING_POINT_SUPPORTED
-extern PNG_EXPORT(float, png_get_pixel_aspect_ratio) PNGARG((png_structp
-png_ptr, png_infop info_ptr));
-#endif
-
-/* Returns image x, y offset in pixels or microns, from oFFs chunk data. */
-extern PNG_EXPORT(png_int_32, png_get_x_offset_pixels) PNGARG((png_structp
-png_ptr, png_infop info_ptr));
-extern PNG_EXPORT(png_int_32, png_get_y_offset_pixels) PNGARG((png_structp
-png_ptr, png_infop info_ptr));
-extern PNG_EXPORT(png_int_32, png_get_x_offset_microns) PNGARG((png_structp
-png_ptr, png_infop info_ptr));
-extern PNG_EXPORT(png_int_32, png_get_y_offset_microns) PNGARG((png_structp
-png_ptr, png_infop info_ptr));
-
-#endif /* PNG_EASY_ACCESS_SUPPORTED */
-
-/* Returns pointer to signature string read from PNG header */
-extern PNG_EXPORT(png_bytep,png_get_signature) PNGARG((png_structp png_ptr,
-png_infop info_ptr));
-
-#if defined(PNG_bKGD_SUPPORTED)
-extern PNG_EXPORT(png_uint_32,png_get_bKGD) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_color_16p *background));
-#endif
-
-#if defined(PNG_bKGD_SUPPORTED)
-extern PNG_EXPORT(void,png_set_bKGD) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_color_16p background));
-#endif
-
-#if defined(PNG_cHRM_SUPPORTED)
-#ifdef PNG_FLOATING_POINT_SUPPORTED
-extern PNG_EXPORT(png_uint_32,png_get_cHRM) PNGARG((png_structp png_ptr,
- png_infop info_ptr, double *white_x, double *white_y, double *red_x,
- double *red_y, double *green_x, double *green_y, double *blue_x,
- double *blue_y));
-#endif
-#ifdef PNG_FIXED_POINT_SUPPORTED
-extern PNG_EXPORT(png_uint_32,png_get_cHRM_fixed) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_fixed_point *int_white_x, png_fixed_point
- *int_white_y, png_fixed_point *int_red_x, png_fixed_point *int_red_y,
- png_fixed_point *int_green_x, png_fixed_point *int_green_y, png_fixed_point
- *int_blue_x, png_fixed_point *int_blue_y));
-#endif
-#endif
-
-#if defined(PNG_cHRM_SUPPORTED)
-#ifdef PNG_FLOATING_POINT_SUPPORTED
-extern PNG_EXPORT(void,png_set_cHRM) PNGARG((png_structp png_ptr,
- png_infop info_ptr, double white_x, double white_y, double red_x,
- double red_y, double green_x, double green_y, double blue_x, double blue_y));
-#endif
-#ifdef PNG_FIXED_POINT_SUPPORTED
-extern PNG_EXPORT(void,png_set_cHRM_fixed) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_fixed_point int_white_x, png_fixed_point int_white_y,
- png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point
- int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x,
- png_fixed_point int_blue_y));
-#endif
-#endif
-
-#if defined(PNG_gAMA_SUPPORTED)
-#ifdef PNG_FLOATING_POINT_SUPPORTED
-extern PNG_EXPORT(png_uint_32,png_get_gAMA) PNGARG((png_structp png_ptr,
- png_infop info_ptr, double *file_gamma));
-#endif
-extern PNG_EXPORT(png_uint_32,png_get_gAMA_fixed) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_fixed_point *int_file_gamma));
-#endif
-
-#if defined(PNG_gAMA_SUPPORTED)
-#ifdef PNG_FLOATING_POINT_SUPPORTED
-extern PNG_EXPORT(void,png_set_gAMA) PNGARG((png_structp png_ptr,
- png_infop info_ptr, double file_gamma));
-#endif
-extern PNG_EXPORT(void,png_set_gAMA_fixed) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_fixed_point int_file_gamma));
-#endif
-
-#if defined(PNG_hIST_SUPPORTED)
-extern PNG_EXPORT(png_uint_32,png_get_hIST) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_uint_16p *hist));
-#endif
-
-#if defined(PNG_hIST_SUPPORTED)
-extern PNG_EXPORT(void,png_set_hIST) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_uint_16p hist));
-#endif
-
-extern PNG_EXPORT(png_uint_32,png_get_IHDR) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_uint_32 *width, png_uint_32 *height,
- int *bit_depth, int *color_type, int *interlace_method,
- int *compression_method, int *filter_method));
-
-extern PNG_EXPORT(void,png_set_IHDR) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_uint_32 width, png_uint_32 height, int bit_depth,
- int color_type, int interlace_method, int compression_method,
- int filter_method));
-
-#if defined(PNG_oFFs_SUPPORTED)
-extern PNG_EXPORT(png_uint_32,png_get_oFFs) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_int_32 *offset_x, png_int_32 *offset_y,
- int *unit_type));
-#endif
-
-#if defined(PNG_oFFs_SUPPORTED)
-extern PNG_EXPORT(void,png_set_oFFs) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_int_32 offset_x, png_int_32 offset_y,
- int unit_type));
-#endif
-
-#if defined(PNG_pCAL_SUPPORTED)
-extern PNG_EXPORT(png_uint_32,png_get_pCAL) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_charp *purpose, png_int_32 *X0, png_int_32 *X1,
- int *type, int *nparams, png_charp *units, png_charpp *params));
-#endif
-
-#if defined(PNG_pCAL_SUPPORTED)
-extern PNG_EXPORT(void,png_set_pCAL) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_charp purpose, png_int_32 X0, png_int_32 X1,
- int type, int nparams, png_charp units, png_charpp params));
-#endif
-
-#if defined(PNG_pHYs_SUPPORTED)
-extern PNG_EXPORT(png_uint_32,png_get_pHYs) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type));
-#endif
-
-#if defined(PNG_pHYs_SUPPORTED)
-extern PNG_EXPORT(void,png_set_pHYs) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_uint_32 res_x, png_uint_32 res_y, int unit_type));
-#endif
-
-extern PNG_EXPORT(png_uint_32,png_get_PLTE) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_colorp *palette, int *num_palette));
-
-extern PNG_EXPORT(void,png_set_PLTE) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_colorp palette, int num_palette));
-
-#if defined(PNG_sBIT_SUPPORTED)
-extern PNG_EXPORT(png_uint_32,png_get_sBIT) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_color_8p *sig_bit));
-#endif
-
-#if defined(PNG_sBIT_SUPPORTED)
-extern PNG_EXPORT(void,png_set_sBIT) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_color_8p sig_bit));
-#endif
-
-#if defined(PNG_sRGB_SUPPORTED)
-extern PNG_EXPORT(png_uint_32,png_get_sRGB) PNGARG((png_structp png_ptr,
- png_infop info_ptr, int *intent));
-#endif
-
-#if defined(PNG_sRGB_SUPPORTED)
-extern PNG_EXPORT(void,png_set_sRGB) PNGARG((png_structp png_ptr,
- png_infop info_ptr, int intent));
-extern PNG_EXPORT(void,png_set_sRGB_gAMA_and_cHRM) PNGARG((png_structp png_ptr,
- png_infop info_ptr, int intent));
-#endif
-
-#if defined(PNG_iCCP_SUPPORTED)
-extern PNG_EXPORT(png_uint_32,png_get_iCCP) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_charpp name, int *compression_type,
- png_charpp profile, png_uint_32 *proflen));
- /* Note to maintainer: profile should be png_bytepp */
-#endif
-
-#if defined(PNG_iCCP_SUPPORTED)
-extern PNG_EXPORT(void,png_set_iCCP) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_charp name, int compression_type,
- png_charp profile, png_uint_32 proflen));
- /* Note to maintainer: profile should be png_bytep */
-#endif
-
-#if defined(PNG_sPLT_SUPPORTED)
-extern PNG_EXPORT(png_uint_32,png_get_sPLT) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_sPLT_tpp entries));
-#endif
-
-#if defined(PNG_sPLT_SUPPORTED)
-extern PNG_EXPORT(void,png_set_sPLT) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_sPLT_tp entries, int nentries));
-#endif
-
-#if defined(PNG_TEXT_SUPPORTED)
-/* png_get_text also returns the number of text chunks in *num_text */
-extern PNG_EXPORT(png_uint_32,png_get_text) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_textp *text_ptr, int *num_text));
-#endif
-
-/*
- * Note while png_set_text() will accept a structure whose text,
- * language, and translated keywords are NULL pointers, the structure
- * returned by png_get_text will always contain regular
- * zero-terminated C strings. They might be empty strings but
- * they will never be NULL pointers.
- */
-
-#if defined(PNG_TEXT_SUPPORTED)
-extern PNG_EXPORT(void,png_set_text) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_textp text_ptr, int num_text));
-#endif
-
-#if defined(PNG_tIME_SUPPORTED)
-extern PNG_EXPORT(png_uint_32,png_get_tIME) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_timep *mod_time));
-#endif
-
-#if defined(PNG_tIME_SUPPORTED)
-extern PNG_EXPORT(void,png_set_tIME) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_timep mod_time));
-#endif
-
-#if defined(PNG_tRNS_SUPPORTED)
-extern PNG_EXPORT(png_uint_32,png_get_tRNS) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_bytep *trans, int *num_trans,
- png_color_16p *trans_values));
-#endif
-
-#if defined(PNG_tRNS_SUPPORTED)
-extern PNG_EXPORT(void,png_set_tRNS) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_bytep trans, int num_trans,
- png_color_16p trans_values));
-#endif
-
-#if defined(PNG_tRNS_SUPPORTED)
-#endif
-
-#if defined(PNG_sCAL_SUPPORTED)
-#ifdef PNG_FLOATING_POINT_SUPPORTED
-extern PNG_EXPORT(png_uint_32,png_get_sCAL) PNGARG((png_structp png_ptr,
- png_infop info_ptr, int *unit, double *width, double *height));
-#else
-#ifdef PNG_FIXED_POINT_SUPPORTED
-extern PNG_EXPORT(png_uint_32,png_get_sCAL_s) PNGARG((png_structp png_ptr,
- png_infop info_ptr, int *unit, png_charpp swidth, png_charpp sheight));
-#endif
-#endif
-#endif /* PNG_sCAL_SUPPORTED */
-
-#if defined(PNG_sCAL_SUPPORTED)
-#ifdef PNG_FLOATING_POINT_SUPPORTED
-extern PNG_EXPORT(void,png_set_sCAL) PNGARG((png_structp png_ptr,
- png_infop info_ptr, int unit, double width, double height));
-#endif
-#ifdef PNG_FIXED_POINT_SUPPORTED
-extern PNG_EXPORT(void,png_set_sCAL_s) PNGARG((png_structp png_ptr,
- png_infop info_ptr, int unit, png_charp swidth, png_charp sheight));
-#endif
-#endif /* PNG_sCAL_SUPPORTED || PNG_WRITE_sCAL_SUPPORTED */
-
-#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
-/* provide a list of chunks and how they are to be handled, if the built-in
- handling or default unknown chunk handling is not desired. Any chunks not
- listed will be handled in the default manner. The IHDR and IEND chunks
- must not be listed.
- keep = 0: follow default behavour
- = 1: do not keep
- = 2: keep only if safe-to-copy
- = 3: keep even if unsafe-to-copy
-*/
-extern PNG_EXPORT(void, png_set_keep_unknown_chunks) PNGARG((png_structp
- png_ptr, int keep, png_bytep chunk_list, int num_chunks));
-extern PNG_EXPORT(void, png_set_unknown_chunks) PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_unknown_chunkp unknowns, int num_unknowns));
-extern PNG_EXPORT(void, png_set_unknown_chunk_location)
- PNGARG((png_structp png_ptr, png_infop info_ptr, int chunk, int location));
-extern PNG_EXPORT(png_uint_32,png_get_unknown_chunks) PNGARG((png_structp
- png_ptr, png_infop info_ptr, png_unknown_chunkpp entries));
-#endif
-
-/* Png_free_data() will turn off the "valid" flag for anything it frees.
- If you need to turn it off for a chunk that your application has freed,
- you can use png_set_invalid(png_ptr, info_ptr, PNG_INFO_CHNK); */
-extern PNG_EXPORT(void, png_set_invalid) PNGARG((png_structp png_ptr,
- png_infop info_ptr, int mask));
-
-#if defined(PNG_INFO_IMAGE_SUPPORTED)
-/* The "params" pointer is currently not used and is for future expansion. */
-extern PNG_EXPORT(void, png_read_png) PNGARG((png_structp png_ptr,
- png_infop info_ptr,
- int transforms,
- png_voidp params));
-extern PNG_EXPORT(void, png_write_png) PNGARG((png_structp png_ptr,
- png_infop info_ptr,
- int transforms,
- png_voidp params));
-#endif
-
-/* Define PNG_DEBUG at compile time for debugging information. Higher
- * numbers for PNG_DEBUG mean more debugging information. This has
- * only been added since version 0.95 so it is not implemented throughout
- * libpng yet, but more support will be added as needed.
- */
-#ifdef PNG_DEBUG
-#if (PNG_DEBUG > 0)
-#if !defined(PNG_DEBUG_FILE) && defined(_MSC_VER)
-#include <crtdbg.h>
-#if (PNG_DEBUG > 1)
-#define png_debug(l,m) _RPT0(_CRT_WARN,m)
-#define png_debug1(l,m,p1) _RPT1(_CRT_WARN,m,p1)
-#define png_debug2(l,m,p1,p2) _RPT2(_CRT_WARN,m,p1,p2)
-#endif
-#else /* PNG_DEBUG_FILE || !_MSC_VER */
-#ifndef PNG_DEBUG_FILE
-#define PNG_DEBUG_FILE stderr
-#endif /* PNG_DEBUG_FILE */
-#if (PNG_DEBUG > 1)
-#define png_debug(l,m) \
-{ \
- int num_tabs=l; \
- fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \
- (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":"")))); \
-}
-#define png_debug1(l,m,p1) \
-{ \
- int num_tabs=l; \
- fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \
- (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1); \
-}
-#define png_debug2(l,m,p1,p2) \
-{ \
- int num_tabs=l; \
- fprintf(PNG_DEBUG_FILE,"%s"m,(num_tabs==1 ? "\t" : \
- (num_tabs==2 ? "\t\t":(num_tabs>2 ? "\t\t\t":""))),p1,p2); \
-}
-#endif /* (PNG_DEBUG > 1) */
-#endif /* _MSC_VER */
-#endif /* (PNG_DEBUG > 0) */
-#endif /* PNG_DEBUG */
-#ifndef png_debug
-#define png_debug(l, m)
-#endif
-#ifndef png_debug1
-#define png_debug1(l, m, p1)
-#endif
-#ifndef png_debug2
-#define png_debug2(l, m, p1, p2)
-#endif
-
-extern PNG_EXPORT(png_bytep,png_sig_bytes) PNGARG((void));
-
-extern PNG_EXPORT(png_charp,png_get_copyright) PNGARG((png_structp png_ptr));
-extern PNG_EXPORT(png_charp,png_get_header_ver) PNGARG((png_structp png_ptr));
-extern PNG_EXPORT(png_charp,png_get_header_version) PNGARG((png_structp png_ptr));
-extern PNG_EXPORT(png_charp,png_get_libpng_ver) PNGARG((png_structp png_ptr));
-
-#ifdef PNG_MNG_FEATURES_SUPPORTED
-extern PNG_EXPORT(png_uint_32,png_permit_mng_features) PNGARG((png_structp
- png_ptr, png_uint_32 mng_features_permitted));
-#endif
-
-/* Added to version 1.2.0 */
-#if defined(PNG_ASSEMBLER_CODE_SUPPORTED)
-#define PNG_ASM_FLAG_MMX_SUPPORT_COMPILED 0x01 /* not user-settable */
-#define PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU 0x02 /* not user-settable */
-#define PNG_ASM_FLAG_MMX_READ_COMBINE_ROW 0x04
-#define PNG_ASM_FLAG_MMX_READ_INTERLACE 0x08
-#define PNG_ASM_FLAG_MMX_READ_FILTER_SUB 0x10
-#define PNG_ASM_FLAG_MMX_READ_FILTER_UP 0x20
-#define PNG_ASM_FLAG_MMX_READ_FILTER_AVG 0x40
-#define PNG_ASM_FLAG_MMX_READ_FILTER_PAETH 0x80
-#define PNG_ASM_FLAGS_INITIALIZED 0x80000000 /* not user-settable */
-
-#define PNG_MMX_READ_FLAGS ( PNG_ASM_FLAG_MMX_READ_COMBINE_ROW \
- | PNG_ASM_FLAG_MMX_READ_INTERLACE \
- | PNG_ASM_FLAG_MMX_READ_FILTER_SUB \
- | PNG_ASM_FLAG_MMX_READ_FILTER_UP \
- | PNG_ASM_FLAG_MMX_READ_FILTER_AVG \
- | PNG_ASM_FLAG_MMX_READ_FILTER_PAETH )
-#define PNG_MMX_WRITE_FLAGS ( 0 )
-
-#define PNG_MMX_FLAGS ( PNG_ASM_FLAG_MMX_SUPPORT_COMPILED \
- | PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU \
- | PNG_MMX_READ_FLAGS \
- | PNG_MMX_WRITE_FLAGS )
-
-#define PNG_SELECT_READ 1
-#define PNG_SELECT_WRITE 2
-
-
-/* pngget.c */
-extern PNG_EXPORT(png_uint_32,png_get_mmx_flagmask)
- PNGARG((int flag_select, int *compilerID));
-
-/* pngget.c */
-extern PNG_EXPORT(png_uint_32,png_get_asm_flagmask)
- PNGARG((int flag_select));
-
-/* pngget.c */
-extern PNG_EXPORT(png_uint_32,png_get_asm_flags)
- PNGARG((png_structp png_ptr));
-
-/* pngget.c */
-extern PNG_EXPORT(png_byte,png_get_mmx_bitdepth_threshold)
- PNGARG((png_structp png_ptr));
-
-/* pngget.c */
-extern PNG_EXPORT(png_uint_32,png_get_mmx_rowbytes_threshold)
- PNGARG((png_structp png_ptr));
-
-/* pngset.c */
-extern PNG_EXPORT(void,png_set_asm_flags)
- PNGARG((png_structp png_ptr, png_uint_32 asm_flags));
-
-/* pngset.c */
-extern PNG_EXPORT(void,png_set_mmx_thresholds)
- PNGARG((png_structp png_ptr, png_byte mmx_bitdepth_threshold,
- png_uint_32 mmx_rowbytes_threshold));
-
-#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */
-
-/* png.c, pnggccrd.c, or pngvcrd.c */
-extern PNG_EXPORT(int,png_mmx_support) PNGARG((void));
-
-/* Strip the prepended error numbers ("#nnn ") from error and warning
- * messages before passing them to the error or warning handler. */
-#ifdef PNG_ERROR_NUMBERS_SUPPORTED
-extern PNG_EXPORT(void,png_set_strip_error_numbers) PNGARG((png_structp
- png_ptr, png_uint_32 strip_mode));
-#endif
-
-/* Maintainer: Put new public prototypes here ^, in libpng.3, and project defs */
-
-#define PNG_HEADER_VERSION_STRING \
- " libpng version 1.2.1 - December 12, 2001 (header)\n"
-
-#ifdef PNG_READ_COMPOSITE_NODIV_SUPPORTED
-/* With these routines we avoid an integer divide, which will be slower on
- * most machines. However, it does take more operations than the corresponding
- * divide method, so it may be slower on a few RISC systems. There are two
- * shifts (by 8 or 16 bits) and an addition, versus a single integer divide.
- *
- * Note that the rounding factors are NOT supposed to be the same! 128 and
- * 32768 are correct for the NODIV code; 127 and 32767 are correct for the
- * standard method.
- *
- * [Optimized code by Greg Roelofs and Mark Adler...blame us for bugs. :-) ]
- */
-
- /* fg and bg should be in `gamma 1.0' space; alpha is the opacity */
-
-# define png_composite(composite, fg, alpha, bg) \
- { png_uint_16 temp = (png_uint_16)((png_uint_16)(fg) * (png_uint_16)(alpha) \
- + (png_uint_16)(bg)*(png_uint_16)(255 - \
- (png_uint_16)(alpha)) + (png_uint_16)128); \
- (composite) = (png_byte)((temp + (temp >> 8)) >> 8); }
-
-# define png_composite_16(composite, fg, alpha, bg) \
- { png_uint_32 temp = (png_uint_32)((png_uint_32)(fg) * (png_uint_32)(alpha) \
- + (png_uint_32)(bg)*(png_uint_32)(65535L - \
- (png_uint_32)(alpha)) + (png_uint_32)32768L); \
- (composite) = (png_uint_16)((temp + (temp >> 16)) >> 16); }
-
-#else /* standard method using integer division */
-
-# define png_composite(composite, fg, alpha, bg) \
- (composite) = (png_byte)(((png_uint_16)(fg) * (png_uint_16)(alpha) + \
- (png_uint_16)(bg) * (png_uint_16)(255 - (png_uint_16)(alpha)) + \
- (png_uint_16)127) / 255)
-
-# define png_composite_16(composite, fg, alpha, bg) \
- (composite) = (png_uint_16)(((png_uint_32)(fg) * (png_uint_32)(alpha) + \
- (png_uint_32)(bg)*(png_uint_32)(65535L - (png_uint_32)(alpha)) + \
- (png_uint_32)32767) / (png_uint_32)65535L)
-
-#endif /* PNG_READ_COMPOSITE_NODIV_SUPPORTED */
-
-/* These next functions are used internally in the code. They generally
- * shouldn't be used unless you are writing code to add or replace some
- * functionality in libpng. More information about most functions can
- * be found in the files where the functions are located.
- */
-
-#if defined(PNG_INTERNAL)
-
-/* Various modes of operation. Note that after an init, mode is set to
- * zero automatically when the structure is created.
- */
-#define PNG_HAVE_IHDR 0x01
-#define PNG_HAVE_PLTE 0x02
-#define PNG_HAVE_IDAT 0x04
-#define PNG_AFTER_IDAT 0x08
-#define PNG_HAVE_IEND 0x10
-#define PNG_HAVE_gAMA 0x20
-#define PNG_HAVE_cHRM 0x40
-#define PNG_HAVE_sRGB 0x80
-#define PNG_HAVE_CHUNK_HEADER 0x100
-#define PNG_WROTE_tIME 0x200
-#define PNG_WROTE_INFO_BEFORE_PLTE 0x400
-#define PNG_BACKGROUND_IS_GRAY 0x800
-#define PNG_HAVE_PNG_SIGNATURE 0x1000
-
-/* flags for the transformations the PNG library does on the image data */
-#define PNG_BGR 0x0001
-#define PNG_INTERLACE 0x0002
-#define PNG_PACK 0x0004
-#define PNG_SHIFT 0x0008
-#define PNG_SWAP_BYTES 0x0010
-#define PNG_INVERT_MONO 0x0020
-#define PNG_DITHER 0x0040
-#define PNG_BACKGROUND 0x0080
-#define PNG_BACKGROUND_EXPAND 0x0100
- /* 0x0200 unused */
-#define PNG_16_TO_8 0x0400
-#define PNG_RGBA 0x0800
-#define PNG_EXPAND 0x1000
-#define PNG_GAMMA 0x2000
-#define PNG_GRAY_TO_RGB 0x4000
-#define PNG_FILLER 0x8000L
-#define PNG_PACKSWAP 0x10000L
-#define PNG_SWAP_ALPHA 0x20000L
-#define PNG_STRIP_ALPHA 0x40000L
-#define PNG_INVERT_ALPHA 0x80000L
-#define PNG_USER_TRANSFORM 0x100000L
-#define PNG_RGB_TO_GRAY_ERR 0x200000L
-#define PNG_RGB_TO_GRAY_WARN 0x400000L
-#define PNG_RGB_TO_GRAY 0x600000L /* two bits, RGB_TO_GRAY_ERR|WARN */
-
-/* flags for png_create_struct */
-#define PNG_STRUCT_PNG 0x0001
-#define PNG_STRUCT_INFO 0x0002
-
-/* Scaling factor for filter heuristic weighting calculations */
-#define PNG_WEIGHT_SHIFT 8
-#define PNG_WEIGHT_FACTOR (1<<(PNG_WEIGHT_SHIFT))
-#define PNG_COST_SHIFT 3
-#define PNG_COST_FACTOR (1<<(PNG_COST_SHIFT))
-
-/* flags for the png_ptr->flags rather than declaring a byte for each one */
-#define PNG_FLAG_ZLIB_CUSTOM_STRATEGY 0x0001
-#define PNG_FLAG_ZLIB_CUSTOM_LEVEL 0x0002
-#define PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL 0x0004
-#define PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS 0x0008
-#define PNG_FLAG_ZLIB_CUSTOM_METHOD 0x0010
-#define PNG_FLAG_ZLIB_FINISHED 0x0020
-#define PNG_FLAG_ROW_INIT 0x0040
-#define PNG_FLAG_FILLER_AFTER 0x0080
-#define PNG_FLAG_CRC_ANCILLARY_USE 0x0100
-#define PNG_FLAG_CRC_ANCILLARY_NOWARN 0x0200
-#define PNG_FLAG_CRC_CRITICAL_USE 0x0400
-#define PNG_FLAG_CRC_CRITICAL_IGNORE 0x0800
-#define PNG_FLAG_FREE_PLTE 0x1000
-#define PNG_FLAG_FREE_TRNS 0x2000
-#define PNG_FLAG_FREE_HIST 0x4000
-#define PNG_FLAG_KEEP_UNKNOWN_CHUNKS 0x8000L
-#define PNG_FLAG_KEEP_UNSAFE_CHUNKS 0x10000L
-#define PNG_FLAG_LIBRARY_MISMATCH 0x20000L
-#define PNG_FLAG_STRIP_ERROR_NUMBERS 0x40000L
-#define PNG_FLAG_STRIP_ERROR_TEXT 0x80000L
-
-/* For use in png_set_keep_unknown, png_handle_as_unknown */
-#define HANDLE_CHUNK_AS_DEFAULT 0
-#define HANDLE_CHUNK_NEVER 1
-#define HANDLE_CHUNK_IF_SAFE 2
-#define HANDLE_CHUNK_ALWAYS 3
-
-#define PNG_FLAG_CRC_ANCILLARY_MASK (PNG_FLAG_CRC_ANCILLARY_USE | \
- PNG_FLAG_CRC_ANCILLARY_NOWARN)
-
-#define PNG_FLAG_CRC_CRITICAL_MASK (PNG_FLAG_CRC_CRITICAL_USE | \
- PNG_FLAG_CRC_CRITICAL_IGNORE)
-
-#define PNG_FLAG_CRC_MASK (PNG_FLAG_CRC_ANCILLARY_MASK | \
- PNG_FLAG_CRC_CRITICAL_MASK)
-
-/* save typing and make code easier to understand */
-#define PNG_COLOR_DIST(c1, c2) (abs((int)((c1).red) - (int)((c2).red)) + \
- abs((int)((c1).green) - (int)((c2).green)) + \
- abs((int)((c1).blue) - (int)((c2).blue)))
-
-/* variables declared in png.c - only it needs to define PNG_NO_EXTERN */
-#if !defined(PNG_NO_EXTERN) || defined(PNG_ALWAYS_EXTERN)
-/* place to hold the signature string for a PNG file. */
-#ifdef PNG_USE_GLOBAL_ARRAYS
- PNG_EXPORT_VAR (const png_byte FARDATA) png_sig[8];
-#else
-#define png_sig png_sig_bytes(NULL)
-#endif
-#endif /* PNG_NO_EXTERN */
-
-/* Constant strings for known chunk types. If you need to add a chunk,
- * define the name here, and add an invocation of the macro in png.c and
- * wherever it's needed.
- */
-#define PNG_IHDR const png_byte png_IHDR[5] = { 73, 72, 68, 82, '\0'}
-#define PNG_IDAT const png_byte png_IDAT[5] = { 73, 68, 65, 84, '\0'}
-#define PNG_IEND const png_byte png_IEND[5] = { 73, 69, 78, 68, '\0'}
-#define PNG_PLTE const png_byte png_PLTE[5] = { 80, 76, 84, 69, '\0'}
-#define PNG_bKGD const png_byte png_bKGD[5] = { 98, 75, 71, 68, '\0'}
-#define PNG_cHRM const png_byte png_cHRM[5] = { 99, 72, 82, 77, '\0'}
-#define PNG_gAMA const png_byte png_gAMA[5] = {103, 65, 77, 65, '\0'}
-#define PNG_hIST const png_byte png_hIST[5] = {104, 73, 83, 84, '\0'}
-#define PNG_iCCP const png_byte png_iCCP[5] = {105, 67, 67, 80, '\0'}
-#define PNG_iTXt const png_byte png_iTXt[5] = {105, 84, 88, 116, '\0'}
-#define PNG_oFFs const png_byte png_oFFs[5] = {111, 70, 70, 115, '\0'}
-#define PNG_pCAL const png_byte png_pCAL[5] = {112, 67, 65, 76, '\0'}
-#define PNG_sCAL const png_byte png_sCAL[5] = {115, 67, 65, 76, '\0'}
-#define PNG_pHYs const png_byte png_pHYs[5] = {112, 72, 89, 115, '\0'}
-#define PNG_sBIT const png_byte png_sBIT[5] = {115, 66, 73, 84, '\0'}
-#define PNG_sPLT const png_byte png_sPLT[5] = {115, 80, 76, 84, '\0'}
-#define PNG_sRGB const png_byte png_sRGB[5] = {115, 82, 71, 66, '\0'}
-#define PNG_tEXt const png_byte png_tEXt[5] = {116, 69, 88, 116, '\0'}
-#define PNG_tIME const png_byte png_tIME[5] = {116, 73, 77, 69, '\0'}
-#define PNG_tRNS const png_byte png_tRNS[5] = {116, 82, 78, 83, '\0'}
-#define PNG_zTXt const png_byte png_zTXt[5] = {122, 84, 88, 116, '\0'}
-
-#ifdef PNG_USE_GLOBAL_ARRAYS
-PNG_EXPORT_VAR (const png_byte FARDATA) png_IHDR[5];
-PNG_EXPORT_VAR (const png_byte FARDATA) png_IDAT[5];
-PNG_EXPORT_VAR (const png_byte FARDATA) png_IEND[5];
-PNG_EXPORT_VAR (const png_byte FARDATA) png_PLTE[5];
-PNG_EXPORT_VAR (const png_byte FARDATA) png_bKGD[5];
-PNG_EXPORT_VAR (const png_byte FARDATA) png_cHRM[5];
-PNG_EXPORT_VAR (const png_byte FARDATA) png_gAMA[5];
-PNG_EXPORT_VAR (const png_byte FARDATA) png_hIST[5];
-PNG_EXPORT_VAR (const png_byte FARDATA) png_iCCP[5];
-PNG_EXPORT_VAR (const png_byte FARDATA) png_iTXt[5];
-PNG_EXPORT_VAR (const png_byte FARDATA) png_oFFs[5];
-PNG_EXPORT_VAR (const png_byte FARDATA) png_pCAL[5];
-PNG_EXPORT_VAR (const png_byte FARDATA) png_sCAL[5];
-PNG_EXPORT_VAR (const png_byte FARDATA) png_pHYs[5];
-PNG_EXPORT_VAR (const png_byte FARDATA) png_sBIT[5];
-PNG_EXPORT_VAR (const png_byte FARDATA) png_sPLT[5];
-PNG_EXPORT_VAR (const png_byte FARDATA) png_sRGB[5];
-PNG_EXPORT_VAR (const png_byte FARDATA) png_tEXt[5];
-PNG_EXPORT_VAR (const png_byte FARDATA) png_tIME[5];
-PNG_EXPORT_VAR (const png_byte FARDATA) png_tRNS[5];
-PNG_EXPORT_VAR (const png_byte FARDATA) png_zTXt[5];
-#endif /* PNG_USE_GLOBAL_ARRAYS */
-
-
-/* Inline macros to do direct reads of bytes from the input buffer. These
- * require that you are using an architecture that uses PNG byte ordering
- * (MSB first) and supports unaligned data storage. I think that PowerPC
- * in big-endian mode and 680x0 are the only ones that will support this.
- * The x86 line of processors definitely do not. The png_get_int_32()
- * routine also assumes we are using two's complement format for negative
- * values, which is almost certainly true.
- */
-#if defined(PNG_READ_BIG_ENDIAN_SUPPORTED)
-# if defined(PNG_pCAL_SUPPORTED) || defined(PNG_oFFs_SUPPORTED)
-# define png_get_int_32(buf) ( *((png_int_32p) (buf)))
-# endif
-# define png_get_uint_32(buf) ( *((png_uint_32p) (buf)))
-# define png_get_uint_16(buf) ( *((png_uint_16p) (buf)))
-#else
-# if defined(PNG_pCAL_SUPPORTED) || defined(PNG_oFFs_SUPPORTED)
-PNG_EXTERN png_int_32 png_get_int_32 PNGARG((png_bytep buf));
-# endif
-PNG_EXTERN png_uint_32 png_get_uint_32 PNGARG((png_bytep buf));
-PNG_EXTERN png_uint_16 png_get_uint_16 PNGARG((png_bytep buf));
-#endif /* !PNG_READ_BIG_ENDIAN_SUPPORTED */
-
-/* Initialize png_ptr struct for reading, and allocate any other memory.
- * (old interface - DEPRECATED - use png_create_read_struct instead).
- */
-extern PNG_EXPORT(void,png_read_init) PNGARG((png_structp png_ptr));
-#define png_read_init(png_ptr) png_read_init_3(&png_ptr, \
- PNG_LIBPNG_VER_STRING, sizeof(png_struct));
-extern PNG_EXPORT(void,png_read_init_3) PNGARG((png_structpp ptr_ptr,
- png_const_charp user_png_ver, png_size_t png_struct_size));
-extern PNG_EXPORT(void,png_read_init_2) PNGARG((png_structp png_ptr,
- png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t
- png_info_size));
-
-/* Initialize png_ptr struct for writing, and allocate any other memory.
- * (old interface - DEPRECATED - use png_create_write_struct instead).
- */
-extern PNG_EXPORT(void,png_write_init) PNGARG((png_structp png_ptr));
-#define png_write_init(png_ptr) png_write_init_3(&png_ptr, \
- PNG_LIBPNG_VER_STRING, sizeof(png_struct));
-extern PNG_EXPORT(void,png_write_init_3) PNGARG((png_structpp ptr_ptr,
- png_const_charp user_png_ver, png_size_t png_struct_size));
-extern PNG_EXPORT(void,png_write_init_2) PNGARG((png_structp png_ptr,
- png_const_charp user_png_ver, png_size_t png_struct_size, png_size_t
- png_info_size));
-
-/* Allocate memory for an internal libpng struct */
-PNG_EXTERN png_voidp png_create_struct PNGARG((int type));
-
-/* Free memory from internal libpng struct */
-PNG_EXTERN void png_destroy_struct PNGARG((png_voidp struct_ptr));
-
-PNG_EXTERN png_voidp png_create_struct_2 PNGARG((int type, png_malloc_ptr
- malloc_fn, png_voidp mem_ptr));
-PNG_EXTERN void png_destroy_struct_2 PNGARG((png_voidp struct_ptr,
- png_free_ptr free_fn, png_voidp mem_ptr));
-
-/* Free any memory that info_ptr points to and reset struct. */
-PNG_EXTERN void png_info_destroy PNGARG((png_structp png_ptr,
- png_infop info_ptr));
-
-/* Function to allocate memory for zlib. */
-PNG_EXTERN voidpf png_zalloc PNGARG((voidpf png_ptr, uInt items, uInt size));
-
-/* Function to free memory for zlib */
-PNG_EXTERN void png_zfree PNGARG((voidpf png_ptr, voidpf ptr));
-
-/* Reset the CRC variable */
-PNG_EXTERN void png_reset_crc PNGARG((png_structp png_ptr));
-
-/* Write the "data" buffer to whatever output you are using. */
-PNG_EXTERN void png_write_data PNGARG((png_structp png_ptr, png_bytep data,
- png_size_t length));
-
-/* Read data from whatever input you are using into the "data" buffer */
-PNG_EXTERN void png_read_data PNGARG((png_structp png_ptr, png_bytep data,
- png_size_t length));
-
-/* Read bytes into buf, and update png_ptr->crc */
-PNG_EXTERN void png_crc_read PNGARG((png_structp png_ptr, png_bytep buf,
- png_size_t length));
-
-/* Decompress data in a chunk that uses compression */
-#if defined(PNG_zTXt_SUPPORTED) || defined(PNG_iTXt_SUPPORTED) || \
- defined(PNG_iCCP_SUPPORTED) || defined(PNG_sPLT_SUPPORTED)
-PNG_EXTERN png_charp png_decompress_chunk PNGARG((png_structp png_ptr,
- int comp_type, png_charp chunkdata, png_size_t chunklength,
- png_size_t prefix_length, png_size_t *data_length));
-#endif
-
-/* Read "skip" bytes, read the file crc, and (optionally) verify png_ptr->crc */
-PNG_EXTERN int png_crc_finish PNGARG((png_structp png_ptr, png_uint_32 skip));
-
-/* Read the CRC from the file and compare it to the libpng calculated CRC */
-PNG_EXTERN int png_crc_error PNGARG((png_structp png_ptr));
-
-/* Calculate the CRC over a section of data. Note that we are only
- * passing a maximum of 64K on systems that have this as a memory limit,
- * since this is the maximum buffer size we can specify.
- */
-PNG_EXTERN void png_calculate_crc PNGARG((png_structp png_ptr, png_bytep ptr,
- png_size_t length));
-
-#if defined(PNG_WRITE_FLUSH_SUPPORTED)
-PNG_EXTERN void png_flush PNGARG((png_structp png_ptr));
-#endif
-
-/* Place a 32-bit number into a buffer in PNG byte order (big-endian).
- * The only currently known PNG chunks that use signed numbers are
- * the ancillary extension chunks, oFFs and pCAL.
- */
-PNG_EXTERN void png_save_uint_32 PNGARG((png_bytep buf, png_uint_32 i));
-
-#if defined(PNG_WRITE_pCAL_SUPPORTED) || defined(PNG_WRITE_oFFs_SUPPORTED)
-PNG_EXTERN void png_save_int_32 PNGARG((png_bytep buf, png_int_32 i));
-#endif
-
-/* Place a 16-bit number into a buffer in PNG byte order.
- * The parameter is declared unsigned int, not png_uint_16,
- * just to avoid potential problems on pre-ANSI C compilers.
- */
-PNG_EXTERN void png_save_uint_16 PNGARG((png_bytep buf, unsigned int i));
-
-/* simple function to write the signature */
-PNG_EXTERN void png_write_sig PNGARG((png_structp png_ptr));
-
-/* write various chunks */
-
-/* Write the IHDR chunk, and update the png_struct with the necessary
- * information.
- */
-PNG_EXTERN void png_write_IHDR PNGARG((png_structp png_ptr, png_uint_32 width,
- png_uint_32 height,
- int bit_depth, int color_type, int compression_method, int filter_method,
- int interlace_method));
-
-PNG_EXTERN void png_write_PLTE PNGARG((png_structp png_ptr, png_colorp palette,
- png_uint_32 num_pal));
-
-PNG_EXTERN void png_write_IDAT PNGARG((png_structp png_ptr, png_bytep data,
- png_size_t length));
-
-PNG_EXTERN void png_write_IEND PNGARG((png_structp png_ptr));
-
-#if defined(PNG_WRITE_gAMA_SUPPORTED)
-#ifdef PNG_FLOATING_POINT_SUPPORTED
-PNG_EXTERN void png_write_gAMA PNGARG((png_structp png_ptr, double file_gamma));
-#endif
-#ifdef PNG_FIXED_POINT_SUPPORTED
-PNG_EXTERN void png_write_gAMA_fixed PNGARG((png_structp png_ptr, png_fixed_point
- file_gamma));
-#endif
-#endif
-
-#if defined(PNG_WRITE_sBIT_SUPPORTED)
-PNG_EXTERN void png_write_sBIT PNGARG((png_structp png_ptr, png_color_8p sbit,
- int color_type));
-#endif
-
-#if defined(PNG_WRITE_cHRM_SUPPORTED)
-#ifdef PNG_FLOATING_POINT_SUPPORTED
-PNG_EXTERN void png_write_cHRM PNGARG((png_structp png_ptr,
- double white_x, double white_y,
- double red_x, double red_y, double green_x, double green_y,
- double blue_x, double blue_y));
-#endif
-#ifdef PNG_FIXED_POINT_SUPPORTED
-PNG_EXTERN void png_write_cHRM_fixed PNGARG((png_structp png_ptr,
- png_fixed_point int_white_x, png_fixed_point int_white_y,
- png_fixed_point int_red_x, png_fixed_point int_red_y, png_fixed_point
- int_green_x, png_fixed_point int_green_y, png_fixed_point int_blue_x,
- png_fixed_point int_blue_y));
-#endif
-#endif
-
-#if defined(PNG_WRITE_sRGB_SUPPORTED)
-PNG_EXTERN void png_write_sRGB PNGARG((png_structp png_ptr,
- int intent));
-#endif
-
-#if defined(PNG_WRITE_iCCP_SUPPORTED)
-PNG_EXTERN void png_write_iCCP PNGARG((png_structp png_ptr,
- png_charp name, int compression_type,
- png_charp profile, int proflen));
- /* Note to maintainer: profile should be png_bytep */
-#endif
-
-#if defined(PNG_WRITE_sPLT_SUPPORTED)
-PNG_EXTERN void png_write_sPLT PNGARG((png_structp png_ptr,
- png_sPLT_tp palette));
-#endif
-
-#if defined(PNG_WRITE_tRNS_SUPPORTED)
-PNG_EXTERN void png_write_tRNS PNGARG((png_structp png_ptr, png_bytep trans,
- png_color_16p values, int number, int color_type));
-#endif
-
-#if defined(PNG_WRITE_bKGD_SUPPORTED)
-PNG_EXTERN void png_write_bKGD PNGARG((png_structp png_ptr,
- png_color_16p values, int color_type));
-#endif
-
-#if defined(PNG_WRITE_hIST_SUPPORTED)
-PNG_EXTERN void png_write_hIST PNGARG((png_structp png_ptr, png_uint_16p hist,
- int num_hist));
-#endif
-
-#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \
- defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED)
-PNG_EXTERN png_size_t png_check_keyword PNGARG((png_structp png_ptr,
- png_charp key, png_charpp new_key));
-#endif
-
-#if defined(PNG_WRITE_tEXt_SUPPORTED)
-PNG_EXTERN void png_write_tEXt PNGARG((png_structp png_ptr, png_charp key,
- png_charp text, png_size_t text_len));
-#endif
-
-#if defined(PNG_WRITE_zTXt_SUPPORTED)
-PNG_EXTERN void png_write_zTXt PNGARG((png_structp png_ptr, png_charp key,
- png_charp text, png_size_t text_len, int compression));
-#endif
-
-#if defined(PNG_WRITE_iTXt_SUPPORTED)
-PNG_EXTERN void png_write_iTXt PNGARG((png_structp png_ptr,
- int compression, png_charp key, png_charp lang, png_charp lang_key,
- png_charp text));
-#endif
-
-#if defined(PNG_WRITE_oFFs_SUPPORTED)
-PNG_EXTERN void png_write_oFFs PNGARG((png_structp png_ptr,
- png_int_32 x_offset, png_int_32 y_offset, int unit_type));
-#endif
-
-#if defined(PNG_WRITE_pCAL_SUPPORTED)
-PNG_EXTERN void png_write_pCAL PNGARG((png_structp png_ptr, png_charp purpose,
- png_int_32 X0, png_int_32 X1, int type, int nparams,
- png_charp units, png_charpp params));
-#endif
-
-#if defined(PNG_WRITE_pHYs_SUPPORTED)
-PNG_EXTERN void png_write_pHYs PNGARG((png_structp png_ptr,
- png_uint_32 x_pixels_per_unit, png_uint_32 y_pixels_per_unit,
- int unit_type));
-#endif
-
-#if defined(PNG_WRITE_tIME_SUPPORTED)
-PNG_EXTERN void png_write_tIME PNGARG((png_structp png_ptr,
- png_timep mod_time));
-#endif
-
-#if defined(PNG_WRITE_sCAL_SUPPORTED)
-#if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO)
-PNG_EXTERN void png_write_sCAL PNGARG((png_structp png_ptr,
- int unit, double width, double height));
-#else
-#ifdef PNG_FIXED_POINT_SUPPORTED
-PNG_EXTERN void png_write_sCAL_s PNGARG((png_structp png_ptr,
- int unit, png_charp width, png_charp height));
-#endif
-#endif
-#endif
-
-/* Called when finished processing a row of data */
-PNG_EXTERN void png_write_finish_row PNGARG((png_structp png_ptr));
-
-/* Internal use only. Called before first row of data */
-PNG_EXTERN void png_write_start_row PNGARG((png_structp png_ptr));
-
-#if defined(PNG_READ_GAMMA_SUPPORTED)
-PNG_EXTERN void png_build_gamma_table PNGARG((png_structp png_ptr));
-#endif
-
-/* combine a row of data, dealing with alpha, etc. if requested */
-PNG_EXTERN void png_combine_row PNGARG((png_structp png_ptr, png_bytep row,
- int mask));
-
-#if defined(PNG_READ_INTERLACING_SUPPORTED)
-/* expand an interlaced row */
-/* OLD pre-1.0.9 interface:
-PNG_EXTERN void png_do_read_interlace PNGARG((png_row_infop row_info,
- png_bytep row, int pass, png_uint_32 transformations));
- */
-PNG_EXTERN void png_do_read_interlace PNGARG((png_structp png_ptr));
-#endif
-
-/* GRR TO DO (2.0 or whenever): simplify other internal calling interfaces */
-
-#if defined(PNG_WRITE_INTERLACING_SUPPORTED)
-/* grab pixels out of a row for an interlaced pass */
-PNG_EXTERN void png_do_write_interlace PNGARG((png_row_infop row_info,
- png_bytep row, int pass));
-#endif
-
-/* unfilter a row */
-PNG_EXTERN void png_read_filter_row PNGARG((png_structp png_ptr,
- png_row_infop row_info, png_bytep row, png_bytep prev_row, int filter));
-
-/* Choose the best filter to use and filter the row data */
-PNG_EXTERN void png_write_find_filter PNGARG((png_structp png_ptr,
- png_row_infop row_info));
-
-/* Write out the filtered row. */
-PNG_EXTERN void png_write_filtered_row PNGARG((png_structp png_ptr,
- png_bytep filtered_row));
-/* finish a row while reading, dealing with interlacing passes, etc. */
-PNG_EXTERN void png_read_finish_row PNGARG((png_structp png_ptr));
-
-/* initialize the row buffers, etc. */
-PNG_EXTERN void png_read_start_row PNGARG((png_structp png_ptr));
-/* optional call to update the users info structure */
-PNG_EXTERN void png_read_transform_info PNGARG((png_structp png_ptr,
- png_infop info_ptr));
-
-/* these are the functions that do the transformations */
-#if defined(PNG_READ_FILLER_SUPPORTED)
-PNG_EXTERN void png_do_read_filler PNGARG((png_row_infop row_info,
- png_bytep row, png_uint_32 filler, png_uint_32 flags));
-#endif
-
-#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED)
-PNG_EXTERN void png_do_read_swap_alpha PNGARG((png_row_infop row_info,
- png_bytep row));
-#endif
-
-#if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
-PNG_EXTERN void png_do_write_swap_alpha PNGARG((png_row_infop row_info,
- png_bytep row));
-#endif
-
-#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED)
-PNG_EXTERN void png_do_read_invert_alpha PNGARG((png_row_infop row_info,
- png_bytep row));
-#endif
-
-#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
-PNG_EXTERN void png_do_write_invert_alpha PNGARG((png_row_infop row_info,
- png_bytep row));
-#endif
-
-#if defined(PNG_WRITE_FILLER_SUPPORTED) || \
- defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
-PNG_EXTERN void png_do_strip_filler PNGARG((png_row_infop row_info,
- png_bytep row, png_uint_32 flags));
-#endif
-
-#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
-PNG_EXTERN void png_do_swap PNGARG((png_row_infop row_info, png_bytep row));
-#endif
-
-#if defined(PNG_READ_PACKSWAP_SUPPORTED) || defined(PNG_WRITE_PACKSWAP_SUPPORTED)
-PNG_EXTERN void png_do_packswap PNGARG((png_row_infop row_info, png_bytep row));
-#endif
-
-#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
-PNG_EXTERN int png_do_rgb_to_gray PNGARG((png_structp png_ptr, png_row_infop
- row_info, png_bytep row));
-#endif
-
-#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)
-PNG_EXTERN void png_do_gray_to_rgb PNGARG((png_row_infop row_info,
- png_bytep row));
-#endif
-
-#if defined(PNG_READ_PACK_SUPPORTED)
-PNG_EXTERN void png_do_unpack PNGARG((png_row_infop row_info, png_bytep row));
-#endif
-
-#if defined(PNG_READ_SHIFT_SUPPORTED)
-PNG_EXTERN void png_do_unshift PNGARG((png_row_infop row_info, png_bytep row,
- png_color_8p sig_bits));
-#endif
-
-#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
-PNG_EXTERN void png_do_invert PNGARG((png_row_infop row_info, png_bytep row));
-#endif
-
-#if defined(PNG_READ_16_TO_8_SUPPORTED)
-PNG_EXTERN void png_do_chop PNGARG((png_row_infop row_info, png_bytep row));
-#endif
-
-#if defined(PNG_READ_DITHER_SUPPORTED)
-PNG_EXTERN void png_do_dither PNGARG((png_row_infop row_info,
- png_bytep row, png_bytep palette_lookup, png_bytep dither_lookup));
-
-# if defined(PNG_CORRECT_PALETTE_SUPPORTED)
-PNG_EXTERN void png_correct_palette PNGARG((png_structp png_ptr,
- png_colorp palette, int num_palette));
-# endif
-#endif
-
-#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
-PNG_EXTERN void png_do_bgr PNGARG((png_row_infop row_info, png_bytep row));
-#endif
-
-#if defined(PNG_WRITE_PACK_SUPPORTED)
-PNG_EXTERN void png_do_pack PNGARG((png_row_infop row_info,
- png_bytep row, png_uint_32 bit_depth));
-#endif
-
-#if defined(PNG_WRITE_SHIFT_SUPPORTED)
-PNG_EXTERN void png_do_shift PNGARG((png_row_infop row_info, png_bytep row,
- png_color_8p bit_depth));
-#endif
-
-#if defined(PNG_READ_BACKGROUND_SUPPORTED)
-#if defined(PNG_READ_GAMMA_SUPPORTED)
-PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row,
- png_color_16p trans_values, png_color_16p background,
- png_color_16p background_1,
- png_bytep gamma_table, png_bytep gamma_from_1, png_bytep gamma_to_1,
- png_uint_16pp gamma_16, png_uint_16pp gamma_16_from_1,
- png_uint_16pp gamma_16_to_1, int gamma_shift));
-#else
-PNG_EXTERN void png_do_background PNGARG((png_row_infop row_info, png_bytep row,
- png_color_16p trans_values, png_color_16p background));
-#endif
-#endif
-
-#if defined(PNG_READ_GAMMA_SUPPORTED)
-PNG_EXTERN void png_do_gamma PNGARG((png_row_infop row_info, png_bytep row,
- png_bytep gamma_table, png_uint_16pp gamma_16_table,
- int gamma_shift));
-#endif
-
-#if defined(PNG_READ_EXPAND_SUPPORTED)
-PNG_EXTERN void png_do_expand_palette PNGARG((png_row_infop row_info,
- png_bytep row, png_colorp palette, png_bytep trans, int num_trans));
-PNG_EXTERN void png_do_expand PNGARG((png_row_infop row_info,
- png_bytep row, png_color_16p trans_value));
-#endif
-
-/* The following decodes the appropriate chunks, and does error correction,
- * then calls the appropriate callback for the chunk if it is valid.
- */
-
-/* decode the IHDR chunk */
-PNG_EXTERN void png_handle_IHDR PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
-PNG_EXTERN void png_handle_PLTE PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
-PNG_EXTERN void png_handle_IEND PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
-
-#if defined(PNG_READ_bKGD_SUPPORTED)
-PNG_EXTERN void png_handle_bKGD PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
-#endif
-
-#if defined(PNG_READ_cHRM_SUPPORTED)
-PNG_EXTERN void png_handle_cHRM PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
-#endif
-
-#if defined(PNG_READ_gAMA_SUPPORTED)
-PNG_EXTERN void png_handle_gAMA PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
-#endif
-
-#if defined(PNG_READ_hIST_SUPPORTED)
-PNG_EXTERN void png_handle_hIST PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
-#endif
-
-#if defined(PNG_READ_iCCP_SUPPORTED)
-extern void png_handle_iCCP PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
-#endif /* PNG_READ_iCCP_SUPPORTED */
-
-#if defined(PNG_READ_iTXt_SUPPORTED)
-PNG_EXTERN void png_handle_iTXt PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
-#endif
-
-#if defined(PNG_READ_oFFs_SUPPORTED)
-PNG_EXTERN void png_handle_oFFs PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
-#endif
-
-#if defined(PNG_READ_pCAL_SUPPORTED)
-PNG_EXTERN void png_handle_pCAL PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
-#endif
-
-#if defined(PNG_READ_pHYs_SUPPORTED)
-PNG_EXTERN void png_handle_pHYs PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
-#endif
-
-#if defined(PNG_READ_sBIT_SUPPORTED)
-PNG_EXTERN void png_handle_sBIT PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
-#endif
-
-#if defined(PNG_READ_sCAL_SUPPORTED)
-PNG_EXTERN void png_handle_sCAL PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
-#endif
-
-#if defined(PNG_READ_sPLT_SUPPORTED)
-extern void png_handle_sPLT PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
-#endif /* PNG_READ_sPLT_SUPPORTED */
-
-#if defined(PNG_READ_sRGB_SUPPORTED)
-PNG_EXTERN void png_handle_sRGB PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
-#endif
-
-#if defined(PNG_READ_tEXt_SUPPORTED)
-PNG_EXTERN void png_handle_tEXt PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
-#endif
-
-#if defined(PNG_READ_tIME_SUPPORTED)
-PNG_EXTERN void png_handle_tIME PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
-#endif
-
-#if defined(PNG_READ_tRNS_SUPPORTED)
-PNG_EXTERN void png_handle_tRNS PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
-#endif
-
-#if defined(PNG_READ_zTXt_SUPPORTED)
-PNG_EXTERN void png_handle_zTXt PNGARG((png_structp png_ptr, png_infop info_ptr,
- png_uint_32 length));
-#endif
-
-#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
-PNG_EXTERN int png_handle_as_unknown PNGARG((png_structp png_ptr, png_bytep
- chunk_name));
-#endif
-
-PNG_EXTERN void png_handle_unknown PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_uint_32 length));
-
-PNG_EXTERN void png_check_chunk_name PNGARG((png_structp png_ptr,
- png_bytep chunk_name));
-
-/* handle the transformations for reading and writing */
-PNG_EXTERN void png_do_read_transformations PNGARG((png_structp png_ptr));
-PNG_EXTERN void png_do_write_transformations PNGARG((png_structp png_ptr));
-
-PNG_EXTERN void png_init_read_transformations PNGARG((png_structp png_ptr));
-
-#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
-PNG_EXTERN void png_push_read_chunk PNGARG((png_structp png_ptr,
- png_infop info_ptr));
-PNG_EXTERN void png_push_read_sig PNGARG((png_structp png_ptr,
- png_infop info_ptr));
-PNG_EXTERN void png_push_check_crc PNGARG((png_structp png_ptr));
-PNG_EXTERN void png_push_crc_skip PNGARG((png_structp png_ptr,
- png_uint_32 length));
-PNG_EXTERN void png_push_crc_finish PNGARG((png_structp png_ptr));
-PNG_EXTERN void png_push_fill_buffer PNGARG((png_structp png_ptr,
- png_bytep buffer, png_size_t length));
-PNG_EXTERN void png_push_save_buffer PNGARG((png_structp png_ptr));
-PNG_EXTERN void png_push_restore_buffer PNGARG((png_structp png_ptr,
- png_bytep buffer, png_size_t buffer_length));
-PNG_EXTERN void png_push_read_IDAT PNGARG((png_structp png_ptr));
-PNG_EXTERN void png_process_IDAT_data PNGARG((png_structp png_ptr,
- png_bytep buffer, png_size_t buffer_length));
-PNG_EXTERN void png_push_process_row PNGARG((png_structp png_ptr));
-PNG_EXTERN void png_push_handle_unknown PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_uint_32 length));
-PNG_EXTERN void png_push_have_info PNGARG((png_structp png_ptr,
- png_infop info_ptr));
-PNG_EXTERN void png_push_have_end PNGARG((png_structp png_ptr,
- png_infop info_ptr));
-PNG_EXTERN void png_push_have_row PNGARG((png_structp png_ptr, png_bytep row));
-PNG_EXTERN void png_push_read_end PNGARG((png_structp png_ptr,
- png_infop info_ptr));
-PNG_EXTERN void png_process_some_data PNGARG((png_structp png_ptr,
- png_infop info_ptr));
-PNG_EXTERN void png_read_push_finish_row PNGARG((png_structp png_ptr));
-#if defined(PNG_READ_tEXt_SUPPORTED)
-PNG_EXTERN void png_push_handle_tEXt PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_uint_32 length));
-PNG_EXTERN void png_push_read_tEXt PNGARG((png_structp png_ptr,
- png_infop info_ptr));
-#endif
-#if defined(PNG_READ_zTXt_SUPPORTED)
-PNG_EXTERN void png_push_handle_zTXt PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_uint_32 length));
-PNG_EXTERN void png_push_read_zTXt PNGARG((png_structp png_ptr,
- png_infop info_ptr));
-#endif
-#if defined(PNG_READ_iTXt_SUPPORTED)
-PNG_EXTERN void png_push_handle_iTXt PNGARG((png_structp png_ptr,
- png_infop info_ptr, png_uint_32 length));
-PNG_EXTERN void png_push_read_iTXt PNGARG((png_structp png_ptr,
- png_infop info_ptr));
-#endif
-
-#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
-
-#ifdef PNG_MNG_FEATURES_SUPPORTED
-PNG_EXTERN void png_do_read_intrapixel PNGARG((png_row_infop row_info,
- png_bytep row));
-PNG_EXTERN void png_do_write_intrapixel PNGARG((png_row_infop row_info,
- png_bytep row));
-#endif
-
-#if defined(PNG_ASSEMBLER_CODE_SUPPORTED)
-/* png.c */ /* PRIVATE */
-PNG_EXTERN void png_init_mmx_flags PNGARG((png_structp png_ptr));
-#endif
-/* Maintainer: Put new private prototypes here ^ and in libpngpf.3 */
-
-#endif /* PNG_INTERNAL */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* PNG_VERSION_INFO_ONLY */
-/* do not put anything past this line */
-#endif /* PNG_H */
diff --git a/libpng/pngasmrd.h b/libpng/pngasmrd.h
deleted file mode 100644
index b96a464..0000000
--- a/libpng/pngasmrd.h
+++ /dev/null
@@ -1,11 +0,0 @@
-/* pngasmrd.h - assembler version of utilities to read a PNG file
- *
- * libpng 1.2.1 - December 12, 2001
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 2001 Glenn Randers-Pehrson
- *
- */
-
-/* This file is obsolete in libpng-1.0.9 and later; its contents now appear
- * at the end of pngconf.h.
- */
diff --git a/libpng/pngconf.h b/libpng/pngconf.h
deleted file mode 100644
index e482748..0000000
--- a/libpng/pngconf.h
+++ /dev/null
@@ -1,1331 +0,0 @@
-/* pngconf.h - machine configurable file for libpng
- *
- * libpng 1.2.1 - December 12, 2001
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2001 Glenn Randers-Pehrson
- * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
- * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
- */
-
-/* Any machine specific code is near the front of this file, so if you
- * are configuring libpng for a machine, you may want to read the section
- * starting here down to where it starts to typedef png_color, png_text,
- * and png_info.
- */
-
-#ifndef PNGCONF_H
-#define PNGCONF_H
-
-/* This is the size of the compression buffer, and thus the size of
- * an IDAT chunk. Make this whatever size you feel is best for your
- * machine. One of these will be allocated per png_struct. When this
- * is full, it writes the data to the disk, and does some other
- * calculations. Making this an extremely small size will slow
- * the library down, but you may want to experiment to determine
- * where it becomes significant, if you are concerned with memory
- * usage. Note that zlib allocates at least 32Kb also. For readers,
- * this describes the size of the buffer available to read the data in.
- * Unless this gets smaller than the size of a row (compressed),
- * it should not make much difference how big this is.
- */
-
-#ifndef PNG_ZBUF_SIZE
-# define PNG_ZBUF_SIZE 8192
-#endif
-
-/* Enable if you want a write-only libpng */
-
-#ifndef PNG_NO_READ_SUPPORTED
-# define PNG_READ_SUPPORTED
-#endif
-
-/* Enable if you want a read-only libpng */
-
-#ifndef PNG_NO_WRITE_SUPPORTED
-# define PNG_WRITE_SUPPORTED
-#endif
-
-/* Enabled by default in 1.2.0. You can disable this if you don't need to
- support PNGs that are embedded in MNG datastreams */
-#ifndef PNG_NO_MNG_FEATURES
-# ifndef PNG_MNG_FEATURES_SUPPORTED
-# define PNG_MNG_FEATURES_SUPPORTED
-# endif
-#endif
-
-#ifndef PNG_NO_FLOATING_POINT_SUPPORTED
-# ifndef PNG_FLOATING_POINT_SUPPORTED
-# define PNG_FLOATING_POINT_SUPPORTED
-# endif
-#endif
-
-/* If you are running on a machine where you cannot allocate more
- * than 64K of memory at once, uncomment this. While libpng will not
- * normally need that much memory in a chunk (unless you load up a very
- * large file), zlib needs to know how big of a chunk it can use, and
- * libpng thus makes sure to check any memory allocation to verify it
- * will fit into memory.
-#define PNG_MAX_MALLOC_64K
- */
-#if defined(MAXSEG_64K) && !defined(PNG_MAX_MALLOC_64K)
-# define PNG_MAX_MALLOC_64K
-#endif
-
-/* Special munging to support doing things the 'cygwin' way:
- * 'Normal' png-on-win32 defines/defaults:
- * PNG_BUILD_DLL -- building dll
- * PNG_USE_DLL -- building an application, linking to dll
- * (no define) -- building static library, or building an
- * application and linking to the static lib
- * 'Cygwin' defines/defaults:
- * PNG_BUILD_DLL -- building the dll
- * (no define) -- building an application, linking to the dll
- * PNG_STATIC -- building the static lib, or building an application
- * that links to the static lib.
- * ALL_STATIC -- building various static libs, or building an application
- * that links to the static libs.
- * Thus,
- * a cygwin user should define either PNG_BUILD_DLL or PNG_STATIC, and
- * this bit of #ifdefs will define the 'correct' config variables based on
- * that. If a cygwin user *wants* to define 'PNG_USE_DLL' that's okay, but
- * unnecessary.
- *
- * Also, the precedence order is:
- * ALL_STATIC (since we can't #undef something outside our namespace)
- * PNG_BUILD_DLL
- * PNG_STATIC
- * (nothing) == PNG_USE_DLL
- */
-#if defined(__CYGWIN__)
-# if defined(ALL_STATIC)
-# if defined(PNG_BUILD_DLL)
-# undef PNG_BUILD_DLL
-# endif
-# if defined(PNG_USE_DLL)
-# undef PNG_USE_DLL
-# endif
-# if defined(PNG_DLL)
-# undef PNG_DLL
-# endif
-# if !defined(PNG_STATIC)
-# define PNG_STATIC
-# endif
-# else
-# if defined (PNG_BUILD_DLL)
-# if defined(PNG_STATIC)
-# undef PNG_STATIC
-# endif
-# if defined(PNG_USE_DLL)
-# undef PNG_USE_DLL
-# endif
-# if !defined(PNG_DLL)
-# define PNG_DLL
-# endif
-# else
-# if defined(PNG_STATIC)
-# if defined(PNG_USE_DLL)
-# undef PNG_USE_DLL
-# endif
-# if defined(PNG_DLL)
-# undef PNG_DLL
-# endif
-# else
-# if !defined(PNG_USE_DLL)
-# define PNG_USE_DLL
-# endif
-# if !defined(PNG_DLL)
-# define PNG_DLL
-# endif
-# endif
-# endif
-# endif
-#endif
-
-/* This protects us against compilers that run on a windowing system
- * and thus don't have or would rather us not use the stdio types:
- * stdin, stdout, and stderr. The only one currently used is stderr
- * in png_error() and png_warning(). #defining PNG_NO_CONSOLE_IO will
- * prevent these from being compiled and used. #defining PNG_NO_STDIO
- * will also prevent these, plus will prevent the entire set of stdio
- * macros and functions (FILE *, printf, etc.) from being compiled and used,
- * unless (PNG_DEBUG > 0) has been #defined.
- *
- * #define PNG_NO_CONSOLE_IO
- * #define PNG_NO_STDIO
- */
-
-#if defined(_WIN32_WCE)
-# include <windows.h>
- /* Console I/O functions are not supported on WindowsCE */
-# define PNG_NO_CONSOLE_IO
-# ifdef PNG_DEBUG
-# undef PNG_DEBUG
-# endif
-#endif
-
-#ifdef PNG_BUILD_DLL
-# ifndef PNG_CONSOLE_IO_SUPPORTED
-# ifndef PNG_NO_CONSOLE_IO
-# define PNG_NO_CONSOLE_IO
-# endif
-# endif
-#endif
-
-# ifdef PNG_NO_STDIO
-# ifndef PNG_NO_CONSOLE_IO
-# define PNG_NO_CONSOLE_IO
-# endif
-# ifdef PNG_DEBUG
-# if (PNG_DEBUG > 0)
-# include <stdio.h>
-# endif
-# endif
-# else
-# if !defined(_WIN32_WCE)
-/* "stdio.h" functions are not supported on WindowsCE */
-# include <stdio.h>
-# endif
-# endif
-
-/* This macro protects us against machines that don't have function
- * prototypes (ie K&R style headers). If your compiler does not handle
- * function prototypes, define this macro and use the included ansi2knr.
- * I've always been able to use _NO_PROTO as the indicator, but you may
- * need to drag the empty declaration out in front of here, or change the
- * ifdef to suit your own needs.
- */
-#ifndef PNGARG
-
-#ifdef OF /* zlib prototype munger */
-# define PNGARG(arglist) OF(arglist)
-#else
-
-#ifdef _NO_PROTO
-# define PNGARG(arglist) ()
-# ifndef PNG_TYPECAST_NULL
-# define PNG_TYPECAST_NULL
-# endif
-#else
-# define PNGARG(arglist) arglist
-#endif /* _NO_PROTO */
-
-#endif /* OF */
-
-#endif /* PNGARG */
-
-/* Try to determine if we are compiling on a Mac. Note that testing for
- * just __MWERKS__ is not good enough, because the Codewarrior is now used
- * on non-Mac platforms.
- */
-#ifndef MACOS
-# if (defined(__MWERKS__) && defined(macintosh)) || defined(applec) || \
- defined(THINK_C) || defined(__SC__) || defined(TARGET_OS_MAC)
-# define MACOS
-# endif
-#endif
-
-/* enough people need this for various reasons to include it here */
-#if !defined(MACOS) && !defined(RISCOS) && !defined(_WIN32_WCE)
-# include <sys/types.h>
-#endif
-
-#if !defined(PNG_SETJMP_NOT_SUPPORTED) && !defined(PNG_NO_SETJMP_SUPPORTED)
-# define PNG_SETJMP_SUPPORTED
-#endif
-
-#ifdef PNG_SETJMP_SUPPORTED
-/* This is an attempt to force a single setjmp behaviour on Linux. If
- * the X config stuff didn't define _BSD_SOURCE we wouldn't need this.
- */
-
-# ifdef __linux__
-# ifdef _BSD_SOURCE
-# define PNG_SAVE_BSD_SOURCE
-# undef _BSD_SOURCE
-# endif
-# ifdef _SETJMP_H
- __png.h__ already includes setjmp.h;
- __dont__ include it again.;
-# endif
-# endif /* __linux__ */
-
- /* include setjmp.h for error handling */
-# include <setjmp.h>
-
-# ifdef __linux__
-# ifdef PNG_SAVE_BSD_SOURCE
-# define _BSD_SOURCE
-# undef PNG_SAVE_BSD_SOURCE
-# endif
-# endif /* __linux__ */
-#endif /* PNG_SETJMP_SUPPORTED */
-
-#ifdef BSD
-# include <strings.h>
-#else
-# include <string.h>
-#endif
-
-/* Other defines for things like memory and the like can go here. */
-#ifdef PNG_INTERNAL
-
-#include <stdlib.h>
-
-/* The functions exported by PNG_EXTERN are PNG_INTERNAL functions, which
- * aren't usually used outside the library (as far as I know), so it is
- * debatable if they should be exported at all. In the future, when it is
- * possible to have run-time registry of chunk-handling functions, some of
- * these will be made available again.
-#define PNG_EXTERN extern
- */
-#define PNG_EXTERN
-
-/* Other defines specific to compilers can go here. Try to keep
- * them inside an appropriate ifdef/endif pair for portability.
- */
-
-#if defined(PNG_FLOATING_POINT_SUPPORTED)
-# if defined(MACOS)
- /* We need to check that <math.h> hasn't already been included earlier
- * as it seems it doesn't agree with <fp.h>, yet we should really use
- * <fp.h> if possible.
- */
-# if !defined(__MATH_H__) && !defined(__MATH_H) && !defined(__cmath__)
-# include <fp.h>
-# endif
-# else
-# include <math.h>
-# endif
-# if defined(_AMIGA) && defined(__SASC) && defined(_M68881)
- /* Amiga SAS/C: We must include builtin FPU functions when compiling using
- * MATH=68881
- */
-# include <m68881.h>
-# endif
-#endif
-
-/* Codewarrior on NT has linking problems without this. */
-#if (defined(__MWERKS__) && defined(WIN32)) || defined(__STDC__)
-# define PNG_ALWAYS_EXTERN
-#endif
-
-/* For some reason, Borland C++ defines memcmp, etc. in mem.h, not
- * stdlib.h like it should (I think). Or perhaps this is a C++
- * "feature"?
- */
-#ifdef __TURBOC__
-# include <mem.h>
-# include "alloc.h"
-#endif
-
-#if defined(_MSC_VER) && (defined(WIN32) || defined(_Windows) || \
- defined(_WINDOWS) || defined(_WIN32) || defined(__WIN32__))
-# include <malloc.h>
-#endif
-
-/* This controls how fine the dithering gets. As this allocates
- * a largish chunk of memory (32K), those who are not as concerned
- * with dithering quality can decrease some or all of these.
- */
-#ifndef PNG_DITHER_RED_BITS
-# define PNG_DITHER_RED_BITS 5
-#endif
-#ifndef PNG_DITHER_GREEN_BITS
-# define PNG_DITHER_GREEN_BITS 5
-#endif
-#ifndef PNG_DITHER_BLUE_BITS
-# define PNG_DITHER_BLUE_BITS 5
-#endif
-
-/* This controls how fine the gamma correction becomes when you
- * are only interested in 8 bits anyway. Increasing this value
- * results in more memory being used, and more pow() functions
- * being called to fill in the gamma tables. Don't set this value
- * less then 8, and even that may not work (I haven't tested it).
- */
-
-#ifndef PNG_MAX_GAMMA_8
-# define PNG_MAX_GAMMA_8 11
-#endif
-
-/* This controls how much a difference in gamma we can tolerate before
- * we actually start doing gamma conversion.
- */
-#ifndef PNG_GAMMA_THRESHOLD
-# define PNG_GAMMA_THRESHOLD 0.05
-#endif
-
-#endif /* PNG_INTERNAL */
-
-/* The following uses const char * instead of char * for error
- * and warning message functions, so some compilers won't complain.
- * If you do not want to use const, define PNG_NO_CONST here.
- */
-
-#ifndef PNG_NO_CONST
-# define PNG_CONST const
-#else
-# define PNG_CONST
-#endif
-
-/* The following defines give you the ability to remove code from the
- * library that you will not be using. I wish I could figure out how to
- * automate this, but I can't do that without making it seriously hard
- * on the users. So if you are not using an ability, change the #define
- * to and #undef, and that part of the library will not be compiled. If
- * your linker can't find a function, you may want to make sure the
- * ability is defined here. Some of these depend upon some others being
- * defined. I haven't figured out all the interactions here, so you may
- * have to experiment awhile to get everything to compile. If you are
- * creating or using a shared library, you probably shouldn't touch this,
- * as it will affect the size of the structures, and this will cause bad
- * things to happen if the library and/or application ever change.
- */
-
-/* Any features you will not be using can be undef'ed here */
-
-/* GR-P, 0.96a: Set "*TRANSFORMS_SUPPORTED as default but allow user
- * to turn it off with "*TRANSFORMS_NOT_SUPPORTED" or *PNG_NO_*_TRANSFORMS
- * on the compile line, then pick and choose which ones to define without
- * having to edit this file. It is safe to use the *TRANSFORMS_NOT_SUPPORTED
- * if you only want to have a png-compliant reader/writer but don't need
- * any of the extra transformations. This saves about 80 kbytes in a
- * typical installation of the library. (PNG_NO_* form added in version
- * 1.0.1c, for consistency)
- */
-
-/* The size of the png_text structure changed in libpng-1.0.6 when
- * iTXt is supported. It is turned off by default, to support old apps
- * that malloc the png_text structure instead of calling png_set_text()
- * and letting libpng malloc it. It will be turned on by default in
- * libpng-1.3.0.
- */
-
-#ifndef PNG_iTXt_SUPPORTED
-# if !defined(PNG_READ_iTXt_SUPPORTED) && !defined(PNG_NO_READ_iTXt)
-# define PNG_NO_READ_iTXt
-# endif
-# if !defined(PNG_WRITE_iTXt_SUPPORTED) && !defined(PNG_NO_WRITE_iTXt)
-# define PNG_NO_WRITE_iTXt
-# endif
-#endif
-
-/* The following support, added after version 1.0.0, can be turned off here en
- * masse by defining PNG_LEGACY_SUPPORTED in case you need binary compatibility
- * with old applications that require the length of png_struct and png_info
- * to remain unchanged.
- */
-
-#ifdef PNG_LEGACY_SUPPORTED
-# define PNG_NO_FREE_ME
-# define PNG_NO_READ_UNKNOWN_CHUNKS
-# define PNG_NO_WRITE_UNKNOWN_CHUNKS
-# define PNG_NO_READ_USER_CHUNKS
-# define PNG_NO_READ_iCCP
-# define PNG_NO_WRITE_iCCP
-# define PNG_NO_READ_iTXt
-# define PNG_NO_WRITE_iTXt
-# define PNG_NO_READ_sCAL
-# define PNG_NO_WRITE_sCAL
-# define PNG_NO_READ_sPLT
-# define PNG_NO_WRITE_sPLT
-# define PNG_NO_INFO_IMAGE
-# define PNG_NO_READ_RGB_TO_GRAY
-# define PNG_NO_READ_USER_TRANSFORM
-# define PNG_NO_WRITE_USER_TRANSFORM
-# define PNG_NO_USER_MEM
-# define PNG_NO_READ_EMPTY_PLTE
-# define PNG_NO_MNG_FEATURES
-# define PNG_NO_FIXED_POINT_SUPPORTED
-#endif
-
-/* Ignore attempt to turn off both floating and fixed point support */
-#if !defined(PNG_FLOATING_POINT_SUPPORTED) || \
- !defined(PNG_NO_FIXED_POINT_SUPPORTED)
-# define PNG_FIXED_POINT_SUPPORTED
-#endif
-
-#ifndef PNG_NO_FREE_ME
-# define PNG_FREE_ME_SUPPORTED
-#endif
-
-#if defined(PNG_READ_SUPPORTED)
-
-#if !defined(PNG_READ_TRANSFORMS_NOT_SUPPORTED) && \
- !defined(PNG_NO_READ_TRANSFORMS)
-# define PNG_READ_TRANSFORMS_SUPPORTED
-#endif
-
-#ifdef PNG_READ_TRANSFORMS_SUPPORTED
-# ifndef PNG_NO_READ_EXPAND
-# define PNG_READ_EXPAND_SUPPORTED
-# endif
-# ifndef PNG_NO_READ_SHIFT
-# define PNG_READ_SHIFT_SUPPORTED
-# endif
-# ifndef PNG_NO_READ_PACK
-# define PNG_READ_PACK_SUPPORTED
-# endif
-# ifndef PNG_NO_READ_BGR
-# define PNG_READ_BGR_SUPPORTED
-# endif
-# ifndef PNG_NO_READ_SWAP
-# define PNG_READ_SWAP_SUPPORTED
-# endif
-# ifndef PNG_NO_READ_PACKSWAP
-# define PNG_READ_PACKSWAP_SUPPORTED
-# endif
-# ifndef PNG_NO_READ_INVERT
-# define PNG_READ_INVERT_SUPPORTED
-# endif
-# ifndef PNG_NO_READ_DITHER
-# define PNG_READ_DITHER_SUPPORTED
-# endif
-# ifndef PNG_NO_READ_BACKGROUND
-# define PNG_READ_BACKGROUND_SUPPORTED
-# endif
-# ifndef PNG_NO_READ_16_TO_8
-# define PNG_READ_16_TO_8_SUPPORTED
-# endif
-# ifndef PNG_NO_READ_FILLER
-# define PNG_READ_FILLER_SUPPORTED
-# endif
-# ifndef PNG_NO_READ_GAMMA
-# define PNG_READ_GAMMA_SUPPORTED
-# endif
-# ifndef PNG_NO_READ_GRAY_TO_RGB
-# define PNG_READ_GRAY_TO_RGB_SUPPORTED
-# endif
-# ifndef PNG_NO_READ_SWAP_ALPHA
-# define PNG_READ_SWAP_ALPHA_SUPPORTED
-# endif
-# ifndef PNG_NO_READ_INVERT_ALPHA
-# define PNG_READ_INVERT_ALPHA_SUPPORTED
-# endif
-# ifndef PNG_NO_READ_STRIP_ALPHA
-# define PNG_READ_STRIP_ALPHA_SUPPORTED
-# endif
-# ifndef PNG_NO_READ_USER_TRANSFORM
-# define PNG_READ_USER_TRANSFORM_SUPPORTED
-# endif
-# ifndef PNG_NO_READ_RGB_TO_GRAY
-# define PNG_READ_RGB_TO_GRAY_SUPPORTED
-# endif
-#endif /* PNG_READ_TRANSFORMS_SUPPORTED */
-
-#if !defined(PNG_NO_PROGRESSIVE_READ) && \
- !defined(PNG_PROGRESSIVE_READ_NOT_SUPPORTED) /* if you don't do progressive */
-# define PNG_PROGRESSIVE_READ_SUPPORTED /* reading. This is not talking */
-#endif /* about interlacing capability! You'll */
- /* still have interlacing unless you change the following line: */
-
-#define PNG_READ_INTERLACING_SUPPORTED /* required for PNG-compliant decoders */
-
-#ifndef PNG_NO_READ_COMPOSITE_NODIV
-# ifndef PNG_NO_READ_COMPOSITED_NODIV /* libpng-1.0.x misspelling */
-# define PNG_READ_COMPOSITE_NODIV_SUPPORTED /* well tested on Intel, SGI */
-# endif
-#endif
-
-/* Deprecated, will be removed from version 2.0.0.
- Use PNG_MNG_FEATURES_SUPPORTED instead. */
-#ifndef PNG_NO_READ_EMPTY_PLTE
-# define PNG_READ_EMPTY_PLTE_SUPPORTED
-#endif
-
-#endif /* PNG_READ_SUPPORTED */
-
-#if defined(PNG_WRITE_SUPPORTED)
-
-# if !defined(PNG_WRITE_TRANSFORMS_NOT_SUPPORTED) && \
- !defined(PNG_NO_WRITE_TRANSFORMS)
-# define PNG_WRITE_TRANSFORMS_SUPPORTED
-#endif
-
-#ifdef PNG_WRITE_TRANSFORMS_SUPPORTED
-# ifndef PNG_NO_WRITE_SHIFT
-# define PNG_WRITE_SHIFT_SUPPORTED
-# endif
-# ifndef PNG_NO_WRITE_PACK
-# define PNG_WRITE_PACK_SUPPORTED
-# endif
-# ifndef PNG_NO_WRITE_BGR
-# define PNG_WRITE_BGR_SUPPORTED
-# endif
-# ifndef PNG_NO_WRITE_SWAP
-# define PNG_WRITE_SWAP_SUPPORTED
-# endif
-# ifndef PNG_NO_WRITE_PACKSWAP
-# define PNG_WRITE_PACKSWAP_SUPPORTED
-# endif
-# ifndef PNG_NO_WRITE_INVERT
-# define PNG_WRITE_INVERT_SUPPORTED
-# endif
-# ifndef PNG_NO_WRITE_FILLER
-# define PNG_WRITE_FILLER_SUPPORTED /* same as WRITE_STRIP_ALPHA */
-# endif
-# ifndef PNG_NO_WRITE_SWAP_ALPHA
-# define PNG_WRITE_SWAP_ALPHA_SUPPORTED
-# endif
-# ifndef PNG_NO_WRITE_INVERT_ALPHA
-# define PNG_WRITE_INVERT_ALPHA_SUPPORTED
-# endif
-# ifndef PNG_NO_WRITE_USER_TRANSFORM
-# define PNG_WRITE_USER_TRANSFORM_SUPPORTED
-# endif
-#endif /* PNG_WRITE_TRANSFORMS_SUPPORTED */
-
-#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
- defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
-# ifndef PNG_NO_USER_TRANSFORM_PTR
-# define PNG_USER_TRANSFORM_PTR_SUPPORTED
-# endif
-#endif
-
-#define PNG_WRITE_INTERLACING_SUPPORTED /* not required for PNG-compliant
- encoders, but can cause trouble
- if left undefined */
-
-#if !defined(PNG_NO_WRITE_WEIGHTED_FILTER) && \
- defined(PNG_FLOATING_POINT_SUPPORTED)
-# define PNG_WRITE_WEIGHTED_FILTER_SUPPORTED
-#endif
-
-#ifndef PNG_NO_ERROR_NUMBERS
-#define PNG_ERROR_NUMBERS_SUPPORTED
-#endif
-
-#ifndef PNG_NO_WRITE_FLUSH
-# define PNG_WRITE_FLUSH_SUPPORTED
-#endif
-
-/* Deprecated, see PNG_MNG_FEATURES_SUPPORTED, above */
-#ifndef PNG_NO_WRITE_EMPTY_PLTE
-# define PNG_WRITE_EMPTY_PLTE_SUPPORTED
-#endif
-
-#endif /* PNG_WRITE_SUPPORTED */
-
-#ifndef PNG_NO_STDIO
-# define PNG_TIME_RFC1123_SUPPORTED
-#endif
-
-/* This adds extra functions in pngget.c for accessing data from the
- * info pointer (added in version 0.99)
- * png_get_image_width()
- * png_get_image_height()
- * png_get_bit_depth()
- * png_get_color_type()
- * png_get_compression_type()
- * png_get_filter_type()
- * png_get_interlace_type()
- * png_get_pixel_aspect_ratio()
- * png_get_pixels_per_meter()
- * png_get_x_offset_pixels()
- * png_get_y_offset_pixels()
- * png_get_x_offset_microns()
- * png_get_y_offset_microns()
- */
-#if !defined(PNG_NO_EASY_ACCESS) && !defined(PNG_EASY_ACCESS_SUPPORTED)
-# define PNG_EASY_ACCESS_SUPPORTED
-#endif
-
-/* PNG_ASSEMBLER_CODE was enabled by default in version 1.2.0
- even when PNG_USE_PNGVCRD or PNG_USE_PNGGCCRD is not defined */
-#if defined(PNG_READ_SUPPORTED) && !defined(PNG_NO_ASSEMBLER_CODE)
-# ifndef PNG_ASSEMBLER_CODE_SUPPORTED
-# define PNG_ASSEMBLER_CODE_SUPPORTED
-# endif
-# if !defined(PNG_MMX_CODE_SUPPORTED) && !defined(PNG_NO_MMX_CODE)
-# define PNG_MMX_CODE_SUPPORTED
-# endif
-#endif
-
-/* If you are sure that you don't need thread safety and you are compiling
- with PNG_USE_PNGCCRD for an MMX application, you can define this for
- faster execution. See pnggccrd.c.
-#define PNG_THREAD_UNSAFE_OK
-*/
-
-#if !defined(PNG_NO_USER_MEM) && !defined(PNG_USER_MEM_SUPPORTED)
-# define PNG_USER_MEM_SUPPORTED
-#endif
-
-/* These are currently experimental features, define them if you want */
-
-/* very little testing */
-/*
-#ifdef PNG_READ_SUPPORTED
-# ifndef PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED
-# define PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED
-# endif
-#endif
-*/
-
-/* This is only for PowerPC big-endian and 680x0 systems */
-/* some testing */
-/*
-#ifdef PNG_READ_SUPPORTED
-# ifndef PNG_PNG_READ_BIG_ENDIAN_SUPPORTED
-# define PNG_READ_BIG_ENDIAN_SUPPORTED
-# endif
-#endif
-*/
-
-/* Buggy compilers (e.g., gcc 2.7.2.2) need this */
-/*
-#define PNG_NO_POINTER_INDEXING
-*/
-
-/* These functions are turned off by default, as they will be phased out. */
-/*
-#define PNG_USELESS_TESTS_SUPPORTED
-#define PNG_CORRECT_PALETTE_SUPPORTED
-*/
-
-/* Any chunks you are not interested in, you can undef here. The
- * ones that allocate memory may be expecially important (hIST,
- * tEXt, zTXt, tRNS, pCAL). Others will just save time and make png_info
- * a bit smaller.
- */
-
-#if defined(PNG_READ_SUPPORTED) && \
- !defined(PNG_READ_ANCILLARY_CHUNKS_NOT_SUPPORTED) && \
- !defined(PNG_NO_READ_ANCILLARY_CHUNKS)
-# define PNG_READ_ANCILLARY_CHUNKS_SUPPORTED
-#endif
-
-#if defined(PNG_WRITE_SUPPORTED) && \
- !defined(PNG_WRITE_ANCILLARY_CHUNKS_NOT_SUPPORTED) && \
- !defined(PNG_NO_WRITE_ANCILLARY_CHUNKS)
-# define PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED
-#endif
-
-#ifdef PNG_READ_ANCILLARY_CHUNKS_SUPPORTED
-
-#ifdef PNG_NO_READ_TEXT
-# define PNG_NO_READ_iTXt
-# define PNG_NO_READ_tEXt
-# define PNG_NO_READ_zTXt
-#endif
-#ifndef PNG_NO_READ_bKGD
-# define PNG_READ_bKGD_SUPPORTED
-# define PNG_bKGD_SUPPORTED
-#endif
-#ifndef PNG_NO_READ_cHRM
-# define PNG_READ_cHRM_SUPPORTED
-# define PNG_cHRM_SUPPORTED
-#endif
-#ifndef PNG_NO_READ_gAMA
-# define PNG_READ_gAMA_SUPPORTED
-# define PNG_gAMA_SUPPORTED
-#endif
-#ifndef PNG_NO_READ_hIST
-# define PNG_READ_hIST_SUPPORTED
-# define PNG_hIST_SUPPORTED
-#endif
-#ifndef PNG_NO_READ_iCCP
-# define PNG_READ_iCCP_SUPPORTED
-# define PNG_iCCP_SUPPORTED
-#endif
-#ifndef PNG_NO_READ_iTXt
-# ifndef PNG_READ_iTXt_SUPPORTED
-# define PNG_READ_iTXt_SUPPORTED
-# endif
-# ifndef PNG_iTXt_SUPPORTED
-# define PNG_iTXt_SUPPORTED
-# endif
-#endif
-#ifndef PNG_NO_READ_oFFs
-# define PNG_READ_oFFs_SUPPORTED
-# define PNG_oFFs_SUPPORTED
-#endif
-#ifndef PNG_NO_READ_pCAL
-# define PNG_READ_pCAL_SUPPORTED
-# define PNG_pCAL_SUPPORTED
-#endif
-#ifndef PNG_NO_READ_sCAL
-# define PNG_READ_sCAL_SUPPORTED
-# define PNG_sCAL_SUPPORTED
-#endif
-#ifndef PNG_NO_READ_pHYs
-# define PNG_READ_pHYs_SUPPORTED
-# define PNG_pHYs_SUPPORTED
-#endif
-#ifndef PNG_NO_READ_sBIT
-# define PNG_READ_sBIT_SUPPORTED
-# define PNG_sBIT_SUPPORTED
-#endif
-#ifndef PNG_NO_READ_sPLT
-# define PNG_READ_sPLT_SUPPORTED
-# define PNG_sPLT_SUPPORTED
-#endif
-#ifndef PNG_NO_READ_sRGB
-# define PNG_READ_sRGB_SUPPORTED
-# define PNG_sRGB_SUPPORTED
-#endif
-#ifndef PNG_NO_READ_tEXt
-# define PNG_READ_tEXt_SUPPORTED
-# define PNG_tEXt_SUPPORTED
-#endif
-#ifndef PNG_NO_READ_tIME
-# define PNG_READ_tIME_SUPPORTED
-# define PNG_tIME_SUPPORTED
-#endif
-#ifndef PNG_NO_READ_tRNS
-# define PNG_READ_tRNS_SUPPORTED
-# define PNG_tRNS_SUPPORTED
-#endif
-#ifndef PNG_NO_READ_zTXt
-# define PNG_READ_zTXt_SUPPORTED
-# define PNG_zTXt_SUPPORTED
-#endif
-#ifndef PNG_NO_READ_UNKNOWN_CHUNKS
-# define PNG_READ_UNKNOWN_CHUNKS_SUPPORTED
-# ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED
-# define PNG_UNKNOWN_CHUNKS_SUPPORTED
-# endif
-# ifndef PNG_NO_HANDLE_AS_UNKNOWN
-# define PNG_HANDLE_AS_UNKNOWN_SUPPORTED
-# endif
-#endif
-#if !defined(PNG_NO_READ_USER_CHUNKS) && \
- defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
-# define PNG_READ_USER_CHUNKS_SUPPORTED
-# define PNG_USER_CHUNKS_SUPPORTED
-# ifdef PNG_NO_READ_UNKNOWN_CHUNKS
-# undef PNG_NO_READ_UNKNOWN_CHUNKS
-# endif
-# ifdef PNG_NO_HANDLE_AS_UNKNOWN
-# undef PNG_NO_HANDLE_AS_UNKNOWN
-# endif
-#endif
-#ifndef PNG_NO_READ_OPT_PLTE
-# define PNG_READ_OPT_PLTE_SUPPORTED /* only affects support of the */
-#endif /* optional PLTE chunk in RGB and RGBA images */
-#if defined(PNG_READ_iTXt_SUPPORTED) || defined(PNG_READ_tEXt_SUPPORTED) || \
- defined(PNG_READ_zTXt_SUPPORTED)
-# define PNG_READ_TEXT_SUPPORTED
-# define PNG_TEXT_SUPPORTED
-#endif
-
-#endif /* PNG_READ_ANCILLARY_CHUNKS_SUPPORTED */
-
-#ifdef PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED
-
-#ifdef PNG_NO_WRITE_TEXT
-# define PNG_NO_WRITE_iTXt
-# define PNG_NO_WRITE_tEXt
-# define PNG_NO_WRITE_zTXt
-#endif
-#ifndef PNG_NO_WRITE_bKGD
-# define PNG_WRITE_bKGD_SUPPORTED
-# ifndef PNG_bKGD_SUPPORTED
-# define PNG_bKGD_SUPPORTED
-# endif
-#endif
-#ifndef PNG_NO_WRITE_cHRM
-# define PNG_WRITE_cHRM_SUPPORTED
-# ifndef PNG_cHRM_SUPPORTED
-# define PNG_cHRM_SUPPORTED
-# endif
-#endif
-#ifndef PNG_NO_WRITE_gAMA
-# define PNG_WRITE_gAMA_SUPPORTED
-# ifndef PNG_gAMA_SUPPORTED
-# define PNG_gAMA_SUPPORTED
-# endif
-#endif
-#ifndef PNG_NO_WRITE_hIST
-# define PNG_WRITE_hIST_SUPPORTED
-# ifndef PNG_hIST_SUPPORTED
-# define PNG_hIST_SUPPORTED
-# endif
-#endif
-#ifndef PNG_NO_WRITE_iCCP
-# define PNG_WRITE_iCCP_SUPPORTED
-# ifndef PNG_iCCP_SUPPORTED
-# define PNG_iCCP_SUPPORTED
-# endif
-#endif
-#ifndef PNG_NO_WRITE_iTXt
-# ifndef PNG_WRITE_iTXt_SUPPORTED
-# define PNG_WRITE_iTXt_SUPPORTED
-# endif
-# ifndef PNG_iTXt_SUPPORTED
-# define PNG_iTXt_SUPPORTED
-# endif
-#endif
-#ifndef PNG_NO_WRITE_oFFs
-# define PNG_WRITE_oFFs_SUPPORTED
-# ifndef PNG_oFFs_SUPPORTED
-# define PNG_oFFs_SUPPORTED
-# endif
-#endif
-#ifndef PNG_NO_WRITE_pCAL
-# define PNG_WRITE_pCAL_SUPPORTED
-# ifndef PNG_pCAL_SUPPORTED
-# define PNG_pCAL_SUPPORTED
-# endif
-#endif
-#ifndef PNG_NO_WRITE_sCAL
-# define PNG_WRITE_sCAL_SUPPORTED
-# ifndef PNG_sCAL_SUPPORTED
-# define PNG_sCAL_SUPPORTED
-# endif
-#endif
-#ifndef PNG_NO_WRITE_pHYs
-# define PNG_WRITE_pHYs_SUPPORTED
-# ifndef PNG_pHYs_SUPPORTED
-# define PNG_pHYs_SUPPORTED
-# endif
-#endif
-#ifndef PNG_NO_WRITE_sBIT
-# define PNG_WRITE_sBIT_SUPPORTED
-# ifndef PNG_sBIT_SUPPORTED
-# define PNG_sBIT_SUPPORTED
-# endif
-#endif
-#ifndef PNG_NO_WRITE_sPLT
-# define PNG_WRITE_sPLT_SUPPORTED
-# ifndef PNG_sPLT_SUPPORTED
-# define PNG_sPLT_SUPPORTED
-# endif
-#endif
-#ifndef PNG_NO_WRITE_sRGB
-# define PNG_WRITE_sRGB_SUPPORTED
-# ifndef PNG_sRGB_SUPPORTED
-# define PNG_sRGB_SUPPORTED
-# endif
-#endif
-#ifndef PNG_NO_WRITE_tEXt
-# define PNG_WRITE_tEXt_SUPPORTED
-# ifndef PNG_tEXt_SUPPORTED
-# define PNG_tEXt_SUPPORTED
-# endif
-#endif
-#ifndef PNG_NO_WRITE_tIME
-# define PNG_WRITE_tIME_SUPPORTED
-# ifndef PNG_tIME_SUPPORTED
-# define PNG_tIME_SUPPORTED
-# endif
-#endif
-#ifndef PNG_NO_WRITE_tRNS
-# define PNG_WRITE_tRNS_SUPPORTED
-# ifndef PNG_tRNS_SUPPORTED
-# define PNG_tRNS_SUPPORTED
-# endif
-#endif
-#ifndef PNG_NO_WRITE_zTXt
-# define PNG_WRITE_zTXt_SUPPORTED
-# ifndef PNG_zTXt_SUPPORTED
-# define PNG_zTXt_SUPPORTED
-# endif
-#endif
-#ifndef PNG_NO_WRITE_UNKNOWN_CHUNKS
-# define PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED
-# ifndef PNG_UNKNOWN_CHUNKS_SUPPORTED
-# define PNG_UNKNOWN_CHUNKS_SUPPORTED
-# endif
-# ifndef PNG_NO_HANDLE_AS_UNKNOWN
-# ifndef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
-# define PNG_HANDLE_AS_UNKNOWN_SUPPORTED
-# endif
-# endif
-#endif
-#if defined(PNG_WRITE_iTXt_SUPPORTED) || defined(PNG_WRITE_tEXt_SUPPORTED) || \
- defined(PNG_WRITE_zTXt_SUPPORTED)
-# define PNG_WRITE_TEXT_SUPPORTED
-# ifndef PNG_TEXT_SUPPORTED
-# define PNG_TEXT_SUPPORTED
-# endif
-#endif
-
-#endif /* PNG_WRITE_ANCILLARY_CHUNKS_SUPPORTED */
-
-/* Turn this off to disable png_read_png() and
- * png_write_png() and leave the row_pointers member
- * out of the info structure.
- */
-#ifndef PNG_NO_INFO_IMAGE
-# define PNG_INFO_IMAGE_SUPPORTED
-#endif
-
-/* need the time information for reading tIME chunks */
-#if defined(PNG_tIME_SUPPORTED)
-# if !defined(_WIN32_WCE)
- /* "time.h" functions are not supported on WindowsCE */
-# include <time.h>
-# endif
-#endif
-
-/* Some typedefs to get us started. These should be safe on most of the
- * common platforms. The typedefs should be at least as large as the
- * numbers suggest (a png_uint_32 must be at least 32 bits long), but they
- * don't have to be exactly that size. Some compilers dislike passing
- * unsigned shorts as function parameters, so you may be better off using
- * unsigned int for png_uint_16. Likewise, for 64-bit systems, you may
- * want to have unsigned int for png_uint_32 instead of unsigned long.
- */
-
-typedef unsigned long png_uint_32;
-typedef long png_int_32;
-typedef unsigned short png_uint_16;
-typedef short png_int_16;
-typedef unsigned char png_byte;
-
-/* This is usually size_t. It is typedef'ed just in case you need it to
- change (I'm not sure if you will or not, so I thought I'd be safe) */
-typedef size_t png_size_t;
-
-/* The following is needed for medium model support. It cannot be in the
- * PNG_INTERNAL section. Needs modification for other compilers besides
- * MSC. Model independent support declares all arrays and pointers to be
- * large using the far keyword. The zlib version used must also support
- * model independent data. As of version zlib 1.0.4, the necessary changes
- * have been made in zlib. The USE_FAR_KEYWORD define triggers other
- * changes that are needed. (Tim Wegner)
- */
-
-/* Separate compiler dependencies (problem here is that zlib.h always
- defines FAR. (SJT) */
-#ifdef __BORLANDC__
-# if defined(__LARGE__) || defined(__HUGE__) || defined(__COMPACT__)
-# define LDATA 1
-# else
-# define LDATA 0
-# endif
- /* GRR: why is Cygwin in here? Cygwin is not Borland C... */
-# if !defined(__WIN32__) && !defined(__FLAT__) && !defined(__CYGWIN__)
-# define PNG_MAX_MALLOC_64K
-# if (LDATA != 1)
-# ifndef FAR
-# define FAR __far
-# endif
-# define USE_FAR_KEYWORD
-# endif /* LDATA != 1 */
- /* Possibly useful for moving data out of default segment.
- * Uncomment it if you want. Could also define FARDATA as
- * const if your compiler supports it. (SJT)
-# define FARDATA FAR
- */
-# endif /* __WIN32__, __FLAT__, __CYGWIN__ */
-#endif /* __BORLANDC__ */
-
-
-/* Suggest testing for specific compiler first before testing for
- * FAR. The Watcom compiler defines both __MEDIUM__ and M_I86MM,
- * making reliance oncertain keywords suspect. (SJT)
- */
-
-/* MSC Medium model */
-#if defined(FAR)
-# if defined(M_I86MM)
-# define USE_FAR_KEYWORD
-# define FARDATA FAR
-# include <dos.h>
-# endif
-#endif
-
-/* SJT: default case */
-#ifndef FAR
-# define FAR
-#endif
-
-/* At this point FAR is always defined */
-#ifndef FARDATA
-# define FARDATA
-#endif
-
-/* Typedef for floating-point numbers that are converted
- to fixed-point with a multiple of 100,000, e.g., int_gamma */
-typedef png_int_32 png_fixed_point;
-
-/* Add typedefs for pointers */
-typedef void FAR * png_voidp;
-typedef png_byte FAR * png_bytep;
-typedef png_uint_32 FAR * png_uint_32p;
-typedef png_int_32 FAR * png_int_32p;
-typedef png_uint_16 FAR * png_uint_16p;
-typedef png_int_16 FAR * png_int_16p;
-typedef PNG_CONST char FAR * png_const_charp;
-typedef char FAR * png_charp;
-typedef png_fixed_point FAR * png_fixed_point_p;
-
-#ifndef PNG_NO_STDIO
-#if defined(_WIN32_WCE)
-typedef HANDLE png_FILE_p;
-#else
-typedef FILE * png_FILE_p;
-#endif
-#endif
-
-#ifdef PNG_FLOATING_POINT_SUPPORTED
-typedef double FAR * png_doublep;
-#endif
-
-/* Pointers to pointers; i.e. arrays */
-typedef png_byte FAR * FAR * png_bytepp;
-typedef png_uint_32 FAR * FAR * png_uint_32pp;
-typedef png_int_32 FAR * FAR * png_int_32pp;
-typedef png_uint_16 FAR * FAR * png_uint_16pp;
-typedef png_int_16 FAR * FAR * png_int_16pp;
-typedef PNG_CONST char FAR * FAR * png_const_charpp;
-typedef char FAR * FAR * png_charpp;
-typedef png_fixed_point FAR * FAR * png_fixed_point_pp;
-#ifdef PNG_FLOATING_POINT_SUPPORTED
-typedef double FAR * FAR * png_doublepp;
-#endif
-
-/* Pointers to pointers to pointers; i.e., pointer to array */
-typedef char FAR * FAR * FAR * png_charppp;
-
-/* libpng typedefs for types in zlib. If zlib changes
- * or another compression library is used, then change these.
- * Eliminates need to change all the source files.
- */
-typedef charf * png_zcharp;
-typedef charf * FAR * png_zcharpp;
-typedef z_stream FAR * png_zstreamp;
-
-/*
- * Define PNG_BUILD_DLL if the module being built is a Windows
- * LIBPNG DLL.
- *
- * Define PNG_USE_DLL if you want to *link* to the Windows LIBPNG DLL.
- * It is equivalent to Microsoft predefined macro _DLL that is
- * automatically defined when you compile using the share
- * version of the CRT (C Run-Time library)
- *
- * The cygwin mods make this behavior a little different:
- * Define PNG_BUILD_DLL if you are building a dll for use with cygwin
- * Define PNG_STATIC if you are building a static library for use with cygwin,
- * -or- if you are building an application that you want to link to the
- * static library.
- * PNG_USE_DLL is defined by default (no user action needed) unless one of
- * the other flags is defined.
- */
-
-#if !defined(PNG_DLL) && (defined(PNG_BUILD_DLL) || defined(PNG_USE_DLL))
-# define PNG_DLL
-#endif
-/* If CYGWIN, then disallow GLOBAL ARRAYS unless building a static lib.
- * When building a static lib, default to no GLOBAL ARRAYS, but allow
- * command-line override
- */
-#if defined(__CYGWIN__)
-# if !defined(PNG_STATIC)
-# if defined(PNG_USE_GLOBAL_ARRAYS)
-# undef PNG_USE_GLOBAL_ARRAYS
-# endif
-# if !defined(PNG_USE_LOCAL_ARRAYS)
-# define PNG_USE_LOCAL_ARRAYS
-# endif
-# else
-# if defined(PNG_USE_LOCAL_ARRAYS) || defined(PNG_NO_GLOBAL_ARRAYS)
-# if defined(PNG_USE_GLOBAL_ARRAYS)
-# undef PNG_USE_GLOBAL_ARRAYS
-# endif
-# endif
-# endif
-# if !defined(PNG_USE_LOCAL_ARRAYS) && !defined(PNG_USE_GLOBAL_ARRAYS)
-# define PNG_USE_LOCAL_ARRAYS
-# endif
-#endif
-
-/* Do not use global arrays (helps with building DLL's)
- * They are no longer used in libpng itself, since version 1.0.5c,
- * but might be required for some pre-1.0.5c applications.
- */
-#if !defined(PNG_USE_LOCAL_ARRAYS) && !defined(PNG_USE_GLOBAL_ARRAYS)
-# if defined(PNG_NO_GLOBAL_ARRAYS) || (defined(__GNUC__) && defined(PNG_DLL))
-# define PNG_USE_LOCAL_ARRAYS
-# else
-# define PNG_USE_GLOBAL_ARRAYS
-# endif
-#endif
-
-
-#ifndef PNGAPI
-
-#if defined(__MINGW32__) || defined(__CYGWIN__) && !defined(PNG_MODULEDEF)
-# ifndef PNG_NO_MODULEDEF
-# define PNG_NO_MODULEDEF
-# endif
-#endif
-
-#if !defined(PNG_IMPEXP) && defined(PNG_BUILD_DLL) && !defined(PNG_NO_MODULEDEF)
-# define PNG_IMPEXP
-#endif
-
-#if defined(PNG_DLL) || defined(_DLL) || defined(__DLL__ ) || \
- (( defined(_Windows) || defined(_WINDOWS) || \
- defined(WIN32) || defined(_WIN32) || defined(__WIN32__) \
- ) && !defined(__CYGWIN__))
-
-# if defined(__GNUC__) || (defined (_MSC_VER) && (_MSC_VER >= 800))
-# define PNGAPI __cdecl
-# else
-# define PNGAPI _cdecl
-# endif
-
-# if !defined(PNG_IMPEXP) && (!defined(PNG_DLL) || \
- 0 /* WINCOMPILER_WITH_NO_SUPPORT_FOR_DECLIMPEXP */)
-# define PNG_IMPEXP
-# endif
-
-# if !defined(PNG_IMPEXP)
-
-# define PNG_EXPORT_TYPE1(type,symbol) PNG_IMPEXP type PNGAPI symbol
-# define PNG_EXPORT_TYPE2(type,symbol) type PNG_IMPEXP PNGAPI symbol
-
- /* Borland/Microsoft */
-# if defined(_MSC_VER) || defined(__BORLANDC__)
-# if (_MSC_VER >= 800) || (__BORLANDC__ >= 0x500)
-# define PNG_EXPORT PNG_EXPORT_TYPE1
-# else
-# define PNG_EXPORT PNG_EXPORT_TYPE2
-# if defined(PNG_BUILD_DLL)
-# define PNG_IMPEXP __export
-# else
-# define PNG_IMPEXP /*__import*/ /* doesn't exist AFAIK in
- VC++*/
-# endif /* Exists in Borland C++ for
- C++ classes (== huge) */
-# endif
-# endif
-
-# if !defined(PNG_IMPEXP)
-# if defined(PNG_BUILD_DLL)
-# define PNG_IMPEXP __declspec(dllexport)
-# else
-# define PNG_IMPEXP __declspec(dllimport)
-# endif
-# endif
-# endif /* PNG_IMPEXP */
-#else /* !(DLL || non-cygwin WINDOWS) */
-# if defined(__CYGWIN__) && !defined(PNG_DLL)
-# if !defined(PNG_IMPEXP)
-# define PNG_IMPEXP
-# endif
-# define PNGAPI __cdecl
-# else
-# if (defined(__IBMC__) || defined(IBMCPP__)) && defined(__OS2__)
-# define PNGAPI _System
-# define PNG_IMPEXP
-# else
-# if 0 /* ... other platforms, with other meanings */
-# else
-# define PNGAPI
-# define PNG_IMPEXP
-# endif
-# endif
-# endif
-#endif
-#endif
-
-#ifndef PNGAPI
-# define PNGAPI
-#endif
-#ifndef PNG_IMPEXP
-# define PNG_IMPEXP
-#endif
-
-#ifndef PNG_EXPORT
-# define PNG_EXPORT(type,symbol) PNG_IMPEXP type PNGAPI symbol
-#endif
-
-#ifdef PNG_USE_GLOBAL_ARRAYS
-# ifndef PNG_EXPORT_VAR
-# define PNG_EXPORT_VAR(type) extern PNG_IMPEXP type
-# endif
-#endif
-
-/* User may want to use these so they are not in PNG_INTERNAL. Any library
- * functions that are passed far data must be model independent.
- */
-
-#ifndef PNG_ABORT
-# define PNG_ABORT() abort()
-#endif
-
-#ifdef PNG_SETJMP_SUPPORTED
-# define png_jmpbuf(png_ptr) ((png_ptr)->jmpbuf)
-#else
-# define png_jmpbuf(png_ptr) \
- (LIBPNG_WAS_COMPILED_WITH__PNG_SETJMP_NOT_SUPPORTED)
-#endif
-
-#if defined(USE_FAR_KEYWORD) /* memory model independent fns */
-/* use this to make far-to-near assignments */
-# define CHECK 1
-# define NOCHECK 0
-# define CVT_PTR(ptr) (png_far_to_near(png_ptr,ptr,CHECK))
-# define CVT_PTR_NOCHECK(ptr) (png_far_to_near(png_ptr,ptr,NOCHECK))
-# define png_strcpy _fstrcpy
-# define png_strlen _fstrlen
-# define png_memcmp _fmemcmp /* SJT: added */
-# define png_memcpy _fmemcpy
-# define png_memset _fmemset
-#else /* use the usual functions */
-# define CVT_PTR(ptr) (ptr)
-# define CVT_PTR_NOCHECK(ptr) (ptr)
-# define png_strcpy strcpy
-# define png_strlen strlen
-# define png_memcmp memcmp /* SJT: added */
-# define png_memcpy memcpy
-# define png_memset memset
-#endif
-/* End of memory model independent support */
-
-/* Just a little check that someone hasn't tried to define something
- * contradictory.
- */
-#if (PNG_ZBUF_SIZE > 65536) && defined(PNG_MAX_MALLOC_64K)
-# undef PNG_ZBUF_SIZE
-# define PNG_ZBUF_SIZE 65536
-#endif
-
-#ifdef PNG_READ_SUPPORTED
-/* Prior to libpng-1.0.9, this block was in pngasmrd.h */
-#if defined(PNG_INTERNAL)
-
-/* These are the default thresholds before the MMX code kicks in; if either
- * rowbytes or bitdepth is below the threshold, plain C code is used. These
- * can be overridden at runtime via the png_set_mmx_thresholds() call in
- * libpng 1.2.0 and later. The values below were chosen by Intel.
- */
-
-#ifndef PNG_MMX_ROWBYTES_THRESHOLD_DEFAULT
-# define PNG_MMX_ROWBYTES_THRESHOLD_DEFAULT 128 /* >= */
-#endif
-#ifndef PNG_MMX_BITDEPTH_THRESHOLD_DEFAULT
-# define PNG_MMX_BITDEPTH_THRESHOLD_DEFAULT 9 /* >= */
-#endif
-
-/* Set this in the makefile for VC++ on Pentium, not here. */
-/* Platform must be Pentium. Makefile must assemble and load pngvcrd.c .
- * MMX will be detected at run time and used if present.
- */
-#ifdef PNG_USE_PNGVCRD
-# define PNG_HAVE_ASSEMBLER_COMBINE_ROW
-# define PNG_HAVE_ASSEMBLER_READ_INTERLACE
-# define PNG_HAVE_ASSEMBLER_READ_FILTER_ROW
-#endif
-
-/* Set this in the makefile for gcc/as on Pentium, not here. */
-/* Platform must be Pentium. Makefile must assemble and load pnggccrd.c .
- * MMX will be detected at run time and used if present.
- */
-#ifdef PNG_USE_PNGGCCRD
-# define PNG_HAVE_ASSEMBLER_COMBINE_ROW
-# define PNG_HAVE_ASSEMBLER_READ_INTERLACE
-# define PNG_HAVE_ASSEMBLER_READ_FILTER_ROW
-#endif
-/* - see pnggccrd.c for info about what is currently enabled */
-
-#endif /* PNG_INTERNAL */
-#endif /* PNG_READ_SUPPORTED */
-
-#endif /* PNGCONF_H */
-
diff --git a/libpng/pngerror.c b/libpng/pngerror.c
deleted file mode 100644
index b6ad8d8..0000000
--- a/libpng/pngerror.c
+++ /dev/null
@@ -1,289 +0,0 @@
-
-/* pngerror.c - stub functions for i/o and memory allocation
- *
- * libpng 1.2.1 - December 12, 2001
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2001 Glenn Randers-Pehrson
- * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
- * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
- *
- * This file provides a location for all error handling. Users who
- * need special error handling are expected to write replacement functions
- * and use png_set_error_fn() to use those functions. See the instructions
- * at each function.
- */
-
-#define PNG_INTERNAL
-#include "png.h"
-
-static void /* PRIVATE */
-png_default_error PNGARG((png_structp png_ptr,
- png_const_charp message));
-static void /* PRIVATE */
-png_default_warning PNGARG((png_structp png_ptr,
- png_const_charp message));
-
-/* This function is called whenever there is a fatal error. This function
- * should not be changed. If there is a need to handle errors differently,
- * you should supply a replacement error function and use png_set_error_fn()
- * to replace the error function at run-time.
- */
-void PNGAPI
-png_error(png_structp png_ptr, png_const_charp message)
-{
-#ifdef PNG_ERROR_NUMBERS_SUPPORTED
- char msg[16];
- if (png_ptr->flags&(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT))
- {
- int offset = 0;
- if (*message == '#')
- {
- for (offset=1; offset<15; offset++)
- if (*(message+offset) == ' ')
- break;
- if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT)
- {
- int i;
- for (i=0; i<offset-1; i++)
- msg[i]=message[i+1];
- msg[i]='\0';
- message=msg;
- }
- else
- message+=offset;
- }
- else
- {
- if (png_ptr->flags&PNG_FLAG_STRIP_ERROR_TEXT)
- {
- msg[0]='0';
- msg[1]='\0';
- message=msg;
- }
- }
- }
-#endif
- if (png_ptr->error_fn != NULL)
- (*(png_ptr->error_fn))(png_ptr, message);
-
- /* if the following returns or doesn't exist, use the default function,
- which will not return */
- png_default_error(png_ptr, message);
-}
-
-/* This function is called whenever there is a non-fatal error. This function
- * should not be changed. If there is a need to handle warnings differently,
- * you should supply a replacement warning function and use
- * png_set_error_fn() to replace the warning function at run-time.
- */
-void PNGAPI
-png_warning(png_structp png_ptr, png_const_charp message)
-{
- int offset = 0;
-#ifdef PNG_ERROR_NUMBERS_SUPPORTED
- if (png_ptr->flags&(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT))
-#endif
- {
- if (*message == '#')
- {
- for (offset=1; offset<15; offset++)
- if (*(message+offset) == ' ')
- break;
- }
- }
- if (png_ptr->warning_fn != NULL)
- (*(png_ptr->warning_fn))(png_ptr, (png_const_charp)(message+offset));
- else
- png_default_warning(png_ptr, (png_const_charp)(message+offset));
-}
-
-/* These utilities are used internally to build an error message that relates
- * to the current chunk. The chunk name comes from png_ptr->chunk_name,
- * this is used to prefix the message. The message is limited in length
- * to 63 bytes, the name characters are output as hex digits wrapped in []
- * if the character is invalid.
- */
-#define isnonalpha(c) ((c) < 41 || (c) > 122 || ((c) > 90 && (c) < 97))
-static PNG_CONST char png_digit[16] = {
- '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E',
- 'F' };
-
-static void /* PRIVATE */
-png_format_buffer(png_structp png_ptr, png_charp buffer, png_const_charp
- message)
-{
- int iout = 0, iin = 0;
-
- while (iin < 4)
- {
- int c = png_ptr->chunk_name[iin++];
- if (isnonalpha(c))
- {
- buffer[iout++] = '[';
- buffer[iout++] = png_digit[(c & 0xf0) >> 4];
- buffer[iout++] = png_digit[c & 0x0f];
- buffer[iout++] = ']';
- }
- else
- {
- buffer[iout++] = (png_byte)c;
- }
- }
-
- if (message == NULL)
- buffer[iout] = 0;
- else
- {
- buffer[iout++] = ':';
- buffer[iout++] = ' ';
- png_memcpy(buffer+iout, message, 64);
- buffer[iout+63] = 0;
- }
-}
-
-void PNGAPI
-png_chunk_error(png_structp png_ptr, png_const_charp message)
-{
- char msg[18+64];
- png_format_buffer(png_ptr, msg, message);
- png_error(png_ptr, msg);
-}
-
-void PNGAPI
-png_chunk_warning(png_structp png_ptr, png_const_charp message)
-{
- char msg[18+64];
- png_format_buffer(png_ptr, msg, message);
- png_warning(png_ptr, msg);
-}
-
-/* This is the default error handling function. Note that replacements for
- * this function MUST NOT RETURN, or the program will likely crash. This
- * function is used by default, or if the program supplies NULL for the
- * error function pointer in png_set_error_fn().
- */
-static void /* PRIVATE */
-png_default_error(png_structp png_ptr, png_const_charp message)
-{
-#ifndef PNG_NO_CONSOLE_IO
-#ifdef PNG_ERROR_NUMBERS_SUPPORTED
- if (*message == '#')
- {
- int offset;
- char error_number[16];
- for (offset=0; offset<15; offset++)
- {
- error_number[offset] = *(message+offset+1);
- if (*(message+offset) == ' ')
- break;
- }
- if((offset > 1) && (offset < 15))
- {
- error_number[offset-1]='\0';
- fprintf(stderr, "libpng error no. %s: %s\n", error_number, message+offset);
- }
- else
- fprintf(stderr, "libpng error: %s, offset=%d\n", message,offset);
- }
- else
-#endif
- fprintf(stderr, "libpng error: %s\n", message);
-#else
- if (message)
- /* make compiler happy */ ;
-#endif
-
-#ifdef PNG_SETJMP_SUPPORTED
-# ifdef USE_FAR_KEYWORD
- {
- jmp_buf jmpbuf;
- png_memcpy(jmpbuf,png_ptr->jmpbuf,sizeof(jmp_buf));
- longjmp(jmpbuf, 1);
- }
-# else
- longjmp(png_ptr->jmpbuf, 1);
-# endif
-#else
- if (png_ptr)
- /* make compiler happy */ ;
- PNG_ABORT();
-#endif
-}
-
-/* This function is called when there is a warning, but the library thinks
- * it can continue anyway. Replacement functions don't have to do anything
- * here if you don't want them to. In the default configuration, png_ptr is
- * not used, but it is passed in case it may be useful.
- */
-static void /* PRIVATE */
-png_default_warning(png_structp png_ptr, png_const_charp message)
-{
-#ifndef PNG_NO_CONSOLE_IO
-# ifdef PNG_ERROR_NUMBERS_SUPPORTED
- if (*message == '#')
- {
- int offset;
- char warning_number[16];
- for (offset=0; offset<15; offset++)
- {
- warning_number[offset]=*(message+offset+1);
- if (*(message+offset) == ' ')
- break;
- }
- if((offset > 1) && (offset < 15))
- {
- warning_number[offset-1]='\0';
- fprintf(stderr, "libpng warning no. %s: %s\n", warning_number,
- message+offset);
- }
- else
- fprintf(stderr, "libpng warning: %s\n", message);
- }
- else
-# endif
- fprintf(stderr, "libpng warning: %s\n", message);
-#else
- if (message)
- /* appease compiler */ ;
-#endif
- if (png_ptr)
- return;
-}
-
-/* This function is called when the application wants to use another method
- * of handling errors and warnings. Note that the error function MUST NOT
- * return to the calling routine or serious problems will occur. The return
- * method used in the default routine calls longjmp(png_ptr->jmpbuf, 1)
- */
-void PNGAPI
-png_set_error_fn(png_structp png_ptr, png_voidp error_ptr,
- png_error_ptr error_fn, png_error_ptr warning_fn)
-{
- png_ptr->error_ptr = error_ptr;
- png_ptr->error_fn = error_fn;
- png_ptr->warning_fn = warning_fn;
-}
-
-
-/* This function returns a pointer to the error_ptr associated with the user
- * functions. The application should free any memory associated with this
- * pointer before png_write_destroy and png_read_destroy are called.
- */
-png_voidp PNGAPI
-png_get_error_ptr(png_structp png_ptr)
-{
- return ((png_voidp)png_ptr->error_ptr);
-}
-
-
-#ifdef PNG_ERROR_NUMBERS_SUPPORTED
-void
-png_set_strip_error_numbers(png_structp png_ptr, png_uint_32 strip_mode)
-{
- if(png_ptr != NULL)
- {
- png_ptr->flags &=
- ((~(PNG_FLAG_STRIP_ERROR_NUMBERS|PNG_FLAG_STRIP_ERROR_TEXT))&strip_mode);
- }
-}
-#endif
diff --git a/libpng/pnggccrd.c b/libpng/pnggccrd.c
deleted file mode 100644
index e4540c5..0000000
--- a/libpng/pnggccrd.c
+++ /dev/null
@@ -1,5340 +0,0 @@
-/* pnggccrd.c - mixed C/assembler version of utilities to read a PNG file
- *
- * For Intel x86 CPU (Pentium-MMX or later) and GNU C compiler.
- *
- * See http://www.intel.com/drg/pentiumII/appnotes/916/916.htm
- * and http://www.intel.com/drg/pentiumII/appnotes/923/923.htm
- * for Intel's performance analysis of the MMX vs. non-MMX code.
- *
- * libpng version 1.2.1 - December 12, 2001
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2001 Glenn Randers-Pehrson
- * Copyright (c) 1998, Intel Corporation
- *
- * Based on MSVC code contributed by Nirav Chhatrapati, Intel Corp., 1998.
- * Interface to libpng contributed by Gilles Vollant, 1999.
- * GNU C port by Greg Roelofs, 1999-2001.
- *
- * Lines 2350-4300 converted in place with intel2gas 1.3.1:
- *
- * intel2gas -mdI pnggccrd.c.partially-msvc -o pnggccrd.c
- *
- * and then cleaned up by hand. See http://hermes.terminal.at/intel2gas/ .
- *
- * NOTE: A sufficiently recent version of GNU as (or as.exe under DOS/Windows)
- * is required to assemble the newer MMX instructions such as movq.
- * For djgpp, see
- *
- * ftp://ftp.simtel.net/pub/simtelnet/gnu/djgpp/v2gnu/bnu281b.zip
- *
- * (or a later version in the same directory). For Linux, check your
- * distribution's web site(s) or try these links:
- *
- * http://rufus.w3.org/linux/RPM/binutils.html
- * http://www.debian.org/Packages/stable/devel/binutils.html
- * ftp://ftp.slackware.com/pub/linux/slackware/slackware/slakware/d1/
- * binutils.tgz
- *
- * For other platforms, see the main GNU site:
- *
- * ftp://ftp.gnu.org/pub/gnu/binutils/
- *
- * Version 2.5.2l.15 is definitely too old...
- */
-
-/*
- * TEMPORARY PORTING NOTES AND CHANGELOG (mostly by Greg Roelofs)
- * =====================================
- *
- * 19991006:
- * - fixed sign error in post-MMX cleanup code (16- & 32-bit cases)
- *
- * 19991007:
- * - additional optimizations (possible or definite):
- * x [DONE] write MMX code for 64-bit case (pixel_bytes == 8) [not tested]
- * - write MMX code for 48-bit case (pixel_bytes == 6)
- * - figure out what's up with 24-bit case (pixel_bytes == 3):
- * why subtract 8 from width_mmx in the pass 4/5 case?
- * (only width_mmx case) (near line 1606)
- * x [DONE] replace pixel_bytes within each block with the true
- * constant value (or are compilers smart enough to do that?)
- * - rewrite all MMX interlacing code so it's aligned with
- * the *beginning* of the row buffer, not the end. This
- * would not only allow one to eliminate half of the memory
- * writes for odd passes (that is, pass == odd), it may also
- * eliminate some unaligned-data-access exceptions (assuming
- * there's a penalty for not aligning 64-bit accesses on
- * 64-bit boundaries). The only catch is that the "leftover"
- * pixel(s) at the end of the row would have to be saved,
- * but there are enough unused MMX registers in every case,
- * so this is not a problem. A further benefit is that the
- * post-MMX cleanup code (C code) in at least some of the
- * cases could be done within the assembler block.
- * x [DONE] the "v3 v2 v1 v0 v7 v6 v5 v4" comments are confusing,
- * inconsistent, and don't match the MMX Programmer's Reference
- * Manual conventions anyway. They should be changed to
- * "b7 b6 b5 b4 b3 b2 b1 b0," where b0 indicates the byte that
- * was lowest in memory (e.g., corresponding to a left pixel)
- * and b7 is the byte that was highest (e.g., a right pixel).
- *
- * 19991016:
- * - Brennan's Guide notwithstanding, gcc under Linux does *not*
- * want globals prefixed by underscores when referencing them--
- * i.e., if the variable is const4, then refer to it as const4,
- * not _const4. This seems to be a djgpp-specific requirement.
- * Also, such variables apparently *must* be declared outside
- * of functions; neither static nor automatic variables work if
- * defined within the scope of a single function, but both
- * static and truly global (multi-module) variables work fine.
- *
- * 19991023:
- * - fixed png_combine_row() non-MMX replication bug (odd passes only?)
- * - switched from string-concatenation-with-macros to cleaner method of
- * renaming global variables for djgpp--i.e., always use prefixes in
- * inlined assembler code (== strings) and conditionally rename the
- * variables, not the other way around. Hence _const4, _mask8_0, etc.
- *
- * 19991024:
- * - fixed mmxsupport()/png_do_read_interlace() first-row bug
- * This one was severely weird: even though mmxsupport() doesn't touch
- * ebx (where "row" pointer was stored), it nevertheless managed to zero
- * the register (even in static/non-fPIC code--see below), which in turn
- * caused png_do_read_interlace() to return prematurely on the first row of
- * interlaced images (i.e., without expanding the interlaced pixels).
- * Inspection of the generated assembly code didn't turn up any clues,
- * although it did point at a minor optimization (i.e., get rid of
- * mmx_supported_local variable and just use eax). Possibly the CPUID
- * instruction is more destructive than it looks? (Not yet checked.)
- * - "info gcc" was next to useless, so compared fPIC and non-fPIC assembly
- * listings... Apparently register spillage has to do with ebx, since
- * it's used to index the global offset table. Commenting it out of the
- * input-reg lists in png_combine_row() eliminated compiler barfage, so
- * ifdef'd with __PIC__ macro: if defined, use a global for unmask
- *
- * 19991107:
- * - verified CPUID clobberage: 12-char string constant ("GenuineIntel",
- * "AuthenticAMD", etc.) placed in ebx:ecx:edx. Still need to polish.
- *
- * 19991120:
- * - made "diff" variable (now "_dif") global to simplify conversion of
- * filtering routines (running out of regs, sigh). "diff" is still used
- * in interlacing routines, however.
- * - fixed up both versions of mmxsupport() (ORIG_THAT_USED_TO_CLOBBER_EBX
- * macro determines which is used); original not yet tested.
- *
- * 20000213:
- * - when compiling with gcc, be sure to use -fomit-frame-pointer
- *
- * 20000319:
- * - fixed a register-name typo in png_do_read_interlace(), default (MMX) case,
- * pass == 4 or 5, that caused visible corruption of interlaced images
- *
- * 20000623:
- * - Various problems were reported with gcc 2.95.2 in the Cygwin environment,
- * many of the form "forbidden register 0 (ax) was spilled for class AREG."
- * This is explained at http://gcc.gnu.org/fom_serv/cache/23.html, and
- * Chuck Wilson supplied a patch involving dummy output registers. See
- * http://sourceforge.net/bugs/?func=detailbug&bug_id=108741&group_id=5624
- * for the original (anonymous) SourceForge bug report.
- *
- * 20000706:
- * - Chuck Wilson passed along these remaining gcc 2.95.2 errors:
- * pnggccrd.c: In function `png_combine_row':
- * pnggccrd.c:525: more than 10 operands in `asm'
- * pnggccrd.c:669: more than 10 operands in `asm'
- * pnggccrd.c:828: more than 10 operands in `asm'
- * pnggccrd.c:994: more than 10 operands in `asm'
- * pnggccrd.c:1177: more than 10 operands in `asm'
- * They are all the same problem and can be worked around by using the
- * global _unmask variable unconditionally, not just in the -fPIC case.
- * Reportedly earlier versions of gcc also have the problem with more than
- * 10 operands; they just don't report it. Much strangeness ensues, etc.
- *
- * 20000729:
- * - enabled png_read_filter_row_mmx_up() (shortest remaining unconverted
- * MMX routine); began converting png_read_filter_row_mmx_sub()
- * - to finish remaining sections:
- * - clean up indentation and comments
- * - preload local variables
- * - add output and input regs (order of former determines numerical
- * mapping of latter)
- * - avoid all usage of ebx (including bx, bh, bl) register [20000823]
- * - remove "$" from addressing of Shift and Mask variables [20000823]
- *
- * 20000731:
- * - global union vars causing segfaults in png_read_filter_row_mmx_sub()?
- *
- * 20000822:
- * - ARGH, stupid png_read_filter_row_mmx_sub() segfault only happens with
- * shared-library (-fPIC) version! Code works just fine as part of static
- * library. Damn damn damn damn damn, should have tested that sooner.
- * ebx is getting clobbered again (explicitly this time); need to save it
- * on stack or rewrite asm code to avoid using it altogether. Blargh!
- *
- * 20000823:
- * - first section was trickiest; all remaining sections have ebx -> edx now.
- * (-fPIC works again.) Also added missing underscores to various Shift*
- * and *Mask* globals and got rid of leading "$" signs.
- *
- * 20000826:
- * - added visual separators to help navigate microscopic printed copies
- * (http://pobox.com/~newt/code/gpr-latest.zip, mode 10); started working
- * on png_read_filter_row_mmx_avg()
- *
- * 20000828:
- * - finished png_read_filter_row_mmx_avg(): only Paeth left! (930 lines...)
- * What the hell, did png_read_filter_row_mmx_paeth(), too. Comments not
- * cleaned up/shortened in either routine, but functionality is complete
- * and seems to be working fine.
- *
- * 20000829:
- * - ahhh, figured out last(?) bit of gcc/gas asm-fu: if register is listed
- * as an input reg (with dummy output variables, etc.), then it *cannot*
- * also appear in the clobber list or gcc 2.95.2 will barf. The solution
- * is simple enough...
- *
- * 20000914:
- * - bug in png_read_filter_row_mmx_avg(): 16-bit grayscale not handled
- * correctly (but 48-bit RGB just fine)
- *
- * 20000916:
- * - fixed bug in png_read_filter_row_mmx_avg(), bpp == 2 case; three errors:
- * - "_ShiftBpp.use = 24;" should have been "_ShiftBpp.use = 16;"
- * - "_ShiftRem.use = 40;" should have been "_ShiftRem.use = 48;"
- * - "psllq _ShiftRem, %%mm2" should have been "psrlq _ShiftRem, %%mm2"
- *
- * 20010101:
- * - added new png_init_mmx_flags() function (here only because it needs to
- * call mmxsupport(), which should probably become global png_mmxsupport());
- * modified other MMX routines to run conditionally (png_ptr->asm_flags)
- *
- * 20010103:
- * - renamed mmxsupport() to png_mmx_support(), with auto-set of mmx_supported,
- * and made it public; moved png_init_mmx_flags() to png.c as internal func
- *
- * 20010104:
- * - removed dependency on png_read_filter_row_c() (C code already duplicated
- * within MMX version of png_read_filter_row()) so no longer necessary to
- * compile it into pngrutil.o
- *
- * 20010310:
- * - fixed buffer-overrun bug in png_combine_row() C code (non-MMX)
- *
- * STILL TO DO:
- * - test png_do_read_interlace() 64-bit case (pixel_bytes == 8)
- * - write MMX code for 48-bit case (pixel_bytes == 6)
- * - figure out what's up with 24-bit case (pixel_bytes == 3):
- * why subtract 8 from width_mmx in the pass 4/5 case?
- * (only width_mmx case) (near line 1606)
- * - rewrite all MMX interlacing code so it's aligned with beginning
- * of the row buffer, not the end (see 19991007 for details)
- * x pick one version of mmxsupport() and get rid of the other
- * - add error messages to any remaining bogus default cases
- * - enable pixel_depth == 8 cases in png_read_filter_row()? (test speed)
- * x add support for runtime enable/disable/query of various MMX routines
- */
-
-#define PNG_INTERNAL
-#include "png.h"
-
-#if defined(PNG_USE_PNGGCCRD)
-
-int PNGAPI png_mmx_support(void);
-
-#ifdef PNG_USE_LOCAL_ARRAYS
-static const int FARDATA png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
-static const int FARDATA png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
-static const int FARDATA png_pass_width[7] = {8, 4, 4, 2, 2, 1, 1};
-#endif
-
-#if defined(PNG_ASSEMBLER_CODE_SUPPORTED)
-/* djgpp, Win32, and Cygwin add their own underscores to global variables,
- * so define them without: */
-#if defined(__DJGPP__) || defined(WIN32) || defined(__CYGWIN__)
-# define _mmx_supported mmx_supported
-# define _const4 const4
-# define _const6 const6
-# define _mask8_0 mask8_0
-# define _mask16_1 mask16_1
-# define _mask16_0 mask16_0
-# define _mask24_2 mask24_2
-# define _mask24_1 mask24_1
-# define _mask24_0 mask24_0
-# define _mask32_3 mask32_3
-# define _mask32_2 mask32_2
-# define _mask32_1 mask32_1
-# define _mask32_0 mask32_0
-# define _mask48_5 mask48_5
-# define _mask48_4 mask48_4
-# define _mask48_3 mask48_3
-# define _mask48_2 mask48_2
-# define _mask48_1 mask48_1
-# define _mask48_0 mask48_0
-# define _LBCarryMask LBCarryMask
-# define _HBClearMask HBClearMask
-# define _ActiveMask ActiveMask
-# define _ActiveMask2 ActiveMask2
-# define _ActiveMaskEnd ActiveMaskEnd
-# define _ShiftBpp ShiftBpp
-# define _ShiftRem ShiftRem
-#ifdef PNG_THREAD_UNSAFE_OK
-# define _unmask unmask
-# define _FullLength FullLength
-# define _MMXLength MMXLength
-# define _dif dif
-# define _patemp patemp
-# define _pbtemp pbtemp
-# define _pctemp pctemp
-#endif
-#endif
-
-
-/* These constants are used in the inlined MMX assembly code.
- Ignore gcc's "At top level: defined but not used" warnings. */
-
-/* GRR 20000706: originally _unmask was needed only when compiling with -fPIC,
- * since that case uses the %ebx register for indexing the Global Offset Table
- * and there were no other registers available. But gcc 2.95 and later emit
- * "more than 10 operands in `asm'" errors when %ebx is used to preload unmask
- * in the non-PIC case, so we'll just use the global unconditionally now.
- */
-#ifdef PNG_THREAD_UNSAFE_OK
-static int _unmask;
-#endif
-
-static unsigned long long _mask8_0 = 0x0102040810204080LL;
-
-static unsigned long long _mask16_1 = 0x0101020204040808LL;
-static unsigned long long _mask16_0 = 0x1010202040408080LL;
-
-static unsigned long long _mask24_2 = 0x0101010202020404LL;
-static unsigned long long _mask24_1 = 0x0408080810101020LL;
-static unsigned long long _mask24_0 = 0x2020404040808080LL;
-
-static unsigned long long _mask32_3 = 0x0101010102020202LL;
-static unsigned long long _mask32_2 = 0x0404040408080808LL;
-static unsigned long long _mask32_1 = 0x1010101020202020LL;
-static unsigned long long _mask32_0 = 0x4040404080808080LL;
-
-static unsigned long long _mask48_5 = 0x0101010101010202LL;
-static unsigned long long _mask48_4 = 0x0202020204040404LL;
-static unsigned long long _mask48_3 = 0x0404080808080808LL;
-static unsigned long long _mask48_2 = 0x1010101010102020LL;
-static unsigned long long _mask48_1 = 0x2020202040404040LL;
-static unsigned long long _mask48_0 = 0x4040808080808080LL;
-
-static unsigned long long _const4 = 0x0000000000FFFFFFLL;
-//static unsigned long long _const5 = 0x000000FFFFFF0000LL; // NOT USED
-static unsigned long long _const6 = 0x00000000000000FFLL;
-
-// These are used in the row-filter routines and should/would be local
-// variables if not for gcc addressing limitations.
-// WARNING: Their presence probably defeats the thread safety of libpng.
-
-#ifdef PNG_THREAD_UNSAFE_OK
-static png_uint_32 _FullLength;
-static png_uint_32 _MMXLength;
-static int _dif;
-static int _patemp; // temp variables for Paeth routine
-static int _pbtemp;
-static int _pctemp;
-#endif
-
-void /* PRIVATE */
-png_squelch_warnings(void)
-{
-#ifdef PNG_THREAD_UNSAFE_OK
- _dif = _dif;
- _patemp = _patemp;
- _pbtemp = _pbtemp;
- _pctemp = _pctemp;
- _MMXLength = _MMXLength;
-#endif
- _const4 = _const4;
- _const6 = _const6;
- _mask8_0 = _mask8_0;
- _mask16_1 = _mask16_1;
- _mask16_0 = _mask16_0;
- _mask24_2 = _mask24_2;
- _mask24_1 = _mask24_1;
- _mask24_0 = _mask24_0;
- _mask32_3 = _mask32_3;
- _mask32_2 = _mask32_2;
- _mask32_1 = _mask32_1;
- _mask32_0 = _mask32_0;
- _mask48_5 = _mask48_5;
- _mask48_4 = _mask48_4;
- _mask48_3 = _mask48_3;
- _mask48_2 = _mask48_2;
- _mask48_1 = _mask48_1;
- _mask48_0 = _mask48_0;
-}
-#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */
-
-
-static int _mmx_supported = 2;
-
-/*===========================================================================*/
-/* */
-/* P N G _ C O M B I N E _ R O W */
-/* */
-/*===========================================================================*/
-
-#if defined(PNG_HAVE_ASSEMBLER_COMBINE_ROW)
-
-#define BPP2 2
-#define BPP3 3 /* bytes per pixel (a.k.a. pixel_bytes) */
-#define BPP4 4
-#define BPP6 6 /* (defined only to help avoid cut-and-paste errors) */
-#define BPP8 8
-
-/* Combines the row recently read in with the previous row.
- This routine takes care of alpha and transparency if requested.
- This routine also handles the two methods of progressive display
- of interlaced images, depending on the mask value.
- The mask value describes which pixels are to be combined with
- the row. The pattern always repeats every 8 pixels, so just 8
- bits are needed. A one indicates the pixel is to be combined; a
- zero indicates the pixel is to be skipped. This is in addition
- to any alpha or transparency value associated with the pixel.
- If you want all pixels to be combined, pass 0xff (255) in mask. */
-
-/* Use this routine for the x86 platform - it uses a faster MMX routine
- if the machine supports MMX. */
-
-void /* PRIVATE */
-png_combine_row(png_structp png_ptr, png_bytep row, int mask)
-{
- png_debug(1, "in png_combine_row (pnggccrd.c)\n");
-
-#if defined(PNG_ASSEMBLER_CODE_SUPPORTED)
- if (_mmx_supported == 2) {
- /* this should have happened in png_init_mmx_flags() already */
- png_warning(png_ptr, "asm_flags may not have been initialized");
- png_mmx_support();
- }
-#endif
-
- if (mask == 0xff)
- {
- png_debug(2,"mask == 0xff: doing single png_memcpy()\n");
- png_memcpy(row, png_ptr->row_buf + 1,
- (png_size_t)((png_ptr->width * png_ptr->row_info.pixel_depth + 7) >> 3));
- }
- else /* (png_combine_row() is never called with mask == 0) */
- {
- switch (png_ptr->row_info.pixel_depth)
- {
- case 1: /* png_ptr->row_info.pixel_depth */
- {
- png_bytep sp;
- png_bytep dp;
- int s_inc, s_start, s_end;
- int m;
- int shift;
- png_uint_32 i;
-
- sp = png_ptr->row_buf + 1;
- dp = row;
- m = 0x80;
-#if defined(PNG_READ_PACKSWAP_SUPPORTED)
- if (png_ptr->transformations & PNG_PACKSWAP)
- {
- s_start = 0;
- s_end = 7;
- s_inc = 1;
- }
- else
-#endif
- {
- s_start = 7;
- s_end = 0;
- s_inc = -1;
- }
-
- shift = s_start;
-
- for (i = 0; i < png_ptr->width; i++)
- {
- if (m & mask)
- {
- int value;
-
- value = (*sp >> shift) & 0x1;
- *dp &= (png_byte)((0x7f7f >> (7 - shift)) & 0xff);
- *dp |= (png_byte)(value << shift);
- }
-
- if (shift == s_end)
- {
- shift = s_start;
- sp++;
- dp++;
- }
- else
- shift += s_inc;
-
- if (m == 1)
- m = 0x80;
- else
- m >>= 1;
- }
- break;
- }
-
- case 2: /* png_ptr->row_info.pixel_depth */
- {
- png_bytep sp;
- png_bytep dp;
- int s_start, s_end, s_inc;
- int m;
- int shift;
- png_uint_32 i;
- int value;
-
- sp = png_ptr->row_buf + 1;
- dp = row;
- m = 0x80;
-#if defined(PNG_READ_PACKSWAP_SUPPORTED)
- if (png_ptr->transformations & PNG_PACKSWAP)
- {
- s_start = 0;
- s_end = 6;
- s_inc = 2;
- }
- else
-#endif
- {
- s_start = 6;
- s_end = 0;
- s_inc = -2;
- }
-
- shift = s_start;
-
- for (i = 0; i < png_ptr->width; i++)
- {
- if (m & mask)
- {
- value = (*sp >> shift) & 0x3;
- *dp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff);
- *dp |= (png_byte)(value << shift);
- }
-
- if (shift == s_end)
- {
- shift = s_start;
- sp++;
- dp++;
- }
- else
- shift += s_inc;
- if (m == 1)
- m = 0x80;
- else
- m >>= 1;
- }
- break;
- }
-
- case 4: /* png_ptr->row_info.pixel_depth */
- {
- png_bytep sp;
- png_bytep dp;
- int s_start, s_end, s_inc;
- int m;
- int shift;
- png_uint_32 i;
- int value;
-
- sp = png_ptr->row_buf + 1;
- dp = row;
- m = 0x80;
-#if defined(PNG_READ_PACKSWAP_SUPPORTED)
- if (png_ptr->transformations & PNG_PACKSWAP)
- {
- s_start = 0;
- s_end = 4;
- s_inc = 4;
- }
- else
-#endif
- {
- s_start = 4;
- s_end = 0;
- s_inc = -4;
- }
- shift = s_start;
-
- for (i = 0; i < png_ptr->width; i++)
- {
- if (m & mask)
- {
- value = (*sp >> shift) & 0xf;
- *dp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff);
- *dp |= (png_byte)(value << shift);
- }
-
- if (shift == s_end)
- {
- shift = s_start;
- sp++;
- dp++;
- }
- else
- shift += s_inc;
- if (m == 1)
- m = 0x80;
- else
- m >>= 1;
- }
- break;
- }
-
- case 8: /* png_ptr->row_info.pixel_depth */
- {
- png_bytep srcptr;
- png_bytep dstptr;
-
-#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK)
- if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW)
- /* && _mmx_supported */ )
- {
- png_uint_32 len;
- int diff;
- int dummy_value_a; // fix 'forbidden register spilled' error
- int dummy_value_d;
- int dummy_value_c;
- int dummy_value_S;
- int dummy_value_D;
- _unmask = ~mask; // global variable for -fPIC version
- srcptr = png_ptr->row_buf + 1;
- dstptr = row;
- len = png_ptr->width &~7; // reduce to multiple of 8
- diff = (int) (png_ptr->width & 7); // amount lost
-
- __asm__ __volatile__ (
- "movd _unmask, %%mm7 \n\t" // load bit pattern
- "psubb %%mm6, %%mm6 \n\t" // zero mm6
- "punpcklbw %%mm7, %%mm7 \n\t"
- "punpcklwd %%mm7, %%mm7 \n\t"
- "punpckldq %%mm7, %%mm7 \n\t" // fill reg with 8 masks
-
- "movq _mask8_0, %%mm0 \n\t"
- "pand %%mm7, %%mm0 \n\t" // nonzero if keep byte
- "pcmpeqb %%mm6, %%mm0 \n\t" // zeros->1s, v versa
-
-// preload "movl len, %%ecx \n\t" // load length of line
-// preload "movl srcptr, %%esi \n\t" // load source
-// preload "movl dstptr, %%edi \n\t" // load dest
-
- "cmpl $0, %%ecx \n\t" // len == 0 ?
- "je mainloop8end \n\t"
-
- "mainloop8: \n\t"
- "movq (%%esi), %%mm4 \n\t" // *srcptr
- "pand %%mm0, %%mm4 \n\t"
- "movq %%mm0, %%mm6 \n\t"
- "pandn (%%edi), %%mm6 \n\t" // *dstptr
- "por %%mm6, %%mm4 \n\t"
- "movq %%mm4, (%%edi) \n\t"
- "addl $8, %%esi \n\t" // inc by 8 bytes processed
- "addl $8, %%edi \n\t"
- "subl $8, %%ecx \n\t" // dec by 8 pixels processed
- "ja mainloop8 \n\t"
-
- "mainloop8end: \n\t"
-// preload "movl diff, %%ecx \n\t" // (diff is in eax)
- "movl %%eax, %%ecx \n\t"
- "cmpl $0, %%ecx \n\t"
- "jz end8 \n\t"
-// preload "movl mask, %%edx \n\t"
- "sall $24, %%edx \n\t" // make low byte, high byte
-
- "secondloop8: \n\t"
- "sall %%edx \n\t" // move high bit to CF
- "jnc skip8 \n\t" // if CF = 0
- "movb (%%esi), %%al \n\t"
- "movb %%al, (%%edi) \n\t"
-
- "skip8: \n\t"
- "incl %%esi \n\t"
- "incl %%edi \n\t"
- "decl %%ecx \n\t"
- "jnz secondloop8 \n\t"
-
- "end8: \n\t"
- "EMMS \n\t" // DONE
-
- : "=a" (dummy_value_a), // output regs (dummy)
- "=d" (dummy_value_d),
- "=c" (dummy_value_c),
- "=S" (dummy_value_S),
- "=D" (dummy_value_D)
-
- : "3" (srcptr), // esi // input regs
- "4" (dstptr), // edi
- "0" (diff), // eax
-// was (unmask) "b" RESERVED // ebx // Global Offset Table idx
- "2" (len), // ecx
- "1" (mask) // edx
-
-#if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */
- : "%mm0", "%mm4", "%mm6", "%mm7" // clobber list
-#endif
- );
- }
- else /* mmx _not supported - Use modified C routine */
-#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */
- {
- register png_uint_32 i;
- png_uint_32 initial_val = png_pass_start[png_ptr->pass];
- /* png.c: png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; */
- register int stride = png_pass_inc[png_ptr->pass];
- /* png.c: png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; */
- register int rep_bytes = png_pass_width[png_ptr->pass];
- /* png.c: png_pass_width[] = {8, 4, 4, 2, 2, 1, 1}; */
- png_uint_32 len = png_ptr->width &~7; /* reduce to mult. of 8 */
- int diff = (int) (png_ptr->width & 7); /* amount lost */
- register png_uint_32 final_val = len; /* GRR bugfix */
-
- srcptr = png_ptr->row_buf + 1 + initial_val;
- dstptr = row + initial_val;
-
- for (i = initial_val; i < final_val; i += stride)
- {
- png_memcpy(dstptr, srcptr, rep_bytes);
- srcptr += stride;
- dstptr += stride;
- }
- if (diff) /* number of leftover pixels: 3 for pngtest */
- {
- final_val+=diff /* *BPP1 */ ;
- for (; i < final_val; i += stride)
- {
- if (rep_bytes > (int)(final_val-i))
- rep_bytes = (int)(final_val-i);
- png_memcpy(dstptr, srcptr, rep_bytes);
- srcptr += stride;
- dstptr += stride;
- }
- }
-
- } /* end of else (_mmx_supported) */
-
- break;
- } /* end 8 bpp */
-
- case 16: /* png_ptr->row_info.pixel_depth */
- {
- png_bytep srcptr;
- png_bytep dstptr;
-
-#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK)
- if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW)
- /* && _mmx_supported */ )
- {
- png_uint_32 len;
- int diff;
- int dummy_value_a; // fix 'forbidden register spilled' error
- int dummy_value_d;
- int dummy_value_c;
- int dummy_value_S;
- int dummy_value_D;
- _unmask = ~mask; // global variable for -fPIC version
- srcptr = png_ptr->row_buf + 1;
- dstptr = row;
- len = png_ptr->width &~7; // reduce to multiple of 8
- diff = (int) (png_ptr->width & 7); // amount lost //
-
- __asm__ __volatile__ (
- "movd _unmask, %%mm7 \n\t" // load bit pattern
- "psubb %%mm6, %%mm6 \n\t" // zero mm6
- "punpcklbw %%mm7, %%mm7 \n\t"
- "punpcklwd %%mm7, %%mm7 \n\t"
- "punpckldq %%mm7, %%mm7 \n\t" // fill reg with 8 masks
-
- "movq _mask16_0, %%mm0 \n\t"
- "movq _mask16_1, %%mm1 \n\t"
-
- "pand %%mm7, %%mm0 \n\t"
- "pand %%mm7, %%mm1 \n\t"
-
- "pcmpeqb %%mm6, %%mm0 \n\t"
- "pcmpeqb %%mm6, %%mm1 \n\t"
-
-// preload "movl len, %%ecx \n\t" // load length of line
-// preload "movl srcptr, %%esi \n\t" // load source
-// preload "movl dstptr, %%edi \n\t" // load dest
-
- "cmpl $0, %%ecx \n\t"
- "jz mainloop16end \n\t"
-
- "mainloop16: \n\t"
- "movq (%%esi), %%mm4 \n\t"
- "pand %%mm0, %%mm4 \n\t"
- "movq %%mm0, %%mm6 \n\t"
- "movq (%%edi), %%mm7 \n\t"
- "pandn %%mm7, %%mm6 \n\t"
- "por %%mm6, %%mm4 \n\t"
- "movq %%mm4, (%%edi) \n\t"
-
- "movq 8(%%esi), %%mm5 \n\t"
- "pand %%mm1, %%mm5 \n\t"
- "movq %%mm1, %%mm7 \n\t"
- "movq 8(%%edi), %%mm6 \n\t"
- "pandn %%mm6, %%mm7 \n\t"
- "por %%mm7, %%mm5 \n\t"
- "movq %%mm5, 8(%%edi) \n\t"
-
- "addl $16, %%esi \n\t" // inc by 16 bytes processed
- "addl $16, %%edi \n\t"
- "subl $8, %%ecx \n\t" // dec by 8 pixels processed
- "ja mainloop16 \n\t"
-
- "mainloop16end: \n\t"
-// preload "movl diff, %%ecx \n\t" // (diff is in eax)
- "movl %%eax, %%ecx \n\t"
- "cmpl $0, %%ecx \n\t"
- "jz end16 \n\t"
-// preload "movl mask, %%edx \n\t"
- "sall $24, %%edx \n\t" // make low byte, high byte
-
- "secondloop16: \n\t"
- "sall %%edx \n\t" // move high bit to CF
- "jnc skip16 \n\t" // if CF = 0
- "movw (%%esi), %%ax \n\t"
- "movw %%ax, (%%edi) \n\t"
-
- "skip16: \n\t"
- "addl $2, %%esi \n\t"
- "addl $2, %%edi \n\t"
- "decl %%ecx \n\t"
- "jnz secondloop16 \n\t"
-
- "end16: \n\t"
- "EMMS \n\t" // DONE
-
- : "=a" (dummy_value_a), // output regs (dummy)
- "=c" (dummy_value_c),
- "=d" (dummy_value_d),
- "=S" (dummy_value_S),
- "=D" (dummy_value_D)
-
- : "0" (diff), // eax // input regs
-// was (unmask) " " RESERVED // ebx // Global Offset Table idx
- "1" (len), // ecx
- "2" (mask), // edx
- "3" (srcptr), // esi
- "4" (dstptr) // edi
-
-#if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */
- : "%mm0", "%mm1", "%mm4" // clobber list
- , "%mm5", "%mm6", "%mm7"
-#endif
- );
- }
- else /* mmx _not supported - Use modified C routine */
-#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */
- {
- register png_uint_32 i;
- png_uint_32 initial_val = BPP2 * png_pass_start[png_ptr->pass];
- /* png.c: png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; */
- register int stride = BPP2 * png_pass_inc[png_ptr->pass];
- /* png.c: png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; */
- register int rep_bytes = BPP2 * png_pass_width[png_ptr->pass];
- /* png.c: png_pass_width[] = {8, 4, 4, 2, 2, 1, 1}; */
- png_uint_32 len = png_ptr->width &~7; /* reduce to mult. of 8 */
- int diff = (int) (png_ptr->width & 7); /* amount lost */
- register png_uint_32 final_val = BPP2 * len; /* GRR bugfix */
-
- srcptr = png_ptr->row_buf + 1 + initial_val;
- dstptr = row + initial_val;
-
- for (i = initial_val; i < final_val; i += stride)
- {
- png_memcpy(dstptr, srcptr, rep_bytes);
- srcptr += stride;
- dstptr += stride;
- }
- if (diff) /* number of leftover pixels: 3 for pngtest */
- {
- final_val+=diff*BPP2;
- for (; i < final_val; i += stride)
- {
- if (rep_bytes > (int)(final_val-i))
- rep_bytes = (int)(final_val-i);
- png_memcpy(dstptr, srcptr, rep_bytes);
- srcptr += stride;
- dstptr += stride;
- }
- }
- } /* end of else (_mmx_supported) */
-
- break;
- } /* end 16 bpp */
-
- case 24: /* png_ptr->row_info.pixel_depth */
- {
- png_bytep srcptr;
- png_bytep dstptr;
-
-#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK)
- if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW)
- /* && _mmx_supported */ )
- {
- png_uint_32 len;
- int diff;
- int dummy_value_a; // fix 'forbidden register spilled' error
- int dummy_value_d;
- int dummy_value_c;
- int dummy_value_S;
- int dummy_value_D;
- _unmask = ~mask; // global variable for -fPIC version
- srcptr = png_ptr->row_buf + 1;
- dstptr = row;
- len = png_ptr->width &~7; // reduce to multiple of 8
- diff = (int) (png_ptr->width & 7); // amount lost //
-
- __asm__ __volatile__ (
- "movd _unmask, %%mm7 \n\t" // load bit pattern
- "psubb %%mm6, %%mm6 \n\t" // zero mm6
- "punpcklbw %%mm7, %%mm7 \n\t"
- "punpcklwd %%mm7, %%mm7 \n\t"
- "punpckldq %%mm7, %%mm7 \n\t" // fill reg with 8 masks
-
- "movq _mask24_0, %%mm0 \n\t"
- "movq _mask24_1, %%mm1 \n\t"
- "movq _mask24_2, %%mm2 \n\t"
-
- "pand %%mm7, %%mm0 \n\t"
- "pand %%mm7, %%mm1 \n\t"
- "pand %%mm7, %%mm2 \n\t"
-
- "pcmpeqb %%mm6, %%mm0 \n\t"
- "pcmpeqb %%mm6, %%mm1 \n\t"
- "pcmpeqb %%mm6, %%mm2 \n\t"
-
-// preload "movl len, %%ecx \n\t" // load length of line
-// preload "movl srcptr, %%esi \n\t" // load source
-// preload "movl dstptr, %%edi \n\t" // load dest
-
- "cmpl $0, %%ecx \n\t"
- "jz mainloop24end \n\t"
-
- "mainloop24: \n\t"
- "movq (%%esi), %%mm4 \n\t"
- "pand %%mm0, %%mm4 \n\t"
- "movq %%mm0, %%mm6 \n\t"
- "movq (%%edi), %%mm7 \n\t"
- "pandn %%mm7, %%mm6 \n\t"
- "por %%mm6, %%mm4 \n\t"
- "movq %%mm4, (%%edi) \n\t"
-
- "movq 8(%%esi), %%mm5 \n\t"
- "pand %%mm1, %%mm5 \n\t"
- "movq %%mm1, %%mm7 \n\t"
- "movq 8(%%edi), %%mm6 \n\t"
- "pandn %%mm6, %%mm7 \n\t"
- "por %%mm7, %%mm5 \n\t"
- "movq %%mm5, 8(%%edi) \n\t"
-
- "movq 16(%%esi), %%mm6 \n\t"
- "pand %%mm2, %%mm6 \n\t"
- "movq %%mm2, %%mm4 \n\t"
- "movq 16(%%edi), %%mm7 \n\t"
- "pandn %%mm7, %%mm4 \n\t"
- "por %%mm4, %%mm6 \n\t"
- "movq %%mm6, 16(%%edi) \n\t"
-
- "addl $24, %%esi \n\t" // inc by 24 bytes processed
- "addl $24, %%edi \n\t"
- "subl $8, %%ecx \n\t" // dec by 8 pixels processed
-
- "ja mainloop24 \n\t"
-
- "mainloop24end: \n\t"
-// preload "movl diff, %%ecx \n\t" // (diff is in eax)
- "movl %%eax, %%ecx \n\t"
- "cmpl $0, %%ecx \n\t"
- "jz end24 \n\t"
-// preload "movl mask, %%edx \n\t"
- "sall $24, %%edx \n\t" // make low byte, high byte
-
- "secondloop24: \n\t"
- "sall %%edx \n\t" // move high bit to CF
- "jnc skip24 \n\t" // if CF = 0
- "movw (%%esi), %%ax \n\t"
- "movw %%ax, (%%edi) \n\t"
- "xorl %%eax, %%eax \n\t"
- "movb 2(%%esi), %%al \n\t"
- "movb %%al, 2(%%edi) \n\t"
-
- "skip24: \n\t"
- "addl $3, %%esi \n\t"
- "addl $3, %%edi \n\t"
- "decl %%ecx \n\t"
- "jnz secondloop24 \n\t"
-
- "end24: \n\t"
- "EMMS \n\t" // DONE
-
- : "=a" (dummy_value_a), // output regs (dummy)
- "=d" (dummy_value_d),
- "=c" (dummy_value_c),
- "=S" (dummy_value_S),
- "=D" (dummy_value_D)
-
- : "3" (srcptr), // esi // input regs
- "4" (dstptr), // edi
- "0" (diff), // eax
-// was (unmask) "b" RESERVED // ebx // Global Offset Table idx
- "2" (len), // ecx
- "1" (mask) // edx
-
-#if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */
- : "%mm0", "%mm1", "%mm2" // clobber list
- , "%mm4", "%mm5", "%mm6", "%mm7"
-#endif
- );
- }
- else /* mmx _not supported - Use modified C routine */
-#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */
- {
- register png_uint_32 i;
- png_uint_32 initial_val = BPP3 * png_pass_start[png_ptr->pass];
- /* png.c: png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; */
- register int stride = BPP3 * png_pass_inc[png_ptr->pass];
- /* png.c: png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; */
- register int rep_bytes = BPP3 * png_pass_width[png_ptr->pass];
- /* png.c: png_pass_width[] = {8, 4, 4, 2, 2, 1, 1}; */
- png_uint_32 len = png_ptr->width &~7; /* reduce to mult. of 8 */
- int diff = (int) (png_ptr->width & 7); /* amount lost */
- register png_uint_32 final_val = BPP3 * len; /* GRR bugfix */
-
- srcptr = png_ptr->row_buf + 1 + initial_val;
- dstptr = row + initial_val;
-
- for (i = initial_val; i < final_val; i += stride)
- {
- png_memcpy(dstptr, srcptr, rep_bytes);
- srcptr += stride;
- dstptr += stride;
- }
- if (diff) /* number of leftover pixels: 3 for pngtest */
- {
- final_val+=diff*BPP3;
- for (; i < final_val; i += stride)
- {
- if (rep_bytes > (int)(final_val-i))
- rep_bytes = (int)(final_val-i);
- png_memcpy(dstptr, srcptr, rep_bytes);
- srcptr += stride;
- dstptr += stride;
- }
- }
- } /* end of else (_mmx_supported) */
-
- break;
- } /* end 24 bpp */
-
- case 32: /* png_ptr->row_info.pixel_depth */
- {
- png_bytep srcptr;
- png_bytep dstptr;
-
-#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK)
- if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW)
- /* && _mmx_supported */ )
- {
- png_uint_32 len;
- int diff;
- int dummy_value_a; // fix 'forbidden register spilled' error
- int dummy_value_d;
- int dummy_value_c;
- int dummy_value_S;
- int dummy_value_D;
- _unmask = ~mask; // global variable for -fPIC version
- srcptr = png_ptr->row_buf + 1;
- dstptr = row;
- len = png_ptr->width &~7; // reduce to multiple of 8
- diff = (int) (png_ptr->width & 7); // amount lost //
-
- __asm__ __volatile__ (
- "movd _unmask, %%mm7 \n\t" // load bit pattern
- "psubb %%mm6, %%mm6 \n\t" // zero mm6
- "punpcklbw %%mm7, %%mm7 \n\t"
- "punpcklwd %%mm7, %%mm7 \n\t"
- "punpckldq %%mm7, %%mm7 \n\t" // fill reg with 8 masks
-
- "movq _mask32_0, %%mm0 \n\t"
- "movq _mask32_1, %%mm1 \n\t"
- "movq _mask32_2, %%mm2 \n\t"
- "movq _mask32_3, %%mm3 \n\t"
-
- "pand %%mm7, %%mm0 \n\t"
- "pand %%mm7, %%mm1 \n\t"
- "pand %%mm7, %%mm2 \n\t"
- "pand %%mm7, %%mm3 \n\t"
-
- "pcmpeqb %%mm6, %%mm0 \n\t"
- "pcmpeqb %%mm6, %%mm1 \n\t"
- "pcmpeqb %%mm6, %%mm2 \n\t"
- "pcmpeqb %%mm6, %%mm3 \n\t"
-
-// preload "movl len, %%ecx \n\t" // load length of line
-// preload "movl srcptr, %%esi \n\t" // load source
-// preload "movl dstptr, %%edi \n\t" // load dest
-
- "cmpl $0, %%ecx \n\t" // lcr
- "jz mainloop32end \n\t"
-
- "mainloop32: \n\t"
- "movq (%%esi), %%mm4 \n\t"
- "pand %%mm0, %%mm4 \n\t"
- "movq %%mm0, %%mm6 \n\t"
- "movq (%%edi), %%mm7 \n\t"
- "pandn %%mm7, %%mm6 \n\t"
- "por %%mm6, %%mm4 \n\t"
- "movq %%mm4, (%%edi) \n\t"
-
- "movq 8(%%esi), %%mm5 \n\t"
- "pand %%mm1, %%mm5 \n\t"
- "movq %%mm1, %%mm7 \n\t"
- "movq 8(%%edi), %%mm6 \n\t"
- "pandn %%mm6, %%mm7 \n\t"
- "por %%mm7, %%mm5 \n\t"
- "movq %%mm5, 8(%%edi) \n\t"
-
- "movq 16(%%esi), %%mm6 \n\t"
- "pand %%mm2, %%mm6 \n\t"
- "movq %%mm2, %%mm4 \n\t"
- "movq 16(%%edi), %%mm7 \n\t"
- "pandn %%mm7, %%mm4 \n\t"
- "por %%mm4, %%mm6 \n\t"
- "movq %%mm6, 16(%%edi) \n\t"
-
- "movq 24(%%esi), %%mm7 \n\t"
- "pand %%mm3, %%mm7 \n\t"
- "movq %%mm3, %%mm5 \n\t"
- "movq 24(%%edi), %%mm4 \n\t"
- "pandn %%mm4, %%mm5 \n\t"
- "por %%mm5, %%mm7 \n\t"
- "movq %%mm7, 24(%%edi) \n\t"
-
- "addl $32, %%esi \n\t" // inc by 32 bytes processed
- "addl $32, %%edi \n\t"
- "subl $8, %%ecx \n\t" // dec by 8 pixels processed
- "ja mainloop32 \n\t"
-
- "mainloop32end: \n\t"
-// preload "movl diff, %%ecx \n\t" // (diff is in eax)
- "movl %%eax, %%ecx \n\t"
- "cmpl $0, %%ecx \n\t"
- "jz end32 \n\t"
-// preload "movl mask, %%edx \n\t"
- "sall $24, %%edx \n\t" // low byte => high byte
-
- "secondloop32: \n\t"
- "sall %%edx \n\t" // move high bit to CF
- "jnc skip32 \n\t" // if CF = 0
- "movl (%%esi), %%eax \n\t"
- "movl %%eax, (%%edi) \n\t"
-
- "skip32: \n\t"
- "addl $4, %%esi \n\t"
- "addl $4, %%edi \n\t"
- "decl %%ecx \n\t"
- "jnz secondloop32 \n\t"
-
- "end32: \n\t"
- "EMMS \n\t" // DONE
-
- : "=a" (dummy_value_a), // output regs (dummy)
- "=d" (dummy_value_d),
- "=c" (dummy_value_c),
- "=S" (dummy_value_S),
- "=D" (dummy_value_D)
-
- : "3" (srcptr), // esi // input regs
- "4" (dstptr), // edi
- "0" (diff), // eax
-// was (unmask) "b" RESERVED // ebx // Global Offset Table idx
- "2" (len), // ecx
- "1" (mask) // edx
-
-#if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */
- : "%mm0", "%mm1", "%mm2", "%mm3" // clobber list
- , "%mm4", "%mm5", "%mm6", "%mm7"
-#endif
- );
- }
- else /* mmx _not supported - Use modified C routine */
-#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */
- {
- register png_uint_32 i;
- png_uint_32 initial_val = BPP4 * png_pass_start[png_ptr->pass];
- /* png.c: png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; */
- register int stride = BPP4 * png_pass_inc[png_ptr->pass];
- /* png.c: png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; */
- register int rep_bytes = BPP4 * png_pass_width[png_ptr->pass];
- /* png.c: png_pass_width[] = {8, 4, 4, 2, 2, 1, 1}; */
- png_uint_32 len = png_ptr->width &~7; /* reduce to mult. of 8 */
- int diff = (int) (png_ptr->width & 7); /* amount lost */
- register png_uint_32 final_val = BPP4 * len; /* GRR bugfix */
-
- srcptr = png_ptr->row_buf + 1 + initial_val;
- dstptr = row + initial_val;
-
- for (i = initial_val; i < final_val; i += stride)
- {
- png_memcpy(dstptr, srcptr, rep_bytes);
- srcptr += stride;
- dstptr += stride;
- }
- if (diff) /* number of leftover pixels: 3 for pngtest */
- {
- final_val+=diff*BPP4;
- for (; i < final_val; i += stride)
- {
- if (rep_bytes > (int)(final_val-i))
- rep_bytes = (int)(final_val-i);
- png_memcpy(dstptr, srcptr, rep_bytes);
- srcptr += stride;
- dstptr += stride;
- }
- }
- } /* end of else (_mmx_supported) */
-
- break;
- } /* end 32 bpp */
-
- case 48: /* png_ptr->row_info.pixel_depth */
- {
- png_bytep srcptr;
- png_bytep dstptr;
-
-#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK)
- if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW)
- /* && _mmx_supported */ )
- {
- png_uint_32 len;
- int diff;
- int dummy_value_a; // fix 'forbidden register spilled' error
- int dummy_value_d;
- int dummy_value_c;
- int dummy_value_S;
- int dummy_value_D;
- _unmask = ~mask; // global variable for -fPIC version
- srcptr = png_ptr->row_buf + 1;
- dstptr = row;
- len = png_ptr->width &~7; // reduce to multiple of 8
- diff = (int) (png_ptr->width & 7); // amount lost //
-
- __asm__ __volatile__ (
- "movd _unmask, %%mm7 \n\t" // load bit pattern
- "psubb %%mm6, %%mm6 \n\t" // zero mm6
- "punpcklbw %%mm7, %%mm7 \n\t"
- "punpcklwd %%mm7, %%mm7 \n\t"
- "punpckldq %%mm7, %%mm7 \n\t" // fill reg with 8 masks
-
- "movq _mask48_0, %%mm0 \n\t"
- "movq _mask48_1, %%mm1 \n\t"
- "movq _mask48_2, %%mm2 \n\t"
- "movq _mask48_3, %%mm3 \n\t"
- "movq _mask48_4, %%mm4 \n\t"
- "movq _mask48_5, %%mm5 \n\t"
-
- "pand %%mm7, %%mm0 \n\t"
- "pand %%mm7, %%mm1 \n\t"
- "pand %%mm7, %%mm2 \n\t"
- "pand %%mm7, %%mm3 \n\t"
- "pand %%mm7, %%mm4 \n\t"
- "pand %%mm7, %%mm5 \n\t"
-
- "pcmpeqb %%mm6, %%mm0 \n\t"
- "pcmpeqb %%mm6, %%mm1 \n\t"
- "pcmpeqb %%mm6, %%mm2 \n\t"
- "pcmpeqb %%mm6, %%mm3 \n\t"
- "pcmpeqb %%mm6, %%mm4 \n\t"
- "pcmpeqb %%mm6, %%mm5 \n\t"
-
-// preload "movl len, %%ecx \n\t" // load length of line
-// preload "movl srcptr, %%esi \n\t" // load source
-// preload "movl dstptr, %%edi \n\t" // load dest
-
- "cmpl $0, %%ecx \n\t"
- "jz mainloop48end \n\t"
-
- "mainloop48: \n\t"
- "movq (%%esi), %%mm7 \n\t"
- "pand %%mm0, %%mm7 \n\t"
- "movq %%mm0, %%mm6 \n\t"
- "pandn (%%edi), %%mm6 \n\t"
- "por %%mm6, %%mm7 \n\t"
- "movq %%mm7, (%%edi) \n\t"
-
- "movq 8(%%esi), %%mm6 \n\t"
- "pand %%mm1, %%mm6 \n\t"
- "movq %%mm1, %%mm7 \n\t"
- "pandn 8(%%edi), %%mm7 \n\t"
- "por %%mm7, %%mm6 \n\t"
- "movq %%mm6, 8(%%edi) \n\t"
-
- "movq 16(%%esi), %%mm6 \n\t"
- "pand %%mm2, %%mm6 \n\t"
- "movq %%mm2, %%mm7 \n\t"
- "pandn 16(%%edi), %%mm7 \n\t"
- "por %%mm7, %%mm6 \n\t"
- "movq %%mm6, 16(%%edi) \n\t"
-
- "movq 24(%%esi), %%mm7 \n\t"
- "pand %%mm3, %%mm7 \n\t"
- "movq %%mm3, %%mm6 \n\t"
- "pandn 24(%%edi), %%mm6 \n\t"
- "por %%mm6, %%mm7 \n\t"
- "movq %%mm7, 24(%%edi) \n\t"
-
- "movq 32(%%esi), %%mm6 \n\t"
- "pand %%mm4, %%mm6 \n\t"
- "movq %%mm4, %%mm7 \n\t"
- "pandn 32(%%edi), %%mm7 \n\t"
- "por %%mm7, %%mm6 \n\t"
- "movq %%mm6, 32(%%edi) \n\t"
-
- "movq 40(%%esi), %%mm7 \n\t"
- "pand %%mm5, %%mm7 \n\t"
- "movq %%mm5, %%mm6 \n\t"
- "pandn 40(%%edi), %%mm6 \n\t"
- "por %%mm6, %%mm7 \n\t"
- "movq %%mm7, 40(%%edi) \n\t"
-
- "addl $48, %%esi \n\t" // inc by 48 bytes processed
- "addl $48, %%edi \n\t"
- "subl $8, %%ecx \n\t" // dec by 8 pixels processed
-
- "ja mainloop48 \n\t"
-
- "mainloop48end: \n\t"
-// preload "movl diff, %%ecx \n\t" // (diff is in eax)
- "movl %%eax, %%ecx \n\t"
- "cmpl $0, %%ecx \n\t"
- "jz end48 \n\t"
-// preload "movl mask, %%edx \n\t"
- "sall $24, %%edx \n\t" // make low byte, high byte
-
- "secondloop48: \n\t"
- "sall %%edx \n\t" // move high bit to CF
- "jnc skip48 \n\t" // if CF = 0
- "movl (%%esi), %%eax \n\t"
- "movl %%eax, (%%edi) \n\t"
-
- "skip48: \n\t"
- "addl $4, %%esi \n\t"
- "addl $4, %%edi \n\t"
- "decl %%ecx \n\t"
- "jnz secondloop48 \n\t"
-
- "end48: \n\t"
- "EMMS \n\t" // DONE
-
- : "=a" (dummy_value_a), // output regs (dummy)
- "=d" (dummy_value_d),
- "=c" (dummy_value_c),
- "=S" (dummy_value_S),
- "=D" (dummy_value_D)
-
- : "3" (srcptr), // esi // input regs
- "4" (dstptr), // edi
- "0" (diff), // eax
-// was (unmask) "b" RESERVED // ebx // Global Offset Table idx
- "2" (len), // ecx
- "1" (mask) // edx
-
-#if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */
- : "%mm0", "%mm1", "%mm2", "%mm3" // clobber list
- , "%mm4", "%mm5", "%mm6", "%mm7"
-#endif
- );
- }
- else /* mmx _not supported - Use modified C routine */
-#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */
- {
- register png_uint_32 i;
- png_uint_32 initial_val = BPP6 * png_pass_start[png_ptr->pass];
- /* png.c: png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; */
- register int stride = BPP6 * png_pass_inc[png_ptr->pass];
- /* png.c: png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; */
- register int rep_bytes = BPP6 * png_pass_width[png_ptr->pass];
- /* png.c: png_pass_width[] = {8, 4, 4, 2, 2, 1, 1}; */
- png_uint_32 len = png_ptr->width &~7; /* reduce to mult. of 8 */
- int diff = (int) (png_ptr->width & 7); /* amount lost */
- register png_uint_32 final_val = BPP6 * len; /* GRR bugfix */
-
- srcptr = png_ptr->row_buf + 1 + initial_val;
- dstptr = row + initial_val;
-
- for (i = initial_val; i < final_val; i += stride)
- {
- png_memcpy(dstptr, srcptr, rep_bytes);
- srcptr += stride;
- dstptr += stride;
- }
- if (diff) /* number of leftover pixels: 3 for pngtest */
- {
- final_val+=diff*BPP6;
- for (; i < final_val; i += stride)
- {
- if (rep_bytes > (int)(final_val-i))
- rep_bytes = (int)(final_val-i);
- png_memcpy(dstptr, srcptr, rep_bytes);
- srcptr += stride;
- dstptr += stride;
- }
- }
- } /* end of else (_mmx_supported) */
-
- break;
- } /* end 48 bpp */
-
- case 64: /* png_ptr->row_info.pixel_depth */
- {
- png_bytep srcptr;
- png_bytep dstptr;
- register png_uint_32 i;
- png_uint_32 initial_val = BPP8 * png_pass_start[png_ptr->pass];
- /* png.c: png_pass_start[] = {0, 4, 0, 2, 0, 1, 0}; */
- register int stride = BPP8 * png_pass_inc[png_ptr->pass];
- /* png.c: png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1}; */
- register int rep_bytes = BPP8 * png_pass_width[png_ptr->pass];
- /* png.c: png_pass_width[] = {8, 4, 4, 2, 2, 1, 1}; */
- png_uint_32 len = png_ptr->width &~7; /* reduce to mult. of 8 */
- int diff = (int) (png_ptr->width & 7); /* amount lost */
- register png_uint_32 final_val = BPP8 * len; /* GRR bugfix */
-
- srcptr = png_ptr->row_buf + 1 + initial_val;
- dstptr = row + initial_val;
-
- for (i = initial_val; i < final_val; i += stride)
- {
- png_memcpy(dstptr, srcptr, rep_bytes);
- srcptr += stride;
- dstptr += stride;
- }
- if (diff) /* number of leftover pixels: 3 for pngtest */
- {
- final_val+=diff*BPP8;
- for (; i < final_val; i += stride)
- {
- if (rep_bytes > (int)(final_val-i))
- rep_bytes = (int)(final_val-i);
- png_memcpy(dstptr, srcptr, rep_bytes);
- srcptr += stride;
- dstptr += stride;
- }
- }
-
- break;
- } /* end 64 bpp */
-
- default: /* png_ptr->row_info.pixel_depth != 1,2,4,8,16,24,32,48,64 */
- {
- /* this should never happen */
- png_warning(png_ptr, "Invalid row_info.pixel_depth in pnggccrd");
- break;
- }
- } /* end switch (png_ptr->row_info.pixel_depth) */
-
- } /* end if (non-trivial mask) */
-
-} /* end png_combine_row() */
-
-#endif /* PNG_HAVE_ASSEMBLER_COMBINE_ROW */
-
-
-
-
-/*===========================================================================*/
-/* */
-/* P N G _ D O _ R E A D _ I N T E R L A C E */
-/* */
-/*===========================================================================*/
-
-#if defined(PNG_READ_INTERLACING_SUPPORTED)
-#if defined(PNG_HAVE_ASSEMBLER_READ_INTERLACE)
-
-/* png_do_read_interlace() is called after any 16-bit to 8-bit conversion
- * has taken place. [GRR: what other steps come before and/or after?]
- */
-
-void /* PRIVATE */
-png_do_read_interlace(png_structp png_ptr)
-{
- png_row_infop row_info = &(png_ptr->row_info);
- png_bytep row = png_ptr->row_buf + 1;
- int pass = png_ptr->pass;
-#if defined(PNG_READ_PACKSWAP_SUPPORTED)
- png_uint_32 transformations = png_ptr->transformations;
-#endif
-
- png_debug(1, "in png_do_read_interlace (pnggccrd.c)\n");
-
-#if defined(PNG_ASSEMBLER_CODE_SUPPORTED)
- if (_mmx_supported == 2) {
- /* this should have happened in png_init_mmx_flags() already */
- png_warning(png_ptr, "asm_flags may not have been initialized");
- png_mmx_support();
- }
-#endif
-
- if (row != NULL && row_info != NULL)
- {
- png_uint_32 final_width;
-
- final_width = row_info->width * png_pass_inc[pass];
-
- switch (row_info->pixel_depth)
- {
- case 1:
- {
- png_bytep sp, dp;
- int sshift, dshift;
- int s_start, s_end, s_inc;
- png_byte v;
- png_uint_32 i;
- int j;
-
- sp = row + (png_size_t)((row_info->width - 1) >> 3);
- dp = row + (png_size_t)((final_width - 1) >> 3);
-#if defined(PNG_READ_PACKSWAP_SUPPORTED)
- if (transformations & PNG_PACKSWAP)
- {
- sshift = (int)((row_info->width + 7) & 7);
- dshift = (int)((final_width + 7) & 7);
- s_start = 7;
- s_end = 0;
- s_inc = -1;
- }
- else
-#endif
- {
- sshift = 7 - (int)((row_info->width + 7) & 7);
- dshift = 7 - (int)((final_width + 7) & 7);
- s_start = 0;
- s_end = 7;
- s_inc = 1;
- }
-
- for (i = row_info->width; i; i--)
- {
- v = (png_byte)((*sp >> sshift) & 0x1);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- *dp &= (png_byte)((0x7f7f >> (7 - dshift)) & 0xff);
- *dp |= (png_byte)(v << dshift);
- if (dshift == s_end)
- {
- dshift = s_start;
- dp--;
- }
- else
- dshift += s_inc;
- }
- if (sshift == s_end)
- {
- sshift = s_start;
- sp--;
- }
- else
- sshift += s_inc;
- }
- break;
- }
-
- case 2:
- {
- png_bytep sp, dp;
- int sshift, dshift;
- int s_start, s_end, s_inc;
- png_uint_32 i;
-
- sp = row + (png_size_t)((row_info->width - 1) >> 2);
- dp = row + (png_size_t)((final_width - 1) >> 2);
-#if defined(PNG_READ_PACKSWAP_SUPPORTED)
- if (transformations & PNG_PACKSWAP)
- {
- sshift = (png_size_t)(((row_info->width + 3) & 3) << 1);
- dshift = (png_size_t)(((final_width + 3) & 3) << 1);
- s_start = 6;
- s_end = 0;
- s_inc = -2;
- }
- else
-#endif
- {
- sshift = (png_size_t)((3 - ((row_info->width + 3) & 3)) << 1);
- dshift = (png_size_t)((3 - ((final_width + 3) & 3)) << 1);
- s_start = 0;
- s_end = 6;
- s_inc = 2;
- }
-
- for (i = row_info->width; i; i--)
- {
- png_byte v;
- int j;
-
- v = (png_byte)((*sp >> sshift) & 0x3);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- *dp &= (png_byte)((0x3f3f >> (6 - dshift)) & 0xff);
- *dp |= (png_byte)(v << dshift);
- if (dshift == s_end)
- {
- dshift = s_start;
- dp--;
- }
- else
- dshift += s_inc;
- }
- if (sshift == s_end)
- {
- sshift = s_start;
- sp--;
- }
- else
- sshift += s_inc;
- }
- break;
- }
-
- case 4:
- {
- png_bytep sp, dp;
- int sshift, dshift;
- int s_start, s_end, s_inc;
- png_uint_32 i;
-
- sp = row + (png_size_t)((row_info->width - 1) >> 1);
- dp = row + (png_size_t)((final_width - 1) >> 1);
-#if defined(PNG_READ_PACKSWAP_SUPPORTED)
- if (transformations & PNG_PACKSWAP)
- {
- sshift = (png_size_t)(((row_info->width + 1) & 1) << 2);
- dshift = (png_size_t)(((final_width + 1) & 1) << 2);
- s_start = 4;
- s_end = 0;
- s_inc = -4;
- }
- else
-#endif
- {
- sshift = (png_size_t)((1 - ((row_info->width + 1) & 1)) << 2);
- dshift = (png_size_t)((1 - ((final_width + 1) & 1)) << 2);
- s_start = 0;
- s_end = 4;
- s_inc = 4;
- }
-
- for (i = row_info->width; i; i--)
- {
- png_byte v;
- int j;
-
- v = (png_byte)((*sp >> sshift) & 0xf);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- *dp &= (png_byte)((0xf0f >> (4 - dshift)) & 0xff);
- *dp |= (png_byte)(v << dshift);
- if (dshift == s_end)
- {
- dshift = s_start;
- dp--;
- }
- else
- dshift += s_inc;
- }
- if (sshift == s_end)
- {
- sshift = s_start;
- sp--;
- }
- else
- sshift += s_inc;
- }
- break;
- }
-
- /*====================================================================*/
-
- default: /* 8-bit or larger (this is where the routine is modified) */
- {
-#if 0
-// static unsigned long long _const4 = 0x0000000000FFFFFFLL; no good
-// static unsigned long long const4 = 0x0000000000FFFFFFLL; no good
-// unsigned long long _const4 = 0x0000000000FFFFFFLL; no good
-// unsigned long long const4 = 0x0000000000FFFFFFLL; no good
-#endif
- png_bytep sptr, dp;
- png_uint_32 i;
- png_size_t pixel_bytes;
- int width = (int)row_info->width;
-
- pixel_bytes = (row_info->pixel_depth >> 3);
-
- /* point sptr at the last pixel in the pre-expanded row: */
- sptr = row + (width - 1) * pixel_bytes;
-
- /* point dp at the last pixel position in the expanded row: */
- dp = row + (final_width - 1) * pixel_bytes;
-
- /* New code by Nirav Chhatrapati - Intel Corporation */
-
-#if defined(PNG_ASSEMBLER_CODE_SUPPORTED)
- if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_INTERLACE)
- /* && _mmx_supported */ )
- {
- //--------------------------------------------------------------
- if (pixel_bytes == 3)
- {
- if (((pass == 0) || (pass == 1)) && width)
- {
- int dummy_value_c; // fix 'forbidden register spilled'
- int dummy_value_S;
- int dummy_value_D;
-
- __asm__ __volatile__ (
- "subl $21, %%edi \n\t"
- // (png_pass_inc[pass] - 1)*pixel_bytes
-
- ".loop3_pass0: \n\t"
- "movd (%%esi), %%mm0 \n\t" // x x x x x 2 1 0
- "pand _const4, %%mm0 \n\t" // z z z z z 2 1 0
- "movq %%mm0, %%mm1 \n\t" // z z z z z 2 1 0
- "psllq $16, %%mm0 \n\t" // z z z 2 1 0 z z
- "movq %%mm0, %%mm2 \n\t" // z z z 2 1 0 z z
- "psllq $24, %%mm0 \n\t" // 2 1 0 z z z z z
- "psrlq $8, %%mm1 \n\t" // z z z z z z 2 1
- "por %%mm2, %%mm0 \n\t" // 2 1 0 2 1 0 z z
- "por %%mm1, %%mm0 \n\t" // 2 1 0 2 1 0 2 1
- "movq %%mm0, %%mm3 \n\t" // 2 1 0 2 1 0 2 1
- "psllq $16, %%mm0 \n\t" // 0 2 1 0 2 1 z z
- "movq %%mm3, %%mm4 \n\t" // 2 1 0 2 1 0 2 1
- "punpckhdq %%mm0, %%mm3 \n\t" // 0 2 1 0 2 1 0 2
- "movq %%mm4, 16(%%edi) \n\t"
- "psrlq $32, %%mm0 \n\t" // z z z z 0 2 1 0
- "movq %%mm3, 8(%%edi) \n\t"
- "punpckldq %%mm4, %%mm0 \n\t" // 1 0 2 1 0 2 1 0
- "subl $3, %%esi \n\t"
- "movq %%mm0, (%%edi) \n\t"
- "subl $24, %%edi \n\t"
- "decl %%ecx \n\t"
- "jnz .loop3_pass0 \n\t"
- "EMMS \n\t" // DONE
-
- : "=c" (dummy_value_c), // output regs (dummy)
- "=S" (dummy_value_S),
- "=D" (dummy_value_D)
-
- : "1" (sptr), // esi // input regs
- "2" (dp), // edi
- "0" (width) // ecx
-// doesn't work "i" (0x0000000000FFFFFFLL) // %1 (a.k.a. _const4)
-
-#if 0 /* %mm0, ..., %mm4 not supported by gcc 2.7.2.3 or egcs 1.1 */
- : "%mm0", "%mm1", "%mm2" // clobber list
- , "%mm3", "%mm4"
-#endif
- );
- }
- else if (((pass == 2) || (pass == 3)) && width)
- {
- int dummy_value_c; // fix 'forbidden register spilled'
- int dummy_value_S;
- int dummy_value_D;
-
- __asm__ __volatile__ (
- "subl $9, %%edi \n\t"
- // (png_pass_inc[pass] - 1)*pixel_bytes
-
- ".loop3_pass2: \n\t"
- "movd (%%esi), %%mm0 \n\t" // x x x x x 2 1 0
- "pand _const4, %%mm0 \n\t" // z z z z z 2 1 0
- "movq %%mm0, %%mm1 \n\t" // z z z z z 2 1 0
- "psllq $16, %%mm0 \n\t" // z z z 2 1 0 z z
- "movq %%mm0, %%mm2 \n\t" // z z z 2 1 0 z z
- "psllq $24, %%mm0 \n\t" // 2 1 0 z z z z z
- "psrlq $8, %%mm1 \n\t" // z z z z z z 2 1
- "por %%mm2, %%mm0 \n\t" // 2 1 0 2 1 0 z z
- "por %%mm1, %%mm0 \n\t" // 2 1 0 2 1 0 2 1
- "movq %%mm0, 4(%%edi) \n\t"
- "psrlq $16, %%mm0 \n\t" // z z 2 1 0 2 1 0
- "subl $3, %%esi \n\t"
- "movd %%mm0, (%%edi) \n\t"
- "subl $12, %%edi \n\t"
- "decl %%ecx \n\t"
- "jnz .loop3_pass2 \n\t"
- "EMMS \n\t" // DONE
-
- : "=c" (dummy_value_c), // output regs (dummy)
- "=S" (dummy_value_S),
- "=D" (dummy_value_D)
-
- : "1" (sptr), // esi // input regs
- "2" (dp), // edi
- "0" (width) // ecx
-
-#if 0 /* %mm0, ..., %mm2 not supported by gcc 2.7.2.3 or egcs 1.1 */
- : "%mm0", "%mm1", "%mm2" // clobber list
-#endif
- );
- }
- else if (width) /* && ((pass == 4) || (pass == 5)) */
- {
- int width_mmx = ((width >> 1) << 1) - 8; // GRR: huh?
- if (width_mmx < 0)
- width_mmx = 0;
- width -= width_mmx; // 8 or 9 pix, 24 or 27 bytes
- if (width_mmx)
- {
- // png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};
- // sptr points at last pixel in pre-expanded row
- // dp points at last pixel position in expanded row
- int dummy_value_c; // fix 'forbidden register spilled'
- int dummy_value_S;
- int dummy_value_D;
-
- __asm__ __volatile__ (
- "subl $3, %%esi \n\t"
- "subl $9, %%edi \n\t"
- // (png_pass_inc[pass] + 1)*pixel_bytes
-
- ".loop3_pass4: \n\t"
- "movq (%%esi), %%mm0 \n\t" // x x 5 4 3 2 1 0
- "movq %%mm0, %%mm1 \n\t" // x x 5 4 3 2 1 0
- "movq %%mm0, %%mm2 \n\t" // x x 5 4 3 2 1 0
- "psllq $24, %%mm0 \n\t" // 4 3 2 1 0 z z z
- "pand _const4, %%mm1 \n\t" // z z z z z 2 1 0
- "psrlq $24, %%mm2 \n\t" // z z z x x 5 4 3
- "por %%mm1, %%mm0 \n\t" // 4 3 2 1 0 2 1 0
- "movq %%mm2, %%mm3 \n\t" // z z z x x 5 4 3
- "psllq $8, %%mm2 \n\t" // z z x x 5 4 3 z
- "movq %%mm0, (%%edi) \n\t"
- "psrlq $16, %%mm3 \n\t" // z z z z z x x 5
- "pand _const6, %%mm3 \n\t" // z z z z z z z 5
- "por %%mm3, %%mm2 \n\t" // z z x x 5 4 3 5
- "subl $6, %%esi \n\t"
- "movd %%mm2, 8(%%edi) \n\t"
- "subl $12, %%edi \n\t"
- "subl $2, %%ecx \n\t"
- "jnz .loop3_pass4 \n\t"
- "EMMS \n\t" // DONE
-
- : "=c" (dummy_value_c), // output regs (dummy)
- "=S" (dummy_value_S),
- "=D" (dummy_value_D)
-
- : "1" (sptr), // esi // input regs
- "2" (dp), // edi
- "0" (width_mmx) // ecx
-
-#if 0 /* %mm0, ..., %mm3 not supported by gcc 2.7.2.3 or egcs 1.1 */
- : "%mm0", "%mm1" // clobber list
- , "%mm2", "%mm3"
-#endif
- );
- }
-
- sptr -= width_mmx*3;
- dp -= width_mmx*6;
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
-
- png_memcpy(v, sptr, 3);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- png_memcpy(dp, v, 3);
- dp -= 3;
- }
- sptr -= 3;
- }
- }
- } /* end of pixel_bytes == 3 */
-
- //--------------------------------------------------------------
- else if (pixel_bytes == 1)
- {
- if (((pass == 0) || (pass == 1)) && width)
- {
- int width_mmx = ((width >> 2) << 2);
- width -= width_mmx; // 0-3 pixels => 0-3 bytes
- if (width_mmx)
- {
- int dummy_value_c; // fix 'forbidden register spilled'
- int dummy_value_S;
- int dummy_value_D;
-
- __asm__ __volatile__ (
- "subl $3, %%esi \n\t"
- "subl $31, %%edi \n\t"
-
- ".loop1_pass0: \n\t"
- "movd (%%esi), %%mm0 \n\t" // x x x x 3 2 1 0
- "movq %%mm0, %%mm1 \n\t" // x x x x 3 2 1 0
- "punpcklbw %%mm0, %%mm0 \n\t" // 3 3 2 2 1 1 0 0
- "movq %%mm0, %%mm2 \n\t" // 3 3 2 2 1 1 0 0
- "punpcklwd %%mm0, %%mm0 \n\t" // 1 1 1 1 0 0 0 0
- "movq %%mm0, %%mm3 \n\t" // 1 1 1 1 0 0 0 0
- "punpckldq %%mm0, %%mm0 \n\t" // 0 0 0 0 0 0 0 0
- "punpckhdq %%mm3, %%mm3 \n\t" // 1 1 1 1 1 1 1 1
- "movq %%mm0, (%%edi) \n\t"
- "punpckhwd %%mm2, %%mm2 \n\t" // 3 3 3 3 2 2 2 2
- "movq %%mm3, 8(%%edi) \n\t"
- "movq %%mm2, %%mm4 \n\t" // 3 3 3 3 2 2 2 2
- "punpckldq %%mm2, %%mm2 \n\t" // 2 2 2 2 2 2 2 2
- "punpckhdq %%mm4, %%mm4 \n\t" // 3 3 3 3 3 3 3 3
- "movq %%mm2, 16(%%edi) \n\t"
- "subl $4, %%esi \n\t"
- "movq %%mm4, 24(%%edi) \n\t"
- "subl $32, %%edi \n\t"
- "subl $4, %%ecx \n\t"
- "jnz .loop1_pass0 \n\t"
- "EMMS \n\t" // DONE
-
- : "=c" (dummy_value_c), // output regs (dummy)
- "=S" (dummy_value_S),
- "=D" (dummy_value_D)
-
- : "1" (sptr), // esi // input regs
- "2" (dp), // edi
- "0" (width_mmx) // ecx
-
-#if 0 /* %mm0, ..., %mm4 not supported by gcc 2.7.2.3 or egcs 1.1 */
- : "%mm0", "%mm1", "%mm2" // clobber list
- , "%mm3", "%mm4"
-#endif
- );
- }
-
- sptr -= width_mmx;
- dp -= width_mmx*8;
- for (i = width; i; i--)
- {
- int j;
-
- /* I simplified this part in version 1.0.4e
- * here and in several other instances where
- * pixel_bytes == 1 -- GR-P
- *
- * Original code:
- *
- * png_byte v[8];
- * png_memcpy(v, sptr, pixel_bytes);
- * for (j = 0; j < png_pass_inc[pass]; j++)
- * {
- * png_memcpy(dp, v, pixel_bytes);
- * dp -= pixel_bytes;
- * }
- * sptr -= pixel_bytes;
- *
- * Replacement code is in the next three lines:
- */
-
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- *dp-- = *sptr;
- }
- --sptr;
- }
- }
- else if (((pass == 2) || (pass == 3)) && width)
- {
- int width_mmx = ((width >> 2) << 2);
- width -= width_mmx; // 0-3 pixels => 0-3 bytes
- if (width_mmx)
- {
- int dummy_value_c; // fix 'forbidden register spilled'
- int dummy_value_S;
- int dummy_value_D;
-
- __asm__ __volatile__ (
- "subl $3, %%esi \n\t"
- "subl $15, %%edi \n\t"
-
- ".loop1_pass2: \n\t"
- "movd (%%esi), %%mm0 \n\t" // x x x x 3 2 1 0
- "punpcklbw %%mm0, %%mm0 \n\t" // 3 3 2 2 1 1 0 0
- "movq %%mm0, %%mm1 \n\t" // 3 3 2 2 1 1 0 0
- "punpcklwd %%mm0, %%mm0 \n\t" // 1 1 1 1 0 0 0 0
- "punpckhwd %%mm1, %%mm1 \n\t" // 3 3 3 3 2 2 2 2
- "movq %%mm0, (%%edi) \n\t"
- "subl $4, %%esi \n\t"
- "movq %%mm1, 8(%%edi) \n\t"
- "subl $16, %%edi \n\t"
- "subl $4, %%ecx \n\t"
- "jnz .loop1_pass2 \n\t"
- "EMMS \n\t" // DONE
-
- : "=c" (dummy_value_c), // output regs (dummy)
- "=S" (dummy_value_S),
- "=D" (dummy_value_D)
-
- : "1" (sptr), // esi // input regs
- "2" (dp), // edi
- "0" (width_mmx) // ecx
-
-#if 0 /* %mm0, %mm1 not supported by gcc 2.7.2.3 or egcs 1.1 */
- : "%mm0", "%mm1" // clobber list
-#endif
- );
- }
-
- sptr -= width_mmx;
- dp -= width_mmx*4;
- for (i = width; i; i--)
- {
- int j;
-
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- *dp-- = *sptr;
- }
- --sptr;
- }
- }
- else if (width) /* && ((pass == 4) || (pass == 5)) */
- {
- int width_mmx = ((width >> 3) << 3);
- width -= width_mmx; // 0-3 pixels => 0-3 bytes
- if (width_mmx)
- {
- int dummy_value_c; // fix 'forbidden register spilled'
- int dummy_value_S;
- int dummy_value_D;
-
- __asm__ __volatile__ (
- "subl $7, %%esi \n\t"
- "subl $15, %%edi \n\t"
-
- ".loop1_pass4: \n\t"
- "movq (%%esi), %%mm0 \n\t" // 7 6 5 4 3 2 1 0
- "movq %%mm0, %%mm1 \n\t" // 7 6 5 4 3 2 1 0
- "punpcklbw %%mm0, %%mm0 \n\t" // 3 3 2 2 1 1 0 0
- "punpckhbw %%mm1, %%mm1 \n\t" // 7 7 6 6 5 5 4 4
- "movq %%mm1, 8(%%edi) \n\t"
- "subl $8, %%esi \n\t"
- "movq %%mm0, (%%edi) \n\t"
- "subl $16, %%edi \n\t"
- "subl $8, %%ecx \n\t"
- "jnz .loop1_pass4 \n\t"
- "EMMS \n\t" // DONE
-
- : "=c" (dummy_value_c), // output regs (none)
- "=S" (dummy_value_S),
- "=D" (dummy_value_D)
-
- : "1" (sptr), // esi // input regs
- "2" (dp), // edi
- "0" (width_mmx) // ecx
-
-#if 0 /* %mm0, %mm1 not supported by gcc 2.7.2.3 or egcs 1.1 */
- : "%mm0", "%mm1" // clobber list
-#endif
- );
- }
-
- sptr -= width_mmx;
- dp -= width_mmx*2;
- for (i = width; i; i--)
- {
- int j;
-
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- *dp-- = *sptr;
- }
- --sptr;
- }
- }
- } /* end of pixel_bytes == 1 */
-
- //--------------------------------------------------------------
- else if (pixel_bytes == 2)
- {
- if (((pass == 0) || (pass == 1)) && width)
- {
- int width_mmx = ((width >> 1) << 1);
- width -= width_mmx; // 0,1 pixels => 0,2 bytes
- if (width_mmx)
- {
- int dummy_value_c; // fix 'forbidden register spilled'
- int dummy_value_S;
- int dummy_value_D;
-
- __asm__ __volatile__ (
- "subl $2, %%esi \n\t"
- "subl $30, %%edi \n\t"
-
- ".loop2_pass0: \n\t"
- "movd (%%esi), %%mm0 \n\t" // x x x x 3 2 1 0
- "punpcklwd %%mm0, %%mm0 \n\t" // 3 2 3 2 1 0 1 0
- "movq %%mm0, %%mm1 \n\t" // 3 2 3 2 1 0 1 0
- "punpckldq %%mm0, %%mm0 \n\t" // 1 0 1 0 1 0 1 0
- "punpckhdq %%mm1, %%mm1 \n\t" // 3 2 3 2 3 2 3 2
- "movq %%mm0, (%%edi) \n\t"
- "movq %%mm0, 8(%%edi) \n\t"
- "movq %%mm1, 16(%%edi) \n\t"
- "subl $4, %%esi \n\t"
- "movq %%mm1, 24(%%edi) \n\t"
- "subl $32, %%edi \n\t"
- "subl $2, %%ecx \n\t"
- "jnz .loop2_pass0 \n\t"
- "EMMS \n\t" // DONE
-
- : "=c" (dummy_value_c), // output regs (dummy)
- "=S" (dummy_value_S),
- "=D" (dummy_value_D)
-
- : "1" (sptr), // esi // input regs
- "2" (dp), // edi
- "0" (width_mmx) // ecx
-
-#if 0 /* %mm0, %mm1 not supported by gcc 2.7.2.3 or egcs 1.1 */
- : "%mm0", "%mm1" // clobber list
-#endif
- );
- }
-
- sptr -= (width_mmx*2 - 2); // sign fixed
- dp -= (width_mmx*16 - 2); // sign fixed
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
- sptr -= 2;
- png_memcpy(v, sptr, 2);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- dp -= 2;
- png_memcpy(dp, v, 2);
- }
- }
- }
- else if (((pass == 2) || (pass == 3)) && width)
- {
- int width_mmx = ((width >> 1) << 1) ;
- width -= width_mmx; // 0,1 pixels => 0,2 bytes
- if (width_mmx)
- {
- int dummy_value_c; // fix 'forbidden register spilled'
- int dummy_value_S;
- int dummy_value_D;
-
- __asm__ __volatile__ (
- "subl $2, %%esi \n\t"
- "subl $14, %%edi \n\t"
-
- ".loop2_pass2: \n\t"
- "movd (%%esi), %%mm0 \n\t" // x x x x 3 2 1 0
- "punpcklwd %%mm0, %%mm0 \n\t" // 3 2 3 2 1 0 1 0
- "movq %%mm0, %%mm1 \n\t" // 3 2 3 2 1 0 1 0
- "punpckldq %%mm0, %%mm0 \n\t" // 1 0 1 0 1 0 1 0
- "punpckhdq %%mm1, %%mm1 \n\t" // 3 2 3 2 3 2 3 2
- "movq %%mm0, (%%edi) \n\t"
- "subl $4, %%esi \n\t"
- "movq %%mm1, 8(%%edi) \n\t"
- "subl $16, %%edi \n\t"
- "subl $2, %%ecx \n\t"
- "jnz .loop2_pass2 \n\t"
- "EMMS \n\t" // DONE
-
- : "=c" (dummy_value_c), // output regs (dummy)
- "=S" (dummy_value_S),
- "=D" (dummy_value_D)
-
- : "1" (sptr), // esi // input regs
- "2" (dp), // edi
- "0" (width_mmx) // ecx
-
-#if 0 /* %mm0, %mm1 not supported by gcc 2.7.2.3 or egcs 1.1 */
- : "%mm0", "%mm1" // clobber list
-#endif
- );
- }
-
- sptr -= (width_mmx*2 - 2); // sign fixed
- dp -= (width_mmx*8 - 2); // sign fixed
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
- sptr -= 2;
- png_memcpy(v, sptr, 2);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- dp -= 2;
- png_memcpy(dp, v, 2);
- }
- }
- }
- else if (width) // pass == 4 or 5
- {
- int width_mmx = ((width >> 1) << 1) ;
- width -= width_mmx; // 0,1 pixels => 0,2 bytes
- if (width_mmx)
- {
- int dummy_value_c; // fix 'forbidden register spilled'
- int dummy_value_S;
- int dummy_value_D;
-
- __asm__ __volatile__ (
- "subl $2, %%esi \n\t"
- "subl $6, %%edi \n\t"
-
- ".loop2_pass4: \n\t"
- "movd (%%esi), %%mm0 \n\t" // x x x x 3 2 1 0
- "punpcklwd %%mm0, %%mm0 \n\t" // 3 2 3 2 1 0 1 0
- "subl $4, %%esi \n\t"
- "movq %%mm0, (%%edi) \n\t"
- "subl $8, %%edi \n\t"
- "subl $2, %%ecx \n\t"
- "jnz .loop2_pass4 \n\t"
- "EMMS \n\t" // DONE
-
- : "=c" (dummy_value_c), // output regs (dummy)
- "=S" (dummy_value_S),
- "=D" (dummy_value_D)
-
- : "1" (sptr), // esi // input regs
- "2" (dp), // edi
- "0" (width_mmx) // ecx
-
-#if 0 /* %mm0 not supported by gcc 2.7.2.3 or egcs 1.1 */
- : "%mm0" // clobber list
-#endif
- );
- }
-
- sptr -= (width_mmx*2 - 2); // sign fixed
- dp -= (width_mmx*4 - 2); // sign fixed
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
- sptr -= 2;
- png_memcpy(v, sptr, 2);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- dp -= 2;
- png_memcpy(dp, v, 2);
- }
- }
- }
- } /* end of pixel_bytes == 2 */
-
- //--------------------------------------------------------------
- else if (pixel_bytes == 4)
- {
- if (((pass == 0) || (pass == 1)) && width)
- {
- int width_mmx = ((width >> 1) << 1);
- width -= width_mmx; // 0,1 pixels => 0,4 bytes
- if (width_mmx)
- {
- int dummy_value_c; // fix 'forbidden register spilled'
- int dummy_value_S;
- int dummy_value_D;
-
- __asm__ __volatile__ (
- "subl $4, %%esi \n\t"
- "subl $60, %%edi \n\t"
-
- ".loop4_pass0: \n\t"
- "movq (%%esi), %%mm0 \n\t" // 7 6 5 4 3 2 1 0
- "movq %%mm0, %%mm1 \n\t" // 7 6 5 4 3 2 1 0
- "punpckldq %%mm0, %%mm0 \n\t" // 3 2 1 0 3 2 1 0
- "punpckhdq %%mm1, %%mm1 \n\t" // 7 6 5 4 7 6 5 4
- "movq %%mm0, (%%edi) \n\t"
- "movq %%mm0, 8(%%edi) \n\t"
- "movq %%mm0, 16(%%edi) \n\t"
- "movq %%mm0, 24(%%edi) \n\t"
- "movq %%mm1, 32(%%edi) \n\t"
- "movq %%mm1, 40(%%edi) \n\t"
- "movq %%mm1, 48(%%edi) \n\t"
- "subl $8, %%esi \n\t"
- "movq %%mm1, 56(%%edi) \n\t"
- "subl $64, %%edi \n\t"
- "subl $2, %%ecx \n\t"
- "jnz .loop4_pass0 \n\t"
- "EMMS \n\t" // DONE
-
- : "=c" (dummy_value_c), // output regs (dummy)
- "=S" (dummy_value_S),
- "=D" (dummy_value_D)
-
- : "1" (sptr), // esi // input regs
- "2" (dp), // edi
- "0" (width_mmx) // ecx
-
-#if 0 /* %mm0, %mm1 not supported by gcc 2.7.2.3 or egcs 1.1 */
- : "%mm0", "%mm1" // clobber list
-#endif
- );
- }
-
- sptr -= (width_mmx*4 - 4); // sign fixed
- dp -= (width_mmx*32 - 4); // sign fixed
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
- sptr -= 4;
- png_memcpy(v, sptr, 4);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- dp -= 4;
- png_memcpy(dp, v, 4);
- }
- }
- }
- else if (((pass == 2) || (pass == 3)) && width)
- {
- int width_mmx = ((width >> 1) << 1);
- width -= width_mmx; // 0,1 pixels => 0,4 bytes
- if (width_mmx)
- {
- int dummy_value_c; // fix 'forbidden register spilled'
- int dummy_value_S;
- int dummy_value_D;
-
- __asm__ __volatile__ (
- "subl $4, %%esi \n\t"
- "subl $28, %%edi \n\t"
-
- ".loop4_pass2: \n\t"
- "movq (%%esi), %%mm0 \n\t" // 7 6 5 4 3 2 1 0
- "movq %%mm0, %%mm1 \n\t" // 7 6 5 4 3 2 1 0
- "punpckldq %%mm0, %%mm0 \n\t" // 3 2 1 0 3 2 1 0
- "punpckhdq %%mm1, %%mm1 \n\t" // 7 6 5 4 7 6 5 4
- "movq %%mm0, (%%edi) \n\t"
- "movq %%mm0, 8(%%edi) \n\t"
- "movq %%mm1, 16(%%edi) \n\t"
- "movq %%mm1, 24(%%edi) \n\t"
- "subl $8, %%esi \n\t"
- "subl $32, %%edi \n\t"
- "subl $2, %%ecx \n\t"
- "jnz .loop4_pass2 \n\t"
- "EMMS \n\t" // DONE
-
- : "=c" (dummy_value_c), // output regs (dummy)
- "=S" (dummy_value_S),
- "=D" (dummy_value_D)
-
- : "1" (sptr), // esi // input regs
- "2" (dp), // edi
- "0" (width_mmx) // ecx
-
-#if 0 /* %mm0, %mm1 not supported by gcc 2.7.2.3 or egcs 1.1 */
- : "%mm0", "%mm1" // clobber list
-#endif
- );
- }
-
- sptr -= (width_mmx*4 - 4); // sign fixed
- dp -= (width_mmx*16 - 4); // sign fixed
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
- sptr -= 4;
- png_memcpy(v, sptr, 4);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- dp -= 4;
- png_memcpy(dp, v, 4);
- }
- }
- }
- else if (width) // pass == 4 or 5
- {
- int width_mmx = ((width >> 1) << 1) ;
- width -= width_mmx; // 0,1 pixels => 0,4 bytes
- if (width_mmx)
- {
- int dummy_value_c; // fix 'forbidden register spilled'
- int dummy_value_S;
- int dummy_value_D;
-
- __asm__ __volatile__ (
- "subl $4, %%esi \n\t"
- "subl $12, %%edi \n\t"
-
- ".loop4_pass4: \n\t"
- "movq (%%esi), %%mm0 \n\t" // 7 6 5 4 3 2 1 0
- "movq %%mm0, %%mm1 \n\t" // 7 6 5 4 3 2 1 0
- "punpckldq %%mm0, %%mm0 \n\t" // 3 2 1 0 3 2 1 0
- "punpckhdq %%mm1, %%mm1 \n\t" // 7 6 5 4 7 6 5 4
- "movq %%mm0, (%%edi) \n\t"
- "subl $8, %%esi \n\t"
- "movq %%mm1, 8(%%edi) \n\t"
- "subl $16, %%edi \n\t"
- "subl $2, %%ecx \n\t"
- "jnz .loop4_pass4 \n\t"
- "EMMS \n\t" // DONE
-
- : "=c" (dummy_value_c), // output regs (dummy)
- "=S" (dummy_value_S),
- "=D" (dummy_value_D)
-
- : "1" (sptr), // esi // input regs
- "2" (dp), // edi
- "0" (width_mmx) // ecx
-
-#if 0 /* %mm0, %mm1 not supported by gcc 2.7.2.3 or egcs 1.1 */
- : "%mm0", "%mm1" // clobber list
-#endif
- );
- }
-
- sptr -= (width_mmx*4 - 4); // sign fixed
- dp -= (width_mmx*8 - 4); // sign fixed
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
- sptr -= 4;
- png_memcpy(v, sptr, 4);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- dp -= 4;
- png_memcpy(dp, v, 4);
- }
- }
- }
- } /* end of pixel_bytes == 4 */
-
- //--------------------------------------------------------------
- else if (pixel_bytes == 8)
- {
-// GRR TEST: should work, but needs testing (special 64-bit version of rpng2?)
- // GRR NOTE: no need to combine passes here!
- if (((pass == 0) || (pass == 1)) && width)
- {
- int dummy_value_c; // fix 'forbidden register spilled'
- int dummy_value_S;
- int dummy_value_D;
-
- // source is 8-byte RRGGBBAA
- // dest is 64-byte RRGGBBAA RRGGBBAA RRGGBBAA RRGGBBAA ...
- __asm__ __volatile__ (
- "subl $56, %%edi \n\t" // start of last block
-
- ".loop8_pass0: \n\t"
- "movq (%%esi), %%mm0 \n\t" // 7 6 5 4 3 2 1 0
- "movq %%mm0, (%%edi) \n\t"
- "movq %%mm0, 8(%%edi) \n\t"
- "movq %%mm0, 16(%%edi) \n\t"
- "movq %%mm0, 24(%%edi) \n\t"
- "movq %%mm0, 32(%%edi) \n\t"
- "movq %%mm0, 40(%%edi) \n\t"
- "movq %%mm0, 48(%%edi) \n\t"
- "subl $8, %%esi \n\t"
- "movq %%mm0, 56(%%edi) \n\t"
- "subl $64, %%edi \n\t"
- "decl %%ecx \n\t"
- "jnz .loop8_pass0 \n\t"
- "EMMS \n\t" // DONE
-
- : "=c" (dummy_value_c), // output regs (dummy)
- "=S" (dummy_value_S),
- "=D" (dummy_value_D)
-
- : "1" (sptr), // esi // input regs
- "2" (dp), // edi
- "0" (width) // ecx
-
-#if 0 /* %mm0 not supported by gcc 2.7.2.3 or egcs 1.1 */
- : "%mm0" // clobber list
-#endif
- );
- }
- else if (((pass == 2) || (pass == 3)) && width)
- {
- // source is 8-byte RRGGBBAA
- // dest is 32-byte RRGGBBAA RRGGBBAA RRGGBBAA RRGGBBAA
- int width_mmx = ((width >> 1) << 1) ;
- width -= width_mmx;
- if (width_mmx)
- {
- int dummy_value_c; // fix 'forbidden register spilled'
- int dummy_value_S;
- int dummy_value_D;
-
- __asm__ __volatile__ (
- "subl $24, %%edi \n\t" // start of last block
-
- ".loop8_pass2: \n\t"
- "movq (%%esi), %%mm0 \n\t" // 7 6 5 4 3 2 1 0
- "movq %%mm0, (%%edi) \n\t"
- "movq %%mm0, 8(%%edi) \n\t"
- "movq %%mm0, 16(%%edi) \n\t"
- "subl $8, %%esi \n\t"
- "movq %%mm0, 24(%%edi) \n\t"
- "subl $32, %%edi \n\t"
- "decl %%ecx \n\t"
- "jnz .loop8_pass2 \n\t"
- "EMMS \n\t" // DONE
-
- : "=c" (dummy_value_c), // output regs (dummy)
- "=S" (dummy_value_S),
- "=D" (dummy_value_D)
-
- : "1" (sptr), // esi // input regs
- "2" (dp), // edi
- "0" (width) // ecx
-
-#if 0 /* %mm0 not supported by gcc 2.7.2.3 or egcs 1.1 */
- : "%mm0" // clobber list
-#endif
- );
- }
- }
- else if (width) // pass == 4 or 5
- {
- // source is 8-byte RRGGBBAA
- // dest is 16-byte RRGGBBAA RRGGBBAA
- int width_mmx = ((width >> 1) << 1) ;
- width -= width_mmx;
- if (width_mmx)
- {
- int dummy_value_c; // fix 'forbidden register spilled'
- int dummy_value_S;
- int dummy_value_D;
-
- __asm__ __volatile__ (
- "subl $8, %%edi \n\t" // start of last block
-
- ".loop8_pass4: \n\t"
- "movq (%%esi), %%mm0 \n\t" // 7 6 5 4 3 2 1 0
- "movq %%mm0, (%%edi) \n\t"
- "subl $8, %%esi \n\t"
- "movq %%mm0, 8(%%edi) \n\t"
- "subl $16, %%edi \n\t"
- "decl %%ecx \n\t"
- "jnz .loop8_pass4 \n\t"
- "EMMS \n\t" // DONE
-
- : "=c" (dummy_value_c), // output regs (dummy)
- "=S" (dummy_value_S),
- "=D" (dummy_value_D)
-
- : "1" (sptr), // esi // input regs
- "2" (dp), // edi
- "0" (width) // ecx
-
-#if 0 /* %mm0 not supported by gcc 2.7.2.3 or egcs 1.1 */
- : "%mm0" // clobber list
-#endif
- );
- }
- }
-
- } /* end of pixel_bytes == 8 */
-
- //--------------------------------------------------------------
- else if (pixel_bytes == 6)
- {
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
- png_memcpy(v, sptr, 6);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- png_memcpy(dp, v, 6);
- dp -= 6;
- }
- sptr -= 6;
- }
- } /* end of pixel_bytes == 6 */
-
- //--------------------------------------------------------------
- else
- {
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
- png_memcpy(v, sptr, pixel_bytes);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- png_memcpy(dp, v, pixel_bytes);
- dp -= pixel_bytes;
- }
- sptr-= pixel_bytes;
- }
- }
- } // end of _mmx_supported ========================================
-
- else /* MMX not supported: use modified C code - takes advantage
- * of inlining of png_memcpy for a constant */
- /* GRR 19991007: does it? or should pixel_bytes in each
- * block be replaced with immediate value (e.g., 1)? */
- /* GRR 19991017: replaced with constants in each case */
-#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */
- {
- if (pixel_bytes == 1)
- {
- for (i = width; i; i--)
- {
- int j;
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- *dp-- = *sptr;
- }
- --sptr;
- }
- }
- else if (pixel_bytes == 3)
- {
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
- png_memcpy(v, sptr, 3);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- png_memcpy(dp, v, 3);
- dp -= 3;
- }
- sptr -= 3;
- }
- }
- else if (pixel_bytes == 2)
- {
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
- png_memcpy(v, sptr, 2);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- png_memcpy(dp, v, 2);
- dp -= 2;
- }
- sptr -= 2;
- }
- }
- else if (pixel_bytes == 4)
- {
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
- png_memcpy(v, sptr, 4);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
-#ifdef PNG_DEBUG
- if (dp < row || dp+3 > row+png_ptr->row_buf_size)
- {
- printf("dp out of bounds: row=%d, dp=%d, rp=%d\n",
- row, dp, row+png_ptr->row_buf_size);
- printf("row_buf=%d\n",png_ptr->row_buf_size);
- }
-#endif
- png_memcpy(dp, v, 4);
- dp -= 4;
- }
- sptr -= 4;
- }
- }
- else if (pixel_bytes == 6)
- {
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
- png_memcpy(v, sptr, 6);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- png_memcpy(dp, v, 6);
- dp -= 6;
- }
- sptr -= 6;
- }
- }
- else if (pixel_bytes == 8)
- {
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
- png_memcpy(v, sptr, 8);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- png_memcpy(dp, v, 8);
- dp -= 8;
- }
- sptr -= 8;
- }
- }
- else /* GRR: should never be reached */
- {
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
- png_memcpy(v, sptr, pixel_bytes);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- png_memcpy(dp, v, pixel_bytes);
- dp -= pixel_bytes;
- }
- sptr -= pixel_bytes;
- }
- }
-
- } /* end if (MMX not supported) */
- break;
- }
- } /* end switch (row_info->pixel_depth) */
-
- row_info->width = final_width;
- row_info->rowbytes = ((final_width *
- (png_uint_32)row_info->pixel_depth + 7) >> 3);
- }
-
-} /* end png_do_read_interlace() */
-
-#endif /* PNG_HAVE_ASSEMBLER_READ_INTERLACE */
-#endif /* PNG_READ_INTERLACING_SUPPORTED */
-
-
-
-#if defined(PNG_HAVE_ASSEMBLER_READ_FILTER_ROW)
-#if defined(PNG_ASSEMBLER_CODE_SUPPORTED)
-
-// These variables are utilized in the functions below. They are declared
-// globally here to ensure alignment on 8-byte boundaries.
-
-union uAll {
- long long use;
- double align;
-} _LBCarryMask = {0x0101010101010101LL},
- _HBClearMask = {0x7f7f7f7f7f7f7f7fLL},
- _ActiveMask, _ActiveMask2, _ActiveMaskEnd, _ShiftBpp, _ShiftRem;
-
-#ifdef PNG_THREAD_UNSAFE_OK
-//===========================================================================//
-// //
-// P N G _ R E A D _ F I L T E R _ R O W _ M M X _ A V G //
-// //
-//===========================================================================//
-
-// Optimized code for PNG Average filter decoder
-
-static void /* PRIVATE */
-png_read_filter_row_mmx_avg(png_row_infop row_info, png_bytep row,
- png_bytep prev_row)
-{
- int bpp;
- int dummy_value_c; // fix 'forbidden register 2 (cx) was spilled' error
- int dummy_value_S;
- int dummy_value_D;
-
- bpp = (row_info->pixel_depth + 7) >> 3; // get # bytes per pixel
- _FullLength = row_info->rowbytes; // # of bytes to filter
-
- __asm__ __volatile__ (
- // initialize address pointers and offset
-#ifdef __PIC__
- "pushl %%ebx \n\t" // save index to Global Offset Table
-#endif
-//pre "movl row, %%edi \n\t" // edi: Avg(x)
- "xorl %%ebx, %%ebx \n\t" // ebx: x
- "movl %%edi, %%edx \n\t"
-//pre "movl prev_row, %%esi \n\t" // esi: Prior(x)
-//pre "subl bpp, %%edx \n\t" // (bpp is preloaded into ecx)
- "subl %%ecx, %%edx \n\t" // edx: Raw(x-bpp)
-
- "xorl %%eax,%%eax \n\t"
-
- // Compute the Raw value for the first bpp bytes
- // Raw(x) = Avg(x) + (Prior(x)/2)
- "avg_rlp: \n\t"
- "movb (%%esi,%%ebx,),%%al \n\t" // load al with Prior(x)
- "incl %%ebx \n\t"
- "shrb %%al \n\t" // divide by 2
- "addb -1(%%edi,%%ebx,),%%al \n\t" // add Avg(x); -1 to offset inc ebx
-//pre "cmpl bpp, %%ebx \n\t" // (bpp is preloaded into ecx)
- "cmpl %%ecx, %%ebx \n\t"
- "movb %%al,-1(%%edi,%%ebx,) \n\t" // write Raw(x); -1 to offset inc ebx
- "jb avg_rlp \n\t" // mov does not affect flags
-
- // get # of bytes to alignment
- "movl %%edi, _dif \n\t" // take start of row
- "addl %%ebx, _dif \n\t" // add bpp
- "addl $0xf, _dif \n\t" // add 7+8 to incr past alignment bdry
- "andl $0xfffffff8, _dif \n\t" // mask to alignment boundary
- "subl %%edi, _dif \n\t" // subtract from start => value ebx at
- "jz avg_go \n\t" // alignment
-
- // fix alignment
- // Compute the Raw value for the bytes up to the alignment boundary
- // Raw(x) = Avg(x) + ((Raw(x-bpp) + Prior(x))/2)
- "xorl %%ecx, %%ecx \n\t"
-
- "avg_lp1: \n\t"
- "xorl %%eax, %%eax \n\t"
- "movb (%%esi,%%ebx,), %%cl \n\t" // load cl with Prior(x)
- "movb (%%edx,%%ebx,), %%al \n\t" // load al with Raw(x-bpp)
- "addw %%cx, %%ax \n\t"
- "incl %%ebx \n\t"
- "shrw %%ax \n\t" // divide by 2
- "addb -1(%%edi,%%ebx,), %%al \n\t" // add Avg(x); -1 to offset inc ebx
- "cmpl _dif, %%ebx \n\t" // check if at alignment boundary
- "movb %%al, -1(%%edi,%%ebx,) \n\t" // write Raw(x); -1 to offset inc ebx
- "jb avg_lp1 \n\t" // repeat until at alignment boundary
-
- "avg_go: \n\t"
- "movl _FullLength, %%eax \n\t"
- "movl %%eax, %%ecx \n\t"
- "subl %%ebx, %%eax \n\t" // subtract alignment fix
- "andl $0x00000007, %%eax \n\t" // calc bytes over mult of 8
- "subl %%eax, %%ecx \n\t" // drop over bytes from original length
- "movl %%ecx, _MMXLength \n\t"
-#ifdef __PIC__
- "popl %%ebx \n\t" // restore index to Global Offset Table
-#endif
-
- : "=c" (dummy_value_c), // output regs (dummy)
- "=S" (dummy_value_S),
- "=D" (dummy_value_D)
-
- : "0" (bpp), // ecx // input regs
- "1" (prev_row), // esi
- "2" (row) // edi
-
- : "%eax", "%edx" // clobber list
-#ifndef __PIC__
- , "%ebx"
-#endif
- // GRR: INCLUDE "memory" as clobbered? (_dif, _MMXLength)
- // (seems to work fine without...)
- );
-
- // now do the math for the rest of the row
- switch (bpp)
- {
- case 3:
- {
- _ActiveMask.use = 0x0000000000ffffffLL;
- _ShiftBpp.use = 24; // == 3 * 8
- _ShiftRem.use = 40; // == 64 - 24
-
- __asm__ __volatile__ (
- // re-init address pointers and offset
- "movq _ActiveMask, %%mm7 \n\t"
- "movl _dif, %%ecx \n\t" // ecx: x = offset to
- "movq _LBCarryMask, %%mm5 \n\t" // alignment boundary
-// preload "movl row, %%edi \n\t" // edi: Avg(x)
- "movq _HBClearMask, %%mm4 \n\t"
-// preload "movl prev_row, %%esi \n\t" // esi: Prior(x)
-
- // prime the pump: load the first Raw(x-bpp) data set
- "movq -8(%%edi,%%ecx,), %%mm2 \n\t" // load previous aligned 8 bytes
- // (correct pos. in loop below)
- "avg_3lp: \n\t"
- "movq (%%edi,%%ecx,), %%mm0 \n\t" // load mm0 with Avg(x)
- "movq %%mm5, %%mm3 \n\t"
- "psrlq _ShiftRem, %%mm2 \n\t" // correct position Raw(x-bpp)
- // data
- "movq (%%esi,%%ecx,), %%mm1 \n\t" // load mm1 with Prior(x)
- "movq %%mm7, %%mm6 \n\t"
- "pand %%mm1, %%mm3 \n\t" // get lsb for each prev_row byte
- "psrlq $1, %%mm1 \n\t" // divide prev_row bytes by 2
- "pand %%mm4, %%mm1 \n\t" // clear invalid bit 7 of each
- // byte
- "paddb %%mm1, %%mm0 \n\t" // add (Prev_row/2) to Avg for
- // each byte
- // add 1st active group (Raw(x-bpp)/2) to average with LBCarry
- "movq %%mm3, %%mm1 \n\t" // now use mm1 for getting
- // LBCarrys
- "pand %%mm2, %%mm1 \n\t" // get LBCarrys for each byte
- // where both
- // lsb's were == 1 (only valid for active group)
- "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2
- "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each
- // byte
- "paddb %%mm1, %%mm2 \n\t" // add LBCarrys to (Raw(x-bpp)/2)
- // for each byte
- "pand %%mm6, %%mm2 \n\t" // leave only Active Group 1
- // bytes to add to Avg
- "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) + LBCarrys to
- // Avg for each Active
- // byte
- // add 2nd active group (Raw(x-bpp)/2) to average with _LBCarry
- "psllq _ShiftBpp, %%mm6 \n\t" // shift the mm6 mask to cover
- // bytes 3-5
- "movq %%mm0, %%mm2 \n\t" // mov updated Raws to mm2
- "psllq _ShiftBpp, %%mm2 \n\t" // shift data to pos. correctly
- "movq %%mm3, %%mm1 \n\t" // now use mm1 for getting
- // LBCarrys
- "pand %%mm2, %%mm1 \n\t" // get LBCarrys for each byte
- // where both
- // lsb's were == 1 (only valid for active group)
- "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2
- "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each
- // byte
- "paddb %%mm1, %%mm2 \n\t" // add LBCarrys to (Raw(x-bpp)/2)
- // for each byte
- "pand %%mm6, %%mm2 \n\t" // leave only Active Group 2
- // bytes to add to Avg
- "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) + LBCarrys to
- // Avg for each Active
- // byte
-
- // add 3rd active group (Raw(x-bpp)/2) to average with _LBCarry
- "psllq _ShiftBpp, %%mm6 \n\t" // shift mm6 mask to cover last
- // two
- // bytes
- "movq %%mm0, %%mm2 \n\t" // mov updated Raws to mm2
- "psllq _ShiftBpp, %%mm2 \n\t" // shift data to pos. correctly
- // Data only needs to be shifted once here to
- // get the correct x-bpp offset.
- "movq %%mm3, %%mm1 \n\t" // now use mm1 for getting
- // LBCarrys
- "pand %%mm2, %%mm1 \n\t" // get LBCarrys for each byte
- // where both
- // lsb's were == 1 (only valid for active group)
- "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2
- "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each
- // byte
- "paddb %%mm1, %%mm2 \n\t" // add LBCarrys to (Raw(x-bpp)/2)
- // for each byte
- "pand %%mm6, %%mm2 \n\t" // leave only Active Group 2
- // bytes to add to Avg
- "addl $8, %%ecx \n\t"
- "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) + LBCarrys to
- // Avg for each Active
- // byte
- // now ready to write back to memory
- "movq %%mm0, -8(%%edi,%%ecx,) \n\t"
- // move updated Raw(x) to use as Raw(x-bpp) for next loop
- "cmpl _MMXLength, %%ecx \n\t"
- "movq %%mm0, %%mm2 \n\t" // mov updated Raw(x) to mm2
- "jb avg_3lp \n\t"
-
- : "=S" (dummy_value_S), // output regs (dummy)
- "=D" (dummy_value_D)
-
- : "0" (prev_row), // esi // input regs
- "1" (row) // edi
-
- : "%ecx" // clobber list
-#if 0 /* %mm0, ..., %mm7 not supported by gcc 2.7.2.3 or egcs 1.1 */
- , "%mm0", "%mm1", "%mm2", "%mm3"
- , "%mm4", "%mm5", "%mm6", "%mm7"
-#endif
- );
- }
- break; // end 3 bpp
-
- case 6:
- case 4:
- //case 7: // who wrote this? PNG doesn't support 5 or 7 bytes/pixel
- //case 5: // GRR BOGUS
- {
- _ActiveMask.use = 0xffffffffffffffffLL; // use shift below to clear
- // appropriate inactive bytes
- _ShiftBpp.use = bpp << 3;
- _ShiftRem.use = 64 - _ShiftBpp.use;
-
- __asm__ __volatile__ (
- "movq _HBClearMask, %%mm4 \n\t"
-
- // re-init address pointers and offset
- "movl _dif, %%ecx \n\t" // ecx: x = offset to
- // alignment boundary
-
- // load _ActiveMask and clear all bytes except for 1st active group
- "movq _ActiveMask, %%mm7 \n\t"
-// preload "movl row, %%edi \n\t" // edi: Avg(x)
- "psrlq _ShiftRem, %%mm7 \n\t"
-// preload "movl prev_row, %%esi \n\t" // esi: Prior(x)
- "movq %%mm7, %%mm6 \n\t"
- "movq _LBCarryMask, %%mm5 \n\t"
- "psllq _ShiftBpp, %%mm6 \n\t" // create mask for 2nd active
- // group
-
- // prime the pump: load the first Raw(x-bpp) data set
- "movq -8(%%edi,%%ecx,), %%mm2 \n\t" // load previous aligned 8 bytes
- // (we correct pos. in loop below)
- "avg_4lp: \n\t"
- "movq (%%edi,%%ecx,), %%mm0 \n\t"
- "psrlq _ShiftRem, %%mm2 \n\t" // shift data to pos. correctly
- "movq (%%esi,%%ecx,), %%mm1 \n\t"
- // add (Prev_row/2) to average
- "movq %%mm5, %%mm3 \n\t"
- "pand %%mm1, %%mm3 \n\t" // get lsb for each prev_row byte
- "psrlq $1, %%mm1 \n\t" // divide prev_row bytes by 2
- "pand %%mm4, %%mm1 \n\t" // clear invalid bit 7 of each
- // byte
- "paddb %%mm1, %%mm0 \n\t" // add (Prev_row/2) to Avg for
- // each byte
- // add 1st active group (Raw(x-bpp)/2) to average with _LBCarry
- "movq %%mm3, %%mm1 \n\t" // now use mm1 for getting
- // LBCarrys
- "pand %%mm2, %%mm1 \n\t" // get LBCarrys for each byte
- // where both
- // lsb's were == 1 (only valid for active group)
- "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2
- "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each
- // byte
- "paddb %%mm1, %%mm2 \n\t" // add LBCarrys to (Raw(x-bpp)/2)
- // for each byte
- "pand %%mm7, %%mm2 \n\t" // leave only Active Group 1
- // bytes to add to Avg
- "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) + LBCarrys to Avg
- // for each Active
- // byte
- // add 2nd active group (Raw(x-bpp)/2) to average with _LBCarry
- "movq %%mm0, %%mm2 \n\t" // mov updated Raws to mm2
- "psllq _ShiftBpp, %%mm2 \n\t" // shift data to pos. correctly
- "addl $8, %%ecx \n\t"
- "movq %%mm3, %%mm1 \n\t" // now use mm1 for getting
- // LBCarrys
- "pand %%mm2, %%mm1 \n\t" // get LBCarrys for each byte
- // where both
- // lsb's were == 1 (only valid for active group)
- "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2
- "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each
- // byte
- "paddb %%mm1, %%mm2 \n\t" // add LBCarrys to (Raw(x-bpp)/2)
- // for each byte
- "pand %%mm6, %%mm2 \n\t" // leave only Active Group 2
- // bytes to add to Avg
- "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) + LBCarrys to
- // Avg for each Active
- // byte
- "cmpl _MMXLength, %%ecx \n\t"
- // now ready to write back to memory
- "movq %%mm0, -8(%%edi,%%ecx,) \n\t"
- // prep Raw(x-bpp) for next loop
- "movq %%mm0, %%mm2 \n\t" // mov updated Raws to mm2
- "jb avg_4lp \n\t"
-
- : "=S" (dummy_value_S), // output regs (dummy)
- "=D" (dummy_value_D)
-
- : "0" (prev_row), // esi // input regs
- "1" (row) // edi
-
- : "%ecx" // clobber list
-#if 0 /* %mm0, ..., %mm7 not supported by gcc 2.7.2.3 or egcs 1.1 */
- , "%mm0", "%mm1", "%mm2", "%mm3"
- , "%mm4", "%mm5", "%mm6", "%mm7"
-#endif
- );
- }
- break; // end 4,6 bpp
-
- case 2:
- {
- _ActiveMask.use = 0x000000000000ffffLL;
- _ShiftBpp.use = 16; // == 2 * 8
- _ShiftRem.use = 48; // == 64 - 16
-
- __asm__ __volatile__ (
- // load _ActiveMask
- "movq _ActiveMask, %%mm7 \n\t"
- // re-init address pointers and offset
- "movl _dif, %%ecx \n\t" // ecx: x = offset to alignment
- // boundary
- "movq _LBCarryMask, %%mm5 \n\t"
-// preload "movl row, %%edi \n\t" // edi: Avg(x)
- "movq _HBClearMask, %%mm4 \n\t"
-// preload "movl prev_row, %%esi \n\t" // esi: Prior(x)
-
- // prime the pump: load the first Raw(x-bpp) data set
- "movq -8(%%edi,%%ecx,), %%mm2 \n\t" // load previous aligned 8 bytes
- // (we correct pos. in loop below)
- "avg_2lp: \n\t"
- "movq (%%edi,%%ecx,), %%mm0 \n\t"
- "psrlq _ShiftRem, %%mm2 \n\t" // shift data to pos. correctly
- "movq (%%esi,%%ecx,), %%mm1 \n\t" // (GRR BUGFIX: was psllq)
- // add (Prev_row/2) to average
- "movq %%mm5, %%mm3 \n\t"
- "pand %%mm1, %%mm3 \n\t" // get lsb for each prev_row byte
- "psrlq $1, %%mm1 \n\t" // divide prev_row bytes by 2
- "pand %%mm4, %%mm1 \n\t" // clear invalid bit 7 of each
- // byte
- "movq %%mm7, %%mm6 \n\t"
- "paddb %%mm1, %%mm0 \n\t" // add (Prev_row/2) to Avg for
- // each byte
-
- // add 1st active group (Raw(x-bpp)/2) to average with _LBCarry
- "movq %%mm3, %%mm1 \n\t" // now use mm1 for getting
- // LBCarrys
- "pand %%mm2, %%mm1 \n\t" // get LBCarrys for each byte
- // where both
- // lsb's were == 1 (only valid
- // for active group)
- "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2
- "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each
- // byte
- "paddb %%mm1, %%mm2 \n\t" // add LBCarrys to (Raw(x-bpp)/2)
- // for each byte
- "pand %%mm6, %%mm2 \n\t" // leave only Active Group 1
- // bytes to add to Avg
- "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) + LBCarrys to Avg
- // for each Active byte
-
- // add 2nd active group (Raw(x-bpp)/2) to average with _LBCarry
- "psllq _ShiftBpp, %%mm6 \n\t" // shift the mm6 mask to cover
- // bytes 2 & 3
- "movq %%mm0, %%mm2 \n\t" // mov updated Raws to mm2
- "psllq _ShiftBpp, %%mm2 \n\t" // shift data to pos. correctly
- "movq %%mm3, %%mm1 \n\t" // now use mm1 for getting
- // LBCarrys
- "pand %%mm2, %%mm1 \n\t" // get LBCarrys for each byte
- // where both
- // lsb's were == 1 (only valid
- // for active group)
- "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2
- "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each
- // byte
- "paddb %%mm1, %%mm2 \n\t" // add LBCarrys to (Raw(x-bpp)/2)
- // for each byte
- "pand %%mm6, %%mm2 \n\t" // leave only Active Group 2
- // bytes to add to Avg
- "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) + LBCarrys to
- // Avg for each Active byte
-
- // add 3rd active group (Raw(x-bpp)/2) to average with _LBCarry
- "psllq _ShiftBpp, %%mm6 \n\t" // shift the mm6 mask to cover
- // bytes 4 & 5
- "movq %%mm0, %%mm2 \n\t" // mov updated Raws to mm2
- "psllq _ShiftBpp, %%mm2 \n\t" // shift data to pos. correctly
- "movq %%mm3, %%mm1 \n\t" // now use mm1 for getting
- // LBCarrys
- "pand %%mm2, %%mm1 \n\t" // get LBCarrys for each byte
- // where both lsb's were == 1
- // (only valid for active group)
- "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2
- "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each
- // byte
- "paddb %%mm1, %%mm2 \n\t" // add LBCarrys to (Raw(x-bpp)/2)
- // for each byte
- "pand %%mm6, %%mm2 \n\t" // leave only Active Group 2
- // bytes to add to Avg
- "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) + LBCarrys to
- // Avg for each Active byte
-
- // add 4th active group (Raw(x-bpp)/2) to average with _LBCarry
- "psllq _ShiftBpp, %%mm6 \n\t" // shift the mm6 mask to cover
- // bytes 6 & 7
- "movq %%mm0, %%mm2 \n\t" // mov updated Raws to mm2
- "psllq _ShiftBpp, %%mm2 \n\t" // shift data to pos. correctly
- "addl $8, %%ecx \n\t"
- "movq %%mm3, %%mm1 \n\t" // now use mm1 for getting
- // LBCarrys
- "pand %%mm2, %%mm1 \n\t" // get LBCarrys for each byte
- // where both
- // lsb's were == 1 (only valid
- // for active group)
- "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2
- "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each
- // byte
- "paddb %%mm1, %%mm2 \n\t" // add LBCarrys to (Raw(x-bpp)/2)
- // for each byte
- "pand %%mm6, %%mm2 \n\t" // leave only Active Group 2
- // bytes to add to Avg
- "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) + LBCarrys to
- // Avg for each Active byte
-
- "cmpl _MMXLength, %%ecx \n\t"
- // now ready to write back to memory
- "movq %%mm0, -8(%%edi,%%ecx,) \n\t"
- // prep Raw(x-bpp) for next loop
- "movq %%mm0, %%mm2 \n\t" // mov updated Raws to mm2
- "jb avg_2lp \n\t"
-
- : "=S" (dummy_value_S), // output regs (dummy)
- "=D" (dummy_value_D)
-
- : "0" (prev_row), // esi // input regs
- "1" (row) // edi
-
- : "%ecx" // clobber list
-#if 0 /* %mm0, ..., %mm7 not supported by gcc 2.7.2.3 or egcs 1.1 */
- , "%mm0", "%mm1", "%mm2", "%mm3"
- , "%mm4", "%mm5", "%mm6", "%mm7"
-#endif
- );
- }
- break; // end 2 bpp
-
- case 1:
- {
- __asm__ __volatile__ (
- // re-init address pointers and offset
-#ifdef __PIC__
- "pushl %%ebx \n\t" // save Global Offset Table index
-#endif
- "movl _dif, %%ebx \n\t" // ebx: x = offset to alignment
- // boundary
-// preload "movl row, %%edi \n\t" // edi: Avg(x)
- "cmpl _FullLength, %%ebx \n\t" // test if offset at end of array
- "jnb avg_1end \n\t"
- // do Paeth decode for remaining bytes
-// preload "movl prev_row, %%esi \n\t" // esi: Prior(x)
- "movl %%edi, %%edx \n\t"
-// preload "subl bpp, %%edx \n\t" // (bpp is preloaded into ecx)
- "subl %%ecx, %%edx \n\t" // edx: Raw(x-bpp)
- "xorl %%ecx, %%ecx \n\t" // zero ecx before using cl & cx
- // in loop below
- "avg_1lp: \n\t"
- // Raw(x) = Avg(x) + ((Raw(x-bpp) + Prior(x))/2)
- "xorl %%eax, %%eax \n\t"
- "movb (%%esi,%%ebx,), %%cl \n\t" // load cl with Prior(x)
- "movb (%%edx,%%ebx,), %%al \n\t" // load al with Raw(x-bpp)
- "addw %%cx, %%ax \n\t"
- "incl %%ebx \n\t"
- "shrw %%ax \n\t" // divide by 2
- "addb -1(%%edi,%%ebx,), %%al \n\t" // add Avg(x); -1 to offset
- // inc ebx
- "cmpl _FullLength, %%ebx \n\t" // check if at end of array
- "movb %%al, -1(%%edi,%%ebx,) \n\t" // write back Raw(x);
- // mov does not affect flags; -1 to offset inc ebx
- "jb avg_1lp \n\t"
-
- "avg_1end: \n\t"
-#ifdef __PIC__
- "popl %%ebx \n\t" // Global Offset Table index
-#endif
-
- : "=c" (dummy_value_c), // output regs (dummy)
- "=S" (dummy_value_S),
- "=D" (dummy_value_D)
-
- : "0" (bpp), // ecx // input regs
- "1" (prev_row), // esi
- "2" (row) // edi
-
- : "%eax", "%edx" // clobber list
-#ifndef __PIC__
- , "%ebx"
-#endif
- );
- }
- return; // end 1 bpp
-
- case 8:
- {
- __asm__ __volatile__ (
- // re-init address pointers and offset
- "movl _dif, %%ecx \n\t" // ecx: x == offset to alignment
- "movq _LBCarryMask, %%mm5 \n\t" // boundary
-// preload "movl row, %%edi \n\t" // edi: Avg(x)
- "movq _HBClearMask, %%mm4 \n\t"
-// preload "movl prev_row, %%esi \n\t" // esi: Prior(x)
-
- // prime the pump: load the first Raw(x-bpp) data set
- "movq -8(%%edi,%%ecx,), %%mm2 \n\t" // load previous aligned 8 bytes
- // (NO NEED to correct pos. in loop below)
-
- "avg_8lp: \n\t"
- "movq (%%edi,%%ecx,), %%mm0 \n\t"
- "movq %%mm5, %%mm3 \n\t"
- "movq (%%esi,%%ecx,), %%mm1 \n\t"
- "addl $8, %%ecx \n\t"
- "pand %%mm1, %%mm3 \n\t" // get lsb for each prev_row byte
- "psrlq $1, %%mm1 \n\t" // divide prev_row bytes by 2
- "pand %%mm2, %%mm3 \n\t" // get LBCarrys for each byte
- // where both lsb's were == 1
- "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2
- "pand %%mm4, %%mm1 \n\t" // clear invalid bit 7, each byte
- "paddb %%mm3, %%mm0 \n\t" // add LBCarrys to Avg, each byte
- "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7, each byte
- "paddb %%mm1, %%mm0 \n\t" // add (Prev_row/2) to Avg, each
- "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) to Avg for each
- "cmpl _MMXLength, %%ecx \n\t"
- "movq %%mm0, -8(%%edi,%%ecx,) \n\t"
- "movq %%mm0, %%mm2 \n\t" // reuse as Raw(x-bpp)
- "jb avg_8lp \n\t"
-
- : "=S" (dummy_value_S), // output regs (dummy)
- "=D" (dummy_value_D)
-
- : "0" (prev_row), // esi // input regs
- "1" (row) // edi
-
- : "%ecx" // clobber list
-#if 0 /* %mm0, ..., %mm5 not supported by gcc 2.7.2.3 or egcs 1.1 */
- , "%mm0", "%mm1", "%mm2"
- , "%mm3", "%mm4", "%mm5"
-#endif
- );
- }
- break; // end 8 bpp
-
- default: // bpp greater than 8 (!= 1,2,3,4,[5],6,[7],8)
- {
-
-#ifdef PNG_DEBUG
- // GRR: PRINT ERROR HERE: SHOULD NEVER BE REACHED
- png_debug(1,
- "Internal logic error in pnggccrd (png_read_filter_row_mmx_avg())\n");
-#endif
-
-#if 0
- __asm__ __volatile__ (
- "movq _LBCarryMask, %%mm5 \n\t"
- // re-init address pointers and offset
- "movl _dif, %%ebx \n\t" // ebx: x = offset to
- // alignment boundary
- "movl row, %%edi \n\t" // edi: Avg(x)
- "movq _HBClearMask, %%mm4 \n\t"
- "movl %%edi, %%edx \n\t"
- "movl prev_row, %%esi \n\t" // esi: Prior(x)
- "subl bpp, %%edx \n\t" // edx: Raw(x-bpp)
- "avg_Alp: \n\t"
- "movq (%%edi,%%ebx,), %%mm0 \n\t"
- "movq %%mm5, %%mm3 \n\t"
- "movq (%%esi,%%ebx,), %%mm1 \n\t"
- "pand %%mm1, %%mm3 \n\t" // get lsb for each prev_row byte
- "movq (%%edx,%%ebx,), %%mm2 \n\t"
- "psrlq $1, %%mm1 \n\t" // divide prev_row bytes by 2
- "pand %%mm2, %%mm3 \n\t" // get LBCarrys for each byte
- // where both lsb's were == 1
- "psrlq $1, %%mm2 \n\t" // divide raw bytes by 2
- "pand %%mm4, %%mm1 \n\t" // clear invalid bit 7 of each
- // byte
- "paddb %%mm3, %%mm0 \n\t" // add LBCarrys to Avg for each
- // byte
- "pand %%mm4, %%mm2 \n\t" // clear invalid bit 7 of each
- // byte
- "paddb %%mm1, %%mm0 \n\t" // add (Prev_row/2) to Avg for
- // each byte
- "addl $8, %%ebx \n\t"
- "paddb %%mm2, %%mm0 \n\t" // add (Raw/2) to Avg for each
- // byte
- "cmpl _MMXLength, %%ebx \n\t"
- "movq %%mm0, -8(%%edi,%%ebx,) \n\t"
- "jb avg_Alp \n\t"
-
- : // FIXASM: output regs/vars go here, e.g.: "=m" (memory_var)
-
- : // FIXASM: input regs, e.g.: "c" (count), "S" (src), "D" (dest)
-
- : "%ebx", "%edx", "%edi", "%esi" // CHECKASM: clobber list
- );
-#endif /* 0 - NEVER REACHED */
- }
- break;
-
- } // end switch (bpp)
-
- __asm__ __volatile__ (
- // MMX acceleration complete; now do clean-up
- // check if any remaining bytes left to decode
-#ifdef __PIC__
- "pushl %%ebx \n\t" // save index to Global Offset Table
-#endif
- "movl _MMXLength, %%ebx \n\t" // ebx: x == offset bytes after MMX
-//pre "movl row, %%edi \n\t" // edi: Avg(x)
- "cmpl _FullLength, %%ebx \n\t" // test if offset at end of array
- "jnb avg_end \n\t"
-
- // do Avg decode for remaining bytes
-//pre "movl prev_row, %%esi \n\t" // esi: Prior(x)
- "movl %%edi, %%edx \n\t"
-//pre "subl bpp, %%edx \n\t" // (bpp is preloaded into ecx)
- "subl %%ecx, %%edx \n\t" // edx: Raw(x-bpp)
- "xorl %%ecx, %%ecx \n\t" // zero ecx before using cl & cx below
-
- "avg_lp2: \n\t"
- // Raw(x) = Avg(x) + ((Raw(x-bpp) + Prior(x))/2)
- "xorl %%eax, %%eax \n\t"
- "movb (%%esi,%%ebx,), %%cl \n\t" // load cl with Prior(x)
- "movb (%%edx,%%ebx,), %%al \n\t" // load al with Raw(x-bpp)
- "addw %%cx, %%ax \n\t"
- "incl %%ebx \n\t"
- "shrw %%ax \n\t" // divide by 2
- "addb -1(%%edi,%%ebx,), %%al \n\t" // add Avg(x); -1 to offset inc ebx
- "cmpl _FullLength, %%ebx \n\t" // check if at end of array
- "movb %%al, -1(%%edi,%%ebx,) \n\t" // write back Raw(x) [mov does not
- "jb avg_lp2 \n\t" // affect flags; -1 to offset inc ebx]
-
- "avg_end: \n\t"
- "EMMS \n\t" // end MMX; prep for poss. FP instrs.
-#ifdef __PIC__
- "popl %%ebx \n\t" // restore index to Global Offset Table
-#endif
-
- : "=c" (dummy_value_c), // output regs (dummy)
- "=S" (dummy_value_S),
- "=D" (dummy_value_D)
-
- : "0" (bpp), // ecx // input regs
- "1" (prev_row), // esi
- "2" (row) // edi
-
- : "%eax", "%edx" // clobber list
-#ifndef __PIC__
- , "%ebx"
-#endif
- );
-
-} /* end png_read_filter_row_mmx_avg() */
-#endif
-
-
-
-#ifdef PNG_THREAD_UNSAFE_OK
-//===========================================================================//
-// //
-// P N G _ R E A D _ F I L T E R _ R O W _ M M X _ P A E T H //
-// //
-//===========================================================================//
-
-// Optimized code for PNG Paeth filter decoder
-
-static void /* PRIVATE */
-png_read_filter_row_mmx_paeth(png_row_infop row_info, png_bytep row,
- png_bytep prev_row)
-{
- int bpp;
- int dummy_value_c; // fix 'forbidden register 2 (cx) was spilled' error
- int dummy_value_S;
- int dummy_value_D;
-
- bpp = (row_info->pixel_depth + 7) >> 3; // Get # bytes per pixel
- _FullLength = row_info->rowbytes; // # of bytes to filter
-
- __asm__ __volatile__ (
-#ifdef __PIC__
- "pushl %%ebx \n\t" // save index to Global Offset Table
-#endif
- "xorl %%ebx, %%ebx \n\t" // ebx: x offset
-//pre "movl row, %%edi \n\t"
- "xorl %%edx, %%edx \n\t" // edx: x-bpp offset
-//pre "movl prev_row, %%esi \n\t"
- "xorl %%eax, %%eax \n\t"
-
- // Compute the Raw value for the first bpp bytes
- // Note: the formula works out to be always
- // Paeth(x) = Raw(x) + Prior(x) where x < bpp
- "paeth_rlp: \n\t"
- "movb (%%edi,%%ebx,), %%al \n\t"
- "addb (%%esi,%%ebx,), %%al \n\t"
- "incl %%ebx \n\t"
-//pre "cmpl bpp, %%ebx \n\t" (bpp is preloaded into ecx)
- "cmpl %%ecx, %%ebx \n\t"
- "movb %%al, -1(%%edi,%%ebx,) \n\t"
- "jb paeth_rlp \n\t"
- // get # of bytes to alignment
- "movl %%edi, _dif \n\t" // take start of row
- "addl %%ebx, _dif \n\t" // add bpp
- "xorl %%ecx, %%ecx \n\t"
- "addl $0xf, _dif \n\t" // add 7 + 8 to incr past alignment
- // boundary
- "andl $0xfffffff8, _dif \n\t" // mask to alignment boundary
- "subl %%edi, _dif \n\t" // subtract from start ==> value ebx
- // at alignment
- "jz paeth_go \n\t"
- // fix alignment
-
- "paeth_lp1: \n\t"
- "xorl %%eax, %%eax \n\t"
- // pav = p - a = (a + b - c) - a = b - c
- "movb (%%esi,%%ebx,), %%al \n\t" // load Prior(x) into al
- "movb (%%esi,%%edx,), %%cl \n\t" // load Prior(x-bpp) into cl
- "subl %%ecx, %%eax \n\t" // subtract Prior(x-bpp)
- "movl %%eax, _patemp \n\t" // Save pav for later use
- "xorl %%eax, %%eax \n\t"
- // pbv = p - b = (a + b - c) - b = a - c
- "movb (%%edi,%%edx,), %%al \n\t" // load Raw(x-bpp) into al
- "subl %%ecx, %%eax \n\t" // subtract Prior(x-bpp)
- "movl %%eax, %%ecx \n\t"
- // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv
- "addl _patemp, %%eax \n\t" // pcv = pav + pbv
- // pc = abs(pcv)
- "testl $0x80000000, %%eax \n\t"
- "jz paeth_pca \n\t"
- "negl %%eax \n\t" // reverse sign of neg values
-
- "paeth_pca: \n\t"
- "movl %%eax, _pctemp \n\t" // save pc for later use
- // pb = abs(pbv)
- "testl $0x80000000, %%ecx \n\t"
- "jz paeth_pba \n\t"
- "negl %%ecx \n\t" // reverse sign of neg values
-
- "paeth_pba: \n\t"
- "movl %%ecx, _pbtemp \n\t" // save pb for later use
- // pa = abs(pav)
- "movl _patemp, %%eax \n\t"
- "testl $0x80000000, %%eax \n\t"
- "jz paeth_paa \n\t"
- "negl %%eax \n\t" // reverse sign of neg values
-
- "paeth_paa: \n\t"
- "movl %%eax, _patemp \n\t" // save pa for later use
- // test if pa <= pb
- "cmpl %%ecx, %%eax \n\t"
- "jna paeth_abb \n\t"
- // pa > pb; now test if pb <= pc
- "cmpl _pctemp, %%ecx \n\t"
- "jna paeth_bbc \n\t"
- // pb > pc; Raw(x) = Paeth(x) + Prior(x-bpp)
- "movb (%%esi,%%edx,), %%cl \n\t" // load Prior(x-bpp) into cl
- "jmp paeth_paeth \n\t"
-
- "paeth_bbc: \n\t"
- // pb <= pc; Raw(x) = Paeth(x) + Prior(x)
- "movb (%%esi,%%ebx,), %%cl \n\t" // load Prior(x) into cl
- "jmp paeth_paeth \n\t"
-
- "paeth_abb: \n\t"
- // pa <= pb; now test if pa <= pc
- "cmpl _pctemp, %%eax \n\t"
- "jna paeth_abc \n\t"
- // pa > pc; Raw(x) = Paeth(x) + Prior(x-bpp)
- "movb (%%esi,%%edx,), %%cl \n\t" // load Prior(x-bpp) into cl
- "jmp paeth_paeth \n\t"
-
- "paeth_abc: \n\t"
- // pa <= pc; Raw(x) = Paeth(x) + Raw(x-bpp)
- "movb (%%edi,%%edx,), %%cl \n\t" // load Raw(x-bpp) into cl
-
- "paeth_paeth: \n\t"
- "incl %%ebx \n\t"
- "incl %%edx \n\t"
- // Raw(x) = (Paeth(x) + Paeth_Predictor( a, b, c )) mod 256
- "addb %%cl, -1(%%edi,%%ebx,) \n\t"
- "cmpl _dif, %%ebx \n\t"
- "jb paeth_lp1 \n\t"
-
- "paeth_go: \n\t"
- "movl _FullLength, %%ecx \n\t"
- "movl %%ecx, %%eax \n\t"
- "subl %%ebx, %%eax \n\t" // subtract alignment fix
- "andl $0x00000007, %%eax \n\t" // calc bytes over mult of 8
- "subl %%eax, %%ecx \n\t" // drop over bytes from original length
- "movl %%ecx, _MMXLength \n\t"
-#ifdef __PIC__
- "popl %%ebx \n\t" // restore index to Global Offset Table
-#endif
-
- : "=c" (dummy_value_c), // output regs (dummy)
- "=S" (dummy_value_S),
- "=D" (dummy_value_D)
-
- : "0" (bpp), // ecx // input regs
- "1" (prev_row), // esi
- "2" (row) // edi
-
- : "%eax", "%edx" // clobber list
-#ifndef __PIC__
- , "%ebx"
-#endif
- );
-
- // now do the math for the rest of the row
- switch (bpp)
- {
- case 3:
- {
- _ActiveMask.use = 0x0000000000ffffffLL;
- _ActiveMaskEnd.use = 0xffff000000000000LL;
- _ShiftBpp.use = 24; // == bpp(3) * 8
- _ShiftRem.use = 40; // == 64 - 24
-
- __asm__ __volatile__ (
- "movl _dif, %%ecx \n\t"
-// preload "movl row, %%edi \n\t"
-// preload "movl prev_row, %%esi \n\t"
- "pxor %%mm0, %%mm0 \n\t"
- // prime the pump: load the first Raw(x-bpp) data set
- "movq -8(%%edi,%%ecx,), %%mm1 \n\t"
- "paeth_3lp: \n\t"
- "psrlq _ShiftRem, %%mm1 \n\t" // shift last 3 bytes to 1st
- // 3 bytes
- "movq (%%esi,%%ecx,), %%mm2 \n\t" // load b=Prior(x)
- "punpcklbw %%mm0, %%mm1 \n\t" // unpack High bytes of a
- "movq -8(%%esi,%%ecx,), %%mm3 \n\t" // prep c=Prior(x-bpp) bytes
- "punpcklbw %%mm0, %%mm2 \n\t" // unpack High bytes of b
- "psrlq _ShiftRem, %%mm3 \n\t" // shift last 3 bytes to 1st
- // 3 bytes
- // pav = p - a = (a + b - c) - a = b - c
- "movq %%mm2, %%mm4 \n\t"
- "punpcklbw %%mm0, %%mm3 \n\t" // unpack High bytes of c
- // pbv = p - b = (a + b - c) - b = a - c
- "movq %%mm1, %%mm5 \n\t"
- "psubw %%mm3, %%mm4 \n\t"
- "pxor %%mm7, %%mm7 \n\t"
- // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv
- "movq %%mm4, %%mm6 \n\t"
- "psubw %%mm3, %%mm5 \n\t"
-
- // pa = abs(p-a) = abs(pav)
- // pb = abs(p-b) = abs(pbv)
- // pc = abs(p-c) = abs(pcv)
- "pcmpgtw %%mm4, %%mm0 \n\t" // create mask pav bytes < 0
- "paddw %%mm5, %%mm6 \n\t"
- "pand %%mm4, %%mm0 \n\t" // only pav bytes < 0 in mm7
- "pcmpgtw %%mm5, %%mm7 \n\t" // create mask pbv bytes < 0
- "psubw %%mm0, %%mm4 \n\t"
- "pand %%mm5, %%mm7 \n\t" // only pbv bytes < 0 in mm0
- "psubw %%mm0, %%mm4 \n\t"
- "psubw %%mm7, %%mm5 \n\t"
- "pxor %%mm0, %%mm0 \n\t"
- "pcmpgtw %%mm6, %%mm0 \n\t" // create mask pcv bytes < 0
- "pand %%mm6, %%mm0 \n\t" // only pav bytes < 0 in mm7
- "psubw %%mm7, %%mm5 \n\t"
- "psubw %%mm0, %%mm6 \n\t"
- // test pa <= pb
- "movq %%mm4, %%mm7 \n\t"
- "psubw %%mm0, %%mm6 \n\t"
- "pcmpgtw %%mm5, %%mm7 \n\t" // pa > pb?
- "movq %%mm7, %%mm0 \n\t"
- // use mm7 mask to merge pa & pb
- "pand %%mm7, %%mm5 \n\t"
- // use mm0 mask copy to merge a & b
- "pand %%mm0, %%mm2 \n\t"
- "pandn %%mm4, %%mm7 \n\t"
- "pandn %%mm1, %%mm0 \n\t"
- "paddw %%mm5, %%mm7 \n\t"
- "paddw %%mm2, %%mm0 \n\t"
- // test ((pa <= pb)? pa:pb) <= pc
- "pcmpgtw %%mm6, %%mm7 \n\t" // pab > pc?
- "pxor %%mm1, %%mm1 \n\t"
- "pand %%mm7, %%mm3 \n\t"
- "pandn %%mm0, %%mm7 \n\t"
- "paddw %%mm3, %%mm7 \n\t"
- "pxor %%mm0, %%mm0 \n\t"
- "packuswb %%mm1, %%mm7 \n\t"
- "movq (%%esi,%%ecx,), %%mm3 \n\t" // load c=Prior(x-bpp)
- "pand _ActiveMask, %%mm7 \n\t"
- "movq %%mm3, %%mm2 \n\t" // load b=Prior(x) step 1
- "paddb (%%edi,%%ecx,), %%mm7 \n\t" // add Paeth predictor with Raw(x)
- "punpcklbw %%mm0, %%mm3 \n\t" // unpack High bytes of c
- "movq %%mm7, (%%edi,%%ecx,) \n\t" // write back updated value
- "movq %%mm7, %%mm1 \n\t" // now mm1 will be used as
- // Raw(x-bpp)
- // now do Paeth for 2nd set of bytes (3-5)
- "psrlq _ShiftBpp, %%mm2 \n\t" // load b=Prior(x) step 2
- "punpcklbw %%mm0, %%mm1 \n\t" // unpack High bytes of a
- "pxor %%mm7, %%mm7 \n\t"
- "punpcklbw %%mm0, %%mm2 \n\t" // unpack High bytes of b
- // pbv = p - b = (a + b - c) - b = a - c
- "movq %%mm1, %%mm5 \n\t"
- // pav = p - a = (a + b - c) - a = b - c
- "movq %%mm2, %%mm4 \n\t"
- "psubw %%mm3, %%mm5 \n\t"
- "psubw %%mm3, %%mm4 \n\t"
- // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) =
- // pav + pbv = pbv + pav
- "movq %%mm5, %%mm6 \n\t"
- "paddw %%mm4, %%mm6 \n\t"
-
- // pa = abs(p-a) = abs(pav)
- // pb = abs(p-b) = abs(pbv)
- // pc = abs(p-c) = abs(pcv)
- "pcmpgtw %%mm5, %%mm0 \n\t" // create mask pbv bytes < 0
- "pcmpgtw %%mm4, %%mm7 \n\t" // create mask pav bytes < 0
- "pand %%mm5, %%mm0 \n\t" // only pbv bytes < 0 in mm0
- "pand %%mm4, %%mm7 \n\t" // only pav bytes < 0 in mm7
- "psubw %%mm0, %%mm5 \n\t"
- "psubw %%mm7, %%mm4 \n\t"
- "psubw %%mm0, %%mm5 \n\t"
- "psubw %%mm7, %%mm4 \n\t"
- "pxor %%mm0, %%mm0 \n\t"
- "pcmpgtw %%mm6, %%mm0 \n\t" // create mask pcv bytes < 0
- "pand %%mm6, %%mm0 \n\t" // only pav bytes < 0 in mm7
- "psubw %%mm0, %%mm6 \n\t"
- // test pa <= pb
- "movq %%mm4, %%mm7 \n\t"
- "psubw %%mm0, %%mm6 \n\t"
- "pcmpgtw %%mm5, %%mm7 \n\t" // pa > pb?
- "movq %%mm7, %%mm0 \n\t"
- // use mm7 mask to merge pa & pb
- "pand %%mm7, %%mm5 \n\t"
- // use mm0 mask copy to merge a & b
- "pand %%mm0, %%mm2 \n\t"
- "pandn %%mm4, %%mm7 \n\t"
- "pandn %%mm1, %%mm0 \n\t"
- "paddw %%mm5, %%mm7 \n\t"
- "paddw %%mm2, %%mm0 \n\t"
- // test ((pa <= pb)? pa:pb) <= pc
- "pcmpgtw %%mm6, %%mm7 \n\t" // pab > pc?
- "movq (%%esi,%%ecx,), %%mm2 \n\t" // load b=Prior(x)
- "pand %%mm7, %%mm3 \n\t"
- "pandn %%mm0, %%mm7 \n\t"
- "pxor %%mm1, %%mm1 \n\t"
- "paddw %%mm3, %%mm7 \n\t"
- "pxor %%mm0, %%mm0 \n\t"
- "packuswb %%mm1, %%mm7 \n\t"
- "movq %%mm2, %%mm3 \n\t" // load c=Prior(x-bpp) step 1
- "pand _ActiveMask, %%mm7 \n\t"
- "punpckhbw %%mm0, %%mm2 \n\t" // unpack High bytes of b
- "psllq _ShiftBpp, %%mm7 \n\t" // shift bytes to 2nd group of
- // 3 bytes
- // pav = p - a = (a + b - c) - a = b - c
- "movq %%mm2, %%mm4 \n\t"
- "paddb (%%edi,%%ecx,), %%mm7 \n\t" // add Paeth predictor with Raw(x)
- "psllq _ShiftBpp, %%mm3 \n\t" // load c=Prior(x-bpp) step 2
- "movq %%mm7, (%%edi,%%ecx,) \n\t" // write back updated value
- "movq %%mm7, %%mm1 \n\t"
- "punpckhbw %%mm0, %%mm3 \n\t" // unpack High bytes of c
- "psllq _ShiftBpp, %%mm1 \n\t" // shift bytes
- // now mm1 will be used as Raw(x-bpp)
- // now do Paeth for 3rd, and final, set of bytes (6-7)
- "pxor %%mm7, %%mm7 \n\t"
- "punpckhbw %%mm0, %%mm1 \n\t" // unpack High bytes of a
- "psubw %%mm3, %%mm4 \n\t"
- // pbv = p - b = (a + b - c) - b = a - c
- "movq %%mm1, %%mm5 \n\t"
- // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv
- "movq %%mm4, %%mm6 \n\t"
- "psubw %%mm3, %%mm5 \n\t"
- "pxor %%mm0, %%mm0 \n\t"
- "paddw %%mm5, %%mm6 \n\t"
-
- // pa = abs(p-a) = abs(pav)
- // pb = abs(p-b) = abs(pbv)
- // pc = abs(p-c) = abs(pcv)
- "pcmpgtw %%mm4, %%mm0 \n\t" // create mask pav bytes < 0
- "pcmpgtw %%mm5, %%mm7 \n\t" // create mask pbv bytes < 0
- "pand %%mm4, %%mm0 \n\t" // only pav bytes < 0 in mm7
- "pand %%mm5, %%mm7 \n\t" // only pbv bytes < 0 in mm0
- "psubw %%mm0, %%mm4 \n\t"
- "psubw %%mm7, %%mm5 \n\t"
- "psubw %%mm0, %%mm4 \n\t"
- "psubw %%mm7, %%mm5 \n\t"
- "pxor %%mm0, %%mm0 \n\t"
- "pcmpgtw %%mm6, %%mm0 \n\t" // create mask pcv bytes < 0
- "pand %%mm6, %%mm0 \n\t" // only pav bytes < 0 in mm7
- "psubw %%mm0, %%mm6 \n\t"
- // test pa <= pb
- "movq %%mm4, %%mm7 \n\t"
- "psubw %%mm0, %%mm6 \n\t"
- "pcmpgtw %%mm5, %%mm7 \n\t" // pa > pb?
- "movq %%mm7, %%mm0 \n\t"
- // use mm0 mask copy to merge a & b
- "pand %%mm0, %%mm2 \n\t"
- // use mm7 mask to merge pa & pb
- "pand %%mm7, %%mm5 \n\t"
- "pandn %%mm1, %%mm0 \n\t"
- "pandn %%mm4, %%mm7 \n\t"
- "paddw %%mm2, %%mm0 \n\t"
- "paddw %%mm5, %%mm7 \n\t"
- // test ((pa <= pb)? pa:pb) <= pc
- "pcmpgtw %%mm6, %%mm7 \n\t" // pab > pc?
- "pand %%mm7, %%mm3 \n\t"
- "pandn %%mm0, %%mm7 \n\t"
- "paddw %%mm3, %%mm7 \n\t"
- "pxor %%mm1, %%mm1 \n\t"
- "packuswb %%mm7, %%mm1 \n\t"
- // step ecx to next set of 8 bytes and repeat loop til done
- "addl $8, %%ecx \n\t"
- "pand _ActiveMaskEnd, %%mm1 \n\t"
- "paddb -8(%%edi,%%ecx,), %%mm1 \n\t" // add Paeth predictor with
- // Raw(x)
-
- "cmpl _MMXLength, %%ecx \n\t"
- "pxor %%mm0, %%mm0 \n\t" // pxor does not affect flags
- "movq %%mm1, -8(%%edi,%%ecx,) \n\t" // write back updated value
- // mm1 will be used as Raw(x-bpp) next loop
- // mm3 ready to be used as Prior(x-bpp) next loop
- "jb paeth_3lp \n\t"
-
- : "=S" (dummy_value_S), // output regs (dummy)
- "=D" (dummy_value_D)
-
- : "0" (prev_row), // esi // input regs
- "1" (row) // edi
-
- : "%ecx" // clobber list
-#if 0 /* %mm0, ..., %mm7 not supported by gcc 2.7.2.3 or egcs 1.1 */
- , "%mm0", "%mm1", "%mm2", "%mm3"
- , "%mm4", "%mm5", "%mm6", "%mm7"
-#endif
- );
- }
- break; // end 3 bpp
-
- case 6:
- //case 7: // GRR BOGUS
- //case 5: // GRR BOGUS
- {
- _ActiveMask.use = 0x00000000ffffffffLL;
- _ActiveMask2.use = 0xffffffff00000000LL;
- _ShiftBpp.use = bpp << 3; // == bpp * 8
- _ShiftRem.use = 64 - _ShiftBpp.use;
-
- __asm__ __volatile__ (
- "movl _dif, %%ecx \n\t"
-// preload "movl row, %%edi \n\t"
-// preload "movl prev_row, %%esi \n\t"
- // prime the pump: load the first Raw(x-bpp) data set
- "movq -8(%%edi,%%ecx,), %%mm1 \n\t"
- "pxor %%mm0, %%mm0 \n\t"
-
- "paeth_6lp: \n\t"
- // must shift to position Raw(x-bpp) data
- "psrlq _ShiftRem, %%mm1 \n\t"
- // do first set of 4 bytes
- "movq -8(%%esi,%%ecx,), %%mm3 \n\t" // read c=Prior(x-bpp) bytes
- "punpcklbw %%mm0, %%mm1 \n\t" // unpack Low bytes of a
- "movq (%%esi,%%ecx,), %%mm2 \n\t" // load b=Prior(x)
- "punpcklbw %%mm0, %%mm2 \n\t" // unpack Low bytes of b
- // must shift to position Prior(x-bpp) data
- "psrlq _ShiftRem, %%mm3 \n\t"
- // pav = p - a = (a + b - c) - a = b - c
- "movq %%mm2, %%mm4 \n\t"
- "punpcklbw %%mm0, %%mm3 \n\t" // unpack Low bytes of c
- // pbv = p - b = (a + b - c) - b = a - c
- "movq %%mm1, %%mm5 \n\t"
- "psubw %%mm3, %%mm4 \n\t"
- "pxor %%mm7, %%mm7 \n\t"
- // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv
- "movq %%mm4, %%mm6 \n\t"
- "psubw %%mm3, %%mm5 \n\t"
- // pa = abs(p-a) = abs(pav)
- // pb = abs(p-b) = abs(pbv)
- // pc = abs(p-c) = abs(pcv)
- "pcmpgtw %%mm4, %%mm0 \n\t" // create mask pav bytes < 0
- "paddw %%mm5, %%mm6 \n\t"
- "pand %%mm4, %%mm0 \n\t" // only pav bytes < 0 in mm7
- "pcmpgtw %%mm5, %%mm7 \n\t" // create mask pbv bytes < 0
- "psubw %%mm0, %%mm4 \n\t"
- "pand %%mm5, %%mm7 \n\t" // only pbv bytes < 0 in mm0
- "psubw %%mm0, %%mm4 \n\t"
- "psubw %%mm7, %%mm5 \n\t"
- "pxor %%mm0, %%mm0 \n\t"
- "pcmpgtw %%mm6, %%mm0 \n\t" // create mask pcv bytes < 0
- "pand %%mm6, %%mm0 \n\t" // only pav bytes < 0 in mm7
- "psubw %%mm7, %%mm5 \n\t"
- "psubw %%mm0, %%mm6 \n\t"
- // test pa <= pb
- "movq %%mm4, %%mm7 \n\t"
- "psubw %%mm0, %%mm6 \n\t"
- "pcmpgtw %%mm5, %%mm7 \n\t" // pa > pb?
- "movq %%mm7, %%mm0 \n\t"
- // use mm7 mask to merge pa & pb
- "pand %%mm7, %%mm5 \n\t"
- // use mm0 mask copy to merge a & b
- "pand %%mm0, %%mm2 \n\t"
- "pandn %%mm4, %%mm7 \n\t"
- "pandn %%mm1, %%mm0 \n\t"
- "paddw %%mm5, %%mm7 \n\t"
- "paddw %%mm2, %%mm0 \n\t"
- // test ((pa <= pb)? pa:pb) <= pc
- "pcmpgtw %%mm6, %%mm7 \n\t" // pab > pc?
- "pxor %%mm1, %%mm1 \n\t"
- "pand %%mm7, %%mm3 \n\t"
- "pandn %%mm0, %%mm7 \n\t"
- "paddw %%mm3, %%mm7 \n\t"
- "pxor %%mm0, %%mm0 \n\t"
- "packuswb %%mm1, %%mm7 \n\t"
- "movq -8(%%esi,%%ecx,), %%mm3 \n\t" // load c=Prior(x-bpp)
- "pand _ActiveMask, %%mm7 \n\t"
- "psrlq _ShiftRem, %%mm3 \n\t"
- "movq (%%esi,%%ecx,), %%mm2 \n\t" // load b=Prior(x) step 1
- "paddb (%%edi,%%ecx,), %%mm7 \n\t" // add Paeth predictor and Raw(x)
- "movq %%mm2, %%mm6 \n\t"
- "movq %%mm7, (%%edi,%%ecx,) \n\t" // write back updated value
- "movq -8(%%edi,%%ecx,), %%mm1 \n\t"
- "psllq _ShiftBpp, %%mm6 \n\t"
- "movq %%mm7, %%mm5 \n\t"
- "psrlq _ShiftRem, %%mm1 \n\t"
- "por %%mm6, %%mm3 \n\t"
- "psllq _ShiftBpp, %%mm5 \n\t"
- "punpckhbw %%mm0, %%mm3 \n\t" // unpack High bytes of c
- "por %%mm5, %%mm1 \n\t"
- // do second set of 4 bytes
- "punpckhbw %%mm0, %%mm2 \n\t" // unpack High bytes of b
- "punpckhbw %%mm0, %%mm1 \n\t" // unpack High bytes of a
- // pav = p - a = (a + b - c) - a = b - c
- "movq %%mm2, %%mm4 \n\t"
- // pbv = p - b = (a + b - c) - b = a - c
- "movq %%mm1, %%mm5 \n\t"
- "psubw %%mm3, %%mm4 \n\t"
- "pxor %%mm7, %%mm7 \n\t"
- // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv
- "movq %%mm4, %%mm6 \n\t"
- "psubw %%mm3, %%mm5 \n\t"
- // pa = abs(p-a) = abs(pav)
- // pb = abs(p-b) = abs(pbv)
- // pc = abs(p-c) = abs(pcv)
- "pcmpgtw %%mm4, %%mm0 \n\t" // create mask pav bytes < 0
- "paddw %%mm5, %%mm6 \n\t"
- "pand %%mm4, %%mm0 \n\t" // only pav bytes < 0 in mm7
- "pcmpgtw %%mm5, %%mm7 \n\t" // create mask pbv bytes < 0
- "psubw %%mm0, %%mm4 \n\t"
- "pand %%mm5, %%mm7 \n\t" // only pbv bytes < 0 in mm0
- "psubw %%mm0, %%mm4 \n\t"
- "psubw %%mm7, %%mm5 \n\t"
- "pxor %%mm0, %%mm0 \n\t"
- "pcmpgtw %%mm6, %%mm0 \n\t" // create mask pcv bytes < 0
- "pand %%mm6, %%mm0 \n\t" // only pav bytes < 0 in mm7
- "psubw %%mm7, %%mm5 \n\t"
- "psubw %%mm0, %%mm6 \n\t"
- // test pa <= pb
- "movq %%mm4, %%mm7 \n\t"
- "psubw %%mm0, %%mm6 \n\t"
- "pcmpgtw %%mm5, %%mm7 \n\t" // pa > pb?
- "movq %%mm7, %%mm0 \n\t"
- // use mm7 mask to merge pa & pb
- "pand %%mm7, %%mm5 \n\t"
- // use mm0 mask copy to merge a & b
- "pand %%mm0, %%mm2 \n\t"
- "pandn %%mm4, %%mm7 \n\t"
- "pandn %%mm1, %%mm0 \n\t"
- "paddw %%mm5, %%mm7 \n\t"
- "paddw %%mm2, %%mm0 \n\t"
- // test ((pa <= pb)? pa:pb) <= pc
- "pcmpgtw %%mm6, %%mm7 \n\t" // pab > pc?
- "pxor %%mm1, %%mm1 \n\t"
- "pand %%mm7, %%mm3 \n\t"
- "pandn %%mm0, %%mm7 \n\t"
- "pxor %%mm1, %%mm1 \n\t"
- "paddw %%mm3, %%mm7 \n\t"
- "pxor %%mm0, %%mm0 \n\t"
- // step ecx to next set of 8 bytes and repeat loop til done
- "addl $8, %%ecx \n\t"
- "packuswb %%mm7, %%mm1 \n\t"
- "paddb -8(%%edi,%%ecx,), %%mm1 \n\t" // add Paeth predictor with Raw(x)
- "cmpl _MMXLength, %%ecx \n\t"
- "movq %%mm1, -8(%%edi,%%ecx,) \n\t" // write back updated value
- // mm1 will be used as Raw(x-bpp) next loop
- "jb paeth_6lp \n\t"
-
- : "=S" (dummy_value_S), // output regs (dummy)
- "=D" (dummy_value_D)
-
- : "0" (prev_row), // esi // input regs
- "1" (row) // edi
-
- : "%ecx" // clobber list
-#if 0 /* %mm0, ..., %mm7 not supported by gcc 2.7.2.3 or egcs 1.1 */
- , "%mm0", "%mm1", "%mm2", "%mm3"
- , "%mm4", "%mm5", "%mm6", "%mm7"
-#endif
- );
- }
- break; // end 6 bpp
-
- case 4:
- {
- _ActiveMask.use = 0x00000000ffffffffLL;
-
- __asm__ __volatile__ (
- "movl _dif, %%ecx \n\t"
-// preload "movl row, %%edi \n\t"
-// preload "movl prev_row, %%esi \n\t"
- "pxor %%mm0, %%mm0 \n\t"
- // prime the pump: load the first Raw(x-bpp) data set
- "movq -8(%%edi,%%ecx,), %%mm1 \n\t" // only time should need to read
- // a=Raw(x-bpp) bytes
- "paeth_4lp: \n\t"
- // do first set of 4 bytes
- "movq -8(%%esi,%%ecx,), %%mm3 \n\t" // read c=Prior(x-bpp) bytes
- "punpckhbw %%mm0, %%mm1 \n\t" // unpack Low bytes of a
- "movq (%%esi,%%ecx,), %%mm2 \n\t" // load b=Prior(x)
- "punpcklbw %%mm0, %%mm2 \n\t" // unpack High bytes of b
- // pav = p - a = (a + b - c) - a = b - c
- "movq %%mm2, %%mm4 \n\t"
- "punpckhbw %%mm0, %%mm3 \n\t" // unpack High bytes of c
- // pbv = p - b = (a + b - c) - b = a - c
- "movq %%mm1, %%mm5 \n\t"
- "psubw %%mm3, %%mm4 \n\t"
- "pxor %%mm7, %%mm7 \n\t"
- // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv
- "movq %%mm4, %%mm6 \n\t"
- "psubw %%mm3, %%mm5 \n\t"
- // pa = abs(p-a) = abs(pav)
- // pb = abs(p-b) = abs(pbv)
- // pc = abs(p-c) = abs(pcv)
- "pcmpgtw %%mm4, %%mm0 \n\t" // create mask pav bytes < 0
- "paddw %%mm5, %%mm6 \n\t"
- "pand %%mm4, %%mm0 \n\t" // only pav bytes < 0 in mm7
- "pcmpgtw %%mm5, %%mm7 \n\t" // create mask pbv bytes < 0
- "psubw %%mm0, %%mm4 \n\t"
- "pand %%mm5, %%mm7 \n\t" // only pbv bytes < 0 in mm0
- "psubw %%mm0, %%mm4 \n\t"
- "psubw %%mm7, %%mm5 \n\t"
- "pxor %%mm0, %%mm0 \n\t"
- "pcmpgtw %%mm6, %%mm0 \n\t" // create mask pcv bytes < 0
- "pand %%mm6, %%mm0 \n\t" // only pav bytes < 0 in mm7
- "psubw %%mm7, %%mm5 \n\t"
- "psubw %%mm0, %%mm6 \n\t"
- // test pa <= pb
- "movq %%mm4, %%mm7 \n\t"
- "psubw %%mm0, %%mm6 \n\t"
- "pcmpgtw %%mm5, %%mm7 \n\t" // pa > pb?
- "movq %%mm7, %%mm0 \n\t"
- // use mm7 mask to merge pa & pb
- "pand %%mm7, %%mm5 \n\t"
- // use mm0 mask copy to merge a & b
- "pand %%mm0, %%mm2 \n\t"
- "pandn %%mm4, %%mm7 \n\t"
- "pandn %%mm1, %%mm0 \n\t"
- "paddw %%mm5, %%mm7 \n\t"
- "paddw %%mm2, %%mm0 \n\t"
- // test ((pa <= pb)? pa:pb) <= pc
- "pcmpgtw %%mm6, %%mm7 \n\t" // pab > pc?
- "pxor %%mm1, %%mm1 \n\t"
- "pand %%mm7, %%mm3 \n\t"
- "pandn %%mm0, %%mm7 \n\t"
- "paddw %%mm3, %%mm7 \n\t"
- "pxor %%mm0, %%mm0 \n\t"
- "packuswb %%mm1, %%mm7 \n\t"
- "movq (%%esi,%%ecx,), %%mm3 \n\t" // load c=Prior(x-bpp)
- "pand _ActiveMask, %%mm7 \n\t"
- "movq %%mm3, %%mm2 \n\t" // load b=Prior(x) step 1
- "paddb (%%edi,%%ecx,), %%mm7 \n\t" // add Paeth predictor with Raw(x)
- "punpcklbw %%mm0, %%mm3 \n\t" // unpack High bytes of c
- "movq %%mm7, (%%edi,%%ecx,) \n\t" // write back updated value
- "movq %%mm7, %%mm1 \n\t" // now mm1 will be used as Raw(x-bpp)
- // do second set of 4 bytes
- "punpckhbw %%mm0, %%mm2 \n\t" // unpack Low bytes of b
- "punpcklbw %%mm0, %%mm1 \n\t" // unpack Low bytes of a
- // pav = p - a = (a + b - c) - a = b - c
- "movq %%mm2, %%mm4 \n\t"
- // pbv = p - b = (a + b - c) - b = a - c
- "movq %%mm1, %%mm5 \n\t"
- "psubw %%mm3, %%mm4 \n\t"
- "pxor %%mm7, %%mm7 \n\t"
- // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv
- "movq %%mm4, %%mm6 \n\t"
- "psubw %%mm3, %%mm5 \n\t"
- // pa = abs(p-a) = abs(pav)
- // pb = abs(p-b) = abs(pbv)
- // pc = abs(p-c) = abs(pcv)
- "pcmpgtw %%mm4, %%mm0 \n\t" // create mask pav bytes < 0
- "paddw %%mm5, %%mm6 \n\t"
- "pand %%mm4, %%mm0 \n\t" // only pav bytes < 0 in mm7
- "pcmpgtw %%mm5, %%mm7 \n\t" // create mask pbv bytes < 0
- "psubw %%mm0, %%mm4 \n\t"
- "pand %%mm5, %%mm7 \n\t" // only pbv bytes < 0 in mm0
- "psubw %%mm0, %%mm4 \n\t"
- "psubw %%mm7, %%mm5 \n\t"
- "pxor %%mm0, %%mm0 \n\t"
- "pcmpgtw %%mm6, %%mm0 \n\t" // create mask pcv bytes < 0
- "pand %%mm6, %%mm0 \n\t" // only pav bytes < 0 in mm7
- "psubw %%mm7, %%mm5 \n\t"
- "psubw %%mm0, %%mm6 \n\t"
- // test pa <= pb
- "movq %%mm4, %%mm7 \n\t"
- "psubw %%mm0, %%mm6 \n\t"
- "pcmpgtw %%mm5, %%mm7 \n\t" // pa > pb?
- "movq %%mm7, %%mm0 \n\t"
- // use mm7 mask to merge pa & pb
- "pand %%mm7, %%mm5 \n\t"
- // use mm0 mask copy to merge a & b
- "pand %%mm0, %%mm2 \n\t"
- "pandn %%mm4, %%mm7 \n\t"
- "pandn %%mm1, %%mm0 \n\t"
- "paddw %%mm5, %%mm7 \n\t"
- "paddw %%mm2, %%mm0 \n\t"
- // test ((pa <= pb)? pa:pb) <= pc
- "pcmpgtw %%mm6, %%mm7 \n\t" // pab > pc?
- "pxor %%mm1, %%mm1 \n\t"
- "pand %%mm7, %%mm3 \n\t"
- "pandn %%mm0, %%mm7 \n\t"
- "pxor %%mm1, %%mm1 \n\t"
- "paddw %%mm3, %%mm7 \n\t"
- "pxor %%mm0, %%mm0 \n\t"
- // step ecx to next set of 8 bytes and repeat loop til done
- "addl $8, %%ecx \n\t"
- "packuswb %%mm7, %%mm1 \n\t"
- "paddb -8(%%edi,%%ecx,), %%mm1 \n\t" // add predictor with Raw(x)
- "cmpl _MMXLength, %%ecx \n\t"
- "movq %%mm1, -8(%%edi,%%ecx,) \n\t" // write back updated value
- // mm1 will be used as Raw(x-bpp) next loop
- "jb paeth_4lp \n\t"
-
- : "=S" (dummy_value_S), // output regs (dummy)
- "=D" (dummy_value_D)
-
- : "0" (prev_row), // esi // input regs
- "1" (row) // edi
-
- : "%ecx" // clobber list
-#if 0 /* %mm0, ..., %mm7 not supported by gcc 2.7.2.3 or egcs 1.1 */
- , "%mm0", "%mm1", "%mm2", "%mm3"
- , "%mm4", "%mm5", "%mm6", "%mm7"
-#endif
- );
- }
- break; // end 4 bpp
-
- case 8: // bpp == 8
- {
- _ActiveMask.use = 0x00000000ffffffffLL;
-
- __asm__ __volatile__ (
- "movl _dif, %%ecx \n\t"
-// preload "movl row, %%edi \n\t"
-// preload "movl prev_row, %%esi \n\t"
- "pxor %%mm0, %%mm0 \n\t"
- // prime the pump: load the first Raw(x-bpp) data set
- "movq -8(%%edi,%%ecx,), %%mm1 \n\t" // only time should need to read
- // a=Raw(x-bpp) bytes
- "paeth_8lp: \n\t"
- // do first set of 4 bytes
- "movq -8(%%esi,%%ecx,), %%mm3 \n\t" // read c=Prior(x-bpp) bytes
- "punpcklbw %%mm0, %%mm1 \n\t" // unpack Low bytes of a
- "movq (%%esi,%%ecx,), %%mm2 \n\t" // load b=Prior(x)
- "punpcklbw %%mm0, %%mm2 \n\t" // unpack Low bytes of b
- // pav = p - a = (a + b - c) - a = b - c
- "movq %%mm2, %%mm4 \n\t"
- "punpcklbw %%mm0, %%mm3 \n\t" // unpack Low bytes of c
- // pbv = p - b = (a + b - c) - b = a - c
- "movq %%mm1, %%mm5 \n\t"
- "psubw %%mm3, %%mm4 \n\t"
- "pxor %%mm7, %%mm7 \n\t"
- // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv
- "movq %%mm4, %%mm6 \n\t"
- "psubw %%mm3, %%mm5 \n\t"
- // pa = abs(p-a) = abs(pav)
- // pb = abs(p-b) = abs(pbv)
- // pc = abs(p-c) = abs(pcv)
- "pcmpgtw %%mm4, %%mm0 \n\t" // create mask pav bytes < 0
- "paddw %%mm5, %%mm6 \n\t"
- "pand %%mm4, %%mm0 \n\t" // only pav bytes < 0 in mm7
- "pcmpgtw %%mm5, %%mm7 \n\t" // create mask pbv bytes < 0
- "psubw %%mm0, %%mm4 \n\t"
- "pand %%mm5, %%mm7 \n\t" // only pbv bytes < 0 in mm0
- "psubw %%mm0, %%mm4 \n\t"
- "psubw %%mm7, %%mm5 \n\t"
- "pxor %%mm0, %%mm0 \n\t"
- "pcmpgtw %%mm6, %%mm0 \n\t" // create mask pcv bytes < 0
- "pand %%mm6, %%mm0 \n\t" // only pav bytes < 0 in mm7
- "psubw %%mm7, %%mm5 \n\t"
- "psubw %%mm0, %%mm6 \n\t"
- // test pa <= pb
- "movq %%mm4, %%mm7 \n\t"
- "psubw %%mm0, %%mm6 \n\t"
- "pcmpgtw %%mm5, %%mm7 \n\t" // pa > pb?
- "movq %%mm7, %%mm0 \n\t"
- // use mm7 mask to merge pa & pb
- "pand %%mm7, %%mm5 \n\t"
- // use mm0 mask copy to merge a & b
- "pand %%mm0, %%mm2 \n\t"
- "pandn %%mm4, %%mm7 \n\t"
- "pandn %%mm1, %%mm0 \n\t"
- "paddw %%mm5, %%mm7 \n\t"
- "paddw %%mm2, %%mm0 \n\t"
- // test ((pa <= pb)? pa:pb) <= pc
- "pcmpgtw %%mm6, %%mm7 \n\t" // pab > pc?
- "pxor %%mm1, %%mm1 \n\t"
- "pand %%mm7, %%mm3 \n\t"
- "pandn %%mm0, %%mm7 \n\t"
- "paddw %%mm3, %%mm7 \n\t"
- "pxor %%mm0, %%mm0 \n\t"
- "packuswb %%mm1, %%mm7 \n\t"
- "movq -8(%%esi,%%ecx,), %%mm3 \n\t" // read c=Prior(x-bpp) bytes
- "pand _ActiveMask, %%mm7 \n\t"
- "movq (%%esi,%%ecx,), %%mm2 \n\t" // load b=Prior(x)
- "paddb (%%edi,%%ecx,), %%mm7 \n\t" // add Paeth predictor with Raw(x)
- "punpckhbw %%mm0, %%mm3 \n\t" // unpack High bytes of c
- "movq %%mm7, (%%edi,%%ecx,) \n\t" // write back updated value
- "movq -8(%%edi,%%ecx,), %%mm1 \n\t" // read a=Raw(x-bpp) bytes
-
- // do second set of 4 bytes
- "punpckhbw %%mm0, %%mm2 \n\t" // unpack High bytes of b
- "punpckhbw %%mm0, %%mm1 \n\t" // unpack High bytes of a
- // pav = p - a = (a + b - c) - a = b - c
- "movq %%mm2, %%mm4 \n\t"
- // pbv = p - b = (a + b - c) - b = a - c
- "movq %%mm1, %%mm5 \n\t"
- "psubw %%mm3, %%mm4 \n\t"
- "pxor %%mm7, %%mm7 \n\t"
- // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv
- "movq %%mm4, %%mm6 \n\t"
- "psubw %%mm3, %%mm5 \n\t"
- // pa = abs(p-a) = abs(pav)
- // pb = abs(p-b) = abs(pbv)
- // pc = abs(p-c) = abs(pcv)
- "pcmpgtw %%mm4, %%mm0 \n\t" // create mask pav bytes < 0
- "paddw %%mm5, %%mm6 \n\t"
- "pand %%mm4, %%mm0 \n\t" // only pav bytes < 0 in mm7
- "pcmpgtw %%mm5, %%mm7 \n\t" // create mask pbv bytes < 0
- "psubw %%mm0, %%mm4 \n\t"
- "pand %%mm5, %%mm7 \n\t" // only pbv bytes < 0 in mm0
- "psubw %%mm0, %%mm4 \n\t"
- "psubw %%mm7, %%mm5 \n\t"
- "pxor %%mm0, %%mm0 \n\t"
- "pcmpgtw %%mm6, %%mm0 \n\t" // create mask pcv bytes < 0
- "pand %%mm6, %%mm0 \n\t" // only pav bytes < 0 in mm7
- "psubw %%mm7, %%mm5 \n\t"
- "psubw %%mm0, %%mm6 \n\t"
- // test pa <= pb
- "movq %%mm4, %%mm7 \n\t"
- "psubw %%mm0, %%mm6 \n\t"
- "pcmpgtw %%mm5, %%mm7 \n\t" // pa > pb?
- "movq %%mm7, %%mm0 \n\t"
- // use mm7 mask to merge pa & pb
- "pand %%mm7, %%mm5 \n\t"
- // use mm0 mask copy to merge a & b
- "pand %%mm0, %%mm2 \n\t"
- "pandn %%mm4, %%mm7 \n\t"
- "pandn %%mm1, %%mm0 \n\t"
- "paddw %%mm5, %%mm7 \n\t"
- "paddw %%mm2, %%mm0 \n\t"
- // test ((pa <= pb)? pa:pb) <= pc
- "pcmpgtw %%mm6, %%mm7 \n\t" // pab > pc?
- "pxor %%mm1, %%mm1 \n\t"
- "pand %%mm7, %%mm3 \n\t"
- "pandn %%mm0, %%mm7 \n\t"
- "pxor %%mm1, %%mm1 \n\t"
- "paddw %%mm3, %%mm7 \n\t"
- "pxor %%mm0, %%mm0 \n\t"
- // step ecx to next set of 8 bytes and repeat loop til done
- "addl $8, %%ecx \n\t"
- "packuswb %%mm7, %%mm1 \n\t"
- "paddb -8(%%edi,%%ecx,), %%mm1 \n\t" // add Paeth predictor with Raw(x)
- "cmpl _MMXLength, %%ecx \n\t"
- "movq %%mm1, -8(%%edi,%%ecx,) \n\t" // write back updated value
- // mm1 will be used as Raw(x-bpp) next loop
- "jb paeth_8lp \n\t"
-
- : "=S" (dummy_value_S), // output regs (dummy)
- "=D" (dummy_value_D)
-
- : "0" (prev_row), // esi // input regs
- "1" (row) // edi
-
- : "%ecx" // clobber list
-#if 0 /* %mm0, ..., %mm7 not supported by gcc 2.7.2.3 or egcs 1.1 */
- , "%mm0", "%mm1", "%mm2", "%mm3"
- , "%mm4", "%mm5", "%mm6", "%mm7"
-#endif
- );
- }
- break; // end 8 bpp
-
- case 1: // bpp = 1
- case 2: // bpp = 2
- default: // bpp > 8
- {
- __asm__ __volatile__ (
-#ifdef __PIC__
- "pushl %%ebx \n\t" // save Global Offset Table index
-#endif
- "movl _dif, %%ebx \n\t"
- "cmpl _FullLength, %%ebx \n\t"
- "jnb paeth_dend \n\t"
-
-// preload "movl row, %%edi \n\t"
-// preload "movl prev_row, %%esi \n\t"
- // do Paeth decode for remaining bytes
- "movl %%ebx, %%edx \n\t"
-// preload "subl bpp, %%edx \n\t" // (bpp is preloaded into ecx)
- "subl %%ecx, %%edx \n\t" // edx = ebx - bpp
- "xorl %%ecx, %%ecx \n\t" // zero ecx before using cl & cx
-
- "paeth_dlp: \n\t"
- "xorl %%eax, %%eax \n\t"
- // pav = p - a = (a + b - c) - a = b - c
- "movb (%%esi,%%ebx,), %%al \n\t" // load Prior(x) into al
- "movb (%%esi,%%edx,), %%cl \n\t" // load Prior(x-bpp) into cl
- "subl %%ecx, %%eax \n\t" // subtract Prior(x-bpp)
- "movl %%eax, _patemp \n\t" // Save pav for later use
- "xorl %%eax, %%eax \n\t"
- // pbv = p - b = (a + b - c) - b = a - c
- "movb (%%edi,%%edx,), %%al \n\t" // load Raw(x-bpp) into al
- "subl %%ecx, %%eax \n\t" // subtract Prior(x-bpp)
- "movl %%eax, %%ecx \n\t"
- // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv
- "addl _patemp, %%eax \n\t" // pcv = pav + pbv
- // pc = abs(pcv)
- "testl $0x80000000, %%eax \n\t"
- "jz paeth_dpca \n\t"
- "negl %%eax \n\t" // reverse sign of neg values
-
- "paeth_dpca: \n\t"
- "movl %%eax, _pctemp \n\t" // save pc for later use
- // pb = abs(pbv)
- "testl $0x80000000, %%ecx \n\t"
- "jz paeth_dpba \n\t"
- "negl %%ecx \n\t" // reverse sign of neg values
-
- "paeth_dpba: \n\t"
- "movl %%ecx, _pbtemp \n\t" // save pb for later use
- // pa = abs(pav)
- "movl _patemp, %%eax \n\t"
- "testl $0x80000000, %%eax \n\t"
- "jz paeth_dpaa \n\t"
- "negl %%eax \n\t" // reverse sign of neg values
-
- "paeth_dpaa: \n\t"
- "movl %%eax, _patemp \n\t" // save pa for later use
- // test if pa <= pb
- "cmpl %%ecx, %%eax \n\t"
- "jna paeth_dabb \n\t"
- // pa > pb; now test if pb <= pc
- "cmpl _pctemp, %%ecx \n\t"
- "jna paeth_dbbc \n\t"
- // pb > pc; Raw(x) = Paeth(x) + Prior(x-bpp)
- "movb (%%esi,%%edx,), %%cl \n\t" // load Prior(x-bpp) into cl
- "jmp paeth_dpaeth \n\t"
-
- "paeth_dbbc: \n\t"
- // pb <= pc; Raw(x) = Paeth(x) + Prior(x)
- "movb (%%esi,%%ebx,), %%cl \n\t" // load Prior(x) into cl
- "jmp paeth_dpaeth \n\t"
-
- "paeth_dabb: \n\t"
- // pa <= pb; now test if pa <= pc
- "cmpl _pctemp, %%eax \n\t"
- "jna paeth_dabc \n\t"
- // pa > pc; Raw(x) = Paeth(x) + Prior(x-bpp)
- "movb (%%esi,%%edx,), %%cl \n\t" // load Prior(x-bpp) into cl
- "jmp paeth_dpaeth \n\t"
-
- "paeth_dabc: \n\t"
- // pa <= pc; Raw(x) = Paeth(x) + Raw(x-bpp)
- "movb (%%edi,%%edx,), %%cl \n\t" // load Raw(x-bpp) into cl
-
- "paeth_dpaeth: \n\t"
- "incl %%ebx \n\t"
- "incl %%edx \n\t"
- // Raw(x) = (Paeth(x) + Paeth_Predictor( a, b, c )) mod 256
- "addb %%cl, -1(%%edi,%%ebx,) \n\t"
- "cmpl _FullLength, %%ebx \n\t"
- "jb paeth_dlp \n\t"
-
- "paeth_dend: \n\t"
-#ifdef __PIC__
- "popl %%ebx \n\t" // index to Global Offset Table
-#endif
-
- : "=c" (dummy_value_c), // output regs (dummy)
- "=S" (dummy_value_S),
- "=D" (dummy_value_D)
-
- : "0" (bpp), // ecx // input regs
- "1" (prev_row), // esi
- "2" (row) // edi
-
- : "%eax", "%edx" // clobber list
-#ifndef __PIC__
- , "%ebx"
-#endif
- );
- }
- return; // No need to go further with this one
-
- } // end switch (bpp)
-
- __asm__ __volatile__ (
- // MMX acceleration complete; now do clean-up
- // check if any remaining bytes left to decode
-#ifdef __PIC__
- "pushl %%ebx \n\t" // save index to Global Offset Table
-#endif
- "movl _MMXLength, %%ebx \n\t"
- "cmpl _FullLength, %%ebx \n\t"
- "jnb paeth_end \n\t"
-//pre "movl row, %%edi \n\t"
-//pre "movl prev_row, %%esi \n\t"
- // do Paeth decode for remaining bytes
- "movl %%ebx, %%edx \n\t"
-//pre "subl bpp, %%edx \n\t" // (bpp is preloaded into ecx)
- "subl %%ecx, %%edx \n\t" // edx = ebx - bpp
- "xorl %%ecx, %%ecx \n\t" // zero ecx before using cl & cx below
-
- "paeth_lp2: \n\t"
- "xorl %%eax, %%eax \n\t"
- // pav = p - a = (a + b - c) - a = b - c
- "movb (%%esi,%%ebx,), %%al \n\t" // load Prior(x) into al
- "movb (%%esi,%%edx,), %%cl \n\t" // load Prior(x-bpp) into cl
- "subl %%ecx, %%eax \n\t" // subtract Prior(x-bpp)
- "movl %%eax, _patemp \n\t" // Save pav for later use
- "xorl %%eax, %%eax \n\t"
- // pbv = p - b = (a + b - c) - b = a - c
- "movb (%%edi,%%edx,), %%al \n\t" // load Raw(x-bpp) into al
- "subl %%ecx, %%eax \n\t" // subtract Prior(x-bpp)
- "movl %%eax, %%ecx \n\t"
- // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv
- "addl _patemp, %%eax \n\t" // pcv = pav + pbv
- // pc = abs(pcv)
- "testl $0x80000000, %%eax \n\t"
- "jz paeth_pca2 \n\t"
- "negl %%eax \n\t" // reverse sign of neg values
-
- "paeth_pca2: \n\t"
- "movl %%eax, _pctemp \n\t" // save pc for later use
- // pb = abs(pbv)
- "testl $0x80000000, %%ecx \n\t"
- "jz paeth_pba2 \n\t"
- "negl %%ecx \n\t" // reverse sign of neg values
-
- "paeth_pba2: \n\t"
- "movl %%ecx, _pbtemp \n\t" // save pb for later use
- // pa = abs(pav)
- "movl _patemp, %%eax \n\t"
- "testl $0x80000000, %%eax \n\t"
- "jz paeth_paa2 \n\t"
- "negl %%eax \n\t" // reverse sign of neg values
-
- "paeth_paa2: \n\t"
- "movl %%eax, _patemp \n\t" // save pa for later use
- // test if pa <= pb
- "cmpl %%ecx, %%eax \n\t"
- "jna paeth_abb2 \n\t"
- // pa > pb; now test if pb <= pc
- "cmpl _pctemp, %%ecx \n\t"
- "jna paeth_bbc2 \n\t"
- // pb > pc; Raw(x) = Paeth(x) + Prior(x-bpp)
- "movb (%%esi,%%edx,), %%cl \n\t" // load Prior(x-bpp) into cl
- "jmp paeth_paeth2 \n\t"
-
- "paeth_bbc2: \n\t"
- // pb <= pc; Raw(x) = Paeth(x) + Prior(x)
- "movb (%%esi,%%ebx,), %%cl \n\t" // load Prior(x) into cl
- "jmp paeth_paeth2 \n\t"
-
- "paeth_abb2: \n\t"
- // pa <= pb; now test if pa <= pc
- "cmpl _pctemp, %%eax \n\t"
- "jna paeth_abc2 \n\t"
- // pa > pc; Raw(x) = Paeth(x) + Prior(x-bpp)
- "movb (%%esi,%%edx,), %%cl \n\t" // load Prior(x-bpp) into cl
- "jmp paeth_paeth2 \n\t"
-
- "paeth_abc2: \n\t"
- // pa <= pc; Raw(x) = Paeth(x) + Raw(x-bpp)
- "movb (%%edi,%%edx,), %%cl \n\t" // load Raw(x-bpp) into cl
-
- "paeth_paeth2: \n\t"
- "incl %%ebx \n\t"
- "incl %%edx \n\t"
- // Raw(x) = (Paeth(x) + Paeth_Predictor( a, b, c )) mod 256
- "addb %%cl, -1(%%edi,%%ebx,) \n\t"
- "cmpl _FullLength, %%ebx \n\t"
- "jb paeth_lp2 \n\t"
-
- "paeth_end: \n\t"
- "EMMS \n\t" // end MMX; prep for poss. FP instrs.
-#ifdef __PIC__
- "popl %%ebx \n\t" // restore index to Global Offset Table
-#endif
-
- : "=c" (dummy_value_c), // output regs (dummy)
- "=S" (dummy_value_S),
- "=D" (dummy_value_D)
-
- : "0" (bpp), // ecx // input regs
- "1" (prev_row), // esi
- "2" (row) // edi
-
- : "%eax", "%edx" // clobber list (no input regs!)
-#ifndef __PIC__
- , "%ebx"
-#endif
- );
-
-} /* end png_read_filter_row_mmx_paeth() */
-#endif
-
-
-
-
-#ifdef PNG_THREAD_UNSAFE_OK
-//===========================================================================//
-// //
-// P N G _ R E A D _ F I L T E R _ R O W _ M M X _ S U B //
-// //
-//===========================================================================//
-
-// Optimized code for PNG Sub filter decoder
-
-static void /* PRIVATE */
-png_read_filter_row_mmx_sub(png_row_infop row_info, png_bytep row)
-{
- int bpp;
- int dummy_value_a;
- int dummy_value_D;
-
- bpp = (row_info->pixel_depth + 7) >> 3; // calc number of bytes per pixel
- _FullLength = row_info->rowbytes - bpp; // number of bytes to filter
-
- __asm__ __volatile__ (
-//pre "movl row, %%edi \n\t"
- "movl %%edi, %%esi \n\t" // lp = row
-//pre "movl bpp, %%eax \n\t"
- "addl %%eax, %%edi \n\t" // rp = row + bpp
-//irr "xorl %%eax, %%eax \n\t"
- // get # of bytes to alignment
- "movl %%edi, _dif \n\t" // take start of row
- "addl $0xf, _dif \n\t" // add 7 + 8 to incr past
- // alignment boundary
- "xorl %%ecx, %%ecx \n\t"
- "andl $0xfffffff8, _dif \n\t" // mask to alignment boundary
- "subl %%edi, _dif \n\t" // subtract from start ==> value
- "jz sub_go \n\t" // ecx at alignment
-
- "sub_lp1: \n\t" // fix alignment
- "movb (%%esi,%%ecx,), %%al \n\t"
- "addb %%al, (%%edi,%%ecx,) \n\t"
- "incl %%ecx \n\t"
- "cmpl _dif, %%ecx \n\t"
- "jb sub_lp1 \n\t"
-
- "sub_go: \n\t"
- "movl _FullLength, %%eax \n\t"
- "movl %%eax, %%edx \n\t"
- "subl %%ecx, %%edx \n\t" // subtract alignment fix
- "andl $0x00000007, %%edx \n\t" // calc bytes over mult of 8
- "subl %%edx, %%eax \n\t" // drop over bytes from length
- "movl %%eax, _MMXLength \n\t"
-
- : "=a" (dummy_value_a), // 0 // output regs (dummy)
- "=D" (dummy_value_D) // 1
-
- : "0" (bpp), // eax // input regs
- "1" (row) // edi
-
- : "%ebx", "%ecx", "%edx" // clobber list
- , "%esi"
-
-#if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */
- , "%mm0", "%mm1", "%mm2", "%mm3"
- , "%mm4", "%mm5", "%mm6", "%mm7"
-#endif
- );
-
- // now do the math for the rest of the row
- switch (bpp)
- {
- case 3:
- {
- _ActiveMask.use = 0x0000ffffff000000LL;
- _ShiftBpp.use = 24; // == 3 * 8
- _ShiftRem.use = 40; // == 64 - 24
-
- __asm__ __volatile__ (
-// preload "movl row, %%edi \n\t"
- "movq _ActiveMask, %%mm7 \n\t" // load _ActiveMask for 2nd
- // active byte group
- "movl %%edi, %%esi \n\t" // lp = row
-// preload "movl bpp, %%eax \n\t"
- "addl %%eax, %%edi \n\t" // rp = row + bpp
- "movq %%mm7, %%mm6 \n\t"
- "movl _dif, %%edx \n\t"
- "psllq _ShiftBpp, %%mm6 \n\t" // move mask in mm6 to cover
- // 3rd active byte group
- // prime the pump: load the first Raw(x-bpp) data set
- "movq -8(%%edi,%%edx,), %%mm1 \n\t"
-
- "sub_3lp: \n\t" // shift data for adding first
- "psrlq _ShiftRem, %%mm1 \n\t" // bpp bytes (no need for mask;
- // shift clears inactive bytes)
- // add 1st active group
- "movq (%%edi,%%edx,), %%mm0 \n\t"
- "paddb %%mm1, %%mm0 \n\t"
-
- // add 2nd active group
- "movq %%mm0, %%mm1 \n\t" // mov updated Raws to mm1
- "psllq _ShiftBpp, %%mm1 \n\t" // shift data to pos. correctly
- "pand %%mm7, %%mm1 \n\t" // mask to use 2nd active group
- "paddb %%mm1, %%mm0 \n\t"
-
- // add 3rd active group
- "movq %%mm0, %%mm1 \n\t" // mov updated Raws to mm1
- "psllq _ShiftBpp, %%mm1 \n\t" // shift data to pos. correctly
- "pand %%mm6, %%mm1 \n\t" // mask to use 3rd active group
- "addl $8, %%edx \n\t"
- "paddb %%mm1, %%mm0 \n\t"
-
- "cmpl _MMXLength, %%edx \n\t"
- "movq %%mm0, -8(%%edi,%%edx,) \n\t" // write updated Raws to array
- "movq %%mm0, %%mm1 \n\t" // prep 1st add at top of loop
- "jb sub_3lp \n\t"
-
- : "=a" (dummy_value_a), // 0 // output regs (dummy)
- "=D" (dummy_value_D) // 1
-
- : "0" (bpp), // eax // input regs
- "1" (row) // edi
-
- : "%edx", "%esi" // clobber list
-#if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */
- , "%mm0", "%mm1", "%mm6", "%mm7"
-#endif
- );
- }
- break;
-
- case 1:
- {
- __asm__ __volatile__ (
- "movl _dif, %%edx \n\t"
-// preload "movl row, %%edi \n\t"
- "cmpl _FullLength, %%edx \n\t"
- "jnb sub_1end \n\t"
- "movl %%edi, %%esi \n\t" // lp = row
- "xorl %%eax, %%eax \n\t"
-// preload "movl bpp, %%eax \n\t"
- "addl %%eax, %%edi \n\t" // rp = row + bpp
-
- "sub_1lp: \n\t"
- "movb (%%esi,%%edx,), %%al \n\t"
- "addb %%al, (%%edi,%%edx,) \n\t"
- "incl %%edx \n\t"
- "cmpl _FullLength, %%edx \n\t"
- "jb sub_1lp \n\t"
-
- "sub_1end: \n\t"
-
- : "=a" (dummy_value_a), // 0 // output regs (dummy)
- "=D" (dummy_value_D) // 1
-
- : "0" (bpp), // eax // input regs
- "1" (row) // edi
-
- : "%edx", "%esi" // clobber list
- );
- }
- return;
-
- case 6:
- case 4:
- //case 7: // GRR BOGUS
- //case 5: // GRR BOGUS
- {
- _ShiftBpp.use = bpp << 3;
- _ShiftRem.use = 64 - _ShiftBpp.use;
-
- __asm__ __volatile__ (
-// preload "movl row, %%edi \n\t"
- "movl _dif, %%edx \n\t"
- "movl %%edi, %%esi \n\t" // lp = row
-// preload "movl bpp, %%eax \n\t"
- "addl %%eax, %%edi \n\t" // rp = row + bpp
-
- // prime the pump: load the first Raw(x-bpp) data set
- "movq -8(%%edi,%%edx,), %%mm1 \n\t"
-
- "sub_4lp: \n\t" // shift data for adding first
- "psrlq _ShiftRem, %%mm1 \n\t" // bpp bytes (no need for mask;
- // shift clears inactive bytes)
- "movq (%%edi,%%edx,), %%mm0 \n\t"
- "paddb %%mm1, %%mm0 \n\t"
-
- // add 2nd active group
- "movq %%mm0, %%mm1 \n\t" // mov updated Raws to mm1
- "psllq _ShiftBpp, %%mm1 \n\t" // shift data to pos. correctly
- "addl $8, %%edx \n\t"
- "paddb %%mm1, %%mm0 \n\t"
-
- "cmpl _MMXLength, %%edx \n\t"
- "movq %%mm0, -8(%%edi,%%edx,) \n\t"
- "movq %%mm0, %%mm1 \n\t" // prep 1st add at top of loop
- "jb sub_4lp \n\t"
-
- : "=a" (dummy_value_a), // 0 // output regs (dummy)
- "=D" (dummy_value_D) // 1
-
- : "0" (bpp), // eax // input regs
- "1" (row) // edi
-
- : "%edx", "%esi" // clobber list
-#if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */
- , "%mm0", "%mm1"
-#endif
- );
- }
- break;
-
- case 2:
- {
- _ActiveMask.use = 0x00000000ffff0000LL;
- _ShiftBpp.use = 16; // == 2 * 8
- _ShiftRem.use = 48; // == 64 - 16
-
- __asm__ __volatile__ (
- "movq _ActiveMask, %%mm7 \n\t" // load _ActiveMask for 2nd
- // active byte group
- "movl _dif, %%edx \n\t"
- "movq %%mm7, %%mm6 \n\t"
-// preload "movl row, %%edi \n\t"
- "psllq _ShiftBpp, %%mm6 \n\t" // move mask in mm6 to cover
- // 3rd active byte group
- "movl %%edi, %%esi \n\t" // lp = row
- "movq %%mm6, %%mm5 \n\t"
-// preload "movl bpp, %%eax \n\t"
- "addl %%eax, %%edi \n\t" // rp = row + bpp
- "psllq _ShiftBpp, %%mm5 \n\t" // move mask in mm5 to cover
- // 4th active byte group
- // prime the pump: load the first Raw(x-bpp) data set
- "movq -8(%%edi,%%edx,), %%mm1 \n\t"
-
- "sub_2lp: \n\t" // shift data for adding first
- "psrlq _ShiftRem, %%mm1 \n\t" // bpp bytes (no need for mask;
- // shift clears inactive bytes)
- // add 1st active group
- "movq (%%edi,%%edx,), %%mm0 \n\t"
- "paddb %%mm1, %%mm0 \n\t"
-
- // add 2nd active group
- "movq %%mm0, %%mm1 \n\t" // mov updated Raws to mm1
- "psllq _ShiftBpp, %%mm1 \n\t" // shift data to pos. correctly
- "pand %%mm7, %%mm1 \n\t" // mask to use 2nd active group
- "paddb %%mm1, %%mm0 \n\t"
-
- // add 3rd active group
- "movq %%mm0, %%mm1 \n\t" // mov updated Raws to mm1
- "psllq _ShiftBpp, %%mm1 \n\t" // shift data to pos. correctly
- "pand %%mm6, %%mm1 \n\t" // mask to use 3rd active group
- "paddb %%mm1, %%mm0 \n\t"
-
- // add 4th active group
- "movq %%mm0, %%mm1 \n\t" // mov updated Raws to mm1
- "psllq _ShiftBpp, %%mm1 \n\t" // shift data to pos. correctly
- "pand %%mm5, %%mm1 \n\t" // mask to use 4th active group
- "addl $8, %%edx \n\t"
- "paddb %%mm1, %%mm0 \n\t"
- "cmpl _MMXLength, %%edx \n\t"
- "movq %%mm0, -8(%%edi,%%edx,) \n\t" // write updated Raws to array
- "movq %%mm0, %%mm1 \n\t" // prep 1st add at top of loop
- "jb sub_2lp \n\t"
-
- : "=a" (dummy_value_a), // 0 // output regs (dummy)
- "=D" (dummy_value_D) // 1
-
- : "0" (bpp), // eax // input regs
- "1" (row) // edi
-
- : "%edx", "%esi" // clobber list
-#if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */
- , "%mm0", "%mm1", "%mm5", "%mm6", "%mm7"
-#endif
- );
- }
- break;
-
- case 8:
- {
- __asm__ __volatile__ (
-// preload "movl row, %%edi \n\t"
- "movl _dif, %%edx \n\t"
- "movl %%edi, %%esi \n\t" // lp = row
-// preload "movl bpp, %%eax \n\t"
- "addl %%eax, %%edi \n\t" // rp = row + bpp
- "movl _MMXLength, %%ecx \n\t"
-
- // prime the pump: load the first Raw(x-bpp) data set
- "movq -8(%%edi,%%edx,), %%mm7 \n\t"
- "andl $0x0000003f, %%ecx \n\t" // calc bytes over mult of 64
-
- "sub_8lp: \n\t"
- "movq (%%edi,%%edx,), %%mm0 \n\t" // load Sub(x) for 1st 8 bytes
- "paddb %%mm7, %%mm0 \n\t"
- "movq 8(%%edi,%%edx,), %%mm1 \n\t" // load Sub(x) for 2nd 8 bytes
- "movq %%mm0, (%%edi,%%edx,) \n\t" // write Raw(x) for 1st 8 bytes
-
- // Now mm0 will be used as Raw(x-bpp) for the 2nd group of 8 bytes.
- // This will be repeated for each group of 8 bytes with the 8th
- // group being used as the Raw(x-bpp) for the 1st group of the
- // next loop.
-
- "paddb %%mm0, %%mm1 \n\t"
- "movq 16(%%edi,%%edx,), %%mm2 \n\t" // load Sub(x) for 3rd 8 bytes
- "movq %%mm1, 8(%%edi,%%edx,) \n\t" // write Raw(x) for 2nd 8 bytes
- "paddb %%mm1, %%mm2 \n\t"
- "movq 24(%%edi,%%edx,), %%mm3 \n\t" // load Sub(x) for 4th 8 bytes
- "movq %%mm2, 16(%%edi,%%edx,) \n\t" // write Raw(x) for 3rd 8 bytes
- "paddb %%mm2, %%mm3 \n\t"
- "movq 32(%%edi,%%edx,), %%mm4 \n\t" // load Sub(x) for 5th 8 bytes
- "movq %%mm3, 24(%%edi,%%edx,) \n\t" // write Raw(x) for 4th 8 bytes
- "paddb %%mm3, %%mm4 \n\t"
- "movq 40(%%edi,%%edx,), %%mm5 \n\t" // load Sub(x) for 6th 8 bytes
- "movq %%mm4, 32(%%edi,%%edx,) \n\t" // write Raw(x) for 5th 8 bytes
- "paddb %%mm4, %%mm5 \n\t"
- "movq 48(%%edi,%%edx,), %%mm6 \n\t" // load Sub(x) for 7th 8 bytes
- "movq %%mm5, 40(%%edi,%%edx,) \n\t" // write Raw(x) for 6th 8 bytes
- "paddb %%mm5, %%mm6 \n\t"
- "movq 56(%%edi,%%edx,), %%mm7 \n\t" // load Sub(x) for 8th 8 bytes
- "movq %%mm6, 48(%%edi,%%edx,) \n\t" // write Raw(x) for 7th 8 bytes
- "addl $64, %%edx \n\t"
- "paddb %%mm6, %%mm7 \n\t"
- "cmpl %%ecx, %%edx \n\t"
- "movq %%mm7, -8(%%edi,%%edx,) \n\t" // write Raw(x) for 8th 8 bytes
- "jb sub_8lp \n\t"
-
- "cmpl _MMXLength, %%edx \n\t"
- "jnb sub_8lt8 \n\t"
-
- "sub_8lpA: \n\t"
- "movq (%%edi,%%edx,), %%mm0 \n\t"
- "addl $8, %%edx \n\t"
- "paddb %%mm7, %%mm0 \n\t"
- "cmpl _MMXLength, %%edx \n\t"
- "movq %%mm0, -8(%%edi,%%edx,) \n\t" // -8 to offset early addl edx
- "movq %%mm0, %%mm7 \n\t" // move calculated Raw(x) data
- // to mm1 to be new Raw(x-bpp)
- // for next loop
- "jb sub_8lpA \n\t"
-
- "sub_8lt8: \n\t"
-
- : "=a" (dummy_value_a), // 0 // output regs (dummy)
- "=D" (dummy_value_D) // 1
-
- : "0" (bpp), // eax // input regs
- "1" (row) // edi
-
- : "%ecx", "%edx", "%esi" // clobber list
-#if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */
- , "%mm0", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5", "%mm6", "%mm7"
-#endif
- );
- }
- break;
-
- default: // bpp greater than 8 bytes GRR BOGUS
- {
- __asm__ __volatile__ (
- "movl _dif, %%edx \n\t"
-// preload "movl row, %%edi \n\t"
- "movl %%edi, %%esi \n\t" // lp = row
-// preload "movl bpp, %%eax \n\t"
- "addl %%eax, %%edi \n\t" // rp = row + bpp
-
- "sub_Alp: \n\t"
- "movq (%%edi,%%edx,), %%mm0 \n\t"
- "movq (%%esi,%%edx,), %%mm1 \n\t"
- "addl $8, %%edx \n\t"
- "paddb %%mm1, %%mm0 \n\t"
- "cmpl _MMXLength, %%edx \n\t"
- "movq %%mm0, -8(%%edi,%%edx,) \n\t" // mov does not affect flags;
- // -8 to offset addl edx
- "jb sub_Alp \n\t"
-
- : "=a" (dummy_value_a), // 0 // output regs (dummy)
- "=D" (dummy_value_D) // 1
-
- : "0" (bpp), // eax // input regs
- "1" (row) // edi
-
- : "%edx", "%esi" // clobber list
-#if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */
- , "%mm0", "%mm1"
-#endif
- );
- }
- break;
-
- } // end switch (bpp)
-
- __asm__ __volatile__ (
- "movl _MMXLength, %%edx \n\t"
-//pre "movl row, %%edi \n\t"
- "cmpl _FullLength, %%edx \n\t"
- "jnb sub_end \n\t"
-
- "movl %%edi, %%esi \n\t" // lp = row
-//pre "movl bpp, %%eax \n\t"
- "addl %%eax, %%edi \n\t" // rp = row + bpp
- "xorl %%eax, %%eax \n\t"
-
- "sub_lp2: \n\t"
- "movb (%%esi,%%edx,), %%al \n\t"
- "addb %%al, (%%edi,%%edx,) \n\t"
- "incl %%edx \n\t"
- "cmpl _FullLength, %%edx \n\t"
- "jb sub_lp2 \n\t"
-
- "sub_end: \n\t"
- "EMMS \n\t" // end MMX instructions
-
- : "=a" (dummy_value_a), // 0 // output regs (dummy)
- "=D" (dummy_value_D) // 1
-
- : "0" (bpp), // eax // input regs
- "1" (row) // edi
-
- : "%edx", "%esi" // clobber list
- );
-
-} // end of png_read_filter_row_mmx_sub()
-#endif
-
-
-
-
-//===========================================================================//
-// //
-// P N G _ R E A D _ F I L T E R _ R O W _ M M X _ U P //
-// //
-//===========================================================================//
-
-// Optimized code for PNG Up filter decoder
-
-static void /* PRIVATE */
-png_read_filter_row_mmx_up(png_row_infop row_info, png_bytep row,
- png_bytep prev_row)
-{
- png_uint_32 len;
- int dummy_value_d; // fix 'forbidden register 3 (dx) was spilled' error
- int dummy_value_S;
- int dummy_value_D;
-
- len = row_info->rowbytes; // number of bytes to filter
-
- __asm__ __volatile__ (
-//pre "movl row, %%edi \n\t"
- // get # of bytes to alignment
- "movl %%edi, %%ecx \n\t"
- "xorl %%ebx, %%ebx \n\t"
- "addl $0x7, %%ecx \n\t"
- "xorl %%eax, %%eax \n\t"
- "andl $0xfffffff8, %%ecx \n\t"
-//pre "movl prev_row, %%esi \n\t"
- "subl %%edi, %%ecx \n\t"
- "jz up_go \n\t"
-
- "up_lp1: \n\t" // fix alignment
- "movb (%%edi,%%ebx,), %%al \n\t"
- "addb (%%esi,%%ebx,), %%al \n\t"
- "incl %%ebx \n\t"
- "cmpl %%ecx, %%ebx \n\t"
- "movb %%al, -1(%%edi,%%ebx,) \n\t" // mov does not affect flags; -1 to
- "jb up_lp1 \n\t" // offset incl ebx
-
- "up_go: \n\t"
-//pre "movl len, %%edx \n\t"
- "movl %%edx, %%ecx \n\t"
- "subl %%ebx, %%edx \n\t" // subtract alignment fix
- "andl $0x0000003f, %%edx \n\t" // calc bytes over mult of 64
- "subl %%edx, %%ecx \n\t" // drop over bytes from length
-
- // unrolled loop - use all MMX registers and interleave to reduce
- // number of branch instructions (loops) and reduce partial stalls
- "up_loop: \n\t"
- "movq (%%esi,%%ebx,), %%mm1 \n\t"
- "movq (%%edi,%%ebx,), %%mm0 \n\t"
- "movq 8(%%esi,%%ebx,), %%mm3 \n\t"
- "paddb %%mm1, %%mm0 \n\t"
- "movq 8(%%edi,%%ebx,), %%mm2 \n\t"
- "movq %%mm0, (%%edi,%%ebx,) \n\t"
- "paddb %%mm3, %%mm2 \n\t"
- "movq 16(%%esi,%%ebx,), %%mm5 \n\t"
- "movq %%mm2, 8(%%edi,%%ebx,) \n\t"
- "movq 16(%%edi,%%ebx,), %%mm4 \n\t"
- "movq 24(%%esi,%%ebx,), %%mm7 \n\t"
- "paddb %%mm5, %%mm4 \n\t"
- "movq 24(%%edi,%%ebx,), %%mm6 \n\t"
- "movq %%mm4, 16(%%edi,%%ebx,) \n\t"
- "paddb %%mm7, %%mm6 \n\t"
- "movq 32(%%esi,%%ebx,), %%mm1 \n\t"
- "movq %%mm6, 24(%%edi,%%ebx,) \n\t"
- "movq 32(%%edi,%%ebx,), %%mm0 \n\t"
- "movq 40(%%esi,%%ebx,), %%mm3 \n\t"
- "paddb %%mm1, %%mm0 \n\t"
- "movq 40(%%edi,%%ebx,), %%mm2 \n\t"
- "movq %%mm0, 32(%%edi,%%ebx,) \n\t"
- "paddb %%mm3, %%mm2 \n\t"
- "movq 48(%%esi,%%ebx,), %%mm5 \n\t"
- "movq %%mm2, 40(%%edi,%%ebx,) \n\t"
- "movq 48(%%edi,%%ebx,), %%mm4 \n\t"
- "movq 56(%%esi,%%ebx,), %%mm7 \n\t"
- "paddb %%mm5, %%mm4 \n\t"
- "movq 56(%%edi,%%ebx,), %%mm6 \n\t"
- "movq %%mm4, 48(%%edi,%%ebx,) \n\t"
- "addl $64, %%ebx \n\t"
- "paddb %%mm7, %%mm6 \n\t"
- "cmpl %%ecx, %%ebx \n\t"
- "movq %%mm6, -8(%%edi,%%ebx,) \n\t" // (+56)movq does not affect flags;
- "jb up_loop \n\t" // -8 to offset addl ebx
-
- "cmpl $0, %%edx \n\t" // test for bytes over mult of 64
- "jz up_end \n\t"
-
- "cmpl $8, %%edx \n\t" // test for less than 8 bytes
- "jb up_lt8 \n\t" // [added by lcreeve@netins.net]
-
- "addl %%edx, %%ecx \n\t"
- "andl $0x00000007, %%edx \n\t" // calc bytes over mult of 8
- "subl %%edx, %%ecx \n\t" // drop over bytes from length
- "jz up_lt8 \n\t"
-
- "up_lpA: \n\t" // use MMX regs to update 8 bytes sim.
- "movq (%%esi,%%ebx,), %%mm1 \n\t"
- "movq (%%edi,%%ebx,), %%mm0 \n\t"
- "addl $8, %%ebx \n\t"
- "paddb %%mm1, %%mm0 \n\t"
- "cmpl %%ecx, %%ebx \n\t"
- "movq %%mm0, -8(%%edi,%%ebx,) \n\t" // movq does not affect flags; -8 to
- "jb up_lpA \n\t" // offset add ebx
- "cmpl $0, %%edx \n\t" // test for bytes over mult of 8
- "jz up_end \n\t"
-
- "up_lt8: \n\t"
- "xorl %%eax, %%eax \n\t"
- "addl %%edx, %%ecx \n\t" // move over byte count into counter
-
- "up_lp2: \n\t" // use x86 regs for remaining bytes
- "movb (%%edi,%%ebx,), %%al \n\t"
- "addb (%%esi,%%ebx,), %%al \n\t"
- "incl %%ebx \n\t"
- "cmpl %%ecx, %%ebx \n\t"
- "movb %%al, -1(%%edi,%%ebx,) \n\t" // mov does not affect flags; -1 to
- "jb up_lp2 \n\t" // offset inc ebx
-
- "up_end: \n\t"
- "EMMS \n\t" // conversion of filtered row complete
-
- : "=d" (dummy_value_d), // 0 // output regs (dummy)
- "=S" (dummy_value_S), // 1
- "=D" (dummy_value_D) // 2
-
- : "0" (len), // edx // input regs
- "1" (prev_row), // esi
- "2" (row) // edi
-
- : "%eax", "%ebx", "%ecx" // clobber list (no input regs!)
-
-#if 0 /* MMX regs (%mm0, etc.) not supported by gcc 2.7.2.3 or egcs 1.1 */
- , "%mm0", "%mm1", "%mm2", "%mm3"
- , "%mm4", "%mm5", "%mm6", "%mm7"
-#endif
- );
-
-} // end of png_read_filter_row_mmx_up()
-
-#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */
-
-
-
-
-/*===========================================================================*/
-/* */
-/* P N G _ R E A D _ F I L T E R _ R O W */
-/* */
-/*===========================================================================*/
-
-
-/* Optimized png_read_filter_row routines */
-
-void /* PRIVATE */
-png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep
- row, png_bytep prev_row, int filter)
-{
-#ifdef PNG_DEBUG
- char filnm[10];
-#endif
-
-#if defined(PNG_ASSEMBLER_CODE_SUPPORTED)
-/* GRR: these are superseded by png_ptr->asm_flags: */
-#define UseMMX_sub 1 // GRR: converted 20000730
-#define UseMMX_up 1 // GRR: converted 20000729
-#define UseMMX_avg 1 // GRR: converted 20000828 (+ 16-bit bugfix 20000916)
-#define UseMMX_paeth 1 // GRR: converted 20000828
-
- if (_mmx_supported == 2) {
- /* this should have happened in png_init_mmx_flags() already */
- png_warning(png_ptr, "asm_flags may not have been initialized");
- png_mmx_support();
- }
-#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */
-
-#ifdef PNG_DEBUG
- png_debug(1, "in png_read_filter_row (pnggccrd.c)\n");
- switch (filter)
- {
- case 0: sprintf(filnm, "none");
- break;
- case 1: sprintf(filnm, "sub-%s",
-#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK)
- (png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_SUB)? "MMX" :
-#endif
-"x86");
- break;
- case 2: sprintf(filnm, "up-%s",
-#ifdef PNG_ASSEMBLER_CODE_SUPPORTED
- (png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_UP)? "MMX" :
-#endif
- "x86");
- break;
- case 3: sprintf(filnm, "avg-%s",
-#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK)
- (png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_AVG)? "MMX" :
-#endif
- "x86");
- break;
- case 4: sprintf(filnm, "Paeth-%s",
-#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK)
- (png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_PAETH)? "MMX":
-#endif
-"x86");
- break;
- default: sprintf(filnm, "unknw");
- break;
- }
- png_debug2(0, "row_number=%5ld, %5s, ", png_ptr->row_number, filnm);
- png_debug1(0, "row=0x%08lx, ", (unsigned long)row);
- png_debug2(0, "pixdepth=%2d, bytes=%d, ", (int)row_info->pixel_depth,
- (int)((row_info->pixel_depth + 7) >> 3));
- png_debug1(0,"rowbytes=%8ld\n", row_info->rowbytes);
-#endif /* PNG_DEBUG */
-
- switch (filter)
- {
- case PNG_FILTER_VALUE_NONE:
- break;
-
- case PNG_FILTER_VALUE_SUB:
-#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK)
- if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_SUB) &&
- (row_info->pixel_depth >= png_ptr->mmx_bitdepth_threshold) &&
- (row_info->rowbytes >= png_ptr->mmx_rowbytes_threshold))
- {
- png_read_filter_row_mmx_sub(row_info, row);
- }
- else
-#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */
- {
- png_uint_32 i;
- png_uint_32 istop = row_info->rowbytes;
- png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3;
- png_bytep rp = row + bpp;
- png_bytep lp = row;
-
- for (i = bpp; i < istop; i++)
- {
- *rp = (png_byte)(((int)(*rp) + (int)(*lp++)) & 0xff);
- rp++;
- }
- } /* end !UseMMX_sub */
- break;
-
- case PNG_FILTER_VALUE_UP:
-#if defined(PNG_ASSEMBLER_CODE_SUPPORTED)
- if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_UP) &&
- (row_info->pixel_depth >= png_ptr->mmx_bitdepth_threshold) &&
- (row_info->rowbytes >= png_ptr->mmx_rowbytes_threshold))
- {
- png_read_filter_row_mmx_up(row_info, row, prev_row);
- }
- else
-#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */
- {
- png_uint_32 i;
- png_uint_32 istop = row_info->rowbytes;
- png_bytep rp = row;
- png_bytep pp = prev_row;
-
- for (i = 0; i < istop; ++i)
- {
- *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff);
- rp++;
- }
- } /* end !UseMMX_up */
- break;
-
- case PNG_FILTER_VALUE_AVG:
-#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK)
- if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_AVG) &&
- (row_info->pixel_depth >= png_ptr->mmx_bitdepth_threshold) &&
- (row_info->rowbytes >= png_ptr->mmx_rowbytes_threshold))
- {
- png_read_filter_row_mmx_avg(row_info, row, prev_row);
- }
- else
-#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */
- {
- png_uint_32 i;
- png_bytep rp = row;
- png_bytep pp = prev_row;
- png_bytep lp = row;
- png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3;
- png_uint_32 istop = row_info->rowbytes - bpp;
-
- for (i = 0; i < bpp; i++)
- {
- *rp = (png_byte)(((int)(*rp) +
- ((int)(*pp++) >> 1)) & 0xff);
- rp++;
- }
-
- for (i = 0; i < istop; i++)
- {
- *rp = (png_byte)(((int)(*rp) +
- ((int)(*pp++ + *lp++) >> 1)) & 0xff);
- rp++;
- }
- } /* end !UseMMX_avg */
- break;
-
- case PNG_FILTER_VALUE_PAETH:
-#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_THREAD_UNSAFE_OK)
- if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_PAETH) &&
- (row_info->pixel_depth >= png_ptr->mmx_bitdepth_threshold) &&
- (row_info->rowbytes >= png_ptr->mmx_rowbytes_threshold))
- {
- png_read_filter_row_mmx_paeth(row_info, row, prev_row);
- }
- else
-#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */
- {
- png_uint_32 i;
- png_bytep rp = row;
- png_bytep pp = prev_row;
- png_bytep lp = row;
- png_bytep cp = prev_row;
- png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3;
- png_uint_32 istop = row_info->rowbytes - bpp;
-
- for (i = 0; i < bpp; i++)
- {
- *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff);
- rp++;
- }
-
- for (i = 0; i < istop; i++) /* use leftover rp,pp */
- {
- int a, b, c, pa, pb, pc, p;
-
- a = *lp++;
- b = *pp++;
- c = *cp++;
-
- p = b - c;
- pc = a - c;
-
-#ifdef PNG_USE_ABS
- pa = abs(p);
- pb = abs(pc);
- pc = abs(p + pc);
-#else
- pa = p < 0 ? -p : p;
- pb = pc < 0 ? -pc : pc;
- pc = (p + pc) < 0 ? -(p + pc) : p + pc;
-#endif
-
- /*
- if (pa <= pb && pa <= pc)
- p = a;
- else if (pb <= pc)
- p = b;
- else
- p = c;
- */
-
- p = (pa <= pb && pa <= pc) ? a : (pb <= pc) ? b : c;
-
- *rp = (png_byte)(((int)(*rp) + p) & 0xff);
- rp++;
- }
- } /* end !UseMMX_paeth */
- break;
-
- default:
- png_warning(png_ptr, "Ignoring bad row-filter type");
- *row=0;
- break;
- }
-}
-
-#endif /* PNG_HAVE_ASSEMBLER_READ_FILTER_ROW */
-
-
-/*===========================================================================*/
-/* */
-/* P N G _ M M X _ S U P P O R T */
-/* */
-/*===========================================================================*/
-
-/* GRR NOTES: (1) the following code assumes 386 or better (pushfl/popfl)
- * (2) all instructions compile with gcc 2.7.2.3 and later
- * (3) the function is moved down here to prevent gcc from
- * inlining it in multiple places and then barfing be-
- * cause the ".NOT_SUPPORTED" label is multiply defined
- * [is there a way to signal that a *single* function should
- * not be inlined? is there a way to modify the label for
- * each inlined instance, e.g., by appending _1, _2, etc.?
- * maybe if don't use leading "." in label name? (nope...sigh)]
- */
-
-int PNGAPI
-png_mmx_support(void)
-{
-#if defined(PNG_MMX_CODE_SUPPORTED)
- __asm__ __volatile__ (
- "pushl %%ebx \n\t" // ebx gets clobbered by CPUID instruction
- "pushl %%ecx \n\t" // so does ecx...
- "pushl %%edx \n\t" // ...and edx (but ecx & edx safe on Linux)
-// ".byte 0x66 \n\t" // convert 16-bit pushf to 32-bit pushfd
-// "pushf \n\t" // 16-bit pushf
- "pushfl \n\t" // save Eflag to stack
- "popl %%eax \n\t" // get Eflag from stack into eax
- "movl %%eax, %%ecx \n\t" // make another copy of Eflag in ecx
- "xorl $0x200000, %%eax \n\t" // toggle ID bit in Eflag (i.e., bit 21)
- "pushl %%eax \n\t" // save modified Eflag back to stack
-// ".byte 0x66 \n\t" // convert 16-bit popf to 32-bit popfd
-// "popf \n\t" // 16-bit popf
- "popfl \n\t" // restore modified value to Eflag reg
- "pushfl \n\t" // save Eflag to stack
- "popl %%eax \n\t" // get Eflag from stack
- "pushl %%ecx \n\t" // save original Eflag to stack
- "popfl \n\t" // restore original Eflag
- "xorl %%ecx, %%eax \n\t" // compare new Eflag with original Eflag
- "jz .NOT_SUPPORTED \n\t" // if same, CPUID instr. is not supported
-
- "xorl %%eax, %%eax \n\t" // set eax to zero
-// ".byte 0x0f, 0xa2 \n\t" // CPUID instruction (two-byte opcode)
- "cpuid \n\t" // get the CPU identification info
- "cmpl $1, %%eax \n\t" // make sure eax return non-zero value
- "jl .NOT_SUPPORTED \n\t" // if eax is zero, MMX is not supported
-
- "xorl %%eax, %%eax \n\t" // set eax to zero and...
- "incl %%eax \n\t" // ...increment eax to 1. This pair is
- // faster than the instruction "mov eax, 1"
- "cpuid \n\t" // get the CPU identification info again
- "andl $0x800000, %%edx \n\t" // mask out all bits but MMX bit (23)
- "cmpl $0, %%edx \n\t" // 0 = MMX not supported
- "jz .NOT_SUPPORTED \n\t" // non-zero = yes, MMX IS supported
-
- "movl $1, %%eax \n\t" // set return value to 1
- "jmp .RETURN \n\t" // DONE: have MMX support
-
- ".NOT_SUPPORTED: \n\t" // target label for jump instructions
- "movl $0, %%eax \n\t" // set return value to 0
- ".RETURN: \n\t" // target label for jump instructions
- "movl %%eax, _mmx_supported \n\t" // save in global static variable, too
- "popl %%edx \n\t" // restore edx
- "popl %%ecx \n\t" // restore ecx
- "popl %%ebx \n\t" // restore ebx
-
-// "ret \n\t" // DONE: no MMX support
- // (fall through to standard C "ret")
-
- : // output list (none)
-
- : // any variables used on input (none)
-
- : "%eax" // clobber list
-// , "%ebx", "%ecx", "%edx" // GRR: we handle these manually
-// , "memory" // if write to a variable gcc thought was in a reg
-// , "cc" // "condition codes" (flag bits)
- );
-#else
- _mmx_supported = 0;
-#endif /* PNG_MMX_CODE_SUPPORTED */
-
- return _mmx_supported;
-}
-
-
-#endif /* PNG_USE_PNGGCCRD */
diff --git a/libpng/pngget.c b/libpng/pngget.c
deleted file mode 100644
index f180f3d..0000000
--- a/libpng/pngget.c
+++ /dev/null
@@ -1,917 +0,0 @@
-
-/* pngget.c - retrieval of values from info struct
- *
- * libpng 1.2.1 - December 12, 2001
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2001 Glenn Randers-Pehrson
- * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
- * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
- */
-
-#define PNG_INTERNAL
-#include "png.h"
-
-png_uint_32 PNGAPI
-png_get_valid(png_structp png_ptr, png_infop info_ptr, png_uint_32 flag)
-{
- if (png_ptr != NULL && info_ptr != NULL)
- return(info_ptr->valid & flag);
- else
- return(0);
-}
-
-png_uint_32 PNGAPI
-png_get_rowbytes(png_structp png_ptr, png_infop info_ptr)
-{
- if (png_ptr != NULL && info_ptr != NULL)
- return(info_ptr->rowbytes);
- else
- return(0);
-}
-
-#if defined(PNG_INFO_IMAGE_SUPPORTED)
-png_bytepp PNGAPI
-png_get_rows(png_structp png_ptr, png_infop info_ptr)
-{
- if (png_ptr != NULL && info_ptr != NULL)
- return(info_ptr->row_pointers);
- else
- return(0);
-}
-#endif
-
-#ifdef PNG_EASY_ACCESS_SUPPORTED
-/* easy access to info, added in libpng-0.99 */
-png_uint_32 PNGAPI
-png_get_image_width(png_structp png_ptr, png_infop info_ptr)
-{
- if (png_ptr != NULL && info_ptr != NULL)
- {
- return info_ptr->width;
- }
- return (0);
-}
-
-png_uint_32 PNGAPI
-png_get_image_height(png_structp png_ptr, png_infop info_ptr)
-{
- if (png_ptr != NULL && info_ptr != NULL)
- {
- return info_ptr->height;
- }
- return (0);
-}
-
-png_byte PNGAPI
-png_get_bit_depth(png_structp png_ptr, png_infop info_ptr)
-{
- if (png_ptr != NULL && info_ptr != NULL)
- {
- return info_ptr->bit_depth;
- }
- return (0);
-}
-
-png_byte PNGAPI
-png_get_color_type(png_structp png_ptr, png_infop info_ptr)
-{
- if (png_ptr != NULL && info_ptr != NULL)
- {
- return info_ptr->color_type;
- }
- return (0);
-}
-
-png_byte PNGAPI
-png_get_filter_type(png_structp png_ptr, png_infop info_ptr)
-{
- if (png_ptr != NULL && info_ptr != NULL)
- {
- return info_ptr->filter_type;
- }
- return (0);
-}
-
-png_byte PNGAPI
-png_get_interlace_type(png_structp png_ptr, png_infop info_ptr)
-{
- if (png_ptr != NULL && info_ptr != NULL)
- {
- return info_ptr->interlace_type;
- }
- return (0);
-}
-
-png_byte PNGAPI
-png_get_compression_type(png_structp png_ptr, png_infop info_ptr)
-{
- if (png_ptr != NULL && info_ptr != NULL)
- {
- return info_ptr->compression_type;
- }
- return (0);
-}
-
-png_uint_32 PNGAPI
-png_get_x_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)
-{
- if (png_ptr != NULL && info_ptr != NULL)
-#if defined(PNG_pHYs_SUPPORTED)
- if (info_ptr->valid & PNG_INFO_pHYs)
- {
- png_debug1(1, "in %s retrieval function\n", "png_get_x_pixels_per_meter");
- if(info_ptr->phys_unit_type != PNG_RESOLUTION_METER)
- return (0);
- else return (info_ptr->x_pixels_per_unit);
- }
-#else
- return (0);
-#endif
- return (0);
-}
-
-png_uint_32 PNGAPI
-png_get_y_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)
-{
- if (png_ptr != NULL && info_ptr != NULL)
-#if defined(PNG_pHYs_SUPPORTED)
- if (info_ptr->valid & PNG_INFO_pHYs)
- {
- png_debug1(1, "in %s retrieval function\n", "png_get_y_pixels_per_meter");
- if(info_ptr->phys_unit_type != PNG_RESOLUTION_METER)
- return (0);
- else return (info_ptr->y_pixels_per_unit);
- }
-#else
- return (0);
-#endif
- return (0);
-}
-
-png_uint_32 PNGAPI
-png_get_pixels_per_meter(png_structp png_ptr, png_infop info_ptr)
-{
- if (png_ptr != NULL && info_ptr != NULL)
-#if defined(PNG_pHYs_SUPPORTED)
- if (info_ptr->valid & PNG_INFO_pHYs)
- {
- png_debug1(1, "in %s retrieval function\n", "png_get_pixels_per_meter");
- if(info_ptr->phys_unit_type != PNG_RESOLUTION_METER ||
- info_ptr->x_pixels_per_unit != info_ptr->y_pixels_per_unit)
- return (0);
- else return (info_ptr->x_pixels_per_unit);
- }
-#else
- return (0);
-#endif
- return (0);
-}
-
-#ifdef PNG_FLOATING_POINT_SUPPORTED
-float PNGAPI
-png_get_pixel_aspect_ratio(png_structp png_ptr, png_infop info_ptr)
- {
- if (png_ptr != NULL && info_ptr != NULL)
-#if defined(PNG_pHYs_SUPPORTED)
- if (info_ptr->valid & PNG_INFO_pHYs)
- {
- png_debug1(1, "in %s retrieval function\n", "png_get_aspect_ratio");
- if (info_ptr->x_pixels_per_unit == 0)
- return ((float)0.0);
- else
- return ((float)((float)info_ptr->y_pixels_per_unit
- /(float)info_ptr->x_pixels_per_unit));
- }
-#else
- return (0.0);
-#endif
- return ((float)0.0);
-}
-#endif
-
-png_int_32 PNGAPI
-png_get_x_offset_microns(png_structp png_ptr, png_infop info_ptr)
-{
- if (png_ptr != NULL && info_ptr != NULL)
-#if defined(PNG_oFFs_SUPPORTED)
- if (info_ptr->valid & PNG_INFO_oFFs)
- {
- png_debug1(1, "in %s retrieval function\n", "png_get_x_offset_microns");
- if(info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER)
- return (0);
- else return (info_ptr->x_offset);
- }
-#else
- return (0);
-#endif
- return (0);
-}
-
-png_int_32 PNGAPI
-png_get_y_offset_microns(png_structp png_ptr, png_infop info_ptr)
-{
- if (png_ptr != NULL && info_ptr != NULL)
-#if defined(PNG_oFFs_SUPPORTED)
- if (info_ptr->valid & PNG_INFO_oFFs)
- {
- png_debug1(1, "in %s retrieval function\n", "png_get_y_offset_microns");
- if(info_ptr->offset_unit_type != PNG_OFFSET_MICROMETER)
- return (0);
- else return (info_ptr->y_offset);
- }
-#else
- return (0);
-#endif
- return (0);
-}
-
-png_int_32 PNGAPI
-png_get_x_offset_pixels(png_structp png_ptr, png_infop info_ptr)
-{
- if (png_ptr != NULL && info_ptr != NULL)
-#if defined(PNG_oFFs_SUPPORTED)
- if (info_ptr->valid & PNG_INFO_oFFs)
- {
- png_debug1(1, "in %s retrieval function\n", "png_get_x_offset_microns");
- if(info_ptr->offset_unit_type != PNG_OFFSET_PIXEL)
- return (0);
- else return (info_ptr->x_offset);
- }
-#else
- return (0);
-#endif
- return (0);
-}
-
-png_int_32 PNGAPI
-png_get_y_offset_pixels(png_structp png_ptr, png_infop info_ptr)
-{
- if (png_ptr != NULL && info_ptr != NULL)
-#if defined(PNG_oFFs_SUPPORTED)
- if (info_ptr->valid & PNG_INFO_oFFs)
- {
- png_debug1(1, "in %s retrieval function\n", "png_get_y_offset_microns");
- if(info_ptr->offset_unit_type != PNG_OFFSET_PIXEL)
- return (0);
- else return (info_ptr->y_offset);
- }
-#else
- return (0);
-#endif
- return (0);
-}
-
-#if defined(PNG_INCH_CONVERSIONS) && defined(PNG_FLOATING_POINT_SUPPORTED)
-png_uint_32 PNGAPI
-png_get_pixels_per_inch(png_structp png_ptr, png_infop info_ptr)
-{
- return ((png_uint_32)((float)png_get_pixels_per_meter(png_ptr, info_ptr)
- *.0254 +.5));
-}
-
-png_uint_32 PNGAPI
-png_get_x_pixels_per_inch(png_structp png_ptr, png_infop info_ptr)
-{
- return ((png_uint_32)((float)png_get_x_pixels_per_meter(png_ptr, info_ptr)
- *.0254 +.5));
-}
-
-png_uint_32 PNGAPI
-png_get_y_pixels_per_inch(png_structp png_ptr, png_infop info_ptr)
-{
- return ((png_uint_32)((float)png_get_y_pixels_per_meter(png_ptr, info_ptr)
- *.0254 +.5));
-}
-
-float PNGAPI
-png_get_x_offset_inches(png_structp png_ptr, png_infop info_ptr)
-{
- return ((float)png_get_x_offset_microns(png_ptr, info_ptr)
- *.00003937);
-}
-
-float PNGAPI
-png_get_y_offset_inches(png_structp png_ptr, png_infop info_ptr)
-{
- return ((float)png_get_y_offset_microns(png_ptr, info_ptr)
- *.00003937);
-}
-
-#if defined(PNG_pHYs_SUPPORTED)
-png_uint_32 PNGAPI
-png_get_pHYs_dpi(png_structp png_ptr, png_infop info_ptr,
- png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)
-{
- png_uint_32 retval = 0;
-
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs))
- {
- png_debug1(1, "in %s retrieval function\n", "pHYs");
- if (res_x != NULL)
- {
- *res_x = info_ptr->x_pixels_per_unit;
- retval |= PNG_INFO_pHYs;
- }
- if (res_y != NULL)
- {
- *res_y = info_ptr->y_pixels_per_unit;
- retval |= PNG_INFO_pHYs;
- }
- if (unit_type != NULL)
- {
- *unit_type = (int)info_ptr->phys_unit_type;
- retval |= PNG_INFO_pHYs;
- if(*unit_type == 1)
- {
- if (res_x != NULL) *res_x = (png_uint_32)(*res_x * .0254 + .50);
- if (res_y != NULL) *res_y = (png_uint_32)(*res_y * .0254 + .50);
- }
- }
- }
- return (retval);
-}
-#endif /* PNG_pHYs_SUPPORTED */
-#endif /* PNG_INCH_CONVERSIONS && PNG_FLOATING_POINT_SUPPORTED */
-
-/* png_get_channels really belongs in here, too, but it's been around longer */
-
-#endif /* PNG_EASY_ACCESS_SUPPORTED */
-
-png_byte PNGAPI
-png_get_channels(png_structp png_ptr, png_infop info_ptr)
-{
- if (png_ptr != NULL && info_ptr != NULL)
- return(info_ptr->channels);
- else
- return (0);
-}
-
-png_bytep PNGAPI
-png_get_signature(png_structp png_ptr, png_infop info_ptr)
-{
- if (png_ptr != NULL && info_ptr != NULL)
- return(info_ptr->signature);
- else
- return (NULL);
-}
-
-#if defined(PNG_bKGD_SUPPORTED)
-png_uint_32 PNGAPI
-png_get_bKGD(png_structp png_ptr, png_infop info_ptr,
- png_color_16p *background)
-{
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD)
- && background != NULL)
- {
- png_debug1(1, "in %s retrieval function\n", "bKGD");
- *background = &(info_ptr->background);
- return (PNG_INFO_bKGD);
- }
- return (0);
-}
-#endif
-
-#if defined(PNG_cHRM_SUPPORTED)
-#ifdef PNG_FLOATING_POINT_SUPPORTED
-png_uint_32 PNGAPI
-png_get_cHRM(png_structp png_ptr, png_infop info_ptr,
- double *white_x, double *white_y, double *red_x, double *red_y,
- double *green_x, double *green_y, double *blue_x, double *blue_y)
-{
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM))
- {
- png_debug1(1, "in %s retrieval function\n", "cHRM");
- if (white_x != NULL)
- *white_x = (double)info_ptr->x_white;
- if (white_y != NULL)
- *white_y = (double)info_ptr->y_white;
- if (red_x != NULL)
- *red_x = (double)info_ptr->x_red;
- if (red_y != NULL)
- *red_y = (double)info_ptr->y_red;
- if (green_x != NULL)
- *green_x = (double)info_ptr->x_green;
- if (green_y != NULL)
- *green_y = (double)info_ptr->y_green;
- if (blue_x != NULL)
- *blue_x = (double)info_ptr->x_blue;
- if (blue_y != NULL)
- *blue_y = (double)info_ptr->y_blue;
- return (PNG_INFO_cHRM);
- }
- return (0);
-}
-#endif
-#ifdef PNG_FIXED_POINT_SUPPORTED
-png_uint_32 PNGAPI
-png_get_cHRM_fixed(png_structp png_ptr, png_infop info_ptr,
- png_fixed_point *white_x, png_fixed_point *white_y, png_fixed_point *red_x,
- png_fixed_point *red_y, png_fixed_point *green_x, png_fixed_point *green_y,
- png_fixed_point *blue_x, png_fixed_point *blue_y)
-{
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM))
- {
- png_debug1(1, "in %s retrieval function\n", "cHRM");
- if (white_x != NULL)
- *white_x = info_ptr->int_x_white;
- if (white_y != NULL)
- *white_y = info_ptr->int_y_white;
- if (red_x != NULL)
- *red_x = info_ptr->int_x_red;
- if (red_y != NULL)
- *red_y = info_ptr->int_y_red;
- if (green_x != NULL)
- *green_x = info_ptr->int_x_green;
- if (green_y != NULL)
- *green_y = info_ptr->int_y_green;
- if (blue_x != NULL)
- *blue_x = info_ptr->int_x_blue;
- if (blue_y != NULL)
- *blue_y = info_ptr->int_y_blue;
- return (PNG_INFO_cHRM);
- }
- return (0);
-}
-#endif
-#endif
-
-#if defined(PNG_gAMA_SUPPORTED)
-#ifdef PNG_FLOATING_POINT_SUPPORTED
-png_uint_32 PNGAPI
-png_get_gAMA(png_structp png_ptr, png_infop info_ptr, double *file_gamma)
-{
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA)
- && file_gamma != NULL)
- {
- png_debug1(1, "in %s retrieval function\n", "gAMA");
- *file_gamma = (double)info_ptr->gamma;
- return (PNG_INFO_gAMA);
- }
- return (0);
-}
-#endif
-#ifdef PNG_FIXED_POINT_SUPPORTED
-png_uint_32 PNGAPI
-png_get_gAMA_fixed(png_structp png_ptr, png_infop info_ptr,
- png_fixed_point *int_file_gamma)
-{
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA)
- && int_file_gamma != NULL)
- {
- png_debug1(1, "in %s retrieval function\n", "gAMA");
- *int_file_gamma = info_ptr->int_gamma;
- return (PNG_INFO_gAMA);
- }
- return (0);
-}
-#endif
-#endif
-
-#if defined(PNG_sRGB_SUPPORTED)
-png_uint_32 PNGAPI
-png_get_sRGB(png_structp png_ptr, png_infop info_ptr, int *file_srgb_intent)
-{
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB)
- && file_srgb_intent != NULL)
- {
- png_debug1(1, "in %s retrieval function\n", "sRGB");
- *file_srgb_intent = (int)info_ptr->srgb_intent;
- return (PNG_INFO_sRGB);
- }
- return (0);
-}
-#endif
-
-#if defined(PNG_iCCP_SUPPORTED)
-png_uint_32 PNGAPI
-png_get_iCCP(png_structp png_ptr, png_infop info_ptr,
- png_charpp name, int *compression_type,
- png_charpp profile, png_uint_32 *proflen)
-{
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP)
- && name != NULL && profile != NULL && proflen != NULL)
- {
- png_debug1(1, "in %s retrieval function\n", "iCCP");
- *name = info_ptr->iccp_name;
- *profile = info_ptr->iccp_profile;
- /* compression_type is a dummy so the API won't have to change
- if we introduce multiple compression types later. */
- *proflen = (int)info_ptr->iccp_proflen;
- *compression_type = (int)info_ptr->iccp_compression;
- return (PNG_INFO_iCCP);
- }
- return (0);
-}
-#endif
-
-#if defined(PNG_sPLT_SUPPORTED)
-png_uint_32 PNGAPI
-png_get_sPLT(png_structp png_ptr, png_infop info_ptr,
- png_sPLT_tpp spalettes)
-{
- if (png_ptr != NULL && info_ptr != NULL && spalettes != NULL)
- *spalettes = info_ptr->splt_palettes;
- return ((png_uint_32)info_ptr->splt_palettes_num);
-}
-#endif
-
-#if defined(PNG_hIST_SUPPORTED)
-png_uint_32 PNGAPI
-png_get_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p *hist)
-{
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST)
- && hist != NULL)
- {
- png_debug1(1, "in %s retrieval function\n", "hIST");
- *hist = info_ptr->hist;
- return (PNG_INFO_hIST);
- }
- return (0);
-}
-#endif
-
-png_uint_32 PNGAPI
-png_get_IHDR(png_structp png_ptr, png_infop info_ptr,
- png_uint_32 *width, png_uint_32 *height, int *bit_depth,
- int *color_type, int *interlace_type, int *compression_type,
- int *filter_type)
-
-{
- if (png_ptr != NULL && info_ptr != NULL && width != NULL && height != NULL &&
- bit_depth != NULL && color_type != NULL)
- {
- int pixel_depth, channels;
- png_uint_32 rowbytes_per_pixel;
-
- png_debug1(1, "in %s retrieval function\n", "IHDR");
- *width = info_ptr->width;
- *height = info_ptr->height;
- *bit_depth = info_ptr->bit_depth;
- *color_type = info_ptr->color_type;
- if (compression_type != NULL)
- *compression_type = info_ptr->compression_type;
- if (filter_type != NULL)
- *filter_type = info_ptr->filter_type;
- if (interlace_type != NULL)
- *interlace_type = info_ptr->interlace_type;
-
- /* check for potential overflow of rowbytes */
- if (*color_type == PNG_COLOR_TYPE_PALETTE)
- channels = 1;
- else if (*color_type & PNG_COLOR_MASK_COLOR)
- channels = 3;
- else
- channels = 1;
- if (*color_type & PNG_COLOR_MASK_ALPHA)
- channels++;
- pixel_depth = *bit_depth * channels;
- rowbytes_per_pixel = (pixel_depth + 7) >> 3;
- if ((*width > PNG_MAX_UINT/rowbytes_per_pixel))
- {
- png_warning(png_ptr,
- "Width too large for libpng to process image data.");
- }
- return (1);
- }
- return (0);
-}
-
-#if defined(PNG_oFFs_SUPPORTED)
-png_uint_32 PNGAPI
-png_get_oFFs(png_structp png_ptr, png_infop info_ptr,
- png_int_32 *offset_x, png_int_32 *offset_y, int *unit_type)
-{
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs)
- && offset_x != NULL && offset_y != NULL && unit_type != NULL)
- {
- png_debug1(1, "in %s retrieval function\n", "oFFs");
- *offset_x = info_ptr->x_offset;
- *offset_y = info_ptr->y_offset;
- *unit_type = (int)info_ptr->offset_unit_type;
- return (PNG_INFO_oFFs);
- }
- return (0);
-}
-#endif
-
-#if defined(PNG_pCAL_SUPPORTED)
-png_uint_32 PNGAPI
-png_get_pCAL(png_structp png_ptr, png_infop info_ptr,
- png_charp *purpose, png_int_32 *X0, png_int_32 *X1, int *type, int *nparams,
- png_charp *units, png_charpp *params)
-{
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL)
- && purpose != NULL && X0 != NULL && X1 != NULL && type != NULL &&
- nparams != NULL && units != NULL && params != NULL)
- {
- png_debug1(1, "in %s retrieval function\n", "pCAL");
- *purpose = info_ptr->pcal_purpose;
- *X0 = info_ptr->pcal_X0;
- *X1 = info_ptr->pcal_X1;
- *type = (int)info_ptr->pcal_type;
- *nparams = (int)info_ptr->pcal_nparams;
- *units = info_ptr->pcal_units;
- *params = info_ptr->pcal_params;
- return (PNG_INFO_pCAL);
- }
- return (0);
-}
-#endif
-
-#if defined(PNG_sCAL_SUPPORTED)
-#ifdef PNG_FLOATING_POINT_SUPPORTED
-png_uint_32 PNGAPI
-png_get_sCAL(png_structp png_ptr, png_infop info_ptr,
- int *unit, double *width, double *height)
-{
- if (png_ptr != NULL && info_ptr != NULL &&
- (info_ptr->valid & PNG_INFO_sCAL))
- {
- *unit = info_ptr->scal_unit;
- *width = info_ptr->scal_pixel_width;
- *height = info_ptr->scal_pixel_height;
- return (PNG_INFO_sCAL);
- }
- return(0);
-}
-#else
-#ifdef PNG_FIXED_POINT_SUPPORTED
-png_uint_32 PNGAPI
-png_get_sCAL_s(png_structp png_ptr, png_infop info_ptr,
- int *unit, png_charpp width, png_charpp height)
-{
- if (png_ptr != NULL && info_ptr != NULL &&
- (info_ptr->valid & PNG_INFO_sCAL))
- {
- *unit = info_ptr->scal_unit;
- *width = info_ptr->scal_s_width;
- *height = info_ptr->scal_s_height;
- return (PNG_INFO_sCAL);
- }
- return(0);
-}
-#endif
-#endif
-#endif
-
-#if defined(PNG_pHYs_SUPPORTED)
-png_uint_32 PNGAPI
-png_get_pHYs(png_structp png_ptr, png_infop info_ptr,
- png_uint_32 *res_x, png_uint_32 *res_y, int *unit_type)
-{
- png_uint_32 retval = 0;
-
- if (png_ptr != NULL && info_ptr != NULL &&
- (info_ptr->valid & PNG_INFO_pHYs))
- {
- png_debug1(1, "in %s retrieval function\n", "pHYs");
- if (res_x != NULL)
- {
- *res_x = info_ptr->x_pixels_per_unit;
- retval |= PNG_INFO_pHYs;
- }
- if (res_y != NULL)
- {
- *res_y = info_ptr->y_pixels_per_unit;
- retval |= PNG_INFO_pHYs;
- }
- if (unit_type != NULL)
- {
- *unit_type = (int)info_ptr->phys_unit_type;
- retval |= PNG_INFO_pHYs;
- }
- }
- return (retval);
-}
-#endif
-
-png_uint_32 PNGAPI
-png_get_PLTE(png_structp png_ptr, png_infop info_ptr, png_colorp *palette,
- int *num_palette)
-{
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_PLTE)
- && palette != NULL)
- {
- png_debug1(1, "in %s retrieval function\n", "PLTE");
- *palette = info_ptr->palette;
- *num_palette = info_ptr->num_palette;
- png_debug1(3, "num_palette = %d\n", *num_palette);
- return (PNG_INFO_PLTE);
- }
- return (0);
-}
-
-#if defined(PNG_sBIT_SUPPORTED)
-png_uint_32 PNGAPI
-png_get_sBIT(png_structp png_ptr, png_infop info_ptr, png_color_8p *sig_bit)
-{
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT)
- && sig_bit != NULL)
- {
- png_debug1(1, "in %s retrieval function\n", "sBIT");
- *sig_bit = &(info_ptr->sig_bit);
- return (PNG_INFO_sBIT);
- }
- return (0);
-}
-#endif
-
-#if defined(PNG_TEXT_SUPPORTED)
-png_uint_32 PNGAPI
-png_get_text(png_structp png_ptr, png_infop info_ptr, png_textp *text_ptr,
- int *num_text)
-{
- if (png_ptr != NULL && info_ptr != NULL && info_ptr->num_text > 0)
- {
- png_debug1(1, "in %s retrieval function\n",
- (png_ptr->chunk_name[0] == '\0' ? "text"
- : (png_const_charp)png_ptr->chunk_name));
- if (text_ptr != NULL)
- *text_ptr = info_ptr->text;
- if (num_text != NULL)
- *num_text = info_ptr->num_text;
- return ((png_uint_32)info_ptr->num_text);
- }
- if (num_text != NULL)
- *num_text = 0;
- return(0);
-}
-#endif
-
-#if defined(PNG_tIME_SUPPORTED)
-png_uint_32 PNGAPI
-png_get_tIME(png_structp png_ptr, png_infop info_ptr, png_timep *mod_time)
-{
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME)
- && mod_time != NULL)
- {
- png_debug1(1, "in %s retrieval function\n", "tIME");
- *mod_time = &(info_ptr->mod_time);
- return (PNG_INFO_tIME);
- }
- return (0);
-}
-#endif
-
-#if defined(PNG_tRNS_SUPPORTED)
-png_uint_32 PNGAPI
-png_get_tRNS(png_structp png_ptr, png_infop info_ptr,
- png_bytep *trans, int *num_trans, png_color_16p *trans_values)
-{
- png_uint_32 retval = 0;
- if (png_ptr != NULL && info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS))
- {
- png_debug1(1, "in %s retrieval function\n", "tRNS");
- if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
- {
- if (trans != NULL)
- {
- *trans = info_ptr->trans;
- retval |= PNG_INFO_tRNS;
- }
- if (trans_values != NULL)
- *trans_values = &(info_ptr->trans_values);
- }
- else /* if (info_ptr->color_type != PNG_COLOR_TYPE_PALETTE) */
- {
- if (trans_values != NULL)
- {
- *trans_values = &(info_ptr->trans_values);
- retval |= PNG_INFO_tRNS;
- }
- if(trans != NULL)
- *trans = NULL;
- }
- if(num_trans != NULL)
- {
- *num_trans = info_ptr->num_trans;
- retval |= PNG_INFO_tRNS;
- }
- }
- return (retval);
-}
-#endif
-
-#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
-png_uint_32 PNGAPI
-png_get_unknown_chunks(png_structp png_ptr, png_infop info_ptr,
- png_unknown_chunkpp unknowns)
-{
- if (png_ptr != NULL && info_ptr != NULL && unknowns != NULL)
- *unknowns = info_ptr->unknown_chunks;
- return ((png_uint_32)info_ptr->unknown_chunks_num);
-}
-#endif
-
-#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
-png_byte PNGAPI
-png_get_rgb_to_gray_status (png_structp png_ptr)
-{
- return (png_byte)(png_ptr? png_ptr->rgb_to_gray_status : 0);
-}
-#endif
-
-#if defined(PNG_USER_CHUNKS_SUPPORTED)
-png_voidp PNGAPI
-png_get_user_chunk_ptr(png_structp png_ptr)
-{
- return (png_ptr? png_ptr->user_chunk_ptr : NULL);
-}
-#endif
-
-
-png_uint_32 PNGAPI
-png_get_compression_buffer_size(png_structp png_ptr)
-{
- return (png_uint_32)(png_ptr? png_ptr->zbuf_size : 0L);
-}
-
-
-#ifdef PNG_ASSEMBLER_CODE_SUPPORTED
-/* this function was added to libpng 1.2.0 and should exist by default*/
-png_uint_32 PNGAPI
-png_get_asm_flags (png_structp png_ptr)
-{
- return (png_uint_32)(png_ptr? png_ptr->asm_flags : 0L);
-}
-
-/* this function was added to libpng 1.2.0 and should exist by default */
-png_uint_32 PNGAPI
-png_get_asm_flagmask (int flag_select)
-{
- png_uint_32 settable_asm_flags = 0;
-
- if (flag_select & PNG_SELECT_READ)
- settable_asm_flags |=
- PNG_ASM_FLAG_MMX_READ_COMBINE_ROW |
- PNG_ASM_FLAG_MMX_READ_INTERLACE |
- PNG_ASM_FLAG_MMX_READ_FILTER_SUB |
- PNG_ASM_FLAG_MMX_READ_FILTER_UP |
- PNG_ASM_FLAG_MMX_READ_FILTER_AVG |
- PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ;
- /* no non-MMX flags yet */
-
-#if 0
- /* GRR: no write-flags yet, either, but someday... */
- if (flag_select & PNG_SELECT_WRITE)
- settable_asm_flags |=
- PNG_ASM_FLAG_MMX_WRITE_ [whatever] ;
-#endif /* 0 */
-
- return settable_asm_flags; /* _theoretically_ settable capabilities only */
-}
-#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */
-
-
-#if defined(PNG_ASSEMBLER_CODE_SUPPORTED)
- /* GRR: could add this: && defined(PNG_MMX_CODE_SUPPORTED) */
-/* this function was added to libpng 1.2.0 */
-png_uint_32 PNGAPI
-png_get_mmx_flagmask (int flag_select, int *compilerID)
-{
- png_uint_32 settable_mmx_flags = 0;
-
- if (flag_select & PNG_SELECT_READ)
- settable_mmx_flags |=
- PNG_ASM_FLAG_MMX_READ_COMBINE_ROW |
- PNG_ASM_FLAG_MMX_READ_INTERLACE |
- PNG_ASM_FLAG_MMX_READ_FILTER_SUB |
- PNG_ASM_FLAG_MMX_READ_FILTER_UP |
- PNG_ASM_FLAG_MMX_READ_FILTER_AVG |
- PNG_ASM_FLAG_MMX_READ_FILTER_PAETH ;
-#if 0
- /* GRR: no MMX write support yet, but someday... */
- if (flag_select & PNG_SELECT_WRITE)
- settable_mmx_flags |=
- PNG_ASM_FLAG_MMX_WRITE_ [whatever] ;
-#endif /* 0 */
-
- if (compilerID != NULL) {
-#ifdef PNG_USE_PNGVCRD
- *compilerID = 1; /* MSVC */
-#else
-#ifdef PNG_USE_PNGGCCRD
- *compilerID = 2; /* gcc/gas */
-#else
- *compilerID = -1; /* unknown (i.e., no asm/MMX code compiled) */
-#endif
-#endif
- }
-
- return settable_mmx_flags; /* _theoretically_ settable capabilities only */
-}
-
-/* this function was added to libpng 1.2.0 */
-png_byte PNGAPI
-png_get_mmx_bitdepth_threshold (png_structp png_ptr)
-{
- return (png_byte)(png_ptr? png_ptr->mmx_bitdepth_threshold : 0);
-}
-
-/* this function was added to libpng 1.2.0 */
-png_uint_32 PNGAPI
-png_get_mmx_rowbytes_threshold (png_structp png_ptr)
-{
- return (png_uint_32)(png_ptr? png_ptr->mmx_rowbytes_threshold : 0L);
-}
-#endif /* PNG_ASSEMBLER_CODE_SUPPORTED */
diff --git a/libpng/pngmem.c b/libpng/pngmem.c
deleted file mode 100644
index b1741a4..0000000
--- a/libpng/pngmem.c
+++ /dev/null
@@ -1,517 +0,0 @@
-
-/* pngmem.c - stub functions for memory allocation
- *
- * libpng 1.2.1 - December 12, 2001
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2001 Glenn Randers-Pehrson
- * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
- * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
- *
- * This file provides a location for all memory allocation. Users who
- * need special memory handling are expected to supply replacement
- * functions for png_malloc() and png_free(), and to use
- * png_create_read_struct_2() and png_create_write_struct_2() to
- * identify the replacement functions.
- */
-
-#define PNG_INTERNAL
-#include "png.h"
-
-/* Borland DOS special memory handler */
-#if defined(__TURBOC__) && !defined(_Windows) && !defined(__FLAT__)
-/* if you change this, be sure to change the one in png.h also */
-
-/* Allocate memory for a png_struct. The malloc and memset can be replaced
- by a single call to calloc() if this is thought to improve performance. */
-png_voidp /* PRIVATE */
-png_create_struct(int type)
-{
-#ifdef PNG_USER_MEM_SUPPORTED
- return (png_create_struct_2(type, png_malloc_ptr_NULL, png_voidp_NULL));
-}
-
-/* Alternate version of png_create_struct, for use with user-defined malloc. */
-png_voidp /* PRIVATE */
-png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr)
-{
-#endif /* PNG_USER_MEM_SUPPORTED */
- png_size_t size;
- png_voidp struct_ptr;
-
- if (type == PNG_STRUCT_INFO)
- size = sizeof(png_info);
- else if (type == PNG_STRUCT_PNG)
- size = sizeof(png_struct);
- else
- return (NULL);
-
-#ifdef PNG_USER_MEM_SUPPORTED
- if(malloc_fn != NULL)
- {
- png_struct dummy_struct;
- png_structp png_ptr = &dummy_struct;
- png_ptr->mem_ptr=mem_ptr;
- struct_ptr = (*(malloc_fn))(png_ptr, (png_uint_32)size);
- }
- else
-#endif /* PNG_USER_MEM_SUPPORTED */
- struct_ptr = (png_voidp)farmalloc(size));
- if (struct_ptr != NULL)
- png_memset(struct_ptr, 0, size);
- return (struct_ptr);
-}
-
-/* Free memory allocated by a png_create_struct() call */
-void /* PRIVATE */
-png_destroy_struct(png_voidp struct_ptr)
-{
-#ifdef PNG_USER_MEM_SUPPORTED
- png_destroy_struct_2(struct_ptr, png_free_ptr_NULL, png_voidp_NULL);
-}
-
-/* Free memory allocated by a png_create_struct() call */
-void /* PRIVATE */
-png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn,
- png_voidp mem_ptr)
-{
-#endif
- if (struct_ptr != NULL)
- {
-#ifdef PNG_USER_MEM_SUPPORTED
- if(free_fn != NULL)
- {
- png_struct dummy_struct;
- png_structp png_ptr = &dummy_struct;
- png_ptr->mem_ptr=mem_ptr;
- (*(free_fn))(png_ptr, struct_ptr);
- return;
- }
-#endif /* PNG_USER_MEM_SUPPORTED */
- farfree (struct_ptr);
- }
-}
-
-/* Allocate memory. For reasonable files, size should never exceed
- * 64K. However, zlib may allocate more then 64K if you don't tell
- * it not to. See zconf.h and png.h for more information. zlib does
- * need to allocate exactly 64K, so whatever you call here must
- * have the ability to do that.
- *
- * Borland seems to have a problem in DOS mode for exactly 64K.
- * It gives you a segment with an offset of 8 (perhaps to store its
- * memory stuff). zlib doesn't like this at all, so we have to
- * detect and deal with it. This code should not be needed in
- * Windows or OS/2 modes, and only in 16 bit mode. This code has
- * been updated by Alexander Lehmann for version 0.89 to waste less
- * memory.
- *
- * Note that we can't use png_size_t for the "size" declaration,
- * since on some systems a png_size_t is a 16-bit quantity, and as a
- * result, we would be truncating potentially larger memory requests
- * (which should cause a fatal error) and introducing major problems.
- */
-png_voidp PNGAPI
-png_malloc(png_structp png_ptr, png_uint_32 size)
-{
-#ifndef PNG_USER_MEM_SUPPORTED
- png_voidp ret;
-#endif
- if (png_ptr == NULL || size == 0)
- return (NULL);
-
-#ifdef PNG_USER_MEM_SUPPORTED
- if(png_ptr->malloc_fn != NULL)
- {
- ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, (png_size_t)size));
- if (ret == NULL)
- png_error(png_ptr, "Out of memory!");
- return (ret);
- }
- else
- return png_malloc_default(png_ptr, size);
-}
-
-png_voidp PNGAPI
-png_malloc_default(png_structp png_ptr, png_uint_32 size)
-{
- png_voidp ret;
-#endif /* PNG_USER_MEM_SUPPORTED */
-
-#ifdef PNG_MAX_MALLOC_64K
- if (size > (png_uint_32)65536L)
- png_error(png_ptr, "Cannot Allocate > 64K");
-#endif
-
- if (size == (png_uint_32)65536L)
- {
- if (png_ptr->offset_table == NULL)
- {
- /* try to see if we need to do any of this fancy stuff */
- ret = farmalloc(size);
- if (ret == NULL || ((png_size_t)ret & 0xffff))
- {
- int num_blocks;
- png_uint_32 total_size;
- png_bytep table;
- int i;
- png_byte huge * hptr;
-
- if (ret != NULL)
- {
- farfree(ret);
- ret = NULL;
- }
-
- if(png_ptr->zlib_window_bits > 14)
- num_blocks = (int)(1 << (png_ptr->zlib_window_bits - 14));
- else
- num_blocks = 1;
- if (png_ptr->zlib_mem_level >= 7)
- num_blocks += (int)(1 << (png_ptr->zlib_mem_level - 7));
- else
- num_blocks++;
-
- total_size = ((png_uint_32)65536L) * (png_uint_32)num_blocks+16;
-
- table = farmalloc(total_size);
-
- if (table == NULL)
- {
- png_error(png_ptr, "Out Of Memory."); /* Note "O" and "M" */
- }
-
- if ((png_size_t)table & 0xfff0)
- {
- png_error(png_ptr, "Farmalloc didn't return normalized pointer");
- }
-
- png_ptr->offset_table = table;
- png_ptr->offset_table_ptr = farmalloc(num_blocks *
- sizeof (png_bytep));
-
- if (png_ptr->offset_table_ptr == NULL)
- {
- png_error(png_ptr, "Out Of memory.");
- }
-
- hptr = (png_byte huge *)table;
- if ((png_size_t)hptr & 0xf)
- {
- hptr = (png_byte huge *)((long)(hptr) & 0xfffffff0L);
- hptr = hptr + 16L; /* "hptr += 16L" fails on Turbo C++ 3.0 */
- }
- for (i = 0; i < num_blocks; i++)
- {
- png_ptr->offset_table_ptr[i] = (png_bytep)hptr;
- hptr = hptr + (png_uint_32)65536L; /* "+=" fails on TC++3.0 */
- }
-
- png_ptr->offset_table_number = num_blocks;
- png_ptr->offset_table_count = 0;
- png_ptr->offset_table_count_free = 0;
- }
- }
-
- if (png_ptr->offset_table_count >= png_ptr->offset_table_number)
- png_error(png_ptr, "Out of Memory.");
-
- ret = png_ptr->offset_table_ptr[png_ptr->offset_table_count++];
- }
- else
- ret = farmalloc(size);
-
- if (ret == NULL)
- {
- png_error(png_ptr, "Out of memory."); /* Note "o" and "m" */
- }
-
- return (ret);
-}
-
-/* free a pointer allocated by png_malloc(). In the default
- configuration, png_ptr is not used, but is passed in case it
- is needed. If ptr is NULL, return without taking any action. */
-void PNGAPI
-png_free(png_structp png_ptr, png_voidp ptr)
-{
- if (png_ptr == NULL || ptr == NULL)
- return;
-
-#ifdef PNG_USER_MEM_SUPPORTED
- if (png_ptr->free_fn != NULL)
- {
- (*(png_ptr->free_fn))(png_ptr, ptr);
- return;
- }
- else png_free_default(png_ptr, ptr);
-}
-
-void PNGAPI
-png_free_default(png_structp png_ptr, png_voidp ptr)
-{
-#endif /* PNG_USER_MEM_SUPPORTED */
-
- if (png_ptr->offset_table != NULL)
- {
- int i;
-
- for (i = 0; i < png_ptr->offset_table_count; i++)
- {
- if (ptr == png_ptr->offset_table_ptr[i])
- {
- ptr = NULL;
- png_ptr->offset_table_count_free++;
- break;
- }
- }
- if (png_ptr->offset_table_count_free == png_ptr->offset_table_count)
- {
- farfree(png_ptr->offset_table);
- farfree(png_ptr->offset_table_ptr);
- png_ptr->offset_table = NULL;
- png_ptr->offset_table_ptr = NULL;
- }
- }
-
- if (ptr != NULL)
- {
- farfree(ptr);
- }
-}
-
-#else /* Not the Borland DOS special memory handler */
-
-/* Allocate memory for a png_struct or a png_info. The malloc and
- memset can be replaced by a single call to calloc() if this is thought
- to improve performance noticably.*/
-png_voidp /* PRIVATE */
-png_create_struct(int type)
-{
-#ifdef PNG_USER_MEM_SUPPORTED
- return (png_create_struct_2(type, png_malloc_ptr_NULL, png_voidp_NULL));
-}
-
-/* Allocate memory for a png_struct or a png_info. The malloc and
- memset can be replaced by a single call to calloc() if this is thought
- to improve performance noticably.*/
-png_voidp /* PRIVATE */
-png_create_struct_2(int type, png_malloc_ptr malloc_fn, png_voidp mem_ptr)
-{
-#endif /* PNG_USER_MEM_SUPPORTED */
- png_size_t size;
- png_voidp struct_ptr;
-
- if (type == PNG_STRUCT_INFO)
- size = sizeof(png_info);
- else if (type == PNG_STRUCT_PNG)
- size = sizeof(png_struct);
- else
- return (NULL);
-
-#ifdef PNG_USER_MEM_SUPPORTED
- if(malloc_fn != NULL)
- {
- png_struct dummy_struct;
- png_structp png_ptr = &dummy_struct;
- png_ptr->mem_ptr=mem_ptr;
- struct_ptr = (*(malloc_fn))(png_ptr, size);
- if (struct_ptr != NULL)
- png_memset(struct_ptr, 0, size);
- return (struct_ptr);
- }
-#endif /* PNG_USER_MEM_SUPPORTED */
-
-#if defined(__TURBOC__) && !defined(__FLAT__)
- if ((struct_ptr = (png_voidp)farmalloc(size)) != NULL)
-#else
-# if defined(_MSC_VER) && defined(MAXSEG_64K)
- if ((struct_ptr = (png_voidp)halloc(size,1)) != NULL)
-# else
- if ((struct_ptr = (png_voidp)malloc(size)) != NULL)
-# endif
-#endif
- {
- png_memset(struct_ptr, 0, size);
- }
-
- return (struct_ptr);
-}
-
-
-/* Free memory allocated by a png_create_struct() call */
-void /* PRIVATE */
-png_destroy_struct(png_voidp struct_ptr)
-{
-#ifdef PNG_USER_MEM_SUPPORTED
- png_destroy_struct_2(struct_ptr, png_free_ptr_NULL, png_voidp_NULL);
-}
-
-/* Free memory allocated by a png_create_struct() call */
-void /* PRIVATE */
-png_destroy_struct_2(png_voidp struct_ptr, png_free_ptr free_fn,
- png_voidp mem_ptr)
-{
-#endif /* PNG_USER_MEM_SUPPORTED */
- if (struct_ptr != NULL)
- {
-#ifdef PNG_USER_MEM_SUPPORTED
- if(free_fn != NULL)
- {
- png_struct dummy_struct;
- png_structp png_ptr = &dummy_struct;
- png_ptr->mem_ptr=mem_ptr;
- (*(free_fn))(png_ptr, struct_ptr);
- return;
- }
-#endif /* PNG_USER_MEM_SUPPORTED */
-#if defined(__TURBOC__) && !defined(__FLAT__)
- farfree(struct_ptr);
-#else
-# if defined(_MSC_VER) && defined(MAXSEG_64K)
- hfree(struct_ptr);
-# else
- free(struct_ptr);
-# endif
-#endif
- }
-}
-
-
-/* Allocate memory. For reasonable files, size should never exceed
- 64K. However, zlib may allocate more then 64K if you don't tell
- it not to. See zconf.h and png.h for more information. zlib does
- need to allocate exactly 64K, so whatever you call here must
- have the ability to do that. */
-
-png_voidp PNGAPI
-png_malloc(png_structp png_ptr, png_uint_32 size)
-{
- png_voidp ret;
- if (png_ptr == NULL || size == 0)
- return (NULL);
-
-#ifdef PNG_USER_MEM_SUPPORTED
- if(png_ptr->malloc_fn != NULL)
- {
- ret = ((png_voidp)(*(png_ptr->malloc_fn))(png_ptr, size));
- if (ret == NULL)
- png_error(png_ptr, "Out of Memory!");
- return (ret);
- }
- else
- return (png_malloc_default(png_ptr, size));
-}
-png_voidp /* PRIVATE */
-png_malloc_default(png_structp png_ptr, png_uint_32 size)
-{
- png_voidp ret;
-#endif /* PNG_USER_MEM_SUPPORTED */
-
-#ifdef PNG_MAX_MALLOC_64K
- if (size > (png_uint_32)65536L)
- png_error(png_ptr, "Cannot Allocate > 64K");
-#endif
-
-#if defined(__TURBOC__) && !defined(__FLAT__)
- ret = farmalloc(size);
-#else
-# if defined(_MSC_VER) && defined(MAXSEG_64K)
- ret = halloc(size, 1);
-# else
- ret = malloc((size_t)size);
-# endif
-#endif
-
- if (ret == NULL)
- png_error(png_ptr, "Out of Memory");
-
- return (ret);
-}
-
-/* Free a pointer allocated by png_malloc(). If ptr is NULL, return
- without taking any action. */
-void PNGAPI
-png_free(png_structp png_ptr, png_voidp ptr)
-{
- if (png_ptr == NULL || ptr == NULL)
- return;
-
-#ifdef PNG_USER_MEM_SUPPORTED
- if (png_ptr->free_fn != NULL)
- {
- (*(png_ptr->free_fn))(png_ptr, ptr);
- return;
- }
- else png_free_default(png_ptr, ptr);
-}
-void /* PRIVATE */
-png_free_default(png_structp png_ptr, png_voidp ptr)
-{
- if (png_ptr == NULL || ptr == NULL)
- return;
-
-#endif /* PNG_USER_MEM_SUPPORTED */
-
-#if defined(__TURBOC__) && !defined(__FLAT__)
- farfree(ptr);
-#else
-# if defined(_MSC_VER) && defined(MAXSEG_64K)
- hfree(ptr);
-# else
- free(ptr);
-# endif
-#endif
-}
-
-#endif /* Not Borland DOS special memory handler */
-
-png_voidp /* PRIVATE */
-png_memcpy_check (png_structp png_ptr, png_voidp s1, png_voidp s2,
- png_uint_32 length)
-{
- png_size_t size;
-
- size = (png_size_t)length;
- if ((png_uint_32)size != length)
- png_error(png_ptr,"Overflow in png_memcpy_check.");
-
- return(png_memcpy (s1, s2, size));
-}
-
-png_voidp /* PRIVATE */
-png_memset_check (png_structp png_ptr, png_voidp s1, int value,
- png_uint_32 length)
-{
- png_size_t size;
-
- size = (png_size_t)length;
- if ((png_uint_32)size != length)
- png_error(png_ptr,"Overflow in png_memset_check.");
-
- return (png_memset (s1, value, size));
-
-}
-
-#ifdef PNG_USER_MEM_SUPPORTED
-/* This function is called when the application wants to use another method
- * of allocating and freeing memory.
- */
-void PNGAPI
-png_set_mem_fn(png_structp png_ptr, png_voidp mem_ptr, png_malloc_ptr
- malloc_fn, png_free_ptr free_fn)
-{
- png_ptr->mem_ptr = mem_ptr;
- png_ptr->malloc_fn = malloc_fn;
- png_ptr->free_fn = free_fn;
-}
-
-/* This function returns a pointer to the mem_ptr associated with the user
- * functions. The application should free any memory associated with this
- * pointer before png_write_destroy and png_read_destroy are called.
- */
-png_voidp PNGAPI
-png_get_mem_ptr(png_structp png_ptr)
-{
- return ((png_voidp)png_ptr->mem_ptr);
-}
-#endif /* PNG_USER_MEM_SUPPORTED */
diff --git a/libpng/pngpread.c b/libpng/pngpread.c
deleted file mode 100644
index 9207cbd..0000000
--- a/libpng/pngpread.c
+++ /dev/null
@@ -1,1502 +0,0 @@
-
-/* pngpread.c - read a png file in push mode
- *
- * libpng 1.2.1 - December 12, 2001
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2001 Glenn Randers-Pehrson
- * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
- * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
- */
-
-#define PNG_INTERNAL
-#include "png.h"
-
-#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
-
-/* push model modes */
-#define PNG_READ_SIG_MODE 0
-#define PNG_READ_CHUNK_MODE 1
-#define PNG_READ_IDAT_MODE 2
-#define PNG_SKIP_MODE 3
-#define PNG_READ_tEXt_MODE 4
-#define PNG_READ_zTXt_MODE 5
-#define PNG_READ_DONE_MODE 6
-#define PNG_READ_iTXt_MODE 7
-#define PNG_ERROR_MODE 8
-
-void PNGAPI
-png_process_data(png_structp png_ptr, png_infop info_ptr,
- png_bytep buffer, png_size_t buffer_size)
-{
- png_push_restore_buffer(png_ptr, buffer, buffer_size);
-
- while (png_ptr->buffer_size)
- {
- png_process_some_data(png_ptr, info_ptr);
- }
-}
-
-/* What we do with the incoming data depends on what we were previously
- * doing before we ran out of data...
- */
-void /* PRIVATE */
-png_process_some_data(png_structp png_ptr, png_infop info_ptr)
-{
- switch (png_ptr->process_mode)
- {
- case PNG_READ_SIG_MODE:
- {
- png_push_read_sig(png_ptr, info_ptr);
- break;
- }
- case PNG_READ_CHUNK_MODE:
- {
- png_push_read_chunk(png_ptr, info_ptr);
- break;
- }
- case PNG_READ_IDAT_MODE:
- {
- png_push_read_IDAT(png_ptr);
- break;
- }
-#if defined(PNG_READ_tEXt_SUPPORTED)
- case PNG_READ_tEXt_MODE:
- {
- png_push_read_tEXt(png_ptr, info_ptr);
- break;
- }
-#endif
-#if defined(PNG_READ_zTXt_SUPPORTED)
- case PNG_READ_zTXt_MODE:
- {
- png_push_read_zTXt(png_ptr, info_ptr);
- break;
- }
-#endif
-#if defined(PNG_READ_iTXt_SUPPORTED)
- case PNG_READ_iTXt_MODE:
- {
- png_push_read_iTXt(png_ptr, info_ptr);
- break;
- }
-#endif
- case PNG_SKIP_MODE:
- {
- png_push_crc_finish(png_ptr);
- break;
- }
- default:
- {
- png_ptr->buffer_size = 0;
- break;
- }
- }
-}
-
-/* Read any remaining signature bytes from the stream and compare them with
- * the correct PNG signature. It is possible that this routine is called
- * with bytes already read from the signature, either because they have been
- * checked by the calling application, or because of multiple calls to this
- * routine.
- */
-void /* PRIVATE */
-png_push_read_sig(png_structp png_ptr, png_infop info_ptr)
-{
- png_size_t num_checked = png_ptr->sig_bytes,
- num_to_check = 8 - num_checked;
-
- if (png_ptr->buffer_size < num_to_check)
- {
- num_to_check = png_ptr->buffer_size;
- }
-
- png_push_fill_buffer(png_ptr, &(info_ptr->signature[num_checked]),
- num_to_check);
- png_ptr->sig_bytes = (png_byte)(png_ptr->sig_bytes+num_to_check);
-
- if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check))
- {
- if (num_checked < 4 &&
- png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4))
- png_error(png_ptr, "Not a PNG file");
- else
- png_error(png_ptr, "PNG file corrupted by ASCII conversion");
- }
- else
- {
- if (png_ptr->sig_bytes >= 8)
- {
- png_ptr->process_mode = PNG_READ_CHUNK_MODE;
- }
- }
-}
-
-void /* PRIVATE */
-png_push_read_chunk(png_structp png_ptr, png_infop info_ptr)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_IHDR;
- PNG_IDAT;
- PNG_IEND;
- PNG_PLTE;
-#if defined(PNG_READ_bKGD_SUPPORTED)
- PNG_bKGD;
-#endif
-#if defined(PNG_READ_cHRM_SUPPORTED)
- PNG_cHRM;
-#endif
-#if defined(PNG_READ_gAMA_SUPPORTED)
- PNG_gAMA;
-#endif
-#if defined(PNG_READ_hIST_SUPPORTED)
- PNG_hIST;
-#endif
-#if defined(PNG_READ_iCCP_SUPPORTED)
- PNG_iCCP;
-#endif
-#if defined(PNG_READ_iTXt_SUPPORTED)
- PNG_iTXt;
-#endif
-#if defined(PNG_READ_oFFs_SUPPORTED)
- PNG_oFFs;
-#endif
-#if defined(PNG_READ_pCAL_SUPPORTED)
- PNG_pCAL;
-#endif
-#if defined(PNG_READ_pHYs_SUPPORTED)
- PNG_pHYs;
-#endif
-#if defined(PNG_READ_sBIT_SUPPORTED)
- PNG_sBIT;
-#endif
-#if defined(PNG_READ_sCAL_SUPPORTED)
- PNG_sCAL;
-#endif
-#if defined(PNG_READ_sRGB_SUPPORTED)
- PNG_sRGB;
-#endif
-#if defined(PNG_READ_sPLT_SUPPORTED)
- PNG_sPLT;
-#endif
-#if defined(PNG_READ_tEXt_SUPPORTED)
- PNG_tEXt;
-#endif
-#if defined(PNG_READ_tIME_SUPPORTED)
- PNG_tIME;
-#endif
-#if defined(PNG_READ_tRNS_SUPPORTED)
- PNG_tRNS;
-#endif
-#if defined(PNG_READ_zTXt_SUPPORTED)
- PNG_zTXt;
-#endif
-#endif /* PNG_USE_LOCAL_ARRAYS */
- /* First we make sure we have enough data for the 4 byte chunk name
- * and the 4 byte chunk length before proceeding with decoding the
- * chunk data. To fully decode each of these chunks, we also make
- * sure we have enough data in the buffer for the 4 byte CRC at the
- * end of every chunk (except IDAT, which is handled separately).
- */
- if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER))
- {
- png_byte chunk_length[4];
-
- if (png_ptr->buffer_size < 8)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
- png_push_fill_buffer(png_ptr, chunk_length, 4);
- png_ptr->push_length = png_get_uint_32(chunk_length);
- png_reset_crc(png_ptr);
- png_crc_read(png_ptr, png_ptr->chunk_name, 4);
- png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
- }
-
- if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4))
- {
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
- png_handle_IHDR(png_ptr, info_ptr, png_ptr->push_length);
- }
- else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
- {
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
- png_handle_PLTE(png_ptr, info_ptr, png_ptr->push_length);
- }
- else if (!png_memcmp(png_ptr->chunk_name, (png_bytep)png_IDAT, 4))
- {
- /* If we reach an IDAT chunk, this means we have read all of the
- * header chunks, and we can start reading the image (or if this
- * is called after the image has been read - we have an error).
- */
- if (png_ptr->mode & PNG_HAVE_IDAT)
- {
- if (png_ptr->push_length == 0)
- return;
-
- if (png_ptr->mode & PNG_AFTER_IDAT)
- png_error(png_ptr, "Too many IDAT's found");
- }
-
- png_ptr->idat_size = png_ptr->push_length;
- png_ptr->mode |= PNG_HAVE_IDAT;
- png_ptr->process_mode = PNG_READ_IDAT_MODE;
- png_push_have_info(png_ptr, info_ptr);
- png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes;
- png_ptr->zstream.next_out = png_ptr->row_buf;
- return;
- }
- else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4))
- {
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
- png_handle_IEND(png_ptr, info_ptr, png_ptr->push_length);
- png_ptr->process_mode = PNG_READ_DONE_MODE;
- png_push_have_end(png_ptr, info_ptr);
- }
-#if defined(PNG_READ_gAMA_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4))
- {
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
- png_handle_gAMA(png_ptr, info_ptr, png_ptr->push_length);
- }
-#endif
-#if defined(PNG_READ_sBIT_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4))
- {
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
- png_handle_sBIT(png_ptr, info_ptr, png_ptr->push_length);
- }
-#endif
-#if defined(PNG_READ_cHRM_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4))
- {
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
- png_handle_cHRM(png_ptr, info_ptr, png_ptr->push_length);
- }
-#endif
-#if defined(PNG_READ_sRGB_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4))
- {
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
- png_handle_sRGB(png_ptr, info_ptr, png_ptr->push_length);
- }
-#endif
-#if defined(PNG_READ_iCCP_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4))
- {
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
- png_handle_iCCP(png_ptr, info_ptr, png_ptr->push_length);
- }
-#endif
-#if defined(PNG_READ_sPLT_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4))
- {
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
- png_handle_sPLT(png_ptr, info_ptr, png_ptr->push_length);
- }
-#endif
-#if defined(PNG_READ_tRNS_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4))
- {
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
- png_handle_tRNS(png_ptr, info_ptr, png_ptr->push_length);
- }
-#endif
-#if defined(PNG_READ_bKGD_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4))
- {
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
- png_handle_bKGD(png_ptr, info_ptr, png_ptr->push_length);
- }
-#endif
-#if defined(PNG_READ_hIST_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4))
- {
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
- png_handle_hIST(png_ptr, info_ptr, png_ptr->push_length);
- }
-#endif
-#if defined(PNG_READ_pHYs_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4))
- {
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
- png_handle_pHYs(png_ptr, info_ptr, png_ptr->push_length);
- }
-#endif
-#if defined(PNG_READ_oFFs_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4))
- {
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
- png_handle_oFFs(png_ptr, info_ptr, png_ptr->push_length);
- }
-#endif
-#if defined(PNG_READ_pCAL_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4))
- {
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
- png_handle_pCAL(png_ptr, info_ptr, png_ptr->push_length);
- }
-#endif
-#if defined(PNG_READ_sCAL_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4))
- {
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
- png_handle_sCAL(png_ptr, info_ptr, png_ptr->push_length);
- }
-#endif
-#if defined(PNG_READ_tIME_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4))
- {
- if (png_ptr->push_length + 4 > png_ptr->buffer_size)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
- png_handle_tIME(png_ptr, info_ptr, png_ptr->push_length);
- }
-#endif
-#if defined(PNG_READ_tEXt_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4))
- {
- png_push_handle_tEXt(png_ptr, info_ptr, png_ptr->push_length);
- }
-#endif
-#if defined(PNG_READ_zTXt_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4))
- {
- png_push_handle_zTXt(png_ptr, info_ptr, png_ptr->push_length);
- }
-#endif
-#if defined(PNG_READ_iTXt_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4))
- {
- png_push_handle_iTXt(png_ptr, info_ptr, png_ptr->push_length);
- }
-#endif
- else
- {
- png_push_handle_unknown(png_ptr, info_ptr, png_ptr->push_length);
- }
-
- png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
-}
-
-void /* PRIVATE */
-png_push_crc_skip(png_structp png_ptr, png_uint_32 skip)
-{
- png_ptr->process_mode = PNG_SKIP_MODE;
- png_ptr->skip_length = skip;
-}
-
-void /* PRIVATE */
-png_push_crc_finish(png_structp png_ptr)
-{
- if (png_ptr->skip_length && png_ptr->save_buffer_size)
- {
- png_size_t save_size;
-
- if (png_ptr->skip_length < (png_uint_32)png_ptr->save_buffer_size)
- save_size = (png_size_t)png_ptr->skip_length;
- else
- save_size = png_ptr->save_buffer_size;
-
- png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size);
-
- png_ptr->skip_length -= save_size;
- png_ptr->buffer_size -= save_size;
- png_ptr->save_buffer_size -= save_size;
- png_ptr->save_buffer_ptr += save_size;
- }
- if (png_ptr->skip_length && png_ptr->current_buffer_size)
- {
- png_size_t save_size;
-
- if (png_ptr->skip_length < (png_uint_32)png_ptr->current_buffer_size)
- save_size = (png_size_t)png_ptr->skip_length;
- else
- save_size = png_ptr->current_buffer_size;
-
- png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size);
-
- png_ptr->skip_length -= save_size;
- png_ptr->buffer_size -= save_size;
- png_ptr->current_buffer_size -= save_size;
- png_ptr->current_buffer_ptr += save_size;
- }
- if (!png_ptr->skip_length)
- {
- if (png_ptr->buffer_size < 4)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
- png_crc_finish(png_ptr, 0);
- png_ptr->process_mode = PNG_READ_CHUNK_MODE;
- }
-}
-
-void /* PRIVATE */
-png_push_fill_buffer(png_structp png_ptr, png_bytep buffer, png_size_t length)
-{
- png_bytep ptr;
-
- ptr = buffer;
- if (png_ptr->save_buffer_size)
- {
- png_size_t save_size;
-
- if (length < png_ptr->save_buffer_size)
- save_size = length;
- else
- save_size = png_ptr->save_buffer_size;
-
- png_memcpy(ptr, png_ptr->save_buffer_ptr, save_size);
- length -= save_size;
- ptr += save_size;
- png_ptr->buffer_size -= save_size;
- png_ptr->save_buffer_size -= save_size;
- png_ptr->save_buffer_ptr += save_size;
- }
- if (length && png_ptr->current_buffer_size)
- {
- png_size_t save_size;
-
- if (length < png_ptr->current_buffer_size)
- save_size = length;
- else
- save_size = png_ptr->current_buffer_size;
-
- png_memcpy(ptr, png_ptr->current_buffer_ptr, save_size);
- png_ptr->buffer_size -= save_size;
- png_ptr->current_buffer_size -= save_size;
- png_ptr->current_buffer_ptr += save_size;
- }
-}
-
-void /* PRIVATE */
-png_push_save_buffer(png_structp png_ptr)
-{
- if (png_ptr->save_buffer_size)
- {
- if (png_ptr->save_buffer_ptr != png_ptr->save_buffer)
- {
- png_size_t i,istop;
- png_bytep sp;
- png_bytep dp;
-
- istop = png_ptr->save_buffer_size;
- for (i = 0, sp = png_ptr->save_buffer_ptr, dp = png_ptr->save_buffer;
- i < istop; i++, sp++, dp++)
- {
- *dp = *sp;
- }
- }
- }
- if (png_ptr->save_buffer_size + png_ptr->current_buffer_size >
- png_ptr->save_buffer_max)
- {
- png_size_t new_max;
- png_bytep old_buffer;
-
- new_max = png_ptr->save_buffer_size + png_ptr->current_buffer_size + 256;
- old_buffer = png_ptr->save_buffer;
- png_ptr->save_buffer = (png_bytep)png_malloc(png_ptr,
- (png_uint_32)new_max);
- png_memcpy(png_ptr->save_buffer, old_buffer, png_ptr->save_buffer_size);
- png_free(png_ptr, old_buffer);
- png_ptr->save_buffer_max = new_max;
- }
- if (png_ptr->current_buffer_size)
- {
- png_memcpy(png_ptr->save_buffer + png_ptr->save_buffer_size,
- png_ptr->current_buffer_ptr, png_ptr->current_buffer_size);
- png_ptr->save_buffer_size += png_ptr->current_buffer_size;
- png_ptr->current_buffer_size = 0;
- }
- png_ptr->save_buffer_ptr = png_ptr->save_buffer;
- png_ptr->buffer_size = 0;
-}
-
-void /* PRIVATE */
-png_push_restore_buffer(png_structp png_ptr, png_bytep buffer,
- png_size_t buffer_length)
-{
- png_ptr->current_buffer = buffer;
- png_ptr->current_buffer_size = buffer_length;
- png_ptr->buffer_size = buffer_length + png_ptr->save_buffer_size;
- png_ptr->current_buffer_ptr = png_ptr->current_buffer;
-}
-
-void /* PRIVATE */
-png_push_read_IDAT(png_structp png_ptr)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_IDAT;
-#endif
- if (!(png_ptr->mode & PNG_HAVE_CHUNK_HEADER))
- {
- png_byte chunk_length[4];
-
- if (png_ptr->buffer_size < 8)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
- png_push_fill_buffer(png_ptr, chunk_length, 4);
- png_ptr->push_length = png_get_uint_32(chunk_length);
-
- png_reset_crc(png_ptr);
- png_crc_read(png_ptr, png_ptr->chunk_name, 4);
- png_ptr->mode |= PNG_HAVE_CHUNK_HEADER;
-
- if (png_memcmp(png_ptr->chunk_name, (png_bytep)png_IDAT, 4))
- {
- png_ptr->process_mode = PNG_READ_CHUNK_MODE;
- if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
- png_error(png_ptr, "Not enough compressed data");
- return;
- }
-
- png_ptr->idat_size = png_ptr->push_length;
- }
- if (png_ptr->idat_size && png_ptr->save_buffer_size)
- {
- png_size_t save_size;
-
- if (png_ptr->idat_size < (png_uint_32)png_ptr->save_buffer_size)
- {
- save_size = (png_size_t)png_ptr->idat_size;
- /* check for overflow */
- if((png_uint_32)save_size != png_ptr->idat_size)
- png_error(png_ptr, "save_size overflowed in pngpread");
- }
- else
- save_size = png_ptr->save_buffer_size;
-
- png_calculate_crc(png_ptr, png_ptr->save_buffer_ptr, save_size);
- png_process_IDAT_data(png_ptr, png_ptr->save_buffer_ptr, save_size);
-
- png_ptr->idat_size -= save_size;
- png_ptr->buffer_size -= save_size;
- png_ptr->save_buffer_size -= save_size;
- png_ptr->save_buffer_ptr += save_size;
- }
- if (png_ptr->idat_size && png_ptr->current_buffer_size)
- {
- png_size_t save_size;
-
- if (png_ptr->idat_size < (png_uint_32)png_ptr->current_buffer_size)
- {
- save_size = (png_size_t)png_ptr->idat_size;
- /* check for overflow */
- if((png_uint_32)save_size != png_ptr->idat_size)
- png_error(png_ptr, "save_size overflowed in pngpread");
- }
- else
- save_size = png_ptr->current_buffer_size;
-
- png_calculate_crc(png_ptr, png_ptr->current_buffer_ptr, save_size);
- png_process_IDAT_data(png_ptr, png_ptr->current_buffer_ptr, save_size);
-
- png_ptr->idat_size -= save_size;
- png_ptr->buffer_size -= save_size;
- png_ptr->current_buffer_size -= save_size;
- png_ptr->current_buffer_ptr += save_size;
- }
- if (!png_ptr->idat_size)
- {
- if (png_ptr->buffer_size < 4)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
- png_crc_finish(png_ptr, 0);
- png_ptr->mode &= ~PNG_HAVE_CHUNK_HEADER;
- }
-}
-
-void /* PRIVATE */
-png_process_IDAT_data(png_structp png_ptr, png_bytep buffer,
- png_size_t buffer_length)
-{
- int ret;
-
- if ((png_ptr->flags & PNG_FLAG_ZLIB_FINISHED) && buffer_length)
- png_error(png_ptr, "Extra compression data");
-
- png_ptr->zstream.next_in = buffer;
- png_ptr->zstream.avail_in = (uInt)buffer_length;
- for(;;)
- {
- ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);
- if (ret != Z_OK)
- {
- if (ret == Z_STREAM_END)
- {
- if (png_ptr->zstream.avail_in)
- png_error(png_ptr, "Extra compressed data");
- if (!(png_ptr->zstream.avail_out))
- {
- png_push_process_row(png_ptr);
- }
-
- png_ptr->mode |= PNG_AFTER_IDAT;
- png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
- break;
- }
- else if (ret == Z_BUF_ERROR)
- break;
- else
- png_error(png_ptr, "Decompression Error");
- }
- if (!(png_ptr->zstream.avail_out))
- {
- png_push_process_row(png_ptr);
- png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes;
- png_ptr->zstream.next_out = png_ptr->row_buf;
- }
- else
- break;
- }
-}
-
-void /* PRIVATE */
-png_push_process_row(png_structp png_ptr)
-{
- png_ptr->row_info.color_type = png_ptr->color_type;
- png_ptr->row_info.width = png_ptr->iwidth;
- png_ptr->row_info.channels = png_ptr->channels;
- png_ptr->row_info.bit_depth = png_ptr->bit_depth;
- png_ptr->row_info.pixel_depth = png_ptr->pixel_depth;
-
- png_ptr->row_info.rowbytes = ((png_ptr->row_info.width *
- (png_uint_32)png_ptr->row_info.pixel_depth + 7) >> 3);
-
- png_read_filter_row(png_ptr, &(png_ptr->row_info),
- png_ptr->row_buf + 1, png_ptr->prev_row + 1,
- (int)(png_ptr->row_buf[0]));
-
- png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf,
- png_ptr->rowbytes + 1);
-
- if (png_ptr->transformations)
- png_do_read_transformations(png_ptr);
-
-#if defined(PNG_READ_INTERLACING_SUPPORTED)
- /* blow up interlaced rows to full size */
- if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))
- {
- if (png_ptr->pass < 6)
-/* old interface (pre-1.0.9):
- png_do_read_interlace(&(png_ptr->row_info),
- png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations);
- */
- png_do_read_interlace(png_ptr);
-
- switch (png_ptr->pass)
- {
- case 0:
- {
- int i;
- for (i = 0; i < 8 && png_ptr->pass == 0; i++)
- {
- png_push_have_row(png_ptr, png_ptr->row_buf + 1);
- png_read_push_finish_row(png_ptr); /* updates png_ptr->pass */
- }
- if (png_ptr->pass == 2) /* pass 1 might be empty */
- {
- for (i = 0; i < 4 && png_ptr->pass == 2; i++)
- {
- png_push_have_row(png_ptr, png_bytep_NULL);
- png_read_push_finish_row(png_ptr);
- }
- }
- if (png_ptr->pass == 4 && png_ptr->height <= 4)
- {
- for (i = 0; i < 2 && png_ptr->pass == 4; i++)
- {
- png_push_have_row(png_ptr, png_bytep_NULL);
- png_read_push_finish_row(png_ptr);
- }
- }
- if (png_ptr->pass == 6 && png_ptr->height <= 4)
- {
- png_push_have_row(png_ptr, png_bytep_NULL);
- png_read_push_finish_row(png_ptr);
- }
- break;
- }
- case 1:
- {
- int i;
- for (i = 0; i < 8 && png_ptr->pass == 1; i++)
- {
- png_push_have_row(png_ptr, png_ptr->row_buf + 1);
- png_read_push_finish_row(png_ptr);
- }
- if (png_ptr->pass == 2) /* skip top 4 generated rows */
- {
- for (i = 0; i < 4 && png_ptr->pass == 2; i++)
- {
- png_push_have_row(png_ptr, png_bytep_NULL);
- png_read_push_finish_row(png_ptr);
- }
- }
- break;
- }
- case 2:
- {
- int i;
- for (i = 0; i < 4 && png_ptr->pass == 2; i++)
- {
- png_push_have_row(png_ptr, png_ptr->row_buf + 1);
- png_read_push_finish_row(png_ptr);
- }
- for (i = 0; i < 4 && png_ptr->pass == 2; i++)
- {
- png_push_have_row(png_ptr, png_bytep_NULL);
- png_read_push_finish_row(png_ptr);
- }
- if (png_ptr->pass == 4) /* pass 3 might be empty */
- {
- for (i = 0; i < 2 && png_ptr->pass == 4; i++)
- {
- png_push_have_row(png_ptr, png_bytep_NULL);
- png_read_push_finish_row(png_ptr);
- }
- }
- break;
- }
- case 3:
- {
- int i;
- for (i = 0; i < 4 && png_ptr->pass == 3; i++)
- {
- png_push_have_row(png_ptr, png_ptr->row_buf + 1);
- png_read_push_finish_row(png_ptr);
- }
- if (png_ptr->pass == 4) /* skip top two generated rows */
- {
- for (i = 0; i < 2 && png_ptr->pass == 4; i++)
- {
- png_push_have_row(png_ptr, png_bytep_NULL);
- png_read_push_finish_row(png_ptr);
- }
- }
- break;
- }
- case 4:
- {
- int i;
- for (i = 0; i < 2 && png_ptr->pass == 4; i++)
- {
- png_push_have_row(png_ptr, png_ptr->row_buf + 1);
- png_read_push_finish_row(png_ptr);
- }
- for (i = 0; i < 2 && png_ptr->pass == 4; i++)
- {
- png_push_have_row(png_ptr, png_bytep_NULL);
- png_read_push_finish_row(png_ptr);
- }
- if (png_ptr->pass == 6) /* pass 5 might be empty */
- {
- png_push_have_row(png_ptr, png_bytep_NULL);
- png_read_push_finish_row(png_ptr);
- }
- break;
- }
- case 5:
- {
- int i;
- for (i = 0; i < 2 && png_ptr->pass == 5; i++)
- {
- png_push_have_row(png_ptr, png_ptr->row_buf + 1);
- png_read_push_finish_row(png_ptr);
- }
- if (png_ptr->pass == 6) /* skip top generated row */
- {
- png_push_have_row(png_ptr, png_bytep_NULL);
- png_read_push_finish_row(png_ptr);
- }
- break;
- }
- case 6:
- {
- png_push_have_row(png_ptr, png_ptr->row_buf + 1);
- png_read_push_finish_row(png_ptr);
- if (png_ptr->pass != 6)
- break;
- png_push_have_row(png_ptr, png_bytep_NULL);
- png_read_push_finish_row(png_ptr);
- }
- }
- }
- else
-#endif
- {
- png_push_have_row(png_ptr, png_ptr->row_buf + 1);
- png_read_push_finish_row(png_ptr);
- }
-}
-
-void /* PRIVATE */
-png_read_push_finish_row(png_structp png_ptr)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
-
- /* start of interlace block */
- const int FARDATA png_pass_start[] = {0, 4, 0, 2, 0, 1, 0};
-
- /* offset to next interlace block */
- const int FARDATA png_pass_inc[] = {8, 8, 4, 4, 2, 2, 1};
-
- /* start of interlace block in the y direction */
- const int FARDATA png_pass_ystart[] = {0, 0, 4, 0, 2, 0, 1};
-
- /* offset to next interlace block in the y direction */
- const int FARDATA png_pass_yinc[] = {8, 8, 8, 4, 4, 2, 2};
-
- /* Width of interlace block. This is not currently used - if you need
- * it, uncomment it here and in png.h
- const int FARDATA png_pass_width[] = {8, 4, 4, 2, 2, 1, 1};
- */
-
- /* Height of interlace block. This is not currently used - if you need
- * it, uncomment it here and in png.h
- const int FARDATA png_pass_height[] = {8, 8, 4, 4, 2, 2, 1};
- */
-#endif
-
- png_ptr->row_number++;
- if (png_ptr->row_number < png_ptr->num_rows)
- return;
-
- if (png_ptr->interlaced)
- {
- png_ptr->row_number = 0;
- png_memset_check(png_ptr, png_ptr->prev_row, 0,
- png_ptr->rowbytes + 1);
- do
- {
- png_ptr->pass++;
- if ((png_ptr->pass == 1 && png_ptr->width < 5) ||
- (png_ptr->pass == 3 && png_ptr->width < 3) ||
- (png_ptr->pass == 5 && png_ptr->width < 2))
- png_ptr->pass++;
-
- if (png_ptr->pass >= 7)
- break;
-
- png_ptr->iwidth = (png_ptr->width +
- png_pass_inc[png_ptr->pass] - 1 -
- png_pass_start[png_ptr->pass]) /
- png_pass_inc[png_ptr->pass];
-
- png_ptr->irowbytes = ((png_ptr->iwidth *
- png_ptr->pixel_depth + 7) >> 3) + 1;
-
- if (png_ptr->transformations & PNG_INTERLACE)
- break;
-
- png_ptr->num_rows = (png_ptr->height +
- png_pass_yinc[png_ptr->pass] - 1 -
- png_pass_ystart[png_ptr->pass]) /
- png_pass_yinc[png_ptr->pass];
-
- } while (png_ptr->iwidth == 0 || png_ptr->num_rows == 0);
- }
-}
-
-#if defined(PNG_READ_tEXt_SUPPORTED)
-void /* PRIVATE */
-png_push_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
- length)
-{
- if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
- {
- png_error(png_ptr, "Out of place tEXt");
- /* to quiet some compiler warnings */
- if(info_ptr == NULL) return;
- }
-
-#ifdef PNG_MAX_MALLOC_64K
- png_ptr->skip_length = 0; /* This may not be necessary */
-
- if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */
- {
- png_warning(png_ptr, "tEXt chunk too large to fit in memory");
- png_ptr->skip_length = length - (png_uint_32)65535L;
- length = (png_uint_32)65535L;
- }
-#endif
-
- png_ptr->current_text = (png_charp)png_malloc(png_ptr,
- (png_uint_32)(length+1));
- png_ptr->current_text[length] = '\0';
- png_ptr->current_text_ptr = png_ptr->current_text;
- png_ptr->current_text_size = (png_size_t)length;
- png_ptr->current_text_left = (png_size_t)length;
- png_ptr->process_mode = PNG_READ_tEXt_MODE;
-}
-
-void /* PRIVATE */
-png_push_read_tEXt(png_structp png_ptr, png_infop info_ptr)
-{
- if (png_ptr->buffer_size && png_ptr->current_text_left)
- {
- png_size_t text_size;
-
- if (png_ptr->buffer_size < png_ptr->current_text_left)
- text_size = png_ptr->buffer_size;
- else
- text_size = png_ptr->current_text_left;
- png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
- png_ptr->current_text_left -= text_size;
- png_ptr->current_text_ptr += text_size;
- }
- if (!(png_ptr->current_text_left))
- {
- png_textp text_ptr;
- png_charp text;
- png_charp key;
-
- if (png_ptr->buffer_size < 4)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
- png_push_crc_finish(png_ptr);
-
-#if defined(PNG_MAX_MALLOC_64K)
- if (png_ptr->skip_length)
- return;
-#endif
-
- key = png_ptr->current_text;
- png_ptr->current_text = 0;
-
- for (text = key; *text; text++)
- /* empty loop */ ;
-
- if (text != key + png_ptr->current_text_size)
- text++;
-
- text_ptr = (png_textp)png_malloc(png_ptr, (png_uint_32)sizeof(png_text));
- text_ptr->compression = PNG_TEXT_COMPRESSION_NONE;
- text_ptr->key = key;
-#ifdef PNG_iTXt_SUPPORTED
- text_ptr->lang = NULL;
- text_ptr->lang_key = NULL;
-#endif
- text_ptr->text = text;
-
- png_set_text(png_ptr, info_ptr, text_ptr, 1);
-
- png_free(png_ptr, key);
- png_free(png_ptr, text_ptr);
- }
-}
-#endif
-
-#if defined(PNG_READ_zTXt_SUPPORTED)
-void /* PRIVATE */
-png_push_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
- length)
-{
- if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
- {
- png_error(png_ptr, "Out of place zTXt");
- /* to quiet some compiler warnings */
- if(info_ptr == NULL) return;
- }
-
-#ifdef PNG_MAX_MALLOC_64K
- /* We can't handle zTXt chunks > 64K, since we don't have enough space
- * to be able to store the uncompressed data. Actually, the threshold
- * is probably around 32K, but it isn't as definite as 64K is.
- */
- if (length > (png_uint_32)65535L)
- {
- png_warning(png_ptr, "zTXt chunk too large to fit in memory");
- png_push_crc_skip(png_ptr, length);
- return;
- }
-#endif
-
- png_ptr->current_text = (png_charp)png_malloc(png_ptr,
- (png_uint_32)(length+1));
- png_ptr->current_text[length] = '\0';
- png_ptr->current_text_ptr = png_ptr->current_text;
- png_ptr->current_text_size = (png_size_t)length;
- png_ptr->current_text_left = (png_size_t)length;
- png_ptr->process_mode = PNG_READ_zTXt_MODE;
-}
-
-void /* PRIVATE */
-png_push_read_zTXt(png_structp png_ptr, png_infop info_ptr)
-{
- if (png_ptr->buffer_size && png_ptr->current_text_left)
- {
- png_size_t text_size;
-
- if (png_ptr->buffer_size < (png_uint_32)png_ptr->current_text_left)
- text_size = png_ptr->buffer_size;
- else
- text_size = png_ptr->current_text_left;
- png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
- png_ptr->current_text_left -= text_size;
- png_ptr->current_text_ptr += text_size;
- }
- if (!(png_ptr->current_text_left))
- {
- png_textp text_ptr;
- png_charp text;
- png_charp key;
- int ret;
- png_size_t text_size, key_size;
-
- if (png_ptr->buffer_size < 4)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
- png_push_crc_finish(png_ptr);
-
- key = png_ptr->current_text;
- png_ptr->current_text = 0;
-
- for (text = key; *text; text++)
- /* empty loop */ ;
-
- /* zTXt can't have zero text */
- if (text == key + png_ptr->current_text_size)
- {
- png_free(png_ptr, key);
- return;
- }
-
- text++;
-
- if (*text != PNG_TEXT_COMPRESSION_zTXt) /* check compression byte */
- {
- png_free(png_ptr, key);
- return;
- }
-
- text++;
-
- png_ptr->zstream.next_in = (png_bytep )text;
- png_ptr->zstream.avail_in = (uInt)(png_ptr->current_text_size -
- (text - key));
- png_ptr->zstream.next_out = png_ptr->zbuf;
- png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
-
- key_size = text - key;
- text_size = 0;
- text = NULL;
- ret = Z_STREAM_END;
-
- while (png_ptr->zstream.avail_in)
- {
- ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);
- if (ret != Z_OK && ret != Z_STREAM_END)
- {
- inflateReset(&png_ptr->zstream);
- png_ptr->zstream.avail_in = 0;
- png_free(png_ptr, key);
- png_free(png_ptr, text);
- return;
- }
- if (!(png_ptr->zstream.avail_out) || ret == Z_STREAM_END)
- {
- if (text == NULL)
- {
- text = (png_charp)png_malloc(png_ptr,
- (png_uint_32)(png_ptr->zbuf_size - png_ptr->zstream.avail_out
- + key_size + 1));
- png_memcpy(text + key_size, png_ptr->zbuf,
- png_ptr->zbuf_size - png_ptr->zstream.avail_out);
- png_memcpy(text, key, key_size);
- text_size = key_size + png_ptr->zbuf_size -
- png_ptr->zstream.avail_out;
- *(text + text_size) = '\0';
- }
- else
- {
- png_charp tmp;
-
- tmp = text;
- text = (png_charp)png_malloc(png_ptr, text_size +
- (png_uint_32)(png_ptr->zbuf_size - png_ptr->zstream.avail_out
- + 1));
- png_memcpy(text, tmp, text_size);
- png_free(png_ptr, tmp);
- png_memcpy(text + text_size, png_ptr->zbuf,
- png_ptr->zbuf_size - png_ptr->zstream.avail_out);
- text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out;
- *(text + text_size) = '\0';
- }
- if (ret != Z_STREAM_END)
- {
- png_ptr->zstream.next_out = png_ptr->zbuf;
- png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
- }
- }
- else
- {
- break;
- }
-
- if (ret == Z_STREAM_END)
- break;
- }
-
- inflateReset(&png_ptr->zstream);
- png_ptr->zstream.avail_in = 0;
-
- if (ret != Z_STREAM_END)
- {
- png_free(png_ptr, key);
- png_free(png_ptr, text);
- return;
- }
-
- png_free(png_ptr, key);
- key = text;
- text += key_size;
-
- text_ptr = (png_textp)png_malloc(png_ptr, (png_uint_32)sizeof(png_text));
- text_ptr->compression = PNG_TEXT_COMPRESSION_zTXt;
- text_ptr->key = key;
-#ifdef PNG_iTXt_SUPPORTED
- text_ptr->lang = NULL;
- text_ptr->lang_key = NULL;
-#endif
- text_ptr->text = text;
-
- png_set_text(png_ptr, info_ptr, text_ptr, 1);
-
- png_free(png_ptr, key);
- png_free(png_ptr, text_ptr);
- }
-}
-#endif
-
-#if defined(PNG_READ_iTXt_SUPPORTED)
-void /* PRIVATE */
-png_push_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32
- length)
-{
- if (!(png_ptr->mode & PNG_HAVE_IHDR) || (png_ptr->mode & PNG_HAVE_IEND))
- {
- png_error(png_ptr, "Out of place iTXt");
- /* to quiet some compiler warnings */
- if(info_ptr == NULL) return;
- }
-
-#ifdef PNG_MAX_MALLOC_64K
- png_ptr->skip_length = 0; /* This may not be necessary */
-
- if (length > (png_uint_32)65535L) /* Can't hold entire string in memory */
- {
- png_warning(png_ptr, "iTXt chunk too large to fit in memory");
- png_ptr->skip_length = length - (png_uint_32)65535L;
- length = (png_uint_32)65535L;
- }
-#endif
-
- png_ptr->current_text = (png_charp)png_malloc(png_ptr,
- (png_uint_32)(length+1));
- png_ptr->current_text[length] = '\0';
- png_ptr->current_text_ptr = png_ptr->current_text;
- png_ptr->current_text_size = (png_size_t)length;
- png_ptr->current_text_left = (png_size_t)length;
- png_ptr->process_mode = PNG_READ_iTXt_MODE;
-}
-
-void /* PRIVATE */
-png_push_read_iTXt(png_structp png_ptr, png_infop info_ptr)
-{
-
- if (png_ptr->buffer_size && png_ptr->current_text_left)
- {
- png_size_t text_size;
-
- if (png_ptr->buffer_size < png_ptr->current_text_left)
- text_size = png_ptr->buffer_size;
- else
- text_size = png_ptr->current_text_left;
- png_crc_read(png_ptr, (png_bytep)png_ptr->current_text_ptr, text_size);
- png_ptr->current_text_left -= text_size;
- png_ptr->current_text_ptr += text_size;
- }
- if (!(png_ptr->current_text_left))
- {
- png_textp text_ptr;
- png_charp key;
- int comp_flag;
- png_charp lang;
- png_charp lang_key;
- png_charp text;
-
- if (png_ptr->buffer_size < 4)
- {
- png_push_save_buffer(png_ptr);
- return;
- }
-
- png_push_crc_finish(png_ptr);
-
-#if defined(PNG_MAX_MALLOC_64K)
- if (png_ptr->skip_length)
- return;
-#endif
-
- key = png_ptr->current_text;
- png_ptr->current_text = 0;
-
- for (lang = key; *lang; lang++)
- /* empty loop */ ;
-
- if (lang != key + png_ptr->current_text_size)
- lang++;
-
- comp_flag = *lang++;
- lang++; /* skip comp_type, always zero */
-
- for (lang_key = lang; *lang_key; lang_key++)
- /* empty loop */ ;
- lang_key++; /* skip NUL separator */
-
- for (text = lang_key; *text; text++)
- /* empty loop */ ;
-
- if (text != key + png_ptr->current_text_size)
- text++;
-
- text_ptr = (png_textp)png_malloc(png_ptr, (png_uint_32)sizeof(png_text));
- text_ptr->compression = comp_flag + 2;
- text_ptr->key = key;
- text_ptr->lang = lang;
- text_ptr->lang_key = lang_key;
- text_ptr->text = text;
- text_ptr->text_length = 0;
- text_ptr->itxt_length = png_strlen(text);
-
- png_set_text(png_ptr, info_ptr, text_ptr, 1);
-
- png_free(png_ptr, text_ptr);
- }
-}
-#endif
-
-/* This function is called when we haven't found a handler for this
- * chunk. If there isn't a problem with the chunk itself (ie a bad chunk
- * name or a critical chunk), the chunk is (currently) silently ignored.
- */
-void /* PRIVATE */
-png_push_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32
- length)
-{
- png_uint_32 skip=0;
- png_check_chunk_name(png_ptr, png_ptr->chunk_name);
-
- if (!(png_ptr->chunk_name[0] & 0x20))
- {
-#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
- if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
- HANDLE_CHUNK_ALWAYS
-#if defined(PNG_READ_USER_CHUNKS_SUPPORTED)
- && png_ptr->read_user_chunk_fn == NULL
-#endif
- )
-#endif
- png_chunk_error(png_ptr, "unknown critical chunk");
-
- /* to quiet compiler warnings about unused info_ptr */
- if (info_ptr == NULL)
- return;
- }
-
-#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
- if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS)
- {
- png_unknown_chunk chunk;
-
-#ifdef PNG_MAX_MALLOC_64K
- if (length > (png_uint_32)65535L)
- {
- png_warning(png_ptr, "unknown chunk too large to fit in memory");
- skip = length - (png_uint_32)65535L;
- length = (png_uint_32)65535L;
- }
-#endif
-
- png_strcpy((png_charp)chunk.name, (png_charp)png_ptr->chunk_name);
- chunk.data = (png_bytep)png_malloc(png_ptr, length);
- png_crc_read(png_ptr, chunk.data, length);
- chunk.size = length;
-#if defined(PNG_READ_USER_CHUNKS_SUPPORTED)
- if(png_ptr->read_user_chunk_fn != NULL)
- {
- /* callback to user unknown chunk handler */
- if ((*(png_ptr->read_user_chunk_fn)) (png_ptr, &chunk) <= 0)
- {
- if (!(png_ptr->chunk_name[0] & 0x20))
- if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
- HANDLE_CHUNK_ALWAYS)
- png_chunk_error(png_ptr, "unknown critical chunk");
- }
- png_set_unknown_chunks(png_ptr, info_ptr, &chunk, 1);
- }
- else
-#endif
- png_set_unknown_chunks(png_ptr, info_ptr, &chunk, 1);
- png_free(png_ptr, chunk.data);
- }
- else
-#endif
- skip=length;
- png_push_crc_skip(png_ptr, skip);
-}
-
-void /* PRIVATE */
-png_push_have_info(png_structp png_ptr, png_infop info_ptr)
-{
- if (png_ptr->info_fn != NULL)
- (*(png_ptr->info_fn))(png_ptr, info_ptr);
-}
-
-void /* PRIVATE */
-png_push_have_end(png_structp png_ptr, png_infop info_ptr)
-{
- if (png_ptr->end_fn != NULL)
- (*(png_ptr->end_fn))(png_ptr, info_ptr);
-}
-
-void /* PRIVATE */
-png_push_have_row(png_structp png_ptr, png_bytep row)
-{
- if (png_ptr->row_fn != NULL)
- (*(png_ptr->row_fn))(png_ptr, row, png_ptr->row_number,
- (int)png_ptr->pass);
-}
-
-void PNGAPI
-png_progressive_combine_row (png_structp png_ptr,
- png_bytep old_row, png_bytep new_row)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- const int FARDATA png_pass_dsp_mask[7] =
- {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff};
-#endif
- if (new_row != NULL) /* new_row must == png_ptr->row_buf here. */
- png_combine_row(png_ptr, old_row, png_pass_dsp_mask[png_ptr->pass]);
-}
-
-void PNGAPI
-png_set_progressive_read_fn(png_structp png_ptr, png_voidp progressive_ptr,
- png_progressive_info_ptr info_fn, png_progressive_row_ptr row_fn,
- png_progressive_end_ptr end_fn)
-{
- png_ptr->info_fn = info_fn;
- png_ptr->row_fn = row_fn;
- png_ptr->end_fn = end_fn;
-
- png_set_read_fn(png_ptr, progressive_ptr, png_push_fill_buffer);
-}
-
-png_voidp PNGAPI
-png_get_progressive_ptr(png_structp png_ptr)
-{
- return png_ptr->io_ptr;
-}
-#endif /* PNG_PROGRESSIVE_READ_SUPPORTED */
diff --git a/libpng/pngread.c b/libpng/pngread.c
deleted file mode 100644
index c47df62..0000000
--- a/libpng/pngread.c
+++ /dev/null
@@ -1,1398 +0,0 @@
-
-/* pngread.c - read a PNG file
- *
- * libpng 1.2.1 - December 12, 2001
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2001 Glenn Randers-Pehrson
- * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
- * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
- *
- * This file contains routines that an application calls directly to
- * read a PNG file or stream.
- */
-
-#define PNG_INTERNAL
-#include "png.h"
-
-/* Create a PNG structure for reading, and allocate any memory needed. */
-png_structp PNGAPI
-png_create_read_struct(png_const_charp user_png_ver, png_voidp error_ptr,
- png_error_ptr error_fn, png_error_ptr warn_fn)
-{
-
-#ifdef PNG_USER_MEM_SUPPORTED
- return (png_create_read_struct_2(user_png_ver, error_ptr, error_fn,
- warn_fn, png_voidp_NULL, png_malloc_ptr_NULL, png_free_ptr_NULL));
-}
-
-/* Alternate create PNG structure for reading, and allocate any memory needed. */
-png_structp PNGAPI
-png_create_read_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,
- png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr,
- png_malloc_ptr malloc_fn, png_free_ptr free_fn)
-{
-#endif /* PNG_USER_MEM_SUPPORTED */
-
- png_structp png_ptr;
-
-#ifdef PNG_SETJMP_SUPPORTED
-#ifdef USE_FAR_KEYWORD
- jmp_buf jmpbuf;
-#endif
-#endif
-
- int i;
-
- png_debug(1, "in png_create_read_struct\n");
-#ifdef PNG_USER_MEM_SUPPORTED
- if ((png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG,
- (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr)) == NULL)
-#else
- if ((png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG)) == NULL)
-#endif
- return (NULL);
-
-#ifdef PNG_ASSEMBLER_CODE_SUPPORTED
- png_init_mmx_flags(png_ptr); /* 1.2.0 addition */
-#endif
-
-#ifdef PNG_SETJMP_SUPPORTED
-#ifdef USE_FAR_KEYWORD
- if (setjmp(jmpbuf))
-#else
- if (setjmp(png_ptr->jmpbuf))
-#endif
- {
- png_free(png_ptr, png_ptr->zbuf);
- png_ptr->zbuf=NULL;
- png_destroy_struct(png_ptr);
- return (NULL);
- }
-#ifdef USE_FAR_KEYWORD
- png_memcpy(png_ptr->jmpbuf,jmpbuf,sizeof(jmp_buf));
-#endif
-#endif
-
-#ifdef PNG_USER_MEM_SUPPORTED
- png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn);
-#endif
-
- png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn);
-
- i=0;
- do
- {
- if(user_png_ver[i] != png_libpng_ver[i])
- png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
- } while (png_libpng_ver[i++]);
-
- if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH)
- {
- /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so
- * we must recompile any applications that use any older library version.
- * For versions after libpng 1.0, we will be compatible, so we need
- * only check the first digit.
- */
- if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] ||
- (user_png_ver[0] == '1' && user_png_ver[2] != png_libpng_ver[2]) ||
- (user_png_ver[0] == '0' && user_png_ver[2] < '9'))
- {
-#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE)
- char msg[80];
- if (user_png_ver)
- {
- sprintf(msg, "Application was compiled with png.h from libpng-%.20s",
- user_png_ver);
- png_warning(png_ptr, msg);
- }
- sprintf(msg, "Application is running with png.c from libpng-%.20s",
- png_libpng_ver);
- png_warning(png_ptr, msg);
-#endif
-#ifdef PNG_ERROR_NUMBERS_SUPPORTED
- png_ptr->flags=0;
-#endif
- png_error(png_ptr,
- "Incompatible libpng version in application and library");
- }
- }
-
- /* initialize zbuf - compression buffer */
- png_ptr->zbuf_size = PNG_ZBUF_SIZE;
- png_ptr->zbuf = (png_bytep)png_malloc(png_ptr,
- (png_uint_32)png_ptr->zbuf_size);
- png_ptr->zstream.zalloc = png_zalloc;
- png_ptr->zstream.zfree = png_zfree;
- png_ptr->zstream.opaque = (voidpf)png_ptr;
-
- switch (inflateInit(&png_ptr->zstream))
- {
- case Z_OK: /* Do nothing */ break;
- case Z_MEM_ERROR:
- case Z_STREAM_ERROR: png_error(png_ptr, "zlib memory error"); break;
- case Z_VERSION_ERROR: png_error(png_ptr, "zlib version error"); break;
- default: png_error(png_ptr, "Unknown zlib error");
- }
-
- png_ptr->zstream.next_out = png_ptr->zbuf;
- png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
-
- png_set_read_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL);
-
- return (png_ptr);
-}
-
-/* Initialize PNG structure for reading, and allocate any memory needed.
- This interface is deprecated in favour of the png_create_read_struct(),
- and it will eventually disappear. */
-#undef png_read_init
-void PNGAPI
-png_read_init(png_structp png_ptr)
-{
- /* We only come here via pre-1.0.7-compiled applications */
- png_read_init_2(png_ptr, "1.0.6 or earlier", 0, 0);
-}
-
-#undef png_read_init_2
-void PNGAPI
-png_read_init_2(png_structp png_ptr, png_const_charp user_png_ver,
- png_size_t png_struct_size, png_size_t png_info_size)
-{
- /* We only come here via pre-1.0.12-compiled applications */
-#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE)
- if(sizeof(png_struct) > png_struct_size || sizeof(png_info) > png_info_size)
- {
- char msg[80];
- png_ptr->warning_fn=NULL;
- if (user_png_ver)
- {
- sprintf(msg, "Application was compiled with png.h from libpng-%.20s",
- user_png_ver);
- png_warning(png_ptr, msg);
- }
- sprintf(msg, "Application is running with png.c from libpng-%.20s",
- png_libpng_ver);
- png_warning(png_ptr, msg);
- }
-#endif
- if(sizeof(png_struct) > png_struct_size)
- {
- png_ptr->error_fn=NULL;
-#ifdef PNG_ERROR_NUMBERS_SUPPORTED
- png_ptr->flags=0;
-#endif
- png_error(png_ptr,
- "The png struct allocated by the application for reading is too small.");
- }
- if(sizeof(png_info) > png_info_size)
- {
- png_ptr->error_fn=NULL;
-#ifdef PNG_ERROR_NUMBERS_SUPPORTED
- png_ptr->flags=0;
-#endif
- png_error(png_ptr,
- "The info struct allocated by application for reading is too small.");
- }
- png_read_init_3(&png_ptr, user_png_ver, png_struct_size);
-}
-
-void PNGAPI
-png_read_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver,
- png_size_t png_struct_size)
-{
-#ifdef PNG_SETJMP_SUPPORTED
- jmp_buf tmp_jmp; /* to save current jump buffer */
-#endif
-
- int i=0;
-
- png_structp png_ptr=*ptr_ptr;
-
- do
- {
- if(user_png_ver[i] != png_libpng_ver[i])
- {
-#ifdef PNG_LEGACY_SUPPORTED
- png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
-#else
- png_ptr->warning_fn=NULL;
- png_warning(png_ptr,
- "Application uses deprecated png_read_init() and should be recompiled.");
- break;
-#endif
- }
- } while (png_libpng_ver[i++]);
-
- png_debug(1, "in png_read_init_3\n");
-
-#ifdef PNG_SETJMP_SUPPORTED
- /* save jump buffer and error functions */
- png_memcpy(tmp_jmp, png_ptr->jmpbuf, sizeof (jmp_buf));
-#endif
-
- if(sizeof(png_struct) > png_struct_size)
- {
- png_destroy_struct(png_ptr);
- *ptr_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG);
- png_ptr = *ptr_ptr;
- }
-
- /* reset all variables to 0 */
- png_memset(png_ptr, 0, sizeof (png_struct));
-
-#ifdef PNG_SETJMP_SUPPORTED
- /* restore jump buffer */
- png_memcpy(png_ptr->jmpbuf, tmp_jmp, sizeof (jmp_buf));
-#endif
-
- /* initialize zbuf - compression buffer */
- png_ptr->zbuf_size = PNG_ZBUF_SIZE;
- png_ptr->zbuf = (png_bytep)png_malloc(png_ptr,
- (png_uint_32)png_ptr->zbuf_size);
- png_ptr->zstream.zalloc = png_zalloc;
- png_ptr->zstream.zfree = png_zfree;
- png_ptr->zstream.opaque = (voidpf)png_ptr;
-
- switch (inflateInit(&png_ptr->zstream))
- {
- case Z_OK: /* Do nothing */ break;
- case Z_MEM_ERROR:
- case Z_STREAM_ERROR: png_error(png_ptr, "zlib memory"); break;
- case Z_VERSION_ERROR: png_error(png_ptr, "zlib version"); break;
- default: png_error(png_ptr, "Unknown zlib error");
- }
-
- png_ptr->zstream.next_out = png_ptr->zbuf;
- png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
-
- png_set_read_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL);
-}
-
-/* Read the information before the actual image data. This has been
- * changed in v0.90 to allow reading a file that already has the magic
- * bytes read from the stream. You can tell libpng how many bytes have
- * been read from the beginning of the stream (up to the maximum of 8)
- * via png_set_sig_bytes(), and we will only check the remaining bytes
- * here. The application can then have access to the signature bytes we
- * read if it is determined that this isn't a valid PNG file.
- */
-void PNGAPI
-png_read_info(png_structp png_ptr, png_infop info_ptr)
-{
- png_debug(1, "in png_read_info\n");
- /* save jump buffer and error functions */
- /* If we haven't checked all of the PNG signature bytes, do so now. */
- if (png_ptr->sig_bytes < 8)
- {
- png_size_t num_checked = png_ptr->sig_bytes,
- num_to_check = 8 - num_checked;
-
- png_read_data(png_ptr, &(info_ptr->signature[num_checked]), num_to_check);
- png_ptr->sig_bytes = 8;
-
- if (png_sig_cmp(info_ptr->signature, num_checked, num_to_check))
- {
- if (num_checked < 4 &&
- png_sig_cmp(info_ptr->signature, num_checked, num_to_check - 4))
- png_error(png_ptr, "Not a PNG file");
- else
- png_error(png_ptr, "PNG file corrupted by ASCII conversion");
- }
- if (num_checked < 3)
- png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE;
- }
-
- for(;;)
- {
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_IHDR;
- PNG_IDAT;
- PNG_IEND;
- PNG_PLTE;
-#if defined(PNG_READ_bKGD_SUPPORTED)
- PNG_bKGD;
-#endif
-#if defined(PNG_READ_cHRM_SUPPORTED)
- PNG_cHRM;
-#endif
-#if defined(PNG_READ_gAMA_SUPPORTED)
- PNG_gAMA;
-#endif
-#if defined(PNG_READ_hIST_SUPPORTED)
- PNG_hIST;
-#endif
-#if defined(PNG_READ_iCCP_SUPPORTED)
- PNG_iCCP;
-#endif
-#if defined(PNG_READ_iTXt_SUPPORTED)
- PNG_iTXt;
-#endif
-#if defined(PNG_READ_oFFs_SUPPORTED)
- PNG_oFFs;
-#endif
-#if defined(PNG_READ_pCAL_SUPPORTED)
- PNG_pCAL;
-#endif
-#if defined(PNG_READ_pHYs_SUPPORTED)
- PNG_pHYs;
-#endif
-#if defined(PNG_READ_sBIT_SUPPORTED)
- PNG_sBIT;
-#endif
-#if defined(PNG_READ_sCAL_SUPPORTED)
- PNG_sCAL;
-#endif
-#if defined(PNG_READ_sPLT_SUPPORTED)
- PNG_sPLT;
-#endif
-#if defined(PNG_READ_sRGB_SUPPORTED)
- PNG_sRGB;
-#endif
-#if defined(PNG_READ_tEXt_SUPPORTED)
- PNG_tEXt;
-#endif
-#if defined(PNG_READ_tIME_SUPPORTED)
- PNG_tIME;
-#endif
-#if defined(PNG_READ_tRNS_SUPPORTED)
- PNG_tRNS;
-#endif
-#if defined(PNG_READ_zTXt_SUPPORTED)
- PNG_zTXt;
-#endif
-#endif /* PNG_GLOBAL_ARRAYS */
- png_byte chunk_length[4];
- png_uint_32 length;
-
- png_read_data(png_ptr, chunk_length, 4);
- length = png_get_uint_32(chunk_length);
-
- png_reset_crc(png_ptr);
- png_crc_read(png_ptr, png_ptr->chunk_name, 4);
-
- png_debug2(0, "Reading %s chunk, length=%lu.\n", png_ptr->chunk_name,
- length);
-
- /* This should be a binary subdivision search or a hash for
- * matching the chunk name rather than a linear search.
- */
- if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4))
- png_handle_IHDR(png_ptr, info_ptr, length);
- else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4))
- png_handle_IEND(png_ptr, info_ptr, length);
-#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
- else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name))
- {
- if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
- png_ptr->mode |= PNG_HAVE_IDAT;
- png_handle_unknown(png_ptr, info_ptr, length);
- if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
- png_ptr->mode |= PNG_HAVE_PLTE;
- else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
- {
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before IDAT");
- else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
- !(png_ptr->mode & PNG_HAVE_PLTE))
- png_error(png_ptr, "Missing PLTE before IDAT");
- break;
- }
- }
-#endif
- else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
- png_handle_PLTE(png_ptr, info_ptr, length);
- else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
- {
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before IDAT");
- else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
- !(png_ptr->mode & PNG_HAVE_PLTE))
- png_error(png_ptr, "Missing PLTE before IDAT");
-
- png_ptr->idat_size = length;
- png_ptr->mode |= PNG_HAVE_IDAT;
- break;
- }
-#if defined(PNG_READ_bKGD_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4))
- png_handle_bKGD(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_cHRM_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4))
- png_handle_cHRM(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_gAMA_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4))
- png_handle_gAMA(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_hIST_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4))
- png_handle_hIST(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_oFFs_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4))
- png_handle_oFFs(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_pCAL_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4))
- png_handle_pCAL(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_sCAL_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4))
- png_handle_sCAL(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_pHYs_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4))
- png_handle_pHYs(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_sBIT_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4))
- png_handle_sBIT(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_sRGB_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4))
- png_handle_sRGB(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_iCCP_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4))
- png_handle_iCCP(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_sPLT_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4))
- png_handle_sPLT(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_tEXt_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4))
- png_handle_tEXt(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_tIME_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4))
- png_handle_tIME(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_tRNS_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4))
- png_handle_tRNS(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_zTXt_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4))
- png_handle_zTXt(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_iTXt_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4))
- png_handle_iTXt(png_ptr, info_ptr, length);
-#endif
- else
- png_handle_unknown(png_ptr, info_ptr, length);
- }
-}
-
-/* optional call to update the users info_ptr structure */
-void PNGAPI
-png_read_update_info(png_structp png_ptr, png_infop info_ptr)
-{
- png_debug(1, "in png_read_update_info\n");
- /* save jump buffer and error functions */
- if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
- png_read_start_row(png_ptr);
- else
- png_warning(png_ptr,
- "Ignoring extra png_read_update_info() call; row buffer not reallocated");
- png_read_transform_info(png_ptr, info_ptr);
-}
-
-/* Initialize palette, background, etc, after transformations
- * are set, but before any reading takes place. This allows
- * the user to obtain a gamma-corrected palette, for example.
- * If the user doesn't call this, we will do it ourselves.
- */
-void PNGAPI
-png_start_read_image(png_structp png_ptr)
-{
- png_debug(1, "in png_start_read_image\n");
- /* save jump buffer and error functions */
- if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
- png_read_start_row(png_ptr);
-}
-
-void PNGAPI
-png_read_row(png_structp png_ptr, png_bytep row, png_bytep dsp_row)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_IDAT;
- const int png_pass_dsp_mask[7] = {0xff, 0x0f, 0xff, 0x33, 0xff, 0x55, 0xff};
- const int png_pass_mask[7] = {0x80, 0x08, 0x88, 0x22, 0xaa, 0x55, 0xff};
-#endif
- int ret;
- png_debug2(1, "in png_read_row (row %lu, pass %d)\n",
- png_ptr->row_number, png_ptr->pass);
- /* save jump buffer and error functions */
- if (!(png_ptr->flags & PNG_FLAG_ROW_INIT))
- png_read_start_row(png_ptr);
- if (png_ptr->row_number == 0 && png_ptr->pass == 0)
- {
- /* check for transforms that have been set but were defined out */
-#if defined(PNG_WRITE_INVERT_SUPPORTED) && !defined(PNG_READ_INVERT_SUPPORTED)
- if (png_ptr->transformations & PNG_INVERT_MONO)
- png_warning(png_ptr, "PNG_READ_INVERT_SUPPORTED is not defined.");
-#endif
-#if defined(PNG_WRITE_FILLER_SUPPORTED) && !defined(PNG_READ_FILLER_SUPPORTED)
- if (png_ptr->transformations & PNG_FILLER)
- png_warning(png_ptr, "PNG_READ_FILLER_SUPPORTED is not defined.");
-#endif
-#if defined(PNG_WRITE_PACKSWAP_SUPPORTED) && !defined(PNG_READ_PACKSWAP_SUPPORTED)
- if (png_ptr->transformations & PNG_PACKSWAP)
- png_warning(png_ptr, "PNG_READ_PACKSWAP_SUPPORTED is not defined.");
-#endif
-#if defined(PNG_WRITE_PACK_SUPPORTED) && !defined(PNG_READ_PACK_SUPPORTED)
- if (png_ptr->transformations & PNG_PACK)
- png_warning(png_ptr, "PNG_READ_PACK_SUPPORTED is not defined.");
-#endif
-#if defined(PNG_WRITE_SHIFT_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED)
- if (png_ptr->transformations & PNG_SHIFT)
- png_warning(png_ptr, "PNG_READ_SHIFT_SUPPORTED is not defined.");
-#endif
-#if defined(PNG_WRITE_BGR_SUPPORTED) && !defined(PNG_READ_BGR_SUPPORTED)
- if (png_ptr->transformations & PNG_BGR)
- png_warning(png_ptr, "PNG_READ_BGR_SUPPORTED is not defined.");
-#endif
-#if defined(PNG_WRITE_SWAP_SUPPORTED) && !defined(PNG_READ_SWAP_SUPPORTED)
- if (png_ptr->transformations & PNG_SWAP_BYTES)
- png_warning(png_ptr, "PNG_READ_SWAP_SUPPORTED is not defined.");
-#endif
- }
-
-#if defined(PNG_READ_INTERLACING_SUPPORTED)
- /* if interlaced and we do not need a new row, combine row and return */
- if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))
- {
- switch (png_ptr->pass)
- {
- case 0:
- if (png_ptr->row_number & 0x07)
- {
- if (dsp_row != NULL)
- png_combine_row(png_ptr, dsp_row,
- png_pass_dsp_mask[png_ptr->pass]);
- png_read_finish_row(png_ptr);
- return;
- }
- break;
- case 1:
- if ((png_ptr->row_number & 0x07) || png_ptr->width < 5)
- {
- if (dsp_row != NULL)
- png_combine_row(png_ptr, dsp_row,
- png_pass_dsp_mask[png_ptr->pass]);
- png_read_finish_row(png_ptr);
- return;
- }
- break;
- case 2:
- if ((png_ptr->row_number & 0x07) != 4)
- {
- if (dsp_row != NULL && (png_ptr->row_number & 4))
- png_combine_row(png_ptr, dsp_row,
- png_pass_dsp_mask[png_ptr->pass]);
- png_read_finish_row(png_ptr);
- return;
- }
- break;
- case 3:
- if ((png_ptr->row_number & 3) || png_ptr->width < 3)
- {
- if (dsp_row != NULL)
- png_combine_row(png_ptr, dsp_row,
- png_pass_dsp_mask[png_ptr->pass]);
- png_read_finish_row(png_ptr);
- return;
- }
- break;
- case 4:
- if ((png_ptr->row_number & 3) != 2)
- {
- if (dsp_row != NULL && (png_ptr->row_number & 2))
- png_combine_row(png_ptr, dsp_row,
- png_pass_dsp_mask[png_ptr->pass]);
- png_read_finish_row(png_ptr);
- return;
- }
- break;
- case 5:
- if ((png_ptr->row_number & 1) || png_ptr->width < 2)
- {
- if (dsp_row != NULL)
- png_combine_row(png_ptr, dsp_row,
- png_pass_dsp_mask[png_ptr->pass]);
- png_read_finish_row(png_ptr);
- return;
- }
- break;
- case 6:
- if (!(png_ptr->row_number & 1))
- {
- png_read_finish_row(png_ptr);
- return;
- }
- break;
- }
- }
-#endif
-
- if (!(png_ptr->mode & PNG_HAVE_IDAT))
- png_error(png_ptr, "Invalid attempt to read row data");
-
- png_ptr->zstream.next_out = png_ptr->row_buf;
- png_ptr->zstream.avail_out = (uInt)png_ptr->irowbytes;
- do
- {
- if (!(png_ptr->zstream.avail_in))
- {
- while (!png_ptr->idat_size)
- {
- png_byte chunk_length[4];
-
- png_crc_finish(png_ptr, 0);
-
- png_read_data(png_ptr, chunk_length, 4);
- png_ptr->idat_size = png_get_uint_32(chunk_length);
-
- png_reset_crc(png_ptr);
- png_crc_read(png_ptr, png_ptr->chunk_name, 4);
- if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
- png_error(png_ptr, "Not enough image data");
- }
- png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size;
- png_ptr->zstream.next_in = png_ptr->zbuf;
- if (png_ptr->zbuf_size > png_ptr->idat_size)
- png_ptr->zstream.avail_in = (uInt)png_ptr->idat_size;
- png_crc_read(png_ptr, png_ptr->zbuf,
- (png_size_t)png_ptr->zstream.avail_in);
- png_ptr->idat_size -= png_ptr->zstream.avail_in;
- }
- ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);
- if (ret == Z_STREAM_END)
- {
- if (png_ptr->zstream.avail_out || png_ptr->zstream.avail_in ||
- png_ptr->idat_size)
- png_error(png_ptr, "Extra compressed data");
- png_ptr->mode |= PNG_AFTER_IDAT;
- png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
- break;
- }
- if (ret != Z_OK)
- png_error(png_ptr, png_ptr->zstream.msg ? png_ptr->zstream.msg :
- "Decompression error");
-
- } while (png_ptr->zstream.avail_out);
-
- png_ptr->row_info.color_type = png_ptr->color_type;
- png_ptr->row_info.width = png_ptr->iwidth;
- png_ptr->row_info.channels = png_ptr->channels;
- png_ptr->row_info.bit_depth = png_ptr->bit_depth;
- png_ptr->row_info.pixel_depth = png_ptr->pixel_depth;
- png_ptr->row_info.rowbytes = ((png_ptr->row_info.width *
- (png_uint_32)png_ptr->row_info.pixel_depth + 7) >> 3);
-
- if(png_ptr->row_buf[0])
- png_read_filter_row(png_ptr, &(png_ptr->row_info),
- png_ptr->row_buf + 1, png_ptr->prev_row + 1,
- (int)(png_ptr->row_buf[0]));
-
- png_memcpy_check(png_ptr, png_ptr->prev_row, png_ptr->row_buf,
- png_ptr->rowbytes + 1);
-
-#if defined(PNG_MNG_FEATURES_SUPPORTED)
- if((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
- (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING))
- {
- /* Intrapixel differencing */
- png_do_read_intrapixel(&(png_ptr->row_info), png_ptr->row_buf + 1);
- }
-#endif
-
- if (png_ptr->transformations)
- png_do_read_transformations(png_ptr);
-
-#if defined(PNG_READ_INTERLACING_SUPPORTED)
- /* blow up interlaced rows to full size */
- if (png_ptr->interlaced &&
- (png_ptr->transformations & PNG_INTERLACE))
- {
- if (png_ptr->pass < 6)
-/* old interface (pre-1.0.9):
- png_do_read_interlace(&(png_ptr->row_info),
- png_ptr->row_buf + 1, png_ptr->pass, png_ptr->transformations);
- */
- png_do_read_interlace(png_ptr);
-
- if (dsp_row != NULL)
- png_combine_row(png_ptr, dsp_row,
- png_pass_dsp_mask[png_ptr->pass]);
- if (row != NULL)
- png_combine_row(png_ptr, row,
- png_pass_mask[png_ptr->pass]);
- }
- else
-#endif
- {
- if (row != NULL)
- png_combine_row(png_ptr, row, 0xff);
- if (dsp_row != NULL)
- png_combine_row(png_ptr, dsp_row, 0xff);
- }
- png_read_finish_row(png_ptr);
-
- if (png_ptr->read_row_fn != NULL)
- (*(png_ptr->read_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass);
-}
-
-/* Read one or more rows of image data. If the image is interlaced,
- * and png_set_interlace_handling() has been called, the rows need to
- * contain the contents of the rows from the previous pass. If the
- * image has alpha or transparency, and png_handle_alpha()[*] has been
- * called, the rows contents must be initialized to the contents of the
- * screen.
- *
- * "row" holds the actual image, and pixels are placed in it
- * as they arrive. If the image is displayed after each pass, it will
- * appear to "sparkle" in. "display_row" can be used to display a
- * "chunky" progressive image, with finer detail added as it becomes
- * available. If you do not want this "chunky" display, you may pass
- * NULL for display_row. If you do not want the sparkle display, and
- * you have not called png_handle_alpha(), you may pass NULL for rows.
- * If you have called png_handle_alpha(), and the image has either an
- * alpha channel or a transparency chunk, you must provide a buffer for
- * rows. In this case, you do not have to provide a display_row buffer
- * also, but you may. If the image is not interlaced, or if you have
- * not called png_set_interlace_handling(), the display_row buffer will
- * be ignored, so pass NULL to it.
- *
- * [*] png_handle_alpha() does not exist yet, as of libpng version 1.2.1
- */
-
-void PNGAPI
-png_read_rows(png_structp png_ptr, png_bytepp row,
- png_bytepp display_row, png_uint_32 num_rows)
-{
- png_uint_32 i;
- png_bytepp rp;
- png_bytepp dp;
-
- png_debug(1, "in png_read_rows\n");
- /* save jump buffer and error functions */
- rp = row;
- dp = display_row;
- if (rp != NULL && dp != NULL)
- for (i = 0; i < num_rows; i++)
- {
- png_bytep rptr = *rp++;
- png_bytep dptr = *dp++;
-
- png_read_row(png_ptr, rptr, dptr);
- }
- else if(rp != NULL)
- for (i = 0; i < num_rows; i++)
- {
- png_bytep rptr = *rp;
- png_read_row(png_ptr, rptr, png_bytep_NULL);
- rp++;
- }
- else if(dp != NULL)
- for (i = 0; i < num_rows; i++)
- {
- png_bytep dptr = *dp;
- png_read_row(png_ptr, png_bytep_NULL, dptr);
- dp++;
- }
-}
-
-/* Read the entire image. If the image has an alpha channel or a tRNS
- * chunk, and you have called png_handle_alpha()[*], you will need to
- * initialize the image to the current image that PNG will be overlaying.
- * We set the num_rows again here, in case it was incorrectly set in
- * png_read_start_row() by a call to png_read_update_info() or
- * png_start_read_image() if png_set_interlace_handling() wasn't called
- * prior to either of these functions like it should have been. You can
- * only call this function once. If you desire to have an image for
- * each pass of a interlaced image, use png_read_rows() instead.
- *
- * [*] png_handle_alpha() does not exist yet, as of libpng version 1.2.1
- */
-void PNGAPI
-png_read_image(png_structp png_ptr, png_bytepp image)
-{
- png_uint_32 i,image_height;
- int pass, j;
- png_bytepp rp;
-
- png_debug(1, "in png_read_image\n");
- /* save jump buffer and error functions */
-
-#ifdef PNG_READ_INTERLACING_SUPPORTED
- pass = png_set_interlace_handling(png_ptr);
-#else
- if (png_ptr->interlaced)
- png_error(png_ptr,
- "Cannot read interlaced image -- interlace handler disabled.");
- pass = 1;
-#endif
-
-
- image_height=png_ptr->height;
- png_ptr->num_rows = image_height; /* Make sure this is set correctly */
-
- for (j = 0; j < pass; j++)
- {
- rp = image;
- for (i = 0; i < image_height; i++)
- {
- png_read_row(png_ptr, *rp, png_bytep_NULL);
- rp++;
- }
- }
-}
-
-/* Read the end of the PNG file. Will not read past the end of the
- * file, will verify the end is accurate, and will read any comments
- * or time information at the end of the file, if info is not NULL.
- */
-void PNGAPI
-png_read_end(png_structp png_ptr, png_infop info_ptr)
-{
- png_byte chunk_length[4];
- png_uint_32 length;
-
- png_debug(1, "in png_read_end\n");
- /* save jump buffer and error functions */
- png_crc_finish(png_ptr, 0); /* Finish off CRC from last IDAT chunk */
-
- do
- {
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_IHDR;
- PNG_IDAT;
- PNG_IEND;
- PNG_PLTE;
-#if defined(PNG_READ_bKGD_SUPPORTED)
- PNG_bKGD;
-#endif
-#if defined(PNG_READ_cHRM_SUPPORTED)
- PNG_cHRM;
-#endif
-#if defined(PNG_READ_gAMA_SUPPORTED)
- PNG_gAMA;
-#endif
-#if defined(PNG_READ_hIST_SUPPORTED)
- PNG_hIST;
-#endif
-#if defined(PNG_READ_iCCP_SUPPORTED)
- PNG_iCCP;
-#endif
-#if defined(PNG_READ_iTXt_SUPPORTED)
- PNG_iTXt;
-#endif
-#if defined(PNG_READ_oFFs_SUPPORTED)
- PNG_oFFs;
-#endif
-#if defined(PNG_READ_pCAL_SUPPORTED)
- PNG_pCAL;
-#endif
-#if defined(PNG_READ_pHYs_SUPPORTED)
- PNG_pHYs;
-#endif
-#if defined(PNG_READ_sBIT_SUPPORTED)
- PNG_sBIT;
-#endif
-#if defined(PNG_READ_sCAL_SUPPORTED)
- PNG_sCAL;
-#endif
-#if defined(PNG_READ_sPLT_SUPPORTED)
- PNG_sPLT;
-#endif
-#if defined(PNG_READ_sRGB_SUPPORTED)
- PNG_sRGB;
-#endif
-#if defined(PNG_READ_tEXt_SUPPORTED)
- PNG_tEXt;
-#endif
-#if defined(PNG_READ_tIME_SUPPORTED)
- PNG_tIME;
-#endif
-#if defined(PNG_READ_tRNS_SUPPORTED)
- PNG_tRNS;
-#endif
-#if defined(PNG_READ_zTXt_SUPPORTED)
- PNG_zTXt;
-#endif
-#endif /* PNG_GLOBAL_ARRAYS */
-
- png_read_data(png_ptr, chunk_length, 4);
- length = png_get_uint_32(chunk_length);
-
- png_reset_crc(png_ptr);
- png_crc_read(png_ptr, png_ptr->chunk_name, 4);
-
- png_debug1(0, "Reading %s chunk.\n", png_ptr->chunk_name);
-
- if (!png_memcmp(png_ptr->chunk_name, png_IHDR, 4))
- png_handle_IHDR(png_ptr, info_ptr, length);
- else if (!png_memcmp(png_ptr->chunk_name, png_IEND, 4))
- png_handle_IEND(png_ptr, info_ptr, length);
-#ifdef PNG_HANDLE_AS_UNKNOWN_SUPPORTED
- else if (png_handle_as_unknown(png_ptr, png_ptr->chunk_name))
- {
- if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
- {
- if (length > 0 || png_ptr->mode & PNG_AFTER_IDAT)
- png_error(png_ptr, "Too many IDAT's found");
- }
- else
- png_ptr->mode |= PNG_AFTER_IDAT;
- png_handle_unknown(png_ptr, info_ptr, length);
- if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
- png_ptr->mode |= PNG_HAVE_PLTE;
- }
-#endif
- else if (!png_memcmp(png_ptr->chunk_name, png_IDAT, 4))
- {
- /* Zero length IDATs are legal after the last IDAT has been
- * read, but not after other chunks have been read.
- */
- if (length > 0 || png_ptr->mode & PNG_AFTER_IDAT)
- png_error(png_ptr, "Too many IDAT's found");
- png_crc_finish(png_ptr, length);
- }
- else if (!png_memcmp(png_ptr->chunk_name, png_PLTE, 4))
- png_handle_PLTE(png_ptr, info_ptr, length);
-#if defined(PNG_READ_bKGD_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_bKGD, 4))
- png_handle_bKGD(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_cHRM_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_cHRM, 4))
- png_handle_cHRM(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_gAMA_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_gAMA, 4))
- png_handle_gAMA(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_hIST_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_hIST, 4))
- png_handle_hIST(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_oFFs_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_oFFs, 4))
- png_handle_oFFs(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_pCAL_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_pCAL, 4))
- png_handle_pCAL(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_sCAL_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_sCAL, 4))
- png_handle_sCAL(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_pHYs_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_pHYs, 4))
- png_handle_pHYs(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_sBIT_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_sBIT, 4))
- png_handle_sBIT(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_sRGB_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_sRGB, 4))
- png_handle_sRGB(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_iCCP_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_iCCP, 4))
- png_handle_iCCP(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_sPLT_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_sPLT, 4))
- png_handle_sPLT(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_tEXt_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_tEXt, 4))
- png_handle_tEXt(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_tIME_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_tIME, 4))
- png_handle_tIME(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_tRNS_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_tRNS, 4))
- png_handle_tRNS(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_zTXt_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_zTXt, 4))
- png_handle_zTXt(png_ptr, info_ptr, length);
-#endif
-#if defined(PNG_READ_iTXt_SUPPORTED)
- else if (!png_memcmp(png_ptr->chunk_name, png_iTXt, 4))
- png_handle_iTXt(png_ptr, info_ptr, length);
-#endif
- else
- png_handle_unknown(png_ptr, info_ptr, length);
- } while (!(png_ptr->mode & PNG_HAVE_IEND));
-}
-
-/* free all memory used by the read */
-void PNGAPI
-png_destroy_read_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr,
- png_infopp end_info_ptr_ptr)
-{
- png_structp png_ptr = NULL;
- png_infop info_ptr = NULL, end_info_ptr = NULL;
-#ifdef PNG_USER_MEM_SUPPORTED
- png_free_ptr free_fn = NULL;
- png_voidp mem_ptr = NULL;
-#endif
-
- png_debug(1, "in png_destroy_read_struct\n");
- /* save jump buffer and error functions */
- if (png_ptr_ptr != NULL)
- png_ptr = *png_ptr_ptr;
-
- if (info_ptr_ptr != NULL)
- info_ptr = *info_ptr_ptr;
-
- if (end_info_ptr_ptr != NULL)
- end_info_ptr = *end_info_ptr_ptr;
-
-#ifdef PNG_USER_MEM_SUPPORTED
- free_fn = png_ptr->free_fn;
- mem_ptr = png_ptr->mem_ptr;
-#endif
-
- png_read_destroy(png_ptr, info_ptr, end_info_ptr);
-
- if (info_ptr != NULL)
- {
-#if defined(PNG_TEXT_SUPPORTED)
- png_free_data(png_ptr, info_ptr, PNG_FREE_TEXT, -1);
-#endif
-
-#ifdef PNG_USER_MEM_SUPPORTED
- png_destroy_struct_2((png_voidp)info_ptr, (png_free_ptr)free_fn,
- (png_voidp)mem_ptr);
-#else
- png_destroy_struct((png_voidp)info_ptr);
-#endif
- *info_ptr_ptr = NULL;
- }
-
- if (end_info_ptr != NULL)
- {
-#if defined(PNG_READ_TEXT_SUPPORTED)
- png_free_data(png_ptr, end_info_ptr, PNG_FREE_TEXT, -1);
-#endif
-#ifdef PNG_USER_MEM_SUPPORTED
- png_destroy_struct_2((png_voidp)end_info_ptr, (png_free_ptr)free_fn,
- (png_voidp)mem_ptr);
-#else
- png_destroy_struct((png_voidp)end_info_ptr);
-#endif
- *end_info_ptr_ptr = NULL;
- }
-
- if (png_ptr != NULL)
- {
-#ifdef PNG_USER_MEM_SUPPORTED
- png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn,
- (png_voidp)mem_ptr);
-#else
- png_destroy_struct((png_voidp)png_ptr);
-#endif
- *png_ptr_ptr = NULL;
- }
-}
-
-/* free all memory used by the read (old method) */
-void /* PRIVATE */
-png_read_destroy(png_structp png_ptr, png_infop info_ptr, png_infop end_info_ptr)
-{
-#ifdef PNG_SETJMP_SUPPORTED
- jmp_buf tmp_jmp;
-#endif
- png_error_ptr error_fn;
- png_error_ptr warning_fn;
- png_voidp error_ptr;
-#ifdef PNG_USER_MEM_SUPPORTED
- png_free_ptr free_fn;
-#endif
-
- png_debug(1, "in png_read_destroy\n");
- /* save jump buffer and error functions */
- if (info_ptr != NULL)
- png_info_destroy(png_ptr, info_ptr);
-
- if (end_info_ptr != NULL)
- png_info_destroy(png_ptr, end_info_ptr);
-
- png_free(png_ptr, png_ptr->zbuf);
- png_free(png_ptr, png_ptr->big_row_buf);
- png_free(png_ptr, png_ptr->prev_row);
-#if defined(PNG_READ_DITHER_SUPPORTED)
- png_free(png_ptr, png_ptr->palette_lookup);
- png_free(png_ptr, png_ptr->dither_index);
-#endif
-#if defined(PNG_READ_GAMMA_SUPPORTED)
- png_free(png_ptr, png_ptr->gamma_table);
-#endif
-#if defined(PNG_READ_BACKGROUND_SUPPORTED)
- png_free(png_ptr, png_ptr->gamma_from_1);
- png_free(png_ptr, png_ptr->gamma_to_1);
-#endif
-#ifdef PNG_FREE_ME_SUPPORTED
- if (png_ptr->free_me & PNG_FREE_PLTE)
- png_zfree(png_ptr, png_ptr->palette);
- png_ptr->free_me &= ~PNG_FREE_PLTE;
-#else
- if (png_ptr->flags & PNG_FLAG_FREE_PLTE)
- png_zfree(png_ptr, png_ptr->palette);
- png_ptr->flags &= ~PNG_FLAG_FREE_PLTE;
-#endif
-#if defined(PNG_tRNS_SUPPORTED) || \
- defined(PNG_READ_EXPAND_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
-#ifdef PNG_FREE_ME_SUPPORTED
- if (png_ptr->free_me & PNG_FREE_TRNS)
- png_free(png_ptr, png_ptr->trans);
- png_ptr->free_me &= ~PNG_FREE_TRNS;
-#else
- if (png_ptr->flags & PNG_FLAG_FREE_TRNS)
- png_free(png_ptr, png_ptr->trans);
- png_ptr->flags &= ~PNG_FLAG_FREE_TRNS;
-#endif
-#endif
-#if defined(PNG_READ_hIST_SUPPORTED)
-#ifdef PNG_FREE_ME_SUPPORTED
- if (png_ptr->free_me & PNG_FREE_HIST)
- png_free(png_ptr, png_ptr->hist);
- png_ptr->free_me &= ~PNG_FREE_HIST;
-#else
- if (png_ptr->flags & PNG_FLAG_FREE_HIST)
- png_free(png_ptr, png_ptr->hist);
- png_ptr->flags &= ~PNG_FLAG_FREE_HIST;
-#endif
-#endif
-#if defined(PNG_READ_GAMMA_SUPPORTED)
- if (png_ptr->gamma_16_table != NULL)
- {
- int i;
- int istop = (1 << (8 - png_ptr->gamma_shift));
- for (i = 0; i < istop; i++)
- {
- png_free(png_ptr, png_ptr->gamma_16_table[i]);
- }
- png_free(png_ptr, png_ptr->gamma_16_table);
- }
-#if defined(PNG_READ_BACKGROUND_SUPPORTED)
- if (png_ptr->gamma_16_from_1 != NULL)
- {
- int i;
- int istop = (1 << (8 - png_ptr->gamma_shift));
- for (i = 0; i < istop; i++)
- {
- png_free(png_ptr, png_ptr->gamma_16_from_1[i]);
- }
- png_free(png_ptr, png_ptr->gamma_16_from_1);
- }
- if (png_ptr->gamma_16_to_1 != NULL)
- {
- int i;
- int istop = (1 << (8 - png_ptr->gamma_shift));
- for (i = 0; i < istop; i++)
- {
- png_free(png_ptr, png_ptr->gamma_16_to_1[i]);
- }
- png_free(png_ptr, png_ptr->gamma_16_to_1);
- }
-#endif
-#endif
-#if defined(PNG_TIME_RFC1123_SUPPORTED)
- png_free(png_ptr, png_ptr->time_buffer);
-#endif
-
- inflateEnd(&png_ptr->zstream);
-#ifdef PNG_PROGRESSIVE_READ_SUPPORTED
- png_free(png_ptr, png_ptr->save_buffer);
-#endif
-
- /* Save the important info out of the png_struct, in case it is
- * being used again.
- */
-#ifdef PNG_SETJMP_SUPPORTED
- png_memcpy(tmp_jmp, png_ptr->jmpbuf, sizeof (jmp_buf));
-#endif
-
- error_fn = png_ptr->error_fn;
- warning_fn = png_ptr->warning_fn;
- error_ptr = png_ptr->error_ptr;
-#ifdef PNG_USER_MEM_SUPPORTED
- free_fn = png_ptr->free_fn;
-#endif
-
- png_memset(png_ptr, 0, sizeof (png_struct));
-
- png_ptr->error_fn = error_fn;
- png_ptr->warning_fn = warning_fn;
- png_ptr->error_ptr = error_ptr;
-#ifdef PNG_USER_MEM_SUPPORTED
- png_ptr->free_fn = free_fn;
-#endif
-
-#ifdef PNG_SETJMP_SUPPORTED
- png_memcpy(png_ptr->jmpbuf, tmp_jmp, sizeof (jmp_buf));
-#endif
-
-}
-
-void PNGAPI
-png_set_read_status_fn(png_structp png_ptr, png_read_status_ptr read_row_fn)
-{
- png_ptr->read_row_fn = read_row_fn;
-}
-
-#if defined(PNG_INFO_IMAGE_SUPPORTED)
-void PNGAPI
-png_read_png(png_structp png_ptr, png_infop info_ptr,
- int transforms,
- voidp params)
-{
- int row;
-
-#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED)
- /* invert the alpha channel from opacity to transparency */
- if (transforms & PNG_TRANSFORM_INVERT_ALPHA)
- png_set_invert_alpha(png_ptr);
-#endif
-
- /* The call to png_read_info() gives us all of the information from the
- * PNG file before the first IDAT (image data chunk).
- */
- png_read_info(png_ptr, info_ptr);
-
- /* -------------- image transformations start here ------------------- */
-
-#if defined(PNG_READ_16_TO_8_SUPPORTED)
- /* tell libpng to strip 16 bit/color files down to 8 bits/color */
- if (transforms & PNG_TRANSFORM_STRIP_16)
- png_set_strip_16(png_ptr);
-#endif
-
-#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
- /* Strip alpha bytes from the input data without combining with the
- * background (not recommended).
- */
- if (transforms & PNG_TRANSFORM_STRIP_ALPHA)
- png_set_strip_alpha(png_ptr);
-#endif
-
-#if defined(PNG_READ_PACK_SUPPORTED) && !defined(PNG_READ_EXPAND_SUPPORTED)
- /* Extract multiple pixels with bit depths of 1, 2, and 4 from a single
- * byte into separate bytes (useful for paletted and grayscale images).
- */
- if (transforms & PNG_TRANSFORM_PACKING)
- png_set_packing(png_ptr);
-#endif
-
-#if defined(PNG_READ_PACKSWAP_SUPPORTED)
- /* Change the order of packed pixels to least significant bit first
- * (not useful if you are using png_set_packing). */
- if (transforms & PNG_TRANSFORM_PACKSWAP)
- png_set_packswap(png_ptr);
-#endif
-
-#if defined(PNG_READ_EXPAND_SUPPORTED)
- /* Expand paletted colors into true RGB triplets
- * Expand grayscale images to full 8 bits from 1, 2, or 4 bits/pixel
- * Expand paletted or RGB images with transparency to full alpha
- * channels so the data will be available as RGBA quartets.
- */
- if (transforms & PNG_TRANSFORM_EXPAND)
- if ((png_ptr->bit_depth < 8) ||
- (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ||
- (png_get_valid(png_ptr, info_ptr, PNG_INFO_tRNS)))
- png_set_expand(png_ptr);
-#endif
-
- /* We don't handle background color or gamma transformation or dithering. */
-
-#if defined(PNG_READ_INVERT_SUPPORTED)
- /* invert monochrome files to have 0 as white and 1 as black */
- if (transforms & PNG_TRANSFORM_INVERT_MONO)
- png_set_invert_mono(png_ptr);
-#endif
-
-#if defined(PNG_READ_SHIFT_SUPPORTED)
- /* If you want to shift the pixel values from the range [0,255] or
- * [0,65535] to the original [0,7] or [0,31], or whatever range the
- * colors were originally in:
- */
- if ((transforms & PNG_TRANSFORM_SHIFT)
- && png_get_valid(png_ptr, info_ptr, PNG_INFO_sBIT))
- {
- png_color_8p sig_bit;
-
- png_get_sBIT(png_ptr, info_ptr, &sig_bit);
- png_set_shift(png_ptr, sig_bit);
- }
-#endif
-
-#if defined(PNG_READ_BGR_SUPPORTED)
- /* flip the RGB pixels to BGR (or RGBA to BGRA) */
- if (transforms & PNG_TRANSFORM_BGR)
- png_set_bgr(png_ptr);
-#endif
-
-#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED)
- /* swap the RGBA or GA data to ARGB or AG (or BGRA to ABGR) */
- if (transforms & PNG_TRANSFORM_SWAP_ALPHA)
- png_set_swap_alpha(png_ptr);
-#endif
-
-#if defined(PNG_READ_SWAP_SUPPORTED)
- /* swap bytes of 16 bit files to least significant byte first */
- if (transforms & PNG_TRANSFORM_SWAP_ENDIAN)
- png_set_swap(png_ptr);
-#endif
-
- /* We don't handle adding filler bytes */
-
- /* Optional call to gamma correct and add the background to the palette
- * and update info structure. REQUIRED if you are expecting libpng to
- * update the palette for you (i.e., you selected such a transform above).
- */
- png_read_update_info(png_ptr, info_ptr);
-
- /* -------------- image transformations end here ------------------- */
-
-#ifdef PNG_FREE_ME_SUPPORTED
- png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0);
-#endif
- if(info_ptr->row_pointers == NULL)
- {
- info_ptr->row_pointers = (png_bytepp)png_malloc(png_ptr,
- info_ptr->height * sizeof(png_bytep));
-#ifdef PNG_FREE_ME_SUPPORTED
- info_ptr->free_me |= PNG_FREE_ROWS;
-#endif
- for (row = 0; row < (int)info_ptr->height; row++)
- {
- info_ptr->row_pointers[row] = (png_bytep)png_malloc(png_ptr,
- png_get_rowbytes(png_ptr, info_ptr));
- }
- }
-
- png_read_image(png_ptr, info_ptr->row_pointers);
- info_ptr->valid |= PNG_INFO_IDAT;
-
- /* read rest of file, and get additional chunks in info_ptr - REQUIRED */
- png_read_end(png_ptr, info_ptr);
-
- if(transforms == 0 || params == NULL)
- /* quiet compiler warnings */ return;
-
-}
-#endif
diff --git a/libpng/pngrio.c b/libpng/pngrio.c
deleted file mode 100644
index 79755b4..0000000
--- a/libpng/pngrio.c
+++ /dev/null
@@ -1,161 +0,0 @@
-
-/* pngrio.c - functions for data input
- *
- * libpng 1.2.1 - December 12, 2001
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2001 Glenn Randers-Pehrson
- * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
- * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
- *
- * This file provides a location for all input. Users who need
- * special handling are expected to write a function that has the same
- * arguments as this and performs a similar function, but that possibly
- * has a different input method. Note that you shouldn't change this
- * function, but rather write a replacement function and then make
- * libpng use it at run time with png_set_read_fn(...).
- */
-
-#define PNG_INTERNAL
-#include "png.h"
-
-/* Read the data from whatever input you are using. The default routine
- reads from a file pointer. Note that this routine sometimes gets called
- with very small lengths, so you should implement some kind of simple
- buffering if you are using unbuffered reads. This should never be asked
- to read more then 64K on a 16 bit machine. */
-void /* PRIVATE */
-png_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
-{
- png_debug1(4,"reading %d bytes\n", (int)length);
- if (png_ptr->read_data_fn != NULL)
- (*(png_ptr->read_data_fn))(png_ptr, data, length);
- else
- png_error(png_ptr, "Call to NULL read function");
-}
-
-#if !defined(PNG_NO_STDIO)
-/* This is the function that does the actual reading of data. If you are
- not reading from a standard C stream, you should create a replacement
- read_data function and use it at run time with png_set_read_fn(), rather
- than changing the library. */
-#ifndef USE_FAR_KEYWORD
-static void /* PRIVATE */
-png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
-{
- png_size_t check;
-
- /* fread() returns 0 on error, so it is OK to store this in a png_size_t
- * instead of an int, which is what fread() actually returns.
- */
-#if defined(_WIN32_WCE)
- if ( !ReadFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) )
- check = 0;
-#else
- check = (png_size_t)fread(data, (png_size_t)1, length,
- (png_FILE_p)png_ptr->io_ptr);
-#endif
-
- if (check != length)
- png_error(png_ptr, "Read Error");
-}
-#else
-/* this is the model-independent version. Since the standard I/O library
- can't handle far buffers in the medium and small models, we have to copy
- the data.
-*/
-
-#define NEAR_BUF_SIZE 1024
-#define MIN(a,b) (a <= b ? a : b)
-
-static void /* PRIVATE */
-png_default_read_data(png_structp png_ptr, png_bytep data, png_size_t length)
-{
- int check;
- png_byte *n_data;
- png_FILE_p io_ptr;
-
- /* Check if data really is near. If so, use usual code. */
- n_data = (png_byte *)CVT_PTR_NOCHECK(data);
- io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr);
- if ((png_bytep)n_data == data)
- {
-#if defined(_WIN32_WCE)
- if ( !ReadFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) )
- check = 0;
-#else
- check = fread(n_data, 1, length, io_ptr);
-#endif
- }
- else
- {
- png_byte buf[NEAR_BUF_SIZE];
- png_size_t read, remaining, err;
- check = 0;
- remaining = length;
- do
- {
- read = MIN(NEAR_BUF_SIZE, remaining);
-#if defined(_WIN32_WCE)
- if ( !ReadFile((HANDLE)(io_ptr), buf, read, &err, NULL) )
- err = 0;
-#else
- err = fread(buf, (png_size_t)1, read, io_ptr);
-#endif
- png_memcpy(data, buf, read); /* copy far buffer to near buffer */
- if(err != read)
- break;
- else
- check += err;
- data += read;
- remaining -= read;
- }
- while (remaining != 0);
- }
- if ((png_uint_32)check != (png_uint_32)length)
- png_error(png_ptr, "read Error");
-}
-#endif
-#endif
-
-/* This function allows the application to supply a new input function
- for libpng if standard C streams aren't being used.
-
- This function takes as its arguments:
- png_ptr - pointer to a png input data structure
- io_ptr - pointer to user supplied structure containing info about
- the input functions. May be NULL.
- read_data_fn - pointer to a new input function that takes as its
- arguments a pointer to a png_struct, a pointer to
- a location where input data can be stored, and a 32-bit
- unsigned int that is the number of bytes to be read.
- To exit and output any fatal error messages the new write
- function should call png_error(png_ptr, "Error msg"). */
-void PNGAPI
-png_set_read_fn(png_structp png_ptr, png_voidp io_ptr,
- png_rw_ptr read_data_fn)
-{
- png_ptr->io_ptr = io_ptr;
-
-#if !defined(PNG_NO_STDIO)
- if (read_data_fn != NULL)
- png_ptr->read_data_fn = read_data_fn;
- else
- png_ptr->read_data_fn = png_default_read_data;
-#else
- png_ptr->read_data_fn = read_data_fn;
-#endif
-
- /* It is an error to write to a read device */
- if (png_ptr->write_data_fn != NULL)
- {
- png_ptr->write_data_fn = NULL;
- png_warning(png_ptr,
- "It's an error to set both read_data_fn and write_data_fn in the ");
- png_warning(png_ptr,
- "same structure. Resetting write_data_fn to NULL.");
- }
-
-#if defined(PNG_WRITE_FLUSH_SUPPORTED)
- png_ptr->output_flush_fn = NULL;
-#endif
-}
diff --git a/libpng/pngrtran.c b/libpng/pngrtran.c
deleted file mode 100644
index 2d62779..0000000
--- a/libpng/pngrtran.c
+++ /dev/null
@@ -1,4137 +0,0 @@
-
-/* pngrtran.c - transforms the data in a row for PNG readers
- *
- * libpng 1.2.1 - December 12, 2001
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2001 Glenn Randers-Pehrson
- * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
- * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
- *
- * This file contains functions optionally called by an application
- * in order to tell libpng how to handle data when reading a PNG.
- * Transformations that are used in both reading and writing are
- * in pngtrans.c.
- */
-
-#define PNG_INTERNAL
-#include "png.h"
-
-/* Set the action on getting a CRC error for an ancillary or critical chunk. */
-void PNGAPI
-png_set_crc_action(png_structp png_ptr, int crit_action, int ancil_action)
-{
- png_debug(1, "in png_set_crc_action\n");
- /* Tell libpng how we react to CRC errors in critical chunks */
- switch (crit_action)
- {
- case PNG_CRC_NO_CHANGE: /* leave setting as is */
- break;
- case PNG_CRC_WARN_USE: /* warn/use data */
- png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK;
- png_ptr->flags |= PNG_FLAG_CRC_CRITICAL_USE;
- break;
- case PNG_CRC_QUIET_USE: /* quiet/use data */
- png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK;
- png_ptr->flags |= PNG_FLAG_CRC_CRITICAL_USE |
- PNG_FLAG_CRC_CRITICAL_IGNORE;
- break;
- case PNG_CRC_WARN_DISCARD: /* not a valid action for critical data */
- png_warning(png_ptr, "Can't discard critical data on CRC error.");
- case PNG_CRC_ERROR_QUIT: /* error/quit */
- case PNG_CRC_DEFAULT:
- default:
- png_ptr->flags &= ~PNG_FLAG_CRC_CRITICAL_MASK;
- break;
- }
-
- switch (ancil_action)
- {
- case PNG_CRC_NO_CHANGE: /* leave setting as is */
- break;
- case PNG_CRC_WARN_USE: /* warn/use data */
- png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK;
- png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_USE;
- break;
- case PNG_CRC_QUIET_USE: /* quiet/use data */
- png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK;
- png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_USE |
- PNG_FLAG_CRC_ANCILLARY_NOWARN;
- break;
- case PNG_CRC_ERROR_QUIT: /* error/quit */
- png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK;
- png_ptr->flags |= PNG_FLAG_CRC_ANCILLARY_NOWARN;
- break;
- case PNG_CRC_WARN_DISCARD: /* warn/discard data */
- case PNG_CRC_DEFAULT:
- default:
- png_ptr->flags &= ~PNG_FLAG_CRC_ANCILLARY_MASK;
- break;
- }
-}
-
-#if defined(PNG_READ_BACKGROUND_SUPPORTED) && \
- defined(PNG_FLOATING_POINT_SUPPORTED)
-/* handle alpha and tRNS via a background color */
-void PNGAPI
-png_set_background(png_structp png_ptr,
- png_color_16p background_color, int background_gamma_code,
- int need_expand, double background_gamma)
-{
- png_debug(1, "in png_set_background\n");
- if (background_gamma_code == PNG_BACKGROUND_GAMMA_UNKNOWN)
- {
- png_warning(png_ptr, "Application must supply a known background gamma");
- return;
- }
-
- png_ptr->transformations |= PNG_BACKGROUND;
- png_memcpy(&(png_ptr->background), background_color, sizeof(png_color_16));
- png_ptr->background_gamma = (float)background_gamma;
- png_ptr->background_gamma_type = (png_byte)(background_gamma_code);
- png_ptr->transformations |= (need_expand ? PNG_BACKGROUND_EXPAND : 0);
-
- /* Note: if need_expand is set and color_type is either RGB or RGB_ALPHA
- * (in which case need_expand is superfluous anyway), the background color
- * might actually be gray yet not be flagged as such. This is not a problem
- * for the current code, which uses PNG_BACKGROUND_IS_GRAY only to
- * decide when to do the png_do_gray_to_rgb() transformation.
- */
- if ((need_expand && !(png_ptr->color_type & PNG_COLOR_MASK_COLOR)) ||
- (!need_expand && background_color->red == background_color->green &&
- background_color->red == background_color->blue))
- png_ptr->mode |= PNG_BACKGROUND_IS_GRAY;
-}
-#endif
-
-#if defined(PNG_READ_16_TO_8_SUPPORTED)
-/* strip 16 bit depth files to 8 bit depth */
-void PNGAPI
-png_set_strip_16(png_structp png_ptr)
-{
- png_debug(1, "in png_set_strip_16\n");
- png_ptr->transformations |= PNG_16_TO_8;
-}
-#endif
-
-#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
-void PNGAPI
-png_set_strip_alpha(png_structp png_ptr)
-{
- png_debug(1, "in png_set_strip_alpha\n");
- png_ptr->transformations |= PNG_STRIP_ALPHA;
-}
-#endif
-
-#if defined(PNG_READ_DITHER_SUPPORTED)
-/* Dither file to 8 bit. Supply a palette, the current number
- * of elements in the palette, the maximum number of elements
- * allowed, and a histogram if possible. If the current number
- * of colors is greater then the maximum number, the palette will be
- * modified to fit in the maximum number. "full_dither" indicates
- * whether we need a dithering cube set up for RGB images, or if we
- * simply are reducing the number of colors in a paletted image.
- */
-
-typedef struct png_dsort_struct
-{
- struct png_dsort_struct FAR * next;
- png_byte left;
- png_byte right;
-} png_dsort;
-typedef png_dsort FAR * png_dsortp;
-typedef png_dsort FAR * FAR * png_dsortpp;
-
-void PNGAPI
-png_set_dither(png_structp png_ptr, png_colorp palette,
- int num_palette, int maximum_colors, png_uint_16p histogram,
- int full_dither)
-{
- png_debug(1, "in png_set_dither\n");
- png_ptr->transformations |= PNG_DITHER;
-
- if (!full_dither)
- {
- int i;
-
- png_ptr->dither_index = (png_bytep)png_malloc(png_ptr,
- (png_uint_32)(num_palette * sizeof (png_byte)));
- for (i = 0; i < num_palette; i++)
- png_ptr->dither_index[i] = (png_byte)i;
- }
-
- if (num_palette > maximum_colors)
- {
- if (histogram != NULL)
- {
- /* This is easy enough, just throw out the least used colors.
- Perhaps not the best solution, but good enough. */
-
- int i;
- png_bytep sort;
-
- /* initialize an array to sort colors */
- sort = (png_bytep)png_malloc(png_ptr, (png_uint_32)(num_palette
- * sizeof (png_byte)));
-
- /* initialize the sort array */
- for (i = 0; i < num_palette; i++)
- sort[i] = (png_byte)i;
-
- /* Find the least used palette entries by starting a
- bubble sort, and running it until we have sorted
- out enough colors. Note that we don't care about
- sorting all the colors, just finding which are
- least used. */
-
- for (i = num_palette - 1; i >= maximum_colors; i--)
- {
- int done; /* to stop early if the list is pre-sorted */
- int j;
-
- done = 1;
- for (j = 0; j < i; j++)
- {
- if (histogram[sort[j]] < histogram[sort[j + 1]])
- {
- png_byte t;
-
- t = sort[j];
- sort[j] = sort[j + 1];
- sort[j + 1] = t;
- done = 0;
- }
- }
- if (done)
- break;
- }
-
- /* swap the palette around, and set up a table, if necessary */
- if (full_dither)
- {
- int j = num_palette;
-
- /* put all the useful colors within the max, but don't
- move the others */
- for (i = 0; i < maximum_colors; i++)
- {
- if ((int)sort[i] >= maximum_colors)
- {
- do
- j--;
- while ((int)sort[j] >= maximum_colors);
- palette[i] = palette[j];
- }
- }
- }
- else
- {
- int j = num_palette;
-
- /* move all the used colors inside the max limit, and
- develop a translation table */
- for (i = 0; i < maximum_colors; i++)
- {
- /* only move the colors we need to */
- if ((int)sort[i] >= maximum_colors)
- {
- png_color tmp_color;
-
- do
- j--;
- while ((int)sort[j] >= maximum_colors);
-
- tmp_color = palette[j];
- palette[j] = palette[i];
- palette[i] = tmp_color;
- /* indicate where the color went */
- png_ptr->dither_index[j] = (png_byte)i;
- png_ptr->dither_index[i] = (png_byte)j;
- }
- }
-
- /* find closest color for those colors we are not using */
- for (i = 0; i < num_palette; i++)
- {
- if ((int)png_ptr->dither_index[i] >= maximum_colors)
- {
- int min_d, k, min_k, d_index;
-
- /* find the closest color to one we threw out */
- d_index = png_ptr->dither_index[i];
- min_d = PNG_COLOR_DIST(palette[d_index], palette[0]);
- for (k = 1, min_k = 0; k < maximum_colors; k++)
- {
- int d;
-
- d = PNG_COLOR_DIST(palette[d_index], palette[k]);
-
- if (d < min_d)
- {
- min_d = d;
- min_k = k;
- }
- }
- /* point to closest color */
- png_ptr->dither_index[i] = (png_byte)min_k;
- }
- }
- }
- png_free(png_ptr, sort);
- }
- else
- {
- /* This is much harder to do simply (and quickly). Perhaps
- we need to go through a median cut routine, but those
- don't always behave themselves with only a few colors
- as input. So we will just find the closest two colors,
- and throw out one of them (chosen somewhat randomly).
- [We don't understand this at all, so if someone wants to
- work on improving it, be our guest - AED, GRP]
- */
- int i;
- int max_d;
- int num_new_palette;
- png_dsortpp hash;
- png_bytep index_to_palette;
- /* where the original index currently is in the palette */
- png_bytep palette_to_index;
- /* which original index points to this palette color */
-
- /* initialize palette index arrays */
- index_to_palette = (png_bytep)png_malloc(png_ptr,
- (png_uint_32)(num_palette * sizeof (png_byte)));
- palette_to_index = (png_bytep)png_malloc(png_ptr,
- (png_uint_32)(num_palette * sizeof (png_byte)));
-
- /* initialize the sort array */
- for (i = 0; i < num_palette; i++)
- {
- index_to_palette[i] = (png_byte)i;
- palette_to_index[i] = (png_byte)i;
- }
-
- hash = (png_dsortpp)png_malloc(png_ptr, (png_uint_32)(769 *
- sizeof (png_dsortp)));
- for (i = 0; i < 769; i++)
- hash[i] = NULL;
-/* png_memset(hash, 0, 769 * sizeof (png_dsortp)); */
-
- num_new_palette = num_palette;
-
- /* initial wild guess at how far apart the farthest pixel
- pair we will be eliminating will be. Larger
- numbers mean more areas will be allocated, Smaller
- numbers run the risk of not saving enough data, and
- having to do this all over again.
-
- I have not done extensive checking on this number.
- */
- max_d = 96;
-
- while (num_new_palette > maximum_colors)
- {
- for (i = 0; i < num_new_palette - 1; i++)
- {
- int j;
-
- for (j = i + 1; j < num_new_palette; j++)
- {
- int d;
-
- d = PNG_COLOR_DIST(palette[i], palette[j]);
-
- if (d <= max_d)
- {
- png_dsortp t;
-
- t = (png_dsortp)png_malloc(png_ptr, (png_uint_32)(sizeof
- (png_dsort)));
- t->next = hash[d];
- t->left = (png_byte)i;
- t->right = (png_byte)j;
- hash[d] = t;
- }
- }
- }
-
- for (i = 0; i <= max_d; i++)
- {
- if (hash[i] != NULL)
- {
- png_dsortp p;
-
- for (p = hash[i]; p; p = p->next)
- {
- if ((int)index_to_palette[p->left] < num_new_palette &&
- (int)index_to_palette[p->right] < num_new_palette)
- {
- int j, next_j;
-
- if (num_new_palette & 0x01)
- {
- j = p->left;
- next_j = p->right;
- }
- else
- {
- j = p->right;
- next_j = p->left;
- }
-
- num_new_palette--;
- palette[index_to_palette[j]] = palette[num_new_palette];
- if (!full_dither)
- {
- int k;
-
- for (k = 0; k < num_palette; k++)
- {
- if (png_ptr->dither_index[k] ==
- index_to_palette[j])
- png_ptr->dither_index[k] =
- index_to_palette[next_j];
- if ((int)png_ptr->dither_index[k] ==
- num_new_palette)
- png_ptr->dither_index[k] =
- index_to_palette[j];
- }
- }
-
- index_to_palette[palette_to_index[num_new_palette]] =
- index_to_palette[j];
- palette_to_index[index_to_palette[j]] =
- palette_to_index[num_new_palette];
-
- index_to_palette[j] = (png_byte)num_new_palette;
- palette_to_index[num_new_palette] = (png_byte)j;
- }
- if (num_new_palette <= maximum_colors)
- break;
- }
- if (num_new_palette <= maximum_colors)
- break;
- }
- }
-
- for (i = 0; i < 769; i++)
- {
- if (hash[i] != NULL)
- {
- png_dsortp p = hash[i];
- while (p)
- {
- png_dsortp t;
-
- t = p->next;
- png_free(png_ptr, p);
- p = t;
- }
- }
- hash[i] = 0;
- }
- max_d += 96;
- }
- png_free(png_ptr, hash);
- png_free(png_ptr, palette_to_index);
- png_free(png_ptr, index_to_palette);
- }
- num_palette = maximum_colors;
- }
- if (png_ptr->palette == NULL)
- {
- png_ptr->palette = palette;
- }
- png_ptr->num_palette = (png_uint_16)num_palette;
-
- if (full_dither)
- {
- int i;
- png_bytep distance;
- int total_bits = PNG_DITHER_RED_BITS + PNG_DITHER_GREEN_BITS +
- PNG_DITHER_BLUE_BITS;
- int num_red = (1 << PNG_DITHER_RED_BITS);
- int num_green = (1 << PNG_DITHER_GREEN_BITS);
- int num_blue = (1 << PNG_DITHER_BLUE_BITS);
- png_size_t num_entries = ((png_size_t)1 << total_bits);
-
- png_ptr->palette_lookup = (png_bytep )png_malloc(png_ptr,
- (png_uint_32)(num_entries * sizeof (png_byte)));
-
- png_memset(png_ptr->palette_lookup, 0, num_entries * sizeof (png_byte));
-
- distance = (png_bytep)png_malloc(png_ptr, (png_uint_32)(num_entries *
- sizeof(png_byte)));
-
- png_memset(distance, 0xff, num_entries * sizeof(png_byte));
-
- for (i = 0; i < num_palette; i++)
- {
- int ir, ig, ib;
- int r = (palette[i].red >> (8 - PNG_DITHER_RED_BITS));
- int g = (palette[i].green >> (8 - PNG_DITHER_GREEN_BITS));
- int b = (palette[i].blue >> (8 - PNG_DITHER_BLUE_BITS));
-
- for (ir = 0; ir < num_red; ir++)
- {
- int dr = abs(ir - r);
- int index_r = (ir << (PNG_DITHER_BLUE_BITS + PNG_DITHER_GREEN_BITS));
-
- for (ig = 0; ig < num_green; ig++)
- {
- int dg = abs(ig - g);
- int dt = dr + dg;
- int dm = ((dr > dg) ? dr : dg);
- int index_g = index_r | (ig << PNG_DITHER_BLUE_BITS);
-
- for (ib = 0; ib < num_blue; ib++)
- {
- int d_index = index_g | ib;
- int db = abs(ib - b);
- int dmax = ((dm > db) ? dm : db);
- int d = dmax + dt + db;
-
- if (d < (int)distance[d_index])
- {
- distance[d_index] = (png_byte)d;
- png_ptr->palette_lookup[d_index] = (png_byte)i;
- }
- }
- }
- }
- }
-
- png_free(png_ptr, distance);
- }
-}
-#endif
-
-#if defined(PNG_READ_GAMMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED)
-/* Transform the image from the file_gamma to the screen_gamma. We
- * only do transformations on images where the file_gamma and screen_gamma
- * are not close reciprocals, otherwise it slows things down slightly, and
- * also needlessly introduces small errors.
- */
-void PNGAPI
-png_set_gamma(png_structp png_ptr, double scrn_gamma, double file_gamma)
-{
- png_debug(1, "in png_set_gamma\n");
- if (fabs(scrn_gamma * file_gamma - 1.0) > PNG_GAMMA_THRESHOLD)
- png_ptr->transformations |= PNG_GAMMA;
- png_ptr->gamma = (float)file_gamma;
- png_ptr->screen_gamma = (float)scrn_gamma;
-}
-#endif
-
-#if defined(PNG_READ_EXPAND_SUPPORTED)
-/* Expand paletted images to RGB, expand grayscale images of
- * less than 8-bit depth to 8-bit depth, and expand tRNS chunks
- * to alpha channels.
- */
-void PNGAPI
-png_set_expand(png_structp png_ptr)
-{
- png_debug(1, "in png_set_expand\n");
- png_ptr->transformations |= PNG_EXPAND;
-}
-
-/* GRR 19990627: the following three functions currently are identical
- * to png_set_expand(). However, it is entirely reasonable that someone
- * might wish to expand an indexed image to RGB but *not* expand a single,
- * fully transparent palette entry to a full alpha channel--perhaps instead
- * convert tRNS to the grayscale/RGB format (16-bit RGB value), or replace
- * the transparent color with a particular RGB value, or drop tRNS entirely.
- * IOW, a future version of the library may make the transformations flag
- * a bit more fine-grained, with separate bits for each of these three
- * functions.
- *
- * More to the point, these functions make it obvious what libpng will be
- * doing, whereas "expand" can (and does) mean any number of things.
- */
-
-/* Expand paletted images to RGB. */
-void PNGAPI
-png_set_palette_to_rgb(png_structp png_ptr)
-{
- png_debug(1, "in png_set_expand\n");
- png_ptr->transformations |= PNG_EXPAND;
-}
-
-/* Expand grayscale images of less than 8-bit depth to 8 bits. */
-void PNGAPI
-png_set_gray_1_2_4_to_8(png_structp png_ptr)
-{
- png_debug(1, "in png_set_expand\n");
- png_ptr->transformations |= PNG_EXPAND;
-}
-
-/* Expand tRNS chunks to alpha channels. */
-void PNGAPI
-png_set_tRNS_to_alpha(png_structp png_ptr)
-{
- png_debug(1, "in png_set_expand\n");
- png_ptr->transformations |= PNG_EXPAND;
-}
-#endif /* defined(PNG_READ_EXPAND_SUPPORTED) */
-
-#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)
-void PNGAPI
-png_set_gray_to_rgb(png_structp png_ptr)
-{
- png_debug(1, "in png_set_gray_to_rgb\n");
- png_ptr->transformations |= PNG_GRAY_TO_RGB;
-}
-#endif
-
-#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
-#if defined(PNG_FLOATING_POINT_SUPPORTED)
-/* Convert a RGB image to a grayscale of the same width. This allows us,
- * for example, to convert a 24 bpp RGB image into an 8 bpp grayscale image.
- */
-
-void PNGAPI
-png_set_rgb_to_gray(png_structp png_ptr, int error_action, double red,
- double green)
-{
- int red_fixed = (int)((float)red*100000.0 + 0.5);
- int green_fixed = (int)((float)green*100000.0 + 0.5);
- png_set_rgb_to_gray_fixed(png_ptr, error_action, red_fixed, green_fixed);
-}
-#endif
-
-void PNGAPI
-png_set_rgb_to_gray_fixed(png_structp png_ptr, int error_action,
- png_fixed_point red, png_fixed_point green)
-{
- png_debug(1, "in png_set_rgb_to_gray\n");
- switch(error_action)
- {
- case 1: png_ptr->transformations |= PNG_RGB_TO_GRAY;
- break;
- case 2: png_ptr->transformations |= PNG_RGB_TO_GRAY_WARN;
- break;
- case 3: png_ptr->transformations |= PNG_RGB_TO_GRAY_ERR;
- }
- if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
-#if defined(PNG_READ_EXPAND_SUPPORTED)
- png_ptr->transformations |= PNG_EXPAND;
-#else
- {
- png_warning(png_ptr, "Cannot do RGB_TO_GRAY without EXPAND_SUPPORTED.");
- png_ptr->transformations &= ~PNG_RGB_TO_GRAY;
- }
-#endif
- {
- png_uint_16 red_int, green_int;
- if(red < 0 || green < 0)
- {
- red_int = 6968; /* .212671 * 32768 + .5 */
- green_int = 23434; /* .715160 * 32768 + .5 */
- }
- else if(red + green < 100000L)
- {
- red_int = (png_uint_16)(((png_uint_32)red*32768L)/100000L);
- green_int = (png_uint_16)(((png_uint_32)green*32768L)/100000L);
- }
- else
- {
- png_warning(png_ptr, "ignoring out of range rgb_to_gray coefficients");
- red_int = 6968;
- green_int = 23434;
- }
- png_ptr->rgb_to_gray_red_coeff = red_int;
- png_ptr->rgb_to_gray_green_coeff = green_int;
- png_ptr->rgb_to_gray_blue_coeff = (png_uint_16)(32768-red_int-green_int);
- }
-}
-#endif
-
-#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
- defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \
- defined(PNG_LEGACY_SUPPORTED)
-void PNGAPI
-png_set_read_user_transform_fn(png_structp png_ptr, png_user_transform_ptr
- read_user_transform_fn)
-{
- png_debug(1, "in png_set_read_user_transform_fn\n");
-#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
- png_ptr->transformations |= PNG_USER_TRANSFORM;
- png_ptr->read_user_transform_fn = read_user_transform_fn;
-#endif
-#ifdef PNG_LEGACY_SUPPORTED
- if(read_user_transform_fn)
- png_warning(png_ptr,
- "This version of libpng does not support user transforms");
-#endif
-}
-#endif
-
-/* Initialize everything needed for the read. This includes modifying
- * the palette.
- */
-void /* PRIVATE */
-png_init_read_transformations(png_structp png_ptr)
-{
- png_debug(1, "in png_init_read_transformations\n");
-#if defined(PNG_USELESS_TESTS_SUPPORTED)
- if(png_ptr != NULL)
-#endif
- {
-#if defined(PNG_READ_BACKGROUND_SUPPORTED) || defined(PNG_READ_SHIFT_SUPPORTED) \
- || defined(PNG_READ_GAMMA_SUPPORTED)
- int color_type = png_ptr->color_type;
-#endif
-
-#if defined(PNG_READ_EXPAND_SUPPORTED) && defined(PNG_READ_BACKGROUND_SUPPORTED)
- if ((png_ptr->transformations & PNG_BACKGROUND_EXPAND) &&
- (png_ptr->transformations & PNG_EXPAND))
- {
- if (!(color_type & PNG_COLOR_MASK_COLOR)) /* i.e., GRAY or GRAY_ALPHA */
- {
- /* expand background chunk. */
- switch (png_ptr->bit_depth)
- {
- case 1:
- png_ptr->background.gray *= (png_uint_16)0xff;
- png_ptr->background.red = png_ptr->background.green =
- png_ptr->background.blue = png_ptr->background.gray;
- break;
- case 2:
- png_ptr->background.gray *= (png_uint_16)0x55;
- png_ptr->background.red = png_ptr->background.green =
- png_ptr->background.blue = png_ptr->background.gray;
- break;
- case 4:
- png_ptr->background.gray *= (png_uint_16)0x11;
- png_ptr->background.red = png_ptr->background.green =
- png_ptr->background.blue = png_ptr->background.gray;
- break;
- case 8:
- case 16:
- png_ptr->background.red = png_ptr->background.green =
- png_ptr->background.blue = png_ptr->background.gray;
- break;
- }
- }
- else if (color_type == PNG_COLOR_TYPE_PALETTE)
- {
- png_ptr->background.red =
- png_ptr->palette[png_ptr->background.index].red;
- png_ptr->background.green =
- png_ptr->palette[png_ptr->background.index].green;
- png_ptr->background.blue =
- png_ptr->palette[png_ptr->background.index].blue;
-
-#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED)
- if (png_ptr->transformations & PNG_INVERT_ALPHA)
- {
-#if defined(PNG_READ_EXPAND_SUPPORTED)
- if (!(png_ptr->transformations & PNG_EXPAND))
-#endif
- {
- /* invert the alpha channel (in tRNS) unless the pixels are
- going to be expanded, in which case leave it for later */
- int i,istop;
- istop=(int)png_ptr->num_trans;
- for (i=0; i<istop; i++)
- png_ptr->trans[i] = (png_byte)(255 - png_ptr->trans[i]);
- }
- }
-#endif
-
- }
- }
-#endif
-
-#if defined(PNG_READ_BACKGROUND_SUPPORTED) && defined(PNG_READ_GAMMA_SUPPORTED)
- png_ptr->background_1 = png_ptr->background;
-#endif
-#if defined(PNG_READ_GAMMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED)
- if (png_ptr->transformations & (PNG_GAMMA | PNG_RGB_TO_GRAY))
- {
- png_build_gamma_table(png_ptr);
-#if defined(PNG_READ_BACKGROUND_SUPPORTED)
- if (png_ptr->transformations & PNG_BACKGROUND)
- {
- if (color_type == PNG_COLOR_TYPE_PALETTE)
- {
- png_color back, back_1;
- png_colorp palette = png_ptr->palette;
- int num_palette = png_ptr->num_palette;
- int i;
- if (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_FILE)
- {
- back.red = png_ptr->gamma_table[png_ptr->background.red];
- back.green = png_ptr->gamma_table[png_ptr->background.green];
- back.blue = png_ptr->gamma_table[png_ptr->background.blue];
-
- back_1.red = png_ptr->gamma_to_1[png_ptr->background.red];
- back_1.green = png_ptr->gamma_to_1[png_ptr->background.green];
- back_1.blue = png_ptr->gamma_to_1[png_ptr->background.blue];
- }
- else
- {
- double g, gs;
-
- switch (png_ptr->background_gamma_type)
- {
- case PNG_BACKGROUND_GAMMA_SCREEN:
- g = (png_ptr->screen_gamma);
- gs = 1.0;
- break;
- case PNG_BACKGROUND_GAMMA_FILE:
- g = 1.0 / (png_ptr->gamma);
- gs = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma);
- break;
- case PNG_BACKGROUND_GAMMA_UNIQUE:
- g = 1.0 / (png_ptr->background_gamma);
- gs = 1.0 / (png_ptr->background_gamma *
- png_ptr->screen_gamma);
- break;
- default:
- g = 1.0; /* back_1 */
- gs = 1.0; /* back */
- }
-
- if ( fabs(gs - 1.0) < PNG_GAMMA_THRESHOLD)
- {
- back.red = (png_byte)png_ptr->background.red;
- back.green = (png_byte)png_ptr->background.green;
- back.blue = (png_byte)png_ptr->background.blue;
- }
- else
- {
- back.red = (png_byte)(pow(
- (double)png_ptr->background.red/255, gs) * 255.0 + .5);
- back.green = (png_byte)(pow(
- (double)png_ptr->background.green/255, gs) * 255.0 + .5);
- back.blue = (png_byte)(pow(
- (double)png_ptr->background.blue/255, gs) * 255.0 + .5);
- }
-
- back_1.red = (png_byte)(pow(
- (double)png_ptr->background.red/255, g) * 255.0 + .5);
- back_1.green = (png_byte)(pow(
- (double)png_ptr->background.green/255, g) * 255.0 + .5);
- back_1.blue = (png_byte)(pow(
- (double)png_ptr->background.blue/255, g) * 255.0 + .5);
- }
- for (i = 0; i < num_palette; i++)
- {
- if (i < (int)png_ptr->num_trans && png_ptr->trans[i] != 0xff)
- {
- if (png_ptr->trans[i] == 0)
- {
- palette[i] = back;
- }
- else /* if (png_ptr->trans[i] != 0xff) */
- {
- png_byte v, w;
-
- v = png_ptr->gamma_to_1[palette[i].red];
- png_composite(w, v, png_ptr->trans[i], back_1.red);
- palette[i].red = png_ptr->gamma_from_1[w];
-
- v = png_ptr->gamma_to_1[palette[i].green];
- png_composite(w, v, png_ptr->trans[i], back_1.green);
- palette[i].green = png_ptr->gamma_from_1[w];
-
- v = png_ptr->gamma_to_1[palette[i].blue];
- png_composite(w, v, png_ptr->trans[i], back_1.blue);
- palette[i].blue = png_ptr->gamma_from_1[w];
- }
- }
- else
- {
- palette[i].red = png_ptr->gamma_table[palette[i].red];
- palette[i].green = png_ptr->gamma_table[palette[i].green];
- palette[i].blue = png_ptr->gamma_table[palette[i].blue];
- }
- }
- }
- /* if (png_ptr->background_gamma_type!=PNG_BACKGROUND_GAMMA_UNKNOWN)*/
- else
- /* color_type != PNG_COLOR_TYPE_PALETTE */
- {
- double m = (double)(((png_uint_32)1 << png_ptr->bit_depth) - 1);
- double g = 1.0;
- double gs = 1.0;
-
- switch (png_ptr->background_gamma_type)
- {
- case PNG_BACKGROUND_GAMMA_SCREEN:
- g = (png_ptr->screen_gamma);
- gs = 1.0;
- break;
- case PNG_BACKGROUND_GAMMA_FILE:
- g = 1.0 / (png_ptr->gamma);
- gs = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma);
- break;
- case PNG_BACKGROUND_GAMMA_UNIQUE:
- g = 1.0 / (png_ptr->background_gamma);
- gs = 1.0 / (png_ptr->background_gamma *
- png_ptr->screen_gamma);
- break;
- }
-
- if (color_type & PNG_COLOR_MASK_COLOR)
- {
- /* RGB or RGBA */
- png_ptr->background_1.red = (png_uint_16)(pow(
- (double)png_ptr->background.red / m, g) * m + .5);
- png_ptr->background_1.green = (png_uint_16)(pow(
- (double)png_ptr->background.green / m, g) * m + .5);
- png_ptr->background_1.blue = (png_uint_16)(pow(
- (double)png_ptr->background.blue / m, g) * m + .5);
- png_ptr->background.red = (png_uint_16)(pow(
- (double)png_ptr->background.red / m, gs) * m + .5);
- png_ptr->background.green = (png_uint_16)(pow(
- (double)png_ptr->background.green / m, gs) * m + .5);
- png_ptr->background.blue = (png_uint_16)(pow(
- (double)png_ptr->background.blue / m, gs) * m + .5);
- }
- else
- {
- /* GRAY or GRAY ALPHA */
- png_ptr->background_1.gray = (png_uint_16)(pow(
- (double)png_ptr->background.gray / m, g) * m + .5);
- png_ptr->background.gray = (png_uint_16)(pow(
- (double)png_ptr->background.gray / m, gs) * m + .5);
- }
- }
- }
- else
- /* transformation does not include PNG_BACKGROUND */
-#endif /* PNG_READ_BACKGROUND_SUPPORTED */
- if (color_type == PNG_COLOR_TYPE_PALETTE)
- {
- png_colorp palette = png_ptr->palette;
- int num_palette = png_ptr->num_palette;
- int i;
-
- for (i = 0; i < num_palette; i++)
- {
- palette[i].red = png_ptr->gamma_table[palette[i].red];
- palette[i].green = png_ptr->gamma_table[palette[i].green];
- palette[i].blue = png_ptr->gamma_table[palette[i].blue];
- }
- }
- }
-#if defined(PNG_READ_BACKGROUND_SUPPORTED)
- else
-#endif
-#endif /* PNG_READ_GAMMA_SUPPORTED && PNG_FLOATING_POINT_SUPPORTED */
-#if defined(PNG_READ_BACKGROUND_SUPPORTED)
- /* No GAMMA transformation */
- if ((png_ptr->transformations & PNG_BACKGROUND) &&
- (color_type == PNG_COLOR_TYPE_PALETTE))
- {
- int i;
- int istop = (int)png_ptr->num_trans;
- png_color back;
- png_colorp palette = png_ptr->palette;
-
- back.red = (png_byte)png_ptr->background.red;
- back.green = (png_byte)png_ptr->background.green;
- back.blue = (png_byte)png_ptr->background.blue;
-
- for (i = 0; i < istop; i++)
- {
- if (png_ptr->trans[i] == 0)
- {
- palette[i] = back;
- }
- else if (png_ptr->trans[i] != 0xff)
- {
- /* The png_composite() macro is defined in png.h */
- png_composite(palette[i].red, palette[i].red,
- png_ptr->trans[i], back.red);
- png_composite(palette[i].green, palette[i].green,
- png_ptr->trans[i], back.green);
- png_composite(palette[i].blue, palette[i].blue,
- png_ptr->trans[i], back.blue);
- }
- }
- }
-#endif /* PNG_READ_BACKGROUND_SUPPORTED */
-
-#if defined(PNG_READ_SHIFT_SUPPORTED)
- if ((png_ptr->transformations & PNG_SHIFT) &&
- (color_type == PNG_COLOR_TYPE_PALETTE))
- {
- png_uint_16 i;
- png_uint_16 istop = png_ptr->num_palette;
- int sr = 8 - png_ptr->sig_bit.red;
- int sg = 8 - png_ptr->sig_bit.green;
- int sb = 8 - png_ptr->sig_bit.blue;
-
- if (sr < 0 || sr > 8)
- sr = 0;
- if (sg < 0 || sg > 8)
- sg = 0;
- if (sb < 0 || sb > 8)
- sb = 0;
- for (i = 0; i < istop; i++)
- {
- png_ptr->palette[i].red >>= sr;
- png_ptr->palette[i].green >>= sg;
- png_ptr->palette[i].blue >>= sb;
- }
- }
-#endif /* PNG_READ_SHIFT_SUPPORTED */
- }
-#if !defined(PNG_READ_GAMMA_SUPPORTED) && !defined(PNG_READ_SHIFT_SUPPORTED) \
- && !defined(PNG_READ_BACKGROUND_SUPPORTED)
- if(png_ptr)
- return;
-#endif
-}
-
-/* Modify the info structure to reflect the transformations. The
- * info should be updated so a PNG file could be written with it,
- * assuming the transformations result in valid PNG data.
- */
-void /* PRIVATE */
-png_read_transform_info(png_structp png_ptr, png_infop info_ptr)
-{
- png_debug(1, "in png_read_transform_info\n");
-#if defined(PNG_READ_EXPAND_SUPPORTED)
- if (png_ptr->transformations & PNG_EXPAND)
- {
- if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
- {
- if (png_ptr->num_trans)
- info_ptr->color_type = PNG_COLOR_TYPE_RGB_ALPHA;
- else
- info_ptr->color_type = PNG_COLOR_TYPE_RGB;
- info_ptr->bit_depth = 8;
- info_ptr->num_trans = 0;
- }
- else
- {
- if (png_ptr->num_trans)
- info_ptr->color_type |= PNG_COLOR_MASK_ALPHA;
- if (info_ptr->bit_depth < 8)
- info_ptr->bit_depth = 8;
- info_ptr->num_trans = 0;
- }
- }
-#endif
-
-#if defined(PNG_READ_BACKGROUND_SUPPORTED)
- if (png_ptr->transformations & PNG_BACKGROUND)
- {
- info_ptr->color_type &= ~PNG_COLOR_MASK_ALPHA;
- info_ptr->num_trans = 0;
- info_ptr->background = png_ptr->background;
- }
-#endif
-
-#if defined(PNG_READ_GAMMA_SUPPORTED)
- if (png_ptr->transformations & PNG_GAMMA)
- {
-#ifdef PNG_FLOATING_POINT_SUPPORTED
- info_ptr->gamma = png_ptr->gamma;
-#endif
-#ifdef PNG_FIXED_POINT_SUPPORTED
- info_ptr->int_gamma = png_ptr->int_gamma;
-#endif
- }
-#endif
-
-#if defined(PNG_READ_16_TO_8_SUPPORTED)
- if ((png_ptr->transformations & PNG_16_TO_8) && (info_ptr->bit_depth == 16))
- info_ptr->bit_depth = 8;
-#endif
-
-#if defined(PNG_READ_DITHER_SUPPORTED)
- if (png_ptr->transformations & PNG_DITHER)
- {
- if (((info_ptr->color_type == PNG_COLOR_TYPE_RGB) ||
- (info_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA)) &&
- png_ptr->palette_lookup && info_ptr->bit_depth == 8)
- {
- info_ptr->color_type = PNG_COLOR_TYPE_PALETTE;
- }
- }
-#endif
-
-#if defined(PNG_READ_PACK_SUPPORTED)
- if ((png_ptr->transformations & PNG_PACK) && (info_ptr->bit_depth < 8))
- info_ptr->bit_depth = 8;
-#endif
-
-#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)
- if (png_ptr->transformations & PNG_GRAY_TO_RGB)
- info_ptr->color_type |= PNG_COLOR_MASK_COLOR;
-#endif
-
-#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
- if (png_ptr->transformations & PNG_RGB_TO_GRAY)
- info_ptr->color_type &= ~PNG_COLOR_MASK_COLOR;
-#endif
-
- if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
- info_ptr->channels = 1;
- else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR)
- info_ptr->channels = 3;
- else
- info_ptr->channels = 1;
-
-#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
- if (png_ptr->transformations & PNG_STRIP_ALPHA)
- info_ptr->color_type &= ~PNG_COLOR_MASK_ALPHA;
-#endif
-
- if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA)
- info_ptr->channels++;
-
-#if defined(PNG_READ_FILLER_SUPPORTED)
- /* STRIP_ALPHA and FILLER allowed: MASK_ALPHA bit stripped above */
- if ((png_ptr->transformations & PNG_FILLER) &&
- ((info_ptr->color_type == PNG_COLOR_TYPE_RGB) ||
- (info_ptr->color_type == PNG_COLOR_TYPE_GRAY)))
- {
- info_ptr->channels++;
-#if 0 /* if adding a true alpha channel not just filler */
- info_ptr->color_type |= PNG_COLOR_MASK_ALPHA;
-#endif
- }
-#endif
-
-#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED) && \
-defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
- if(png_ptr->transformations & PNG_USER_TRANSFORM)
- {
- if(info_ptr->bit_depth < png_ptr->user_transform_depth)
- info_ptr->bit_depth = png_ptr->user_transform_depth;
- if(info_ptr->channels < png_ptr->user_transform_channels)
- info_ptr->channels = png_ptr->user_transform_channels;
- }
-#endif
-
- info_ptr->pixel_depth = (png_byte)(info_ptr->channels *
- info_ptr->bit_depth);
- info_ptr->rowbytes = ((info_ptr->width * info_ptr->pixel_depth + 7) >> 3);
-
-#if !defined(PNG_READ_EXPAND_SUPPORTED)
- if(png_ptr)
- return;
-#endif
-}
-
-/* Transform the row. The order of transformations is significant,
- * and is very touchy. If you add a transformation, take care to
- * decide how it fits in with the other transformations here.
- */
-void /* PRIVATE */
-png_do_read_transformations(png_structp png_ptr)
-{
- png_debug(1, "in png_do_read_transformations\n");
-#if !defined(PNG_USELESS_TESTS_SUPPORTED)
- if (png_ptr->row_buf == NULL)
- {
-#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE)
- char msg[50];
-
- sprintf(msg, "NULL row buffer for row %ld, pass %d", png_ptr->row_number,
- png_ptr->pass);
- png_error(png_ptr, msg);
-#else
- png_error(png_ptr, "NULL row buffer");
-#endif
- }
-#endif
-
-#if defined(PNG_READ_EXPAND_SUPPORTED)
- if (png_ptr->transformations & PNG_EXPAND)
- {
- if (png_ptr->row_info.color_type == PNG_COLOR_TYPE_PALETTE)
- {
- png_do_expand_palette(&(png_ptr->row_info), png_ptr->row_buf + 1,
- png_ptr->palette, png_ptr->trans, png_ptr->num_trans);
- }
- else
- {
- if (png_ptr->num_trans)
- png_do_expand(&(png_ptr->row_info), png_ptr->row_buf + 1,
- &(png_ptr->trans_values));
- else
- png_do_expand(&(png_ptr->row_info), png_ptr->row_buf + 1,
- NULL);
- }
- }
-#endif
-
-#if defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
- if (png_ptr->transformations & PNG_STRIP_ALPHA)
- png_do_strip_filler(&(png_ptr->row_info), png_ptr->row_buf + 1,
- PNG_FLAG_FILLER_AFTER);
-#endif
-
-#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
- if (png_ptr->transformations & PNG_RGB_TO_GRAY)
- {
- int rgb_error =
- png_do_rgb_to_gray(png_ptr, &(png_ptr->row_info), png_ptr->row_buf + 1);
- if(rgb_error)
- {
- png_ptr->rgb_to_gray_status=1;
- if(png_ptr->transformations == PNG_RGB_TO_GRAY_WARN)
- png_warning(png_ptr, "png_do_rgb_to_gray found nongray pixel");
- if(png_ptr->transformations == PNG_RGB_TO_GRAY_ERR)
- png_error(png_ptr, "png_do_rgb_to_gray found nongray pixel");
- }
- }
-#endif
-
-/*
-From Andreas Dilger e-mail to png-implement, 26 March 1998:
-
- In most cases, the "simple transparency" should be done prior to doing
- gray-to-RGB, or you will have to test 3x as many bytes to check if a
- pixel is transparent. You would also need to make sure that the
- transparency information is upgraded to RGB.
-
- To summarize, the current flow is:
- - Gray + simple transparency -> compare 1 or 2 gray bytes and composite
- with background "in place" if transparent,
- convert to RGB if necessary
- - Gray + alpha -> composite with gray background and remove alpha bytes,
- convert to RGB if necessary
-
- To support RGB backgrounds for gray images we need:
- - Gray + simple transparency -> convert to RGB + simple transparency, compare
- 3 or 6 bytes and composite with background
- "in place" if transparent (3x compare/pixel
- compared to doing composite with gray bkgrnd)
- - Gray + alpha -> convert to RGB + alpha, composite with background and
- remove alpha bytes (3x float operations/pixel
- compared with composite on gray background)
-
- Greg's change will do this. The reason it wasn't done before is for
- performance, as this increases the per-pixel operations. If we would check
- in advance if the background was gray or RGB, and position the gray-to-RGB
- transform appropriately, then it would save a lot of work/time.
- */
-
-#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)
- /* if gray -> RGB, do so now only if background is non-gray; else do later
- * for performance reasons */
- if ((png_ptr->transformations & PNG_GRAY_TO_RGB) &&
- !(png_ptr->mode & PNG_BACKGROUND_IS_GRAY))
- png_do_gray_to_rgb(&(png_ptr->row_info), png_ptr->row_buf + 1);
-#endif
-
-#if defined(PNG_READ_BACKGROUND_SUPPORTED)
- if ((png_ptr->transformations & PNG_BACKGROUND) &&
- ((png_ptr->num_trans != 0 ) ||
- (png_ptr->color_type & PNG_COLOR_MASK_ALPHA)))
- png_do_background(&(png_ptr->row_info), png_ptr->row_buf + 1,
- &(png_ptr->trans_values), &(png_ptr->background)
-#if defined(PNG_READ_GAMMA_SUPPORTED)
- , &(png_ptr->background_1),
- png_ptr->gamma_table, png_ptr->gamma_from_1,
- png_ptr->gamma_to_1, png_ptr->gamma_16_table,
- png_ptr->gamma_16_from_1, png_ptr->gamma_16_to_1,
- png_ptr->gamma_shift
-#endif
-);
-#endif
-
-#if defined(PNG_READ_GAMMA_SUPPORTED)
- if ((png_ptr->transformations & PNG_GAMMA) &&
-#if defined(PNG_READ_BACKGROUND_SUPPORTED)
- !((png_ptr->transformations & PNG_BACKGROUND) &&
- ((png_ptr->num_trans != 0) ||
- (png_ptr->color_type & PNG_COLOR_MASK_ALPHA))) &&
-#endif
- (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE))
- png_do_gamma(&(png_ptr->row_info), png_ptr->row_buf + 1,
- png_ptr->gamma_table, png_ptr->gamma_16_table,
- png_ptr->gamma_shift);
-#endif
-
-#if defined(PNG_READ_16_TO_8_SUPPORTED)
- if (png_ptr->transformations & PNG_16_TO_8)
- png_do_chop(&(png_ptr->row_info), png_ptr->row_buf + 1);
-#endif
-
-#if defined(PNG_READ_DITHER_SUPPORTED)
- if (png_ptr->transformations & PNG_DITHER)
- {
- png_do_dither((png_row_infop)&(png_ptr->row_info), png_ptr->row_buf + 1,
- png_ptr->palette_lookup, png_ptr->dither_index);
- if(png_ptr->row_info.rowbytes == (png_uint_32)0)
- png_error(png_ptr, "png_do_dither returned rowbytes=0");
- }
-#endif
-
-#if defined(PNG_READ_INVERT_SUPPORTED)
- if (png_ptr->transformations & PNG_INVERT_MONO)
- png_do_invert(&(png_ptr->row_info), png_ptr->row_buf + 1);
-#endif
-
-#if defined(PNG_READ_SHIFT_SUPPORTED)
- if (png_ptr->transformations & PNG_SHIFT)
- png_do_unshift(&(png_ptr->row_info), png_ptr->row_buf + 1,
- &(png_ptr->shift));
-#endif
-
-#if defined(PNG_READ_PACK_SUPPORTED)
- if (png_ptr->transformations & PNG_PACK)
- png_do_unpack(&(png_ptr->row_info), png_ptr->row_buf + 1);
-#endif
-
-#if defined(PNG_READ_BGR_SUPPORTED)
- if (png_ptr->transformations & PNG_BGR)
- png_do_bgr(&(png_ptr->row_info), png_ptr->row_buf + 1);
-#endif
-
-#if defined(PNG_READ_PACKSWAP_SUPPORTED)
- if (png_ptr->transformations & PNG_PACKSWAP)
- png_do_packswap(&(png_ptr->row_info), png_ptr->row_buf + 1);
-#endif
-
-#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)
- /* if gray -> RGB, do so now only if we did not do so above */
- if ((png_ptr->transformations & PNG_GRAY_TO_RGB) &&
- (png_ptr->mode & PNG_BACKGROUND_IS_GRAY))
- png_do_gray_to_rgb(&(png_ptr->row_info), png_ptr->row_buf + 1);
-#endif
-
-#if defined(PNG_READ_FILLER_SUPPORTED)
- if (png_ptr->transformations & PNG_FILLER)
- png_do_read_filler(&(png_ptr->row_info), png_ptr->row_buf + 1,
- (png_uint_32)png_ptr->filler, png_ptr->flags);
-#endif
-
-#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED)
- if (png_ptr->transformations & PNG_INVERT_ALPHA)
- png_do_read_invert_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1);
-#endif
-
-#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED)
- if (png_ptr->transformations & PNG_SWAP_ALPHA)
- png_do_read_swap_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1);
-#endif
-
-#if defined(PNG_READ_SWAP_SUPPORTED)
- if (png_ptr->transformations & PNG_SWAP_BYTES)
- png_do_swap(&(png_ptr->row_info), png_ptr->row_buf + 1);
-#endif
-
-#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED)
- if (png_ptr->transformations & PNG_USER_TRANSFORM)
- {
- if(png_ptr->read_user_transform_fn != NULL)
- (*(png_ptr->read_user_transform_fn)) /* user read transform function */
- (png_ptr, /* png_ptr */
- &(png_ptr->row_info), /* row_info: */
- /* png_uint_32 width; width of row */
- /* png_uint_32 rowbytes; number of bytes in row */
- /* png_byte color_type; color type of pixels */
- /* png_byte bit_depth; bit depth of samples */
- /* png_byte channels; number of channels (1-4) */
- /* png_byte pixel_depth; bits per pixel (depth*channels) */
- png_ptr->row_buf + 1); /* start of pixel data for row */
-#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
- if(png_ptr->user_transform_depth)
- png_ptr->row_info.bit_depth = png_ptr->user_transform_depth;
- if(png_ptr->user_transform_channels)
- png_ptr->row_info.channels = png_ptr->user_transform_channels;
-#endif
- png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth *
- png_ptr->row_info.channels);
- png_ptr->row_info.rowbytes = (png_ptr->row_info.width *
- png_ptr->row_info.pixel_depth+7)>>3;
- }
-#endif
-
-}
-
-#if defined(PNG_READ_PACK_SUPPORTED)
-/* Unpack pixels of 1, 2, or 4 bits per pixel into 1 byte per pixel,
- * without changing the actual values. Thus, if you had a row with
- * a bit depth of 1, you would end up with bytes that only contained
- * the numbers 0 or 1. If you would rather they contain 0 and 255, use
- * png_do_shift() after this.
- */
-void /* PRIVATE */
-png_do_unpack(png_row_infop row_info, png_bytep row)
-{
- png_debug(1, "in png_do_unpack\n");
-#if defined(PNG_USELESS_TESTS_SUPPORTED)
- if (row != NULL && row_info != NULL && row_info->bit_depth < 8)
-#else
- if (row_info->bit_depth < 8)
-#endif
- {
- png_uint_32 i;
- png_uint_32 row_width=row_info->width;
-
- switch (row_info->bit_depth)
- {
- case 1:
- {
- png_bytep sp = row + (png_size_t)((row_width - 1) >> 3);
- png_bytep dp = row + (png_size_t)row_width - 1;
- png_uint_32 shift = 7 - (int)((row_width + 7) & 0x07);
- for (i = 0; i < row_width; i++)
- {
- *dp = (png_byte)((*sp >> shift) & 0x01);
- if (shift == 7)
- {
- shift = 0;
- sp--;
- }
- else
- shift++;
-
- dp--;
- }
- break;
- }
- case 2:
- {
-
- png_bytep sp = row + (png_size_t)((row_width - 1) >> 2);
- png_bytep dp = row + (png_size_t)row_width - 1;
- png_uint_32 shift = (int)((3 - ((row_width + 3) & 0x03)) << 1);
- for (i = 0; i < row_width; i++)
- {
- *dp = (png_byte)((*sp >> shift) & 0x03);
- if (shift == 6)
- {
- shift = 0;
- sp--;
- }
- else
- shift += 2;
-
- dp--;
- }
- break;
- }
- case 4:
- {
- png_bytep sp = row + (png_size_t)((row_width - 1) >> 1);
- png_bytep dp = row + (png_size_t)row_width - 1;
- png_uint_32 shift = (int)((1 - ((row_width + 1) & 0x01)) << 2);
- for (i = 0; i < row_width; i++)
- {
- *dp = (png_byte)((*sp >> shift) & 0x0f);
- if (shift == 4)
- {
- shift = 0;
- sp--;
- }
- else
- shift = 4;
-
- dp--;
- }
- break;
- }
- }
- row_info->bit_depth = 8;
- row_info->pixel_depth = (png_byte)(8 * row_info->channels);
- row_info->rowbytes = row_width * row_info->channels;
- }
-}
-#endif
-
-#if defined(PNG_READ_SHIFT_SUPPORTED)
-/* Reverse the effects of png_do_shift. This routine merely shifts the
- * pixels back to their significant bits values. Thus, if you have
- * a row of bit depth 8, but only 5 are significant, this will shift
- * the values back to 0 through 31.
- */
-void /* PRIVATE */
-png_do_unshift(png_row_infop row_info, png_bytep row, png_color_8p sig_bits)
-{
- png_debug(1, "in png_do_unshift\n");
- if (
-#if defined(PNG_USELESS_TESTS_SUPPORTED)
- row != NULL && row_info != NULL && sig_bits != NULL &&
-#endif
- row_info->color_type != PNG_COLOR_TYPE_PALETTE)
- {
- int shift[4];
- int channels = 0;
- int c;
- png_uint_16 value = 0;
- png_uint_32 row_width = row_info->width;
-
- if (row_info->color_type & PNG_COLOR_MASK_COLOR)
- {
- shift[channels++] = row_info->bit_depth - sig_bits->red;
- shift[channels++] = row_info->bit_depth - sig_bits->green;
- shift[channels++] = row_info->bit_depth - sig_bits->blue;
- }
- else
- {
- shift[channels++] = row_info->bit_depth - sig_bits->gray;
- }
- if (row_info->color_type & PNG_COLOR_MASK_ALPHA)
- {
- shift[channels++] = row_info->bit_depth - sig_bits->alpha;
- }
-
- for (c = 0; c < channels; c++)
- {
- if (shift[c] <= 0)
- shift[c] = 0;
- else
- value = 1;
- }
-
- if (!value)
- return;
-
- switch (row_info->bit_depth)
- {
- case 2:
- {
- png_bytep bp;
- png_uint_32 i;
- png_uint_32 istop = row_info->rowbytes;
-
- for (bp = row, i = 0; i < istop; i++)
- {
- *bp >>= 1;
- *bp++ &= 0x55;
- }
- break;
- }
- case 4:
- {
- png_bytep bp = row;
- png_uint_32 i;
- png_uint_32 istop = row_info->rowbytes;
- png_byte mask = (png_byte)((((int)0xf0 >> shift[0]) & (int)0xf0) |
- (png_byte)((int)0xf >> shift[0]));
-
- for (i = 0; i < istop; i++)
- {
- *bp >>= shift[0];
- *bp++ &= mask;
- }
- break;
- }
- case 8:
- {
- png_bytep bp = row;
- png_uint_32 i;
- png_uint_32 istop = row_width * channels;
-
- for (i = 0; i < istop; i++)
- {
- *bp++ >>= shift[i%channels];
- }
- break;
- }
- case 16:
- {
- png_bytep bp = row;
- png_uint_32 i;
- png_uint_32 istop = channels * row_width;
-
- for (i = 0; i < istop; i++)
- {
- value = (png_uint_16)((*bp << 8) + *(bp + 1));
- value >>= shift[i%channels];
- *bp++ = (png_byte)(value >> 8);
- *bp++ = (png_byte)(value & 0xff);
- }
- break;
- }
- }
- }
-}
-#endif
-
-#if defined(PNG_READ_16_TO_8_SUPPORTED)
-/* chop rows of bit depth 16 down to 8 */
-void /* PRIVATE */
-png_do_chop(png_row_infop row_info, png_bytep row)
-{
- png_debug(1, "in png_do_chop\n");
-#if defined(PNG_USELESS_TESTS_SUPPORTED)
- if (row != NULL && row_info != NULL && row_info->bit_depth == 16)
-#else
- if (row_info->bit_depth == 16)
-#endif
- {
- png_bytep sp = row;
- png_bytep dp = row;
- png_uint_32 i;
- png_uint_32 istop = row_info->width * row_info->channels;
-
- for (i = 0; i<istop; i++, sp += 2, dp++)
- {
-#if defined(PNG_READ_16_TO_8_ACCURATE_SCALE_SUPPORTED)
- /* This does a more accurate scaling of the 16-bit color
- * value, rather than a simple low-byte truncation.
- *
- * What the ideal calculation should be:
- * *dp = (((((png_uint_32)(*sp) << 8) |
- * (png_uint_32)(*(sp + 1))) * 255 + 127) / (png_uint_32)65535L;
- *
- * GRR: no, I think this is what it really should be:
- * *dp = (((((png_uint_32)(*sp) << 8) |
- * (png_uint_32)(*(sp + 1))) + 128L) / (png_uint_32)257L;
- *
- * GRR: here's the exact calculation with shifts:
- * temp = (((png_uint_32)(*sp) << 8) | (png_uint_32)(*(sp + 1))) + 128L;
- * *dp = (temp - (temp >> 8)) >> 8;
- *
- * Approximate calculation with shift/add instead of multiply/divide:
- * *dp = ((((png_uint_32)(*sp) << 8) |
- * (png_uint_32)((int)(*(sp + 1)) - *sp)) + 128) >> 8;
- *
- * What we actually do to avoid extra shifting and conversion:
- */
-
- *dp = *sp + ((((int)(*(sp + 1)) - *sp) > 128) ? 1 : 0);
-#else
- /* Simply discard the low order byte */
- *dp = *sp;
-#endif
- }
- row_info->bit_depth = 8;
- row_info->pixel_depth = (png_byte)(8 * row_info->channels);
- row_info->rowbytes = row_info->width * row_info->channels;
- }
-}
-#endif
-
-#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED)
-void /* PRIVATE */
-png_do_read_swap_alpha(png_row_infop row_info, png_bytep row)
-{
- png_debug(1, "in png_do_read_swap_alpha\n");
-#if defined(PNG_USELESS_TESTS_SUPPORTED)
- if (row != NULL && row_info != NULL)
-#endif
- {
- png_uint_32 row_width = row_info->width;
- if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
- {
- /* This converts from RGBA to ARGB */
- if (row_info->bit_depth == 8)
- {
- png_bytep sp = row + row_info->rowbytes;
- png_bytep dp = sp;
- png_byte save;
- png_uint_32 i;
-
- for (i = 0; i < row_width; i++)
- {
- save = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = save;
- }
- }
- /* This converts from RRGGBBAA to AARRGGBB */
- else
- {
- png_bytep sp = row + row_info->rowbytes;
- png_bytep dp = sp;
- png_byte save[2];
- png_uint_32 i;
-
- for (i = 0; i < row_width; i++)
- {
- save[0] = *(--sp);
- save[1] = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = save[0];
- *(--dp) = save[1];
- }
- }
- }
- else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
- {
- /* This converts from GA to AG */
- if (row_info->bit_depth == 8)
- {
- png_bytep sp = row + row_info->rowbytes;
- png_bytep dp = sp;
- png_byte save;
- png_uint_32 i;
-
- for (i = 0; i < row_width; i++)
- {
- save = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = save;
- }
- }
- /* This converts from GGAA to AAGG */
- else
- {
- png_bytep sp = row + row_info->rowbytes;
- png_bytep dp = sp;
- png_byte save[2];
- png_uint_32 i;
-
- for (i = 0; i < row_width; i++)
- {
- save[0] = *(--sp);
- save[1] = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = save[0];
- *(--dp) = save[1];
- }
- }
- }
- }
-}
-#endif
-
-#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED)
-void /* PRIVATE */
-png_do_read_invert_alpha(png_row_infop row_info, png_bytep row)
-{
- png_debug(1, "in png_do_read_invert_alpha\n");
-#if defined(PNG_USELESS_TESTS_SUPPORTED)
- if (row != NULL && row_info != NULL)
-#endif
- {
- png_uint_32 row_width = row_info->width;
- if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
- {
- /* This inverts the alpha channel in RGBA */
- if (row_info->bit_depth == 8)
- {
- png_bytep sp = row + row_info->rowbytes;
- png_bytep dp = sp;
- png_uint_32 i;
-
- for (i = 0; i < row_width; i++)
- {
- *(--dp) = (png_byte)(255 - *(--sp));
-
-/* This does nothing:
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- We can replace it with:
-*/
- sp-=3;
- dp=sp;
- }
- }
- /* This inverts the alpha channel in RRGGBBAA */
- else
- {
- png_bytep sp = row + row_info->rowbytes;
- png_bytep dp = sp;
- png_uint_32 i;
-
- for (i = 0; i < row_width; i++)
- {
- *(--dp) = (png_byte)(255 - *(--sp));
- *(--dp) = (png_byte)(255 - *(--sp));
-
-/* This does nothing:
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- We can replace it with:
-*/
- sp-=6;
- dp=sp;
- }
- }
- }
- else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
- {
- /* This inverts the alpha channel in GA */
- if (row_info->bit_depth == 8)
- {
- png_bytep sp = row + row_info->rowbytes;
- png_bytep dp = sp;
- png_uint_32 i;
-
- for (i = 0; i < row_width; i++)
- {
- *(--dp) = (png_byte)(255 - *(--sp));
- *(--dp) = *(--sp);
- }
- }
- /* This inverts the alpha channel in GGAA */
- else
- {
- png_bytep sp = row + row_info->rowbytes;
- png_bytep dp = sp;
- png_uint_32 i;
-
- for (i = 0; i < row_width; i++)
- {
- *(--dp) = (png_byte)(255 - *(--sp));
- *(--dp) = (png_byte)(255 - *(--sp));
-/*
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
-*/
- sp-=2;
- dp=sp;
- }
- }
- }
- }
-}
-#endif
-
-#if defined(PNG_READ_FILLER_SUPPORTED)
-/* Add filler channel if we have RGB color */
-void /* PRIVATE */
-png_do_read_filler(png_row_infop row_info, png_bytep row,
- png_uint_32 filler, png_uint_32 flags)
-{
- png_uint_32 i;
- png_uint_32 row_width = row_info->width;
-
- png_byte hi_filler = (png_byte)((filler>>8) & 0xff);
- png_byte lo_filler = (png_byte)(filler & 0xff);
-
- png_debug(1, "in png_do_read_filler\n");
- if (
-#if defined(PNG_USELESS_TESTS_SUPPORTED)
- row != NULL && row_info != NULL &&
-#endif
- row_info->color_type == PNG_COLOR_TYPE_GRAY)
- {
- if(row_info->bit_depth == 8)
- {
- /* This changes the data from G to GX */
- if (flags & PNG_FLAG_FILLER_AFTER)
- {
- png_bytep sp = row + (png_size_t)row_width;
- png_bytep dp = sp + (png_size_t)row_width;
- for (i = 1; i < row_width; i++)
- {
- *(--dp) = lo_filler;
- *(--dp) = *(--sp);
- }
- *(--dp) = lo_filler;
- row_info->channels = 2;
- row_info->pixel_depth = 16;
- row_info->rowbytes = row_width * 2;
- }
- /* This changes the data from G to XG */
- else
- {
- png_bytep sp = row + (png_size_t)row_width;
- png_bytep dp = sp + (png_size_t)row_width;
- for (i = 0; i < row_width; i++)
- {
- *(--dp) = *(--sp);
- *(--dp) = lo_filler;
- }
- row_info->channels = 2;
- row_info->pixel_depth = 16;
- row_info->rowbytes = row_width * 2;
- }
- }
- else if(row_info->bit_depth == 16)
- {
- /* This changes the data from GG to GGXX */
- if (flags & PNG_FLAG_FILLER_AFTER)
- {
- png_bytep sp = row + (png_size_t)row_width;
- png_bytep dp = sp + (png_size_t)row_width;
- for (i = 1; i < row_width; i++)
- {
- *(--dp) = hi_filler;
- *(--dp) = lo_filler;
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- }
- *(--dp) = hi_filler;
- *(--dp) = lo_filler;
- row_info->channels = 2;
- row_info->pixel_depth = 32;
- row_info->rowbytes = row_width * 4;
- }
- /* This changes the data from GG to XXGG */
- else
- {
- png_bytep sp = row + (png_size_t)row_width;
- png_bytep dp = sp + (png_size_t)row_width;
- for (i = 0; i < row_width; i++)
- {
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = hi_filler;
- *(--dp) = lo_filler;
- }
- row_info->channels = 2;
- row_info->pixel_depth = 32;
- row_info->rowbytes = row_width * 4;
- }
- }
- } /* COLOR_TYPE == GRAY */
- else if (row_info->color_type == PNG_COLOR_TYPE_RGB)
- {
- if(row_info->bit_depth == 8)
- {
- /* This changes the data from RGB to RGBX */
- if (flags & PNG_FLAG_FILLER_AFTER)
- {
- png_bytep sp = row + (png_size_t)row_width * 3;
- png_bytep dp = sp + (png_size_t)row_width;
- for (i = 1; i < row_width; i++)
- {
- *(--dp) = lo_filler;
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- }
- *(--dp) = lo_filler;
- row_info->channels = 4;
- row_info->pixel_depth = 32;
- row_info->rowbytes = row_width * 4;
- }
- /* This changes the data from RGB to XRGB */
- else
- {
- png_bytep sp = row + (png_size_t)row_width * 3;
- png_bytep dp = sp + (png_size_t)row_width;
- for (i = 0; i < row_width; i++)
- {
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = lo_filler;
- }
- row_info->channels = 4;
- row_info->pixel_depth = 32;
- row_info->rowbytes = row_width * 4;
- }
- }
- else if(row_info->bit_depth == 16)
- {
- /* This changes the data from RRGGBB to RRGGBBXX */
- if (flags & PNG_FLAG_FILLER_AFTER)
- {
- png_bytep sp = row + (png_size_t)row_width * 3;
- png_bytep dp = sp + (png_size_t)row_width;
- for (i = 1; i < row_width; i++)
- {
- *(--dp) = hi_filler;
- *(--dp) = lo_filler;
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- }
- *(--dp) = hi_filler;
- *(--dp) = lo_filler;
- row_info->channels = 4;
- row_info->pixel_depth = 64;
- row_info->rowbytes = row_width * 8;
- }
- /* This changes the data from RRGGBB to XXRRGGBB */
- else
- {
- png_bytep sp = row + (png_size_t)row_width * 3;
- png_bytep dp = sp + (png_size_t)row_width;
- for (i = 0; i < row_width; i++)
- {
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = *(--sp);
- *(--dp) = hi_filler;
- *(--dp) = lo_filler;
- }
- row_info->channels = 4;
- row_info->pixel_depth = 64;
- row_info->rowbytes = row_width * 8;
- }
- }
- } /* COLOR_TYPE == RGB */
-}
-#endif
-
-#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)
-/* expand grayscale files to RGB, with or without alpha */
-void /* PRIVATE */
-png_do_gray_to_rgb(png_row_infop row_info, png_bytep row)
-{
- png_uint_32 i;
- png_uint_32 row_width = row_info->width;
-
- png_debug(1, "in png_do_gray_to_rgb\n");
- if (row_info->bit_depth >= 8 &&
-#if defined(PNG_USELESS_TESTS_SUPPORTED)
- row != NULL && row_info != NULL &&
-#endif
- !(row_info->color_type & PNG_COLOR_MASK_COLOR))
- {
- if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
- {
- if (row_info->bit_depth == 8)
- {
- png_bytep sp = row + (png_size_t)row_width - 1;
- png_bytep dp = sp + (png_size_t)row_width * 2;
- for (i = 0; i < row_width; i++)
- {
- *(dp--) = *sp;
- *(dp--) = *sp;
- *(dp--) = *(sp--);
- }
- }
- else
- {
- png_bytep sp = row + (png_size_t)row_width * 2 - 1;
- png_bytep dp = sp + (png_size_t)row_width * 4;
- for (i = 0; i < row_width; i++)
- {
- *(dp--) = *sp;
- *(dp--) = *(sp - 1);
- *(dp--) = *sp;
- *(dp--) = *(sp - 1);
- *(dp--) = *(sp--);
- *(dp--) = *(sp--);
- }
- }
- }
- else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
- {
- if (row_info->bit_depth == 8)
- {
- png_bytep sp = row + (png_size_t)row_width * 2 - 1;
- png_bytep dp = sp + (png_size_t)row_width * 2;
- for (i = 0; i < row_width; i++)
- {
- *(dp--) = *(sp--);
- *(dp--) = *sp;
- *(dp--) = *sp;
- *(dp--) = *(sp--);
- }
- }
- else
- {
- png_bytep sp = row + (png_size_t)row_width * 4 - 1;
- png_bytep dp = sp + (png_size_t)row_width * 4;
- for (i = 0; i < row_width; i++)
- {
- *(dp--) = *(sp--);
- *(dp--) = *(sp--);
- *(dp--) = *sp;
- *(dp--) = *(sp - 1);
- *(dp--) = *sp;
- *(dp--) = *(sp - 1);
- *(dp--) = *(sp--);
- *(dp--) = *(sp--);
- }
- }
- }
- row_info->channels += (png_byte)2;
- row_info->color_type |= PNG_COLOR_MASK_COLOR;
- row_info->pixel_depth = (png_byte)(row_info->channels *
- row_info->bit_depth);
- row_info->rowbytes = ((row_width *
- row_info->pixel_depth + 7) >> 3);
- }
-}
-#endif
-
-#if defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
-/* reduce RGB files to grayscale, with or without alpha
- * using the equation given in Poynton's ColorFAQ at
- * <http://www.inforamp.net/~poynton/>
- * Copyright (c) 1998-01-04 Charles Poynton poynton@inforamp.net
- *
- * Y = 0.212671 * R + 0.715160 * G + 0.072169 * B
- *
- * We approximate this with
- *
- * Y = 0.21268 * R + 0.7151 * G + 0.07217 * B
- *
- * which can be expressed with integers as
- *
- * Y = (6969 * R + 23434 * G + 2365 * B)/32768
- *
- * The calculation is to be done in a linear colorspace.
- *
- * Other integer coefficents can be used via png_set_rgb_to_gray().
- */
-int /* PRIVATE */
-png_do_rgb_to_gray(png_structp png_ptr, png_row_infop row_info, png_bytep row)
-
-{
- png_uint_32 i;
-
- png_uint_32 row_width = row_info->width;
- int rgb_error = 0;
-
- png_debug(1, "in png_do_rgb_to_gray\n");
- if (
-#if defined(PNG_USELESS_TESTS_SUPPORTED)
- row != NULL && row_info != NULL &&
-#endif
- (row_info->color_type & PNG_COLOR_MASK_COLOR))
- {
- png_uint_32 rc = png_ptr->rgb_to_gray_red_coeff;
- png_uint_32 gc = png_ptr->rgb_to_gray_green_coeff;
- png_uint_32 bc = png_ptr->rgb_to_gray_blue_coeff;
-
- if (row_info->color_type == PNG_COLOR_TYPE_RGB)
- {
- if (row_info->bit_depth == 8)
- {
-#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
- if (png_ptr->gamma_from_1 != NULL && png_ptr->gamma_to_1 != NULL)
- {
- png_bytep sp = row;
- png_bytep dp = row;
-
- for (i = 0; i < row_width; i++)
- {
- png_byte red = png_ptr->gamma_to_1[*(sp++)];
- png_byte green = png_ptr->gamma_to_1[*(sp++)];
- png_byte blue = png_ptr->gamma_to_1[*(sp++)];
- if(red != green || red != blue)
- {
- rgb_error |= 1;
- *(dp++) = png_ptr->gamma_from_1[
- (rc*red+gc*green+bc*blue)>>15];
- }
- else
- *(dp++) = *(sp-1);
- }
- }
- else
-#endif
- {
- png_bytep sp = row;
- png_bytep dp = row;
- for (i = 0; i < row_width; i++)
- {
- png_byte red = *(sp++);
- png_byte green = *(sp++);
- png_byte blue = *(sp++);
- if(red != green || red != blue)
- {
- rgb_error |= 1;
- *(dp++) = (png_byte)((rc*red+gc*green+bc*blue)>>15);
- }
- else
- *(dp++) = *(sp-1);
- }
- }
- }
-
- else /* RGB bit_depth == 16 */
- {
-#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
- if (png_ptr->gamma_16_to_1 != NULL &&
- png_ptr->gamma_16_from_1 != NULL)
- {
- png_bytep sp = row;
- png_bytep dp = row;
- for (i = 0; i < row_width; i++)
- {
- png_uint_16 red, green, blue, w;
-
- red = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2;
- green = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2;
- blue = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2;
-
- if(red == green && red == blue)
- w = red;
- else
- {
- png_uint_16 red_1 = png_ptr->gamma_16_to_1[(red&0xff) >>
- png_ptr->gamma_shift][red>>8];
- png_uint_16 green_1 = png_ptr->gamma_16_to_1[(green&0xff) >>
- png_ptr->gamma_shift][green>>8];
- png_uint_16 blue_1 = png_ptr->gamma_16_to_1[(blue&0xff) >>
- png_ptr->gamma_shift][blue>>8];
- png_uint_16 gray16 = (png_uint_16)((rc*red_1 + gc*green_1
- + bc*blue_1)>>15);
- w = png_ptr->gamma_16_from_1[(gray16&0xff) >>
- png_ptr->gamma_shift][gray16 >> 8];
- rgb_error |= 1;
- }
-
- *(dp++) = (png_byte)((w>>8) & 0xff);
- *(dp++) = (png_byte)(w & 0xff);
- }
- }
- else
-#endif
- {
- png_bytep sp = row;
- png_bytep dp = row;
- for (i = 0; i < row_width; i++)
- {
- png_uint_16 red, green, blue, gray16;
-
- red = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2;
- green = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2;
- blue = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2;
-
- if(red != green || red != blue)
- rgb_error |= 1;
- gray16 = (png_uint_16)((rc*red + gc*green + bc*blue)>>15);
- *(dp++) = (png_byte)((gray16>>8) & 0xff);
- *(dp++) = (png_byte)(gray16 & 0xff);
- }
- }
- }
- }
- if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
- {
- if (row_info->bit_depth == 8)
- {
-#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
- if (png_ptr->gamma_from_1 != NULL && png_ptr->gamma_to_1 != NULL)
- {
- png_bytep sp = row;
- png_bytep dp = row;
- for (i = 0; i < row_width; i++)
- {
- png_byte red = png_ptr->gamma_to_1[*(sp++)];
- png_byte green = png_ptr->gamma_to_1[*(sp++)];
- png_byte blue = png_ptr->gamma_to_1[*(sp++)];
- if(red != green || red != blue)
- rgb_error |= 1;
- *(dp++) = png_ptr->gamma_from_1
- [(rc*red + gc*green + bc*blue)>>15];
- *(dp++) = *(sp++); /* alpha */
- }
- }
- else
-#endif
- {
- png_bytep sp = row;
- png_bytep dp = row;
- for (i = 0; i < row_width; i++)
- {
- png_byte red = *(sp++);
- png_byte green = *(sp++);
- png_byte blue = *(sp++);
- if(red != green || red != blue)
- rgb_error |= 1;
- *(dp++) = (png_byte)((gc*red + gc*green + bc*blue)>>8);
- *(dp++) = *(sp++); /* alpha */
- }
- }
- }
- else /* RGBA bit_depth == 16 */
- {
-#if defined(PNG_READ_GAMMA_SUPPORTED) || defined(PNG_READ_BACKGROUND_SUPPORTED)
- if (png_ptr->gamma_16_to_1 != NULL &&
- png_ptr->gamma_16_from_1 != NULL)
- {
- png_bytep sp = row;
- png_bytep dp = row;
- for (i = 0; i < row_width; i++)
- {
- png_uint_16 red, green, blue, w;
-
- red = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2;
- green = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2;
- blue = (png_uint_16)(((*(sp))<<8) | *(sp+1)); sp+=2;
-
- if(red == green && red == blue)
- w = red;
- else
- {
- png_uint_16 red_1 = png_ptr->gamma_16_to_1[(red&0xff) >>
- png_ptr->gamma_shift][red>>8];
- png_uint_16 green_1 = png_ptr->gamma_16_to_1[(green&0xff) >>
- png_ptr->gamma_shift][green>>8];
- png_uint_16 blue_1 = png_ptr->gamma_16_to_1[(blue&0xff) >>
- png_ptr->gamma_shift][blue>>8];
- png_uint_16 gray16 = (png_uint_16)((rc * red_1
- + gc * green_1 + bc * blue_1)>>15);
- w = png_ptr->gamma_16_from_1[(gray16&0xff) >>
- png_ptr->gamma_shift][gray16 >> 8];
- rgb_error |= 1;
- }
-
- *(dp++) = (png_byte)((w>>8) & 0xff);
- *(dp++) = (png_byte)(w & 0xff);
- *(dp++) = *(sp++); /* alpha */
- *(dp++) = *(sp++);
- }
- }
- else
-#endif
- {
- png_bytep sp = row;
- png_bytep dp = row;
- for (i = 0; i < row_width; i++)
- {
- png_uint_16 red, green, blue, gray16;
- red = (png_uint_16)((*(sp)<<8) | *(sp+1)); sp+=2;
- green = (png_uint_16)((*(sp)<<8) | *(sp+1)); sp+=2;
- blue = (png_uint_16)((*(sp)<<8) | *(sp+1)); sp+=2;
- if(red != green || red != blue)
- rgb_error |= 1;
- gray16 = (png_uint_16)((rc*red + gc*green + bc*blue)>>15);
- *(dp++) = (png_byte)((gray16>>8) & 0xff);
- *(dp++) = (png_byte)(gray16 & 0xff);
- *(dp++) = *(sp++); /* alpha */
- *(dp++) = *(sp++);
- }
- }
- }
- }
- row_info->channels -= (png_byte)2;
- row_info->color_type &= ~PNG_COLOR_MASK_COLOR;
- row_info->pixel_depth = (png_byte)(row_info->channels *
- row_info->bit_depth);
- row_info->rowbytes = ((row_width *
- row_info->pixel_depth + 7) >> 3);
- }
- return rgb_error;
-}
-#endif
-
-/* Build a grayscale palette. Palette is assumed to be 1 << bit_depth
- * large of png_color. This lets grayscale images be treated as
- * paletted. Most useful for gamma correction and simplification
- * of code.
- */
-void /* PRIVATE */
-png_build_grayscale_palette(int bit_depth, png_colorp palette)
-{
- int num_palette;
- int color_inc;
- int i;
- int v;
-
- png_debug(1, "in png_do_build_grayscale_palette\n");
- if (palette == NULL)
- return;
-
- switch (bit_depth)
- {
- case 1:
- num_palette = 2;
- color_inc = 0xff;
- break;
- case 2:
- num_palette = 4;
- color_inc = 0x55;
- break;
- case 4:
- num_palette = 16;
- color_inc = 0x11;
- break;
- case 8:
- num_palette = 256;
- color_inc = 1;
- break;
- default:
- num_palette = 0;
- color_inc = 0;
- break;
- }
-
- for (i = 0, v = 0; i < num_palette; i++, v += color_inc)
- {
- palette[i].red = (png_byte)v;
- palette[i].green = (png_byte)v;
- palette[i].blue = (png_byte)v;
- }
-}
-
-/* This function is currently unused. Do we really need it? */
-#if defined(PNG_READ_DITHER_SUPPORTED) && defined(PNG_CORRECT_PALETTE_SUPPORTED)
-void /* PRIVATE */
-png_correct_palette(png_structp png_ptr, png_colorp palette,
- int num_palette)
-{
- png_debug(1, "in png_correct_palette\n");
-#if defined(PNG_READ_BACKGROUND_SUPPORTED) && \
- defined(PNG_READ_GAMMA_SUPPORTED) && defined(PNG_FLOATING_POINT_SUPPORTED)
- if (png_ptr->transformations & (PNG_GAMMA | PNG_BACKGROUND))
- {
- png_color back, back_1;
-
- if (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_FILE)
- {
- back.red = png_ptr->gamma_table[png_ptr->background.red];
- back.green = png_ptr->gamma_table[png_ptr->background.green];
- back.blue = png_ptr->gamma_table[png_ptr->background.blue];
-
- back_1.red = png_ptr->gamma_to_1[png_ptr->background.red];
- back_1.green = png_ptr->gamma_to_1[png_ptr->background.green];
- back_1.blue = png_ptr->gamma_to_1[png_ptr->background.blue];
- }
- else
- {
- double g;
-
- g = 1.0 / (png_ptr->background_gamma * png_ptr->screen_gamma);
-
- if (png_ptr->background_gamma_type == PNG_BACKGROUND_GAMMA_SCREEN ||
- fabs(g - 1.0) < PNG_GAMMA_THRESHOLD)
- {
- back.red = png_ptr->background.red;
- back.green = png_ptr->background.green;
- back.blue = png_ptr->background.blue;
- }
- else
- {
- back.red =
- (png_byte)(pow((double)png_ptr->background.red/255, g) *
- 255.0 + 0.5);
- back.green =
- (png_byte)(pow((double)png_ptr->background.green/255, g) *
- 255.0 + 0.5);
- back.blue =
- (png_byte)(pow((double)png_ptr->background.blue/255, g) *
- 255.0 + 0.5);
- }
-
- g = 1.0 / png_ptr->background_gamma;
-
- back_1.red =
- (png_byte)(pow((double)png_ptr->background.red/255, g) *
- 255.0 + 0.5);
- back_1.green =
- (png_byte)(pow((double)png_ptr->background.green/255, g) *
- 255.0 + 0.5);
- back_1.blue =
- (png_byte)(pow((double)png_ptr->background.blue/255, g) *
- 255.0 + 0.5);
- }
-
- if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
- {
- png_uint_32 i;
-
- for (i = 0; i < (png_uint_32)num_palette; i++)
- {
- if (i < png_ptr->num_trans && png_ptr->trans[i] == 0)
- {
- palette[i] = back;
- }
- else if (i < png_ptr->num_trans && png_ptr->trans[i] != 0xff)
- {
- png_byte v, w;
-
- v = png_ptr->gamma_to_1[png_ptr->palette[i].red];
- png_composite(w, v, png_ptr->trans[i], back_1.red);
- palette[i].red = png_ptr->gamma_from_1[w];
-
- v = png_ptr->gamma_to_1[png_ptr->palette[i].green];
- png_composite(w, v, png_ptr->trans[i], back_1.green);
- palette[i].green = png_ptr->gamma_from_1[w];
-
- v = png_ptr->gamma_to_1[png_ptr->palette[i].blue];
- png_composite(w, v, png_ptr->trans[i], back_1.blue);
- palette[i].blue = png_ptr->gamma_from_1[w];
- }
- else
- {
- palette[i].red = png_ptr->gamma_table[palette[i].red];
- palette[i].green = png_ptr->gamma_table[palette[i].green];
- palette[i].blue = png_ptr->gamma_table[palette[i].blue];
- }
- }
- }
- else
- {
- int i;
-
- for (i = 0; i < num_palette; i++)
- {
- if (palette[i].red == (png_byte)png_ptr->trans_values.gray)
- {
- palette[i] = back;
- }
- else
- {
- palette[i].red = png_ptr->gamma_table[palette[i].red];
- palette[i].green = png_ptr->gamma_table[palette[i].green];
- palette[i].blue = png_ptr->gamma_table[palette[i].blue];
- }
- }
- }
- }
- else
-#endif
-#if defined(PNG_READ_GAMMA_SUPPORTED)
- if (png_ptr->transformations & PNG_GAMMA)
- {
- int i;
-
- for (i = 0; i < num_palette; i++)
- {
- palette[i].red = png_ptr->gamma_table[palette[i].red];
- palette[i].green = png_ptr->gamma_table[palette[i].green];
- palette[i].blue = png_ptr->gamma_table[palette[i].blue];
- }
- }
-#if defined(PNG_READ_BACKGROUND_SUPPORTED)
- else
-#endif
-#endif
-#if defined(PNG_READ_BACKGROUND_SUPPORTED)
- if (png_ptr->transformations & PNG_BACKGROUND)
- {
- if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
- {
- png_color back;
-
- back.red = (png_byte)png_ptr->background.red;
- back.green = (png_byte)png_ptr->background.green;
- back.blue = (png_byte)png_ptr->background.blue;
-
- for (i = 0; i < (int)png_ptr->num_trans; i++)
- {
- if (png_ptr->trans[i] == 0)
- {
- palette[i].red = back.red;
- palette[i].green = back.green;
- palette[i].blue = back.blue;
- }
- else if (png_ptr->trans[i] != 0xff)
- {
- png_composite(palette[i].red, png_ptr->palette[i].red,
- png_ptr->trans[i], back.red);
- png_composite(palette[i].green, png_ptr->palette[i].green,
- png_ptr->trans[i], back.green);
- png_composite(palette[i].blue, png_ptr->palette[i].blue,
- png_ptr->trans[i], back.blue);
- }
- }
- }
- else /* assume grayscale palette (what else could it be?) */
- {
- int i;
-
- for (i = 0; i < num_palette; i++)
- {
- if (i == (png_byte)png_ptr->trans_values.gray)
- {
- palette[i].red = (png_byte)png_ptr->background.red;
- palette[i].green = (png_byte)png_ptr->background.green;
- palette[i].blue = (png_byte)png_ptr->background.blue;
- }
- }
- }
- }
-#endif
-}
-#endif
-
-#if defined(PNG_READ_BACKGROUND_SUPPORTED)
-/* Replace any alpha or transparency with the supplied background color.
- * "background" is already in the screen gamma, while "background_1" is
- * at a gamma of 1.0. Paletted files have already been taken care of.
- */
-void /* PRIVATE */
-png_do_background(png_row_infop row_info, png_bytep row,
- png_color_16p trans_values, png_color_16p background
-#if defined(PNG_READ_GAMMA_SUPPORTED)
- , png_color_16p background_1,
- png_bytep gamma_table, png_bytep gamma_from_1, png_bytep gamma_to_1,
- png_uint_16pp gamma_16, png_uint_16pp gamma_16_from_1,
- png_uint_16pp gamma_16_to_1, int gamma_shift
-#endif
- )
-{
- png_bytep sp, dp;
- png_uint_32 i;
- png_uint_32 row_width=row_info->width;
- int shift;
-
- png_debug(1, "in png_do_background\n");
- if (background != NULL &&
-#if defined(PNG_USELESS_TESTS_SUPPORTED)
- row != NULL && row_info != NULL &&
-#endif
- (!(row_info->color_type & PNG_COLOR_MASK_ALPHA) ||
- (row_info->color_type != PNG_COLOR_TYPE_PALETTE && trans_values)))
- {
- switch (row_info->color_type)
- {
- case PNG_COLOR_TYPE_GRAY:
- {
- switch (row_info->bit_depth)
- {
- case 1:
- {
- sp = row;
- shift = 7;
- for (i = 0; i < row_width; i++)
- {
- if ((png_uint_16)((*sp >> shift) & 0x01)
- == trans_values->gray)
- {
- *sp &= (png_byte)((0x7f7f >> (7 - shift)) & 0xff);
- *sp |= (png_byte)(background->gray << shift);
- }
- if (!shift)
- {
- shift = 7;
- sp++;
- }
- else
- shift--;
- }
- break;
- }
- case 2:
- {
-#if defined(PNG_READ_GAMMA_SUPPORTED)
- if (gamma_table != NULL)
- {
- sp = row;
- shift = 6;
- for (i = 0; i < row_width; i++)
- {
- if ((png_uint_16)((*sp >> shift) & 0x03)
- == trans_values->gray)
- {
- *sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff);
- *sp |= (png_byte)(background->gray << shift);
- }
- else
- {
- png_byte p = (png_byte)((*sp >> shift) & 0x03);
- png_byte g = (png_byte)((gamma_table [p | (p << 2) |
- (p << 4) | (p << 6)] >> 6) & 0x03);
- *sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff);
- *sp |= (png_byte)(g << shift);
- }
- if (!shift)
- {
- shift = 6;
- sp++;
- }
- else
- shift -= 2;
- }
- }
- else
-#endif
- {
- sp = row;
- shift = 6;
- for (i = 0; i < row_width; i++)
- {
- if ((png_uint_16)((*sp >> shift) & 0x03)
- == trans_values->gray)
- {
- *sp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff);
- *sp |= (png_byte)(background->gray << shift);
- }
- if (!shift)
- {
- shift = 6;
- sp++;
- }
- else
- shift -= 2;
- }
- }
- break;
- }
- case 4:
- {
-#if defined(PNG_READ_GAMMA_SUPPORTED)
- if (gamma_table != NULL)
- {
- sp = row;
- shift = 4;
- for (i = 0; i < row_width; i++)
- {
- if ((png_uint_16)((*sp >> shift) & 0x0f)
- == trans_values->gray)
- {
- *sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff);
- *sp |= (png_byte)(background->gray << shift);
- }
- else
- {
- png_byte p = (png_byte)((*sp >> shift) & 0x0f);
- png_byte g = (png_byte)((gamma_table[p |
- (p << 4)] >> 4) & 0x0f);
- *sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff);
- *sp |= (png_byte)(g << shift);
- }
- if (!shift)
- {
- shift = 4;
- sp++;
- }
- else
- shift -= 4;
- }
- }
- else
-#endif
- {
- sp = row;
- shift = 4;
- for (i = 0; i < row_width; i++)
- {
- if ((png_uint_16)((*sp >> shift) & 0x0f)
- == trans_values->gray)
- {
- *sp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff);
- *sp |= (png_byte)(background->gray << shift);
- }
- if (!shift)
- {
- shift = 4;
- sp++;
- }
- else
- shift -= 4;
- }
- }
- break;
- }
- case 8:
- {
-#if defined(PNG_READ_GAMMA_SUPPORTED)
- if (gamma_table != NULL)
- {
- sp = row;
- for (i = 0; i < row_width; i++, sp++)
- {
- if (*sp == trans_values->gray)
- {
- *sp = (png_byte)background->gray;
- }
- else
- {
- *sp = gamma_table[*sp];
- }
- }
- }
- else
-#endif
- {
- sp = row;
- for (i = 0; i < row_width; i++, sp++)
- {
- if (*sp == trans_values->gray)
- {
- *sp = (png_byte)background->gray;
- }
- }
- }
- break;
- }
- case 16:
- {
-#if defined(PNG_READ_GAMMA_SUPPORTED)
- if (gamma_16 != NULL)
- {
- sp = row;
- for (i = 0; i < row_width; i++, sp += 2)
- {
- png_uint_16 v;
-
- v = (png_uint_16)(((*sp) << 8) + *(sp + 1));
- if (v == trans_values->gray)
- {
- /* background is already in screen gamma */
- *sp = (png_byte)((background->gray >> 8) & 0xff);
- *(sp + 1) = (png_byte)(background->gray & 0xff);
- }
- else
- {
- v = gamma_16[*(sp + 1) >> gamma_shift][*sp];
- *sp = (png_byte)((v >> 8) & 0xff);
- *(sp + 1) = (png_byte)(v & 0xff);
- }
- }
- }
- else
-#endif
- {
- sp = row;
- for (i = 0; i < row_width; i++, sp += 2)
- {
- png_uint_16 v;
-
- v = (png_uint_16)(((*sp) << 8) + *(sp + 1));
- if (v == trans_values->gray)
- {
- *sp = (png_byte)((background->gray >> 8) & 0xff);
- *(sp + 1) = (png_byte)(background->gray & 0xff);
- }
- }
- }
- break;
- }
- }
- break;
- }
- case PNG_COLOR_TYPE_RGB:
- {
- if (row_info->bit_depth == 8)
- {
-#if defined(PNG_READ_GAMMA_SUPPORTED)
- if (gamma_table != NULL)
- {
- sp = row;
- for (i = 0; i < row_width; i++, sp += 3)
- {
- if (*sp == trans_values->red &&
- *(sp + 1) == trans_values->green &&
- *(sp + 2) == trans_values->blue)
- {
- *sp = (png_byte)background->red;
- *(sp + 1) = (png_byte)background->green;
- *(sp + 2) = (png_byte)background->blue;
- }
- else
- {
- *sp = gamma_table[*sp];
- *(sp + 1) = gamma_table[*(sp + 1)];
- *(sp + 2) = gamma_table[*(sp + 2)];
- }
- }
- }
- else
-#endif
- {
- sp = row;
- for (i = 0; i < row_width; i++, sp += 3)
- {
- if (*sp == trans_values->red &&
- *(sp + 1) == trans_values->green &&
- *(sp + 2) == trans_values->blue)
- {
- *sp = (png_byte)background->red;
- *(sp + 1) = (png_byte)background->green;
- *(sp + 2) = (png_byte)background->blue;
- }
- }
- }
- }
- else /* if (row_info->bit_depth == 16) */
- {
-#if defined(PNG_READ_GAMMA_SUPPORTED)
- if (gamma_16 != NULL)
- {
- sp = row;
- for (i = 0; i < row_width; i++, sp += 6)
- {
- png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1));
- png_uint_16 g = (png_uint_16)(((*(sp+2)) << 8) + *(sp+3));
- png_uint_16 b = (png_uint_16)(((*(sp+4)) << 8) + *(sp+5));
- if (r == trans_values->red && g == trans_values->green &&
- b == trans_values->blue)
- {
- /* background is already in screen gamma */
- *sp = (png_byte)((background->red >> 8) & 0xff);
- *(sp + 1) = (png_byte)(background->red & 0xff);
- *(sp + 2) = (png_byte)((background->green >> 8) & 0xff);
- *(sp + 3) = (png_byte)(background->green & 0xff);
- *(sp + 4) = (png_byte)((background->blue >> 8) & 0xff);
- *(sp + 5) = (png_byte)(background->blue & 0xff);
- }
- else
- {
- png_uint_16 v = gamma_16[*(sp + 1) >> gamma_shift][*sp];
- *sp = (png_byte)((v >> 8) & 0xff);
- *(sp + 1) = (png_byte)(v & 0xff);
- v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)];
- *(sp + 2) = (png_byte)((v >> 8) & 0xff);
- *(sp + 3) = (png_byte)(v & 0xff);
- v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)];
- *(sp + 4) = (png_byte)((v >> 8) & 0xff);
- *(sp + 5) = (png_byte)(v & 0xff);
- }
- }
- }
- else
-#endif
- {
- sp = row;
- for (i = 0; i < row_width; i++, sp += 6)
- {
- png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp+1));
- png_uint_16 g = (png_uint_16)(((*(sp+2)) << 8) + *(sp+3));
- png_uint_16 b = (png_uint_16)(((*(sp+4)) << 8) + *(sp+5));
-
- if (r == trans_values->red && g == trans_values->green &&
- b == trans_values->blue)
- {
- *sp = (png_byte)((background->red >> 8) & 0xff);
- *(sp + 1) = (png_byte)(background->red & 0xff);
- *(sp + 2) = (png_byte)((background->green >> 8) & 0xff);
- *(sp + 3) = (png_byte)(background->green & 0xff);
- *(sp + 4) = (png_byte)((background->blue >> 8) & 0xff);
- *(sp + 5) = (png_byte)(background->blue & 0xff);
- }
- }
- }
- }
- break;
- }
- case PNG_COLOR_TYPE_GRAY_ALPHA:
- {
- if (row_info->bit_depth == 8)
- {
-#if defined(PNG_READ_GAMMA_SUPPORTED)
- if (gamma_to_1 != NULL && gamma_from_1 != NULL &&
- gamma_table != NULL)
- {
- sp = row;
- dp = row;
- for (i = 0; i < row_width; i++, sp += 2, dp++)
- {
- png_uint_16 a = *(sp + 1);
-
- if (a == 0xff)
- {
- *dp = gamma_table[*sp];
- }
- else if (a == 0)
- {
- /* background is already in screen gamma */
- *dp = (png_byte)background->gray;
- }
- else
- {
- png_byte v, w;
-
- v = gamma_to_1[*sp];
- png_composite(w, v, a, background_1->gray);
- *dp = gamma_from_1[w];
- }
- }
- }
- else
-#endif
- {
- sp = row;
- dp = row;
- for (i = 0; i < row_width; i++, sp += 2, dp++)
- {
- png_byte a = *(sp + 1);
-
- if (a == 0xff)
- {
- *dp = *sp;
- }
-#if defined(PNG_READ_GAMMA_SUPPORTED)
- else if (a == 0)
- {
- *dp = (png_byte)background->gray;
- }
- else
- {
- png_composite(*dp, *sp, a, background_1->gray);
- }
-#else
- *dp = (png_byte)background->gray;
-#endif
- }
- }
- }
- else /* if (png_ptr->bit_depth == 16) */
- {
-#if defined(PNG_READ_GAMMA_SUPPORTED)
- if (gamma_16 != NULL && gamma_16_from_1 != NULL &&
- gamma_16_to_1 != NULL)
- {
- sp = row;
- dp = row;
- for (i = 0; i < row_width; i++, sp += 4, dp += 2)
- {
- png_uint_16 a = (png_uint_16)(((*(sp+2)) << 8) + *(sp+3));
-
- if (a == (png_uint_16)0xffff)
- {
- png_uint_16 v;
-
- v = gamma_16[*(sp + 1) >> gamma_shift][*sp];
- *dp = (png_byte)((v >> 8) & 0xff);
- *(dp + 1) = (png_byte)(v & 0xff);
- }
-#if defined(PNG_READ_GAMMA_SUPPORTED)
- else if (a == 0)
-#else
- else
-#endif
- {
- /* background is already in screen gamma */
- *dp = (png_byte)((background->gray >> 8) & 0xff);
- *(dp + 1) = (png_byte)(background->gray & 0xff);
- }
-#if defined(PNG_READ_GAMMA_SUPPORTED)
- else
- {
- png_uint_16 g, v, w;
-
- g = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp];
- png_composite_16(v, g, a, background_1->gray);
- w = gamma_16_from_1[(v&0xff) >> gamma_shift][v >> 8];
- *dp = (png_byte)((w >> 8) & 0xff);
- *(dp + 1) = (png_byte)(w & 0xff);
- }
-#endif
- }
- }
- else
-#endif
- {
- sp = row;
- dp = row;
- for (i = 0; i < row_width; i++, sp += 4, dp += 2)
- {
- png_uint_16 a = (png_uint_16)(((*(sp+2)) << 8) + *(sp+3));
- if (a == (png_uint_16)0xffff)
- {
- png_memcpy(dp, sp, 2);
- }
-#if defined(PNG_READ_GAMMA_SUPPORTED)
- else if (a == 0)
-#else
- else
-#endif
- {
- *dp = (png_byte)((background->gray >> 8) & 0xff);
- *(dp + 1) = (png_byte)(background->gray & 0xff);
- }
-#if defined(PNG_READ_GAMMA_SUPPORTED)
- else
- {
- png_uint_16 g, v;
-
- g = (png_uint_16)(((*sp) << 8) + *(sp + 1));
- png_composite_16(v, g, a, background_1->gray);
- *dp = (png_byte)((v >> 8) & 0xff);
- *(dp + 1) = (png_byte)(v & 0xff);
- }
-#endif
- }
- }
- }
- break;
- }
- case PNG_COLOR_TYPE_RGB_ALPHA:
- {
- if (row_info->bit_depth == 8)
- {
-#if defined(PNG_READ_GAMMA_SUPPORTED)
- if (gamma_to_1 != NULL && gamma_from_1 != NULL &&
- gamma_table != NULL)
- {
- sp = row;
- dp = row;
- for (i = 0; i < row_width; i++, sp += 4, dp += 3)
- {
- png_byte a = *(sp + 3);
-
- if (a == 0xff)
- {
- *dp = gamma_table[*sp];
- *(dp + 1) = gamma_table[*(sp + 1)];
- *(dp + 2) = gamma_table[*(sp + 2)];
- }
- else if (a == 0)
- {
- /* background is already in screen gamma */
- *dp = (png_byte)background->red;
- *(dp + 1) = (png_byte)background->green;
- *(dp + 2) = (png_byte)background->blue;
- }
- else
- {
- png_byte v, w;
-
- v = gamma_to_1[*sp];
- png_composite(w, v, a, background_1->red);
- *dp = gamma_from_1[w];
- v = gamma_to_1[*(sp + 1)];
- png_composite(w, v, a, background_1->green);
- *(dp + 1) = gamma_from_1[w];
- v = gamma_to_1[*(sp + 2)];
- png_composite(w, v, a, background_1->blue);
- *(dp + 2) = gamma_from_1[w];
- }
- }
- }
- else
-#endif
- {
- sp = row;
- dp = row;
- for (i = 0; i < row_width; i++, sp += 4, dp += 3)
- {
- png_byte a = *(sp + 3);
-
- if (a == 0xff)
- {
- *dp = *sp;
- *(dp + 1) = *(sp + 1);
- *(dp + 2) = *(sp + 2);
- }
- else if (a == 0)
- {
- *dp = (png_byte)background->red;
- *(dp + 1) = (png_byte)background->green;
- *(dp + 2) = (png_byte)background->blue;
- }
- else
- {
- png_composite(*dp, *sp, a, background->red);
- png_composite(*(dp + 1), *(sp + 1), a,
- background->green);
- png_composite(*(dp + 2), *(sp + 2), a,
- background->blue);
- }
- }
- }
- }
- else /* if (row_info->bit_depth == 16) */
- {
-#if defined(PNG_READ_GAMMA_SUPPORTED)
- if (gamma_16 != NULL && gamma_16_from_1 != NULL &&
- gamma_16_to_1 != NULL)
- {
- sp = row;
- dp = row;
- for (i = 0; i < row_width; i++, sp += 8, dp += 6)
- {
- png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6))
- << 8) + (png_uint_16)(*(sp + 7)));
- if (a == (png_uint_16)0xffff)
- {
- png_uint_16 v;
-
- v = gamma_16[*(sp + 1) >> gamma_shift][*sp];
- *dp = (png_byte)((v >> 8) & 0xff);
- *(dp + 1) = (png_byte)(v & 0xff);
- v = gamma_16[*(sp + 3) >> gamma_shift][*(sp + 2)];
- *(dp + 2) = (png_byte)((v >> 8) & 0xff);
- *(dp + 3) = (png_byte)(v & 0xff);
- v = gamma_16[*(sp + 5) >> gamma_shift][*(sp + 4)];
- *(dp + 4) = (png_byte)((v >> 8) & 0xff);
- *(dp + 5) = (png_byte)(v & 0xff);
- }
- else if (a == 0)
- {
- /* background is already in screen gamma */
- *dp = (png_byte)((background->red >> 8) & 0xff);
- *(dp + 1) = (png_byte)(background->red & 0xff);
- *(dp + 2) = (png_byte)((background->green >> 8) & 0xff);
- *(dp + 3) = (png_byte)(background->green & 0xff);
- *(dp + 4) = (png_byte)((background->blue >> 8) & 0xff);
- *(dp + 5) = (png_byte)(background->blue & 0xff);
- }
- else
- {
- png_uint_16 v, w, x;
-
- v = gamma_16_to_1[*(sp + 1) >> gamma_shift][*sp];
- png_composite_16(w, v, a, background->red);
- x = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8];
- *dp = (png_byte)((x >> 8) & 0xff);
- *(dp + 1) = (png_byte)(x & 0xff);
- v = gamma_16_to_1[*(sp + 3) >> gamma_shift][*(sp + 2)];
- png_composite_16(w, v, a, background->green);
- x = gamma_16_from_1[((w&0xff) >> gamma_shift)][w >> 8];
- *(dp + 2) = (png_byte)((x >> 8) & 0xff);
- *(dp + 3) = (png_byte)(x & 0xff);
- v = gamma_16_to_1[*(sp + 5) >> gamma_shift][*(sp + 4)];
- png_composite_16(w, v, a, background->blue);
- x = gamma_16_from_1[(w & 0xff) >> gamma_shift][w >> 8];
- *(dp + 4) = (png_byte)((x >> 8) & 0xff);
- *(dp + 5) = (png_byte)(x & 0xff);
- }
- }
- }
- else
-#endif
- {
- sp = row;
- dp = row;
- for (i = 0; i < row_width; i++, sp += 8, dp += 6)
- {
- png_uint_16 a = (png_uint_16)(((png_uint_16)(*(sp + 6))
- << 8) + (png_uint_16)(*(sp + 7)));
- if (a == (png_uint_16)0xffff)
- {
- png_memcpy(dp, sp, 6);
- }
- else if (a == 0)
- {
- *dp = (png_byte)((background->red >> 8) & 0xff);
- *(dp + 1) = (png_byte)(background->red & 0xff);
- *(dp + 2) = (png_byte)((background->green >> 8) & 0xff);
- *(dp + 3) = (png_byte)(background->green & 0xff);
- *(dp + 4) = (png_byte)((background->blue >> 8) & 0xff);
- *(dp + 5) = (png_byte)(background->blue & 0xff);
- }
- else
- {
- png_uint_16 v;
-
- png_uint_16 r = (png_uint_16)(((*sp) << 8) + *(sp + 1));
- png_uint_16 g = (png_uint_16)(((*(sp + 2)) << 8)
- + *(sp + 3));
- png_uint_16 b = (png_uint_16)(((*(sp + 4)) << 8)
- + *(sp + 5));
-
- png_composite_16(v, r, a, background->red);
- *dp = (png_byte)((v >> 8) & 0xff);
- *(dp + 1) = (png_byte)(v & 0xff);
- png_composite_16(v, g, a, background->green);
- *(dp + 2) = (png_byte)((v >> 8) & 0xff);
- *(dp + 3) = (png_byte)(v & 0xff);
- png_composite_16(v, b, a, background->blue);
- *(dp + 4) = (png_byte)((v >> 8) & 0xff);
- *(dp + 5) = (png_byte)(v & 0xff);
- }
- }
- }
- }
- break;
- }
- }
-
- if (row_info->color_type & PNG_COLOR_MASK_ALPHA)
- {
- row_info->color_type &= ~PNG_COLOR_MASK_ALPHA;
- row_info->channels--;
- row_info->pixel_depth = (png_byte)(row_info->channels *
- row_info->bit_depth);
- row_info->rowbytes = ((row_width *
- row_info->pixel_depth + 7) >> 3);
- }
- }
-}
-#endif
-
-#if defined(PNG_READ_GAMMA_SUPPORTED)
-/* Gamma correct the image, avoiding the alpha channel. Make sure
- * you do this after you deal with the transparency issue on grayscale
- * or RGB images. If your bit depth is 8, use gamma_table, if it
- * is 16, use gamma_16_table and gamma_shift. Build these with
- * build_gamma_table().
- */
-void /* PRIVATE */
-png_do_gamma(png_row_infop row_info, png_bytep row,
- png_bytep gamma_table, png_uint_16pp gamma_16_table,
- int gamma_shift)
-{
- png_bytep sp;
- png_uint_32 i;
- png_uint_32 row_width=row_info->width;
-
- png_debug(1, "in png_do_gamma\n");
- if (
-#if defined(PNG_USELESS_TESTS_SUPPORTED)
- row != NULL && row_info != NULL &&
-#endif
- ((row_info->bit_depth <= 8 && gamma_table != NULL) ||
- (row_info->bit_depth == 16 && gamma_16_table != NULL)))
- {
- switch (row_info->color_type)
- {
- case PNG_COLOR_TYPE_RGB:
- {
- if (row_info->bit_depth == 8)
- {
- sp = row;
- for (i = 0; i < row_width; i++)
- {
- *sp = gamma_table[*sp];
- sp++;
- *sp = gamma_table[*sp];
- sp++;
- *sp = gamma_table[*sp];
- sp++;
- }
- }
- else /* if (row_info->bit_depth == 16) */
- {
- sp = row;
- for (i = 0; i < row_width; i++)
- {
- png_uint_16 v;
-
- v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp];
- *sp = (png_byte)((v >> 8) & 0xff);
- *(sp + 1) = (png_byte)(v & 0xff);
- sp += 2;
- v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp];
- *sp = (png_byte)((v >> 8) & 0xff);
- *(sp + 1) = (png_byte)(v & 0xff);
- sp += 2;
- v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp];
- *sp = (png_byte)((v >> 8) & 0xff);
- *(sp + 1) = (png_byte)(v & 0xff);
- sp += 2;
- }
- }
- break;
- }
- case PNG_COLOR_TYPE_RGB_ALPHA:
- {
- if (row_info->bit_depth == 8)
- {
- sp = row;
- for (i = 0; i < row_width; i++)
- {
- *sp = gamma_table[*sp];
- sp++;
- *sp = gamma_table[*sp];
- sp++;
- *sp = gamma_table[*sp];
- sp++;
- sp++;
- }
- }
- else /* if (row_info->bit_depth == 16) */
- {
- sp = row;
- for (i = 0; i < row_width; i++)
- {
- png_uint_16 v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp];
- *sp = (png_byte)((v >> 8) & 0xff);
- *(sp + 1) = (png_byte)(v & 0xff);
- sp += 2;
- v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp];
- *sp = (png_byte)((v >> 8) & 0xff);
- *(sp + 1) = (png_byte)(v & 0xff);
- sp += 2;
- v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp];
- *sp = (png_byte)((v >> 8) & 0xff);
- *(sp + 1) = (png_byte)(v & 0xff);
- sp += 4;
- }
- }
- break;
- }
- case PNG_COLOR_TYPE_GRAY_ALPHA:
- {
- if (row_info->bit_depth == 8)
- {
- sp = row;
- for (i = 0; i < row_width; i++)
- {
- *sp = gamma_table[*sp];
- sp += 2;
- }
- }
- else /* if (row_info->bit_depth == 16) */
- {
- sp = row;
- for (i = 0; i < row_width; i++)
- {
- png_uint_16 v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp];
- *sp = (png_byte)((v >> 8) & 0xff);
- *(sp + 1) = (png_byte)(v & 0xff);
- sp += 4;
- }
- }
- break;
- }
- case PNG_COLOR_TYPE_GRAY:
- {
- if (row_info->bit_depth == 2)
- {
- sp = row;
- for (i = 0; i < row_width; i += 4)
- {
- int a = *sp & 0xc0;
- int b = *sp & 0x30;
- int c = *sp & 0x0c;
- int d = *sp & 0x03;
-
- *sp = (png_byte)(
- ((((int)gamma_table[a|(a>>2)|(a>>4)|(a>>6)]) ) & 0xc0)|
- ((((int)gamma_table[(b<<2)|b|(b>>2)|(b>>4)])>>2) & 0x30)|
- ((((int)gamma_table[(c<<4)|(c<<2)|c|(c>>2)])>>4) & 0x0c)|
- ((((int)gamma_table[(d<<6)|(d<<4)|(d<<2)|d])>>6) ));
- sp++;
- }
- }
- if (row_info->bit_depth == 4)
- {
- sp = row;
- for (i = 0; i < row_width; i += 2)
- {
- int msb = *sp & 0xf0;
- int lsb = *sp & 0x0f;
-
- *sp = (png_byte)((((int)gamma_table[msb | (msb >> 4)]) & 0xf0)
- | (((int)gamma_table[(lsb << 4) | lsb]) >> 4));
- sp++;
- }
- }
- else if (row_info->bit_depth == 8)
- {
- sp = row;
- for (i = 0; i < row_width; i++)
- {
- *sp = gamma_table[*sp];
- sp++;
- }
- }
- else if (row_info->bit_depth == 16)
- {
- sp = row;
- for (i = 0; i < row_width; i++)
- {
- png_uint_16 v = gamma_16_table[*(sp + 1) >> gamma_shift][*sp];
- *sp = (png_byte)((v >> 8) & 0xff);
- *(sp + 1) = (png_byte)(v & 0xff);
- sp += 2;
- }
- }
- break;
- }
- }
- }
-}
-#endif
-
-#if defined(PNG_READ_EXPAND_SUPPORTED)
-/* Expands a palette row to an RGB or RGBA row depending
- * upon whether you supply trans and num_trans.
- */
-void /* PRIVATE */
-png_do_expand_palette(png_row_infop row_info, png_bytep row,
- png_colorp palette, png_bytep trans, int num_trans)
-{
- int shift, value;
- png_bytep sp, dp;
- png_uint_32 i;
- png_uint_32 row_width=row_info->width;
-
- png_debug(1, "in png_do_expand_palette\n");
- if (
-#if defined(PNG_USELESS_TESTS_SUPPORTED)
- row != NULL && row_info != NULL &&
-#endif
- row_info->color_type == PNG_COLOR_TYPE_PALETTE)
- {
- if (row_info->bit_depth < 8)
- {
- switch (row_info->bit_depth)
- {
- case 1:
- {
- sp = row + (png_size_t)((row_width - 1) >> 3);
- dp = row + (png_size_t)row_width - 1;
- shift = 7 - (int)((row_width + 7) & 0x07);
- for (i = 0; i < row_width; i++)
- {
- if ((*sp >> shift) & 0x01)
- *dp = 1;
- else
- *dp = 0;
- if (shift == 7)
- {
- shift = 0;
- sp--;
- }
- else
- shift++;
-
- dp--;
- }
- break;
- }
- case 2:
- {
- sp = row + (png_size_t)((row_width - 1) >> 2);
- dp = row + (png_size_t)row_width - 1;
- shift = (int)((3 - ((row_width + 3) & 0x03)) << 1);
- for (i = 0; i < row_width; i++)
- {
- value = (*sp >> shift) & 0x03;
- *dp = (png_byte)value;
- if (shift == 6)
- {
- shift = 0;
- sp--;
- }
- else
- shift += 2;
-
- dp--;
- }
- break;
- }
- case 4:
- {
- sp = row + (png_size_t)((row_width - 1) >> 1);
- dp = row + (png_size_t)row_width - 1;
- shift = (int)((row_width & 0x01) << 2);
- for (i = 0; i < row_width; i++)
- {
- value = (*sp >> shift) & 0x0f;
- *dp = (png_byte)value;
- if (shift == 4)
- {
- shift = 0;
- sp--;
- }
- else
- shift += 4;
-
- dp--;
- }
- break;
- }
- }
- row_info->bit_depth = 8;
- row_info->pixel_depth = 8;
- row_info->rowbytes = row_width;
- }
- switch (row_info->bit_depth)
- {
- case 8:
- {
- if (trans != NULL)
- {
- sp = row + (png_size_t)row_width - 1;
- dp = row + (png_size_t)(row_width << 2) - 1;
-
- for (i = 0; i < row_width; i++)
- {
- if ((int)(*sp) >= num_trans)
- *dp-- = 0xff;
- else
- *dp-- = trans[*sp];
- *dp-- = palette[*sp].blue;
- *dp-- = palette[*sp].green;
- *dp-- = palette[*sp].red;
- sp--;
- }
- row_info->bit_depth = 8;
- row_info->pixel_depth = 32;
- row_info->rowbytes = row_width * 4;
- row_info->color_type = 6;
- row_info->channels = 4;
- }
- else
- {
- sp = row + (png_size_t)row_width - 1;
- dp = row + (png_size_t)(row_width * 3) - 1;
-
- for (i = 0; i < row_width; i++)
- {
- *dp-- = palette[*sp].blue;
- *dp-- = palette[*sp].green;
- *dp-- = palette[*sp].red;
- sp--;
- }
- row_info->bit_depth = 8;
- row_info->pixel_depth = 24;
- row_info->rowbytes = row_width * 3;
- row_info->color_type = 2;
- row_info->channels = 3;
- }
- break;
- }
- }
- }
-}
-
-/* If the bit depth < 8, it is expanded to 8. Also, if the
- * transparency value is supplied, an alpha channel is built.
- */
-void /* PRIVATE */
-png_do_expand(png_row_infop row_info, png_bytep row,
- png_color_16p trans_value)
-{
- int shift, value;
- png_bytep sp, dp;
- png_uint_32 i;
- png_uint_32 row_width=row_info->width;
-
- png_debug(1, "in png_do_expand\n");
-#if defined(PNG_USELESS_TESTS_SUPPORTED)
- if (row != NULL && row_info != NULL)
-#endif
- {
- if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
- {
- png_uint_16 gray = (png_uint_16)(trans_value ? trans_value->gray : 0);
-
- if (row_info->bit_depth < 8)
- {
- switch (row_info->bit_depth)
- {
- case 1:
- {
- gray = (png_uint_16)(gray*0xff);
- sp = row + (png_size_t)((row_width - 1) >> 3);
- dp = row + (png_size_t)row_width - 1;
- shift = 7 - (int)((row_width + 7) & 0x07);
- for (i = 0; i < row_width; i++)
- {
- if ((*sp >> shift) & 0x01)
- *dp = 0xff;
- else
- *dp = 0;
- if (shift == 7)
- {
- shift = 0;
- sp--;
- }
- else
- shift++;
-
- dp--;
- }
- break;
- }
- case 2:
- {
- gray = (png_uint_16)(gray*0x55);
- sp = row + (png_size_t)((row_width - 1) >> 2);
- dp = row + (png_size_t)row_width - 1;
- shift = (int)((3 - ((row_width + 3) & 0x03)) << 1);
- for (i = 0; i < row_width; i++)
- {
- value = (*sp >> shift) & 0x03;
- *dp = (png_byte)(value | (value << 2) | (value << 4) |
- (value << 6));
- if (shift == 6)
- {
- shift = 0;
- sp--;
- }
- else
- shift += 2;
-
- dp--;
- }
- break;
- }
- case 4:
- {
- gray = (png_uint_16)(gray*0x11);
- sp = row + (png_size_t)((row_width - 1) >> 1);
- dp = row + (png_size_t)row_width - 1;
- shift = (int)((1 - ((row_width + 1) & 0x01)) << 2);
- for (i = 0; i < row_width; i++)
- {
- value = (*sp >> shift) & 0x0f;
- *dp = (png_byte)(value | (value << 4));
- if (shift == 4)
- {
- shift = 0;
- sp--;
- }
- else
- shift = 4;
-
- dp--;
- }
- break;
- }
- }
- row_info->bit_depth = 8;
- row_info->pixel_depth = 8;
- row_info->rowbytes = row_width;
- }
-
- if (trans_value != NULL)
- {
- if (row_info->bit_depth == 8)
- {
- sp = row + (png_size_t)row_width - 1;
- dp = row + (png_size_t)(row_width << 1) - 1;
- for (i = 0; i < row_width; i++)
- {
- if (*sp == gray)
- *dp-- = 0;
- else
- *dp-- = 0xff;
- *dp-- = *sp--;
- }
- }
- else if (row_info->bit_depth == 16)
- {
- sp = row + row_info->rowbytes - 1;
- dp = row + (row_info->rowbytes << 1) - 1;
- for (i = 0; i < row_width; i++)
- {
- if (((png_uint_16)*(sp) |
- ((png_uint_16)*(sp - 1) << 8)) == gray)
- {
- *dp-- = 0;
- *dp-- = 0;
- }
- else
- {
- *dp-- = 0xff;
- *dp-- = 0xff;
- }
- *dp-- = *sp--;
- *dp-- = *sp--;
- }
- }
- row_info->color_type = PNG_COLOR_TYPE_GRAY_ALPHA;
- row_info->channels = 2;
- row_info->pixel_depth = (png_byte)(row_info->bit_depth << 1);
- row_info->rowbytes =
- ((row_width * row_info->pixel_depth) >> 3);
- }
- }
- else if (row_info->color_type == PNG_COLOR_TYPE_RGB && trans_value)
- {
- if (row_info->bit_depth == 8)
- {
- sp = row + (png_size_t)row_info->rowbytes - 1;
- dp = row + (png_size_t)(row_width << 2) - 1;
- for (i = 0; i < row_width; i++)
- {
- if (*(sp - 2) == trans_value->red &&
- *(sp - 1) == trans_value->green &&
- *(sp - 0) == trans_value->blue)
- *dp-- = 0;
- else
- *dp-- = 0xff;
- *dp-- = *sp--;
- *dp-- = *sp--;
- *dp-- = *sp--;
- }
- }
- else if (row_info->bit_depth == 16)
- {
- sp = row + row_info->rowbytes - 1;
- dp = row + (png_size_t)(row_width << 3) - 1;
- for (i = 0; i < row_width; i++)
- {
- if ((((png_uint_16)*(sp - 4) |
- ((png_uint_16)*(sp - 5) << 8)) == trans_value->red) &&
- (((png_uint_16)*(sp - 2) |
- ((png_uint_16)*(sp - 3) << 8)) == trans_value->green) &&
- (((png_uint_16)*(sp - 0) |
- ((png_uint_16)*(sp - 1) << 8)) == trans_value->blue))
- {
- *dp-- = 0;
- *dp-- = 0;
- }
- else
- {
- *dp-- = 0xff;
- *dp-- = 0xff;
- }
- *dp-- = *sp--;
- *dp-- = *sp--;
- *dp-- = *sp--;
- *dp-- = *sp--;
- *dp-- = *sp--;
- *dp-- = *sp--;
- }
- }
- row_info->color_type = PNG_COLOR_TYPE_RGB_ALPHA;
- row_info->channels = 4;
- row_info->pixel_depth = (png_byte)(row_info->bit_depth << 2);
- row_info->rowbytes =
- ((row_width * row_info->pixel_depth) >> 3);
- }
- }
-}
-#endif
-
-#if defined(PNG_READ_DITHER_SUPPORTED)
-void /* PRIVATE */
-png_do_dither(png_row_infop row_info, png_bytep row,
- png_bytep palette_lookup, png_bytep dither_lookup)
-{
- png_bytep sp, dp;
- png_uint_32 i;
- png_uint_32 row_width=row_info->width;
-
- png_debug(1, "in png_do_dither\n");
-#if defined(PNG_USELESS_TESTS_SUPPORTED)
- if (row != NULL && row_info != NULL)
-#endif
- {
- if (row_info->color_type == PNG_COLOR_TYPE_RGB &&
- palette_lookup && row_info->bit_depth == 8)
- {
- int r, g, b, p;
- sp = row;
- dp = row;
- for (i = 0; i < row_width; i++)
- {
- r = *sp++;
- g = *sp++;
- b = *sp++;
-
- /* this looks real messy, but the compiler will reduce
- it down to a reasonable formula. For example, with
- 5 bits per color, we get:
- p = (((r >> 3) & 0x1f) << 10) |
- (((g >> 3) & 0x1f) << 5) |
- ((b >> 3) & 0x1f);
- */
- p = (((r >> (8 - PNG_DITHER_RED_BITS)) &
- ((1 << PNG_DITHER_RED_BITS) - 1)) <<
- (PNG_DITHER_GREEN_BITS + PNG_DITHER_BLUE_BITS)) |
- (((g >> (8 - PNG_DITHER_GREEN_BITS)) &
- ((1 << PNG_DITHER_GREEN_BITS) - 1)) <<
- (PNG_DITHER_BLUE_BITS)) |
- ((b >> (8 - PNG_DITHER_BLUE_BITS)) &
- ((1 << PNG_DITHER_BLUE_BITS) - 1));
-
- *dp++ = palette_lookup[p];
- }
- row_info->color_type = PNG_COLOR_TYPE_PALETTE;
- row_info->channels = 1;
- row_info->pixel_depth = row_info->bit_depth;
- row_info->rowbytes =
- ((row_width * row_info->pixel_depth + 7) >> 3);
- }
- else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA &&
- palette_lookup != NULL && row_info->bit_depth == 8)
- {
- int r, g, b, p;
- sp = row;
- dp = row;
- for (i = 0; i < row_width; i++)
- {
- r = *sp++;
- g = *sp++;
- b = *sp++;
- sp++;
-
- p = (((r >> (8 - PNG_DITHER_RED_BITS)) &
- ((1 << PNG_DITHER_RED_BITS) - 1)) <<
- (PNG_DITHER_GREEN_BITS + PNG_DITHER_BLUE_BITS)) |
- (((g >> (8 - PNG_DITHER_GREEN_BITS)) &
- ((1 << PNG_DITHER_GREEN_BITS) - 1)) <<
- (PNG_DITHER_BLUE_BITS)) |
- ((b >> (8 - PNG_DITHER_BLUE_BITS)) &
- ((1 << PNG_DITHER_BLUE_BITS) - 1));
-
- *dp++ = palette_lookup[p];
- }
- row_info->color_type = PNG_COLOR_TYPE_PALETTE;
- row_info->channels = 1;
- row_info->pixel_depth = row_info->bit_depth;
- row_info->rowbytes =
- ((row_width * row_info->pixel_depth + 7) >> 3);
- }
- else if (row_info->color_type == PNG_COLOR_TYPE_PALETTE &&
- dither_lookup && row_info->bit_depth == 8)
- {
- sp = row;
- for (i = 0; i < row_width; i++, sp++)
- {
- *sp = dither_lookup[*sp];
- }
- }
- }
-}
-#endif
-
-#ifdef PNG_FLOATING_POINT_SUPPORTED
-#if defined(PNG_READ_GAMMA_SUPPORTED)
-static int png_gamma_shift[] =
- {0x10, 0x21, 0x42, 0x84, 0x110, 0x248, 0x550, 0xff0};
-
-/* We build the 8- or 16-bit gamma tables here. Note that for 16-bit
- * tables, we don't make a full table if we are reducing to 8-bit in
- * the future. Note also how the gamma_16 tables are segmented so that
- * we don't need to allocate > 64K chunks for a full 16-bit table.
- */
-void /* PRIVATE */
-png_build_gamma_table(png_structp png_ptr)
-{
- png_debug(1, "in png_build_gamma_table\n");
- if(png_ptr->gamma != 0.0)
- {
- if (png_ptr->bit_depth <= 8)
- {
- int i;
- double g;
-
- if (png_ptr->screen_gamma > .000001)
- g = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma);
- else
- g = 1.0;
-
- png_ptr->gamma_table = (png_bytep)png_malloc(png_ptr,
- (png_uint_32)256);
-
- for (i = 0; i < 256; i++)
- {
- png_ptr->gamma_table[i] = (png_byte)(pow((double)i / 255.0,
- g) * 255.0 + .5);
- }
-
-#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \
- defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
- if (png_ptr->transformations & ((PNG_BACKGROUND) | PNG_RGB_TO_GRAY))
- {
-
- g = 1.0 / (png_ptr->gamma);
-
- png_ptr->gamma_to_1 = (png_bytep)png_malloc(png_ptr,
- (png_uint_32)256);
-
- for (i = 0; i < 256; i++)
- {
- png_ptr->gamma_to_1[i] = (png_byte)(pow((double)i / 255.0,
- g) * 255.0 + .5);
- }
-
-
- png_ptr->gamma_from_1 = (png_bytep)png_malloc(png_ptr,
- (png_uint_32)256);
-
- if(png_ptr->screen_gamma > 0.000001)
- g = 1.0 / png_ptr->screen_gamma;
- else
- g = png_ptr->gamma; /* probably doing rgb_to_gray */
-
- for (i = 0; i < 256; i++)
- {
- png_ptr->gamma_from_1[i] = (png_byte)(pow((double)i / 255.0,
- g) * 255.0 + .5);
-
- }
- }
-#endif /* PNG_READ_BACKGROUND_SUPPORTED || PNG_RGB_TO_GRAY_SUPPORTED */
- }
- else
- {
- double g;
- int i, j, shift, num;
- int sig_bit;
- png_uint_32 ig;
-
- if (png_ptr->color_type & PNG_COLOR_MASK_COLOR)
- {
- sig_bit = (int)png_ptr->sig_bit.red;
- if ((int)png_ptr->sig_bit.green > sig_bit)
- sig_bit = png_ptr->sig_bit.green;
- if ((int)png_ptr->sig_bit.blue > sig_bit)
- sig_bit = png_ptr->sig_bit.blue;
- }
- else
- {
- sig_bit = (int)png_ptr->sig_bit.gray;
- }
-
- if (sig_bit > 0)
- shift = 16 - sig_bit;
- else
- shift = 0;
-
- if (png_ptr->transformations & PNG_16_TO_8)
- {
- if (shift < (16 - PNG_MAX_GAMMA_8))
- shift = (16 - PNG_MAX_GAMMA_8);
- }
-
- if (shift > 8)
- shift = 8;
- if (shift < 0)
- shift = 0;
-
- png_ptr->gamma_shift = (png_byte)shift;
-
- num = (1 << (8 - shift));
-
- if (png_ptr->screen_gamma > .000001)
- g = 1.0 / (png_ptr->gamma * png_ptr->screen_gamma);
- else
- g = 1.0;
-
- png_ptr->gamma_16_table = (png_uint_16pp)png_malloc(png_ptr,
- (png_uint_32)(num * sizeof (png_uint_16p)));
-
- if (png_ptr->transformations & (PNG_16_TO_8 | PNG_BACKGROUND))
- {
- double fin, fout;
- png_uint_32 last, max;
-
- for (i = 0; i < num; i++)
- {
- png_ptr->gamma_16_table[i] = (png_uint_16p)png_malloc(png_ptr,
- (png_uint_32)(256 * sizeof (png_uint_16)));
- }
-
- g = 1.0 / g;
- last = 0;
- for (i = 0; i < 256; i++)
- {
- fout = ((double)i + 0.5) / 256.0;
- fin = pow(fout, g);
- max = (png_uint_32)(fin * (double)((png_uint_32)num << 8));
- while (last <= max)
- {
- png_ptr->gamma_16_table[(int)(last & (0xff >> shift))]
- [(int)(last >> (8 - shift))] = (png_uint_16)(
- (png_uint_16)i | ((png_uint_16)i << 8));
- last++;
- }
- }
- while (last < ((png_uint_32)num << 8))
- {
- png_ptr->gamma_16_table[(int)(last & (0xff >> shift))]
- [(int)(last >> (8 - shift))] = (png_uint_16)65535L;
- last++;
- }
- }
- else
- {
- for (i = 0; i < num; i++)
- {
- png_ptr->gamma_16_table[i] = (png_uint_16p)png_malloc(png_ptr,
- (png_uint_32)(256 * sizeof (png_uint_16)));
-
- ig = (((png_uint_32)i * (png_uint_32)png_gamma_shift[shift]) >> 4);
- for (j = 0; j < 256; j++)
- {
- png_ptr->gamma_16_table[i][j] =
- (png_uint_16)(pow((double)(ig + ((png_uint_32)j << 8)) /
- 65535.0, g) * 65535.0 + .5);
- }
- }
- }
-
-#if defined(PNG_READ_BACKGROUND_SUPPORTED) || \
- defined(PNG_READ_RGB_TO_GRAY_SUPPORTED)
- if (png_ptr->transformations & (PNG_BACKGROUND | PNG_RGB_TO_GRAY))
- {
-
- g = 1.0 / (png_ptr->gamma);
-
- png_ptr->gamma_16_to_1 = (png_uint_16pp)png_malloc(png_ptr,
- (png_uint_32)(num * sizeof (png_uint_16p )));
-
- for (i = 0; i < num; i++)
- {
- png_ptr->gamma_16_to_1[i] = (png_uint_16p)png_malloc(png_ptr,
- (png_uint_32)(256 * sizeof (png_uint_16)));
-
- ig = (((png_uint_32)i *
- (png_uint_32)png_gamma_shift[shift]) >> 4);
- for (j = 0; j < 256; j++)
- {
- png_ptr->gamma_16_to_1[i][j] =
- (png_uint_16)(pow((double)(ig + ((png_uint_32)j << 8)) /
- 65535.0, g) * 65535.0 + .5);
- }
- }
-
- if(png_ptr->screen_gamma > 0.000001)
- g = 1.0 / png_ptr->screen_gamma;
- else
- g = png_ptr->gamma; /* probably doing rgb_to_gray */
-
- png_ptr->gamma_16_from_1 = (png_uint_16pp)png_malloc(png_ptr,
- (png_uint_32)(num * sizeof (png_uint_16p)));
-
- for (i = 0; i < num; i++)
- {
- png_ptr->gamma_16_from_1[i] = (png_uint_16p)png_malloc(png_ptr,
- (png_uint_32)(256 * sizeof (png_uint_16)));
-
- ig = (((png_uint_32)i *
- (png_uint_32)png_gamma_shift[shift]) >> 4);
- for (j = 0; j < 256; j++)
- {
- png_ptr->gamma_16_from_1[i][j] =
- (png_uint_16)(pow((double)(ig + ((png_uint_32)j << 8)) /
- 65535.0, g) * 65535.0 + .5);
- }
- }
- }
-#endif /* PNG_READ_BACKGROUND_SUPPORTED || PNG_RGB_TO_GRAY_SUPPORTED */
- }
- }
-}
-#endif
-/* To do: install integer version of png_build_gamma_table here */
-#endif
-
-#if defined(PNG_MNG_FEATURES_SUPPORTED)
-/* undoes intrapixel differencing */
-void /* PRIVATE */
-png_do_read_intrapixel(png_row_infop row_info, png_bytep row)
-{
- png_debug(1, "in png_do_read_intrapixel\n");
- if (
-#if defined(PNG_USELESS_TESTS_SUPPORTED)
- row != NULL && row_info != NULL &&
-#endif
- (row_info->color_type & PNG_COLOR_MASK_COLOR))
- {
- int bytes_per_pixel;
- png_uint_32 row_width = row_info->width;
- if (row_info->bit_depth == 8)
- {
- png_bytep rp;
- png_uint_32 i;
-
- if (row_info->color_type == PNG_COLOR_TYPE_RGB)
- bytes_per_pixel = 3;
- else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
- bytes_per_pixel = 4;
- else
- return;
-
- for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)
- {
- *(rp) = (png_byte)((256 + *rp + *(rp+1))&0xff);
- *(rp+2) = (png_byte)((256 + *(rp+2) + *(rp+1))&0xff);
- }
- }
- else if (row_info->bit_depth == 16)
- {
- png_bytep rp;
- png_uint_32 i;
-
- if (row_info->color_type == PNG_COLOR_TYPE_RGB)
- bytes_per_pixel = 6;
- else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
- bytes_per_pixel = 8;
- else
- return;
-
- for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)
- {
- png_uint_32 s0=*(rp )<<8 | *(rp+1);
- png_uint_32 s1=*(rp+2)<<8 | *(rp+3);
- png_uint_32 s2=*(rp+4)<<8 | *(rp+5);
- png_uint_32 red=(65536+s0+s1)&0xffff;
- png_uint_32 blue=(65536+s2+s1)&0xffff;
- *(rp ) = (png_byte)((red>>8)&0xff);
- *(rp+1) = (png_byte)(red&0xff);
- *(rp+4) = (png_byte)((blue>>8)&0xff);
- *(rp+5) = (png_byte)(blue&0xff);
- }
- }
- }
-}
-#endif /* PNG_MNG_FEATURES_SUPPORTED */
diff --git a/libpng/pngrutil.c b/libpng/pngrutil.c
deleted file mode 100644
index e9dc1a4..0000000
--- a/libpng/pngrutil.c
+++ /dev/null
@@ -1,3005 +0,0 @@
-
-/* pngrutil.c - utilities to read a PNG file
- *
- * libpng 1.2.1 - December 12, 2001
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2001 Glenn Randers-Pehrson
- * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
- * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
- *
- * This file contains routines that are only called from within
- * libpng itself during the course of reading an image.
- */
-
-#define PNG_INTERNAL
-#include "png.h"
-
-#if defined(_WIN32_WCE)
-/* strtod() function is not supported on WindowsCE */
-# ifdef PNG_FLOATING_POINT_SUPPORTED
-__inline double strtod(const char *nptr, char **endptr)
-{
- double result = 0;
- int len;
- wchar_t *str, *end;
-
- len = MultiByteToWideChar(CP_ACP, 0, nptr, -1, NULL, 0);
- str = (wchar_t *)malloc(len * sizeof(wchar_t));
- if ( NULL != str )
- {
- MultiByteToWideChar(CP_ACP, 0, nptr, -1, str, len);
- result = wcstod(str, &end);
- len = WideCharToMultiByte(CP_ACP, 0, end, -1, NULL, 0, NULL, NULL);
- *endptr = (char *)nptr + (png_strlen(nptr) - len + 1);
- free(str);
- }
- return result;
-}
-# endif
-#endif
-
-#ifndef PNG_READ_BIG_ENDIAN_SUPPORTED
-/* Grab an unsigned 32-bit integer from a buffer in big-endian format. */
-png_uint_32 /* PRIVATE */
-png_get_uint_32(png_bytep buf)
-{
- png_uint_32 i = ((png_uint_32)(*buf) << 24) +
- ((png_uint_32)(*(buf + 1)) << 16) +
- ((png_uint_32)(*(buf + 2)) << 8) +
- (png_uint_32)(*(buf + 3));
-
- return (i);
-}
-
-#if defined(PNG_READ_pCAL_SUPPORTED) || defined(PNG_READ_oFFs_SUPPORTED)
-/* Grab a signed 32-bit integer from a buffer in big-endian format. The
- * data is stored in the PNG file in two's complement format, and it is
- * assumed that the machine format for signed integers is the same. */
-png_int_32 /* PRIVATE */
-png_get_int_32(png_bytep buf)
-{
- png_int_32 i = ((png_int_32)(*buf) << 24) +
- ((png_int_32)(*(buf + 1)) << 16) +
- ((png_int_32)(*(buf + 2)) << 8) +
- (png_int_32)(*(buf + 3));
-
- return (i);
-}
-#endif /* PNG_READ_pCAL_SUPPORTED */
-
-/* Grab an unsigned 16-bit integer from a buffer in big-endian format. */
-png_uint_16 /* PRIVATE */
-png_get_uint_16(png_bytep buf)
-{
- png_uint_16 i = (png_uint_16)(((png_uint_16)(*buf) << 8) +
- (png_uint_16)(*(buf + 1)));
-
- return (i);
-}
-#endif /* PNG_READ_BIG_ENDIAN_SUPPORTED */
-
-/* Read data, and (optionally) run it through the CRC. */
-void /* PRIVATE */
-png_crc_read(png_structp png_ptr, png_bytep buf, png_size_t length)
-{
- png_read_data(png_ptr, buf, length);
- png_calculate_crc(png_ptr, buf, length);
-}
-
-/* Optionally skip data and then check the CRC. Depending on whether we
- are reading a ancillary or critical chunk, and how the program has set
- things up, we may calculate the CRC on the data and print a message.
- Returns '1' if there was a CRC error, '0' otherwise. */
-int /* PRIVATE */
-png_crc_finish(png_structp png_ptr, png_uint_32 skip)
-{
- png_size_t i;
- png_size_t istop = png_ptr->zbuf_size;
-
- for (i = (png_size_t)skip; i > istop; i -= istop)
- {
- png_crc_read(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size);
- }
- if (i)
- {
- png_crc_read(png_ptr, png_ptr->zbuf, i);
- }
-
- if (png_crc_error(png_ptr))
- {
- if (((png_ptr->chunk_name[0] & 0x20) && /* Ancillary */
- !(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN)) ||
- (!(png_ptr->chunk_name[0] & 0x20) && /* Critical */
- (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_USE)))
- {
- png_chunk_warning(png_ptr, "CRC error");
- }
- else
- {
- png_chunk_error(png_ptr, "CRC error");
- }
- return (1);
- }
-
- return (0);
-}
-
-/* Compare the CRC stored in the PNG file with that calculated by libpng from
- the data it has read thus far. */
-int /* PRIVATE */
-png_crc_error(png_structp png_ptr)
-{
- png_byte crc_bytes[4];
- png_uint_32 crc;
- int need_crc = 1;
-
- if (png_ptr->chunk_name[0] & 0x20) /* ancillary */
- {
- if ((png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_MASK) ==
- (PNG_FLAG_CRC_ANCILLARY_USE | PNG_FLAG_CRC_ANCILLARY_NOWARN))
- need_crc = 0;
- }
- else /* critical */
- {
- if (png_ptr->flags & PNG_FLAG_CRC_CRITICAL_IGNORE)
- need_crc = 0;
- }
-
- png_read_data(png_ptr, crc_bytes, 4);
-
- if (need_crc)
- {
- crc = png_get_uint_32(crc_bytes);
- return ((int)(crc != png_ptr->crc));
- }
- else
- return (0);
-}
-
-#if defined(PNG_READ_zTXt_SUPPORTED) || defined(PNG_READ_iTXt_SUPPORTED) || \
- defined(PNG_READ_iCCP_SUPPORTED)
-/*
- * Decompress trailing data in a chunk. The assumption is that chunkdata
- * points at an allocated area holding the contents of a chunk with a
- * trailing compressed part. What we get back is an allocated area
- * holding the original prefix part and an uncompressed version of the
- * trailing part (the malloc area passed in is freed).
- */
-png_charp /* PRIVATE */
-png_decompress_chunk(png_structp png_ptr, int comp_type,
- png_charp chunkdata, png_size_t chunklength,
- png_size_t prefix_size, png_size_t *newlength)
-{
- static char msg[] = "Error decoding compressed text";
- png_charp text = NULL;
- png_size_t text_size;
-
- if (comp_type == PNG_COMPRESSION_TYPE_BASE)
- {
- int ret = Z_OK;
- png_ptr->zstream.next_in = (png_bytep)(chunkdata + prefix_size);
- png_ptr->zstream.avail_in = (uInt)(chunklength - prefix_size);
- png_ptr->zstream.next_out = png_ptr->zbuf;
- png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
-
- text_size = 0;
- text = NULL;
-
- while (png_ptr->zstream.avail_in)
- {
- ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);
- if (ret != Z_OK && ret != Z_STREAM_END)
- {
- if (png_ptr->zstream.msg != NULL)
- png_warning(png_ptr, png_ptr->zstream.msg);
- else
- png_warning(png_ptr, msg);
- inflateReset(&png_ptr->zstream);
- png_ptr->zstream.avail_in = 0;
-
- if (text == NULL)
- {
- text_size = prefix_size + sizeof(msg) + 1;
- text = (png_charp)png_malloc(png_ptr, text_size);
- png_memcpy(text, chunkdata, prefix_size);
- }
-
- text[text_size - 1] = 0x00;
-
- /* Copy what we can of the error message into the text chunk */
- text_size = (png_size_t)(chunklength - (text - chunkdata) - 1);
- text_size = sizeof(msg) > text_size ? text_size : sizeof(msg);
- png_memcpy(text + prefix_size, msg, text_size + 1);
- break;
- }
- if (!png_ptr->zstream.avail_out || ret == Z_STREAM_END)
- {
- if (text == NULL)
- {
- text_size = prefix_size +
- png_ptr->zbuf_size - png_ptr->zstream.avail_out;
- text = (png_charp)png_malloc(png_ptr, text_size + 1);
- png_memcpy(text + prefix_size, png_ptr->zbuf,
- text_size - prefix_size);
- png_memcpy(text, chunkdata, prefix_size);
- *(text + text_size) = 0x00;
- }
- else
- {
- png_charp tmp;
-
- tmp = text;
- text = (png_charp)png_malloc(png_ptr, (png_uint_32)(text_size +
- png_ptr->zbuf_size - png_ptr->zstream.avail_out + 1));
- png_memcpy(text, tmp, text_size);
- png_free(png_ptr, tmp);
- png_memcpy(text + text_size, png_ptr->zbuf,
- (png_ptr->zbuf_size - png_ptr->zstream.avail_out));
- text_size += png_ptr->zbuf_size - png_ptr->zstream.avail_out;
- *(text + text_size) = 0x00;
- }
- if (ret == Z_STREAM_END)
- break;
- else
- {
- png_ptr->zstream.next_out = png_ptr->zbuf;
- png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
- }
- }
- }
- if (ret != Z_STREAM_END)
- {
-#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE)
- char umsg[50];
-
- if (ret == Z_BUF_ERROR)
- sprintf(umsg,"Buffer error in compressed datastream in %s chunk",
- png_ptr->chunk_name);
- else if (ret == Z_DATA_ERROR)
- sprintf(umsg,"Data error in compressed datastream in %s chunk",
- png_ptr->chunk_name);
- else
- sprintf(umsg,"Incomplete compressed datastream in %s chunk",
- png_ptr->chunk_name);
- png_warning(png_ptr, umsg);
-#else
- png_warning(png_ptr,
- "Incomplete compressed datastream in chunk other than IDAT");
-#endif
- text_size=prefix_size;
- if (text == NULL)
- {
- text = (png_charp)png_malloc(png_ptr, text_size+1);
- png_memcpy(text, chunkdata, prefix_size);
- }
- *(text + text_size) = 0x00;
- }
-
- inflateReset(&png_ptr->zstream);
- png_ptr->zstream.avail_in = 0;
-
- png_free(png_ptr, chunkdata);
- chunkdata = text;
- *newlength=text_size;
- }
- else /* if (comp_type != PNG_COMPRESSION_TYPE_BASE) */
- {
-#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE)
- char umsg[50];
-
- sprintf(umsg, "Unknown zTXt compression type %d", comp_type);
- png_warning(png_ptr, umsg);
-#else
- png_warning(png_ptr, "Unknown zTXt compression type");
-#endif
-
- *(chunkdata + prefix_size) = 0x00;
- *newlength=prefix_size;
- }
-
- return chunkdata;
-}
-#endif
-
-/* read and check the IDHR chunk */
-void /* PRIVATE */
-png_handle_IHDR(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
-{
- png_byte buf[13];
- png_uint_32 width, height;
- int bit_depth, color_type, compression_type, filter_type;
- int interlace_type;
-
- png_debug(1, "in png_handle_IHDR\n");
-
- if (png_ptr->mode & PNG_HAVE_IHDR)
- png_error(png_ptr, "Out of place IHDR");
-
- /* check the length */
- if (length != 13)
- png_error(png_ptr, "Invalid IHDR chunk");
-
- png_ptr->mode |= PNG_HAVE_IHDR;
-
- png_crc_read(png_ptr, buf, 13);
- png_crc_finish(png_ptr, 0);
-
- width = png_get_uint_32(buf);
- height = png_get_uint_32(buf + 4);
- bit_depth = buf[8];
- color_type = buf[9];
- compression_type = buf[10];
- filter_type = buf[11];
- interlace_type = buf[12];
-
-
- /* set internal variables */
- png_ptr->width = width;
- png_ptr->height = height;
- png_ptr->bit_depth = (png_byte)bit_depth;
- png_ptr->interlaced = (png_byte)interlace_type;
- png_ptr->color_type = (png_byte)color_type;
-#if defined(PNG_MNG_FEATURES_SUPPORTED)
- png_ptr->filter_type = (png_byte)filter_type;
-#endif
-
- /* find number of channels */
- switch (png_ptr->color_type)
- {
- case PNG_COLOR_TYPE_GRAY:
- case PNG_COLOR_TYPE_PALETTE:
- png_ptr->channels = 1;
- break;
- case PNG_COLOR_TYPE_RGB:
- png_ptr->channels = 3;
- break;
- case PNG_COLOR_TYPE_GRAY_ALPHA:
- png_ptr->channels = 2;
- break;
- case PNG_COLOR_TYPE_RGB_ALPHA:
- png_ptr->channels = 4;
- break;
- }
-
- /* set up other useful info */
- png_ptr->pixel_depth = (png_byte)(png_ptr->bit_depth *
- png_ptr->channels);
- png_ptr->rowbytes = ((png_ptr->width *
- (png_uint_32)png_ptr->pixel_depth + 7) >> 3);
- png_debug1(3,"bit_depth = %d\n", png_ptr->bit_depth);
- png_debug1(3,"channels = %d\n", png_ptr->channels);
- png_debug1(3,"rowbytes = %lu\n", png_ptr->rowbytes);
- png_set_IHDR(png_ptr, info_ptr, width, height, bit_depth,
- color_type, interlace_type, compression_type, filter_type);
-}
-
-/* read and check the palette */
-void /* PRIVATE */
-png_handle_PLTE(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
-{
- png_color palette[PNG_MAX_PALETTE_LENGTH];
- int num, i;
-#ifndef PNG_NO_POINTER_INDEXING
- png_colorp pal_ptr;
-#endif
-
- png_debug(1, "in png_handle_PLTE\n");
-
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before PLTE");
- else if (png_ptr->mode & PNG_HAVE_IDAT)
- {
- png_warning(png_ptr, "Invalid PLTE after IDAT");
- png_crc_finish(png_ptr, length);
- return;
- }
- else if (png_ptr->mode & PNG_HAVE_PLTE)
- png_error(png_ptr, "Duplicate PLTE chunk");
-
- png_ptr->mode |= PNG_HAVE_PLTE;
-
- if (!(png_ptr->color_type&PNG_COLOR_MASK_COLOR))
- {
- png_warning(png_ptr,
- "Ignoring PLTE chunk in grayscale PNG");
- png_crc_finish(png_ptr, length);
- return;
- }
-#if !defined(PNG_READ_OPT_PLTE_SUPPORTED)
- if (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE)
- {
- png_crc_finish(png_ptr, length);
- return;
- }
-#endif
-
- if (length > 3*PNG_MAX_PALETTE_LENGTH || length % 3)
- {
- if (png_ptr->color_type != PNG_COLOR_TYPE_PALETTE)
- {
- png_warning(png_ptr, "Invalid palette chunk");
- png_crc_finish(png_ptr, length);
- return;
- }
- else
- {
- png_error(png_ptr, "Invalid palette chunk");
- }
- }
-
- num = (int)length / 3;
-
-#ifndef PNG_NO_POINTER_INDEXING
- for (i = 0, pal_ptr = palette; i < num; i++, pal_ptr++)
- {
- png_byte buf[3];
-
- png_crc_read(png_ptr, buf, 3);
- pal_ptr->red = buf[0];
- pal_ptr->green = buf[1];
- pal_ptr->blue = buf[2];
- }
-#else
- for (i = 0; i < num; i++)
- {
- png_byte buf[3];
-
- png_crc_read(png_ptr, buf, 3);
- /* don't depend upon png_color being any order */
- palette[i].red = buf[0];
- palette[i].green = buf[1];
- palette[i].blue = buf[2];
- }
-#endif
-
- /* If we actually NEED the PLTE chunk (ie for a paletted image), we do
- whatever the normal CRC configuration tells us. However, if we
- have an RGB image, the PLTE can be considered ancillary, so
- we will act as though it is. */
-#if !defined(PNG_READ_OPT_PLTE_SUPPORTED)
- if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
-#endif
- {
- png_crc_finish(png_ptr, 0);
- }
-#if !defined(PNG_READ_OPT_PLTE_SUPPORTED)
- else if (png_crc_error(png_ptr)) /* Only if we have a CRC error */
- {
- /* If we don't want to use the data from an ancillary chunk,
- we have two options: an error abort, or a warning and we
- ignore the data in this chunk (which should be OK, since
- it's considered ancillary for a RGB or RGBA image). */
- if (!(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_USE))
- {
- if (png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN)
- {
- png_chunk_error(png_ptr, "CRC error");
- }
- else
- {
- png_chunk_warning(png_ptr, "CRC error");
- return;
- }
- }
- /* Otherwise, we (optionally) emit a warning and use the chunk. */
- else if (!(png_ptr->flags & PNG_FLAG_CRC_ANCILLARY_NOWARN))
- {
- png_chunk_warning(png_ptr, "CRC error");
- }
- }
-#endif
-
- png_set_PLTE(png_ptr, info_ptr, palette, num);
-
-#if defined(PNG_READ_tRNS_SUPPORTED)
- if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
- {
- if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS))
- {
- if (png_ptr->num_trans > (png_uint_16)num)
- {
- png_warning(png_ptr, "Truncating incorrect tRNS chunk length");
- png_ptr->num_trans = (png_uint_16)num;
- }
- if (info_ptr->num_trans > (png_uint_16)num)
- {
- png_warning(png_ptr, "Truncating incorrect info tRNS chunk length");
- info_ptr->num_trans = (png_uint_16)num;
- }
- }
- }
-#endif
-
-}
-
-void /* PRIVATE */
-png_handle_IEND(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
-{
- png_debug(1, "in png_handle_IEND\n");
-
- if (!(png_ptr->mode & PNG_HAVE_IHDR) || !(png_ptr->mode & PNG_HAVE_IDAT))
- {
- png_error(png_ptr, "No image in file");
-
- info_ptr = info_ptr; /* quiet compiler warnings about unused info_ptr */
- }
-
- png_ptr->mode |= (PNG_AFTER_IDAT | PNG_HAVE_IEND);
-
- if (length != 0)
- {
- png_warning(png_ptr, "Incorrect IEND chunk length");
- }
- png_crc_finish(png_ptr, length);
-}
-
-#if defined(PNG_READ_gAMA_SUPPORTED)
-void /* PRIVATE */
-png_handle_gAMA(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
-{
- png_fixed_point igamma;
-#ifdef PNG_FLOATING_POINT_SUPPORTED
- float file_gamma;
-#endif
- png_byte buf[4];
-
- png_debug(1, "in png_handle_gAMA\n");
-
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before gAMA");
- else if (png_ptr->mode & PNG_HAVE_IDAT)
- {
- png_warning(png_ptr, "Invalid gAMA after IDAT");
- png_crc_finish(png_ptr, length);
- return;
- }
- else if (png_ptr->mode & PNG_HAVE_PLTE)
- /* Should be an error, but we can cope with it */
- png_warning(png_ptr, "Out of place gAMA chunk");
-
- else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_gAMA)
-#if defined(PNG_READ_sRGB_SUPPORTED)
- && !(info_ptr->valid & PNG_INFO_sRGB)
-#endif
- )
- {
- png_warning(png_ptr, "Duplicate gAMA chunk");
- png_crc_finish(png_ptr, length);
- return;
- }
-
- if (length != 4)
- {
- png_warning(png_ptr, "Incorrect gAMA chunk length");
- png_crc_finish(png_ptr, length);
- return;
- }
-
- png_crc_read(png_ptr, buf, 4);
- if (png_crc_finish(png_ptr, 0))
- return;
-
- igamma = (png_fixed_point)png_get_uint_32(buf);
- /* check for zero gamma */
- if (igamma == 0)
- {
- png_warning(png_ptr,
- "Ignoring gAMA chunk with gamma=0");
- return;
- }
-
-#if defined(PNG_READ_sRGB_SUPPORTED)
- if (info_ptr->valid & PNG_INFO_sRGB)
- if(igamma < 45000L || igamma > 46000L)
- {
- png_warning(png_ptr,
- "Ignoring incorrect gAMA value when sRGB is also present");
-#ifndef PNG_NO_CONSOLE_IO
- fprintf(stderr, "gamma = (%d/100000)\n", (int)igamma);
-#endif
- return;
- }
-#endif /* PNG_READ_sRGB_SUPPORTED */
-
-#ifdef PNG_FLOATING_POINT_SUPPORTED
- file_gamma = (float)igamma / (float)100000.0;
-# ifdef PNG_READ_GAMMA_SUPPORTED
- png_ptr->gamma = file_gamma;
-# endif
- png_set_gAMA(png_ptr, info_ptr, file_gamma);
-#endif
-#ifdef PNG_FIXED_POINT_SUPPORTED
- png_set_gAMA_fixed(png_ptr, info_ptr, igamma);
-#endif
-}
-#endif
-
-#if defined(PNG_READ_sBIT_SUPPORTED)
-void /* PRIVATE */
-png_handle_sBIT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
-{
- png_size_t truelen;
- png_byte buf[4];
-
- png_debug(1, "in png_handle_sBIT\n");
-
- buf[0] = buf[1] = buf[2] = buf[3] = 0;
-
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before sBIT");
- else if (png_ptr->mode & PNG_HAVE_IDAT)
- {
- png_warning(png_ptr, "Invalid sBIT after IDAT");
- png_crc_finish(png_ptr, length);
- return;
- }
- else if (png_ptr->mode & PNG_HAVE_PLTE)
- {
- /* Should be an error, but we can cope with it */
- png_warning(png_ptr, "Out of place sBIT chunk");
- }
- else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sBIT))
- {
- png_warning(png_ptr, "Duplicate sBIT chunk");
- png_crc_finish(png_ptr, length);
- return;
- }
-
- if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
- truelen = 3;
- else
- truelen = (png_size_t)png_ptr->channels;
-
- if (length != truelen)
- {
- png_warning(png_ptr, "Incorrect sBIT chunk length");
- png_crc_finish(png_ptr, length);
- return;
- }
-
- png_crc_read(png_ptr, buf, truelen);
- if (png_crc_finish(png_ptr, 0))
- return;
-
- if (png_ptr->color_type & PNG_COLOR_MASK_COLOR)
- {
- png_ptr->sig_bit.red = buf[0];
- png_ptr->sig_bit.green = buf[1];
- png_ptr->sig_bit.blue = buf[2];
- png_ptr->sig_bit.alpha = buf[3];
- }
- else
- {
- png_ptr->sig_bit.gray = buf[0];
- png_ptr->sig_bit.red = buf[0];
- png_ptr->sig_bit.green = buf[0];
- png_ptr->sig_bit.blue = buf[0];
- png_ptr->sig_bit.alpha = buf[1];
- }
- png_set_sBIT(png_ptr, info_ptr, &(png_ptr->sig_bit));
-}
-#endif
-
-#if defined(PNG_READ_cHRM_SUPPORTED)
-void /* PRIVATE */
-png_handle_cHRM(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
-{
- png_byte buf[4];
-#ifdef PNG_FLOATING_POINT_SUPPORTED
- float white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y;
-#endif
- png_fixed_point int_x_white, int_y_white, int_x_red, int_y_red, int_x_green,
- int_y_green, int_x_blue, int_y_blue;
-
- png_debug(1, "in png_handle_cHRM\n");
-
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before cHRM");
- else if (png_ptr->mode & PNG_HAVE_IDAT)
- {
- png_warning(png_ptr, "Invalid cHRM after IDAT");
- png_crc_finish(png_ptr, length);
- return;
- }
- else if (png_ptr->mode & PNG_HAVE_PLTE)
- /* Should be an error, but we can cope with it */
- png_warning(png_ptr, "Missing PLTE before cHRM");
-
- else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_cHRM)
-#if defined(PNG_READ_sRGB_SUPPORTED)
- && !(info_ptr->valid & PNG_INFO_sRGB)
-#endif
- )
- {
- png_warning(png_ptr, "Duplicate cHRM chunk");
- png_crc_finish(png_ptr, length);
- return;
- }
-
- if (length != 32)
- {
- png_warning(png_ptr, "Incorrect cHRM chunk length");
- png_crc_finish(png_ptr, length);
- return;
- }
-
- png_crc_read(png_ptr, buf, 4);
- int_x_white = (png_fixed_point)png_get_uint_32(buf);
-
- png_crc_read(png_ptr, buf, 4);
- int_y_white = (png_fixed_point)png_get_uint_32(buf);
-
- if (int_x_white > 80000L || int_y_white > 80000L ||
- int_x_white + int_y_white > 100000L)
- {
- png_warning(png_ptr, "Invalid cHRM white point");
- png_crc_finish(png_ptr, 24);
- return;
- }
-
- png_crc_read(png_ptr, buf, 4);
- int_x_red = (png_fixed_point)png_get_uint_32(buf);
-
- png_crc_read(png_ptr, buf, 4);
- int_y_red = (png_fixed_point)png_get_uint_32(buf);
-
- if (int_x_red > 80000L || int_y_red > 80000L ||
- int_x_red + int_y_red > 100000L)
- {
- png_warning(png_ptr, "Invalid cHRM red point");
- png_crc_finish(png_ptr, 16);
- return;
- }
-
- png_crc_read(png_ptr, buf, 4);
- int_x_green = (png_fixed_point)png_get_uint_32(buf);
-
- png_crc_read(png_ptr, buf, 4);
- int_y_green = (png_fixed_point)png_get_uint_32(buf);
-
- if (int_x_green > 80000L || int_y_green > 80000L ||
- int_x_green + int_y_green > 100000L)
- {
- png_warning(png_ptr, "Invalid cHRM green point");
- png_crc_finish(png_ptr, 8);
- return;
- }
-
- png_crc_read(png_ptr, buf, 4);
- int_x_blue = (png_fixed_point)png_get_uint_32(buf);
-
- png_crc_read(png_ptr, buf, 4);
- int_y_blue = (png_fixed_point)png_get_uint_32(buf);
-
- if (int_x_blue > 80000L || int_y_blue > 80000L ||
- int_x_blue + int_y_blue > 100000L)
- {
- png_warning(png_ptr, "Invalid cHRM blue point");
- png_crc_finish(png_ptr, 0);
- return;
- }
-#ifdef PNG_FLOATING_POINT_SUPPORTED
- white_x = (float)int_x_white / (float)100000.0;
- white_y = (float)int_y_white / (float)100000.0;
- red_x = (float)int_x_red / (float)100000.0;
- red_y = (float)int_y_red / (float)100000.0;
- green_x = (float)int_x_green / (float)100000.0;
- green_y = (float)int_y_green / (float)100000.0;
- blue_x = (float)int_x_blue / (float)100000.0;
- blue_y = (float)int_y_blue / (float)100000.0;
-#endif
-
-#if defined(PNG_READ_sRGB_SUPPORTED)
-#undef png_abs
-#define png_abs(x) (((x)>0)?(x):-(x))
- if (info_ptr->valid & PNG_INFO_sRGB)
- {
- if (png_abs(int_x_white - 31270L) > 1000 ||
- png_abs(int_y_white - 32900L) > 1000 ||
- png_abs(int_x_red - 64000L) > 1000 ||
- png_abs(int_y_red - 33000L) > 1000 ||
- png_abs(int_x_green - 30000L) > 1000 ||
- png_abs(int_y_green - 60000L) > 1000 ||
- png_abs(int_x_blue - 15000L) > 1000 ||
- png_abs(int_y_blue - 6000L) > 1000)
- {
-
- png_warning(png_ptr,
- "Ignoring incorrect cHRM value when sRGB is also present");
-#ifndef PNG_NO_CONSOLE_IO
-#ifdef PNG_FLOATING_POINT_SUPPORTED
- fprintf(stderr,"wx=%f, wy=%f, rx=%f, ry=%f\n",
- white_x, white_y, red_x, red_y);
- fprintf(stderr,"gx=%f, gy=%f, bx=%f, by=%f\n",
- green_x, green_y, blue_x, blue_y);
-#else
- fprintf(stderr,"wx=%ld, wy=%ld, rx=%ld, ry=%ld\n",
- int_x_white, int_y_white, int_x_red, int_y_red);
- fprintf(stderr,"gx=%ld, gy=%ld, bx=%ld, by=%ld\n",
- int_x_green, int_y_green, int_x_blue, int_y_blue);
-#endif
-#endif /* PNG_NO_CONSOLE_IO */
- }
- png_crc_finish(png_ptr, 0);
- return;
- }
-#endif /* PNG_READ_sRGB_SUPPORTED */
-
-#ifdef PNG_FLOATING_POINT_SUPPORTED
- png_set_cHRM(png_ptr, info_ptr,
- white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y);
-#endif
-#ifdef PNG_FIXED_POINT_SUPPORTED
- png_set_cHRM_fixed(png_ptr, info_ptr,
- int_x_white, int_y_white, int_x_red, int_y_red, int_x_green,
- int_y_green, int_x_blue, int_y_blue);
-#endif
- if (png_crc_finish(png_ptr, 0))
- return;
-}
-#endif
-
-#if defined(PNG_READ_sRGB_SUPPORTED)
-void /* PRIVATE */
-png_handle_sRGB(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
-{
- int intent;
- png_byte buf[1];
-
- png_debug(1, "in png_handle_sRGB\n");
-
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before sRGB");
- else if (png_ptr->mode & PNG_HAVE_IDAT)
- {
- png_warning(png_ptr, "Invalid sRGB after IDAT");
- png_crc_finish(png_ptr, length);
- return;
- }
- else if (png_ptr->mode & PNG_HAVE_PLTE)
- /* Should be an error, but we can cope with it */
- png_warning(png_ptr, "Out of place sRGB chunk");
-
- else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sRGB))
- {
- png_warning(png_ptr, "Duplicate sRGB chunk");
- png_crc_finish(png_ptr, length);
- return;
- }
-
- if (length != 1)
- {
- png_warning(png_ptr, "Incorrect sRGB chunk length");
- png_crc_finish(png_ptr, length);
- return;
- }
-
- png_crc_read(png_ptr, buf, 1);
- if (png_crc_finish(png_ptr, 0))
- return;
-
- intent = buf[0];
- /* check for bad intent */
- if (intent >= PNG_sRGB_INTENT_LAST)
- {
- png_warning(png_ptr, "Unknown sRGB intent");
- return;
- }
-
-#if defined(PNG_READ_gAMA_SUPPORTED) && defined(PNG_READ_GAMMA_SUPPORTED)
- if ((info_ptr->valid & PNG_INFO_gAMA))
- {
- int igamma;
-#ifdef PNG_FIXED_POINT_SUPPORTED
- igamma=(int)info_ptr->int_gamma;
-#else
-# ifdef PNG_FLOATING_POINT_SUPPORTED
- igamma=(int)(info_ptr->gamma * 100000.);
-# endif
-#endif
-#if 0 && defined(PNG_cHRM_SUPPORTED) && !defined(PNG_FIXED_POINT_SUPPORTED)
-/* We need to define these here because they aren't in png.h */
- png_fixed_point int_x_white;
- png_fixed_point int_y_white;
- png_fixed_point int_x_red;
- png_fixed_point int_y_red;
- png_fixed_point int_x_green;
- png_fixed_point int_y_green;
- png_fixed_point int_x_blue;
- png_fixed_point int_y_blue;
-#endif
- if(igamma < 45000L || igamma > 46000L)
- {
- png_warning(png_ptr,
- "Ignoring incorrect gAMA value when sRGB is also present");
-#ifndef PNG_NO_CONSOLE_IO
-# ifdef PNG_FIXED_POINT_SUPPORTED
- fprintf(stderr,"incorrect gamma=(%d/100000)\n",(int)png_ptr->int_gamma);
-# else
-# ifdef PNG_FLOATING_POINT_SUPPORTED
- fprintf(stderr,"incorrect gamma=%f\n",png_ptr->gamma);
-# endif
-# endif
-#endif
- }
- }
-#endif /* PNG_READ_gAMA_SUPPORTED */
-
-#ifdef PNG_READ_cHRM_SUPPORTED
-#ifdef PNG_FIXED_POINT_SUPPORTED
-#undef png_abs
-#define png_abs(x) (((x)>0)?(x):-(x))
- if (info_ptr->valid & PNG_INFO_cHRM)
- if (png_abs(info_ptr->int_x_white - 31270L) > 1000 ||
- png_abs(info_ptr->int_y_white - 32900L) > 1000 ||
- png_abs(info_ptr->int_x_red - 64000L) > 1000 ||
- png_abs(info_ptr->int_y_red - 33000L) > 1000 ||
- png_abs(info_ptr->int_x_green - 30000L) > 1000 ||
- png_abs(info_ptr->int_y_green - 60000L) > 1000 ||
- png_abs(info_ptr->int_x_blue - 15000L) > 1000 ||
- png_abs(info_ptr->int_y_blue - 6000L) > 1000)
- {
- png_warning(png_ptr,
- "Ignoring incorrect cHRM value when sRGB is also present");
- }
-#endif /* PNG_FIXED_POINT_SUPPORTED */
-#endif /* PNG_READ_cHRM_SUPPORTED */
-
- png_set_sRGB_gAMA_and_cHRM(png_ptr, info_ptr, intent);
-}
-#endif /* PNG_READ_sRGB_SUPPORTED */
-
-#if defined(PNG_READ_iCCP_SUPPORTED)
-void /* PRIVATE */
-png_handle_iCCP(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
-/* Note: this does not properly handle chunks that are > 64K under DOS */
-{
- png_charp chunkdata;
- png_byte compression_type;
- png_charp profile;
- png_uint_32 skip = 0;
- png_uint_32 profile_size = 0;
- png_uint_32 profile_length = 0;
- png_size_t slength, prefix_length, data_length;
-
- png_debug(1, "in png_handle_iCCP\n");
-
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before iCCP");
- else if (png_ptr->mode & PNG_HAVE_IDAT)
- {
- png_warning(png_ptr, "Invalid iCCP after IDAT");
- png_crc_finish(png_ptr, length);
- return;
- }
- else if (png_ptr->mode & PNG_HAVE_PLTE)
- /* Should be an error, but we can cope with it */
- png_warning(png_ptr, "Out of place iCCP chunk");
-
- else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_iCCP))
- {
- png_warning(png_ptr, "Duplicate iCCP chunk");
- png_crc_finish(png_ptr, length);
- return;
- }
-
-#ifdef PNG_MAX_MALLOC_64K
- if (length > (png_uint_32)65535L)
- {
- png_warning(png_ptr, "iCCP chunk too large to fit in memory");
- skip = length - (png_uint_32)65535L;
- length = (png_uint_32)65535L;
- }
-#endif
-
- chunkdata = (png_charp)png_malloc(png_ptr, length + 1);
- slength = (png_size_t)length;
- png_crc_read(png_ptr, (png_bytep)chunkdata, slength);
-
- if (png_crc_finish(png_ptr, skip))
- {
- png_free(png_ptr, chunkdata);
- return;
- }
-
- chunkdata[slength] = 0x00;
-
- for (profile = chunkdata; *profile; profile++)
- /* empty loop to find end of name */ ;
-
- ++profile;
-
- /* there should be at least one zero (the compression type byte)
- following the separator, and we should be on it */
- if ( profile >= chunkdata + slength)
- {
- png_free(png_ptr, chunkdata);
- png_warning(png_ptr, "Malformed iCCP chunk");
- return;
- }
-
- /* compression_type should always be zero */
- compression_type = *profile++;
- if (compression_type)
- {
- png_warning(png_ptr, "Ignoring nonzero compression type in iCCP chunk");
- compression_type=0x00; /* Reset it to zero (libpng-1.0.6 through 1.0.8
- wrote nonzero) */
- }
-
- prefix_length = profile - chunkdata;
- chunkdata = png_decompress_chunk(png_ptr, compression_type, chunkdata,
- slength, prefix_length, &data_length);
-
- profile_length = data_length - prefix_length;
-
- if ( prefix_length > data_length || profile_length < 4)
- {
- png_free(png_ptr, chunkdata);
- png_warning(png_ptr, "Profile size field missing from iCCP chunk");
- return;
- }
-
- /* Check the profile_size recorded in the first 32 bits of the ICC profile */
- profile_size = ((*(chunkdata+prefix_length))<<24) |
- ((*(chunkdata+prefix_length+1))<<16) |
- ((*(chunkdata+prefix_length+2))<< 8) |
- ((*(chunkdata+prefix_length+3)) );
-
- if(profile_size < profile_length)
- profile_length = profile_size;
-
- if(profile_size > profile_length)
- {
- png_free(png_ptr, chunkdata);
- png_warning(png_ptr, "Ignoring truncated iCCP profile.\n");
- return;
- }
-
- png_set_iCCP(png_ptr, info_ptr, chunkdata, compression_type,
- chunkdata + prefix_length, profile_length);
- png_free(png_ptr, chunkdata);
-}
-#endif /* PNG_READ_iCCP_SUPPORTED */
-
-#if defined(PNG_READ_sPLT_SUPPORTED)
-void /* PRIVATE */
-png_handle_sPLT(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
-/* Note: this does not properly handle chunks that are > 64K under DOS */
-{
- png_bytep chunkdata;
- png_bytep entry_start;
- png_sPLT_t new_palette;
-#ifdef PNG_NO_POINTER_INDEXING
- png_sPLT_entryp pp;
-#endif
- int data_length, entry_size, i;
- png_uint_32 skip = 0;
- png_size_t slength;
-
- png_debug(1, "in png_handle_sPLT\n");
-
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before sPLT");
- else if (png_ptr->mode & PNG_HAVE_IDAT)
- {
- png_warning(png_ptr, "Invalid sPLT after IDAT");
- png_crc_finish(png_ptr, length);
- return;
- }
-
-#ifdef PNG_MAX_MALLOC_64K
- if (length > (png_uint_32)65535L)
- {
- png_warning(png_ptr, "sPLT chunk too large to fit in memory");
- skip = length - (png_uint_32)65535L;
- length = (png_uint_32)65535L;
- }
-#endif
-
- chunkdata = (png_bytep)png_malloc(png_ptr, length + 1);
- slength = (png_size_t)length;
- png_crc_read(png_ptr, (png_bytep)chunkdata, slength);
-
- if (png_crc_finish(png_ptr, skip))
- {
- png_free(png_ptr, chunkdata);
- return;
- }
-
- chunkdata[slength] = 0x00;
-
- for (entry_start = chunkdata; *entry_start; entry_start++)
- /* empty loop to find end of name */ ;
- ++entry_start;
-
- /* a sample depth should follow the separator, and we should be on it */
- if (entry_start > chunkdata + slength)
- {
- png_free(png_ptr, chunkdata);
- png_warning(png_ptr, "malformed sPLT chunk");
- return;
- }
-
- new_palette.depth = *entry_start++;
- entry_size = (new_palette.depth == 8 ? 6 : 10);
- data_length = (slength - (entry_start - chunkdata));
-
- /* integrity-check the data length */
- if (data_length % entry_size)
- {
- png_free(png_ptr, chunkdata);
- png_warning(png_ptr, "sPLT chunk has bad length");
- return;
- }
-
- new_palette.nentries = data_length / entry_size;
- new_palette.entries = (png_sPLT_entryp)png_malloc(
- png_ptr, new_palette.nentries * sizeof(png_sPLT_entry));
-
-#ifndef PNG_NO_POINTER_INDEXING
- for (i = 0; i < new_palette.nentries; i++)
- {
- png_sPLT_entryp pp = new_palette.entries + i;
-
- if (new_palette.depth == 8)
- {
- pp->red = *entry_start++;
- pp->green = *entry_start++;
- pp->blue = *entry_start++;
- pp->alpha = *entry_start++;
- }
- else
- {
- pp->red = png_get_uint_16(entry_start); entry_start += 2;
- pp->green = png_get_uint_16(entry_start); entry_start += 2;
- pp->blue = png_get_uint_16(entry_start); entry_start += 2;
- pp->alpha = png_get_uint_16(entry_start); entry_start += 2;
- }
- pp->frequency = png_get_uint_16(entry_start); entry_start += 2;
- }
-#else
- pp = new_palette.entries;
- for (i = 0; i < new_palette.nentries; i++)
- {
-
- if (new_palette.depth == 8)
- {
- pp[i].red = *entry_start++;
- pp[i].green = *entry_start++;
- pp[i].blue = *entry_start++;
- pp[i].alpha = *entry_start++;
- }
- else
- {
- pp[i].red = png_get_uint_16(entry_start); entry_start += 2;
- pp[i].green = png_get_uint_16(entry_start); entry_start += 2;
- pp[i].blue = png_get_uint_16(entry_start); entry_start += 2;
- pp[i].alpha = png_get_uint_16(entry_start); entry_start += 2;
- }
- pp->frequency = png_get_uint_16(entry_start); entry_start += 2;
- }
-#endif
-
- /* discard all chunk data except the name and stash that */
- new_palette.name = (png_charp)chunkdata;
-
- png_set_sPLT(png_ptr, info_ptr, &new_palette, 1);
-
- png_free(png_ptr, chunkdata);
- png_free(png_ptr, new_palette.entries);
-}
-#endif /* PNG_READ_sPLT_SUPPORTED */
-
-#if defined(PNG_READ_tRNS_SUPPORTED)
-void /* PRIVATE */
-png_handle_tRNS(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
-{
- png_byte readbuf[PNG_MAX_PALETTE_LENGTH];
-
- png_debug(1, "in png_handle_tRNS\n");
-
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before tRNS");
- else if (png_ptr->mode & PNG_HAVE_IDAT)
- {
- png_warning(png_ptr, "Invalid tRNS after IDAT");
- png_crc_finish(png_ptr, length);
- return;
- }
- else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tRNS))
- {
- png_warning(png_ptr, "Duplicate tRNS chunk");
- png_crc_finish(png_ptr, length);
- return;
- }
-
- if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
- {
- if (!(png_ptr->mode & PNG_HAVE_PLTE))
- {
- /* Should be an error, but we can cope with it */
- png_warning(png_ptr, "Missing PLTE before tRNS");
- }
- else if (length > (png_uint_32)png_ptr->num_palette)
- {
- png_warning(png_ptr, "Incorrect tRNS chunk length");
- png_crc_finish(png_ptr, length);
- return;
- }
- if (length == 0)
- {
- png_warning(png_ptr, "Zero length tRNS chunk");
- png_crc_finish(png_ptr, length);
- return;
- }
-
- png_crc_read(png_ptr, readbuf, (png_size_t)length);
- png_ptr->num_trans = (png_uint_16)length;
- }
- else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB)
- {
- png_byte buf[6];
-
- if (length != 6)
- {
- png_warning(png_ptr, "Incorrect tRNS chunk length");
- png_crc_finish(png_ptr, length);
- return;
- }
-
- png_crc_read(png_ptr, buf, (png_size_t)length);
- png_ptr->num_trans = 1;
- png_ptr->trans_values.red = png_get_uint_16(buf);
- png_ptr->trans_values.green = png_get_uint_16(buf + 2);
- png_ptr->trans_values.blue = png_get_uint_16(buf + 4);
- }
- else if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY)
- {
- png_byte buf[6];
-
- if (length != 2)
- {
- png_warning(png_ptr, "Incorrect tRNS chunk length");
- png_crc_finish(png_ptr, length);
- return;
- }
-
- png_crc_read(png_ptr, buf, 2);
- png_ptr->num_trans = 1;
- png_ptr->trans_values.gray = png_get_uint_16(buf);
- }
- else
- {
- png_warning(png_ptr, "tRNS chunk not allowed with alpha channel");
- png_crc_finish(png_ptr, length);
- return;
- }
-
- if (png_crc_finish(png_ptr, 0))
- return;
-
- png_set_tRNS(png_ptr, info_ptr, readbuf, png_ptr->num_trans,
- &(png_ptr->trans_values));
-}
-#endif
-
-#if defined(PNG_READ_bKGD_SUPPORTED)
-void /* PRIVATE */
-png_handle_bKGD(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
-{
- png_size_t truelen;
- png_byte buf[6];
-
- png_debug(1, "in png_handle_bKGD\n");
-
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before bKGD");
- else if (png_ptr->mode & PNG_HAVE_IDAT)
- {
- png_warning(png_ptr, "Invalid bKGD after IDAT");
- png_crc_finish(png_ptr, length);
- return;
- }
- else if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE &&
- !(png_ptr->mode & PNG_HAVE_PLTE))
- {
- png_warning(png_ptr, "Missing PLTE before bKGD");
- png_crc_finish(png_ptr, length);
- return;
- }
- else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_bKGD))
- {
- png_warning(png_ptr, "Duplicate bKGD chunk");
- png_crc_finish(png_ptr, length);
- return;
- }
-
- if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
- truelen = 1;
- else if (png_ptr->color_type & PNG_COLOR_MASK_COLOR)
- truelen = 6;
- else
- truelen = 2;
-
- if (length != truelen)
- {
- png_warning(png_ptr, "Incorrect bKGD chunk length");
- png_crc_finish(png_ptr, length);
- return;
- }
-
- png_crc_read(png_ptr, buf, truelen);
- if (png_crc_finish(png_ptr, 0))
- return;
-
- /* We convert the index value into RGB components so that we can allow
- * arbitrary RGB values for background when we have transparency, and
- * so it is easy to determine the RGB values of the background color
- * from the info_ptr struct. */
- if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
- {
- png_ptr->background.index = buf[0];
- if(info_ptr->num_palette)
- {
- if(buf[0] > info_ptr->num_palette)
- {
- png_warning(png_ptr, "Incorrect bKGD chunk index value");
- return;
- }
- png_ptr->background.red =
- (png_uint_16)png_ptr->palette[buf[0]].red;
- png_ptr->background.green =
- (png_uint_16)png_ptr->palette[buf[0]].green;
- png_ptr->background.blue =
- (png_uint_16)png_ptr->palette[buf[0]].blue;
- }
- }
- else if (!(png_ptr->color_type & PNG_COLOR_MASK_COLOR)) /* GRAY */
- {
- png_ptr->background.red =
- png_ptr->background.green =
- png_ptr->background.blue =
- png_ptr->background.gray = png_get_uint_16(buf);
- }
- else
- {
- png_ptr->background.red = png_get_uint_16(buf);
- png_ptr->background.green = png_get_uint_16(buf + 2);
- png_ptr->background.blue = png_get_uint_16(buf + 4);
- }
-
- png_set_bKGD(png_ptr, info_ptr, &(png_ptr->background));
-}
-#endif
-
-#if defined(PNG_READ_hIST_SUPPORTED)
-void /* PRIVATE */
-png_handle_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
-{
- int num, i;
- png_uint_16 readbuf[PNG_MAX_PALETTE_LENGTH];
-
- png_debug(1, "in png_handle_hIST\n");
-
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before hIST");
- else if (png_ptr->mode & PNG_HAVE_IDAT)
- {
- png_warning(png_ptr, "Invalid hIST after IDAT");
- png_crc_finish(png_ptr, length);
- return;
- }
- else if (!(png_ptr->mode & PNG_HAVE_PLTE))
- {
- png_warning(png_ptr, "Missing PLTE before hIST");
- png_crc_finish(png_ptr, length);
- return;
- }
- else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_hIST))
- {
- png_warning(png_ptr, "Duplicate hIST chunk");
- png_crc_finish(png_ptr, length);
- return;
- }
-
- num = (int)length / 2 ;
- if (num != png_ptr->num_palette)
- {
- png_warning(png_ptr, "Incorrect hIST chunk length");
- png_crc_finish(png_ptr, length);
- return;
- }
-
- for (i = 0; i < num; i++)
- {
- png_byte buf[2];
-
- png_crc_read(png_ptr, buf, 2);
- readbuf[i] = png_get_uint_16(buf);
- }
-
- if (png_crc_finish(png_ptr, 0))
- return;
-
- png_set_hIST(png_ptr, info_ptr, readbuf);
-}
-#endif
-
-#if defined(PNG_READ_pHYs_SUPPORTED)
-void /* PRIVATE */
-png_handle_pHYs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
-{
- png_byte buf[9];
- png_uint_32 res_x, res_y;
- int unit_type;
-
- png_debug(1, "in png_handle_pHYs\n");
-
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before pHYs");
- else if (png_ptr->mode & PNG_HAVE_IDAT)
- {
- png_warning(png_ptr, "Invalid pHYs after IDAT");
- png_crc_finish(png_ptr, length);
- return;
- }
- else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pHYs))
- {
- png_warning(png_ptr, "Duplicate pHYs chunk");
- png_crc_finish(png_ptr, length);
- return;
- }
-
- if (length != 9)
- {
- png_warning(png_ptr, "Incorrect pHYs chunk length");
- png_crc_finish(png_ptr, length);
- return;
- }
-
- png_crc_read(png_ptr, buf, 9);
- if (png_crc_finish(png_ptr, 0))
- return;
-
- res_x = png_get_uint_32(buf);
- res_y = png_get_uint_32(buf + 4);
- unit_type = buf[8];
- png_set_pHYs(png_ptr, info_ptr, res_x, res_y, unit_type);
-}
-#endif
-
-#if defined(PNG_READ_oFFs_SUPPORTED)
-void /* PRIVATE */
-png_handle_oFFs(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
-{
- png_byte buf[9];
- png_int_32 offset_x, offset_y;
- int unit_type;
-
- png_debug(1, "in png_handle_oFFs\n");
-
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before oFFs");
- else if (png_ptr->mode & PNG_HAVE_IDAT)
- {
- png_warning(png_ptr, "Invalid oFFs after IDAT");
- png_crc_finish(png_ptr, length);
- return;
- }
- else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_oFFs))
- {
- png_warning(png_ptr, "Duplicate oFFs chunk");
- png_crc_finish(png_ptr, length);
- return;
- }
-
- if (length != 9)
- {
- png_warning(png_ptr, "Incorrect oFFs chunk length");
- png_crc_finish(png_ptr, length);
- return;
- }
-
- png_crc_read(png_ptr, buf, 9);
- if (png_crc_finish(png_ptr, 0))
- return;
-
- offset_x = png_get_int_32(buf);
- offset_y = png_get_int_32(buf + 4);
- unit_type = buf[8];
- png_set_oFFs(png_ptr, info_ptr, offset_x, offset_y, unit_type);
-}
-#endif
-
-#if defined(PNG_READ_pCAL_SUPPORTED)
-/* read the pCAL chunk (described in the PNG Extensions document) */
-void /* PRIVATE */
-png_handle_pCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
-{
- png_charp purpose;
- png_int_32 X0, X1;
- png_byte type, nparams;
- png_charp buf, units, endptr;
- png_charpp params;
- png_size_t slength;
- int i;
-
- png_debug(1, "in png_handle_pCAL\n");
-
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before pCAL");
- else if (png_ptr->mode & PNG_HAVE_IDAT)
- {
- png_warning(png_ptr, "Invalid pCAL after IDAT");
- png_crc_finish(png_ptr, length);
- return;
- }
- else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_pCAL))
- {
- png_warning(png_ptr, "Duplicate pCAL chunk");
- png_crc_finish(png_ptr, length);
- return;
- }
-
- png_debug1(2, "Allocating and reading pCAL chunk data (%lu bytes)\n",
- length + 1);
- purpose = (png_charp)png_malloc(png_ptr, length + 1);
- slength = (png_size_t)length;
- png_crc_read(png_ptr, (png_bytep)purpose, slength);
-
- if (png_crc_finish(png_ptr, 0))
- {
- png_free(png_ptr, purpose);
- return;
- }
-
- purpose[slength] = 0x00; /* null terminate the last string */
-
- png_debug(3, "Finding end of pCAL purpose string\n");
- for (buf = purpose; *buf; buf++)
- /* empty loop */ ;
-
- endptr = purpose + slength;
-
- /* We need to have at least 12 bytes after the purpose string
- in order to get the parameter information. */
- if (endptr <= buf + 12)
- {
- png_warning(png_ptr, "Invalid pCAL data");
- png_free(png_ptr, purpose);
- return;
- }
-
- png_debug(3, "Reading pCAL X0, X1, type, nparams, and units\n");
- X0 = png_get_int_32((png_bytep)buf+1);
- X1 = png_get_int_32((png_bytep)buf+5);
- type = buf[9];
- nparams = buf[10];
- units = buf + 11;
-
- png_debug(3, "Checking pCAL equation type and number of parameters\n");
- /* Check that we have the right number of parameters for known
- equation types. */
- if ((type == PNG_EQUATION_LINEAR && nparams != 2) ||
- (type == PNG_EQUATION_BASE_E && nparams != 3) ||
- (type == PNG_EQUATION_ARBITRARY && nparams != 3) ||
- (type == PNG_EQUATION_HYPERBOLIC && nparams != 4))
- {
- png_warning(png_ptr, "Invalid pCAL parameters for equation type");
- png_free(png_ptr, purpose);
- return;
- }
- else if (type >= PNG_EQUATION_LAST)
- {
- png_warning(png_ptr, "Unrecognized equation type for pCAL chunk");
- }
-
- for (buf = units; *buf; buf++)
- /* Empty loop to move past the units string. */ ;
-
- png_debug(3, "Allocating pCAL parameters array\n");
- params = (png_charpp)png_malloc(png_ptr, (png_uint_32)(nparams
- *sizeof(png_charp))) ;
-
- /* Get pointers to the start of each parameter string. */
- for (i = 0; i < (int)nparams; i++)
- {
- buf++; /* Skip the null string terminator from previous parameter. */
-
- png_debug1(3, "Reading pCAL parameter %d\n", i);
- for (params[i] = buf; *buf != 0x00 && buf <= endptr; buf++)
- /* Empty loop to move past each parameter string */ ;
-
- /* Make sure we haven't run out of data yet */
- if (buf > endptr)
- {
- png_warning(png_ptr, "Invalid pCAL data");
- png_free(png_ptr, purpose);
- png_free(png_ptr, params);
- return;
- }
- }
-
- png_set_pCAL(png_ptr, info_ptr, purpose, X0, X1, type, nparams,
- units, params);
-
- png_free(png_ptr, purpose);
- png_free(png_ptr, params);
-}
-#endif
-
-#if defined(PNG_READ_sCAL_SUPPORTED)
-/* read the sCAL chunk */
-void /* PRIVATE */
-png_handle_sCAL(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
-{
- png_charp buffer, ep;
-#ifdef PNG_FLOATING_POINT_SUPPORTED
- double width, height;
- png_charp vp;
-#else
-#ifdef PNG_FIXED_POINT_SUPPORTED
- png_charp swidth, sheight;
-#endif
-#endif
- png_size_t slength;
-
- png_debug(1, "in png_handle_sCAL\n");
-
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before sCAL");
- else if (png_ptr->mode & PNG_HAVE_IDAT)
- {
- png_warning(png_ptr, "Invalid sCAL after IDAT");
- png_crc_finish(png_ptr, length);
- return;
- }
- else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_sCAL))
- {
- png_warning(png_ptr, "Duplicate sCAL chunk");
- png_crc_finish(png_ptr, length);
- return;
- }
-
- png_debug1(2, "Allocating and reading sCAL chunk data (%lu bytes)\n",
- length + 1);
- buffer = (png_charp)png_malloc(png_ptr, length + 1);
- slength = (png_size_t)length;
- png_crc_read(png_ptr, (png_bytep)buffer, slength);
-
- if (png_crc_finish(png_ptr, 0))
- {
- png_free(png_ptr, buffer);
- return;
- }
-
- buffer[slength] = 0x00; /* null terminate the last string */
-
- ep = buffer + 1; /* skip unit byte */
-
-#ifdef PNG_FLOATING_POINT_SUPPORTED
- width = strtod(ep, &vp);
- if (*vp)
- {
- png_warning(png_ptr, "malformed width string in sCAL chunk");
- return;
- }
-#else
-#ifdef PNG_FIXED_POINT_SUPPORTED
- swidth = (png_charp)png_malloc(png_ptr, png_strlen(ep) + 1);
- png_memcpy(swidth, ep, (png_size_t)png_strlen(ep));
-#endif
-#endif
-
- for (ep = buffer; *ep; ep++)
- /* empty loop */ ;
- ep++;
-
-#ifdef PNG_FLOATING_POINT_SUPPORTED
- height = strtod(ep, &vp);
- if (*vp)
- {
- png_warning(png_ptr, "malformed height string in sCAL chunk");
- return;
- }
-#else
-#ifdef PNG_FIXED_POINT_SUPPORTED
- sheight = (png_charp)png_malloc(png_ptr, png_strlen(ep) + 1);
- png_memcpy(sheight, ep, (png_size_t)png_strlen(ep));
-#endif
-#endif
-
- if (buffer + slength < ep
-#ifdef PNG_FLOATING_POINT_SUPPORTED
- || width <= 0. || height <= 0.
-#endif
- )
- {
- png_warning(png_ptr, "Invalid sCAL data");
- png_free(png_ptr, buffer);
-#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED)
- png_free(png_ptr, swidth);
- png_free(png_ptr, sheight);
-#endif
- return;
- }
-
-
-#ifdef PNG_FLOATING_POINT_SUPPORTED
- png_set_sCAL(png_ptr, info_ptr, buffer[0], width, height);
-#else
-#ifdef PNG_FIXED_POINT_SUPPORTED
- png_set_sCAL_s(png_ptr, info_ptr, buffer[0], swidth, sheight);
-#endif
-#endif
-
- png_free(png_ptr, buffer);
-#if defined(PNG_FIXED_POINT_SUPPORTED) && !defined(PNG_FLOATING_POINT_SUPPORTED)
- png_free(png_ptr, swidth);
- png_free(png_ptr, sheight);
-#endif
-}
-#endif
-
-#if defined(PNG_READ_tIME_SUPPORTED)
-void /* PRIVATE */
-png_handle_tIME(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
-{
- png_byte buf[7];
- png_time mod_time;
-
- png_debug(1, "in png_handle_tIME\n");
-
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Out of place tIME chunk");
- else if (info_ptr != NULL && (info_ptr->valid & PNG_INFO_tIME))
- {
- png_warning(png_ptr, "Duplicate tIME chunk");
- png_crc_finish(png_ptr, length);
- return;
- }
-
- if (png_ptr->mode & PNG_HAVE_IDAT)
- png_ptr->mode |= PNG_AFTER_IDAT;
-
- if (length != 7)
- {
- png_warning(png_ptr, "Incorrect tIME chunk length");
- png_crc_finish(png_ptr, length);
- return;
- }
-
- png_crc_read(png_ptr, buf, 7);
- if (png_crc_finish(png_ptr, 0))
- return;
-
- mod_time.second = buf[6];
- mod_time.minute = buf[5];
- mod_time.hour = buf[4];
- mod_time.day = buf[3];
- mod_time.month = buf[2];
- mod_time.year = png_get_uint_16(buf);
-
- png_set_tIME(png_ptr, info_ptr, &mod_time);
-}
-#endif
-
-#if defined(PNG_READ_tEXt_SUPPORTED)
-/* Note: this does not properly handle chunks that are > 64K under DOS */
-void /* PRIVATE */
-png_handle_tEXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
-{
- png_textp text_ptr;
- png_charp key;
- png_charp text;
- png_uint_32 skip = 0;
- png_size_t slength;
-
- png_debug(1, "in png_handle_tEXt\n");
-
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before tEXt");
-
- if (png_ptr->mode & PNG_HAVE_IDAT)
- png_ptr->mode |= PNG_AFTER_IDAT;
-
-#ifdef PNG_MAX_MALLOC_64K
- if (length > (png_uint_32)65535L)
- {
- png_warning(png_ptr, "tEXt chunk too large to fit in memory");
- skip = length - (png_uint_32)65535L;
- length = (png_uint_32)65535L;
- }
-#endif
-
- key = (png_charp)png_malloc(png_ptr, length + 1);
- slength = (png_size_t)length;
- png_crc_read(png_ptr, (png_bytep)key, slength);
-
- if (png_crc_finish(png_ptr, skip))
- {
- png_free(png_ptr, key);
- return;
- }
-
- key[slength] = 0x00;
-
- for (text = key; *text; text++)
- /* empty loop to find end of key */ ;
-
- if (text != key + slength)
- text++;
-
- text_ptr = (png_textp)png_malloc(png_ptr, (png_uint_32)sizeof(png_text));
- text_ptr->compression = PNG_TEXT_COMPRESSION_NONE;
- text_ptr->key = key;
-#ifdef PNG_iTXt_SUPPORTED
- text_ptr->lang = NULL;
- text_ptr->lang_key = NULL;
- text_ptr->itxt_length = 0;
-#endif
- text_ptr->text = text;
- text_ptr->text_length = png_strlen(text);
-
- png_set_text(png_ptr, info_ptr, text_ptr, 1);
-
- png_free(png_ptr, key);
- png_free(png_ptr, text_ptr);
-}
-#endif
-
-#if defined(PNG_READ_zTXt_SUPPORTED)
-/* note: this does not correctly handle chunks that are > 64K under DOS */
-void /* PRIVATE */
-png_handle_zTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
-{
- png_textp text_ptr;
- png_charp chunkdata;
- png_charp text;
- int comp_type;
- png_size_t slength, prefix_len, data_len;
-
- png_debug(1, "in png_handle_zTXt\n");
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before zTXt");
-
- if (png_ptr->mode & PNG_HAVE_IDAT)
- png_ptr->mode |= PNG_AFTER_IDAT;
-
-#ifdef PNG_MAX_MALLOC_64K
- /* We will no doubt have problems with chunks even half this size, but
- there is no hard and fast rule to tell us where to stop. */
- if (length > (png_uint_32)65535L)
- {
- png_warning(png_ptr,"zTXt chunk too large to fit in memory");
- png_crc_finish(png_ptr, length);
- return;
- }
-#endif
-
- chunkdata = (png_charp)png_malloc(png_ptr, length + 1);
- slength = (png_size_t)length;
- png_crc_read(png_ptr, (png_bytep)chunkdata, slength);
- if (png_crc_finish(png_ptr, 0))
- {
- png_free(png_ptr, chunkdata);
- return;
- }
-
- chunkdata[slength] = 0x00;
-
- for (text = chunkdata; *text; text++)
- /* empty loop */ ;
-
- /* zTXt must have some text after the chunkdataword */
- if (text == chunkdata + slength)
- {
- comp_type = PNG_TEXT_COMPRESSION_NONE;
- png_warning(png_ptr, "Zero length zTXt chunk");
- }
- else
- {
- comp_type = *(++text);
- if (comp_type != PNG_TEXT_COMPRESSION_zTXt)
- {
- png_warning(png_ptr, "Unknown compression type in zTXt chunk");
- comp_type = PNG_TEXT_COMPRESSION_zTXt;
- }
- text++; /* skip the compression_method byte */
- }
- prefix_len = text - chunkdata;
-
- chunkdata = (png_charp)png_decompress_chunk(png_ptr, comp_type, chunkdata,
- (png_size_t)length, prefix_len, &data_len);
-
- text_ptr = (png_textp)png_malloc(png_ptr, (png_uint_32)sizeof(png_text));
- text_ptr->compression = comp_type;
- text_ptr->key = chunkdata;
-#ifdef PNG_iTXt_SUPPORTED
- text_ptr->lang = NULL;
- text_ptr->lang_key = NULL;
- text_ptr->itxt_length = 0;
-#endif
- text_ptr->text = chunkdata + prefix_len;
- text_ptr->text_length = data_len;
-
- png_set_text(png_ptr, info_ptr, text_ptr, 1);
-
- png_free(png_ptr, text_ptr);
- png_free(png_ptr, chunkdata);
-}
-#endif
-
-#if defined(PNG_READ_iTXt_SUPPORTED)
-/* note: this does not correctly handle chunks that are > 64K under DOS */
-void /* PRIVATE */
-png_handle_iTXt(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
-{
- png_textp text_ptr;
- png_charp chunkdata;
- png_charp key, lang, text, lang_key;
- int comp_flag;
- int comp_type = 0;
- png_size_t slength, prefix_len, data_len;
-
- png_debug(1, "in png_handle_iTXt\n");
-
- if (!(png_ptr->mode & PNG_HAVE_IHDR))
- png_error(png_ptr, "Missing IHDR before iTXt");
-
- if (png_ptr->mode & PNG_HAVE_IDAT)
- png_ptr->mode |= PNG_AFTER_IDAT;
-
-#ifdef PNG_MAX_MALLOC_64K
- /* We will no doubt have problems with chunks even half this size, but
- there is no hard and fast rule to tell us where to stop. */
- if (length > (png_uint_32)65535L)
- {
- png_warning(png_ptr,"iTXt chunk too large to fit in memory");
- png_crc_finish(png_ptr, length);
- return;
- }
-#endif
-
- chunkdata = (png_charp)png_malloc(png_ptr, length + 1);
- slength = (png_size_t)length;
- png_crc_read(png_ptr, (png_bytep)chunkdata, slength);
- if (png_crc_finish(png_ptr, 0))
- {
- png_free(png_ptr, chunkdata);
- return;
- }
-
- chunkdata[slength] = 0x00;
-
- for (lang = chunkdata; *lang; lang++)
- /* empty loop */ ;
- lang++; /* skip NUL separator */
-
- /* iTXt must have a language tag (possibly empty), two compression bytes,
- translated keyword (possibly empty), and possibly some text after the
- keyword */
-
- if (lang >= chunkdata + slength)
- {
- comp_flag = PNG_TEXT_COMPRESSION_NONE;
- png_warning(png_ptr, "Zero length iTXt chunk");
- }
- else
- {
- comp_flag = *lang++;
- comp_type = *lang++;
- }
-
- for (lang_key = lang; *lang_key; lang_key++)
- /* empty loop */ ;
- lang_key++; /* skip NUL separator */
-
- for (text = lang_key; *text; text++)
- /* empty loop */ ;
- text++; /* skip NUL separator */
-
- prefix_len = text - chunkdata;
-
- key=chunkdata;
- if (comp_flag)
- chunkdata = png_decompress_chunk(png_ptr, comp_type, chunkdata,
- (size_t)length, prefix_len, &data_len);
- else
- data_len=png_strlen(chunkdata + prefix_len);
- text_ptr = (png_textp)png_malloc(png_ptr, (png_uint_32)sizeof(png_text));
- text_ptr->compression = (int)comp_flag + 1;
- text_ptr->lang_key = chunkdata+(lang_key-key);
- text_ptr->lang = chunkdata+(lang-key);
- text_ptr->itxt_length = data_len;
- text_ptr->text_length = 0;
- text_ptr->key = chunkdata;
- text_ptr->text = chunkdata + prefix_len;
-
- png_set_text(png_ptr, info_ptr, text_ptr, 1);
-
- png_free(png_ptr, text_ptr);
- png_free(png_ptr, chunkdata);
-}
-#endif
-
-/* This function is called when we haven't found a handler for a
- chunk. If there isn't a problem with the chunk itself (ie bad
- chunk name, CRC, or a critical chunk), the chunk is silently ignored
- -- unless the PNG_FLAG_UNKNOWN_CHUNKS_SUPPORTED flag is on in which
- case it will be saved away to be written out later. */
-void /* PRIVATE */
-png_handle_unknown(png_structp png_ptr, png_infop info_ptr, png_uint_32 length)
-{
- png_uint_32 skip = 0;
-
- png_debug(1, "in png_handle_unknown\n");
-
- if (png_ptr->mode & PNG_HAVE_IDAT)
- {
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_IDAT;
-#endif
- if (png_memcmp(png_ptr->chunk_name, png_IDAT, 4)) /* not an IDAT */
- png_ptr->mode |= PNG_AFTER_IDAT;
- }
-
- png_check_chunk_name(png_ptr, png_ptr->chunk_name);
-
- if (!(png_ptr->chunk_name[0] & 0x20))
- {
-#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
- if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
- HANDLE_CHUNK_ALWAYS
-#if defined(PNG_READ_USER_CHUNKS_SUPPORTED)
- && png_ptr->read_user_chunk_fn == NULL
-#endif
- )
-#endif
- png_chunk_error(png_ptr, "unknown critical chunk");
- }
-
-#if defined(PNG_READ_UNKNOWN_CHUNKS_SUPPORTED)
- if (png_ptr->flags & PNG_FLAG_KEEP_UNKNOWN_CHUNKS)
- {
- png_unknown_chunk chunk;
-
-#ifdef PNG_MAX_MALLOC_64K
- if (length > (png_uint_32)65535L)
- {
- png_warning(png_ptr, "unknown chunk too large to fit in memory");
- skip = length - (png_uint_32)65535L;
- length = (png_uint_32)65535L;
- }
-#endif
- png_strcpy((png_charp)chunk.name, (png_charp)png_ptr->chunk_name);
- chunk.data = (png_bytep)png_malloc(png_ptr, length);
- chunk.size = (png_size_t)length;
- png_crc_read(png_ptr, (png_bytep)chunk.data, length);
-#if defined(PNG_READ_USER_CHUNKS_SUPPORTED)
- if(png_ptr->read_user_chunk_fn != NULL)
- {
- /* callback to user unknown chunk handler */
- if ((*(png_ptr->read_user_chunk_fn)) (png_ptr, &chunk) <= 0)
- {
- if (!(png_ptr->chunk_name[0] & 0x20))
- if(png_handle_as_unknown(png_ptr, png_ptr->chunk_name) !=
- HANDLE_CHUNK_ALWAYS)
- png_chunk_error(png_ptr, "unknown critical chunk");
- png_set_unknown_chunks(png_ptr, info_ptr, &chunk, 1);
- }
- }
- else
-#endif
- png_set_unknown_chunks(png_ptr, info_ptr, &chunk, 1);
- png_free(png_ptr, chunk.data);
- }
- else
-#endif
- skip = length;
-
- png_crc_finish(png_ptr, skip);
-
-#if !defined(PNG_READ_USER_CHUNKS_SUPPORTED)
- info_ptr = info_ptr; /* quiet compiler warnings about unused info_ptr */
-#endif
-}
-
-/* This function is called to verify that a chunk name is valid.
- This function can't have the "critical chunk check" incorporated
- into it, since in the future we will need to be able to call user
- functions to handle unknown critical chunks after we check that
- the chunk name itself is valid. */
-
-#define isnonalpha(c) ((c) < 41 || (c) > 122 || ((c) > 90 && (c) < 97))
-
-void /* PRIVATE */
-png_check_chunk_name(png_structp png_ptr, png_bytep chunk_name)
-{
- png_debug(1, "in png_check_chunk_name\n");
- if (isnonalpha(chunk_name[0]) || isnonalpha(chunk_name[1]) ||
- isnonalpha(chunk_name[2]) || isnonalpha(chunk_name[3]))
- {
- png_chunk_error(png_ptr, "invalid chunk type");
- }
-}
-
-/* Combines the row recently read in with the existing pixels in the
- row. This routine takes care of alpha and transparency if requested.
- This routine also handles the two methods of progressive display
- of interlaced images, depending on the mask value.
- The mask value describes which pixels are to be combined with
- the row. The pattern always repeats every 8 pixels, so just 8
- bits are needed. A one indicates the pixel is to be combined,
- a zero indicates the pixel is to be skipped. This is in addition
- to any alpha or transparency value associated with the pixel. If
- you want all pixels to be combined, pass 0xff (255) in mask. */
-#ifndef PNG_HAVE_ASSEMBLER_COMBINE_ROW
-void /* PRIVATE */
-png_combine_row(png_structp png_ptr, png_bytep row, int mask)
-{
- png_debug(1,"in png_combine_row\n");
- if (mask == 0xff)
- {
- png_memcpy(row, png_ptr->row_buf + 1,
- (png_size_t)((png_ptr->width *
- png_ptr->row_info.pixel_depth + 7) >> 3));
- }
- else
- {
- switch (png_ptr->row_info.pixel_depth)
- {
- case 1:
- {
- png_bytep sp = png_ptr->row_buf + 1;
- png_bytep dp = row;
- int s_inc, s_start, s_end;
- int m = 0x80;
- int shift;
- png_uint_32 i;
- png_uint_32 row_width = png_ptr->width;
-
-#if defined(PNG_READ_PACKSWAP_SUPPORTED)
- if (png_ptr->transformations & PNG_PACKSWAP)
- {
- s_start = 0;
- s_end = 7;
- s_inc = 1;
- }
- else
-#endif
- {
- s_start = 7;
- s_end = 0;
- s_inc = -1;
- }
-
- shift = s_start;
-
- for (i = 0; i < row_width; i++)
- {
- if (m & mask)
- {
- int value;
-
- value = (*sp >> shift) & 0x01;
- *dp &= (png_byte)((0x7f7f >> (7 - shift)) & 0xff);
- *dp |= (png_byte)(value << shift);
- }
-
- if (shift == s_end)
- {
- shift = s_start;
- sp++;
- dp++;
- }
- else
- shift += s_inc;
-
- if (m == 1)
- m = 0x80;
- else
- m >>= 1;
- }
- break;
- }
- case 2:
- {
- png_bytep sp = png_ptr->row_buf + 1;
- png_bytep dp = row;
- int s_start, s_end, s_inc;
- int m = 0x80;
- int shift;
- png_uint_32 i;
- png_uint_32 row_width = png_ptr->width;
- int value;
-
-#if defined(PNG_READ_PACKSWAP_SUPPORTED)
- if (png_ptr->transformations & PNG_PACKSWAP)
- {
- s_start = 0;
- s_end = 6;
- s_inc = 2;
- }
- else
-#endif
- {
- s_start = 6;
- s_end = 0;
- s_inc = -2;
- }
-
- shift = s_start;
-
- for (i = 0; i < row_width; i++)
- {
- if (m & mask)
- {
- value = (*sp >> shift) & 0x03;
- *dp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff);
- *dp |= (png_byte)(value << shift);
- }
-
- if (shift == s_end)
- {
- shift = s_start;
- sp++;
- dp++;
- }
- else
- shift += s_inc;
- if (m == 1)
- m = 0x80;
- else
- m >>= 1;
- }
- break;
- }
- case 4:
- {
- png_bytep sp = png_ptr->row_buf + 1;
- png_bytep dp = row;
- int s_start, s_end, s_inc;
- int m = 0x80;
- int shift;
- png_uint_32 i;
- png_uint_32 row_width = png_ptr->width;
- int value;
-
-#if defined(PNG_READ_PACKSWAP_SUPPORTED)
- if (png_ptr->transformations & PNG_PACKSWAP)
- {
- s_start = 0;
- s_end = 4;
- s_inc = 4;
- }
- else
-#endif
- {
- s_start = 4;
- s_end = 0;
- s_inc = -4;
- }
- shift = s_start;
-
- for (i = 0; i < row_width; i++)
- {
- if (m & mask)
- {
- value = (*sp >> shift) & 0xf;
- *dp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff);
- *dp |= (png_byte)(value << shift);
- }
-
- if (shift == s_end)
- {
- shift = s_start;
- sp++;
- dp++;
- }
- else
- shift += s_inc;
- if (m == 1)
- m = 0x80;
- else
- m >>= 1;
- }
- break;
- }
- default:
- {
- png_bytep sp = png_ptr->row_buf + 1;
- png_bytep dp = row;
- png_size_t pixel_bytes = (png_ptr->row_info.pixel_depth >> 3);
- png_uint_32 i;
- png_uint_32 row_width = png_ptr->width;
- png_byte m = 0x80;
-
-
- for (i = 0; i < row_width; i++)
- {
- if (m & mask)
- {
- png_memcpy(dp, sp, pixel_bytes);
- }
-
- sp += pixel_bytes;
- dp += pixel_bytes;
-
- if (m == 1)
- m = 0x80;
- else
- m >>= 1;
- }
- break;
- }
- }
- }
-}
-#endif /* !PNG_HAVE_ASSEMBLER_COMBINE_ROW */
-
-#ifdef PNG_READ_INTERLACING_SUPPORTED
-#ifndef PNG_HAVE_ASSEMBLER_READ_INTERLACE /* else in pngvcrd.c, pnggccrd.c */
-/* OLD pre-1.0.9 interface:
-void png_do_read_interlace(png_row_infop row_info, png_bytep row, int pass,
- png_uint_32 transformations)
- */
-void /* PRIVATE */
-png_do_read_interlace(png_structp png_ptr)
-{
- png_row_infop row_info = &(png_ptr->row_info);
- png_bytep row = png_ptr->row_buf + 1;
- int pass = png_ptr->pass;
- png_uint_32 transformations = png_ptr->transformations;
-#ifdef PNG_USE_LOCAL_ARRAYS
- /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
- /* offset to next interlace block */
- const int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
-#endif
-
- png_debug(1,"in png_do_read_interlace (stock C version)\n");
- if (row != NULL && row_info != NULL)
- {
- png_uint_32 final_width;
-
- final_width = row_info->width * png_pass_inc[pass];
-
- switch (row_info->pixel_depth)
- {
- case 1:
- {
- png_bytep sp = row + (png_size_t)((row_info->width - 1) >> 3);
- png_bytep dp = row + (png_size_t)((final_width - 1) >> 3);
- int sshift, dshift;
- int s_start, s_end, s_inc;
- int jstop = png_pass_inc[pass];
- png_byte v;
- png_uint_32 i;
- int j;
-
-#if defined(PNG_READ_PACKSWAP_SUPPORTED)
- if (transformations & PNG_PACKSWAP)
- {
- sshift = (int)((row_info->width + 7) & 0x07);
- dshift = (int)((final_width + 7) & 0x07);
- s_start = 7;
- s_end = 0;
- s_inc = -1;
- }
- else
-#endif
- {
- sshift = 7 - (int)((row_info->width + 7) & 0x07);
- dshift = 7 - (int)((final_width + 7) & 0x07);
- s_start = 0;
- s_end = 7;
- s_inc = 1;
- }
-
- for (i = 0; i < row_info->width; i++)
- {
- v = (png_byte)((*sp >> sshift) & 0x01);
- for (j = 0; j < jstop; j++)
- {
- *dp &= (png_byte)((0x7f7f >> (7 - dshift)) & 0xff);
- *dp |= (png_byte)(v << dshift);
- if (dshift == s_end)
- {
- dshift = s_start;
- dp--;
- }
- else
- dshift += s_inc;
- }
- if (sshift == s_end)
- {
- sshift = s_start;
- sp--;
- }
- else
- sshift += s_inc;
- }
- break;
- }
- case 2:
- {
- png_bytep sp = row + (png_uint_32)((row_info->width - 1) >> 2);
- png_bytep dp = row + (png_uint_32)((final_width - 1) >> 2);
- int sshift, dshift;
- int s_start, s_end, s_inc;
- int jstop = png_pass_inc[pass];
- png_uint_32 i;
-
-#if defined(PNG_READ_PACKSWAP_SUPPORTED)
- if (transformations & PNG_PACKSWAP)
- {
- sshift = (int)(((row_info->width + 3) & 0x03) << 1);
- dshift = (int)(((final_width + 3) & 0x03) << 1);
- s_start = 6;
- s_end = 0;
- s_inc = -2;
- }
- else
-#endif
- {
- sshift = (int)((3 - ((row_info->width + 3) & 0x03)) << 1);
- dshift = (int)((3 - ((final_width + 3) & 0x03)) << 1);
- s_start = 0;
- s_end = 6;
- s_inc = 2;
- }
-
- for (i = 0; i < row_info->width; i++)
- {
- png_byte v;
- int j;
-
- v = (png_byte)((*sp >> sshift) & 0x03);
- for (j = 0; j < jstop; j++)
- {
- *dp &= (png_byte)((0x3f3f >> (6 - dshift)) & 0xff);
- *dp |= (png_byte)(v << dshift);
- if (dshift == s_end)
- {
- dshift = s_start;
- dp--;
- }
- else
- dshift += s_inc;
- }
- if (sshift == s_end)
- {
- sshift = s_start;
- sp--;
- }
- else
- sshift += s_inc;
- }
- break;
- }
- case 4:
- {
- png_bytep sp = row + (png_size_t)((row_info->width - 1) >> 1);
- png_bytep dp = row + (png_size_t)((final_width - 1) >> 1);
- int sshift, dshift;
- int s_start, s_end, s_inc;
- png_uint_32 i;
- int jstop = png_pass_inc[pass];
-
-#if defined(PNG_READ_PACKSWAP_SUPPORTED)
- if (transformations & PNG_PACKSWAP)
- {
- sshift = (int)(((row_info->width + 1) & 0x01) << 2);
- dshift = (int)(((final_width + 1) & 0x01) << 2);
- s_start = 4;
- s_end = 0;
- s_inc = -4;
- }
- else
-#endif
- {
- sshift = (int)((1 - ((row_info->width + 1) & 0x01)) << 2);
- dshift = (int)((1 - ((final_width + 1) & 0x01)) << 2);
- s_start = 0;
- s_end = 4;
- s_inc = 4;
- }
-
- for (i = 0; i < row_info->width; i++)
- {
- png_byte v = (png_byte)((*sp >> sshift) & 0xf);
- int j;
-
- for (j = 0; j < jstop; j++)
- {
- *dp &= (png_byte)((0xf0f >> (4 - dshift)) & 0xff);
- *dp |= (png_byte)(v << dshift);
- if (dshift == s_end)
- {
- dshift = s_start;
- dp--;
- }
- else
- dshift += s_inc;
- }
- if (sshift == s_end)
- {
- sshift = s_start;
- sp--;
- }
- else
- sshift += s_inc;
- }
- break;
- }
- default:
- {
- png_size_t pixel_bytes = (row_info->pixel_depth >> 3);
- png_bytep sp = row + (png_size_t)(row_info->width - 1) * pixel_bytes;
- png_bytep dp = row + (png_size_t)(final_width - 1) * pixel_bytes;
-
- int jstop = png_pass_inc[pass];
- png_uint_32 i;
-
- for (i = 0; i < row_info->width; i++)
- {
- png_byte v[8];
- int j;
-
- png_memcpy(v, sp, pixel_bytes);
- for (j = 0; j < jstop; j++)
- {
- png_memcpy(dp, v, pixel_bytes);
- dp -= pixel_bytes;
- }
- sp -= pixel_bytes;
- }
- break;
- }
- }
- row_info->width = final_width;
- row_info->rowbytes = ((final_width *
- (png_uint_32)row_info->pixel_depth + 7) >> 3);
- }
-#if !defined(PNG_READ_PACKSWAP_SUPPORTED)
- transformations = transformations; /* silence compiler warning */
-#endif
-}
-#endif /* !PNG_HAVE_ASSEMBLER_READ_INTERLACE */
-#endif /* PNG_READ_INTERLACING_SUPPORTED */
-
-#ifndef PNG_HAVE_ASSEMBLER_READ_FILTER_ROW
-void /* PRIVATE */
-png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep row,
- png_bytep prev_row, int filter)
-{
- png_debug(1, "in png_read_filter_row\n");
- png_debug2(2,"row = %lu, filter = %d\n", png_ptr->row_number, filter);
- switch (filter)
- {
- case PNG_FILTER_VALUE_NONE:
- break;
- case PNG_FILTER_VALUE_SUB:
- {
- png_uint_32 i;
- png_uint_32 istop = row_info->rowbytes;
- png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3;
- png_bytep rp = row + bpp;
- png_bytep lp = row;
-
- for (i = bpp; i < istop; i++)
- {
- *rp = (png_byte)(((int)(*rp) + (int)(*lp++)) & 0xff);
- rp++;
- }
- break;
- }
- case PNG_FILTER_VALUE_UP:
- {
- png_uint_32 i;
- png_uint_32 istop = row_info->rowbytes;
- png_bytep rp = row;
- png_bytep pp = prev_row;
-
- for (i = 0; i < istop; i++)
- {
- *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff);
- rp++;
- }
- break;
- }
- case PNG_FILTER_VALUE_AVG:
- {
- png_uint_32 i;
- png_bytep rp = row;
- png_bytep pp = prev_row;
- png_bytep lp = row;
- png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3;
- png_uint_32 istop = row_info->rowbytes - bpp;
-
- for (i = 0; i < bpp; i++)
- {
- *rp = (png_byte)(((int)(*rp) +
- ((int)(*pp++) / 2 )) & 0xff);
- rp++;
- }
-
- for (i = 0; i < istop; i++)
- {
- *rp = (png_byte)(((int)(*rp) +
- (int)(*pp++ + *lp++) / 2 ) & 0xff);
- rp++;
- }
- break;
- }
- case PNG_FILTER_VALUE_PAETH:
- {
- png_uint_32 i;
- png_bytep rp = row;
- png_bytep pp = prev_row;
- png_bytep lp = row;
- png_bytep cp = prev_row;
- png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3;
- png_uint_32 istop=row_info->rowbytes - bpp;
-
- for (i = 0; i < bpp; i++)
- {
- *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff);
- rp++;
- }
-
- for (i = 0; i < istop; i++) /* use leftover rp,pp */
- {
- int a, b, c, pa, pb, pc, p;
-
- a = *lp++;
- b = *pp++;
- c = *cp++;
-
- p = b - c;
- pc = a - c;
-
-#ifdef PNG_USE_ABS
- pa = abs(p);
- pb = abs(pc);
- pc = abs(p + pc);
-#else
- pa = p < 0 ? -p : p;
- pb = pc < 0 ? -pc : pc;
- pc = (p + pc) < 0 ? -(p + pc) : p + pc;
-#endif
-
- /*
- if (pa <= pb && pa <= pc)
- p = a;
- else if (pb <= pc)
- p = b;
- else
- p = c;
- */
-
- p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c;
-
- *rp = (png_byte)(((int)(*rp) + p) & 0xff);
- rp++;
- }
- break;
- }
- default:
- png_warning(png_ptr, "Ignoring bad adaptive filter type");
- *row=0;
- break;
- }
-}
-#endif /* !PNG_HAVE_ASSEMBLER_READ_FILTER_ROW */
-
-void /* PRIVATE */
-png_read_finish_row(png_structp png_ptr)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
-
- /* start of interlace block */
- const int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
-
- /* offset to next interlace block */
- const int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
-
- /* start of interlace block in the y direction */
- const int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};
-
- /* offset to next interlace block in the y direction */
- const int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
-#endif
-
- png_debug(1, "in png_read_finish_row\n");
- png_ptr->row_number++;
- if (png_ptr->row_number < png_ptr->num_rows)
- return;
-
- if (png_ptr->interlaced)
- {
- png_ptr->row_number = 0;
- png_memset_check(png_ptr, png_ptr->prev_row, 0, png_ptr->rowbytes + 1);
- do
- {
- png_ptr->pass++;
- if (png_ptr->pass >= 7)
- break;
- png_ptr->iwidth = (png_ptr->width +
- png_pass_inc[png_ptr->pass] - 1 -
- png_pass_start[png_ptr->pass]) /
- png_pass_inc[png_ptr->pass];
- png_ptr->irowbytes = ((png_ptr->iwidth *
- (png_uint_32)png_ptr->pixel_depth + 7) >> 3) +1;
-
- if (!(png_ptr->transformations & PNG_INTERLACE))
- {
- png_ptr->num_rows = (png_ptr->height +
- png_pass_yinc[png_ptr->pass] - 1 -
- png_pass_ystart[png_ptr->pass]) /
- png_pass_yinc[png_ptr->pass];
- if (!(png_ptr->num_rows))
- continue;
- }
- else /* if (png_ptr->transformations & PNG_INTERLACE) */
- break;
- } while (png_ptr->iwidth == 0);
-
- if (png_ptr->pass < 7)
- return;
- }
-
- if (!(png_ptr->flags & PNG_FLAG_ZLIB_FINISHED))
- {
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_IDAT;
-#endif
- char extra;
- int ret;
-
- png_ptr->zstream.next_out = (Byte *)&extra;
- png_ptr->zstream.avail_out = (uInt)1;
- for(;;)
- {
- if (!(png_ptr->zstream.avail_in))
- {
- while (!png_ptr->idat_size)
- {
- png_byte chunk_length[4];
-
- png_crc_finish(png_ptr, 0);
-
- png_read_data(png_ptr, chunk_length, 4);
- png_ptr->idat_size = png_get_uint_32(chunk_length);
-
- png_reset_crc(png_ptr);
- png_crc_read(png_ptr, png_ptr->chunk_name, 4);
- if (png_memcmp(png_ptr->chunk_name, (png_bytep)png_IDAT, 4))
- png_error(png_ptr, "Not enough image data");
-
- }
- png_ptr->zstream.avail_in = (uInt)png_ptr->zbuf_size;
- png_ptr->zstream.next_in = png_ptr->zbuf;
- if (png_ptr->zbuf_size > png_ptr->idat_size)
- png_ptr->zstream.avail_in = (uInt)png_ptr->idat_size;
- png_crc_read(png_ptr, png_ptr->zbuf, png_ptr->zstream.avail_in);
- png_ptr->idat_size -= png_ptr->zstream.avail_in;
- }
- ret = inflate(&png_ptr->zstream, Z_PARTIAL_FLUSH);
- if (ret == Z_STREAM_END)
- {
- if (!(png_ptr->zstream.avail_out) || png_ptr->zstream.avail_in ||
- png_ptr->idat_size)
- png_error(png_ptr, "Extra compressed data");
- png_ptr->mode |= PNG_AFTER_IDAT;
- png_ptr->flags |= PNG_FLAG_ZLIB_FINISHED;
- break;
- }
- if (ret != Z_OK)
- png_error(png_ptr, png_ptr->zstream.msg ? png_ptr->zstream.msg :
- "Decompression Error");
-
- if (!(png_ptr->zstream.avail_out))
- png_error(png_ptr, "Extra compressed data");
-
- }
- png_ptr->zstream.avail_out = 0;
- }
-
- if (png_ptr->idat_size || png_ptr->zstream.avail_in)
- png_error(png_ptr, "Extra compression data");
-
- inflateReset(&png_ptr->zstream);
-
- png_ptr->mode |= PNG_AFTER_IDAT;
-}
-
-void /* PRIVATE */
-png_read_start_row(png_structp png_ptr)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
-
- /* start of interlace block */
- const int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
-
- /* offset to next interlace block */
- const int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
-
- /* start of interlace block in the y direction */
- const int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};
-
- /* offset to next interlace block in the y direction */
- const int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
-#endif
-
- int max_pixel_depth;
- png_uint_32 row_bytes;
-
- png_debug(1, "in png_read_start_row\n");
- png_ptr->zstream.avail_in = 0;
- png_init_read_transformations(png_ptr);
- if (png_ptr->interlaced)
- {
- if (!(png_ptr->transformations & PNG_INTERLACE))
- png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 -
- png_pass_ystart[0]) / png_pass_yinc[0];
- else
- png_ptr->num_rows = png_ptr->height;
-
- png_ptr->iwidth = (png_ptr->width +
- png_pass_inc[png_ptr->pass] - 1 -
- png_pass_start[png_ptr->pass]) /
- png_pass_inc[png_ptr->pass];
-
- row_bytes = ((png_ptr->iwidth *
- (png_uint_32)png_ptr->pixel_depth + 7) >> 3) +1;
- png_ptr->irowbytes = (png_size_t)row_bytes;
- if((png_uint_32)png_ptr->irowbytes != row_bytes)
- png_error(png_ptr, "Rowbytes overflow in png_read_start_row");
- }
- else
- {
- png_ptr->num_rows = png_ptr->height;
- png_ptr->iwidth = png_ptr->width;
- png_ptr->irowbytes = png_ptr->rowbytes + 1;
- }
- max_pixel_depth = png_ptr->pixel_depth;
-
-#if defined(PNG_READ_PACK_SUPPORTED)
- if ((png_ptr->transformations & PNG_PACK) && png_ptr->bit_depth < 8)
- max_pixel_depth = 8;
-#endif
-
-#if defined(PNG_READ_EXPAND_SUPPORTED)
- if (png_ptr->transformations & PNG_EXPAND)
- {
- if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
- {
- if (png_ptr->num_trans)
- max_pixel_depth = 32;
- else
- max_pixel_depth = 24;
- }
- else if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY)
- {
- if (max_pixel_depth < 8)
- max_pixel_depth = 8;
- if (png_ptr->num_trans)
- max_pixel_depth *= 2;
- }
- else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB)
- {
- if (png_ptr->num_trans)
- {
- max_pixel_depth *= 4;
- max_pixel_depth /= 3;
- }
- }
- }
-#endif
-
-#if defined(PNG_READ_FILLER_SUPPORTED)
- if (png_ptr->transformations & (PNG_FILLER))
- {
- if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
- max_pixel_depth = 32;
- else if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY)
- {
- if (max_pixel_depth <= 8)
- max_pixel_depth = 16;
- else
- max_pixel_depth = 32;
- }
- else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB)
- {
- if (max_pixel_depth <= 32)
- max_pixel_depth = 32;
- else
- max_pixel_depth = 64;
- }
- }
-#endif
-
-#if defined(PNG_READ_GRAY_TO_RGB_SUPPORTED)
- if (png_ptr->transformations & PNG_GRAY_TO_RGB)
- {
- if (
-#if defined(PNG_READ_EXPAND_SUPPORTED)
- (png_ptr->num_trans && (png_ptr->transformations & PNG_EXPAND)) ||
-#endif
-#if defined(PNG_READ_FILLER_SUPPORTED)
- (png_ptr->transformations & (PNG_FILLER)) ||
-#endif
- png_ptr->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
- {
- if (max_pixel_depth <= 16)
- max_pixel_depth = 32;
- else
- max_pixel_depth = 64;
- }
- else
- {
- if (max_pixel_depth <= 8)
- {
- if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
- max_pixel_depth = 32;
- else
- max_pixel_depth = 24;
- }
- else if (png_ptr->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
- max_pixel_depth = 64;
- else
- max_pixel_depth = 48;
- }
- }
-#endif
-
-#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) && \
-defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
- if(png_ptr->transformations & PNG_USER_TRANSFORM)
- {
- int user_pixel_depth=png_ptr->user_transform_depth*
- png_ptr->user_transform_channels;
- if(user_pixel_depth > max_pixel_depth)
- max_pixel_depth=user_pixel_depth;
- }
-#endif
-
- /* align the width on the next larger 8 pixels. Mainly used
- for interlacing */
- row_bytes = ((png_ptr->width + 7) & ~((png_uint_32)7));
- /* calculate the maximum bytes needed, adding a byte and a pixel
- for safety's sake */
- row_bytes = ((row_bytes * (png_uint_32)max_pixel_depth + 7) >> 3) +
- 1 + ((max_pixel_depth + 7) >> 3);
-#ifdef PNG_MAX_MALLOC_64K
- if (row_bytes > (png_uint_32)65536L)
- png_error(png_ptr, "This image requires a row greater than 64KB");
-#endif
- png_ptr->big_row_buf = (png_bytep)png_malloc(png_ptr, row_bytes+64);
- png_ptr->row_buf = png_ptr->big_row_buf+32;
-#if defined(PNG_DEBUG) && defined(PNG_USE_PNGGCCRD)
- png_ptr->row_buf_size = row_bytes;
-#endif
-
-#ifdef PNG_MAX_MALLOC_64K
- if ((png_uint_32)png_ptr->rowbytes + 1 > (png_uint_32)65536L)
- png_error(png_ptr, "This image requires a row greater than 64KB");
-#endif
- png_ptr->prev_row = (png_bytep)png_malloc(png_ptr, (png_uint_32)(
- png_ptr->rowbytes + 1));
-
- png_memset_check(png_ptr, png_ptr->prev_row, 0, png_ptr->rowbytes + 1);
-
- png_debug1(3, "width = %lu,\n", png_ptr->width);
- png_debug1(3, "height = %lu,\n", png_ptr->height);
- png_debug1(3, "iwidth = %lu,\n", png_ptr->iwidth);
- png_debug1(3, "num_rows = %lu\n", png_ptr->num_rows);
- png_debug1(3, "rowbytes = %lu,\n", png_ptr->rowbytes);
- png_debug1(3, "irowbytes = %lu,\n", png_ptr->irowbytes);
-
- png_ptr->flags |= PNG_FLAG_ROW_INIT;
-}
diff --git a/libpng/pngset.c b/libpng/pngset.c
deleted file mode 100644
index 7878f37..0000000
--- a/libpng/pngset.c
+++ /dev/null
@@ -1,1033 +0,0 @@
-
-/* pngset.c - storage of image information into info struct
- *
- * libpng 1.2.1 - December 12, 2001
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2001 Glenn Randers-Pehrson
- * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
- * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
- *
- * The functions here are used during reads to store data from the file
- * into the info struct, and during writes to store application data
- * into the info struct for writing into the file. This abstracts the
- * info struct and allows us to change the structure in the future.
- */
-
-#define PNG_INTERNAL
-#include "png.h"
-
-#if defined(PNG_bKGD_SUPPORTED)
-void PNGAPI
-png_set_bKGD(png_structp png_ptr, png_infop info_ptr, png_color_16p background)
-{
- png_debug1(1, "in %s storage function\n", "bKGD");
- if (png_ptr == NULL || info_ptr == NULL)
- return;
-
- png_memcpy(&(info_ptr->background), background, sizeof(png_color_16));
- info_ptr->valid |= PNG_INFO_bKGD;
-}
-#endif
-
-#if defined(PNG_cHRM_SUPPORTED)
-#ifdef PNG_FLOATING_POINT_SUPPORTED
-void PNGAPI
-png_set_cHRM(png_structp png_ptr, png_infop info_ptr,
- double white_x, double white_y, double red_x, double red_y,
- double green_x, double green_y, double blue_x, double blue_y)
-{
- png_debug1(1, "in %s storage function\n", "cHRM");
- if (png_ptr == NULL || info_ptr == NULL)
- return;
-
- info_ptr->x_white = (float)white_x;
- info_ptr->y_white = (float)white_y;
- info_ptr->x_red = (float)red_x;
- info_ptr->y_red = (float)red_y;
- info_ptr->x_green = (float)green_x;
- info_ptr->y_green = (float)green_y;
- info_ptr->x_blue = (float)blue_x;
- info_ptr->y_blue = (float)blue_y;
-#ifdef PNG_FIXED_POINT_SUPPORTED
- info_ptr->int_x_white = (png_fixed_point)(white_x*100000.+0.5);
- info_ptr->int_y_white = (png_fixed_point)(white_y*100000.+0.5);
- info_ptr->int_x_red = (png_fixed_point)(red_x*100000.+0.5);
- info_ptr->int_y_red = (png_fixed_point)(red_y*100000.+0.5);
- info_ptr->int_x_green = (png_fixed_point)(green_x*100000.+0.5);
- info_ptr->int_y_green = (png_fixed_point)(green_y*100000.+0.5);
- info_ptr->int_x_blue = (png_fixed_point)(blue_x*100000.+0.5);
- info_ptr->int_y_blue = (png_fixed_point)(blue_y*100000.+0.5);
-#endif
- info_ptr->valid |= PNG_INFO_cHRM;
-}
-#endif
-#ifdef PNG_FIXED_POINT_SUPPORTED
-void PNGAPI
-png_set_cHRM_fixed(png_structp png_ptr, png_infop info_ptr,
- png_fixed_point white_x, png_fixed_point white_y, png_fixed_point red_x,
- png_fixed_point red_y, png_fixed_point green_x, png_fixed_point green_y,
- png_fixed_point blue_x, png_fixed_point blue_y)
-{
- png_debug1(1, "in %s storage function\n", "cHRM");
- if (png_ptr == NULL || info_ptr == NULL)
- return;
-
- info_ptr->int_x_white = white_x;
- info_ptr->int_y_white = white_y;
- info_ptr->int_x_red = red_x;
- info_ptr->int_y_red = red_y;
- info_ptr->int_x_green = green_x;
- info_ptr->int_y_green = green_y;
- info_ptr->int_x_blue = blue_x;
- info_ptr->int_y_blue = blue_y;
-#ifdef PNG_FLOATING_POINT_SUPPORTED
- info_ptr->x_white = (float)(white_x/100000.);
- info_ptr->y_white = (float)(white_y/100000.);
- info_ptr->x_red = (float)(red_x/100000.);
- info_ptr->y_red = (float)(red_y/100000.);
- info_ptr->x_green = (float)(green_x/100000.);
- info_ptr->y_green = (float)(green_y/100000.);
- info_ptr->x_blue = (float)(blue_x/100000.);
- info_ptr->y_blue = (float)(blue_y/100000.);
-#endif
- info_ptr->valid |= PNG_INFO_cHRM;
-}
-#endif
-#endif
-
-#if defined(PNG_gAMA_SUPPORTED)
-#ifdef PNG_FLOATING_POINT_SUPPORTED
-void PNGAPI
-png_set_gAMA(png_structp png_ptr, png_infop info_ptr, double file_gamma)
-{
- png_debug1(1, "in %s storage function\n", "gAMA");
- if (png_ptr == NULL || info_ptr == NULL)
- return;
-
- info_ptr->gamma = (float)file_gamma;
-#ifdef PNG_FIXED_POINT_SUPPORTED
- info_ptr->int_gamma = (int)(file_gamma*100000.+.5);
-#endif
- info_ptr->valid |= PNG_INFO_gAMA;
- if(file_gamma == 0.0)
- png_warning(png_ptr, "Setting gamma=0");
-}
-#endif
-void PNGAPI
-png_set_gAMA_fixed(png_structp png_ptr, png_infop info_ptr, png_fixed_point
- int_gamma)
-{
- png_debug1(1, "in %s storage function\n", "gAMA");
- if (png_ptr == NULL || info_ptr == NULL)
- return;
-
-#ifdef PNG_FLOATING_POINT_SUPPORTED
- info_ptr->gamma = (float)(int_gamma/100000.);
-#endif
-#ifdef PNG_FIXED_POINT_SUPPORTED
- info_ptr->int_gamma = int_gamma;
-#endif
- info_ptr->valid |= PNG_INFO_gAMA;
- if(int_gamma == 0)
- png_warning(png_ptr, "Setting gamma=0");
-}
-#endif
-
-#if defined(PNG_hIST_SUPPORTED)
-void PNGAPI
-png_set_hIST(png_structp png_ptr, png_infop info_ptr, png_uint_16p hist)
-{
- int i;
-
- png_debug1(1, "in %s storage function\n", "hIST");
- if (png_ptr == NULL || info_ptr == NULL)
- return;
- if (info_ptr->num_palette == 0)
- {
- png_warning(png_ptr,
- "Palette size 0, hIST allocation skipped.");
- return;
- }
-
-#ifdef PNG_FREE_ME_SUPPORTED
- png_free_data(png_ptr, info_ptr, PNG_FREE_HIST, 0);
-#endif
- /* Changed from info->num_palette to 256 in version 1.2.1 */
- png_ptr->hist = (png_uint_16p)png_malloc(png_ptr,
- (png_uint_32)(256 * sizeof (png_uint_16)));
-
- for (i = 0; i < info_ptr->num_palette; i++)
- png_ptr->hist[i] = hist[i];
- info_ptr->hist = png_ptr->hist;
- info_ptr->valid |= PNG_INFO_hIST;
-
-#ifdef PNG_FREE_ME_SUPPORTED
- info_ptr->free_me |= PNG_FREE_HIST;
-#else
- png_ptr->flags |= PNG_FLAG_FREE_HIST;
-#endif
-}
-#endif
-
-void PNGAPI
-png_set_IHDR(png_structp png_ptr, png_infop info_ptr,
- png_uint_32 width, png_uint_32 height, int bit_depth,
- int color_type, int interlace_type, int compression_type,
- int filter_type)
-{
- int rowbytes_per_pixel;
- png_debug1(1, "in %s storage function\n", "IHDR");
- if (png_ptr == NULL || info_ptr == NULL)
- return;
-
- /* check for width and height valid values */
- if (width == 0 || height == 0)
- png_error(png_ptr, "Image width or height is zero in IHDR");
- if (width > PNG_MAX_UINT || height > PNG_MAX_UINT)
- png_error(png_ptr, "Invalid image size in IHDR");
-
- /* check other values */
- if (bit_depth != 1 && bit_depth != 2 && bit_depth != 4 &&
- bit_depth != 8 && bit_depth != 16)
- png_error(png_ptr, "Invalid bit depth in IHDR");
-
- if (color_type < 0 || color_type == 1 ||
- color_type == 5 || color_type > 6)
- png_error(png_ptr, "Invalid color type in IHDR");
-
- if (((color_type == PNG_COLOR_TYPE_PALETTE) && bit_depth > 8) ||
- ((color_type == PNG_COLOR_TYPE_RGB ||
- color_type == PNG_COLOR_TYPE_GRAY_ALPHA ||
- color_type == PNG_COLOR_TYPE_RGB_ALPHA) && bit_depth < 8))
- png_error(png_ptr, "Invalid color type/bit depth combination in IHDR");
-
- if (interlace_type >= PNG_INTERLACE_LAST)
- png_error(png_ptr, "Unknown interlace method in IHDR");
-
- if (compression_type != PNG_COMPRESSION_TYPE_BASE)
- png_error(png_ptr, "Unknown compression method in IHDR");
-
-#if defined(PNG_MNG_FEATURES_SUPPORTED)
- /* Accept filter_method 64 (intrapixel differencing) only if
- * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and
- * 2. Libpng did not read a PNG signature (this filter_method is only
- * used in PNG datastreams that are embedded in MNG datastreams) and
- * 3. The application called png_permit_mng_features with a mask that
- * included PNG_FLAG_MNG_FILTER_64 and
- * 4. The filter_method is 64 and
- * 5. The color_type is RGB or RGBA
- */
- if((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)&&png_ptr->mng_features_permitted)
- png_warning(png_ptr,"MNG features are not allowed in a PNG datastream\n");
- if(filter_type != PNG_FILTER_TYPE_BASE)
- {
- if(!((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
- (filter_type == PNG_INTRAPIXEL_DIFFERENCING) &&
- ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) == 0) &&
- (color_type == PNG_COLOR_TYPE_RGB ||
- color_type == PNG_COLOR_TYPE_RGB_ALPHA)))
- png_error(png_ptr, "Unknown filter method in IHDR");
- if(png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)
- png_warning(png_ptr, "Invalid filter method in IHDR");
- }
-#else
- if(filter_type != PNG_FILTER_TYPE_BASE)
- png_error(png_ptr, "Unknown filter method in IHDR");
-#endif
-
- info_ptr->width = width;
- info_ptr->height = height;
- info_ptr->bit_depth = (png_byte)bit_depth;
- info_ptr->color_type =(png_byte) color_type;
- info_ptr->compression_type = (png_byte)compression_type;
- info_ptr->filter_type = (png_byte)filter_type;
- info_ptr->interlace_type = (png_byte)interlace_type;
- if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
- info_ptr->channels = 1;
- else if (info_ptr->color_type & PNG_COLOR_MASK_COLOR)
- info_ptr->channels = 3;
- else
- info_ptr->channels = 1;
- if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA)
- info_ptr->channels++;
- info_ptr->pixel_depth = (png_byte)(info_ptr->channels * info_ptr->bit_depth);
-
- /* check for overflow */
- rowbytes_per_pixel = (info_ptr->pixel_depth + 7) >> 3;
- if (( width > PNG_MAX_UINT/rowbytes_per_pixel))
- {
- png_warning(png_ptr,
- "Width too large to process image data; rowbytes will overflow.");
- info_ptr->rowbytes = (png_size_t)0;
- }
- else
- info_ptr->rowbytes = (info_ptr->width * info_ptr->pixel_depth + 7) >> 3;
-}
-
-#if defined(PNG_oFFs_SUPPORTED)
-void PNGAPI
-png_set_oFFs(png_structp png_ptr, png_infop info_ptr,
- png_int_32 offset_x, png_int_32 offset_y, int unit_type)
-{
- png_debug1(1, "in %s storage function\n", "oFFs");
- if (png_ptr == NULL || info_ptr == NULL)
- return;
-
- info_ptr->x_offset = offset_x;
- info_ptr->y_offset = offset_y;
- info_ptr->offset_unit_type = (png_byte)unit_type;
- info_ptr->valid |= PNG_INFO_oFFs;
-}
-#endif
-
-#if defined(PNG_pCAL_SUPPORTED)
-void PNGAPI
-png_set_pCAL(png_structp png_ptr, png_infop info_ptr,
- png_charp purpose, png_int_32 X0, png_int_32 X1, int type, int nparams,
- png_charp units, png_charpp params)
-{
- png_uint_32 length;
- int i;
-
- png_debug1(1, "in %s storage function\n", "pCAL");
- if (png_ptr == NULL || info_ptr == NULL)
- return;
-
- length = png_strlen(purpose) + 1;
- png_debug1(3, "allocating purpose for info (%lu bytes)\n", length);
- info_ptr->pcal_purpose = (png_charp)png_malloc(png_ptr, length);
- png_memcpy(info_ptr->pcal_purpose, purpose, (png_size_t)length);
-
- png_debug(3, "storing X0, X1, type, and nparams in info\n");
- info_ptr->pcal_X0 = X0;
- info_ptr->pcal_X1 = X1;
- info_ptr->pcal_type = (png_byte)type;
- info_ptr->pcal_nparams = (png_byte)nparams;
-
- length = png_strlen(units) + 1;
- png_debug1(3, "allocating units for info (%lu bytes)\n", length);
- info_ptr->pcal_units = (png_charp)png_malloc(png_ptr, length);
- png_memcpy(info_ptr->pcal_units, units, (png_size_t)length);
-
- info_ptr->pcal_params = (png_charpp)png_malloc(png_ptr,
- (png_uint_32)((nparams + 1) * sizeof(png_charp)));
-
- info_ptr->pcal_params[nparams] = NULL;
-
- for (i = 0; i < nparams; i++)
- {
- length = png_strlen(params[i]) + 1;
- png_debug2(3, "allocating parameter %d for info (%lu bytes)\n", i, length);
- info_ptr->pcal_params[i] = (png_charp)png_malloc(png_ptr, length);
- png_memcpy(info_ptr->pcal_params[i], params[i], (png_size_t)length);
- }
-
- info_ptr->valid |= PNG_INFO_pCAL;
-#ifdef PNG_FREE_ME_SUPPORTED
- info_ptr->free_me |= PNG_FREE_PCAL;
-#endif
-}
-#endif
-
-#if defined(PNG_READ_sCAL_SUPPORTED) || defined(PNG_WRITE_sCAL_SUPPORTED)
-#ifdef PNG_FLOATING_POINT_SUPPORTED
-void PNGAPI
-png_set_sCAL(png_structp png_ptr, png_infop info_ptr,
- int unit, double width, double height)
-{
- png_debug1(1, "in %s storage function\n", "sCAL");
- if (png_ptr == NULL || info_ptr == NULL)
- return;
-
- info_ptr->scal_unit = (png_byte)unit;
- info_ptr->scal_pixel_width = width;
- info_ptr->scal_pixel_height = height;
-
- info_ptr->valid |= PNG_INFO_sCAL;
-}
-#else
-#ifdef PNG_FIXED_POINT_SUPPORTED
-void PNGAPI
-png_set_sCAL_s(png_structp png_ptr, png_infop info_ptr,
- int unit, png_charp swidth, png_charp sheight)
-{
- png_uint_32 length;
-
- png_debug1(1, "in %s storage function\n", "sCAL");
- if (png_ptr == NULL || info_ptr == NULL)
- return;
-
- info_ptr->scal_unit = (png_byte)unit;
-
- length = png_strlen(swidth) + 1;
- png_debug1(3, "allocating unit for info (%d bytes)\n", length);
- info_ptr->scal_s_width = (png_charp)png_malloc(png_ptr, length);
- png_memcpy(info_ptr->scal_s_width, swidth, (png_size_t)length);
-
- length = png_strlen(sheight) + 1;
- png_debug1(3, "allocating unit for info (%d bytes)\n", length);
- info_ptr->scal_s_height = (png_charp)png_malloc(png_ptr, length);
- png_memcpy(info_ptr->scal_s_height, sheight, (png_size_t)length);
-
- info_ptr->valid |= PNG_INFO_sCAL;
-#ifdef PNG_FREE_ME_SUPPORTED
- info_ptr->free_me |= PNG_FREE_SCAL;
-#endif
-}
-#endif
-#endif
-#endif
-
-#if defined(PNG_pHYs_SUPPORTED)
-void PNGAPI
-png_set_pHYs(png_structp png_ptr, png_infop info_ptr,
- png_uint_32 res_x, png_uint_32 res_y, int unit_type)
-{
- png_debug1(1, "in %s storage function\n", "pHYs");
- if (png_ptr == NULL || info_ptr == NULL)
- return;
-
- info_ptr->x_pixels_per_unit = res_x;
- info_ptr->y_pixels_per_unit = res_y;
- info_ptr->phys_unit_type = (png_byte)unit_type;
- info_ptr->valid |= PNG_INFO_pHYs;
-}
-#endif
-
-void PNGAPI
-png_set_PLTE(png_structp png_ptr, png_infop info_ptr,
- png_colorp palette, int num_palette)
-{
-
- png_debug1(1, "in %s storage function\n", "PLTE");
- if (png_ptr == NULL || info_ptr == NULL)
- return;
-
- /*
- * It may not actually be necessary to set png_ptr->palette here;
- * we do it for backward compatibility with the way the png_handle_tRNS
- * function used to do the allocation.
- */
-#ifdef PNG_FREE_ME_SUPPORTED
- png_free_data(png_ptr, info_ptr, PNG_FREE_PLTE, 0);
-#endif
- /* Changed in libpng-1.2.1 to allocate 256 instead of num_palette entries,
- in case of an invalid PNG file that has too-large sample values. */
- png_ptr->palette = (png_colorp)png_zalloc(png_ptr, (uInt)256,
- sizeof (png_color));
- png_memcpy(png_ptr->palette, palette, num_palette * sizeof (png_color));
- info_ptr->palette = png_ptr->palette;
- info_ptr->num_palette = png_ptr->num_palette = (png_uint_16)num_palette;
-
-#ifdef PNG_FREE_ME_SUPPORTED
- info_ptr->free_me |= PNG_FREE_PLTE;
-#else
- png_ptr->flags |= PNG_FLAG_FREE_PLTE;
-#endif
-
- info_ptr->valid |= PNG_INFO_PLTE;
-}
-
-#if defined(PNG_sBIT_SUPPORTED)
-void PNGAPI
-png_set_sBIT(png_structp png_ptr, png_infop info_ptr,
- png_color_8p sig_bit)
-{
- png_debug1(1, "in %s storage function\n", "sBIT");
- if (png_ptr == NULL || info_ptr == NULL)
- return;
-
- png_memcpy(&(info_ptr->sig_bit), sig_bit, sizeof (png_color_8));
- info_ptr->valid |= PNG_INFO_sBIT;
-}
-#endif
-
-#if defined(PNG_sRGB_SUPPORTED)
-void PNGAPI
-png_set_sRGB(png_structp png_ptr, png_infop info_ptr, int intent)
-{
- png_debug1(1, "in %s storage function\n", "sRGB");
- if (png_ptr == NULL || info_ptr == NULL)
- return;
-
- info_ptr->srgb_intent = (png_byte)intent;
- info_ptr->valid |= PNG_INFO_sRGB;
-}
-
-void PNGAPI
-png_set_sRGB_gAMA_and_cHRM(png_structp png_ptr, png_infop info_ptr,
- int intent)
-{
-#if defined(PNG_gAMA_SUPPORTED)
-#ifdef PNG_FLOATING_POINT_SUPPORTED
- float file_gamma;
-#endif
-#ifdef PNG_FIXED_POINT_SUPPORTED
- png_fixed_point int_file_gamma;
-#endif
-#endif
-#if defined(PNG_cHRM_SUPPORTED)
-#ifdef PNG_FLOATING_POINT_SUPPORTED
- float white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y;
-#endif
-#ifdef PNG_FIXED_POINT_SUPPORTED
- png_fixed_point int_white_x, int_white_y, int_red_x, int_red_y, int_green_x,
- int_green_y, int_blue_x, int_blue_y;
-#endif
-#endif
- png_debug1(1, "in %s storage function\n", "sRGB_gAMA_and_cHRM");
- if (png_ptr == NULL || info_ptr == NULL)
- return;
-
- png_set_sRGB(png_ptr, info_ptr, intent);
-
-#if defined(PNG_gAMA_SUPPORTED)
-#ifdef PNG_FLOATING_POINT_SUPPORTED
- file_gamma = (float).45455;
- png_set_gAMA(png_ptr, info_ptr, file_gamma);
-#endif
-#ifdef PNG_FIXED_POINT_SUPPORTED
- int_file_gamma = 45455L;
- png_set_gAMA_fixed(png_ptr, info_ptr, int_file_gamma);
-#endif
-#endif
-
-#if defined(PNG_cHRM_SUPPORTED)
-#ifdef PNG_FIXED_POINT_SUPPORTED
- int_white_x = 31270L;
- int_white_y = 32900L;
- int_red_x = 64000L;
- int_red_y = 33000L;
- int_green_x = 30000L;
- int_green_y = 60000L;
- int_blue_x = 15000L;
- int_blue_y = 6000L;
-
- png_set_cHRM_fixed(png_ptr, info_ptr,
- int_white_x, int_white_y, int_red_x, int_red_y, int_green_x, int_green_y,
- int_blue_x, int_blue_y);
-#endif
-#ifdef PNG_FLOATING_POINT_SUPPORTED
- white_x = (float).3127;
- white_y = (float).3290;
- red_x = (float).64;
- red_y = (float).33;
- green_x = (float).30;
- green_y = (float).60;
- blue_x = (float).15;
- blue_y = (float).06;
-
- png_set_cHRM(png_ptr, info_ptr,
- white_x, white_y, red_x, red_y, green_x, green_y, blue_x, blue_y);
-#endif
-#endif
-}
-#endif
-
-
-#if defined(PNG_iCCP_SUPPORTED)
-void PNGAPI
-png_set_iCCP(png_structp png_ptr, png_infop info_ptr,
- png_charp name, int compression_type,
- png_charp profile, png_uint_32 proflen)
-{
- png_charp new_iccp_name;
- png_charp new_iccp_profile;
-
- png_debug1(1, "in %s storage function\n", "iCCP");
- if (png_ptr == NULL || info_ptr == NULL || name == NULL || profile == NULL)
- return;
-
- new_iccp_name = (png_charp)png_malloc(png_ptr, png_strlen(name)+1);
- png_strcpy(new_iccp_name, name);
- new_iccp_profile = (png_charp)png_malloc(png_ptr, proflen);
- png_memcpy(new_iccp_profile, profile, (png_size_t)proflen);
-
- png_free_data(png_ptr, info_ptr, PNG_FREE_ICCP, 0);
-
- info_ptr->iccp_proflen = proflen;
- info_ptr->iccp_name = new_iccp_name;
- info_ptr->iccp_profile = new_iccp_profile;
- /* Compression is always zero but is here so the API and info structure
- * does not have to change if we introduce multiple compression types */
- info_ptr->iccp_compression = (png_byte)compression_type;
-#ifdef PNG_FREE_ME_SUPPORTED
- info_ptr->free_me |= PNG_FREE_ICCP;
-#endif
- info_ptr->valid |= PNG_INFO_iCCP;
-}
-#endif
-
-#if defined(PNG_TEXT_SUPPORTED)
-void PNGAPI
-png_set_text(png_structp png_ptr, png_infop info_ptr, png_textp text_ptr,
- int num_text)
-{
- int i;
-
- png_debug1(1, "in %s storage function\n", (png_ptr->chunk_name[0] == '\0' ?
- "text" : (png_const_charp)png_ptr->chunk_name));
-
- if (png_ptr == NULL || info_ptr == NULL || num_text == 0)
- return;
-
- /* Make sure we have enough space in the "text" array in info_struct
- * to hold all of the incoming text_ptr objects.
- */
- if (info_ptr->num_text + num_text > info_ptr->max_text)
- {
- if (info_ptr->text != NULL)
- {
- png_textp old_text;
- int old_max;
-
- old_max = info_ptr->max_text;
- info_ptr->max_text = info_ptr->num_text + num_text + 8;
- old_text = info_ptr->text;
- info_ptr->text = (png_textp)png_malloc(png_ptr,
- (png_uint_32)(info_ptr->max_text * sizeof (png_text)));
- png_memcpy(info_ptr->text, old_text, (png_size_t)(old_max *
- sizeof(png_text)));
- png_free(png_ptr, old_text);
- }
- else
- {
- info_ptr->max_text = num_text + 8;
- info_ptr->num_text = 0;
- info_ptr->text = (png_textp)png_malloc(png_ptr,
- (png_uint_32)(info_ptr->max_text * sizeof (png_text)));
-#ifdef PNG_FREE_ME_SUPPORTED
- info_ptr->free_me |= PNG_FREE_TEXT;
-#endif
- }
- png_debug1(3, "allocated %d entries for info_ptr->text\n",
- info_ptr->max_text);
- }
- for (i = 0; i < num_text; i++)
- {
- png_size_t text_length,key_len;
- png_size_t lang_len,lang_key_len;
- png_textp textp = &(info_ptr->text[info_ptr->num_text]);
-
- if (text_ptr[i].key == NULL)
- continue;
-
- key_len = png_strlen(text_ptr[i].key);
-
- if(text_ptr[i].compression <= 0)
- {
- lang_len = 0;
- lang_key_len = 0;
- }
- else
-#ifdef PNG_iTXt_SUPPORTED
- {
- /* set iTXt data */
- if (text_ptr[i].key != NULL)
- lang_len = png_strlen(text_ptr[i].lang);
- else
- lang_len = 0;
- if (text_ptr[i].lang_key != NULL)
- lang_key_len = png_strlen(text_ptr[i].lang_key);
- else
- lang_key_len = 0;
- }
-#else
- {
- png_warning(png_ptr, "iTXt chunk not supported.");
- continue;
- }
-#endif
-
- if (text_ptr[i].text == NULL || text_ptr[i].text[0] == '\0')
- {
- text_length = 0;
-#ifdef PNG_iTXt_SUPPORTED
- if(text_ptr[i].compression > 0)
- textp->compression = PNG_ITXT_COMPRESSION_NONE;
- else
-#endif
- textp->compression = PNG_TEXT_COMPRESSION_NONE;
- }
- else
- {
- text_length = png_strlen(text_ptr[i].text);
- textp->compression = text_ptr[i].compression;
- }
-
- textp->key = (png_charp)png_malloc(png_ptr,
- (png_uint_32)(key_len + text_length + lang_len + lang_key_len + 4));
- png_debug2(2, "Allocated %lu bytes at %x in png_set_text\n",
- (png_uint_32)(key_len + lang_len + lang_key_len + text_length + 4),
- (int)textp->key);
-
- png_memcpy(textp->key, text_ptr[i].key,
- (png_size_t)(key_len));
- *(textp->key+key_len) = '\0';
-#ifdef PNG_iTXt_SUPPORTED
- if (text_ptr[i].compression > 0)
- {
- textp->lang=textp->key + key_len + 1;
- png_memcpy(textp->lang, text_ptr[i].lang, lang_len);
- *(textp->lang+lang_len) = '\0';
- textp->lang_key=textp->lang + lang_len + 1;
- png_memcpy(textp->lang_key, text_ptr[i].lang_key, lang_key_len);
- *(textp->lang_key+lang_key_len) = '\0';
- textp->text=textp->lang_key + lang_key_len + 1;
- }
- else
-#endif
- {
-#ifdef PNG_iTXt_SUPPORTED
- textp->lang=NULL;
- textp->lang_key=NULL;
-#endif
- textp->text=textp->key + key_len + 1;
- }
- if(text_length)
- png_memcpy(textp->text, text_ptr[i].text,
- (png_size_t)(text_length));
- *(textp->text+text_length) = '\0';
-
-#ifdef PNG_iTXt_SUPPORTED
- if(textp->compression > 0)
- {
- textp->text_length = 0;
- textp->itxt_length = text_length;
- }
- else
-#endif
- {
- textp->text_length = text_length;
-#ifdef PNG_iTXt_SUPPORTED
- textp->itxt_length = 0;
-#endif
- }
- info_ptr->text[info_ptr->num_text]= *textp;
- info_ptr->num_text++;
- png_debug1(3, "transferred text chunk %d\n", info_ptr->num_text);
- }
-}
-#endif
-
-#if defined(PNG_tIME_SUPPORTED)
-void PNGAPI
-png_set_tIME(png_structp png_ptr, png_infop info_ptr, png_timep mod_time)
-{
- png_debug1(1, "in %s storage function\n", "tIME");
- if (png_ptr == NULL || info_ptr == NULL ||
- (png_ptr->mode & PNG_WROTE_tIME))
- return;
-
- png_memcpy(&(info_ptr->mod_time), mod_time, sizeof (png_time));
- info_ptr->valid |= PNG_INFO_tIME;
-}
-#endif
-
-#if defined(PNG_tRNS_SUPPORTED)
-void PNGAPI
-png_set_tRNS(png_structp png_ptr, png_infop info_ptr,
- png_bytep trans, int num_trans, png_color_16p trans_values)
-{
- png_debug1(1, "in %s storage function\n", "tRNS");
- if (png_ptr == NULL || info_ptr == NULL)
- return;
-
- if (trans != NULL)
- {
- /*
- * It may not actually be necessary to set png_ptr->trans here;
- * we do it for backward compatibility with the way the png_handle_tRNS
- * function used to do the allocation.
- */
-#ifdef PNG_FREE_ME_SUPPORTED
- png_free_data(png_ptr, info_ptr, PNG_FREE_TRNS, 0);
-#endif
- /* Changed from num_trans to 256 in version 1.2.1 */
- png_ptr->trans = info_ptr->trans = (png_bytep)png_malloc(png_ptr,
- (png_uint_32)256);
- png_memcpy(info_ptr->trans, trans, (png_size_t)num_trans);
-#ifdef PNG_FREE_ME_SUPPORTED
- info_ptr->free_me |= PNG_FREE_TRNS;
-#else
- png_ptr->flags |= PNG_FLAG_FREE_TRNS;
-#endif
- }
-
- if (trans_values != NULL)
- {
- png_memcpy(&(info_ptr->trans_values), trans_values,
- sizeof(png_color_16));
- if (num_trans == 0)
- num_trans = 1;
- }
- info_ptr->num_trans = (png_uint_16)num_trans;
- info_ptr->valid |= PNG_INFO_tRNS;
-}
-#endif
-
-#if defined(PNG_sPLT_SUPPORTED)
-void PNGAPI
-png_set_sPLT(png_structp png_ptr,
- png_infop info_ptr, png_sPLT_tp entries, int nentries)
-{
- png_sPLT_tp np;
- int i;
-
- np = (png_sPLT_tp)png_malloc(png_ptr,
- (info_ptr->splt_palettes_num + nentries) * sizeof(png_sPLT_t));
-
- png_memcpy(np, info_ptr->splt_palettes,
- info_ptr->splt_palettes_num * sizeof(png_sPLT_t));
- png_free(png_ptr, info_ptr->splt_palettes);
- info_ptr->splt_palettes=NULL;
-
- for (i = 0; i < nentries; i++)
- {
- png_sPLT_tp to = np + info_ptr->splt_palettes_num + i;
- png_sPLT_tp from = entries + i;
-
- to->name = (png_charp)png_malloc(png_ptr,
- png_strlen(from->name) + 1);
- png_strcpy(to->name, from->name);
- to->entries = (png_sPLT_entryp)png_malloc(png_ptr,
- from->nentries * sizeof(png_sPLT_t));
- png_memcpy(to->entries, from->entries,
- from->nentries * sizeof(png_sPLT_t));
- to->nentries = from->nentries;
- to->depth = from->depth;
- }
-
- info_ptr->splt_palettes = np;
- info_ptr->splt_palettes_num += nentries;
- info_ptr->valid |= PNG_INFO_sPLT;
-#ifdef PNG_FREE_ME_SUPPORTED
- info_ptr->free_me |= PNG_FREE_SPLT;
-#endif
-}
-#endif /* PNG_sPLT_SUPPORTED */
-
-#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
-void PNGAPI
-png_set_unknown_chunks(png_structp png_ptr,
- png_infop info_ptr, png_unknown_chunkp unknowns, int num_unknowns)
-{
- png_unknown_chunkp np;
- int i;
-
- if (png_ptr == NULL || info_ptr == NULL || num_unknowns == 0)
- return;
-
- np = (png_unknown_chunkp)png_malloc(png_ptr,
- (info_ptr->unknown_chunks_num + num_unknowns) *
- sizeof(png_unknown_chunk));
-
- png_memcpy(np, info_ptr->unknown_chunks,
- info_ptr->unknown_chunks_num * sizeof(png_unknown_chunk));
- png_free(png_ptr, info_ptr->unknown_chunks);
- info_ptr->unknown_chunks=NULL;
-
- for (i = 0; i < num_unknowns; i++)
- {
- png_unknown_chunkp to = np + info_ptr->unknown_chunks_num + i;
- png_unknown_chunkp from = unknowns + i;
-
- png_strcpy((png_charp)to->name, (png_charp)from->name);
- to->data = (png_bytep)png_malloc(png_ptr, from->size);
- png_memcpy(to->data, from->data, from->size);
- to->size = from->size;
-
- /* note our location in the read or write sequence */
- to->location = (png_byte)(png_ptr->mode & 0xff);
- }
-
- info_ptr->unknown_chunks = np;
- info_ptr->unknown_chunks_num += num_unknowns;
-#ifdef PNG_FREE_ME_SUPPORTED
- info_ptr->free_me |= PNG_FREE_UNKN;
-#endif
-}
-void PNGAPI
-png_set_unknown_chunk_location(png_structp png_ptr, png_infop info_ptr,
- int chunk, int location)
-{
- if(png_ptr != NULL && info_ptr != NULL && chunk >= 0 && chunk <
- (int)info_ptr->unknown_chunks_num)
- info_ptr->unknown_chunks[chunk].location = (png_byte)location;
-}
-#endif
-
-#if defined(PNG_READ_EMPTY_PLTE_SUPPORTED) || \
- defined(PNG_WRITE_EMPTY_PLTE_SUPPORTED)
-void PNGAPI
-png_permit_empty_plte (png_structp png_ptr, int empty_plte_permitted)
-{
- /* This function is deprecated in favor of png_permit_mng_features()
- and will be removed from libpng-2.0.0 */
- png_debug(1, "in png_permit_empty_plte, DEPRECATED.\n");
- if (png_ptr == NULL)
- return;
- png_ptr->mng_features_permitted = (png_byte)
- ((png_ptr->mng_features_permitted & (~(PNG_FLAG_MNG_EMPTY_PLTE))) |
- ((empty_plte_permitted & PNG_FLAG_MNG_EMPTY_PLTE)));
-}
-#endif
-
-#if defined(PNG_MNG_FEATURES_SUPPORTED)
-png_uint_32 PNGAPI
-png_permit_mng_features (png_structp png_ptr, png_uint_32 mng_features)
-{
- png_debug(1, "in png_permit_mng_features\n");
- if (png_ptr == NULL)
- return (png_uint_32)0;
- png_ptr->mng_features_permitted =
- (png_byte)(mng_features & PNG_ALL_MNG_FEATURES);
- return (png_uint_32)png_ptr->mng_features_permitted;
-}
-#endif
-
-#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
-void PNGAPI
-png_set_keep_unknown_chunks(png_structp png_ptr, int keep, png_bytep
- chunk_list, int num_chunks)
-{
- png_bytep new_list, p;
- int i, old_num_chunks;
- if (num_chunks == 0)
- {
- if(keep == HANDLE_CHUNK_ALWAYS || keep == HANDLE_CHUNK_IF_SAFE)
- png_ptr->flags |= PNG_FLAG_KEEP_UNKNOWN_CHUNKS;
- else
- png_ptr->flags &= ~PNG_FLAG_KEEP_UNKNOWN_CHUNKS;
-
- if(keep == HANDLE_CHUNK_ALWAYS)
- png_ptr->flags |= PNG_FLAG_KEEP_UNSAFE_CHUNKS;
- else
- png_ptr->flags &= ~PNG_FLAG_KEEP_UNSAFE_CHUNKS;
- return;
- }
- if (chunk_list == NULL)
- return;
- old_num_chunks=png_ptr->num_chunk_list;
- new_list=(png_bytep)png_malloc(png_ptr,
- (png_uint_32)(5*(num_chunks+old_num_chunks)));
- if(png_ptr->chunk_list != NULL)
- {
- png_memcpy(new_list, png_ptr->chunk_list,
- (png_size_t)(5*old_num_chunks));
- png_free(png_ptr, png_ptr->chunk_list);
- png_ptr->chunk_list=NULL;
- }
- png_memcpy(new_list+5*old_num_chunks, chunk_list,
- (png_size_t)(5*num_chunks));
- for (p=new_list+5*old_num_chunks+4, i=0; i<num_chunks; i++, p+=5)
- *p=(png_byte)keep;
- png_ptr->num_chunk_list=old_num_chunks+num_chunks;
- png_ptr->chunk_list=new_list;
-#ifdef PNG_FREE_ME_SUPPORTED
- png_ptr->free_me |= PNG_FREE_LIST;
-#endif
-}
-#endif
-
-#if defined(PNG_READ_USER_CHUNKS_SUPPORTED)
-void PNGAPI
-png_set_read_user_chunk_fn(png_structp png_ptr, png_voidp user_chunk_ptr,
- png_user_chunk_ptr read_user_chunk_fn)
-{
- png_debug(1, "in png_set_read_user_chunk_fn\n");
- png_ptr->read_user_chunk_fn = read_user_chunk_fn;
- png_ptr->user_chunk_ptr = user_chunk_ptr;
-}
-#endif
-
-#if defined(PNG_INFO_IMAGE_SUPPORTED)
-void PNGAPI
-png_set_rows(png_structp png_ptr, png_infop info_ptr, png_bytepp row_pointers)
-{
- png_debug1(1, "in %s storage function\n", "rows");
-
- if (png_ptr == NULL || info_ptr == NULL)
- return;
-
- if(info_ptr->row_pointers && (info_ptr->row_pointers != row_pointers))
- png_free_data(png_ptr, info_ptr, PNG_FREE_ROWS, 0);
- info_ptr->row_pointers = row_pointers;
- if(row_pointers)
- info_ptr->valid |= PNG_INFO_IDAT;
-}
-#endif
-
-void PNGAPI
-png_set_compression_buffer_size(png_structp png_ptr, png_uint_32 size)
-{
- if(png_ptr->zbuf)
- png_free(png_ptr, png_ptr->zbuf);
- png_ptr->zbuf_size = (png_size_t)size;
- png_ptr->zbuf = (png_bytep)png_malloc(png_ptr, size);
- png_ptr->zstream.next_out = png_ptr->zbuf;
- png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
-}
-
-void PNGAPI
-png_set_invalid(png_structp png_ptr, png_infop info_ptr, int mask)
-{
- if (png_ptr && info_ptr)
- info_ptr->valid &= ~(mask);
-}
-
-
-#ifdef PNG_ASSEMBLER_CODE_SUPPORTED
-/* this function was added to libpng 1.2.0 and should always exist by default */
-void PNGAPI
-png_set_asm_flags (png_structp png_ptr, png_uint_32 asm_flags)
-{
- png_uint_32 settable_asm_flags;
- png_uint_32 settable_mmx_flags;
-
- settable_mmx_flags =
-#ifdef PNG_HAVE_ASSEMBLER_COMBINE_ROW
- PNG_ASM_FLAG_MMX_READ_COMBINE_ROW |
-#endif
-#ifdef PNG_HAVE_ASSEMBLER_READ_INTERLACE
- PNG_ASM_FLAG_MMX_READ_INTERLACE |
-#endif
-#ifdef PNG_HAVE_ASSEMBLER_READ_FILTER_ROW
- PNG_ASM_FLAG_MMX_READ_FILTER_SUB |
- PNG_ASM_FLAG_MMX_READ_FILTER_UP |
- PNG_ASM_FLAG_MMX_READ_FILTER_AVG |
- PNG_ASM_FLAG_MMX_READ_FILTER_PAETH |
-#endif
- 0;
-
- /* could be some non-MMX ones in the future, but not currently: */
- settable_asm_flags = settable_mmx_flags;
-
- if (!(png_ptr->asm_flags & PNG_ASM_FLAG_MMX_SUPPORT_COMPILED) ||
- !(png_ptr->asm_flags & PNG_ASM_FLAG_MMX_SUPPORT_IN_CPU))
- {
- /* clear all MMX flags if MMX isn't supported */
- settable_asm_flags &= ~settable_mmx_flags;
- png_ptr->asm_flags &= ~settable_mmx_flags;
- }
-
- /* we're replacing the settable bits with those passed in by the user,
- * so first zero them out of the master copy, then logical-OR in the
- * allowed subset that was requested */
-
- png_ptr->asm_flags &= ~settable_asm_flags; /* zero them */
- png_ptr->asm_flags |= (asm_flags & settable_asm_flags); /* set them */
-}
-#endif /* ?PNG_ASSEMBLER_CODE_SUPPORTED */
-
-#ifdef PNG_ASSEMBLER_CODE_SUPPORTED
-/* this function was added to libpng 1.2.0 */
-void PNGAPI
-png_set_mmx_thresholds (png_structp png_ptr,
- png_byte mmx_bitdepth_threshold,
- png_uint_32 mmx_rowbytes_threshold)
-{
- png_ptr->mmx_bitdepth_threshold = mmx_bitdepth_threshold;
- png_ptr->mmx_rowbytes_threshold = mmx_rowbytes_threshold;
-}
-#endif /* ?PNG_ASSEMBLER_CODE_SUPPORTED */
diff --git a/libpng/pngtrans.c b/libpng/pngtrans.c
deleted file mode 100644
index 6eee9fb..0000000
--- a/libpng/pngtrans.c
+++ /dev/null
@@ -1,640 +0,0 @@
-
-/* pngtrans.c - transforms the data in a row (used by both readers and writers)
- *
- * libpng 1.2.1 - December 12, 2001
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2001 Glenn Randers-Pehrson
- * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
- * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
- */
-
-#define PNG_INTERNAL
-#include "png.h"
-
-#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
-/* turn on BGR-to-RGB mapping */
-void PNGAPI
-png_set_bgr(png_structp png_ptr)
-{
- png_debug(1, "in png_set_bgr\n");
- png_ptr->transformations |= PNG_BGR;
-}
-#endif
-
-#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
-/* turn on 16 bit byte swapping */
-void PNGAPI
-png_set_swap(png_structp png_ptr)
-{
- png_debug(1, "in png_set_swap\n");
- if (png_ptr->bit_depth == 16)
- png_ptr->transformations |= PNG_SWAP_BYTES;
-}
-#endif
-
-#if defined(PNG_READ_PACK_SUPPORTED) || defined(PNG_WRITE_PACK_SUPPORTED)
-/* turn on pixel packing */
-void PNGAPI
-png_set_packing(png_structp png_ptr)
-{
- png_debug(1, "in png_set_packing\n");
- if (png_ptr->bit_depth < 8)
- {
- png_ptr->transformations |= PNG_PACK;
- png_ptr->usr_bit_depth = 8;
- }
-}
-#endif
-
-#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
-/* turn on packed pixel swapping */
-void PNGAPI
-png_set_packswap(png_structp png_ptr)
-{
- png_debug(1, "in png_set_packswap\n");
- if (png_ptr->bit_depth < 8)
- png_ptr->transformations |= PNG_PACKSWAP;
-}
-#endif
-
-#if defined(PNG_READ_SHIFT_SUPPORTED) || defined(PNG_WRITE_SHIFT_SUPPORTED)
-void PNGAPI
-png_set_shift(png_structp png_ptr, png_color_8p true_bits)
-{
- png_debug(1, "in png_set_shift\n");
- png_ptr->transformations |= PNG_SHIFT;
- png_ptr->shift = *true_bits;
-}
-#endif
-
-#if defined(PNG_READ_INTERLACING_SUPPORTED) || \
- defined(PNG_WRITE_INTERLACING_SUPPORTED)
-int PNGAPI
-png_set_interlace_handling(png_structp png_ptr)
-{
- png_debug(1, "in png_set_interlace handling\n");
- if (png_ptr->interlaced)
- {
- png_ptr->transformations |= PNG_INTERLACE;
- return (7);
- }
-
- return (1);
-}
-#endif
-
-#if defined(PNG_READ_FILLER_SUPPORTED) || defined(PNG_WRITE_FILLER_SUPPORTED)
-/* Add a filler byte on read, or remove a filler or alpha byte on write.
- * The filler type has changed in v0.95 to allow future 2-byte fillers
- * for 48-bit input data, as well as to avoid problems with some compilers
- * that don't like bytes as parameters.
- */
-void PNGAPI
-png_set_filler(png_structp png_ptr, png_uint_32 filler, int filler_loc)
-{
- png_debug(1, "in png_set_filler\n");
- png_ptr->transformations |= PNG_FILLER;
- png_ptr->filler = (png_byte)filler;
- if (filler_loc == PNG_FILLER_AFTER)
- png_ptr->flags |= PNG_FLAG_FILLER_AFTER;
- else
- png_ptr->flags &= ~PNG_FLAG_FILLER_AFTER;
-
- /* This should probably go in the "do_filler" routine.
- * I attempted to do that in libpng-1.0.1a but that caused problems
- * so I restored it in libpng-1.0.2a
- */
-
- if (png_ptr->color_type == PNG_COLOR_TYPE_RGB)
- {
- png_ptr->usr_channels = 4;
- }
-
- /* Also I added this in libpng-1.0.2a (what happens when we expand
- * a less-than-8-bit grayscale to GA? */
-
- if (png_ptr->color_type == PNG_COLOR_TYPE_GRAY && png_ptr->bit_depth >= 8)
- {
- png_ptr->usr_channels = 2;
- }
-}
-#endif
-
-#if defined(PNG_READ_SWAP_ALPHA_SUPPORTED) || \
- defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
-void PNGAPI
-png_set_swap_alpha(png_structp png_ptr)
-{
- png_debug(1, "in png_set_swap_alpha\n");
- png_ptr->transformations |= PNG_SWAP_ALPHA;
-}
-#endif
-
-#if defined(PNG_READ_INVERT_ALPHA_SUPPORTED) || \
- defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
-void PNGAPI
-png_set_invert_alpha(png_structp png_ptr)
-{
- png_debug(1, "in png_set_invert_alpha\n");
- png_ptr->transformations |= PNG_INVERT_ALPHA;
-}
-#endif
-
-#if defined(PNG_READ_INVERT_SUPPORTED) || defined(PNG_WRITE_INVERT_SUPPORTED)
-void PNGAPI
-png_set_invert_mono(png_structp png_ptr)
-{
- png_debug(1, "in png_set_invert_mono\n");
- png_ptr->transformations |= PNG_INVERT_MONO;
-}
-
-/* invert monochrome grayscale data */
-void /* PRIVATE */
-png_do_invert(png_row_infop row_info, png_bytep row)
-{
- png_debug(1, "in png_do_invert\n");
- /* This test removed from libpng version 1.0.13 and 1.2.0:
- * if (row_info->bit_depth == 1 &&
- */
-#if defined(PNG_USELESS_TESTS_SUPPORTED)
- if (row == NULL || row_info == NULL)
- return;
-#endif
- if (row_info->color_type == PNG_COLOR_TYPE_GRAY)
- {
- png_bytep rp = row;
- png_uint_32 i;
- png_uint_32 istop = row_info->rowbytes;
-
- for (i = 0; i < istop; i++)
- {
- *rp = (png_byte)(~(*rp));
- rp++;
- }
- }
- else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
- row_info->bit_depth == 8)
- {
- png_bytep rp = row;
- png_uint_32 i;
- png_uint_32 istop = row_info->rowbytes;
-
- for (i = 0; i < istop; i+=2)
- {
- *rp = (png_byte)(~(*rp));
- rp+=2;
- }
- }
- else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA &&
- row_info->bit_depth == 16)
- {
- png_bytep rp = row;
- png_uint_32 i;
- png_uint_32 istop = row_info->rowbytes;
-
- for (i = 0; i < istop; i+=4)
- {
- *rp = (png_byte)(~(*rp));
- *(rp+1) = (png_byte)(~(*(rp+1)));
- rp+=4;
- }
- }
-}
-#endif
-
-#if defined(PNG_READ_SWAP_SUPPORTED) || defined(PNG_WRITE_SWAP_SUPPORTED)
-/* swaps byte order on 16 bit depth images */
-void /* PRIVATE */
-png_do_swap(png_row_infop row_info, png_bytep row)
-{
- png_debug(1, "in png_do_swap\n");
- if (
-#if defined(PNG_USELESS_TESTS_SUPPORTED)
- row != NULL && row_info != NULL &&
-#endif
- row_info->bit_depth == 16)
- {
- png_bytep rp = row;
- png_uint_32 i;
- png_uint_32 istop= row_info->width * row_info->channels;
-
- for (i = 0; i < istop; i++, rp += 2)
- {
- png_byte t = *rp;
- *rp = *(rp + 1);
- *(rp + 1) = t;
- }
- }
-}
-#endif
-
-#if defined(PNG_READ_PACKSWAP_SUPPORTED)||defined(PNG_WRITE_PACKSWAP_SUPPORTED)
-static png_byte onebppswaptable[256] = {
- 0x00, 0x80, 0x40, 0xC0, 0x20, 0xA0, 0x60, 0xE0,
- 0x10, 0x90, 0x50, 0xD0, 0x30, 0xB0, 0x70, 0xF0,
- 0x08, 0x88, 0x48, 0xC8, 0x28, 0xA8, 0x68, 0xE8,
- 0x18, 0x98, 0x58, 0xD8, 0x38, 0xB8, 0x78, 0xF8,
- 0x04, 0x84, 0x44, 0xC4, 0x24, 0xA4, 0x64, 0xE4,
- 0x14, 0x94, 0x54, 0xD4, 0x34, 0xB4, 0x74, 0xF4,
- 0x0C, 0x8C, 0x4C, 0xCC, 0x2C, 0xAC, 0x6C, 0xEC,
- 0x1C, 0x9C, 0x5C, 0xDC, 0x3C, 0xBC, 0x7C, 0xFC,
- 0x02, 0x82, 0x42, 0xC2, 0x22, 0xA2, 0x62, 0xE2,
- 0x12, 0x92, 0x52, 0xD2, 0x32, 0xB2, 0x72, 0xF2,
- 0x0A, 0x8A, 0x4A, 0xCA, 0x2A, 0xAA, 0x6A, 0xEA,
- 0x1A, 0x9A, 0x5A, 0xDA, 0x3A, 0xBA, 0x7A, 0xFA,
- 0x06, 0x86, 0x46, 0xC6, 0x26, 0xA6, 0x66, 0xE6,
- 0x16, 0x96, 0x56, 0xD6, 0x36, 0xB6, 0x76, 0xF6,
- 0x0E, 0x8E, 0x4E, 0xCE, 0x2E, 0xAE, 0x6E, 0xEE,
- 0x1E, 0x9E, 0x5E, 0xDE, 0x3E, 0xBE, 0x7E, 0xFE,
- 0x01, 0x81, 0x41, 0xC1, 0x21, 0xA1, 0x61, 0xE1,
- 0x11, 0x91, 0x51, 0xD1, 0x31, 0xB1, 0x71, 0xF1,
- 0x09, 0x89, 0x49, 0xC9, 0x29, 0xA9, 0x69, 0xE9,
- 0x19, 0x99, 0x59, 0xD9, 0x39, 0xB9, 0x79, 0xF9,
- 0x05, 0x85, 0x45, 0xC5, 0x25, 0xA5, 0x65, 0xE5,
- 0x15, 0x95, 0x55, 0xD5, 0x35, 0xB5, 0x75, 0xF5,
- 0x0D, 0x8D, 0x4D, 0xCD, 0x2D, 0xAD, 0x6D, 0xED,
- 0x1D, 0x9D, 0x5D, 0xDD, 0x3D, 0xBD, 0x7D, 0xFD,
- 0x03, 0x83, 0x43, 0xC3, 0x23, 0xA3, 0x63, 0xE3,
- 0x13, 0x93, 0x53, 0xD3, 0x33, 0xB3, 0x73, 0xF3,
- 0x0B, 0x8B, 0x4B, 0xCB, 0x2B, 0xAB, 0x6B, 0xEB,
- 0x1B, 0x9B, 0x5B, 0xDB, 0x3B, 0xBB, 0x7B, 0xFB,
- 0x07, 0x87, 0x47, 0xC7, 0x27, 0xA7, 0x67, 0xE7,
- 0x17, 0x97, 0x57, 0xD7, 0x37, 0xB7, 0x77, 0xF7,
- 0x0F, 0x8F, 0x4F, 0xCF, 0x2F, 0xAF, 0x6F, 0xEF,
- 0x1F, 0x9F, 0x5F, 0xDF, 0x3F, 0xBF, 0x7F, 0xFF
-};
-
-static png_byte twobppswaptable[256] = {
- 0x00, 0x40, 0x80, 0xC0, 0x10, 0x50, 0x90, 0xD0,
- 0x20, 0x60, 0xA0, 0xE0, 0x30, 0x70, 0xB0, 0xF0,
- 0x04, 0x44, 0x84, 0xC4, 0x14, 0x54, 0x94, 0xD4,
- 0x24, 0x64, 0xA4, 0xE4, 0x34, 0x74, 0xB4, 0xF4,
- 0x08, 0x48, 0x88, 0xC8, 0x18, 0x58, 0x98, 0xD8,
- 0x28, 0x68, 0xA8, 0xE8, 0x38, 0x78, 0xB8, 0xF8,
- 0x0C, 0x4C, 0x8C, 0xCC, 0x1C, 0x5C, 0x9C, 0xDC,
- 0x2C, 0x6C, 0xAC, 0xEC, 0x3C, 0x7C, 0xBC, 0xFC,
- 0x01, 0x41, 0x81, 0xC1, 0x11, 0x51, 0x91, 0xD1,
- 0x21, 0x61, 0xA1, 0xE1, 0x31, 0x71, 0xB1, 0xF1,
- 0x05, 0x45, 0x85, 0xC5, 0x15, 0x55, 0x95, 0xD5,
- 0x25, 0x65, 0xA5, 0xE5, 0x35, 0x75, 0xB5, 0xF5,
- 0x09, 0x49, 0x89, 0xC9, 0x19, 0x59, 0x99, 0xD9,
- 0x29, 0x69, 0xA9, 0xE9, 0x39, 0x79, 0xB9, 0xF9,
- 0x0D, 0x4D, 0x8D, 0xCD, 0x1D, 0x5D, 0x9D, 0xDD,
- 0x2D, 0x6D, 0xAD, 0xED, 0x3D, 0x7D, 0xBD, 0xFD,
- 0x02, 0x42, 0x82, 0xC2, 0x12, 0x52, 0x92, 0xD2,
- 0x22, 0x62, 0xA2, 0xE2, 0x32, 0x72, 0xB2, 0xF2,
- 0x06, 0x46, 0x86, 0xC6, 0x16, 0x56, 0x96, 0xD6,
- 0x26, 0x66, 0xA6, 0xE6, 0x36, 0x76, 0xB6, 0xF6,
- 0x0A, 0x4A, 0x8A, 0xCA, 0x1A, 0x5A, 0x9A, 0xDA,
- 0x2A, 0x6A, 0xAA, 0xEA, 0x3A, 0x7A, 0xBA, 0xFA,
- 0x0E, 0x4E, 0x8E, 0xCE, 0x1E, 0x5E, 0x9E, 0xDE,
- 0x2E, 0x6E, 0xAE, 0xEE, 0x3E, 0x7E, 0xBE, 0xFE,
- 0x03, 0x43, 0x83, 0xC3, 0x13, 0x53, 0x93, 0xD3,
- 0x23, 0x63, 0xA3, 0xE3, 0x33, 0x73, 0xB3, 0xF3,
- 0x07, 0x47, 0x87, 0xC7, 0x17, 0x57, 0x97, 0xD7,
- 0x27, 0x67, 0xA7, 0xE7, 0x37, 0x77, 0xB7, 0xF7,
- 0x0B, 0x4B, 0x8B, 0xCB, 0x1B, 0x5B, 0x9B, 0xDB,
- 0x2B, 0x6B, 0xAB, 0xEB, 0x3B, 0x7B, 0xBB, 0xFB,
- 0x0F, 0x4F, 0x8F, 0xCF, 0x1F, 0x5F, 0x9F, 0xDF,
- 0x2F, 0x6F, 0xAF, 0xEF, 0x3F, 0x7F, 0xBF, 0xFF
-};
-
-static png_byte fourbppswaptable[256] = {
- 0x00, 0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70,
- 0x80, 0x90, 0xA0, 0xB0, 0xC0, 0xD0, 0xE0, 0xF0,
- 0x01, 0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71,
- 0x81, 0x91, 0xA1, 0xB1, 0xC1, 0xD1, 0xE1, 0xF1,
- 0x02, 0x12, 0x22, 0x32, 0x42, 0x52, 0x62, 0x72,
- 0x82, 0x92, 0xA2, 0xB2, 0xC2, 0xD2, 0xE2, 0xF2,
- 0x03, 0x13, 0x23, 0x33, 0x43, 0x53, 0x63, 0x73,
- 0x83, 0x93, 0xA3, 0xB3, 0xC3, 0xD3, 0xE3, 0xF3,
- 0x04, 0x14, 0x24, 0x34, 0x44, 0x54, 0x64, 0x74,
- 0x84, 0x94, 0xA4, 0xB4, 0xC4, 0xD4, 0xE4, 0xF4,
- 0x05, 0x15, 0x25, 0x35, 0x45, 0x55, 0x65, 0x75,
- 0x85, 0x95, 0xA5, 0xB5, 0xC5, 0xD5, 0xE5, 0xF5,
- 0x06, 0x16, 0x26, 0x36, 0x46, 0x56, 0x66, 0x76,
- 0x86, 0x96, 0xA6, 0xB6, 0xC6, 0xD6, 0xE6, 0xF6,
- 0x07, 0x17, 0x27, 0x37, 0x47, 0x57, 0x67, 0x77,
- 0x87, 0x97, 0xA7, 0xB7, 0xC7, 0xD7, 0xE7, 0xF7,
- 0x08, 0x18, 0x28, 0x38, 0x48, 0x58, 0x68, 0x78,
- 0x88, 0x98, 0xA8, 0xB8, 0xC8, 0xD8, 0xE8, 0xF8,
- 0x09, 0x19, 0x29, 0x39, 0x49, 0x59, 0x69, 0x79,
- 0x89, 0x99, 0xA9, 0xB9, 0xC9, 0xD9, 0xE9, 0xF9,
- 0x0A, 0x1A, 0x2A, 0x3A, 0x4A, 0x5A, 0x6A, 0x7A,
- 0x8A, 0x9A, 0xAA, 0xBA, 0xCA, 0xDA, 0xEA, 0xFA,
- 0x0B, 0x1B, 0x2B, 0x3B, 0x4B, 0x5B, 0x6B, 0x7B,
- 0x8B, 0x9B, 0xAB, 0xBB, 0xCB, 0xDB, 0xEB, 0xFB,
- 0x0C, 0x1C, 0x2C, 0x3C, 0x4C, 0x5C, 0x6C, 0x7C,
- 0x8C, 0x9C, 0xAC, 0xBC, 0xCC, 0xDC, 0xEC, 0xFC,
- 0x0D, 0x1D, 0x2D, 0x3D, 0x4D, 0x5D, 0x6D, 0x7D,
- 0x8D, 0x9D, 0xAD, 0xBD, 0xCD, 0xDD, 0xED, 0xFD,
- 0x0E, 0x1E, 0x2E, 0x3E, 0x4E, 0x5E, 0x6E, 0x7E,
- 0x8E, 0x9E, 0xAE, 0xBE, 0xCE, 0xDE, 0xEE, 0xFE,
- 0x0F, 0x1F, 0x2F, 0x3F, 0x4F, 0x5F, 0x6F, 0x7F,
- 0x8F, 0x9F, 0xAF, 0xBF, 0xCF, 0xDF, 0xEF, 0xFF
-};
-
-/* swaps pixel packing order within bytes */
-void /* PRIVATE */
-png_do_packswap(png_row_infop row_info, png_bytep row)
-{
- png_debug(1, "in png_do_packswap\n");
- if (
-#if defined(PNG_USELESS_TESTS_SUPPORTED)
- row != NULL && row_info != NULL &&
-#endif
- row_info->bit_depth < 8)
- {
- png_bytep rp, end, table;
-
- end = row + row_info->rowbytes;
-
- if (row_info->bit_depth == 1)
- table = onebppswaptable;
- else if (row_info->bit_depth == 2)
- table = twobppswaptable;
- else if (row_info->bit_depth == 4)
- table = fourbppswaptable;
- else
- return;
-
- for (rp = row; rp < end; rp++)
- *rp = table[*rp];
- }
-}
-#endif /* PNG_READ_PACKSWAP_SUPPORTED or PNG_WRITE_PACKSWAP_SUPPORTED */
-
-#if defined(PNG_WRITE_FILLER_SUPPORTED) || \
- defined(PNG_READ_STRIP_ALPHA_SUPPORTED)
-/* remove filler or alpha byte(s) */
-void /* PRIVATE */
-png_do_strip_filler(png_row_infop row_info, png_bytep row, png_uint_32 flags)
-{
- png_debug(1, "in png_do_strip_filler\n");
-#if defined(PNG_USELESS_TESTS_SUPPORTED)
- if (row != NULL && row_info != NULL)
-#endif
- {
-/*
- if (row_info->color_type == PNG_COLOR_TYPE_RGB ||
- row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
-*/
- png_bytep sp=row;
- png_bytep dp=row;
- png_uint_32 row_width=row_info->width;
- png_uint_32 i;
-
- if (row_info->channels == 4)
- {
- if (row_info->bit_depth == 8)
- {
- /* This converts from RGBX or RGBA to RGB */
- if (flags & PNG_FLAG_FILLER_AFTER)
- {
- dp+=3; sp+=4;
- for (i = 1; i < row_width; i++)
- {
- *dp++ = *sp++;
- *dp++ = *sp++;
- *dp++ = *sp++;
- sp++;
- }
- }
- /* This converts from XRGB or ARGB to RGB */
- else
- {
- for (i = 0; i < row_width; i++)
- {
- sp++;
- *dp++ = *sp++;
- *dp++ = *sp++;
- *dp++ = *sp++;
- }
- }
- row_info->pixel_depth = 24;
- row_info->rowbytes = row_width * 3;
- }
- else /* if (row_info->bit_depth == 16) */
- {
- if (flags & PNG_FLAG_FILLER_AFTER)
- {
- /* This converts from RRGGBBXX or RRGGBBAA to RRGGBB */
- sp += 8; dp += 6;
- for (i = 1; i < row_width; i++)
- {
- /* This could be (although png_memcpy is probably slower):
- png_memcpy(dp, sp, 6);
- sp += 8;
- dp += 6;
- */
-
- *dp++ = *sp++;
- *dp++ = *sp++;
- *dp++ = *sp++;
- *dp++ = *sp++;
- *dp++ = *sp++;
- *dp++ = *sp++;
- sp += 2;
- }
- }
- else
- {
- /* This converts from XXRRGGBB or AARRGGBB to RRGGBB */
- for (i = 0; i < row_width; i++)
- {
- /* This could be (although png_memcpy is probably slower):
- png_memcpy(dp, sp, 6);
- sp += 8;
- dp += 6;
- */
-
- sp+=2;
- *dp++ = *sp++;
- *dp++ = *sp++;
- *dp++ = *sp++;
- *dp++ = *sp++;
- *dp++ = *sp++;
- *dp++ = *sp++;
- }
- }
- row_info->pixel_depth = 48;
- row_info->rowbytes = row_width * 6;
- }
- row_info->channels = 3;
- row_info->color_type &= ~PNG_COLOR_MASK_ALPHA;
- }
-/*
- else if (row_info->color_type == PNG_COLOR_TYPE_GRAY ||
- row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
-*/
- else if (row_info->channels == 2)
- {
- if (row_info->bit_depth == 8)
- {
- /* This converts from GX or GA to G */
- if (flags & PNG_FLAG_FILLER_AFTER)
- {
- for (i = 0; i < row_width; i++)
- {
- *dp++ = *sp++;
- sp++;
- }
- }
- /* This converts from XG or AG to G */
- else
- {
- for (i = 0; i < row_width; i++)
- {
- sp++;
- *dp++ = *sp++;
- }
- }
- row_info->pixel_depth = 8;
- row_info->rowbytes = row_width;
- }
- else /* if (row_info->bit_depth == 16) */
- {
- if (flags & PNG_FLAG_FILLER_AFTER)
- {
- /* This converts from GGXX or GGAA to GG */
- sp += 4; dp += 2;
- for (i = 1; i < row_width; i++)
- {
- *dp++ = *sp++;
- *dp++ = *sp++;
- sp += 2;
- }
- }
- else
- {
- /* This converts from XXGG or AAGG to GG */
- for (i = 0; i < row_width; i++)
- {
- sp += 2;
- *dp++ = *sp++;
- *dp++ = *sp++;
- }
- }
- row_info->pixel_depth = 16;
- row_info->rowbytes = row_width * 2;
- }
- row_info->channels = 1;
- row_info->color_type &= ~PNG_COLOR_MASK_ALPHA;
- }
- }
-}
-#endif
-
-#if defined(PNG_READ_BGR_SUPPORTED) || defined(PNG_WRITE_BGR_SUPPORTED)
-/* swaps red and blue bytes within a pixel */
-void /* PRIVATE */
-png_do_bgr(png_row_infop row_info, png_bytep row)
-{
- png_debug(1, "in png_do_bgr\n");
- if (
-#if defined(PNG_USELESS_TESTS_SUPPORTED)
- row != NULL && row_info != NULL &&
-#endif
- (row_info->color_type & PNG_COLOR_MASK_COLOR))
- {
- png_uint_32 row_width = row_info->width;
- if (row_info->bit_depth == 8)
- {
- if (row_info->color_type == PNG_COLOR_TYPE_RGB)
- {
- png_bytep rp;
- png_uint_32 i;
-
- for (i = 0, rp = row; i < row_width; i++, rp += 3)
- {
- png_byte save = *rp;
- *rp = *(rp + 2);
- *(rp + 2) = save;
- }
- }
- else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
- {
- png_bytep rp;
- png_uint_32 i;
-
- for (i = 0, rp = row; i < row_width; i++, rp += 4)
- {
- png_byte save = *rp;
- *rp = *(rp + 2);
- *(rp + 2) = save;
- }
- }
- }
- else if (row_info->bit_depth == 16)
- {
- if (row_info->color_type == PNG_COLOR_TYPE_RGB)
- {
- png_bytep rp;
- png_uint_32 i;
-
- for (i = 0, rp = row; i < row_width; i++, rp += 6)
- {
- png_byte save = *rp;
- *rp = *(rp + 4);
- *(rp + 4) = save;
- save = *(rp + 1);
- *(rp + 1) = *(rp + 5);
- *(rp + 5) = save;
- }
- }
- else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
- {
- png_bytep rp;
- png_uint_32 i;
-
- for (i = 0, rp = row; i < row_width; i++, rp += 8)
- {
- png_byte save = *rp;
- *rp = *(rp + 4);
- *(rp + 4) = save;
- save = *(rp + 1);
- *(rp + 1) = *(rp + 5);
- *(rp + 5) = save;
- }
- }
- }
- }
-}
-#endif /* PNG_READ_BGR_SUPPORTED or PNG_WRITE_BGR_SUPPORTED */
-
-#if defined(PNG_READ_USER_TRANSFORM_SUPPORTED) || \
- defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED) || \
- defined(PNG_LEGACY_SUPPORTED)
-void PNGAPI
-png_set_user_transform_info(png_structp png_ptr, png_voidp
- user_transform_ptr, int user_transform_depth, int user_transform_channels)
-{
- png_debug(1, "in png_set_user_transform_info\n");
-#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
- png_ptr->user_transform_ptr = user_transform_ptr;
- png_ptr->user_transform_depth = (png_byte)user_transform_depth;
- png_ptr->user_transform_channels = (png_byte)user_transform_channels;
-#else
- if(user_transform_ptr || user_transform_depth || user_transform_channels)
- png_warning(png_ptr,
- "This version of libpng does not support user transform info");
-#endif
-}
-#endif
-
-/* This function returns a pointer to the user_transform_ptr associated with
- * the user transform functions. The application should free any memory
- * associated with this pointer before png_write_destroy and png_read_destroy
- * are called.
- */
-png_voidp PNGAPI
-png_get_user_transform_ptr(png_structp png_ptr)
-{
-#if defined(PNG_USER_TRANSFORM_PTR_SUPPORTED)
- return ((png_voidp)png_ptr->user_transform_ptr);
-#else
- if(png_ptr)
- return (NULL);
- return (NULL);
-#endif
-}
diff --git a/libpng/pngvcrd.c b/libpng/pngvcrd.c
deleted file mode 100644
index d0aa58b..0000000
--- a/libpng/pngvcrd.c
+++ /dev/null
@@ -1,3845 +0,0 @@
-/* pngvcrd.c - mixed C/assembler version of utilities to read a PNG file
- *
- * For Intel x86 CPU and Microsoft Visual C++ compiler
- *
- * libpng version 1.2.1 - December 12, 2001
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2001 Glenn Randers-Pehrson
- * Copyright (c) 1998, Intel Corporation
- *
- * Contributed by Nirav Chhatrapati, Intel Corporation, 1998
- * Interface to libpng contributed by Gilles Vollant, 1999
- *
- *
- * In png_do_read_interlace() in libpng versions 1.0.3a through 1.0.4d,
- * a sign error in the post-MMX cleanup code for each pixel_depth resulted
- * in bad pixels at the beginning of some rows of some images, and also
- * (due to out-of-range memory reads and writes) caused heap corruption
- * when compiled with MSVC 6.0. The error was fixed in version 1.0.4e.
- *
- * [png_read_filter_row_mmx_avg() bpp == 2 bugfix, GRR 20000916]
- *
- * [runtime MMX configuration, GRR 20010102]
- *
- */
-
-#define PNG_INTERNAL
-#include "png.h"
-
-#if defined(PNG_ASSEMBLER_CODE_SUPPORTED) && defined(PNG_USE_PNGVCRD)
-
-static int mmx_supported=2;
-
-
-int PNGAPI
-png_mmx_support(void)
-{
- int mmx_supported_local = 0;
- _asm {
- push ebx //CPUID will trash these
- push ecx
- push edx
-
- pushfd //Save Eflag to stack
- pop eax //Get Eflag from stack into eax
- mov ecx, eax //Make another copy of Eflag in ecx
- xor eax, 0x200000 //Toggle ID bit in Eflag [i.e. bit(21)]
- push eax //Save modified Eflag back to stack
-
- popfd //Restored modified value back to Eflag reg
- pushfd //Save Eflag to stack
- pop eax //Get Eflag from stack
- push ecx // save original Eflag to stack
- popfd // restore original Eflag
- xor eax, ecx //Compare the new Eflag with the original Eflag
- jz NOT_SUPPORTED //If the same, CPUID instruction is not supported,
- //skip following instructions and jump to
- //NOT_SUPPORTED label
-
- xor eax, eax //Set eax to zero
-
- _asm _emit 0x0f //CPUID instruction (two bytes opcode)
- _asm _emit 0xa2
-
- cmp eax, 1 //make sure eax return non-zero value
- jl NOT_SUPPORTED //If eax is zero, mmx not supported
-
- xor eax, eax //set eax to zero
- inc eax //Now increment eax to 1. This instruction is
- //faster than the instruction "mov eax, 1"
-
- _asm _emit 0x0f //CPUID instruction
- _asm _emit 0xa2
-
- and edx, 0x00800000 //mask out all bits but mmx bit(24)
- cmp edx, 0 // 0 = mmx not supported
- jz NOT_SUPPORTED // non-zero = Yes, mmx IS supported
-
- mov mmx_supported_local, 1 //set return value to 1
-
-NOT_SUPPORTED:
- mov eax, mmx_supported_local //move return value to eax
- pop edx //CPUID trashed these
- pop ecx
- pop ebx
- }
-
- //mmx_supported_local=0; // test code for force don't support MMX
- //printf("MMX : %u (1=MMX supported)\n",mmx_supported_local);
-
- mmx_supported = mmx_supported_local;
- return mmx_supported_local;
-}
-
-/* Combines the row recently read in with the previous row.
- This routine takes care of alpha and transparency if requested.
- This routine also handles the two methods of progressive display
- of interlaced images, depending on the mask value.
- The mask value describes which pixels are to be combined with
- the row. The pattern always repeats every 8 pixels, so just 8
- bits are needed. A one indicates the pixel is to be combined; a
- zero indicates the pixel is to be skipped. This is in addition
- to any alpha or transparency value associated with the pixel. If
- you want all pixels to be combined, pass 0xff (255) in mask. */
-
-/* Use this routine for x86 platform - uses faster MMX routine if machine
- supports MMX */
-
-void /* PRIVATE */
-png_combine_row(png_structp png_ptr, png_bytep row, int mask)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- const int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
-#endif
-
- png_debug(1,"in png_combine_row_asm\n");
-
- if (mmx_supported == 2) {
- /* this should have happened in png_init_mmx_flags() already */
- png_warning(png_ptr, "asm_flags may not have been initialized");
- png_mmx_support();
- }
-
- if (mask == 0xff)
- {
- png_memcpy(row, png_ptr->row_buf + 1,
- (png_size_t)((png_ptr->width * png_ptr->row_info.pixel_depth + 7) >> 3));
- }
- /* GRR: add "else if (mask == 0)" case?
- * or does png_combine_row() not even get called in that case? */
- else
- {
- switch (png_ptr->row_info.pixel_depth)
- {
- case 1:
- {
- png_bytep sp;
- png_bytep dp;
- int s_inc, s_start, s_end;
- int m;
- int shift;
- png_uint_32 i;
-
- sp = png_ptr->row_buf + 1;
- dp = row;
- m = 0x80;
-#if defined(PNG_READ_PACKSWAP_SUPPORTED)
- if (png_ptr->transformations & PNG_PACKSWAP)
- {
- s_start = 0;
- s_end = 7;
- s_inc = 1;
- }
- else
-#endif
- {
- s_start = 7;
- s_end = 0;
- s_inc = -1;
- }
-
- shift = s_start;
-
- for (i = 0; i < png_ptr->width; i++)
- {
- if (m & mask)
- {
- int value;
-
- value = (*sp >> shift) & 0x1;
- *dp &= (png_byte)((0x7f7f >> (7 - shift)) & 0xff);
- *dp |= (png_byte)(value << shift);
- }
-
- if (shift == s_end)
- {
- shift = s_start;
- sp++;
- dp++;
- }
- else
- shift += s_inc;
-
- if (m == 1)
- m = 0x80;
- else
- m >>= 1;
- }
- break;
- }
-
- case 2:
- {
- png_bytep sp;
- png_bytep dp;
- int s_start, s_end, s_inc;
- int m;
- int shift;
- png_uint_32 i;
- int value;
-
- sp = png_ptr->row_buf + 1;
- dp = row;
- m = 0x80;
-#if defined(PNG_READ_PACKSWAP_SUPPORTED)
- if (png_ptr->transformations & PNG_PACKSWAP)
- {
- s_start = 0;
- s_end = 6;
- s_inc = 2;
- }
- else
-#endif
- {
- s_start = 6;
- s_end = 0;
- s_inc = -2;
- }
-
- shift = s_start;
-
- for (i = 0; i < png_ptr->width; i++)
- {
- if (m & mask)
- {
- value = (*sp >> shift) & 0x3;
- *dp &= (png_byte)((0x3f3f >> (6 - shift)) & 0xff);
- *dp |= (png_byte)(value << shift);
- }
-
- if (shift == s_end)
- {
- shift = s_start;
- sp++;
- dp++;
- }
- else
- shift += s_inc;
- if (m == 1)
- m = 0x80;
- else
- m >>= 1;
- }
- break;
- }
-
- case 4:
- {
- png_bytep sp;
- png_bytep dp;
- int s_start, s_end, s_inc;
- int m;
- int shift;
- png_uint_32 i;
- int value;
-
- sp = png_ptr->row_buf + 1;
- dp = row;
- m = 0x80;
-#if defined(PNG_READ_PACKSWAP_SUPPORTED)
- if (png_ptr->transformations & PNG_PACKSWAP)
- {
- s_start = 0;
- s_end = 4;
- s_inc = 4;
- }
- else
-#endif
- {
- s_start = 4;
- s_end = 0;
- s_inc = -4;
- }
- shift = s_start;
-
- for (i = 0; i < png_ptr->width; i++)
- {
- if (m & mask)
- {
- value = (*sp >> shift) & 0xf;
- *dp &= (png_byte)((0xf0f >> (4 - shift)) & 0xff);
- *dp |= (png_byte)(value << shift);
- }
-
- if (shift == s_end)
- {
- shift = s_start;
- sp++;
- dp++;
- }
- else
- shift += s_inc;
- if (m == 1)
- m = 0x80;
- else
- m >>= 1;
- }
- break;
- }
-
- case 8:
- {
- png_bytep srcptr;
- png_bytep dstptr;
- png_uint_32 len;
- int m;
- int diff, unmask;
-
- __int64 mask0=0x0102040810204080;
-
- if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW)
- /* && mmx_supported */ )
- {
- srcptr = png_ptr->row_buf + 1;
- dstptr = row;
- m = 0x80;
- unmask = ~mask;
- len = png_ptr->width &~7; //reduce to multiple of 8
- diff = png_ptr->width & 7; //amount lost
-
- _asm
- {
- movd mm7, unmask //load bit pattern
- psubb mm6,mm6 //zero mm6
- punpcklbw mm7,mm7
- punpcklwd mm7,mm7
- punpckldq mm7,mm7 //fill register with 8 masks
-
- movq mm0,mask0
-
- pand mm0,mm7 //nonzero if keep byte
- pcmpeqb mm0,mm6 //zeros->1s, v versa
-
- mov ecx,len //load length of line (pixels)
- mov esi,srcptr //load source
- mov ebx,dstptr //load dest
- cmp ecx,0 //lcr
- je mainloop8end
-
-mainloop8:
- movq mm4,[esi]
- pand mm4,mm0
- movq mm6,mm0
- pandn mm6,[ebx]
- por mm4,mm6
- movq [ebx],mm4
-
- add esi,8 //inc by 8 bytes processed
- add ebx,8
- sub ecx,8 //dec by 8 pixels processed
-
- ja mainloop8
-mainloop8end:
-
- mov ecx,diff
- cmp ecx,0
- jz end8
-
- mov edx,mask
- sal edx,24 //make low byte the high byte
-
-secondloop8:
- sal edx,1 //move high bit to CF
- jnc skip8 //if CF = 0
- mov al,[esi]
- mov [ebx],al
-skip8:
- inc esi
- inc ebx
-
- dec ecx
- jnz secondloop8
-end8:
- emms
- }
- }
- else /* mmx not supported - use modified C routine */
- {
- register unsigned int incr1, initial_val, final_val;
- png_size_t pixel_bytes;
- png_uint_32 i;
- register int disp = png_pass_inc[png_ptr->pass];
- int offset_table[7] = {0, 4, 0, 2, 0, 1, 0};
-
- pixel_bytes = (png_ptr->row_info.pixel_depth >> 3);
- srcptr = png_ptr->row_buf + 1 + offset_table[png_ptr->pass]*
- pixel_bytes;
- dstptr = row + offset_table[png_ptr->pass]*pixel_bytes;
- initial_val = offset_table[png_ptr->pass]*pixel_bytes;
- final_val = png_ptr->width*pixel_bytes;
- incr1 = (disp)*pixel_bytes;
- for (i = initial_val; i < final_val; i += incr1)
- {
- png_memcpy(dstptr, srcptr, pixel_bytes);
- srcptr += incr1;
- dstptr += incr1;
- }
- } /* end of else */
-
- break;
- } // end 8 bpp
-
- case 16:
- {
- png_bytep srcptr;
- png_bytep dstptr;
- png_uint_32 len;
- int unmask, diff;
- __int64 mask1=0x0101020204040808,
- mask0=0x1010202040408080;
-
- if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW)
- /* && mmx_supported */ )
- {
- srcptr = png_ptr->row_buf + 1;
- dstptr = row;
-
- unmask = ~mask;
- len = (png_ptr->width)&~7;
- diff = (png_ptr->width)&7;
- _asm
- {
- movd mm7, unmask //load bit pattern
- psubb mm6,mm6 //zero mm6
- punpcklbw mm7,mm7
- punpcklwd mm7,mm7
- punpckldq mm7,mm7 //fill register with 8 masks
-
- movq mm0,mask0
- movq mm1,mask1
-
- pand mm0,mm7
- pand mm1,mm7
-
- pcmpeqb mm0,mm6
- pcmpeqb mm1,mm6
-
- mov ecx,len //load length of line
- mov esi,srcptr //load source
- mov ebx,dstptr //load dest
- cmp ecx,0 //lcr
- jz mainloop16end
-
-mainloop16:
- movq mm4,[esi]
- pand mm4,mm0
- movq mm6,mm0
- movq mm7,[ebx]
- pandn mm6,mm7
- por mm4,mm6
- movq [ebx],mm4
-
- movq mm5,[esi+8]
- pand mm5,mm1
- movq mm7,mm1
- movq mm6,[ebx+8]
- pandn mm7,mm6
- por mm5,mm7
- movq [ebx+8],mm5
-
- add esi,16 //inc by 16 bytes processed
- add ebx,16
- sub ecx,8 //dec by 8 pixels processed
-
- ja mainloop16
-
-mainloop16end:
- mov ecx,diff
- cmp ecx,0
- jz end16
-
- mov edx,mask
- sal edx,24 //make low byte the high byte
-secondloop16:
- sal edx,1 //move high bit to CF
- jnc skip16 //if CF = 0
- mov ax,[esi]
- mov [ebx],ax
-skip16:
- add esi,2
- add ebx,2
-
- dec ecx
- jnz secondloop16
-end16:
- emms
- }
- }
- else /* mmx not supported - use modified C routine */
- {
- register unsigned int incr1, initial_val, final_val;
- png_size_t pixel_bytes;
- png_uint_32 i;
- register int disp = png_pass_inc[png_ptr->pass];
- int offset_table[7] = {0, 4, 0, 2, 0, 1, 0};
-
- pixel_bytes = (png_ptr->row_info.pixel_depth >> 3);
- srcptr = png_ptr->row_buf + 1 + offset_table[png_ptr->pass]*
- pixel_bytes;
- dstptr = row + offset_table[png_ptr->pass]*pixel_bytes;
- initial_val = offset_table[png_ptr->pass]*pixel_bytes;
- final_val = png_ptr->width*pixel_bytes;
- incr1 = (disp)*pixel_bytes;
- for (i = initial_val; i < final_val; i += incr1)
- {
- png_memcpy(dstptr, srcptr, pixel_bytes);
- srcptr += incr1;
- dstptr += incr1;
- }
- } /* end of else */
-
- break;
- } // end 16 bpp
-
- case 24:
- {
- png_bytep srcptr;
- png_bytep dstptr;
- png_uint_32 len;
- int unmask, diff;
-
- __int64 mask2=0x0101010202020404, //24bpp
- mask1=0x0408080810101020,
- mask0=0x2020404040808080;
-
- srcptr = png_ptr->row_buf + 1;
- dstptr = row;
-
- unmask = ~mask;
- len = (png_ptr->width)&~7;
- diff = (png_ptr->width)&7;
-
- if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW)
- /* && mmx_supported */ )
- {
- _asm
- {
- movd mm7, unmask //load bit pattern
- psubb mm6,mm6 //zero mm6
- punpcklbw mm7,mm7
- punpcklwd mm7,mm7
- punpckldq mm7,mm7 //fill register with 8 masks
-
- movq mm0,mask0
- movq mm1,mask1
- movq mm2,mask2
-
- pand mm0,mm7
- pand mm1,mm7
- pand mm2,mm7
-
- pcmpeqb mm0,mm6
- pcmpeqb mm1,mm6
- pcmpeqb mm2,mm6
-
- mov ecx,len //load length of line
- mov esi,srcptr //load source
- mov ebx,dstptr //load dest
- cmp ecx,0
- jz mainloop24end
-
-mainloop24:
- movq mm4,[esi]
- pand mm4,mm0
- movq mm6,mm0
- movq mm7,[ebx]
- pandn mm6,mm7
- por mm4,mm6
- movq [ebx],mm4
-
-
- movq mm5,[esi+8]
- pand mm5,mm1
- movq mm7,mm1
- movq mm6,[ebx+8]
- pandn mm7,mm6
- por mm5,mm7
- movq [ebx+8],mm5
-
- movq mm6,[esi+16]
- pand mm6,mm2
- movq mm4,mm2
- movq mm7,[ebx+16]
- pandn mm4,mm7
- por mm6,mm4
- movq [ebx+16],mm6
-
- add esi,24 //inc by 24 bytes processed
- add ebx,24
- sub ecx,8 //dec by 8 pixels processed
-
- ja mainloop24
-
-mainloop24end:
- mov ecx,diff
- cmp ecx,0
- jz end24
-
- mov edx,mask
- sal edx,24 //make low byte the high byte
-secondloop24:
- sal edx,1 //move high bit to CF
- jnc skip24 //if CF = 0
- mov ax,[esi]
- mov [ebx],ax
- xor eax,eax
- mov al,[esi+2]
- mov [ebx+2],al
-skip24:
- add esi,3
- add ebx,3
-
- dec ecx
- jnz secondloop24
-
-end24:
- emms
- }
- }
- else /* mmx not supported - use modified C routine */
- {
- register unsigned int incr1, initial_val, final_val;
- png_size_t pixel_bytes;
- png_uint_32 i;
- register int disp = png_pass_inc[png_ptr->pass];
- int offset_table[7] = {0, 4, 0, 2, 0, 1, 0};
-
- pixel_bytes = (png_ptr->row_info.pixel_depth >> 3);
- srcptr = png_ptr->row_buf + 1 + offset_table[png_ptr->pass]*
- pixel_bytes;
- dstptr = row + offset_table[png_ptr->pass]*pixel_bytes;
- initial_val = offset_table[png_ptr->pass]*pixel_bytes;
- final_val = png_ptr->width*pixel_bytes;
- incr1 = (disp)*pixel_bytes;
- for (i = initial_val; i < final_val; i += incr1)
- {
- png_memcpy(dstptr, srcptr, pixel_bytes);
- srcptr += incr1;
- dstptr += incr1;
- }
- } /* end of else */
-
- break;
- } // end 24 bpp
-
- case 32:
- {
- png_bytep srcptr;
- png_bytep dstptr;
- png_uint_32 len;
- int unmask, diff;
-
- __int64 mask3=0x0101010102020202, //32bpp
- mask2=0x0404040408080808,
- mask1=0x1010101020202020,
- mask0=0x4040404080808080;
-
- srcptr = png_ptr->row_buf + 1;
- dstptr = row;
-
- unmask = ~mask;
- len = (png_ptr->width)&~7;
- diff = (png_ptr->width)&7;
-
- if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW)
- /* && mmx_supported */ )
- {
- _asm
- {
- movd mm7, unmask //load bit pattern
- psubb mm6,mm6 //zero mm6
- punpcklbw mm7,mm7
- punpcklwd mm7,mm7
- punpckldq mm7,mm7 //fill register with 8 masks
-
- movq mm0,mask0
- movq mm1,mask1
- movq mm2,mask2
- movq mm3,mask3
-
- pand mm0,mm7
- pand mm1,mm7
- pand mm2,mm7
- pand mm3,mm7
-
- pcmpeqb mm0,mm6
- pcmpeqb mm1,mm6
- pcmpeqb mm2,mm6
- pcmpeqb mm3,mm6
-
- mov ecx,len //load length of line
- mov esi,srcptr //load source
- mov ebx,dstptr //load dest
-
- cmp ecx,0 //lcr
- jz mainloop32end
-
-mainloop32:
- movq mm4,[esi]
- pand mm4,mm0
- movq mm6,mm0
- movq mm7,[ebx]
- pandn mm6,mm7
- por mm4,mm6
- movq [ebx],mm4
-
- movq mm5,[esi+8]
- pand mm5,mm1
- movq mm7,mm1
- movq mm6,[ebx+8]
- pandn mm7,mm6
- por mm5,mm7
- movq [ebx+8],mm5
-
- movq mm6,[esi+16]
- pand mm6,mm2
- movq mm4,mm2
- movq mm7,[ebx+16]
- pandn mm4,mm7
- por mm6,mm4
- movq [ebx+16],mm6
-
- movq mm7,[esi+24]
- pand mm7,mm3
- movq mm5,mm3
- movq mm4,[ebx+24]
- pandn mm5,mm4
- por mm7,mm5
- movq [ebx+24],mm7
-
- add esi,32 //inc by 32 bytes processed
- add ebx,32
- sub ecx,8 //dec by 8 pixels processed
-
- ja mainloop32
-
-mainloop32end:
- mov ecx,diff
- cmp ecx,0
- jz end32
-
- mov edx,mask
- sal edx,24 //make low byte the high byte
-secondloop32:
- sal edx,1 //move high bit to CF
- jnc skip32 //if CF = 0
- mov eax,[esi]
- mov [ebx],eax
-skip32:
- add esi,4
- add ebx,4
-
- dec ecx
- jnz secondloop32
-
-end32:
- emms
- }
- }
- else /* mmx _not supported - Use modified C routine */
- {
- register unsigned int incr1, initial_val, final_val;
- png_size_t pixel_bytes;
- png_uint_32 i;
- register int disp = png_pass_inc[png_ptr->pass];
- int offset_table[7] = {0, 4, 0, 2, 0, 1, 0};
-
- pixel_bytes = (png_ptr->row_info.pixel_depth >> 3);
- srcptr = png_ptr->row_buf + 1 + offset_table[png_ptr->pass]*
- pixel_bytes;
- dstptr = row + offset_table[png_ptr->pass]*pixel_bytes;
- initial_val = offset_table[png_ptr->pass]*pixel_bytes;
- final_val = png_ptr->width*pixel_bytes;
- incr1 = (disp)*pixel_bytes;
- for (i = initial_val; i < final_val; i += incr1)
- {
- png_memcpy(dstptr, srcptr, pixel_bytes);
- srcptr += incr1;
- dstptr += incr1;
- }
- } /* end of else */
-
- break;
- } // end 32 bpp
-
- case 48:
- {
- png_bytep srcptr;
- png_bytep dstptr;
- png_uint_32 len;
- int unmask, diff;
-
- __int64 mask5=0x0101010101010202,
- mask4=0x0202020204040404,
- mask3=0x0404080808080808,
- mask2=0x1010101010102020,
- mask1=0x2020202040404040,
- mask0=0x4040808080808080;
-
- if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_COMBINE_ROW)
- /* && mmx_supported */ )
- {
- srcptr = png_ptr->row_buf + 1;
- dstptr = row;
-
- unmask = ~mask;
- len = (png_ptr->width)&~7;
- diff = (png_ptr->width)&7;
- _asm
- {
- movd mm7, unmask //load bit pattern
- psubb mm6,mm6 //zero mm6
- punpcklbw mm7,mm7
- punpcklwd mm7,mm7
- punpckldq mm7,mm7 //fill register with 8 masks
-
- movq mm0,mask0
- movq mm1,mask1
- movq mm2,mask2
- movq mm3,mask3
- movq mm4,mask4
- movq mm5,mask5
-
- pand mm0,mm7
- pand mm1,mm7
- pand mm2,mm7
- pand mm3,mm7
- pand mm4,mm7
- pand mm5,mm7
-
- pcmpeqb mm0,mm6
- pcmpeqb mm1,mm6
- pcmpeqb mm2,mm6
- pcmpeqb mm3,mm6
- pcmpeqb mm4,mm6
- pcmpeqb mm5,mm6
-
- mov ecx,len //load length of line
- mov esi,srcptr //load source
- mov ebx,dstptr //load dest
-
- cmp ecx,0
- jz mainloop48end
-
-mainloop48:
- movq mm7,[esi]
- pand mm7,mm0
- movq mm6,mm0
- pandn mm6,[ebx]
- por mm7,mm6
- movq [ebx],mm7
-
- movq mm6,[esi+8]
- pand mm6,mm1
- movq mm7,mm1
- pandn mm7,[ebx+8]
- por mm6,mm7
- movq [ebx+8],mm6
-
- movq mm6,[esi+16]
- pand mm6,mm2
- movq mm7,mm2
- pandn mm7,[ebx+16]
- por mm6,mm7
- movq [ebx+16],mm6
-
- movq mm7,[esi+24]
- pand mm7,mm3
- movq mm6,mm3
- pandn mm6,[ebx+24]
- por mm7,mm6
- movq [ebx+24],mm7
-
- movq mm6,[esi+32]
- pand mm6,mm4
- movq mm7,mm4
- pandn mm7,[ebx+32]
- por mm6,mm7
- movq [ebx+32],mm6
-
- movq mm7,[esi+40]
- pand mm7,mm5
- movq mm6,mm5
- pandn mm6,[ebx+40]
- por mm7,mm6
- movq [ebx+40],mm7
-
- add esi,48 //inc by 32 bytes processed
- add ebx,48
- sub ecx,8 //dec by 8 pixels processed
-
- ja mainloop48
-mainloop48end:
-
- mov ecx,diff
- cmp ecx,0
- jz end48
-
- mov edx,mask
- sal edx,24 //make low byte the high byte
-
-secondloop48:
- sal edx,1 //move high bit to CF
- jnc skip48 //if CF = 0
- mov eax,[esi]
- mov [ebx],eax
-skip48:
- add esi,4
- add ebx,4
-
- dec ecx
- jnz secondloop48
-
-end48:
- emms
- }
- }
- else /* mmx _not supported - Use modified C routine */
- {
- register unsigned int incr1, initial_val, final_val;
- png_size_t pixel_bytes;
- png_uint_32 i;
- register int disp = png_pass_inc[png_ptr->pass];
- int offset_table[7] = {0, 4, 0, 2, 0, 1, 0};
-
- pixel_bytes = (png_ptr->row_info.pixel_depth >> 3);
- srcptr = png_ptr->row_buf + 1 + offset_table[png_ptr->pass]*
- pixel_bytes;
- dstptr = row + offset_table[png_ptr->pass]*pixel_bytes;
- initial_val = offset_table[png_ptr->pass]*pixel_bytes;
- final_val = png_ptr->width*pixel_bytes;
- incr1 = (disp)*pixel_bytes;
- for (i = initial_val; i < final_val; i += incr1)
- {
- png_memcpy(dstptr, srcptr, pixel_bytes);
- srcptr += incr1;
- dstptr += incr1;
- }
- } /* end of else */
-
- break;
- } // end 48 bpp
-
- default:
- {
- png_bytep sptr;
- png_bytep dp;
- png_size_t pixel_bytes;
- int offset_table[7] = {0, 4, 0, 2, 0, 1, 0};
- unsigned int i;
- register int disp = png_pass_inc[png_ptr->pass]; // get the offset
- register unsigned int incr1, initial_val, final_val;
-
- pixel_bytes = (png_ptr->row_info.pixel_depth >> 3);
- sptr = png_ptr->row_buf + 1 + offset_table[png_ptr->pass]*
- pixel_bytes;
- dp = row + offset_table[png_ptr->pass]*pixel_bytes;
- initial_val = offset_table[png_ptr->pass]*pixel_bytes;
- final_val = png_ptr->width*pixel_bytes;
- incr1 = (disp)*pixel_bytes;
- for (i = initial_val; i < final_val; i += incr1)
- {
- png_memcpy(dp, sptr, pixel_bytes);
- sptr += incr1;
- dp += incr1;
- }
- break;
- }
- } /* end switch (png_ptr->row_info.pixel_depth) */
- } /* end if (non-trivial mask) */
-
-} /* end png_combine_row() */
-
-
-#if defined(PNG_READ_INTERLACING_SUPPORTED)
-
-void /* PRIVATE */
-png_do_read_interlace(png_structp png_ptr)
-{
- png_row_infop row_info = &(png_ptr->row_info);
- png_bytep row = png_ptr->row_buf + 1;
- int pass = png_ptr->pass;
- png_uint_32 transformations = png_ptr->transformations;
-#ifdef PNG_USE_LOCAL_ARRAYS
- const int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
-#endif
-
- png_debug(1,"in png_do_read_interlace\n");
-
- if (mmx_supported == 2) {
- /* this should have happened in png_init_mmx_flags() already */
- png_warning(png_ptr, "asm_flags may not have been initialized");
- png_mmx_support();
- }
-
- if (row != NULL && row_info != NULL)
- {
- png_uint_32 final_width;
-
- final_width = row_info->width * png_pass_inc[pass];
-
- switch (row_info->pixel_depth)
- {
- case 1:
- {
- png_bytep sp, dp;
- int sshift, dshift;
- int s_start, s_end, s_inc;
- png_byte v;
- png_uint_32 i;
- int j;
-
- sp = row + (png_size_t)((row_info->width - 1) >> 3);
- dp = row + (png_size_t)((final_width - 1) >> 3);
-#if defined(PNG_READ_PACKSWAP_SUPPORTED)
- if (transformations & PNG_PACKSWAP)
- {
- sshift = (int)((row_info->width + 7) & 7);
- dshift = (int)((final_width + 7) & 7);
- s_start = 7;
- s_end = 0;
- s_inc = -1;
- }
- else
-#endif
- {
- sshift = 7 - (int)((row_info->width + 7) & 7);
- dshift = 7 - (int)((final_width + 7) & 7);
- s_start = 0;
- s_end = 7;
- s_inc = 1;
- }
-
- for (i = row_info->width; i; i--)
- {
- v = (png_byte)((*sp >> sshift) & 0x1);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- *dp &= (png_byte)((0x7f7f >> (7 - dshift)) & 0xff);
- *dp |= (png_byte)(v << dshift);
- if (dshift == s_end)
- {
- dshift = s_start;
- dp--;
- }
- else
- dshift += s_inc;
- }
- if (sshift == s_end)
- {
- sshift = s_start;
- sp--;
- }
- else
- sshift += s_inc;
- }
- break;
- }
-
- case 2:
- {
- png_bytep sp, dp;
- int sshift, dshift;
- int s_start, s_end, s_inc;
- png_uint_32 i;
-
- sp = row + (png_size_t)((row_info->width - 1) >> 2);
- dp = row + (png_size_t)((final_width - 1) >> 2);
-#if defined(PNG_READ_PACKSWAP_SUPPORTED)
- if (transformations & PNG_PACKSWAP)
- {
- sshift = (png_size_t)(((row_info->width + 3) & 3) << 1);
- dshift = (png_size_t)(((final_width + 3) & 3) << 1);
- s_start = 6;
- s_end = 0;
- s_inc = -2;
- }
- else
-#endif
- {
- sshift = (png_size_t)((3 - ((row_info->width + 3) & 3)) << 1);
- dshift = (png_size_t)((3 - ((final_width + 3) & 3)) << 1);
- s_start = 0;
- s_end = 6;
- s_inc = 2;
- }
-
- for (i = row_info->width; i; i--)
- {
- png_byte v;
- int j;
-
- v = (png_byte)((*sp >> sshift) & 0x3);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- *dp &= (png_byte)((0x3f3f >> (6 - dshift)) & 0xff);
- *dp |= (png_byte)(v << dshift);
- if (dshift == s_end)
- {
- dshift = s_start;
- dp--;
- }
- else
- dshift += s_inc;
- }
- if (sshift == s_end)
- {
- sshift = s_start;
- sp--;
- }
- else
- sshift += s_inc;
- }
- break;
- }
-
- case 4:
- {
- png_bytep sp, dp;
- int sshift, dshift;
- int s_start, s_end, s_inc;
- png_uint_32 i;
-
- sp = row + (png_size_t)((row_info->width - 1) >> 1);
- dp = row + (png_size_t)((final_width - 1) >> 1);
-#if defined(PNG_READ_PACKSWAP_SUPPORTED)
- if (transformations & PNG_PACKSWAP)
- {
- sshift = (png_size_t)(((row_info->width + 1) & 1) << 2);
- dshift = (png_size_t)(((final_width + 1) & 1) << 2);
- s_start = 4;
- s_end = 0;
- s_inc = -4;
- }
- else
-#endif
- {
- sshift = (png_size_t)((1 - ((row_info->width + 1) & 1)) << 2);
- dshift = (png_size_t)((1 - ((final_width + 1) & 1)) << 2);
- s_start = 0;
- s_end = 4;
- s_inc = 4;
- }
-
- for (i = row_info->width; i; i--)
- {
- png_byte v;
- int j;
-
- v = (png_byte)((*sp >> sshift) & 0xf);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- *dp &= (png_byte)((0xf0f >> (4 - dshift)) & 0xff);
- *dp |= (png_byte)(v << dshift);
- if (dshift == s_end)
- {
- dshift = s_start;
- dp--;
- }
- else
- dshift += s_inc;
- }
- if (sshift == s_end)
- {
- sshift = s_start;
- sp--;
- }
- else
- sshift += s_inc;
- }
- break;
- }
-
- default: // This is the place where the routine is modified
- {
- __int64 const4 = 0x0000000000FFFFFF;
- // __int64 const5 = 0x000000FFFFFF0000; // unused...
- __int64 const6 = 0x00000000000000FF;
- png_bytep sptr, dp;
- png_uint_32 i;
- png_size_t pixel_bytes;
- int width = row_info->width;
-
- pixel_bytes = (row_info->pixel_depth >> 3);
-
- sptr = row + (width - 1) * pixel_bytes;
- dp = row + (final_width - 1) * pixel_bytes;
- // New code by Nirav Chhatrapati - Intel Corporation
- // sign fix by GRR
- // NOTE: there is NO MMX code for 48-bit and 64-bit images
-
- // use MMX routine if machine supports it
- if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_INTERLACE)
- /* && mmx_supported */ )
- {
- if (pixel_bytes == 3)
- {
- if (((pass == 0) || (pass == 1)) && width)
- {
- _asm
- {
- mov esi, sptr
- mov edi, dp
- mov ecx, width
- sub edi, 21 // (png_pass_inc[pass] - 1)*pixel_bytes
-loop_pass0:
- movd mm0, [esi] ; X X X X X v2 v1 v0
- pand mm0, const4 ; 0 0 0 0 0 v2 v1 v0
- movq mm1, mm0 ; 0 0 0 0 0 v2 v1 v0
- psllq mm0, 16 ; 0 0 0 v2 v1 v0 0 0
- movq mm2, mm0 ; 0 0 0 v2 v1 v0 0 0
- psllq mm0, 24 ; v2 v1 v0 0 0 0 0 0
- psrlq mm1, 8 ; 0 0 0 0 0 0 v2 v1
- por mm0, mm2 ; v2 v1 v0 v2 v1 v0 0 0
- por mm0, mm1 ; v2 v1 v0 v2 v1 v0 v2 v1
- movq mm3, mm0 ; v2 v1 v0 v2 v1 v0 v2 v1
- psllq mm0, 16 ; v0 v2 v1 v0 v2 v1 0 0
- movq mm4, mm3 ; v2 v1 v0 v2 v1 v0 v2 v1
- punpckhdq mm3, mm0 ; v0 v2 v1 v0 v2 v1 v0 v2
- movq [edi+16] , mm4
- psrlq mm0, 32 ; 0 0 0 0 v0 v2 v1 v0
- movq [edi+8] , mm3
- punpckldq mm0, mm4 ; v1 v0 v2 v1 v0 v2 v1 v0
- sub esi, 3
- movq [edi], mm0
- sub edi, 24
- //sub esi, 3
- dec ecx
- jnz loop_pass0
- EMMS
- }
- }
- else if (((pass == 2) || (pass == 3)) && width)
- {
- _asm
- {
- mov esi, sptr
- mov edi, dp
- mov ecx, width
- sub edi, 9 // (png_pass_inc[pass] - 1)*pixel_bytes
-loop_pass2:
- movd mm0, [esi] ; X X X X X v2 v1 v0
- pand mm0, const4 ; 0 0 0 0 0 v2 v1 v0
- movq mm1, mm0 ; 0 0 0 0 0 v2 v1 v0
- psllq mm0, 16 ; 0 0 0 v2 v1 v0 0 0
- movq mm2, mm0 ; 0 0 0 v2 v1 v0 0 0
- psllq mm0, 24 ; v2 v1 v0 0 0 0 0 0
- psrlq mm1, 8 ; 0 0 0 0 0 0 v2 v1
- por mm0, mm2 ; v2 v1 v0 v2 v1 v0 0 0
- por mm0, mm1 ; v2 v1 v0 v2 v1 v0 v2 v1
- movq [edi+4], mm0 ; move to memory
- psrlq mm0, 16 ; 0 0 v2 v1 v0 v2 v1 v0
- movd [edi], mm0 ; move to memory
- sub esi, 3
- sub edi, 12
- dec ecx
- jnz loop_pass2
- EMMS
- }
- }
- else if (width) /* && ((pass == 4) || (pass == 5)) */
- {
- int width_mmx = ((width >> 1) << 1) - 8;
- if (width_mmx < 0)
- width_mmx = 0;
- width -= width_mmx; // 8 or 9 pix, 24 or 27 bytes
- if (width_mmx)
- {
- _asm
- {
- mov esi, sptr
- mov edi, dp
- mov ecx, width_mmx
- sub esi, 3
- sub edi, 9
-loop_pass4:
- movq mm0, [esi] ; X X v2 v1 v0 v5 v4 v3
- movq mm7, mm0 ; X X v2 v1 v0 v5 v4 v3
- movq mm6, mm0 ; X X v2 v1 v0 v5 v4 v3
- psllq mm0, 24 ; v1 v0 v5 v4 v3 0 0 0
- pand mm7, const4 ; 0 0 0 0 0 v5 v4 v3
- psrlq mm6, 24 ; 0 0 0 X X v2 v1 v0
- por mm0, mm7 ; v1 v0 v5 v4 v3 v5 v4 v3
- movq mm5, mm6 ; 0 0 0 X X v2 v1 v0
- psllq mm6, 8 ; 0 0 X X v2 v1 v0 0
- movq [edi], mm0 ; move quad to memory
- psrlq mm5, 16 ; 0 0 0 0 0 X X v2
- pand mm5, const6 ; 0 0 0 0 0 0 0 v2
- por mm6, mm5 ; 0 0 X X v2 v1 v0 v2
- movd [edi+8], mm6 ; move double to memory
- sub esi, 6
- sub edi, 12
- sub ecx, 2
- jnz loop_pass4
- EMMS
- }
- }
-
- sptr -= width_mmx*3;
- dp -= width_mmx*6;
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
-
- png_memcpy(v, sptr, 3);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- png_memcpy(dp, v, 3);
- dp -= 3;
- }
- sptr -= 3;
- }
- }
- } /* end of pixel_bytes == 3 */
-
- else if (pixel_bytes == 1)
- {
- if (((pass == 0) || (pass == 1)) && width)
- {
- int width_mmx = ((width >> 2) << 2);
- width -= width_mmx;
- if (width_mmx)
- {
- _asm
- {
- mov esi, sptr
- mov edi, dp
- mov ecx, width_mmx
- sub edi, 31
- sub esi, 3
-loop1_pass0:
- movd mm0, [esi] ; X X X X v0 v1 v2 v3
- movq mm1, mm0 ; X X X X v0 v1 v2 v3
- punpcklbw mm0, mm0 ; v0 v0 v1 v1 v2 v2 v3 v3
- movq mm2, mm0 ; v0 v0 v1 v1 v2 v2 v3 v3
- punpcklwd mm0, mm0 ; v2 v2 v2 v2 v3 v3 v3 v3
- movq mm3, mm0 ; v2 v2 v2 v2 v3 v3 v3 v3
- punpckldq mm0, mm0 ; v3 v3 v3 v3 v3 v3 v3 v3
- punpckhdq mm3, mm3 ; v2 v2 v2 v2 v2 v2 v2 v2
- movq [edi], mm0 ; move to memory v3
- punpckhwd mm2, mm2 ; v0 v0 v0 v0 v1 v1 v1 v1
- movq [edi+8], mm3 ; move to memory v2
- movq mm4, mm2 ; v0 v0 v0 v0 v1 v1 v1 v1
- punpckldq mm2, mm2 ; v1 v1 v1 v1 v1 v1 v1 v1
- punpckhdq mm4, mm4 ; v0 v0 v0 v0 v0 v0 v0 v0
- movq [edi+16], mm2 ; move to memory v1
- movq [edi+24], mm4 ; move to memory v0
- sub esi, 4
- sub edi, 32
- sub ecx, 4
- jnz loop1_pass0
- EMMS
- }
- }
-
- sptr -= width_mmx;
- dp -= width_mmx*8;
- for (i = width; i; i--)
- {
- int j;
-
- /* I simplified this part in version 1.0.4e
- * here and in several other instances where
- * pixel_bytes == 1 -- GR-P
- *
- * Original code:
- *
- * png_byte v[8];
- * png_memcpy(v, sptr, pixel_bytes);
- * for (j = 0; j < png_pass_inc[pass]; j++)
- * {
- * png_memcpy(dp, v, pixel_bytes);
- * dp -= pixel_bytes;
- * }
- * sptr -= pixel_bytes;
- *
- * Replacement code is in the next three lines:
- */
-
- for (j = 0; j < png_pass_inc[pass]; j++)
- *dp-- = *sptr;
- sptr--;
- }
- }
- else if (((pass == 2) || (pass == 3)) && width)
- {
- int width_mmx = ((width >> 2) << 2);
- width -= width_mmx;
- if (width_mmx)
- {
- _asm
- {
- mov esi, sptr
- mov edi, dp
- mov ecx, width_mmx
- sub edi, 15
- sub esi, 3
-loop1_pass2:
- movd mm0, [esi] ; X X X X v0 v1 v2 v3
- punpcklbw mm0, mm0 ; v0 v0 v1 v1 v2 v2 v3 v3
- movq mm1, mm0 ; v0 v0 v1 v1 v2 v2 v3 v3
- punpcklwd mm0, mm0 ; v2 v2 v2 v2 v3 v3 v3 v3
- punpckhwd mm1, mm1 ; v0 v0 v0 v0 v1 v1 v1 v1
- movq [edi], mm0 ; move to memory v2 and v3
- sub esi, 4
- movq [edi+8], mm1 ; move to memory v1 and v0
- sub edi, 16
- sub ecx, 4
- jnz loop1_pass2
- EMMS
- }
- }
-
- sptr -= width_mmx;
- dp -= width_mmx*4;
- for (i = width; i; i--)
- {
- int j;
-
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- *dp-- = *sptr;
- }
- sptr --;
- }
- }
- else if (width) /* && ((pass == 4) || (pass == 5))) */
- {
- int width_mmx = ((width >> 3) << 3);
- width -= width_mmx;
- if (width_mmx)
- {
- _asm
- {
- mov esi, sptr
- mov edi, dp
- mov ecx, width_mmx
- sub edi, 15
- sub esi, 7
-loop1_pass4:
- movq mm0, [esi] ; v0 v1 v2 v3 v4 v5 v6 v7
- movq mm1, mm0 ; v0 v1 v2 v3 v4 v5 v6 v7
- punpcklbw mm0, mm0 ; v4 v4 v5 v5 v6 v6 v7 v7
- //movq mm1, mm0 ; v0 v0 v1 v1 v2 v2 v3 v3
- punpckhbw mm1, mm1 ;v0 v0 v1 v1 v2 v2 v3 v3
- movq [edi+8], mm1 ; move to memory v0 v1 v2 and v3
- sub esi, 8
- movq [edi], mm0 ; move to memory v4 v5 v6 and v7
- //sub esi, 4
- sub edi, 16
- sub ecx, 8
- jnz loop1_pass4
- EMMS
- }
- }
-
- sptr -= width_mmx;
- dp -= width_mmx*2;
- for (i = width; i; i--)
- {
- int j;
-
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- *dp-- = *sptr;
- }
- sptr --;
- }
- }
- } /* end of pixel_bytes == 1 */
-
- else if (pixel_bytes == 2)
- {
- if (((pass == 0) || (pass == 1)) && width)
- {
- int width_mmx = ((width >> 1) << 1);
- width -= width_mmx;
- if (width_mmx)
- {
- _asm
- {
- mov esi, sptr
- mov edi, dp
- mov ecx, width_mmx
- sub esi, 2
- sub edi, 30
-loop2_pass0:
- movd mm0, [esi] ; X X X X v1 v0 v3 v2
- punpcklwd mm0, mm0 ; v1 v0 v1 v0 v3 v2 v3 v2
- movq mm1, mm0 ; v1 v0 v1 v0 v3 v2 v3 v2
- punpckldq mm0, mm0 ; v3 v2 v3 v2 v3 v2 v3 v2
- punpckhdq mm1, mm1 ; v1 v0 v1 v0 v1 v0 v1 v0
- movq [edi], mm0
- movq [edi + 8], mm0
- movq [edi + 16], mm1
- movq [edi + 24], mm1
- sub esi, 4
- sub edi, 32
- sub ecx, 2
- jnz loop2_pass0
- EMMS
- }
- }
-
- sptr -= (width_mmx*2 - 2); // sign fixed
- dp -= (width_mmx*16 - 2); // sign fixed
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
- sptr -= 2;
- png_memcpy(v, sptr, 2);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- dp -= 2;
- png_memcpy(dp, v, 2);
- }
- }
- }
- else if (((pass == 2) || (pass == 3)) && width)
- {
- int width_mmx = ((width >> 1) << 1) ;
- width -= width_mmx;
- if (width_mmx)
- {
- _asm
- {
- mov esi, sptr
- mov edi, dp
- mov ecx, width_mmx
- sub esi, 2
- sub edi, 14
-loop2_pass2:
- movd mm0, [esi] ; X X X X v1 v0 v3 v2
- punpcklwd mm0, mm0 ; v1 v0 v1 v0 v3 v2 v3 v2
- movq mm1, mm0 ; v1 v0 v1 v0 v3 v2 v3 v2
- punpckldq mm0, mm0 ; v3 v2 v3 v2 v3 v2 v3 v2
- punpckhdq mm1, mm1 ; v1 v0 v1 v0 v1 v0 v1 v0
- movq [edi], mm0
- sub esi, 4
- movq [edi + 8], mm1
- //sub esi, 4
- sub edi, 16
- sub ecx, 2
- jnz loop2_pass2
- EMMS
- }
- }
-
- sptr -= (width_mmx*2 - 2); // sign fixed
- dp -= (width_mmx*8 - 2); // sign fixed
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
- sptr -= 2;
- png_memcpy(v, sptr, 2);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- dp -= 2;
- png_memcpy(dp, v, 2);
- }
- }
- }
- else if (width) // pass == 4 or 5
- {
- int width_mmx = ((width >> 1) << 1) ;
- width -= width_mmx;
- if (width_mmx)
- {
- _asm
- {
- mov esi, sptr
- mov edi, dp
- mov ecx, width_mmx
- sub esi, 2
- sub edi, 6
-loop2_pass4:
- movd mm0, [esi] ; X X X X v1 v0 v3 v2
- punpcklwd mm0, mm0 ; v1 v0 v1 v0 v3 v2 v3 v2
- sub esi, 4
- movq [edi], mm0
- sub edi, 8
- sub ecx, 2
- jnz loop2_pass4
- EMMS
- }
- }
-
- sptr -= (width_mmx*2 - 2); // sign fixed
- dp -= (width_mmx*4 - 2); // sign fixed
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
- sptr -= 2;
- png_memcpy(v, sptr, 2);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- dp -= 2;
- png_memcpy(dp, v, 2);
- }
- }
- }
- } /* end of pixel_bytes == 2 */
-
- else if (pixel_bytes == 4)
- {
- if (((pass == 0) || (pass == 1)) && width)
- {
- int width_mmx = ((width >> 1) << 1) ;
- width -= width_mmx;
- if (width_mmx)
- {
- _asm
- {
- mov esi, sptr
- mov edi, dp
- mov ecx, width_mmx
- sub esi, 4
- sub edi, 60
-loop4_pass0:
- movq mm0, [esi] ; v3 v2 v1 v0 v7 v6 v5 v4
- movq mm1, mm0 ; v3 v2 v1 v0 v7 v6 v5 v4
- punpckldq mm0, mm0 ; v7 v6 v5 v4 v7 v6 v5 v4
- punpckhdq mm1, mm1 ; v3 v2 v1 v0 v3 v2 v1 v0
- movq [edi], mm0
- movq [edi + 8], mm0
- movq [edi + 16], mm0
- movq [edi + 24], mm0
- movq [edi+32], mm1
- movq [edi + 40], mm1
- movq [edi+ 48], mm1
- sub esi, 8
- movq [edi + 56], mm1
- sub edi, 64
- sub ecx, 2
- jnz loop4_pass0
- EMMS
- }
- }
-
- sptr -= (width_mmx*4 - 4); // sign fixed
- dp -= (width_mmx*32 - 4); // sign fixed
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
- sptr -= 4;
- png_memcpy(v, sptr, 4);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- dp -= 4;
- png_memcpy(dp, v, 4);
- }
- }
- }
- else if (((pass == 2) || (pass == 3)) && width)
- {
- int width_mmx = ((width >> 1) << 1) ;
- width -= width_mmx;
- if (width_mmx)
- {
- _asm
- {
- mov esi, sptr
- mov edi, dp
- mov ecx, width_mmx
- sub esi, 4
- sub edi, 28
-loop4_pass2:
- movq mm0, [esi] ; v3 v2 v1 v0 v7 v6 v5 v4
- movq mm1, mm0 ; v3 v2 v1 v0 v7 v6 v5 v4
- punpckldq mm0, mm0 ; v7 v6 v5 v4 v7 v6 v5 v4
- punpckhdq mm1, mm1 ; v3 v2 v1 v0 v3 v2 v1 v0
- movq [edi], mm0
- movq [edi + 8], mm0
- movq [edi+16], mm1
- movq [edi + 24], mm1
- sub esi, 8
- sub edi, 32
- sub ecx, 2
- jnz loop4_pass2
- EMMS
- }
- }
-
- sptr -= (width_mmx*4 - 4); // sign fixed
- dp -= (width_mmx*16 - 4); // sign fixed
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
- sptr -= 4;
- png_memcpy(v, sptr, 4);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- dp -= 4;
- png_memcpy(dp, v, 4);
- }
- }
- }
- else if (width) // pass == 4 or 5
- {
- int width_mmx = ((width >> 1) << 1) ;
- width -= width_mmx;
- if (width_mmx)
- {
- _asm
- {
- mov esi, sptr
- mov edi, dp
- mov ecx, width_mmx
- sub esi, 4
- sub edi, 12
-loop4_pass4:
- movq mm0, [esi] ; v3 v2 v1 v0 v7 v6 v5 v4
- movq mm1, mm0 ; v3 v2 v1 v0 v7 v6 v5 v4
- punpckldq mm0, mm0 ; v7 v6 v5 v4 v7 v6 v5 v4
- punpckhdq mm1, mm1 ; v3 v2 v1 v0 v3 v2 v1 v0
- movq [edi], mm0
- sub esi, 8
- movq [edi + 8], mm1
- sub edi, 16
- sub ecx, 2
- jnz loop4_pass4
- EMMS
- }
- }
-
- sptr -= (width_mmx*4 - 4); // sign fixed
- dp -= (width_mmx*8 - 4); // sign fixed
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
- sptr -= 4;
- png_memcpy(v, sptr, 4);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- dp -= 4;
- png_memcpy(dp, v, 4);
- }
- }
- }
-
- } /* end of pixel_bytes == 4 */
-
- else if (pixel_bytes == 6)
- {
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
- png_memcpy(v, sptr, 6);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- png_memcpy(dp, v, 6);
- dp -= 6;
- }
- sptr -= 6;
- }
- } /* end of pixel_bytes == 6 */
-
- else
- {
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
- png_memcpy(v, sptr, pixel_bytes);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- png_memcpy(dp, v, pixel_bytes);
- dp -= pixel_bytes;
- }
- sptr-= pixel_bytes;
- }
- }
- } /* end of mmx_supported */
-
- else /* MMX not supported: use modified C code - takes advantage
- * of inlining of memcpy for a constant */
- {
- if (pixel_bytes == 1)
- {
- for (i = width; i; i--)
- {
- int j;
- for (j = 0; j < png_pass_inc[pass]; j++)
- *dp-- = *sptr;
- sptr--;
- }
- }
- else if (pixel_bytes == 3)
- {
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
- png_memcpy(v, sptr, pixel_bytes);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- png_memcpy(dp, v, pixel_bytes);
- dp -= pixel_bytes;
- }
- sptr -= pixel_bytes;
- }
- }
- else if (pixel_bytes == 2)
- {
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
- png_memcpy(v, sptr, pixel_bytes);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- png_memcpy(dp, v, pixel_bytes);
- dp -= pixel_bytes;
- }
- sptr -= pixel_bytes;
- }
- }
- else if (pixel_bytes == 4)
- {
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
- png_memcpy(v, sptr, pixel_bytes);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- png_memcpy(dp, v, pixel_bytes);
- dp -= pixel_bytes;
- }
- sptr -= pixel_bytes;
- }
- }
- else if (pixel_bytes == 6)
- {
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
- png_memcpy(v, sptr, pixel_bytes);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- png_memcpy(dp, v, pixel_bytes);
- dp -= pixel_bytes;
- }
- sptr -= pixel_bytes;
- }
- }
- else
- {
- for (i = width; i; i--)
- {
- png_byte v[8];
- int j;
- png_memcpy(v, sptr, pixel_bytes);
- for (j = 0; j < png_pass_inc[pass]; j++)
- {
- png_memcpy(dp, v, pixel_bytes);
- dp -= pixel_bytes;
- }
- sptr -= pixel_bytes;
- }
- }
-
- } /* end of MMX not supported */
- break;
- }
- } /* end switch (row_info->pixel_depth) */
-
- row_info->width = final_width;
- row_info->rowbytes = ((final_width *
- (png_uint_32)row_info->pixel_depth + 7) >> 3);
- }
-
-}
-
-#endif /* PNG_READ_INTERLACING_SUPPORTED */
-
-
-// These variables are utilized in the functions below. They are declared
-// globally here to ensure alignment on 8-byte boundaries.
-
-union uAll {
- __int64 use;
- double align;
-} LBCarryMask = {0x0101010101010101},
- HBClearMask = {0x7f7f7f7f7f7f7f7f},
- ActiveMask, ActiveMask2, ActiveMaskEnd, ShiftBpp, ShiftRem;
-
-
-// Optimized code for PNG Average filter decoder
-void /* PRIVATE */
-png_read_filter_row_mmx_avg(png_row_infop row_info, png_bytep row
- , png_bytep prev_row)
-{
- int bpp;
- png_uint_32 FullLength;
- png_uint_32 MMXLength;
- //png_uint_32 len;
- int diff;
-
- bpp = (row_info->pixel_depth + 7) >> 3; // Get # bytes per pixel
- FullLength = row_info->rowbytes; // # of bytes to filter
- _asm {
- // Init address pointers and offset
- mov edi, row // edi ==> Avg(x)
- xor ebx, ebx // ebx ==> x
- mov edx, edi
- mov esi, prev_row // esi ==> Prior(x)
- sub edx, bpp // edx ==> Raw(x-bpp)
-
- xor eax, eax
- // Compute the Raw value for the first bpp bytes
- // Raw(x) = Avg(x) + (Prior(x)/2)
-davgrlp:
- mov al, [esi + ebx] // Load al with Prior(x)
- inc ebx
- shr al, 1 // divide by 2
- add al, [edi+ebx-1] // Add Avg(x); -1 to offset inc ebx
- cmp ebx, bpp
- mov [edi+ebx-1], al // Write back Raw(x);
- // mov does not affect flags; -1 to offset inc ebx
- jb davgrlp
- // get # of bytes to alignment
- mov diff, edi // take start of row
- add diff, ebx // add bpp
- add diff, 0xf // add 7 + 8 to incr past alignment boundary
- and diff, 0xfffffff8 // mask to alignment boundary
- sub diff, edi // subtract from start ==> value ebx at alignment
- jz davggo
- // fix alignment
- // Compute the Raw value for the bytes upto the alignment boundary
- // Raw(x) = Avg(x) + ((Raw(x-bpp) + Prior(x))/2)
- xor ecx, ecx
-davglp1:
- xor eax, eax
- mov cl, [esi + ebx] // load cl with Prior(x)
- mov al, [edx + ebx] // load al with Raw(x-bpp)
- add ax, cx
- inc ebx
- shr ax, 1 // divide by 2
- add al, [edi+ebx-1] // Add Avg(x); -1 to offset inc ebx
- cmp ebx, diff // Check if at alignment boundary
- mov [edi+ebx-1], al // Write back Raw(x);
- // mov does not affect flags; -1 to offset inc ebx
- jb davglp1 // Repeat until at alignment boundary
-davggo:
- mov eax, FullLength
- mov ecx, eax
- sub eax, ebx // subtract alignment fix
- and eax, 0x00000007 // calc bytes over mult of 8
- sub ecx, eax // drop over bytes from original length
- mov MMXLength, ecx
- } // end _asm block
- // Now do the math for the rest of the row
- switch ( bpp )
- {
- case 3:
- {
- ActiveMask.use = 0x0000000000ffffff;
- ShiftBpp.use = 24; // == 3 * 8
- ShiftRem.use = 40; // == 64 - 24
- _asm {
- // Re-init address pointers and offset
- movq mm7, ActiveMask
- mov ebx, diff // ebx ==> x = offset to alignment boundary
- movq mm5, LBCarryMask
- mov edi, row // edi ==> Avg(x)
- movq mm4, HBClearMask
- mov esi, prev_row // esi ==> Prior(x)
- // PRIME the pump (load the first Raw(x-bpp) data set
- movq mm2, [edi + ebx - 8] // Load previous aligned 8 bytes
- // (we correct position in loop below)
-davg3lp:
- movq mm0, [edi + ebx] // Load mm0 with Avg(x)
- // Add (Prev_row/2) to Average
- movq mm3, mm5
- psrlq mm2, ShiftRem // Correct position Raw(x-bpp) data
- movq mm1, [esi + ebx] // Load mm1 with Prior(x)
- movq mm6, mm7
- pand mm3, mm1 // get lsb for each prev_row byte
- psrlq mm1, 1 // divide prev_row bytes by 2
- pand mm1, mm4 // clear invalid bit 7 of each byte
- paddb mm0, mm1 // add (Prev_row/2) to Avg for each byte
- // Add 1st active group (Raw(x-bpp)/2) to Average with LBCarry
- movq mm1, mm3 // now use mm1 for getting LBCarrys
- pand mm1, mm2 // get LBCarrys for each byte where both
- // lsb's were == 1 (Only valid for active group)
- psrlq mm2, 1 // divide raw bytes by 2
- pand mm2, mm4 // clear invalid bit 7 of each byte
- paddb mm2, mm1 // add LBCarrys to (Raw(x-bpp)/2) for each byte
- pand mm2, mm6 // Leave only Active Group 1 bytes to add to Avg
- paddb mm0, mm2 // add (Raw/2) + LBCarrys to Avg for each Active
- // byte
- // Add 2nd active group (Raw(x-bpp)/2) to Average with LBCarry
- psllq mm6, ShiftBpp // shift the mm6 mask to cover bytes 3-5
- movq mm2, mm0 // mov updated Raws to mm2
- psllq mm2, ShiftBpp // shift data to position correctly
- movq mm1, mm3 // now use mm1 for getting LBCarrys
- pand mm1, mm2 // get LBCarrys for each byte where both
- // lsb's were == 1 (Only valid for active group)
- psrlq mm2, 1 // divide raw bytes by 2
- pand mm2, mm4 // clear invalid bit 7 of each byte
- paddb mm2, mm1 // add LBCarrys to (Raw(x-bpp)/2) for each byte
- pand mm2, mm6 // Leave only Active Group 2 bytes to add to Avg
- paddb mm0, mm2 // add (Raw/2) + LBCarrys to Avg for each Active
- // byte
-
- // Add 3rd active group (Raw(x-bpp)/2) to Average with LBCarry
- psllq mm6, ShiftBpp // shift the mm6 mask to cover the last two
- // bytes
- movq mm2, mm0 // mov updated Raws to mm2
- psllq mm2, ShiftBpp // shift data to position correctly
- // Data only needs to be shifted once here to
- // get the correct x-bpp offset.
- movq mm1, mm3 // now use mm1 for getting LBCarrys
- pand mm1, mm2 // get LBCarrys for each byte where both
- // lsb's were == 1 (Only valid for active group)
- psrlq mm2, 1 // divide raw bytes by 2
- pand mm2, mm4 // clear invalid bit 7 of each byte
- paddb mm2, mm1 // add LBCarrys to (Raw(x-bpp)/2) for each byte
- pand mm2, mm6 // Leave only Active Group 2 bytes to add to Avg
- add ebx, 8
- paddb mm0, mm2 // add (Raw/2) + LBCarrys to Avg for each Active
- // byte
-
- // Now ready to write back to memory
- movq [edi + ebx - 8], mm0
- // Move updated Raw(x) to use as Raw(x-bpp) for next loop
- cmp ebx, MMXLength
- movq mm2, mm0 // mov updated Raw(x) to mm2
- jb davg3lp
- } // end _asm block
- }
- break;
-
- case 6:
- case 4:
- case 7:
- case 5:
- {
- ActiveMask.use = 0xffffffffffffffff; // use shift below to clear
- // appropriate inactive bytes
- ShiftBpp.use = bpp << 3;
- ShiftRem.use = 64 - ShiftBpp.use;
- _asm {
- movq mm4, HBClearMask
- // Re-init address pointers and offset
- mov ebx, diff // ebx ==> x = offset to alignment boundary
- // Load ActiveMask and clear all bytes except for 1st active group
- movq mm7, ActiveMask
- mov edi, row // edi ==> Avg(x)
- psrlq mm7, ShiftRem
- mov esi, prev_row // esi ==> Prior(x)
- movq mm6, mm7
- movq mm5, LBCarryMask
- psllq mm6, ShiftBpp // Create mask for 2nd active group
- // PRIME the pump (load the first Raw(x-bpp) data set
- movq mm2, [edi + ebx - 8] // Load previous aligned 8 bytes
- // (we correct position in loop below)
-davg4lp:
- movq mm0, [edi + ebx]
- psrlq mm2, ShiftRem // shift data to position correctly
- movq mm1, [esi + ebx]
- // Add (Prev_row/2) to Average
- movq mm3, mm5
- pand mm3, mm1 // get lsb for each prev_row byte
- psrlq mm1, 1 // divide prev_row bytes by 2
- pand mm1, mm4 // clear invalid bit 7 of each byte
- paddb mm0, mm1 // add (Prev_row/2) to Avg for each byte
- // Add 1st active group (Raw(x-bpp)/2) to Average with LBCarry
- movq mm1, mm3 // now use mm1 for getting LBCarrys
- pand mm1, mm2 // get LBCarrys for each byte where both
- // lsb's were == 1 (Only valid for active group)
- psrlq mm2, 1 // divide raw bytes by 2
- pand mm2, mm4 // clear invalid bit 7 of each byte
- paddb mm2, mm1 // add LBCarrys to (Raw(x-bpp)/2) for each byte
- pand mm2, mm7 // Leave only Active Group 1 bytes to add to Avg
- paddb mm0, mm2 // add (Raw/2) + LBCarrys to Avg for each Active
- // byte
- // Add 2nd active group (Raw(x-bpp)/2) to Average with LBCarry
- movq mm2, mm0 // mov updated Raws to mm2
- psllq mm2, ShiftBpp // shift data to position correctly
- add ebx, 8
- movq mm1, mm3 // now use mm1 for getting LBCarrys
- pand mm1, mm2 // get LBCarrys for each byte where both
- // lsb's were == 1 (Only valid for active group)
- psrlq mm2, 1 // divide raw bytes by 2
- pand mm2, mm4 // clear invalid bit 7 of each byte
- paddb mm2, mm1 // add LBCarrys to (Raw(x-bpp)/2) for each byte
- pand mm2, mm6 // Leave only Active Group 2 bytes to add to Avg
- paddb mm0, mm2 // add (Raw/2) + LBCarrys to Avg for each Active
- // byte
- cmp ebx, MMXLength
- // Now ready to write back to memory
- movq [edi + ebx - 8], mm0
- // Prep Raw(x-bpp) for next loop
- movq mm2, mm0 // mov updated Raws to mm2
- jb davg4lp
- } // end _asm block
- }
- break;
- case 2:
- {
- ActiveMask.use = 0x000000000000ffff;
- ShiftBpp.use = 16; // == 2 * 8 [BUGFIX]
- ShiftRem.use = 48; // == 64 - 16 [BUGFIX]
- _asm {
- // Load ActiveMask
- movq mm7, ActiveMask
- // Re-init address pointers and offset
- mov ebx, diff // ebx ==> x = offset to alignment boundary
- movq mm5, LBCarryMask
- mov edi, row // edi ==> Avg(x)
- movq mm4, HBClearMask
- mov esi, prev_row // esi ==> Prior(x)
- // PRIME the pump (load the first Raw(x-bpp) data set
- movq mm2, [edi + ebx - 8] // Load previous aligned 8 bytes
- // (we correct position in loop below)
-davg2lp:
- movq mm0, [edi + ebx]
- psrlq mm2, ShiftRem // shift data to position correctly [BUGFIX]
- movq mm1, [esi + ebx]
- // Add (Prev_row/2) to Average
- movq mm3, mm5
- pand mm3, mm1 // get lsb for each prev_row byte
- psrlq mm1, 1 // divide prev_row bytes by 2
- pand mm1, mm4 // clear invalid bit 7 of each byte
- movq mm6, mm7
- paddb mm0, mm1 // add (Prev_row/2) to Avg for each byte
- // Add 1st active group (Raw(x-bpp)/2) to Average with LBCarry
- movq mm1, mm3 // now use mm1 for getting LBCarrys
- pand mm1, mm2 // get LBCarrys for each byte where both
- // lsb's were == 1 (Only valid for active group)
- psrlq mm2, 1 // divide raw bytes by 2
- pand mm2, mm4 // clear invalid bit 7 of each byte
- paddb mm2, mm1 // add LBCarrys to (Raw(x-bpp)/2) for each byte
- pand mm2, mm6 // Leave only Active Group 1 bytes to add to Avg
- paddb mm0, mm2 // add (Raw/2) + LBCarrys to Avg for each Active byte
- // Add 2nd active group (Raw(x-bpp)/2) to Average with LBCarry
- psllq mm6, ShiftBpp // shift the mm6 mask to cover bytes 2 & 3
- movq mm2, mm0 // mov updated Raws to mm2
- psllq mm2, ShiftBpp // shift data to position correctly
- movq mm1, mm3 // now use mm1 for getting LBCarrys
- pand mm1, mm2 // get LBCarrys for each byte where both
- // lsb's were == 1 (Only valid for active group)
- psrlq mm2, 1 // divide raw bytes by 2
- pand mm2, mm4 // clear invalid bit 7 of each byte
- paddb mm2, mm1 // add LBCarrys to (Raw(x-bpp)/2) for each byte
- pand mm2, mm6 // Leave only Active Group 2 bytes to add to Avg
- paddb mm0, mm2 // add (Raw/2) + LBCarrys to Avg for each Active byte
-
- // Add rdd active group (Raw(x-bpp)/2) to Average with LBCarry
- psllq mm6, ShiftBpp // shift the mm6 mask to cover bytes 4 & 5
- movq mm2, mm0 // mov updated Raws to mm2
- psllq mm2, ShiftBpp // shift data to position correctly
- // Data only needs to be shifted once here to
- // get the correct x-bpp offset.
- movq mm1, mm3 // now use mm1 for getting LBCarrys
- pand mm1, mm2 // get LBCarrys for each byte where both
- // lsb's were == 1 (Only valid for active group)
- psrlq mm2, 1 // divide raw bytes by 2
- pand mm2, mm4 // clear invalid bit 7 of each byte
- paddb mm2, mm1 // add LBCarrys to (Raw(x-bpp)/2) for each byte
- pand mm2, mm6 // Leave only Active Group 2 bytes to add to Avg
- paddb mm0, mm2 // add (Raw/2) + LBCarrys to Avg for each Active byte
-
- // Add 4th active group (Raw(x-bpp)/2) to Average with LBCarry
- psllq mm6, ShiftBpp // shift the mm6 mask to cover bytes 6 & 7
- movq mm2, mm0 // mov updated Raws to mm2
- psllq mm2, ShiftBpp // shift data to position correctly
- // Data only needs to be shifted once here to
- // get the correct x-bpp offset.
- add ebx, 8
- movq mm1, mm3 // now use mm1 for getting LBCarrys
- pand mm1, mm2 // get LBCarrys for each byte where both
- // lsb's were == 1 (Only valid for active group)
- psrlq mm2, 1 // divide raw bytes by 2
- pand mm2, mm4 // clear invalid bit 7 of each byte
- paddb mm2, mm1 // add LBCarrys to (Raw(x-bpp)/2) for each byte
- pand mm2, mm6 // Leave only Active Group 2 bytes to add to Avg
- paddb mm0, mm2 // add (Raw/2) + LBCarrys to Avg for each Active byte
-
- cmp ebx, MMXLength
- // Now ready to write back to memory
- movq [edi + ebx - 8], mm0
- // Prep Raw(x-bpp) for next loop
- movq mm2, mm0 // mov updated Raws to mm2
- jb davg2lp
- } // end _asm block
- }
- break;
-
- case 1: // bpp == 1
- {
- _asm {
- // Re-init address pointers and offset
- mov ebx, diff // ebx ==> x = offset to alignment boundary
- mov edi, row // edi ==> Avg(x)
- cmp ebx, FullLength // Test if offset at end of array
- jnb davg1end
- // Do Paeth decode for remaining bytes
- mov esi, prev_row // esi ==> Prior(x)
- mov edx, edi
- xor ecx, ecx // zero ecx before using cl & cx in loop below
- sub edx, bpp // edx ==> Raw(x-bpp)
-davg1lp:
- // Raw(x) = Avg(x) + ((Raw(x-bpp) + Prior(x))/2)
- xor eax, eax
- mov cl, [esi + ebx] // load cl with Prior(x)
- mov al, [edx + ebx] // load al with Raw(x-bpp)
- add ax, cx
- inc ebx
- shr ax, 1 // divide by 2
- add al, [edi+ebx-1] // Add Avg(x); -1 to offset inc ebx
- cmp ebx, FullLength // Check if at end of array
- mov [edi+ebx-1], al // Write back Raw(x);
- // mov does not affect flags; -1 to offset inc ebx
- jb davg1lp
-davg1end:
- } // end _asm block
- }
- return;
-
- case 8: // bpp == 8
- {
- _asm {
- // Re-init address pointers and offset
- mov ebx, diff // ebx ==> x = offset to alignment boundary
- movq mm5, LBCarryMask
- mov edi, row // edi ==> Avg(x)
- movq mm4, HBClearMask
- mov esi, prev_row // esi ==> Prior(x)
- // PRIME the pump (load the first Raw(x-bpp) data set
- movq mm2, [edi + ebx - 8] // Load previous aligned 8 bytes
- // (NO NEED to correct position in loop below)
-davg8lp:
- movq mm0, [edi + ebx]
- movq mm3, mm5
- movq mm1, [esi + ebx]
- add ebx, 8
- pand mm3, mm1 // get lsb for each prev_row byte
- psrlq mm1, 1 // divide prev_row bytes by 2
- pand mm3, mm2 // get LBCarrys for each byte where both
- // lsb's were == 1
- psrlq mm2, 1 // divide raw bytes by 2
- pand mm1, mm4 // clear invalid bit 7 of each byte
- paddb mm0, mm3 // add LBCarrys to Avg for each byte
- pand mm2, mm4 // clear invalid bit 7 of each byte
- paddb mm0, mm1 // add (Prev_row/2) to Avg for each byte
- paddb mm0, mm2 // add (Raw/2) to Avg for each byte
- cmp ebx, MMXLength
- movq [edi + ebx - 8], mm0
- movq mm2, mm0 // reuse as Raw(x-bpp)
- jb davg8lp
- } // end _asm block
- }
- break;
- default: // bpp greater than 8
- {
- _asm {
- movq mm5, LBCarryMask
- // Re-init address pointers and offset
- mov ebx, diff // ebx ==> x = offset to alignment boundary
- mov edi, row // edi ==> Avg(x)
- movq mm4, HBClearMask
- mov edx, edi
- mov esi, prev_row // esi ==> Prior(x)
- sub edx, bpp // edx ==> Raw(x-bpp)
-davgAlp:
- movq mm0, [edi + ebx]
- movq mm3, mm5
- movq mm1, [esi + ebx]
- pand mm3, mm1 // get lsb for each prev_row byte
- movq mm2, [edx + ebx]
- psrlq mm1, 1 // divide prev_row bytes by 2
- pand mm3, mm2 // get LBCarrys for each byte where both
- // lsb's were == 1
- psrlq mm2, 1 // divide raw bytes by 2
- pand mm1, mm4 // clear invalid bit 7 of each byte
- paddb mm0, mm3 // add LBCarrys to Avg for each byte
- pand mm2, mm4 // clear invalid bit 7 of each byte
- paddb mm0, mm1 // add (Prev_row/2) to Avg for each byte
- add ebx, 8
- paddb mm0, mm2 // add (Raw/2) to Avg for each byte
- cmp ebx, MMXLength
- movq [edi + ebx - 8], mm0
- jb davgAlp
- } // end _asm block
- }
- break;
- } // end switch ( bpp )
-
- _asm {
- // MMX acceleration complete now do clean-up
- // Check if any remaining bytes left to decode
- mov ebx, MMXLength // ebx ==> x = offset bytes remaining after MMX
- mov edi, row // edi ==> Avg(x)
- cmp ebx, FullLength // Test if offset at end of array
- jnb davgend
- // Do Paeth decode for remaining bytes
- mov esi, prev_row // esi ==> Prior(x)
- mov edx, edi
- xor ecx, ecx // zero ecx before using cl & cx in loop below
- sub edx, bpp // edx ==> Raw(x-bpp)
-davglp2:
- // Raw(x) = Avg(x) + ((Raw(x-bpp) + Prior(x))/2)
- xor eax, eax
- mov cl, [esi + ebx] // load cl with Prior(x)
- mov al, [edx + ebx] // load al with Raw(x-bpp)
- add ax, cx
- inc ebx
- shr ax, 1 // divide by 2
- add al, [edi+ebx-1] // Add Avg(x); -1 to offset inc ebx
- cmp ebx, FullLength // Check if at end of array
- mov [edi+ebx-1], al // Write back Raw(x);
- // mov does not affect flags; -1 to offset inc ebx
- jb davglp2
-davgend:
- emms // End MMX instructions; prep for possible FP instrs.
- } // end _asm block
-}
-
-// Optimized code for PNG Paeth filter decoder
-void /* PRIVATE */
-png_read_filter_row_mmx_paeth(png_row_infop row_info, png_bytep row,
- png_bytep prev_row)
-{
- png_uint_32 FullLength;
- png_uint_32 MMXLength;
- //png_uint_32 len;
- int bpp;
- int diff;
- //int ptemp;
- int patemp, pbtemp, pctemp;
-
- bpp = (row_info->pixel_depth + 7) >> 3; // Get # bytes per pixel
- FullLength = row_info->rowbytes; // # of bytes to filter
- _asm
- {
- xor ebx, ebx // ebx ==> x offset
- mov edi, row
- xor edx, edx // edx ==> x-bpp offset
- mov esi, prev_row
- xor eax, eax
-
- // Compute the Raw value for the first bpp bytes
- // Note: the formula works out to be always
- // Paeth(x) = Raw(x) + Prior(x) where x < bpp
-dpthrlp:
- mov al, [edi + ebx]
- add al, [esi + ebx]
- inc ebx
- cmp ebx, bpp
- mov [edi + ebx - 1], al
- jb dpthrlp
- // get # of bytes to alignment
- mov diff, edi // take start of row
- add diff, ebx // add bpp
- xor ecx, ecx
- add diff, 0xf // add 7 + 8 to incr past alignment boundary
- and diff, 0xfffffff8 // mask to alignment boundary
- sub diff, edi // subtract from start ==> value ebx at alignment
- jz dpthgo
- // fix alignment
-dpthlp1:
- xor eax, eax
- // pav = p - a = (a + b - c) - a = b - c
- mov al, [esi + ebx] // load Prior(x) into al
- mov cl, [esi + edx] // load Prior(x-bpp) into cl
- sub eax, ecx // subtract Prior(x-bpp)
- mov patemp, eax // Save pav for later use
- xor eax, eax
- // pbv = p - b = (a + b - c) - b = a - c
- mov al, [edi + edx] // load Raw(x-bpp) into al
- sub eax, ecx // subtract Prior(x-bpp)
- mov ecx, eax
- // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv
- add eax, patemp // pcv = pav + pbv
- // pc = abs(pcv)
- test eax, 0x80000000
- jz dpthpca
- neg eax // reverse sign of neg values
-dpthpca:
- mov pctemp, eax // save pc for later use
- // pb = abs(pbv)
- test ecx, 0x80000000
- jz dpthpba
- neg ecx // reverse sign of neg values
-dpthpba:
- mov pbtemp, ecx // save pb for later use
- // pa = abs(pav)
- mov eax, patemp
- test eax, 0x80000000
- jz dpthpaa
- neg eax // reverse sign of neg values
-dpthpaa:
- mov patemp, eax // save pa for later use
- // test if pa <= pb
- cmp eax, ecx
- jna dpthabb
- // pa > pb; now test if pb <= pc
- cmp ecx, pctemp
- jna dpthbbc
- // pb > pc; Raw(x) = Paeth(x) + Prior(x-bpp)
- mov cl, [esi + edx] // load Prior(x-bpp) into cl
- jmp dpthpaeth
-dpthbbc:
- // pb <= pc; Raw(x) = Paeth(x) + Prior(x)
- mov cl, [esi + ebx] // load Prior(x) into cl
- jmp dpthpaeth
-dpthabb:
- // pa <= pb; now test if pa <= pc
- cmp eax, pctemp
- jna dpthabc
- // pa > pc; Raw(x) = Paeth(x) + Prior(x-bpp)
- mov cl, [esi + edx] // load Prior(x-bpp) into cl
- jmp dpthpaeth
-dpthabc:
- // pa <= pc; Raw(x) = Paeth(x) + Raw(x-bpp)
- mov cl, [edi + edx] // load Raw(x-bpp) into cl
-dpthpaeth:
- inc ebx
- inc edx
- // Raw(x) = (Paeth(x) + Paeth_Predictor( a, b, c )) mod 256
- add [edi + ebx - 1], cl
- cmp ebx, diff
- jb dpthlp1
-dpthgo:
- mov ecx, FullLength
- mov eax, ecx
- sub eax, ebx // subtract alignment fix
- and eax, 0x00000007 // calc bytes over mult of 8
- sub ecx, eax // drop over bytes from original length
- mov MMXLength, ecx
- } // end _asm block
- // Now do the math for the rest of the row
- switch ( bpp )
- {
- case 3:
- {
- ActiveMask.use = 0x0000000000ffffff;
- ActiveMaskEnd.use = 0xffff000000000000;
- ShiftBpp.use = 24; // == bpp(3) * 8
- ShiftRem.use = 40; // == 64 - 24
- _asm
- {
- mov ebx, diff
- mov edi, row
- mov esi, prev_row
- pxor mm0, mm0
- // PRIME the pump (load the first Raw(x-bpp) data set
- movq mm1, [edi+ebx-8]
-dpth3lp:
- psrlq mm1, ShiftRem // shift last 3 bytes to 1st 3 bytes
- movq mm2, [esi + ebx] // load b=Prior(x)
- punpcklbw mm1, mm0 // Unpack High bytes of a
- movq mm3, [esi+ebx-8] // Prep c=Prior(x-bpp) bytes
- punpcklbw mm2, mm0 // Unpack High bytes of b
- psrlq mm3, ShiftRem // shift last 3 bytes to 1st 3 bytes
- // pav = p - a = (a + b - c) - a = b - c
- movq mm4, mm2
- punpcklbw mm3, mm0 // Unpack High bytes of c
- // pbv = p - b = (a + b - c) - b = a - c
- movq mm5, mm1
- psubw mm4, mm3
- pxor mm7, mm7
- // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv
- movq mm6, mm4
- psubw mm5, mm3
-
- // pa = abs(p-a) = abs(pav)
- // pb = abs(p-b) = abs(pbv)
- // pc = abs(p-c) = abs(pcv)
- pcmpgtw mm0, mm4 // Create mask pav bytes < 0
- paddw mm6, mm5
- pand mm0, mm4 // Only pav bytes < 0 in mm7
- pcmpgtw mm7, mm5 // Create mask pbv bytes < 0
- psubw mm4, mm0
- pand mm7, mm5 // Only pbv bytes < 0 in mm0
- psubw mm4, mm0
- psubw mm5, mm7
- pxor mm0, mm0
- pcmpgtw mm0, mm6 // Create mask pcv bytes < 0
- pand mm0, mm6 // Only pav bytes < 0 in mm7
- psubw mm5, mm7
- psubw mm6, mm0
- // test pa <= pb
- movq mm7, mm4
- psubw mm6, mm0
- pcmpgtw mm7, mm5 // pa > pb?
- movq mm0, mm7
- // use mm7 mask to merge pa & pb
- pand mm5, mm7
- // use mm0 mask copy to merge a & b
- pand mm2, mm0
- pandn mm7, mm4
- pandn mm0, mm1
- paddw mm7, mm5
- paddw mm0, mm2
- // test ((pa <= pb)? pa:pb) <= pc
- pcmpgtw mm7, mm6 // pab > pc?
- pxor mm1, mm1
- pand mm3, mm7
- pandn mm7, mm0
- paddw mm7, mm3
- pxor mm0, mm0
- packuswb mm7, mm1
- movq mm3, [esi + ebx] // load c=Prior(x-bpp)
- pand mm7, ActiveMask
- movq mm2, mm3 // load b=Prior(x) step 1
- paddb mm7, [edi + ebx] // add Paeth predictor with Raw(x)
- punpcklbw mm3, mm0 // Unpack High bytes of c
- movq [edi + ebx], mm7 // write back updated value
- movq mm1, mm7 // Now mm1 will be used as Raw(x-bpp)
- // Now do Paeth for 2nd set of bytes (3-5)
- psrlq mm2, ShiftBpp // load b=Prior(x) step 2
- punpcklbw mm1, mm0 // Unpack High bytes of a
- pxor mm7, mm7
- punpcklbw mm2, mm0 // Unpack High bytes of b
- // pbv = p - b = (a + b - c) - b = a - c
- movq mm5, mm1
- // pav = p - a = (a + b - c) - a = b - c
- movq mm4, mm2
- psubw mm5, mm3
- psubw mm4, mm3
- // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) =
- // pav + pbv = pbv + pav
- movq mm6, mm5
- paddw mm6, mm4
-
- // pa = abs(p-a) = abs(pav)
- // pb = abs(p-b) = abs(pbv)
- // pc = abs(p-c) = abs(pcv)
- pcmpgtw mm0, mm5 // Create mask pbv bytes < 0
- pcmpgtw mm7, mm4 // Create mask pav bytes < 0
- pand mm0, mm5 // Only pbv bytes < 0 in mm0
- pand mm7, mm4 // Only pav bytes < 0 in mm7
- psubw mm5, mm0
- psubw mm4, mm7
- psubw mm5, mm0
- psubw mm4, mm7
- pxor mm0, mm0
- pcmpgtw mm0, mm6 // Create mask pcv bytes < 0
- pand mm0, mm6 // Only pav bytes < 0 in mm7
- psubw mm6, mm0
- // test pa <= pb
- movq mm7, mm4
- psubw mm6, mm0
- pcmpgtw mm7, mm5 // pa > pb?
- movq mm0, mm7
- // use mm7 mask to merge pa & pb
- pand mm5, mm7
- // use mm0 mask copy to merge a & b
- pand mm2, mm0
- pandn mm7, mm4
- pandn mm0, mm1
- paddw mm7, mm5
- paddw mm0, mm2
- // test ((pa <= pb)? pa:pb) <= pc
- pcmpgtw mm7, mm6 // pab > pc?
- movq mm2, [esi + ebx] // load b=Prior(x)
- pand mm3, mm7
- pandn mm7, mm0
- pxor mm1, mm1
- paddw mm7, mm3
- pxor mm0, mm0
- packuswb mm7, mm1
- movq mm3, mm2 // load c=Prior(x-bpp) step 1
- pand mm7, ActiveMask
- punpckhbw mm2, mm0 // Unpack High bytes of b
- psllq mm7, ShiftBpp // Shift bytes to 2nd group of 3 bytes
- // pav = p - a = (a + b - c) - a = b - c
- movq mm4, mm2
- paddb mm7, [edi + ebx] // add Paeth predictor with Raw(x)
- psllq mm3, ShiftBpp // load c=Prior(x-bpp) step 2
- movq [edi + ebx], mm7 // write back updated value
- movq mm1, mm7
- punpckhbw mm3, mm0 // Unpack High bytes of c
- psllq mm1, ShiftBpp // Shift bytes
- // Now mm1 will be used as Raw(x-bpp)
- // Now do Paeth for 3rd, and final, set of bytes (6-7)
- pxor mm7, mm7
- punpckhbw mm1, mm0 // Unpack High bytes of a
- psubw mm4, mm3
- // pbv = p - b = (a + b - c) - b = a - c
- movq mm5, mm1
- // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv
- movq mm6, mm4
- psubw mm5, mm3
- pxor mm0, mm0
- paddw mm6, mm5
-
- // pa = abs(p-a) = abs(pav)
- // pb = abs(p-b) = abs(pbv)
- // pc = abs(p-c) = abs(pcv)
- pcmpgtw mm0, mm4 // Create mask pav bytes < 0
- pcmpgtw mm7, mm5 // Create mask pbv bytes < 0
- pand mm0, mm4 // Only pav bytes < 0 in mm7
- pand mm7, mm5 // Only pbv bytes < 0 in mm0
- psubw mm4, mm0
- psubw mm5, mm7
- psubw mm4, mm0
- psubw mm5, mm7
- pxor mm0, mm0
- pcmpgtw mm0, mm6 // Create mask pcv bytes < 0
- pand mm0, mm6 // Only pav bytes < 0 in mm7
- psubw mm6, mm0
- // test pa <= pb
- movq mm7, mm4
- psubw mm6, mm0
- pcmpgtw mm7, mm5 // pa > pb?
- movq mm0, mm7
- // use mm0 mask copy to merge a & b
- pand mm2, mm0
- // use mm7 mask to merge pa & pb
- pand mm5, mm7
- pandn mm0, mm1
- pandn mm7, mm4
- paddw mm0, mm2
- paddw mm7, mm5
- // test ((pa <= pb)? pa:pb) <= pc
- pcmpgtw mm7, mm6 // pab > pc?
- pand mm3, mm7
- pandn mm7, mm0
- paddw mm7, mm3
- pxor mm1, mm1
- packuswb mm1, mm7
- // Step ebx to next set of 8 bytes and repeat loop til done
- add ebx, 8
- pand mm1, ActiveMaskEnd
- paddb mm1, [edi + ebx - 8] // add Paeth predictor with Raw(x)
-
- cmp ebx, MMXLength
- pxor mm0, mm0 // pxor does not affect flags
- movq [edi + ebx - 8], mm1 // write back updated value
- // mm1 will be used as Raw(x-bpp) next loop
- // mm3 ready to be used as Prior(x-bpp) next loop
- jb dpth3lp
- } // end _asm block
- }
- break;
-
- case 6:
- case 7:
- case 5:
- {
- ActiveMask.use = 0x00000000ffffffff;
- ActiveMask2.use = 0xffffffff00000000;
- ShiftBpp.use = bpp << 3; // == bpp * 8
- ShiftRem.use = 64 - ShiftBpp.use;
- _asm
- {
- mov ebx, diff
- mov edi, row
- mov esi, prev_row
- // PRIME the pump (load the first Raw(x-bpp) data set
- movq mm1, [edi+ebx-8]
- pxor mm0, mm0
-dpth6lp:
- // Must shift to position Raw(x-bpp) data
- psrlq mm1, ShiftRem
- // Do first set of 4 bytes
- movq mm3, [esi+ebx-8] // read c=Prior(x-bpp) bytes
- punpcklbw mm1, mm0 // Unpack Low bytes of a
- movq mm2, [esi + ebx] // load b=Prior(x)
- punpcklbw mm2, mm0 // Unpack Low bytes of b
- // Must shift to position Prior(x-bpp) data
- psrlq mm3, ShiftRem
- // pav = p - a = (a + b - c) - a = b - c
- movq mm4, mm2
- punpcklbw mm3, mm0 // Unpack Low bytes of c
- // pbv = p - b = (a + b - c) - b = a - c
- movq mm5, mm1
- psubw mm4, mm3
- pxor mm7, mm7
- // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv
- movq mm6, mm4
- psubw mm5, mm3
- // pa = abs(p-a) = abs(pav)
- // pb = abs(p-b) = abs(pbv)
- // pc = abs(p-c) = abs(pcv)
- pcmpgtw mm0, mm4 // Create mask pav bytes < 0
- paddw mm6, mm5
- pand mm0, mm4 // Only pav bytes < 0 in mm7
- pcmpgtw mm7, mm5 // Create mask pbv bytes < 0
- psubw mm4, mm0
- pand mm7, mm5 // Only pbv bytes < 0 in mm0
- psubw mm4, mm0
- psubw mm5, mm7
- pxor mm0, mm0
- pcmpgtw mm0, mm6 // Create mask pcv bytes < 0
- pand mm0, mm6 // Only pav bytes < 0 in mm7
- psubw mm5, mm7
- psubw mm6, mm0
- // test pa <= pb
- movq mm7, mm4
- psubw mm6, mm0
- pcmpgtw mm7, mm5 // pa > pb?
- movq mm0, mm7
- // use mm7 mask to merge pa & pb
- pand mm5, mm7
- // use mm0 mask copy to merge a & b
- pand mm2, mm0
- pandn mm7, mm4
- pandn mm0, mm1
- paddw mm7, mm5
- paddw mm0, mm2
- // test ((pa <= pb)? pa:pb) <= pc
- pcmpgtw mm7, mm6 // pab > pc?
- pxor mm1, mm1
- pand mm3, mm7
- pandn mm7, mm0
- paddw mm7, mm3
- pxor mm0, mm0
- packuswb mm7, mm1
- movq mm3, [esi + ebx - 8] // load c=Prior(x-bpp)
- pand mm7, ActiveMask
- psrlq mm3, ShiftRem
- movq mm2, [esi + ebx] // load b=Prior(x) step 1
- paddb mm7, [edi + ebx] // add Paeth predictor with Raw(x)
- movq mm6, mm2
- movq [edi + ebx], mm7 // write back updated value
- movq mm1, [edi+ebx-8]
- psllq mm6, ShiftBpp
- movq mm5, mm7
- psrlq mm1, ShiftRem
- por mm3, mm6
- psllq mm5, ShiftBpp
- punpckhbw mm3, mm0 // Unpack High bytes of c
- por mm1, mm5
- // Do second set of 4 bytes
- punpckhbw mm2, mm0 // Unpack High bytes of b
- punpckhbw mm1, mm0 // Unpack High bytes of a
- // pav = p - a = (a + b - c) - a = b - c
- movq mm4, mm2
- // pbv = p - b = (a + b - c) - b = a - c
- movq mm5, mm1
- psubw mm4, mm3
- pxor mm7, mm7
- // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv
- movq mm6, mm4
- psubw mm5, mm3
- // pa = abs(p-a) = abs(pav)
- // pb = abs(p-b) = abs(pbv)
- // pc = abs(p-c) = abs(pcv)
- pcmpgtw mm0, mm4 // Create mask pav bytes < 0
- paddw mm6, mm5
- pand mm0, mm4 // Only pav bytes < 0 in mm7
- pcmpgtw mm7, mm5 // Create mask pbv bytes < 0
- psubw mm4, mm0
- pand mm7, mm5 // Only pbv bytes < 0 in mm0
- psubw mm4, mm0
- psubw mm5, mm7
- pxor mm0, mm0
- pcmpgtw mm0, mm6 // Create mask pcv bytes < 0
- pand mm0, mm6 // Only pav bytes < 0 in mm7
- psubw mm5, mm7
- psubw mm6, mm0
- // test pa <= pb
- movq mm7, mm4
- psubw mm6, mm0
- pcmpgtw mm7, mm5 // pa > pb?
- movq mm0, mm7
- // use mm7 mask to merge pa & pb
- pand mm5, mm7
- // use mm0 mask copy to merge a & b
- pand mm2, mm0
- pandn mm7, mm4
- pandn mm0, mm1
- paddw mm7, mm5
- paddw mm0, mm2
- // test ((pa <= pb)? pa:pb) <= pc
- pcmpgtw mm7, mm6 // pab > pc?
- pxor mm1, mm1
- pand mm3, mm7
- pandn mm7, mm0
- pxor mm1, mm1
- paddw mm7, mm3
- pxor mm0, mm0
- // Step ex to next set of 8 bytes and repeat loop til done
- add ebx, 8
- packuswb mm1, mm7
- paddb mm1, [edi + ebx - 8] // add Paeth predictor with Raw(x)
- cmp ebx, MMXLength
- movq [edi + ebx - 8], mm1 // write back updated value
- // mm1 will be used as Raw(x-bpp) next loop
- jb dpth6lp
- } // end _asm block
- }
- break;
-
- case 4:
- {
- ActiveMask.use = 0x00000000ffffffff;
- _asm {
- mov ebx, diff
- mov edi, row
- mov esi, prev_row
- pxor mm0, mm0
- // PRIME the pump (load the first Raw(x-bpp) data set
- movq mm1, [edi+ebx-8] // Only time should need to read
- // a=Raw(x-bpp) bytes
-dpth4lp:
- // Do first set of 4 bytes
- movq mm3, [esi+ebx-8] // read c=Prior(x-bpp) bytes
- punpckhbw mm1, mm0 // Unpack Low bytes of a
- movq mm2, [esi + ebx] // load b=Prior(x)
- punpcklbw mm2, mm0 // Unpack High bytes of b
- // pav = p - a = (a + b - c) - a = b - c
- movq mm4, mm2
- punpckhbw mm3, mm0 // Unpack High bytes of c
- // pbv = p - b = (a + b - c) - b = a - c
- movq mm5, mm1
- psubw mm4, mm3
- pxor mm7, mm7
- // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv
- movq mm6, mm4
- psubw mm5, mm3
- // pa = abs(p-a) = abs(pav)
- // pb = abs(p-b) = abs(pbv)
- // pc = abs(p-c) = abs(pcv)
- pcmpgtw mm0, mm4 // Create mask pav bytes < 0
- paddw mm6, mm5
- pand mm0, mm4 // Only pav bytes < 0 in mm7
- pcmpgtw mm7, mm5 // Create mask pbv bytes < 0
- psubw mm4, mm0
- pand mm7, mm5 // Only pbv bytes < 0 in mm0
- psubw mm4, mm0
- psubw mm5, mm7
- pxor mm0, mm0
- pcmpgtw mm0, mm6 // Create mask pcv bytes < 0
- pand mm0, mm6 // Only pav bytes < 0 in mm7
- psubw mm5, mm7
- psubw mm6, mm0
- // test pa <= pb
- movq mm7, mm4
- psubw mm6, mm0
- pcmpgtw mm7, mm5 // pa > pb?
- movq mm0, mm7
- // use mm7 mask to merge pa & pb
- pand mm5, mm7
- // use mm0 mask copy to merge a & b
- pand mm2, mm0
- pandn mm7, mm4
- pandn mm0, mm1
- paddw mm7, mm5
- paddw mm0, mm2
- // test ((pa <= pb)? pa:pb) <= pc
- pcmpgtw mm7, mm6 // pab > pc?
- pxor mm1, mm1
- pand mm3, mm7
- pandn mm7, mm0
- paddw mm7, mm3
- pxor mm0, mm0
- packuswb mm7, mm1
- movq mm3, [esi + ebx] // load c=Prior(x-bpp)
- pand mm7, ActiveMask
- movq mm2, mm3 // load b=Prior(x) step 1
- paddb mm7, [edi + ebx] // add Paeth predictor with Raw(x)
- punpcklbw mm3, mm0 // Unpack High bytes of c
- movq [edi + ebx], mm7 // write back updated value
- movq mm1, mm7 // Now mm1 will be used as Raw(x-bpp)
- // Do second set of 4 bytes
- punpckhbw mm2, mm0 // Unpack Low bytes of b
- punpcklbw mm1, mm0 // Unpack Low bytes of a
- // pav = p - a = (a + b - c) - a = b - c
- movq mm4, mm2
- // pbv = p - b = (a + b - c) - b = a - c
- movq mm5, mm1
- psubw mm4, mm3
- pxor mm7, mm7
- // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv
- movq mm6, mm4
- psubw mm5, mm3
- // pa = abs(p-a) = abs(pav)
- // pb = abs(p-b) = abs(pbv)
- // pc = abs(p-c) = abs(pcv)
- pcmpgtw mm0, mm4 // Create mask pav bytes < 0
- paddw mm6, mm5
- pand mm0, mm4 // Only pav bytes < 0 in mm7
- pcmpgtw mm7, mm5 // Create mask pbv bytes < 0
- psubw mm4, mm0
- pand mm7, mm5 // Only pbv bytes < 0 in mm0
- psubw mm4, mm0
- psubw mm5, mm7
- pxor mm0, mm0
- pcmpgtw mm0, mm6 // Create mask pcv bytes < 0
- pand mm0, mm6 // Only pav bytes < 0 in mm7
- psubw mm5, mm7
- psubw mm6, mm0
- // test pa <= pb
- movq mm7, mm4
- psubw mm6, mm0
- pcmpgtw mm7, mm5 // pa > pb?
- movq mm0, mm7
- // use mm7 mask to merge pa & pb
- pand mm5, mm7
- // use mm0 mask copy to merge a & b
- pand mm2, mm0
- pandn mm7, mm4
- pandn mm0, mm1
- paddw mm7, mm5
- paddw mm0, mm2
- // test ((pa <= pb)? pa:pb) <= pc
- pcmpgtw mm7, mm6 // pab > pc?
- pxor mm1, mm1
- pand mm3, mm7
- pandn mm7, mm0
- pxor mm1, mm1
- paddw mm7, mm3
- pxor mm0, mm0
- // Step ex to next set of 8 bytes and repeat loop til done
- add ebx, 8
- packuswb mm1, mm7
- paddb mm1, [edi + ebx - 8] // add Paeth predictor with Raw(x)
- cmp ebx, MMXLength
- movq [edi + ebx - 8], mm1 // write back updated value
- // mm1 will be used as Raw(x-bpp) next loop
- jb dpth4lp
- } // end _asm block
- }
- break;
- case 8: // bpp == 8
- {
- ActiveMask.use = 0x00000000ffffffff;
- _asm {
- mov ebx, diff
- mov edi, row
- mov esi, prev_row
- pxor mm0, mm0
- // PRIME the pump (load the first Raw(x-bpp) data set
- movq mm1, [edi+ebx-8] // Only time should need to read
- // a=Raw(x-bpp) bytes
-dpth8lp:
- // Do first set of 4 bytes
- movq mm3, [esi+ebx-8] // read c=Prior(x-bpp) bytes
- punpcklbw mm1, mm0 // Unpack Low bytes of a
- movq mm2, [esi + ebx] // load b=Prior(x)
- punpcklbw mm2, mm0 // Unpack Low bytes of b
- // pav = p - a = (a + b - c) - a = b - c
- movq mm4, mm2
- punpcklbw mm3, mm0 // Unpack Low bytes of c
- // pbv = p - b = (a + b - c) - b = a - c
- movq mm5, mm1
- psubw mm4, mm3
- pxor mm7, mm7
- // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv
- movq mm6, mm4
- psubw mm5, mm3
- // pa = abs(p-a) = abs(pav)
- // pb = abs(p-b) = abs(pbv)
- // pc = abs(p-c) = abs(pcv)
- pcmpgtw mm0, mm4 // Create mask pav bytes < 0
- paddw mm6, mm5
- pand mm0, mm4 // Only pav bytes < 0 in mm7
- pcmpgtw mm7, mm5 // Create mask pbv bytes < 0
- psubw mm4, mm0
- pand mm7, mm5 // Only pbv bytes < 0 in mm0
- psubw mm4, mm0
- psubw mm5, mm7
- pxor mm0, mm0
- pcmpgtw mm0, mm6 // Create mask pcv bytes < 0
- pand mm0, mm6 // Only pav bytes < 0 in mm7
- psubw mm5, mm7
- psubw mm6, mm0
- // test pa <= pb
- movq mm7, mm4
- psubw mm6, mm0
- pcmpgtw mm7, mm5 // pa > pb?
- movq mm0, mm7
- // use mm7 mask to merge pa & pb
- pand mm5, mm7
- // use mm0 mask copy to merge a & b
- pand mm2, mm0
- pandn mm7, mm4
- pandn mm0, mm1
- paddw mm7, mm5
- paddw mm0, mm2
- // test ((pa <= pb)? pa:pb) <= pc
- pcmpgtw mm7, mm6 // pab > pc?
- pxor mm1, mm1
- pand mm3, mm7
- pandn mm7, mm0
- paddw mm7, mm3
- pxor mm0, mm0
- packuswb mm7, mm1
- movq mm3, [esi+ebx-8] // read c=Prior(x-bpp) bytes
- pand mm7, ActiveMask
- movq mm2, [esi + ebx] // load b=Prior(x)
- paddb mm7, [edi + ebx] // add Paeth predictor with Raw(x)
- punpckhbw mm3, mm0 // Unpack High bytes of c
- movq [edi + ebx], mm7 // write back updated value
- movq mm1, [edi+ebx-8] // read a=Raw(x-bpp) bytes
-
- // Do second set of 4 bytes
- punpckhbw mm2, mm0 // Unpack High bytes of b
- punpckhbw mm1, mm0 // Unpack High bytes of a
- // pav = p - a = (a + b - c) - a = b - c
- movq mm4, mm2
- // pbv = p - b = (a + b - c) - b = a - c
- movq mm5, mm1
- psubw mm4, mm3
- pxor mm7, mm7
- // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv
- movq mm6, mm4
- psubw mm5, mm3
- // pa = abs(p-a) = abs(pav)
- // pb = abs(p-b) = abs(pbv)
- // pc = abs(p-c) = abs(pcv)
- pcmpgtw mm0, mm4 // Create mask pav bytes < 0
- paddw mm6, mm5
- pand mm0, mm4 // Only pav bytes < 0 in mm7
- pcmpgtw mm7, mm5 // Create mask pbv bytes < 0
- psubw mm4, mm0
- pand mm7, mm5 // Only pbv bytes < 0 in mm0
- psubw mm4, mm0
- psubw mm5, mm7
- pxor mm0, mm0
- pcmpgtw mm0, mm6 // Create mask pcv bytes < 0
- pand mm0, mm6 // Only pav bytes < 0 in mm7
- psubw mm5, mm7
- psubw mm6, mm0
- // test pa <= pb
- movq mm7, mm4
- psubw mm6, mm0
- pcmpgtw mm7, mm5 // pa > pb?
- movq mm0, mm7
- // use mm7 mask to merge pa & pb
- pand mm5, mm7
- // use mm0 mask copy to merge a & b
- pand mm2, mm0
- pandn mm7, mm4
- pandn mm0, mm1
- paddw mm7, mm5
- paddw mm0, mm2
- // test ((pa <= pb)? pa:pb) <= pc
- pcmpgtw mm7, mm6 // pab > pc?
- pxor mm1, mm1
- pand mm3, mm7
- pandn mm7, mm0
- pxor mm1, mm1
- paddw mm7, mm3
- pxor mm0, mm0
- // Step ex to next set of 8 bytes and repeat loop til done
- add ebx, 8
- packuswb mm1, mm7
- paddb mm1, [edi + ebx - 8] // add Paeth predictor with Raw(x)
- cmp ebx, MMXLength
- movq [edi + ebx - 8], mm1 // write back updated value
- // mm1 will be used as Raw(x-bpp) next loop
- jb dpth8lp
- } // end _asm block
- }
- break;
-
- case 1: // bpp = 1
- case 2: // bpp = 2
- default: // bpp > 8
- {
- _asm {
- mov ebx, diff
- cmp ebx, FullLength
- jnb dpthdend
- mov edi, row
- mov esi, prev_row
- // Do Paeth decode for remaining bytes
- mov edx, ebx
- xor ecx, ecx // zero ecx before using cl & cx in loop below
- sub edx, bpp // Set edx = ebx - bpp
-dpthdlp:
- xor eax, eax
- // pav = p - a = (a + b - c) - a = b - c
- mov al, [esi + ebx] // load Prior(x) into al
- mov cl, [esi + edx] // load Prior(x-bpp) into cl
- sub eax, ecx // subtract Prior(x-bpp)
- mov patemp, eax // Save pav for later use
- xor eax, eax
- // pbv = p - b = (a + b - c) - b = a - c
- mov al, [edi + edx] // load Raw(x-bpp) into al
- sub eax, ecx // subtract Prior(x-bpp)
- mov ecx, eax
- // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv
- add eax, patemp // pcv = pav + pbv
- // pc = abs(pcv)
- test eax, 0x80000000
- jz dpthdpca
- neg eax // reverse sign of neg values
-dpthdpca:
- mov pctemp, eax // save pc for later use
- // pb = abs(pbv)
- test ecx, 0x80000000
- jz dpthdpba
- neg ecx // reverse sign of neg values
-dpthdpba:
- mov pbtemp, ecx // save pb for later use
- // pa = abs(pav)
- mov eax, patemp
- test eax, 0x80000000
- jz dpthdpaa
- neg eax // reverse sign of neg values
-dpthdpaa:
- mov patemp, eax // save pa for later use
- // test if pa <= pb
- cmp eax, ecx
- jna dpthdabb
- // pa > pb; now test if pb <= pc
- cmp ecx, pctemp
- jna dpthdbbc
- // pb > pc; Raw(x) = Paeth(x) + Prior(x-bpp)
- mov cl, [esi + edx] // load Prior(x-bpp) into cl
- jmp dpthdpaeth
-dpthdbbc:
- // pb <= pc; Raw(x) = Paeth(x) + Prior(x)
- mov cl, [esi + ebx] // load Prior(x) into cl
- jmp dpthdpaeth
-dpthdabb:
- // pa <= pb; now test if pa <= pc
- cmp eax, pctemp
- jna dpthdabc
- // pa > pc; Raw(x) = Paeth(x) + Prior(x-bpp)
- mov cl, [esi + edx] // load Prior(x-bpp) into cl
- jmp dpthdpaeth
-dpthdabc:
- // pa <= pc; Raw(x) = Paeth(x) + Raw(x-bpp)
- mov cl, [edi + edx] // load Raw(x-bpp) into cl
-dpthdpaeth:
- inc ebx
- inc edx
- // Raw(x) = (Paeth(x) + Paeth_Predictor( a, b, c )) mod 256
- add [edi + ebx - 1], cl
- cmp ebx, FullLength
- jb dpthdlp
-dpthdend:
- } // end _asm block
- }
- return; // No need to go further with this one
- } // end switch ( bpp )
- _asm
- {
- // MMX acceleration complete now do clean-up
- // Check if any remaining bytes left to decode
- mov ebx, MMXLength
- cmp ebx, FullLength
- jnb dpthend
- mov edi, row
- mov esi, prev_row
- // Do Paeth decode for remaining bytes
- mov edx, ebx
- xor ecx, ecx // zero ecx before using cl & cx in loop below
- sub edx, bpp // Set edx = ebx - bpp
-dpthlp2:
- xor eax, eax
- // pav = p - a = (a + b - c) - a = b - c
- mov al, [esi + ebx] // load Prior(x) into al
- mov cl, [esi + edx] // load Prior(x-bpp) into cl
- sub eax, ecx // subtract Prior(x-bpp)
- mov patemp, eax // Save pav for later use
- xor eax, eax
- // pbv = p - b = (a + b - c) - b = a - c
- mov al, [edi + edx] // load Raw(x-bpp) into al
- sub eax, ecx // subtract Prior(x-bpp)
- mov ecx, eax
- // pcv = p - c = (a + b - c) -c = (a - c) + (b - c) = pav + pbv
- add eax, patemp // pcv = pav + pbv
- // pc = abs(pcv)
- test eax, 0x80000000
- jz dpthpca2
- neg eax // reverse sign of neg values
-dpthpca2:
- mov pctemp, eax // save pc for later use
- // pb = abs(pbv)
- test ecx, 0x80000000
- jz dpthpba2
- neg ecx // reverse sign of neg values
-dpthpba2:
- mov pbtemp, ecx // save pb for later use
- // pa = abs(pav)
- mov eax, patemp
- test eax, 0x80000000
- jz dpthpaa2
- neg eax // reverse sign of neg values
-dpthpaa2:
- mov patemp, eax // save pa for later use
- // test if pa <= pb
- cmp eax, ecx
- jna dpthabb2
- // pa > pb; now test if pb <= pc
- cmp ecx, pctemp
- jna dpthbbc2
- // pb > pc; Raw(x) = Paeth(x) + Prior(x-bpp)
- mov cl, [esi + edx] // load Prior(x-bpp) into cl
- jmp dpthpaeth2
-dpthbbc2:
- // pb <= pc; Raw(x) = Paeth(x) + Prior(x)
- mov cl, [esi + ebx] // load Prior(x) into cl
- jmp dpthpaeth2
-dpthabb2:
- // pa <= pb; now test if pa <= pc
- cmp eax, pctemp
- jna dpthabc2
- // pa > pc; Raw(x) = Paeth(x) + Prior(x-bpp)
- mov cl, [esi + edx] // load Prior(x-bpp) into cl
- jmp dpthpaeth2
-dpthabc2:
- // pa <= pc; Raw(x) = Paeth(x) + Raw(x-bpp)
- mov cl, [edi + edx] // load Raw(x-bpp) into cl
-dpthpaeth2:
- inc ebx
- inc edx
- // Raw(x) = (Paeth(x) + Paeth_Predictor( a, b, c )) mod 256
- add [edi + ebx - 1], cl
- cmp ebx, FullLength
- jb dpthlp2
-dpthend:
- emms // End MMX instructions; prep for possible FP instrs.
- } // end _asm block
-}
-
-// Optimized code for PNG Sub filter decoder
-void /* PRIVATE */
-png_read_filter_row_mmx_sub(png_row_infop row_info, png_bytep row)
-{
- //int test;
- int bpp;
- png_uint_32 FullLength;
- png_uint_32 MMXLength;
- int diff;
-
- bpp = (row_info->pixel_depth + 7) >> 3; // Get # bytes per pixel
- FullLength = row_info->rowbytes - bpp; // # of bytes to filter
- _asm {
- mov edi, row
- mov esi, edi // lp = row
- add edi, bpp // rp = row + bpp
- xor eax, eax
- // get # of bytes to alignment
- mov diff, edi // take start of row
- add diff, 0xf // add 7 + 8 to incr past
- // alignment boundary
- xor ebx, ebx
- and diff, 0xfffffff8 // mask to alignment boundary
- sub diff, edi // subtract from start ==> value
- // ebx at alignment
- jz dsubgo
- // fix alignment
-dsublp1:
- mov al, [esi+ebx]
- add [edi+ebx], al
- inc ebx
- cmp ebx, diff
- jb dsublp1
-dsubgo:
- mov ecx, FullLength
- mov edx, ecx
- sub edx, ebx // subtract alignment fix
- and edx, 0x00000007 // calc bytes over mult of 8
- sub ecx, edx // drop over bytes from length
- mov MMXLength, ecx
- } // end _asm block
-
- // Now do the math for the rest of the row
- switch ( bpp )
- {
- case 3:
- {
- ActiveMask.use = 0x0000ffffff000000;
- ShiftBpp.use = 24; // == 3 * 8
- ShiftRem.use = 40; // == 64 - 24
- _asm {
- mov edi, row
- movq mm7, ActiveMask // Load ActiveMask for 2nd active byte group
- mov esi, edi // lp = row
- add edi, bpp // rp = row + bpp
- movq mm6, mm7
- mov ebx, diff
- psllq mm6, ShiftBpp // Move mask in mm6 to cover 3rd active
- // byte group
- // PRIME the pump (load the first Raw(x-bpp) data set
- movq mm1, [edi+ebx-8]
-dsub3lp:
- psrlq mm1, ShiftRem // Shift data for adding 1st bpp bytes
- // no need for mask; shift clears inactive bytes
- // Add 1st active group
- movq mm0, [edi+ebx]
- paddb mm0, mm1
- // Add 2nd active group
- movq mm1, mm0 // mov updated Raws to mm1
- psllq mm1, ShiftBpp // shift data to position correctly
- pand mm1, mm7 // mask to use only 2nd active group
- paddb mm0, mm1
- // Add 3rd active group
- movq mm1, mm0 // mov updated Raws to mm1
- psllq mm1, ShiftBpp // shift data to position correctly
- pand mm1, mm6 // mask to use only 3rd active group
- add ebx, 8
- paddb mm0, mm1
- cmp ebx, MMXLength
- movq [edi+ebx-8], mm0 // Write updated Raws back to array
- // Prep for doing 1st add at top of loop
- movq mm1, mm0
- jb dsub3lp
- } // end _asm block
- }
- break;
-
- case 1:
- {
- // Placed here just in case this is a duplicate of the
- // non-MMX code for the SUB filter in png_read_filter_row below
- //
- // png_bytep rp;
- // png_bytep lp;
- // png_uint_32 i;
- // bpp = (row_info->pixel_depth + 7) >> 3;
- // for (i = (png_uint_32)bpp, rp = row + bpp, lp = row;
- // i < row_info->rowbytes; i++, rp++, lp++)
- // {
- // *rp = (png_byte)(((int)(*rp) + (int)(*lp)) & 0xff);
- // }
- _asm {
- mov ebx, diff
- mov edi, row
- cmp ebx, FullLength
- jnb dsub1end
- mov esi, edi // lp = row
- xor eax, eax
- add edi, bpp // rp = row + bpp
-dsub1lp:
- mov al, [esi+ebx]
- add [edi+ebx], al
- inc ebx
- cmp ebx, FullLength
- jb dsub1lp
-dsub1end:
- } // end _asm block
- }
- return;
-
- case 6:
- case 7:
- case 4:
- case 5:
- {
- ShiftBpp.use = bpp << 3;
- ShiftRem.use = 64 - ShiftBpp.use;
- _asm {
- mov edi, row
- mov ebx, diff
- mov esi, edi // lp = row
- add edi, bpp // rp = row + bpp
- // PRIME the pump (load the first Raw(x-bpp) data set
- movq mm1, [edi+ebx-8]
-dsub4lp:
- psrlq mm1, ShiftRem // Shift data for adding 1st bpp bytes
- // no need for mask; shift clears inactive bytes
- movq mm0, [edi+ebx]
- paddb mm0, mm1
- // Add 2nd active group
- movq mm1, mm0 // mov updated Raws to mm1
- psllq mm1, ShiftBpp // shift data to position correctly
- // there is no need for any mask
- // since shift clears inactive bits/bytes
- add ebx, 8
- paddb mm0, mm1
- cmp ebx, MMXLength
- movq [edi+ebx-8], mm0
- movq mm1, mm0 // Prep for doing 1st add at top of loop
- jb dsub4lp
- } // end _asm block
- }
- break;
-
- case 2:
- {
- ActiveMask.use = 0x00000000ffff0000;
- ShiftBpp.use = 16; // == 2 * 8
- ShiftRem.use = 48; // == 64 - 16
- _asm {
- movq mm7, ActiveMask // Load ActiveMask for 2nd active byte group
- mov ebx, diff
- movq mm6, mm7
- mov edi, row
- psllq mm6, ShiftBpp // Move mask in mm6 to cover 3rd active
- // byte group
- mov esi, edi // lp = row
- movq mm5, mm6
- add edi, bpp // rp = row + bpp
- psllq mm5, ShiftBpp // Move mask in mm5 to cover 4th active
- // byte group
- // PRIME the pump (load the first Raw(x-bpp) data set
- movq mm1, [edi+ebx-8]
-dsub2lp:
- // Add 1st active group
- psrlq mm1, ShiftRem // Shift data for adding 1st bpp bytes
- // no need for mask; shift clears inactive
- // bytes
- movq mm0, [edi+ebx]
- paddb mm0, mm1
- // Add 2nd active group
- movq mm1, mm0 // mov updated Raws to mm1
- psllq mm1, ShiftBpp // shift data to position correctly
- pand mm1, mm7 // mask to use only 2nd active group
- paddb mm0, mm1
- // Add 3rd active group
- movq mm1, mm0 // mov updated Raws to mm1
- psllq mm1, ShiftBpp // shift data to position correctly
- pand mm1, mm6 // mask to use only 3rd active group
- paddb mm0, mm1
- // Add 4th active group
- movq mm1, mm0 // mov updated Raws to mm1
- psllq mm1, ShiftBpp // shift data to position correctly
- pand mm1, mm5 // mask to use only 4th active group
- add ebx, 8
- paddb mm0, mm1
- cmp ebx, MMXLength
- movq [edi+ebx-8], mm0 // Write updated Raws back to array
- movq mm1, mm0 // Prep for doing 1st add at top of loop
- jb dsub2lp
- } // end _asm block
- }
- break;
- case 8:
- {
- _asm {
- mov edi, row
- mov ebx, diff
- mov esi, edi // lp = row
- add edi, bpp // rp = row + bpp
- mov ecx, MMXLength
- movq mm7, [edi+ebx-8] // PRIME the pump (load the first
- // Raw(x-bpp) data set
- and ecx, 0x0000003f // calc bytes over mult of 64
-dsub8lp:
- movq mm0, [edi+ebx] // Load Sub(x) for 1st 8 bytes
- paddb mm0, mm7
- movq mm1, [edi+ebx+8] // Load Sub(x) for 2nd 8 bytes
- movq [edi+ebx], mm0 // Write Raw(x) for 1st 8 bytes
- // Now mm0 will be used as Raw(x-bpp) for
- // the 2nd group of 8 bytes. This will be
- // repeated for each group of 8 bytes with
- // the 8th group being used as the Raw(x-bpp)
- // for the 1st group of the next loop.
- paddb mm1, mm0
- movq mm2, [edi+ebx+16] // Load Sub(x) for 3rd 8 bytes
- movq [edi+ebx+8], mm1 // Write Raw(x) for 2nd 8 bytes
- paddb mm2, mm1
- movq mm3, [edi+ebx+24] // Load Sub(x) for 4th 8 bytes
- movq [edi+ebx+16], mm2 // Write Raw(x) for 3rd 8 bytes
- paddb mm3, mm2
- movq mm4, [edi+ebx+32] // Load Sub(x) for 5th 8 bytes
- movq [edi+ebx+24], mm3 // Write Raw(x) for 4th 8 bytes
- paddb mm4, mm3
- movq mm5, [edi+ebx+40] // Load Sub(x) for 6th 8 bytes
- movq [edi+ebx+32], mm4 // Write Raw(x) for 5th 8 bytes
- paddb mm5, mm4
- movq mm6, [edi+ebx+48] // Load Sub(x) for 7th 8 bytes
- movq [edi+ebx+40], mm5 // Write Raw(x) for 6th 8 bytes
- paddb mm6, mm5
- movq mm7, [edi+ebx+56] // Load Sub(x) for 8th 8 bytes
- movq [edi+ebx+48], mm6 // Write Raw(x) for 7th 8 bytes
- add ebx, 64
- paddb mm7, mm6
- cmp ebx, ecx
- movq [edi+ebx-8], mm7 // Write Raw(x) for 8th 8 bytes
- jb dsub8lp
- cmp ebx, MMXLength
- jnb dsub8lt8
-dsub8lpA:
- movq mm0, [edi+ebx]
- add ebx, 8
- paddb mm0, mm7
- cmp ebx, MMXLength
- movq [edi+ebx-8], mm0 // use -8 to offset early add to ebx
- movq mm7, mm0 // Move calculated Raw(x) data to mm1 to
- // be the new Raw(x-bpp) for the next loop
- jb dsub8lpA
-dsub8lt8:
- } // end _asm block
- }
- break;
-
- default: // bpp greater than 8 bytes
- {
- _asm {
- mov ebx, diff
- mov edi, row
- mov esi, edi // lp = row
- add edi, bpp // rp = row + bpp
-dsubAlp:
- movq mm0, [edi+ebx]
- movq mm1, [esi+ebx]
- add ebx, 8
- paddb mm0, mm1
- cmp ebx, MMXLength
- movq [edi+ebx-8], mm0 // mov does not affect flags; -8 to offset
- // add ebx
- jb dsubAlp
- } // end _asm block
- }
- break;
-
- } // end switch ( bpp )
-
- _asm {
- mov ebx, MMXLength
- mov edi, row
- cmp ebx, FullLength
- jnb dsubend
- mov esi, edi // lp = row
- xor eax, eax
- add edi, bpp // rp = row + bpp
-dsublp2:
- mov al, [esi+ebx]
- add [edi+ebx], al
- inc ebx
- cmp ebx, FullLength
- jb dsublp2
-dsubend:
- emms // End MMX instructions; prep for possible FP instrs.
- } // end _asm block
-}
-
-// Optimized code for PNG Up filter decoder
-void /* PRIVATE */
-png_read_filter_row_mmx_up(png_row_infop row_info, png_bytep row,
- png_bytep prev_row)
-{
- png_uint_32 len;
- len = row_info->rowbytes; // # of bytes to filter
- _asm {
- mov edi, row
- // get # of bytes to alignment
- mov ecx, edi
- xor ebx, ebx
- add ecx, 0x7
- xor eax, eax
- and ecx, 0xfffffff8
- mov esi, prev_row
- sub ecx, edi
- jz dupgo
- // fix alignment
-duplp1:
- mov al, [edi+ebx]
- add al, [esi+ebx]
- inc ebx
- cmp ebx, ecx
- mov [edi + ebx-1], al // mov does not affect flags; -1 to offset inc ebx
- jb duplp1
-dupgo:
- mov ecx, len
- mov edx, ecx
- sub edx, ebx // subtract alignment fix
- and edx, 0x0000003f // calc bytes over mult of 64
- sub ecx, edx // drop over bytes from length
- // Unrolled loop - use all MMX registers and interleave to reduce
- // number of branch instructions (loops) and reduce partial stalls
-duploop:
- movq mm1, [esi+ebx]
- movq mm0, [edi+ebx]
- movq mm3, [esi+ebx+8]
- paddb mm0, mm1
- movq mm2, [edi+ebx+8]
- movq [edi+ebx], mm0
- paddb mm2, mm3
- movq mm5, [esi+ebx+16]
- movq [edi+ebx+8], mm2
- movq mm4, [edi+ebx+16]
- movq mm7, [esi+ebx+24]
- paddb mm4, mm5
- movq mm6, [edi+ebx+24]
- movq [edi+ebx+16], mm4
- paddb mm6, mm7
- movq mm1, [esi+ebx+32]
- movq [edi+ebx+24], mm6
- movq mm0, [edi+ebx+32]
- movq mm3, [esi+ebx+40]
- paddb mm0, mm1
- movq mm2, [edi+ebx+40]
- movq [edi+ebx+32], mm0
- paddb mm2, mm3
- movq mm5, [esi+ebx+48]
- movq [edi+ebx+40], mm2
- movq mm4, [edi+ebx+48]
- movq mm7, [esi+ebx+56]
- paddb mm4, mm5
- movq mm6, [edi+ebx+56]
- movq [edi+ebx+48], mm4
- add ebx, 64
- paddb mm6, mm7
- cmp ebx, ecx
- movq [edi+ebx-8], mm6 // (+56)movq does not affect flags;
- // -8 to offset add ebx
- jb duploop
-
- cmp edx, 0 // Test for bytes over mult of 64
- jz dupend
-
-
- // 2 lines added by lcreeve@netins.net
- // (mail 11 Jul 98 in png-implement list)
- cmp edx, 8 //test for less than 8 bytes
- jb duplt8
-
-
- add ecx, edx
- and edx, 0x00000007 // calc bytes over mult of 8
- sub ecx, edx // drop over bytes from length
- jz duplt8
- // Loop using MMX registers mm0 & mm1 to update 8 bytes simultaneously
-duplpA:
- movq mm1, [esi+ebx]
- movq mm0, [edi+ebx]
- add ebx, 8
- paddb mm0, mm1
- cmp ebx, ecx
- movq [edi+ebx-8], mm0 // movq does not affect flags; -8 to offset add ebx
- jb duplpA
- cmp edx, 0 // Test for bytes over mult of 8
- jz dupend
-duplt8:
- xor eax, eax
- add ecx, edx // move over byte count into counter
- // Loop using x86 registers to update remaining bytes
-duplp2:
- mov al, [edi + ebx]
- add al, [esi + ebx]
- inc ebx
- cmp ebx, ecx
- mov [edi + ebx-1], al // mov does not affect flags; -1 to offset inc ebx
- jb duplp2
-dupend:
- // Conversion of filtered row completed
- emms // End MMX instructions; prep for possible FP instrs.
- } // end _asm block
-}
-
-
-// Optimized png_read_filter_row routines
-void /* PRIVATE */
-png_read_filter_row(png_structp png_ptr, png_row_infop row_info, png_bytep
- row, png_bytep prev_row, int filter)
-{
-#ifdef PNG_DEBUG
- char filnm[10];
-#endif
-
- if (mmx_supported == 2) {
- /* this should have happened in png_init_mmx_flags() already */
- png_warning(png_ptr, "asm_flags may not have been initialized");
- png_mmx_support();
- }
-
-#ifdef PNG_DEBUG
- png_debug(1, "in png_read_filter_row\n");
- switch (filter)
- {
- case 0: sprintf(filnm, "none");
- break;
- case 1: sprintf(filnm, "sub-%s",
- (png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_SUB)? "MMX" : "x86");
- break;
- case 2: sprintf(filnm, "up-%s",
- (png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_UP)? "MMX" : "x86");
- break;
- case 3: sprintf(filnm, "avg-%s",
- (png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_AVG)? "MMX" : "x86");
- break;
- case 4: sprintf(filnm, "Paeth-%s",
- (png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_PAETH)? "MMX":"x86");
- break;
- default: sprintf(filnm, "unknw");
- break;
- }
- png_debug2(0,"row=%5d, %s, ", png_ptr->row_number, filnm);
- png_debug2(0, "pd=%2d, b=%d, ", (int)row_info->pixel_depth,
- (int)((row_info->pixel_depth + 7) >> 3));
- png_debug1(0,"len=%8d, ", row_info->rowbytes);
-#endif /* PNG_DEBUG */
-
- switch (filter)
- {
- case PNG_FILTER_VALUE_NONE:
- break;
-
- case PNG_FILTER_VALUE_SUB:
- {
- if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_SUB) &&
- (row_info->pixel_depth >= png_ptr->mmx_bitdepth_threshold) &&
- (row_info->rowbytes >= png_ptr->mmx_rowbytes_threshold))
- {
- png_read_filter_row_mmx_sub(row_info, row);
- }
- else
- {
- png_uint_32 i;
- png_uint_32 istop = row_info->rowbytes;
- png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3;
- png_bytep rp = row + bpp;
- png_bytep lp = row;
-
- for (i = bpp; i < istop; i++)
- {
- *rp = (png_byte)(((int)(*rp) + (int)(*lp++)) & 0xff);
- rp++;
- }
- }
- break;
- }
-
- case PNG_FILTER_VALUE_UP:
- {
- if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_UP) &&
- (row_info->pixel_depth >= png_ptr->mmx_bitdepth_threshold) &&
- (row_info->rowbytes >= png_ptr->mmx_rowbytes_threshold))
- {
- png_read_filter_row_mmx_up(row_info, row, prev_row);
- }
- else
- {
- png_uint_32 i;
- png_uint_32 istop = row_info->rowbytes;
- png_bytep rp = row;
- png_bytep pp = prev_row;
-
- for (i = 0; i < istop; ++i)
- {
- *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff);
- rp++;
- }
- }
- break;
- }
-
- case PNG_FILTER_VALUE_AVG:
- {
- if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_AVG) &&
- (row_info->pixel_depth >= png_ptr->mmx_bitdepth_threshold) &&
- (row_info->rowbytes >= png_ptr->mmx_rowbytes_threshold))
- {
- png_read_filter_row_mmx_avg(row_info, row, prev_row);
- }
- else
- {
- png_uint_32 i;
- png_bytep rp = row;
- png_bytep pp = prev_row;
- png_bytep lp = row;
- png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3;
- png_uint_32 istop = row_info->rowbytes - bpp;
-
- for (i = 0; i < bpp; i++)
- {
- *rp = (png_byte)(((int)(*rp) +
- ((int)(*pp++) >> 1)) & 0xff);
- rp++;
- }
-
- for (i = 0; i < istop; i++)
- {
- *rp = (png_byte)(((int)(*rp) +
- ((int)(*pp++ + *lp++) >> 1)) & 0xff);
- rp++;
- }
- }
- break;
- }
-
- case PNG_FILTER_VALUE_PAETH:
- {
- if ((png_ptr->asm_flags & PNG_ASM_FLAG_MMX_READ_FILTER_PAETH) &&
- (row_info->pixel_depth >= png_ptr->mmx_bitdepth_threshold) &&
- (row_info->rowbytes >= png_ptr->mmx_rowbytes_threshold))
- {
- png_read_filter_row_mmx_paeth(row_info, row, prev_row);
- }
- else
- {
- png_uint_32 i;
- png_bytep rp = row;
- png_bytep pp = prev_row;
- png_bytep lp = row;
- png_bytep cp = prev_row;
- png_uint_32 bpp = (row_info->pixel_depth + 7) >> 3;
- png_uint_32 istop=row_info->rowbytes - bpp;
-
- for (i = 0; i < bpp; i++)
- {
- *rp = (png_byte)(((int)(*rp) + (int)(*pp++)) & 0xff);
- rp++;
- }
-
- for (i = 0; i < istop; i++) // use leftover rp,pp
- {
- int a, b, c, pa, pb, pc, p;
-
- a = *lp++;
- b = *pp++;
- c = *cp++;
-
- p = b - c;
- pc = a - c;
-
-#ifdef PNG_USE_ABS
- pa = abs(p);
- pb = abs(pc);
- pc = abs(p + pc);
-#else
- pa = p < 0 ? -p : p;
- pb = pc < 0 ? -pc : pc;
- pc = (p + pc) < 0 ? -(p + pc) : p + pc;
-#endif
-
- /*
- if (pa <= pb && pa <= pc)
- p = a;
- else if (pb <= pc)
- p = b;
- else
- p = c;
- */
-
- p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c;
-
- *rp = (png_byte)(((int)(*rp) + p) & 0xff);
- rp++;
- }
- }
- break;
- }
-
- default:
- png_warning(png_ptr, "Ignoring bad row filter type");
- *row=0;
- break;
- }
-}
-
-#endif /* PNG_ASSEMBLER_CODE_SUPPORTED && PNG_USE_PNGVCRD */
diff --git a/libpng/pngwio.c b/libpng/pngwio.c
deleted file mode 100644
index 01ebbcf..0000000
--- a/libpng/pngwio.c
+++ /dev/null
@@ -1,228 +0,0 @@
-
-/* pngwio.c - functions for data output
- *
- * libpng 1.2.1 - December 12, 2001
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2001 Glenn Randers-Pehrson
- * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
- * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
- *
- * This file provides a location for all output. Users who need
- * special handling are expected to write functions that have the same
- * arguments as these and perform similar functions, but that possibly
- * use different output methods. Note that you shouldn't change these
- * functions, but rather write replacement functions and then change
- * them at run time with png_set_write_fn(...).
- */
-
-#define PNG_INTERNAL
-#include "png.h"
-#ifdef PNG_WRITE_SUPPORTED
-
-/* Write the data to whatever output you are using. The default routine
- writes to a file pointer. Note that this routine sometimes gets called
- with very small lengths, so you should implement some kind of simple
- buffering if you are using unbuffered writes. This should never be asked
- to write more than 64K on a 16 bit machine. */
-
-void /* PRIVATE */
-png_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
-{
- if (png_ptr->write_data_fn != NULL )
- (*(png_ptr->write_data_fn))(png_ptr, data, length);
- else
- png_error(png_ptr, "Call to NULL write function");
-}
-
-#if !defined(PNG_NO_STDIO)
-/* This is the function that does the actual writing of data. If you are
- not writing to a standard C stream, you should create a replacement
- write_data function and use it at run time with png_set_write_fn(), rather
- than changing the library. */
-#ifndef USE_FAR_KEYWORD
-static void /* PRIVATE */
-png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
-{
- png_uint_32 check;
-
-#if defined(_WIN32_WCE)
- if ( !WriteFile((HANDLE)(png_ptr->io_ptr), data, length, &check, NULL) )
- check = 0;
-#else
- check = fwrite(data, 1, length, (png_FILE_p)(png_ptr->io_ptr));
-#endif
- if (check != length)
- png_error(png_ptr, "Write Error");
-}
-#else
-/* this is the model-independent version. Since the standard I/O library
- can't handle far buffers in the medium and small models, we have to copy
- the data.
-*/
-
-#define NEAR_BUF_SIZE 1024
-#define MIN(a,b) (a <= b ? a : b)
-
-static void /* PRIVATE */
-png_default_write_data(png_structp png_ptr, png_bytep data, png_size_t length)
-{
- png_uint_32 check;
- png_byte *near_data; /* Needs to be "png_byte *" instead of "png_bytep" */
- png_FILE_p io_ptr;
-
- /* Check if data really is near. If so, use usual code. */
- near_data = (png_byte *)CVT_PTR_NOCHECK(data);
- io_ptr = (png_FILE_p)CVT_PTR(png_ptr->io_ptr);
- if ((png_bytep)near_data == data)
- {
-#if defined(_WIN32_WCE)
- if ( !WriteFile(io_ptr, near_data, length, &check, NULL) )
- check = 0;
-#else
- check = fwrite(near_data, 1, length, io_ptr);
-#endif
- }
- else
- {
- png_byte buf[NEAR_BUF_SIZE];
- png_size_t written, remaining, err;
- check = 0;
- remaining = length;
- do
- {
- written = MIN(NEAR_BUF_SIZE, remaining);
- png_memcpy(buf, data, written); /* copy far buffer to near buffer */
-#if defined(_WIN32_WCE)
- if ( !WriteFile(io_ptr, buf, written, &err, NULL) )
- err = 0;
-#else
- err = fwrite(buf, 1, written, io_ptr);
-#endif
- if (err != written)
- break;
- else
- check += err;
- data += written;
- remaining -= written;
- }
- while (remaining != 0);
- }
- if (check != length)
- png_error(png_ptr, "Write Error");
-}
-
-#endif
-#endif
-
-/* This function is called to output any data pending writing (normally
- to disk). After png_flush is called, there should be no data pending
- writing in any buffers. */
-#if defined(PNG_WRITE_FLUSH_SUPPORTED)
-void /* PRIVATE */
-png_flush(png_structp png_ptr)
-{
- if (png_ptr->output_flush_fn != NULL)
- (*(png_ptr->output_flush_fn))(png_ptr);
-}
-
-#if !defined(PNG_NO_STDIO)
-static void /* PRIVATE */
-png_default_flush(png_structp png_ptr)
-{
-#if !defined(_WIN32_WCE)
- png_FILE_p io_ptr;
- io_ptr = (png_FILE_p)CVT_PTR((png_ptr->io_ptr));
- if (io_ptr != NULL)
- fflush(io_ptr);
-#endif
-}
-#endif
-#endif
-
-/* This function allows the application to supply new output functions for
- libpng if standard C streams aren't being used.
-
- This function takes as its arguments:
- png_ptr - pointer to a png output data structure
- io_ptr - pointer to user supplied structure containing info about
- the output functions. May be NULL.
- write_data_fn - pointer to a new output function that takes as its
- arguments a pointer to a png_struct, a pointer to
- data to be written, and a 32-bit unsigned int that is
- the number of bytes to be written. The new write
- function should call png_error(png_ptr, "Error msg")
- to exit and output any fatal error messages.
- flush_data_fn - pointer to a new flush function that takes as its
- arguments a pointer to a png_struct. After a call to
- the flush function, there should be no data in any buffers
- or pending transmission. If the output method doesn't do
- any buffering of ouput, a function prototype must still be
- supplied although it doesn't have to do anything. If
- PNG_WRITE_FLUSH_SUPPORTED is not defined at libpng compile
- time, output_flush_fn will be ignored, although it must be
- supplied for compatibility. */
-void PNGAPI
-png_set_write_fn(png_structp png_ptr, png_voidp io_ptr,
- png_rw_ptr write_data_fn, png_flush_ptr output_flush_fn)
-{
- png_ptr->io_ptr = io_ptr;
-
-#if !defined(PNG_NO_STDIO)
- if (write_data_fn != NULL)
- png_ptr->write_data_fn = write_data_fn;
- else
- png_ptr->write_data_fn = png_default_write_data;
-#else
- png_ptr->write_data_fn = write_data_fn;
-#endif
-
-#if defined(PNG_WRITE_FLUSH_SUPPORTED)
-#if !defined(PNG_NO_STDIO)
- if (output_flush_fn != NULL)
- png_ptr->output_flush_fn = output_flush_fn;
- else
- png_ptr->output_flush_fn = png_default_flush;
-#else
- png_ptr->output_flush_fn = output_flush_fn;
-#endif
-#endif /* PNG_WRITE_FLUSH_SUPPORTED */
-
- /* It is an error to read while writing a png file */
- if (png_ptr->read_data_fn != NULL)
- {
- png_ptr->read_data_fn = NULL;
- png_warning(png_ptr,
- "Attempted to set both read_data_fn and write_data_fn in");
- png_warning(png_ptr,
- "the same structure. Resetting read_data_fn to NULL.");
- }
-}
-
-#if defined(USE_FAR_KEYWORD)
-#if defined(_MSC_VER)
-void *png_far_to_near(png_structp png_ptr,png_voidp ptr, int check)
-{
- void *near_ptr;
- void FAR *far_ptr;
- FP_OFF(near_ptr) = FP_OFF(ptr);
- far_ptr = (void FAR *)near_ptr;
- if(check != 0)
- if(FP_SEG(ptr) != FP_SEG(far_ptr))
- png_error(png_ptr,"segment lost in conversion");
- return(near_ptr);
-}
-# else
-void *png_far_to_near(png_structp png_ptr,png_voidp ptr, int check)
-{
- void *near_ptr;
- void FAR *far_ptr;
- near_ptr = (void FAR *)ptr;
- far_ptr = (void FAR *)near_ptr;
- if(check != 0)
- if(far_ptr != ptr)
- png_error(png_ptr,"segment lost in conversion");
- return(near_ptr);
-}
-# endif
-# endif
-#endif /* PNG_WRITE_SUPPORTED */
diff --git a/libpng/pngwrite.c b/libpng/pngwrite.c
deleted file mode 100644
index f46ce0f..0000000
--- a/libpng/pngwrite.c
+++ /dev/null
@@ -1,1432 +0,0 @@
-
-/* pngwrite.c - general routines to write a PNG file
- *
- * libpng 1.2.1 - December 12, 2001
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2001 Glenn Randers-Pehrson
- * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
- * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
- */
-
-/* get internal access to png.h */
-#define PNG_INTERNAL
-#include "png.h"
-#ifdef PNG_WRITE_SUPPORTED
-
-/* Writes all the PNG information. This is the suggested way to use the
- * library. If you have a new chunk to add, make a function to write it,
- * and put it in the correct location here. If you want the chunk written
- * after the image data, put it in png_write_end(). I strongly encourage
- * you to supply a PNG_INFO_ flag, and check info_ptr->valid before writing
- * the chunk, as that will keep the code from breaking if you want to just
- * write a plain PNG file. If you have long comments, I suggest writing
- * them in png_write_end(), and compressing them.
- */
-void PNGAPI
-png_write_info_before_PLTE(png_structp png_ptr, png_infop info_ptr)
-{
- png_debug(1, "in png_write_info_before_PLTE\n");
- if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE))
- {
- png_write_sig(png_ptr); /* write PNG signature */
-#if defined(PNG_MNG_FEATURES_SUPPORTED)
- if((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE)&&(png_ptr->mng_features_permitted))
- {
- png_warning(png_ptr,"MNG features are not allowed in a PNG datastream\n");
- png_ptr->mng_features_permitted=0;
- }
-#endif
- /* write IHDR information. */
- png_write_IHDR(png_ptr, info_ptr->width, info_ptr->height,
- info_ptr->bit_depth, info_ptr->color_type, info_ptr->compression_type,
- info_ptr->filter_type,
-#if defined(PNG_WRITE_INTERLACING_SUPPORTED)
- info_ptr->interlace_type);
-#else
- 0);
-#endif
- /* the rest of these check to see if the valid field has the appropriate
- flag set, and if it does, writes the chunk. */
-#if defined(PNG_WRITE_gAMA_SUPPORTED)
- if (info_ptr->valid & PNG_INFO_gAMA)
- {
-# ifdef PNG_FLOATING_POINT_SUPPORTED
- png_write_gAMA(png_ptr, info_ptr->gamma);
-#else
-#ifdef PNG_FIXED_POINT_SUPPORTED
- png_write_gAMA_fixed(png_ptr, info_ptr->int_gamma);
-# endif
-#endif
- }
-#endif
-#if defined(PNG_WRITE_sRGB_SUPPORTED)
- if (info_ptr->valid & PNG_INFO_sRGB)
- png_write_sRGB(png_ptr, (int)info_ptr->srgb_intent);
-#endif
-#if defined(PNG_WRITE_iCCP_SUPPORTED)
- if (info_ptr->valid & PNG_INFO_iCCP)
- png_write_iCCP(png_ptr, info_ptr->iccp_name, PNG_COMPRESSION_TYPE_BASE,
- info_ptr->iccp_profile, (int)info_ptr->iccp_proflen);
-#endif
-#if defined(PNG_WRITE_sBIT_SUPPORTED)
- if (info_ptr->valid & PNG_INFO_sBIT)
- png_write_sBIT(png_ptr, &(info_ptr->sig_bit), info_ptr->color_type);
-#endif
-#if defined(PNG_WRITE_cHRM_SUPPORTED)
- if (info_ptr->valid & PNG_INFO_cHRM)
- {
-#ifdef PNG_FLOATING_POINT_SUPPORTED
- png_write_cHRM(png_ptr,
- info_ptr->x_white, info_ptr->y_white,
- info_ptr->x_red, info_ptr->y_red,
- info_ptr->x_green, info_ptr->y_green,
- info_ptr->x_blue, info_ptr->y_blue);
-#else
-# ifdef PNG_FIXED_POINT_SUPPORTED
- png_write_cHRM_fixed(png_ptr,
- info_ptr->int_x_white, info_ptr->int_y_white,
- info_ptr->int_x_red, info_ptr->int_y_red,
- info_ptr->int_x_green, info_ptr->int_y_green,
- info_ptr->int_x_blue, info_ptr->int_y_blue);
-# endif
-#endif
- }
-#endif
-#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED)
- if (info_ptr->unknown_chunks_num)
- {
- png_unknown_chunk *up;
-
- png_debug(5, "writing extra chunks\n");
-
- for (up = info_ptr->unknown_chunks;
- up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num;
- up++)
- {
- int keep=png_handle_as_unknown(png_ptr, up->name);
- if (keep != HANDLE_CHUNK_NEVER &&
- up->location && (!(up->location & PNG_HAVE_PLTE)) &&
- ((up->name[3] & 0x20) || keep == HANDLE_CHUNK_ALWAYS ||
- (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS)))
- {
- png_write_chunk(png_ptr, up->name, up->data, up->size);
- }
- }
- }
-#endif
- png_ptr->mode |= PNG_WROTE_INFO_BEFORE_PLTE;
- }
-}
-
-void PNGAPI
-png_write_info(png_structp png_ptr, png_infop info_ptr)
-{
-#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED)
- int i;
-#endif
-
- png_debug(1, "in png_write_info\n");
-
- png_write_info_before_PLTE(png_ptr, info_ptr);
-
- if (info_ptr->valid & PNG_INFO_PLTE)
- png_write_PLTE(png_ptr, info_ptr->palette,
- (png_uint_32)info_ptr->num_palette);
- else if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
- png_error(png_ptr, "Valid palette required for paletted images\n");
-
-#if defined(PNG_WRITE_tRNS_SUPPORTED)
- if (info_ptr->valid & PNG_INFO_tRNS)
- {
-#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
- /* invert the alpha channel (in tRNS) */
- if ((png_ptr->transformations & PNG_INVERT_ALPHA) &&
- info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
- {
- int j;
- for (j=0; j<(int)info_ptr->num_trans; j++)
- info_ptr->trans[j] = (png_byte)(255 - info_ptr->trans[j]);
- }
-#endif
- png_write_tRNS(png_ptr, info_ptr->trans, &(info_ptr->trans_values),
- info_ptr->num_trans, info_ptr->color_type);
- }
-#endif
-#if defined(PNG_WRITE_bKGD_SUPPORTED)
- if (info_ptr->valid & PNG_INFO_bKGD)
- png_write_bKGD(png_ptr, &(info_ptr->background), info_ptr->color_type);
-#endif
-#if defined(PNG_WRITE_hIST_SUPPORTED)
- if (info_ptr->valid & PNG_INFO_hIST)
- png_write_hIST(png_ptr, info_ptr->hist, info_ptr->num_palette);
-#endif
-#if defined(PNG_WRITE_oFFs_SUPPORTED)
- if (info_ptr->valid & PNG_INFO_oFFs)
- png_write_oFFs(png_ptr, info_ptr->x_offset, info_ptr->y_offset,
- info_ptr->offset_unit_type);
-#endif
-#if defined(PNG_WRITE_pCAL_SUPPORTED)
- if (info_ptr->valid & PNG_INFO_pCAL)
- png_write_pCAL(png_ptr, info_ptr->pcal_purpose, info_ptr->pcal_X0,
- info_ptr->pcal_X1, info_ptr->pcal_type, info_ptr->pcal_nparams,
- info_ptr->pcal_units, info_ptr->pcal_params);
-#endif
-#if defined(PNG_WRITE_sCAL_SUPPORTED)
- if (info_ptr->valid & PNG_INFO_sCAL)
-#if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO)
- png_write_sCAL(png_ptr, (int)info_ptr->scal_unit,
- info_ptr->scal_pixel_width, info_ptr->scal_pixel_height);
-#else
-#ifdef PNG_FIXED_POINT_SUPPORTED
- png_write_sCAL_s(png_ptr, (int)info_ptr->scal_unit,
- info_ptr->scal_s_width, info_ptr->scal_s_height);
-#else
- png_warning(png_ptr,
- "png_write_sCAL not supported; sCAL chunk not written.\n");
-#endif
-#endif
-#endif
-#if defined(PNG_WRITE_pHYs_SUPPORTED)
- if (info_ptr->valid & PNG_INFO_pHYs)
- png_write_pHYs(png_ptr, info_ptr->x_pixels_per_unit,
- info_ptr->y_pixels_per_unit, info_ptr->phys_unit_type);
-#endif
-#if defined(PNG_WRITE_tIME_SUPPORTED)
- if (info_ptr->valid & PNG_INFO_tIME)
- {
- png_write_tIME(png_ptr, &(info_ptr->mod_time));
- png_ptr->mode |= PNG_WROTE_tIME;
- }
-#endif
-#if defined(PNG_WRITE_sPLT_SUPPORTED)
- if (info_ptr->valid & PNG_INFO_sPLT)
- for (i = 0; i < (int)info_ptr->splt_palettes_num; i++)
- png_write_sPLT(png_ptr, info_ptr->splt_palettes + i);
-#endif
-#if defined(PNG_WRITE_TEXT_SUPPORTED)
- /* Check to see if we need to write text chunks */
- for (i = 0; i < info_ptr->num_text; i++)
- {
- png_debug2(2, "Writing header text chunk %d, type %d\n", i,
- info_ptr->text[i].compression);
- /* an internationalized chunk? */
- if (info_ptr->text[i].compression > 0)
- {
-#if defined(PNG_WRITE_iTXt_SUPPORTED)
- /* write international chunk */
- png_write_iTXt(png_ptr,
- info_ptr->text[i].compression,
- info_ptr->text[i].key,
- info_ptr->text[i].lang,
- info_ptr->text[i].lang_key,
- info_ptr->text[i].text);
-#else
- png_warning(png_ptr, "Unable to write international text\n");
-#endif
- /* Mark this chunk as written */
- info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;
- }
- /* If we want a compressed text chunk */
- else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_zTXt)
- {
-#if defined(PNG_WRITE_zTXt_SUPPORTED)
- /* write compressed chunk */
- png_write_zTXt(png_ptr, info_ptr->text[i].key,
- info_ptr->text[i].text, 0,
- info_ptr->text[i].compression);
-#else
- png_warning(png_ptr, "Unable to write compressed text\n");
-#endif
- /* Mark this chunk as written */
- info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR;
- }
- else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE)
- {
-#if defined(PNG_WRITE_tEXt_SUPPORTED)
- /* write uncompressed chunk */
- png_write_tEXt(png_ptr, info_ptr->text[i].key,
- info_ptr->text[i].text,
- 0);
-#else
- png_warning(png_ptr, "Unable to write uncompressed text\n");
-#endif
- /* Mark this chunk as written */
- info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;
- }
- }
-#endif
-#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED)
- if (info_ptr->unknown_chunks_num)
- {
- png_unknown_chunk *up;
-
- png_debug(5, "writing extra chunks\n");
-
- for (up = info_ptr->unknown_chunks;
- up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num;
- up++)
- {
- int keep=png_handle_as_unknown(png_ptr, up->name);
- if (keep != HANDLE_CHUNK_NEVER &&
- up->location && (up->location & PNG_HAVE_PLTE) &&
- !(up->location & PNG_HAVE_IDAT) &&
- ((up->name[3] & 0x20) || keep == HANDLE_CHUNK_ALWAYS ||
- (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS)))
- {
- png_write_chunk(png_ptr, up->name, up->data, up->size);
- }
- }
- }
-#endif
-}
-
-/* Writes the end of the PNG file. If you don't want to write comments or
- * time information, you can pass NULL for info. If you already wrote these
- * in png_write_info(), do not write them again here. If you have long
- * comments, I suggest writing them here, and compressing them.
- */
-void PNGAPI
-png_write_end(png_structp png_ptr, png_infop info_ptr)
-{
- png_debug(1, "in png_write_end\n");
- if (!(png_ptr->mode & PNG_HAVE_IDAT))
- png_error(png_ptr, "No IDATs written into file");
-
- /* see if user wants us to write information chunks */
- if (info_ptr != NULL)
- {
-#if defined(PNG_WRITE_TEXT_SUPPORTED)
- int i; /* local index variable */
-#endif
-#if defined(PNG_WRITE_tIME_SUPPORTED)
- /* check to see if user has supplied a time chunk */
- if ((info_ptr->valid & PNG_INFO_tIME) &&
- !(png_ptr->mode & PNG_WROTE_tIME))
- png_write_tIME(png_ptr, &(info_ptr->mod_time));
-#endif
-#if defined(PNG_WRITE_TEXT_SUPPORTED)
- /* loop through comment chunks */
- for (i = 0; i < info_ptr->num_text; i++)
- {
- png_debug2(2, "Writing trailer text chunk %d, type %d\n", i,
- info_ptr->text[i].compression);
- /* an internationalized chunk? */
- if (info_ptr->text[i].compression > 0)
- {
-#if defined(PNG_WRITE_iTXt_SUPPORTED)
- /* write international chunk */
- png_write_iTXt(png_ptr,
- info_ptr->text[i].compression,
- info_ptr->text[i].key,
- info_ptr->text[i].lang,
- info_ptr->text[i].lang_key,
- info_ptr->text[i].text);
-#else
- png_warning(png_ptr, "Unable to write international text\n");
-#endif
- /* Mark this chunk as written */
- info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;
- }
- else if (info_ptr->text[i].compression >= PNG_TEXT_COMPRESSION_zTXt)
- {
-#if defined(PNG_WRITE_zTXt_SUPPORTED)
- /* write compressed chunk */
- png_write_zTXt(png_ptr, info_ptr->text[i].key,
- info_ptr->text[i].text, 0,
- info_ptr->text[i].compression);
-#else
- png_warning(png_ptr, "Unable to write compressed text\n");
-#endif
- /* Mark this chunk as written */
- info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_zTXt_WR;
- }
- else if (info_ptr->text[i].compression == PNG_TEXT_COMPRESSION_NONE)
- {
-#if defined(PNG_WRITE_tEXt_SUPPORTED)
- /* write uncompressed chunk */
- png_write_tEXt(png_ptr, info_ptr->text[i].key,
- info_ptr->text[i].text, 0);
-#else
- png_warning(png_ptr, "Unable to write uncompressed text\n");
-#endif
-
- /* Mark this chunk as written */
- info_ptr->text[i].compression = PNG_TEXT_COMPRESSION_NONE_WR;
- }
- }
-#endif
-#if defined(PNG_WRITE_UNKNOWN_CHUNKS_SUPPORTED)
- if (info_ptr->unknown_chunks_num)
- {
- png_unknown_chunk *up;
-
- png_debug(5, "writing extra chunks\n");
-
- for (up = info_ptr->unknown_chunks;
- up < info_ptr->unknown_chunks + info_ptr->unknown_chunks_num;
- up++)
- {
- int keep=png_handle_as_unknown(png_ptr, up->name);
- if (keep != HANDLE_CHUNK_NEVER &&
- up->location && (up->location & PNG_AFTER_IDAT) &&
- ((up->name[3] & 0x20) || keep == HANDLE_CHUNK_ALWAYS ||
- (png_ptr->flags & PNG_FLAG_KEEP_UNSAFE_CHUNKS)))
- {
- png_write_chunk(png_ptr, up->name, up->data, up->size);
- }
- }
- }
-#endif
- }
-
- png_ptr->mode |= PNG_AFTER_IDAT;
-
- /* write end of PNG file */
- png_write_IEND(png_ptr);
-#if 0
-/* This flush, added in libpng-1.0.8, causes some applications to crash
- because they do not set png_ptr->output_flush_fn */
- png_flush(png_ptr);
-#endif
-}
-
-#if defined(PNG_WRITE_tIME_SUPPORTED)
-#if !defined(_WIN32_WCE)
-/* "time.h" functions are not supported on WindowsCE */
-void PNGAPI
-png_convert_from_struct_tm(png_timep ptime, struct tm FAR * ttime)
-{
- png_debug(1, "in png_convert_from_struct_tm\n");
- ptime->year = (png_uint_16)(1900 + ttime->tm_year);
- ptime->month = (png_byte)(ttime->tm_mon + 1);
- ptime->day = (png_byte)ttime->tm_mday;
- ptime->hour = (png_byte)ttime->tm_hour;
- ptime->minute = (png_byte)ttime->tm_min;
- ptime->second = (png_byte)ttime->tm_sec;
-}
-
-void PNGAPI
-png_convert_from_time_t(png_timep ptime, time_t ttime)
-{
- struct tm *tbuf;
-
- png_debug(1, "in png_convert_from_time_t\n");
- tbuf = gmtime(&ttime);
- png_convert_from_struct_tm(ptime, tbuf);
-}
-#endif
-#endif
-
-/* Initialize png_ptr structure, and allocate any memory needed */
-png_structp PNGAPI
-png_create_write_struct(png_const_charp user_png_ver, png_voidp error_ptr,
- png_error_ptr error_fn, png_error_ptr warn_fn)
-{
-#ifdef PNG_USER_MEM_SUPPORTED
- return (png_create_write_struct_2(user_png_ver, error_ptr, error_fn,
- warn_fn, png_voidp_NULL, png_malloc_ptr_NULL, png_free_ptr_NULL));
-}
-
-/* Alternate initialize png_ptr structure, and allocate any memory needed */
-png_structp PNGAPI
-png_create_write_struct_2(png_const_charp user_png_ver, png_voidp error_ptr,
- png_error_ptr error_fn, png_error_ptr warn_fn, png_voidp mem_ptr,
- png_malloc_ptr malloc_fn, png_free_ptr free_fn)
-{
-#endif /* PNG_USER_MEM_SUPPORTED */
- png_structp png_ptr;
-#ifdef PNG_SETJMP_SUPPORTED
-#ifdef USE_FAR_KEYWORD
- jmp_buf jmpbuf;
-#endif
-#endif
- int i;
- png_debug(1, "in png_create_write_struct\n");
-#ifdef PNG_USER_MEM_SUPPORTED
- if ((png_ptr = (png_structp)png_create_struct_2(PNG_STRUCT_PNG,
- (png_malloc_ptr)malloc_fn, (png_voidp)mem_ptr)) == NULL)
-#else
- if ((png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG)) == NULL)
-#endif /* PNG_USER_MEM_SUPPORTED */
- return (NULL);
-
-#ifdef PNG_ASSEMBLER_CODE_SUPPORTED
- png_init_mmx_flags(png_ptr); /* 1.2.0 addition */
-#endif
-
-#ifdef PNG_SETJMP_SUPPORTED
-#ifdef USE_FAR_KEYWORD
- if (setjmp(jmpbuf))
-#else
- if (setjmp(png_ptr->jmpbuf))
-#endif
- {
- png_free(png_ptr, png_ptr->zbuf);
- png_ptr->zbuf=NULL;
- png_destroy_struct(png_ptr);
- return (NULL);
- }
-#ifdef USE_FAR_KEYWORD
- png_memcpy(png_ptr->jmpbuf,jmpbuf,sizeof(jmp_buf));
-#endif
-#endif
-
-#ifdef PNG_USER_MEM_SUPPORTED
- png_set_mem_fn(png_ptr, mem_ptr, malloc_fn, free_fn);
-#endif /* PNG_USER_MEM_SUPPORTED */
- png_set_error_fn(png_ptr, error_ptr, error_fn, warn_fn);
-
- i=0;
- do
- {
- if(user_png_ver[i] != png_libpng_ver[i])
- png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
- } while (png_libpng_ver[i++]);
-
- if (png_ptr->flags & PNG_FLAG_LIBRARY_MISMATCH)
- {
- /* Libpng 0.90 and later are binary incompatible with libpng 0.89, so
- * we must recompile any applications that use any older library version.
- * For versions after libpng 1.0, we will be compatible, so we need
- * only check the first digit.
- */
- if (user_png_ver == NULL || user_png_ver[0] != png_libpng_ver[0] ||
- (user_png_ver[0] == '1' && user_png_ver[2] != png_libpng_ver[2]) ||
- (user_png_ver[0] == '0' && user_png_ver[2] < '9'))
- {
-#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE)
- char msg[80];
- if (user_png_ver)
- {
- sprintf(msg, "Application was compiled with png.h from libpng-%.20s",
- user_png_ver);
- png_warning(png_ptr, msg);
- }
- sprintf(msg, "Application is running with png.c from libpng-%.20s",
- png_libpng_ver);
- png_warning(png_ptr, msg);
-#endif
-#ifdef PNG_ERROR_NUMBERS_SUPPORTED
- png_ptr->flags=0;
-#endif
- png_error(png_ptr,
- "Incompatible libpng version in application and library");
- }
- }
-
- /* initialize zbuf - compression buffer */
- png_ptr->zbuf_size = PNG_ZBUF_SIZE;
- png_ptr->zbuf = (png_bytep)png_malloc(png_ptr,
- (png_uint_32)png_ptr->zbuf_size);
-
- png_set_write_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL,
- png_flush_ptr_NULL);
-
-#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
- png_set_filter_heuristics(png_ptr, PNG_FILTER_HEURISTIC_DEFAULT,
- 1, png_doublep_NULL, png_doublep_NULL);
-#endif
-
- return ((png_structp)png_ptr);
-}
-
-/* Initialize png_ptr structure, and allocate any memory needed */
-#undef png_write_init
-void PNGAPI
-png_write_init(png_structp png_ptr)
-{
- /* We only come here via pre-1.0.7-compiled applications */
- png_write_init_2(png_ptr, "1.0.6 or earlier", 0, 0);
-}
-
-#undef png_write_init_2
-void PNGAPI
-png_write_init_2(png_structp png_ptr, png_const_charp user_png_ver,
- png_size_t png_struct_size, png_size_t png_info_size)
-{
- /* We only come here via pre-1.0.12-compiled applications */
-#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE)
- if(sizeof(png_struct) > png_struct_size || sizeof(png_info) > png_info_size)
- {
- char msg[80];
- png_ptr->warning_fn=NULL;
- if (user_png_ver)
- {
- sprintf(msg, "Application was compiled with png.h from libpng-%.20s",
- user_png_ver);
- png_warning(png_ptr, msg);
- }
- sprintf(msg, "Application is running with png.c from libpng-%.20s",
- png_libpng_ver);
- png_warning(png_ptr, msg);
- }
-#endif
- if(sizeof(png_struct) > png_struct_size)
- {
- png_ptr->error_fn=NULL;
-#ifdef PNG_ERROR_NUMBERS_SUPPORTED
- png_ptr->flags=0;
-#endif
- png_error(png_ptr,
- "The png struct allocated by the application for writing is too small.");
- }
- if(sizeof(png_info) > png_info_size)
- {
- png_ptr->error_fn=NULL;
-#ifdef PNG_ERROR_NUMBERS_SUPPORTED
- png_ptr->flags=0;
-#endif
- png_error(png_ptr,
- "The info struct allocated by the application for writing is too small.");
- }
- png_write_init_3(&png_ptr, user_png_ver, png_struct_size);
-}
-
-
-void PNGAPI
-png_write_init_3(png_structpp ptr_ptr, png_const_charp user_png_ver,
- png_size_t png_struct_size)
-{
- png_structp png_ptr=*ptr_ptr;
-#ifdef PNG_SETJMP_SUPPORTED
- jmp_buf tmp_jmp; /* to save current jump buffer */
-#endif
- int i = 0;
- do
- {
- if (user_png_ver[i] != png_libpng_ver[i])
- {
-#ifdef PNG_LEGACY_SUPPORTED
- png_ptr->flags |= PNG_FLAG_LIBRARY_MISMATCH;
-#else
- png_ptr->warning_fn=NULL;
- png_warning(png_ptr,
- "Application uses deprecated png_write_init() and should be recompiled.");
- break;
-#endif
- }
- } while (png_libpng_ver[i++]);
-
- png_debug(1, "in png_write_init_3\n");
-
-#ifdef PNG_SETJMP_SUPPORTED
- /* save jump buffer and error functions */
- png_memcpy(tmp_jmp, png_ptr->jmpbuf, sizeof (jmp_buf));
-#endif
-
- if (sizeof(png_struct) > png_struct_size)
- {
- png_destroy_struct(png_ptr);
- png_ptr = (png_structp)png_create_struct(PNG_STRUCT_PNG);
- *ptr_ptr = png_ptr;
- }
-
- /* reset all variables to 0 */
- png_memset(png_ptr, 0, sizeof (png_struct));
-
-#ifdef PNG_ASSEMBLER_CODE_SUPPORTED
- png_init_mmx_flags(png_ptr); /* 1.2.0 addition */
-#endif
-
-#ifdef PNG_SETJMP_SUPPORTED
- /* restore jump buffer */
- png_memcpy(png_ptr->jmpbuf, tmp_jmp, sizeof (jmp_buf));
-#endif
-
- png_set_write_fn(png_ptr, png_voidp_NULL, png_rw_ptr_NULL,
- png_flush_ptr_NULL);
-
- /* initialize zbuf - compression buffer */
- png_ptr->zbuf_size = PNG_ZBUF_SIZE;
- png_ptr->zbuf = (png_bytep)png_malloc(png_ptr,
- (png_uint_32)png_ptr->zbuf_size);
-
-#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
- png_set_filter_heuristics(png_ptr, PNG_FILTER_HEURISTIC_DEFAULT,
- 1, png_doublep_NULL, png_doublep_NULL);
-#endif
-}
-
-/* Write a few rows of image data. If the image is interlaced,
- * either you will have to write the 7 sub images, or, if you
- * have called png_set_interlace_handling(), you will have to
- * "write" the image seven times.
- */
-void PNGAPI
-png_write_rows(png_structp png_ptr, png_bytepp row,
- png_uint_32 num_rows)
-{
- png_uint_32 i; /* row counter */
- png_bytepp rp; /* row pointer */
-
- png_debug(1, "in png_write_rows\n");
- /* loop through the rows */
- for (i = 0, rp = row; i < num_rows; i++, rp++)
- {
- png_write_row(png_ptr, *rp);
- }
-}
-
-/* Write the image. You only need to call this function once, even
- * if you are writing an interlaced image.
- */
-void PNGAPI
-png_write_image(png_structp png_ptr, png_bytepp image)
-{
- png_uint_32 i; /* row index */
- int pass, num_pass; /* pass variables */
- png_bytepp rp; /* points to current row */
-
- png_debug(1, "in png_write_image\n");
-#if defined(PNG_WRITE_INTERLACING_SUPPORTED)
- /* intialize interlace handling. If image is not interlaced,
- this will set pass to 1 */
- num_pass = png_set_interlace_handling(png_ptr);
-#else
- num_pass = 1;
-#endif
- /* loop through passes */
- for (pass = 0; pass < num_pass; pass++)
- {
- /* loop through image */
- for (i = 0, rp = image; i < png_ptr->height; i++, rp++)
- {
- png_write_row(png_ptr, *rp);
- }
- }
-}
-
-/* called by user to write a row of image data */
-void PNGAPI
-png_write_row(png_structp png_ptr, png_bytep row)
-{
- png_debug2(1, "in png_write_row (row %ld, pass %d)\n",
- png_ptr->row_number, png_ptr->pass);
- /* initialize transformations and other stuff if first time */
- if (png_ptr->row_number == 0 && png_ptr->pass == 0)
- {
- /* make sure we wrote the header info */
- if (!(png_ptr->mode & PNG_WROTE_INFO_BEFORE_PLTE))
- png_error(png_ptr,
- "png_write_info was never called before png_write_row.");
-
- /* check for transforms that have been set but were defined out */
-#if !defined(PNG_WRITE_INVERT_SUPPORTED) && defined(PNG_READ_INVERT_SUPPORTED)
- if (png_ptr->transformations & PNG_INVERT_MONO)
- png_warning(png_ptr, "PNG_WRITE_INVERT_SUPPORTED is not defined.");
-#endif
-#if !defined(PNG_WRITE_FILLER_SUPPORTED) && defined(PNG_READ_FILLER_SUPPORTED)
- if (png_ptr->transformations & PNG_FILLER)
- png_warning(png_ptr, "PNG_WRITE_FILLER_SUPPORTED is not defined.");
-#endif
-#if !defined(PNG_WRITE_PACKSWAP_SUPPORTED) && defined(PNG_READ_PACKSWAP_SUPPORTED)
- if (png_ptr->transformations & PNG_PACKSWAP)
- png_warning(png_ptr, "PNG_WRITE_PACKSWAP_SUPPORTED is not defined.");
-#endif
-#if !defined(PNG_WRITE_PACK_SUPPORTED) && defined(PNG_READ_PACK_SUPPORTED)
- if (png_ptr->transformations & PNG_PACK)
- png_warning(png_ptr, "PNG_WRITE_PACK_SUPPORTED is not defined.");
-#endif
-#if !defined(PNG_WRITE_SHIFT_SUPPORTED) && defined(PNG_READ_SHIFT_SUPPORTED)
- if (png_ptr->transformations & PNG_SHIFT)
- png_warning(png_ptr, "PNG_WRITE_SHIFT_SUPPORTED is not defined.");
-#endif
-#if !defined(PNG_WRITE_BGR_SUPPORTED) && defined(PNG_READ_BGR_SUPPORTED)
- if (png_ptr->transformations & PNG_BGR)
- png_warning(png_ptr, "PNG_WRITE_BGR_SUPPORTED is not defined.");
-#endif
-#if !defined(PNG_WRITE_SWAP_SUPPORTED) && defined(PNG_READ_SWAP_SUPPORTED)
- if (png_ptr->transformations & PNG_SWAP_BYTES)
- png_warning(png_ptr, "PNG_WRITE_SWAP_SUPPORTED is not defined.");
-#endif
-
- png_write_start_row(png_ptr);
- }
-
-#if defined(PNG_WRITE_INTERLACING_SUPPORTED)
- /* if interlaced and not interested in row, return */
- if (png_ptr->interlaced && (png_ptr->transformations & PNG_INTERLACE))
- {
- switch (png_ptr->pass)
- {
- case 0:
- if (png_ptr->row_number & 0x07)
- {
- png_write_finish_row(png_ptr);
- return;
- }
- break;
- case 1:
- if ((png_ptr->row_number & 0x07) || png_ptr->width < 5)
- {
- png_write_finish_row(png_ptr);
- return;
- }
- break;
- case 2:
- if ((png_ptr->row_number & 0x07) != 4)
- {
- png_write_finish_row(png_ptr);
- return;
- }
- break;
- case 3:
- if ((png_ptr->row_number & 0x03) || png_ptr->width < 3)
- {
- png_write_finish_row(png_ptr);
- return;
- }
- break;
- case 4:
- if ((png_ptr->row_number & 0x03) != 2)
- {
- png_write_finish_row(png_ptr);
- return;
- }
- break;
- case 5:
- if ((png_ptr->row_number & 0x01) || png_ptr->width < 2)
- {
- png_write_finish_row(png_ptr);
- return;
- }
- break;
- case 6:
- if (!(png_ptr->row_number & 0x01))
- {
- png_write_finish_row(png_ptr);
- return;
- }
- break;
- }
- }
-#endif
-
- /* set up row info for transformations */
- png_ptr->row_info.color_type = png_ptr->color_type;
- png_ptr->row_info.width = png_ptr->usr_width;
- png_ptr->row_info.channels = png_ptr->usr_channels;
- png_ptr->row_info.bit_depth = png_ptr->usr_bit_depth;
- png_ptr->row_info.pixel_depth = (png_byte)(png_ptr->row_info.bit_depth *
- png_ptr->row_info.channels);
-
- png_ptr->row_info.rowbytes = ((png_ptr->row_info.width *
- (png_uint_32)png_ptr->row_info.pixel_depth + 7) >> 3);
-
- png_debug1(3, "row_info->color_type = %d\n", png_ptr->row_info.color_type);
- png_debug1(3, "row_info->width = %lu\n", png_ptr->row_info.width);
- png_debug1(3, "row_info->channels = %d\n", png_ptr->row_info.channels);
- png_debug1(3, "row_info->bit_depth = %d\n", png_ptr->row_info.bit_depth);
- png_debug1(3, "row_info->pixel_depth = %d\n", png_ptr->row_info.pixel_depth);
- png_debug1(3, "row_info->rowbytes = %lu\n", png_ptr->row_info.rowbytes);
-
- /* Copy user's row into buffer, leaving room for filter byte. */
- png_memcpy_check(png_ptr, png_ptr->row_buf + 1, row,
- png_ptr->row_info.rowbytes);
-
-#if defined(PNG_WRITE_INTERLACING_SUPPORTED)
- /* handle interlacing */
- if (png_ptr->interlaced && png_ptr->pass < 6 &&
- (png_ptr->transformations & PNG_INTERLACE))
- {
- png_do_write_interlace(&(png_ptr->row_info),
- png_ptr->row_buf + 1, png_ptr->pass);
- /* this should always get caught above, but still ... */
- if (!(png_ptr->row_info.width))
- {
- png_write_finish_row(png_ptr);
- return;
- }
- }
-#endif
-
- /* handle other transformations */
- if (png_ptr->transformations)
- png_do_write_transformations(png_ptr);
-
-#if defined(PNG_MNG_FEATURES_SUPPORTED)
- /* Write filter_method 64 (intrapixel differencing) only if
- * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and
- * 2. Libpng did not write a PNG signature (this filter_method is only
- * used in PNG datastreams that are embedded in MNG datastreams) and
- * 3. The application called png_permit_mng_features with a mask that
- * included PNG_FLAG_MNG_FILTER_64 and
- * 4. The filter_method is 64 and
- * 5. The color_type is RGB or RGBA
- */
- if((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
- (png_ptr->filter_type == PNG_INTRAPIXEL_DIFFERENCING))
- {
- /* Intrapixel differencing */
- png_do_write_intrapixel(&(png_ptr->row_info), png_ptr->row_buf + 1);
- }
-#endif
-
- /* Find a filter if necessary, filter the row and write it out. */
- png_write_find_filter(png_ptr, &(png_ptr->row_info));
-
- if (png_ptr->write_row_fn != NULL)
- (*(png_ptr->write_row_fn))(png_ptr, png_ptr->row_number, png_ptr->pass);
-}
-
-#if defined(PNG_WRITE_FLUSH_SUPPORTED)
-/* Set the automatic flush interval or 0 to turn flushing off */
-void PNGAPI
-png_set_flush(png_structp png_ptr, int nrows)
-{
- png_debug(1, "in png_set_flush\n");
- png_ptr->flush_dist = (nrows < 0 ? 0 : nrows);
-}
-
-/* flush the current output buffers now */
-void PNGAPI
-png_write_flush(png_structp png_ptr)
-{
- int wrote_IDAT;
-
- png_debug(1, "in png_write_flush\n");
- /* We have already written out all of the data */
- if (png_ptr->row_number >= png_ptr->num_rows)
- return;
-
- do
- {
- int ret;
-
- /* compress the data */
- ret = deflate(&png_ptr->zstream, Z_SYNC_FLUSH);
- wrote_IDAT = 0;
-
- /* check for compression errors */
- if (ret != Z_OK)
- {
- if (png_ptr->zstream.msg != NULL)
- png_error(png_ptr, png_ptr->zstream.msg);
- else
- png_error(png_ptr, "zlib error");
- }
-
- if (!(png_ptr->zstream.avail_out))
- {
- /* write the IDAT and reset the zlib output buffer */
- png_write_IDAT(png_ptr, png_ptr->zbuf,
- png_ptr->zbuf_size);
- png_ptr->zstream.next_out = png_ptr->zbuf;
- png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
- wrote_IDAT = 1;
- }
- } while(wrote_IDAT == 1);
-
- /* If there is any data left to be output, write it into a new IDAT */
- if (png_ptr->zbuf_size != png_ptr->zstream.avail_out)
- {
- /* write the IDAT and reset the zlib output buffer */
- png_write_IDAT(png_ptr, png_ptr->zbuf,
- png_ptr->zbuf_size - png_ptr->zstream.avail_out);
- png_ptr->zstream.next_out = png_ptr->zbuf;
- png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
- }
- png_ptr->flush_rows = 0;
- png_flush(png_ptr);
-}
-#endif /* PNG_WRITE_FLUSH_SUPPORTED */
-
-/* free all memory used by the write */
-void PNGAPI
-png_destroy_write_struct(png_structpp png_ptr_ptr, png_infopp info_ptr_ptr)
-{
- png_structp png_ptr = NULL;
- png_infop info_ptr = NULL;
-#ifdef PNG_USER_MEM_SUPPORTED
- png_free_ptr free_fn = NULL;
- png_voidp mem_ptr = NULL;
-#endif
-
- png_debug(1, "in png_destroy_write_struct\n");
- if (png_ptr_ptr != NULL)
- {
- png_ptr = *png_ptr_ptr;
-#ifdef PNG_USER_MEM_SUPPORTED
- free_fn = png_ptr->free_fn;
-#endif
- }
-
- if (info_ptr_ptr != NULL)
- info_ptr = *info_ptr_ptr;
-
- if (info_ptr != NULL)
- {
- png_free_data(png_ptr, info_ptr, PNG_FREE_ALL, -1);
-
-#if defined(PNG_UNKNOWN_CHUNKS_SUPPORTED)
- if (png_ptr->num_chunk_list)
- {
- png_free(png_ptr, png_ptr->chunk_list);
- png_ptr->chunk_list=NULL;
- png_ptr->num_chunk_list=0;
- }
-#endif
-
-#ifdef PNG_USER_MEM_SUPPORTED
- png_destroy_struct_2((png_voidp)info_ptr, (png_free_ptr)free_fn,
- (png_voidp)mem_ptr);
-#else
- png_destroy_struct((png_voidp)info_ptr);
-#endif
- *info_ptr_ptr = NULL;
- }
-
- if (png_ptr != NULL)
- {
- png_write_destroy(png_ptr);
-#ifdef PNG_USER_MEM_SUPPORTED
- png_destroy_struct_2((png_voidp)png_ptr, (png_free_ptr)free_fn,
- (png_voidp)mem_ptr);
-#else
- png_destroy_struct((png_voidp)png_ptr);
-#endif
- *png_ptr_ptr = NULL;
- }
-}
-
-
-/* Free any memory used in png_ptr struct (old method) */
-void /* PRIVATE */
-png_write_destroy(png_structp png_ptr)
-{
-#ifdef PNG_SETJMP_SUPPORTED
- jmp_buf tmp_jmp; /* save jump buffer */
-#endif
- png_error_ptr error_fn;
- png_error_ptr warning_fn;
- png_voidp error_ptr;
-#ifdef PNG_USER_MEM_SUPPORTED
- png_free_ptr free_fn;
-#endif
-
- png_debug(1, "in png_write_destroy\n");
- /* free any memory zlib uses */
- deflateEnd(&png_ptr->zstream);
-
- /* free our memory. png_free checks NULL for us. */
- png_free(png_ptr, png_ptr->zbuf);
- png_free(png_ptr, png_ptr->row_buf);
- png_free(png_ptr, png_ptr->prev_row);
- png_free(png_ptr, png_ptr->sub_row);
- png_free(png_ptr, png_ptr->up_row);
- png_free(png_ptr, png_ptr->avg_row);
- png_free(png_ptr, png_ptr->paeth_row);
-
-#if defined(PNG_TIME_RFC1123_SUPPORTED)
- png_free(png_ptr, png_ptr->time_buffer);
-#endif
-
-#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
- png_free(png_ptr, png_ptr->prev_filters);
- png_free(png_ptr, png_ptr->filter_weights);
- png_free(png_ptr, png_ptr->inv_filter_weights);
- png_free(png_ptr, png_ptr->filter_costs);
- png_free(png_ptr, png_ptr->inv_filter_costs);
-#endif
-
-#ifdef PNG_SETJMP_SUPPORTED
- /* reset structure */
- png_memcpy(tmp_jmp, png_ptr->jmpbuf, sizeof (jmp_buf));
-#endif
-
- error_fn = png_ptr->error_fn;
- warning_fn = png_ptr->warning_fn;
- error_ptr = png_ptr->error_ptr;
-#ifdef PNG_USER_MEM_SUPPORTED
- free_fn = png_ptr->free_fn;
-#endif
-
- png_memset(png_ptr, 0, sizeof (png_struct));
-
- png_ptr->error_fn = error_fn;
- png_ptr->warning_fn = warning_fn;
- png_ptr->error_ptr = error_ptr;
-#ifdef PNG_USER_MEM_SUPPORTED
- png_ptr->free_fn = free_fn;
-#endif
-
-#ifdef PNG_SETJMP_SUPPORTED
- png_memcpy(png_ptr->jmpbuf, tmp_jmp, sizeof (jmp_buf));
-#endif
-}
-
-/* Allow the application to select one or more row filters to use. */
-void PNGAPI
-png_set_filter(png_structp png_ptr, int method, int filters)
-{
- png_debug(1, "in png_set_filter\n");
-#if defined(PNG_MNG_FEATURES_SUPPORTED)
- if((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
- (method == PNG_INTRAPIXEL_DIFFERENCING))
- method = PNG_FILTER_TYPE_BASE;
-#endif
- if (method == PNG_FILTER_TYPE_BASE)
- {
- switch (filters & (PNG_ALL_FILTERS | 0x07))
- {
- case 5:
- case 6:
- case 7: png_warning(png_ptr, "Unknown row filter for method 0");
- case PNG_FILTER_VALUE_NONE: png_ptr->do_filter=PNG_FILTER_NONE; break;
- case PNG_FILTER_VALUE_SUB: png_ptr->do_filter=PNG_FILTER_SUB; break;
- case PNG_FILTER_VALUE_UP: png_ptr->do_filter=PNG_FILTER_UP; break;
- case PNG_FILTER_VALUE_AVG: png_ptr->do_filter=PNG_FILTER_AVG; break;
- case PNG_FILTER_VALUE_PAETH: png_ptr->do_filter=PNG_FILTER_PAETH;break;
- default: png_ptr->do_filter = (png_byte)filters; break;
- }
-
- /* If we have allocated the row_buf, this means we have already started
- * with the image and we should have allocated all of the filter buffers
- * that have been selected. If prev_row isn't already allocated, then
- * it is too late to start using the filters that need it, since we
- * will be missing the data in the previous row. If an application
- * wants to start and stop using particular filters during compression,
- * it should start out with all of the filters, and then add and
- * remove them after the start of compression.
- */
- if (png_ptr->row_buf != NULL)
- {
- if ((png_ptr->do_filter & PNG_FILTER_SUB) && png_ptr->sub_row == NULL)
- {
- png_ptr->sub_row = (png_bytep)png_malloc(png_ptr,
- (png_ptr->rowbytes + 1));
- png_ptr->sub_row[0] = PNG_FILTER_VALUE_SUB;
- }
-
- if ((png_ptr->do_filter & PNG_FILTER_UP) && png_ptr->up_row == NULL)
- {
- if (png_ptr->prev_row == NULL)
- {
- png_warning(png_ptr, "Can't add Up filter after starting");
- png_ptr->do_filter &= ~PNG_FILTER_UP;
- }
- else
- {
- png_ptr->up_row = (png_bytep)png_malloc(png_ptr,
- (png_ptr->rowbytes + 1));
- png_ptr->up_row[0] = PNG_FILTER_VALUE_UP;
- }
- }
-
- if ((png_ptr->do_filter & PNG_FILTER_AVG) && png_ptr->avg_row == NULL)
- {
- if (png_ptr->prev_row == NULL)
- {
- png_warning(png_ptr, "Can't add Average filter after starting");
- png_ptr->do_filter &= ~PNG_FILTER_AVG;
- }
- else
- {
- png_ptr->avg_row = (png_bytep)png_malloc(png_ptr,
- (png_ptr->rowbytes + 1));
- png_ptr->avg_row[0] = PNG_FILTER_VALUE_AVG;
- }
- }
-
- if ((png_ptr->do_filter & PNG_FILTER_PAETH) &&
- png_ptr->paeth_row == NULL)
- {
- if (png_ptr->prev_row == NULL)
- {
- png_warning(png_ptr, "Can't add Paeth filter after starting");
- png_ptr->do_filter &= (png_byte)(~PNG_FILTER_PAETH);
- }
- else
- {
- png_ptr->paeth_row = (png_bytep)png_malloc(png_ptr,
- (png_ptr->rowbytes + 1));
- png_ptr->paeth_row[0] = PNG_FILTER_VALUE_PAETH;
- }
- }
-
- if (png_ptr->do_filter == PNG_NO_FILTERS)
- png_ptr->do_filter = PNG_FILTER_NONE;
- }
- }
- else
- png_error(png_ptr, "Unknown custom filter method");
-}
-
-/* This allows us to influence the way in which libpng chooses the "best"
- * filter for the current scanline. While the "minimum-sum-of-absolute-
- * differences metric is relatively fast and effective, there is some
- * question as to whether it can be improved upon by trying to keep the
- * filtered data going to zlib more consistent, hopefully resulting in
- * better compression.
- */
-#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED) /* GRR 970116 */
-void PNGAPI
-png_set_filter_heuristics(png_structp png_ptr, int heuristic_method,
- int num_weights, png_doublep filter_weights,
- png_doublep filter_costs)
-{
- int i;
-
- png_debug(1, "in png_set_filter_heuristics\n");
- if (heuristic_method >= PNG_FILTER_HEURISTIC_LAST)
- {
- png_warning(png_ptr, "Unknown filter heuristic method");
- return;
- }
-
- if (heuristic_method == PNG_FILTER_HEURISTIC_DEFAULT)
- {
- heuristic_method = PNG_FILTER_HEURISTIC_UNWEIGHTED;
- }
-
- if (num_weights < 0 || filter_weights == NULL ||
- heuristic_method == PNG_FILTER_HEURISTIC_UNWEIGHTED)
- {
- num_weights = 0;
- }
-
- png_ptr->num_prev_filters = (png_byte)num_weights;
- png_ptr->heuristic_method = (png_byte)heuristic_method;
-
- if (num_weights > 0)
- {
- if (png_ptr->prev_filters == NULL)
- {
- png_ptr->prev_filters = (png_bytep)png_malloc(png_ptr,
- (png_uint_32)(sizeof(png_byte) * num_weights));
-
- /* To make sure that the weighting starts out fairly */
- for (i = 0; i < num_weights; i++)
- {
- png_ptr->prev_filters[i] = 255;
- }
- }
-
- if (png_ptr->filter_weights == NULL)
- {
- png_ptr->filter_weights = (png_uint_16p)png_malloc(png_ptr,
- (png_uint_32)(sizeof(png_uint_16) * num_weights));
-
- png_ptr->inv_filter_weights = (png_uint_16p)png_malloc(png_ptr,
- (png_uint_32)(sizeof(png_uint_16) * num_weights));
- for (i = 0; i < num_weights; i++)
- {
- png_ptr->inv_filter_weights[i] =
- png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR;
- }
- }
-
- for (i = 0; i < num_weights; i++)
- {
- if (filter_weights[i] < 0.0)
- {
- png_ptr->inv_filter_weights[i] =
- png_ptr->filter_weights[i] = PNG_WEIGHT_FACTOR;
- }
- else
- {
- png_ptr->inv_filter_weights[i] =
- (png_uint_16)((double)PNG_WEIGHT_FACTOR*filter_weights[i]+0.5);
- png_ptr->filter_weights[i] =
- (png_uint_16)((double)PNG_WEIGHT_FACTOR/filter_weights[i]+0.5);
- }
- }
- }
-
- /* If, in the future, there are other filter methods, this would
- * need to be based on png_ptr->filter.
- */
- if (png_ptr->filter_costs == NULL)
- {
- png_ptr->filter_costs = (png_uint_16p)png_malloc(png_ptr,
- (png_uint_32)(sizeof(png_uint_16) * PNG_FILTER_VALUE_LAST));
-
- png_ptr->inv_filter_costs = (png_uint_16p)png_malloc(png_ptr,
- (png_uint_32)(sizeof(png_uint_16) * PNG_FILTER_VALUE_LAST));
-
- for (i = 0; i < PNG_FILTER_VALUE_LAST; i++)
- {
- png_ptr->inv_filter_costs[i] =
- png_ptr->filter_costs[i] = PNG_COST_FACTOR;
- }
- }
-
- /* Here is where we set the relative costs of the different filters. We
- * should take the desired compression level into account when setting
- * the costs, so that Paeth, for instance, has a high relative cost at low
- * compression levels, while it has a lower relative cost at higher
- * compression settings. The filter types are in order of increasing
- * relative cost, so it would be possible to do this with an algorithm.
- */
- for (i = 0; i < PNG_FILTER_VALUE_LAST; i++)
- {
- if (filter_costs == NULL || filter_costs[i] < 0.0)
- {
- png_ptr->inv_filter_costs[i] =
- png_ptr->filter_costs[i] = PNG_COST_FACTOR;
- }
- else if (filter_costs[i] >= 1.0)
- {
- png_ptr->inv_filter_costs[i] =
- (png_uint_16)((double)PNG_COST_FACTOR / filter_costs[i] + 0.5);
- png_ptr->filter_costs[i] =
- (png_uint_16)((double)PNG_COST_FACTOR * filter_costs[i] + 0.5);
- }
- }
-}
-#endif /* PNG_WRITE_WEIGHTED_FILTER_SUPPORTED */
-
-void PNGAPI
-png_set_compression_level(png_structp png_ptr, int level)
-{
- png_debug(1, "in png_set_compression_level\n");
- png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_LEVEL;
- png_ptr->zlib_level = level;
-}
-
-void PNGAPI
-png_set_compression_mem_level(png_structp png_ptr, int mem_level)
-{
- png_debug(1, "in png_set_compression_mem_level\n");
- png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL;
- png_ptr->zlib_mem_level = mem_level;
-}
-
-void PNGAPI
-png_set_compression_strategy(png_structp png_ptr, int strategy)
-{
- png_debug(1, "in png_set_compression_strategy\n");
- png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_STRATEGY;
- png_ptr->zlib_strategy = strategy;
-}
-
-void PNGAPI
-png_set_compression_window_bits(png_structp png_ptr, int window_bits)
-{
- if (window_bits > 15)
- png_warning(png_ptr, "Only compression windows <= 32k supported by PNG");
- else if (window_bits < 8)
- png_warning(png_ptr, "Only compression windows >= 256 supported by PNG");
-#ifndef WBITS_8_OK
- /* avoid libpng bug with 256-byte windows */
- if (window_bits == 8)
- {
- png_warning(png_ptr, "Compression window is being reset to 512");
- window_bits=9;
- }
-#endif
- png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS;
- png_ptr->zlib_window_bits = window_bits;
-}
-
-void PNGAPI
-png_set_compression_method(png_structp png_ptr, int method)
-{
- png_debug(1, "in png_set_compression_method\n");
- if (method != 8)
- png_warning(png_ptr, "Only compression method 8 is supported by PNG");
- png_ptr->flags |= PNG_FLAG_ZLIB_CUSTOM_METHOD;
- png_ptr->zlib_method = method;
-}
-
-void PNGAPI
-png_set_write_status_fn(png_structp png_ptr, png_write_status_ptr write_row_fn)
-{
- png_ptr->write_row_fn = write_row_fn;
-}
-
-#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
-void PNGAPI
-png_set_write_user_transform_fn(png_structp png_ptr, png_user_transform_ptr
- write_user_transform_fn)
-{
- png_debug(1, "in png_set_write_user_transform_fn\n");
- png_ptr->transformations |= PNG_USER_TRANSFORM;
- png_ptr->write_user_transform_fn = write_user_transform_fn;
-}
-#endif
-
-
-#if defined(PNG_INFO_IMAGE_SUPPORTED)
-void PNGAPI
-png_write_png(png_structp png_ptr, png_infop info_ptr,
- int transforms, voidp params)
-{
-#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
- /* invert the alpha channel from opacity to transparency */
- if (transforms & PNG_TRANSFORM_INVERT_ALPHA)
- png_set_invert_alpha(png_ptr);
-#endif
-
- /* Write the file header information. */
- png_write_info(png_ptr, info_ptr);
-
- /* ------ these transformations don't touch the info structure ------- */
-
-#if defined(PNG_WRITE_INVERT_SUPPORTED)
- /* invert monochrome pixels */
- if (transforms & PNG_TRANSFORM_INVERT_MONO)
- png_set_invert_mono(png_ptr);
-#endif
-
-#if defined(PNG_WRITE_SHIFT_SUPPORTED)
- /* Shift the pixels up to a legal bit depth and fill in
- * as appropriate to correctly scale the image.
- */
- if ((transforms & PNG_TRANSFORM_SHIFT)
- && (info_ptr->valid & PNG_INFO_sBIT))
- png_set_shift(png_ptr, &info_ptr->sig_bit);
-#endif
-
-#if defined(PNG_WRITE_PACK_SUPPORTED)
- /* pack pixels into bytes */
- if (transforms & PNG_TRANSFORM_PACKING)
- png_set_packing(png_ptr);
-#endif
-
-#if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
- /* swap location of alpha bytes from ARGB to RGBA */
- if (transforms & PNG_TRANSFORM_SWAP_ALPHA)
- png_set_swap_alpha(png_ptr);
-#endif
-
-#if defined(PNG_WRITE_FILLER_SUPPORTED)
- /* Get rid of filler (OR ALPHA) bytes, pack XRGB/RGBX/ARGB/RGBA into
- * RGB (4 channels -> 3 channels). The second parameter is not used.
- */
- if (transforms & PNG_TRANSFORM_STRIP_FILLER)
- png_set_filler(png_ptr, 0, PNG_FILLER_BEFORE);
-#endif
-
-#if defined(PNG_WRITE_BGR_SUPPORTED)
- /* flip BGR pixels to RGB */
- if (transforms & PNG_TRANSFORM_BGR)
- png_set_bgr(png_ptr);
-#endif
-
-#if defined(PNG_WRITE_SWAP_SUPPORTED)
- /* swap bytes of 16-bit files to most significant byte first */
- if (transforms & PNG_TRANSFORM_SWAP_ENDIAN)
- png_set_swap(png_ptr);
-#endif
-
-#if defined(PNG_WRITE_PACKSWAP_SUPPORTED)
- /* swap bits of 1, 2, 4 bit packed pixel formats */
- if (transforms & PNG_TRANSFORM_PACKSWAP)
- png_set_packswap(png_ptr);
-#endif
-
- /* ----------------------- end of transformations ------------------- */
-
- /* write the bits */
- if (info_ptr->valid & PNG_INFO_IDAT)
- png_write_image(png_ptr, info_ptr->row_pointers);
-
- /* It is REQUIRED to call this to finish writing the rest of the file */
- png_write_end(png_ptr, info_ptr);
-
- if(transforms == 0 || params == NULL)
- /* quiet compiler warnings */ return;
-}
-#endif
-#endif /* PNG_WRITE_SUPPORTED */
diff --git a/libpng/pngwtran.c b/libpng/pngwtran.c
deleted file mode 100644
index 55e691d..0000000
--- a/libpng/pngwtran.c
+++ /dev/null
@@ -1,563 +0,0 @@
-
-/* pngwtran.c - transforms the data in a row for PNG writers
- *
- * libpng 1.2.1 - December 12, 2001
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2001 Glenn Randers-Pehrson
- * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
- * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
- */
-
-#define PNG_INTERNAL
-#include "png.h"
-#ifdef PNG_WRITE_SUPPORTED
-
-/* Transform the data according to the user's wishes. The order of
- * transformations is significant.
- */
-void /* PRIVATE */
-png_do_write_transformations(png_structp png_ptr)
-{
- png_debug(1, "in png_do_write_transformations\n");
-
- if (png_ptr == NULL)
- return;
-
-#if defined(PNG_WRITE_USER_TRANSFORM_SUPPORTED)
- if (png_ptr->transformations & PNG_USER_TRANSFORM)
- if(png_ptr->write_user_transform_fn != NULL)
- (*(png_ptr->write_user_transform_fn)) /* user write transform function */
- (png_ptr, /* png_ptr */
- &(png_ptr->row_info), /* row_info: */
- /* png_uint_32 width; width of row */
- /* png_uint_32 rowbytes; number of bytes in row */
- /* png_byte color_type; color type of pixels */
- /* png_byte bit_depth; bit depth of samples */
- /* png_byte channels; number of channels (1-4) */
- /* png_byte pixel_depth; bits per pixel (depth*channels) */
- png_ptr->row_buf + 1); /* start of pixel data for row */
-#endif
-#if defined(PNG_WRITE_FILLER_SUPPORTED)
- if (png_ptr->transformations & PNG_FILLER)
- png_do_strip_filler(&(png_ptr->row_info), png_ptr->row_buf + 1,
- png_ptr->flags);
-#endif
-#if defined(PNG_WRITE_PACKSWAP_SUPPORTED)
- if (png_ptr->transformations & PNG_PACKSWAP)
- png_do_packswap(&(png_ptr->row_info), png_ptr->row_buf + 1);
-#endif
-#if defined(PNG_WRITE_PACK_SUPPORTED)
- if (png_ptr->transformations & PNG_PACK)
- png_do_pack(&(png_ptr->row_info), png_ptr->row_buf + 1,
- (png_uint_32)png_ptr->bit_depth);
-#endif
-#if defined(PNG_WRITE_SWAP_SUPPORTED)
- if (png_ptr->transformations & PNG_SWAP_BYTES)
- png_do_swap(&(png_ptr->row_info), png_ptr->row_buf + 1);
-#endif
-#if defined(PNG_WRITE_SHIFT_SUPPORTED)
- if (png_ptr->transformations & PNG_SHIFT)
- png_do_shift(&(png_ptr->row_info), png_ptr->row_buf + 1,
- &(png_ptr->shift));
-#endif
-#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
- if (png_ptr->transformations & PNG_INVERT_ALPHA)
- png_do_write_invert_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1);
-#endif
-#if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
- if (png_ptr->transformations & PNG_SWAP_ALPHA)
- png_do_write_swap_alpha(&(png_ptr->row_info), png_ptr->row_buf + 1);
-#endif
-#if defined(PNG_WRITE_BGR_SUPPORTED)
- if (png_ptr->transformations & PNG_BGR)
- png_do_bgr(&(png_ptr->row_info), png_ptr->row_buf + 1);
-#endif
-#if defined(PNG_WRITE_INVERT_SUPPORTED)
- if (png_ptr->transformations & PNG_INVERT_MONO)
- png_do_invert(&(png_ptr->row_info), png_ptr->row_buf + 1);
-#endif
-}
-
-#if defined(PNG_WRITE_PACK_SUPPORTED)
-/* Pack pixels into bytes. Pass the true bit depth in bit_depth. The
- * row_info bit depth should be 8 (one pixel per byte). The channels
- * should be 1 (this only happens on grayscale and paletted images).
- */
-void /* PRIVATE */
-png_do_pack(png_row_infop row_info, png_bytep row, png_uint_32 bit_depth)
-{
- png_debug(1, "in png_do_pack\n");
- if (row_info->bit_depth == 8 &&
-#if defined(PNG_USELESS_TESTS_SUPPORTED)
- row != NULL && row_info != NULL &&
-#endif
- row_info->channels == 1)
- {
- switch ((int)bit_depth)
- {
- case 1:
- {
- png_bytep sp, dp;
- int mask, v;
- png_uint_32 i;
- png_uint_32 row_width = row_info->width;
-
- sp = row;
- dp = row;
- mask = 0x80;
- v = 0;
-
- for (i = 0; i < row_width; i++)
- {
- if (*sp != 0)
- v |= mask;
- sp++;
- if (mask > 1)
- mask >>= 1;
- else
- {
- mask = 0x80;
- *dp = (png_byte)v;
- dp++;
- v = 0;
- }
- }
- if (mask != 0x80)
- *dp = (png_byte)v;
- break;
- }
- case 2:
- {
- png_bytep sp, dp;
- int shift, v;
- png_uint_32 i;
- png_uint_32 row_width = row_info->width;
-
- sp = row;
- dp = row;
- shift = 6;
- v = 0;
- for (i = 0; i < row_width; i++)
- {
- png_byte value;
-
- value = (png_byte)(*sp & 0x03);
- v |= (value << shift);
- if (shift == 0)
- {
- shift = 6;
- *dp = (png_byte)v;
- dp++;
- v = 0;
- }
- else
- shift -= 2;
- sp++;
- }
- if (shift != 6)
- *dp = (png_byte)v;
- break;
- }
- case 4:
- {
- png_bytep sp, dp;
- int shift, v;
- png_uint_32 i;
- png_uint_32 row_width = row_info->width;
-
- sp = row;
- dp = row;
- shift = 4;
- v = 0;
- for (i = 0; i < row_width; i++)
- {
- png_byte value;
-
- value = (png_byte)(*sp & 0x0f);
- v |= (value << shift);
-
- if (shift == 0)
- {
- shift = 4;
- *dp = (png_byte)v;
- dp++;
- v = 0;
- }
- else
- shift -= 4;
-
- sp++;
- }
- if (shift != 4)
- *dp = (png_byte)v;
- break;
- }
- }
- row_info->bit_depth = (png_byte)bit_depth;
- row_info->pixel_depth = (png_byte)(bit_depth * row_info->channels);
- row_info->rowbytes =
- ((row_info->width * row_info->pixel_depth + 7) >> 3);
- }
-}
-#endif
-
-#if defined(PNG_WRITE_SHIFT_SUPPORTED)
-/* Shift pixel values to take advantage of whole range. Pass the
- * true number of bits in bit_depth. The row should be packed
- * according to row_info->bit_depth. Thus, if you had a row of
- * bit depth 4, but the pixels only had values from 0 to 7, you
- * would pass 3 as bit_depth, and this routine would translate the
- * data to 0 to 15.
- */
-void /* PRIVATE */
-png_do_shift(png_row_infop row_info, png_bytep row, png_color_8p bit_depth)
-{
- png_debug(1, "in png_do_shift\n");
-#if defined(PNG_USELESS_TESTS_SUPPORTED)
- if (row != NULL && row_info != NULL &&
-#else
- if (
-#endif
- row_info->color_type != PNG_COLOR_TYPE_PALETTE)
- {
- int shift_start[4], shift_dec[4];
- int channels = 0;
-
- if (row_info->color_type & PNG_COLOR_MASK_COLOR)
- {
- shift_start[channels] = row_info->bit_depth - bit_depth->red;
- shift_dec[channels] = bit_depth->red;
- channels++;
- shift_start[channels] = row_info->bit_depth - bit_depth->green;
- shift_dec[channels] = bit_depth->green;
- channels++;
- shift_start[channels] = row_info->bit_depth - bit_depth->blue;
- shift_dec[channels] = bit_depth->blue;
- channels++;
- }
- else
- {
- shift_start[channels] = row_info->bit_depth - bit_depth->gray;
- shift_dec[channels] = bit_depth->gray;
- channels++;
- }
- if (row_info->color_type & PNG_COLOR_MASK_ALPHA)
- {
- shift_start[channels] = row_info->bit_depth - bit_depth->alpha;
- shift_dec[channels] = bit_depth->alpha;
- channels++;
- }
-
- /* with low row depths, could only be grayscale, so one channel */
- if (row_info->bit_depth < 8)
- {
- png_bytep bp = row;
- png_uint_32 i;
- png_byte mask;
- png_uint_32 row_bytes = row_info->rowbytes;
-
- if (bit_depth->gray == 1 && row_info->bit_depth == 2)
- mask = 0x55;
- else if (row_info->bit_depth == 4 && bit_depth->gray == 3)
- mask = 0x11;
- else
- mask = 0xff;
-
- for (i = 0; i < row_bytes; i++, bp++)
- {
- png_uint_16 v;
- int j;
-
- v = *bp;
- *bp = 0;
- for (j = shift_start[0]; j > -shift_dec[0]; j -= shift_dec[0])
- {
- if (j > 0)
- *bp |= (png_byte)((v << j) & 0xff);
- else
- *bp |= (png_byte)((v >> (-j)) & mask);
- }
- }
- }
- else if (row_info->bit_depth == 8)
- {
- png_bytep bp = row;
- png_uint_32 i;
- png_uint_32 istop = channels * row_info->width;
-
- for (i = 0; i < istop; i++, bp++)
- {
-
- png_uint_16 v;
- int j;
- int c = (int)(i%channels);
-
- v = *bp;
- *bp = 0;
- for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c])
- {
- if (j > 0)
- *bp |= (png_byte)((v << j) & 0xff);
- else
- *bp |= (png_byte)((v >> (-j)) & 0xff);
- }
- }
- }
- else
- {
- png_bytep bp;
- png_uint_32 i;
- png_uint_32 istop = channels * row_info->width;
-
- for (bp = row, i = 0; i < istop; i++)
- {
- int c = (int)(i%channels);
- png_uint_16 value, v;
- int j;
-
- v = (png_uint_16)(((png_uint_16)(*bp) << 8) + *(bp + 1));
- value = 0;
- for (j = shift_start[c]; j > -shift_dec[c]; j -= shift_dec[c])
- {
- if (j > 0)
- value |= (png_uint_16)((v << j) & (png_uint_16)0xffff);
- else
- value |= (png_uint_16)((v >> (-j)) & (png_uint_16)0xffff);
- }
- *bp++ = (png_byte)(value >> 8);
- *bp++ = (png_byte)(value & 0xff);
- }
- }
- }
-}
-#endif
-
-#if defined(PNG_WRITE_SWAP_ALPHA_SUPPORTED)
-void /* PRIVATE */
-png_do_write_swap_alpha(png_row_infop row_info, png_bytep row)
-{
- png_debug(1, "in png_do_write_swap_alpha\n");
-#if defined(PNG_USELESS_TESTS_SUPPORTED)
- if (row != NULL && row_info != NULL)
-#endif
- {
- if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
- {
- /* This converts from ARGB to RGBA */
- if (row_info->bit_depth == 8)
- {
- png_bytep sp, dp;
- png_uint_32 i;
- png_uint_32 row_width = row_info->width;
- for (i = 0, sp = dp = row; i < row_width; i++)
- {
- png_byte save = *(sp++);
- *(dp++) = *(sp++);
- *(dp++) = *(sp++);
- *(dp++) = *(sp++);
- *(dp++) = save;
- }
- }
- /* This converts from AARRGGBB to RRGGBBAA */
- else
- {
- png_bytep sp, dp;
- png_uint_32 i;
- png_uint_32 row_width = row_info->width;
-
- for (i = 0, sp = dp = row; i < row_width; i++)
- {
- png_byte save[2];
- save[0] = *(sp++);
- save[1] = *(sp++);
- *(dp++) = *(sp++);
- *(dp++) = *(sp++);
- *(dp++) = *(sp++);
- *(dp++) = *(sp++);
- *(dp++) = *(sp++);
- *(dp++) = *(sp++);
- *(dp++) = save[0];
- *(dp++) = save[1];
- }
- }
- }
- else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
- {
- /* This converts from AG to GA */
- if (row_info->bit_depth == 8)
- {
- png_bytep sp, dp;
- png_uint_32 i;
- png_uint_32 row_width = row_info->width;
-
- for (i = 0, sp = dp = row; i < row_width; i++)
- {
- png_byte save = *(sp++);
- *(dp++) = *(sp++);
- *(dp++) = save;
- }
- }
- /* This converts from AAGG to GGAA */
- else
- {
- png_bytep sp, dp;
- png_uint_32 i;
- png_uint_32 row_width = row_info->width;
-
- for (i = 0, sp = dp = row; i < row_width; i++)
- {
- png_byte save[2];
- save[0] = *(sp++);
- save[1] = *(sp++);
- *(dp++) = *(sp++);
- *(dp++) = *(sp++);
- *(dp++) = save[0];
- *(dp++) = save[1];
- }
- }
- }
- }
-}
-#endif
-
-#if defined(PNG_WRITE_INVERT_ALPHA_SUPPORTED)
-void /* PRIVATE */
-png_do_write_invert_alpha(png_row_infop row_info, png_bytep row)
-{
- png_debug(1, "in png_do_write_invert_alpha\n");
-#if defined(PNG_USELESS_TESTS_SUPPORTED)
- if (row != NULL && row_info != NULL)
-#endif
- {
- if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
- {
- /* This inverts the alpha channel in RGBA */
- if (row_info->bit_depth == 8)
- {
- png_bytep sp, dp;
- png_uint_32 i;
- png_uint_32 row_width = row_info->width;
- for (i = 0, sp = dp = row; i < row_width; i++)
- {
- *(dp++) = *(sp++);
- *(dp++) = *(sp++);
- *(dp++) = *(sp++);
- *(dp++) = (png_byte)(255 - *(sp++));
- }
- }
- /* This inverts the alpha channel in RRGGBBAA */
- else
- {
- png_bytep sp, dp;
- png_uint_32 i;
- png_uint_32 row_width = row_info->width;
-
- for (i = 0, sp = dp = row; i < row_width; i++)
- {
- *(dp++) = *(sp++);
- *(dp++) = *(sp++);
- *(dp++) = *(sp++);
- *(dp++) = *(sp++);
- *(dp++) = *(sp++);
- *(dp++) = *(sp++);
- *(dp++) = (png_byte)(255 - *(sp++));
- *(dp++) = (png_byte)(255 - *(sp++));
- }
- }
- }
- else if (row_info->color_type == PNG_COLOR_TYPE_GRAY_ALPHA)
- {
- /* This inverts the alpha channel in GA */
- if (row_info->bit_depth == 8)
- {
- png_bytep sp, dp;
- png_uint_32 i;
- png_uint_32 row_width = row_info->width;
-
- for (i = 0, sp = dp = row; i < row_width; i++)
- {
- *(dp++) = *(sp++);
- *(dp++) = (png_byte)(255 - *(sp++));
- }
- }
- /* This inverts the alpha channel in GGAA */
- else
- {
- png_bytep sp, dp;
- png_uint_32 i;
- png_uint_32 row_width = row_info->width;
-
- for (i = 0, sp = dp = row; i < row_width; i++)
- {
- *(dp++) = *(sp++);
- *(dp++) = *(sp++);
- *(dp++) = (png_byte)(255 - *(sp++));
- *(dp++) = (png_byte)(255 - *(sp++));
- }
- }
- }
- }
-}
-#endif
-
-#if defined(PNG_MNG_FEATURES_SUPPORTED)
-/* undoes intrapixel differencing */
-void /* PRIVATE */
-png_do_write_intrapixel(png_row_infop row_info, png_bytep row)
-{
- png_debug(1, "in png_do_write_intrapixel\n");
- if (
-#if defined(PNG_USELESS_TESTS_SUPPORTED)
- row != NULL && row_info != NULL &&
-#endif
- (row_info->color_type & PNG_COLOR_MASK_COLOR))
- {
- int bytes_per_pixel;
- png_uint_32 row_width = row_info->width;
- if (row_info->bit_depth == 8)
- {
- png_bytep rp;
- png_uint_32 i;
-
- if (row_info->color_type == PNG_COLOR_TYPE_RGB)
- bytes_per_pixel = 3;
- else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
- bytes_per_pixel = 4;
- else
- return;
-
- for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)
- {
- *(rp) = (png_byte)((*rp - *(rp+1))&0xff);
- *(rp+2) = (png_byte)((*(rp+2) - *(rp+1))&0xff);
- }
- }
- else if (row_info->bit_depth == 16)
- {
- png_bytep rp;
- png_uint_32 i;
-
- if (row_info->color_type == PNG_COLOR_TYPE_RGB)
- bytes_per_pixel = 6;
- else if (row_info->color_type == PNG_COLOR_TYPE_RGB_ALPHA)
- bytes_per_pixel = 8;
- else
- return;
-
- for (i = 0, rp = row; i < row_width; i++, rp += bytes_per_pixel)
- {
- png_uint_32 s0=*(rp )<<8 | *(rp+1);
- png_uint_32 s1=*(rp+2)<<8 | *(rp+3);
- png_uint_32 s2=*(rp+4)<<8 | *(rp+5);
- png_uint_32 red=(s0-s1)&0xffff;
- png_uint_32 blue=(s2-s1)&0xffff;
- *(rp ) = (png_byte)((red>>8)&0xff);
- *(rp+1) = (png_byte)(red&0xff);
- *(rp+4) = (png_byte)((blue>>8)&0xff);
- *(rp+5) = (png_byte)(blue&0xff);
- }
- }
- }
-}
-#endif /* PNG_MNG_FEATURES_SUPPORTED */
-#endif /* PNG_WRITE_SUPPORTED */
diff --git a/libpng/pngwutil.c b/libpng/pngwutil.c
deleted file mode 100644
index 1f2d724..0000000
--- a/libpng/pngwutil.c
+++ /dev/null
@@ -1,2669 +0,0 @@
-
-/* pngwutil.c - utilities to write a PNG file
- *
- * libpng 1.2.1 - December 12, 2001
- * For conditions of distribution and use, see copyright notice in png.h
- * Copyright (c) 1998-2001 Glenn Randers-Pehrson
- * (Version 0.96 Copyright (c) 1996, 1997 Andreas Dilger)
- * (Version 0.88 Copyright (c) 1995, 1996 Guy Eric Schalnat, Group 42, Inc.)
- */
-
-#define PNG_INTERNAL
-#include "png.h"
-#ifdef PNG_WRITE_SUPPORTED
-
-/* Place a 32-bit number into a buffer in PNG byte order. We work
- * with unsigned numbers for convenience, although one supported
- * ancillary chunk uses signed (two's complement) numbers.
- */
-void /* PRIVATE */
-png_save_uint_32(png_bytep buf, png_uint_32 i)
-{
- buf[0] = (png_byte)((i >> 24) & 0xff);
- buf[1] = (png_byte)((i >> 16) & 0xff);
- buf[2] = (png_byte)((i >> 8) & 0xff);
- buf[3] = (png_byte)(i & 0xff);
-}
-
-#if defined(PNG_WRITE_pCAL_SUPPORTED) || defined(PNG_WRITE_oFFs_SUPPORTED)
-/* The png_save_int_32 function assumes integers are stored in two's
- * complement format. If this isn't the case, then this routine needs to
- * be modified to write data in two's complement format.
- */
-void /* PRIVATE */
-png_save_int_32(png_bytep buf, png_int_32 i)
-{
- buf[0] = (png_byte)((i >> 24) & 0xff);
- buf[1] = (png_byte)((i >> 16) & 0xff);
- buf[2] = (png_byte)((i >> 8) & 0xff);
- buf[3] = (png_byte)(i & 0xff);
-}
-#endif
-
-/* Place a 16-bit number into a buffer in PNG byte order.
- * The parameter is declared unsigned int, not png_uint_16,
- * just to avoid potential problems on pre-ANSI C compilers.
- */
-void /* PRIVATE */
-png_save_uint_16(png_bytep buf, unsigned int i)
-{
- buf[0] = (png_byte)((i >> 8) & 0xff);
- buf[1] = (png_byte)(i & 0xff);
-}
-
-/* Write a PNG chunk all at once. The type is an array of ASCII characters
- * representing the chunk name. The array must be at least 4 bytes in
- * length, and does not need to be null terminated. To be safe, pass the
- * pre-defined chunk names here, and if you need a new one, define it
- * where the others are defined. The length is the length of the data.
- * All the data must be present. If that is not possible, use the
- * png_write_chunk_start(), png_write_chunk_data(), and png_write_chunk_end()
- * functions instead.
- */
-void PNGAPI
-png_write_chunk(png_structp png_ptr, png_bytep chunk_name,
- png_bytep data, png_size_t length)
-{
- png_write_chunk_start(png_ptr, chunk_name, (png_uint_32)length);
- png_write_chunk_data(png_ptr, data, length);
- png_write_chunk_end(png_ptr);
-}
-
-/* Write the start of a PNG chunk. The type is the chunk type.
- * The total_length is the sum of the lengths of all the data you will be
- * passing in png_write_chunk_data().
- */
-void PNGAPI
-png_write_chunk_start(png_structp png_ptr, png_bytep chunk_name,
- png_uint_32 length)
-{
- png_byte buf[4];
- png_debug2(0, "Writing %s chunk (%lu bytes)\n", chunk_name, length);
-
- /* write the length */
- png_save_uint_32(buf, length);
- png_write_data(png_ptr, buf, (png_size_t)4);
-
- /* write the chunk name */
- png_write_data(png_ptr, chunk_name, (png_size_t)4);
- /* reset the crc and run it over the chunk name */
- png_reset_crc(png_ptr);
- png_calculate_crc(png_ptr, chunk_name, (png_size_t)4);
-}
-
-/* Write the data of a PNG chunk started with png_write_chunk_start().
- * Note that multiple calls to this function are allowed, and that the
- * sum of the lengths from these calls *must* add up to the total_length
- * given to png_write_chunk_start().
- */
-void PNGAPI
-png_write_chunk_data(png_structp png_ptr, png_bytep data, png_size_t length)
-{
- /* write the data, and run the CRC over it */
- if (data != NULL && length > 0)
- {
- png_calculate_crc(png_ptr, data, length);
- png_write_data(png_ptr, data, length);
- }
-}
-
-/* Finish a chunk started with png_write_chunk_start(). */
-void PNGAPI
-png_write_chunk_end(png_structp png_ptr)
-{
- png_byte buf[4];
-
- /* write the crc */
- png_save_uint_32(buf, png_ptr->crc);
-
- png_write_data(png_ptr, buf, (png_size_t)4);
-}
-
-/* Simple function to write the signature. If we have already written
- * the magic bytes of the signature, or more likely, the PNG stream is
- * being embedded into another stream and doesn't need its own signature,
- * we should call png_set_sig_bytes() to tell libpng how many of the
- * bytes have already been written.
- */
-void /* PRIVATE */
-png_write_sig(png_structp png_ptr)
-{
- png_byte png_signature[8] = {137, 80, 78, 71, 13, 10, 26, 10};
- /* write the rest of the 8 byte signature */
- png_write_data(png_ptr, &png_signature[png_ptr->sig_bytes],
- (png_size_t)8 - png_ptr->sig_bytes);
- if(png_ptr->sig_bytes < 3)
- png_ptr->mode |= PNG_HAVE_PNG_SIGNATURE;
-}
-
-#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_iCCP_SUPPORTED)
-/*
- * This pair of functions encapsulates the operation of (a) compressing a
- * text string, and (b) issuing it later as a series of chunk data writes.
- * The compression_state structure is shared context for these functions
- * set up by the caller in order to make the whole mess thread-safe.
- */
-
-typedef struct
-{
- char *input; /* the uncompressed input data */
- int input_len; /* its length */
- int num_output_ptr; /* number of output pointers used */
- int max_output_ptr; /* size of output_ptr */
- png_charpp output_ptr; /* array of pointers to output */
-} compression_state;
-
-/* compress given text into storage in the png_ptr structure */
-static int /* PRIVATE */
-png_text_compress(png_structp png_ptr,
- png_charp text, png_size_t text_len, int compression,
- compression_state *comp)
-{
- int ret;
-
- comp->num_output_ptr = comp->max_output_ptr = 0;
- comp->output_ptr = NULL;
- comp->input = NULL;
-
- /* we may just want to pass the text right through */
- if (compression == PNG_TEXT_COMPRESSION_NONE)
- {
- comp->input = text;
- comp->input_len = text_len;
- return((int)text_len);
- }
-
- if (compression >= PNG_TEXT_COMPRESSION_LAST)
- {
-#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE)
- char msg[50];
- sprintf(msg, "Unknown compression type %d", compression);
- png_warning(png_ptr, msg);
-#else
- png_warning(png_ptr, "Unknown compression type");
-#endif
- }
-
- /* We can't write the chunk until we find out how much data we have,
- * which means we need to run the compressor first and save the
- * output. This shouldn't be a problem, as the vast majority of
- * comments should be reasonable, but we will set up an array of
- * malloc'd pointers to be sure.
- *
- * If we knew the application was well behaved, we could simplify this
- * greatly by assuming we can always malloc an output buffer large
- * enough to hold the compressed text ((1001 * text_len / 1000) + 12)
- * and malloc this directly. The only time this would be a bad idea is
- * if we can't malloc more than 64K and we have 64K of random input
- * data, or if the input string is incredibly large (although this
- * wouldn't cause a failure, just a slowdown due to swapping).
- */
-
- /* set up the compression buffers */
- png_ptr->zstream.avail_in = (uInt)text_len;
- png_ptr->zstream.next_in = (Bytef *)text;
- png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
- png_ptr->zstream.next_out = (Bytef *)png_ptr->zbuf;
-
- /* this is the same compression loop as in png_write_row() */
- do
- {
- /* compress the data */
- ret = deflate(&png_ptr->zstream, Z_NO_FLUSH);
- if (ret != Z_OK)
- {
- /* error */
- if (png_ptr->zstream.msg != NULL)
- png_error(png_ptr, png_ptr->zstream.msg);
- else
- png_error(png_ptr, "zlib error");
- }
- /* check to see if we need more room */
- if (!png_ptr->zstream.avail_out && png_ptr->zstream.avail_in)
- {
- /* make sure the output array has room */
- if (comp->num_output_ptr >= comp->max_output_ptr)
- {
- int old_max;
-
- old_max = comp->max_output_ptr;
- comp->max_output_ptr = comp->num_output_ptr + 4;
- if (comp->output_ptr != NULL)
- {
- png_charpp old_ptr;
-
- old_ptr = comp->output_ptr;
- comp->output_ptr = (png_charpp)png_malloc(png_ptr,
- (png_uint_32)(comp->max_output_ptr * sizeof (png_charpp)));
- png_memcpy(comp->output_ptr, old_ptr, old_max
- * sizeof (png_charp));
- png_free(png_ptr, old_ptr);
- }
- else
- comp->output_ptr = (png_charpp)png_malloc(png_ptr,
- (png_uint_32)(comp->max_output_ptr * sizeof (png_charp)));
- }
-
- /* save the data */
- comp->output_ptr[comp->num_output_ptr] = (png_charp)png_malloc(png_ptr,
- (png_uint_32)png_ptr->zbuf_size);
- png_memcpy(comp->output_ptr[comp->num_output_ptr], png_ptr->zbuf,
- png_ptr->zbuf_size);
- comp->num_output_ptr++;
-
- /* and reset the buffer */
- png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
- png_ptr->zstream.next_out = png_ptr->zbuf;
- }
- /* continue until we don't have any more to compress */
- } while (png_ptr->zstream.avail_in);
-
- /* finish the compression */
- do
- {
- /* tell zlib we are finished */
- ret = deflate(&png_ptr->zstream, Z_FINISH);
-
- if (ret == Z_OK)
- {
- /* check to see if we need more room */
- if (!(png_ptr->zstream.avail_out))
- {
- /* check to make sure our output array has room */
- if (comp->num_output_ptr >= comp->max_output_ptr)
- {
- int old_max;
-
- old_max = comp->max_output_ptr;
- comp->max_output_ptr = comp->num_output_ptr + 4;
- if (comp->output_ptr != NULL)
- {
- png_charpp old_ptr;
-
- old_ptr = comp->output_ptr;
- /* This could be optimized to realloc() */
- comp->output_ptr = (png_charpp)png_malloc(png_ptr,
- (png_uint_32)(comp->max_output_ptr * sizeof (png_charpp)));
- png_memcpy(comp->output_ptr, old_ptr,
- old_max * sizeof (png_charp));
- png_free(png_ptr, old_ptr);
- }
- else
- comp->output_ptr = (png_charpp)png_malloc(png_ptr,
- (png_uint_32)(comp->max_output_ptr * sizeof (png_charp)));
- }
-
- /* save off the data */
- comp->output_ptr[comp->num_output_ptr] =
- (png_charp)png_malloc(png_ptr, (png_uint_32)png_ptr->zbuf_size);
- png_memcpy(comp->output_ptr[comp->num_output_ptr], png_ptr->zbuf,
- png_ptr->zbuf_size);
- comp->num_output_ptr++;
-
- /* and reset the buffer pointers */
- png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
- png_ptr->zstream.next_out = png_ptr->zbuf;
- }
- }
- else if (ret != Z_STREAM_END)
- {
- /* we got an error */
- if (png_ptr->zstream.msg != NULL)
- png_error(png_ptr, png_ptr->zstream.msg);
- else
- png_error(png_ptr, "zlib error");
- }
- } while (ret != Z_STREAM_END);
-
- /* text length is number of buffers plus last buffer */
- text_len = png_ptr->zbuf_size * comp->num_output_ptr;
- if (png_ptr->zstream.avail_out < png_ptr->zbuf_size)
- text_len += png_ptr->zbuf_size - (png_size_t)png_ptr->zstream.avail_out;
-
- return((int)text_len);
-}
-
-/* ship the compressed text out via chunk writes */
-static void /* PRIVATE */
-png_write_compressed_data_out(png_structp png_ptr, compression_state *comp)
-{
- int i;
-
- /* handle the no-compression case */
- if (comp->input)
- {
- png_write_chunk_data(png_ptr, (png_bytep)comp->input,
- (png_size_t)comp->input_len);
- return;
- }
-
- /* write saved output buffers, if any */
- for (i = 0; i < comp->num_output_ptr; i++)
- {
- png_write_chunk_data(png_ptr,(png_bytep)comp->output_ptr[i],
- png_ptr->zbuf_size);
- png_free(png_ptr, comp->output_ptr[i]);
- comp->output_ptr[i]=NULL;
- }
- if (comp->max_output_ptr != 0)
- png_free(png_ptr, comp->output_ptr);
- comp->output_ptr=NULL;
- /* write anything left in zbuf */
- if (png_ptr->zstream.avail_out < (png_uint_32)png_ptr->zbuf_size)
- png_write_chunk_data(png_ptr, png_ptr->zbuf,
- png_ptr->zbuf_size - png_ptr->zstream.avail_out);
-
- /* reset zlib for another zTXt/iTXt or the image data */
- deflateReset(&png_ptr->zstream);
-
-}
-#endif
-
-/* Write the IHDR chunk, and update the png_struct with the necessary
- * information. Note that the rest of this code depends upon this
- * information being correct.
- */
-void /* PRIVATE */
-png_write_IHDR(png_structp png_ptr, png_uint_32 width, png_uint_32 height,
- int bit_depth, int color_type, int compression_type, int filter_type,
- int interlace_type)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_IHDR;
-#endif
- png_byte buf[13]; /* buffer to store the IHDR info */
-
- png_debug(1, "in png_write_IHDR\n");
- /* Check that we have valid input data from the application info */
- switch (color_type)
- {
- case PNG_COLOR_TYPE_GRAY:
- switch (bit_depth)
- {
- case 1:
- case 2:
- case 4:
- case 8:
- case 16: png_ptr->channels = 1; break;
- default: png_error(png_ptr,"Invalid bit depth for grayscale image");
- }
- break;
- case PNG_COLOR_TYPE_RGB:
- if (bit_depth != 8 && bit_depth != 16)
- png_error(png_ptr, "Invalid bit depth for RGB image");
- png_ptr->channels = 3;
- break;
- case PNG_COLOR_TYPE_PALETTE:
- switch (bit_depth)
- {
- case 1:
- case 2:
- case 4:
- case 8: png_ptr->channels = 1; break;
- default: png_error(png_ptr, "Invalid bit depth for paletted image");
- }
- break;
- case PNG_COLOR_TYPE_GRAY_ALPHA:
- if (bit_depth != 8 && bit_depth != 16)
- png_error(png_ptr, "Invalid bit depth for grayscale+alpha image");
- png_ptr->channels = 2;
- break;
- case PNG_COLOR_TYPE_RGB_ALPHA:
- if (bit_depth != 8 && bit_depth != 16)
- png_error(png_ptr, "Invalid bit depth for RGBA image");
- png_ptr->channels = 4;
- break;
- default:
- png_error(png_ptr, "Invalid image color type specified");
- }
-
- if (compression_type != PNG_COMPRESSION_TYPE_BASE)
- {
- png_warning(png_ptr, "Invalid compression type specified");
- compression_type = PNG_COMPRESSION_TYPE_BASE;
- }
-
- /* Write filter_method 64 (intrapixel differencing) only if
- * 1. Libpng was compiled with PNG_MNG_FEATURES_SUPPORTED and
- * 2. Libpng did not write a PNG signature (this filter_method is only
- * used in PNG datastreams that are embedded in MNG datastreams) and
- * 3. The application called png_permit_mng_features with a mask that
- * included PNG_FLAG_MNG_FILTER_64 and
- * 4. The filter_method is 64 and
- * 5. The color_type is RGB or RGBA
- */
- if (
-#if defined(PNG_MNG_FEATURES_SUPPORTED)
- !((png_ptr->mng_features_permitted & PNG_FLAG_MNG_FILTER_64) &&
- ((png_ptr->mode&PNG_HAVE_PNG_SIGNATURE) == 0) &&
- (color_type == PNG_COLOR_TYPE_RGB ||
- color_type == PNG_COLOR_TYPE_RGB_ALPHA) &&
- (filter_type == PNG_INTRAPIXEL_DIFFERENCING)) &&
-#endif
- filter_type != PNG_FILTER_TYPE_BASE)
- {
- png_warning(png_ptr, "Invalid filter type specified");
- filter_type = PNG_FILTER_TYPE_BASE;
- }
-
-#ifdef PNG_WRITE_INTERLACING_SUPPORTED
- if (interlace_type != PNG_INTERLACE_NONE &&
- interlace_type != PNG_INTERLACE_ADAM7)
- {
- png_warning(png_ptr, "Invalid interlace type specified");
- interlace_type = PNG_INTERLACE_ADAM7;
- }
-#else
- interlace_type=PNG_INTERLACE_NONE;
-#endif
-
- /* save off the relevent information */
- png_ptr->bit_depth = (png_byte)bit_depth;
- png_ptr->color_type = (png_byte)color_type;
- png_ptr->interlaced = (png_byte)interlace_type;
-#if defined(PNG_MNG_FEATURES_SUPPORTED)
- png_ptr->filter_type = (png_byte)filter_type;
-#endif
- png_ptr->width = width;
- png_ptr->height = height;
-
- png_ptr->pixel_depth = (png_byte)(bit_depth * png_ptr->channels);
- png_ptr->rowbytes = ((width * (png_size_t)png_ptr->pixel_depth + 7) >> 3);
- /* set the usr info, so any transformations can modify it */
- png_ptr->usr_width = png_ptr->width;
- png_ptr->usr_bit_depth = png_ptr->bit_depth;
- png_ptr->usr_channels = png_ptr->channels;
-
- /* pack the header information into the buffer */
- png_save_uint_32(buf, width);
- png_save_uint_32(buf + 4, height);
- buf[8] = (png_byte)bit_depth;
- buf[9] = (png_byte)color_type;
- buf[10] = (png_byte)compression_type;
- buf[11] = (png_byte)filter_type;
- buf[12] = (png_byte)interlace_type;
-
- /* write the chunk */
- png_write_chunk(png_ptr, (png_bytep)png_IHDR, buf, (png_size_t)13);
-
- /* initialize zlib with PNG info */
- png_ptr->zstream.zalloc = png_zalloc;
- png_ptr->zstream.zfree = png_zfree;
- png_ptr->zstream.opaque = (voidpf)png_ptr;
- if (!(png_ptr->do_filter))
- {
- if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE ||
- png_ptr->bit_depth < 8)
- png_ptr->do_filter = PNG_FILTER_NONE;
- else
- png_ptr->do_filter = PNG_ALL_FILTERS;
- }
- if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_STRATEGY))
- {
- if (png_ptr->do_filter != PNG_FILTER_NONE)
- png_ptr->zlib_strategy = Z_FILTERED;
- else
- png_ptr->zlib_strategy = Z_DEFAULT_STRATEGY;
- }
- if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_LEVEL))
- png_ptr->zlib_level = Z_DEFAULT_COMPRESSION;
- if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_MEM_LEVEL))
- png_ptr->zlib_mem_level = 8;
- if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_WINDOW_BITS))
- png_ptr->zlib_window_bits = 15;
- if (!(png_ptr->flags & PNG_FLAG_ZLIB_CUSTOM_METHOD))
- png_ptr->zlib_method = 8;
- deflateInit2(&png_ptr->zstream, png_ptr->zlib_level,
- png_ptr->zlib_method, png_ptr->zlib_window_bits,
- png_ptr->zlib_mem_level, png_ptr->zlib_strategy);
- png_ptr->zstream.next_out = png_ptr->zbuf;
- png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
-
- png_ptr->mode = PNG_HAVE_IHDR;
-}
-
-/* write the palette. We are careful not to trust png_color to be in the
- * correct order for PNG, so people can redefine it to any convenient
- * structure.
- */
-void /* PRIVATE */
-png_write_PLTE(png_structp png_ptr, png_colorp palette, png_uint_32 num_pal)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_PLTE;
-#endif
- png_uint_32 i;
- png_colorp pal_ptr;
- png_byte buf[3];
-
- png_debug(1, "in png_write_PLTE\n");
- if ((
-#if defined(PNG_MNG_FEATURES_SUPPORTED)
- !(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) &&
-#endif
- num_pal == 0) || num_pal > 256)
- {
- if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
- {
- png_error(png_ptr, "Invalid number of colors in palette");
- }
- else
- {
- png_warning(png_ptr, "Invalid number of colors in palette");
- return;
- }
- }
-
- if (!(png_ptr->color_type&PNG_COLOR_MASK_COLOR))
- {
- png_warning(png_ptr,
- "Ignoring request to write a PLTE chunk in grayscale PNG");
- return;
- }
-
- png_ptr->num_palette = (png_uint_16)num_pal;
- png_debug1(3, "num_palette = %d\n", png_ptr->num_palette);
-
- png_write_chunk_start(png_ptr, (png_bytep)png_PLTE, num_pal * 3);
-#ifndef PNG_NO_POINTER_INDEXING
- for (i = 0, pal_ptr = palette; i < num_pal; i++, pal_ptr++)
- {
- buf[0] = pal_ptr->red;
- buf[1] = pal_ptr->green;
- buf[2] = pal_ptr->blue;
- png_write_chunk_data(png_ptr, buf, (png_size_t)3);
- }
-#else
- /* This is a little slower but some buggy compilers need to do this instead */
- pal_ptr=palette;
- for (i = 0; i < num_pal; i++)
- {
- buf[0] = pal_ptr[i].red;
- buf[1] = pal_ptr[i].green;
- buf[2] = pal_ptr[i].blue;
- png_write_chunk_data(png_ptr, buf, (png_size_t)3);
- }
-#endif
- png_write_chunk_end(png_ptr);
- png_ptr->mode |= PNG_HAVE_PLTE;
-}
-
-/* write an IDAT chunk */
-void /* PRIVATE */
-png_write_IDAT(png_structp png_ptr, png_bytep data, png_size_t length)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_IDAT;
-#endif
- png_debug(1, "in png_write_IDAT\n");
- png_write_chunk(png_ptr, (png_bytep)png_IDAT, data, length);
- png_ptr->mode |= PNG_HAVE_IDAT;
-}
-
-/* write an IEND chunk */
-void /* PRIVATE */
-png_write_IEND(png_structp png_ptr)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_IEND;
-#endif
- png_debug(1, "in png_write_IEND\n");
- png_write_chunk(png_ptr, (png_bytep)png_IEND, png_bytep_NULL,
- (png_size_t)0);
- png_ptr->mode |= PNG_HAVE_IEND;
-}
-
-#if defined(PNG_WRITE_gAMA_SUPPORTED)
-/* write a gAMA chunk */
-#ifdef PNG_FLOATING_POINT_SUPPORTED
-void /* PRIVATE */
-png_write_gAMA(png_structp png_ptr, double file_gamma)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_gAMA;
-#endif
- png_uint_32 igamma;
- png_byte buf[4];
-
- png_debug(1, "in png_write_gAMA\n");
- /* file_gamma is saved in 1/100,000ths */
- igamma = (png_uint_32)(file_gamma * 100000.0 + 0.5);
- png_save_uint_32(buf, igamma);
- png_write_chunk(png_ptr, (png_bytep)png_gAMA, buf, (png_size_t)4);
-}
-#endif
-#ifdef PNG_FIXED_POINT_SUPPORTED
-void /* PRIVATE */
-png_write_gAMA_fixed(png_structp png_ptr, png_fixed_point file_gamma)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_gAMA;
-#endif
- png_byte buf[4];
-
- png_debug(1, "in png_write_gAMA\n");
- /* file_gamma is saved in 1/100,000ths */
- png_save_uint_32(buf, (png_uint_32)file_gamma);
- png_write_chunk(png_ptr, (png_bytep)png_gAMA, buf, (png_size_t)4);
-}
-#endif
-#endif
-
-#if defined(PNG_WRITE_sRGB_SUPPORTED)
-/* write a sRGB chunk */
-void /* PRIVATE */
-png_write_sRGB(png_structp png_ptr, int srgb_intent)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_sRGB;
-#endif
- png_byte buf[1];
-
- png_debug(1, "in png_write_sRGB\n");
- if(srgb_intent >= PNG_sRGB_INTENT_LAST)
- png_warning(png_ptr,
- "Invalid sRGB rendering intent specified");
- buf[0]=(png_byte)srgb_intent;
- png_write_chunk(png_ptr, (png_bytep)png_sRGB, buf, (png_size_t)1);
-}
-#endif
-
-#if defined(PNG_WRITE_iCCP_SUPPORTED)
-/* write an iCCP chunk */
-void /* PRIVATE */
-png_write_iCCP(png_structp png_ptr, png_charp name, int compression_type,
- png_charp profile, int profile_len)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_iCCP;
-#endif
- png_size_t name_len;
- png_charp new_name;
- compression_state comp;
-
- png_debug(1, "in png_write_iCCP\n");
- if (name == NULL || (name_len = png_check_keyword(png_ptr, name,
- &new_name)) == 0)
- {
- png_warning(png_ptr, "Empty keyword in iCCP chunk");
- return;
- }
-
- if (compression_type != PNG_COMPRESSION_TYPE_BASE)
- png_warning(png_ptr, "Unknown compression type in iCCP chunk");
-
- if (profile == NULL)
- profile_len = 0;
-
- if (profile_len)
- profile_len = png_text_compress(png_ptr, profile, (png_size_t)profile_len,
- PNG_COMPRESSION_TYPE_BASE, &comp);
-
- /* make sure we include the NULL after the name and the compression type */
- png_write_chunk_start(png_ptr, (png_bytep)png_iCCP,
- (png_uint_32)name_len+profile_len+2);
- new_name[name_len+1]=0x00;
- png_write_chunk_data(png_ptr, (png_bytep)new_name, name_len + 2);
-
- if (profile_len)
- png_write_compressed_data_out(png_ptr, &comp);
-
- png_write_chunk_end(png_ptr);
- png_free(png_ptr, new_name);
-}
-#endif
-
-#if defined(PNG_WRITE_sPLT_SUPPORTED)
-/* write a sPLT chunk */
-void /* PRIVATE */
-png_write_sPLT(png_structp png_ptr, png_sPLT_tp spalette)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_sPLT;
-#endif
- png_size_t name_len;
- png_charp new_name;
- png_byte entrybuf[10];
- int entry_size = (spalette->depth == 8 ? 6 : 10);
- int palette_size = entry_size * spalette->nentries;
- png_sPLT_entryp ep;
-#ifdef PNG_NO_POINTER_INDEXING
- int i;
-#endif
-
- png_debug(1, "in png_write_sPLT\n");
- if (spalette->name == NULL || (name_len = png_check_keyword(png_ptr,
- spalette->name, &new_name))==0)
- {
- png_warning(png_ptr, "Empty keyword in sPLT chunk");
- return;
- }
-
- /* make sure we include the NULL after the name */
- png_write_chunk_start(png_ptr, (png_bytep)png_sPLT,
- (png_uint_32)(name_len + 2 + palette_size));
- png_write_chunk_data(png_ptr, (png_bytep)new_name, name_len + 1);
- png_write_chunk_data(png_ptr, (png_bytep)&spalette->depth, 1);
-
- /* loop through each palette entry, writing appropriately */
-#ifndef PNG_NO_POINTER_INDEXING
- for (ep = spalette->entries; ep<spalette->entries+spalette->nentries; ep++)
- {
- if (spalette->depth == 8)
- {
- entrybuf[0] = (png_byte)ep->red;
- entrybuf[1] = (png_byte)ep->green;
- entrybuf[2] = (png_byte)ep->blue;
- entrybuf[3] = (png_byte)ep->alpha;
- png_save_uint_16(entrybuf + 4, ep->frequency);
- }
- else
- {
- png_save_uint_16(entrybuf + 0, ep->red);
- png_save_uint_16(entrybuf + 2, ep->green);
- png_save_uint_16(entrybuf + 4, ep->blue);
- png_save_uint_16(entrybuf + 6, ep->alpha);
- png_save_uint_16(entrybuf + 8, ep->frequency);
- }
- png_write_chunk_data(png_ptr, entrybuf, (png_size_t)entry_size);
- }
-#else
- ep=spalette->entries;
- for (i=0; i>spalette->nentries; i++)
- {
- if (spalette->depth == 8)
- {
- entrybuf[0] = (png_byte)ep[i].red;
- entrybuf[1] = (png_byte)ep[i].green;
- entrybuf[2] = (png_byte)ep[i].blue;
- entrybuf[3] = (png_byte)ep[i].alpha;
- png_save_uint_16(entrybuf + 4, ep[i].frequency);
- }
- else
- {
- png_save_uint_16(entrybuf + 0, ep[i].red);
- png_save_uint_16(entrybuf + 2, ep[i].green);
- png_save_uint_16(entrybuf + 4, ep[i].blue);
- png_save_uint_16(entrybuf + 6, ep[i].alpha);
- png_save_uint_16(entrybuf + 8, ep[i].frequency);
- }
- png_write_chunk_data(png_ptr, entrybuf, entry_size);
- }
-#endif
-
- png_write_chunk_end(png_ptr);
- png_free(png_ptr, new_name);
-}
-#endif
-
-#if defined(PNG_WRITE_sBIT_SUPPORTED)
-/* write the sBIT chunk */
-void /* PRIVATE */
-png_write_sBIT(png_structp png_ptr, png_color_8p sbit, int color_type)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_sBIT;
-#endif
- png_byte buf[4];
- png_size_t size;
-
- png_debug(1, "in png_write_sBIT\n");
- /* make sure we don't depend upon the order of PNG_COLOR_8 */
- if (color_type & PNG_COLOR_MASK_COLOR)
- {
- png_byte maxbits;
-
- maxbits = (png_byte)(color_type==PNG_COLOR_TYPE_PALETTE ? 8 :
- png_ptr->usr_bit_depth);
- if (sbit->red == 0 || sbit->red > maxbits ||
- sbit->green == 0 || sbit->green > maxbits ||
- sbit->blue == 0 || sbit->blue > maxbits)
- {
- png_warning(png_ptr, "Invalid sBIT depth specified");
- return;
- }
- buf[0] = sbit->red;
- buf[1] = sbit->green;
- buf[2] = sbit->blue;
- size = 3;
- }
- else
- {
- if (sbit->gray == 0 || sbit->gray > png_ptr->usr_bit_depth)
- {
- png_warning(png_ptr, "Invalid sBIT depth specified");
- return;
- }
- buf[0] = sbit->gray;
- size = 1;
- }
-
- if (color_type & PNG_COLOR_MASK_ALPHA)
- {
- if (sbit->alpha == 0 || sbit->alpha > png_ptr->usr_bit_depth)
- {
- png_warning(png_ptr, "Invalid sBIT depth specified");
- return;
- }
- buf[size++] = sbit->alpha;
- }
-
- png_write_chunk(png_ptr, (png_bytep)png_sBIT, buf, size);
-}
-#endif
-
-#if defined(PNG_WRITE_cHRM_SUPPORTED)
-/* write the cHRM chunk */
-#ifdef PNG_FLOATING_POINT_SUPPORTED
-void /* PRIVATE */
-png_write_cHRM(png_structp png_ptr, double white_x, double white_y,
- double red_x, double red_y, double green_x, double green_y,
- double blue_x, double blue_y)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_cHRM;
-#endif
- png_byte buf[32];
- png_uint_32 itemp;
-
- png_debug(1, "in png_write_cHRM\n");
- /* each value is saved in 1/100,000ths */
- if (white_x < 0 || white_x > 0.8 || white_y < 0 || white_y > 0.8 ||
- white_x + white_y > 1.0)
- {
- png_warning(png_ptr, "Invalid cHRM white point specified");
-#if !defined(PNG_NO_CONSOLE_IO)
- fprintf(stderr,"white_x=%f, white_y=%f\n",white_x, white_y);
-#endif
- return;
- }
- itemp = (png_uint_32)(white_x * 100000.0 + 0.5);
- png_save_uint_32(buf, itemp);
- itemp = (png_uint_32)(white_y * 100000.0 + 0.5);
- png_save_uint_32(buf + 4, itemp);
-
- if (red_x < 0 || red_x > 0.8 || red_y < 0 || red_y > 0.8 ||
- red_x + red_y > 1.0)
- {
- png_warning(png_ptr, "Invalid cHRM red point specified");
- return;
- }
- itemp = (png_uint_32)(red_x * 100000.0 + 0.5);
- png_save_uint_32(buf + 8, itemp);
- itemp = (png_uint_32)(red_y * 100000.0 + 0.5);
- png_save_uint_32(buf + 12, itemp);
-
- if (green_x < 0 || green_x > 0.8 || green_y < 0 || green_y > 0.8 ||
- green_x + green_y > 1.0)
- {
- png_warning(png_ptr, "Invalid cHRM green point specified");
- return;
- }
- itemp = (png_uint_32)(green_x * 100000.0 + 0.5);
- png_save_uint_32(buf + 16, itemp);
- itemp = (png_uint_32)(green_y * 100000.0 + 0.5);
- png_save_uint_32(buf + 20, itemp);
-
- if (blue_x < 0 || blue_x > 0.8 || blue_y < 0 || blue_y > 0.8 ||
- blue_x + blue_y > 1.0)
- {
- png_warning(png_ptr, "Invalid cHRM blue point specified");
- return;
- }
- itemp = (png_uint_32)(blue_x * 100000.0 + 0.5);
- png_save_uint_32(buf + 24, itemp);
- itemp = (png_uint_32)(blue_y * 100000.0 + 0.5);
- png_save_uint_32(buf + 28, itemp);
-
- png_write_chunk(png_ptr, (png_bytep)png_cHRM, buf, (png_size_t)32);
-}
-#endif
-#ifdef PNG_FIXED_POINT_SUPPORTED
-void /* PRIVATE */
-png_write_cHRM_fixed(png_structp png_ptr, png_fixed_point white_x,
- png_fixed_point white_y, png_fixed_point red_x, png_fixed_point red_y,
- png_fixed_point green_x, png_fixed_point green_y, png_fixed_point blue_x,
- png_fixed_point blue_y)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_cHRM;
-#endif
- png_byte buf[32];
-
- png_debug(1, "in png_write_cHRM\n");
- /* each value is saved in 1/100,000ths */
- if (white_x > 80000L || white_y > 80000L || white_x + white_y > 100000L)
- {
- png_warning(png_ptr, "Invalid fixed cHRM white point specified");
-#if !defined(PNG_NO_CONSOLE_IO)
- fprintf(stderr,"white_x=%ld, white_y=%ld\n",white_x, white_y);
-#endif
- return;
- }
- png_save_uint_32(buf, (png_uint_32)white_x);
- png_save_uint_32(buf + 4, (png_uint_32)white_y);
-
- if (red_x > 80000L || red_y > 80000L || red_x + red_y > 100000L)
- {
- png_warning(png_ptr, "Invalid cHRM fixed red point specified");
- return;
- }
- png_save_uint_32(buf + 8, (png_uint_32)red_x);
- png_save_uint_32(buf + 12, (png_uint_32)red_y);
-
- if (green_x > 80000L || green_y > 80000L || green_x + green_y > 100000L)
- {
- png_warning(png_ptr, "Invalid fixed cHRM green point specified");
- return;
- }
- png_save_uint_32(buf + 16, (png_uint_32)green_x);
- png_save_uint_32(buf + 20, (png_uint_32)green_y);
-
- if (blue_x > 80000L || blue_y > 80000L || blue_x + blue_y > 100000L)
- {
- png_warning(png_ptr, "Invalid fixed cHRM blue point specified");
- return;
- }
- png_save_uint_32(buf + 24, (png_uint_32)blue_x);
- png_save_uint_32(buf + 28, (png_uint_32)blue_y);
-
- png_write_chunk(png_ptr, (png_bytep)png_cHRM, buf, (png_size_t)32);
-}
-#endif
-#endif
-
-#if defined(PNG_WRITE_tRNS_SUPPORTED)
-/* write the tRNS chunk */
-void /* PRIVATE */
-png_write_tRNS(png_structp png_ptr, png_bytep trans, png_color_16p tran,
- int num_trans, int color_type)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_tRNS;
-#endif
- png_byte buf[6];
-
- png_debug(1, "in png_write_tRNS\n");
- if (color_type == PNG_COLOR_TYPE_PALETTE)
- {
- if (num_trans <= 0 || num_trans > (int)png_ptr->num_palette)
- {
- png_warning(png_ptr,"Invalid number of transparent colors specified");
- return;
- }
- /* write the chunk out as it is */
- png_write_chunk(png_ptr, (png_bytep)png_tRNS, trans, (png_size_t)num_trans);
- }
- else if (color_type == PNG_COLOR_TYPE_GRAY)
- {
- /* one 16 bit value */
- if(tran->gray >= (1 << png_ptr->bit_depth))
- {
- png_warning(png_ptr,
- "Ignoring attempt to write tRNS chunk out-of-range for bit_depth");
- return;
- }
- png_save_uint_16(buf, tran->gray);
- png_write_chunk(png_ptr, (png_bytep)png_tRNS, buf, (png_size_t)2);
- }
- else if (color_type == PNG_COLOR_TYPE_RGB)
- {
- /* three 16 bit values */
- png_save_uint_16(buf, tran->red);
- png_save_uint_16(buf + 2, tran->green);
- png_save_uint_16(buf + 4, tran->blue);
- if(png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4]))
- {
- png_warning(png_ptr,
- "Ignoring attempt to write 16-bit tRNS chunk when bit_depth is 8");
- return;
- }
- png_write_chunk(png_ptr, (png_bytep)png_tRNS, buf, (png_size_t)6);
- }
- else
- {
- png_warning(png_ptr, "Can't write tRNS with an alpha channel");
- }
-}
-#endif
-
-#if defined(PNG_WRITE_bKGD_SUPPORTED)
-/* write the background chunk */
-void /* PRIVATE */
-png_write_bKGD(png_structp png_ptr, png_color_16p back, int color_type)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_bKGD;
-#endif
- png_byte buf[6];
-
- png_debug(1, "in png_write_bKGD\n");
- if (color_type == PNG_COLOR_TYPE_PALETTE)
- {
- if (
-#if defined(PNG_MNG_FEATURES_SUPPORTED)
- (png_ptr->num_palette ||
- (!(png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE))) &&
-#endif
- back->index > png_ptr->num_palette)
- {
- png_warning(png_ptr, "Invalid background palette index");
- return;
- }
- buf[0] = back->index;
- png_write_chunk(png_ptr, (png_bytep)png_bKGD, buf, (png_size_t)1);
- }
- else if (color_type & PNG_COLOR_MASK_COLOR)
- {
- png_save_uint_16(buf, back->red);
- png_save_uint_16(buf + 2, back->green);
- png_save_uint_16(buf + 4, back->blue);
- if(png_ptr->bit_depth == 8 && (buf[0] | buf[2] | buf[4]))
- {
- png_warning(png_ptr,
- "Ignoring attempt to write 16-bit bKGD chunk when bit_depth is 8");
- return;
- }
- png_write_chunk(png_ptr, (png_bytep)png_bKGD, buf, (png_size_t)6);
- }
- else
- {
- if(back->gray >= (1 << png_ptr->bit_depth))
- {
- png_warning(png_ptr,
- "Ignoring attempt to write bKGD chunk out-of-range for bit_depth");
- return;
- }
- png_save_uint_16(buf, back->gray);
- png_write_chunk(png_ptr, (png_bytep)png_bKGD, buf, (png_size_t)2);
- }
-}
-#endif
-
-#if defined(PNG_WRITE_hIST_SUPPORTED)
-/* write the histogram */
-void /* PRIVATE */
-png_write_hIST(png_structp png_ptr, png_uint_16p hist, int num_hist)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_hIST;
-#endif
- int i;
- png_byte buf[3];
-
- png_debug(1, "in png_write_hIST\n");
- if (num_hist > (int)png_ptr->num_palette)
- {
- png_debug2(3, "num_hist = %d, num_palette = %d\n", num_hist,
- png_ptr->num_palette);
- png_warning(png_ptr, "Invalid number of histogram entries specified");
- return;
- }
-
- png_write_chunk_start(png_ptr, (png_bytep)png_hIST, (png_uint_32)(num_hist * 2));
- for (i = 0; i < num_hist; i++)
- {
- png_save_uint_16(buf, hist[i]);
- png_write_chunk_data(png_ptr, buf, (png_size_t)2);
- }
- png_write_chunk_end(png_ptr);
-}
-#endif
-
-#if defined(PNG_WRITE_TEXT_SUPPORTED) || defined(PNG_WRITE_pCAL_SUPPORTED) || \
- defined(PNG_WRITE_iCCP_SUPPORTED) || defined(PNG_WRITE_sPLT_SUPPORTED)
-/* Check that the tEXt or zTXt keyword is valid per PNG 1.0 specification,
- * and if invalid, correct the keyword rather than discarding the entire
- * chunk. The PNG 1.0 specification requires keywords 1-79 characters in
- * length, forbids leading or trailing whitespace, multiple internal spaces,
- * and the non-break space (0x80) from ISO 8859-1. Returns keyword length.
- *
- * The new_key is allocated to hold the corrected keyword and must be freed
- * by the calling routine. This avoids problems with trying to write to
- * static keywords without having to have duplicate copies of the strings.
- */
-png_size_t /* PRIVATE */
-png_check_keyword(png_structp png_ptr, png_charp key, png_charpp new_key)
-{
- png_size_t key_len;
- png_charp kp, dp;
- int kflag;
- int kwarn=0;
-
- png_debug(1, "in png_check_keyword\n");
- *new_key = NULL;
-
- if (key == NULL || (key_len = png_strlen(key)) == 0)
- {
- png_warning(png_ptr, "zero length keyword");
- return ((png_size_t)0);
- }
-
- png_debug1(2, "Keyword to be checked is '%s'\n", key);
-
- *new_key = (png_charp)png_malloc(png_ptr, (png_uint_32)(key_len + 2));
-
- /* Replace non-printing characters with a blank and print a warning */
- for (kp = key, dp = *new_key; *kp != '\0'; kp++, dp++)
- {
- if (*kp < 0x20 || (*kp > 0x7E && (png_byte)*kp < 0xA1))
- {
-#if !defined(PNG_NO_STDIO) && !defined(_WIN32_WCE)
- char msg[40];
-
- sprintf(msg, "invalid keyword character 0x%02X", *kp);
- png_warning(png_ptr, msg);
-#else
- png_warning(png_ptr, "invalid character in keyword");
-#endif
- *dp = ' ';
- }
- else
- {
- *dp = *kp;
- }
- }
- *dp = '\0';
-
- /* Remove any trailing white space. */
- kp = *new_key + key_len - 1;
- if (*kp == ' ')
- {
- png_warning(png_ptr, "trailing spaces removed from keyword");
-
- while (*kp == ' ')
- {
- *(kp--) = '\0';
- key_len--;
- }
- }
-
- /* Remove any leading white space. */
- kp = *new_key;
- if (*kp == ' ')
- {
- png_warning(png_ptr, "leading spaces removed from keyword");
-
- while (*kp == ' ')
- {
- kp++;
- key_len--;
- }
- }
-
- png_debug1(2, "Checking for multiple internal spaces in '%s'\n", kp);
-
- /* Remove multiple internal spaces. */
- for (kflag = 0, dp = *new_key; *kp != '\0'; kp++)
- {
- if (*kp == ' ' && kflag == 0)
- {
- *(dp++) = *kp;
- kflag = 1;
- }
- else if (*kp == ' ')
- {
- key_len--;
- kwarn=1;
- }
- else
- {
- *(dp++) = *kp;
- kflag = 0;
- }
- }
- *dp = '\0';
- if(kwarn)
- png_warning(png_ptr, "extra interior spaces removed from keyword");
-
- if (key_len == 0)
- {
- png_free(png_ptr, *new_key);
- *new_key=NULL;
- png_warning(png_ptr, "Zero length keyword");
- }
-
- if (key_len > 79)
- {
- png_warning(png_ptr, "keyword length must be 1 - 79 characters");
- new_key[79] = '\0';
- key_len = 79;
- }
-
- return (key_len);
-}
-#endif
-
-#if defined(PNG_WRITE_tEXt_SUPPORTED)
-/* write a tEXt chunk */
-void /* PRIVATE */
-png_write_tEXt(png_structp png_ptr, png_charp key, png_charp text,
- png_size_t text_len)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_tEXt;
-#endif
- png_size_t key_len;
- png_charp new_key;
-
- png_debug(1, "in png_write_tEXt\n");
- if (key == NULL || (key_len = png_check_keyword(png_ptr, key, &new_key))==0)
- {
- png_warning(png_ptr, "Empty keyword in tEXt chunk");
- return;
- }
-
- if (text == NULL || *text == '\0')
- text_len = 0;
- else
- text_len = png_strlen(text);
-
- /* make sure we include the 0 after the key */
- png_write_chunk_start(png_ptr, (png_bytep)png_tEXt, (png_uint_32)key_len+text_len+1);
- /*
- * We leave it to the application to meet PNG-1.0 requirements on the
- * contents of the text. PNG-1.0 through PNG-1.2 discourage the use of
- * any non-Latin-1 characters except for NEWLINE. ISO PNG will forbid them.
- * The NUL character is forbidden by PNG-1.0 through PNG-1.2 and ISO PNG.
- */
- png_write_chunk_data(png_ptr, (png_bytep)new_key, key_len + 1);
- if (text_len)
- png_write_chunk_data(png_ptr, (png_bytep)text, text_len);
-
- png_write_chunk_end(png_ptr);
- png_free(png_ptr, new_key);
-}
-#endif
-
-#if defined(PNG_WRITE_zTXt_SUPPORTED)
-/* write a compressed text chunk */
-void /* PRIVATE */
-png_write_zTXt(png_structp png_ptr, png_charp key, png_charp text,
- png_size_t text_len, int compression)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_zTXt;
-#endif
- png_size_t key_len;
- char buf[1];
- png_charp new_key;
- compression_state comp;
-
- png_debug(1, "in png_write_zTXt\n");
-
- if (key == NULL || (key_len = png_check_keyword(png_ptr, key, &new_key))==0)
- {
- png_warning(png_ptr, "Empty keyword in zTXt chunk");
- return;
- }
-
- if (text == NULL || *text == '\0' || compression==PNG_TEXT_COMPRESSION_NONE)
- {
- png_write_tEXt(png_ptr, new_key, text, (png_size_t)0);
- png_free(png_ptr, new_key);
- return;
- }
-
- text_len = png_strlen(text);
-
- png_free(png_ptr, new_key);
-
- /* compute the compressed data; do it now for the length */
- text_len = png_text_compress(png_ptr, text, text_len, compression,
- &comp);
-
- /* write start of chunk */
- png_write_chunk_start(png_ptr, (png_bytep)png_zTXt, (png_uint_32)
- (key_len+text_len+2));
- /* write key */
- png_write_chunk_data(png_ptr, (png_bytep)key, key_len + 1);
- buf[0] = (png_byte)compression;
- /* write compression */
- png_write_chunk_data(png_ptr, (png_bytep)buf, (png_size_t)1);
- /* write the compressed data */
- png_write_compressed_data_out(png_ptr, &comp);
-
- /* close the chunk */
- png_write_chunk_end(png_ptr);
-}
-#endif
-
-#if defined(PNG_WRITE_iTXt_SUPPORTED)
-/* write an iTXt chunk */
-void /* PRIVATE */
-png_write_iTXt(png_structp png_ptr, int compression, png_charp key,
- png_charp lang, png_charp lang_key, png_charp text)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_iTXt;
-#endif
- png_size_t lang_len, key_len, lang_key_len, text_len;
- png_charp new_lang, new_key;
- png_byte cbuf[2];
- compression_state comp;
-
- png_debug(1, "in png_write_iTXt\n");
-
- if (key == NULL || (key_len = png_check_keyword(png_ptr, key, &new_key))==0)
- {
- png_warning(png_ptr, "Empty keyword in iTXt chunk");
- return;
- }
- if (lang == NULL || (lang_len = png_check_keyword(png_ptr, lang,
- &new_lang))==0)
- {
- png_warning(png_ptr, "Empty language field in iTXt chunk");
- return;
- }
- lang_key_len = png_strlen(lang_key);
- text_len = png_strlen(text);
-
- if (text == NULL || *text == '\0')
- text_len = 0;
-
- /* compute the compressed data; do it now for the length */
- text_len = png_text_compress(png_ptr, text, text_len, compression-2,
- &comp);
-
- /* make sure we include the compression flag, the compression byte,
- * and the NULs after the key, lang, and lang_key parts */
-
- png_write_chunk_start(png_ptr, (png_bytep)png_iTXt,
- (png_uint_32)(
- 5 /* comp byte, comp flag, terminators for key, lang and lang_key */
- + key_len
- + lang_len
- + lang_key_len
- + text_len));
-
- /*
- * We leave it to the application to meet PNG-1.0 requirements on the
- * contents of the text. PNG-1.0 through PNG-1.2 discourage the use of
- * any non-Latin-1 characters except for NEWLINE. ISO PNG will forbid them.
- * The NUL character is forbidden by PNG-1.0 through PNG-1.2 and ISO PNG.
- */
- png_write_chunk_data(png_ptr, (png_bytep)new_key, key_len + 1);
-
- /* set the compression flag */
- if (compression == PNG_ITXT_COMPRESSION_NONE || \
- compression == PNG_TEXT_COMPRESSION_NONE)
- cbuf[0] = 0;
- else /* compression == PNG_ITXT_COMPRESSION_zTXt */
- cbuf[0] = 1;
- /* set the compression method */
- cbuf[1] = 0;
- png_write_chunk_data(png_ptr, cbuf, 2);
-
- png_write_chunk_data(png_ptr, (png_bytep)new_lang, lang_len + 1);
- png_write_chunk_data(png_ptr, (png_bytep)lang_key, lang_key_len+1);
- png_write_chunk_data(png_ptr, '\0', 1);
-
- png_write_compressed_data_out(png_ptr, &comp);
-
- png_write_chunk_end(png_ptr);
- png_free(png_ptr, new_key);
- png_free(png_ptr, new_lang);
-}
-#endif
-
-#if defined(PNG_WRITE_oFFs_SUPPORTED)
-/* write the oFFs chunk */
-void /* PRIVATE */
-png_write_oFFs(png_structp png_ptr, png_int_32 x_offset, png_int_32 y_offset,
- int unit_type)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_oFFs;
-#endif
- png_byte buf[9];
-
- png_debug(1, "in png_write_oFFs\n");
- if (unit_type >= PNG_OFFSET_LAST)
- png_warning(png_ptr, "Unrecognized unit type for oFFs chunk");
-
- png_save_int_32(buf, x_offset);
- png_save_int_32(buf + 4, y_offset);
- buf[8] = (png_byte)unit_type;
-
- png_write_chunk(png_ptr, (png_bytep)png_oFFs, buf, (png_size_t)9);
-}
-#endif
-
-#if defined(PNG_WRITE_pCAL_SUPPORTED)
-/* write the pCAL chunk (described in the PNG extensions document) */
-void /* PRIVATE */
-png_write_pCAL(png_structp png_ptr, png_charp purpose, png_int_32 X0,
- png_int_32 X1, int type, int nparams, png_charp units, png_charpp params)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_pCAL;
-#endif
- png_size_t purpose_len, units_len, total_len;
- png_uint_32p params_len;
- png_byte buf[10];
- png_charp new_purpose;
- int i;
-
- png_debug1(1, "in png_write_pCAL (%d parameters)\n", nparams);
- if (type >= PNG_EQUATION_LAST)
- png_warning(png_ptr, "Unrecognized equation type for pCAL chunk");
-
- purpose_len = png_check_keyword(png_ptr, purpose, &new_purpose) + 1;
- png_debug1(3, "pCAL purpose length = %d\n", (int)purpose_len);
- units_len = png_strlen(units) + (nparams == 0 ? 0 : 1);
- png_debug1(3, "pCAL units length = %d\n", (int)units_len);
- total_len = purpose_len + units_len + 10;
-
- params_len = (png_uint_32p)png_malloc(png_ptr, (png_uint_32)(nparams
- *sizeof(png_uint_32)));
-
- /* Find the length of each parameter, making sure we don't count the
- null terminator for the last parameter. */
- for (i = 0; i < nparams; i++)
- {
- params_len[i] = png_strlen(params[i]) + (i == nparams - 1 ? 0 : 1);
- png_debug2(3, "pCAL parameter %d length = %lu\n", i, params_len[i]);
- total_len += (png_size_t)params_len[i];
- }
-
- png_debug1(3, "pCAL total length = %d\n", (int)total_len);
- png_write_chunk_start(png_ptr, (png_bytep)png_pCAL, (png_uint_32)total_len);
- png_write_chunk_data(png_ptr, (png_bytep)new_purpose, purpose_len);
- png_save_int_32(buf, X0);
- png_save_int_32(buf + 4, X1);
- buf[8] = (png_byte)type;
- buf[9] = (png_byte)nparams;
- png_write_chunk_data(png_ptr, buf, (png_size_t)10);
- png_write_chunk_data(png_ptr, (png_bytep)units, (png_size_t)units_len);
-
- png_free(png_ptr, new_purpose);
-
- for (i = 0; i < nparams; i++)
- {
- png_write_chunk_data(png_ptr, (png_bytep)params[i],
- (png_size_t)params_len[i]);
- }
-
- png_free(png_ptr, params_len);
- png_write_chunk_end(png_ptr);
-}
-#endif
-
-#if defined(PNG_WRITE_sCAL_SUPPORTED)
-/* write the sCAL chunk */
-#if defined(PNG_FLOATING_POINT_SUPPORTED) && !defined(PNG_NO_STDIO)
-void /* PRIVATE */
-png_write_sCAL(png_structp png_ptr, int unit, double width,double height)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_sCAL;
-#endif
- png_size_t total_len;
- char wbuf[32], hbuf[32];
-
- png_debug(1, "in png_write_sCAL\n");
-
-#if defined(_WIN32_WCE)
-/* sprintf() function is not supported on WindowsCE */
- {
- wchar_t wc_buf[32];
- swprintf(wc_buf, TEXT("%12.12e"), width);
- WideCharToMultiByte(CP_ACP, 0, wc_buf, -1, wbuf, 32, NULL, NULL);
- swprintf(wc_buf, TEXT("%12.12e"), height);
- WideCharToMultiByte(CP_ACP, 0, wc_buf, -1, hbuf, 32, NULL, NULL);
- }
-#else
- sprintf(wbuf, "%12.12e", width);
- sprintf(hbuf, "%12.12e", height);
-#endif
- total_len = 1 + png_strlen(wbuf)+1 + png_strlen(hbuf);
-
- png_debug1(3, "sCAL total length = %d\n", (int)total_len);
- png_write_chunk_start(png_ptr, (png_bytep)png_sCAL, (png_uint_32)total_len);
- png_write_chunk_data(png_ptr, (png_bytep)&unit, 1);
- png_write_chunk_data(png_ptr, (png_bytep)wbuf, png_strlen(wbuf)+1);
- png_write_chunk_data(png_ptr, (png_bytep)hbuf, png_strlen(hbuf));
-
- png_write_chunk_end(png_ptr);
-}
-#else
-#ifdef PNG_FIXED_POINT_SUPPORTED
-void /* PRIVATE */
-png_write_sCAL_s(png_structp png_ptr, int unit, png_charp width,
- png_charp height)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_sCAL;
-#endif
- png_size_t total_len;
- char wbuf[32], hbuf[32];
-
- png_debug(1, "in png_write_sCAL_s\n");
-
- png_strcpy(wbuf,(const char *)width);
- png_strcpy(hbuf,(const char *)height);
- total_len = 1 + png_strlen(wbuf)+1 + png_strlen(hbuf);
-
- png_debug1(3, "sCAL total length = %d\n", total_len);
- png_write_chunk_start(png_ptr, (png_bytep)png_sCAL, (png_uint_32)total_len);
- png_write_chunk_data(png_ptr, (png_bytep)&unit, 1);
- png_write_chunk_data(png_ptr, (png_bytep)wbuf, png_strlen(wbuf)+1);
- png_write_chunk_data(png_ptr, (png_bytep)hbuf, png_strlen(hbuf));
-
- png_write_chunk_end(png_ptr);
-}
-#endif
-#endif
-#endif
-
-#if defined(PNG_WRITE_pHYs_SUPPORTED)
-/* write the pHYs chunk */
-void /* PRIVATE */
-png_write_pHYs(png_structp png_ptr, png_uint_32 x_pixels_per_unit,
- png_uint_32 y_pixels_per_unit,
- int unit_type)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_pHYs;
-#endif
- png_byte buf[9];
-
- png_debug(1, "in png_write_pHYs\n");
- if (unit_type >= PNG_RESOLUTION_LAST)
- png_warning(png_ptr, "Unrecognized unit type for pHYs chunk");
-
- png_save_uint_32(buf, x_pixels_per_unit);
- png_save_uint_32(buf + 4, y_pixels_per_unit);
- buf[8] = (png_byte)unit_type;
-
- png_write_chunk(png_ptr, (png_bytep)png_pHYs, buf, (png_size_t)9);
-}
-#endif
-
-#if defined(PNG_WRITE_tIME_SUPPORTED)
-/* Write the tIME chunk. Use either png_convert_from_struct_tm()
- * or png_convert_from_time_t(), or fill in the structure yourself.
- */
-void /* PRIVATE */
-png_write_tIME(png_structp png_ptr, png_timep mod_time)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- PNG_tIME;
-#endif
- png_byte buf[7];
-
- png_debug(1, "in png_write_tIME\n");
- if (mod_time->month > 12 || mod_time->month < 1 ||
- mod_time->day > 31 || mod_time->day < 1 ||
- mod_time->hour > 23 || mod_time->second > 60)
- {
- png_warning(png_ptr, "Invalid time specified for tIME chunk");
- return;
- }
-
- png_save_uint_16(buf, mod_time->year);
- buf[2] = mod_time->month;
- buf[3] = mod_time->day;
- buf[4] = mod_time->hour;
- buf[5] = mod_time->minute;
- buf[6] = mod_time->second;
-
- png_write_chunk(png_ptr, (png_bytep)png_tIME, buf, (png_size_t)7);
-}
-#endif
-
-/* initializes the row writing capability of libpng */
-void /* PRIVATE */
-png_write_start_row(png_structp png_ptr)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
-
- /* start of interlace block */
- int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
-
- /* offset to next interlace block */
- int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
-
- /* start of interlace block in the y direction */
- int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};
-
- /* offset to next interlace block in the y direction */
- int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
-#endif
-
- png_size_t buf_size;
-
- png_debug(1, "in png_write_start_row\n");
- buf_size = (png_size_t)(((png_ptr->width * png_ptr->usr_channels *
- png_ptr->usr_bit_depth + 7) >> 3) + 1);
-
- /* set up row buffer */
- png_ptr->row_buf = (png_bytep)png_malloc(png_ptr, (png_uint_32)buf_size);
- png_ptr->row_buf[0] = PNG_FILTER_VALUE_NONE;
-
- /* set up filtering buffer, if using this filter */
- if (png_ptr->do_filter & PNG_FILTER_SUB)
- {
- png_ptr->sub_row = (png_bytep)png_malloc(png_ptr,
- (png_ptr->rowbytes + 1));
- png_ptr->sub_row[0] = PNG_FILTER_VALUE_SUB;
- }
-
- /* We only need to keep the previous row if we are using one of these. */
- if (png_ptr->do_filter & (PNG_FILTER_AVG | PNG_FILTER_UP | PNG_FILTER_PAETH))
- {
- /* set up previous row buffer */
- png_ptr->prev_row = (png_bytep)png_malloc(png_ptr, (png_uint_32)buf_size);
- png_memset(png_ptr->prev_row, 0, buf_size);
-
- if (png_ptr->do_filter & PNG_FILTER_UP)
- {
- png_ptr->up_row = (png_bytep )png_malloc(png_ptr,
- (png_ptr->rowbytes + 1));
- png_ptr->up_row[0] = PNG_FILTER_VALUE_UP;
- }
-
- if (png_ptr->do_filter & PNG_FILTER_AVG)
- {
- png_ptr->avg_row = (png_bytep)png_malloc(png_ptr,
- (png_ptr->rowbytes + 1));
- png_ptr->avg_row[0] = PNG_FILTER_VALUE_AVG;
- }
-
- if (png_ptr->do_filter & PNG_FILTER_PAETH)
- {
- png_ptr->paeth_row = (png_bytep )png_malloc(png_ptr,
- (png_ptr->rowbytes + 1));
- png_ptr->paeth_row[0] = PNG_FILTER_VALUE_PAETH;
- }
- }
-
-#ifdef PNG_WRITE_INTERLACING_SUPPORTED
- /* if interlaced, we need to set up width and height of pass */
- if (png_ptr->interlaced)
- {
- if (!(png_ptr->transformations & PNG_INTERLACE))
- {
- png_ptr->num_rows = (png_ptr->height + png_pass_yinc[0] - 1 -
- png_pass_ystart[0]) / png_pass_yinc[0];
- png_ptr->usr_width = (png_ptr->width + png_pass_inc[0] - 1 -
- png_pass_start[0]) / png_pass_inc[0];
- }
- else
- {
- png_ptr->num_rows = png_ptr->height;
- png_ptr->usr_width = png_ptr->width;
- }
- }
- else
-#endif
- {
- png_ptr->num_rows = png_ptr->height;
- png_ptr->usr_width = png_ptr->width;
- }
- png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
- png_ptr->zstream.next_out = png_ptr->zbuf;
-}
-
-/* Internal use only. Called when finished processing a row of data. */
-void /* PRIVATE */
-png_write_finish_row(png_structp png_ptr)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
-
- /* start of interlace block */
- int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
-
- /* offset to next interlace block */
- int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
-
- /* start of interlace block in the y direction */
- int png_pass_ystart[7] = {0, 0, 4, 0, 2, 0, 1};
-
- /* offset to next interlace block in the y direction */
- int png_pass_yinc[7] = {8, 8, 8, 4, 4, 2, 2};
-#endif
-
- int ret;
-
- png_debug(1, "in png_write_finish_row\n");
- /* next row */
- png_ptr->row_number++;
-
- /* see if we are done */
- if (png_ptr->row_number < png_ptr->num_rows)
- return;
-
-#ifdef PNG_WRITE_INTERLACING_SUPPORTED
- /* if interlaced, go to next pass */
- if (png_ptr->interlaced)
- {
- png_ptr->row_number = 0;
- if (png_ptr->transformations & PNG_INTERLACE)
- {
- png_ptr->pass++;
- }
- else
- {
- /* loop until we find a non-zero width or height pass */
- do
- {
- png_ptr->pass++;
- if (png_ptr->pass >= 7)
- break;
- png_ptr->usr_width = (png_ptr->width +
- png_pass_inc[png_ptr->pass] - 1 -
- png_pass_start[png_ptr->pass]) /
- png_pass_inc[png_ptr->pass];
- png_ptr->num_rows = (png_ptr->height +
- png_pass_yinc[png_ptr->pass] - 1 -
- png_pass_ystart[png_ptr->pass]) /
- png_pass_yinc[png_ptr->pass];
- if (png_ptr->transformations & PNG_INTERLACE)
- break;
- } while (png_ptr->usr_width == 0 || png_ptr->num_rows == 0);
-
- }
-
- /* reset the row above the image for the next pass */
- if (png_ptr->pass < 7)
- {
- if (png_ptr->prev_row != NULL)
- png_memset(png_ptr->prev_row, 0,
- (png_size_t) (((png_uint_32)png_ptr->usr_channels *
- (png_uint_32)png_ptr->usr_bit_depth *
- png_ptr->width + 7) >> 3) + 1);
- return;
- }
- }
-#endif
-
- /* if we get here, we've just written the last row, so we need
- to flush the compressor */
- do
- {
- /* tell the compressor we are done */
- ret = deflate(&png_ptr->zstream, Z_FINISH);
- /* check for an error */
- if (ret == Z_OK)
- {
- /* check to see if we need more room */
- if (!(png_ptr->zstream.avail_out))
- {
- png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size);
- png_ptr->zstream.next_out = png_ptr->zbuf;
- png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
- }
- }
- else if (ret != Z_STREAM_END)
- {
- if (png_ptr->zstream.msg != NULL)
- png_error(png_ptr, png_ptr->zstream.msg);
- else
- png_error(png_ptr, "zlib error");
- }
- } while (ret != Z_STREAM_END);
-
- /* write any extra space */
- if (png_ptr->zstream.avail_out < png_ptr->zbuf_size)
- {
- png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size -
- png_ptr->zstream.avail_out);
- }
-
- deflateReset(&png_ptr->zstream);
-}
-
-#if defined(PNG_WRITE_INTERLACING_SUPPORTED)
-/* Pick out the correct pixels for the interlace pass.
- * The basic idea here is to go through the row with a source
- * pointer and a destination pointer (sp and dp), and copy the
- * correct pixels for the pass. As the row gets compacted,
- * sp will always be >= dp, so we should never overwrite anything.
- * See the default: case for the easiest code to understand.
- */
-void /* PRIVATE */
-png_do_write_interlace(png_row_infop row_info, png_bytep row, int pass)
-{
-#ifdef PNG_USE_LOCAL_ARRAYS
- /* arrays to facilitate easy interlacing - use pass (0 - 6) as index */
-
- /* start of interlace block */
- int png_pass_start[7] = {0, 4, 0, 2, 0, 1, 0};
-
- /* offset to next interlace block */
- int png_pass_inc[7] = {8, 8, 4, 4, 2, 2, 1};
-#endif
-
- png_debug(1, "in png_do_write_interlace\n");
- /* we don't have to do anything on the last pass (6) */
-#if defined(PNG_USELESS_TESTS_SUPPORTED)
- if (row != NULL && row_info != NULL && pass < 6)
-#else
- if (pass < 6)
-#endif
- {
- /* each pixel depth is handled separately */
- switch (row_info->pixel_depth)
- {
- case 1:
- {
- png_bytep sp;
- png_bytep dp;
- int shift;
- int d;
- int value;
- png_uint_32 i;
- png_uint_32 row_width = row_info->width;
-
- dp = row;
- d = 0;
- shift = 7;
- for (i = png_pass_start[pass]; i < row_width;
- i += png_pass_inc[pass])
- {
- sp = row + (png_size_t)(i >> 3);
- value = (int)(*sp >> (7 - (int)(i & 0x07))) & 0x01;
- d |= (value << shift);
-
- if (shift == 0)
- {
- shift = 7;
- *dp++ = (png_byte)d;
- d = 0;
- }
- else
- shift--;
-
- }
- if (shift != 7)
- *dp = (png_byte)d;
- break;
- }
- case 2:
- {
- png_bytep sp;
- png_bytep dp;
- int shift;
- int d;
- int value;
- png_uint_32 i;
- png_uint_32 row_width = row_info->width;
-
- dp = row;
- shift = 6;
- d = 0;
- for (i = png_pass_start[pass]; i < row_width;
- i += png_pass_inc[pass])
- {
- sp = row + (png_size_t)(i >> 2);
- value = (*sp >> ((3 - (int)(i & 0x03)) << 1)) & 0x03;
- d |= (value << shift);
-
- if (shift == 0)
- {
- shift = 6;
- *dp++ = (png_byte)d;
- d = 0;
- }
- else
- shift -= 2;
- }
- if (shift != 6)
- *dp = (png_byte)d;
- break;
- }
- case 4:
- {
- png_bytep sp;
- png_bytep dp;
- int shift;
- int d;
- int value;
- png_uint_32 i;
- png_uint_32 row_width = row_info->width;
-
- dp = row;
- shift = 4;
- d = 0;
- for (i = png_pass_start[pass]; i < row_width;
- i += png_pass_inc[pass])
- {
- sp = row + (png_size_t)(i >> 1);
- value = (*sp >> ((1 - (int)(i & 0x01)) << 2)) & 0x0f;
- d |= (value << shift);
-
- if (shift == 0)
- {
- shift = 4;
- *dp++ = (png_byte)d;
- d = 0;
- }
- else
- shift -= 4;
- }
- if (shift != 4)
- *dp = (png_byte)d;
- break;
- }
- default:
- {
- png_bytep sp;
- png_bytep dp;
- png_uint_32 i;
- png_uint_32 row_width = row_info->width;
- png_size_t pixel_bytes;
-
- /* start at the beginning */
- dp = row;
- /* find out how many bytes each pixel takes up */
- pixel_bytes = (row_info->pixel_depth >> 3);
- /* loop through the row, only looking at the pixels that
- matter */
- for (i = png_pass_start[pass]; i < row_width;
- i += png_pass_inc[pass])
- {
- /* find out where the original pixel is */
- sp = row + (png_size_t)i * pixel_bytes;
- /* move the pixel */
- if (dp != sp)
- png_memcpy(dp, sp, pixel_bytes);
- /* next pixel */
- dp += pixel_bytes;
- }
- break;
- }
- }
- /* set new row width */
- row_info->width = (row_info->width +
- png_pass_inc[pass] - 1 -
- png_pass_start[pass]) /
- png_pass_inc[pass];
- row_info->rowbytes = ((row_info->width *
- row_info->pixel_depth + 7) >> 3);
- }
-}
-#endif
-
-/* This filters the row, chooses which filter to use, if it has not already
- * been specified by the application, and then writes the row out with the
- * chosen filter.
- */
-#define PNG_MAXSUM (~((png_uint_32)0) >> 1)
-#define PNG_HISHIFT 10
-#define PNG_LOMASK ((png_uint_32)0xffffL)
-#define PNG_HIMASK ((png_uint_32)(~PNG_LOMASK >> PNG_HISHIFT))
-void /* PRIVATE */
-png_write_find_filter(png_structp png_ptr, png_row_infop row_info)
-{
- png_bytep prev_row, best_row, row_buf;
- png_uint_32 mins, bpp;
- png_byte filter_to_do = png_ptr->do_filter;
- png_uint_32 row_bytes = row_info->rowbytes;
-#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
- int num_p_filters = (int)png_ptr->num_prev_filters;
-#endif
-
- png_debug(1, "in png_write_find_filter\n");
- /* find out how many bytes offset each pixel is */
- bpp = (row_info->pixel_depth + 7) / 8;
-
- prev_row = png_ptr->prev_row;
- best_row = row_buf = png_ptr->row_buf;
- mins = PNG_MAXSUM;
-
- /* The prediction method we use is to find which method provides the
- * smallest value when summing the absolute values of the distances
- * from zero, using anything >= 128 as negative numbers. This is known
- * as the "minimum sum of absolute differences" heuristic. Other
- * heuristics are the "weighted minimum sum of absolute differences"
- * (experimental and can in theory improve compression), and the "zlib
- * predictive" method (not implemented yet), which does test compressions
- * of lines using different filter methods, and then chooses the
- * (series of) filter(s) that give minimum compressed data size (VERY
- * computationally expensive).
- *
- * GRR 980525: consider also
- * (1) minimum sum of absolute differences from running average (i.e.,
- * keep running sum of non-absolute differences & count of bytes)
- * [track dispersion, too? restart average if dispersion too large?]
- * (1b) minimum sum of absolute differences from sliding average, probably
- * with window size <= deflate window (usually 32K)
- * (2) minimum sum of squared differences from zero or running average
- * (i.e., ~ root-mean-square approach)
- */
-
-
- /* We don't need to test the 'no filter' case if this is the only filter
- * that has been chosen, as it doesn't actually do anything to the data.
- */
- if ((filter_to_do & PNG_FILTER_NONE) &&
- filter_to_do != PNG_FILTER_NONE)
- {
- png_bytep rp;
- png_uint_32 sum = 0;
- png_uint_32 i;
- int v;
-
- for (i = 0, rp = row_buf + 1; i < row_bytes; i++, rp++)
- {
- v = *rp;
- sum += (v < 128) ? v : 256 - v;
- }
-
-#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
- if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
- {
- png_uint_32 sumhi, sumlo;
- int j;
- sumlo = sum & PNG_LOMASK;
- sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK; /* Gives us some footroom */
-
- /* Reduce the sum if we match any of the previous rows */
- for (j = 0; j < num_p_filters; j++)
- {
- if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_NONE)
- {
- sumlo = (sumlo * png_ptr->filter_weights[j]) >>
- PNG_WEIGHT_SHIFT;
- sumhi = (sumhi * png_ptr->filter_weights[j]) >>
- PNG_WEIGHT_SHIFT;
- }
- }
-
- /* Factor in the cost of this filter (this is here for completeness,
- * but it makes no sense to have a "cost" for the NONE filter, as
- * it has the minimum possible computational cost - none).
- */
- sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_NONE]) >>
- PNG_COST_SHIFT;
- sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_NONE]) >>
- PNG_COST_SHIFT;
-
- if (sumhi > PNG_HIMASK)
- sum = PNG_MAXSUM;
- else
- sum = (sumhi << PNG_HISHIFT) + sumlo;
- }
-#endif
- mins = sum;
- }
-
- /* sub filter */
- if (filter_to_do == PNG_FILTER_SUB)
- /* it's the only filter so no testing is needed */
- {
- png_bytep rp, lp, dp;
- png_uint_32 i;
- for (i = 0, rp = row_buf + 1, dp = png_ptr->sub_row + 1; i < bpp;
- i++, rp++, dp++)
- {
- *dp = *rp;
- }
- for (lp = row_buf + 1; i < row_bytes;
- i++, rp++, lp++, dp++)
- {
- *dp = (png_byte)(((int)*rp - (int)*lp) & 0xff);
- }
- best_row = png_ptr->sub_row;
- }
-
- else if (filter_to_do & PNG_FILTER_SUB)
- {
- png_bytep rp, dp, lp;
- png_uint_32 sum = 0, lmins = mins;
- png_uint_32 i;
- int v;
-
-#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
- /* We temporarily increase the "minimum sum" by the factor we
- * would reduce the sum of this filter, so that we can do the
- * early exit comparison without scaling the sum each time.
- */
- if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
- {
- int j;
- png_uint_32 lmhi, lmlo;
- lmlo = lmins & PNG_LOMASK;
- lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK;
-
- for (j = 0; j < num_p_filters; j++)
- {
- if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_SUB)
- {
- lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >>
- PNG_WEIGHT_SHIFT;
- lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >>
- PNG_WEIGHT_SHIFT;
- }
- }
-
- lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >>
- PNG_COST_SHIFT;
- lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >>
- PNG_COST_SHIFT;
-
- if (lmhi > PNG_HIMASK)
- lmins = PNG_MAXSUM;
- else
- lmins = (lmhi << PNG_HISHIFT) + lmlo;
- }
-#endif
-
- for (i = 0, rp = row_buf + 1, dp = png_ptr->sub_row + 1; i < bpp;
- i++, rp++, dp++)
- {
- v = *dp = *rp;
-
- sum += (v < 128) ? v : 256 - v;
- }
- for (lp = row_buf + 1; i < row_info->rowbytes;
- i++, rp++, lp++, dp++)
- {
- v = *dp = (png_byte)(((int)*rp - (int)*lp) & 0xff);
-
- sum += (v < 128) ? v : 256 - v;
-
- if (sum > lmins) /* We are already worse, don't continue. */
- break;
- }
-
-#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
- if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
- {
- int j;
- png_uint_32 sumhi, sumlo;
- sumlo = sum & PNG_LOMASK;
- sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK;
-
- for (j = 0; j < num_p_filters; j++)
- {
- if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_SUB)
- {
- sumlo = (sumlo * png_ptr->inv_filter_weights[j]) >>
- PNG_WEIGHT_SHIFT;
- sumhi = (sumhi * png_ptr->inv_filter_weights[j]) >>
- PNG_WEIGHT_SHIFT;
- }
- }
-
- sumlo = (sumlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >>
- PNG_COST_SHIFT;
- sumhi = (sumhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_SUB]) >>
- PNG_COST_SHIFT;
-
- if (sumhi > PNG_HIMASK)
- sum = PNG_MAXSUM;
- else
- sum = (sumhi << PNG_HISHIFT) + sumlo;
- }
-#endif
-
- if (sum < mins)
- {
- mins = sum;
- best_row = png_ptr->sub_row;
- }
- }
-
- /* up filter */
- if (filter_to_do == PNG_FILTER_UP)
- {
- png_bytep rp, dp, pp;
- png_uint_32 i;
-
- for (i = 0, rp = row_buf + 1, dp = png_ptr->up_row + 1,
- pp = prev_row + 1; i < row_bytes;
- i++, rp++, pp++, dp++)
- {
- *dp = (png_byte)(((int)*rp - (int)*pp) & 0xff);
- }
- best_row = png_ptr->up_row;
- }
-
- else if (filter_to_do & PNG_FILTER_UP)
- {
- png_bytep rp, dp, pp;
- png_uint_32 sum = 0, lmins = mins;
- png_uint_32 i;
- int v;
-
-
-#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
- if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
- {
- int j;
- png_uint_32 lmhi, lmlo;
- lmlo = lmins & PNG_LOMASK;
- lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK;
-
- for (j = 0; j < num_p_filters; j++)
- {
- if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_UP)
- {
- lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >>
- PNG_WEIGHT_SHIFT;
- lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >>
- PNG_WEIGHT_SHIFT;
- }
- }
-
- lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_UP]) >>
- PNG_COST_SHIFT;
- lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_UP]) >>
- PNG_COST_SHIFT;
-
- if (lmhi > PNG_HIMASK)
- lmins = PNG_MAXSUM;
- else
- lmins = (lmhi << PNG_HISHIFT) + lmlo;
- }
-#endif
-
- for (i = 0, rp = row_buf + 1, dp = png_ptr->up_row + 1,
- pp = prev_row + 1; i < row_bytes; i++)
- {
- v = *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff);
-
- sum += (v < 128) ? v : 256 - v;
-
- if (sum > lmins) /* We are already worse, don't continue. */
- break;
- }
-
-#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
- if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
- {
- int j;
- png_uint_32 sumhi, sumlo;
- sumlo = sum & PNG_LOMASK;
- sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK;
-
- for (j = 0; j < num_p_filters; j++)
- {
- if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_UP)
- {
- sumlo = (sumlo * png_ptr->filter_weights[j]) >>
- PNG_WEIGHT_SHIFT;
- sumhi = (sumhi * png_ptr->filter_weights[j]) >>
- PNG_WEIGHT_SHIFT;
- }
- }
-
- sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_UP]) >>
- PNG_COST_SHIFT;
- sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_UP]) >>
- PNG_COST_SHIFT;
-
- if (sumhi > PNG_HIMASK)
- sum = PNG_MAXSUM;
- else
- sum = (sumhi << PNG_HISHIFT) + sumlo;
- }
-#endif
-
- if (sum < mins)
- {
- mins = sum;
- best_row = png_ptr->up_row;
- }
- }
-
- /* avg filter */
- if (filter_to_do == PNG_FILTER_AVG)
- {
- png_bytep rp, dp, pp, lp;
- png_uint_32 i;
- for (i = 0, rp = row_buf + 1, dp = png_ptr->avg_row + 1,
- pp = prev_row + 1; i < bpp; i++)
- {
- *dp++ = (png_byte)(((int)*rp++ - ((int)*pp++ / 2)) & 0xff);
- }
- for (lp = row_buf + 1; i < row_bytes; i++)
- {
- *dp++ = (png_byte)(((int)*rp++ - (((int)*pp++ + (int)*lp++) / 2))
- & 0xff);
- }
- best_row = png_ptr->avg_row;
- }
-
- else if (filter_to_do & PNG_FILTER_AVG)
- {
- png_bytep rp, dp, pp, lp;
- png_uint_32 sum = 0, lmins = mins;
- png_uint_32 i;
- int v;
-
-#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
- if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
- {
- int j;
- png_uint_32 lmhi, lmlo;
- lmlo = lmins & PNG_LOMASK;
- lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK;
-
- for (j = 0; j < num_p_filters; j++)
- {
- if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_AVG)
- {
- lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >>
- PNG_WEIGHT_SHIFT;
- lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >>
- PNG_WEIGHT_SHIFT;
- }
- }
-
- lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_AVG]) >>
- PNG_COST_SHIFT;
- lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_AVG]) >>
- PNG_COST_SHIFT;
-
- if (lmhi > PNG_HIMASK)
- lmins = PNG_MAXSUM;
- else
- lmins = (lmhi << PNG_HISHIFT) + lmlo;
- }
-#endif
-
- for (i = 0, rp = row_buf + 1, dp = png_ptr->avg_row + 1,
- pp = prev_row + 1; i < bpp; i++)
- {
- v = *dp++ = (png_byte)(((int)*rp++ - ((int)*pp++ / 2)) & 0xff);
-
- sum += (v < 128) ? v : 256 - v;
- }
- for (lp = row_buf + 1; i < row_bytes; i++)
- {
- v = *dp++ =
- (png_byte)(((int)*rp++ - (((int)*pp++ + (int)*lp++) / 2)) & 0xff);
-
- sum += (v < 128) ? v : 256 - v;
-
- if (sum > lmins) /* We are already worse, don't continue. */
- break;
- }
-
-#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
- if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
- {
- int j;
- png_uint_32 sumhi, sumlo;
- sumlo = sum & PNG_LOMASK;
- sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK;
-
- for (j = 0; j < num_p_filters; j++)
- {
- if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_NONE)
- {
- sumlo = (sumlo * png_ptr->filter_weights[j]) >>
- PNG_WEIGHT_SHIFT;
- sumhi = (sumhi * png_ptr->filter_weights[j]) >>
- PNG_WEIGHT_SHIFT;
- }
- }
-
- sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_AVG]) >>
- PNG_COST_SHIFT;
- sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_AVG]) >>
- PNG_COST_SHIFT;
-
- if (sumhi > PNG_HIMASK)
- sum = PNG_MAXSUM;
- else
- sum = (sumhi << PNG_HISHIFT) + sumlo;
- }
-#endif
-
- if (sum < mins)
- {
- mins = sum;
- best_row = png_ptr->avg_row;
- }
- }
-
- /* Paeth filter */
- if (filter_to_do == PNG_FILTER_PAETH)
- {
- png_bytep rp, dp, pp, cp, lp;
- png_uint_32 i;
- for (i = 0, rp = row_buf + 1, dp = png_ptr->paeth_row + 1,
- pp = prev_row + 1; i < bpp; i++)
- {
- *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff);
- }
-
- for (lp = row_buf + 1, cp = prev_row + 1; i < row_bytes; i++)
- {
- int a, b, c, pa, pb, pc, p;
-
- b = *pp++;
- c = *cp++;
- a = *lp++;
-
- p = b - c;
- pc = a - c;
-
-#ifdef PNG_USE_ABS
- pa = abs(p);
- pb = abs(pc);
- pc = abs(p + pc);
-#else
- pa = p < 0 ? -p : p;
- pb = pc < 0 ? -pc : pc;
- pc = (p + pc) < 0 ? -(p + pc) : p + pc;
-#endif
-
- p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c;
-
- *dp++ = (png_byte)(((int)*rp++ - p) & 0xff);
- }
- best_row = png_ptr->paeth_row;
- }
-
- else if (filter_to_do & PNG_FILTER_PAETH)
- {
- png_bytep rp, dp, pp, cp, lp;
- png_uint_32 sum = 0, lmins = mins;
- png_uint_32 i;
- int v;
-
-#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
- if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
- {
- int j;
- png_uint_32 lmhi, lmlo;
- lmlo = lmins & PNG_LOMASK;
- lmhi = (lmins >> PNG_HISHIFT) & PNG_HIMASK;
-
- for (j = 0; j < num_p_filters; j++)
- {
- if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_PAETH)
- {
- lmlo = (lmlo * png_ptr->inv_filter_weights[j]) >>
- PNG_WEIGHT_SHIFT;
- lmhi = (lmhi * png_ptr->inv_filter_weights[j]) >>
- PNG_WEIGHT_SHIFT;
- }
- }
-
- lmlo = (lmlo * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_PAETH]) >>
- PNG_COST_SHIFT;
- lmhi = (lmhi * png_ptr->inv_filter_costs[PNG_FILTER_VALUE_PAETH]) >>
- PNG_COST_SHIFT;
-
- if (lmhi > PNG_HIMASK)
- lmins = PNG_MAXSUM;
- else
- lmins = (lmhi << PNG_HISHIFT) + lmlo;
- }
-#endif
-
- for (i = 0, rp = row_buf + 1, dp = png_ptr->paeth_row + 1,
- pp = prev_row + 1; i < bpp; i++)
- {
- v = *dp++ = (png_byte)(((int)*rp++ - (int)*pp++) & 0xff);
-
- sum += (v < 128) ? v : 256 - v;
- }
-
- for (lp = row_buf + 1, cp = prev_row + 1; i < row_bytes; i++)
- {
- int a, b, c, pa, pb, pc, p;
-
- b = *pp++;
- c = *cp++;
- a = *lp++;
-
-#ifndef PNG_SLOW_PAETH
- p = b - c;
- pc = a - c;
-#ifdef PNG_USE_ABS
- pa = abs(p);
- pb = abs(pc);
- pc = abs(p + pc);
-#else
- pa = p < 0 ? -p : p;
- pb = pc < 0 ? -pc : pc;
- pc = (p + pc) < 0 ? -(p + pc) : p + pc;
-#endif
- p = (pa <= pb && pa <=pc) ? a : (pb <= pc) ? b : c;
-#else /* PNG_SLOW_PAETH */
- p = a + b - c;
- pa = abs(p - a);
- pb = abs(p - b);
- pc = abs(p - c);
- if (pa <= pb && pa <= pc)
- p = a;
- else if (pb <= pc)
- p = b;
- else
- p = c;
-#endif /* PNG_SLOW_PAETH */
-
- v = *dp++ = (png_byte)(((int)*rp++ - p) & 0xff);
-
- sum += (v < 128) ? v : 256 - v;
-
- if (sum > lmins) /* We are already worse, don't continue. */
- break;
- }
-
-#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
- if (png_ptr->heuristic_method == PNG_FILTER_HEURISTIC_WEIGHTED)
- {
- int j;
- png_uint_32 sumhi, sumlo;
- sumlo = sum & PNG_LOMASK;
- sumhi = (sum >> PNG_HISHIFT) & PNG_HIMASK;
-
- for (j = 0; j < num_p_filters; j++)
- {
- if (png_ptr->prev_filters[j] == PNG_FILTER_VALUE_PAETH)
- {
- sumlo = (sumlo * png_ptr->filter_weights[j]) >>
- PNG_WEIGHT_SHIFT;
- sumhi = (sumhi * png_ptr->filter_weights[j]) >>
- PNG_WEIGHT_SHIFT;
- }
- }
-
- sumlo = (sumlo * png_ptr->filter_costs[PNG_FILTER_VALUE_PAETH]) >>
- PNG_COST_SHIFT;
- sumhi = (sumhi * png_ptr->filter_costs[PNG_FILTER_VALUE_PAETH]) >>
- PNG_COST_SHIFT;
-
- if (sumhi > PNG_HIMASK)
- sum = PNG_MAXSUM;
- else
- sum = (sumhi << PNG_HISHIFT) + sumlo;
- }
-#endif
-
- if (sum < mins)
- {
- best_row = png_ptr->paeth_row;
- }
- }
-
- /* Do the actual writing of the filtered row data from the chosen filter. */
-
- png_write_filtered_row(png_ptr, best_row);
-
-#if defined(PNG_WRITE_WEIGHTED_FILTER_SUPPORTED)
- /* Save the type of filter we picked this time for future calculations */
- if (png_ptr->num_prev_filters > 0)
- {
- int j;
- for (j = 1; j < num_p_filters; j++)
- {
- png_ptr->prev_filters[j] = png_ptr->prev_filters[j - 1];
- }
- png_ptr->prev_filters[j] = best_row[0];
- }
-#endif
-}
-
-
-/* Do the actual writing of a previously filtered row. */
-void /* PRIVATE */
-png_write_filtered_row(png_structp png_ptr, png_bytep filtered_row)
-{
- png_debug(1, "in png_write_filtered_row\n");
- png_debug1(2, "filter = %d\n", filtered_row[0]);
- /* set up the zlib input buffer */
-
- png_ptr->zstream.next_in = filtered_row;
- png_ptr->zstream.avail_in = (uInt)png_ptr->row_info.rowbytes + 1;
- /* repeat until we have compressed all the data */
- do
- {
- int ret; /* return of zlib */
-
- /* compress the data */
- ret = deflate(&png_ptr->zstream, Z_NO_FLUSH);
- /* check for compression errors */
- if (ret != Z_OK)
- {
- if (png_ptr->zstream.msg != NULL)
- png_error(png_ptr, png_ptr->zstream.msg);
- else
- png_error(png_ptr, "zlib error");
- }
-
- /* see if it is time to write another IDAT */
- if (!(png_ptr->zstream.avail_out))
- {
- /* write the IDAT and reset the zlib output buffer */
- png_write_IDAT(png_ptr, png_ptr->zbuf, png_ptr->zbuf_size);
- png_ptr->zstream.next_out = png_ptr->zbuf;
- png_ptr->zstream.avail_out = (uInt)png_ptr->zbuf_size;
- }
- /* repeat until all data has been compressed */
- } while (png_ptr->zstream.avail_in);
-
- /* swap the current and previous rows */
- if (png_ptr->prev_row != NULL)
- {
- png_bytep tptr;
-
- tptr = png_ptr->prev_row;
- png_ptr->prev_row = png_ptr->row_buf;
- png_ptr->row_buf = tptr;
- }
-
- /* finish row - updates counters and flushes zlib if last row */
- png_write_finish_row(png_ptr);
-
-#if defined(PNG_WRITE_FLUSH_SUPPORTED)
- png_ptr->flush_rows++;
-
- if (png_ptr->flush_dist > 0 &&
- png_ptr->flush_rows >= png_ptr->flush_dist)
- {
- png_write_flush(png_ptr);
- }
-#endif
-}
-#endif /* PNG_WRITE_SUPPORTED */
diff --git a/libpng/trees.c b/libpng/trees.c
deleted file mode 100644
index 6125d6b..0000000
--- a/libpng/trees.c
+++ /dev/null
@@ -1,1204 +0,0 @@
-/* trees.c -- output deflated data using Huffman coding
- * Copyright (C) 1995-2002 Jean-loup Gailly
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/*
- * ALGORITHM
- *
- * The "deflation" process uses several Huffman trees. The more
- * common source values are represented by shorter bit sequences.
- *
- * Each code tree is stored in a compressed form which is itself
- * a Huffman encoding of the lengths of all the code strings (in
- * ascending order by source values). The actual code strings are
- * reconstructed from the lengths in the inflate process, as described
- * in the deflate specification.
- *
- * REFERENCES
- *
- * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification".
- * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc
- *
- * Storer, James A.
- * Data Compression: Methods and Theory, pp. 49-50.
- * Computer Science Press, 1988. ISBN 0-7167-8156-5.
- *
- * Sedgewick, R.
- * Algorithms, p290.
- * Addison-Wesley, 1983. ISBN 0-201-06672-6.
- */
-
-/* @(#) $Id$ */
-
-/* #define GEN_TREES_H */
-
-#include "deflate.h"
-
-#ifdef DEBUG
-# include <ctype.h>
-#endif
-
-/* ===========================================================================
- * Constants
- */
-
-#define MAX_BL_BITS 7
-/* Bit length codes must not exceed MAX_BL_BITS bits */
-
-#define END_BLOCK 256
-/* end of block literal code */
-
-#define REP_3_6 16
-/* repeat previous bit length 3-6 times (2 bits of repeat count) */
-
-#define REPZ_3_10 17
-/* repeat a zero length 3-10 times (3 bits of repeat count) */
-
-#define REPZ_11_138 18
-/* repeat a zero length 11-138 times (7 bits of repeat count) */
-
-local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */
- = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0};
-
-local const int extra_dbits[D_CODES] /* extra bits for each distance code */
- = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};
-
-local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */
- = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7};
-
-local const uch bl_order[BL_CODES]
- = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15};
-/* The lengths of the bit length codes are sent in order of decreasing
- * probability, to avoid transmitting the lengths for unused bit length codes.
- */
-
-#define Buf_size (8 * 2*sizeof(char))
-/* Number of bits used within bi_buf. (bi_buf might be implemented on
- * more than 16 bits on some systems.)
- */
-
-/* ===========================================================================
- * Local data. These are initialized only once.
- */
-
-#define DIST_CODE_LEN 512 /* see definition of array dist_code below */
-
-#if defined(GEN_TREES_H) || !defined(STDC)
-/* non ANSI compilers may not accept trees.h */
-
-local ct_data static_ltree[L_CODES+2];
-/* The static literal tree. Since the bit lengths are imposed, there is no
- * need for the L_CODES extra codes used during heap construction. However
- * The codes 286 and 287 are needed to build a canonical tree (see _tr_init
- * below).
- */
-
-local ct_data static_dtree[D_CODES];
-/* The static distance tree. (Actually a trivial tree since all codes use
- * 5 bits.)
- */
-
-uch _dist_code[DIST_CODE_LEN];
-/* Distance codes. The first 256 values correspond to the distances
- * 3 .. 258, the last 256 values correspond to the top 8 bits of
- * the 15 bit distances.
- */
-
-uch _length_code[MAX_MATCH-MIN_MATCH+1];
-/* length code for each normalized match length (0 == MIN_MATCH) */
-
-local int base_length[LENGTH_CODES];
-/* First normalized length for each code (0 = MIN_MATCH) */
-
-local int base_dist[D_CODES];
-/* First normalized distance for each code (0 = distance of 1) */
-
-#else
-# include "trees.h"
-#endif /* GEN_TREES_H */
-
-struct static_tree_desc_s {
- const ct_data *static_tree; /* static tree or NULL */
- const intf *extra_bits; /* extra bits for each code or NULL */
- int extra_base; /* base index for extra_bits */
- int elems; /* max number of elements in the tree */
- int max_length; /* max bit length for the codes */
-};
-
-local static_tree_desc static_l_desc =
-{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS};
-
-local static_tree_desc static_d_desc =
-{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS};
-
-local static_tree_desc static_bl_desc =
-{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS};
-
-/* ===========================================================================
- * Local (static) routines in this file.
- */
-
-local void tr_static_init OF((void));
-local void init_block OF((deflate_state *s));
-local void pqdownheap OF((deflate_state *s, ct_data *tree, int k));
-local void gen_bitlen OF((deflate_state *s, tree_desc *desc));
-local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count));
-local void build_tree OF((deflate_state *s, tree_desc *desc));
-local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code));
-local void send_tree OF((deflate_state *s, ct_data *tree, int max_code));
-local int build_bl_tree OF((deflate_state *s));
-local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes,
- int blcodes));
-local void compress_block OF((deflate_state *s, ct_data *ltree,
- ct_data *dtree));
-local void set_data_type OF((deflate_state *s));
-local unsigned bi_reverse OF((unsigned value, int length));
-local void bi_windup OF((deflate_state *s));
-local void bi_flush OF((deflate_state *s));
-local void copy_block OF((deflate_state *s, charf *buf, unsigned len,
- int header));
-
-#ifdef GEN_TREES_H
-local void gen_trees_header OF((void));
-#endif
-
-#ifndef DEBUG
-# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len)
- /* Send a code of the given tree. c and tree must not have side effects */
-
-#else /* DEBUG */
-# define send_code(s, c, tree) \
- { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \
- send_bits(s, tree[c].Code, tree[c].Len); }
-#endif
-
-/* ===========================================================================
- * Output a short LSB first on the stream.
- * IN assertion: there is enough room in pendingBuf.
- */
-#define put_short(s, w) { \
- put_byte(s, (uch)((w) & 0xff)); \
- put_byte(s, (uch)((ush)(w) >> 8)); \
-}
-
-/* ===========================================================================
- * Send a value on a given number of bits.
- * IN assertion: length <= 16 and value fits in length bits.
- */
-#ifdef DEBUG
-local void send_bits OF((deflate_state *s, int value, int length));
-
-local void send_bits(deflate_state s, int value, int length)
-{
- Tracevv((stderr," l %2d v %4x ", length, value));
- Assert(length > 0 && length <= 15, "invalid length");
- s->bits_sent += (ulg)length;
-
- /* If not enough room in bi_buf, use (valid) bits from bi_buf and
- * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid))
- * unused bits in value.
- */
- if (s->bi_valid > (int)Buf_size - length) {
- s->bi_buf |= (value << s->bi_valid);
- put_short(s, s->bi_buf);
- s->bi_buf = (ush)value >> (Buf_size - s->bi_valid);
- s->bi_valid += length - Buf_size;
- } else {
- s->bi_buf |= value << s->bi_valid;
- s->bi_valid += length;
- }
-}
-#else /* !DEBUG */
-
-#define send_bits(s, value, length) \
-{ int len = length;\
- if (s->bi_valid > (int)Buf_size - len) {\
- int val = value;\
- s->bi_buf |= (val << s->bi_valid);\
- put_short(s, s->bi_buf);\
- s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\
- s->bi_valid += len - Buf_size;\
- } else {\
- s->bi_buf |= (value) << s->bi_valid;\
- s->bi_valid += len;\
- }\
-}
-#endif /* DEBUG */
-
-
-#define MAX(a,b) (a >= b ? a : b)
-/* the arguments must not have side effects */
-
-/* ===========================================================================
- * Initialize the various 'constant' tables.
- */
-local void tr_static_init(void)
-{
-#if defined(GEN_TREES_H) || !defined(STDC)
- static int static_init_done = 0;
- int n; /* iterates over tree elements */
- int bits; /* bit counter */
- int length; /* length value */
- int code; /* code value */
- int dist; /* distance index */
- ush bl_count[MAX_BITS+1];
- /* number of codes at each bit length for an optimal tree */
-
- if (static_init_done) return;
-
- /* For some embedded targets, global variables are not initialized: */
- static_l_desc.static_tree = static_ltree;
- static_l_desc.extra_bits = extra_lbits;
- static_d_desc.static_tree = static_dtree;
- static_d_desc.extra_bits = extra_dbits;
- static_bl_desc.extra_bits = extra_blbits;
-
- /* Initialize the mapping length (0..255) -> length code (0..28) */
- length = 0;
- for (code = 0; code < LENGTH_CODES-1; code++) {
- base_length[code] = length;
- for (n = 0; n < (1<<extra_lbits[code]); n++) {
- _length_code[length++] = (uch)code;
- }
- }
- Assert (length == 256, "tr_static_init: length != 256");
- /* Note that the length 255 (match length 258) can be represented
- * in two different ways: code 284 + 5 bits or code 285, so we
- * overwrite length_code[255] to use the best encoding:
- */
- _length_code[length-1] = (uch)code;
-
- /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
- dist = 0;
- for (code = 0 ; code < 16; code++) {
- base_dist[code] = dist;
- for (n = 0; n < (1<<extra_dbits[code]); n++) {
- _dist_code[dist++] = (uch)code;
- }
- }
- Assert (dist == 256, "tr_static_init: dist != 256");
- dist >>= 7; /* from now on, all distances are divided by 128 */
- for ( ; code < D_CODES; code++) {
- base_dist[code] = dist << 7;
- for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {
- _dist_code[256 + dist++] = (uch)code;
- }
- }
- Assert (dist == 256, "tr_static_init: 256+dist != 512");
-
- /* Construct the codes of the static literal tree */
- for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0;
- n = 0;
- while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++;
- while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++;
- while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++;
- while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++;
- /* Codes 286 and 287 do not exist, but we must include them in the
- * tree construction to get a canonical Huffman tree (longest code
- * all ones)
- */
- gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count);
-
- /* The static distance tree is trivial: */
- for (n = 0; n < D_CODES; n++) {
- static_dtree[n].Len = 5;
- static_dtree[n].Code = bi_reverse((unsigned)n, 5);
- }
- static_init_done = 1;
-
-# ifdef GEN_TREES_H
- gen_trees_header();
-# endif
-#endif /* defined(GEN_TREES_H) || !defined(STDC) */
-}
-
-/* ===========================================================================
- * Genererate the file trees.h describing the static trees.
- */
-#ifdef GEN_TREES_H
-# ifndef DEBUG
-# include <stdio.h>
-# endif
-
-# define SEPARATOR(i, last, width) \
- ((i) == (last)? "\n};\n\n" : \
- ((i) % (width) == (width)-1 ? ",\n" : ", "))
-
-void gen_trees_header()
-{
- FILE *header = fopen("trees.h", "w");
- int i;
-
- Assert (header != NULL, "Can't open trees.h");
- fprintf(header,
- "/* header created automatically with -DGEN_TREES_H */\n\n");
-
- fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n");
- for (i = 0; i < L_CODES+2; i++) {
- fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code,
- static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5));
- }
-
- fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n");
- for (i = 0; i < D_CODES; i++) {
- fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code,
- static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5));
- }
-
- fprintf(header, "const uch _dist_code[DIST_CODE_LEN] = {\n");
- for (i = 0; i < DIST_CODE_LEN; i++) {
- fprintf(header, "%2u%s", _dist_code[i],
- SEPARATOR(i, DIST_CODE_LEN-1, 20));
- }
-
- fprintf(header, "const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {\n");
- for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) {
- fprintf(header, "%2u%s", _length_code[i],
- SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20));
- }
-
- fprintf(header, "local const int base_length[LENGTH_CODES] = {\n");
- for (i = 0; i < LENGTH_CODES; i++) {
- fprintf(header, "%1u%s", base_length[i],
- SEPARATOR(i, LENGTH_CODES-1, 20));
- }
-
- fprintf(header, "local const int base_dist[D_CODES] = {\n");
- for (i = 0; i < D_CODES; i++) {
- fprintf(header, "%5u%s", base_dist[i],
- SEPARATOR(i, D_CODES-1, 10));
- }
-
- fclose(header);
-}
-#endif /* GEN_TREES_H */
-
-/* ===========================================================================
- * Initialize the tree data structures for a new zlib stream.
- */
-void _tr_init(deflate_state *s)
-{
- tr_static_init();
-
- s->l_desc.dyn_tree = s->dyn_ltree;
- s->l_desc.stat_desc = &static_l_desc;
-
- s->d_desc.dyn_tree = s->dyn_dtree;
- s->d_desc.stat_desc = &static_d_desc;
-
- s->bl_desc.dyn_tree = s->bl_tree;
- s->bl_desc.stat_desc = &static_bl_desc;
-
- s->bi_buf = 0;
- s->bi_valid = 0;
- s->last_eob_len = 8; /* enough lookahead for inflate */
-#ifdef DEBUG
- s->compressed_len = 0L;
- s->bits_sent = 0L;
-#endif
-
- /* Initialize the first block of the first file: */
- init_block(s);
-}
-
-/* ===========================================================================
- * Initialize a new block.
- */
-local void init_block(deflate_state *s)
-{
- int n; /* iterates over tree elements */
-
- /* Initialize the trees. */
- for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0;
- for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0;
- for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0;
-
- s->dyn_ltree[END_BLOCK].Freq = 1;
- s->opt_len = s->static_len = 0L;
- s->last_lit = s->matches = 0;
-}
-
-#define SMALLEST 1
-/* Index within the heap array of least frequent node in the Huffman tree */
-
-
-/* ===========================================================================
- * Remove the smallest element from the heap and recreate the heap with
- * one less element. Updates heap and heap_len.
- */
-#define pqremove(s, tree, top) \
-{\
- top = s->heap[SMALLEST]; \
- s->heap[SMALLEST] = s->heap[s->heap_len--]; \
- pqdownheap(s, tree, SMALLEST); \
-}
-
-/* ===========================================================================
- * Compares to subtrees, using the tree depth as tie breaker when
- * the subtrees have equal frequency. This minimizes the worst case length.
- */
-#define smaller(tree, n, m, depth) \
- (tree[n].Freq < tree[m].Freq || \
- (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m]))
-
-/* ===========================================================================
- * Restore the heap property by moving down the tree starting at node k,
- * exchanging a node with the smallest of its two sons if necessary, stopping
- * when the heap property is re-established (each father smaller than its
- * two sons).
- */
-local void pqdownheap(deflate_state *s, ct_data *tree, int k)
-
- /* the tree to restore */
- /* node to move down */
-{
- int v = s->heap[k];
- int j = k << 1; /* left son of k */
- while (j <= s->heap_len) {
- /* Set j to the smallest of the two sons: */
- if (j < s->heap_len &&
- smaller(tree, s->heap[j+1], s->heap[j], s->depth)) {
- j++;
- }
- /* Exit if v is smaller than both sons */
- if (smaller(tree, v, s->heap[j], s->depth)) break;
-
- /* Exchange v with the smallest son */
- s->heap[k] = s->heap[j]; k = j;
-
- /* And continue down the tree, setting j to the left son of k */
- j <<= 1;
- }
- s->heap[k] = v;
-}
-
-/* ===========================================================================
- * Compute the optimal bit lengths for a tree and update the total bit length
- * for the current block.
- * IN assertion: the fields freq and dad are set, heap[heap_max] and
- * above are the tree nodes sorted by increasing frequency.
- * OUT assertions: the field len is set to the optimal bit length, the
- * array bl_count contains the frequencies for each bit length.
- * The length opt_len is updated; static_len is also updated if stree is
- * not null.
- */
-local void gen_bitlen(deflate_state *s, tree_desc *desc)
-
- /* the tree descriptor */
-{
- ct_data *tree = desc->dyn_tree;
- int max_code = desc->max_code;
- const ct_data *stree = desc->stat_desc->static_tree;
- const intf *extra = desc->stat_desc->extra_bits;
- int base = desc->stat_desc->extra_base;
- int max_length = desc->stat_desc->max_length;
- int h; /* heap index */
- int n, m; /* iterate over the tree elements */
- int bits; /* bit length */
- int xbits; /* extra bits */
- ush f; /* frequency */
- int overflow = 0; /* number of elements with bit length too large */
-
- for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0;
-
- /* In a first pass, compute the optimal bit lengths (which may
- * overflow in the case of the bit length tree).
- */
- tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */
-
- for (h = s->heap_max+1; h < HEAP_SIZE; h++) {
- n = s->heap[h];
- bits = tree[tree[n].Dad].Len + 1;
- if (bits > max_length) bits = max_length, overflow++;
- tree[n].Len = (ush)bits;
- /* We overwrite tree[n].Dad which is no longer needed */
-
- if (n > max_code) continue; /* not a leaf node */
-
- s->bl_count[bits]++;
- xbits = 0;
- if (n >= base) xbits = extra[n-base];
- f = tree[n].Freq;
- s->opt_len += (ulg)f * (bits + xbits);
- if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits);
- }
- if (overflow == 0) return;
-
- Trace((stderr,"\nbit length overflow\n"));
- /* This happens for example on obj2 and pic of the Calgary corpus */
-
- /* Find the first bit length which could increase: */
- do {
- bits = max_length-1;
- while (s->bl_count[bits] == 0) bits--;
- s->bl_count[bits]--; /* move one leaf down the tree */
- s->bl_count[bits+1] += 2; /* move one overflow item as its brother */
- s->bl_count[max_length]--;
- /* The brother of the overflow item also moves one step up,
- * but this does not affect bl_count[max_length]
- */
- overflow -= 2;
- } while (overflow > 0);
-
- /* Now recompute all bit lengths, scanning in increasing frequency.
- * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
- * lengths instead of fixing only the wrong ones. This idea is taken
- * from 'ar' written by Haruhiko Okumura.)
- */
- for (bits = max_length; bits != 0; bits--) {
- n = s->bl_count[bits];
- while (n != 0) {
- m = s->heap[--h];
- if (m > max_code) continue;
- if (tree[m].Len != (unsigned) bits) {
- Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
- s->opt_len += ((long)bits - (long)tree[m].Len)
- *(long)tree[m].Freq;
- tree[m].Len = (ush)bits;
- }
- n--;
- }
- }
-}
-
-/* ===========================================================================
- * Generate the codes for a given tree and bit counts (which need not be
- * optimal).
- * IN assertion: the array bl_count contains the bit length statistics for
- * the given tree and the field len is set for all tree elements.
- * OUT assertion: the field code is set for all tree elements of non
- * zero code length.
- */
-local void gen_codes (ct_data *tree, int max_code, ushf *bl_count)
- /* the tree to decorate */
- /* largest code with non zero frequency */
- /* number of codes at each bit length */
-{
- ush next_code[MAX_BITS+1]; /* next code value for each bit length */
- ush code = 0; /* running code value */
- int bits; /* bit index */
- int n; /* code index */
-
- /* The distribution counts are first used to generate the code values
- * without bit reversal.
- */
- for (bits = 1; bits <= MAX_BITS; bits++) {
- next_code[bits] = code = (code + bl_count[bits-1]) << 1;
- }
- /* Check that the bit counts in bl_count are consistent. The last code
- * must be all ones.
- */
- Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
- "inconsistent bit counts");
- Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
-
- for (n = 0; n <= max_code; n++) {
- int len = tree[n].Len;
- if (len == 0) continue;
- /* Now reverse the bits */
- tree[n].Code = bi_reverse(next_code[len]++, len);
-
- Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
- n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
- }
-}
-
-/* ===========================================================================
- * Construct one Huffman tree and assigns the code bit strings and lengths.
- * Update the total bit length for the current block.
- * IN assertion: the field freq is set for all tree elements.
- * OUT assertions: the fields len and code are set to the optimal bit length
- * and corresponding code. The length opt_len is updated; static_len is
- * also updated if stree is not null. The field max_code is set.
- */
-local void build_tree(deflate_state *s, tree_desc *desc)
-
- /* the tree descriptor */
-{
- ct_data *tree = desc->dyn_tree;
- const ct_data *stree = desc->stat_desc->static_tree;
- int elems = desc->stat_desc->elems;
- int n, m; /* iterate over heap elements */
- int max_code = -1; /* largest code with non zero frequency */
- int node; /* new node being created */
-
- /* Construct the initial heap, with least frequent element in
- * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
- * heap[0] is not used.
- */
- s->heap_len = 0, s->heap_max = HEAP_SIZE;
-
- for (n = 0; n < elems; n++) {
- if (tree[n].Freq != 0) {
- s->heap[++(s->heap_len)] = max_code = n;
- s->depth[n] = 0;
- } else {
- tree[n].Len = 0;
- }
- }
-
- /* The pkzip format requires that at least one distance code exists,
- * and that at least one bit should be sent even if there is only one
- * possible code. So to avoid special checks later on we force at least
- * two codes of non zero frequency.
- */
- while (s->heap_len < 2) {
- node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0);
- tree[node].Freq = 1;
- s->depth[node] = 0;
- s->opt_len--; if (stree) s->static_len -= stree[node].Len;
- /* node is 0 or 1 so it does not have extra bits */
- }
- desc->max_code = max_code;
-
- /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
- * establish sub-heaps of increasing lengths:
- */
- for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n);
-
- /* Construct the Huffman tree by repeatedly combining the least two
- * frequent nodes.
- */
- node = elems; /* next internal node of the tree */
- do {
- pqremove(s, tree, n); /* n = node of least frequency */
- m = s->heap[SMALLEST]; /* m = node of next least frequency */
-
- s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */
- s->heap[--(s->heap_max)] = m;
-
- /* Create a new node father of n and m */
- tree[node].Freq = tree[n].Freq + tree[m].Freq;
- s->depth[node] = (uch) (MAX(s->depth[n], s->depth[m]) + 1);
- tree[n].Dad = tree[m].Dad = (ush)node;
-#ifdef DUMP_BL_TREE
- if (tree == s->bl_tree) {
- fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)",
- node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq);
- }
-#endif
- /* and insert the new node in the heap */
- s->heap[SMALLEST] = node++;
- pqdownheap(s, tree, SMALLEST);
-
- } while (s->heap_len >= 2);
-
- s->heap[--(s->heap_max)] = s->heap[SMALLEST];
-
- /* At this point, the fields freq and dad are set. We can now
- * generate the bit lengths.
- */
- gen_bitlen(s, (tree_desc *)desc);
-
- /* The field len is now set, we can generate the bit codes */
- gen_codes ((ct_data *)tree, max_code, s->bl_count);
-}
-
-/* ===========================================================================
- * Scan a literal or distance tree to determine the frequencies of the codes
- * in the bit length tree.
- */
-local void scan_tree (deflate_state *s, ct_data *tree, int max_code)
-
- /* the tree to be scanned */
- /* and its largest code of non zero frequency */
-{
- int n; /* iterates over all tree elements */
- int prevlen = -1; /* last emitted length */
- int curlen; /* length of current code */
- int nextlen = tree[0].Len; /* length of next code */
- int count = 0; /* repeat count of the current code */
- int max_count = 7; /* max repeat count */
- int min_count = 4; /* min repeat count */
-
- if (nextlen == 0) max_count = 138, min_count = 3;
- tree[max_code+1].Len = (ush)0xffff; /* guard */
-
- for (n = 0; n <= max_code; n++) {
- curlen = nextlen; nextlen = tree[n+1].Len;
- if (++count < max_count && curlen == nextlen) {
- continue;
- } else if (count < min_count) {
- s->bl_tree[curlen].Freq += count;
- } else if (curlen != 0) {
- if (curlen != prevlen) s->bl_tree[curlen].Freq++;
- s->bl_tree[REP_3_6].Freq++;
- } else if (count <= 10) {
- s->bl_tree[REPZ_3_10].Freq++;
- } else {
- s->bl_tree[REPZ_11_138].Freq++;
- }
- count = 0; prevlen = curlen;
- if (nextlen == 0) {
- max_count = 138, min_count = 3;
- } else if (curlen == nextlen) {
- max_count = 6, min_count = 3;
- } else {
- max_count = 7, min_count = 4;
- }
- }
-}
-
-/* ===========================================================================
- * Send a literal or distance tree in compressed form, using the codes in
- * bl_tree.
- */
-local void send_tree (deflate_state *s, ct_data *tree, int max_code)
-
- /* the tree to be scanned */
- /* and its largest code of non zero frequency */
-{
- int n; /* iterates over all tree elements */
- int prevlen = -1; /* last emitted length */
- int curlen; /* length of current code */
- int nextlen = tree[0].Len; /* length of next code */
- int count = 0; /* repeat count of the current code */
- int max_count = 7; /* max repeat count */
- int min_count = 4; /* min repeat count */
-
- /* tree[max_code+1].Len = -1; */ /* guard already set */
- if (nextlen == 0) max_count = 138, min_count = 3;
-
- for (n = 0; n <= max_code; n++) {
- curlen = nextlen; nextlen = tree[n+1].Len;
- if (++count < max_count && curlen == nextlen) {
- continue;
- } else if (count < min_count) {
- do { send_code(s, curlen, s->bl_tree); } while (--count != 0);
-
- } else if (curlen != 0) {
- if (curlen != prevlen) {
- send_code(s, curlen, s->bl_tree); count--;
- }
- Assert(count >= 3 && count <= 6, " 3_6?");
- send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2);
-
- } else if (count <= 10) {
- send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3);
-
- } else {
- send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7);
- }
- count = 0; prevlen = curlen;
- if (nextlen == 0) {
- max_count = 138, min_count = 3;
- } else if (curlen == nextlen) {
- max_count = 6, min_count = 3;
- } else {
- max_count = 7, min_count = 4;
- }
- }
-}
-
-/* ===========================================================================
- * Construct the Huffman tree for the bit lengths and return the index in
- * bl_order of the last bit length code to send.
- */
-local int build_bl_tree(deflate_state *s)
-{
- int max_blindex; /* index of last bit length code of non zero freq */
-
- /* Determine the bit length frequencies for literal and distance trees */
- scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code);
- scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code);
-
- /* Build the bit length tree: */
- build_tree(s, (tree_desc *)(&(s->bl_desc)));
- /* opt_len now includes the length of the tree representations, except
- * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
- */
-
- /* Determine the number of bit length codes to send. The pkzip format
- * requires that at least 4 bit length codes be sent. (appnote.txt says
- * 3 but the actual value used is 4.)
- */
- for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) {
- if (s->bl_tree[bl_order[max_blindex]].Len != 0) break;
- }
- /* Update opt_len to include the bit length tree and counts */
- s->opt_len += 3*(max_blindex+1) + 5+5+4;
- Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
- s->opt_len, s->static_len));
-
- return max_blindex;
-}
-
-/* ===========================================================================
- * Send the header for a block using dynamic Huffman trees: the counts, the
- * lengths of the bit length codes, the literal tree and the distance tree.
- * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
- */
-local void send_all_trees(deflate_state *s, int lcodes, int dcodes, int blcodes)
-
- /* number of codes for each tree */
-{
- int rank; /* index in bl_order */
-
- Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
- Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
- "too many codes");
- Tracev((stderr, "\nbl counts: "));
- send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */
- send_bits(s, dcodes-1, 5);
- send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */
- for (rank = 0; rank < blcodes; rank++) {
- Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
- send_bits(s, s->bl_tree[bl_order[rank]].Len, 3);
- }
- Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
-
- send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */
- Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
-
- send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */
- Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
-}
-
-/* ===========================================================================
- * Send a stored block
- */
-void _tr_stored_block(deflate_state *s, charf *buf, ulg stored_len, int eof)
-
- /* input block */
- /* length of input block */
- /* true if this is the last block for a file */
-{
- send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */
-#ifdef DEBUG
- s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L;
- s->compressed_len += (stored_len + 4) << 3;
-#endif
- copy_block(s, buf, (unsigned)stored_len, 1); /* with header */
-}
-
-/* ===========================================================================
- * Send one empty static block to give enough lookahead for inflate.
- * This takes 10 bits, of which 7 may remain in the bit buffer.
- * The current inflate code requires 9 bits of lookahead. If the
- * last two codes for the previous block (real code plus EOB) were coded
- * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode
- * the last real code. In this case we send two empty static blocks instead
- * of one. (There are no problems if the previous block is stored or fixed.)
- * To simplify the code, we assume the worst case of last real code encoded
- * on one bit only.
- */
-void _tr_align(deflate_state *s)
-{
- send_bits(s, STATIC_TREES<<1, 3);
- send_code(s, END_BLOCK, static_ltree);
-#ifdef DEBUG
- s->compressed_len += 10L; /* 3 for block type, 7 for EOB */
-#endif
- bi_flush(s);
- /* Of the 10 bits for the empty block, we have already sent
- * (10 - bi_valid) bits. The lookahead for the last real code (before
- * the EOB of the previous block) was thus at least one plus the length
- * of the EOB plus what we have just sent of the empty static block.
- */
- if (1 + s->last_eob_len + 10 - s->bi_valid < 9) {
- send_bits(s, STATIC_TREES<<1, 3);
- send_code(s, END_BLOCK, static_ltree);
-#ifdef DEBUG
- s->compressed_len += 10L;
-#endif
- bi_flush(s);
- }
- s->last_eob_len = 7;
-}
-
-/* ===========================================================================
- * Determine the best encoding for the current block: dynamic trees, static
- * trees or store, and output the encoded block to the zip file.
- */
-void _tr_flush_block(deflate_state *s, charf *buf, ulg stored_len, int eof)
-
- /* input block, or NULL if too old */
- /* length of input block */
- /* true if this is the last block for a file */
-{
- ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */
- int max_blindex = 0; /* index of last bit length code of non zero freq */
-
- /* Build the Huffman trees unless a stored block is forced */
- if (s->level > 0) {
-
- /* Check if the file is ascii or binary */
- if (s->data_type == Z_UNKNOWN) set_data_type(s);
-
- /* Construct the literal and distance trees */
- build_tree(s, (tree_desc *)(&(s->l_desc)));
- Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
- s->static_len));
-
- build_tree(s, (tree_desc *)(&(s->d_desc)));
- Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
- s->static_len));
- /* At this point, opt_len and static_len are the total bit lengths of
- * the compressed block data, excluding the tree representations.
- */
-
- /* Build the bit length tree for the above two trees, and get the index
- * in bl_order of the last bit length code to send.
- */
- max_blindex = build_bl_tree(s);
-
- /* Determine the best encoding. Compute first the block length in bytes*/
- opt_lenb = (s->opt_len+3+7)>>3;
- static_lenb = (s->static_len+3+7)>>3;
-
- Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
- opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
- s->last_lit));
-
- if (static_lenb <= opt_lenb) opt_lenb = static_lenb;
-
- } else {
- Assert(buf != (char*)0, "lost buf");
- opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
- }
-
-#ifdef FORCE_STORED
- if (buf != (char*)0) { /* force stored block */
-#else
- if (stored_len+4 <= opt_lenb && buf != (char*)0) {
- /* 4: two words for the lengths */
-#endif
- /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
- * Otherwise we can't have processed more than WSIZE input bytes since
- * the last block flush, because compression would have been
- * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
- * transform a block into a stored block.
- */
- _tr_stored_block(s, buf, stored_len, eof);
-
-#ifdef FORCE_STATIC
- } else if (static_lenb >= 0) { /* force static trees */
-#else
- } else if (static_lenb == opt_lenb) {
-#endif
- send_bits(s, (STATIC_TREES<<1)+eof, 3);
- compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree);
-#ifdef DEBUG
- s->compressed_len += 3 + s->static_len;
-#endif
- } else {
- send_bits(s, (DYN_TREES<<1)+eof, 3);
- send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1,
- max_blindex+1);
- compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree);
-#ifdef DEBUG
- s->compressed_len += 3 + s->opt_len;
-#endif
- }
- Assert (s->compressed_len == s->bits_sent, "bad compressed size");
- /* The above check is made mod 2^32, for files larger than 512 MB
- * and uLong implemented on 32 bits.
- */
- init_block(s);
-
- if (eof) {
- bi_windup(s);
-#ifdef DEBUG
- s->compressed_len += 7; /* align on byte boundary */
-#endif
- }
- Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
- s->compressed_len-7*eof));
-}
-
-/* ===========================================================================
- * Save the match info and tally the frequency counts. Return true if
- * the current block must be flushed.
- */
-int _tr_tally (deflate_state *s, unsigned int dist, unsigned int lc)
-
- /* distance of matched string */
- /* match length-MIN_MATCH or unmatched char (if dist==0) */
-{
- s->d_buf[s->last_lit] = (ush)dist;
- s->l_buf[s->last_lit++] = (uch)lc;
- if (dist == 0) {
- /* lc is the unmatched char */
- s->dyn_ltree[lc].Freq++;
- } else {
- s->matches++;
- /* Here, lc is the match length - MIN_MATCH */
- dist--; /* dist = match distance - 1 */
- Assert((ush)dist < (ush)MAX_DIST(s) &&
- (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
- (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match");
-
- s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++;
- s->dyn_dtree[d_code(dist)].Freq++;
- }
-
-#ifdef TRUNCATE_BLOCK
- /* Try to guess if it is profitable to stop the current block here */
- if ((s->last_lit & 0x1fff) == 0 && s->level > 2) {
- /* Compute an upper bound for the compressed length */
- ulg out_length = (ulg)s->last_lit*8L;
- ulg in_length = (ulg)((long)s->strstart - s->block_start);
- int dcode;
- for (dcode = 0; dcode < D_CODES; dcode++) {
- out_length += (ulg)s->dyn_dtree[dcode].Freq *
- (5L+extra_dbits[dcode]);
- }
- out_length >>= 3;
- Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",
- s->last_lit, in_length, out_length,
- 100L - out_length*100L/in_length));
- if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1;
- }
-#endif
- return (s->last_lit == s->lit_bufsize-1);
- /* We avoid equality with lit_bufsize because of wraparound at 64K
- * on 16 bit machines and because stored blocks are restricted to
- * 64K-1 bytes.
- */
-}
-
-/* ===========================================================================
- * Send the block data compressed using the given Huffman trees
- */
-local void compress_block(deflate_state *s, ct_data *ltree, ct_data *dtree)
-
- /* literal tree */
- /* distance tree */
-{
- unsigned dist; /* distance of matched string */
- int lc; /* match length or unmatched char (if dist == 0) */
- unsigned lx = 0; /* running index in l_buf */
- unsigned code; /* the code to send */
- int extra; /* number of extra bits to send */
-
- if (s->last_lit != 0) do {
- dist = s->d_buf[lx];
- lc = s->l_buf[lx++];
- if (dist == 0) {
- send_code(s, lc, ltree); /* send a literal byte */
- Tracecv(isgraph(lc), (stderr," '%c' ", lc));
- } else {
- /* Here, lc is the match length - MIN_MATCH */
- code = _length_code[lc];
- send_code(s, code+LITERALS+1, ltree); /* send the length code */
- extra = extra_lbits[code];
- if (extra != 0) {
- lc -= base_length[code];
- send_bits(s, lc, extra); /* send the extra length bits */
- }
- dist--; /* dist is now the match distance - 1 */
- code = d_code(dist);
- Assert (code < D_CODES, "bad d_code");
-
- send_code(s, code, dtree); /* send the distance code */
- extra = extra_dbits[code];
- if (extra != 0) {
- dist -= base_dist[code];
- send_bits(s, dist, extra); /* send the extra distance bits */
- }
- } /* literal or match pair ? */
-
- /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
- Assert(s->pending < s->lit_bufsize + 2*lx, "pendingBuf overflow");
-
- } while (lx < s->last_lit);
-
- send_code(s, END_BLOCK, ltree);
- s->last_eob_len = ltree[END_BLOCK].Len;
-}
-
-/* ===========================================================================
- * Set the data type to ASCII or BINARY, using a crude approximation:
- * binary if more than 20% of the bytes are <= 6 or >= 128, ascii otherwise.
- * IN assertion: the fields freq of dyn_ltree are set and the total of all
- * frequencies does not exceed 64K (to fit in an int on 16 bit machines).
- */
-local void set_data_type(deflate_state *s)
-{
- int n = 0;
- unsigned ascii_freq = 0;
- unsigned bin_freq = 0;
- while (n < 7) bin_freq += s->dyn_ltree[n++].Freq;
- while (n < 128) ascii_freq += s->dyn_ltree[n++].Freq;
- while (n < LITERALS) bin_freq += s->dyn_ltree[n++].Freq;
- s->data_type = (Byte)(bin_freq > (ascii_freq >> 2) ? Z_BINARY : Z_ASCII);
-}
-
-/* ===========================================================================
- * Reverse the first len bits of a code, using straightforward code (a faster
- * method would use a table)
- * IN assertion: 1 <= len <= 15
- */
-local unsigned bi_reverse(unsigned int code, int len)
- /* the value to invert */
- /* its bit length */
-{
- register unsigned res = 0;
- do {
- res |= code & 1;
- code >>= 1, res <<= 1;
- } while (--len > 0);
- return res >> 1;
-}
-
-/* ===========================================================================
- * Flush the bit buffer, keeping at most 7 bits in it.
- */
-local void bi_flush(deflate_state *s)
-{
- if (s->bi_valid == 16) {
- put_short(s, s->bi_buf);
- s->bi_buf = 0;
- s->bi_valid = 0;
- } else if (s->bi_valid >= 8) {
- put_byte(s, (Byte)s->bi_buf);
- s->bi_buf >>= 8;
- s->bi_valid -= 8;
- }
-}
-
-/* ===========================================================================
- * Flush the bit buffer and align the output on a byte boundary
- */
-local void bi_windup(deflate_state *s)
-{
- if (s->bi_valid > 8) {
- put_short(s, s->bi_buf);
- } else if (s->bi_valid > 0) {
- put_byte(s, (Byte)s->bi_buf);
- }
- s->bi_buf = 0;
- s->bi_valid = 0;
-#ifdef DEBUG
- s->bits_sent = (s->bits_sent+7) & ~7;
-#endif
-}
-
-/* ===========================================================================
- * Copy a stored block, storing first the length and its
- * one's complement if requested.
- */
-local void copy_block(deflate_state *s, charf *buf, unsigned int len, int header)
-
- /* the input data */
- /* its length */
- /* true if block header must be written */
-{
- bi_windup(s); /* align on byte boundary */
- s->last_eob_len = 8; /* enough lookahead for inflate */
-
- if (header) {
- put_short(s, (ush)len);
- put_short(s, (ush)~len);
-#ifdef DEBUG
- s->bits_sent += 2*16;
-#endif
- }
-#ifdef DEBUG
- s->bits_sent += (ulg)len<<3;
-#endif
- while (len--) {
- put_byte(s, *buf++);
- }
-}
diff --git a/libpng/trees.h b/libpng/trees.h
deleted file mode 100644
index 72facf9..0000000
--- a/libpng/trees.h
+++ /dev/null
@@ -1,128 +0,0 @@
-/* header created automatically with -DGEN_TREES_H */
-
-local const ct_data static_ltree[L_CODES+2] = {
-{{ 12},{ 8}}, {{140},{ 8}}, {{ 76},{ 8}}, {{204},{ 8}}, {{ 44},{ 8}},
-{{172},{ 8}}, {{108},{ 8}}, {{236},{ 8}}, {{ 28},{ 8}}, {{156},{ 8}},
-{{ 92},{ 8}}, {{220},{ 8}}, {{ 60},{ 8}}, {{188},{ 8}}, {{124},{ 8}},
-{{252},{ 8}}, {{ 2},{ 8}}, {{130},{ 8}}, {{ 66},{ 8}}, {{194},{ 8}},
-{{ 34},{ 8}}, {{162},{ 8}}, {{ 98},{ 8}}, {{226},{ 8}}, {{ 18},{ 8}},
-{{146},{ 8}}, {{ 82},{ 8}}, {{210},{ 8}}, {{ 50},{ 8}}, {{178},{ 8}},
-{{114},{ 8}}, {{242},{ 8}}, {{ 10},{ 8}}, {{138},{ 8}}, {{ 74},{ 8}},
-{{202},{ 8}}, {{ 42},{ 8}}, {{170},{ 8}}, {{106},{ 8}}, {{234},{ 8}},
-{{ 26},{ 8}}, {{154},{ 8}}, {{ 90},{ 8}}, {{218},{ 8}}, {{ 58},{ 8}},
-{{186},{ 8}}, {{122},{ 8}}, {{250},{ 8}}, {{ 6},{ 8}}, {{134},{ 8}},
-{{ 70},{ 8}}, {{198},{ 8}}, {{ 38},{ 8}}, {{166},{ 8}}, {{102},{ 8}},
-{{230},{ 8}}, {{ 22},{ 8}}, {{150},{ 8}}, {{ 86},{ 8}}, {{214},{ 8}},
-{{ 54},{ 8}}, {{182},{ 8}}, {{118},{ 8}}, {{246},{ 8}}, {{ 14},{ 8}},
-{{142},{ 8}}, {{ 78},{ 8}}, {{206},{ 8}}, {{ 46},{ 8}}, {{174},{ 8}},
-{{110},{ 8}}, {{238},{ 8}}, {{ 30},{ 8}}, {{158},{ 8}}, {{ 94},{ 8}},
-{{222},{ 8}}, {{ 62},{ 8}}, {{190},{ 8}}, {{126},{ 8}}, {{254},{ 8}},
-{{ 1},{ 8}}, {{129},{ 8}}, {{ 65},{ 8}}, {{193},{ 8}}, {{ 33},{ 8}},
-{{161},{ 8}}, {{ 97},{ 8}}, {{225},{ 8}}, {{ 17},{ 8}}, {{145},{ 8}},
-{{ 81},{ 8}}, {{209},{ 8}}, {{ 49},{ 8}}, {{177},{ 8}}, {{113},{ 8}},
-{{241},{ 8}}, {{ 9},{ 8}}, {{137},{ 8}}, {{ 73},{ 8}}, {{201},{ 8}},
-{{ 41},{ 8}}, {{169},{ 8}}, {{105},{ 8}}, {{233},{ 8}}, {{ 25},{ 8}},
-{{153},{ 8}}, {{ 89},{ 8}}, {{217},{ 8}}, {{ 57},{ 8}}, {{185},{ 8}},
-{{121},{ 8}}, {{249},{ 8}}, {{ 5},{ 8}}, {{133},{ 8}}, {{ 69},{ 8}},
-{{197},{ 8}}, {{ 37},{ 8}}, {{165},{ 8}}, {{101},{ 8}}, {{229},{ 8}},
-{{ 21},{ 8}}, {{149},{ 8}}, {{ 85},{ 8}}, {{213},{ 8}}, {{ 53},{ 8}},
-{{181},{ 8}}, {{117},{ 8}}, {{245},{ 8}}, {{ 13},{ 8}}, {{141},{ 8}},
-{{ 77},{ 8}}, {{205},{ 8}}, {{ 45},{ 8}}, {{173},{ 8}}, {{109},{ 8}},
-{{237},{ 8}}, {{ 29},{ 8}}, {{157},{ 8}}, {{ 93},{ 8}}, {{221},{ 8}},
-{{ 61},{ 8}}, {{189},{ 8}}, {{125},{ 8}}, {{253},{ 8}}, {{ 19},{ 9}},
-{{275},{ 9}}, {{147},{ 9}}, {{403},{ 9}}, {{ 83},{ 9}}, {{339},{ 9}},
-{{211},{ 9}}, {{467},{ 9}}, {{ 51},{ 9}}, {{307},{ 9}}, {{179},{ 9}},
-{{435},{ 9}}, {{115},{ 9}}, {{371},{ 9}}, {{243},{ 9}}, {{499},{ 9}},
-{{ 11},{ 9}}, {{267},{ 9}}, {{139},{ 9}}, {{395},{ 9}}, {{ 75},{ 9}},
-{{331},{ 9}}, {{203},{ 9}}, {{459},{ 9}}, {{ 43},{ 9}}, {{299},{ 9}},
-{{171},{ 9}}, {{427},{ 9}}, {{107},{ 9}}, {{363},{ 9}}, {{235},{ 9}},
-{{491},{ 9}}, {{ 27},{ 9}}, {{283},{ 9}}, {{155},{ 9}}, {{411},{ 9}},
-{{ 91},{ 9}}, {{347},{ 9}}, {{219},{ 9}}, {{475},{ 9}}, {{ 59},{ 9}},
-{{315},{ 9}}, {{187},{ 9}}, {{443},{ 9}}, {{123},{ 9}}, {{379},{ 9}},
-{{251},{ 9}}, {{507},{ 9}}, {{ 7},{ 9}}, {{263},{ 9}}, {{135},{ 9}},
-{{391},{ 9}}, {{ 71},{ 9}}, {{327},{ 9}}, {{199},{ 9}}, {{455},{ 9}},
-{{ 39},{ 9}}, {{295},{ 9}}, {{167},{ 9}}, {{423},{ 9}}, {{103},{ 9}},
-{{359},{ 9}}, {{231},{ 9}}, {{487},{ 9}}, {{ 23},{ 9}}, {{279},{ 9}},
-{{151},{ 9}}, {{407},{ 9}}, {{ 87},{ 9}}, {{343},{ 9}}, {{215},{ 9}},
-{{471},{ 9}}, {{ 55},{ 9}}, {{311},{ 9}}, {{183},{ 9}}, {{439},{ 9}},
-{{119},{ 9}}, {{375},{ 9}}, {{247},{ 9}}, {{503},{ 9}}, {{ 15},{ 9}},
-{{271},{ 9}}, {{143},{ 9}}, {{399},{ 9}}, {{ 79},{ 9}}, {{335},{ 9}},
-{{207},{ 9}}, {{463},{ 9}}, {{ 47},{ 9}}, {{303},{ 9}}, {{175},{ 9}},
-{{431},{ 9}}, {{111},{ 9}}, {{367},{ 9}}, {{239},{ 9}}, {{495},{ 9}},
-{{ 31},{ 9}}, {{287},{ 9}}, {{159},{ 9}}, {{415},{ 9}}, {{ 95},{ 9}},
-{{351},{ 9}}, {{223},{ 9}}, {{479},{ 9}}, {{ 63},{ 9}}, {{319},{ 9}},
-{{191},{ 9}}, {{447},{ 9}}, {{127},{ 9}}, {{383},{ 9}}, {{255},{ 9}},
-{{511},{ 9}}, {{ 0},{ 7}}, {{ 64},{ 7}}, {{ 32},{ 7}}, {{ 96},{ 7}},
-{{ 16},{ 7}}, {{ 80},{ 7}}, {{ 48},{ 7}}, {{112},{ 7}}, {{ 8},{ 7}},
-{{ 72},{ 7}}, {{ 40},{ 7}}, {{104},{ 7}}, {{ 24},{ 7}}, {{ 88},{ 7}},
-{{ 56},{ 7}}, {{120},{ 7}}, {{ 4},{ 7}}, {{ 68},{ 7}}, {{ 36},{ 7}},
-{{100},{ 7}}, {{ 20},{ 7}}, {{ 84},{ 7}}, {{ 52},{ 7}}, {{116},{ 7}},
-{{ 3},{ 8}}, {{131},{ 8}}, {{ 67},{ 8}}, {{195},{ 8}}, {{ 35},{ 8}},
-{{163},{ 8}}, {{ 99},{ 8}}, {{227},{ 8}}
-};
-
-local const ct_data static_dtree[D_CODES] = {
-{{ 0},{ 5}}, {{16},{ 5}}, {{ 8},{ 5}}, {{24},{ 5}}, {{ 4},{ 5}},
-{{20},{ 5}}, {{12},{ 5}}, {{28},{ 5}}, {{ 2},{ 5}}, {{18},{ 5}},
-{{10},{ 5}}, {{26},{ 5}}, {{ 6},{ 5}}, {{22},{ 5}}, {{14},{ 5}},
-{{30},{ 5}}, {{ 1},{ 5}}, {{17},{ 5}}, {{ 9},{ 5}}, {{25},{ 5}},
-{{ 5},{ 5}}, {{21},{ 5}}, {{13},{ 5}}, {{29},{ 5}}, {{ 3},{ 5}},
-{{19},{ 5}}, {{11},{ 5}}, {{27},{ 5}}, {{ 7},{ 5}}, {{23},{ 5}}
-};
-
-const uch _dist_code[DIST_CODE_LEN] = {
- 0, 1, 2, 3, 4, 4, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8,
- 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 10, 10, 10,
-10, 10, 10, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11,
-11, 11, 11, 11, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12,
-12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 13, 13, 13, 13,
-13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13,
-13, 13, 13, 13, 13, 13, 13, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,
-14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 15, 15, 15, 15, 15, 15, 15, 15,
-15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
-15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 0, 0, 16, 17,
-18, 18, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 22, 22, 22, 22, 22, 22, 22, 22,
-23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
-24, 24, 24, 24, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27,
-27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
-27, 27, 27, 27, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
-28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
-28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
-28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
-29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
-29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29,
-29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29
-};
-
-const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 12, 12,
-13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 15, 16, 16, 16, 16, 16, 16, 16, 16,
-17, 17, 17, 17, 17, 17, 17, 17, 18, 18, 18, 18, 18, 18, 18, 18, 19, 19, 19, 19,
-19, 19, 19, 19, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20,
-21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 22, 22, 22,
-22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, 23, 23, 23, 23, 23, 23, 23, 23,
-23, 23, 23, 23, 23, 23, 23, 23, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
-24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25,
-25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 26, 26, 26, 26, 26, 26, 26, 26,
-26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26,
-26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27,
-27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28
-};
-
-local const int base_length[LENGTH_CODES] = {
-0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 12, 14, 16, 20, 24, 28, 32, 40, 48, 56,
-64, 80, 96, 112, 128, 160, 192, 224, 0
-};
-
-local const int base_dist[D_CODES] = {
- 0, 1, 2, 3, 4, 6, 8, 12, 16, 24,
- 32, 48, 64, 96, 128, 192, 256, 384, 512, 768,
- 1024, 1536, 2048, 3072, 4096, 6144, 8192, 12288, 16384, 24576
-};
-
diff --git a/libpng/uncompr.c b/libpng/uncompr.c
deleted file mode 100644
index ebcb33f..0000000
--- a/libpng/uncompr.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/* uncompr.c -- decompress a memory buffer
- * Copyright (C) 1995-2002 Jean-loup Gailly.
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* @(#) $Id$ */
-
-#include "zlib.h"
-
-/* ===========================================================================
- Decompresses the source buffer into the destination buffer. sourceLen is
- the byte length of the source buffer. Upon entry, destLen is the total
- size of the destination buffer, which must be large enough to hold the
- entire uncompressed data. (The size of the uncompressed data must have
- been saved previously by the compressor and transmitted to the decompressor
- by some mechanism outside the scope of this compression library.)
- Upon exit, destLen is the actual size of the compressed buffer.
- This function can be used to decompress a whole file at once if the
- input file is mmap'ed.
-
- uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
- enough memory, Z_BUF_ERROR if there was not enough room in the output
- buffer, or Z_DATA_ERROR if the input data was corrupted.
-*/
-int ZEXPORT uncompress (Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)
-{
- z_stream stream;
- int err;
-
- stream.next_in = (Bytef*)source;
- stream.avail_in = (uInt)sourceLen;
- /* Check for source > 64K on 16-bit machine: */
- if ((uLong)stream.avail_in != sourceLen) return Z_BUF_ERROR;
-
- stream.next_out = dest;
- stream.avail_out = (uInt)*destLen;
- if ((uLong)stream.avail_out != *destLen) return Z_BUF_ERROR;
-
- stream.zalloc = (alloc_func)0;
- stream.zfree = (free_func)0;
-
- err = inflateInit(&stream);
- if (err != Z_OK) return err;
-
- err = inflate(&stream, Z_FINISH);
- if (err != Z_STREAM_END) {
- inflateEnd(&stream);
- return err == Z_OK ? Z_BUF_ERROR : err;
- }
- *destLen = stream.total_out;
-
- err = inflateEnd(&stream);
- return err;
-}
diff --git a/libpng/zconf.h b/libpng/zconf.h
deleted file mode 100644
index eb0ae2e..0000000
--- a/libpng/zconf.h
+++ /dev/null
@@ -1,279 +0,0 @@
-/* zconf.h -- configuration of the zlib compression library
- * Copyright (C) 1995-2002 Jean-loup Gailly.
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* @(#) $Id$ */
-
-#ifndef _ZCONF_H
-#define _ZCONF_H
-
-/*
- * If you *really* need a unique prefix for all types and library functions,
- * compile with -DZ_PREFIX. The "standard" zlib should be compiled without it.
- */
-#ifdef Z_PREFIX
-# define deflateInit_ z_deflateInit_
-# define deflate z_deflate
-# define deflateEnd z_deflateEnd
-# define inflateInit_ z_inflateInit_
-# define inflate z_inflate
-# define inflateEnd z_inflateEnd
-# define deflateInit2_ z_deflateInit2_
-# define deflateSetDictionary z_deflateSetDictionary
-# define deflateCopy z_deflateCopy
-# define deflateReset z_deflateReset
-# define deflateParams z_deflateParams
-# define inflateInit2_ z_inflateInit2_
-# define inflateSetDictionary z_inflateSetDictionary
-# define inflateSync z_inflateSync
-# define inflateSyncPoint z_inflateSyncPoint
-# define inflateReset z_inflateReset
-# define compress z_compress
-# define compress2 z_compress2
-# define uncompress z_uncompress
-# define adler32 z_adler32
-# define crc32 z_crc32
-# define get_crc_table z_get_crc_table
-
-# define Byte z_Byte
-# define uInt z_uInt
-# define uLong z_uLong
-# define Bytef z_Bytef
-# define charf z_charf
-# define intf z_intf
-# define uIntf z_uIntf
-# define uLongf z_uLongf
-# define voidpf z_voidpf
-# define voidp z_voidp
-#endif
-
-#if (defined(_WIN32) || defined(__WIN32__)) && !defined(WIN32)
-# define WIN32
-#endif
-#if defined(__GNUC__) || defined(WIN32) || defined(__386__) || defined(i386)
-# ifndef __32BIT__
-# define __32BIT__
-# endif
-#endif
-#if defined(__MSDOS__) && !defined(MSDOS)
-# define MSDOS
-#endif
-
-/*
- * Compile with -DMAXSEG_64K if the alloc function cannot allocate more
- * than 64k bytes at a time (needed on systems with 16-bit int).
- */
-#if defined(MSDOS) && !defined(__32BIT__)
-# define MAXSEG_64K
-#endif
-#ifdef MSDOS
-# define UNALIGNED_OK
-#endif
-
-#if (defined(MSDOS) || defined(_WINDOWS) || defined(WIN32)) && !defined(STDC)
-# define STDC
-#endif
-#if defined(__STDC__) || defined(__cplusplus) || defined(__OS2__)
-# ifndef STDC
-# define STDC
-# endif
-#endif
-
-#ifndef STDC
-# ifndef const /* cannot use !defined(STDC) && !defined(const) on Mac */
-# define const
-# endif
-#endif
-
-/* Some Mac compilers merge all .h files incorrectly: */
-#if defined(__MWERKS__) || defined(applec) ||defined(THINK_C) ||defined(__SC__)
-# define NO_DUMMY_DECL
-#endif
-
-/* Old Borland C incorrectly complains about missing returns: */
-#if defined(__BORLANDC__) && (__BORLANDC__ < 0x500)
-# define NEED_DUMMY_RETURN
-#endif
-
-
-/* Maximum value for memLevel in deflateInit2 */
-#ifndef MAX_MEM_LEVEL
-# ifdef MAXSEG_64K
-# define MAX_MEM_LEVEL 8
-# else
-# define MAX_MEM_LEVEL 9
-# endif
-#endif
-
-/* Maximum value for windowBits in deflateInit2 and inflateInit2.
- * WARNING: reducing MAX_WBITS makes minigzip unable to extract .gz files
- * created by gzip. (Files created by minigzip can still be extracted by
- * gzip.)
- */
-#ifndef MAX_WBITS
-# define MAX_WBITS 15 /* 32K LZ77 window */
-#endif
-
-/* The memory requirements for deflate are (in bytes):
- (1 << (windowBits+2)) + (1 << (memLevel+9))
- that is: 128K for windowBits=15 + 128K for memLevel = 8 (default values)
- plus a few kilobytes for small objects. For example, if you want to reduce
- the default memory requirements from 256K to 128K, compile with
- make CFLAGS="-O -DMAX_WBITS=14 -DMAX_MEM_LEVEL=7"
- Of course this will generally degrade compression (there's no free lunch).
-
- The memory requirements for inflate are (in bytes) 1 << windowBits
- that is, 32K for windowBits=15 (default value) plus a few kilobytes
- for small objects.
-*/
-
- /* Type declarations */
-
-#ifndef OF /* function prototypes */
-# ifdef STDC
-# define OF(args) args
-# else
-# define OF(args) ()
-# endif
-#endif
-
-/* The following definitions for FAR are needed only for MSDOS mixed
- * model programming (small or medium model with some far allocations).
- * This was tested only with MSC; for other MSDOS compilers you may have
- * to define NO_MEMCPY in zutil.h. If you don't need the mixed model,
- * just define FAR to be empty.
- */
-#if (defined(M_I86SM) || defined(M_I86MM)) && !defined(__32BIT__)
- /* MSC small or medium model */
-# define SMALL_MEDIUM
-# ifdef _MSC_VER
-# define FAR _far
-# else
-# define FAR far
-# endif
-#endif
-#if defined(__BORLANDC__) && (defined(__SMALL__) || defined(__MEDIUM__))
-# ifndef __32BIT__
-# define SMALL_MEDIUM
-# define FAR _far
-# endif
-#endif
-
-/* Compile with -DZLIB_DLL for Windows DLL support */
-#if defined(ZLIB_DLL)
-# if defined(_WINDOWS) || defined(WINDOWS)
-# ifdef FAR
-# undef FAR
-# endif
-# include <windows.h>
-# define ZEXPORT WINAPI
-# ifdef WIN32
-# define ZEXPORTVA WINAPIV
-# else
-# define ZEXPORTVA FAR _cdecl _export
-# endif
-# endif
-# if defined (__BORLANDC__)
-# if (__BORLANDC__ >= 0x0500) && defined (WIN32)
-# include <windows.h>
-# define ZEXPORT __declspec(dllexport) WINAPI
-# define ZEXPORTRVA __declspec(dllexport) WINAPIV
-# else
-# if defined (_Windows) && defined (__DLL__)
-# define ZEXPORT _export
-# define ZEXPORTVA _export
-# endif
-# endif
-# endif
-#endif
-
-#if defined (__BEOS__)
-# if defined (ZLIB_DLL)
-# define ZEXTERN extern __declspec(dllexport)
-# else
-# define ZEXTERN extern __declspec(dllimport)
-# endif
-#endif
-
-#ifndef ZEXPORT
-# define ZEXPORT
-#endif
-#ifndef ZEXPORTVA
-# define ZEXPORTVA
-#endif
-#ifndef ZEXTERN
-# define ZEXTERN extern
-#endif
-
-#ifndef FAR
-# define FAR
-#endif
-
-#if !defined(MACOS) && !defined(TARGET_OS_MAC)
-typedef unsigned char Byte; /* 8 bits */
-#endif
-typedef unsigned int uInt; /* 16 bits or more */
-typedef unsigned long uLong; /* 32 bits or more */
-
-#ifdef SMALL_MEDIUM
- /* Borland C/C++ and some old MSC versions ignore FAR inside typedef */
-# define Bytef Byte FAR
-#else
- typedef Byte FAR Bytef;
-#endif
-typedef char FAR charf;
-typedef int FAR intf;
-typedef uInt FAR uIntf;
-typedef uLong FAR uLongf;
-
-#ifdef STDC
- typedef void FAR *voidpf;
- typedef void *voidp;
-#else
- typedef Byte FAR *voidpf;
- typedef Byte *voidp;
-#endif
-
-#ifdef HAVE_UNISTD_H
-# include <sys/types.h> /* for off_t */
-# include <unistd.h> /* for SEEK_* and off_t */
-# define z_off_t off_t
-#endif
-#ifndef SEEK_SET
-# define SEEK_SET 0 /* Seek from beginning of file. */
-# define SEEK_CUR 1 /* Seek from current position. */
-# define SEEK_END 2 /* Set file pointer to EOF plus "offset" */
-#endif
-#ifndef z_off_t
-# define z_off_t long
-#endif
-
-/* MVS linker does not support external names larger than 8 bytes */
-#if defined(__MVS__)
-# pragma map(deflateInit_,"DEIN")
-# pragma map(deflateInit2_,"DEIN2")
-# pragma map(deflateEnd,"DEEND")
-# pragma map(inflateInit_,"ININ")
-# pragma map(inflateInit2_,"ININ2")
-# pragma map(inflateEnd,"INEND")
-# pragma map(inflateSync,"INSY")
-# pragma map(inflateSetDictionary,"INSEDI")
-# pragma map(inflate_blocks,"INBL")
-# pragma map(inflate_blocks_new,"INBLNE")
-# pragma map(inflate_blocks_free,"INBLFR")
-# pragma map(inflate_blocks_reset,"INBLRE")
-# pragma map(inflate_codes_free,"INCOFR")
-# pragma map(inflate_codes,"INCO")
-# pragma map(inflate_fast,"INFA")
-# pragma map(inflate_flush,"INFLU")
-# pragma map(inflate_mask,"INMA")
-# pragma map(inflate_set_dictionary,"INSEDI2")
-# pragma map(inflate_copyright,"INCOPY")
-# pragma map(inflate_trees_bits,"INTRBI")
-# pragma map(inflate_trees_dynamic,"INTRDY")
-# pragma map(inflate_trees_fixed,"INTRFI")
-# pragma map(inflate_trees_free,"INTRFR")
-#endif
-
-#endif /* _ZCONF_H */
diff --git a/libpng/zlib.h b/libpng/zlib.h
deleted file mode 100644
index 52cb529..0000000
--- a/libpng/zlib.h
+++ /dev/null
@@ -1,893 +0,0 @@
-/* zlib.h -- interface of the 'zlib' general purpose compression library
- version 1.1.4, March 11th, 2002
-
- Copyright (C) 1995-2002 Jean-loup Gailly and Mark Adler
-
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
-
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
-
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
-
- Jean-loup Gailly Mark Adler
- jloup@gzip.org madler@alumni.caltech.edu
-
-
- The data format used by the zlib library is described by RFCs (Request for
- Comments) 1950 to 1952 in the files ftp://ds.internic.net/rfc/rfc1950.txt
- (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).
-*/
-
-#ifndef _ZLIB_H
-#define _ZLIB_H
-
-#include "zconf.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define ZLIB_VERSION "1.1.4"
-
-/*
- The 'zlib' compression library provides in-memory compression and
- decompression functions, including integrity checks of the uncompressed
- data. This version of the library supports only one compression method
- (deflation) but other algorithms will be added later and will have the same
- stream interface.
-
- Compression can be done in a single step if the buffers are large
- enough (for example if an input file is mmap'ed), or can be done by
- repeated calls of the compression function. In the latter case, the
- application must provide more input and/or consume the output
- (providing more output space) before each call.
-
- The library also supports reading and writing files in gzip (.gz) format
- with an interface similar to that of stdio.
-
- The library does not install any signal handler. The decoder checks
- the consistency of the compressed data, so the library should never
- crash even in case of corrupted input.
-*/
-
-typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
-typedef void (*free_func) OF((voidpf opaque, voidpf address));
-
-struct internal_state;
-
-typedef struct z_stream_s {
- Bytef *next_in; /* next input byte */
- uInt avail_in; /* number of bytes available at next_in */
- uLong total_in; /* total nb of input bytes read so far */
-
- Bytef *next_out; /* next output byte should be put there */
- uInt avail_out; /* remaining free space at next_out */
- uLong total_out; /* total nb of bytes output so far */
-
- char *msg; /* last error message, NULL if no error */
- struct internal_state FAR *state; /* not visible by applications */
-
- alloc_func zalloc; /* used to allocate the internal state */
- free_func zfree; /* used to free the internal state */
- voidpf opaque; /* private data object passed to zalloc and zfree */
-
- int data_type; /* best guess about the data type: ascii or binary */
- uLong adler; /* adler32 value of the uncompressed data */
- uLong reserved; /* reserved for future use */
-} z_stream;
-
-typedef z_stream FAR *z_streamp;
-
-/*
- The application must update next_in and avail_in when avail_in has
- dropped to zero. It must update next_out and avail_out when avail_out
- has dropped to zero. The application must initialize zalloc, zfree and
- opaque before calling the init function. All other fields are set by the
- compression library and must not be updated by the application.
-
- The opaque value provided by the application will be passed as the first
- parameter for calls of zalloc and zfree. This can be useful for custom
- memory management. The compression library attaches no meaning to the
- opaque value.
-
- zalloc must return Z_NULL if there is not enough memory for the object.
- If zlib is used in a multi-threaded application, zalloc and zfree must be
- thread safe.
-
- On 16-bit systems, the functions zalloc and zfree must be able to allocate
- exactly 65536 bytes, but will not be required to allocate more than this
- if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS,
- pointers returned by zalloc for objects of exactly 65536 bytes *must*
- have their offset normalized to zero. The default allocation function
- provided by this library ensures this (see zutil.c). To reduce memory
- requirements and avoid any allocation of 64K objects, at the expense of
- compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h).
-
- The fields total_in and total_out can be used for statistics or
- progress reports. After compression, total_in holds the total size of
- the uncompressed data and may be saved for use in the decompressor
- (particularly if the decompressor wants to decompress everything in
- a single step).
-*/
-
- /* constants */
-
-#define Z_NO_FLUSH 0
-#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */
-#define Z_SYNC_FLUSH 2
-#define Z_FULL_FLUSH 3
-#define Z_FINISH 4
-/* Allowed flush values; see deflate() below for details */
-
-#define Z_OK 0
-#define Z_STREAM_END 1
-#define Z_NEED_DICT 2
-#define Z_ERRNO (-1)
-#define Z_STREAM_ERROR (-2)
-#define Z_DATA_ERROR (-3)
-#define Z_MEM_ERROR (-4)
-#define Z_BUF_ERROR (-5)
-#define Z_VERSION_ERROR (-6)
-/* Return codes for the compression/decompression functions. Negative
- * values are errors, positive values are used for special but normal events.
- */
-
-#define Z_NO_COMPRESSION 0
-#define Z_BEST_SPEED 1
-#define Z_BEST_COMPRESSION 9
-#define Z_DEFAULT_COMPRESSION (-1)
-/* compression levels */
-
-#define Z_FILTERED 1
-#define Z_HUFFMAN_ONLY 2
-#define Z_DEFAULT_STRATEGY 0
-/* compression strategy; see deflateInit2() below for details */
-
-#define Z_BINARY 0
-#define Z_ASCII 1
-#define Z_UNKNOWN 2
-/* Possible values of the data_type field */
-
-#define Z_DEFLATED 8
-/* The deflate compression method (the only one supported in this version) */
-
-#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */
-
-#define zlib_version zlibVersion()
-/* for compatibility with versions < 1.0.2 */
-
- /* basic functions */
-
-ZEXTERN const char * ZEXPORT zlibVersion OF((void));
-/* The application can compare zlibVersion and ZLIB_VERSION for consistency.
- If the first character differs, the library code actually used is
- not compatible with the zlib.h header file used by the application.
- This check is automatically made by deflateInit and inflateInit.
- */
-
-/*
-ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));
-
- Initializes the internal stream state for compression. The fields
- zalloc, zfree and opaque must be initialized before by the caller.
- If zalloc and zfree are set to Z_NULL, deflateInit updates them to
- use default allocation functions.
-
- The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:
- 1 gives best speed, 9 gives best compression, 0 gives no compression at
- all (the input data is simply copied a block at a time).
- Z_DEFAULT_COMPRESSION requests a default compromise between speed and
- compression (currently equivalent to level 6).
-
- deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not
- enough memory, Z_STREAM_ERROR if level is not a valid compression level,
- Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible
- with the version assumed by the caller (ZLIB_VERSION).
- msg is set to null if there is no error message. deflateInit does not
- perform any compression: this will be done by deflate().
-*/
-
-
-ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
-/*
- deflate compresses as much data as possible, and stops when the input
- buffer becomes empty or the output buffer becomes full. It may introduce some
- output latency (reading input without producing any output) except when
- forced to flush.
-
- The detailed semantics are as follows. deflate performs one or both of the
- following actions:
-
- - Compress more input starting at next_in and update next_in and avail_in
- accordingly. If not all input can be processed (because there is not
- enough room in the output buffer), next_in and avail_in are updated and
- processing will resume at this point for the next call of deflate().
-
- - Provide more output starting at next_out and update next_out and avail_out
- accordingly. This action is forced if the parameter flush is non zero.
- Forcing flush frequently degrades the compression ratio, so this parameter
- should be set only when necessary (in interactive applications).
- Some output may be provided even if flush is not set.
-
- Before the call of deflate(), the application should ensure that at least
- one of the actions is possible, by providing more input and/or consuming
- more output, and updating avail_in or avail_out accordingly; avail_out
- should never be zero before the call. The application can consume the
- compressed output when it wants, for example when the output buffer is full
- (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK
- and with zero avail_out, it must be called again after making room in the
- output buffer because there might be more output pending.
-
- If the parameter flush is set to Z_SYNC_FLUSH, all pending output is
- flushed to the output buffer and the output is aligned on a byte boundary, so
- that the decompressor can get all input data available so far. (In particular
- avail_in is zero after the call if enough output space has been provided
- before the call.) Flushing may degrade compression for some compression
- algorithms and so it should be used only when necessary.
-
- If flush is set to Z_FULL_FLUSH, all output is flushed as with
- Z_SYNC_FLUSH, and the compression state is reset so that decompression can
- restart from this point if previous compressed data has been damaged or if
- random access is desired. Using Z_FULL_FLUSH too often can seriously degrade
- the compression.
-
- If deflate returns with avail_out == 0, this function must be called again
- with the same value of the flush parameter and more output space (updated
- avail_out), until the flush is complete (deflate returns with non-zero
- avail_out).
-
- If the parameter flush is set to Z_FINISH, pending input is processed,
- pending output is flushed and deflate returns with Z_STREAM_END if there
- was enough output space; if deflate returns with Z_OK, this function must be
- called again with Z_FINISH and more output space (updated avail_out) but no
- more input data, until it returns with Z_STREAM_END or an error. After
- deflate has returned Z_STREAM_END, the only possible operations on the
- stream are deflateReset or deflateEnd.
-
- Z_FINISH can be used immediately after deflateInit if all the compression
- is to be done in a single step. In this case, avail_out must be at least
- 0.1% larger than avail_in plus 12 bytes. If deflate does not return
- Z_STREAM_END, then it must be called again as described above.
-
- deflate() sets strm->adler to the adler32 checksum of all input read
- so far (that is, total_in bytes).
-
- deflate() may update data_type if it can make a good guess about
- the input data type (Z_ASCII or Z_BINARY). In doubt, the data is considered
- binary. This field is only for information purposes and does not affect
- the compression algorithm in any manner.
-
- deflate() returns Z_OK if some progress has been made (more input
- processed or more output produced), Z_STREAM_END if all input has been
- consumed and all output has been produced (only when flush is set to
- Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example
- if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible
- (for example avail_in or avail_out was zero).
-*/
-
-
-ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));
-/*
- All dynamically allocated data structures for this stream are freed.
- This function discards any unprocessed input and does not flush any
- pending output.
-
- deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the
- stream state was inconsistent, Z_DATA_ERROR if the stream was freed
- prematurely (some input or output was discarded). In the error case,
- msg may be set but then points to a static string (which must not be
- deallocated).
-*/
-
-
-/*
-ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
-
- Initializes the internal stream state for decompression. The fields
- next_in, avail_in, zalloc, zfree and opaque must be initialized before by
- the caller. If next_in is not Z_NULL and avail_in is large enough (the exact
- value depends on the compression method), inflateInit determines the
- compression method from the zlib header and allocates all data structures
- accordingly; otherwise the allocation will be deferred to the first call of
- inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to
- use default allocation functions.
-
- inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
- memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
- version assumed by the caller. msg is set to null if there is no error
- message. inflateInit does not perform any decompression apart from reading
- the zlib header if present: this will be done by inflate(). (So next_in and
- avail_in may be modified, but next_out and avail_out are unchanged.)
-*/
-
-
-ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
-/*
- inflate decompresses as much data as possible, and stops when the input
- buffer becomes empty or the output buffer becomes full. It may some
- introduce some output latency (reading input without producing any output)
- except when forced to flush.
-
- The detailed semantics are as follows. inflate performs one or both of the
- following actions:
-
- - Decompress more input starting at next_in and update next_in and avail_in
- accordingly. If not all input can be processed (because there is not
- enough room in the output buffer), next_in is updated and processing
- will resume at this point for the next call of inflate().
-
- - Provide more output starting at next_out and update next_out and avail_out
- accordingly. inflate() provides as much output as possible, until there
- is no more input data or no more space in the output buffer (see below
- about the flush parameter).
-
- Before the call of inflate(), the application should ensure that at least
- one of the actions is possible, by providing more input and/or consuming
- more output, and updating the next_* and avail_* values accordingly.
- The application can consume the uncompressed output when it wants, for
- example when the output buffer is full (avail_out == 0), or after each
- call of inflate(). If inflate returns Z_OK and with zero avail_out, it
- must be called again after making room in the output buffer because there
- might be more output pending.
-
- If the parameter flush is set to Z_SYNC_FLUSH, inflate flushes as much
- output as possible to the output buffer. The flushing behavior of inflate is
- not specified for values of the flush parameter other than Z_SYNC_FLUSH
- and Z_FINISH, but the current implementation actually flushes as much output
- as possible anyway.
-
- inflate() should normally be called until it returns Z_STREAM_END or an
- error. However if all decompression is to be performed in a single step
- (a single call of inflate), the parameter flush should be set to
- Z_FINISH. In this case all pending input is processed and all pending
- output is flushed; avail_out must be large enough to hold all the
- uncompressed data. (The size of the uncompressed data may have been saved
- by the compressor for this purpose.) The next operation on this stream must
- be inflateEnd to deallocate the decompression state. The use of Z_FINISH
- is never required, but can be used to inform inflate that a faster routine
- may be used for the single inflate() call.
-
- If a preset dictionary is needed at this point (see inflateSetDictionary
- below), inflate sets strm-adler to the adler32 checksum of the
- dictionary chosen by the compressor and returns Z_NEED_DICT; otherwise
- it sets strm->adler to the adler32 checksum of all output produced
- so far (that is, total_out bytes) and returns Z_OK, Z_STREAM_END or
- an error code as described below. At the end of the stream, inflate()
- checks that its computed adler32 checksum is equal to that saved by the
- compressor and returns Z_STREAM_END only if the checksum is correct.
-
- inflate() returns Z_OK if some progress has been made (more input processed
- or more output produced), Z_STREAM_END if the end of the compressed data has
- been reached and all uncompressed output has been produced, Z_NEED_DICT if a
- preset dictionary is needed at this point, Z_DATA_ERROR if the input data was
- corrupted (input stream not conforming to the zlib format or incorrect
- adler32 checksum), Z_STREAM_ERROR if the stream structure was inconsistent
- (for example if next_in or next_out was NULL), Z_MEM_ERROR if there was not
- enough memory, Z_BUF_ERROR if no progress is possible or if there was not
- enough room in the output buffer when Z_FINISH is used. In the Z_DATA_ERROR
- case, the application may then call inflateSync to look for a good
- compression block.
-*/
-
-
-ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));
-/*
- All dynamically allocated data structures for this stream are freed.
- This function discards any unprocessed input and does not flush any
- pending output.
-
- inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state
- was inconsistent. In the error case, msg may be set but then points to a
- static string (which must not be deallocated).
-*/
-
- /* Advanced functions */
-
-/*
- The following functions are needed only in some special applications.
-*/
-
-/*
-ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
- int level,
- int method,
- int windowBits,
- int memLevel,
- int strategy));
-
- This is another version of deflateInit with more compression options. The
- fields next_in, zalloc, zfree and opaque must be initialized before by
- the caller.
-
- The method parameter is the compression method. It must be Z_DEFLATED in
- this version of the library.
-
- The windowBits parameter is the base two logarithm of the window size
- (the size of the history buffer). It should be in the range 8..15 for this
- version of the library. Larger values of this parameter result in better
- compression at the expense of memory usage. The default value is 15 if
- deflateInit is used instead.
-
- The memLevel parameter specifies how much memory should be allocated
- for the internal compression state. memLevel=1 uses minimum memory but
- is slow and reduces compression ratio; memLevel=9 uses maximum memory
- for optimal speed. The default value is 8. See zconf.h for total memory
- usage as a function of windowBits and memLevel.
-
- The strategy parameter is used to tune the compression algorithm. Use the
- value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a
- filter (or predictor), or Z_HUFFMAN_ONLY to force Huffman encoding only (no
- string match). Filtered data consists mostly of small values with a
- somewhat random distribution. In this case, the compression algorithm is
- tuned to compress them better. The effect of Z_FILTERED is to force more
- Huffman coding and less string matching; it is somewhat intermediate
- between Z_DEFAULT and Z_HUFFMAN_ONLY. The strategy parameter only affects
- the compression ratio but not the correctness of the compressed output even
- if it is not set appropriately.
-
- deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
- memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid
- method). msg is set to null if there is no error message. deflateInit2 does
- not perform any compression: this will be done by deflate().
-*/
-
-ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
- const Bytef *dictionary,
- uInt dictLength));
-/*
- Initializes the compression dictionary from the given byte sequence
- without producing any compressed output. This function must be called
- immediately after deflateInit, deflateInit2 or deflateReset, before any
- call of deflate. The compressor and decompressor must use exactly the same
- dictionary (see inflateSetDictionary).
-
- The dictionary should consist of strings (byte sequences) that are likely
- to be encountered later in the data to be compressed, with the most commonly
- used strings preferably put towards the end of the dictionary. Using a
- dictionary is most useful when the data to be compressed is short and can be
- predicted with good accuracy; the data can then be compressed better than
- with the default empty dictionary.
-
- Depending on the size of the compression data structures selected by
- deflateInit or deflateInit2, a part of the dictionary may in effect be
- discarded, for example if the dictionary is larger than the window size in
- deflate or deflate2. Thus the strings most likely to be useful should be
- put at the end of the dictionary, not at the front.
-
- Upon return of this function, strm->adler is set to the Adler32 value
- of the dictionary; the decompressor may later use this value to determine
- which dictionary has been used by the compressor. (The Adler32 value
- applies to the whole dictionary even if only a subset of the dictionary is
- actually used by the compressor.)
-
- deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a
- parameter is invalid (such as NULL dictionary) or the stream state is
- inconsistent (for example if deflate has already been called for this stream
- or if the compression method is bsort). deflateSetDictionary does not
- perform any compression: this will be done by deflate().
-*/
-
-ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,
- z_streamp source));
-/*
- Sets the destination stream as a complete copy of the source stream.
-
- This function can be useful when several compression strategies will be
- tried, for example when there are several ways of pre-processing the input
- data with a filter. The streams that will be discarded should then be freed
- by calling deflateEnd. Note that deflateCopy duplicates the internal
- compression state which can be quite large, so this strategy is slow and
- can consume lots of memory.
-
- deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
- enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
- (such as zalloc being NULL). msg is left unchanged in both source and
- destination.
-*/
-
-ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm));
-/*
- This function is equivalent to deflateEnd followed by deflateInit,
- but does not free and reallocate all the internal compression state.
- The stream will keep the same compression level and any other attributes
- that may have been set by deflateInit2.
-
- deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
- stream state was inconsistent (such as zalloc or state being NULL).
-*/
-
-ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
- int level,
- int strategy));
-/*
- Dynamically update the compression level and compression strategy. The
- interpretation of level and strategy is as in deflateInit2. This can be
- used to switch between compression and straight copy of the input data, or
- to switch to a different kind of input data requiring a different
- strategy. If the compression level is changed, the input available so far
- is compressed with the old level (and may be flushed); the new level will
- take effect only at the next call of deflate().
-
- Before the call of deflateParams, the stream state must be set as for
- a call of deflate(), since the currently available input may have to
- be compressed and flushed. In particular, strm->avail_out must be non-zero.
-
- deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source
- stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR
- if strm->avail_out was zero.
-*/
-
-/*
-ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
- int windowBits));
-
- This is another version of inflateInit with an extra parameter. The
- fields next_in, avail_in, zalloc, zfree and opaque must be initialized
- before by the caller.
-
- The windowBits parameter is the base two logarithm of the maximum window
- size (the size of the history buffer). It should be in the range 8..15 for
- this version of the library. The default value is 15 if inflateInit is used
- instead. If a compressed stream with a larger window size is given as
- input, inflate() will return with the error code Z_DATA_ERROR instead of
- trying to allocate a larger window.
-
- inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
- memory, Z_STREAM_ERROR if a parameter is invalid (such as a negative
- memLevel). msg is set to null if there is no error message. inflateInit2
- does not perform any decompression apart from reading the zlib header if
- present: this will be done by inflate(). (So next_in and avail_in may be
- modified, but next_out and avail_out are unchanged.)
-*/
-
-ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
- const Bytef *dictionary,
- uInt dictLength));
-/*
- Initializes the decompression dictionary from the given uncompressed byte
- sequence. This function must be called immediately after a call of inflate
- if this call returned Z_NEED_DICT. The dictionary chosen by the compressor
- can be determined from the Adler32 value returned by this call of
- inflate. The compressor and decompressor must use exactly the same
- dictionary (see deflateSetDictionary).
-
- inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a
- parameter is invalid (such as NULL dictionary) or the stream state is
- inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the
- expected one (incorrect Adler32 value). inflateSetDictionary does not
- perform any decompression: this will be done by subsequent calls of
- inflate().
-*/
-
-ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
-/*
- Skips invalid compressed data until a full flush point (see above the
- description of deflate with Z_FULL_FLUSH) can be found, or until all
- available input is skipped. No output is provided.
-
- inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR
- if no more input was provided, Z_DATA_ERROR if no flush point has been found,
- or Z_STREAM_ERROR if the stream structure was inconsistent. In the success
- case, the application may save the current current value of total_in which
- indicates where valid compressed data was found. In the error case, the
- application may repeatedly call inflateSync, providing more input each time,
- until success or end of the input data.
-*/
-
-ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));
-/*
- This function is equivalent to inflateEnd followed by inflateInit,
- but does not free and reallocate all the internal decompression state.
- The stream will keep attributes that may have been set by inflateInit2.
-
- inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
- stream state was inconsistent (such as zalloc or state being NULL).
-*/
-
-
- /* utility functions */
-
-/*
- The following utility functions are implemented on top of the
- basic stream-oriented functions. To simplify the interface, some
- default options are assumed (compression level and memory usage,
- standard memory allocation functions). The source code of these
- utility functions can easily be modified if you need special options.
-*/
-
-ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen,
- const Bytef *source, uLong sourceLen));
-/*
- Compresses the source buffer into the destination buffer. sourceLen is
- the byte length of the source buffer. Upon entry, destLen is the total
- size of the destination buffer, which must be at least 0.1% larger than
- sourceLen plus 12 bytes. Upon exit, destLen is the actual size of the
- compressed buffer.
- This function can be used to compress a whole file at once if the
- input file is mmap'ed.
- compress returns Z_OK if success, Z_MEM_ERROR if there was not
- enough memory, Z_BUF_ERROR if there was not enough room in the output
- buffer.
-*/
-
-ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen,
- const Bytef *source, uLong sourceLen,
- int level));
-/*
- Compresses the source buffer into the destination buffer. The level
- parameter has the same meaning as in deflateInit. sourceLen is the byte
- length of the source buffer. Upon entry, destLen is the total size of the
- destination buffer, which must be at least 0.1% larger than sourceLen plus
- 12 bytes. Upon exit, destLen is the actual size of the compressed buffer.
-
- compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
- memory, Z_BUF_ERROR if there was not enough room in the output buffer,
- Z_STREAM_ERROR if the level parameter is invalid.
-*/
-
-ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
- const Bytef *source, uLong sourceLen));
-/*
- Decompresses the source buffer into the destination buffer. sourceLen is
- the byte length of the source buffer. Upon entry, destLen is the total
- size of the destination buffer, which must be large enough to hold the
- entire uncompressed data. (The size of the uncompressed data must have
- been saved previously by the compressor and transmitted to the decompressor
- by some mechanism outside the scope of this compression library.)
- Upon exit, destLen is the actual size of the compressed buffer.
- This function can be used to decompress a whole file at once if the
- input file is mmap'ed.
-
- uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
- enough memory, Z_BUF_ERROR if there was not enough room in the output
- buffer, or Z_DATA_ERROR if the input data was corrupted.
-*/
-
-
-typedef voidp gzFile;
-
-ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
-/*
- Opens a gzip (.gz) file for reading or writing. The mode parameter
- is as in fopen ("rb" or "wb") but can also include a compression level
- ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for
- Huffman only compression as in "wb1h". (See the description
- of deflateInit2 for more information about the strategy parameter.)
-
- gzopen can be used to read a file which is not in gzip format; in this
- case gzread will directly read from the file without decompression.
-
- gzopen returns NULL if the file could not be opened or if there was
- insufficient memory to allocate the (de)compression state; errno
- can be checked to distinguish the two cases (if errno is zero, the
- zlib error is Z_MEM_ERROR). */
-
-ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));
-/*
- gzdopen() associates a gzFile with the file descriptor fd. File
- descriptors are obtained from calls like open, dup, creat, pipe or
- fileno (in the file has been previously opened with fopen).
- The mode parameter is as in gzopen.
- The next call of gzclose on the returned gzFile will also close the
- file descriptor fd, just like fclose(fdopen(fd), mode) closes the file
- descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode).
- gzdopen returns NULL if there was insufficient memory to allocate
- the (de)compression state.
-*/
-
-ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
-/*
- Dynamically update the compression level or strategy. See the description
- of deflateInit2 for the meaning of these parameters.
- gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not
- opened for writing.
-*/
-
-ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
-/*
- Reads the given number of uncompressed bytes from the compressed file.
- If the input file was not in gzip format, gzread copies the given number
- of bytes into the buffer.
- gzread returns the number of uncompressed bytes actually read (0 for
- end of file, -1 for error). */
-
-ZEXTERN int ZEXPORT gzwrite OF((gzFile file,
- const voidp buf, unsigned len));
-/*
- Writes the given number of uncompressed bytes into the compressed file.
- gzwrite returns the number of uncompressed bytes actually written
- (0 in case of error).
-*/
-
-ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...));
-/*
- Converts, formats, and writes the args to the compressed file under
- control of the format string, as in fprintf. gzprintf returns the number of
- uncompressed bytes actually written (0 in case of error).
-*/
-
-ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
-/*
- Writes the given null-terminated string to the compressed file, excluding
- the terminating null character.
- gzputs returns the number of characters written, or -1 in case of error.
-*/
-
-ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
-/*
- Reads bytes from the compressed file until len-1 characters are read, or
- a newline character is read and transferred to buf, or an end-of-file
- condition is encountered. The string is then terminated with a null
- character.
- gzgets returns buf, or Z_NULL in case of error.
-*/
-
-ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c));
-/*
- Writes c, converted to an unsigned char, into the compressed file.
- gzputc returns the value that was written, or -1 in case of error.
-*/
-
-ZEXTERN int ZEXPORT gzgetc OF((gzFile file));
-/*
- Reads one byte from the compressed file. gzgetc returns this byte
- or -1 in case of end of file or error.
-*/
-
-ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));
-/*
- Flushes all pending output into the compressed file. The parameter
- flush is as in the deflate() function. The return value is the zlib
- error number (see function gzerror below). gzflush returns Z_OK if
- the flush parameter is Z_FINISH and all output could be flushed.
- gzflush should be called only when strictly necessary because it can
- degrade compression.
-*/
-
-ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,
- z_off_t offset, int whence));
-/*
- Sets the starting position for the next gzread or gzwrite on the
- given compressed file. The offset represents a number of bytes in the
- uncompressed data stream. The whence parameter is defined as in lseek(2);
- the value SEEK_END is not supported.
- If the file is opened for reading, this function is emulated but can be
- extremely slow. If the file is opened for writing, only forward seeks are
- supported; gzseek then compresses a sequence of zeroes up to the new
- starting position.
-
- gzseek returns the resulting offset location as measured in bytes from
- the beginning of the uncompressed stream, or -1 in case of error, in
- particular if the file is opened for writing and the new starting position
- would be before the current position.
-*/
-
-ZEXTERN int ZEXPORT gzrewind OF((gzFile file));
-/*
- Rewinds the given file. This function is supported only for reading.
-
- gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)
-*/
-
-ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file));
-/*
- Returns the starting position for the next gzread or gzwrite on the
- given compressed file. This position represents a number of bytes in the
- uncompressed data stream.
-
- gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)
-*/
-
-ZEXTERN int ZEXPORT gzeof OF((gzFile file));
-/*
- Returns 1 when EOF has previously been detected reading the given
- input stream, otherwise zero.
-*/
-
-ZEXTERN int ZEXPORT gzclose OF((gzFile file));
-/*
- Flushes all pending output if necessary, closes the compressed file
- and deallocates all the (de)compression state. The return value is the zlib
- error number (see function gzerror below).
-*/
-
-ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
-/*
- Returns the error message for the last error which occurred on the
- given compressed file. errnum is set to zlib error number. If an
- error occurred in the file system and not in the compression library,
- errnum is set to Z_ERRNO and the application may consult errno
- to get the exact error code.
-*/
-
- /* checksum functions */
-
-/*
- These functions are not related to compression but are exported
- anyway because they might be useful in applications using the
- compression library.
-*/
-
-ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
-
-/*
- Update a running Adler-32 checksum with the bytes buf[0..len-1] and
- return the updated checksum. If buf is NULL, this function returns
- the required initial value for the checksum.
- An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
- much faster. Usage example:
-
- uLong adler = adler32(0L, Z_NULL, 0);
-
- while (read_buffer(buffer, length) != EOF) {
- adler = adler32(adler, buffer, length);
- }
- if (adler != original_adler) error();
-*/
-
-ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
-/*
- Update a running crc with the bytes buf[0..len-1] and return the updated
- crc. If buf is NULL, this function returns the required initial value
- for the crc. Pre- and post-conditioning (one's complement) is performed
- within this function so it shouldn't be done by the application.
- Usage example:
-
- uLong crc = crc32(0L, Z_NULL, 0);
-
- while (read_buffer(buffer, length) != EOF) {
- crc = crc32(crc, buffer, length);
- }
- if (crc != original_crc) error();
-*/
-
-
- /* various hacks, don't look :) */
-
-/* deflateInit and inflateInit are macros to allow checking the zlib version
- * and the compiler's view of z_stream:
- */
-ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level,
- const char *version, int stream_size));
-ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm,
- const char *version, int stream_size));
-ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method,
- int windowBits, int memLevel,
- int strategy, const char *version,
- int stream_size));
-ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits,
- const char *version, int stream_size));
-#define deflateInit(strm, level) \
- deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream))
-#define inflateInit(strm) \
- inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream))
-#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \
- deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\
- (strategy), ZLIB_VERSION, sizeof(z_stream))
-#define inflateInit2(strm, windowBits) \
- inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream))
-
-
-#if !defined(_Z_UTIL_H) && !defined(NO_DUMMY_DECL)
- struct internal_state {int dummy;}; /* hack for buggy compilers */
-#endif
-
-ZEXTERN const char * ZEXPORT zError OF((int err));
-ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z));
-ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void));
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* _ZLIB_H */
diff --git a/libpng/zutil.c b/libpng/zutil.c
deleted file mode 100644
index 64cec41..0000000
--- a/libpng/zutil.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/* zutil.c -- target dependent utility functions for the compression library
- * Copyright (C) 1995-2002 Jean-loup Gailly.
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* @(#) $Id$ */
-
-#include "zutil.h"
-
-struct internal_state {int dummy;}; /* for buggy compilers */
-
-#ifndef STDC
-extern void exit OF((int));
-#endif
-
-const char *z_errmsg[10] = {
-"need dictionary", /* Z_NEED_DICT 2 */
-"stream end", /* Z_STREAM_END 1 */
-"", /* Z_OK 0 */
-"file error", /* Z_ERRNO (-1) */
-"stream error", /* Z_STREAM_ERROR (-2) */
-"data error", /* Z_DATA_ERROR (-3) */
-"insufficient memory", /* Z_MEM_ERROR (-4) */
-"buffer error", /* Z_BUF_ERROR (-5) */
-"incompatible version",/* Z_VERSION_ERROR (-6) */
-""};
-
-
-const char * ZEXPORT zlibVersion(void)
-{
- return ZLIB_VERSION;
-}
-
-#ifdef DEBUG
-
-# ifndef verbose
-# define verbose 0
-# endif
-int z_verbose = verbose;
-
-void z_error (char *m)
-{
- fprintf(stderr, "%s\n", m);
- exit(1);
-}
-#endif
-
-/* exported to allow conversion of error code to string for compress() and
- * uncompress()
- */
-const char * ZEXPORT zError(int err)
-{
- return ERR_MSG(err);
-}
-
-
-#ifndef HAVE_MEMCPY
-
-void zmemcpy(Bytef *dest, const Bytef *source, uint len)
-{
- if (len == 0) return;
- do {
- *dest++ = *source++; /* ??? to be unrolled */
- } while (--len != 0);
-}
-
-int zmemcmp(const Bytef *s1, const Bytef *s2, uint len)
-{
- uInt j;
-
- for (j = 0; j < len; j++) {
- if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1;
- }
- return 0;
-}
-
-void zmemzero(Bytef *dest, uInt len)
-{
- if (len == 0) return;
- do {
- *dest++ = 0; /* ??? to be unrolled */
- } while (--len != 0);
-}
-#endif
-
-#ifdef __TURBOC__
-#if (defined( __BORLANDC__) || !defined(SMALL_MEDIUM)) && !defined(__32BIT__)
-/* Small and medium model in Turbo C are for now limited to near allocation
- * with reduced MAX_WBITS and MAX_MEM_LEVEL
- */
-# define MY_ZCALLOC
-
-/* Turbo C malloc() does not allow dynamic allocation of 64K bytes
- * and farmalloc(64K) returns a pointer with an offset of 8, so we
- * must fix the pointer. Warning: the pointer must be put back to its
- * original form in order to free it, use zcfree().
- */
-
-#define MAX_PTR 10
-/* 10*64K = 640K */
-
-local int next_ptr = 0;
-
-typedef struct ptr_table_s {
- voidpf org_ptr;
- voidpf new_ptr;
-} ptr_table;
-
-local ptr_table table[MAX_PTR];
-/* This table is used to remember the original form of pointers
- * to large buffers (64K). Such pointers are normalized with a zero offset.
- * Since MSDOS is not a preemptive multitasking OS, this table is not
- * protected from concurrent access. This hack doesn't work anyway on
- * a protected system like OS/2. Use Microsoft C instead.
- */
-
-voidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
-{
- voidpf buf = opaque; /* just to make some compilers happy */
- ulg bsize = (ulg)items*size;
-
- /* If we allocate less than 65520 bytes, we assume that farmalloc
- * will return a usable pointer which doesn't have to be normalized.
- */
- if (bsize < 65520L) {
- buf = farmalloc(bsize);
- if (*(ush*)&buf != 0) return buf;
- } else {
- buf = farmalloc(bsize + 16L);
- }
- if (buf == NULL || next_ptr >= MAX_PTR) return NULL;
- table[next_ptr].org_ptr = buf;
-
- /* Normalize the pointer to seg:0 */
- *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4;
- *(ush*)&buf = 0;
- table[next_ptr++].new_ptr = buf;
- return buf;
-}
-
-void zcfree (voidpf opaque, voidpf ptr)
-{
- int n;
- if (*(ush*)&ptr != 0) { /* object < 64K */
- farfree(ptr);
- return;
- }
- /* Find the original pointer */
- for (n = 0; n < next_ptr; n++) {
- if (ptr != table[n].new_ptr) continue;
-
- farfree(table[n].org_ptr);
- while (++n < next_ptr) {
- table[n-1] = table[n];
- }
- next_ptr--;
- return;
- }
- ptr = opaque; /* just to make some compilers happy */
- Assert(0, "zcfree: ptr not found");
-}
-#endif
-#endif /* __TURBOC__ */
-
-
-#if defined(M_I86) && !defined(__32BIT__)
-/* Microsoft C in 16-bit mode */
-
-# define MY_ZCALLOC
-
-#if (!defined(_MSC_VER) || (_MSC_VER <= 600))
-# define _halloc halloc
-# define _hfree hfree
-#endif
-
-voidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
-{
- if (opaque) opaque = 0; /* to make compiler happy */
- return _halloc((long)items, size);
-}
-
-void zcfree (voidpf opaque, voidpf ptr)
-{
- if (opaque) opaque = 0; /* to make compiler happy */
- _hfree(ptr);
-}
-
-#endif /* MSC */
-
-
-#ifndef MY_ZCALLOC /* Any system without a special alloc function */
-
-#ifndef STDC
-extern voidp calloc OF((uInt items, uInt size));
-extern void free OF((voidpf ptr));
-#endif
-
-voidpf zcalloc (voidpf opaque, unsigned int items, unsigned int size)
-{
- if (opaque) items += size - size; /* make compiler happy */
- return (voidpf)calloc(items, size);
-}
-
-void zcfree (voidpf opaque, voidpf ptr)
-{
- free(ptr);
- if (opaque) return; /* make compiler happy */
-}
-
-#endif /* MY_ZCALLOC */
diff --git a/libpng/zutil.h b/libpng/zutil.h
deleted file mode 100644
index 718ebc1..0000000
--- a/libpng/zutil.h
+++ /dev/null
@@ -1,220 +0,0 @@
-/* zutil.h -- internal interface and configuration of the compression library
- * Copyright (C) 1995-2002 Jean-loup Gailly.
- * For conditions of distribution and use, see copyright notice in zlib.h
- */
-
-/* WARNING: this file should *not* be used by applications. It is
- part of the implementation of the compression library and is
- subject to change. Applications should only use zlib.h.
- */
-
-/* @(#) $Id$ */
-
-#ifndef _Z_UTIL_H
-#define _Z_UTIL_H
-
-#include "zlib.h"
-
-#ifdef STDC
-# include <stddef.h>
-# include <string.h>
-# include <stdlib.h>
-#endif
-#ifdef NO_ERRNO_H
- extern int errno;
-#else
-# include <errno.h>
-#endif
-
-#ifndef local
-# define local static
-#endif
-/* compile with -Dlocal if your debugger can't find static symbols */
-
-typedef unsigned char uch;
-typedef uch FAR uchf;
-typedef unsigned short ush;
-typedef ush FAR ushf;
-typedef unsigned long ulg;
-
-extern const char *z_errmsg[10]; /* indexed by 2-zlib_error */
-/* (size given to avoid silly warnings with Visual C++) */
-
-#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]
-
-#define ERR_RETURN(strm,err) \
- return (strm->msg = (char*)ERR_MSG(err), (err))
-/* To be used only when the state is known to be valid */
-
- /* common constants */
-
-#ifndef DEF_WBITS
-# define DEF_WBITS MAX_WBITS
-#endif
-/* default windowBits for decompression. MAX_WBITS is for compression only */
-
-#if MAX_MEM_LEVEL >= 8
-# define DEF_MEM_LEVEL 8
-#else
-# define DEF_MEM_LEVEL MAX_MEM_LEVEL
-#endif
-/* default memLevel */
-
-#define STORED_BLOCK 0
-#define STATIC_TREES 1
-#define DYN_TREES 2
-/* The three kinds of block type */
-
-#define MIN_MATCH 3
-#define MAX_MATCH 258
-/* The minimum and maximum match lengths */
-
-#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */
-
- /* target dependencies */
-
-#ifdef MSDOS
-# define OS_CODE 0x00
-# if defined(__TURBOC__) || defined(__BORLANDC__)
-# if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__))
- /* Allow compilation with ANSI keywords only enabled */
- void _Cdecl farfree( void *block );
- void *_Cdecl farmalloc( unsigned long nbytes );
-# else
-# include <alloc.h>
-# endif
-# else /* MSC or DJGPP */
-# include <malloc.h>
-# endif
-#endif
-
-#ifdef OS2
-# define OS_CODE 0x06
-#endif
-
-#ifdef WIN32 /* Window 95 & Windows NT */
-# define OS_CODE 0x0b
-#endif
-
-#if defined(VAXC) || defined(VMS)
-# define OS_CODE 0x02
-# define F_OPEN(name, mode) \
- fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512")
-#endif
-
-#ifdef AMIGA
-# define OS_CODE 0x01
-#endif
-
-#if defined(ATARI) || defined(atarist)
-# define OS_CODE 0x05
-#endif
-
-#if defined(MACOS) || defined(TARGET_OS_MAC)
-# define OS_CODE 0x07
-# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
-# include <unix.h> /* for fdopen */
-# else
-# ifndef fdopen
-# define fdopen(fd,mode) NULL /* No fdopen() */
-# endif
-# endif
-#endif
-
-#ifdef __50SERIES /* Prime/PRIMOS */
-# define OS_CODE 0x0F
-#endif
-
-#ifdef TOPS20
-# define OS_CODE 0x0a
-#endif
-
-#if defined(_BEOS_) || defined(RISCOS)
-# define fdopen(fd,mode) NULL /* No fdopen() */
-#endif
-
-#if (defined(_MSC_VER) && (_MSC_VER > 600))
-# define fdopen(fd,type) _fdopen(fd,type)
-#endif
-
-
- /* Common defaults */
-
-#ifndef OS_CODE
-# define OS_CODE 0x03 /* assume Unix */
-#endif
-
-#ifndef F_OPEN
-# define F_OPEN(name, mode) fopen((name), (mode))
-#endif
-
- /* functions */
-
-#ifdef HAVE_STRERROR
- extern char *strerror OF((int));
-# define zstrerror(errnum) strerror(errnum)
-#else
-# define zstrerror(errnum) ""
-#endif
-
-#if defined(pyr)
-# define NO_MEMCPY
-#endif
-#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__)
- /* Use our own functions for small and medium model with MSC <= 5.0.
- * You may have to use the same strategy for Borland C (untested).
- * The __SC__ check is for Symantec.
- */
-# define NO_MEMCPY
-#endif
-#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY)
-# define HAVE_MEMCPY
-#endif
-#ifdef HAVE_MEMCPY
-# ifdef SMALL_MEDIUM /* MSDOS small or medium model */
-# define zmemcpy _fmemcpy
-# define zmemcmp _fmemcmp
-# define zmemzero(dest, len) _fmemset(dest, 0, len)
-# else
-# define zmemcpy memcpy
-# define zmemcmp memcmp
-# define zmemzero(dest, len) memset(dest, 0, len)
-# endif
-#else
- extern void zmemcpy OF((Bytef* dest, const Bytef* source, uInt len));
- extern int zmemcmp OF((const Bytef* s1, const Bytef* s2, uInt len));
- extern void zmemzero OF((Bytef* dest, uInt len));
-#endif
-
-/* Diagnostic functions */
-#ifdef DEBUG
-# include <stdio.h>
- extern int z_verbose;
- extern void z_error OF((char *m));
-# define Assert(cond,msg) {if(!(cond)) z_error(msg);}
-# define Trace(x) {if (z_verbose>=0) fprintf x ;}
-# define Tracev(x) {if (z_verbose>0) fprintf x ;}
-# define Tracevv(x) {if (z_verbose>1) fprintf x ;}
-# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;}
-# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;}
-#else
-# define Assert(cond,msg)
-# define Trace(x)
-# define Tracev(x)
-# define Tracevv(x)
-# define Tracec(c,x)
-# define Tracecv(c,x)
-#endif
-
-
-typedef uLong (ZEXPORT *check_func) OF((uLong check, const Bytef *buf,
- uInt len));
-voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size));
-void zcfree OF((voidpf opaque, voidpf ptr));
-
-#define ZALLOC(strm, items, size) \
- (*((strm)->zalloc))((strm)->opaque, (items), (size))
-#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr))
-#define TRY_FREE(s, p) {if (p) ZFREE(s, p);}
-
-#endif /* _Z_UTIL_H */
diff --git a/make.bat b/make.bat
deleted file mode 100644
index 82c90d2..0000000
--- a/make.bat
+++ /dev/null
@@ -1,60 +0,0 @@
-@echo off
-REM make script for Microsoft Visual C++
-REM ...and MINGW and Borland 5.5 also!
-
-if "%1"=="bcc" SET CC=borland
-if "%1"=="mingw" SET CC=mingw
-if "%1"=="msvc" SET CC=msvc
-if "%1"=="" goto USAGE
-
-if "%CC%"=="msvc" SET MAKE=nmake
-if not "%CC%"=="msvc" SET MAKE=make
-
-SET MODE=release
-if "%2"=="debug" SET MODE=debug
-
-REM use perl to create the config file
-perl wintools\make.pl %CC%
-
-type makeconfig > Makefile
-type Makefile.win_%MAKE%.in >>Makefile
-type makeconfig > qtools\Makefile
-type qtools\Makefile.in >>qtools\Makefile
-type makeconfig > libpng\Makefile
-type libpng\Makefile.in >>libpng\Makefile
-type makeconfig > libmd5\Makefile
-type libmd5\Makefile.in >>libmd5\Makefile
-type makeconfig > src\Makefile
-type src\Makefile.in >>src\Makefile
-type makeconfig > examples\Makefile
-type examples\Makefile.win.in >>examples\Makefile
-type makeconfig > doc\Makefile
-type doc\Makefile.win_%MAKE%.in >>doc\Makefile
-type makeconfig > addon\doxywizard\Makefile
-type addon\doxywizard\Makefile.win_%MAKE%.in >>addon\doxywizard\Makefile
-type makeconfig > addon\doxmlparser\src\Makefile
-type addon\doxmlparser\src\Makefile.in >>addon\doxmlparser\src\Makefile
-
-REM build in release or debug mode
-REM sed is used to replace $extraopts by either debug or release while copying
-sed "s/\$extraopts/%MODE%/g" qtools\qtools.pro.in >qtools\qtools.pro
-sed "s/\$extraopts/%MODE%/g" libpng\libpng.pro.in >libpng\libpng.pro
-sed "s/\$extraopts/%MODE%/g" libmd5\libmd5.pro.in >libmd5\libmd5.pro
-sed "s/\$extraopts/%MODE%/g" src\libdoxygen.pro.in >src\libdoxygen.pro
-sed "s/\$extraopts/%MODE%/g" src\libdoxycfg.pro.in >src\libdoxycfg.pro
-sed "s/\$extraopts/%MODE%/g" src\doxygen.pro.in >src\doxygen.pro
-sed "s/\$extraopts/%MODE%/g" src\doxytag.pro.in >src\doxytag.pro
-sed "s/\$extraopts/%MODE%/g" addon\doxywizard\doxywizard.pro.in >addon\doxywizard\doxywizard.pro
-
-REM run make
-%MAKE%.exe
-goto END
-
-:USAGE
-echo "Call with '%0 [bcc|mingw|msvc] [debug]'!"
-echo " bcc: compile with Borland C++"
-echo " mingw: compile with GCC for windows (see www.mingw.org)"
-echo " msvc: compile with Microsoft Visual C++"
-
-:END
-
diff --git a/packages/rpm/build.sh b/packages/rpm/build.sh
deleted file mode 100644
index 64ab34b..0000000
--- a/packages/rpm/build.sh
+++ /dev/null
@@ -1,21 +0,0 @@
-#!/bin/bash
-
-set -e
-
-[ $(whoami) == "root" ] || {
-echo "Don't I need to be root to make RPM packages ?"
-}
-
-RPMBUILDPLACE=/usr/src/RPM/
-
-cp doxygen.spec $RPMBUILDPLACE/SPECS
-
-ls *.patch && {
-cp *.patch $RPMBUILDPLACE/SOURCES
-}
-
-cp ../../../doxygen*.gz $RPMBUILDPLACE/SOURCES
-
-urpmi --auto rpm-build libqt3-devel flex tetex-latex dvips
-
-rpm -ba SPECS/doxygen.spec
diff --git a/packages/rpm/doxygen.spec b/packages/rpm/doxygen.spec
deleted file mode 100644
index b27d9d7..0000000
--- a/packages/rpm/doxygen.spec
+++ /dev/null
@@ -1,150 +0,0 @@
-Summary: A documentation system for C/C++.
-Name: doxygen
-Version: 1.4.2
-Release: 1
-Epoch: 1
-Source0: ftp://ftp.stack.nl/pub/users/dimitri/%{name}-%{version}.src.tar.gz
-Group: Development/Tools
-License: GPL
-Url: http://www.stack.nl/~dimitri/doxygen/index.html
-Prefix: %{_prefix}
-BuildPrereq: libstdc++-devel >= 2.96, /usr/bin/perl, /usr/bin/latex, /usr/bin/dvips
-BuildRoot: %{_tmppath}/%{name}-%{version}-root
-
-%description
-Doxygen can generate an online class browser (in HTML) and/or a
-reference manual (in LaTeX) from a set of documented source files. The
-documentation is extracted directly from the sources. Doxygen can
-also be configured to extract the code structure from undocumented
-source files.
-
-%package doxywizard
-Summary: A GUI for creating and editing configuration files.
-Group: User Interface/X
-Requires: %{name} = %{version}
-BuildPrereq: qt3-devel => 2.3.0, flex
-Requires: qt >= 2.3.0
-
-%description doxywizard
-Doxywizard is a GUI for creating and editing configuration files that
-are used by doxygen.
-
-%prep
-%setup -q
-
-%build
-QTDIR="" && . /etc/profile.d/qt*.sh
-export OLD_PO_FILE_INPUT=yes
-
-./configure --prefix %{_prefix} --shared --release --with-doxywizard
-make all docs
-
-%install
-rm -rf ${RPM_BUILD_ROOT}
-
-export OLD_PO_FILE_INPUT=yes
-make install INSTALL=$RPM_BUILD_ROOT%{_prefix}
-
-%clean
-rm -rf ${RPM_BUILD_ROOT}
-
-%files
-%defattr(-,root,root)
-%doc LANGUAGE.HOWTO README examples html
-%{_bindir}/doxygen
-%{_bindir}/doxytag
-%doc /usr/man/man1/*
-
-%files doxywizard
-%defattr(-,root,root)
-%{_bindir}/doxywizard
-
-%changelog
-* Sun Jan 06 2002 Than Ngo <than@redhat.com> 1.2.13.1-1
-- update to 1.2.13.1
-
-* Sun Dec 30 2001 Jeff Johnson <jbj@redhat.com> 1.2.13-1
-- update to 1.2.13
-
-* Sun Nov 18 2001 Than Ngo <than@redhat.com> 1.2.12-1
-- update to 1.2.12
-- s/Copyright/License
-
-* Wed Sep 12 2001 Tim Powers <timp@redhat.com>
-- rebuild with new gcc and binutils
-
-* Wed Jun 13 2001 Than Ngo <than@redhat.com>
-- update tp 1.2.8.1
-- make doxywizard as separat package
-- fix to use install as default
-
-* Tue Jun 05 2001 Than Ngo <than@redhat.com>
-- update to 1.2.8
-
-* Tue May 01 2001 Than Ngo <than@redhat.com>
-- update to 1.2.7
-- clean up specfile
-- patch to use RPM_OPT_FLAG
-
-* Wed Mar 14 2001 Jeff Johnson <jbj@redhat.com>
-- update to 1.2.6
-
-* Wed Feb 28 2001 Trond Eivind Glomsrød <teg@redhat.com>
-- rebuild
-
-* Tue Dec 26 2000 Than Ngo <than@redhat.com>
-- update to 1.2.4
-- remove excludearch ia64
-- bzip2 sources
-
-* Mon Dec 11 2000 Than Ngo <than@redhat.com>
-- rebuild with the fixed fileutils
-
-* Mon Oct 30 2000 Jeff Johnson <jbj@redhat.com>
-- update to 1.2.3.
-
-* Sun Oct 8 2000 Jeff Johnson <jbj@redhat.com>
-- update to 1.2.2.
-- enable doxywizard.
-
-* Sat Aug 19 2000 Preston Brown <pbrown@redhat.com>
-- 1.2.1 is latest stable, so we upgrade before Winston is released.
-
-* Wed Jul 12 2000 Prospector <bugzilla@redhat.com>
-- automatic rebuild
-
-* Tue Jul 4 2000 Jakub Jelinek <jakub@redhat.com>
-- Rebuild with new C++
-
-* Fri Jun 30 2000 Florian La Roche <laroche@redhat.de>
-- fix QTDIR detection
-
-* Fri Jun 09 2000 Preston Brown <pbrown@redhat.com>
-- compile on x86 w/o optimization, revert when compiler fixed!!
-
-* Wed Jun 07 2000 Preston Brown <pbrown@redhat.com>
-- use newer RPM macros
-
-* Tue Jun 6 2000 Jeff Johnson <jbj@redhat.com>
-- add to distro.
-
-* Tue May 9 2000 Tim Powers <timp@redhat.com>
-- rebuilt for 7.0
-
-* Wed Feb 2 2000 Bernhard Rosenkraenzer <bero@redhat.com>
-- recompile with current Qt (2.1.0/1.45)
-
-* Wed Jan 5 2000 Jeff Johnson <jbj@redhat.com>
-- update to 1.0.0.
-- recompile with qt-2.0.1 if available.
-- relocatable package.
-
-* Mon Nov 8 1999 Tim Powers <timp@redhat.com>
--updated to 0.49-991106
-
-* Tue Jul 13 1999 Tim Powers <timp@redhat.com>
-- updated source
-- cleaned up some stuff in the spec file
-
-* Thu Apr 22 1999 Jeff Johnson <jbj@redhat.com>
-- Create Power Tools 6.0 package.
diff --git a/qtools/.cvsignore b/qtools/.cvsignore
deleted file mode 100644
index 590a919..0000000
--- a/qtools/.cvsignore
+++ /dev/null
@@ -1,3 +0,0 @@
-Makefile
-qtools.pro
-Makefile.qtools
diff --git a/qtools/Doxyfile b/qtools/Doxyfile
deleted file mode 100644
index d32fdca..0000000
--- a/qtools/Doxyfile
+++ /dev/null
@@ -1,1144 +0,0 @@
-# Doxyfile 1.3.7
-
-# This file describes the settings to be used by the documentation system
-# doxygen (www.doxygen.org) for a project
-#
-# All text after a hash (#) is considered a comment and will be ignored
-# The format is:
-# TAG = value [value, ...]
-# For lists items can also be appended using:
-# TAG += value [value, ...]
-# Values that contain spaces should be placed between quotes (" ")
-
-#---------------------------------------------------------------------------
-# Project related configuration options
-#---------------------------------------------------------------------------
-
-# The PROJECT_NAME tag is a single word (or a sequence of words surrounded
-# by quotes) that should identify the project.
-
-PROJECT_NAME = Doxygen
-
-# The PROJECT_NUMBER tag can be used to enter a project or revision number.
-# This could be handy for archiving the generated documentation or
-# if some version control system is used.
-
-PROJECT_NUMBER =
-
-# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute)
-# base path where the generated documentation will be put.
-# If a relative path is entered, it will be relative to the location
-# where doxygen was started. If left blank the current directory will be used.
-
-OUTPUT_DIRECTORY = ../qtools_docs
-
-# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create
-# 2 levels of 10 sub-directories under the output directory of each output
-# format and will distribute the generated files over these directories.
-# Enabling this option can be useful when feeding doxygen a huge amount of source
-# files, where putting all generated files in the same directory would otherwise
-# cause performance problems for the file system.
-
-CREATE_SUBDIRS = NO
-
-# The OUTPUT_LANGUAGE tag is used to specify the language in which all
-# documentation generated by doxygen is written. Doxygen will use this
-# information to generate all constant output in the proper language.
-# The default language is English, other supported languages are:
-# Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, Dutch,
-# Finnish, French, German, Greek, Hungarian, Italian, Japanese, Japanese-en
-# (Japanese with English messages), Korean, Korean-en, Norwegian, Polish, Portuguese,
-# Romanian, Russian, Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.
-
-OUTPUT_LANGUAGE = English
-
-# This tag can be used to specify the encoding used in the generated output.
-# The encoding is not always determined by the language that is chosen,
-# but also whether or not the output is meant for Windows or non-Windows users.
-# In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES
-# forces the Windows encoding (this is the default for the Windows binary),
-# whereas setting the tag to NO uses a Unix-style encoding (the default for
-# all platforms other than Windows).
-
-USE_WINDOWS_ENCODING = NO
-
-# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will
-# include brief member descriptions after the members that are listed in
-# the file and class documentation (similar to JavaDoc).
-# Set to NO to disable this.
-
-BRIEF_MEMBER_DESC = YES
-
-# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend
-# the brief description of a member or function before the detailed description.
-# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the
-# brief descriptions will be completely suppressed.
-
-REPEAT_BRIEF = YES
-
-# This tag implements a quasi-intelligent brief description abbreviator
-# that is used to form the text in various listings. Each string
-# in this list, if found as the leading text of the brief description, will be
-# stripped from the text and the result after processing the whole list, is used
-# as the annotated text. Otherwise, the brief description is used as-is. If left
-# blank, the following values are used ("$name" is automatically replaced with the
-# name of the entity): "The $name class" "The $name widget" "The $name file"
-# "is" "provides" "specifies" "contains" "represents" "a" "an" "the"
-
-ABBREVIATE_BRIEF =
-
-# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then
-# Doxygen will generate a detailed section even if there is only a brief
-# description.
-
-ALWAYS_DETAILED_SEC = NO
-
-# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all inherited
-# members of a class in the documentation of that class as if those members were
-# ordinary class members. Constructors, destructors and assignment operators of
-# the base classes will not be shown.
-
-INLINE_INHERITED_MEMB = NO
-
-# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full
-# path before files name in the file list and in the header files. If set
-# to NO the shortest path that makes the file name unique will be used.
-
-FULL_PATH_NAMES = YES
-
-# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag
-# can be used to strip a user-defined part of the path. Stripping is
-# only done if one of the specified strings matches the left-hand part of
-# the path. The tag can be used to show relative paths in the file list.
-# If left blank the directory from which doxygen is run is used as the
-# path to strip.
-
-STRIP_FROM_PATH = $(PWD)/
-
-# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of
-# the path mentioned in the documentation of a class, which tells
-# the reader which header file to include in order to use a class.
-# If left blank only the name of the header file containing the class
-# definition is used. Otherwise one should specify the include paths that
-# are normally passed to the compiler using the -I flag.
-
-STRIP_FROM_INC_PATH =
-
-# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter
-# (but less readable) file names. This can be useful is your file systems
-# doesn't support long names like on DOS, Mac, or CD-ROM.
-
-SHORT_NAMES = NO
-
-# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen
-# will interpret the first line (until the first dot) of a JavaDoc-style
-# comment as the brief description. If set to NO, the JavaDoc
-# comments will behave just like the Qt-style comments (thus requiring an
-# explicit @brief command for a brief description.
-
-JAVADOC_AUTOBRIEF = YES
-
-# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen
-# treat a multi-line C++ special comment block (i.e. a block of //! or ///
-# comments) as a brief description. This used to be the default behaviour.
-# The new default is to treat a multi-line C++ comment block as a detailed
-# description. Set this tag to YES if you prefer the old behaviour instead.
-
-MULTILINE_CPP_IS_BRIEF = NO
-
-# If the DETAILS_AT_TOP tag is set to YES then Doxygen
-# will output the detailed description near the top, like JavaDoc.
-# If set to NO, the detailed description appears after the member
-# documentation.
-
-DETAILS_AT_TOP = NO
-
-# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented
-# member inherits the documentation from any documented member that it
-# re-implements.
-
-INHERIT_DOCS = YES
-
-# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC
-# tag is set to YES, then doxygen will reuse the documentation of the first
-# member in the group (if any) for the other members of the group. By default
-# all members of a group must be documented explicitly.
-
-DISTRIBUTE_GROUP_DOC = NO
-
-# The TAB_SIZE tag can be used to set the number of spaces in a tab.
-# Doxygen uses this value to replace tabs by spaces in code fragments.
-
-TAB_SIZE = 8
-
-# This tag can be used to specify a number of aliases that acts
-# as commands in the documentation. An alias has the form "name=value".
-# For example adding "sideeffect=\par Side Effects:\n" will allow you to
-# put the command \sideeffect (or @sideeffect) in the documentation, which
-# will result in a user-defined paragraph with heading "Side Effects:".
-# You can put \n's in the value part of an alias to insert newlines.
-
-ALIASES =
-
-# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C sources
-# only. Doxygen will then generate output that is more tailored for C.
-# For instance, some of the names that are used will be different. The list
-# of all members will be omitted, etc.
-
-OPTIMIZE_OUTPUT_FOR_C = NO
-
-# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java sources
-# only. Doxygen will then generate output that is more tailored for Java.
-# For instance, namespaces will be presented as packages, qualified scopes
-# will look different, etc.
-
-OPTIMIZE_OUTPUT_JAVA = NO
-
-# Set the SUBGROUPING tag to YES (the default) to allow class member groups of
-# the same type (for instance a group of public functions) to be put as a
-# subgroup of that type (e.g. under the Public Functions section). Set it to
-# NO to prevent subgrouping. Alternatively, this can be done per class using
-# the \nosubgrouping command.
-
-SUBGROUPING = YES
-
-#---------------------------------------------------------------------------
-# Build related configuration options
-#---------------------------------------------------------------------------
-
-# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in
-# documentation are documented, even if no documentation was available.
-# Private class members and static file members will be hidden unless
-# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES
-
-EXTRACT_ALL = YES
-
-# If the EXTRACT_PRIVATE tag is set to YES all private members of a class
-# will be included in the documentation.
-
-EXTRACT_PRIVATE = YES
-
-# If the EXTRACT_STATIC tag is set to YES all static members of a file
-# will be included in the documentation.
-
-EXTRACT_STATIC = YES
-
-# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs)
-# defined locally in source files will be included in the documentation.
-# If set to NO only classes defined in header files are included.
-
-EXTRACT_LOCAL_CLASSES = YES
-
-# This flag is only useful for Objective-C code. When set to YES local
-# methods, which are defined in the implementation section but not in
-# the interface are included in the documentation.
-# If set to NO (the default) only methods in the interface are included.
-
-EXTRACT_LOCAL_METHODS = NO
-
-# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all
-# undocumented members of documented classes, files or namespaces.
-# If set to NO (the default) these members will be included in the
-# various overviews, but no documentation section is generated.
-# This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_MEMBERS = NO
-
-# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all
-# undocumented classes that are normally visible in the class hierarchy.
-# If set to NO (the default) these classes will be included in the various
-# overviews. This option has no effect if EXTRACT_ALL is enabled.
-
-HIDE_UNDOC_CLASSES = NO
-
-# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all
-# friend (class|struct|union) declarations.
-# If set to NO (the default) these declarations will be included in the
-# documentation.
-
-HIDE_FRIEND_COMPOUNDS = NO
-
-# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any
-# documentation blocks found inside the body of a function.
-# If set to NO (the default) these blocks will be appended to the
-# function's detailed documentation block.
-
-HIDE_IN_BODY_DOCS = NO
-
-# The INTERNAL_DOCS tag determines if documentation
-# that is typed after a \internal command is included. If the tag is set
-# to NO (the default) then the documentation will be excluded.
-# Set it to YES to include the internal documentation.
-
-INTERNAL_DOCS = NO
-
-# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate
-# file names in lower-case letters. If set to 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
-# users are advised to set this option to NO.
-
-CASE_SENSE_NAMES = NO
-
-# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen
-# will show members with their full class and namespace scopes in the
-# documentation. If set to YES the scope will be hidden.
-
-HIDE_SCOPE_NAMES = NO
-
-# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen
-# will put a list of the files that are included by a file in the documentation
-# of that file.
-
-SHOW_INCLUDE_FILES = YES
-
-# If the INLINE_INFO tag is set to YES (the default) then a tag [inline]
-# is inserted in the documentation for inline members.
-
-INLINE_INFO = YES
-
-# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen
-# will sort the (detailed) documentation of file and class members
-# alphabetically by member name. If set to NO the members will appear in
-# declaration order.
-
-SORT_MEMBER_DOCS = YES
-
-# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the
-# brief documentation of file, namespace and class members alphabetically
-# by member name. If set to NO (the default) the members will appear in
-# declaration order.
-
-SORT_BRIEF_DOCS = NO
-
-# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be
-# sorted by fully-qualified names, including namespaces. If set to
-# NO (the default), the class list will be sorted only by class name,
-# not including the namespace part.
-# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.
-# Note: This option applies only to the class list, not to the
-# alphabetical list.
-
-SORT_BY_SCOPE_NAME = NO
-
-# The GENERATE_TODOLIST tag can be used to enable (YES) or
-# disable (NO) the todo list. This list is created by putting \todo
-# commands in the documentation.
-
-GENERATE_TODOLIST = YES
-
-# The GENERATE_TESTLIST tag can be used to enable (YES) or
-# disable (NO) the test list. This list is created by putting \test
-# commands in the documentation.
-
-GENERATE_TESTLIST = YES
-
-# The GENERATE_BUGLIST tag can be used to enable (YES) or
-# disable (NO) the bug list. This list is created by putting \bug
-# commands in the documentation.
-
-GENERATE_BUGLIST = YES
-
-# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or
-# disable (NO) the deprecated list. This list is created by putting
-# \deprecated commands in the documentation.
-
-GENERATE_DEPRECATEDLIST= YES
-
-# The ENABLED_SECTIONS tag can be used to enable conditional
-# documentation sections, marked by \if sectionname ... \endif.
-
-ENABLED_SECTIONS =
-
-# The MAX_INITIALIZER_LINES tag determines the maximum number of lines
-# the initial value of a variable or define consists of for it to appear in
-# the documentation. If the initializer consists of more lines than specified
-# here it will be hidden. Use a value of 0 to hide initializers completely.
-# The appearance of the initializer of individual variables and defines in the
-# documentation can be controlled using \showinitializer or \hideinitializer
-# command in the documentation regardless of this setting.
-
-MAX_INITIALIZER_LINES = 30
-
-# Set the SHOW_USED_FILES tag to NO to disable the list of files generated
-# at the bottom of the documentation of classes and structs. If set to YES the
-# list will mention the files that were used to generate the documentation.
-
-SHOW_USED_FILES = YES
-
-#---------------------------------------------------------------------------
-# configuration options related to warning and progress messages
-#---------------------------------------------------------------------------
-
-# The QUIET tag can be used to turn on/off the messages that are generated
-# by doxygen. Possible values are YES and NO. If left blank NO is used.
-
-QUIET = NO
-
-# The WARNINGS tag can be used to turn on/off the warning messages that are
-# generated by doxygen. Possible values are YES and NO. If left blank
-# NO is used.
-
-WARNINGS = YES
-
-# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings
-# for undocumented members. If EXTRACT_ALL is set to YES then this flag will
-# automatically be disabled.
-
-WARN_IF_UNDOCUMENTED = YES
-
-# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for
-# potential errors in the documentation, such as not documenting some
-# parameters in a documented function, or documenting parameters that
-# don't exist or using markup commands wrongly.
-
-WARN_IF_DOC_ERROR = YES
-
-# The WARN_FORMAT tag determines the format of the warning messages that
-# doxygen can produce. The string should contain the $file, $line, and $text
-# tags, which will be replaced by the file and line number from which the
-# warning originated and the warning text.
-
-WARN_FORMAT = "$file:$line: $text"
-
-# The WARN_LOGFILE tag can be used to specify a file to which warning
-# and error messages should be written. If left blank the output is written
-# to stderr.
-
-WARN_LOGFILE =
-
-#---------------------------------------------------------------------------
-# configuration options related to the input files
-#---------------------------------------------------------------------------
-
-# The INPUT tag can be used to specify the files and/or directories that contain
-# documented source files. You may enter file names like "myfile.cpp" or
-# directories like "/usr/src/myproject". Separate the files or directories
-# with spaces.
-
-INPUT = .
-
-# If the value of the INPUT tag contains directories, you can use the
-# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank the following patterns are tested:
-# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx *.hpp
-# *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm
-
-FILE_PATTERNS = *.h \
- *.cpp \
- *.doc
-
-# The RECURSIVE tag can be used to turn specify whether or not subdirectories
-# should be searched for input files as well. Possible values are YES and NO.
-# If left blank NO is used.
-
-RECURSIVE = NO
-
-# The EXCLUDE tag can be used to specify files and/or directories that should
-# excluded from the INPUT source files. This way you can easily exclude a
-# subdirectory from a directory tree whose root is specified with the INPUT tag.
-
-EXCLUDE =
-
-# The EXCLUDE_SYMLINKS tag can be used select whether or not files or directories
-# that are symbolic links (a Unix filesystem feature) are excluded from the input.
-
-EXCLUDE_SYMLINKS = NO
-
-# If the value of the INPUT tag contains directories, you can use the
-# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude
-# certain files from those directories.
-
-EXCLUDE_PATTERNS =
-
-# The EXAMPLE_PATH tag can be used to specify one or more files or
-# directories that contain example code fragments that are included (see
-# the \include command).
-
-EXAMPLE_PATH =
-
-# If the value of the EXAMPLE_PATH tag contains directories, you can use the
-# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp
-# and *.h) to filter out the source-files in the directories. If left
-# blank all files are included.
-
-EXAMPLE_PATTERNS =
-
-# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be
-# searched for input files to be used with the \include or \dontinclude
-# commands irrespective of the value of the RECURSIVE tag.
-# Possible values are YES and NO. If left blank NO is used.
-
-EXAMPLE_RECURSIVE = NO
-
-# The IMAGE_PATH tag can be used to specify one or more files or
-# directories that contain image that are included in the documentation (see
-# the \image command).
-
-IMAGE_PATH =
-
-# The INPUT_FILTER tag can be used to specify a program that doxygen should
-# invoke to filter for each input file. Doxygen will invoke the filter program
-# by executing (via popen()) the command <filter> <input-file>, where <filter>
-# is the value of the INPUT_FILTER tag, and <input-file> is the name of an
-# input file. Doxygen will then use the output that the filter program writes
-# to standard output.
-
-INPUT_FILTER =
-
-# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using
-# INPUT_FILTER) will be used to filter the input files when producing source
-# files to browse (i.e. when SOURCE_BROWSER is set to YES).
-
-FILTER_SOURCE_FILES = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to source browsing
-#---------------------------------------------------------------------------
-
-# If the SOURCE_BROWSER tag is set to YES then a list of source files will
-# be generated. Documented entities will be cross-referenced with these sources.
-# Note: To get rid of all source code in the generated output, make sure also
-# VERBATIM_HEADERS is set to NO.
-
-SOURCE_BROWSER = YES
-
-# Setting the INLINE_SOURCES tag to YES will include the body
-# of functions and classes directly in the documentation.
-
-INLINE_SOURCES = NO
-
-# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct
-# doxygen to hide any special comment blocks from generated source code
-# fragments. Normal C and C++ comments will always remain visible.
-
-STRIP_CODE_COMMENTS = YES
-
-# If the REFERENCED_BY_RELATION tag is set to YES (the default)
-# then for each documented function all documented
-# functions referencing it will be listed.
-
-REFERENCED_BY_RELATION = YES
-
-# If the REFERENCES_RELATION tag is set to YES (the default)
-# then for each documented function all documented entities
-# called/used by that function will be listed.
-
-REFERENCES_RELATION = YES
-
-# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen
-# will generate a verbatim copy of the header file for each class for
-# which an include is specified. Set to NO to disable this.
-
-VERBATIM_HEADERS = YES
-
-#---------------------------------------------------------------------------
-# configuration options related to the alphabetical class index
-#---------------------------------------------------------------------------
-
-# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index
-# of all compounds will be generated. Enable this if the project
-# contains a lot of classes, structs, unions or interfaces.
-
-ALPHABETICAL_INDEX = YES
-
-# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then
-# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns
-# in which this list will be split (can be a number in the range [1..20])
-
-COLS_IN_ALPHA_INDEX = 4
-
-# In case all classes in a project start with a common prefix, all
-# classes will be put under the same header in the alphabetical index.
-# The IGNORE_PREFIX tag can be used to specify one or more prefixes that
-# should be ignored while generating the index headers.
-
-IGNORE_PREFIX = Q
-
-#---------------------------------------------------------------------------
-# configuration options related to the HTML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_HTML tag is set to YES (the default) Doxygen will
-# generate HTML output.
-
-GENERATE_HTML = YES
-
-# The HTML_OUTPUT tag is used to specify where the HTML docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `html' will be used as the default path.
-
-HTML_OUTPUT =
-
-# The HTML_FILE_EXTENSION tag can be used to specify the file extension for
-# each generated HTML page (for example: .htm,.php,.asp). If it is left blank
-# doxygen will generate files with .html extension.
-
-HTML_FILE_EXTENSION = .html
-
-# The HTML_HEADER tag can be used to specify a personal HTML header for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard header.
-
-HTML_HEADER =
-
-# The HTML_FOOTER tag can be used to specify a personal HTML footer for
-# each generated HTML page. If it is left blank doxygen will generate a
-# standard footer.
-
-HTML_FOOTER =
-
-# The HTML_STYLESHEET tag can be used to specify a user-defined cascading
-# style sheet that is used by each HTML page. It can be used to
-# fine-tune the look of the HTML output. If the tag is left blank doxygen
-# will generate a default style sheet. Note that doxygen will try to copy
-# the style sheet file to the HTML output directory, so don't put your own
-# stylesheet in the HTML output directory as well, or it will be erased!
-
-HTML_STYLESHEET =
-
-# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes,
-# files or namespaces will be aligned in HTML using tables. If set to
-# NO a bullet list will be used.
-
-HTML_ALIGN_MEMBERS = YES
-
-# If the GENERATE_HTMLHELP tag is set to YES, additional index files
-# will be generated that can be used as input for tools like the
-# Microsoft HTML help workshop to generate a compressed HTML help file (.chm)
-# of the generated HTML documentation.
-
-GENERATE_HTMLHELP = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can
-# be used to specify the file name of the resulting .chm file. You
-# can add a path in front of the file if the result should not be
-# written to the html output directory.
-
-CHM_FILE =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can
-# be used to specify the location (absolute path including file name) of
-# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run
-# the HTML help compiler on the generated index.hhp.
-
-HHC_LOCATION =
-
-# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag
-# controls if a separate .chi index file is generated (YES) or that
-# it should be included in the master .chm file (NO).
-
-GENERATE_CHI = NO
-
-# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag
-# controls whether a binary table of contents is generated (YES) or a
-# normal table of contents (NO) in the .chm file.
-
-BINARY_TOC = NO
-
-# The TOC_EXPAND flag can be set to YES to add extra items for group members
-# to the contents of the HTML help documentation and to the tree view.
-
-TOC_EXPAND = NO
-
-# The DISABLE_INDEX tag can be used to turn on/off the condensed index at
-# top of each HTML page. The value NO (the default) enables the index and
-# the value YES disables it.
-
-DISABLE_INDEX = NO
-
-# This tag can be used to set the number of enum values (range [1..20])
-# that doxygen will group on one line in the generated HTML documentation.
-
-ENUM_VALUES_PER_LINE = 4
-
-# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be
-# generated containing a tree-like index structure (just like the one that
-# is generated for HTML Help). For this to work a browser that supports
-# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+,
-# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are
-# probably better off using the HTML help feature.
-
-GENERATE_TREEVIEW = NO
-
-# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be
-# used to set the initial width (in pixels) of the frame in which the tree
-# is shown.
-
-TREEVIEW_WIDTH = 250
-
-#---------------------------------------------------------------------------
-# configuration options related to the LaTeX output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will
-# generate Latex output.
-
-GENERATE_LATEX = NO
-
-# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `latex' will be used as the default path.
-
-LATEX_OUTPUT =
-
-# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be
-# invoked. If left blank `latex' will be used as the default command name.
-
-LATEX_CMD_NAME = latex
-
-# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to
-# generate index for LaTeX. If left blank `makeindex' will be used as the
-# default command name.
-
-MAKEINDEX_CMD_NAME = makeindex
-
-# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact
-# LaTeX documents. This may be useful for small projects and may help to
-# save some trees in general.
-
-COMPACT_LATEX = NO
-
-# The PAPER_TYPE tag can be used to set the paper type that is used
-# by the printer. Possible values are: a4, a4wide, letter, legal and
-# executive. If left blank a4wide will be used.
-
-PAPER_TYPE = a4wide
-
-# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX
-# packages that should be included in the LaTeX output.
-
-EXTRA_PACKAGES =
-
-# The LATEX_HEADER tag can be used to specify a personal LaTeX header for
-# the generated latex document. The header should contain everything until
-# the first chapter. If it is left blank doxygen will generate a
-# standard header. Notice: only use this tag if you know what you are doing!
-
-LATEX_HEADER =
-
-# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated
-# is prepared for conversion to pdf (using ps2pdf). The pdf file will
-# contain links (just like the HTML output) instead of page references
-# This makes the output suitable for online browsing using a pdf viewer.
-
-PDF_HYPERLINKS = NO
-
-# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of
-# plain latex in the generated Makefile. Set this option to YES to get a
-# higher quality PDF documentation.
-
-USE_PDFLATEX = NO
-
-# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode.
-# command to the generated LaTeX files. This will instruct LaTeX to keep
-# running if errors occur, instead of asking the user for help.
-# This option is also used when generating formulas in HTML.
-
-LATEX_BATCHMODE = NO
-
-# If LATEX_HIDE_INDICES is set to YES then doxygen will not
-# include the index chapters (such as File Index, Compound Index, etc.)
-# in the output.
-
-LATEX_HIDE_INDICES = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the RTF output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output
-# The RTF output is optimized for Word 97 and may not look very pretty with
-# other RTF readers or editors.
-
-GENERATE_RTF = NO
-
-# The RTF_OUTPUT tag is used to specify where the RTF docs will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `rtf' will be used as the default path.
-
-RTF_OUTPUT =
-
-# If the COMPACT_RTF tag is set to YES Doxygen generates more compact
-# RTF documents. This may be useful for small projects and may help to
-# save some trees in general.
-
-COMPACT_RTF = NO
-
-# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated
-# will contain hyperlink fields. The RTF file will
-# contain links (just like the HTML output) instead of page references.
-# This makes the output suitable for online browsing using WORD or other
-# programs which support those fields.
-# Note: wordpad (write) and others do not support links.
-
-RTF_HYPERLINKS = NO
-
-# Load stylesheet definitions from file. Syntax is similar to doxygen's
-# config file, i.e. a series of assignments. You only have to provide
-# replacements, missing definitions are set to their default value.
-
-RTF_STYLESHEET_FILE =
-
-# Set optional variables used in the generation of an rtf document.
-# Syntax is similar to doxygen's config file.
-
-RTF_EXTENSIONS_FILE =
-
-#---------------------------------------------------------------------------
-# configuration options related to the man page output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_MAN tag is set to YES (the default) Doxygen will
-# generate man pages
-
-GENERATE_MAN = NO
-
-# The MAN_OUTPUT tag is used to specify where the man pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `man' will be used as the default path.
-
-MAN_OUTPUT =
-
-# The MAN_EXTENSION tag determines the extension that is added to
-# the generated man pages (default is the subroutine's section .3)
-
-MAN_EXTENSION = .3
-
-# If the MAN_LINKS tag is set to YES and Doxygen generates man output,
-# then it will generate one additional man file for each entity
-# documented in the real man page(s). These additional files
-# only source the real man page, but without them the man command
-# would be unable to find the correct page. The default is NO.
-
-MAN_LINKS = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the XML output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_XML tag is set to YES Doxygen will
-# generate an XML file that captures the structure of
-# the code including all documentation.
-
-GENERATE_XML = YES
-
-# The XML_OUTPUT tag is used to specify where the XML pages will be put.
-# If a relative path is entered the value of OUTPUT_DIRECTORY will be
-# put in front of it. If left blank `xml' will be used as the default path.
-
-XML_OUTPUT = xml
-
-# The XML_SCHEMA tag can be used to specify an XML schema,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
-
-XML_SCHEMA =
-
-# The XML_DTD tag can be used to specify an XML DTD,
-# which can be used by a validating XML parser to check the
-# syntax of the XML files.
-
-XML_DTD =
-
-# If the XML_PROGRAMLISTING tag is set to YES Doxygen will
-# dump the program listings (including syntax highlighting
-# and cross-referencing information) to the XML output. Note that
-# enabling this will significantly increase the size of the XML output.
-
-XML_PROGRAMLISTING = YES
-
-#---------------------------------------------------------------------------
-# configuration options for the AutoGen Definitions output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will
-# generate an AutoGen Definitions (see autogen.sf.net) file
-# that captures the structure of the code including all
-# documentation. Note that this feature is still experimental
-# and incomplete at the moment.
-
-GENERATE_AUTOGEN_DEF = NO
-
-#---------------------------------------------------------------------------
-# configuration options related to the Perl module output
-#---------------------------------------------------------------------------
-
-# If the GENERATE_PERLMOD tag is set to YES Doxygen will
-# generate a Perl module file that captures the structure of
-# the code including all documentation. Note that this
-# feature is still experimental and incomplete at the
-# moment.
-
-GENERATE_PERLMOD = NO
-
-# If the PERLMOD_LATEX tag is set to YES Doxygen will generate
-# the necessary Makefile rules, Perl scripts and LaTeX code to be able
-# to generate PDF and DVI output from the Perl module output.
-
-PERLMOD_LATEX = NO
-
-# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be
-# nicely formatted so it can be parsed by a human reader. This is useful
-# if you want to understand what is going on. On the other hand, if this
-# tag is set to NO the size of the Perl module output will be much smaller
-# and Perl will parse it just the same.
-
-PERLMOD_PRETTY = YES
-
-# The names of the make variables in the generated doxyrules.make file
-# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX.
-# This is useful so different doxyrules.make files included by the same
-# Makefile don't overwrite each other's variables.
-
-PERLMOD_MAKEVAR_PREFIX =
-
-#---------------------------------------------------------------------------
-# Configuration options related to the preprocessor
-#---------------------------------------------------------------------------
-
-# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will
-# evaluate all C-preprocessor directives found in the sources and include
-# files.
-
-ENABLE_PREPROCESSING = YES
-
-# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro
-# names in the source code. If set to NO (the default) only conditional
-# compilation will be performed. Macro expansion can be done in a controlled
-# way by setting EXPAND_ONLY_PREDEF to YES.
-
-MACRO_EXPANSION = YES
-
-# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES
-# then the macro expansion is limited to the macros specified with the
-# PREDEFINED and EXPAND_AS_PREDEFINED tags.
-
-EXPAND_ONLY_PREDEF = YES
-
-# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files
-# in the INCLUDE_PATH (see below) will be search if a #include is found.
-
-SEARCH_INCLUDES = YES
-
-# The INCLUDE_PATH tag can be used to specify one or more directories that
-# contain include files that are not input files but should be processed by
-# the preprocessor.
-
-INCLUDE_PATH =
-
-# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard
-# patterns (like *.h and *.hpp) to filter out the header-files in the
-# directories. If left blank, the patterns specified with FILE_PATTERNS will
-# be used.
-
-INCLUDE_FILE_PATTERNS =
-
-# The PREDEFINED tag can be used to specify one or more macro names that
-# are defined before the preprocessor is started (similar to the -D option of
-# gcc). The argument of the tag is a list of macros of the form: name
-# or name=definition (no spaces). If the definition and the = are
-# omitted =1 is assumed.
-
-PREDEFINED =
-
-# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then
-# this tag can be used to specify a list of macro names that should be expanded.
-# The macro definition that is found in the sources will be used.
-# Use the PREDEFINED tag if you want to use a different macro definition.
-
-EXPAND_AS_DEFINED =
-
-# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then
-# doxygen's preprocessor will remove all function-like macros that are alone
-# on a line, have an all uppercase name, and do not end with a semicolon. Such
-# function macros are typically used for boiler-plate code, and will confuse the
-# parser if not removed.
-
-SKIP_FUNCTION_MACROS = YES
-
-#---------------------------------------------------------------------------
-# Configuration::additions related to external references
-#---------------------------------------------------------------------------
-
-# The TAGFILES option can be used to specify one or more tagfiles.
-# Optionally an initial location of the external documentation
-# can be added for each tagfile. The format of a tag file without
-# this location is as follows:
-# TAGFILES = file1 file2 ...
-# Adding location for the tag files is done as follows:
-# TAGFILES = file1=loc1 "file2 = loc2" ...
-# where "loc1" and "loc2" can be relative or absolute paths or
-# URLs. If a location is present for each tag, the installdox tool
-# does not have to be run to correct the links.
-# Note that each tag file must have a unique name
-# (where the name does NOT include the path)
-# If a tag file is not located in the directory in which doxygen
-# is run, you must also specify the path to the tagfile here.
-
-TAGFILES =
-
-# When a file name is specified after GENERATE_TAGFILE, doxygen will create
-# a tag file that is based on the input files it reads.
-
-GENERATE_TAGFILE = ../qtools_docs/qtools.tag
-
-# If the ALLEXTERNALS tag is set to YES all external classes will be listed
-# in the class index. If set to NO only the inherited external classes
-# will be listed.
-
-ALLEXTERNALS = NO
-
-# 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.
-
-EXTERNAL_GROUPS = YES
-
-# The PERL_PATH should be the absolute path and name of the perl script
-# interpreter (i.e. the result of `which perl').
-
-PERL_PATH = /usr/bin/perl
-
-#---------------------------------------------------------------------------
-# Configuration options related to the dot tool
-#---------------------------------------------------------------------------
-
-# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will
-# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base or
-# super classes. Setting the tag to NO turns the diagrams off. Note that this
-# option is superseded by the HAVE_DOT option below. This is only a fallback. It is
-# recommended to install and use dot, since it yields more powerful graphs.
-
-CLASS_DIAGRAMS = YES
-
-# If set to YES, the inheritance and collaboration graphs will hide
-# inheritance and usage relations if the target is undocumented
-# or is not a class.
-
-HIDE_UNDOC_RELATIONS = YES
-
-# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is
-# available from the path. This tool is part of Graphviz, a graph visualization
-# toolkit from AT&T and Lucent Bell Labs. The other options in this section
-# have no effect if this option is set to NO (the default)
-
-HAVE_DOT = YES
-
-# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect inheritance relations. Setting this tag to YES will force the
-# the CLASS_DIAGRAMS tag to NO.
-
-CLASS_GRAPH = YES
-
-# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen
-# will generate a graph for each documented class showing the direct and
-# indirect implementation dependencies (inheritance, containment, and
-# class references variables) of the class with other documented classes.
-
-COLLABORATION_GRAPH = YES
-
-# If the UML_LOOK tag is set to YES doxygen will generate inheritance and
-# collaboration diagrams in a style similar to the OMG's Unified Modeling
-# Language.
-
-UML_LOOK = NO
-
-# If set to YES, the inheritance and collaboration graphs will show the
-# relations between templates and their instances.
-
-TEMPLATE_RELATIONS = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT
-# tags are set to YES then doxygen will generate a graph for each documented
-# file showing the direct and indirect include dependencies of the file with
-# other documented files.
-
-INCLUDE_GRAPH = YES
-
-# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and
-# HAVE_DOT tags are set to YES then doxygen will generate a graph for each
-# documented header file showing the documented files that directly or
-# indirectly include this file.
-
-INCLUDED_BY_GRAPH = NO
-
-# If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will
-# generate a call dependency graph for every global function or class method.
-# Note that enabling this option will significantly increase the time of a run.
-# So in most cases it will be better to enable call graphs for selected
-# functions only using the \callgraph command.
-
-CALL_GRAPH = NO
-
-# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen
-# will graphical hierarchy of all classes instead of a textual one.
-
-GRAPHICAL_HIERARCHY = YES
-
-# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images
-# generated by dot. Possible values are png, jpg, or gif
-# If left blank png will be used.
-
-DOT_IMAGE_FORMAT = png
-
-# The tag DOT_PATH can be used to specify the path where the dot tool can be
-# found. If left blank, it is assumed the dot tool can be found on the path.
-
-DOT_PATH =
-
-# The DOTFILE_DIRS tag can be used to specify one or more directories that
-# contain dot files that are included in the documentation (see the
-# \dotfile command).
-
-DOTFILE_DIRS =
-
-# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than
-# this value, doxygen will try to truncate the graph, so that it fits within
-# the specified constraint. Beware that most browsers cannot cope with very
-# large images.
-
-MAX_DOT_GRAPH_WIDTH = 2048
-
-# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height
-# (in pixels) of the graphs generated by dot. If a graph becomes larger than
-# this value, doxygen will try to truncate the graph, so that it fits within
-# the specified constraint. Beware that most browsers cannot cope with very
-# large images.
-
-MAX_DOT_GRAPH_HEIGHT = 2048
-
-# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the
-# graphs generated by dot. A depth value of 3 means that only nodes reachable
-# from the root by following a path via at most 3 edges will be shown. Nodes that
-# lay further from the root node will be omitted. Note that setting this option to
-# 1 or 2 may greatly reduce the computation time needed for large code bases. Also
-# note that a graph may be further truncated if the graph's image dimensions are
-# not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH and MAX_DOT_GRAPH_HEIGHT).
-# If 0 is used for the depth value (the default), the graph is not depth-constrained.
-
-MAX_DOT_GRAPH_DEPTH = 0
-
-# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will
-# generate a legend page explaining the meaning of the various boxes and
-# arrows in the dot generated graphs.
-
-GENERATE_LEGEND = YES
-
-# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will
-# remove the intermediate dot files that are used to generate
-# the various graphs.
-
-DOT_CLEANUP = YES
-
-#---------------------------------------------------------------------------
-# Configuration::additions related to the search engine
-#---------------------------------------------------------------------------
-
-# The SEARCHENGINE tag specifies whether or not a search engine should be
-# used. If set to NO the values of all tags below this one will be ignored.
-
-SEARCHENGINE = NO
diff --git a/qtools/LICENSE.GPL b/qtools/LICENSE.GPL
deleted file mode 100644
index 935a2a0..0000000
--- a/qtools/LICENSE.GPL
+++ /dev/null
@@ -1,349 +0,0 @@
-
- The Qt GUI Toolkit is Copyright (C) 1994-2000 Trolltech AS.
-
- You may use, distribute and copy the Qt GUI Toolkit under the terms of
- GNU General Public License version 2, which is display below.
-
--------------------------------------------------------------------------
-
- GNU GENERAL PUBLIC LICENSE
- Version 2, June 1991
-
- Copyright (C) 1989, 1991 Free Software Foundation, Inc.
- 675 Mass Ave, Cambridge, MA 02139, USA
- Everyone is permitted to copy and distribute verbatim copies
- of this license document, but changing it is not allowed.
-
- Preamble
-
- The licenses for most software are designed to take away your
-freedom to share and change it. By contrast, the GNU General Public
-License is intended to guarantee your freedom to share and change free
-software--to make sure the software is free for all its users. This
-General Public License applies to most of the Free Software
-Foundation's software and to any other program whose authors commit to
-using it. (Some other Free Software Foundation software is covered by
-the GNU Library General Public License instead.) You can apply it to
-your programs, too.
-
- When we speak of free software, we are referring to freedom, not
-price. Our General Public Licenses are designed to make sure that you
-have the freedom to distribute copies of free software (and charge for
-this service if you wish), that you receive source code or can get it
-if you want it, that you can change the software or use pieces of it
-in new free programs; and that you know you can do these things.
-
- To protect your rights, we need to make restrictions that forbid
-anyone to deny you these rights or to ask you to surrender the rights.
-These restrictions translate to certain responsibilities for you if you
-distribute copies of the software, or if you modify it.
-
- For example, if you distribute copies of such a program, whether
-gratis or for a fee, you must give the recipients all the rights that
-you have. You must make sure that they, too, receive or can get the
-source code. And you must show them these terms so they know their
-rights.
-
- We protect your rights with two steps: (1) copyright the software, and
-(2) offer you this license which gives you legal permission to copy,
-distribute and/or modify the software.
-
- Also, for each author's protection and ours, we want to make certain
-that everyone understands that there is no warranty for this free
-software. If the software is modified by someone else and passed on, we
-want its recipients to know that what they have is not the original, so
-that any problems introduced by others will not reflect on the original
-authors' reputations.
-
- Finally, any free program is threatened constantly by software
-patents. We wish to avoid the danger that redistributors of a free
-program will individually obtain patent licenses, in effect making the
-program proprietary. To prevent this, we have made it clear that any
-patent must be licensed for everyone's free use or not licensed at all.
-
- The precise terms and conditions for copying, distribution and
-modification follow.
-
- GNU GENERAL PUBLIC LICENSE
- TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
-
- 0. This License applies to any program or other work which contains
-a notice placed by the copyright holder saying it may be distributed
-under the terms of this General Public License. The "Program", below,
-refers to any such program or work, and a "work based on the Program"
-means either the Program or any derivative work under copyright law:
-that is to say, a work containing the Program or a portion of it,
-either verbatim or with modifications and/or translated into another
-language. (Hereinafter, translation is included without limitation in
-the term "modification".) Each licensee is addressed as "you".
-
-Activities other than copying, distribution and modification are not
-covered by this License; they are outside its scope. The act of
-running the Program is not restricted, and the output from the Program
-is covered only if its contents constitute a work based on the
-Program (independent of having been made by running the Program).
-Whether that is true depends on what the Program does.
-
- 1. You may copy and distribute verbatim copies of the Program's
-source code as you receive it, in any medium, provided that you
-conspicuously and appropriately publish on each copy an appropriate
-copyright notice and disclaimer of warranty; keep intact all the
-notices that refer to this License and to the absence of any warranty;
-and give any other recipients of the Program a copy of this License
-along with the Program.
-
-You may charge a fee for the physical act of transferring a copy, and
-you may at your option offer warranty protection in exchange for a fee.
-
- 2. You may modify your copy or copies of the Program or any portion
-of it, thus forming a work based on the Program, and copy and
-distribute such modifications or work under the terms of Section 1
-above, provided that you also meet all of these conditions:
-
- a) You must cause the modified files to carry prominent notices
- stating that you changed the files and the date of any change.
-
- b) You must cause any work that you distribute or publish, that in
- whole or in part contains or is derived from the Program or any
- part thereof, to be licensed as a whole at no charge to all third
- parties under the terms of this License.
-
- c) If the modified program normally reads commands interactively
- when run, you must cause it, when started running for such
- interactive use in the most ordinary way, to print or display an
- announcement including an appropriate copyright notice and a
- notice that there is no warranty (or else, saying that you provide
- a warranty) and that users may redistribute the program under
- these conditions, and telling the user how to view a copy of this
- License. (Exception: if the Program itself is interactive but
- does not normally print such an announcement, your work based on
- the Program is not required to print an announcement.)
-
-These requirements apply to the modified work as a whole. If
-identifiable sections of that work are not derived from the Program,
-and can be reasonably considered independent and separate works in
-themselves, then this License, and its terms, do not apply to those
-sections when you distribute them as separate works. But when you
-distribute the same sections as part of a whole which is a work based
-on the Program, the distribution of the whole must be on the terms of
-this License, whose permissions for other licensees extend to the
-entire whole, and thus to each and every part regardless of who wrote it.
-
-Thus, it is not the intent of this section to claim rights or contest
-your rights to work written entirely by you; rather, the intent is to
-exercise the right to control the distribution of derivative or
-collective works based on the Program.
-
-In addition, mere aggregation of another work not based on the Program
-with the Program (or with a work based on the Program) on a volume of
-a storage or distribution medium does not bring the other work under
-the scope of this License.
-
- 3. You may copy and distribute the Program (or a work based on it,
-under Section 2) in object code or executable form under the terms of
-Sections 1 and 2 above provided that you also do one of the following:
-
- a) Accompany it with the complete corresponding machine-readable
- source code, which must be distributed under the terms of Sections
- 1 and 2 above on a medium customarily used for software interchange; or,
-
- b) Accompany it with a written offer, valid for at least three
- years, to give any third party, for a charge no more than your
- cost of physically performing source distribution, a complete
- machine-readable copy of the corresponding source code, to be
- distributed under the terms of Sections 1 and 2 above on a medium
- customarily used for software interchange; or,
-
- c) Accompany it with the information you received as to the offer
- to distribute corresponding source code. (This alternative is
- allowed only for noncommercial distribution and only if you
- received the program in object code or executable form with such
- an offer, in accord with Subsection b above.)
-
-The source code for a work means the preferred form of the work for
-making modifications to it. For an executable work, complete source
-code means all the source code for all modules it contains, plus any
-associated interface definition files, plus the scripts used to
-control compilation and installation of the executable. However, as a
-special exception, the source code distributed need not include
-anything that is normally distributed (in either source or binary
-form) with the major components (compiler, kernel, and so on) of the
-operating system on which the executable runs, unless that component
-itself accompanies the executable.
-
-If distribution of executable or object code is made by offering
-access to copy from a designated place, then offering equivalent
-access to copy the source code from the same place counts as
-distribution of the source code, even though third parties are not
-compelled to copy the source along with the object code.
-
- 4. You may not copy, modify, sublicense, or distribute the Program
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense or distribute the Program is
-void, and will automatically terminate your rights under this License.
-However, parties who have received copies, or rights, from you under
-this License will not have their licenses terminated so long as such
-parties remain in full compliance.
-
- 5. You are not required to accept this License, since you have not
-signed it. However, nothing else grants you permission to modify or
-distribute the Program or its derivative works. These actions are
-prohibited by law if you do not accept this License. Therefore, by
-modifying or distributing the Program (or any work based on the
-Program), you indicate your acceptance of this License to do so, and
-all its terms and conditions for copying, distributing or modifying
-the Program or works based on it.
-
- 6. Each time you redistribute the Program (or any work based on the
-Program), the recipient automatically receives a license from the
-original licensor to copy, distribute or modify the Program subject to
-these terms and conditions. You may not impose any further
-restrictions on the recipients' exercise of the rights granted herein.
-You are not responsible for enforcing compliance by third parties to
-this License.
-
- 7. If, as a consequence of a court judgment or allegation of patent
-infringement or for any other reason (not limited to patent issues),
-conditions are imposed on you (whether by court order, agreement or
-otherwise) that contradict the conditions of this License, they do not
-excuse you from the conditions of this License. If you cannot
-distribute so as to satisfy simultaneously your obligations under this
-License and any other pertinent obligations, then as a consequence you
-may not distribute the Program at all. For example, if a patent
-license would not permit royalty-free redistribution of the Program by
-all those who receive copies directly or indirectly through you, then
-the only way you could satisfy both it and this License would be to
-refrain entirely from distribution of the Program.
-
-If any portion of this section is held invalid or unenforceable under
-any particular circumstance, the balance of the section is intended to
-apply and the section as a whole is intended to apply in other
-circumstances.
-
-It is not the purpose of this section to induce you to infringe any
-patents or other property right claims or to contest validity of any
-such claims; this section has the sole purpose of protecting the
-integrity of the free software distribution system, which is
-implemented by public license practices. Many people have made
-generous contributions to the wide range of software distributed
-through that system in reliance on consistent application of that
-system; it is up to the author/donor to decide if he or she is willing
-to distribute software through any other system and a licensee cannot
-impose that choice.
-
-This section is intended to make thoroughly clear what is believed to
-be a consequence of the rest of this License.
-
- 8. If the distribution and/or use of the Program is restricted in
-certain countries either by patents or by copyrighted interfaces, the
-original copyright holder who places the Program under this License
-may add an explicit geographical distribution limitation excluding
-those countries, so that distribution is permitted only in or among
-countries not thus excluded. In such case, this License incorporates
-the limitation as if written in the body of this License.
-
- 9. The Free Software Foundation may publish revised and/or new versions
-of the General Public License from time to time. Such new versions will
-be similar in spirit to the present version, but may differ in detail to
-address new problems or concerns.
-
-Each version is given a distinguishing version number. If the Program
-specifies a version number of this License which applies to it and "any
-later version", you have the option of following the terms and conditions
-either of that version or of any later version published by the Free
-Software Foundation. If the Program does not specify a version number of
-this License, you may choose any version ever published by the Free Software
-Foundation.
-
- 10. If you wish to incorporate parts of the Program into other free
-programs whose distribution conditions are different, write to the author
-to ask for permission. For software which is copyrighted by the Free
-Software Foundation, write to the Free Software Foundation; we sometimes
-make exceptions for this. Our decision will be guided by the two goals
-of preserving the free status of all derivatives of our free software and
-of promoting the sharing and reuse of software generally.
-
- NO WARRANTY
-
- 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
-FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
-OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
-PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
-OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
-MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
-TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
-PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
-REPAIR OR CORRECTION.
-
- 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
-WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
-REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
-INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
-OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
-TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
-YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
-PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
-POSSIBILITY OF SUCH DAMAGES.
-
- END OF TERMS AND CONDITIONS
-
- Appendix: How to Apply These Terms to Your New Programs
-
- If you develop a new program, and you want it to be of the greatest
-possible use to the public, the best way to achieve this is to make it
-free software which everyone can redistribute and change under these terms.
-
- To do so, attach the following notices to the program. It is safest
-to attach them to the start of each source file to most effectively
-convey the exclusion of warranty; and each file should have at least
-the "copyright" line and a pointer to where the full notice is found.
-
- <one line to give the program's name and a brief idea of what it does.>
- Copyright (C) 19yy <name of author>
-
- 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.
-
- 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.
-
- 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., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-Also add information on how to contact you by electronic and paper mail.
-
-If the program is interactive, make it output a short notice like this
-when it starts in an interactive mode:
-
- Gnomovision version 69, Copyright (C) 19yy name of author
- Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
- This is free software, and you are welcome to redistribute it
- under certain conditions; type `show c' for details.
-
-The hypothetical commands `show w' and `show c' should show the appropriate
-parts of the General Public License. Of course, the commands you use may
-be called something other than `show w' and `show c'; they could even be
-mouse-clicks or menu items--whatever suits your program.
-
-You should also get your employer (if you work as a programmer) or your
-school, if any, to sign a "copyright disclaimer" for the program, if
-necessary. Here is a sample; alter the names:
-
- Yoyodyne, Inc., hereby disclaims all copyright interest in the program
- `Gnomovision' (which makes passes at compilers) written by James Hacker.
-
- <signature of Ty Coon>, 1 April 1989
- Ty Coon, President of Vice
-
-This General Public License does not permit incorporating your program into
-proprietary programs. If your program is a subroutine library, you may
-consider it more useful to permit linking proprietary applications with the
-library. If this is what you want to do, use the GNU Library General
-Public License instead of this License.
-
--------------------------------------------------------------------------
diff --git a/qtools/LICENSE.QPL b/qtools/LICENSE.QPL
deleted file mode 100644
index ecdad6e..0000000
--- a/qtools/LICENSE.QPL
+++ /dev/null
@@ -1,103 +0,0 @@
- THE Q PUBLIC LICENSE
- version 1.0
-
- Copyright (C) 1999-2000 Trolltech AS, Norway.
- Everyone is permitted to copy and
- distribute this license document.
-
-The intent of this license is to establish freedom to share and change the
-software regulated by this license under the open source model.
-
-This license applies to any software containing a notice placed by the
-copyright holder saying that it may be distributed under the terms of
-the Q Public License version 1.0. Such software is herein referred to as
-the Software. This license covers modification and distribution of the
-Software, use of third-party application programs based on the Software,
-and development of free software which uses the Software.
-
- Granted Rights
-
-1. You are granted the non-exclusive rights set forth in this license
- provided you agree to and comply with any and all conditions in this
- license. Whole or partial distribution of the Software, or software
- items that link with the Software, in any form signifies acceptance of
- this license.
-
-2. You may copy and distribute the Software in unmodified form provided
- that the entire package, including - but not restricted to - copyright,
- trademark notices and disclaimers, as released by the initial developer
- of the Software, is distributed.
-
-3. You may make modifications to the Software and distribute your
- modifications, in a form that is separate from the Software, such as
- patches. The following restrictions apply to modifications:
-
- a. Modifications must not alter or remove any copyright notices in
- the Software.
-
- b. When modifications to the Software are released under this
- license, a non-exclusive royalty-free right is granted to the
- initial developer of the Software to distribute your modification
- in future versions of the Software provided such versions remain
- available under these terms in addition to any other license(s) of
- the initial developer.
-
-4. You may distribute machine-executable forms of the Software or
- machine-executable forms of modified versions of the Software, provided
- that you meet these restrictions:
-
- a. You must include this license document in the distribution.
-
- b. You must ensure that all recipients of the machine-executable forms
- are also able to receive the complete machine-readable source code
- to the distributed Software, including all modifications, without
- any charge beyond the costs of data transfer, and place prominent
- notices in the distribution explaining this.
-
- c. You must ensure that all modifications included in the
- machine-executable forms are available under the terms of this
- license.
-
-5. You may use the original or modified versions of the Software to
- compile, link and run application programs legally developed by you
- or by others.
-
-6. You may develop application programs, reusable components and other
- software items that link with the original or modified versions of the
- Software. These items, when distributed, are subject to the following
- requirements:
-
- a. You must ensure that all recipients of machine-executable forms of
- these items are also able to receive and use the complete
- machine-readable source code to the items without any charge
- beyond the costs of data transfer.
-
- b. You must explicitly license all recipients of your items to use
- and re-distribute original and modified versions of the items in
- both machine-executable and source code forms. The recipients must
- be able to do so without any charges whatsoever, and they must be
- able to re-distribute to anyone they choose.
-
-
- c. If the items are not available to the general public, and the
- initial developer of the Software requests a copy of the items,
- then you must supply one.
-
- Limitations of Liability
-
-In no event shall the initial developers or copyright holders be liable
-for any damages whatsoever, including - but not restricted to - lost
-revenue or profits or other direct, indirect, special, incidental or
-consequential damages, even if they have been advised of the possibility
-of such damages, except to the extent invariable law, if any, provides
-otherwise.
-
- No Warranty
-
-The Software and this license document are provided AS IS with NO WARRANTY
-OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS
-FOR A PARTICULAR PURPOSE.
- Choice of Law
-
-This license is governed by the Laws of Norway. Disputes shall be settled
-by Oslo City Court.
diff --git a/qtools/Makefile.in b/qtools/Makefile.in
deleted file mode 100644
index 78710fd..0000000
--- a/qtools/Makefile.in
+++ /dev/null
@@ -1,30 +0,0 @@
-#
-#
-#
-# Copyright (C) 1997-2000 by Dimitri van Heesch.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation under the terms of the GNU General Public License is hereby
-# granted. No representations are made about the suitability of this software
-# for any purpose. It is provided "as is" without express or implied warranty.
-# See the GNU General Public License for more details.
-#
-# Documents produced by Doxygen are derivative works derived from the
-# input used in their production; they are not affected by this license.
-#
-
-all: Makefile.qtools Makefile
- $(MAKE) -f Makefile.qtools $@
-
-Makefile.qtools: qtools.pro
- $(ENV) $(PERL) $(TMAKE) qtools.pro >Makefile.qtools
-
-tmake:
- $(ENV) $(PERL) $(TMAKE) qtools.pro >Makefile.qtools
-
-clean: Makefile.qtools
- $(MAKE) -f Makefile.qtools clean
-
-distclean: clean
-
-FORCE:
diff --git a/qtools/README b/qtools/README
deleted file mode 100644
index 1e7fc8d..0000000
--- a/qtools/README
+++ /dev/null
@@ -1,4 +0,0 @@
-This directory contains a small subset of Troll-Tech's Qt library
-The subset is enough to build the doxygen executable, but lacks many of
-the features found in the Qt library. See http://www.trolltech.com
-for the full package.
diff --git a/qtools/qarray.doc b/qtools/qarray.doc
deleted file mode 100644
index 6914dbc..0000000
--- a/qtools/qarray.doc
+++ /dev/null
@@ -1,486 +0,0 @@
-/****************************************************************************
-**
-**
-** QArray 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.
-**
-**********************************************************************/
-
-
-/*****************************************************************************
- QArray documentation
- *****************************************************************************/
-
-/*!
- \class QArray qarray.h
- \brief The QArray class is a template class that provides arrays of simple types.
-
- \ingroup tools
-
- QArray is implemented as a template class. Define a template
- instance QArray\<X\> to create an array that contains X items.
-
- QArray stores the array elements directly in the array. It can only
- deal with simple types, i.e. C++ types, structs and classes that have
- no constructors, destructors or virtual functions. QArray uses
- bitwise operations to copy and compare array elements.
-
- The QVector collection class is also a kind of array. Like most
- \link collection.html collection classes\endlink, it has pointers to the
- contained items.
-
- QArray uses explicit \link shclass.html sharing\endlink with a reference
- count. If more than one array share common data, and one array is
- modified, all arrays will be modified.
-
- The benefit of sharing is that a program does not need to duplicate
- data when it is not required, which results in less memory usage and
- less copying of data.
-
- Example:
- \code
- #include <qarray.h>
- #include <stdio.h>
-
- QArray<int> fib( int num ) // returns fibonacci array
- {
- ASSERT( num > 2 );
- QArray<int> f( num ); // array of ints
-
- f[0] = f[1] = 1; // initialize first two numbers
- for ( int i=2; i<num; i++ )
- f[i] = f[i-1] + f[i-2];
-
- return f;
- }
-
- void main()
- {
- QArray<int> a = fib( 6 ); // get 6 first fibonaccis
- int i;
-
- for ( i=0; i<a.size(); i++ ) // print them
- prinf( "%d: %d\n", i, a[i] );
-
- printf( "1 is found %d time(s)\n", a.contains(1) );
- printf( "5 is found at index %d\n", a.find(5) );
- }
- \endcode
-
- Program output:
- \code
- 0: 1
- 1: 1
- 2: 2
- 3: 3
- 4: 5
- 5: 8
- 1 is found 2 times
- 5 is found at index 4
- \endcode
-
- Note about using QArray for manipulating structs or classes:
- Compilers will often pad the size of structs of odd sizes up to the
- nearest word boundary. This will then be the size QArray will use
- for its bitwise element comparisons. Since the remaining bytes will
- typically be uninitialized, this can cause find() etc. to fail to
- find the element. Example:
-
- \code
- struct MyStruct
- {
- short i; // 2 bytes
- char c; // 1 byte
- }; // sizeof(MyStruct) may be padded to 4 bytes
-
- QArray<MyStruct> a(1);
- a[0].i = 5;
- a[0].c = 't';
-
- MyStruct x;
- x.i = '5';
- x.c = 't';
- int i = a.find( x ); // May return -1 if the pad bytes differ
- \endcode
-
- To workaround this, make sure that you use a struct where sizeof()
- returns the same as the sum of the sizes of the members, either by
- changing the types of the struct members or by adding dummy members.
-
- \sa \link shclass.html Shared Classes\endlink
-*/
-
-
-/*!
- \fn QArray::QArray()
- Constructs a null array.
- \sa isNull()
-*/
-
-/*!
- \fn QArray::QArray( int size )
- Constructs an array with room for \e size elements.
- Makes a null array if \e size == 0.
-
- Note that the elements are not initialized.
-
- \sa resize(), isNull()
-*/
-
-/*!
- \fn QArray::QArray( const QArray<type> &a )
- Constructs a shallow copy of \e a.
- \sa assign()
-*/
-
-/*!
- \fn QArray::QArray( int, int )
- Constructs an array <em>without allocating</em> array space.
- The arguments should be (0, 0). Use at own risk.
-*/
-
-/*!
- \fn QArray::~QArray()
- Dereferences the array data and deletes it if this was the last
- reference.
-*/
-
-/*!
- \fn QArray<type> &QArray::operator=( const QArray<type> &a )
- Assigns a shallow copy of \e a to this array and returns a reference
- to this array.
-
- Equivalent to assign( a ).
-*/
-
-/*!
- \fn type *QArray::data() const
- Returns a pointer to the actual array data.
-
- The array is a null array if data() == 0 (null pointer).
-
- \sa isNull()
-*/
-
-/*!
- \fn uint QArray::nrefs() const
- Returns the reference count for the shared array data. This reference count
- is always greater than zero.
-*/
-
-/*!
- \fn uint QArray::size() const
- Returns the size of the array (max number of elements).
-
- The array is a null array if size() == 0.
-
- \sa isNull(), resize()
-*/
-
-/*!
- \fn uint QArray::count() const
- Returns the same as size().
-
- \sa size()
-*/
-
-/*!
- \fn bool QArray::isEmpty() const
- Returns TRUE if the array is empty, i.e. size() == 0, otherwise FALSE.
-
- isEmpty() is equivalent with isNull() for QArray. Note that this is not
- the case for QCString::isEmpty().
-*/
-
-/*!
- \fn bool QArray::isNull() const
- Returns TRUE if the array is null, otherwise FALSE.
-
- A null array has size() == 0 and data() == 0.
-*/
-
-/*!
- \fn bool QArray::resize( uint size )
- Resizes (expands or shrinks) the array to \e size elements. The array
- becomes a null array if \e size == 0.
-
- Returns TRUE if successful, or FALSE if the memory cannot be allocated.
-
- New elements will not be initialized.
-
- \sa size()
-*/
-
-/*!
- \fn bool QArray::truncate( uint pos )
- Truncates the array at position \e pos.
-
- Returns TRUE if successful, or FALSE if the memory cannot be allocated.
-
- Equivalent to resize(\e pos).
-
- \sa resize()
-*/
-
-/*!
- \fn bool QArray::fill( const type &v, int size )
- Fills the array with the value \e v. If \e size is specified as different
- from -1, then the array will be resized before filled.
-
- Returns TRUE if successful, or FALSE if the memory cannot be allocated
- (only when \e size != -1).
-
- \sa resize()
-*/
-
-/*!
- \fn void QArray::detach()
- Detaches this array from shared array data, i.e. makes a private, deep
- copy of the data.
-
- Copying will only be performed if the
- \link nrefs() reference count\endlink is greater than one.
-
- \sa copy()
-*/
-
-/*!
- \fn QArray<type> QArray::copy() const
- Returns a deep copy of this array.
- \sa detach(), duplicate()
-*/
-
-/*!
- \fn QArray<type> &QArray::assign( const QArray<type> &a )
- Shallow copy. Dereferences the current array and references the data
- contained in \e a instead. Returns a reference to this array.
- \sa operator=()
-*/
-
-/*!
- \fn QArray<type> &QArray::assign( const type *data, uint size )
- Shallow copy. Dereferences the current array and references the
- array data \e data, which contains \e size elements.
- Returns a reference to this array.
-
- Do not delete \e data later, QArray takes care of that.
-*/
-
-/*!
- \fn QArray<type> &QArray::duplicate( const QArray<type> &a )
- Deep copy. Dereferences the current array and obtains a copy of the data
- contained in \e a instead. Returns a reference to this array.
- \sa copy()
-*/
-
-/*!
- \fn QArray<type> &QArray::duplicate( const type *data, uint size )
- Deep copy. Dereferences the current array and obtains a copy of the
- array data \e data instead. Returns a reference to this array.
- \sa copy()
-*/
-
-/*!
- \fn QArray<type> &QArray::setRawData( const type *data, uint size )
-
- Sets raw data and returns a reference to the array.
-
- Dereferences the current array and sets the new array data to \e data and
- the new array size to \e size. Do not attempt to resize or re-assign the
- array data when raw data has been set.
- Call resetRawData(d,len) to reset the array.
-
- Setting raw data is useful because it sets QArray data without allocating
- memory or copying data.
-
- Example I (intended use):
- \code
- static char bindata[] = { 231, 1, 44, ... };
- QByteArray a;
- a.setRawData( bindata, sizeof(bindata) ); // a points to bindata
- QDataStream s( a, IO_ReadOnly ); // open on a's data
- s >> <something>; // read raw bindata
- a.resetRawData( bindata, sizeof(bindata) ); // finished
- \endcode
-
- Example II (you don't want to do this):
- \code
- static char bindata[] = { 231, 1, 44, ... };
- QByteArray a, b;
- a.setRawData( bindata, sizeof(bindata) ); // a points to bindata
- a.resize( 8 ); // will crash
- b = a; // will crash
- a[2] = 123; // might crash
- // forget to resetRawData - will crash
- \endcode
-
- \warning If you do not call resetRawData(), QArray will attempt to
- deallocate or reallocate the raw data, which might not be too good.
- Be careful.
-
- \sa resetRawData()
-*/
-
-/*!
- \fn void QArray::resetRawData( const type *data, uint size )
- Resets raw data that was set using setRawData().
-
- The arguments must be the data and length that were passed to
- setRawData(). This is for consistency checking.
-
- \sa setRawData()
-*/
-
-/*!
- \fn int QArray::find( const type &v, uint index ) const
- Finds the first occurrence of \e v, starting at position \e index.
-
- Returns the position of \e v, or -1 if \e v could not be found.
-
- \sa contains()
-*/
-
-/*!
- \fn int QArray::contains( const type &v ) const
- Returns the number of times \e v occurs in the array.
- \sa find()
-*/
-
-/*!
- \fn void QArray::sort()
- Sorts the array elements in ascending order, using bitwise
- comparison (memcmp()).
-
- \sa bsearch()
-*/
-
-/*!
- \fn int QArray::bsearch( const type &v ) const
- In a sorted array, finds the first occurrence of \e v using binary
- search. For a sorted array, this is generally much faster than
- find(), which does a linear search.
-
- Returns the position of \e v, or -1 if \e v could not be found.
-
- \sa sort(), find()
-*/
-
-/*!
- \fn type &QArray::operator[]( int index ) const
- Returns a reference to the element at position \e index in the array.
-
- This can be used to both read and set an element. Equivalent to at().
-
- \sa at()
-*/
-
-/*!
- \fn type &QArray::at( uint index ) const
- Returns a reference to the element at position \e index in the array.
-
- This can be used to both read and set an element.
-
- \sa operator[]()
-*/
-
-/*!
- \fn QArray::operator const type *() const
- Cast operator. Returns a pointer to the array.
- \sa data()
-*/
-
-/*!
- \fn bool QArray::operator==( const QArray<type> &a ) const
- Returns TRUE if this array is equal to \e a, otherwise FALSE.
-
- The two arrays are bitwise compared.
-
- \sa operator!=()
-*/
-
-/*!
- \fn bool QArray::operator!=( const QArray<type> &a ) const
- Returns TRUE if this array is different from \e a, otherwise FALSE.
-
- The two arrays are bitwise compared.
-
- \sa operator==()
-*/
-
-/*!
- \fn Iterator QArray::begin()
- Returns an iterator pointing at the beginning of this array.
- This iterator can be used as the iterators of QValueList and QMap
- for example. In fact it does not only behave like a usual pointer:
- It is a pointer.
-*/
-
-/*!
- \fn Iterator QArray::end()
- Returns an iterator pointing behind the last element of this array.
- This iterator can be used as the iterators of QValueList and QMap
- for example. In fact it does not only behave like a usual pointer:
- It is a pointer.
-*/
-
-/*!
- \fn ConstIterator QArray::begin() const
- Returns a const iterator pointing at the beginning of this array.
- This iterator can be used as the iterators of QValueList and QMap
- for example. In fact it does not only behave like a usual pointer:
- It is a pointer.
-*/
-
-/*!
- \fn ConstIterator QArray::end() const
- Returns a const iterator pointing behind the last element of this array.
- This iterator can be used as the iterators of QValueList and QMap
- for example. In fact it does not only behave like a usual pointer:
- It is a pointer.
-*/
-
-
-/*****************************************************************************
- QByteArray documentation
- *****************************************************************************/
-
-/*!
- \class QByteArray qcstring.h
- \brief The QByteArray class provides an array of bytes.
-
- \inherit QArray
-
- \ingroup tools
-
- The QByteArray class provides an explicitly shared array of
- bytes. It is useful for manipulating memory areas with custom
- data. QByteArray is implemented as QArray<char>. See the QArray
- documentation for further information.
-*/
diff --git a/qtools/qarray.h b/qtools/qarray.h
deleted file mode 100644
index 90dcbb7..0000000
--- a/qtools/qarray.h
+++ /dev/null
@@ -1,110 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QArray template/macro class
-**
-** Created : 930906
-**
-** 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 QARRAY_H
-#define QARRAY_H
-
-#ifndef QT_H
-#include "qgarray.h"
-#endif // QT_H
-
-
-template<class type> class Q_EXPORT QArray : public QGArray
-{
-public:
- typedef type* Iterator;
- typedef const type* ConstIterator;
- typedef type ValueType;
-
-protected:
- QArray( int, int ) : QGArray( 0, 0 ) {}
-
-public:
- QArray() {}
- QArray( int size ) : QGArray(size*sizeof(type)) {}
- QArray( const QArray<type> &a ) : QGArray(a) {}
- ~QArray() {}
- QArray<type> &operator=(const QArray<type> &a)
- { return (QArray<type>&)QGArray::assign(a); }
- type *data() const { return (type *)QGArray::data(); }
- uint nrefs() const { return QGArray::nrefs(); }
- uint size() const { return QGArray::size()/sizeof(type); }
- uint count() const { return size(); }
- bool isEmpty() const { return QGArray::size() == 0; }
- bool isNull() const { return QGArray::data() == 0; }
- bool resize( uint size ) { return QGArray::resize(size*sizeof(type)); }
- bool truncate( uint pos ) { return QGArray::resize(pos*sizeof(type)); }
- bool fill( const type &d, int size = -1 )
- { return QGArray::fill((char*)&d,size,sizeof(type) ); }
- void detach() { QGArray::detach(); }
- QArray<type> copy() const
- { QArray<type> tmp; return tmp.duplicate(*this); }
- QArray<type>& assign( const QArray<type>& a )
- { return (QArray<type>&)QGArray::assign(a); }
- QArray<type>& assign( const type *a, uint n )
- { return (QArray<type>&)QGArray::assign((char*)a,n*sizeof(type)); }
- QArray<type>& duplicate( const QArray<type>& a )
- { return (QArray<type>&)QGArray::duplicate(a); }
- QArray<type>& duplicate( const type *a, uint n )
- { return (QArray<type>&)QGArray::duplicate((char*)a,n*sizeof(type)); }
- QArray<type>& setRawData( const type *a, uint n )
- { return (QArray<type>&)QGArray::setRawData((char*)a,
- n*sizeof(type)); }
- void resetRawData( const type *a, uint n )
- { QGArray::resetRawData((char*)a,n*sizeof(type)); }
- int find( const type &d, uint i=0 ) const
- { return QGArray::find((char*)&d,i,sizeof(type)); }
- int contains( const type &d ) const
- { return QGArray::contains((char*)&d,sizeof(type)); }
- void sort() { QGArray::sort(sizeof(type)); }
- int bsearch( const type &d ) const
- { return QGArray::bsearch((const char*)&d,sizeof(type)); }
- type& operator[]( int i ) const
- { return (type &)(*(type *)QGArray::at(i*sizeof(type))); }
- type& at( uint i ) const
- { return (type &)(*(type *)QGArray::at(i*sizeof(type))); }
- operator const type*() const { return (const type *)QGArray::data(); }
- bool operator==( const QArray<type> &a ) const { return isEqual(a); }
- bool operator!=( const QArray<type> &a ) const { return !isEqual(a); }
- Iterator begin() { return data(); }
- Iterator end() { return data() + size(); }
- ConstIterator begin() const { return data(); }
- ConstIterator end() const { return data() + size(); }
-};
-
-
-#endif // QARRAY_H
diff --git a/qtools/qasciidict.h b/qtools/qasciidict.h
deleted file mode 100644
index 29fcf2f..0000000
--- a/qtools/qasciidict.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QAsciiDict template class
-**
-** Created : 920821
-**
-** 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 QASCIIDICT_H
-#define QASCIIDICT_H
-
-#ifndef QT_H
-#include "qgdict.h"
-#endif // QT_H
-
-
-template<class type> class Q_EXPORT QAsciiDict : public QGDict
-{
-public:
- QAsciiDict(int size=17, bool caseSensitive=TRUE, bool copyKeys=TRUE )
- : QGDict(size,AsciiKey,caseSensitive,copyKeys) {}
- QAsciiDict( const QAsciiDict<type> &d ) : QGDict(d) {}
- ~QAsciiDict() { clear(); }
- QAsciiDict<type> &operator=(const QAsciiDict<type> &d)
- { return (QAsciiDict<type>&)QGDict::operator=(d); }
- uint count() const { return QGDict::count(); }
- uint size() const { return QGDict::size(); }
- bool isEmpty() const { return QGDict::count() == 0; }
-
- void insert( const char *k, const type *d )
- { QGDict::look_ascii(k,(Item)d,1); }
- void replace( const char *k, const type *d )
- { QGDict::look_ascii(k,(Item)d,2); }
- bool remove( const char *k ) { return QGDict::remove_ascii(k); }
- type *take( const char *k ) { return (type *)QGDict::take_ascii(k); }
- type *find( const char *k ) const
- { return (type *)((QGDict*)this)->QGDict::look_ascii(k,0,0); }
- type *operator[]( const char *k ) const
- { return (type *)((QGDict*)this)->QGDict::look_ascii(k,0,0); }
-
- void clear() { QGDict::clear(); }
- void resize( uint n ) { QGDict::resize(n); }
- void statistics() const { QGDict::statistics(); }
-private:
- void deleteItem( Item d );
-};
-
-#if defined(Q_DELETING_VOID_UNDEFINED)
-template<> inline void QAsciiDict<void>::deleteItem( Item )
-{
-}
-#endif
-
-template<class type> inline void QAsciiDict<type>::deleteItem( QCollection::Item d )
-{
- if ( del_item ) delete (type *)d;
-}
-
-
-template<class type> class Q_EXPORT QAsciiDictIterator : public QGDictIterator
-{
-public:
- QAsciiDictIterator(const QAsciiDict<type> &d)
- : QGDictIterator((QGDict &)d) {}
- ~QAsciiDictIterator() {}
- uint count() const { return dict->count(); }
- bool isEmpty() const { return dict->count() == 0; }
- type *toFirst() { return (type *)QGDictIterator::toFirst(); }
- operator type *() const { return (type *)QGDictIterator::get(); }
- type *current() const { return (type *)QGDictIterator::get(); }
- const char *currentKey() const { return QGDictIterator::getKeyAscii(); }
- type *operator()() { return (type *)QGDictIterator::operator()(); }
- type *operator++() { return (type *)QGDictIterator::operator++(); }
- type *operator+=(uint j) { return (type *)QGDictIterator::operator+=(j);}
-};
-
-
-#endif // QASCIIDICT_H
diff --git a/qtools/qbuffer.cpp b/qtools/qbuffer.cpp
deleted file mode 100644
index beed0ba..0000000
--- a/qtools/qbuffer.cpp
+++ /dev/null
@@ -1,465 +0,0 @@
-/****************************************************************************
-**
-**
-** Implementation of QBuffer class
-**
-** Created : 930812
-**
-** 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 "qbuffer.h"
-#include <stdlib.h>
-
-// REVISED: paul
-/*!
- \class QBuffer qbuffer.h
- \brief The QBuffer class is an I/O device that operates on a QByteArray
-
- \ingroup io
-
- QBuffer allows reading and writing a memory buffer. It is normally
- used together with a QTextStream or a QDataStream. QBuffer has an
- associated QByteArray which holds the buffer data. The size() of the
- buffer is automatically adjusted as data is written.
-
- The constructor \c QBuffer(QByteArray) creates a QBuffer with an
- existing byte array. The byte array can also be set with setBuffer().
- Writing to the QBuffer will modify the original byte array, since
- QByteArray is \link shclass.html explicitly shared.\endlink
-
- Use open() to open the buffer before use, and to set the mode
- (read-only,write-only, etc.). close() closes the buffer. The buffer
- must be closed before reopening or calling setBuffer().
-
- The common way to use QBuffer is through \l QDataStream or \l QTextStream
- which have constructors that take a QBuffer parameter. For
- convenience, there are also QDataStream and QTextStream constructors
- that take a QByteArray parameter. These constructors create and open
- an internal QBuffer.
-
- Note that QTextStream can also operate on a QString (a Unicode
- string); a QBuffer cannot.
-
- You can also use QBuffer directly through the standard QIODevice
- functions readBlock(), writeBlock() readLine(), at(), getch(), putch() and
- ungetch().
-
- \sa QFile, QDataStream, QTextStream, QByteArray, \link shclass.html Shared Classes\endlink
-*/
-
-
-/*!
- Constructs an empty buffer.
-*/
-
-QBuffer::QBuffer()
-{
- setFlags( IO_Direct );
- a_inc = 16; // initial increment
- a_len = 0;
- ioIndex = 0;
-}
-
-
-/*!
- Constructs a buffer that operates on \a buf.
- If you open the buffer in write mode (\c IO_WriteOnly or
- \c IO_ReadWrite) and write something into the buffer, \a buf
- will be modified.
-
-
- Example:
- \code
- QCString str = "abc";
- QBuffer b( str );
- b.open( IO_WriteOnly );
- b.at( 3 ); // position at \0
- b.writeBlock( "def", 4 ); // write including \0
- b.close();
- // Now, str == "abcdef"
- \endcode
-
-
- \sa setBuffer()
-*/
-
-QBuffer::QBuffer( QByteArray buf ) : a(buf)
-{
- setFlags( IO_Direct );
- a_len = a.size();
- a_inc = (a_len > 512) ? 512 : a_len; // initial increment
- if ( a_inc < 16 )
- a_inc = 16;
- ioIndex = 0;
-}
-
-/*!
- Destructs the buffer.
-*/
-
-QBuffer::~QBuffer()
-{
-}
-
-
-/*!
- Replaces the buffer's contents with \a buf.
-
- This may not be done when isOpen() is TRUE.
-
- Note that if you open the buffer in write mode (\c IO_WriteOnly or
- IO_ReadWrite) and write something into the buffer, \a buf is also
- modified because QByteArray is an explicitly shared class.
-
- \sa buffer(), open(), close()
-*/
-
-bool QBuffer::setBuffer( QByteArray buf )
-{
- if ( isOpen() ) {
-#if defined(CHECK_STATE)
- qWarning( "QBuffer::setBuffer: Buffer is open");
-#endif
- return FALSE;
- }
- a = buf;
- a_len = a.size();
- a_inc = (a_len > 512) ? 512 : a_len; // initial increment
- if ( a_inc < 16 )
- a_inc = 16;
- ioIndex = 0;
- return TRUE;
-}
-
-/*!
- \fn QByteArray QBuffer::buffer() const
-
- Returns this buffer's byte array.
-
- \sa setBuffer()
-*/
-
-/*!
- \reimp
- Opens the buffer in the mode \a m. Returns TRUE if successful,
- otherwise FALSE. The buffer must be opened before use.
-
- The mode parameter \a m must be a combination of the following flags.
- <ul>
- <li>\c IO_ReadOnly opens a buffer in read-only mode.
- <li>\c IO_WriteOnly opens a buffer in write-only mode.
- <li>\c IO_ReadWrite opens a buffer in read/write mode.
- <li>\c IO_Append sets the buffer index to the end of the buffer.
- <li>\c IO_Truncate truncates the buffer.
- </ul>
-
- \sa close(), isOpen()
-*/
-
-bool QBuffer::open( int m )
-{
- if ( isOpen() ) { // buffer already open
-#if defined(CHECK_STATE)
- qWarning( "QBuffer::open: Buffer already open" );
-#endif
- return FALSE;
- }
- setMode( m );
- if ( m & IO_Truncate ) { // truncate buffer
- a.resize( 0 );
- a_len = 0;
- }
- if ( m & IO_Append ) { // append to end of buffer
- ioIndex = a.size();
- } else {
- ioIndex = 0;
- }
- a_inc = 16;
- setState( IO_Open );
- setStatus( 0 );
- return TRUE;
-}
-
-/*!
- \reimp
- Closes an open buffer.
- \sa open()
-*/
-
-void QBuffer::close()
-{
- if ( isOpen() ) {
- setFlags( IO_Direct );
- ioIndex = 0;
- a_inc = 16;
- }
-}
-
-/*!
- \reimp
- The flush function does nothing for a QBuffer.
-*/
-
-void QBuffer::flush()
-{
- return;
-}
-
-
-/*!
- \fn int QBuffer::at() const
- \reimp
-*/
-
-/*!
- \fn uint QBuffer::size() const
- \reimp
-*/
-
-/*!
- \reimp
-*/
-
-bool QBuffer::at( int pos )
-{
-#if defined(CHECK_STATE)
- if ( !isOpen() ) {
- qWarning( "QBuffer::at: Buffer is not open" );
- return FALSE;
- }
-#endif
- if ( (uint)pos > a_len ) {
-#if defined(CHECK_RANGE)
- qWarning( "QBuffer::at: Index %d out of range", pos );
-#endif
- return FALSE;
- }
- ioIndex = pos;
- return TRUE;
-}
-
-
-/*!
- \reimp
-*/
-
-int QBuffer::readBlock( char *p, uint len )
-{
-#if defined(CHECK_STATE)
- CHECK_PTR( p );
- if ( !isOpen() ) { // buffer not open
- qWarning( "QBuffer::readBlock: Buffer not open" );
- return -1;
- }
- if ( !isReadable() ) { // reading not permitted
- qWarning( "QBuffer::readBlock: Read operation not permitted" );
- return -1;
- }
-#endif
- if ( (uint)ioIndex + len > a.size() ) { // overflow
- if ( (uint)ioIndex >= a.size() ) {
- setStatus( IO_ReadError );
- return -1;
- } else {
- len = a.size() - (uint)ioIndex;
- }
- }
- memcpy( p, a.data()+ioIndex, len );
- ioIndex += len;
- return len;
-}
-
-/*!
- \reimp
-
- Writes \a len bytes from \a p into the buffer at the current index,
- overwriting any characters there and extending the buffer if necessary.
- Returns the number of bytes actually written.
-
- Returns -1 if a serious error occurred.
-
- \sa readBlock()
-*/
-
-int QBuffer::writeBlock( const char *p, uint len )
-{
-#if defined(CHECK_NULL)
- if ( p == 0 && len != 0 )
- qWarning( "QBuffer::writeBlock: Null pointer error" );
-#endif
-#if defined(CHECK_STATE)
- if ( !isOpen() ) { // buffer not open
- qWarning( "QBuffer::writeBlock: Buffer not open" );
- return -1;
- }
- if ( !isWritable() ) { // writing not permitted
- qWarning( "QBuffer::writeBlock: Write operation not permitted" );
- return -1;
- }
-#endif
- if ( (uint)ioIndex + len >= a_len ) { // overflow
- uint new_len = a_len + a_inc*(((uint)ioIndex+len-a_len)/a_inc+1);
- if ( !a.resize( new_len ) ) { // could not resize
-#if defined(CHECK_NULL)
- qWarning( "QBuffer::writeBlock: Memory allocation error" );
-#endif
- setStatus( IO_ResourceError );
- return -1;
- }
- a_inc *= 2; // double increment
- a_len = new_len;
- a.shd->len = (uint)ioIndex + len;
- }
- memcpy( a.data()+ioIndex, p, len );
- ioIndex += len;
- if ( a.shd->len < (uint)ioIndex )
- a.shd->len = (uint)ioIndex; // fake (not alloc'd) length
- return len;
-}
-
-
-/*!
- \reimp
-*/
-
-int QBuffer::readLine( char *p, uint maxlen )
-{
-#if defined(CHECK_STATE)
- CHECK_PTR( p );
- if ( !isOpen() ) { // buffer not open
- qWarning( "QBuffer::readLine: Buffer not open" );
- return -1;
- }
- if ( !isReadable() ) { // reading not permitted
- qWarning( "QBuffer::readLine: Read operation not permitted" );
- return -1;
- }
-#endif
- if ( maxlen == 0 )
- return 0;
- uint start = (uint)ioIndex;
- char *d = a.data() + ioIndex;
- maxlen--; // make room for 0-terminator
- if ( a.size() - (uint)ioIndex < maxlen )
- maxlen = a.size() - (uint)ioIndex;
- while ( maxlen-- ) {
- if ( (*p++ = *d++) == '\n' )
- break;
- }
- *p = '\0';
- ioIndex = d - a.data();
- return (uint)ioIndex - start;
-}
-
-
-/*!
- \reimp
-*/
-
-int QBuffer::getch()
-{
-#if defined(CHECK_STATE)
- if ( !isOpen() ) { // buffer not open
- qWarning( "QBuffer::getch: Buffer not open" );
- return -1;
- }
- if ( !isReadable() ) { // reading not permitted
- qWarning( "QBuffer::getch: Read operation not permitted" );
- return -1;
- }
-#endif
- if ( (uint)ioIndex+1 > a.size() ) { // overflow
- setStatus( IO_ReadError );
- return -1;
- }
- return uchar(*(a.data()+ioIndex++));
-}
-
-/*!
- \reimp
- Writes the character \a ch into the buffer, overwriting
- the character at the current index, extending the buffer
- if necessary.
-
- Returns \a ch, or -1 if some error occurred.
-
- \sa getch(), ungetch()
-*/
-
-int QBuffer::putch( int ch )
-{
-#if defined(CHECK_STATE)
- if ( !isOpen() ) { // buffer not open
- qWarning( "QBuffer::putch: Buffer not open" );
- return -1;
- }
- if ( !isWritable() ) { // writing not permitted
- qWarning( "QBuffer::putch: Write operation not permitted" );
- return -1;
- }
-#endif
- if ( (uint)ioIndex + 1 >= a_len ) { // overflow
- char buf[1];
- buf[0] = (char)ch;
- if ( writeBlock(buf,1) != 1 )
- return -1; // write error
- } else {
- *(a.data() + ioIndex++) = (char)ch;
- if ( a.shd->len < (uint)ioIndex )
- a.shd->len = (uint)ioIndex;
- }
- return ch;
-}
-
-/*!
- \reimp
-*/
-
-int QBuffer::ungetch( int ch )
-{
-#if defined(CHECK_STATE)
- if ( !isOpen() ) { // buffer not open
- qWarning( "QBuffer::ungetch: Buffer not open" );
- return -1;
- }
- if ( !isReadable() ) { // reading not permitted
- qWarning( "QBuffer::ungetch: Read operation not permitted" );
- return -1;
- }
-#endif
- if ( ch != -1 ) {
- if ( ioIndex )
- ioIndex--;
- else
- ch = -1;
- }
- return ch;
-}
diff --git a/qtools/qbuffer.h b/qtools/qbuffer.h
deleted file mode 100644
index 9dcd286..0000000
--- a/qtools/qbuffer.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QBuffer class
-**
-** Created : 930812
-**
-** 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 QBUFFER_H
-#define QBUFFER_H
-
-#ifndef QT_H
-#include "qiodevice.h"
-#include "qstring.h"
-#endif // QT_H
-
-
-class Q_EXPORT QBuffer : public QIODevice
-{
-public:
- QBuffer();
- QBuffer( QByteArray );
- ~QBuffer();
-
- QByteArray buffer() const;
- bool setBuffer( QByteArray );
-
- bool open( int );
- void close();
- void flush();
-
- uint size() const;
- int at() const;
- bool at( int );
-
- int readBlock( char *p, uint );
- int writeBlock( const char *p, uint );
- int readLine( char *p, uint );
-
- int getch();
- int putch( int );
- int ungetch( int );
-
-protected:
- QByteArray a;
-
-private:
- uint a_len;
- uint a_inc;
-
-private: // Disabled copy constructor and operator=
-#if defined(Q_DISABLE_COPY)
- QBuffer( const QBuffer & );
- QBuffer &operator=( const QBuffer & );
-#endif
-};
-
-
-inline QByteArray QBuffer::buffer() const
-{ return a; }
-
-inline uint QBuffer::size() const
-{ return a.size(); }
-
-inline int QBuffer::at() const
-{ return ioIndex; }
-
-
-#endif // QBUFFER_H
diff --git a/qtools/qcache.h b/qtools/qcache.h
deleted file mode 100644
index f15345e..0000000
--- a/qtools/qcache.h
+++ /dev/null
@@ -1,148 +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
-
-#define USE_ASCII_STRING
-
-#ifndef USE_ASCII_STRING
-
-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, StringKey, caseSensitive, FALSE ) {}
- ~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 QString &k, const type *d, int c=1, int p=0 )
- { return QGCache::insert_string(k,(Item)d,c,p);}
- bool remove( const QString &k )
- { return QGCache::remove_string(k); }
- type *take( const QString &k )
- { return (type *)QGCache::take_string(k); }
- type *find( const QString &k, bool ref=TRUE ) const
- { return (type *)QGCache::find_string(k,ref);}
- type *operator[]( const QString &k ) const
- { return (type *)QGCache::find_string(k);}
- void statistics() const { QGCache::statistics(); }
-private:
- void deleteItem( Item d ) { if ( del_item ) delete (type *)d; }
-};
-
-#else
-
-
-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(); }
-private:
- void deleteItem( Item d ) { if ( del_item ) delete (type *)d; }
-};
-
-
-#endif
-
-
-
-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(); }
-#ifndef USE_ASCII_STRING
- QString currentKey() const{ return QGCacheIterator::getKeyString(); }
-#else
- const char *currentKey() const{ return QGCacheIterator::getKeyAscii(); }
-#endif
- 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
deleted file mode 100644
index e70b64b..0000000
--- a/qtools/qcollection.cpp
+++ /dev/null
@@ -1,182 +0,0 @@
-/****************************************************************************
-**
-**
-** Implementation of base class for all collection classes
-**
-** Created : 920820
-**
-** 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 "qcollection.h"
-
-// NOT REVISED
-/*!
- \class QCollection qcollection.h
- \brief The QCollection class is the base class of all Qt collections.
-
- \ingroup collection
- \ingroup tools
-
- The QCollection class is an abstract base class for the Qt \link
- collection.html collection classes\endlink QDict, QList etc. via QGDict,
- QGList etc.
-
- A QCollection knows only about the number of objects in the
- collection and the deletion strategy (see setAutoDelete()).
-
- A collection is implemented using the \c Item (generic collection
- item) type, which is a \c void*. The template classes that create
- the real collections cast the \c Item to the required type.
-
- \sa \link collection.html Collection Classes\endlink
-*/
-
-
-/*! \enum QCollection::Item
-
- This type is the generic "item" in a QCollection.
-*/
-
-
-/*!
- \fn QCollection::QCollection()
-
- Constructs a collection. The constructor is protected because
- QCollection is an abstract class.
-*/
-
-/*!
- \fn QCollection::QCollection( const QCollection & source )
-
- Constructs a copy of \a source with autoDelete() set to FALSE. The
- constructor is protected because QCollection is an abstract class.
-
- Note that if \a source has autoDelete turned on, copying it is a
- good way to get memory leaks, reading freed memory, or both.
-*/
-
-/*!
- \fn QCollection::~QCollection()
- Destroys the collection. The destructor is protected because QCollection
- is an abstract class.
-*/
-
-
-/*!
- \fn bool QCollection::autoDelete() const
- Returns the setting of the auto-delete option (default is FALSE).
- \sa setAutoDelete()
-*/
-
-/*!
- \fn void QCollection::setAutoDelete( bool enable )
-
- Sets the auto-delete option of the collection.
-
- Enabling auto-delete (\e enable is TRUE) will delete objects that
- are removed from the collection. This can be useful if the
- collection has the only reference to the objects. (Note that the
- object can still be copied using the copy constructor - copying such
- objects is a good way to get memory leaks, reading freed memory or
- both.)
-
- Disabling auto-delete (\e enable is FALSE) will \e not delete objects
- that are removed from the collection. This is useful if the objects
- are part of many collections.
-
- The default setting is FALSE.
-
- \sa autoDelete()
-*/
-
-
-/*!
- \fn virtual uint QCollection::count() const
- Returns the number of objects in the collection.
-*/
-
-/*!
- \fn virtual void QCollection::clear()
- Removes all objects from the collection. The objects will be deleted
- if auto-delete has been enabled.
- \sa setAutoDelete()
-*/
-
-
-/*!
- Virtual function that creates a copy of an object that is about to
- be inserted into the collection.
-
- The default implementation returns the \e d pointer, i.e. no copy
- is made.
-
- This function is seldom reimplemented in the collection template
- classes. It is not common practice to make a copy of something
- that is being inserted.
-
- \sa deleteItem()
-*/
-
-QCollection::Item QCollection::newItem( Item d )
-{
- return d; // just return reference
-}
-
-/*!
- Virtual function that deletes an item that is about to be removed from
- the collection.
-
- The default implementation deletes \e d pointer if and only if
- auto-delete has been enabled.
-
- This function is always reimplemented in the collection template
- classes.
-
- \warning If you reimplement this function you must also reimplement
- the destructor and call the virtual function clear() from your
- destructor. This is due to the way virtual functions and
- destructors work in C++: virtual functions in derived classes cannot
- be called from a destructor. If you do not do this your
- deleteItem() function will not be called when the container is
- destructed.
-
- \sa newItem(), setAutoDelete()
-*/
-
-void QCollection::deleteItem( Item d )
-{
- if ( del_item )
-#if defined(Q_DELETING_VOID_UNDEFINED)
- delete (char *)d; // default operation
-#else
- delete d; // default operation
-#endif
-}
diff --git a/qtools/qcollection.h b/qtools/qcollection.h
deleted file mode 100644
index a169b7c..0000000
--- a/qtools/qcollection.h
+++ /dev/null
@@ -1,74 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of base class for all collection classes
-**
-** Created : 920629
-**
-** 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 QCOLLECTION_H
-#define QCOLLECTION_H
-
-#ifndef QT_H
-#include "qglobal.h"
-#endif // QT_H
-
-
-class QGVector;
-class QGList;
-class QGDict;
-
-
-class Q_EXPORT QCollection // inherited by all collections
-{
-public:
- bool autoDelete() const { return del_item; }
- void setAutoDelete( bool enable ) { del_item = enable; }
-
- virtual uint count() const = 0;
- virtual void clear() = 0; // delete all objects
-
- typedef void *Item; // generic collection item
-
-protected:
- QCollection() { del_item = FALSE; } // no deletion of objects
- QCollection(const QCollection &) { del_item = FALSE; }
- virtual ~QCollection() {}
-
- bool del_item; // default FALSE
-
- virtual Item newItem( Item ); // create object
- virtual void deleteItem( Item ); // delete object
-};
-
-
-#endif // QCOLLECTION_H
diff --git a/qtools/qconfig.h b/qtools/qconfig.h
deleted file mode 100644
index 7a880f9..0000000
--- a/qtools/qconfig.h
+++ /dev/null
@@ -1 +0,0 @@
-// Everything
diff --git a/qtools/qcstring.cpp b/qtools/qcstring.cpp
deleted file mode 100644
index 44324c2..0000000
--- a/qtools/qcstring.cpp
+++ /dev/null
@@ -1,1917 +0,0 @@
-/****************************************************************************
-**
-**
-** Implementation of extended char array operations, and QByteArray and
-** QCString classes
-**
-** Created : 920722
-**
-** 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 "qstring.h"
-#include "qregexp.h"
-#include "qdatastream.h"
-#include <stdio.h>
-#include <stdarg.h>
-#include <stdlib.h>
-#include <ctype.h>
-
-/*****************************************************************************
- Safe and portable C string functions; extensions to standard string.h
- *****************************************************************************/
-
-/*!
- \fn void *memmove( void *dst, const void *src, uint len )
- \relates QCString
-
- This function is normally part of the C library. Qt implements
- memmove() for platforms that do not have it.
-
- memmove() copies \e len bytes from \e src into \e dst. The data is
- copied correctly even if \e src and \e dst overlap.
-*/
-
-void *qmemmove( void *dst, const void *src, uint len )
-{
- register char *d;
- register char *s;
- if ( dst > src ) {
- d = (char *)dst + len - 1;
- s = (char *)src + len - 1;
- while ( len-- )
- *d-- = *s--;
- } else if ( dst < src ) {
- d = (char *)dst;
- s = (char *)src;
- while ( len-- )
- *d++ = *s++;
- }
- return dst;
-}
-
-/*!
- \relates QCString
-
- Returns a duplicate string.
-
- Allocates space for a copy of \e str (using \c new), copies it, and returns
- a pointer to the copy.
- If \e src is null, it immediately returns 0.
-*/
-
-char *qstrdup( const char *str )
-{
- if ( !str )
- return 0;
- char *dst = new char[strlen(str)+1];
- CHECK_PTR( dst );
- return strcpy( dst, str );
-}
-
-/*!
- \relates QCString
-
- A safe strncpy() function.
-
- Copies all characters up to \e len bytes from \e str into \e dst and returns
- a pointer to \e dst. Guarantees that \e dst is \0-terminated.
- If \e src is null, it immediately returns 0.
-
- \sa qstrcpy()
-*/
-
-char *qstrncpy( char *dst, const char *src, uint len )
-{
- if ( !src )
- return 0;
- strncpy( dst, src, len );
- if ( len > 0 )
- dst[len-1] = '\0';
- return dst;
-}
-
-/*!
- \fn int qstrcmp( const char *str1, const char *str2 )
- \relates QCString
-
- A safe strcmp() function.
-
- Compares \e str1 and \e str2. Returns a negative value if \e str1
- is less than \e str2, 0 if \e str1 is equal to \e str2 or a positive
- value if \e str1 is greater than \e str2.
-
- Special case I: Returns 0 if \e str1 and \e str2 are both null.
-
- Special case II: Returns a random nonzero value if \e str1 is null
- or \e str2 is null (but not both).
-
- \sa qstrncmp(), qstricmp(), qstrnicmp()
-*/
-
-/*!
- \fn int qstrncmp( const char *str1, const char *str2, uint len )
- \relates QCString
-
- A safe strncmp() function.
-
- Compares \e str1 and \e str2 up to \e len bytes.
-
- Returns a negative value if \e str1 is less than \e str2, 0 if \e str1
- is equal to \e str2 or a positive value if \e str1 is greater than \e
- str2.
-
- Special case I: Returns 0 if \e str1 and \e str2 are both null.
-
- Special case II: Returns a random nonzero value if \e str1 is null
- or \e str2 is null (but not both).
-
- \sa qstrcmp(), qstricmp(), qstrnicmp()
-*/
-
-/*!
- \fn int qstricmp( const char *str1, const char *str2 )
- \relates QCString
-
- A safe stricmp() function.
-
- Compares \e str1 and \e str2 ignoring the case.
-
- Returns a negative value if \e str1 is less than \e str2, 0 if \e str1
- is equal to \e str2 or a positive value if \e str1 is greater than \e
- str2.
-
- Special case I: Returns 0 if \e str1 and \e str2 are both null.
-
- Special case II: Returns a random nonzero value if \e str1 is null
- or \e str2 is null (but not both).
-
- \sa qstrcmp(), qstrncmp(), qstrnicmp()
-*/
-
-int qstricmp( const char *str1, const char *str2 )
-{
- register const uchar *s1 = (const uchar *)str1;
- register const uchar *s2 = (const uchar *)str2;
- int res;
- uchar c;
- if ( !s1 || !s2 )
- return s1 == s2 ? 0 : (int)((long)s2 - (long)s1);
- for ( ; !(res = (c=tolower(*s1)) - tolower(*s2)); s1++, s2++ )
- if ( !c ) // strings are equal
- break;
- return res;
-}
-
-/*!
- \fn int strnicmp( const char *str1, const char *str2, uint len )
- \relates QCString
-
- A safe strnicmp() function.
-
- Compares \e str1 and \e str2 up to \e len bytes ignoring the case.
-
- Returns a negative value if \e str1 is less than \e str2, 0 if \e str1
- is equal to \e str2 or a positive value if \e str1 is greater than \e
- str2.
-
- Special case I: Returns 0 if \e str1 and \e str2 are both null.
-
- Special case II: Returns a random nonzero value if \e str1 is null
- or \e str2 is null (but not both).
-
- \sa qstrcmp(), qstrncmp() qstricmp()
-*/
-
-int qstrnicmp( const char *str1, const char *str2, uint len )
-{
- register const uchar *s1 = (const uchar *)str1;
- register const uchar *s2 = (const uchar *)str2;
- int res;
- uchar c;
- if ( !s1 || !s2 )
- return (int)((long)s2 - (long)s1);
- for ( ; len--; s1++, s2++ ) {
- if ( (res = (c=tolower(*s1)) - tolower(*s2)) )
- return res;
- if ( !c ) // strings are equal
- break;
- }
- return 0;
-}
-
-
-static Q_UINT16 crc_tbl[16];
-static bool crc_tbl_init = FALSE;
-
-static void createCRC16Table() // build CRC16 lookup table
-{
- register uint i;
- register uint j;
- uint v0, v1, v2, v3;
- for ( i=0; i<16; i++ ) {
- v0 = i & 1;
- v1 = (i >> 1) & 1;
- v2 = (i >> 2) & 1;
- v3 = (i >> 3) & 1;
- j = 0;
-#undef SET_BIT
-#define SET_BIT(x,b,v) x |= v << b
- SET_BIT(j, 0,v0);
- SET_BIT(j, 7,v0);
- SET_BIT(j,12,v0);
- SET_BIT(j, 1,v1);
- SET_BIT(j, 8,v1);
- SET_BIT(j,13,v1);
- SET_BIT(j, 2,v2);
- SET_BIT(j, 9,v2);
- SET_BIT(j,14,v2);
- SET_BIT(j, 3,v3);
- SET_BIT(j,10,v3);
- SET_BIT(j,15,v3);
- crc_tbl[i] = j;
- }
-}
-
-/*!
- \relates QByteArray
- Returns the CRC-16 checksum of \e len bytes starting at \e data.
-
- The checksum is independent of the byte order (endianness).
-*/
-
-Q_UINT16 qChecksum( const char *data, uint len )
-{
- if ( !crc_tbl_init ) { // create lookup table
- createCRC16Table();
- crc_tbl_init = TRUE;
- }
- register Q_UINT16 crc = 0xffff;
- uchar c;
- uchar *p = (uchar *)data;
- while ( len-- ) {
- c = *p++;
- crc = ((crc >> 4) & 0x0fff) ^ crc_tbl[((crc ^ c) & 15)];
- c >>= 4;
- crc = ((crc >> 4) & 0x0fff) ^ crc_tbl[((crc ^ c) & 15)];
- }
- return (~crc & 0xffff);
-}
-
-
-/*****************************************************************************
- QByteArray member functions
- *****************************************************************************/
-
-// NOT REVISED
-/*! \class QByteArray qcstring.h
-
- \brief The QByteArray class provides an array of bytes.
-
- \inherit QArray
- \ingroup tools
- \ingroup shared
-
- QByteArray is defined as QArray\<char\>.
-*/
-
-
-/*****************************************************************************
- QByteArray stream functions
- *****************************************************************************/
-
-/*!
- \relates QByteArray
- Writes a byte array to a stream and returns a reference to the stream.
-
- \sa \link datastreamformat.html Format of the QDataStream operators \endlink
-*/
-#ifndef QT_NO_DATASTREAM
-
-QDataStream &operator<<( QDataStream &s, const QByteArray &a )
-{
- return s.writeBytes( a.data(), a.size() );
-}
-
-/*!
- \relates QByteArray
- Reads a byte array from a stream and returns a reference to the stream.
-
- \sa \link datastreamformat.html Format of the QDataStream operators \endlink
-*/
-
-QDataStream &operator>>( QDataStream &s, QByteArray &a )
-{
- Q_UINT32 len;
- s >> len; // read size of array
- if ( len == 0 || s.eof() ) { // end of file reached
- a.resize( 0 );
- return s;
- }
- if ( !a.resize( (uint)len ) ) { // resize array
-#if defined(CHECK_NULL)
- qWarning( "QDataStream: Not enough memory to read QByteArray" );
-#endif
- len = 0;
- }
- if ( len > 0 ) // not null array
- s.readRawBytes( a.data(), (uint)len );
- return s;
-}
-
-#endif //QT_NO_DATASTREAM
-
-/*****************************************************************************
- QCString member functions
- *****************************************************************************/
-
-/*!
- \class QCString qcstring.h
-
- \brief The QCString class provides an abstraction of the classic C
- zero-terminated char array (<var>char*</var>).
-
- \ingroup tools
- \ingroup shared
-
- QCString inherits QByteArray, which is defined as QArray\<char\>.
-
- Since QCString is a QArray, it uses \e explicit
- \link shclass.html sharing\endlink with a reference count.
-
- You might use QCString for text that is never exposed to the user,
- but for text the user sees, you should use QString (which provides
- implicit sharing, Unicode and other internationalization support).
-
- Note that QCString is one of the weaker classes in Qt; its design is
- flawed (it tries to behave like a more convenient const char *) and
- as a result, algorithms that use QCString heavily all too often
- perform badly. For example, append() is O(length()) since it scans
- for a null terminator, which makes many algorithms that use QCString
- scale even worse.
-
- Note that for the QCString methods that take a <var>const char *</var>
- parameter the results are undefined if the QCString is not
- zero-terminated. It is legal for the <var>const char *</var> parameter
- to be 0.
-
- A QCString that has not been assigned to anything is \e null, i.e. both
- the length and data pointer is 0. A QCString that references the empty
- string ("", a single '\0' char) is \e empty. Both null and empty
- QCStrings are legal parameters to the methods. Assigning <var>const char
- * 0</var> to QCString gives a null QCString.
-
- \sa \link shclass.html Shared classes\endlink
-*/
-
-
-/*
- Implementation note: The QCString methods for QRegExp searching are
- implemented by converting the QCString to a QString and performing
- the search on that. This implies a deep copy of the QCString
- data. Therefore, if you are giong to perform many QRegExp searches
- on one and the same, large QCString, you will get better performance
- by converting the QCString to a QString yourself, and do the
- searches on that. The results will be of course be identical.
-*/
-
-
-
-/*!
- \fn QCString::QCString()
- Constructs a null string.
- \sa isNull()
-*/
-
-/*!
- \fn QCString::QCString( const QCString &s )
- Constructs a shallow copy \e s.
- \sa assign()
-*/
-
-/*!
- Constructs a string with room for \e size characters, including the
- '\0'-terminator. Makes a null string if \e size == 0.
-
- If \e size \> 0, then the first and last characters in the string are
- initialized to '\0'. All other characters are uninitialized.
-
- \sa resize(), isNull()
-*/
-
-QCString::QCString( int size )
- : QByteArray( size )
-{
- if ( size > 0 ) {
- *data() = '\0'; // set terminator
- *(data()+(size-1)) = '\0';
- }
-}
-
-/*!
- Constructs a string that is a deep copy of \e str.
-
- If \a str is 0 a null string is created.
-
- \sa isNull()
-*/
-
-QCString::QCString( const char *str )
-{
- duplicate( str, qstrlen(str) + 1 );
-}
-
-
-/*!
- Constructs a string that is a deep copy of \e str, that is no more
- than \a maxsize bytes long including the '\0'-terminator.
-
- Example:
- \code
- QCString str( "helloworld", 6 ); // Assigns "hello" to str.
- \endcode
-
- If \a str contains a 0 byte within the first \a maxsize bytes, the
- resulting QCString will be terminated by the 0. If \a str is 0 a
- null string is created.
-
- \sa isNull()
-*/
-
-QCString::QCString( const char *str, uint maxsize )
-{
- if ( str == 0 )
- return;
- uint len; // index of first '\0'
- for ( len = 0; len < maxsize - 1; len++ ) {
- if ( str[len] == '\0' )
- break;
- }
- QByteArray::resize( len + 1 );
- memcpy( data(), str, len );
- data()[len] = 0;
-}
-
-/*!
- \fn QCString &QCString::operator=( const QCString &s )
- Assigns a shallow copy of \e s to this string and returns a reference to
- this string.
-*/
-
-/*!
- \fn QCString &QCString::operator=( const char *str )
- Assigns a deep copy of \a str to this string and returns a reference to
- this string.
-
- If \a str is 0 a null string is created.
-
- \sa isNull()
-*/
-
-/*!
- \fn bool QCString::isNull() const
- Returns TRUE if the string is null, i.e. if data() == 0.
- A null string is also an empty string.
-
- Example:
- \code
- QCString a; // a.data() == 0, a.size() == 0, a.length() == 0
- QCString b == ""; // b.data() == "", b.size() == 1, b.length() == 0
- a.isNull(); // TRUE, because a.data() == 0
- a.isEmpty(); // TRUE, because a.length() == 0
- b.isNull(); // FALSE, because b.data() == ""
- b.isEmpty(); // TRUE, because b.length() == 0
- \endcode
-
- \sa isEmpty(), length(), size()
-*/
-
-/*!
- \fn bool QCString::isEmpty() const
-
- Returns TRUE if the string is empty, i.e. if length() == 0.
- An empty string is not always a null string.
-
- See example in isNull().
-
- \sa isNull(), length(), size()
-*/
-
-/*!
- \fn uint QCString::length() const
- Returns the length of the string, excluding the '\0'-terminator.
- Equivalent to calling \c strlen(data()).
-
- Null strings and empty strings have zero length.
-
- \sa size(), isNull(), isEmpty()
-*/
-
-/*!
- \fn bool QCString::truncate( uint pos )
- Truncates the string at position \e pos.
-
- Equivalent to calling \c resize(pos+1).
-
- Example:
- \code
- QCString s = "truncate this string";
- s.truncate( 5 ); // s == "trunc"
- \endcode
-
- \sa resize()
-*/
-
-/*!
- Extends or shrinks the string to \e len bytes, including the
- '\0'-terminator.
-
- A \0-terminator is set at position <code>len - 1</code> unless
- <code>len == 0</code>.
-
- Example:
- \code
- QCString s = "resize this string";
- s.resize( 7 ); // s == "resize"
- \endcode
-
- \sa truncate()
-*/
-
-bool QCString::resize( uint len )
-{
- detach();
- if ( !QByteArray::resize(len) )
- return FALSE;
- if ( len )
- *(data()+len-1) = '\0';
- return TRUE;
-}
-
-
-/*!
- Implemented as a call to the native vsprintf() (see your C-library
- manual).
-
- If your string is shorter than 256 characters, this sprintf() calls
- resize(256) to decrease the chance of memory corruption. The string is
- resized back to its natural length before sprintf() returns.
-
- Example:
- \code
- QCString s;
- s.sprintf( "%d - %s", 1, "first" ); // result < 256 chars
-
- QCString big( 25000 ); // very long string
- big.sprintf( "%d - %s", 2, longString ); // result < 25000 chars
- \endcode
-
- \warning All vsprintf() implementations will write past the end of
- the target string (*this) if the format specification and arguments
- happen to be longer than the target string, and some will also fail
- if the target string is longer than some arbitrary implementation
- limit.
-
- Giving user-supplied arguments to sprintf() is begging for trouble.
- Sooner or later someone \e will paste a 3000-character line into
- your application.
-*/
-
-QCString &QCString::sprintf( const char *format, ... )
-{
- detach();
- va_list ap;
- va_start( ap, format );
- if ( size() < 256 )
- QByteArray::resize( 256 ); // make string big enough
- vsprintf( data(), format, ap );
- resize( qstrlen(data()) + 1 ); // truncate
- va_end( ap );
- return *this;
-}
-
-
-/*!
- Fills the string with \e len bytes of value \e c, followed by a
- '\0'-terminator.
-
- If \e len is negative, then the current string length is used.
-
- Returns FALSE is \e len is nonnegative and there is no memory to
- resize the string, otherwise TRUE is returned.
-*/
-
-bool QCString::fill( char c, int len )
-{
- detach();
- if ( len < 0 )
- len = length();
- if ( !QByteArray::fill(c,len+1) )
- return FALSE;
- *(data()+len) = '\0';
- return TRUE;
-}
-
-
-/*!
- \fn QCString QCString::copy() const
- Returns a deep copy of this string.
- \sa detach()
-*/
-
-
-/*!
- Finds the first occurrence of the character \e c, starting at
- position \e index.
-
- The search is case sensitive if \e cs is TRUE, or case insensitive if \e
- cs is FALSE.
-
- Returns the position of \e c, or -1 if \e c could not be found.
-*/
-
-int QCString::find( char c, int index, bool cs ) const
-{
- if ( (uint)index >= size() ) // index outside string
- return -1;
- register const char *d;
- if ( cs ) { // case sensitive
- d = strchr( data()+index, c );
- } else {
- d = data()+index;
- c = tolower( (uchar) c );
- while ( *d && tolower((uchar) *d) != c )
- d++;
- if ( !*d && c ) // not found
- d = 0;
- }
- return d ? (int)(d - data()) : -1;
-}
-
-/*!
- Finds the first occurrence of the string \e str, starting at position
- \e index.
-
- The search is case sensitive if \e cs is TRUE, or case insensitive if \e
- cs is FALSE.
-
- Returns the position of \e str, or -1 if \e str could not be found.
-*/
-
-int QCString::find( const char *str, int index, bool cs ) const
-{
- if ( (uint)index >= size() ) // index outside string
- return -1;
- if ( !str ) // no search string
- return -1;
- if ( !*str ) // zero-length search string
- return index;
- register const char *d;
- if ( cs ) { // case sensitive
- d = strstr( data()+index, str );
- } else { // case insensitive
- d = data()+index;
- int len = qstrlen( str );
- while ( *d ) {
- if ( qstrnicmp(d, str, len) == 0 )
- break;
- d++;
- }
- if ( !*d ) // not found
- d = 0;
- }
- return d ? (int)(d - data()) : -1;
-}
-
-/*!
- Finds the first occurrence of the character \e c, starting at
- position \e index and searching backwards.
-
- The search is case sensitive if \e cs is TRUE, or case insensitive if \e
- cs is FALSE.
-
- Returns the position of \e c, or -1 if \e c could not be found.
-*/
-
-int QCString::findRev( char c, int index, bool cs ) const
-{
- const char *b = data();
- const char *d;
- if ( index < 0 ) { // neg index ==> start from end
- if ( size() == 0 )
- return -1;
- if ( cs ) {
- d = strrchr( b, c );
- return d ? (int)(d - b) : -1;
- }
- index = length();
- } else if ( (uint)index >= size() ) { // bad index
- return -1;
- }
- d = b+index;
- if ( cs ) { // case sensitive
- while ( d >= b && *d != c )
- d--;
- } else { // case insensitive
- c = tolower( (uchar) c );
- while ( d >= b && tolower((uchar) *d) != c )
- d--;
- }
- return d >= b ? (int)(d - b) : -1;
-}
-
-/*!
- Finds the first occurrence of the string \e str, starting at
- position \e index and searching backwards.
-
- The search is case sensitive if \e cs is TRUE, or case insensitive if \e
- cs is FALSE.
-
- Returns the position of \e str, or -1 if \e str could not be found.
-*/
-
-int QCString::findRev( const char *str, int index, bool cs ) const
-{
- int slen = qstrlen(str);
- if ( index < 0 ) // neg index ==> start from end
- index = length()-slen;
- else if ( (uint)index >= size() ) // bad index
- return -1;
- else if ( (uint)(index + slen) > length() ) // str would be too long
- index = length() - slen;
- if ( index < 0 )
- return -1;
-
- register char *d = data() + index;
- if ( cs ) { // case sensitive
- for ( int i=index; i>=0; i-- )
- if ( qstrncmp(d--,str,slen)==0 )
- return i;
- } else { // case insensitive
- for ( int i=index; i>=0; i-- )
- if ( qstrnicmp(d--,str,slen)==0 )
- return i;
- }
- return -1;
-}
-
-
-/*!
- Returns the number of times the character \e c occurs in the string.
-
- The match is case sensitive if \e cs is TRUE, or case insensitive if \e cs
- if FALSE.
-*/
-
-int QCString::contains( char c, bool cs ) const
-{
- int count = 0;
- char *d = data();
- if ( !d )
- return 0;
- if ( cs ) { // case sensitive
- while ( *d )
- if ( *d++ == c )
- count++;
- } else { // case insensitive
- c = tolower( (uchar) c );
- while ( *d ) {
- if ( tolower((uchar) *d) == c )
- count++;
- d++;
- }
- }
- return count;
-}
-
-/*!
- Returns the number of times \e str occurs in the string.
-
- The match is case sensitive if \e cs is TRUE, or case insensitive if \e
- cs if FALSE.
-
- This function counts overlapping substrings, for example, "banana"
- contains two occurrences of "ana".
-
- \sa findRev()
-*/
-
-int QCString::contains( const char *str, bool cs ) const
-{
- int count = 0;
- char *d = data();
- if ( !d )
- return 0;
- int len = qstrlen( str );
- while ( *d ) { // counts overlapping strings
- if ( cs ) {
- if ( qstrncmp( d, str, len ) == 0 )
- count++;
- } else {
- if ( qstrnicmp(d, str, len) == 0 )
- count++;
- }
- d++;
- }
- return count;
-}
-
-/*!
- Returns a substring that contains the \e len leftmost characters
- of the string.
-
- The whole string is returned if \e len exceeds the length of the string.
-
- Example:
- \code
- QCString s = "Pineapple";
- QCString t = s.left( 4 ); // t == "Pine"
- \endcode
-
- \sa right(), mid()
-*/
-
-QCString QCString::left( uint len ) const
-{
- if ( isEmpty() ) {
- QCString empty;
- return empty;
- } else if ( len >= size() ) {
- QCString same( data() );
- return same;
- } else {
- QCString s( len+1 );
- strncpy( s.data(), data(), len );
- *(s.data()+len) = '\0';
- return s;
- }
-}
-
-/*!
- Returns a substring that contains the \e len rightmost characters
- of the string.
-
- The whole string is returned if \e len exceeds the length of the string.
-
- Example:
- \code
- QCString s = "Pineapple";
- QCString t = s.right( 5 ); // t == "apple"
- \endcode
-
- \sa left(), mid()
-*/
-
-QCString QCString::right( uint len ) const
-{
- if ( isEmpty() ) {
- QCString empty;
- return empty;
- } else {
- uint l = length();
- if ( len > l )
- len = l;
- char *p = data() + (l - len);
- return QCString( p );
- }
-}
-
-/*!
- Returns a substring that contains the \e len characters of this
- string, starting at position \e index.
-
- Returns a null string if the string is empty or \e index is out
- of range. Returns the whole string from \e index if \e index+len exceeds
- the length of the string.
-
- Example:
- \code
- QCString s = "Two pineapples";
- QCString t = s.mid( 4, 4 ); // t == "pine"
- \endcode
-
- \sa left(), right()
-*/
-
-QCString QCString::mid( uint index, uint len ) const
-{
- if ( len == 0xffffffff ) len = length()-index;
- uint slen = qstrlen( data() );
- if ( isEmpty() || index >= slen ) {
- QCString empty;
- return empty;
- } else {
- register char *p = data()+index;
- QCString s( len+1 );
- strncpy( s.data(), p, len );
- *(s.data()+len) = '\0';
- return s;
- }
-}
-
-/*!
- Returns a string of length \e width (plus '\0') that contains this
- string and padded by the \e fill character.
-
- If the length of the string exceeds \e width and \e truncate is FALSE,
- then the returned string is a copy of the string.
- If the length of the string exceeds \e width and \e truncate is TRUE,
- then the returned string is a left(\e width).
-
- Example:
- \code
- QCString s("apple");
- QCString t = s.leftJustify(8, '.'); // t == "apple..."
- \endcode
-
- \sa rightJustify()
-*/
-
-QCString QCString::leftJustify( uint width, char fill, bool truncate ) const
-{
- QCString result;
- int len = qstrlen(data());
- int padlen = width - len;
- if ( padlen > 0 ) {
- result.QByteArray::resize( len+padlen+1 );
- memcpy( result.data(), data(), len );
- memset( result.data()+len, fill, padlen );
- result[len+padlen] = '\0';
- } else {
- if ( truncate )
- result = left( width );
- else
- result = copy();
- }
- return result;
-}
-
-/*!
- Returns a string of length \e width (plus '\0') that contains pad
- characters followed by the string.
-
- If the length of the string exceeds \e width and \e truncate is FALSE,
- then the returned string is a copy of the string.
- If the length of the string exceeds \e width and \e truncate is TRUE,
- then the returned string is a left(\e width).
-
- Example:
- \code
- QCString s("pie");
- QCString t = s.rightJustify(8, '.'); // t == ".....pie"
- \endcode
-
- \sa leftJustify()
-*/
-
-QCString QCString::rightJustify( uint width, char fill, bool truncate ) const
-{
- QCString result;
- int len = qstrlen(data());
- int padlen = width - len;
- if ( padlen > 0 ) {
- result.QByteArray::resize( len+padlen+1 );
- memset( result.data(), fill, padlen );
- memcpy( result.data()+padlen, data(), len );
- result[len+padlen] = '\0';
- } else {
- if ( truncate )
- result = left( width );
- else
- result = copy();
- }
- return result;
-}
-
-/*!
- Returns a new string that is the string converted to lower case.
-
- Presently it only handles 7-bit ASCII, or whatever tolower()
- handles (if $LC_CTYPE is set, most UNIX systems do the Right Thing).
-
- Example:
- \code
- QCString s("TeX");
- QCString t = s.lower(); // t == "tex"
- \endcode
-
- \sa upper()
-*/
-
-QCString QCString::lower() const
-{
- QCString s( data() );
- register char *p = s.data();
- if ( p ) {
- while ( *p ) {
- *p = tolower((uchar) *p);
- p++;
- }
- }
- return s;
-}
-
-/*!
- Returns a new string that is the string converted to upper case.
-
- Presently it only handles 7-bit ASCII, or whatever toupper()
- handles (if $LC_CTYPE is set, most UNIX systems do the Right Thing).
-
- Example:
- \code
- QCString s("TeX");
- QCString t = s.upper(); // t == "TEX"
- \endcode
-
- \sa lower()
-*/
-
-QCString QCString::upper() const
-{
- QCString s( data() );
- register char *p = s.data();
- if ( p ) {
- while ( *p ) {
- *p = toupper((uchar)*p);
- p++;
- }
- }
- return s;
-}
-
-
-/*!
- Returns a new string that has white space removed from the start and the end.
-
- White space means any ASCII code 9, 10, 11, 12, 13 or 32.
-
- Example:
- \code
- QCString s = " space ";
- QCString t = s.stripWhiteSpace(); // t == "space"
- \endcode
-
- \sa simplifyWhiteSpace()
-*/
-
-QCString QCString::stripWhiteSpace() const
-{
- if ( isEmpty() ) // nothing to do
- return copy();
-
- register char *s = data();
- QCString result = s;
- int reslen = result.length();
- if ( !isspace((uchar) s[0]) && !isspace((uchar) s[reslen-1]) )
- return result; // returns a copy
-
- s = result.data();
- 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
- result.resize( 1 );
- return result;
- }
- while ( end && isspace((uchar) s[end]) ) // skip white space from end
- end--;
- end -= start - 1;
- memmove( result.data(), &s[start], end );
- result.resize( end + 1 );
- return result;
-}
-
-
-/*!
- Returns a new string that has white space removed from the start and the end,
- plus any sequence of internal white space replaced with a single space
- (ASCII 32).
-
- White space means any ASCII code 9, 10, 11, 12, 13 or 32.
-
- \code
- QCString s = " lots\t of\nwhite space ";
- QCString t = s.simplifyWhiteSpace(); // t == "lots of white space"
- \endcode
-
- \sa stripWhiteSpace()
-*/
-
-QCString QCString::simplifyWhiteSpace() const
-{
- if ( isEmpty() ) // nothing to do
- return copy();
- QCString result( size() );
- char *from = data();
- char *to = result.data();
- char *first = to;
- while ( TRUE ) {
- while ( *from && isspace((uchar) *from) )
- from++;
- while ( *from && !isspace((uchar)*from) )
- *to++ = *from++;
- if ( *from )
- *to++ = 0x20; // ' '
- else
- break;
- }
- if ( to > first && *(to-1) == 0x20 )
- to--;
- *to = '\0';
- result.resize( (int)((long)to - (long)result.data()) + 1 );
- return result;
-}
-
-
-/*!
- Insert \e s into the string before position \e index.
-
- If \e index is beyond the end of the string, the string is extended with
- spaces (ASCII 32) to length \e index and \e s is then appended.
-
- \code
- QCString s = "I like fish";
- s.insert( 2, "don't "); // s == "I don't like fish"
- s = "x";
- s.insert( 3, "yz" ); // s == "x yz"
- \endcode
-*/
-
-QCString &QCString::insert( uint index, const char *s )
-{
- int len = qstrlen(s);
- if ( len == 0 )
- return *this;
- uint olen = length();
- int nlen = olen + len;
- if ( index >= olen ) { // insert after end of string
- detach();
- if ( QByteArray::resize(nlen+index-olen+1) ) {
- memset( data()+olen, ' ', index-olen );
- memcpy( data()+index, s, len+1 );
- }
- } else if ( QByteArray::resize(nlen+1) ) { // normal insert
- detach();
- memmove( data()+index+len, data()+index, olen-index+1 );
- memcpy( data()+index, s, len );
- }
- return *this;
-}
-
-/*!
- Insert \e c into the string at (before) position \e index and returns
- a reference to the string.
-
- If \e index is beyond the end of the string, the string is extended with
- spaces (ASCII 32) to length \e index and \e c is then appended.
-
- Example:
- \code
- QCString s = "Yes";
- s.insert( 3, '!'); // s == "Yes!"
- \endcode
-
- \sa remove(), replace()
-*/
-
-QCString &QCString::insert( uint index, char c ) // insert char
-{
- char buf[2];
- buf[0] = c;
- buf[1] = '\0';
- return insert( index, buf );
-}
-
-/*!
- \fn QCString &QCString::prepend( const char *s )
-
- Prepend \a s to the string. Equivalent to insert(0,s).
-
- \sa insert()
-*/
-
-/*!
- Removes \e len characters starting at position \e index from the
- string and returns a reference to the string.
-
- If \e index is too big, nothing happens. If \e index is valid, but
- \e len is too large, the rest of the string is removed.
-
- \code
- QCString s = "Montreal";
- s.remove( 1, 4 );
- // s == "Meal"
- \endcode
-
- \sa insert(), replace()
-*/
-
-QCString &QCString::remove( uint index, uint len )
-{
- uint olen = length();
- if ( index + len >= olen ) { // range problems
- if ( index < olen ) { // index ok
- detach();
- resize( index+1 );
- }
- } else if ( len != 0 ) {
- detach();
- memmove( data()+index, data()+index+len, olen-index-len+1 );
- QByteArray::resize(olen-len+1);
- }
- return *this;
-}
-
-/*!
- Replaces \e len characters starting at position \e index from the
- string with \e s, and returns a reference to the string.
-
- If \e index is too big, nothing is deleted and \e s is inserted at the
- end of the string. If \e index is valid, but \e len is too large, \e
- str replaces the rest of the string.
-
- \code
- QCString s = "Say yes!";
- s.replace( 4, 3, "NO" ); // s == "Say NO!"
- \endcode
-
- \sa insert(), remove()
-*/
-
-QCString &QCString::replace( uint index, uint len, const char *s )
-{
- remove( index, len );
- insert( index, s );
- return *this;
-}
-
-
-/*!
- Finds the first occurrence of the regular expression \e rx, starting at
- position \e index.
-
- Returns the position of the next match, or -1 if \e rx was not found.
-*/
-
-int QCString::find( const QRegExp &rx, int index ) const
-{
- QString d = QString::fromLatin1( data() );
- return d.find( rx, index );
-}
-
-/*!
- Finds the first occurrence of the regular expression \e rx, starting at
- position \e index and searching backwards.
-
- The search will start from the end of the string if \e index is negative.
-
- Returns the position of the next match (backwards), or -1 if \e rx was not
- found.
-*/
-
-int QCString::findRev( const QRegExp &rx, int index ) const
-{
- QString d = QString::fromLatin1( data() );
- return d.findRev( rx, index );
-}
-
-/*!
- Counts the number of overlapping occurrences of \e rx in the string.
-
- Example:
- \code
- QString s = "banana and panama";
- QRegExp r = QRegExp("a[nm]a", TRUE, FALSE);
- s.contains( r ); // 4 matches
- \endcode
-
- \sa find(), findRev()
-*/
-
-int QCString::contains( const QRegExp &rx ) const
-{
- QString d = QString::fromLatin1( data() );
- return d.contains( rx );
-}
-
-
-/*!
- Replaces every occurrence of \e rx in the string with \e str.
- Returns a reference to the string.
-
- Example:
- \code
- QString s = "banana";
- s.replace( QRegExp("a.*a"), "" ); // becomes "b"
-
- QString s = "banana";
- s.replace( QRegExp("^[bn]a"), " " ); // becomes " nana"
-
- QString s = "banana";
- s.replace( QRegExp("^[bn]a"), "" ); // NOTE! becomes ""
- \endcode
-
-*/
-
-QCString &QCString::replace( const QRegExp &rx, const char *str )
-{
- QString d = QString::fromLatin1( data() );
- QString r = QString::fromLatin1( str );
- d.replace( rx, r );
- setStr( d.ascii() );
- return *this;
-}
-
-/*!
- Returns the string converted to a <code>long</code> value.
-
- If \e ok is non-null, \e *ok is set to TRUE if there are no
- conceivable errors, and FALSE if the string is not a number at all, or if
- it has trailing garbage.
-*/
-
-long QCString::toLong( bool *ok ) const
-{
- char *p = data();
- long val=0;
- const long max_mult = 214748364;
- bool is_ok = FALSE;
- int neg = 0;
- if ( !p )
- goto bye;
- while ( isspace((uchar)*p) ) // skip leading space
- p++;
- if ( *p == '-' ) {
- p++;
- neg = 1;
- } else if ( *p == '+' ) {
- p++;
- }
- if ( !isdigit((uchar)*p) )
- goto bye;
- while ( isdigit((uchar)*p) ) {
- if ( val > max_mult || (val == max_mult && (*p-'0') > 7+neg) )
- goto bye;
- val = 10*val + (*p++ - '0');
- }
- if ( neg )
- val = -val;
- while ( isspace((uchar)*p) ) // skip trailing space
- p++;
- if ( *p == '\0' )
- is_ok = TRUE;
-bye:
- if ( ok )
- *ok = is_ok;
- return is_ok ? val : 0;
-}
-
-/*!
- Returns the string converted to an <code>unsigned long</code>
- value.
-
- If \e ok is non-null, \e *ok is set to TRUE if there are no
- conceivable errors, and FALSE if the string is not a number at all,
- or if it has trailing garbage.
-*/
-
-ulong QCString::toULong( bool *ok ) const
-{
- char *p = data();
- ulong val=0;
- const ulong max_mult = 429496729;
- bool is_ok = FALSE;
- if ( !p )
- goto bye;
- while ( isspace((uchar)*p) ) // skip leading space
- p++;
- if ( *p == '+' )
- p++;
- if ( !isdigit((uchar)*p) )
- goto bye;
- while ( isdigit((uchar)*p) ) {
- if ( val > max_mult || (val == max_mult && (*p-'0') > 5) )
- goto bye;
- val = 10*val + (*p++ - '0');
- }
- while ( isspace((uchar)*p) ) // skip trailing space
- p++;
- if ( *p == '\0' )
- is_ok = TRUE;
-bye:
- if ( ok )
- *ok = is_ok;
- return is_ok ? val : 0;
-}
-
-/*!
- Returns the string converted to a <code>short</code> value.
-
- If \e ok is non-null, \e *ok is set to TRUE if there are no
- conceivable errors, and FALSE if the string is not a number at all, or if
- it has trailing garbage.
-*/
-
-short QCString::toShort( bool *ok ) const
-{
- long v = toLong( ok );
- if ( ok && *ok && (v < -32768 || v > 32767) )
- *ok = FALSE;
- return (short)v;
-}
-
-/*!
- Returns the string converted to an <code>unsigned short</code> value.
-
- If \e ok is non-null, \e *ok is set to TRUE if there are no
- conceivable errors, and FALSE if the string is not a number at all, or if
- it has trailing garbage.
-*/
-
-ushort QCString::toUShort( bool *ok ) const
-{
- ulong v = toULong( ok );
- if ( ok && *ok && (v > 65535) )
- *ok = FALSE;
- return (ushort)v;
-}
-
-
-/*!
- Returns the string converted to a <code>int</code> value.
-
- If \e ok is non-null, \e *ok is set to TRUE if there are no
- conceivable errors, and FALSE if the string is not a number at all,
- or if it has trailing garbage.
-*/
-
-int QCString::toInt( bool *ok ) const
-{
- return (int)toLong( ok );
-}
-
-/*!
- Returns the string converted to an <code>unsigned int</code> value.
-
- If \e ok is non-null, \e *ok is set to TRUE if there are no
- conceivable errors, and FALSE if the string is not a number at all,
- or if it has trailing garbage.
-*/
-
-uint QCString::toUInt( bool *ok ) const
-{
- return (uint)toULong( ok );
-}
-
-/*!
- Returns the string converted to a <code>double</code> value.
-
- If \e ok is non-null, \e *ok is set to TRUE if there are no conceivable
- errors, and FALSE if the string is not a number at all, or if it has
- trailing garbage.
-*/
-
-double QCString::toDouble( bool *ok ) const
-{
- char *end;
- double val = strtod( data() ? data() : "", &end );
- if ( ok )
- *ok = ( data() && *data() && ( end == 0 || *end == '\0' ) );
- return val;
-}
-
-/*!
- Returns the string converted to a <code>float</code> value.
-
- If \e ok is non-null, \e *ok is set to TRUE if there are no
- conceivable errors, and FALSE if the string is not a number at all,
- or if it has trailing garbage.
-*/
-
-float QCString::toFloat( bool *ok ) const
-{
- return (float)toDouble( ok );
-}
-
-
-/*!
- Makes a deep copy of \e str.
- Returns a reference to the string.
-*/
-
-QCString &QCString::setStr( const char *str )
-{
- detach();
- if ( str ) // valid string
- store( str, qstrlen(str)+1 );
- else // empty
- resize( 0 );
- return *this;
-}
-
-/*!
- Sets the string to the printed value of \e n and returns a
- reference to the string.
-*/
-
-QCString &QCString::setNum( long n )
-{
- detach();
- char buf[20];
- register 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 = '-';
- store( p, qstrlen(p)+1 );
- return *this;
-}
-
-/*!
- Sets the string to the printed unsigned value of \e n and
- returns a reference to the string.
-*/
-
-QCString &QCString::setNum( ulong n )
-{
- detach();
- char buf[20];
- register char *p = &buf[19];
- *p = '\0';
- do {
- *--p = ((int)(n%10)) + '0';
- n /= 10;
- } while ( n );
- store( p, qstrlen(p)+1 );
- return *this;
-}
-
-/*!
- \fn QCString &QCString::setNum( int n )
- Sets the string to the printed value of \e n and returns a reference
- to the string.
-*/
-
-/*!
- \fn QCString &QCString::setNum( uint n )
- Sets the string to the printed unsigned value of \e n and returns a
- reference to the string.
-*/
-
-/*!
- \fn QCString &QCString::setNum( short n )
- Sets the string to the printed value of \e n and returns a reference
- to the string.
-*/
-
-/*!
- \fn QCString &QCString::setNum( ushort n )
- Sets the string to the printed unsigned value of \e n and returns a
- reference to the string.
-*/
-
-/*!
- Sets the string to the printed value of \e n.
-
- \arg \e f is the format specifier: 'f', 'F', 'e', 'E', 'g', 'G' (same
- as sprintf()).
- \arg \e prec is the precision.
-
- Returns a reference to the string.
-*/
-
-QCString &QCString::setNum( double n, char f, int prec )
-{
-#if defined(CHECK_RANGE)
- if ( !(f=='f' || f=='F' || f=='e' || f=='E' || f=='g' || f=='G') )
- qWarning( "QCString::setNum: Invalid format char '%c'", f );
-#endif
- char format[20];
- register char *fs = format; // generate format string
- *fs++ = '%'; // "%.<prec>l<f>"
- if ( prec > 99 )
- prec = 99;
- *fs++ = '.';
- if ( prec >= 10 ) {
- *fs++ = prec / 10 + '0';
- *fs++ = prec % 10 + '0';
- } else {
- *fs++ = prec + '0';
- }
- *fs++ = 'l';
- *fs++ = f;
- *fs = '\0';
- return sprintf( format, n );
-}
-
-/*!
- \fn QCString &QCString::setNum( float n, char f, int prec )
- Sets the string to the printed value of \e n.
-
- \arg \e f is the format specifier: 'f', 'F', 'e', 'E', 'g', 'G' (same
- as sprintf()).
- \arg \e prec is the precision.
-
- Returns a reference to the string.
-*/
-
-
-/*!
- Sets the character at position \e index to \e c and expands the
- string if necessary, filling with spaces.
-
- Returns FALSE if this \e index was out of range and the string could
- not be expanded, otherwise TRUE.
-*/
-
-bool QCString::setExpand( uint index, char c )
-{
- detach();
- uint oldlen = length();
- if ( index >= oldlen ) {
- if ( !QByteArray::resize( index+2 ) ) // no memory
- return FALSE;
- if ( index > oldlen )
- memset( data() + oldlen, ' ', index - oldlen );
- *(data() + index+1) = '\0'; // terminate padded string
- }
- *(data() + index) = c;
- return TRUE;
-}
-
-
-/*!
- \fn QCString::operator const char *() const
- Returns the string data.
-*/
-
-
-/*!
- \fn QCString& QCString::append( const char *str )
- Appends \e str to the string and returns a reference to the string.
- Equivalent to operator+=().
- */
-
-/*!
- Appends \e str to the string and returns a reference to the string.
-*/
-
-QCString& QCString::operator+=( const char *str )
-{
- if ( !str )
- return *this; // nothing to append
- detach();
- uint len1 = length();
- uint len2 = qstrlen(str);
- if ( !QByteArray::resize( len1 + len2 + 1 ) )
- return *this; // no memory
- memcpy( data() + len1, str, len2 + 1 );
- return *this;
-}
-
-/*!
- Appends \e c to the string and returns a reference to the string.
-*/
-
-QCString &QCString::operator+=( char c )
-{
- detach();
- uint len = length();
- if ( !QByteArray::resize( len + 2 ) )
- return *this; // no memory
- *(data() + len) = c;
- *(data() + len+1) = '\0';
- return *this;
-}
-
-
-/*****************************************************************************
- QCString stream functions
- *****************************************************************************/
-#ifndef QT_NO_DATASTREAM
-/*!
- \relates QCString
- Writes a string to the stream.
-
- \sa \link datastreamformat.html Format of the QDataStream operators \endlink
-*/
-QDataStream &operator<<( QDataStream &s, const QCString &str )
-{
- return s.writeBytes( str.data(), str.size() );
-}
-
-/*!
- \relates QCString
- Reads a string from the stream.
-
- \sa \link datastreamformat.html Format of the QDataStream operators \endlink
-*/
-
-QDataStream &operator>>( QDataStream &s, QCString &str )
-{
- str.detach();
- Q_UINT32 len;
- s >> len; // read size of string
- if ( len == 0 || s.eof() ) { // end of file reached
- str.resize( 0 );
- return s;
- }
- if ( !str.QByteArray::resize( (uint)len )) {// resize string
-#if defined(CHECK_NULL)
- qWarning( "QDataStream: Not enough memory to read QCString" );
-#endif
- len = 0;
- }
- if ( len > 0 ) // not null array
- s.readRawBytes( str.data(), (uint)len );
- return s;
-}
-#endif //QT_NO_DATASTREAM
-
-/*****************************************************************************
- Documentation for related functions
- *****************************************************************************/
-
-/*!
- \fn bool operator==( const QCString &s1, const QCString &s2 )
- \relates QCString
- Returns TRUE if the two strings are equal, or FALSE if they are different.
-
- Equivalent to <code>qstrcmp(s1,s2) == 0</code>.
-*/
-
-/*!
- \fn bool operator==( const QCString &s1, const char *s2 )
- \relates QCString
- Returns TRUE if the two strings are equal, or FALSE if they are different.
-
- Equivalent to <code>qstrcmp(s1,s2) == 0</code>.
-*/
-
-/*!
- \fn bool operator==( const char *s1, const QCString &s2 )
- \relates QCString
- Returns TRUE if the two strings are equal, or FALSE if they are different.
-
- Equivalent to <code>qstrcmp(s1,s2) == 0</code>.
-*/
-
-/*!
- \fn bool operator!=( const QCString &s1, const QCString &s2 )
- \relates QCString
- Returns TRUE if the two strings are different, or FALSE if they are equal.
-
- Equivalent to <code>qstrcmp(s1,s2) != 0</code>.
-*/
-
-/*!
- \fn bool operator!=( const QCString &s1, const char *s2 )
- \relates QCString
- Returns TRUE if the two strings are different, or FALSE if they are equal.
-
- Equivalent to <code>qstrcmp(s1,s2) != 0</code>.
-*/
-
-/*!
- \fn bool operator!=( const char *s1, const QCString &s2 )
- \relates QCString
- Returns TRUE if the two strings are different, or FALSE if they are equal.
-
- Equivalent to <code>qstrcmp(s1,s2) != 0</code>.
-*/
-
-/*!
- \fn bool operator<( const QCString &s1, const char *s2 )
- \relates QCString
- Returns TRUE if \e s1 is alphabetically less than \e s2, otherwise FALSE.
-
- Equivalent to <code>qstrcmp(s1,s2) \< 0</code>.
-*/
-
-/*!
- \fn bool operator<( const char *s1, const QCString &s2 )
- \relates QCString
- Returns TRUE if \e s1 is alphabetically less than \e s2, otherwise FALSE.
-
- Equivalent to <code>qstrcmp(s1,s2) \< 0</code>.
-*/
-
-/*!
- \fn bool operator<=( const QCString &s1, const char *s2 )
- \relates QCString
- Returns TRUE if \e s1 is alphabetically less than or equal to \e s2,
- otherwise FALSE.
-
- Equivalent to <code>qstrcmp(s1,s2) \<= 0</code>.
-*/
-
-/*!
- \fn bool operator<=( const char *s1, const QCString &s2 )
- \relates QCString
- Returns TRUE if \e s1 is alphabetically less than or equal to \e s2,
- otherwise FALSE.
-
- Equivalent to <code>qstrcmp(s1,s2) \<= 0</code>.
-*/
-
-/*!
- \fn bool operator>( const QCString &s1, const char *s2 )
- \relates QCString
- Returns TRUE if \e s1 is alphabetically greater than \e s2, otherwise FALSE.
-
- Equivalent to <code>qstrcmp(s1,s2) \> 0</code>.
-*/
-
-/*!
- \fn bool operator>( const char *s1, const QCString &s2 )
- \relates QCString
- Returns TRUE if \e s1 is alphabetically greater than \e s2, otherwise FALSE.
-
- Equivalent to <code>qstrcmp(s1,s2) \> 0</code>.
-*/
-
-/*!
- \fn bool operator>=( const QCString &s1, const char *s2 )
- \relates QCString
- Returns TRUE if \e s1 is alphabetically greater than or equal to \e s2,
- otherwise FALSE.
-
- Equivalent to <code>qstrcmp(s1,s2) \>= 0</code>.
-*/
-
-/*!
- \fn bool operator>=( const char *s1, const QCString &s2 )
- \relates QCString
- Returns TRUE if \e s1 is alphabetically greater than or equal to \e s2,
- otherwise FALSE.
-
- Equivalent to <code>qstrcmp(s1,s2) \>= 0</code>.
-*/
-
-/*!
- \fn QCString operator+( const QCString &s1, const QCString &s2 )
- \relates QCString
- Returns the concatenated string of s1 and s2.
-*/
-
-/*!
- \fn QCString operator+( const QCString &s1, const char *s2 )
- \relates QCString
- Returns the concatenated string of s1 and s2.
-*/
-
-/*!
- \fn QCString operator+( const char *s1, const QCString &s2 )
- \relates QCString
- Returns the concatenated string of s1 and s2.
-*/
-
-/*!
- \fn QCString operator+( const QCString &s, char c )
- \relates QCString
- Returns the concatenated string of s and c.
-*/
-
-/*!
- \fn QCString operator+( char c, const QCString &s )
- \relates QCString
- Returns the concatenated string of c and s.
-*/
diff --git a/qtools/qcstring.h b/qtools/qcstring.h
deleted file mode 100644
index e735462..0000000
--- a/qtools/qcstring.h
+++ /dev/null
@@ -1,407 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of the extended char array operations,
-** and QByteArray and QCString classes
-**
-** Created : 920609
-**
-** 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 QCSTRING_H
-#define QCSTRING_H
-
-#ifndef QT_H
-#include "qarray.h"
-#endif // QT_H
-
-#include <string.h>
-
-#if defined(_OS_SUN_) && defined(_CC_GNU_)
-#include <strings.h>
-#endif
-
-//#undef SMALLSTRING
-#define SMALLSTRING
-
-/*****************************************************************************
- 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
-
-Q_EXPORT char *qstrdup( const char * );
-
-Q_EXPORT inline uint cstrlen( const char *str )
-{ return strlen(str); }
-
-Q_EXPORT inline uint qstrlen( const char *str )
-{ return str ? strlen(str) : 0; }
-
-Q_EXPORT inline char *cstrcpy( char *dst, const char *src )
-{ return strcpy(dst,src); }
-
-Q_EXPORT inline char *qstrcpy( char *dst, const char *src )
-{ return src ? strcpy(dst, src) : 0; }
-
-Q_EXPORT char *qstrncpy( char *dst, const char *src, uint len );
-
-Q_EXPORT inline int cstrcmp( const char *str1, const char *str2 )
-{ return strcmp(str1,str2); }
-
-Q_EXPORT inline int qstrcmp( const char *str1, const char *str2 )
-{ return (str1 && str2) ? strcmp(str1,str2) : (int)((long)str2 - (long)str1); }
-
-Q_EXPORT 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 )
-{ return (str1 && str2) ? strncmp(str1,str2,len) :
- (int)((long)str2 - (long)str1); }
-
-Q_EXPORT int qstricmp( const char *, const char * );
-
-Q_EXPORT int qstrnicmp( const char *, const char *, uint len );
-
-// ### TODO for 3.0: these and the cstr* functions should be used if
-// !defined(QT_CLEAN_NAMESPACE)
-// We want to keep source compatibility for 2.x
-// ### TODO for 4.0: completely remove these and the cstr* functions
-
-#if !defined(QT_GENUINE_STR)
-
-#undef strlen
-#define strlen qstrlen
-
-#undef strcpy
-#define strcpy qstrcpy
-
-#undef strcmp
-#define strcmp qstrcmp
-
-#undef strncmp
-#define strncmp qstrncmp
-
-#undef stricmp
-#define stricmp qstricmp
-
-#undef strnicmp
-#define strnicmp qstrnicmp
-
-#endif
-
-
-// qChecksum: Internet checksum
-
-Q_EXPORT Q_UINT16 qChecksum( const char *s, uint len );
-
-/*****************************************************************************
- QByteArray class
- *****************************************************************************/
-
-#if defined(Q_TEMPLATEDLL)
-template class Q_EXPORT QArray<char>;
-#endif
-typedef QArray<char> QByteArray;
-
-
-/*****************************************************************************
- QByteArray stream functions
- *****************************************************************************/
-#ifndef QT_NO_DATASTREAM
-Q_EXPORT QDataStream &operator<<( QDataStream &, const QByteArray & );
-Q_EXPORT QDataStream &operator>>( QDataStream &, QByteArray & );
-#endif
-
-
-
-#ifdef SMALLSTRING
-#define SCString QCString
-#include "scstring.h"
-#else
-
-/*****************************************************************************
- QCString class
- *****************************************************************************/
-
-class QRegExp;
-
-class Q_EXPORT QCString : public QByteArray // C string class
-{
-public:
- QCString() {} // make null string
- QCString( int size ); // allocate size incl. \0
- QCString( const QCString &s ) : QByteArray( s ) {}
- QCString( const char *str ); // deep copy
- QCString( const char *str, uint maxlen ); // deep copy, max length
-
- QCString &operator=( const QCString &s );// shallow copy
- QCString &operator=( const char *str ); // deep copy
-
- bool isNull() const;
- bool isEmpty() const;
- uint length() const;
- bool resize( uint newlen );
- bool truncate( uint pos );
- bool fill( char c, int len = -1 );
-
- QCString copy() const;
-
- 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 QRegExp &, 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 &, 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 & ) const;
-
- QCString left( uint len ) const;
- QCString right( uint len ) const;
- QCString mid( uint index, uint len=0xffffffff) const;
-
- QCString leftJustify( uint width, char fill=' ', bool trunc=FALSE)const;
- QCString rightJustify( uint width, char fill=' ',bool trunc=FALSE)const;
-
- QCString lower() const;
- QCString upper() const;
-
- QCString stripWhiteSpace() const;
- QCString simplifyWhiteSpace() const;
-
- QCString &insert( uint index, const char * );
- QCString &insert( uint index, char );
- QCString &append( const char * );
- QCString &prepend( const char * );
- QCString &remove( uint index, uint len );
- QCString &replace( uint index, uint len, const char * );
- QCString &replace( const QRegExp &, const char * );
-
- short toShort( bool *ok=0 ) const;
- ushort toUShort( bool *ok=0 ) const;
- int toInt( bool *ok=0 ) const;
- uint toUInt( bool *ok=0 ) const;
- long toLong( bool *ok=0 ) const;
- ulong toULong( bool *ok=0 ) const;
- float toFloat( bool *ok=0 ) const;
- double toDouble( bool *ok=0 ) const;
-
- QCString &setStr( const char *s );
- QCString &setNum( short );
- QCString &setNum( ushort );
- QCString &setNum( int );
- QCString &setNum( uint );
- QCString &setNum( long );
- QCString &setNum( ulong );
- QCString &setNum( float, char f='g', int prec=6 );
- QCString &setNum( double, char f='g', int prec=6 );
-
- bool setExpand( uint index, char c );
-
- operator const char *() const;
- QCString &operator+=( const char *str );
- QCString &operator+=( char c );
-};
-
-#endif
-
-/*****************************************************************************
- QCString stream functions
- *****************************************************************************/
-#ifndef QT_NO_DATASTREAM
-Q_EXPORT QDataStream &operator<<( QDataStream &, const QCString & );
-Q_EXPORT QDataStream &operator>>( QDataStream &, QCString & );
-#endif
-
-/*****************************************************************************
- QCString inline functions
- *****************************************************************************/
-
-inline QCString &QCString::operator=( const QCString &s )
-{ return (QCString&)assign( s ); }
-
-inline QCString &QCString::operator=( const char *str )
-{ return (QCString&)duplicate( str, qstrlen(str)+1 ); }
-
-inline bool QCString::isNull() const
-{ return data() == 0; }
-
-inline bool QCString::isEmpty() const
-{ return data() == 0 || *data() == '\0'; }
-
-inline uint QCString::length() const
-{ return qstrlen( data() ); }
-
-inline bool QCString::truncate( uint pos )
-{ return resize(pos+1); }
-
-inline QCString QCString::copy() const
-{ return QCString( data() ); }
-
-inline QCString &QCString::prepend( const char *s )
-{ return insert(0,s); }
-
-inline QCString &QCString::append( const char *s )
-{ return operator+=(s); }
-
-inline QCString &QCString::setNum( short n )
-{ return setNum((long)n); }
-
-inline QCString &QCString::setNum( ushort n )
-{ return setNum((ulong)n); }
-
-inline QCString &QCString::setNum( int n )
-{ return setNum((long)n); }
-
-inline QCString &QCString::setNum( uint n )
-{ return setNum((ulong)n); }
-
-inline QCString &QCString::setNum( float n, char f, int prec )
-{ return setNum((double)n,f,prec); }
-
-inline QCString::operator const char *() const
-{ return (const char *)data(); }
-
-
-/*****************************************************************************
- QCString non-member operators
- *****************************************************************************/
-
-Q_EXPORT 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 )
-{ return qstrcmp(s1.data(),s2) == 0; }
-
-Q_EXPORT 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 )
-{ return qstrcmp(s1.data(),s2.data()) != 0; }
-
-Q_EXPORT 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 )
-{ return qstrcmp(s1,s2.data()) != 0; }
-
-Q_EXPORT 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 )
-{ return qstrcmp(s1.data(),s2) < 0; }
-
-Q_EXPORT 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 )
-{ return qstrcmp(s1.data(),s2) <= 0; }
-
-Q_EXPORT 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 )
-{ return qstrcmp(s1.data(),s2) > 0; }
-
-Q_EXPORT 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 )
-{ return qstrcmp(s1.data(),s2) >= 0; }
-
-Q_EXPORT 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 )
-{
- QCString tmp( s1.data() );
- tmp += s2;
- return tmp;
-}
-
-Q_EXPORT inline QCString operator+( const QCString &s1, const char *s2 )
-{
- QCString tmp( s1.data() );
- tmp += s2;
- return tmp;
-}
-
-Q_EXPORT 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 )
-{
- QCString tmp( s1.data() );
- tmp += c2;
- return tmp;
-}
-
-Q_EXPORT inline QCString operator+( char c1, const QCString &s2 )
-{
- QCString tmp;
- tmp += c1;
- tmp += s2;
- return tmp;
-}
-
-#endif // QCSTRING_H
diff --git a/qtools/qdatastream.cpp b/qtools/qdatastream.cpp
deleted file mode 100644
index 7f63cbf..0000000
--- a/qtools/qdatastream.cpp
+++ /dev/null
@@ -1,951 +0,0 @@
-/****************************************************************************
-**
-**
-** Implementation of QDataStream class
-**
-** Created : 930831
-**
-** 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 "qdatastream.h"
-
-#ifndef QT_NO_DATASTREAM
-#include "qbuffer.h"
-#include <stdio.h>
-#include <ctype.h>
-#include <stdlib.h>
-
-// REVISED: warwick
-/*!
- \class QDataStream qdatastream.h
-
- \brief The QDataStream class provides serialization of
- binary data to a QIODevice.
-
- \ingroup io
-
- A data stream is a binary stream of encoded information which is 100%
- independent of the host computer operation system, CPU or byte order. A
- stream that is written by a PC under DOS/Windows can be read by a
- Sun SPARC running Solaris.
-
- The QDataStream class implements serialization of primitive types, like
- \c char, \c short, \c int, \c char* etc. Serialization of more complex
- data is accomplished by breaking up the data into primitive units.
-
- The programmer can select which byte order to use when serializing data.
- The default setting is big endian (MSB first). Changing it to little
- endian breaks the portability (unless the reader also changes to little
- endian). We recommend keeping this setting unless you have
- special requirements.
-
- A data stream cooperates closely with a QIODevice. A QIODevice
- represents an input/output medium one can read data from and write data
- to. The QFile class is an example of an IO device.
-
- Example (write data to a stream):
- \code
- QFile f( "file.dta" );
- f.open( IO_WriteOnly ); // open file for writing
- QDataStream s( &f ); // serialize using f
- s << "the answer is"; // serialize string
- s << (Q_INT32)42; // serialize integer
- \endcode
-
- Example (read data from a stream):
- \code
- QFile f( "file.dta" );
- f.open( IO_ReadOnly ); // open file for reading
- QDataStream s( &f ); // serialize using f
- char *str;
- Q_INT32 a;
- s >> str >> a; // "the answer is" and 42
- delete str; // delete string
- \endcode
-
- In the last example, if you read into a QString instead of a \c char*
- you do not have to delete it.
-
- Normally, each item written to the stream is written in a fixed binary
- format.
- For example, a \c char* is written as a 32-bit integer equal to the
- length of the string including the NUL byte, followed by all the
- characters of the string including the NUL byte. Similarly when
- reading a string, 4 bytes are read to create the 32-bit length value,
- then that many characters for the string including the NUL. For a complete
- description of all Qt types supporting data streaming see \link
- datastreamformat.html Format of the QDataStream operators \endlink .
-
- If you want a "parsing" input stream, see QTextStream. If you just want the
- data to be human-readable to aid in debugging, you can set the data
- stream into printable data mode with setPrintableData(). The data is
- then written slower, in a human readable bloated form that is sufficient
- for debugging.
-
- If you are producing a new binary data format, such as a file format
- for documents created by your application, you could use a QDataStream
- to write the data in a portable format. Typically, you would write
- a brief header containing a magic string and a version number to give
- yourself room for future expansion. For example:
-
- \code
- // Open the file.
- QFile f( "file.xxx" );
- f.open( IO_WriteOnly );
- QDataStream s( &f );
-
- // Write a header with a "magic number" and a version
- s << 0xa0b0c0d0;
- s << 123;
-
- // Write the data
- s << [lots of interesting data]
- \endcode
-
- Then read it in with:
-
- \code
- // Open the file.
- QFile f( "file.xxx" );
- f.open( IO_ReadOnly );
- QDataStream s( &f );
-
- // Read and check the header
- Q_UINT32 magic;
- s >> magic;
- if ( magic != 0xa0b0c0d0 )
- return XXX_BAD_FILE_FORMAT;
-
- // Read the version
- Q_INT32 version;
- s >> version;
- if ( version < 100 )
- return XXX_BAD_FILE_TOO_OLD;
- if ( version > 123 )
- return XXX_BAD_FILE_TOO_NEW;
- if ( version <= 110 )
- s.setVersion(1);
-
- // Read the data
- s >> [lots of interesting data];
- if ( version > 120 )
- s >> [data new in XXX version 1.2];
- s >> [other interesting data];
- \endcode
-
- \sa QTextStream QVariant
-*/
-
-
-/*****************************************************************************
- QDataStream member functions
- *****************************************************************************/
-
-#if defined(CHECK_STATE)
-#undef CHECK_STREAM_PRECOND
-#define CHECK_STREAM_PRECOND if ( !dev ) { \
- qWarning( "QDataStream: No device" ); \
- return *this; }
-#else
-#define CHECK_STREAM_PRECOND
-#endif
-
-static int systemWordSize = 0;
-static bool systemBigEndian;
-
-static const int DefaultStreamVersion = 3;
-// 3 is default in Qt 2.1
-// 2 is the Qt 2.0.x format
-// 1 is the Qt 1.x format
-
-/*!
- Constructs a data stream that has no IO device.
-
- \sa setDevice()
-*/
-
-QDataStream::QDataStream()
-{
- if ( systemWordSize == 0 ) // get system features
- qSysInfo( &systemWordSize, &systemBigEndian );
- dev = 0; // no device set
- owndev = FALSE;
- byteorder = BigEndian; // default byte order
- printable = FALSE;
- ver = DefaultStreamVersion;
- noswap = systemBigEndian;
-}
-
-/*!
- Constructs a data stream that uses the IO device \a d.
-
- \sa setDevice(), device()
-*/
-
-QDataStream::QDataStream( QIODevice *d )
-{
- if ( systemWordSize == 0 ) // get system features
- qSysInfo( &systemWordSize, &systemBigEndian );
- dev = d; // set device
- owndev = FALSE;
- byteorder = BigEndian; // default byte order
- printable = FALSE;
- ver = DefaultStreamVersion;
- noswap = systemBigEndian;
-}
-
-/*!
- Constructs a data stream that operates on a byte array through an
- internal QBuffer device.
-
- Example:
- \code
- static char bindata[] = { 231, 1, 44, ... };
- QByteArray a;
- a.setRawData( bindata, sizeof(bindata) ); // a points to bindata
- QDataStream s( a, IO_ReadOnly ); // open on a's data
- s >> [something]; // read raw bindata
- a.resetRawData( bindata, sizeof(bindata) ); // finished
- \endcode
-
- The QArray::setRawData() function is not for the inexperienced.
-*/
-
-QDataStream::QDataStream( QByteArray a, int mode )
-{
- if ( systemWordSize == 0 ) // get system features
- qSysInfo( &systemWordSize, &systemBigEndian );
- dev = new QBuffer( a ); // create device
- ((QBuffer *)dev)->open( mode ); // open device
- owndev = TRUE;
- byteorder = BigEndian; // default byte order
- printable = FALSE;
- ver = DefaultStreamVersion;
- noswap = systemBigEndian;
-}
-
-/*!
- Destructs the data stream.
-
- The destructor will not affect the current IO device, unless it
- is an internal IO device processing a QByteArray passed in the constructor.
-*/
-
-QDataStream::~QDataStream()
-{
- if ( owndev )
- delete dev;
-}
-
-
-/*!
- \fn QIODevice *QDataStream::device() const
- Returns the IO device currently set.
- \sa setDevice(), unsetDevice()
-*/
-
-/*!
- void QDataStream::setDevice(QIODevice *d )
- Sets the IO device to \a d.
- \sa device(), unsetDevice()
-*/
-
-void QDataStream::setDevice(QIODevice *d )
-{
- if ( owndev ) {
- delete dev;
- owndev = FALSE;
- }
- dev = d;
-}
-
-/*!
- Unsets the IO device. This is the same as calling setDevice( 0 ).
- \sa device(), setDevice()
-*/
-
-void QDataStream::unsetDevice()
-{
- setDevice( 0 );
-}
-
-
-/*!
- \fn bool QDataStream::atEnd() const
- Returns TRUE if the IO device has reached the end position (end of
- stream or file) or if there is no IO device set.
-
- Returns FALSE if the current position of the read/write head of the IO
- device is somewhere before the end position.
-
- \sa QIODevice::atEnd()
-*/
-
-/*!\fn bool QDataStream::eof() const
-
- \obsolete
-
- Returns TRUE if the IO device has reached the end position (end of
- stream or file) or if there is no IO device set.
-
- Returns FALSE if the current position of the read/write head of the IO
- device is somewhere before the end position.
-
- \sa QIODevice::atEnd()
-*/
-
-/*!
- \fn int QDataStream::byteOrder() const
- Returns the current byte order setting - either \c BigEndian or
- \c LittleEndian.
-
- \sa setByteOrder()
-*/
-
-/*!
- Sets the serialization byte order to \a bo.
-
- The \a bo parameter can be \c QDataStream::BigEndian or
- \c QDataStream::LittleEndian.
-
- The default setting is big endian. We recommend leaving this setting unless
- you have special requirements.
-
- \sa byteOrder()
-*/
-
-void QDataStream::setByteOrder( int bo )
-{
- byteorder = bo;
- if ( systemBigEndian )
- noswap = byteorder == BigEndian;
- else
- noswap = byteorder == LittleEndian;
-}
-
-
-/*!
- \fn bool QDataStream::isPrintableData() const
- Returns TRUE if the printable data flag has been set.
- \sa setPrintableData()
-*/
-
-/*!
- \fn void QDataStream::setPrintableData( bool enable )
- Sets or clears the printable data flag.
-
- If this flag is set, the write functions will generate output that
- consists of printable characters (7 bit ASCII).
-
- We recommend enabling printable data only for debugging purposes
- (it is slower and creates larger output).
-*/
-
-
-/*!
- \fn int QDataStream::version() const
- Returns the version number of the data serialization format.
- In Qt 2.1, this number is by default 3.
- \sa setVersion()
-*/
-
-/*!
- \fn void QDataStream::setVersion( int v )
- Sets the version number of the data serialization format.
-
- In order to accomodate for new functionality, the datastream
- serialization format of some Qt classes has changed in some versions of
- Qt. If you want to read data that was created by an earlier version of
- Qt, or write data that can be read by a program that was compiled with
- an earlier version of Qt, use this function to modify the serialization
- format of QDataStream.
-
- For Qt 1.x compatibility, use \a v == 1.
-
- For Qt 2.0.x compatibility, use \a v == 2 (Not required for reading in
- Qt 2.1).
-
- \sa version()
-*/
-
-/*****************************************************************************
- QDataStream read functions
- *****************************************************************************/
-
-
-static Q_INT32 read_int_ascii( QDataStream *s )
-{
- register int n = 0;
- char buf[40];
- while ( TRUE ) {
- buf[n] = s->device()->getch();
- if ( buf[n] == '\n' || n > 38 ) // $-terminator
- break;
- n++;
- }
- buf[n] = '\0';
- return atol( buf );
-}
-
-
-/*!
- \fn QDataStream &QDataStream::operator>>( Q_UINT8 &i )
- Reads an unsigned byte from the stream and returns a reference to
- the stream.
-*/
-
-/*!
- Reads a signed byte from the stream.
-*/
-
-QDataStream &QDataStream::operator>>( Q_INT8 &i )
-{
- CHECK_STREAM_PRECOND
- if ( printable ) { // printable data
- i = (Q_INT8)dev->getch();
- if ( i == '\\' ) { // read octal code
- char buf[4];
- dev->readBlock( buf, 3 );
- i = (buf[2] & 0x07)+((buf[1] & 0x07) << 3)+((buf[0] & 0x07) << 6);
- }
- } else { // data or text
- i = (Q_INT8)dev->getch();
- }
- return *this;
-}
-
-
-/*!
- \fn QDataStream &QDataStream::operator>>( Q_UINT16 &i )
- Reads an unsigned 16-bit integer from the stream and returns a reference to
- the stream.
-*/
-
-/*!
- Reads a signed 16-bit integer from the stream and returns a reference to
- the stream.
-*/
-
-QDataStream &QDataStream::operator>>( Q_INT16 &i )
-{
- CHECK_STREAM_PRECOND
- if ( printable ) { // printable data
- i = (Q_INT16)read_int_ascii( this );
- } else if ( noswap ) { // no conversion needed
- dev->readBlock( (char *)&i, sizeof(Q_INT16) );
- } else { // swap bytes
- register uchar *p = (uchar *)(&i);
- char b[2];
- dev->readBlock( b, 2 );
- *p++ = b[1];
- *p = b[0];
- }
- return *this;
-}
-
-
-/*!
- \fn QDataStream &QDataStream::operator>>( Q_UINT32 &i )
- Reads an unsigned 32-bit integer from the stream and returns a reference to
- the stream.
-*/
-
-/*!
- Reads a signed 32-bit integer from the stream and returns a reference to
- the stream.
-*/
-
-QDataStream &QDataStream::operator>>( Q_INT32 &i )
-{
- CHECK_STREAM_PRECOND
- if ( printable ) { // printable data
- i = read_int_ascii( this );
- } else if ( noswap ) { // no conversion needed
- dev->readBlock( (char *)&i, sizeof(Q_INT32) );
- } else { // swap bytes
- register uchar *p = (uchar *)(&i);
- char b[4];
- dev->readBlock( b, 4 );
- *p++ = b[3];
- *p++ = b[2];
- *p++ = b[1];
- *p = b[0];
- }
- return *this;
-}
-
-/*!
- \fn QDataStream &QDataStream::operator>>( Q_UINT64 &i )
- Reads an unsigned 64-bit integer from the stream and returns a reference to
- the stream, or uses the Q_UINT32 operator if 64 bit is not available.
-*/
-
-/*!
- Reads a signed 64-bit integer from the stream and returns a reference to
- the stream, or uses the Q_UINT32 operator if 64 bit is not available.
-*/
-
-QDataStream &QDataStream::operator>>( Q_INT64 &i )
-{
- CHECK_STREAM_PRECOND
- if ( printable ) { // printable data
- i = read_int_ascii( this );
- } else if ( noswap ) { // no conversion needed
- dev->readBlock( (char *)&i, sizeof(Q_INT64) );
- } else { // swap bytes
- register uchar *p = (uchar *)(&i);
- char b[sizeof(Q_INT64)];
- dev->readBlock( b, sizeof(Q_INT64) );
- if ( sizeof(Q_INT64) == 8 ) {
- *p++ = b[7];
- *p++ = b[6];
- *p++ = b[5];
- *p++ = b[4];
- }
- *p++ = b[3];
- *p++ = b[2];
- *p++ = b[1];
- *p = b[0];
- }
- return *this;
-}
-
-static double read_double_ascii( QDataStream *s )
-{
- register int n = 0;
- char buf[80];
- while ( TRUE ) {
- buf[n] = s->device()->getch();
- if ( buf[n] == '\n' || n > 78 ) // $-terminator
- break;
- n++;
- }
- buf[n] = '\0';
- return atof( buf );
-}
-
-
-/*!
- Reads a 32-bit floating point number from the stream using the standard
- IEEE754 format. Returns a reference to the stream.
-*/
-
-QDataStream &QDataStream::operator>>( float &f )
-{
- CHECK_STREAM_PRECOND
- if ( printable ) { // printable data
- f = (float)read_double_ascii( this );
- } else if ( noswap ) { // no conversion needed
- dev->readBlock( (char *)&f, sizeof(float) );
- } else { // swap bytes
- register uchar *p = (uchar *)(&f);
- char b[4];
- dev->readBlock( b, 4 );
- *p++ = b[3];
- *p++ = b[2];
- *p++ = b[1];
- *p = b[0];
- }
- return *this;
-}
-
-
-/*!
- Reads a 64-bit floating point number from the stream using the standard
- IEEE754 format. Returns a reference to the stream.
-*/
-
-QDataStream &QDataStream::operator>>( double &f )
-{
- CHECK_STREAM_PRECOND
- if ( printable ) { // printable data
- f = read_double_ascii( this );
- } else if ( noswap ) { // no conversion needed
- dev->readBlock( (char *)&f, sizeof(double) );
- } else { // swap bytes
- register uchar *p = (uchar *)(&f);
- char b[8];
- dev->readBlock( b, 8 );
- *p++ = b[7];
- *p++ = b[6];
- *p++ = b[5];
- *p++ = b[4];
- *p++ = b[3];
- *p++ = b[2];
- *p++ = b[1];
- *p = b[0];
- }
- return *this;
-}
-
-
-/*!
- Reads the '\0'-terminated string \a s from the stream and returns
- a reference to the stream.
-
- Space for the string is allocated using \c new - the caller must
- eventually call delete[] on the value.
-*/
-
-QDataStream &QDataStream::operator>>( char *&s )
-{
- uint len = 0;
- return readBytes( s, len );
-}
-
-
-/*!
- Reads the buffer \a s from the stream and returns a reference to the
- stream.
-
- The buffer \a s is allocated using \c new. Destroy it with the \c delete[]
- operator. If the length is zero or \a s cannot be allocated, \a s is
- set to 0.
-
- The \a l parameter will be set to the length of the buffer.
-
- The serialization format is an Q_UINT32 length specifier first, then the
- data (\a l bytes).
-
- \sa readRawBytes(), writeBytes()
-*/
-
-QDataStream &QDataStream::readBytes( char *&s, uint &l )
-{
- CHECK_STREAM_PRECOND
- Q_UINT32 len;
- *this >> len; // first read length spec
- l = (uint)len;
- if ( len == 0 || eof() ) {
- s = 0;
- return *this;
- } else {
- s = new char[len]; // create char array
- CHECK_PTR( s );
- if ( !s ) // no memory
- return *this;
- return readRawBytes( s, (uint)len );
- }
-}
-
-
-/*!
- Reads \a len bytes from the stream into \a s and returns a reference to
- the stream.
-
- The buffer \a s must be preallocated.
-
- \sa readBytes(), QIODevice::readBlock(), writeRawBytes()
-*/
-
-QDataStream &QDataStream::readRawBytes( char *s, uint len )
-{
- CHECK_STREAM_PRECOND
- if ( printable ) { // printable data
- register Q_INT8 *p = (Q_INT8*)s;
- while ( len-- )
- *this >> *p++;
- } else { // read data char array
- dev->readBlock( s, len );
- }
- return *this;
-}
-
-
-/*****************************************************************************
- QDataStream write functions
- *****************************************************************************/
-
-
-/*!
- \fn QDataStream &QDataStream::operator<<( Q_UINT8 i )
- Writes an unsigned byte to the stream and returns a reference to
- the stream.
-*/
-
-/*!
- Writes a signed byte to the stream.
-*/
-
-QDataStream &QDataStream::operator<<( Q_INT8 i )
-{
- CHECK_STREAM_PRECOND
- if ( printable && (i == '\\' || !isprint(i)) ) {
- char buf[6]; // write octal code
- buf[0] = '\\';
- buf[1] = '0' + ((i >> 6) & 0x07);
- buf[2] = '0' + ((i >> 3) & 0x07);
- buf[3] = '0' + (i & 0x07);
- buf[4] = '\0';
- dev->writeBlock( buf, 4 );
- } else {
- dev->putch( i );
- }
- return *this;
-}
-
-
-/*!
- \fn QDataStream &QDataStream::operator<<( Q_UINT16 i )
- Writes an unsigned 16-bit integer to the stream and returns a reference
- to the stream.
-*/
-
-/*!
- Writes a signed 16-bit integer to the stream and returns a reference to
- the stream.
-*/
-
-QDataStream &QDataStream::operator<<( Q_INT16 i )
-{
- CHECK_STREAM_PRECOND
- if ( printable ) { // printable data
- char buf[16];
- sprintf( buf, "%d\n", i );
- dev->writeBlock( buf, strlen(buf) );
- } else if ( noswap ) { // no conversion needed
- dev->writeBlock( (char *)&i, sizeof(Q_INT16) );
- } else { // swap bytes
- register uchar *p = (uchar *)(&i);
- char b[2];
- b[1] = *p++;
- b[0] = *p;
- dev->writeBlock( b, 2 );
- }
- return *this;
-}
-
-
-/*!
- \fn QDataStream &QDataStream::operator<<( Q_UINT32 i )
- Writes an unsigned 32-bit integer to the stream and returns a reference to
- the stream.
-*/
-
-/*!
- Writes a signed 32-bit integer to the stream and returns a reference to
- the stream.
-*/
-
-QDataStream &QDataStream::operator<<( Q_INT32 i )
-{
- CHECK_STREAM_PRECOND
- if ( printable ) { // printable data
- char buf[16];
- sprintf( buf, "%d\n", i );
- dev->writeBlock( buf, strlen(buf) );
- } else if ( noswap ) { // no conversion needed
- dev->writeBlock( (char *)&i, sizeof(Q_INT32) );
- } else { // swap bytes
- register uchar *p = (uchar *)(&i);
- char b[4];
- b[3] = *p++;
- b[2] = *p++;
- b[1] = *p++;
- b[0] = *p;
- dev->writeBlock( b, 4 );
- }
- return *this;
-}
-
-/*!
- \fn QDataStream &QDataStream::operator<<( Q_UINT64 i )
- Writes an unsigned 64-bit integer to the stream and returns a reference to
- the stream, or uses the Q_UINT32-operator if 64 bit is not available.
-*/
-
-/*!
- Writes a signed 64-bit integer to the stream and returns a reference to
- the stream, or calls the Q_INT32-operator if 64 bit is not available.
-*/
-
-QDataStream &QDataStream::operator<<( Q_INT64 i )
-{
- CHECK_STREAM_PRECOND
- if ( printable ) { // printable data
- char buf[20];
- sprintf( buf, "%ld\n", i );
- dev->writeBlock( buf, strlen(buf) );
- } else if ( noswap ) { // no conversion needed
- dev->writeBlock( (char *)&i, sizeof(Q_INT64) );
- } else { // swap bytes
- register uchar *p = (uchar *)(&i);
- char b[sizeof(Q_INT64)];
- if ( sizeof(Q_INT64) == 8 ) {
- b[7] = *p++;
- b[6] = *p++;
- b[5] = *p++;
- b[4] = *p++;
- }
- b[3] = *p++;
- b[2] = *p++;
- b[1] = *p++;
- b[0] = *p;
- dev->writeBlock( b, sizeof(Q_INT64) );
- }
- return *this;
-}
-
-/*!
- \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.
-*/
-
-
-/*!
- Writes a 32-bit floating point number to the stream using the standard
- IEEE754 format. Returns a reference to the stream.
-*/
-
-QDataStream &QDataStream::operator<<( float f )
-{
- CHECK_STREAM_PRECOND
- if ( printable ) { // printable data
- char buf[32];
- sprintf( buf, "%g\n", (double)f );
- dev->writeBlock( buf, strlen(buf) );
- } else {
- float g = f; // fixes float-on-stack problem
- if ( noswap ) { // no conversion needed
- dev->writeBlock( (char *)&g, sizeof(float) );
- } else { // swap bytes
- register uchar *p = (uchar *)(&g);
- char b[4];
- b[3] = *p++;
- b[2] = *p++;
- b[1] = *p++;
- b[0] = *p;
- dev->writeBlock( b, 4 );
- }
- }
- return *this;
-}
-
-
-/*!
- Writes a 64-bit floating point number to the stream using the standard
- IEEE754 format. Returns a reference to the stream.
-*/
-
-QDataStream &QDataStream::operator<<( double f )
-{
- CHECK_STREAM_PRECOND
- if ( printable ) { // printable data
- char buf[32];
- sprintf( buf, "%g\n", f );
- dev->writeBlock( buf, strlen(buf) );
- } else if ( noswap ) { // no conversion needed
- dev->writeBlock( (char *)&f, sizeof(double) );
- } else { // swap bytes
- register uchar *p = (uchar *)(&f);
- char b[8];
- b[7] = *p++;
- b[6] = *p++;
- b[5] = *p++;
- b[4] = *p++;
- b[3] = *p++;
- b[2] = *p++;
- b[1] = *p++;
- b[0] = *p;
- dev->writeBlock( b, 8 );
- }
- return *this;
-}
-
-
-/*!
- Writes the '\0'-terminated string \a s to the stream and returns
- a reference to the stream.
-
- The string is serialized using writeBytes().
-*/
-
-QDataStream &QDataStream::operator<<( const char *s )
-{
- if ( !s ) {
- *this << (Q_UINT32)0;
- return *this;
- }
- uint len = qstrlen( s ) + 1; // also write null terminator
- *this << (Q_UINT32)len; // write length specifier
- return writeRawBytes( s, len );
-}
-
-
-/*!
- Writes the length specifier \a len and the buffer \a s to the stream and
- returns a reference to the stream.
-
- The \a len is serialized as an Q_UINT32, followed by \a len bytes from
- \a s.
-
- \sa writeRawBytes(), readBytes()
-*/
-
-QDataStream &QDataStream::writeBytes(const char *s, uint len)
-{
- CHECK_STREAM_PRECOND
- *this << (Q_UINT32)len; // write length specifier
- if ( len )
- writeRawBytes( s, len );
- return *this;
-}
-
-
-/*!
- Writes \a len bytes from \a s to the stream and returns a reference to the
- stream.
-
- \sa writeBytes(), QIODevice::writeBlock(), readRawBytes()
-*/
-
-QDataStream &QDataStream::writeRawBytes( const char *s, uint len )
-{
- CHECK_STREAM_PRECOND
- if ( printable ) { // write printable
- register char *p = (char *)s;
- while ( len-- )
- *this << *p++;
- } else { // write data char array
- dev->writeBlock( s, len );
- }
- return *this;
-}
-
-#endif // QT_NO_DATASTREAM
diff --git a/qtools/qdatastream.h b/qtools/qdatastream.h
deleted file mode 100644
index 3d18062..0000000
--- a/qtools/qdatastream.h
+++ /dev/null
@@ -1,173 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QDataStream class
-**
-** Created : 930831
-**
-** 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 QDATASTREAM_H
-#define QDATASTREAM_H
-
-#ifndef QT_H
-#include "qiodevice.h"
-#include "qstring.h"
-#endif // QT_H
-
-#ifndef QT_NO_DATASTREAM
-class Q_EXPORT QDataStream // data stream class
-{
-public:
- QDataStream();
- QDataStream( QIODevice * );
- QDataStream( QByteArray, int mode );
- virtual ~QDataStream();
-
- QIODevice *device() const;
- void setDevice( QIODevice * );
- void unsetDevice();
-
- bool atEnd() const;
- bool eof() const;
-
- enum ByteOrder { BigEndian, LittleEndian };
- int byteOrder() const;
- void setByteOrder( int );
-
- bool isPrintableData() const;
- void setPrintableData( bool );
-
- int version() const;
- void setVersion( int );
-
- QDataStream &operator>>( Q_INT8 &i );
- QDataStream &operator>>( Q_UINT8 &i );
- QDataStream &operator>>( Q_INT16 &i );
- QDataStream &operator>>( Q_UINT16 &i );
- QDataStream &operator>>( Q_INT32 &i );
- QDataStream &operator>>( Q_UINT32 &i );
- QDataStream &operator>>( Q_INT64 &i );
- QDataStream &operator>>( Q_UINT64 &i );
-
- QDataStream &operator>>( float &f );
- QDataStream &operator>>( double &f );
- QDataStream &operator>>( char *&str );
-
- QDataStream &operator<<( Q_INT8 i );
- QDataStream &operator<<( Q_UINT8 i );
- QDataStream &operator<<( Q_INT16 i );
- QDataStream &operator<<( Q_UINT16 i );
- QDataStream &operator<<( Q_INT32 i );
- QDataStream &operator<<( Q_UINT32 i );
- QDataStream &operator<<( Q_INT64 i );
- QDataStream &operator<<( Q_UINT64 i );
- QDataStream &operator<<( float f );
- QDataStream &operator<<( double f );
- QDataStream &operator<<( const char *str );
-
- QDataStream &readBytes( char *&, uint &len );
- QDataStream &readRawBytes( char *, uint len );
-
- QDataStream &writeBytes( const char *, uint len );
- QDataStream &writeRawBytes( const char *, uint len );
-
-private:
- QIODevice *dev;
- bool owndev;
- int byteorder;
- bool printable;
- bool noswap;
- int ver;
-
-private: // Disabled copy constructor and operator=
-#if defined(Q_DISABLE_COPY)
- QDataStream( const QDataStream & );
- QDataStream &operator=( const QDataStream & );
-#endif
-};
-
-
-/*****************************************************************************
- QDataStream inline functions
- *****************************************************************************/
-
-inline QIODevice *QDataStream::device() const
-{ return dev; }
-
-inline bool QDataStream::atEnd() const
-{ return dev ? dev->atEnd() : TRUE; }
-
-inline bool QDataStream::eof() const
-{ return atEnd(); }
-
-inline int QDataStream::byteOrder() const
-{ return byteorder; }
-
-inline bool QDataStream::isPrintableData() const
-{ return printable; }
-
-inline void QDataStream::setPrintableData( bool p )
-{ printable = p; }
-
-inline int QDataStream::version() const
-{ return ver; }
-
-inline void QDataStream::setVersion( int v )
-{ ver = v; }
-
-inline QDataStream &QDataStream::operator>>( Q_UINT8 &i )
-{ return *this >> (Q_INT8&)i; }
-
-inline QDataStream &QDataStream::operator>>( Q_UINT16 &i )
-{ return *this >> (Q_INT16&)i; }
-
-inline QDataStream &QDataStream::operator>>( Q_UINT32 &i )
-{ return *this >> (Q_INT32&)i; }
-
-inline QDataStream &QDataStream::operator>>( Q_UINT64 &i )
-{ return *this >> (Q_INT64&)i; }
-
-inline QDataStream &QDataStream::operator<<( Q_UINT8 i )
-{ return *this << (Q_INT8)i; }
-
-inline QDataStream &QDataStream::operator<<( Q_UINT16 i )
-{ return *this << (Q_INT16)i; }
-
-inline QDataStream &QDataStream::operator<<( Q_UINT32 i )
-{ return *this << (Q_INT32)i; }
-
-inline QDataStream &QDataStream::operator<<( Q_UINT64 i )
-{ return *this << (Q_INT64)i; }
-
-
-#endif // QT_NO_DATASTREAM
-#endif // QDATASTREAM_H
diff --git a/qtools/qdatetime.cpp b/qtools/qdatetime.cpp
deleted file mode 100644
index cecb855..0000000
--- a/qtools/qdatetime.cpp
+++ /dev/null
@@ -1,1434 +0,0 @@
-/****************************************************************************
-**
-**
-** Implementation of date and time classes
-**
-** Created : 940124
-**
-** 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 gettimeofday __hide_gettimeofday
-#include "qdatetime.h"
-#include "qdatastream.h"
-#include <stdio.h>
-#include <time.h>
-#if defined(_OS_WIN32_)
-#if defined(_CC_BOOL_DEF_)
-#undef bool
-#include <windows.h>
-#define bool int
-#else
-#include <windows.h>
-#endif
-#elif defined(_OS_MSDOS_)
-#include <dos.h>
-#elif defined(_OS_OS2_)
-#include <os2.h>
-#elif defined(_OS_UNIX_)
-#include <sys/time.h>
-#include <unistd.h>
-#undef gettimeofday
-extern "C" int gettimeofday( struct timeval *, struct timezone * );
-#endif
-
-static const uint FIRST_DAY = 2361222; // Julian day for 1752/09/14
-static const int FIRST_YEAR = 1752; // ### wrong for many countries
-static const uint SECS_PER_DAY = 86400;
-static const uint MSECS_PER_DAY = 86400000;
-static const uint SECS_PER_HOUR = 3600;
-static const uint MSECS_PER_HOUR= 3600000;
-static const uint SECS_PER_MIN = 60;
-static const uint MSECS_PER_MIN = 60000;
-
-static const short monthDays[] ={0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
-
-// ##### Localize.
-
-const char * const QDate::monthNames[] = {
- "Jan", "Feb", "Mar", "Apr", "May", "Jun",
- "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" };
-
-const char * const QDate::weekdayNames[] ={
- "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" };
-
-
-/*****************************************************************************
- QDate member functions
- *****************************************************************************/
-
-// REVISED: aavit
-
-/*!
- \class QDate qdatetime.h
- \brief The QDate class provides date functions.
-
- \ingroup time
-
- A QDate object contains a calendar date, i.e. year, month, and day
- numbers in the modern western (Gregorian) calendar. It can read the
- current date from the system clock. It provides functions for
- comparing dates and for manipulating a date by adding a number of
- days.
-
- A QDate object is typically created either by giving the year, month
- and day numbers explicitly, or by using the static function
- currentDate(), which makes a QDate object which contains the
- system's clock date. An explicit date can also be set using
- setYMD().
-
- The year(), month(), and day() functions provide access to the year,
- month, and day numbers. Also, dayOfWeek() and dayOfYear() functions
- are provided. The same information is provided in textual format by
- the toString(), dayName(), and monthName() functions.
-
- QDate provides a full set of operators to compare two QDate
- objects. A date is considered smaller than another if it is earlier
- than the other.
-
- The date a given number of days later than a given date can be found
- using the addDays() function. Correspondingly, the number of days
- between two dates can be found using the daysTo() function.
-
- The daysInMonth() and daysInYear() functions tell how many days
- there are in this date's month and year, respectively. The
- isLeapYear() function tells whether this date is in a leap year.
-
- Note that QDate may not be used for date calculations for dates in
- the remote past, i.e. prior to the introduction of the Gregorian
- calendar. This calendar was adopted by England Sep. 14. 1752 (hence
- this is the earliest valid QDate), and subsequently by most other
- western countries, until 1923.
-
- The end of time is reached around 8000AD, by which time we expect Qt
- to be obsolete.
-
- \sa QTime, QDateTime
-*/
-
-
-/*!
- \fn QDate::QDate()
- Constructs a null date. Null dates are invalid.
-
- \sa isNull(), isValid()
-*/
-
-
-/*!
- Constructs a date with the year \a y, month \a m and day \a d.
-
- \a y must be in the range 1752-ca. 8000, \a m must be in the range
- 1-12, and \a d must be in the range 1-31. Exception: if \a y is in
- the range 0-99, it is interpreted as 1900-1999.
-
- \sa isValid()
-*/
-
-QDate::QDate( int y, int m, int d )
-{
- jd = 0;
- setYMD( y, m, d );
-}
-
-
-/*!
- \fn bool QDate::isNull() const
-
- Returns TRUE if the date is null. A null date is invalid.
-
- \sa isValid()
-*/
-
-
-/*!
- Returns TRUE if this date is valid.
-
- \sa isNull()
-*/
-
-bool QDate::isValid() const
-{
- return jd >= FIRST_DAY;
-}
-
-
-/*!
- Returns the year (>= 1752) of this date.
-
- \sa month(), day()
-*/
-
-int QDate::year() const
-{
- int y, m, d;
- jul2greg( jd, y, m, d );
- return y;
-}
-
-/*!
- Returns the month (January=1 .. December=12) of this date.
-
- \sa year(), day()
-*/
-
-int QDate::month() const
-{
- int y, m, d;
- jul2greg( jd, y, m, d );
- return m;
-}
-
-/*!
- Returns the day of the month (1..31) of this date.
-
- \sa year(), month(), dayOfWeek()
-*/
-
-int QDate::day() const
-{
- int y, m, d;
- jul2greg( jd, y, m, d );
- return d;
-}
-
-/*!
- Returns the weekday (Monday=1 .. Sunday=7) for this date.
-
- \sa day(), dayOfYear()
-*/
-
-int QDate::dayOfWeek() const
-{
- return (((jd+1) % 7) + 6)%7 + 1;
-}
-
-/*!
- Returns the day of the year (1..365) for this date.
-
- \sa day(), dayOfWeek()
-*/
-
-int QDate::dayOfYear() const
-{
- return jd - greg2jul(year(), 1, 1) + 1;
-}
-
-/*!
- Returns the number of days in the month (28..31) for this date.
-
- \sa day(), daysInYear()
-*/
-
-int QDate::daysInMonth() const
-{
- int y, m, d;
- jul2greg( jd, y, m, d );
- if ( m == 2 && leapYear(y) )
- return 29;
- else
- return monthDays[m];
-}
-
-/*!
- Returns the number of days in the year (365 or 366) for this date.
-
- \sa day(), daysInMonth()
-*/
-
-int QDate::daysInYear() const
-{
- int y, m, d;
- jul2greg( jd, y, m, d );
- return leapYear(y) ? 366 : 365;
-}
-
-
-/*!
- Returns the name of the \a month.
-
- Month 1 == "Jan", month 2 == "Feb" etc.
-
- \sa toString(), dayName()
-*/
-
-QString QDate::monthName( int month ) const
-{
-#if defined(CHECK_RANGE)
- if ( month < 1 || month > 12 ) {
- qWarning( "QDate::monthName: Parameter out ouf range." );
- month = 1;
- }
-#endif
- // ### Remove the fromLatin1 during localization
- return QString::fromLatin1(monthNames[month-1]);
-}
-
-/*!
- Returns the name of the \a weekday.
-
- Weekday 1 == "Mon", day 2 == "Tue" etc.
-
- \sa toString(), monthName()
-*/
-
-QString QDate::dayName( int weekday ) const
-{
-#if defined(CHECK_RANGE)
- if ( weekday < 1 || weekday > 7 ) {
- qWarning( "QDate::dayName: Parameter out of range." );
- weekday = 1;
- }
-#endif
- // ### Remove the fromLatin1 during localization
- return QString::fromLatin1(weekdayNames[weekday-1]);
-}
-
-
-/*!
- Returns the date as a string.
-
- The string format is "Sat May 20 1995". This function uses the
- dayName() and monthName() functions to generate the string.
-
- \sa dayName(), monthName()
-*/
-
-QString QDate::toString() const
-{
- int y, m, d;
- jul2greg( jd, y, m, d );
- QString buf = dayName(dayOfWeek());
- buf += ' ';
- buf += monthName(m);
- QString t;
- t.sprintf( " %d %d", d, y);
- buf += t;
- return buf;
-}
-
-
-/*!
- Sets the year \a y, month \a m and day \a d.
-
- \a y must be in the range 1752-ca. 8000, \a m must be in the range
- 1-12, and \a d must be in the range 1-31. Exception: if \a y is in
- the range 0-99, it is interpreted as 1900-1999.
-
- Returns TRUE if the date is valid, otherwise FALSE.
-*/
-
-bool QDate::setYMD( int y, int m, int d )
-{
- if ( !isValid(y,m,d) ) {
-#if defined(CHECK_RANGE)
- qWarning( "QDate::setYMD: Invalid date %04d/%02d/%02d", y, m, d );
-#endif
- return FALSE;
- }
- jd = greg2jul( y, m, d );
-#if defined(DEBUG)
- ASSERT( year() == (y > 99 ? y : 1900+y) && month() == m && day() == d );
-#endif
- return TRUE;
-}
-
-/*!
- Returns a QDate object containing a date \a ndays later than the
- date of this object (or earlier if \a ndays is negative).
-
- \sa daysTo()
-*/
-
-QDate QDate::addDays( int ndays ) const
-{
- QDate d;
- d.jd = jd + ndays;
- return d;
-}
-
-/*!
- Returns the number of days from this date to \a d (which is negative
- if \a d is earlier than this date).
-
- Example:
- \code
- QDate d1( 1995, 5, 17 ); // May 17th 1995
- QDate d2( 1995, 5, 20 ); // May 20th 1995
- d1.daysTo( d2 ); // returns 3
- d2.daysTo( d1 ); // returns -3
- \endcode
-
- \sa addDays()
-*/
-
-int QDate::daysTo( const QDate &d ) const
-{
- return d.jd - jd;
-}
-
-
-/*!
- \fn bool QDate::operator==( const QDate &d ) const
- Returns TRUE if this date is equal to \a d, or FALSE if
- they are different.
-*/
-
-/*!
- \fn bool QDate::operator!=( const QDate &d ) const
- Returns TRUE if this date is different from \a d, or FALSE if
- they are equal.
-*/
-
-/*!
- \fn bool QDate::operator<( const QDate &d ) const
- Returns TRUE if this date is earlier than \a d, otherwise FALSE.
-*/
-
-/*!
- \fn bool QDate::operator<=( const QDate &d ) const
- Returns TRUE if this date is earlier than or equal to \a d, otherwise FALSE.
-*/
-
-/*!
- \fn bool QDate::operator>( const QDate &d ) const
- Returns TRUE if this date is later than \a d, otherwise FALSE.
-*/
-
-/*!
- \fn bool QDate::operator>=( const QDate &d ) const
- Returns TRUE if this date is later than or equal to \a d, otherwise FALSE.
-*/
-
-
-/*!
- Returns the current date, as reported by the system clock.
-
- \sa QTime::currentTime(), QDateTime::currentDateTime()
-*/
-
-QDate QDate::currentDate()
-{
-#if defined(_OS_WIN32_)
-
- SYSTEMTIME t;
- GetLocalTime( &t );
- QDate d;
- d.jd = greg2jul( t.wYear, t.wMonth, t.wDay );
- return d;
-
-#else
-
- time_t ltime;
- time( &ltime );
- tm *t = localtime( &ltime );
- QDate d;
- d.jd = greg2jul( t->tm_year + 1900, t->tm_mon + 1, t->tm_mday );
- return d;
-
-#endif
-}
-
-/*!
- Returns TRUE if the specified date (year \a y, month \a m and day \a
- d) is valid.
-
- Example:
- \code
- QDate::isValid( 2002, 5, 17 ); // TRUE; May 17th 2002 is OK.
- QDate::isValid( 2002, 2, 30 ); // FALSE; Feb 30th does not exist
- QDate::isValid( 2004, 2, 29 ); // TRUE; 2004 is a leap year
- QDate::isValid( 1202, 6, 6 ); // FALSE; 1202 is pre-Gregorian
- \endcode
-
- Note that a \a y value in the range 00-99 is interpreted as
- 1900-1999.
-
- \sa isNull(), setYMD()
-*/
-
-bool QDate::isValid( int y, int m, int d )
-{
- if ( y >= 0 && y <= 99 )
- y += 1900;
- else if ( y < FIRST_YEAR || (y == FIRST_YEAR && (m < 9 ||
- (m == 9 && d < 14))) )
- return FALSE;
- return (d > 0 && m > 0 && m <= 12) &&
- (d <= monthDays[m] || (d == 29 && m == 2 && leapYear(y)));
-}
-
-/*!
- Returns TRUE if the specified year \a y is a leap year.
-*/
-
-bool QDate::leapYear( int y )
-{
- return y % 4 == 0 && y % 100 != 0 || y % 400 == 0;
-}
-
-/*!
- \internal
- Converts a Gregorian date to a Julian day.
- This algorithm is taken from Communications of the ACM, Vol 6, No 8.
- \sa jul2greg()
-*/
-
-uint QDate::greg2jul( int y, int m, int d )
-{
- uint c, ya;
- if ( y <= 99 )
- y += 1900;
- if ( m > 2 ) {
- m -= 3;
- } else {
- m += 9;
- y--;
- }
- c = y; // NOTE: Sym C++ 6.0 bug
- c /= 100;
- ya = y - 100*c;
- return 1721119 + d + (146097*c)/4 + (1461*ya)/4 + (153*m+2)/5;
-}
-
-/*!
- \internal
- Converts a Julian day to a Gregorian date.
- This algorithm is taken from Communications of the ACM, Vol 6, No 8.
- \sa greg2jul()
-*/
-
-void QDate::jul2greg( uint jd, int &y, int &m, int &d )
-{
- uint x;
- uint j = jd - 1721119;
- y = (j*4 - 1)/146097;
- j = j*4 - 146097*y - 1;
- x = j/4;
- j = (x*4 + 3) / 1461;
- y = 100*y + j;
- x = (x*4) + 3 - 1461*j;
- x = (x + 4)/4;
- m = (5*x - 3)/153;
- x = 5*x - 3 - 153*m;
- d = (x + 5)/5;
- if ( m < 10 ) {
- m += 3;
- } else {
- m -= 9;
- y++;
- }
-}
-
-
-/*****************************************************************************
- QTime member functions
- *****************************************************************************/
-
-/*!
- \class QTime qdatetime.h
-
- \brief The QTime class provides clock time functions.
-
- \ingroup time
-
- A QTime object contains a clock time, i.e. a number of hours,
- minutes, seconds and milliseconds since midnight. It can read the
- current time from the system clock, and measure a span of elapsed
- time. It provides functions for comparing times and for manipulating
- a time by adding a number of (milli)seconds.
-
- QTime operates with 24-hour clock format; it has no concept of
- AM/PM. It operates with local time; it does not know anything about
- time zones or daylight savings time.
-
- A QTime object is typically created either by giving the number of
- hours, minutes, seconds, and milliseconds explicitly, or by using
- the static function currentTime(), which makes a QTime object which
- contains the system's clock time. Note that the accuracy depends on
- the accuracy of the underlying operating system; not all systems
- provide 1-millisecond accuracy.
-
- The hour(), minute(), second(), and msec() functions provide access
- to the number of hours, minutes, seconds, and milliseconds of the
- time. The same information is provided in textual format by the
- toString() function.
-
- QTime provides a full set of operators to compare two QTime
- objects. A time is considered smaller than another if it is earlier
- than the other.
-
- The time a given number of seconds or milliseconds later than a
- given time can be found using the addSecs() or addMSecs()
- functions. Correspondingly, the number of (milli)seconds between two
- times can be found using the secsTo() or msecsTo() functions.
-
- QTime can be used to measure a span of elapsed time using the
- start(), restart(), and elapsed() functions.
-
- \sa QDate, QDateTime
-*/
-
-/*!
- \fn QTime::QTime()
-
- Constructs the time 0 hours, minutes, seconds and milliseconds,
- i.e. 00:00:00.000 (midnight). This is a valid time.
-
- \sa isValid()
-*/
-
-/*!
- Constructs a time with hour \a h, minute \a m, seconds \a s and
- milliseconds \a ms.
-
- \a h must be in the range 0-23, \a m and \a s must be in the range
- 0-59, and \a ms must be in the range 0-999.
-
- \sa isValid()
-*/
-
-QTime::QTime( int h, int m, int s, int ms )
-{
- setHMS( h, m, s, ms );
-}
-
-
-/*!
- \fn bool QTime::isNull() const
- Returns TRUE if the time is equal to 00:00:00.000. A null time is valid.
-
- \sa isValid()
-*/
-
-/*!
- Returns TRUE if the time is valid, or FALSE if the time is invalid.
- The time 23:30:55.746 is valid, while 24:12:30 is invalid.
-
- \sa isNull()
-*/
-
-bool QTime::isValid() const
-{
- return ds < MSECS_PER_DAY;
-}
-
-
-/*!
- Returns the hour part (0..23) of the time.
-*/
-
-int QTime::hour() const
-{
- return ds / MSECS_PER_HOUR;
-}
-
-/*!
- Returns the minute part (0..59) of the time.
-*/
-
-int QTime::minute() const
-{
- return (ds % MSECS_PER_HOUR)/MSECS_PER_MIN;
-}
-
-/*!
- Returns the second part (0..59) of the time.
-*/
-
-int QTime::second() const
-{
- return (ds / 1000)%SECS_PER_MIN;
-}
-
-/*!
- Returns the millisecond part (0..999) of the time.
-*/
-
-int QTime::msec() const
-{
- return ds % 1000;
-}
-
-
-/*!
- Returns the time of this object in a textual format. Milliseconds
- are not included. The string format is HH:MM:SS, e.g. 1 second
- before midnight would be "23:59:59".
-*/
-
-QString QTime::toString() const
-{
- QString buf;
- buf.sprintf( "%.2d:%.2d:%.2d", hour(), minute(), second() );
- return buf;
-}
-
-
-/*!
- Sets the time to hour \a h, minute \a m, seconds \a s and
- milliseconds \a ms.
-
- \a h must be in the range 0-23, \a m and \a s must be in the range
- 0-59, and \a ms must be in the range 0-999. Returns TRUE if the set
- time is valid, otherwise FALSE.
-
- \sa isValid()
-*/
-
-bool QTime::setHMS( int h, int m, int s, int ms )
-{
- if ( !isValid(h,m,s,ms) ) {
-#if defined(CHECK_RANGE)
- qWarning( "QTime::setHMS Invalid time %02d:%02d:%02d.%03d", h, m, s,
- ms );
-#endif
- ds = MSECS_PER_DAY; // make this invalid
- return FALSE;
- }
- ds = (h*SECS_PER_HOUR + m*SECS_PER_MIN + s)*1000 + ms;
- return TRUE;
-}
-
-/*!
- Returns a QTime object containing a time \a nsecs seconds later than
- the time of this object (or earlier if \a ms is negative).
-
- Note that the time will wrap if it passes midnight.
-
- Example:
- \code
- QTime n( 14, 0, 0 ); // n == 14:00:00
- QTime t;
- t = n.addSecs( 70 ); // t == 14:01:10
- t = n.addSecs( -70 ); // t == 13:58:50
- t = n.addSecs( 10*60*60 + 5 ); // t == 00:00:05
- t = n.addSecs( -15*60*60 ); // t == 23:00:00
- \endcode
-
- \sa addMSecs(), secsTo(), QDateTime::addSecs()
-*/
-
-QTime QTime::addSecs( int nsecs ) const
-{
- return addMSecs(nsecs*1000);
-}
-
-/*!
- Returns the number of seconds from this time to \a t (which is
- negative if \a t is earlier than this time).
-
- Since QTime measures time within a day and there are 86400 seconds
- in a day, the result is between -86400 and 86400.
-
- \sa addSecs() QDateTime::secsTo()
-*/
-
-int QTime::secsTo( const QTime &t ) const
-{
- return ((int)t.ds - (int)ds)/1000;
-}
-
-/*!
- Returns a QTime object containing a time \a ms milliseconds later than
- the time of this object (or earlier if \a ms is negative).
-
- Note that the time will wrap if it passes midnight. See addSecs()
- for an example.
-
- \sa addSecs(), msecsTo()
-*/
-
-QTime QTime::addMSecs( int ms ) const
-{
- QTime t;
- if ( ms < 0 ) {
- // % not well-defined for -ve, but / is.
- int negdays = (MSECS_PER_DAY-ms) / MSECS_PER_DAY;
- t.ds = ((int)ds + ms + negdays*MSECS_PER_DAY)
- % MSECS_PER_DAY;
- } else {
- t.ds = ((int)ds + ms) % MSECS_PER_DAY;
- }
- return t;
-}
-
-/*!
- Returns the number of milliseconds from this time to \a t (which is
- negative if \a t is earlier than this time).
-
- Since QTime measures time within a day and there are 86400000
- milliseconds in a day, the result is between -86400000 and 86400000.
-
- \sa secsTo()
-*/
-
-int QTime::msecsTo( const QTime &t ) const
-{
- return (int)t.ds - (int)ds;
-}
-
-
-/*!
- \fn bool QTime::operator==( const QTime &t ) const
-
- Returns TRUE if this time is equal to \a t, or FALSE if they are
- different.
-*/
-
-/*!
- \fn bool QTime::operator!=( const QTime &t ) const
-
- Returns TRUE if this time is different from \a t, or FALSE if they
- are equal.
-*/
-
-/*!
- \fn bool QTime::operator<( const QTime &t ) const
-
- Returns TRUE if this time is earlier than \a t, otherwise FALSE.
-*/
-
-/*!
- \fn bool QTime::operator<=( const QTime &t ) const
-
- Returns TRUE if this time is earlier than or equal to \a t,
- otherwise FALSE.
-*/
-
-/*!
- \fn bool QTime::operator>( const QTime &t ) const
-
- Returns TRUE if this time is later than \a t, otherwise FALSE.
-*/
-
-/*!
- \fn bool QTime::operator>=( const QTime &t ) const
-
- Returns TRUE if this time is later than or equal to \a t, otherwise
- FALSE.
-*/
-
-
-
-/*!
- Returns the current time, as reported by the system clock.
-
- Note that the accuracy depends on the accuracy of the underlying
- operating system; not all systems provide 1-millisecond accuracy.
-*/
-
-QTime QTime::currentTime()
-{
- QTime ct;
- currentTime( &ct );
- return ct;
-}
-
-/*!
- \internal
-
- Fetches the current time and returns TRUE if the time is within one
- minute after midnight, otherwise FALSE. The return value is used by
- QDateTime::currentDateTime() to ensure that the date there is correct.
-*/
-
-bool QTime::currentTime( QTime *ct )
-{
- if ( !ct ) {
-#if defined(CHECK_NULL)
- qWarning( "QTime::currentTime(QTime *): Null pointer not allowed" );
-#endif
- return FALSE;
- }
-
-#if defined(_OS_WIN32_)
-
- SYSTEMTIME t;
- GetLocalTime( &t );
- ct->ds = MSECS_PER_HOUR*t.wHour + MSECS_PER_MIN*t.wMinute +
- 1000*t.wSecond + t.wMilliseconds;
- return (t.wHour == 0 && t.wMinute == 0);
-
-#elif defined(_OS_OS2_)
-
- DATETIME t;
- DosGetDateTime( &t );
- ct->ds = MSECS_PER_HOUR*t.hours + MSECS_PER_MIN*t.minutes +
- 1000*t.seconds + 10*t.hundredths;
- return (t.hours == 0 && t.minutes == 0);
-
-#elif defined(_OS_MSDOS_)
-
- _dostime_t t;
- _dos_gettime( &t );
- ct->ds = MSECS_PER_HOUR*t.hour + MSECS_PER_MIN*t.minute +
- t.second*1000 + t.hsecond*10;
- return (t.hour== 0 && t.minute == 0);
-
-#elif defined(_OS_UNIX_)
-
- struct timeval tv;
- gettimeofday( &tv, 0 );
- time_t ltime = tv.tv_sec;
- tm *t = localtime( &ltime );
- ct->ds = (uint)( MSECS_PER_HOUR*t->tm_hour + MSECS_PER_MIN*t->tm_min +
- 1000*t->tm_sec + tv.tv_usec/1000 );
- return (t->tm_hour== 0 && t->tm_min == 0);
-
-#else
-
- time_t ltime; // no millisecond resolution!!
- ::time( &ltime );
- tm *t = localtime( &ltime );
- ct->ds = MSECS_PER_HOUR*t->tm_hour + MSECS_PER_MIN*t->tm_min +
- 1000*t->tm_sec;
- return (t->tm_hour== 0 && t->tm_min == 0);
-#endif
-}
-
-/*!
- Returns TRUE if the specified time is valid, otherwise FALSE.
-
- The time is valid if \a h is in the range 0-23, \a m and \a s are in
- the range 0-59, and \a ms is in the range 0-999.
-
- Example:
- \code
- QTime::isValid(21, 10, 30); // returns TRUE
- QTime::isValid(22, 5, 62); // returns FALSE
- \endcode
-*/
-
-bool QTime::isValid( int h, int m, int s, int ms )
-{
- return (uint)h < 24 && (uint)m < 60 && (uint)s < 60 && (uint)ms < 1000;
-}
-
-
-/*!
- Sets this time to the current time. This is practical for timing:
-
- \code
- QTime t;
- t.start(); // start clock
- ... // some lengthy task
- qDebug( "%d\n", t.elapsed() ); // prints # msecs elapsed
- \endcode
-
- \sa restart(), elapsed(), currentTime()
-*/
-
-void QTime::start()
-{
- *this = currentTime();
-}
-
-/*!
- Sets this time to the current time, and returns the number of
- milliseconds that have elapsed since the last time start() or
- restart() was called.
-
- This function is guaranteed to be atomic, and is thus very handy for
- repeated measurements: call start() to start the first measurement,
- then restart() for each later measurement.
-
- Note that the counter wraps to zero 24 hours after the last call to
- start() or restart().
-
- \warning If the system's clock setting has been changed since the
- last time start() or restart() was called, the result is undefined.
- This can happen e.g. when daylight saving is turned on or off.
-
- \sa start(), elapsed(), currentTime()
-*/
-
-int QTime::restart()
-{
- QTime t = currentTime();
- int n = msecsTo( t );
- if ( n < 0 ) // passed midnight
- n += 86400*1000;
- *this = t;
- return n;
-}
-
-/*!
- Returns the number of milliseconds that have elapsed since the last
- time start() or restart() was called.
-
- Note that the counter wraps to zero 24 hours after the last call to
- start() or restart.
-
- Note that the accuracy depends on the accuracy of the underlying
- operating system; not all systems provide 1-millisecond accuracy.
-
- \warning If the system's clock setting has been changed since the
- last time start() or restart() was called, the result is undefined.
- This can happen e.g. when daylight saving is turned on or off.
-
- \sa start(), restart()
-*/
-
-int QTime::elapsed()
-{
- int n = msecsTo( currentTime() );
- if ( n < 0 ) // passed midnight
- n += 86400*1000;
- return n;
-}
-
-
-/*****************************************************************************
- QDateTime member functions
- *****************************************************************************/
-
-/*!
- \class QDateTime qdatetime.h
- \brief The QDateTime class provides date and time functions.
-
- \ingroup time
-
- A QDateTime object contains a calendar date and a clock time (a
- "datetime"). It is a combination of the QDate and QTime classes. It
- can read the current datetime from the system clock. It provides
- functions for comparing datetimes and for manipulating a datetime by
- adding a number of seconds or days.
-
- A QDateTime object is typically created either by giving a date and
- time explicitly, or by using the static function currentTime(),
- which makes a QDateTime object which contains the system's clock
- time.
-
- The date() and time() functions provide access to the date and time
- parts of the datetime. The same information is provided in textual
- format by the toString() function.
-
- QDateTime provides a full set of operators to compare two QDateTime
- objects. A datetime is considered smaller than another if it is
- earlier than the other.
-
- The datetime a given number of days or seconds later than a given
- datetime can be found using the addDays() and addSecs()
- functions. Correspondingly, the number of days or seconds between
- two times can be found using the daysTo() or secsTo() functions.
-
- A datetime can also be set using the setTime_t() function, which
- takes a POSIX-standard "number of seconds since 00:00:00 on January
- 1, 1970" value.
-
- The limitations regarding range and resolution mentioned in the
- QDate and QTime documentation apply for QDateTime also.
-
- \sa QDate, QTime
-*/
-
-
-/*!
- \fn QDateTime::QDateTime()
-
- Constructs a null datetime (i.e. null date and null time). A null
- datetime is invalid, since the date is invalid.
-
- \sa isValid()
-*/
-
-
-/*!
- Constructs a datetime with date \a date and null time (00:00:00.000).
-*/
-
-QDateTime::QDateTime( const QDate &date )
- : d(date)
-{
-}
-
-/*!
- Constructs a datetime with date \a date and time \a time.
-*/
-
-QDateTime::QDateTime( const QDate &date, const QTime &time )
- : d(date), t(time)
-{
-}
-
-
-/*!
- \fn bool QDateTime::isNull() const
-
- Returns TRUE if both the date and the time are null. A null date is invalid.
-
- \sa QDate::isNull(), QTime::isNull()
-*/
-
-/*!
- \fn bool QDateTime::isValid() const
-
- Returns TRUE if both the date and the time are valid.
-
- \sa QDate::isValid(), QTime::isValid()
-*/
-
-/*!
- \fn QDate QDateTime::date() const
-
- Returns the date part of this datetime.
-
- \sa setDate(), time()
-*/
-
-/*!
- \fn QTime QDateTime::time() const
-
- Returns the time part of this datetime.
-
- \sa setTime(), date()
-*/
-
-/*!
- \fn void QDateTime::setDate( const QDate &date )
-
- Sets the date part of this datetime.
-
- \sa date(), setTime()
-*/
-
-/*!
- \fn void QDateTime::setTime( const QTime &time )
-
- Sets the time part of this datetime.
-
- \sa time(), setDate()
-*/
-
-
-/*!
- Sets the local date and time given the number of seconds that have passed
- since 00:00:00 on January 1, 1970, Coordinated Universal Time (UTC).
- On systems that do not support timezones this function will behave as if
- local time were UTC.
-
- Note that Microsoft Windows supports only a limited range of values for
- \a secsSince1Jan1970UTC.
-*/
-
-void QDateTime::setTime_t( uint secsSince1Jan1970UTC )
-{
- time_t tmp = (time_t) secsSince1Jan1970UTC;
- tm *tM = localtime( &tmp );
- if ( !tM ) {
- tM = gmtime( &tmp );
- if ( !tM ) {
- d.jd = QDate::greg2jul( 1970, 1, 1 );
- t.ds = 0;
- return;
- }
- }
- d.jd = QDate::greg2jul( tM->tm_year + 1900, tM->tm_mon + 1, tM->tm_mday );
- t.ds = MSECS_PER_HOUR*tM->tm_hour + MSECS_PER_MIN*tM->tm_min +
- 1000*tM->tm_sec;
-}
-
-
-/*!
- Returns the datetime as a string.
-
- The string format is "Sat May 20 03:40:13 1998".
-
- This function uses QDate::dayName(), QDate::monthName(), and
- QTime::toString() to generate the string.
-
-*/
-
-QString QDateTime::toString() const
-{
- QString buf = d.dayName(d.dayOfWeek());
- buf += ' ';
- buf += d.monthName(d.month());
- buf += ' ';
- buf += QString().setNum(d.day());
- buf += ' ';
- buf += t.toString();
- buf += ' ';
- buf += QString().setNum(d.year());
- return buf;
-}
-
-/*!
- Returns a QDateTime object containing a datetime \a ndays days later
- than the datetime of this object (or earlier if \a ndays is
- negative).
-
- \sa daysTo(), addSecs()
-*/
-
-QDateTime QDateTime::addDays( int ndays ) const
-{
- return QDateTime( d.addDays(ndays), t );
-}
-
-/*!
- Returns a QDateTime object containing a datetime \a nsecs seconds
- later than the datetime of this object (or earlier if \a nsecs is
- negative).
-
- \sa secsTo(), addDays()
-*/
-
-QDateTime QDateTime::addSecs( int nsecs ) const
-{
- uint dd = d.jd;
- int tt = t.ds;
- int sign = 1;
- if ( nsecs < 0 ) {
- nsecs = -nsecs;
- sign = -1;
- }
- if ( nsecs >= (int)SECS_PER_DAY ) {
- dd += sign*(nsecs/SECS_PER_DAY);
- nsecs %= SECS_PER_DAY;
- }
- tt += sign*nsecs*1000;
- if ( tt < 0 ) {
- tt = MSECS_PER_DAY - tt - 1;
- dd -= tt / MSECS_PER_DAY;
- tt = tt % MSECS_PER_DAY;
- tt = MSECS_PER_DAY - tt - 1;
- } else if ( tt >= (int)MSECS_PER_DAY ) {
- dd += ( tt / MSECS_PER_DAY );
- tt = tt % MSECS_PER_DAY;
- }
- QDateTime ret;
- ret.t.ds = tt;
- ret.d.jd = dd;
- return ret;
-}
-
-/*!
- Returns the number of days from this datetime to \a dt (which is
- negative if \a dt is earlier than this datetime).
-
- \sa addDays(), secsTo()
-*/
-
-int QDateTime::daysTo( const QDateTime &dt ) const
-{
- return d.daysTo( dt.d );
-}
-
-/*!
- Returns the number of seconds from this datetime to \a dt (which is
- negative if \a dt is earlier than this datetime).
-
- Example:
- \code
- QDateTime dt = QDateTime::currentDateTime();
- QDateTime x( QDate(dt.year(),12,24), QTime(17,00) );
- qDebug( "There are %d seconds to Christmas", dt.secsTo(x) );
- \endcode
-
- \sa addSecs(), daysTo(), QTime::secsTo()
-*/
-
-int QDateTime::secsTo( const QDateTime &dt ) const
-{
- return t.secsTo(dt.t) + d.daysTo(dt.d)*SECS_PER_DAY;
-}
-
-
-/*!
- Returns TRUE if this datetime is equal to \a dt, or FALSE if
- they are different.
- \sa operator!=()
-*/
-
-bool QDateTime::operator==( const QDateTime &dt ) const
-{
- return t == dt.t && d == dt.d;
-}
-
-/*!
- Returns TRUE if this datetime is different from \a dt, or FALSE if
- they are equal.
- \sa operator==()
-*/
-
-bool QDateTime::operator!=( const QDateTime &dt ) const
-{
- return t != dt.t || d != dt.d;
-}
-
-/*!
- Returns TRUE if this datetime is earlier than \a dt, otherwise FALSE.
-*/
-
-bool QDateTime::operator<( const QDateTime &dt ) const
-{
- if ( d < dt.d )
- return TRUE;
- return d == dt.d ? t < dt.t : FALSE;
-}
-
-/*!
- Returns TRUE if this datetime is earlier than or equal to \a dt,
- otherwise FALSE.
-*/
-
-bool QDateTime::operator<=( const QDateTime &dt ) const
-{
- if ( d < dt.d )
- return TRUE;
- return d == dt.d ? t <= dt.t : FALSE;
-}
-
-/*!
- Returns TRUE if this datetime is later than \a dt, otherwise FALSE.
-*/
-
-bool QDateTime::operator>( const QDateTime &dt ) const
-{
- if ( d > dt.d )
- return TRUE;
- return d == dt.d ? t > dt.t : FALSE;
-}
-
-/*!
- Returns TRUE if this datetime is later than or equal to \a dt,
- otherwise FALSE.
-*/
-
-bool QDateTime::operator>=( const QDateTime &dt ) const
-{
- if ( d > dt.d )
- return TRUE;
- return d == dt.d ? t >= dt.t : FALSE;
-}
-
-/*!
- Returns the current datetime, as reported by the system clock.
-
- \sa QDate::currentDate(), QTime::currentTime()
-*/
-
-QDateTime QDateTime::currentDateTime()
-{
- QDate cd = QDate::currentDate();
- QTime ct;
- if ( QTime::currentTime(&ct) ) // too close to midnight?
- cd = QDate::currentDate(); // YES! time for some midnight
- // voodoo, fetch date again
- return QDateTime( cd, ct );
-}
-
-
-/*****************************************************************************
- Date/time stream functions
- *****************************************************************************/
-
-#ifndef QT_NO_DATASTREAM
-/*!
- \relates QDate
- Writes the date to the stream.
-
- \sa \link datastreamformat.html Format of the QDataStream operators \endlink
-*/
-
-QDataStream &operator<<( QDataStream &s, const QDate &d )
-{
- return s << (Q_UINT32)(d.jd);
-}
-
-/*!
- \relates QDate
- Reads a date from the stream.
-
- \sa \link datastreamformat.html Format of the QDataStream operators \endlink
-*/
-
-QDataStream &operator>>( QDataStream &s, QDate &d )
-{
- Q_UINT32 jd;
- s >> jd;
- d.jd = jd;
- return s;
-}
-
-/*!
- \relates QTime
- Writes a time to the stream.
-
- \sa \link datastreamformat.html Format of the QDataStream operators \endlink
-*/
-
-QDataStream &operator<<( QDataStream &s, const QTime &t )
-{
- return s << (Q_UINT32)(t.ds);
-}
-
-/*!
- \relates QTime
- Reads a time from the stream.
-
- \sa \link datastreamformat.html Format of the QDataStream operators \endlink
-*/
-
-QDataStream &operator>>( QDataStream &s, QTime &t )
-{
- Q_UINT32 ds;
- s >> ds;
- t.ds = ds;
- return s;
-}
-
-/*!
- \relates QDateTime
- Writes a datetime to the stream.
-
- \sa \link datastreamformat.html Format of the QDataStream operators \endlink
-*/
-
-QDataStream &operator<<( QDataStream &s, const QDateTime &dt )
-{
- return s << dt.d << dt.t;
-}
-
-/*!
- \relates QDateTime
- Reads a datetime from the stream.
-
- \sa \link datastreamformat.html Format of the QDataStream operators \endlink
-*/
-
-QDataStream &operator>>( QDataStream &s, QDateTime &dt )
-{
- s >> dt.d >> dt.t;
- return s;
-}
-#endif //QT_NO_DATASTREAM
diff --git a/qtools/qdatetime.h b/qtools/qdatetime.h
deleted file mode 100644
index 2d5869c..0000000
--- a/qtools/qdatetime.h
+++ /dev/null
@@ -1,216 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of date and time classes
-**
-** Created : 940124
-**
-** 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 QDATETIME_H
-#define QDATETIME_H
-
-#ifndef QT_H
-#include "qstring.h"
-#endif // QT_H
-
-
-/*****************************************************************************
- QDate class
- *****************************************************************************/
-
-class Q_EXPORT QDate
-{
-public:
- QDate() { jd=0; } // set null date
- QDate( int y, int m, int d ); // set date
- virtual ~QDate() {}
-
- bool isNull() const { return jd == 0; }
- bool isValid() const; // valid date
-
- int year() const; // 1752..
- int month() const; // 1..12
- int day() const; // 1..31
- int dayOfWeek() const; // 1..7 (monday==1)
- int dayOfYear() const; // 1..365
- int daysInMonth() const; // 28..31
- int daysInYear() const; // 365 or 366
-
- virtual QString monthName( int month ) const;
- virtual QString dayName( int weekday ) const;
-
- QString toString() const;
-
- bool setYMD( int y, int m, int d );
-
- QDate addDays( int days ) const;
- int daysTo( const QDate & ) const;
-
- bool operator==( const QDate &d ) const { return jd == d.jd; }
- bool operator!=( const QDate &d ) const { return jd != d.jd; }
- bool operator<( const QDate &d ) const { return jd < d.jd; }
- bool operator<=( const QDate &d ) const { return jd <= d.jd; }
- bool operator>( const QDate &d ) const { return jd > d.jd; }
- bool operator>=( const QDate &d ) const { return jd >= d.jd; }
-
- static QDate currentDate();
- static bool isValid( int y, int m, int d );
- static bool leapYear( int year );
-
-protected:
- static uint greg2jul( int y, int m, int d );
- static void jul2greg( uint jd, int &y, int &m, int &d );
-private:
- static const char * const monthNames[];
- static const char * const weekdayNames[];
- uint jd;
- friend class QDateTime;
-#ifndef QT_NO_DATASTREAM
- friend Q_EXPORT QDataStream &operator<<( QDataStream &, const QDate & );
- friend Q_EXPORT QDataStream &operator>>( QDataStream &, QDate & );
-#endif
-};
-
-
-/*****************************************************************************
- QTime class
- *****************************************************************************/
-
-class Q_EXPORT QTime
-{
-public:
- QTime() { ds=0; } // set null time
- QTime( int h, int m, int s=0, int ms=0 ); // set time
-
- bool isNull() const { return ds == 0; }
- bool isValid() const; // valid time
-
- int hour() const; // 0..23
- int minute() const; // 0..59
- int second() const; // 0..59
- int msec() const; // 0..999
-
- QString toString() const;
-
- bool setHMS( int h, int m, int s, int ms=0 );
-
- QTime addSecs( int secs ) const;
- int secsTo( const QTime & ) const;
- QTime addMSecs( int ms ) const;
- int msecsTo( const QTime & ) const;
-
- bool operator==( const QTime &d ) const { return ds == d.ds; }
- bool operator!=( const QTime &d ) const { return ds != d.ds; }
- bool operator<( const QTime &d ) const { return ds < d.ds; }
- bool operator<=( const QTime &d ) const { return ds <= d.ds; }
- bool operator>( const QTime &d ) const { return ds > d.ds; }
- bool operator>=( const QTime &d ) const { return ds >= d.ds; }
-
- static QTime currentTime();
- static bool isValid( int h, int m, int s, int ms=0 );
-
- void start();
- int restart();
- int elapsed();
-
-private:
- static bool currentTime( QTime * );
-
- uint ds;
- friend class QDateTime;
-#ifndef QT_NO_DATASTREAM
- friend Q_EXPORT QDataStream &operator<<( QDataStream &, const QTime & );
- friend Q_EXPORT QDataStream &operator>>( QDataStream &, QTime & );
-#endif
-};
-
-
-/*****************************************************************************
- QDateTime class
- *****************************************************************************/
-
-class Q_EXPORT QDateTime
-{
-public:
- QDateTime() {} // set null date and null time
- QDateTime( const QDate & );
- QDateTime( const QDate &, const QTime & );
-
- bool isNull() const { return d.isNull() && t.isNull(); }
- bool isValid() const { return d.isValid() && t.isValid(); }
-
- QDate date() const { return d; }
- QTime time() const { return t; }
- void setDate( const QDate &date ) { d=date; }
- void setTime( const QTime &time ) { t=time; }
- void setTime_t( uint secsSince1Jan1970UTC );
-
- QString toString() const;
-
- QDateTime addDays( int days ) const;
- QDateTime addSecs( int secs ) const;
- int daysTo( const QDateTime & ) const;
- int secsTo( const QDateTime & ) const;
-
- bool operator==( const QDateTime &dt ) const;
- bool operator!=( const QDateTime &dt ) const;
- bool operator<( const QDateTime &dt ) const;
- bool operator<=( const QDateTime &dt ) const;
- bool operator>( const QDateTime &dt ) const;
- bool operator>=( const QDateTime &dt ) const;
-
- static QDateTime currentDateTime();
-
-private:
- QDate d;
- QTime t;
-#ifndef QT_NO_DATASTREAM
- friend Q_EXPORT QDataStream &operator<<( QDataStream &, const QDateTime &);
- friend Q_EXPORT QDataStream &operator>>( QDataStream &, QDateTime & );
-#endif
-};
-
-
-/*****************************************************************************
- Date and time stream functions
- *****************************************************************************/
-
-#ifndef QT_NO_DATASTREAM
-Q_EXPORT QDataStream &operator<<( QDataStream &, const QDate & );
-Q_EXPORT QDataStream &operator>>( QDataStream &, QDate & );
-Q_EXPORT QDataStream &operator<<( QDataStream &, const QTime & );
-Q_EXPORT QDataStream &operator>>( QDataStream &, QTime & );
-Q_EXPORT QDataStream &operator<<( QDataStream &, const QDateTime & );
-Q_EXPORT QDataStream &operator>>( QDataStream &, QDateTime & );
-#endif // QT_NO_DATASTREAM
-
-#endif // QDATETIME_H
diff --git a/qtools/qdict.doc b/qtools/qdict.doc
deleted file mode 100644
index d9f6ca5..0000000
--- a/qtools/qdict.doc
+++ /dev/null
@@ -1,492 +0,0 @@
-/****************************************************************************
-**
-**
-** QDict and QDictIterator 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.
-**
-**********************************************************************/
-
-
-/*****************************************************************************
- QDict documentation
- *****************************************************************************/
-
-/*!
- \class QDict qdict.h
- \brief The QDict class is a template class that provides a dictionary based on \c QString keys.
-
- \ingroup collection
- \ingroup tools
-
- QDict is implemented as a template class. Define a template instance
- QDict\<X\> to create a dictionary that operates on pointers to X, or X*.
-
- A dictionary is a collection that associates an item with a key.
- The key is used for inserting and looking up an item. QDict has
- \l QString keys, which are Unicode strings. If you want to use
- non-Unicode, plain 8-bit \c char* keys, use the QAsciiDict template.
- A QDict has the same performace as a QAsciiDict.
-
- The dictionary has very fast insertion and lookup.
-
- Example:
- \code
- #include <qdict.h>
- #include <stdio.h>
-
- void main()
- {
- // Creates a dictionary that maps QString ==> char* (case insensitive)
- QDict<char> dict( 17, FALSE );
-
- dict.insert( "France", "Paris" );
- dict.insert( "Russia", "Moscow" );
- dict.insert( "Norway", "Oslo" );
-
- printf( "%s\n", dict["Norway"] );
- printf( "%s\n", dict["FRANCE"] );
- printf( "%s\n", dict["russia"] );
-
- if ( !dict["Italy"] )
- printf( "Italy not defined\n" );
- }
- \endcode
-
- Program output:
- \code
- Oslo
- Paris
- Moscow
- Italy not defined
- \endcode
-
- The dictionary in our example maps \c QString keys to \c char* items.
- Note that the mapping is case insensitive (specified in the
- \link QDict::QDict() constructor\endlink).
- QDict implements the \link operator[] [] operator\endlink to lookup an item.
-
- QDict is implemented by QGDict as a hash array with a fixed number of
- entries. Each array entry points to a singly linked list of buckets, in
- which the dictionary items are stored.
-
- When an item is inserted with a key, the key is converted (hashed) to
- an integer index into the hash array. The item is inserted before the
- first bucket in the list of buckets.
-
- Looking up an item is normally very fast. The key is again hashed to an
- array index. Then QDict scans the list of buckets and returns the item
- found or null if the item was not found. You cannot insert null pointers
- into a dictionary.
-
- The size of the hash array is very important. In order to get good
- performance, you should use a suitably large \link primes.html prime
- number\endlink. Suitable means equal to or larger than the maximum
- expected number of dictionary items.
-
- Items with equal keys are allowed. When inserting two items with the
- same key, only the last inserted item will be visible (last in, first out)
- until it is removed.
-
- Example:
- \code
- #include <qdict.h>
- #include <stdio.h>
-
- void main()
- {
- // Creates a dictionary that maps QString ==> char* (case sensitive)
- QDict<char> dict;
-
- dict.insert( "Germany", "Berlin" );
- dict.insert( "Germany", "Bonn" );
-
- printf( "%s\n", dict["Germany"] );
- dict.remove( "Germany" ); // Oct 3rd 1990
- printf( "%s\n", dict["Germany"] );
- }
- \endcode
-
- Program output:
- \code
- Bonn
- Berlin
- \endcode
-
- The QDictIterator class can traverse the dictionary contents, but only
- in an arbitrary order. Multiple iterators may independently traverse the
- same dictionary.
-
- Calling setAutoDelete(TRUE) for a dictionary tells it to delete items
- that are removed . The default is to not delete items when they are
- removed.
-
- When inserting an item into a dictionary, only the pointer is copied, not
- the item itself. This is called a shallow copy. It is possible to make the
- dictionary copy all of the item's data (known as a deep copy) when an
- item is inserted. insert() calls the virtual function
- QCollection::newItem() for the item to be inserted.
- Inherit a dictionary and reimplement it if you want deep copies.
-
- When removing a dictionary item, the virtual function
- QCollection::deleteItem() is called. QDict's default implementation
- is to delete the item if auto-deletion is enabled.
-
- \sa QDictIterator, QAsciiDict, QIntDict, QPtrDict,
- \link collection.html Collection Classes\endlink
-*/
-
-
-/*!
- \fn QDict::QDict( int size, bool caseSensitive )
- Constructs a dictionary with the following properties:
- \arg \e size is the size of the internal hash array.
- \arg \e caseSensitive specifies whether to use case sensitive lookup or not.
-
- Setting \e size to a suitably large \link primes.html prime
- number\endlink (equal to or greater than the expected number of entries)
- makes the hash distribution better and hence the loopup faster.
-
- Setting \e caseSensitive to TRUE will treat "abc" and "Abc" as different
- keys. Setting it to FALSE will make the dictionary ignore case.
- Case insensitive comparison includes the whole Unicode alphabeth.
-*/
-
-/*!
- \fn QDict::QDict( const QDict<type> &dict )
- Constructs a copy of \e dict.
-
- Each item in \e dict are inserted into this dictionary.
- Only the pointers are copied (shallow copy).
-*/
-
-/*!
- \fn QDict::~QDict()
- Removes all items from the dictionary and destroys it.
- All iterators that access this dictionary will be reset.
-
- \sa setAutoDelete()
-*/
-
-/*!
- \fn QDict<type> &QDict::operator=(const QDict<type> &dict)
- Assigns \e dict to this dictionary and returns a reference to this
- dictionary.
-
- This dictionary is first cleared, then each item in \e dict is inserted
- into this dictionary.
- Only the pointers are copied (shallow copy), unless newItem() has been
- reimplemented().
-*/
-
-/*!
- \fn uint QDict::count() const
- Returns the number of items in the dictionary.
- \sa isEmpty()
-*/
-
-/*!
- \fn uint QDict::size() const
- Returns the size of the internal hash array (as specified in the
- constructor).
- \sa count()
-*/
-
-/*!
- \fn void QDict::resize( uint newsize )
- Changes the size of the hashtable the \a newsize.
- The contents of the dictionary are preserved,
- but all iterators on the dictionary become invalid.
-*/
-
-/*!
- \fn bool QDict::isEmpty() const
- Returns TRUE if the dictionary is empty, i.e. count() == 0. Returns FALSE
- otherwise.
- \sa count()
-*/
-
-/*!
- \fn void QDict::insert( const QString &key, const type *item )
-
- Inserts the \e key with the \e item into the dictionary.
-
- The key does not have to be a unique dictionary key. If multiple items
- are inserted with the same key, only the last item will be visible.
-
- Null items are not allowed.
-
- \sa replace()
-*/
-
-/*!
- \fn void QDict::replace( const QString &key, const type *item )
-
- Replaces an item which has a key equal to \e key with \e item.
-
- If the item does not already exist, it will be inserted.
-
- Null items are not allowed.
-
- Equivalent to:
- \code
- QDict<char> dict;
- ...
- if ( dict.find(key) )
- dict.remove( key );
- dict.insert( key, item );
- \endcode
-
- If there are two or more items with equal keys, then the last inserted
- of these will be replaced.
-
- \sa insert()
-*/
-
-/*!
- \fn bool QDict::remove( const QString &key )
-
- Removes the item associated with \e key from the dictionary.
- Returns TRUE if successful, or FALSE if the key does not exist in the
- dictionary.
-
- If there are two or more items with equal keys, then the last inserted
- of these will be removed.
-
- The removed item is deleted if \link QCollection::setAutoDelete()
- auto-deletion\endlink is enabled.
-
- All dictionary iterators that refer to the removed item will be set to
- point to the next item in the dictionary traversing order.
-
- \sa take(), clear(), setAutoDelete()
-*/
-
-/*!
- \fn type *QDict::take( const QString &key )
-
- Takes the item associated with \e key out of the dictionary without
- deleting it (even if \link QCollection::setAutoDelete()
- auto-deletion\endlink is enabled).
-
- If there are two or more items with equal keys, then the last inserted
- of these will be taken.
-
- Returns a pointer to the item taken out, or null if the key does not
- exist in the dictionary.
-
- All dictionary iterators that refer to the taken item will be set to
- point to the next item in the dictionary traversal order.
-
- \sa remove(), clear(), setAutoDelete()
-*/
-
-/*!
- \fn void QDict::clear()
-
- Removes all items from the dictionary.
-
- The removed items are deleted if \link QCollection::setAutoDelete()
- auto-deletion\endlink is enabled.
-
- All dictionary iterators that operate on dictionary are reset.
-
- \sa remove(), take(), setAutoDelete()
-*/
-
-/*!
- \fn type *QDict::find( const QString &key ) const
-
- Returns the item associated with \e key, or null if the key does not
- exist in the dictionary.
-
- This function uses an internal hashing algorithm to optimize lookup.
-
- If there are two or more items with equal keys, then the last inserted
- of these will be found.
-
- Equivalent to the [] operator.
-
- \sa operator[]()
-*/
-
-/*!
- \fn type *QDict::operator[]( const QString &key ) const
-
- Returns the item associated with \e key, or null if the key does not
- exist in the dictionary.
-
- This function uses an internal hashing algorithm to optimize lookup.
-
- If there are two or more items with equal keys, then the last inserted
- of these will be found.
-
- Equivalent to the find() function.
-
- \sa find()
-*/
-
-/*!
- \fn void QDict::statistics() const
- Debugging-only function that prints out the dictionary distribution
- using qDebug().
-*/
-
-
-/*****************************************************************************
- QDictIterator documentation
- *****************************************************************************/
-
-/*!
- \class QDictIterator qdict.h
- \brief The QDictIterator class provides an iterator for QDict collections.
-
- \ingroup collection
- \ingroup tools
-
- QDictIterator is implemented as a template class.
- Define a template instance QDictIterator\<X\> to create a
- dictionary iterator that operates on QDict\<X\> (dictionary of X*).
-
- Example:
- \code
- #include <qdict.h>
- #include <stdio.h>
-
- void main()
- {
- // Creates a dictionary that maps QString ==> char* (case insensitive)
- QDict<char> dict( 17, FALSE );
-
- dict.insert( "France", "Paris" );
- dict.insert( "Russia", "Moscow" );
- dict.insert( "Norway", "Oslo" );
-
- QDictIterator<char> it( dict ); // iterator for dict
-
- while ( it.current() ) {
- printf( "%s -> %s\n", it.currentKey().latin1(), it.current() );
- ++it;
- }
- }
- \endcode
-
- Program output:
- \code
- Russia -> Moscow
- Norway -> Oslo
- France -> Paris
- \endcode
-
- Note that the traversal order is arbitrary, you are not guaranteed the
- order above.
-
- Multiple iterators may independently traverse the same dictionary.
- A QDict knows about all iterators that are operating on the dictionary.
- When an item is removed from the dictionary, QDict update all iterators
- that are referring the removed item to point to the next item in the
- traversing order.
-
- \sa QDict, \link collection.html Collection Classes\endlink
-*/
-
-/*!
- \fn QDictIterator::QDictIterator( const QDict<type> &dict )
- Constructs an iterator for \e dict. The current iterator item is
- set to point on the first item in the \e dict.
-*/
-
-/*!
- \fn QDictIterator::~QDictIterator()
- Destroys the iterator.
-*/
-
-/*!
- \fn uint QDictIterator::count() const
- Returns the number of items in the dictionary this iterator operates on.
- \sa isEmpty()
-*/
-
-/*!
- \fn bool QDictIterator::isEmpty() const
- Returns TRUE if the dictionary is empty, i.e. count() == 0, otherwise FALSE.
- \sa count()
-*/
-
-/*!
- \fn type *QDictIterator::toFirst()
- Sets the current iterator item to point to the first item in the
- dictionary and returns a pointer to the item.
- If the dictionary is empty it sets the current item to null and
- returns null.
-*/
-
-/*!
- \fn QDictIterator::operator type *() const
- Cast operator. Returns a pointer to the current iterator item.
- Same as current().
-*/
-
-/*!
- \fn type *QDictIterator::current() const
- Returns a pointer to the current iterator item.
-*/
-
-/*!
- \fn QString QDictIterator::currentKey() const
- Returns a pointer to the key for the current iterator item.
-*/
-
-/*!
- \fn type *QDictIterator::operator()()
- Makes the succeeding item current and returns the original current item.
-
- If the current iterator item was the last item in the dictionary or if it
- was null, null is returned.
-*/
-
-/*!
- \fn type *QDictIterator::operator++()
- Prefix ++ makes the succeeding item current and returns the new current
- item.
-
- If the current iterator item was the last item in the dictionary or if it
- was null, null is returned.
-*/
-
-/*!
- \fn type *QDictIterator::operator+=( uint jump )
- Sets the current item to the item \e jump positions after the current item,
- and returns a pointer to that item.
-
- If that item is beyond the last item or if the dictionary is empty,
- it sets the current item to null and returns null.
-*/
-
-
diff --git a/qtools/qdict.h b/qtools/qdict.h
deleted file mode 100644
index 682b270..0000000
--- a/qtools/qdict.h
+++ /dev/null
@@ -1,116 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QDict template class
-**
-** Created : 920821
-**
-** 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 QDICT_H
-#define QDICT_H
-
-#ifndef QT_H
-#include "qgdict.h"
-#endif // QT_H
-
-#define USE_ASCII_STRING
-
-#ifdef USE_ASCII_STRING
-
-#define QAsciiDict QDict
-#define QAsciiDictIterator QDictIterator
-#include "qasciidict.h"
-
-#else
-
-template<class type> class Q_EXPORT QDict : public QGDict
-{
-public:
- QDict(int size=17, bool caseSensitive=TRUE)
- : QGDict(size,StringKey,caseSensitive,FALSE) {}
- QDict( const QDict<type> &d ) : QGDict(d) {}
- ~QDict() { clear(); }
- QDict<type> &operator=(const QDict<type> &d)
- { return (QDict<type>&)QGDict::operator=(d); }
- uint count() const { return QGDict::count(); }
- uint size() const { return QGDict::size(); }
- bool isEmpty() const { return QGDict::count() == 0; }
-
- void insert( const QString &k, const type *d )
- { QGDict::look_string(k,(Item)d,1); }
- void replace( const QString &k, const type *d )
- { QGDict::look_string(k,(Item)d,2); }
- bool remove( const QString &k ) { return QGDict::remove_string(k); }
- type *take( const QString &k ) { return (type *)QGDict::take_string(k); }
- type *find( const QString &k ) const
- { return (type *)((QGDict*)this)->QGDict::look_string(k,0,0); }
- type *operator[]( const QString &k ) const
- { return (type *)((QGDict*)this)->QGDict::look_string(k,0,0); }
-
- void clear() { QGDict::clear(); }
- void resize( uint n ) { QGDict::resize(n); }
- void statistics() const { QGDict::statistics(); }
-private:
- void deleteItem( Item d );
-};
-
-#if defined(Q_DELETING_VOID_UNDEFINED)
-template<> inline void QDict<void>::deleteItem( Item )
-{
-}
-#endif
-
-template<class type> inline void QDict<type>::deleteItem( QCollection::Item d )
-{
- if ( del_item ) delete (type *)d;
-}
-
-
-template<class type> class Q_EXPORT QDictIterator : public QGDictIterator
-{
-public:
- QDictIterator(const QDict<type> &d) :QGDictIterator((QGDict &)d) {}
- ~QDictIterator() {}
- uint count() const { return dict->count(); }
- bool isEmpty() const { return dict->count() == 0; }
- type *toFirst() { return (type *)QGDictIterator::toFirst(); }
- operator type *() const { return (type *)QGDictIterator::get(); }
- type *current() const { return (type *)QGDictIterator::get(); }
- QString currentKey() const{ return QGDictIterator::getKeyString(); }
- type *operator()() { return (type *)QGDictIterator::operator()(); }
- type *operator++() { return (type *)QGDictIterator::operator++(); }
- type *operator+=(uint j) { return (type *)QGDictIterator::operator+=(j);}
-};
-
-#endif // USE_ASCII_STRING
-
-#endif // QDICT_H
diff --git a/qtools/qdir.cpp b/qtools/qdir.cpp
deleted file mode 100644
index ed7ed99..0000000
--- a/qtools/qdir.cpp
+++ /dev/null
@@ -1,1200 +0,0 @@
-/****************************************************************************
-**
-**
-** Implementation of QDir class
-**
-** Created : 950427
-**
-** 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 "qglobal.h"
-
-#include "qdir.h"
-
-#ifndef QT_NO_DIR
-#include "qfileinfo.h"
-#include "qfiledefs_p.h"
-#include "qregexp.h"
-#include "qstringlist.h"
-#include <stdlib.h>
-#include <ctype.h>
-
-// NOT REVISED
-/*!
- \class QDir qdir.h
- \brief Traverses directory structures and contents in a
- platform-independent way.
-
- \ingroup io
-
- A QDir can point to a file using either a relative or an absolute file
- path. Absolute file paths begin with the directory separator ('/') or a
- drive specification (not applicable to UNIX). Relative file names begin
- with a directory name or a file name and specify a path relative to the
- current directory.
-
- An example of an absolute path is the string "/tmp/quartz", a relative
- path might look like "src/fatlib". You can use the function isRelative()
- to check if a QDir is using a relative or an absolute file path. You can
- call the function convertToAbs() to convert a relative QDir to an
- absolute one.
-
- The directory "example" under the current directory is checked for existence
- in the example below:
-
- \code
- QDir d( "example" ); // "./example"
- if ( !d.exists() )
- qWarning( "Cannot find the example directory" );
- \endcode
-
- If you always use '/' as a directory separator, Qt will translate your
- paths to conform to the underlying operating system.
-
- cd() and cdUp() can be used to navigate the directory tree. Note that the
- logical cd and cdUp operations are not performed if the new directory does
- not exist.
-
- Example:
- \code
- QDir d = QDir::root(); // "/"
- if ( !d.cd("tmp") ) { // "/tmp"
- qWarning( "Cannot find the \"/tmp\" directory" );
- } else {
- QFile f( d.filePath("ex1.txt") ); // "/tmp/ex1.txt"
- if ( !f.open(IO_ReadWrite) )
- qWarning( "Cannot create the file %s", f.name() );
- }
- \endcode
-
- To read the contents of a directory you can use the entryList() and
- entryInfoList() functions.
-
- Example:
- \code
- #include <stdio.h>
- #include <qdir.h>
-
- //
- // This program scans the current directory and lists all files
- // that are not symbolic links, sorted by size with the smallest files
- // first.
- //
-
- int main( int argc, char **argv )
- {
- QDir d;
- d.setFilter( QDir::Files | QDir::Hidden | QDir::NoSymLinks );
- d.setSorting( QDir::Size | QDir::Reversed );
-
- const QFileInfoList *list = d.entryInfoList();
- QFileInfoListIterator it( *list ); // create list iterator
- QFileInfo *fi; // pointer for traversing
-
- printf( " BYTES FILENAME\n" ); // print header
- while ( (fi=it.current()) ) { // for each file...
- printf( "%10li %s\n", fi->size(), fi->fileName().data() );
- ++it; // goto next list element
- }
- }
- \endcode
-*/
-
-
-/*!
- Constructs a QDir pointing to the current directory.
- \sa currentDirPath()
-*/
-
-QDir::QDir()
-{
- dPath = QString::fromLatin1(".");
- init();
-}
-
-/*!
- Constructs a QDir.
-
- \arg \e path is the directory.
- \arg \e nameFilter is the file name filter.
- \arg \e sortSpec is the sort specification, which describes how to
- sort the files in the directory.
- \arg \e filterSpec is the filter specification, which describes how
- to filter the files in the directory.
-
- Most of these arguments (except \e path) have optional values.
-
- Example:
- \code
- // lists all files in /tmp
-
- QDir d( "/tmp" );
- for ( int i=0; i<d.count(); i++ )
- printf( "%s\n", d[i] );
- \endcode
-
- If \e path is "" or null, the directory is set to "." (the current
- directory). If \e nameFilter is "" or null, it is set to "*" (all
- files).
-
- No check is made to ensure that the directory exists.
-
- \sa exists(), setPath(), setNameFilter(), setFilter(), setSorting()
-*/
-
-QDir::QDir( const QString &path, const QString &nameFilter,
- int sortSpec, int filterSpec )
-{
- init();
- dPath = cleanDirPath( path );
- if ( dPath.isEmpty() )
- dPath = QString::fromLatin1(".");
- nameFilt = nameFilter;
- if ( nameFilt.isEmpty() )
- nameFilt = QString::fromLatin1("*");
- filtS = (FilterSpec)filterSpec;
- sortS = (SortSpec)sortSpec;
-}
-
-/*!
- Constructs a QDir that is a copy of the given directory.
- \sa operator=()
-*/
-
-QDir::QDir( const QDir &d )
-{
- dPath = d.dPath;
- fList = 0;
- fiList = 0;
- nameFilt = d.nameFilt;
- dirty = TRUE;
- allDirs = d.allDirs;
- filtS = d.filtS;
- sortS = d.sortS;
-}
-
-
-void QDir::init()
-{
- fList = 0;
- fiList = 0;
- nameFilt = QString::fromLatin1("*");
- dirty = TRUE;
- allDirs = FALSE;
- filtS = All;
- sortS = SortSpec(Name | IgnoreCase);
-}
-
-/*!
- Destructs the QDir and cleans up.
-*/
-
-QDir::~QDir()
-{
- if ( fList )
- delete fList;
- if ( fiList )
- delete fiList;
-}
-
-
-/*!
- Sets the path of the directory. The path is cleaned of redundant ".", ".."
- and multiple separators. No check is made to ensure that a directory
- with this path exists.
-
- The path can be either absolute or relative. Absolute paths begin with the
- directory separator ('/') or a drive specification (not
- applicable to UNIX).
- Relative file names begin with a directory name or a file name and specify
- a path relative to the current directory. An example of
- an absolute path is the string "/tmp/quartz", a relative path might look like
- "src/fatlib". You can use the function isRelative() to check if a QDir
- is using a relative or an absolute file path. You can call the function
- convertToAbs() to convert a relative QDir to an absolute one.
-
- \sa path(), absPath(), exists(), cleanDirPath(), dirName(),
- absFilePath(), isRelative(), convertToAbs()
-*/
-
-void QDir::setPath( const QString &path )
-{
- dPath = cleanDirPath( path );
- if ( dPath.isEmpty() )
- dPath = QString::fromLatin1(".");
- dirty = TRUE;
-}
-
-/*!
- \fn QString QDir::path() const
- Returns the path, this may contain symbolic links, but never contains
- redundant ".", ".." or multiple separators.
-
- The returned path can be either absolute or relative (see setPath()).
-
- \sa setPath(), absPath(), exists(), cleanDirPath(), dirName(),
- absFilePath(), convertSeparators()
-*/
-
-/*!
- Returns the absolute (a path that starts with '/') path, which may
- contain symbolic links, but never contains redundant ".", ".." or
- multiple separators.
-
- \sa setPath(), canonicalPath(), exists(), cleanDirPath(), dirName(),
- absFilePath()
-*/
-
-QString QDir::absPath() const
-{
- if ( QDir::isRelativePath(dPath) ) {
- QString tmp = currentDirPath();
- if ( tmp.right(1) != QString::fromLatin1("/") )
- tmp += '/';
- tmp += dPath;
- return cleanDirPath( tmp );
- } else {
- return cleanDirPath( dPath );
- }
-}
-
-/*!
- Returns the name of the directory, this is NOT the same as the path, e.g.
- a directory with the name "mail", might have the path "/var/spool/mail".
- If the directory has no name (e.g. the root directory) a null string is
- returned.
-
- No check is made to ensure that a directory with this name actually exists.
-
- \sa path(), absPath(), absFilePath(), exists(), QString::isNull()
-*/
-
-QString QDir::dirName() const
-{
- int pos = dPath.findRev( '/' );
- if ( pos == -1 )
- return dPath;
- return dPath.right( dPath.length() - pos - 1 );
-}
-
-/*!
- Returns the path name of a file in the directory. Does NOT check if
- the file actually exists in the directory. If the QDir is relative
- the returned path name will also be relative. Redundant multiple separators
- or "." and ".." directories in \e fileName will not be removed (see
- cleanDirPath()).
-
- If \e acceptAbsPath is TRUE a \e fileName starting with a separator
- ('/') will be returned without change.
- If \e acceptAbsPath is FALSE an absolute path will be appended to
- the directory path.
-
- \sa absFilePath(), isRelative(), canonicalPath()
-*/
-
-QString QDir::filePath( const QString &fileName,
- bool acceptAbsPath ) const
-{
- if ( acceptAbsPath && !isRelativePath(fileName) )
- return QString(fileName);
-
- QString tmp = dPath;
- if ( tmp.isEmpty() || (tmp[(int)tmp.length()-1] != '/' && !!fileName &&
- fileName[0] != '/') )
- tmp += '/';
- tmp += fileName;
- return tmp;
-}
-
-/*!
- Returns the absolute path name of a file in the directory. Does NOT check if
- the file actually exists in the directory. Redundant multiple separators
- or "." and ".." directories in \e fileName will NOT be removed (see
- cleanDirPath()).
-
- If \e acceptAbsPath is TRUE a \e fileName starting with a separator
- ('/') will be returned without change.
- if \e acceptAbsPath is FALSE an absolute path will be appended to
- the directory path.
-
- \sa filePath()
-*/
-
-QString QDir::absFilePath( const QString &fileName,
- bool acceptAbsPath ) const
-{
- if ( acceptAbsPath && !isRelativePath( fileName ) )
- return fileName;
-
- QString tmp = absPath();
- if ( tmp.isEmpty() || (tmp[(int)tmp.length()-1] != '/' && !!fileName &&
- fileName[0] != '/') )
- tmp += '/';
- tmp += fileName;
- return tmp;
-}
-
-
-/*!
- Converts the '/' separators in \a pathName to system native
- separators. Returns the translated string.
-
- On Windows, convertSeparators("c:/winnt/system32") returns
- "c:\winnt\system32".
-
- No conversion is done on UNIX.
-*/
-
-QString QDir::convertSeparators( const QString &pathName )
-{
- QString n( pathName );
-#if defined(_OS_FATFS_) || defined(_OS_OS2EMX_)
- for ( int i=0; i<(int)n.length(); i++ ) {
- if ( n[i] == '/' )
- n[i] = '\\';
- }
-#endif
- return n;
-}
-
-
-/*!
- Changes directory by descending into the given directory. Returns
- TRUE if the new directory exists and is readable. Note that the logical
- cd operation is NOT performed if the new directory does not exist.
-
- If \e acceptAbsPath is TRUE a path starting with a separator ('/')
- will cd to the absolute directory, if \e acceptAbsPath is FALSE
- any number of separators at the beginning of \e dirName will be removed.
-
- Example:
- \code
- QDir d = QDir::home(); // now points to home directory
- if ( !d.cd("c++") ) { // now points to "c++" under home directory if OK
- QFileInfo fi( d, "c++" );
- if ( fi.exists() ) {
- if ( fi.isDir() )
- qWarning( "Cannot cd into \"%s\".", (char*)d.absFilePath("c++") );
- else
- qWarning( "Cannot create directory \"%s\"\n"
- "A file named \"c++\" already exists in \"%s\"",
- (const char *)d.absFilePath("c++"),
- (const char *)d.path() );
- return;
- } else {
- qWarning( "Creating directory \"%s\"",
- (const char *) d.absFilePath("c++") );
- if ( !d.mkdir( "c++" ) ) {
- qWarning("Could not create directory \"%s\"",
- (const char *)d.absFilePath("c++") );
- return;
- }
- }
- }
- \endcode
-
- Calling cd( ".." ) is equivalent to calling cdUp().
-
- \sa cdUp(), isReadable(), exists(), path()
-*/
-
-bool QDir::cd( const QString &dirName, bool acceptAbsPath )
-{
- if ( dirName.isEmpty() || dirName==QString::fromLatin1(".") )
- return TRUE;
- QString old = dPath;
- if ( acceptAbsPath && !isRelativePath(dirName) ) {
- dPath = cleanDirPath( dirName );
- } else {
- if ( !isRoot() )
- dPath += '/';
- dPath += dirName;
- if ( dirName.find('/') >= 0
- || old == QString::fromLatin1(".")
- || dirName == QString::fromLatin1("..") )
- dPath = cleanDirPath( dPath );
- }
- if ( !exists() ) {
- dPath = old; // regret
- return FALSE;
- }
- dirty = TRUE;
- return TRUE;
-}
-
-/*!
- Changes directory by moving one directory up the path followed to arrive
- at the current directory.
-
- Returns TRUE if the new directory exists and is readable. Note that the
- logical cdUp() operation is not performed if the new directory does not
- exist.
-
- \sa cd(), isReadable(), exists(), path()
-*/
-
-bool QDir::cdUp()
-{
- return cd( QString::fromLatin1("..") );
-}
-
-/*!
- \fn QString QDir::nameFilter() const
- Returns the string set by setNameFilter()
-*/
-
-/*!
- Sets the name filter used by entryList() and entryInfoList().
-
- The name filter is a wildcarding filter that understands "*" and "?"
- wildcards, You may specify several filter entries separated by a " " or a ";". If
- you want entryList() and entryInfoList() to list all files ending with
- ".cpp" and all files ending with ".h", you simply call
- dir.setNameFilter("*.cpp *.h") or dir.setNameFilter("*.cpp;*.h")
-
- \sa nameFilter(), setFilter()
-*/
-
-void QDir::setNameFilter( const QString &nameFilter )
-{
- nameFilt = nameFilter;
- if ( nameFilt.isEmpty() )
- nameFilt = QString::fromLatin1("*");
- dirty = TRUE;
-}
-
-/*!
- \fn QDir::FilterSpec QDir::filter() const
- Returns the value set by setFilter()
-*/
-
-/*! \enum QDir::FilterSpec
-
- This enum describes how QDir is to select what entries in a
- directory to return. The filter value is specified by or-ing
- together values from the following list: <ul>
-
- <li> \c Dirs - List directories only
- <li> \c Files - List files only
-
- <li> \c Drives - List disk drives (does nothing under unix)
- <li> \c NoSymLinks - Do not list symbolic links (where they exist)
- <li> \c Readable - List files for which the application has read access.
- <li> \c Writable - List files for which the application has write access.
- <li> \c Executable - List files for which the application has execute access
- <li> \c Modified - Only list files that have been modified (does nothing
- under unix)
- <li> \c Hidden - List hidden files (on unix, files starting with a .)
- <li> \c System - List system files (does nothing under unix)
- </ul>
-
- If you do not set any of \c Readable, \c Writable or \c Executable,
- QDir will set all three of them. This makes the default easy to
- write and at the same time useful.
-
- Examples: \c Readable|Writable means list all files for which the
- application has read access, write access or both. \c Dirs|Drives
- means list drives, directories, all files that the application can
- read, write or execute, and also symlinks to such files/directories.
-*/
-
-
-/*!
- Sets the filter used by entryList() and entryInfoList(). The filter is used
- to specify the kind of files that should be returned by entryList() and
- entryInfoList().
-
- \sa filter(), setNameFilter()
-*/
-
-void QDir::setFilter( int filterSpec )
-{
- if ( filtS == (FilterSpec) filterSpec )
- return;
- filtS = (FilterSpec) filterSpec;
- dirty = TRUE;
-}
-
-/*!
- \fn QDir::SortSpec QDir::sorting() const
-
- Returns the value set by setSorting()
-
- \sa setSorting()
-*/
-
-/*! \enum QDir::SortSpec
-
- This enum describes how QDir is to sort entries in a directory when
- it returns a list of them. The sort value is specified by or-ing
- together values from the following list: <ul>
-
- <li> \c Name - sort by name
- <li> \c Time - sort by time (modification time)
- <li> \c Size - sort by file size
- <li> \c Unsorted - do not sort
-
- <li> \c DirsFirst - put all directories first in the list
- <li> \c Reversed - reverse the sort order
- <li> \c IgnoreCase - sort case-insensitively
-
- </ul>
-
- You can only specify one of the first four. If you specify both \c
- DirsFirst and \c Reversed, directories are still put first but the
- list is otherwise reversed.
-*/
-
-// ### Unsorted+DirsFirst ? Unsorted+Reversed?
-
-/*!
- Sets the sorting order used by entryList() and entryInfoList().
-
- The \e sortSpec is specified by or-ing values from the enum
- SortSpec. The different values are:
-
- One of these:
- <dl compact>
- <dt>Name<dd> Sort by name (alphabetical order).
- <dt>Time<dd> Sort by time (most recent first).
- <dt>Size<dd> Sort by size (largest first).
- <dt>Unsorted<dd> Use the operating system order (UNIX does NOT sort
- alphabetically).
-
- ORed with zero or more of these:
-
- <dt>DirsFirst<dd> Always put directory names first.
- <dt>Reversed<dd> Reverse sort order.
- <dt>IgnoreCase<dd> Ignore case when sorting by name.
- </dl>
-*/
-
-void QDir::setSorting( int sortSpec )
-{
- if ( sortS == (SortSpec) sortSpec )
- return;
- sortS = (SortSpec) sortSpec;
- dirty = TRUE;
-}
-
-/*!
- \fn bool QDir::matchAllDirs() const
- Returns the value set by setMatchAllDirs()
-
- \sa setMatchAllDirs()
-*/
-
-/*!
- If \e enable is TRUE, all directories will be listed (even if they do not
- match the filter or the name filter), otherwise only matched directories
- will be listed.
-
- \bug Currently, directories that do not match the filter will not be
- included (the name filter will be ignored as expected).
-
- \sa matchAllDirs()
-*/
-
-void QDir::setMatchAllDirs( bool enable )
-{
- if ( (bool)allDirs == enable )
- return;
- allDirs = enable;
- dirty = TRUE;
-}
-
-
-/*!
- Returns the number of files that was found.
- Equivalent to entryList().count().
- \sa operator[](), entryList()
-*/
-
-uint QDir::count() const
-{
- return entryList().count();
-}
-
-/*!
- Returns the file name at position \e index in the list of found file
- names.
- Equivalent to entryList().at(index).
-
- Returns null if the \e index is out of range or if the entryList()
- function failed.
-
- \sa count(), entryList()
-*/
-
-QString QDir::operator[]( int index ) const
-{
- entryList();
- return fList && index >= 0 && index < (int)fList->count() ?
- (*fList)[index] : QString::null;
-}
-
-
-/*!
- This function is included to easy porting from Qt 1.x to Qt 2.0,
- it is the same as entryList(), but encodes the filenames as 8-bit
- strings using QFile::encodedName().
-
- It is more efficient to use entryList().
-*/
-QStrList QDir::encodedEntryList( int filterSpec, int sortSpec ) const
-{
- QStrList r;
- QStringList l = entryList(filterSpec,sortSpec);
- for ( QStringList::Iterator it = l.begin(); it != l.end(); ++it ) {
- r.append( QFile::encodeName(*it) );
- }
- return r;
-}
-
-/*!
- This function is included to easy porting from Qt 1.x to Qt 2.0,
- it is the same as entryList(), but encodes the filenames as 8-bit
- strings using QFile::encodedName().
-
- It is more efficient to use entryList().
-*/
-QStrList QDir::encodedEntryList( const QString &nameFilter,
- int filterSpec,
- int sortSpec ) const
-{
- QStrList r;
- QStringList l = entryList(nameFilter,filterSpec,sortSpec);
- for ( QStringList::Iterator it = l.begin(); it != l.end(); ++it ) {
- r.append( QFile::encodeName(*it) );
- }
- return r;
-}
-
-
-
-/*!
- Returns a list of the names of all files and directories in the directory
- indicated by the setSorting(), setFilter() and setNameFilter()
- specifications.
-
- The the filter and sorting specifications can be overridden using the
- \e filterSpec and \e sortSpec arguments.
-
- Returns an empty list if the directory is unreadable or does not exist.
-
- \sa entryInfoList(), setNameFilter(), setSorting(), setFilter(),
- encodedEntryList()
-*/
-
-QStringList QDir::entryList( int filterSpec, int sortSpec ) const
-{
- if ( !dirty && filterSpec == (int)DefaultFilter &&
- sortSpec == (int)DefaultSort )
- return *fList;
- return entryList( nameFilt, filterSpec, sortSpec );
-}
-
-/*!
- Returns a list of the names of all files and directories in the directory
- indicated by the setSorting(), setFilter() and setNameFilter()
- specifications.
-
- The the filter and sorting specifications can be overridden using the
- \e nameFilter, \e filterSpec and \e sortSpec arguments.
-
- Returns and empty list if the directory is unreadable or does not exist.
-
- \sa entryInfoList(), setNameFilter(), setSorting(), setFilter(),
- encodedEntryList()
-*/
-
-QStringList QDir::entryList( const QString &nameFilter,
- int filterSpec, int sortSpec ) const
-{
- if ( filterSpec == (int)DefaultFilter )
- filterSpec = filtS;
- if ( sortSpec == (int)DefaultSort )
- sortSpec = sortS;
- QDir *that = (QDir*)this; // mutable function
- if ( that->readDirEntries(nameFilter, filterSpec, sortSpec) )
- return *that->fList;
- else
- return QStringList();
-}
-
-/*!
- Returns a list of QFileInfo objects for all files and directories in
- the directory pointed to using the setSorting(), setFilter() and
- setNameFilter() specifications.
-
- The the filter and sorting specifications can be overridden using the
- \e filterSpec and \e sortSpec arguments.
-
- Returns 0 if the directory is unreadable or does not exist.
-
- The returned pointer is a const pointer to a QFileInfoList. The list is
- owned by the QDir object and will be reused on the next call to
- entryInfoList() for the same QDir instance. If you want to keep the
- entries of the list after a subsequent call to this function you will
- need to copy them.
-
- \sa entryList(), setNameFilter(), setSorting(), setFilter()
-*/
-
-const QFileInfoList *QDir::entryInfoList( int filterSpec, int sortSpec ) const
-{
- if ( !dirty && filterSpec == (int)DefaultFilter &&
- sortSpec == (int)DefaultSort )
- return fiList;
- return entryInfoList( nameFilt, filterSpec, sortSpec );
-}
-
-/*!
- Returns a list of QFileInfo objects for all files and directories in
- the directory pointed to using the setSorting(), setFilter() and
- setNameFilter() specifications.
-
- The the filter and sorting specifications can be overridden using the
- \e nameFilter, \e filterSpec and \e sortSpec arguments.
-
- Returns 0 if the directory is unreadable or does not exist.
-
- The returned pointer is a const pointer to a QFileInfoList. The list is
- owned by the QDir object and will be reused on the next call to
- entryInfoList() for the same QDir instance. If you want to keep the
- entries of the list after a subsequent call to this function you will
- need to copy them.
-
- \sa entryList(), setNameFilter(), setSorting(), setFilter()
-*/
-
-const QFileInfoList *QDir::entryInfoList( const QString &nameFilter,
- int filterSpec, int sortSpec ) const
-{
- if ( filterSpec == (int)DefaultFilter )
- filterSpec = filtS;
- if ( sortSpec == (int)DefaultSort )
- sortSpec = sortS;
- QDir *that = (QDir*)this; // mutable function
- if ( that->readDirEntries(nameFilter, filterSpec, sortSpec) )
- return that->fiList;
- else
- return 0;
-}
-
-/*!
- Returns TRUE if the directory exists. (If a file with the same
- name is found this function will of course return FALSE).
-
- \sa QFileInfo::exists(), QFile::exists()
-*/
-
-bool QDir::exists() const
-{
- QFileInfo fi( dPath );
- return fi.exists() && fi.isDir();
-}
-
-/*!
- Returns TRUE if the directory path is relative to the current directory,
- FALSE if the path is absolute (e.g. under UNIX a path is relative if it
- does not start with a '/').
-
- According to Einstein this function should always return TRUE.
-
- \sa convertToAbs()
-*/
-
-bool QDir::isRelative() const
-{
- return isRelativePath( dPath );
-}
-
-/*!
- Converts the directory path to an absolute path. If it is already
- absolute nothing is done.
-
- \sa isRelative()
-*/
-
-void QDir::convertToAbs()
-{
- dPath = absPath();
-}
-
-/*!
- Makes a copy of d and assigns it to this QDir.
-*/
-
-QDir &QDir::operator=( const QDir &d )
-{
- dPath = d.dPath;
- delete fList;
- fList = 0;
- delete fiList;
- fiList = 0;
- nameFilt = d.nameFilt;
- dirty = TRUE;
- allDirs = d.allDirs;
- filtS = d.filtS;
- sortS = d.sortS;
- return *this;
-}
-
-/*!
- Sets the directory path to be the given path.
-*/
-
-QDir &QDir::operator=( const QString &path )
-{
- dPath = cleanDirPath( path );
- dirty = TRUE;
- return *this;
-}
-
-
-/*!
- \fn bool QDir::operator!=( const QDir &d ) const
- Returns TRUE if the \e d and this dir have different path or
- different sort/filter settings, otherwise FALSE.
-*/
-
-/*!
- Returns TRUE if the \e d and this dir have the same path and all sort
- and filter settings are equal, otherwise FALSE.
-*/
-
-bool QDir::operator==( const QDir &d ) const
-{
- return dPath == d.dPath &&
- nameFilt == d.nameFilt &&
- allDirs == d.allDirs &&
- filtS == d.filtS &&
- sortS == d.sortS;
-}
-
-
-/*!
- Removes a file.
-
- If \e acceptAbsPath is TRUE a path starting with a separator ('/')
- will remove the file with the absolute path, if \e acceptAbsPath is FALSE
- any number of separators at the beginning of \e fileName will be removed.
-
- Returns TRUE if successful, otherwise FALSE.
-*/
-
-bool QDir::remove( const QString &fileName, bool acceptAbsPath )
-{
- if ( fileName.isEmpty() ) {
-#if defined(CHECK_NULL)
- qWarning( "QDir::remove: Empty or null file name" );
-#endif
- return FALSE;
- }
- QString p = filePath( fileName, acceptAbsPath );
- return QFile::remove( p );
-}
-
-/*!
- Checks for existence of a file.
-
- If \e acceptAbsPaths is TRUE a path starting with a separator ('/')
- will check the file with the absolute path, if \e acceptAbsPath is FALSE
- any number of separators at the beginning of \e name will be removed.
-
- Returns TRUE if the file exists, otherwise FALSE.
-
- \sa QFileInfo::exists(), QFile::exists()
-*/
-
-bool QDir::exists( const QString &name, bool acceptAbsPath )
-{
- if ( name.isEmpty() ) {
-#if defined(CHECK_NULL)
- qWarning( "QDir::exists: Empty or null file name" );
-#endif
- return FALSE;
- }
- QString tmp = filePath( name, acceptAbsPath );
- return QFile::exists( tmp );
-}
-
-/*!
- Returns the native directory separator; '/' under UNIX and '\' under
- MS-DOS, Windows NT and OS/2.
-
- You do not need to use this function to build file paths. If you always
- use '/', Qt will translate your paths to conform to the underlying
- operating system.
-*/
-
-char QDir::separator()
-{
-#if defined(_OS_UNIX_)
- return '/';
-#elif defined (_OS_FATFS_)
- return '\\';
-#elif defined (_OS_MAC_)
- return ':';
-#else
- return '/';
-#endif
-}
-
-/*!
- Returns the current directory.
- \sa currentDirPath(), QDir::QDir()
-*/
-
-QDir QDir::current()
-{
- return QDir( currentDirPath() );
-}
-
-/*!
- Returns the home directory.
- \sa homeDirPath()
-*/
-
-QDir QDir::home()
-{
- return QDir( homeDirPath() );
-}
-
-/*!
- Returns the root directory.
- \sa rootDirPath() drives()
-*/
-
-QDir QDir::root()
-{
- return QDir( rootDirPath() );
-}
-
-/*!
- \fn QString QDir::homeDirPath()
-
- Returns the absolute path for the user's home directory,
- \sa home()
-*/
-
-QStringList qt_makeFilterList( const QString &filter )
-{
- if ( filter.isEmpty() )
- return QStringList();
-
- QChar sep( ';' );
- int i = filter.find( sep, 0 );
- if ( i == -1 && filter.find( ' ', 0 ) != -1 )
- sep = QChar( ' ' );
-
- QStringList lst = QStringList::split( sep, filter );
- QStringList lst2;
- QStringList::Iterator it = lst.begin();
-
- for ( ; it != lst.end(); ++it ) {
- QString s = *it;
- lst2 << s.stripWhiteSpace();
- }
- return lst2;
-}
-
-/*!
- Returns TRUE if the \e fileName matches one of the wildcards in the list \e filters.
- \sa QRegExp
-*/
-
-bool QDir::match( const QStringList &filters, const QString &fileName )
-{
- QStringList::ConstIterator sit = filters.begin();
- bool matched = FALSE;
- for ( ; sit != filters.end(); ++sit ) {
- QRegExp regexp( *sit, FALSE, TRUE );
- if ( regexp.match( fileName ) != -1 ) {
- matched = TRUE;
- break;
- }
- }
-
- return matched;
-}
-
-/*!
- Returns TRUE if the \e fileName matches the wildcard \e filter.
- \a Filter may also contain multiple wildcards separated by spaces or
- semicolons.
- \sa QRegExp
-*/
-
-bool QDir::match( const QString &filter, const QString &fileName )
-{
- QStringList lst = qt_makeFilterList( filter );
- return match( lst, fileName );
-}
-
-
-/*!
- Removes all multiple directory separators ('/') and resolves
- any "." or ".." found in the path.
-
- Symbolic links are kept. This function does not return the
- canonical path, but rather the most simplified version of the input.
- "../stuff" becomes "stuff", "stuff/../nonsense" becomes "nonsense"
- and "\\stuff\\more\\..\\nonsense" becomes "\\stuff\\nonsense".
-
- \sa absPath() canonicalPath()
-*/
-
-QString QDir::cleanDirPath( const QString &filePath )
-{
- QString name = filePath;
- QString newPath;
-
- if ( name.isEmpty() )
- return name;
-
- slashify( name );
-
- bool addedSeparator;
- if ( isRelativePath(name) ) {
- addedSeparator = TRUE;
- name.insert( 0, '/' );
- } else {
- addedSeparator = FALSE;
- }
-
- int ePos, pos, upLevel;
-
- pos = ePos = name.length();
- upLevel = 0;
- int len;
-
- while ( pos && (pos = name.findRev('/',--pos)) != -1 ) {
- len = ePos - pos - 1;
- if ( len == 2 && name.at(pos + 1) == '.'
- && name.at(pos + 2) == '.' ) {
- upLevel++;
- } else {
- if ( len != 0 && (len != 1 || name.at(pos + 1) != '.') ) {
- if ( !upLevel )
- newPath = QString::fromLatin1("/")
- + name.mid(pos + 1, len) + newPath;
- else
- upLevel--;
- }
- }
- ePos = pos;
- }
- if ( addedSeparator ) {
- while ( upLevel-- )
- newPath.insert( 0, QString::fromLatin1("/..") );
- if ( !newPath.isEmpty() )
- newPath.remove( 0, 1 );
- else
- newPath = QString::fromLatin1(".");
- } else {
- if ( newPath.isEmpty() )
- newPath = QString::fromLatin1("/");
-#if defined(_OS_FATFS_) || defined(_OS_OS2EMX_)
- if ( name[0] == '/' ) {
- if ( name[1] == '/' ) // "\\machine\x\ ..."
- newPath.insert( 0, '/' );
- } else {
- newPath = name.left(2) + newPath;
- }
-#endif
- }
- return newPath;
-}
-
-int qt_cmp_si_sortSpec;
-
-#if defined(Q_C_CALLBACKS)
-extern "C" {
-#endif
-
-int qt_cmp_si( const void *n1, const void *n2 )
-{
- if ( !n1 || !n2 )
- return 0;
-
- QDirSortItem* f1 = (QDirSortItem*)n1;
- QDirSortItem* f2 = (QDirSortItem*)n2;
-
- if ( qt_cmp_si_sortSpec & QDir::DirsFirst )
- if ( f1->item->isDir() != f2->item->isDir() )
- return f1->item->isDir() ? -1 : 1;
-
- int r = 0;
- int sortBy = qt_cmp_si_sortSpec & QDir::SortByMask;
-
- switch ( sortBy ) {
- case QDir::Time:
- r = f1->item->lastModified().secsTo(f2->item->lastModified());
- break;
- case QDir::Size:
- r = f2->item->size() - f1->item->size();
- break;
- default:
- ;
- }
-
- if ( r == 0 && sortBy != QDir::Unsorted ) {
- // Still not sorted - sort by name
- bool ic = qt_cmp_si_sortSpec & QDir::IgnoreCase;
-
- if ( f1->filename_cache.isNull() )
- f1->filename_cache = ic ? f1->item->fileName().lower()
- : f1->item->fileName();
- if ( f2->filename_cache.isNull() )
- f2->filename_cache = ic ? f2->item->fileName().lower()
- : f2->item->fileName();
-
- r = f1->filename_cache.compare(f2->filename_cache);
- }
-
- if ( r == 0 ) {
- // Enforce an order - the order the items appear in the array
- r = (char*)n1 - (char*)n2;
- }
-
- if ( qt_cmp_si_sortSpec & QDir::Reversed )
- return -r;
- else
- return r;
-}
-
-#if defined(Q_C_CALLBACKS)
-}
-#endif
-
-#endif // QT_NO_DIR
diff --git a/qtools/qdir.h b/qtools/qdir.h
deleted file mode 100644
index dd74271..0000000
--- a/qtools/qdir.h
+++ /dev/null
@@ -1,235 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QDir class
-**
-** Created : 950427
-**
-** 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 QDIR_H
-#define QDIR_H
-
-#ifndef QT_H
-#include "qstrlist.h"
-#include "qfileinfo.h"
-#endif // QT_H
-
-#ifndef QT_NO_DIR
-typedef QList<QFileInfo> QFileInfoList;
-typedef QListIterator<QFileInfo> QFileInfoListIterator;
-class QStringList;
-
-
-class Q_EXPORT QDir
-{
-public:
- enum FilterSpec { Dirs = 0x001,
- Files = 0x002,
- Drives = 0x004,
- NoSymLinks = 0x008,
- All = 0x007,
- TypeMask = 0x00F,
-
- Readable = 0x010,
- Writable = 0x020,
- Executable = 0x040,
- RWEMask = 0x070,
-
- Modified = 0x080,
- Hidden = 0x100,
- System = 0x200,
- AccessMask = 0x3F0,
-
- DefaultFilter = -1 };
-
- enum SortSpec { Name = 0x00,
- Time = 0x01,
- Size = 0x02,
- Unsorted = 0x03,
- SortByMask = 0x03,
-
- DirsFirst = 0x04,
- Reversed = 0x08,
- IgnoreCase = 0x10,
- DefaultSort = -1 };
-
- QDir();
- QDir( const QString &path, const QString &nameFilter = QString::null,
- int sortSpec = Name | IgnoreCase, int filterSpec = All );
- QDir( const QDir & );
-
- virtual ~QDir();
-
- QDir &operator=( const QDir & );
- QDir &operator=( const QString &path );
-
- virtual void setPath( const QString &path );
- virtual QString path() const;
- virtual QString absPath() const;
- virtual QString canonicalPath() const;
-
- virtual QString dirName() const;
- virtual QString filePath( const QString &fileName,
- bool acceptAbsPath = TRUE ) const;
- virtual QString absFilePath( const QString &fileName,
- bool acceptAbsPath = TRUE ) const;
-
- static QString convertSeparators( const QString &pathName );
-
- virtual bool cd( const QString &dirName, bool acceptAbsPath = TRUE );
- virtual bool cdUp();
-
- QString nameFilter() const;
- virtual void setNameFilter( const QString &nameFilter );
- FilterSpec filter() const;
- virtual void setFilter( int filterSpec );
- SortSpec sorting() const;
- virtual void setSorting( int sortSpec );
-
- bool matchAllDirs() const;
- virtual void setMatchAllDirs( bool );
-
- uint count() const;
- QString operator[]( int ) const;
-
- virtual QStrList encodedEntryList( int filterSpec = DefaultFilter,
- int sortSpec = DefaultSort ) const;
- virtual QStrList encodedEntryList( const QString &nameFilter,
- int filterSpec = DefaultFilter,
- int sortSpec = DefaultSort ) const;
- virtual QStringList entryList( int filterSpec = DefaultFilter,
- int sortSpec = DefaultSort ) const;
- virtual QStringList entryList( const QString &nameFilter,
- int filterSpec = DefaultFilter,
- int sortSpec = DefaultSort ) const;
-
- virtual const QFileInfoList *entryInfoList( int filterSpec = DefaultFilter,
- int sortSpec = DefaultSort ) const;
- virtual const QFileInfoList *entryInfoList( const QString &nameFilter,
- int filterSpec = DefaultFilter,
- int sortSpec = DefaultSort ) const;
-
- static const QFileInfoList *drives();
-
- virtual bool mkdir( const QString &dirName,
- bool acceptAbsPath = TRUE ) const;
- virtual bool rmdir( const QString &dirName,
- bool acceptAbsPath = TRUE ) const;
-
- virtual bool isReadable() const;
- virtual bool exists() const;
- virtual bool isRoot() const;
-
- virtual bool isRelative() const;
- virtual void convertToAbs();
-
- virtual bool operator==( const QDir & ) const;
- virtual bool operator!=( const QDir & ) const;
-
- virtual bool remove( const QString &fileName,
- bool acceptAbsPath = TRUE );
- virtual bool rename( const QString &name, const QString &newName,
- bool acceptAbsPaths = TRUE );
- virtual bool exists( const QString &name,
- bool acceptAbsPath = TRUE );
-
- static char separator();
-
- static bool setCurrent( const QString &path );
- static QDir current();
- static QDir home();
- static QDir root();
- static QString currentDirPath();
- static QString homeDirPath();
- static QString rootDirPath();
-
- static bool match( const QStringList &filters, const QString &fileName );
- static bool match( const QString &filter, const QString &fileName );
- static QString cleanDirPath( const QString &dirPath );
- static bool isRelativePath( const QString &path );
-
-private:
- void init();
- virtual bool readDirEntries( const QString &nameFilter,
- int FilterSpec, int SortSpec );
-
- static void slashify ( QString &);
-
- QString dPath;
- QStringList *fList;
- QFileInfoList *fiList;
- QString nameFilt;
- FilterSpec filtS;
- SortSpec sortS;
- uint dirty : 1;
- uint allDirs : 1;
-};
-
-
-inline QString QDir::path() const
-{
- return dPath;
-}
-
-inline QString QDir::nameFilter() const
-{
- return nameFilt;
-}
-
-inline QDir::FilterSpec QDir::filter() const
-{
- return filtS;
-}
-
-inline QDir::SortSpec QDir::sorting() const
-{
- return sortS;
-}
-
-inline bool QDir::matchAllDirs() const
-{
- return allDirs;
-}
-
-inline bool QDir::operator!=( const QDir &d ) const
-{
- return !(*this == d);
-}
-
-
-struct QDirSortItem {
- QString filename_cache;
- QFileInfo* item;
-};
-
-#endif // QT_NO_DIR
-#endif // QDIR_H
diff --git a/qtools/qdir_unix.cpp b/qtools/qdir_unix.cpp
deleted file mode 100644
index 46a3b69..0000000
--- a/qtools/qdir_unix.cpp
+++ /dev/null
@@ -1,288 +0,0 @@
-/****************************************************************************
-**
-**
-** Implementation of QDirclass
-**
-** Created : 950628
-**
-** 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 for Unix/X11 or for Qt/Embedded 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 "qglobal.h"
-
-#include "qdir.h"
-#ifndef QT_NO_DIR
-
-#include "qfileinfo.h"
-#include "qfiledefs_p.h"
-#include "qregexp.h"
-#include "qstringlist.h"
-#include <stdlib.h>
-#include <ctype.h>
-
-extern QStringList qt_makeFilterList( const QString &filter );
-
-extern int qt_cmp_si_sortSpec;
-
-#if defined(Q_C_CALLBACKS)
-extern "C" {
-#endif
-
-extern int qt_cmp_si( const void *, const void * );
-
-#if defined(Q_C_CALLBACKS)
-}
-#endif
-
-
-void QDir::slashify( QString& )
-{
-}
-
-QString QDir::homeDirPath()
-{
- QString d;
- d = QFile::decodeName(getenv("HOME"));
- slashify( d );
- if ( d.isNull() )
- d = rootDirPath();
- return d;
-}
-
-QString QDir::canonicalPath() const
-{
- QString r;
-
- char cur[PATH_MAX];
- char tmp[PATH_MAX];
- GETCWD( cur, PATH_MAX );
- if ( CHDIR(QFile::encodeName(dPath)) >= 0 ) {
- GETCWD( tmp, PATH_MAX );
- r = QFile::decodeName(tmp);
- }
- CHDIR( cur );
-
- slashify( r );
- return r;
-}
-
-bool QDir::mkdir( const QString &dirName, bool acceptAbsPath ) const
-{
- return MKDIR( QFile::encodeName(filePath(dirName,acceptAbsPath)), 0777 )
- == 0;
-}
-
-bool QDir::rmdir( const QString &dirName, bool acceptAbsPath ) const
-{
- return RMDIR( QFile::encodeName(filePath(dirName,acceptAbsPath)) ) == 0;
-}
-
-bool QDir::isReadable() const
-{
- return ACCESS( QFile::encodeName(dPath), R_OK | X_OK ) == 0;
-}
-
-bool QDir::isRoot() const
-{
- return dPath == QString::fromLatin1("/");
-}
-
-bool QDir::rename( const QString &name, const QString &newName,
- bool acceptAbsPaths )
-{
- if ( name.isEmpty() || newName.isEmpty() ) {
-#if defined(CHECK_NULL)
- qWarning( "QDir::rename: Empty or null file name(s)" );
-#endif
- return FALSE;
- }
- QString fn1 = filePath( name, acceptAbsPaths );
- QString fn2 = filePath( newName, acceptAbsPaths );
- return ::rename( QFile::encodeName(fn1),
- QFile::encodeName(fn2) ) == 0;
-}
-
-bool QDir::setCurrent( const QString &path )
-{
- int r;
- r = CHDIR( QFile::encodeName(path) );
- return r >= 0;
-}
-
-QString QDir::currentDirPath()
-{
- QString result;
-
- STATBUF st;
- if ( STAT( ".", &st ) == 0 ) {
- char currentName[PATH_MAX];
- if ( GETCWD( currentName, PATH_MAX ) != 0 )
- result = QFile::decodeName(currentName);
-#if defined(DEBUG)
- if ( result.isNull() )
- qWarning( "QDir::currentDirPath: getcwd() failed" );
-#endif
- } else {
-#if defined(DEBUG)
- qWarning( "QDir::currentDirPath: stat(\".\") failed" );
-#endif
- }
- slashify( result );
- return result;
-}
-
-QString QDir::rootDirPath()
-{
- QString d = QString::fromLatin1( "/" );
- return d;
-}
-
-bool QDir::isRelativePath( const QString &path )
-{
- int len = path.length();
- if ( len == 0 )
- return TRUE;
- return path[0] != '/';
-}
-
-bool QDir::readDirEntries( const QString &nameFilter,
- int filterSpec, int sortSpec )
-{
- int i;
- if ( !fList ) {
- fList = new QStringList;
- CHECK_PTR( fList );
- fiList = new QFileInfoList;
- CHECK_PTR( fiList );
- fiList->setAutoDelete( TRUE );
- } else {
- fList->clear();
- fiList->clear();
- }
-
- QStringList filters = qt_makeFilterList( nameFilter );
-
- bool doDirs = (filterSpec & Dirs) != 0;
- bool doFiles = (filterSpec & Files) != 0;
- bool noSymLinks = (filterSpec & NoSymLinks) != 0;
- bool doReadable = (filterSpec & Readable) != 0;
- bool doWritable = (filterSpec & Writable) != 0;
- bool doExecable = (filterSpec & Executable) != 0;
- bool doHidden = (filterSpec & Hidden) != 0;
-
-#if defined(_OS_OS2EMX_)
- //QRegExp wc( nameFilter, FALSE, TRUE ); // wild card, case insensitive
-#else
- //QRegExp wc( nameFilter, TRUE, TRUE ); // wild card, case sensitive
-#endif
- QFileInfo fi;
- DIR *dir;
- dirent *file;
-
- dir = opendir( QFile::encodeName(dPath) );
- if ( !dir ) {
-#if defined(CHECK_NULL)
- qWarning( "QDir::readDirEntries: Cannot read the directory: %s",
- QFile::encodeName(dPath).data() );
-#endif
- return FALSE;
- }
-
- while ( (file = readdir(dir)) ) {
- QString fn = QFile::decodeName(file->d_name);
- fi.setFile( *this, fn );
- if ( !match( filters, fn ) && !(allDirs && fi.isDir()) )
- continue;
- if ( (doDirs && fi.isDir()) || (doFiles && fi.isFile()) ) {
- if ( noSymLinks && fi.isSymLink() )
- continue;
- if ( (filterSpec & RWEMask) != 0 )
- if ( (doReadable && !fi.isReadable()) ||
- (doWritable && !fi.isWritable()) ||
- (doExecable && !fi.isExecutable()) )
- continue;
- if ( !doHidden && fn[0] == '.' &&
- fn != QString::fromLatin1(".")
- && fn != QString::fromLatin1("..") )
- continue;
- fiList->append( new QFileInfo( fi ) );
- }
- }
- if ( closedir(dir) != 0 ) {
-#if defined(CHECK_NULL)
- qWarning( "QDir::readDirEntries: Cannot close the directory: %s",
- dPath.local8Bit().data() );
-#endif
- }
-
- // Sort...
- if(fiList->count()) {
- QDirSortItem* si= new QDirSortItem[fiList->count()];
- QFileInfo* itm;
- i=0;
- for (itm = fiList->first(); itm; itm = fiList->next())
- si[i++].item = itm;
- qt_cmp_si_sortSpec = sortSpec;
- qsort( si, i, sizeof(si[0]), qt_cmp_si );
- // put them back in the list
- fiList->setAutoDelete( FALSE );
- fiList->clear();
- int j;
- for ( j=0; j<i; j++ ) {
- fiList->append( si[j].item );
- fList->append( si[j].item->fileName() );
- }
- delete [] si;
- fiList->setAutoDelete( TRUE );
- }
-
- if ( filterSpec == (FilterSpec)filtS && sortSpec == (SortSpec)sortS &&
- nameFilter == nameFilt )
- dirty = FALSE;
- else
- dirty = TRUE;
- return TRUE;
-}
-
-const QFileInfoList * QDir::drives()
-{
- // at most one instance of QFileInfoList is leaked, and this variable
- // points to that list
- static QFileInfoList * knownMemoryLeak = 0;
-
- if ( !knownMemoryLeak ) {
- knownMemoryLeak = new QFileInfoList;
- // non-win32 versions both use just one root directory
- knownMemoryLeak->append( new QFileInfo( rootDirPath() ) );
- }
-
- return knownMemoryLeak;
-}
-#endif //QT_NO_DIR
diff --git a/qtools/qdir_win32.cpp b/qtools/qdir_win32.cpp
deleted file mode 100644
index b1eee66..0000000
--- a/qtools/qdir_win32.cpp
+++ /dev/null
@@ -1,406 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2001 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- * Based on qdir_unix.cpp
- *
- * Copyright (C) 1992-2000 Trolltech AS.
- */
-
-
-#include "qglobal.h"
-
-#include "qdir.h"
-#ifndef QT_NO_DIR
-
-
-#include "qfileinfo.h"
-#include "qfiledefs_p.h"
-#include "qregexp.h"
-#include "qstringlist.h"
-#include <stdlib.h>
-#include <ctype.h>
-#if defined(_OS_WIN32_)
-#if defined(_CC_BOOL_DEF_)
-#undef bool
-#include <windows.h>
-#define bool int
-#else
-#include <windows.h>
-#endif
-#endif
-#if defined(_OS_OS2EMX_)
-extern Q_UINT32 DosQueryCurrentDisk(Q_UINT32*,Q_UINT32*);
-#define NO_ERROR 0
-#endif
-
-extern QStringList qt_makeFilterList( const QString &filter );
-
-extern int qt_cmp_si_sortSpec;
-
-#if defined(Q_C_CALLBACKS)
-extern "C" {
-#endif
-
-extern int qt_cmp_si( const void *, const void * );
-
-#if defined(Q_C_CALLBACKS)
-}
-#endif
-
-
-void QDir::slashify( QString& n )
-{
- for ( int i=0; i<(int)n.length(); i++ )
- {
- if ( n[i] == '\\' )
- n[i] = '/';
- }
-}
-
-QString QDir::homeDirPath()
-{
- QString d;
- d = QFile::decodeName(getenv("HOME"));
- slashify( d );
- if ( d.isNull() )
- d = rootDirPath();
- return d;
-}
-
-QString QDir::canonicalPath() const
-{
- QString r;
-
- char cur[PATH_MAX];
- char tmp[PATH_MAX];
- GETCWD( cur, PATH_MAX );
- if ( CHDIR(QFile::encodeName(dPath)) >= 0 ) {
- GETCWD( tmp, PATH_MAX );
- r = QFile::decodeName(tmp);
- }
- CHDIR( cur );
-
- slashify( r );
- return r;
-}
-
-bool QDir::mkdir( const QString &dirName, bool acceptAbsPath ) const
-{
-#if defined(__CYGWIN32_)
- return MKDIR( QFile::encodeName(filePath(dirName,acceptAbsPath)), 0777 )
- == 0;
-#else
- return MKDIR( QFile::encodeName(filePath(dirName,acceptAbsPath)) ) == 0;
-
-#endif
-}
-
-bool QDir::rmdir( const QString &dirName, bool acceptAbsPath ) const
-{
- return RMDIR( QFile::encodeName(filePath(dirName,acceptAbsPath)) ) == 0;
-}
-
-bool QDir::isReadable() const
-{
- return ACCESS( QFile::encodeName(dPath), R_OK ) == 0;
-}
-
-bool QDir::isRoot() const
-{
- return dPath == QString::fromLatin1("/");
-}
-
-bool QDir::rename( const QString &name, const QString &newName,
- bool acceptAbsPaths )
-{
- if ( name.isEmpty() || newName.isEmpty() ) {
-#if defined(CHECK_NULL)
- qWarning( "QDir::rename: Empty or null file name(s)" );
-#endif
- return FALSE;
- }
- QString fn1 = filePath( name, acceptAbsPaths );
- QString fn2 = filePath( newName, acceptAbsPaths );
- return ::rename( QFile::encodeName(fn1),
- QFile::encodeName(fn2) ) == 0;
-}
-
-bool QDir::setCurrent( const QString &path )
-{
- int r;
- r = CHDIR( QFile::encodeName(path) );
- return r >= 0;
-}
-
-QString QDir::currentDirPath()
-{
- QString result;
-
- STATBUF st;
- if ( STAT( ".", &st ) == 0 ) {
- char currentName[PATH_MAX];
- if ( GETCWD( currentName, PATH_MAX ) != 0 )
- result = QFile::decodeName(currentName);
-#if defined(DEBUG)
- if ( result.isNull() )
- qWarning( "QDir::currentDirPath: getcwd() failed" );
-#endif
- } else {
-#if defined(DEBUG)
- qWarning( "QDir::currentDirPath: stat(\".\") failed" );
-#endif
- }
- slashify( result );
- return result;
-}
-
-QString QDir::rootDirPath()
-{
- QString d = QString::fromLatin1( "/" );
- return d;
-}
-
-bool QDir::isRelativePath( const QString &path )
-{
- int len = path.length();
- if ( len == 0 )
- return TRUE;
- int i = 0;
- if ( isalpha(path[0]) && path[1] == ':' ) // drive, e.g. a:
- i = 2;
- return path[i] != '/' && path[i] != '\\';
-}
-
-#undef IS_SUBDIR
-#undef IS_RDONLY
-#undef IS_ARCH
-#undef IS_HIDDEN
-#undef IS_SYSTEM
-#undef FF_GETFIRST
-#undef FF_GETNEXT
-#undef FF_ERROR
-
-#if defined(_OS_WIN32_)
-#define IS_SUBDIR FILE_ATTRIBUTE_DIRECTORY
-#define IS_RDONLY FILE_ATTRIBUTE_READONLY
-#define IS_ARCH FILE_ATTRIBUTE_ARCHIVE
-#define IS_HIDDEN FILE_ATTRIBUTE_HIDDEN
-#define IS_SYSTEM FILE_ATTRIBUTE_SYSTEM
-#define FF_GETFIRST FindFirstFile
-#define FF_GETNEXT FindNextFile
-#define FF_ERROR INVALID_HANDLE_VALUE
-#else
-#define IS_SUBDIR _A_SUBDIR
-#define IS_RDONLY _A_RDONLY
-#define IS_ARCH _A_ARCH
-#define IS_HIDDEN _A_HIDDEN
-#define IS_SYSTEM _A_SYSTEM
-#define FF_GETFIRST _findfirst
-#define FF_GETNEXT _findnext
-#define FF_ERROR -1
-#endif
-
-
-bool QDir::readDirEntries( const QString &nameFilter,
- int filterSpec, int sortSpec )
-{
- int i;
- if ( !fList ) {
- fList = new QStringList;
- CHECK_PTR( fList );
- fiList = new QFileInfoList;
- CHECK_PTR( fiList );
- fiList->setAutoDelete( TRUE );
- } else {
- fList->clear();
- fiList->clear();
- }
-
- QStringList filters = qt_makeFilterList( nameFilter );
-
- bool doDirs = (filterSpec & Dirs) != 0;
- bool doFiles = (filterSpec & Files) != 0;
- bool noSymLinks = (filterSpec & NoSymLinks) != 0;
- bool doReadable = (filterSpec & Readable) != 0;
- bool doWritable = (filterSpec & Writable) != 0;
- bool doExecable = (filterSpec & Executable) != 0;
- bool doHidden = (filterSpec & Hidden) != 0;
- // show hidden files if the user asks explicitly for e.g. .*
- if ( !doHidden && !nameFilter.isEmpty() && nameFilter[0] == '.' )
- doHidden = TRUE;
- bool doModified = (filterSpec & Modified) != 0;
- bool doSystem = (filterSpec & System) != 0;
-
- QRegExp wc( nameFilter, FALSE, TRUE ); // wild card, case insensitive
- bool first = TRUE;
- QString p = dPath.copy();
- int plen = p.length();
-#if defined(_OS_WIN32_)
- HANDLE ff;
- WIN32_FIND_DATA finfo;
-#else
- long ff;
- _finddata_t finfo;
-#endif
- QFileInfo fi;
- if ( plen == 0 )
- {
-#if defined(CHECK_NULL)
- warning( "QDir::readDirEntries: No directory name specified" );
-#endif
- return FALSE;
- }
- if ( p.at(plen-1) != '/' && p.at(plen-1) != '\\' )
- p += '/';
- p += "*.*";
-
- ff = FF_GETFIRST( p.data(), &finfo );
- if ( ff == FF_ERROR )
- {
-#if defined(DEBUG)
- warning( "QDir::readDirEntries: Cannot read the directory: %s",
- (const char *)dPath );
-#endif
- return FALSE;
- }
-
- while ( TRUE )
- {
- if ( first )
- first = FALSE;
- else
- {
-#if defined(_OS_WIN32_)
- if ( !FF_GETNEXT(ff,&finfo) )
- break;
-#else
- if ( FF_GETNEXT(ff,&finfo) == -1 )
- break;
-#endif
- }
-#if defined(_OS_WIN32_)
- int attrib = finfo.dwFileAttributes;
-#else
- int attrib = finfo.attrib;
-#endif
- bool isDir = (attrib & IS_SUBDIR) != 0;
- bool isFile = !isDir;
- bool isSymLink = FALSE;
- bool isReadable = TRUE;
- bool isWritable = (attrib & IS_RDONLY) == 0;
- bool isExecable = FALSE;
- bool isModified = (attrib & IS_ARCH) != 0;
- bool isHidden = (attrib & IS_HIDDEN) != 0;
- bool isSystem = (attrib & IS_SYSTEM) != 0;
-
-#if defined(_OS_WIN32_)
- const char *fname = finfo.cFileName;
-#else
- const char *fname = finfo.name;
-#endif
- if ( wc.match(fname) == -1 && !(allDirs && isDir) )
- continue;
-
- QString name = fname;
- if ( doExecable )
- {
- QString ext = name.right(4).lower();
- if ( ext == ".exe" || ext == ".com" || ext == ".bat" ||
- ext == ".pif" || ext == ".cmd" )
- isExecable = TRUE;
- }
-
- if ( (doDirs && isDir) || (doFiles && isFile) )
- {
- if ( noSymLinks && isSymLink )
- continue;
- if ( (filterSpec & RWEMask) != 0 )
- if ( (doReadable && !isReadable) ||
- (doWritable && !isWritable) ||
- (doExecable && !isExecable) )
- continue;
- if ( doModified && !isModified )
- continue;
- if ( !doHidden && isHidden )
- continue;
- if ( !doSystem && isSystem )
- continue;
- fi.setFile( *this, name );
- fiList->append( new QFileInfo( fi ) );
- }
- }
-#if defined(_OS_WIN32_)
- FindClose( ff );
-#else
- _findclose( ff );
-#endif
-
- // Sort...
- QDirSortItem* si= new QDirSortItem[fiList->count()];
- QFileInfo* itm;
- i=0;
- for (itm = fiList->first(); itm; itm = fiList->next())
- si[i++].item = itm;
- qt_cmp_si_sortSpec = sortSpec;
- qsort( si, i, sizeof(si[0]), qt_cmp_si );
- // put them back in the list
- fiList->setAutoDelete( FALSE );
- fiList->clear();
- int j;
- for ( j=0; j<i; j++ ) {
- fiList->append( si[j].item );
- fList->append( si[j].item->fileName() );
- }
- delete [] si;
- fiList->setAutoDelete( TRUE );
-
- if ( filterSpec == (FilterSpec)filtS && sortSpec == (SortSpec)sortS &&
- nameFilter == nameFilt )
- dirty = FALSE;
- else
- dirty = TRUE;
- return TRUE;
-}
-
-const QFileInfoList * QDir::drives()
-{
- // at most one instance of QFileInfoList is leaked, and this variable
- // points to that list
- static QFileInfoList * knownMemoryLeak = 0;
-
- if ( !knownMemoryLeak ) {
- knownMemoryLeak = new QFileInfoList;
-
-#if defined(_OS_WIN32_)
- Q_UINT32 driveBits = (Q_UINT32) GetLogicalDrives() & 0x3ffffff;
-#elif defined(_OS_OS2EMX_)
- Q_UINT32 driveBits, cur;
- if (DosQueryCurrentDisk(&cur,&driveBits) != NO_ERROR)
- exit(1);
- driveBits &= 0x3ffffff;
-#endif
- char driveName[4];
- qstrcpy( driveName, "a:/" );
- while( driveBits ) {
- if ( driveBits & 1 )
- knownMemoryLeak->append( new QFileInfo( driveName ) );
- driveName[0]++;
- driveBits = driveBits >> 1;
- }
- }
-
- return knownMemoryLeak;
-}
-#endif //QT_NO_DIR
diff --git a/qtools/qfeatures.h b/qtools/qfeatures.h
deleted file mode 100644
index 84fa715..0000000
--- a/qtools/qfeatures.h
+++ /dev/null
@@ -1,978 +0,0 @@
-/****************************************************************************
-**
-**
-** Global feature selection
-**
-** Created : 000417
-**
-** Copyright (C) 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 QFEATURES_H
-#define QFEATURES_H
-
-/*! \page features....html
- ...
-*/
-
-// Qt ships with a number of pre-defined configurations. If none suit
-// your needs, define QCONFIG_LOCAL and create a "qconfig-local.h" file.
-//
-// Note that disabling some features will produce a libqt that is not
-// compatible with other libqt builds. Such modifications are only
-// supported on Qt/Embedded where reducing the library size is important
-// and where the application-suite is often a fixed set.
-//
-#if defined(QCONFIG_LOCAL)
-#include <qconfig-local.h>
-#elif defined(QCONFIG_MINIMAL)
-#include <qconfig-minimal.h>
-#elif defined(QCONFIG_SMALL)
-#include <qconfig-small.h>
-#elif defined(QCONFIG_MEDIUM)
-#include <qconfig-medium.h>
-#elif defined(QCONFIG_LARGE)
-#include <qconfig-large.h>
-#else // everything...
-#include <qconfig.h>
-#endif
-
-
-// Data structures
-/*!
- QStringList
-*/
-//#define QT_NO_STRINGLIST
-
-#if defined(QT_NO_IMAGE_SMOOTHSCALE)
-/*!
- QIconSet
-*/
-# define QT_NO_ICONSET
-#endif
-
-// File I/O
-#if defined(QT_NO_STRINGLIST)
- /*!
- QDir
- */
-# define QT_NO_DIR
-#endif
-
-/*!
- Palettes
-*/
-//#define QT_NO_PALETTE
-
-/*!
- QTextStream
-*/
-//#define QT_NO_TEXTSTREAM
-/*!
- QDataStream
-*/
-//#define QT_NO_DATASTREAM
-
-/*!
- Dynamic module linking
-*/
-//#define QT_NO_PLUGIN
-
-
-// Images
-/*!
- BMP image I/O
- <p>The Windows Bitmap (BMP) image format is common on MS-Windows.
- <p>This is an uncompressed image format
- offering few advantages over PNG or JPEG.
-*/
-#if defined(QT_NO_DATASTREAM)
-# define QT_NO_IMAGEIO_BMP
-#endif
-/*!
- PPM image I/O
- <p>The Portable PixMap (PPM) image format is common on Unix.
- <p>This is an uncompressed image format
- offering few advantages over PNG or JPEG.
-*/
-//#define QT_NO_IMAGEIO_PPM
-/*!
- XBM image I/O
- <p>The X11 BitMap (XBM) image format is common on X11.
- <p>This is an uncompressed monochrome image format.
- Qt uses this format for some internal images (eg. mouse cursors).
-*/
-//#define QT_NO_IMAGEIO_XBM
-/*!
- XPM image I/O
- <p>The X11 PixMap (XPM) image format is common on X11.
- <p>This is an uncompressed image format.
- XPM images have the small advantage that they can be trivially
- included in source files as they are C code.
- Qt uses this format for some internal images (eg. QMessageBox icons).
-*/
-#if defined(QT_NO_TEXTSTREAM)
-# define QT_NO_IMAGEIO_XPM
-#endif
-/*!
- PNG image I/O
- <p>The Portable Network Graphics (PNG) is a compressed image format.
- <p>See <a href=http://www.libpng.org/pub/png/>The PNG Home Site</a> for
- details of the format.
-*/
-//#define QT_NO_IMAGEIO_PNG
-/*!
- MNG image I/O
- <p>The Multiple-image Network Graphics (MNG) is a compressed animation format.
- <p>See <a href=http://www.libpng.org/pub/mng/>The MNG Home Site</a> for
- details of the format.
-*/
-//#define QT_NO_IMAGEIO_MNG
-/*!
- JPEG image I/O
- <p>The Joint Photographic Experts Group (JPEG) is a compressed lossy image format that gives high compression
- for real-world and photo-realistic images.
-*/
-//#define QT_NO_IMAGEIO_JPEG
-
-/*!
- Asynchronous I/O
- <p>Allows push-driven data processing.
-*/
-//#define QT_NO_ASYNC_IO
-/*!
- Asynchronous image I/O
- <p>Allows push-driven images.
-*/
-//#define QT_NO_ASYNC_IMAGE_IO
-#if defined(QT_NO_ASYNC_IO) || defined(QT_NO_ASYNC_IMAGE_IO)
- /*!
- Animated images
- <p>This includes animated GIFs.
- <p><b>Note: this currently also requires <tt>QT_BUILTIN_GIF_READER</tt> to
- be defined when building Qt.</b>
- */
-# define QT_NO_MOVIE
-#endif
-
-// Fonts
-/*!
- TrueType font files
- <p>Scalable font format common on MS-Windows and becoming common on Unix.
- <p>Only supported on Qt/Embedded.
-*/
-//#define QT_NO_TRUETYPE
-/*!
- BDF font files
- <p>The Bitmap Distribution Format (BDF) font file format, common
- on Unix.
- <p>Only supported on Qt/Embedded.
-*/
-#if defined(QT_NO_TEXTSTREAM) || defined(QT_NO_STRINGLIST)
-# define QT_NO_BDF
-#endif
-/*!
- QFontDatabase
-*/
-#if defined(QT_NO_STRINGLIST)
-# define QT_NO_FONTDATABASE
-#endif
-
-// Internationalization
-
-/*!
- QObject::tr()
-*/
-#if defined(QT_NO_DATASTREAM)
-# define QT_NO_TRANSLATION
-#endif
-
-/*!
- QTextCodec class and subclasses
-*/
-//#define QT_NO_TEXTCODEC
-
-#if defined(QT_NO_TEXTCODEC)
- /*!
- QTextCodec classes
- <p>This includes some large conversion tables.
- */
-# define QT_NO_CODECS
-#endif
-#if defined(QT_LITE_UNICODE)
- /*!
- Unicode property tables
- <p>These include some large tables.
- */
-# define QT_NO_UNICODETABLES
-#endif
-
-/*!
- MIME
-*/
-#if defined(QT_NO_DIR)
-# define QT_NO_MIME
-#endif
-#if defined(QT_NO_MIME) || defined(QT_NO_TEXTSTREAM) || defined(QT_NO_DRAWUTIL) || defined(QT_NO_IMAGE_SMOOTHSCALE)
- /*!
- RichText (HTML) display
- */
-# define QT_NO_RICHTEXT
-#endif
-
-/*!
- XML
-*/
-#if defined(QT_NO_STRINGLIST) || defined(QT_NO_TEXTSTREAM) || defined(QT_NO_TEXTCODEC)
-# define QT_NO_XML
-#endif
-
-/*!
- Document Object Model
-*/
-#if defined(QT_NO_XML) || defined(QT_NO_MIME)
-# define QT_NO_DOM
-#endif
-
-// Sound
-/*!
- Playing sounds
-*/
-//#define QT_NO_SOUND
-
-/*!
- Properties
-*/
-#if defined(QT_NO_STRINGLIST) || defined(QT_NO_ICONSET)
-# define QT_NO_PROPERTIES
-#endif
-
-
-
-// Networking
-
-/*!
- Network support
-*/
-//#define QT_NO_NETWORK
-
-#if defined(QT_NO_NETWORK) || defined(QT_NO_STRINGLIST) || defined(QT_NO_TEXTSTREAM)
- /*!
- DNS
- */
-# define QT_NO_DNS
-#endif
-/*!
- Network file access
-*/
-#if defined(QT_NO_NETWORK) || defined(QT_NO_DIR) || defined(QT_NO_STRINGLIST)
-# define QT_NO_NETWORKPROTOCOL
-#endif
-#if defined(QT_NO_NETWORKPROTOCOL) || defined(QT_NO_DNS)
- /*!
- FTP file access
- */
-# define QT_NO_NETWORKPROTOCOL_FTP
- /*!
- HTTP file access
- */
-# define QT_NO_NETWORKPROTOCOL_HTTP
-#endif
-
-/*!
- External process invocation.
-*/
-//#define QT_NO_PROCESS
-
-
-// Qt/Embedded-specific
-
-#if defined(QT_NO_NETWORK)
- /*!
- Multi-process support.
- */
-# define QT_NO_QWS_MULTIPROCESS
-#endif
-
-#if defined(QT_NO_QWS_MULTIPROCESS) || defined(QT_NO_DATASTREAM)
- /*!
- Palmtop Communication Protocol
- */
-# define QT_NO_COP
-#endif
-
-/*!
- Console keyboard support
-*/
-//#define QT_NO_QWS_KEYBOARD
-
-/*!
- Visible cursor
-*/
-#if defined(QT_NO_CURSOR)
-# define QT_NO_QWS_CURSOR
-#endif
-
-/*!
- Alpha-blended cursor
-*/
-//#define QT_NO_QWS_ALPHA_CURSOR
-/*!
- Mach64 acceleration
-*/
-//#define QT_NO_QWS_MACH64
-/*!
- Voodoo3 acceleration
-*/
-//#define QT_NO_QWS_VOODOO3
-/*!
- Matrox MGA acceleration (Millennium/Millennium II/Mystique/G200/G400)
-*/
-//#define QT_NO_QWS_MATROX
-/*!
- Virtual frame buffer
-*/
-
-//#define QT_NO_QWS_VFB
-/*!
- Transformed frame buffer
-*/
-//#define QT_NO_QWS_TRANSFORMED
-#if defined(QT_NO_NETWORK)
-/*!
- Remote frame buffer (VNC)
-*/
-# ifndef QT_NO_QWS_VNC
-# define QT_NO_QWS_VNC
-# endif
-#endif
-/*!
- 1-bit monochrome
-*/
-//#define QT_NO_QWS_DEPTH_1
-/*!
- 4-bit greyscale
-*/
-//#define QT_NO_QWS_DEPTH_4
-/*!
- 4-bit VGA
-*/
-//#define QT_NO_QWS_VGA_16
-/*!
- SVGALib Support
- Not implemented yet
-*/
-#define QT_NO_QWS_SVGALIB
-/*!
- 8-bit grayscale
-*/
-#define QT_NO_QWS_DEPTH_8GRAYSCALE
-/*!
- 8-bit color
-*/
-//#define QT_NO_QWS_DEPTH_8
-/*!
- 15 or 16-bit color (define QT_QWS_DEPTH16_RGB as 555 for 15-bit)
-*/
-//#define QT_NO_QWS_DEPTH_16
-/*!
- 24-bit color
-*/
-//#define QT_NO_QWS_DEPTH_24
-/*!
- 32-bit color
-*/
-//#define QT_NO_QWS_DEPTH_32
-
-/*!
- Window Manager
-*/
-//#define QT_NO_QWS_MANAGER
-
-/*!
- Window Manager Styles
-*/
-#define QT_NO_QWS_KDE2_WM_STYLE
-#if defined( QT_NO_QWS_MANAGER ) || defined( QT_NO_IMAGEIO_XPM )
-# define QT_NO_QWS_AQUA_WM_STYLE
-# define QT_NO_QWS_BEOS_WM_STYLE
-# define QT_NO_QWS_KDE_WM_STYLE
-# define QT_NO_QWS_QPE_WM_STYLE
-# define QT_NO_QWS_WINDOWS_WM_STYLE
-#endif
-
-/*!
- Saving of fonts
-*/
-//#define QT_NO_QWS_SAVEFONTS
-
-/*!
- Favour code size over graphics speed
- <p>Smaller, slower code will be used for drawing operations.
- <p>Only supported on Qt/Embedded.
-*/
-//#define QT_NO_QWS_GFX_SPEED
-
-/*!
- Qt/Embedded window system properties.
-*/
-//#define QT_NO_QWS_PROPERTIES
-
-#if defined(QT_NO_QWS_PROPERTIES) || defined(QT_NO_MIME)
- /*!
- Cut and paste
- */
-# define QT_NO_CLIPBOARD
-#endif
-
-#if defined(QT_NO_MIME) || defined(QT_NO_QWS_PROPERTIES)
- /*!
- Drag and drop
- */
-# define QT_NO_DRAGANDDROP
-#endif
-
-#if defined(QT_NO_PROPERTIES)
- /*!
- SQL
- */
-# define QT_NO_SQL
-#endif
-
-#if defined(QT_NO_CLIPBOARD) || defined(QT_NO_MIME) || defined(_WS_QWS_)
- /*!
- Cut and paste of complex data types (non-text)
- Not yet implemented for QWS.
- */
-# define QT_NO_MIMECLIPBOARD
-#endif
-
-
-/*!
- Drawing utility functions
-*/
-//#define QT_NO_DRAWUTIL
-/*!
- TrueColor QImage
-*/
-//#define QT_NO_IMAGE_TRUECOLOR
-/*!
- Smooth QImage scaling
-*/
-//#define QT_NO_IMAGE_SMOOTHSCALE
-/*!
- Image file text strings
-*/
-#if defined(QT_NO_STRINGLIST)
-# define QT_NO_IMAGE_TEXT
-#endif
-
-#if defined(QT_NO_IMAGE_TRUECOLOR)
- /*!
- 16-bit QImage
- */
-# define QT_NO_IMAGE_16_BIT
-#endif
-/*!
- Cursors
-*/
-//#define QT_NO_CURSOR
-
-// Painting
-/*!
- Named colors
-*/
-//#define QT_NO_COLORNAMES
-/*!
- Scaling and rotation
-*/
-//#define QT_NO_TRANSFORMATIONS
-
-/*!
- Printing
-*/
-#if defined(QT_NO_TEXTSTREAM)
-# define QT_NO_PRINTER
-#endif
-
-/*!
- QPicture
-*/
-#if defined(QT_NO_DATASTREAM)
-# define QT_NO_PICTURE
-#endif
-
-// Layout
-/*!
- Automatic widget layout
-*/
-//#define QT_NO_LAYOUT
-
-// Widgets
-#if defined(QT_NO_DRAWUTIL) || defined(QT_NO_PALETTE)
-/*!
- QStyle
-*/
-# define QT_NO_STYLE
-#endif
-
-
-/*!
- Dialogs
-*/
-//#define QT_NO_DIALOG
-/*!
- Semi-modal dialogs
-*/
-//#define QT_NO_SEMIMODAL
-/*!
- Framed widgets
-*/
-//#define QT_NO_FRAME
-
-/*!
- Special widget effects (fading, scrolling)
-*/
-//#define QT_NO_EFFECTS
-
-
-/*!
- QLabel
-*/
-#ifdef QT_NO_FRAME
-# define QT_NO_LABEL
-#endif
-
-/*!
- Toolbars
-*/
-#ifdef QT_NO_LAYOUT
-# define QT_NO_TOOLBAR
-#endif
-
-/*!
- Buttons
-*/
-#if defined(QT_NO_BUTTON) || defined(QT_NO_STYLE)
-/*!
- Check-boxes
-*/
-# define QT_NO_CHECKBOX
-/*!
- Radio-buttons
-*/
-# define QT_NO_RADIOBUTTON
-#endif
-#if defined(QT_NO_BUTTON) || defined(QT_NO_TOOLBAR) || defined(QT_NO_ICONSET)
-/*!
- Tool-buttons
-*/
-# define QT_NO_TOOLBUTTON
-#endif
-/*!
- Grid layout widgets
-*/
-#ifdef QT_NO_FRAME
-# define QT_NO_GRID
-#endif
-/*!
- Group boxes
-*/
-#ifdef QT_NO_FRAME
-# define QT_NO_GROUPBOX
-#endif
-#if defined(QT_NO_GROUPBOX)
-/*!
- Button groups
-*/
-# define QT_NO_BUTTONGROUP
-/*!
- Horizontal group boxes
-*/
-# define QT_NO_HGROUPBOX
-#endif
-#if defined(QT_NO_HGROUPBOX)
-/*!
- Vertical group boxes
-*/
-# define QT_NO_VGROUPBOX
-#endif
-#if defined(QT_NO_BUTTONGROUP)
-/*!
- Horizontal button groups
-*/
-# define QT_NO_HBUTTONGROUP
-#endif
-#if defined(QT_NO_HBUTTONGROUP)
-/*!
- Vertical button groups
-*/
-# define QT_NO_VBUTTONGROUP
-#endif
-/*!
- Horizonal box layout widgets
-*/
-#ifdef QT_NO_FRAME
-# define QT_NO_HBOX
-#endif
-#if defined(QT_NO_HBOX)
-/*!
- Vertical box layout widgets
-*/
-# define QT_NO_VBOX
-#endif
-/*!
- Single-line edits
-*/
-#if defined(QT_NO_PALETTE)
-# define QT_NO_LINEEDIT
-#endif
-#if defined(QT_NO_TOOLBAR)
-/*!
- Main-windows
-*/
-# define QT_NO_MAINWINDOW
-#endif
-#if defined(QT_NO_ICONSET)
-/*!
- Menu-like widgets
-*/
-# define QT_NO_MENUDATA
-#endif
-#if defined(QT_NO_MENUDATA)
-/*!
- Popup-menus
-*/
-# define QT_NO_POPUPMENU
-/*!
- Menu bars
-*/
-# define QT_NO_MENUBAR
-#endif
-#if defined(QT_NO_BUTTON) || defined(QT_NO_ICONSET) || defined(QT_NO_POPUPMENU)
-/*!
- Push-buttons
-*/
-# define QT_NO_PUSHBUTTON
-#endif
-/*!
- Progress bars
-*/
-#ifdef QT_NO_FRAME
-# define QT_NO_PROGRESSBAR
-#endif
-/*!
- Range-control widgets
-*/
-//#define QT_NO_RANGECONTROL
-#if defined(QT_NO_RANGECONTROL) || defined(QT_NO_STYLE)
-/*!
- Scroll bars
-*/
-# define QT_NO_SCROLLBAR
-/*!
- Sliders
-*/
-# define QT_NO_SLIDER
-/*!
- Spin boxes
-*/
-# define QT_NO_SPINBOX
-/*!
- Dials
-*/
-# define QT_NO_DIAL
-#endif
-
-
-#if defined(QT_NO_SCROLLBAR) || defined(QT_NO_FRAME)
-/*!
- Scrollable view widgets
-*/
-# define QT_NO_SCROLLVIEW
-#endif
-#if defined(QT_NO_SCROLLVIEW)
-/*!
- QCanvas
-*/
-# define QT_NO_CANVAS
-/*!
- QIconView
-*/
-# define QT_NO_ICONVIEW
-#endif
-
-#if defined(QT_NO_SCROLLBAR)
-/*!
- Table-like widgets
-*/
-# define QT_NO_TABLEVIEW
-#endif
-#if defined(QT_NO_TABLEVIEW)
-/*!
- Multi-line edits
-*/
-# define QT_NO_MULTILINEEDIT
-#endif
-
-/*!
- Splitters
-*/
-#ifdef QT_NO_FRAME
-# define QT_NO_SPLITTER
-#endif
-/*!
- Status bars
-*/
-#ifdef QT_NO_LAYOUT
-# define QT_NO_STATUSBAR
-#endif
-/*!
- Tab-bars
-*/
-#if defined(QT_NO_ICONSET)
-# define QT_NO_TABBAR
-#endif
-#if defined(QT_NO_TABBAR)
-/*!
- Tab widgets
-*/
-# define QT_NO_TABWIDGET
-#endif
-/*!
- Tool tips
-*/
-#if defined( QT_NO_LABEL ) || defined( QT_NO_PALETTE )
-# define QT_NO_TOOLTIP
-#endif
-/*!
- Input validators
-*/
-//#define QT_NO_VALIDATOR
-/*!
- "What's this" help
-*/
-#if defined( QT_NO_TOOLTIP )
-# define QT_NO_WHATSTHIS
-#endif
-/*!
- Widget stacks
-*/
-#ifdef QT_NO_FRAME
-# define QT_NO_WIDGETSTACK
-#endif
-
-#if defined(QT_NO_RICHTEXT) || defined(QT_NO_SCROLLVIEW)
- /*!
- QTextView
- */
-# define QT_NO_TEXTVIEW
-#endif
-
-#if defined(QT_NO_TEXTVIEW)
- /*!
- QTextBrowser
- */
-# define QT_NO_TEXTBROWSER
-#endif
-
-#if defined(QT_NO_STYLE)
- /*!
- Windows style
- */
-# define QT_NO_STYLE_WINDOWS
- /*!
- Motif style
- */
-# define QT_NO_STYLE_MOTIF
-#endif
-
-#if defined(QT_NO_STYLE_MOTIF)
- /*!
- Motif-plus style
- */
-# define QT_NO_STYLE_MOTIFPLUS
-#endif
-
-
-#if defined(QT_NO_SCROLLVIEW) || defined(QT_NO_STRINGLIST)
- /*!
- QListBox
- */
-# define QT_NO_LISTBOX
-#endif
-
-/*!
- QAccel
-*/
-//#define QT_NO_ACCEL
-
-/*!
- QSizeGrip
-*/
-#ifdef QT_NO_PALETTE
-# define QT_NO_SIZEGRIP
-#endif
-/*!
- QHeader
-*/
-#ifdef QT_NO_ICONSET
-# define QT_NO_HEADER
-#endif
-/*!
- QWorkSpace
-*/
-#ifdef QT_NO_FRAME
-# define QT_NO_WORKSPACE
-#endif
-/*!
- QLCDNumber
-*/
-#ifdef QT_NO_FRAME
-# define QT_NO_LCDNUMBER
-#endif
-/*!
- QAction
-*/
-//#define QT_NO_ACTION
-
-#if defined(QT_NO_HEADER)
- /*!
- QTable
- */
-# define QT_NO_TABLE
-#endif
-
-#if defined(QT_NO_LISTBOX)
- /*!
- QComboBox
- */
-# define QT_NO_COMBOBOX
-#endif
-
-#if defined(QT_NO_HEADER) || defined(QT_NO_SCROLLVIEW)
- /*!
- QListView
- */
-# define QT_NO_LISTVIEW
-#endif
-
-#if defined(QT_NO_STYLE_WINDOWS)
- /*!
- Compact Windows style
- */
-# define QT_NO_STYLE_COMPACT
-#endif
-
-#if defined(QT_NO_STYLE_MOTIF) || defined(QT_NO_TRANSFORMATIONS)
- /*!
- CDE style
- */
-# define QT_NO_STYLE_CDE
- /*!
- SGI style
- */
-# define QT_NO_STYLE_SGI
-#endif
-#if defined(QT_NO_STYLE_WINDOWS)
- /*!
- Platinum style
- */
-# define QT_NO_STYLE_PLATINUM
-#endif
-
-/*!
- QColorDialog
-*/
-#if defined(QT_NO_LAYOUT) || defined(QT_NO_LABEL) || defined(QT_NO_PUSHBUTTON) || defined(QT_NO_DIALOG)
-# define QT_NO_COLORDIALOG
-#endif
-#if defined(QT_NO_DIALOG)
-/*!
- QMessageBox
-*/
-# define QT_NO_MESSAGEBOX
-#endif
-#if defined(QT_NO_DIALOG) || defined(QT_NO_TABBAR)
-/*!
- QTabDialog
-*/
-#define QT_NO_TABDIALOG
-#endif
-
-#if defined(QT_NO_DIALOG)
-/*!
- QWizard
-*/
-# define QT_NO_WIZARD
-#endif
-
-#if defined(QT_NO_DIALOG) || defined(QT_NO_LISTVIEW) || defined(QT_NO_NETWORKPROTOCOL) || defined(QT_NO_COMBOBOX) || defined(QT_NO_DIR) || defined(QT_NO_MESSAGEBOX) || defined(QT_NO_SEMIMODAL)
- /*!
- QFileDialog
- */
-# define QT_NO_FILEDIALOG
-#endif
-
-#if defined(QT_NO_DIALOG) || defined(QT_NO_FONTDATABASE) || defined(QT_NO_COMBOBOX)
- /*!
- QFontDialog
- */
-# define QT_NO_FONTDIALOG
-#endif
-
-#if defined(QT_NO_DIALOG) || defined(QT_NO_LISTVIEW) || defined(QT_NO_PRINTER) || defined(QT_NO_COMBOBOX) || defined(QT_NO_DIR) || defined(QT_NO_LAYOUT) || defined(QT_NO_LABEL)
- /*!
- QPrintDialog
- */
-# define QT_NO_PRINTDIALOG
-#endif
-
-#if defined(QT_NO_SEMIMODAL)
- /*!
- QProgressDialog
- */
-# define QT_NO_PROGRESSDIALOG
-#endif
-#if defined(QT_NO_DIALOG) || defined(QT_NO_COMBOBOX)
- /*!
- QInputDialog
- */
-# define QT_NO_INPUTDIALOG
-#endif
-
-#if defined(QT_NO_STRINGLIST)
- /*!
- Session management support
- */
-# define QT_NO_SESSIONMANAGER
-#endif
-
-#endif // QFEATURES_H
diff --git a/qtools/qfile.cpp b/qtools/qfile.cpp
deleted file mode 100644
index 98ed9a3..0000000
--- a/qtools/qfile.cpp
+++ /dev/null
@@ -1,550 +0,0 @@
-/****************************************************************************
-**
-**
-** Implementation of QFile class
-**
-** Created : 930812
-**
-** 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 "qglobal.h"
-#if defined(_OS_WIN32_)
-#ifdef UNICODE
-#ifndef _UNICODE
-#define _UNICODE
-#endif
-#endif
-#endif
-
-#include "qfile.h"
-#include "qfiledefs_p.h"
-
-extern bool qt_file_access( const QString& fn, int t );
-
-// NOT REVISED
-/*!
- \class QFile qfile.h
- \brief The QFile class is an I/O device that operates on files.
-
- \ingroup io
-
- QFile is an I/O device for reading and writing binary and text files. A
- QFile may be used by itself (readBlock and writeBlock) or by more
- conveniently using QDataStream or QTextStream.
-
- Here is a code fragment that uses QTextStream to read a text
- file line by line. It prints each line with a line number.
- \code
- QFile f("file.txt");
- if ( f.open(IO_ReadOnly) ) { // file opened successfully
- QTextStream t( &f ); // use a text stream
- QString s;
- int n = 1;
- while ( !t.eof() ) { // until end of file...
- s = t.readLine(); // line of text excluding '\n'
- printf( "%3d: %s\n", n++, (const char *)s );
- }
- f.close();
- }
- \endcode
-
- The QFileInfo class holds detailed information about a file, such as
- access permissions, file dates and file types.
-
- The QDir class manages directories and lists of file names.
-
- \sa QDataStream, QTextStream
-*/
-
-
-/*!
- Constructs a QFile with no name.
-*/
-
-QFile::QFile()
-{
- init();
-}
-
-/*!
- Constructs a QFile with a file name \e name.
- \sa setName()
-*/
-
-QFile::QFile( const QString &name )
- : fn(name)
-{
- init();
-}
-
-
-/*!
- Destructs a QFile. Calls close().
-*/
-
-QFile::~QFile()
-{
- close();
-}
-
-
-/*!
- \internal
- Initialize internal data.
-*/
-
-void QFile::init()
-{
- setFlags( IO_Direct );
- setStatus( IO_Ok );
- fh = 0;
- fd = 0;
- length = 0;
- ioIndex = 0;
- ext_f = FALSE; // not an external file handle
-}
-
-
-/*!
- \fn QString QFile::name() const
- Returns the name set by setName().
- \sa setName(), QFileInfo::fileName()
-*/
-
-/*!
- Sets the name of the file. The name can include an absolute directory
- path or it can be a name or a path relative to the current directory.
-
- Do not call this function if the file has already been opened.
-
- Note that if the name is relative QFile does not associate it with the
- current directory. If you change directory before calling open(), open
- uses the new current directory.
-
- Example:
- \code
- QFile f;
- QDir::setCurrent( "/tmp" );
- f.setName( "readme.txt" );
- QDir::setCurrent( "/home" );
- f.open( IO_ReadOnly ); // opens "/home/readme.txt" under UNIX
- \endcode
-
- Also note that the directory separator '/' works for all operating
- systems supported by Qt.
-
- \sa name(), QFileInfo, QDir
-*/
-
-void QFile::setName( const QString &name )
-{
- if ( isOpen() ) {
-#if defined(CHECK_STATE)
- qWarning( "QFile::setName: File is open" );
-#endif
- close();
- }
- fn = name;
-}
-
-/*!
- Returns TRUE if this file exists, otherwise FALSE.
- \sa name()
-*/
-
-bool QFile::exists() const
-{
- return qt_file_access( fn, F_OK );
-}
-
-/*!
- Returns TRUE if the file given by \e fileName exists, otherwise FALSE.
-*/
-
-bool QFile::exists( const QString &fileName )
-{
- return qt_file_access( fileName, F_OK );
-}
-
-
-/*!
- Removes the file specified by the file name currently set.
- Returns TRUE if successful, otherwise FALSE.
-
- The file is closed before it is removed.
-*/
-
-bool QFile::remove()
-{
- close();
- return remove( fn );
-}
-
-#if defined(_OS_MAC_) || defined(_OS_MSDOS_) || defined(_OS_WIN32_) || defined(_OS_OS2_) || defined(_OS_CYGWIN_)
-# define HAS_TEXT_FILEMODE // has translate/text filemode
-#endif
-#if defined(O_NONBLOCK)
-# define HAS_ASYNC_FILEMODE
-# define OPEN_ASYNC O_NONBLOCK
-#elif defined(O_NDELAY)
-# define HAS_ASYNC_FILEMODE
-# define OPEN_ASYNC O_NDELAY
-#endif
-
-/*!
- Flushes the file buffer to the disk.
-
- close() also flushes the file buffer.
-*/
-
-void QFile::flush()
-{
- if ( isOpen() && fh ) // can only flush open/buffered
- fflush( fh ); // file
-}
-
-/*!
- Returns TRUE if the end of file has been reached, otherwise FALSE.
- \sa size()
-*/
-
-bool QFile::atEnd() const
-{
- if ( !isOpen() ) {
-#if defined(CHECK_STATE)
- qWarning( "QFile::atEnd: File is not open" );
-#endif
- return FALSE;
- }
- if ( isDirectAccess() && !isTranslated() ) {
- if ( at() < length )
- return FALSE;
- }
- return QIODevice::atEnd();
-}
-
-/*!
- Reads a line of text.
-
- Reads bytes from the file until end-of-line is reached, or up to \a
- maxlen bytes, and returns the number of bytes read, or -1 in case of
- error. The terminating newline is not stripped.
-
- This function is efficient only for buffered files. Avoid
- readLine() for files that have been opened with the \c IO_Raw
- flag.
-
- \sa readBlock(), QTextStream::readLine()
-*/
-
-int QFile::readLine( char *p, uint maxlen )
-{
- if ( maxlen == 0 ) // application bug?
- return 0;
-#if defined(CHECK_STATE)
- CHECK_PTR( p );
- if ( !isOpen() ) { // file not open
- qWarning( "QFile::readLine: File not open" );
- return -1;
- }
- if ( !isReadable() ) { // reading not permitted
- qWarning( "QFile::readLine: Read operation not permitted" );
- return -1;
- }
-#endif
- int nread; // number of bytes read
- if ( isRaw() ) { // raw file
- nread = QIODevice::readLine( p, maxlen );
- } else { // buffered file
- p = fgets( p, maxlen, fh );
- if ( p ) {
- nread = qstrlen( p );
- ioIndex += nread;
- } else {
- nread = -1;
- setStatus(IO_ReadError);
- }
- }
- return nread;
-}
-
-
-/*!
- Reads a line of text.
-
- Reads bytes from the file until end-of-line is reached, or up to \a
- maxlen bytes, and returns the number of bytes read, or -1 in case of
- error. The terminating newline is not stripped.
-
- This function is efficient only for buffered files. Avoid
- readLine() for files that have been opened with the \c IO_Raw
- flag.
-
- Note that the string is read as plain Latin1 bytes, not Unicode.
-
- \sa readBlock(), QTextStream::readLine()
-*/
-
-int QFile::readLine( QString& s, uint maxlen )
-{
- QByteArray ba(maxlen);
- int l = readLine(ba.data(),maxlen);
- if ( l >= 0 ) {
- ba.truncate(l);
- s = QString(ba);
- }
- return l;
-}
-
-
-/*!
- Reads a single byte/character from the file.
-
- Returns the byte/character read, or -1 if the end of the file has been
- reached.
-
- \sa putch(), ungetch()
-*/
-
-int QFile::getch()
-{
-#if defined(CHECK_STATE)
- if ( !isOpen() ) { // file not open
- qWarning( "QFile::getch: File not open" );
- return EOF;
- }
- if ( !isReadable() ) { // reading not permitted
- qWarning( "QFile::getch: Read operation not permitted" );
- return EOF;
- }
-#endif
-
- int ch;
-
- if ( !ungetchBuffer.isEmpty() ) {
- int len = ungetchBuffer.length();
- ch = ungetchBuffer[ len-1 ];
- ungetchBuffer.truncate( len - 1 );
- return ch;
- }
-
- if ( isRaw() ) { // raw file (inefficient)
- char buf[1];
- ch = readBlock( buf, 1 ) == 1 ? buf[0] : EOF;
- } else { // buffered file
- if ( (ch = getc( fh )) != EOF )
- ioIndex++;
- else
- setStatus(IO_ReadError);
- }
- return ch;
-}
-
-/*!
- \fn int QFile::writeBlock( const QByteArray& data )
- \reimp
- \internal
- Should be removed in 3.0
-*/
-
-/*!
- Writes the character \e ch to the file.
-
- Returns \e ch, or -1 if some error occurred.
-
- \sa getch(), ungetch()
-*/
-
-int QFile::putch( int ch )
-{
-#if defined(CHECK_STATE)
- if ( !isOpen() ) { // file not open
- qWarning( "QFile::putch: File not open" );
- return EOF;
- }
- if ( !isWritable() ) { // writing not permitted
- qWarning( "QFile::putch: Write operation not permitted" );
- return EOF;
- }
-#endif
- if ( isRaw() ) { // raw file (inefficient)
- char buf[1];
- buf[0] = ch;
- ch = writeBlock( buf, 1 ) == 1 ? ch : EOF;
- } else { // buffered file
- if ( (ch = putc( ch, fh )) != EOF ) {
- ioIndex++;
- if ( ioIndex > length ) // update file length
- length = ioIndex;
- } else {
- setStatus(IO_WriteError);
- }
- }
- return ch;
-}
-
-/*!
- Puts the character \e ch back into the file and decrements the index if it
- is not zero.
-
- This function is normally called to "undo" a getch() operation.
-
- Returns \e ch, or -1 if some error occurred.
-
- \sa getch(), putch()
-*/
-
-int QFile::ungetch( int ch )
-{
-#if defined(CHECK_STATE)
- if ( !isOpen() ) { // file not open
- qWarning( "QFile::ungetch: File not open" );
- return EOF;
- }
- if ( !isReadable() ) { // reading not permitted
- qWarning( "QFile::ungetch: Read operation not permitted" );
- return EOF;
- }
-#endif
- if ( ch == EOF ) // cannot unget EOF
- return ch;
-
- if ( isSequentialAccess() && !fh) {
- // pipe or similar => we cannot ungetch, so do it manually
- ungetchBuffer +=ch;
- return ch;
- }
-
- if ( isRaw() ) { // raw file (very inefficient)
- char buf[1];
- at( ioIndex-1 );
- buf[0] = ch;
- if ( writeBlock(buf, 1) == 1 )
- at ( ioIndex-1 );
- else
- ch = EOF;
- } else { // buffered file
- if ( (ch = ungetc(ch, fh)) != EOF )
- ioIndex--;
- else
- setStatus( IO_ReadError );
- }
- return ch;
-}
-
-
-static QCString locale_encoder( const QString &fileName )
-{
- return fileName.local8Bit();
-}
-
-
-static QFile::EncoderFn encoder = locale_encoder;
-
-/*!
- When you use QFile, QFileInfo, and QDir to access the filesystem
- with Qt, you can use Unicode filenames. On Unix, these filenames
- are converted to an 8-bit encoding. If you want to do your own
- file I/O on Unix, you should convert the filename using this
- function. On Windows NT, Unicode filenames are supported directly
- in the filesystem and this function should be avoided. On Windows 95,
- non-Latin1 locales are not supported at this time.
-
- By default, this function converts to the local 8-bit encoding
- determined by the user's locale. This is sufficient for
- filenames that the user chooses. Filenames hard-coded into the
- application should only use 7-bit ASCII filename characters.
-
- The conversion scheme can be changed using setEncodingFunction().
- This might be useful if you wish to give the user an option to
- store in filenames in UTF-8, etc., but beware that such filenames
- would probably then be unrecognizable when seen by other programs.
-
- \sa decodeName()
-*/
-
-QCString QFile::encodeName( const QString &fileName )
-{
- return (*encoder)(fileName);
-}
-
-/*!
- \enum QFile::EncoderFn
-
- This is used by QFile::setEncodingFunction().
-*/
-
-/*!
- Sets the function for encoding Unicode filenames.
- The default encodes in the locale-specific 8-bit encoding.
-
- \sa encodeName()
-*/
-void QFile::setEncodingFunction( EncoderFn f )
-{
- encoder = f;
-}
-
-static
-QString locale_decoder( const QCString &localFileName )
-{
- return QString::fromLocal8Bit(localFileName);
-}
-
-static QFile::DecoderFn decoder = locale_decoder;
-
-/*!
- This does the reverse of QFile::encodeName().
-
- \sa setDecodingFunction()
-*/
-QString QFile::decodeName( const QCString &localFileName )
-{
- return (*decoder)(localFileName);
-}
-
-/*!
- \enum QFile::DecoderFn
-
- This is used by QFile::setDecodingFunction().
-*/
-
-/*!
- Sets the function for decoding 8-bit filenames.
- The default uses the locale-specific 8-bit encoding.
-
- \sa encodeName(), decodeName()
-*/
-
-void QFile::setDecodingFunction( DecoderFn f )
-{
- decoder = f;
-}
diff --git a/qtools/qfile.h b/qtools/qfile.h
deleted file mode 100644
index 4ef0685..0000000
--- a/qtools/qfile.h
+++ /dev/null
@@ -1,124 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QFile class
-**
-** Created : 930831
-**
-** 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 QFILE_H
-#define QFILE_H
-
-#ifndef QT_H
-#include "qiodevice.h"
-#include "qstring.h"
-#include <stdio.h>
-#endif // QT_H
-
-class QDir;
-
-
-class Q_EXPORT QFile : public QIODevice // file I/O device class
-{
-public:
- QFile();
- QFile( const QString &name );
- ~QFile();
-
- QString name() const;
- void setName( const QString &name );
-
- typedef QCString (*EncoderFn)( const QString &fileName );
- typedef QString (*DecoderFn)( const QCString &localfileName );
- static QCString encodeName( const QString &fileName );
- static QString decodeName( const QCString &localFileName );
- static void setEncodingFunction( EncoderFn );
- static void setDecodingFunction( DecoderFn );
-
- bool exists() const;
- static bool exists( const QString &fileName );
-
- bool remove();
- static bool remove( const QString &fileName );
-
- bool open( int );
- bool open( int, FILE * );
- bool open( int, int );
- void close();
- void flush();
-
- uint size() const;
- int at() const;
- bool at( int );
- bool atEnd() const;
-
- int readBlock( char *data, uint len );
- int writeBlock( const char *data, uint len );
- int writeBlock( const QByteArray& data )
- { return QIODevice::writeBlock(data); }
- int readLine( char *data, uint maxlen );
- int readLine( QString &, uint maxlen );
-
- int getch();
- int putch( int );
- int ungetch( int );
-
- int handle() const;
-
-protected:
- QString fn;
- FILE *fh;
- int fd;
- int length;
- bool ext_f;
- void * d;
-
-private:
- void init();
- QCString ungetchBuffer;
-
-private: // Disabled copy constructor and operator=
-#if defined(Q_DISABLE_COPY)
- QFile( const QFile & );
- QFile &operator=( const QFile & );
-#endif
-};
-
-
-inline QString QFile::name() const
-{ return fn; }
-
-inline int QFile::at() const
-{ return ioIndex; }
-
-
-#endif // QFILE_H
diff --git a/qtools/qfile_unix.cpp b/qtools/qfile_unix.cpp
deleted file mode 100644
index 6b63d99..0000000
--- a/qtools/qfile_unix.cpp
+++ /dev/null
@@ -1,634 +0,0 @@
-/****************************************************************************
-**
-**
-** Implementation of QFileInfo class
-**
-** Created : 950628
-**
-** 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 for Unix/X11 or for Qt/Embedded 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 "qglobal.h"
-
-#include "qfile.h"
-#include "qfiledefs_p.h"
-
-#if defined(_OS_MAC_) || defined(_OS_MSDOS_) || defined(_OS_WIN32_) || defined(_OS_OS2_) || defined(_OS_CYGWIN_)
-# define HAS_TEXT_FILEMODE // has translate/text filemode
-#endif
-#if defined(O_NONBLOCK)
-# define HAS_ASYNC_FILEMODE
-# define OPEN_ASYNC O_NONBLOCK
-#elif defined(O_NDELAY)
-# define HAS_ASYNC_FILEMODE
-# define OPEN_ASYNC O_NDELAY
-#endif
-
-bool qt_file_access( const QString& fn, int t )
-{
- if ( fn.isEmpty() )
- return FALSE;
- return ACCESS( QFile::encodeName(fn), t ) == 0;
-}
-
-/*!
- Removes the file \a fileName.
- Returns TRUE if successful, otherwise FALSE.
-*/
-
-bool QFile::remove( const QString &fileName )
-{
- if ( fileName.isEmpty() ) {
-#if defined(CHECK_NULL)
- qWarning( "QFile::remove: Empty or null file name" );
-#endif
- return FALSE;
- }
- return unlink( QFile::encodeName(fileName) ) == 0;
- // unlink more common in UNIX
-}
-
-#if defined(O_NONBLOCK)
-# define HAS_ASYNC_FILEMODE
-# define OPEN_ASYNC O_NONBLOCK
-#elif defined(O_NDELAY)
-# define HAS_ASYNC_FILEMODE
-# define OPEN_ASYNC O_NDELAY
-#endif
-
-/*!
- Opens the file specified by the file name currently set, using the mode \e m.
- Returns TRUE if successful, otherwise FALSE.
-
- The mode parameter \e m must be a combination of the following flags:
- <ul>
- <li>\c IO_Raw specified raw (non-buffered) file access.
- <li>\c IO_ReadOnly opens the file in read-only mode.
- <li>\c IO_WriteOnly opens the file in write-only mode (and truncates).
- <li>\c IO_ReadWrite opens the file in read/write mode, equivalent to
- \c (IO_ReadOnly|IO_WriteOnly).
- <li>\c IO_Append opens the file in append mode. This mode is very useful
- when you want to write something to a log file. The file index is set to
- the end of the file. Note that the result is undefined if you position the
- file index manually using at() in append mode.
- <li>\c IO_Truncate truncates the file.
- <li>\c IO_Translate enables carriage returns and linefeed translation
- for text files under MS-DOS, Windows and OS/2.
- </ul>
-
- The raw access mode is best when I/O is block-operated using 4kB block size
- or greater. Buffered access works better when reading small portions of
- data at a time.
-
- <strong>Important:</strong> When working with buffered files, data may
- not be written to the file at once. Call \link flush() flush\endlink
- to make sure the data is really written.
-
- \warning We have experienced problems with some C libraries when a buffered
- file is opened for both reading and writing. If a read operation takes place
- immediately after a write operation, the read buffer contains garbage data.
- Worse, the same garbage is written to the file. Calling flush() before
- readBlock() solved this problem.
-
- If the file does not exist and \c IO_WriteOnly or \c IO_ReadWrite is
- specified, it is created.
-
- Example:
- \code
- QFile f1( "/tmp/data.bin" );
- QFile f2( "readme.txt" );
- f1.open( IO_Raw | IO_ReadWrite | IO_Append );
- f2.open( IO_ReadOnly | IO_Translate );
- \endcode
-
- \sa name(), close(), isOpen(), flush()
-*/
-
-bool QFile::open( int m )
-{
- if ( isOpen() ) { // file already open
-#if defined(CHECK_STATE)
- qWarning( "QFile::open: File already open" );
-#endif
- return FALSE;
- }
- if ( fn.isNull() ) { // no file name defined
-#if defined(CHECK_NULL)
- qWarning( "QFile::open: No file name specified" );
-#endif
- return FALSE;
- }
- init(); // reset params
- setMode( m );
- if ( !(isReadable() || isWritable()) ) {
-#if defined(CHECK_RANGE)
- qWarning( "QFile::open: File access not specified" );
-#endif
- return FALSE;
- }
- bool ok = TRUE;
- STATBUF st;
- if ( isRaw() ) { // raw file I/O
- int oflags = OPEN_RDONLY;
- if ( isReadable() && isWritable() )
- oflags = OPEN_RDWR;
- else if ( isWritable() )
- oflags = OPEN_WRONLY;
- if ( flags() & IO_Append ) { // append to end of file?
- if ( flags() & IO_Truncate )
- oflags |= (OPEN_CREAT | OPEN_TRUNC);
- else
- oflags |= (OPEN_APPEND | OPEN_CREAT);
- setFlags( flags() | IO_WriteOnly ); // append implies write
- } else if ( isWritable() ) { // create/trunc if writable
- if ( flags() & IO_Truncate )
- oflags |= (OPEN_CREAT | OPEN_TRUNC);
- else
- oflags |= OPEN_CREAT;
- }
-#if defined(HAS_TEXT_FILEMODE)
- if ( isTranslated() )
-#ifdef __CYGWIN__
- /* Do nothing, allowing the Cygwin mount mode to take effect. */;
-#else
- oflags |= OPEN_TEXT;
-#endif
- else
- oflags |= OPEN_BINARY;
-#endif
-#if defined(HAS_ASYNC_FILEMODE)
- if ( isAsynchronous() )
- oflags |= OPEN_ASYNC;
-#endif
- fd = OPEN( QFile::encodeName(fn), oflags, 0666 );
-
- if ( fd != -1 ) { // open successful
- FSTAT( fd, &st ); // get the stat for later usage
- } else {
- ok = FALSE;
- }
- } else { // buffered file I/O
- QCString perm;
- char perm2[4];
- bool try_create = FALSE;
- if ( flags() & IO_Append ) { // append to end of file?
- setFlags( flags() | IO_WriteOnly ); // append implies write
- perm = isReadable() ? "a+" : "a";
- } else {
- if ( isReadWrite() ) {
- if ( flags() & IO_Truncate ) {
- perm = "w+";
- } else {
- perm = "r+";
- try_create = TRUE; // try to create if not exists
- }
- } else if ( isReadable() ) {
- perm = "r";
- } else if ( isWritable() ) {
- perm = "w";
- }
- }
- qstrcpy( perm2, perm );
-#if defined(HAS_TEXT_FILEMODE)
- if ( isTranslated() )
-#ifdef __CYGWIN__
- /* Do nothing, allowing the Cygwin mount mode to take effect. */;
-#else
- strcat( perm2, "t" );
-#endif
- else
- strcat( perm2, "b" );
-#endif
- while (1) { // At most twice
-
- fh = fopen( QFile::encodeName(fn), perm2 );
-
- if ( !fh && try_create ) {
- perm2[0] = 'w'; // try "w+" instead of "r+"
- try_create = FALSE;
- } else {
- break;
- }
- }
- if ( fh ) {
- FSTAT( FILENO(fh), &st ); // get the stat for later usage
- } else {
- ok = FALSE;
- }
- }
- if ( ok ) {
- setState( IO_Open );
- // on successful open the file stat was got; now test what type
- // of file we have
- if ( (st.st_mode & STAT_MASK) != STAT_REG ) {
- // non-seekable
- setType( IO_Sequential );
- length = INT_MAX;
- ioIndex = (flags() & IO_Append) == 0 ? 0 : length;
- } else {
- length = (int)st.st_size;
- ioIndex = (flags() & IO_Append) == 0 ? 0 : length;
- if ( !(flags()&IO_Truncate) && length == 0 && isReadable() ) {
- // try if you can read from it (if you can, it's a sequential
- // device; e.g. a file in the /proc filesystem)
- int c = getch();
- if ( c != -1 ) {
- ungetch(c);
- setType( IO_Sequential );
- length = INT_MAX;
- }
- }
- }
- } else {
- init();
- if ( errno == EMFILE ) // no more file handles/descrs
- setStatus( IO_ResourceError );
- else
- setStatus( IO_OpenError );
- }
- return ok;
-}
-
-/*!
- Opens a file in the mode \e m using an existing file handle \e f.
- Returns TRUE if successful, otherwise FALSE.
-
- Example:
- \code
- #include <stdio.h>
-
- void printError( const char* msg )
- {
- QFile f;
- f.open( IO_WriteOnly, stderr );
- f.writeBlock( msg, qstrlen(msg) ); // write to stderr
- f.close();
- }
- \endcode
-
- When a QFile is opened using this function, close() does not actually
- close the file, only flushes it.
-
- \warning If \e f is \c stdin, \c stdout, \c stderr, you may not
- be able to seek. See QIODevice::isSequentialAccess() for more
- information.
-
- \sa close()
-*/
-
-bool QFile::open( int m, FILE *f )
-{
- if ( isOpen() ) {
-#if defined(CHECK_RANGE)
- qWarning( "QFile::open: File already open" );
-#endif
- return FALSE;
- }
- init();
- setMode( m &~IO_Raw );
- setState( IO_Open );
- fh = f;
- ext_f = TRUE;
- STATBUF st;
- FSTAT( FILENO(fh), &st );
- ioIndex = (int)ftell( fh );
- if ( (st.st_mode & STAT_MASK) != STAT_REG || f == stdin ) { //stdin is non seekable
- // non-seekable
- setType( IO_Sequential );
- length = INT_MAX;
- } else {
- length = (int)st.st_size;
- if ( !(flags()&IO_Truncate) && length == 0 && isReadable() ) {
- // try if you can read from it (if you can, it's a sequential
- // device; e.g. a file in the /proc filesystem)
- int c = getch();
- if ( c != -1 ) {
- ungetch(c);
- setType( IO_Sequential );
- length = INT_MAX;
- }
- }
- }
- return TRUE;
-}
-
-/*!
- Opens a file in the mode \e m using an existing file descriptor \e f.
- Returns TRUE if successful, otherwise FALSE.
-
- When a QFile is opened using this function, close() does not actually
- close the file.
-
- \warning If \e f is one of 0 (stdin), 1 (stdout) or 2 (stderr), you may not
- be able to seek. size() is set to \c INT_MAX (in limits.h).
-
- \sa close()
-*/
-
-
-bool QFile::open( int m, int f )
-{
- if ( isOpen() ) {
-#if defined(CHECK_RANGE)
- qWarning( "QFile::open: File already open" );
-#endif
- return FALSE;
- }
- init();
- setMode( m |IO_Raw );
- setState( IO_Open );
- fd = f;
- ext_f = TRUE;
- STATBUF st;
- FSTAT( fd, &st );
- ioIndex = (int)LSEEK(fd, 0, SEEK_CUR);
- if ( (st.st_mode & STAT_MASK) != STAT_REG || f == 0 ) { // stdin is not seekable...
- // non-seekable
- setType( IO_Sequential );
- length = INT_MAX;
- } else {
- length = (int)st.st_size;
- if ( length == 0 && isReadable() ) {
- // try if you can read from it (if you can, it's a sequential
- // device; e.g. a file in the /proc filesystem)
- int c = getch();
- if ( c != -1 ) {
- ungetch(c);
- setType( IO_Sequential );
- length = INT_MAX;
- }
- resetStatus();
- }
- }
- return TRUE;
-}
-
-/*!
- Returns the file size.
- \sa at()
-*/
-
-uint QFile::size() const
-{
- STATBUF st;
- if ( isOpen() ) {
- FSTAT( fh ? FILENO(fh) : fd, &st );
- } else {
- STAT( QFile::encodeName(fn), &st );
- }
- return st.st_size;
-}
-
-/*!
- \fn int QFile::at() const
- Returns the file index.
- \sa size()
-*/
-
-/*!
- Sets the file index to \e pos. Returns TRUE if successful, otherwise FALSE.
-
- Example:
- \code
- QFile f( "data.bin" );
- f.open( IO_ReadOnly ); // index set to 0
- f.at( 100 ); // set index to 100
- f.at( f.at()+50 ); // set index to 150
- f.at( f.size()-80 ); // set index to 80 before EOF
- f.close();
- \endcode
-
- \warning The result is undefined if the file was \link open() opened\endlink
- using the \c IO_Append specifier.
-
- \sa size(), open()
-*/
-
-bool QFile::at( int pos )
-{
- if ( !isOpen() ) {
-#if defined(CHECK_STATE)
- qWarning( "QFile::at: File is not open" );
-#endif
- return FALSE;
- }
- bool ok;
- if ( isRaw() ) { // raw file
- pos = (int)LSEEK(fd, pos, SEEK_SET);
- ok = pos != -1;
- } else { // buffered file
- ok = fseek(fh, pos, SEEK_SET) == 0;
- }
- if ( ok )
- ioIndex = pos;
-#if defined(CHECK_RANGE)
- else
- qWarning( "QFile::at: Cannot set file position %d", pos );
-#endif
- return ok;
-}
-
-/*!
- Reads at most \e len bytes from the file into \e p and returns the
- number of bytes actually read.
-
- Returns -1 if a serious error occurred.
-
- \warning We have experienced problems with some C libraries when a buffered
- file is opened for both reading and writing. If a read operation takes place
- immediately after a write operation, the read buffer contains garbage data.
- Worse, the same garbage is written to the file. Calling flush() before
- readBlock() solved this problem.
-
- \sa writeBlock()
-*/
-
-int QFile::readBlock( char *p, uint len )
-{
-#if defined(CHECK_NULL)
- if ( !p )
- qWarning( "QFile::readBlock: Null pointer error" );
-#endif
-#if defined(CHECK_STATE)
- if ( !isOpen() ) { // file not open
- qWarning( "QFile::readBlock: File not open" );
- return -1;
- }
- if ( !isReadable() ) { // reading not permitted
- qWarning( "QFile::readBlock: Read operation not permitted" );
- return -1;
- }
-#endif
- int nread = 0; // number of bytes read
- if ( !ungetchBuffer.isEmpty() ) {
- // need to add these to the returned string.
- int l = ungetchBuffer.length();
- while( nread < l ) {
- *p = ungetchBuffer[ l - nread - 1 ];
- p++;
- nread++;
- }
- ungetchBuffer.truncate( l - nread );
- }
-
- if ( nread < (int)len ) {
- if ( isRaw() ) { // raw file
- nread += READ( fd, p, len-nread );
- if ( len && nread <= 0 ) {
- nread = 0;
- setStatus(IO_ReadError);
- }
- } else { // buffered file
- nread += fread( p, 1, len-nread, fh );
- if ( (uint)nread != len ) {
- if ( ferror( fh ) || nread==0 )
- setStatus(IO_ReadError);
- }
- }
- }
- ioIndex += nread;
- return nread;
-}
-
-/*! \overload int writeBlock( const QByteArray& data )
-*/
-
-/*! \reimp
-
- Writes \e len bytes from \e p to the file and returns the number of
- bytes actually written.
-
- Returns -1 if a serious error occurred.
-
- \warning When working with buffered files, data may not be written
- to the file at once. Call flush() to make sure the data is really
- written.
-
- \sa readBlock()
-*/
-
-int QFile::writeBlock( const char *p, uint len )
-{
-#if defined(CHECK_NULL)
- if ( p == 0 && len != 0 )
- qWarning( "QFile::writeBlock: Null pointer error" );
-#endif
-#if defined(CHECK_STATE)
- if ( !isOpen() ) { // file not open
- qWarning( "QFile::writeBlock: File not open" );
- return -1;
- }
- if ( !isWritable() ) { // writing not permitted
- qWarning( "QFile::writeBlock: Write operation not permitted" );
- return -1;
- }
-#endif
- int nwritten; // number of bytes written
- if ( isRaw() ) // raw file
- nwritten = WRITE( fd, p, len );
- else // buffered file
- nwritten = fwrite( p, 1, len, fh );
- if ( nwritten != (int)len ) { // write error
- if ( errno == ENOSPC ) // disk is full
- setStatus( IO_ResourceError );
- else
- setStatus( IO_WriteError );
- if ( isRaw() ) // recalc file position
- ioIndex = (int)LSEEK( fd, 0, SEEK_CUR );
- else
- ioIndex = fseek( fh, 0, SEEK_CUR );
- } else {
- ioIndex += nwritten;
- }
- if ( ioIndex > length ) // update file length
- length = ioIndex;
- return nwritten;
-}
-
-/*!
- Returns the file handle of the file.
-
- This is a small positive integer, suitable for use with C library
- functions such as fdopen() and fcntl(), as well as with QSocketNotifier.
-
- If the file is not open or there is an error, handle() returns -1.
-
- \sa QSocketNotifier
-*/
-
-int QFile::handle() const
-{
- if ( !isOpen() )
- return -1;
- else if ( fh )
- return FILENO( fh );
- else
- return fd;
-}
-
-/*!
- Closes an open file.
-
- The file is not closed if it was opened with an existing file handle.
- If the existing file handle is a \c FILE*, the file is flushed.
- If the existing file handle is an \c int file descriptor, nothing
- is done to the file.
-
- Some "write-behind" filesystems may report an unspecified error on
- closing the file. These errors only indicate that something may
- have gone wrong since the previous open(). In such a case status()
- reports IO_UnspecifiedError after close(), otherwise IO_Ok.
-
- \sa open(), flush()
-*/
-
-
-void QFile::close()
-{
- bool ok = FALSE;
- if ( isOpen() ) { // file is not open
- if ( fh ) { // buffered file
- if ( ext_f )
- ok = fflush( fh ) != -1; // flush instead of closing
- else
- ok = fclose( fh ) != -1;
- } else { // raw file
- if ( ext_f )
- ok = TRUE; // cannot close
- else
- ok = CLOSE( fd ) != -1;
- }
- init(); // restore internal state
- }
- if (!ok)
- setStatus (IO_UnspecifiedError);
-
- return;
-}
diff --git a/qtools/qfile_win32.cpp b/qtools/qfile_win32.cpp
deleted file mode 100644
index 39b1fa5..0000000
--- a/qtools/qfile_win32.cpp
+++ /dev/null
@@ -1,593 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2001 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- * Based on qfile_unix.cpp
- *
- * Copyright (C) 1992-2000 Trolltech AS.
- */
-
-#include "qglobal.h"
-
-#include "qfile.h"
-#include "qfiledefs_p.h"
-
-#if defined(_OS_MAC_) || defined(_OS_MSDOS_) || defined(_OS_WIN32_) || defined(_OS_OS2_)
-# define HAS_TEXT_FILEMODE // has translate/text filemode
-#endif
-#if defined(O_NONBLOCK)
-# define HAS_ASYNC_FILEMODE
-# define OPEN_ASYNC O_NONBLOCK
-#elif defined(O_NDELAY)
-# define HAS_ASYNC_FILEMODE
-# define OPEN_ASYNC O_NDELAY
-#endif
-
-bool qt_file_access( const QString& fn, int t )
-{
- if ( fn.isEmpty() )
- return FALSE;
- return ACCESS( QFile::encodeName(fn), t ) == 0;
-}
-
-/*!
- Removes the file \a fileName.
- Returns TRUE if successful, otherwise FALSE.
-*/
-
-bool QFile::remove( const QString &fileName )
-{
- if ( fileName.isEmpty() ) {
-#if defined(CHECK_NULL)
- qWarning( "QFile::remove: Empty or null file name" );
-#endif
- return FALSE;
- }
- return ::remove( QFile::encodeName(fileName) ) == 0;
- // unlink more common in UNIX
-}
-
-#if defined(O_NONBLOCK)
-# define HAS_ASYNC_FILEMODE
-# define OPEN_ASYNC O_NONBLOCK
-#elif defined(O_NDELAY)
-# define HAS_ASYNC_FILEMODE
-# define OPEN_ASYNC O_NDELAY
-#endif
-
-/*!
- Opens the file specified by the file name currently set, using the mode \e m.
- Returns TRUE if successful, otherwise FALSE.
-
- The mode parameter \e m must be a combination of the following flags:
- <ul>
- <li>\c IO_Raw specified raw (non-buffered) file access.
- <li>\c IO_ReadOnly opens the file in read-only mode.
- <li>\c IO_WriteOnly opens the file in write-only mode (and truncates).
- <li>\c IO_ReadWrite opens the file in read/write mode, equivalent to
- \c (IO_ReadOnly|IO_WriteOnly).
- <li>\c IO_Append opens the file in append mode. This mode is very useful
- when you want to write something to a log file. The file index is set to
- the end of the file. Note that the result is undefined if you position the
- file index manually using at() in append mode.
- <li>\c IO_Truncate truncates the file.
- <li>\c IO_Translate enables carriage returns and linefeed translation
- for text files under MS-DOS, Windows and OS/2.
- </ul>
-
- The raw access mode is best when I/O is block-operated using 4kB block size
- or greater. Buffered access works better when reading small portions of
- data at a time.
-
- <strong>Important:</strong> When working with buffered files, data may
- not be written to the file at once. Call \link flush() flush\endlink
- to make sure the data is really written.
-
- \warning We have experienced problems with some C libraries when a buffered
- file is opened for both reading and writing. If a read operation takes place
- immediately after a write operation, the read buffer contains garbage data.
- Worse, the same garbage is written to the file. Calling flush() before
- readBlock() solved this problem.
-
- If the file does not exist and \c IO_WriteOnly or \c IO_ReadWrite is
- specified, it is created.
-
- Example:
- \code
- QFile f1( "/tmp/data.bin" );
- QFile f2( "readme.txt" );
- f1.open( IO_Raw | IO_ReadWrite | IO_Append );
- f2.open( IO_ReadOnly | IO_Translate );
- \endcode
-
- \sa name(), close(), isOpen(), flush()
-*/
-
-bool QFile::open( int m )
-{
- if ( isOpen() ) { // file already open
-#if defined(CHECK_STATE)
- qWarning( "QFile::open: File already open" );
-#endif
- return FALSE;
- }
- if ( fn.isNull() ) { // no file name defined
-#if defined(CHECK_NULL)
- qWarning( "QFile::open: No file name specified" );
-#endif
- return FALSE;
- }
- init(); // reset params
- setMode( m );
- if ( !(isReadable() || isWritable()) ) {
-#if defined(CHECK_RANGE)
- qWarning( "QFile::open: File access not specified" );
-#endif
- return FALSE;
- }
- bool ok = TRUE;
- STATBUF st;
- if ( isRaw() ) { // raw file I/O
- int oflags = OPEN_RDONLY;
- if ( isReadable() && isWritable() )
- oflags = OPEN_RDWR;
- else if ( isWritable() )
- oflags = OPEN_WRONLY;
- if ( flags() & IO_Append ) { // append to end of file?
- if ( flags() & IO_Truncate )
- oflags |= (OPEN_CREAT | OPEN_TRUNC);
- else
- oflags |= (OPEN_APPEND | OPEN_CREAT);
- setFlags( flags() | IO_WriteOnly ); // append implies write
- } else if ( isWritable() ) { // create/trunc if writable
- if ( flags() & IO_Truncate )
- oflags |= (OPEN_CREAT | OPEN_TRUNC);
- else
- oflags |= OPEN_CREAT;
- }
-#if defined(HAS_TEXT_FILEMODE)
- if ( isTranslated() )
- oflags |= OPEN_TEXT;
- else
- oflags |= OPEN_BINARY;
-#endif
-#if defined(HAS_ASYNC_FILEMODE)
- if ( isAsynchronous() )
- oflags |= OPEN_ASYNC;
-#endif
- fd = OPEN( QFile::encodeName(fn), oflags, 0666 );
-
- if ( fd != -1 ) { // open successful
- FSTAT( fd, &st ); // get the stat for later usage
- } else {
- ok = FALSE;
- }
- } else { // buffered file I/O
- QCString perm;
- char perm2[4];
- bool try_create = FALSE;
- if ( flags() & IO_Append ) { // append to end of file?
- setFlags( flags() | IO_WriteOnly ); // append implies write
- perm = isReadable() ? "a+" : "a";
- } else {
- if ( isReadWrite() ) {
- if ( flags() & IO_Truncate ) {
- perm = "w+";
- } else {
- perm = "r+";
- try_create = TRUE; // try to create if not exists
- }
- } else if ( isReadable() ) {
- perm = "r";
- } else if ( isWritable() ) {
- perm = "w";
- }
- }
- qstrcpy( perm2, perm );
- if ( isTranslated() )
- strcat( perm2, "t" );
- else
- strcat( perm2, "b" );
- while (1) { // At most twice
-
- fh = fopen( QFile::encodeName(fn), perm2 );
-
- if ( !fh && try_create ) {
- perm2[0] = 'w'; // try "w+" instead of "r+"
- try_create = FALSE;
- } else {
- break;
- }
- }
- if ( fh ) {
- FSTAT( FILENO(fh), &st ); // get the stat for later usage
- } else {
- ok = FALSE;
- }
- }
- if ( ok ) {
- setState( IO_Open );
- // on successful open the file stat was got; now test what type
- // of file we have
- if ( (st.st_mode & STAT_MASK) != STAT_REG ) {
- // non-seekable
- setType( IO_Sequential );
- length = INT_MAX;
- ioIndex = (flags() & IO_Append) == 0 ? 0 : length;
- } else {
- length = (int)st.st_size;
- ioIndex = (flags() & IO_Append) == 0 ? 0 : length;
- if ( (flags() & !IO_Truncate) && length == 0 && isReadable() ) {
- // try if you can read from it (if you can, it's a sequential
- // device; e.g. a file in the /proc filesystem)
- int c = getch();
- if ( c != -1 ) {
- ungetch(c);
- setType( IO_Sequential );
- length = INT_MAX;
- }
- }
- }
- } else {
- init();
- if ( errno == EMFILE ) // no more file handles/descrs
- setStatus( IO_ResourceError );
- else
- setStatus( IO_OpenError );
- }
- return ok;
-}
-
-/*!
- Opens a file in the mode \e m using an existing file handle \e f.
- Returns TRUE if successful, otherwise FALSE.
-
- Example:
- \code
- #include <stdio.h>
-
- void printError( const char* msg )
- {
- QFile f;
- f.open( IO_WriteOnly, stderr );
- f.writeBlock( msg, qstrlen(msg) ); // write to stderr
- f.close();
- }
- \endcode
-
- When a QFile is opened using this function, close() does not actually
- close the file, only flushes it.
-
- \warning If \e f is \c stdin, \c stdout, \c stderr, you may not
- be able to seek. See QIODevice::isSequentialAccess() for more
- information.
-
- \sa close()
-*/
-
-bool QFile::open( int m, FILE *f )
-{
- if ( isOpen() ) {
-#if defined(CHECK_RANGE)
- qWarning( "QFile::open: File already open" );
-#endif
- return FALSE;
- }
- init();
- setMode( m &~IO_Raw );
- setState( IO_Open );
- fh = f;
- ext_f = TRUE;
- STATBUF st;
- FSTAT( FILENO(fh), &st );
- ioIndex = (int)ftell( fh );
- if ( (st.st_mode & STAT_MASK) != STAT_REG ) {
- // non-seekable
- setType( IO_Sequential );
- length = INT_MAX;
- } else {
- length = (int)st.st_size;
- if ( (flags() & !IO_Truncate) && length == 0 && isReadable() ) {
- // try if you can read from it (if you can, it's a sequential
- // device; e.g. a file in the /proc filesystem)
- int c = getch();
- if ( c != -1 ) {
- ungetch(c);
- setType( IO_Sequential );
- length = INT_MAX;
- }
- }
- }
- return TRUE;
-}
-
-/*!
- Opens a file in the mode \e m using an existing file descriptor \e f.
- Returns TRUE if successful, otherwise FALSE.
-
- When a QFile is opened using this function, close() does not actually
- close the file.
-
- \warning If \e f is one of 0 (stdin), 1 (stdout) or 2 (stderr), you may not
- be able to seek. size() is set to \c INT_MAX (in limits.h).
-
- \sa close()
-*/
-
-
-bool QFile::open( int m, int f )
-{
- if ( isOpen() ) {
-#if defined(CHECK_RANGE)
- qWarning( "QFile::open: File already open" );
-#endif
- return FALSE;
- }
- init();
- setMode( m |IO_Raw );
- setState( IO_Open );
- fd = f;
- ext_f = TRUE;
- STATBUF st;
- FSTAT( fd, &st );
- ioIndex = (int)LSEEK(fd, 0, SEEK_CUR);
- if ( (st.st_mode & STAT_MASK) != STAT_REG ) {
- // non-seekable
- setType( IO_Sequential );
- length = INT_MAX;
- } else {
- length = (int)st.st_size;
- if ( length == 0 && isReadable() ) {
- // try if you can read from it (if you can, it's a sequential
- // device; e.g. a file in the /proc filesystem)
- int c = getch();
- if ( c != -1 ) {
- ungetch(c);
- setType( IO_Sequential );
- length = INT_MAX;
- }
- }
- }
- return TRUE;
-}
-
-/*!
- Returns the file size.
- \sa at()
-*/
-
-uint QFile::size() const
-{
- STATBUF st;
- if ( isOpen() ) {
- FSTAT( fh ? FILENO(fh) : fd, &st );
- } else {
- STAT( QFile::encodeName(fn), &st );
- }
- return st.st_size;
-}
-
-/*!
- \fn int QFile::at() const
- Returns the file index.
- \sa size()
-*/
-
-/*!
- Sets the file index to \e pos. Returns TRUE if successful, otherwise FALSE.
-
- Example:
- \code
- QFile f( "data.bin" );
- f.open( IO_ReadOnly ); // index set to 0
- f.at( 100 ); // set index to 100
- f.at( f.at()+50 ); // set index to 150
- f.at( f.size()-80 ); // set index to 80 before EOF
- f.close();
- \endcode
-
- \warning The result is undefined if the file was \link open() opened\endlink
- using the \c IO_Append specifier.
-
- \sa size(), open()
-*/
-
-bool QFile::at( int pos )
-{
- if ( !isOpen() ) {
-#if defined(CHECK_STATE)
- qWarning( "QFile::at: File is not open" );
-#endif
- return FALSE;
- }
- bool ok;
- if ( isRaw() ) { // raw file
- pos = (int)LSEEK(fd, pos, SEEK_SET);
- ok = pos != -1;
- } else { // buffered file
- ok = fseek(fh, pos, SEEK_SET) == 0;
- }
- if ( ok )
- ioIndex = pos;
-#if defined(CHECK_RANGE)
- else
- qWarning( "QFile::at: Cannot set file position %d", pos );
-#endif
- return ok;
-}
-
-/*!
- Reads at most \e len bytes from the file into \e p and returns the
- number of bytes actually read.
-
- Returns -1 if a serious error occurred.
-
- \warning We have experienced problems with some C libraries when a buffered
- file is opened for both reading and writing. If a read operation takes place
- immediately after a write operation, the read buffer contains garbage data.
- Worse, the same garbage is written to the file. Calling flush() before
- readBlock() solved this problem.
-
- \sa writeBlock()
-*/
-
-int QFile::readBlock( char *p, uint len )
-{
-#if defined(CHECK_NULL)
- if ( !p )
- qWarning( "QFile::readBlock: Null pointer error" );
-#endif
-#if defined(CHECK_STATE)
- if ( !isOpen() ) { // file not open
- qWarning( "QFile::readBlock: File not open" );
- return -1;
- }
- if ( !isReadable() ) { // reading not permitted
- qWarning( "QFile::readBlock: Read operation not permitted" );
- return -1;
- }
-#endif
- int nread; // number of bytes read
- if ( isRaw() ) { // raw file
- nread = READ( fd, p, len );
- if ( len && nread <= 0 ) {
- nread = 0;
- setStatus(IO_ReadError);
- }
- } else { // buffered file
- nread = fread( p, 1, len, fh );
- if ( (uint)nread != len ) {
- if ( ferror( fh ) || nread==0 )
- setStatus(IO_ReadError);
- }
- }
- ioIndex += nread;
- return nread;
-}
-
-/*! \overload int writeBlock( const QByteArray& data )
-*/
-
-/*! \reimp
-
- Writes \e len bytes from \e p to the file and returns the number of
- bytes actually written.
-
- Returns -1 if a serious error occurred.
-
- \warning When working with buffered files, data may not be written
- to the file at once. Call flush() to make sure the data is really
- written.
-
- \sa readBlock()
-*/
-
-int QFile::writeBlock( const char *p, uint len )
-{
-#if defined(CHECK_NULL)
- if ( p == 0 && len != 0 )
- qWarning( "QFile::writeBlock: Null pointer error" );
-#endif
-#if defined(CHECK_STATE)
- if ( !isOpen() ) { // file not open
- qWarning( "QFile::writeBlock: File not open" );
- return -1;
- }
- if ( !isWritable() ) { // writing not permitted
- qWarning( "QFile::writeBlock: Write operation not permitted" );
- return -1;
- }
-#endif
- int nwritten; // number of bytes written
- if ( isRaw() ) // raw file
- nwritten = WRITE( fd, p, len );
- else // buffered file
- nwritten = fwrite( p, 1, len, fh );
- if ( nwritten != (int)len ) { // write error
- if ( errno == ENOSPC ) // disk is full
- setStatus( IO_ResourceError );
- else
- setStatus( IO_WriteError );
- if ( isRaw() ) // recalc file position
- ioIndex = (int)LSEEK( fd, 0, SEEK_CUR );
- else
- ioIndex = fseek( fh, 0, SEEK_CUR );
- } else {
- ioIndex += nwritten;
- }
- if ( ioIndex > length ) // update file length
- length = ioIndex;
- return nwritten;
-}
-
-/*!
- Returns the file handle of the file.
-
- This is a small positive integer, suitable for use with C library
- functions such as fdopen() and fcntl(), as well as with QSocketNotifier.
-
- If the file is not open or there is an error, handle() returns -1.
-
- \sa QSocketNotifier
-*/
-
-int QFile::handle() const
-{
- if ( !isOpen() )
- return -1;
- else if ( fh )
- return FILENO( fh );
- else
- return fd;
-}
-
-/*!
- Closes an open file.
-
- The file is not closed if it was opened with an existing file handle.
- If the existing file handle is a \c FILE*, the file is flushed.
- If the existing file handle is an \c int file descriptor, nothing
- is done to the file.
-
- Some "write-behind" filesystems may report an unspecified error on
- closing the file. These errors only indicate that something may
- have gone wrong since the previous open(). In such a case status()
- reports IO_UnspecifiedError after close(), otherwise IO_Ok.
-
- \sa open(), flush()
-*/
-
-
-void QFile::close()
-{
- bool ok = FALSE;
- if ( isOpen() ) { // file is not open
- if ( fh ) { // buffered file
- if ( ext_f )
- ok = fflush( fh ) != -1; // flush instead of closing
- else
- ok = fclose( fh ) != -1;
- } else { // raw file
- if ( ext_f )
- ok = TRUE; // cannot close
- else
- ok = CLOSE( fd ) != -1;
- }
- init(); // restore internal state
- }
- if (!ok)
- setStatus (IO_UnspecifiedError);
-
- return;
-}
diff --git a/qtools/qfiledefs_p.h b/qtools/qfiledefs_p.h
deleted file mode 100644
index 4a1a154..0000000
--- a/qtools/qfiledefs_p.h
+++ /dev/null
@@ -1,259 +0,0 @@
-/****************************************************************************
-**
-**
-** Common macros and system include files for QFile, QFileInfo and QDir.
-**
-** Created : 930812
-**
-** 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 QFILEDEFS_P_H
-#define QFILEDEFS_P_H
-
-
-//
-// W A R N I N G
-// -------------
-//
-// This file is not part of the Qt API. It exists for the convenience
-// of qfile.cpp, qfileinfo.cpp and qdir.cpp.
-// This header file may change from version to version without notice,
-// or even be removed.
-//
-//
-
-
-#if defined(_CC_MWERKS_)
-# include <stdlib.h>
-# include <stat.h>
-#elif !defined(_OS_MAC_)
-# include <sys/types.h>
-# include <sys/stat.h>
-#endif
-#include <fcntl.h>
-#include <errno.h>
-#if defined(_OS_UNIX_)
-# include <dirent.h>
-# include <unistd.h>
-#endif
-#if defined(_OS_MSDOS_) || defined(_OS_WIN32_) || defined(_OS_OS2_)
-# define _OS_FATFS_
-# if defined(__CYGWIN32__)
-# include <dirent.h>
-# include <unistd.h>
-# if !defined(_OS_UNIX_)
-# define _OS_UNIX_
-# endif
-# else
-# include <io.h>
-# if !defined(_CC_MWERKS_)
-# include <dos.h>
-# endif
-# include <direct.h>
-# endif
-#endif
-#include <limits.h>
-
-
-#if !defined(PATH_MAX)
-#if defined( MAXPATHLEN )
-#define PATH_MAX MAXPATHLEN
-#else
-#define PATH_MAX 1024
-#endif
-#endif
-
-
-#undef STATBUF
-#undef STAT
-#undef STAT_REG
-#undef STAT_DIR
-#undef STAT_LNK
-#undef STAT_MASK
-#undef FILENO
-#undef OPEN
-#undef CLOSE
-#undef LSEEK
-#undef READ
-#undef WRITE
-#undef ACCESS
-#undef GETCWD
-#undef CHDIR
-#undef MKDIR
-#undef RMDIR
-#undef OPEN_RDONLY
-#undef OPEN_WRONLY
-#undef OPEN_CREAT
-#undef OPEN_TRUNC
-#undef OPEN_APPEND
-#undef OPEN_TEXT
-#undef OPEN_BINARY
-
-
-#if defined(_CC_MSVC_) || defined(_CC_SYM_)
-
-# define STATBUF struct _stat // non-ANSI defs
-# define STATBUF4TSTAT struct _stat // non-ANSI defs
-# define STAT ::_stat
-# define FSTAT ::_fstat
-# define STAT_REG _S_IFREG
-# define STAT_DIR _S_IFDIR
-# define STAT_MASK _S_IFMT
-# if defined(_S_IFLNK)
-# define STAT_LNK _S_IFLNK
-# endif
-# define FILENO _fileno
-# define OPEN ::_open
-# define CLOSE ::_close
-# define LSEEK ::_lseek
-# define READ ::_read
-# define WRITE ::_write
-# define ACCESS ::_access
-# define GETCWD ::_getcwd
-# define CHDIR ::_chdir
-# define MKDIR ::_mkdir
-# define RMDIR ::_rmdir
-# define OPEN_RDONLY _O_RDONLY
-# define OPEN_WRONLY _O_WRONLY
-# define OPEN_RDWR _O_RDWR
-# define OPEN_CREAT _O_CREAT
-# define OPEN_TRUNC _O_TRUNC
-# define OPEN_APPEND _O_APPEND
-# if defined(O_TEXT)
-# define OPEN_TEXT _O_TEXT
-# define OPEN_BINARY _O_BINARY
-# endif
-
-#elif defined(_CC_BOR_) && __BORLANDC__ >= 0x550
-
-# define STATBUF struct stat // non-ANSI defs
-# define STATBUF4TSTAT struct _stat // non-ANSI defs
-# define STAT ::stat
-# define FSTAT ::fstat
-# define STAT_REG _S_IFREG
-# define STAT_DIR _S_IFDIR
-# define STAT_MASK _S_IFMT
-# if defined(_S_IFLNK)
-# define STAT_LNK _S_IFLNK
-# endif
-# define FILENO _fileno
-# define OPEN ::open
-# define CLOSE ::_close
-# define LSEEK ::_lseek
-# define READ ::_read
-# define WRITE ::_write
-# define ACCESS ::_access
-# define GETCWD ::_getcwd
-# define CHDIR ::chdir
-# define MKDIR ::_mkdir
-# define RMDIR ::_rmdir
-# define OPEN_RDONLY _O_RDONLY
-# define OPEN_WRONLY _O_WRONLY
-# define OPEN_RDWR _O_RDWR
-# define OPEN_CREAT _O_CREAT
-# define OPEN_TRUNC _O_TRUNC
-# define OPEN_APPEND _O_APPEND
-# if defined(O_TEXT)
-# define OPEN_TEXT _O_TEXT
-# define OPEN_BINARY _O_BINARY
-# endif
-
-#else // all other systems
-
-# define STATBUF struct stat
-# define STATBUF4TSTAT struct stat
-# define STAT ::stat
-# define FSTAT ::fstat
-# define STAT_REG S_IFREG
-# define STAT_DIR S_IFDIR
-# define STAT_MASK S_IFMT
-# if defined(S_IFLNK)
-# define STAT_LNK S_IFLNK
-# endif
-# define FILENO fileno
-# define OPEN ::open
-# define CLOSE ::close
-# define LSEEK ::lseek
-# define READ ::read
-# define WRITE ::write
-# define ACCESS ::access
-# if defined(_OS_OS2EMX_)
-# define GETCWD ::_getcwd2
-# define CHDIR ::_chdir2
-# else
-# define GETCWD ::getcwd
-# define CHDIR ::chdir
-# endif
-# define MKDIR ::mkdir
-# define RMDIR ::rmdir
-# define OPEN_RDONLY O_RDONLY
-# define OPEN_WRONLY O_WRONLY
-# define OPEN_RDWR O_RDWR
-# define OPEN_CREAT O_CREAT
-# define OPEN_TRUNC O_TRUNC
-# define OPEN_APPEND O_APPEND
-# if defined(O_TEXT)
-# define OPEN_TEXT O_TEXT
-# define OPEN_BINARY O_BINARY
-# endif
-#endif
-
-#if defined(_CC_MWERKS_)
-#undef mkdir
-#undef MKDIR
-#define MKDIR _mkdir
-#undef rmdir
-#undef RMDIR
-#define RMDIR _rmdir
-#endif
-
-
-#if defined(_OS_FATFS_)
-# define F_OK 0
-# define X_OK 1
-# define W_OK 2
-# define R_OK 4
-#endif
-
-#if defined(_OS_MAC_)
-# define F_OK 0
-# define X_OK 1
-# define W_OK 2
-# define R_OK 4
-#endif
-
-struct QFileInfoCache
-{
- STATBUF st;
- bool isSymLink;
-};
-
-#endif
diff --git a/qtools/qfileinfo.cpp b/qtools/qfileinfo.cpp
deleted file mode 100644
index 5053b76..0000000
--- a/qtools/qfileinfo.cpp
+++ /dev/null
@@ -1,458 +0,0 @@
-/****************************************************************************
-**
-**
-** Implementation of QFileInfo class
-**
-** Created : 950628
-**
-** 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 "qglobal.h"
-
-#include "qfileinfo.h"
-#include "qfiledefs_p.h"
-#include "qdatetime.h"
-#include "qdir.h"
-
-extern bool qt_file_access( const QString& fn, int t );
-
-// NOT REVISED
-/*!
- \class QFileInfo qfileinfo.h
- \brief The QFileInfo class provides system-independent file information.
-
- \ingroup io
-
- QFileInfo provides information about a file's name and position (path) in
- the file system, its access rights and whether it is a directory or a
- symbolic link. Its size and last modified/read times are also available.
-
- To speed up performance QFileInfo caches information about the file. Since
- files can be changed by other users or programs, or even by other parts of
- the same program there is a function that refreshes the file information;
- refresh(). If you would rather like a QFileInfo to access the file system
- every time you request information from it, you can call the function
- setCaching( FALSE ).
-
- A QFileInfo can point to a file using either a relative or an absolute
- file path. Absolute file paths begin with the directory separator
- ('/') or a drive specification (not applicable to UNIX).
- Relative file names begin with a directory name or a file name and specify
- a path relative to the current directory. An example of
- an absolute path is the string "/tmp/quartz". A relative path might look like
- "src/fatlib". You can use the function isRelative() to check if a QFileInfo
- is using a relative or an absolute file path. You can call the function
- convertToAbs() to convert a relative QFileInfo to an absolute one.
-
- If you need to read and traverse directories, see the QDir class.
-*/
-
-
-/*!
- Constructs a new empty QFileInfo.
-*/
-
-QFileInfo::QFileInfo()
-{
- fic = 0;
- cache = TRUE;
-}
-
-/*!
- Constructs a new QFileInfo that gives information about the given file.
- The string given can be an absolute or a relative file path.
-
- \sa bool setFile(QString ), isRelative(), QDir::setCurrent(),
- QDir::isRelativePath()
-*/
-
-QFileInfo::QFileInfo( const QString &file )
-{
- fn = file;
- slashify( fn );
- fic = 0;
- cache = TRUE;
-}
-
-/*!
- Constructs a new QFileInfo that gives information about \e file.
-
- If the file has a relative path, the QFileInfo will also have one.
-
- \sa isRelative()
-*/
-
-QFileInfo::QFileInfo( const QFile &file )
-{
- fn = file.name();
- slashify( fn );
- fic = 0;
- cache = TRUE;
-}
-
-/*!
- Constructs a new QFileInfo that gives information about the file
- named \e fileName in the directory \e d.
-
- If the directory has a relative path, the QFileInfo will also have one.
-
- \sa isRelative()
-*/
-#ifndef QT_NO_DIR
-QFileInfo::QFileInfo( const QDir &d, const QString &fileName )
-{
- fn = d.filePath( fileName );
- slashify( fn );
- fic = 0;
- cache = TRUE;
-}
-#endif
-/*!
- Constructs a new QFileInfo that is a copy of \e fi.
-*/
-
-QFileInfo::QFileInfo( const QFileInfo &fi )
-{
- fn = fi.fn;
- if ( fi.fic ) {
- fic = new QFileInfoCache;
- *fic = *fi.fic;
- } else {
- fic = 0;
- }
- cache = fi.cache;
-}
-
-/*!
- Destructs the QFileInfo.
-*/
-
-QFileInfo::~QFileInfo()
-{
- delete fic;
-}
-
-
-/*!
- Makes a copy of \e fi and assigns it to this QFileInfo.
-*/
-
-QFileInfo &QFileInfo::operator=( const QFileInfo &fi )
-{
- fn = fi.fn;
- if ( !fi.fic ) {
- delete fic;
- fic = 0;
- } else {
- if ( !fic ) {
- fic = new QFileInfoCache;
- CHECK_PTR( fic );
- }
- *fic = *fi.fic;
- }
- cache = fi.cache;
- return *this;
-}
-
-
-/*!
- Sets the file to obtain information about.
-
- The string given can be an absolute or a relative file path. Absolute file
- paths begin with the directory separator (e.g. '/' under UNIX) or a drive
- specification (not applicable to UNIX). Relative file names begin with a
- directory name or a file name and specify a path relative to the current
- directory.
-
- Example:
- \code
- #include <qfileinfo.h>
- #include <qdir.h>
-
- void test()
- {
- QString absolute = "/liver/aorta";
- QString relative = "liver/aorta";
- QFileInfo fi1( absolute );
- QFileInfo fi2( relative );
-
- QDir::setCurrent( QDir::rootDirPath() );
- // fi1 and fi2 now point to the same file
-
- QDir::setCurrent( "/tmp" );
- // fi1 now points to "/liver/aorta",
- // while fi2 points to "/tmp/liver/aorta"
- }
- \endcode
-
- \sa isRelative(), QDir::setCurrent(), QDir::isRelativePath()
-*/
-
-void QFileInfo::setFile( const QString &file )
-{
- fn = file;
- slashify( fn );
- delete fic;
- fic = 0;
-}
-
-/*!
- Sets the file to obtain information about.
-
- If the file has a relative path, the QFileInfo will also have one.
-
- \sa isRelative()
-*/
-
-void QFileInfo::setFile( const QFile &file )
-{
- fn = file.name();
- slashify( fn );
- delete fic;
- fic = 0;
-}
-
-/*!
- Sets the file to obtains information about to \e fileName in the
- directory \e d.
-
- If the directory has a relative path, the QFileInfo will also have one.
-
- \sa isRelative()
-*/
-#ifndef QT_NO_DIR
-void QFileInfo::setFile( const QDir &d, const QString &fileName )
-{
- fn = d.filePath( fileName );
- slashify( fn );
- delete fic;
- fic = 0;
-}
-#endif
-
-/*!
- Returns TRUE if the file pointed to exists, otherwise FALSE.
-*/
-
-bool QFileInfo::exists() const
-{
- return qt_file_access( fn, F_OK );
-}
-
-/*!
- Refresh the information about the file, i.e. read in information from the
- file system the next time a cached property is fetched.
-
- \sa setCaching()
-*/
-
-void QFileInfo::refresh() const
-{
- QFileInfo *that = (QFileInfo*)this; // Mutable function
- delete that->fic;
- that->fic = 0;
-}
-
-/*!
- \fn bool QFileInfo::caching() const
- Returns TRUE if caching is enabled.
- \sa setCaching(), refresh()
-*/
-
-/*!
- Enables caching of file information if \e enable is TRUE, or disables it
- if \e enable is FALSE.
-
- When caching is enabled, QFileInfo reads the file information the first
- time
-
- Caching is enabled by default.
-
- \sa refresh(), caching()
-*/
-
-void QFileInfo::setCaching( bool enable )
-{
- if ( cache == enable )
- return;
- cache = enable;
- if ( cache ) {
- delete fic;
- fic = 0;
- }
-}
-
-
-/*!
- Returns the name, i.e. the file name including the path (which can be
- absolute or relative).
-
- \sa isRelative(), absFilePath()
-*/
-
-QString QFileInfo::filePath() const
-{
- return fn;
-}
-
-/*!
- Returns the base name of the file.
-
- The base name consists of all characters in the file name up to (but not
- including) the first '.' character. The path is not included.
-
- Example:
- \code
- QFileInfo fi( "/tmp/abdomen.lower" );
- QString base = fi.baseName(); // base = "abdomen"
- \endcode
-
- \sa fileName(), extension()
-*/
-
-QString QFileInfo::baseName() const
-{
- QString tmp = fileName();
- int pos = tmp.find( '.' );
- if ( pos == -1 )
- return tmp;
- else
- return tmp.left( pos );
-}
-
-/*!
- Returns the extension name of the file.
-
- If \a complete is TRUE (the default), extension() returns the string
- of all characters in the file name after (but not including) the
- first '.' character. For a file named "archive.tar.gz" this
- returns "tar.gz".
-
- If \a complete is FALSE, extension() returns the string of all
- characters in the file name after (but not including) the last '.'
- character. For a file named "archive.tar.gz" this returns "gz".
-
- Example:
- \code
- QFileInfo fi( "lex.yy.c" );
- QString ext = fi.extension(); // ext = "yy.c"
- QString ext = fi.extension( FALSE ); // ext = "c"
- \endcode
-
- \sa fileName(), baseName()
-
-*/
-
-QString QFileInfo::extension( bool complete ) const
-{
- QString s = fileName();
- int pos = complete ? s.find( '.' ) : s.findRev( '.' );
- if ( pos < 0 )
- return QString::fromLatin1( "" );
- else
- return s.right( s.length() - pos - 1 );
-}
-
-/*!
- Returns the directory path of the file.
-
- If the QFileInfo is relative and \e absPath is FALSE, the QDir will be
- relative, otherwise it will be absolute.
-
- \sa dirPath(), filePath(), fileName(), isRelative()
-*/
-#ifndef QT_NO_DIR
-QDir QFileInfo::dir( bool absPath ) const
-{
- return QDir( dirPath(absPath) );
-}
-#endif
-
-
-/*!
- Returns TRUE if the file is readable.
- \sa isWritable(), isExecutable(), permission()
-*/
-
-bool QFileInfo::isReadable() const
-{
- return qt_file_access( fn, R_OK );
-}
-
-/*!
- Returns TRUE if the file is writable.
- \sa isReadable(), isExecutable(), permission()
-*/
-
-bool QFileInfo::isWritable() const
-{
- return qt_file_access( fn, W_OK );
-}
-
-/*!
- Returns TRUE if the file is executable.
- \sa isReadable(), isWritable(), permission()
-*/
-
-bool QFileInfo::isExecutable() const
-{
- return qt_file_access( fn, X_OK );
-}
-
-
-/*!
- Returns TRUE if the file path name is relative to the current directory,
- FALSE if the path is absolute (e.g. under UNIX a path is relative if it
- does not start with a '/').
-
- According to Einstein this function should always return TRUE.
-*/
-#ifndef QT_NO_DIR
-bool QFileInfo::isRelative() const
-{
- return QDir::isRelativePath( fn );
-}
-
-/*!
- Converts the file path name to an absolute path.
-
- If it is already absolute nothing is done.
-
- \sa filePath(), isRelative()
-*/
-
-bool QFileInfo::convertToAbs()
-{
- if ( isRelative() )
- fn = absFilePath();
- return QDir::isRelativePath( fn );
-}
-#endif
diff --git a/qtools/qfileinfo.h b/qtools/qfileinfo.h
deleted file mode 100644
index 76ef8c2..0000000
--- a/qtools/qfileinfo.h
+++ /dev/null
@@ -1,138 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QFileInfo class
-**
-** Created : 950628
-**
-** 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 QFILEINFO_H
-#define QFILEINFO_H
-
-#ifndef QT_H
-#include "qfile.h"
-#include "qdatetime.h"
-#endif // QT_H
-
-
-class QDir;
-struct QFileInfoCache;
-
-
-class Q_EXPORT QFileInfo // file information class
-{
-public:
- enum PermissionSpec {
- ReadUser = 0400, WriteUser = 0200, ExeUser = 0100,
- ReadGroup = 0040, WriteGroup = 0020, ExeGroup = 0010,
- ReadOther = 0004, WriteOther = 0002, ExeOther = 0001 };
-
- QFileInfo();
- QFileInfo( const QString &file );
- QFileInfo( const QFile & );
-#ifndef QT_NO_DIR
- QFileInfo( const QDir &, const QString &fileName );
-#endif
- QFileInfo( const QFileInfo & );
- ~QFileInfo();
-
- QFileInfo &operator=( const QFileInfo & );
-
- void setFile( const QString &file );
- void setFile( const QFile & );
-#ifndef QT_NO_DIR
- void setFile( const QDir &, const QString &fileName );
-#endif
- bool exists() const;
- void refresh() const;
- bool caching() const;
- void setCaching( bool );
-
- QString filePath() const;
- QString fileName() const;
-#ifndef QT_NO_DIR //###
- QString absFilePath() const;
-#endif
- QString baseName() const;
- QString extension( bool complete = TRUE ) const;
-
-#ifndef QT_NO_DIR //###
- QString dirPath( bool absPath = FALSE ) const;
-#endif
-#ifndef QT_NO_DIR
- QDir dir( bool absPath = FALSE ) const;
-#endif
- bool isReadable() const;
- bool isWritable() const;
- bool isExecutable() const;
-
-#ifndef QT_NO_DIR //###
- bool isRelative() const;
- bool convertToAbs();
-#endif
-
- bool isFile() const;
- bool isDir() const;
- bool isSymLink() const;
-
- QString readLink() const;
-
- QString owner() const;
- uint ownerId() const;
- QString group() const;
- uint groupId() const;
-
- bool permission( int permissionSpec ) const;
-
- uint size() const;
-
- QDateTime lastModified() const;
- QDateTime lastRead() const;
-
-private:
- void doStat() const;
- static void slashify( QString & );
- static void makeAbs( QString & );
-
- QString fn;
- QFileInfoCache *fic;
- bool cache;
-};
-
-
-inline bool QFileInfo::caching() const
-{
- return cache;
-}
-
-
-#endif // QFILEINFO_H
diff --git a/qtools/qfileinfo_unix.cpp b/qtools/qfileinfo_unix.cpp
deleted file mode 100644
index 5a8fe04..0000000
--- a/qtools/qfileinfo_unix.cpp
+++ /dev/null
@@ -1,425 +0,0 @@
-/****************************************************************************
-**
-**
-** Implementation of QFileInfo class
-**
-** Created : 950628
-**
-** 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 for Unix/X11 or for Qt/Embedded 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 "qglobal.h"
-
-#if defined(_OS_SUN_)
-#define readlink _qt_hide_readlink
-#endif
-
-#include <pwd.h>
-#include <grp.h>
-
-#include "qfileinfo.h"
-#include "qfiledefs_p.h"
-#include "qdatetime.h"
-#include "qdir.h"
-
-#if defined(_OS_SUN_)
-#undef readlink
-extern "C" int readlink( const char *, void *, uint );
-#endif
-
-
-void QFileInfo::slashify( QString& )
-{
- return;
-}
-
-
-void QFileInfo::makeAbs( QString & )
-{
- return;
-}
-
-extern bool qt_file_access( const QString& fn, int t );
-
-/*!
- Returns TRUE if we are pointing to a real file.
- \sa isDir(), isSymLink()
-*/
-bool QFileInfo::isFile() const
-{
- if ( !fic || !cache )
- doStat();
- return fic ? (fic->st.st_mode & STAT_MASK) == STAT_REG : FALSE;
-}
-
-/*!
- Returns TRUE if we are pointing to a directory or a symbolic link to
- a directory.
- \sa isFile(), isSymLink()
-*/
-
-bool QFileInfo::isDir() const
-{
- if ( !fic || !cache )
- doStat();
- return fic ? (fic->st.st_mode & STAT_MASK) == STAT_DIR : FALSE;
-}
-
-/*!
- Returns TRUE if we are pointing to a symbolic link.
- \sa isFile(), isDir(), readLink()
-*/
-
-bool QFileInfo::isSymLink() const
-{
- if ( !fic || !cache )
- doStat();
- return fic ? fic->isSymLink : FALSE;
-}
-
-
-/*!
- Returns the name a symlink points to, or a null QString if the
- object does not refer to a symbolic link.
-
- This name may not represent an existing file; it is only a string.
- QFileInfo::exists() returns TRUE if the symlink points to an
- existing file.
-
- \sa exists(), isSymLink(), isDir(), isFile()
-*/
-
-QString QFileInfo::readLink() const
-{
- QString r;
-
-#if defined(_OS_UNIX_) && !defined(_OS_OS2EMX_)
- char s[PATH_MAX+1];
- if ( !isSymLink() )
- return QString();
- int len = readlink( QFile::encodeName(fn).data(), s, PATH_MAX );
- if ( len >= 0 ) {
- s[len] = '\0';
- r = QFile::decodeName(s);
- }
-#endif
-
- return r;
-}
-
-static const uint nobodyID = (uint) -2;
-
-/*!
- Returns the owner of the file.
-
- On systems where files do not have owners this function returns 0.
-
- Note that this function can be time-consuming under UNIX. (in the order
- of milliseconds on a 486 DX2/66 running Linux).
-
- \sa ownerId(), group(), groupId()
-*/
-
-QString QFileInfo::owner() const
-{
- passwd *pw = getpwuid( ownerId() );
- if ( pw )
- return QFile::decodeName( pw->pw_name );
- return QString::null;
-}
-
-/*!
- Returns the id of the owner of the file.
-
- On systems where files do not have owners this function returns ((uint) -2).
-
- \sa owner(), group(), groupId()
-*/
-
-uint QFileInfo::ownerId() const
-{
- if ( !fic || !cache )
- doStat();
- if ( fic )
- return fic->st.st_uid;
- return nobodyID;
-}
-
-/*!
- Returns the group the file belongs to.
-
- On systems where files do not have groups this function always
- returns 0.
-
- Note that this function can be time-consuming under UNIX (in the order of
- milliseconds on a 486 DX2/66 running Linux).
-
- \sa groupId(), owner(), ownerId()
-*/
-
-QString QFileInfo::group() const
-{
- struct group *gr = getgrgid( groupId() );
- if ( gr )
- return QFile::decodeName( gr->gr_name );
- return QString::null;
-}
-
-/*!
- Returns the id of the group the file belongs to.
-
- On systems where files do not have groups this function always
- returns ((uind) -2).
-
- \sa group(), owner(), ownerId()
-*/
-
-uint QFileInfo::groupId() const
-{
- if ( !fic || !cache )
- doStat();
- if ( fic )
- return fic->st.st_gid;
- return nobodyID;
-}
-
-
-/*!
- \fn bool QFileInfo::permission( int permissionSpec ) const
-
- Tests for file permissions. The \e permissionSpec argument can be several
- flags of type PermissionSpec or'ed together to check for permission
- combinations.
-
- On systems where files do not have permissions this function always
- returns TRUE.
-
- Example:
- \code
- QFileInfo fi( "/tmp/tonsils" );
- if ( fi.permission( QFileInfo::WriteUser | QFileInfo::ReadGroup ) )
- qWarning( "Tonsils can be changed by me, and the group can read them.");
- if ( fi.permission( QFileInfo::WriteGroup | QFileInfo::WriteOther ) )
- qWarning( "Danger! Tonsils can be changed by the group or others!" );
- \endcode
-
- \sa isReadable(), isWritable(), isExecutable()
-*/
-
-bool QFileInfo::permission( int permissionSpec ) const
-{
- if ( !fic || !cache )
- doStat();
- if ( fic ) {
- uint mask = 0;
- if ( permissionSpec & ReadUser)
- mask |= S_IRUSR;
- if ( permissionSpec & WriteUser)
- mask |= S_IWUSR;
- if ( permissionSpec & ExeUser)
- mask |= S_IXUSR;
- if ( permissionSpec & ReadGroup)
- mask |= S_IRGRP;
- if ( permissionSpec & WriteGroup)
- mask |= S_IWGRP;
- if ( permissionSpec & ExeGroup)
- mask |= S_IXGRP;
- if ( permissionSpec & ReadOther)
- mask |= S_IROTH;
- if ( permissionSpec & WriteOther)
- mask |= S_IWOTH;
- if ( permissionSpec & ExeOther)
- mask |= S_IXOTH;
- if ( mask ) {
- return (fic->st.st_mode & mask) == mask;
- } else {
-#if defined(CHECK_NULL)
- qWarning( "QFileInfo::permission: permissionSpec is 0" );
-#endif
- return TRUE;
- }
- } else {
- return FALSE;
- }
-}
-
-/*!
- Returns the file size in bytes, or 0 if the file does not exist if the size
- cannot be fetched.
-*/
-
-uint QFileInfo::size() const
-{
- if ( !fic || !cache )
- doStat();
- if ( fic )
- return (uint)fic->st.st_size;
- else
- return 0;
-}
-
-
-/*!
- Returns the date and time when the file was last modified.
- \sa lastRead()
-*/
-
-QDateTime QFileInfo::lastModified() const
-{
- QDateTime dt;
- if ( !fic || !cache )
- doStat();
- if ( fic )
- dt.setTime_t( fic->st.st_mtime );
- return dt;
-}
-
-/*!
- Returns the date and time when the file was last read (accessed).
-
- On systems that do not support last read times, the modification time is
- returned.
-
- \sa lastModified()
-*/
-
-QDateTime QFileInfo::lastRead() const
-{
- QDateTime dt;
- if ( !fic || !cache )
- doStat();
- if ( fic )
- dt.setTime_t( fic->st.st_atime );
- return dt;
-}
-
-
-void QFileInfo::doStat() const
-{
- QFileInfo *that = ((QFileInfo*)this); // mutable function
- if ( !that->fic )
- that->fic = new QFileInfoCache;
- STATBUF *b = &that->fic->st;
- that->fic->isSymLink = FALSE;
-
-#if defined(_OS_UNIX_) && defined(S_IFLNK)
- if ( ::lstat(QFile::encodeName(fn),b) == 0 ) {
- if ( S_ISLNK( b->st_mode ) )
- that->fic->isSymLink = TRUE;
- else
- return;
- }
-#endif
- int r;
-
- r = STAT( QFile::encodeName(fn), b );
-
- if ( r != 0 ) {
- delete that->fic;
- that->fic = 0;
- }
-}
-
-/*!
- Returns the directory path of the file.
-
- If \e absPath is TRUE an absolute path is always returned.
-
- \sa dir(), filePath(), fileName(), isRelative()
-*/
-#ifndef QT_NO_DIR
-QString QFileInfo::dirPath( bool absPath ) const
-{
- QString s;
- if ( absPath )
- s = absFilePath();
- else
- s = fn;
- int pos = s.findRev( '/' );
- if ( pos == -1 ) {
- return QString::fromLatin1(".");
- } else {
- if ( pos == 0 )
- return QString::fromLatin1( "/" );
- return s.left( pos );
- }
-}
-#endif
-/*!
- Returns the name of the file, the file path is not included.
-
- Example:
- \code
- QFileInfo fi( "/tmp/abdomen.lower" );
- QString name = fi.fileName(); // name = "abdomen.lower"
- \endcode
-
- \sa isRelative(), filePath(), baseName(), extension()
-*/
-
-QString QFileInfo::fileName() const
-{
- int p = fn.findRev( '/' );
- if ( p == -1 ) {
- return fn;
- } else {
- return fn.mid(p+1);
- }
-}
-
-/*!
- Returns the absolute path name.
-
- The absolute path name is the file name including the absolute path. If
- the QFileInfo is absolute (i.e. not relative) this function will return
- the same string as filePath().
-
- Note that this function can be time-consuming under UNIX. (in the order
- of milliseconds on a 486 DX2/66 running Linux).
-
- \sa isRelative(), filePath()
-*/
-#ifndef QT_NO_DIR
-QString QFileInfo::absFilePath() const
-{
- if ( QDir::isRelativePath(fn) ) {
- QString tmp = QDir::currentDirPath();
- tmp += '/';
- tmp += fn;
- makeAbs( tmp );
- return QDir::cleanDirPath( tmp );
- } else {
- QString tmp = fn;
- makeAbs( tmp );
- return QDir::cleanDirPath( tmp );
- }
-
-}
-#endif
diff --git a/qtools/qfileinfo_win32.cpp b/qtools/qfileinfo_win32.cpp
deleted file mode 100644
index bfcc6ac..0000000
--- a/qtools/qfileinfo_win32.cpp
+++ /dev/null
@@ -1,334 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2001 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- * Based on qfileinfo_unix.cpp
- *
- * Copyright (C) 1992-2000 Trolltech AS.
- */
-
-#include "qglobal.h"
-
-#include "qfileinfo.h"
-#include "qfiledefs_p.h"
-#include "qdatetime.h"
-#include "qdir.h"
-
-void QFileInfo::slashify( QString& n )
-{
- for ( int i=0; i<(int)n.length(); i++ )
- {
- if ( n[i] == '\\' )
- n[i] = '/';
- }
-}
-
-void QFileInfo::makeAbs( QString & )
-{
- // TODO: what to do here?
- return;
-}
-
-extern bool qt_file_access( const QString& fn, int t );
-
-/*!
- Returns TRUE if we are pointing to a real file.
- \sa isDir(), isSymLink()
-*/
-bool QFileInfo::isFile() const
-{
- if ( !fic || !cache )
- doStat();
- return fic ? (fic->st.st_mode & STAT_MASK) == STAT_REG : FALSE;
-}
-
-/*!
- Returns TRUE if we are pointing to a directory or a symbolic link to
- a directory.
- \sa isFile(), isSymLink()
-*/
-
-bool QFileInfo::isDir() const
-{
- if ( !fic || !cache )
- doStat();
- return fic ? (fic->st.st_mode & STAT_MASK) == STAT_DIR : FALSE;
-}
-
-/*!
- Returns TRUE if we are pointing to a symbolic link.
- \sa isFile(), isDir(), readLink()
-*/
-
-bool QFileInfo::isSymLink() const
-{
- if ( !fic || !cache )
- doStat();
- return fic ? fic->isSymLink : FALSE;
-}
-
-
-/*!
- Returns the name a symlink points to, or a null QString if the
- object does not refer to a symbolic link.
-
- This name may not represent an existing file; it is only a string.
- QFileInfo::exists() returns TRUE if the symlink points to an
- existing file.
-
- \sa exists(), isSymLink(), isDir(), isFile()
-*/
-
-QString QFileInfo::readLink() const
-{
- QString r;
- return r;
-}
-
-static const uint nobodyID = (uint) -2;
-
-/*!
- Returns the owner of the file.
-
- On systems where files do not have owners this function returns
- a null string.
-
- Note that this function can be time-consuming under UNIX. (in the order
- of milliseconds on a 486 DX2/66 running Linux).
-
- \sa ownerId(), group(), groupId()
-*/
-
-QString QFileInfo::owner() const
-{
- return QString::null;
-}
-
-/*!
- Returns the id of the owner of the file.
-
- On systems where files do not have owners this function returns ((uint) -2).
-
- \sa owner(), group(), groupId()
-*/
-
-uint QFileInfo::ownerId() const
-{
- return (uint)-2;
-}
-
-/*!
- Returns the group the file belongs to.
-
- On systems where files do not have groups this function always
- returns 0.
-
- Note that this function can be time-consuming under UNIX (in the order of
- milliseconds on a 486 DX2/66 running Linux).
-
- \sa groupId(), owner(), ownerId()
-*/
-
-QString QFileInfo::group() const
-{
- return QString::null;
-}
-
-/*!
- Returns the id of the group the file belongs to.
-
- On systems where files do not have groups this function always
- returns ((uind) -2).
-
- \sa group(), owner(), ownerId()
-*/
-
-uint QFileInfo::groupId() const
-{
- return (uint)-2;
-}
-
-
-/*!
- \fn bool QFileInfo::permission( int permissionSpec ) const
-
- Tests for file permissions. The \e permissionSpec argument can be several
- flags of type PermissionSpec or'ed together to check for permission
- combinations.
-
- On systems where files do not have permissions this function always
- returns TRUE.
-
- Example:
- \code
- QFileInfo fi( "/tmp/tonsils" );
- if ( fi.permission( QFileInfo::WriteUser | QFileInfo::ReadGroup ) )
- qWarning( "Tonsils can be changed by me, and the group can read them.");
- if ( fi.permission( QFileInfo::WriteGroup | QFileInfo::WriteOther ) )
- qWarning( "Danger! Tonsils can be changed by the group or others!" );
- \endcode
-
- \sa isReadable(), isWritable(), isExecutable()
-*/
-
-bool QFileInfo::permission( int permissionSpec ) const
-{
- return TRUE;
-}
-
-/*!
- Returns the file size in bytes, or 0 if the file does not exist if the size
- cannot be fetched.
-*/
-
-uint QFileInfo::size() const
-{
- if ( !fic || !cache )
- doStat();
- if ( fic )
- return (uint)fic->st.st_size;
- else
- return 0;
-}
-
-
-/*!
- Returns the date and time when the file was last modified.
- \sa lastRead()
-*/
-
-QDateTime QFileInfo::lastModified() const
-{
- QDateTime dt;
- if ( !fic || !cache )
- doStat();
- if ( fic )
- dt.setTime_t( fic->st.st_mtime );
- return dt;
-}
-
-/*!
- Returns the date and time when the file was last read (accessed).
-
- On systems that do not support last read times, the modification time is
- returned.
-
- \sa lastModified()
-*/
-
-QDateTime QFileInfo::lastRead() const
-{
- QDateTime dt;
- if ( !fic || !cache )
- doStat();
- if ( fic )
- dt.setTime_t( fic->st.st_atime );
- return dt;
-}
-
-
-void QFileInfo::doStat() const
-{
- QFileInfo *that = ((QFileInfo*)this); // mutable function
- if ( !that->fic )
- that->fic = new QFileInfoCache;
- STATBUF *b = &that->fic->st;
- that->fic->isSymLink = FALSE;
-
- int r;
-
- r = STAT( QFile::encodeName(fn), b );
-
- if ( r != 0 ) {
- delete that->fic;
- that->fic = 0;
- }
-}
-
-/*!
- Returns the directory path of the file.
-
- If \e absPath is TRUE an absolute path is always returned.
-
- \sa dir(), filePath(), fileName(), isRelative()
-*/
-#ifndef QT_NO_DIR
-QString QFileInfo::dirPath( bool absPath ) const
-{
- QString s;
- if ( absPath )
- s = absFilePath();
- else
- s = fn;
- int pos = s.findRev( '/' );
- if ( pos == -1 ) {
- return QString::fromLatin1(".");
- } else {
- if ( pos == 0 )
- return QString::fromLatin1( "/" );
- return s.left( pos );
- }
-}
-#endif
-/*!
- Returns the name of the file, the file path is not included.
-
- Example:
- \code
- QFileInfo fi( "/tmp/abdomen.lower" );
- QString name = fi.fileName(); // name = "abdomen.lower"
- \endcode
-
- \sa isRelative(), filePath(), baseName(), extension()
-*/
-
-QString QFileInfo::fileName() const
-{
- int p = fn.findRev( '/' );
- if ( p == -1 ) {
- return fn;
- } else {
- return fn.mid(p+1);
- }
-}
-
-/*!
- Returns the absolute path name.
-
- The absolute path name is the file name including the absolute path. If
- the QFileInfo is absolute (i.e. not relative) this function will return
- the same string as filePath().
-
- Note that this function can be time-consuming under UNIX. (in the order
- of milliseconds on a 486 DX2/66 running Linux).
-
- \sa isRelative(), filePath()
-*/
-#ifndef QT_NO_DIR
-QString QFileInfo::absFilePath() const
-{
- if ( QDir::isRelativePath(fn) ) {
- QString tmp = QDir::currentDirPath();
- tmp += '/';
- tmp += fn;
- makeAbs( tmp );
- return QDir::cleanDirPath( tmp );
- } else {
- QString tmp = fn;
- makeAbs( tmp );
- return QDir::cleanDirPath( tmp );
- }
-
-}
-#endif
diff --git a/qtools/qgarray.cpp b/qtools/qgarray.cpp
deleted file mode 100644
index efc9de0..0000000
--- a/qtools/qgarray.cpp
+++ /dev/null
@@ -1,747 +0,0 @@
-/****************************************************************************
-**
-**
-** Implementation of QGArray class
-**
-** Created : 930906
-**
-** 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 QGARRAY_CPP
-#include "qgarray.h"
-#include "qstring.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 QShared qshared.h
- \brief The QShared struct is internally used for implementing shared classes.
-
- It only contains a reference count and member functions to increment and
- decrement it.
-
- Shared classes normally have internal classes that inherit QShared and
- add the shared data.
-
- \sa \link shclass.html Shared Classes\endlink
-*/
-
-
-/*!
- \class QGArray qgarray.h
- \brief The QGArray class is an internal class for implementing the QArray class.
-
- QGArray is a strictly internal class that acts as base class for the
- QArray template array.
-
- It contains an array of bytes and has no notion of an array element.
-*/
-
-
-/*!
- \internal
- Constructs a null array.
-*/
-
-QGArray::QGArray()
-{
- shd = newData();
- CHECK_PTR( shd );
-}
-
-/*!
- \internal
- Dummy constructor; does not allocate any data.
-
- This constructor does not initialize any array data so subclasses
- must do it. The intention is to make the code more efficient.
-*/
-
-QGArray::QGArray( int, int )
-{
-}
-
-/*!
- \internal
- Constructs an array with room for \e size bytes.
-*/
-
-QGArray::QGArray( int size )
-{
- if ( size < 0 ) {
-#if defined(CHECK_RANGE)
- qWarning( "QGArray: Cannot allocate array with negative length" );
-#endif
- size = 0;
- }
- shd = newData();
- CHECK_PTR( shd );
- if ( size == 0 ) // zero length
- return;
- shd->data = NEW(char,size);
- CHECK_PTR( shd->data );
- shd->len = size;
-}
-
-/*!
- \internal
- Constructs a shallow copy of \e a.
-*/
-
-QGArray::QGArray( const QGArray &a )
-{
- shd = a.shd;
- shd->ref();
-}
-
-/*!
- \internal
- Dereferences the array data and deletes it if this was the last
- reference.
-*/
-
-QGArray::~QGArray()
-{
- if ( shd && shd->deref() ) { // delete when last reference
- if ( shd->data ) // is lost
- DELETE(shd->data);
- deleteData( shd );
- }
-}
-
-
-/*!
- \fn QGArray &QGArray::operator=( const QGArray &a )
- \internal
- Assigns a shallow copy of \e a to this array and returns a reference to
- this array. Equivalent to assign().
-*/
-
-/*!
- \fn void QGArray::detach()
- \internal
- Detaches this array from shared array data.
-*/
-
-/*!
- \fn char *QGArray::data() const
- \internal
- Returns a pointer to the actual array data.
-*/
-
-/*!
- \fn uint QGArray::nrefs() const
- \internal
- Returns the reference count.
-*/
-
-/*!
- \fn uint QGArray::size() const
- \internal
- Returns the size of the array, in bytes.
-*/
-
-
-/*!
- \internal
- Returns TRUE if this array is equal to \e a, otherwise FALSE.
- The comparison is bitwise, of course.
-*/
-
-bool QGArray::isEqual( const QGArray &a ) const
-{
- if ( size() != a.size() ) // different size
- return FALSE;
- if ( data() == a.data() ) // has same data
- return TRUE;
- return (size() ? memcmp( data(), a.data(), size() ) : 0) == 0;
-}
-
-
-/*!
- \internal
- Resizes the array to \e newsize bytes.
-*/
-
-bool QGArray::resize( uint newsize )
-{
- if ( newsize == shd->len ) // nothing to do
- return TRUE;
- if ( newsize == 0 ) { // remove array
- duplicate( 0, 0 );
- return TRUE;
- }
- if ( shd->data ) { // existing data
-#if defined(DONT_USE_REALLOC)
- char *newdata = NEW(char,newsize); // manual realloc
- memcpy( newdata, shd->data, QMIN(shd->len,newsize) );
- DELETE(shd->data);
- shd->data = newdata;
-#else
- shd->data = (char *)realloc( shd->data, newsize );
-#endif
- } else {
- shd->data = NEW(char,newsize);
- }
- CHECK_PTR( shd->data );
- if ( !shd->data ) // no memory
- return FALSE;
- shd->len = newsize;
- return TRUE;
-}
-
-/*!
- \internal
- Fills the array with the repeated occurrences of \e d, which is
- \e sz bytes long.
- If \e len is specified as different from -1, then the array will be
- resized to \e len*sz before it is filled.
-
- Returns TRUE if successful, or FALSE if the memory cannot be allocated
- (only when \e len != -1).
-
- \sa resize()
-*/
-
-bool QGArray::fill( const char *d, int len, uint sz )
-{
- if ( len < 0 )
- len = shd->len/sz; // default: use array length
- else if ( !resize( len*sz ) )
- return FALSE;
- if ( sz == 1 ) // 8 bit elements
- memset( data(), *d, len );
- else if ( sz == 4 ) { // 32 bit elements
- register Q_INT32 *x = (Q_INT32*)data();
- Q_INT32 v = *((Q_INT32*)d);
- while ( len-- )
- *x++ = v;
- } else if ( sz == 2 ) { // 16 bit elements
- register Q_INT16 *x = (Q_INT16*)data();
- Q_INT16 v = *((Q_INT16*)d);
- while ( len-- )
- *x++ = v;
- } else { // any other size elements
- register char *x = data();
- while ( len-- ) { // more complicated
- memcpy( x, d, sz );
- x += sz;
- }
- }
- return TRUE;
-}
-
-/*!
- \internal
- Shallow copy. Dereference the current array and references the data
- contained in \e a instead. Returns a reference to this array.
- \sa operator=()
-*/
-
-QGArray &QGArray::assign( const QGArray &a )
-{
- a.shd->ref(); // avoid 'a = a'
- if ( shd->deref() ) { // delete when last reference
- if ( shd->data ) // is lost
- DELETE(shd->data);
- deleteData( shd );
- }
- shd = a.shd;
- return *this;
-}
-
-/*!
- \internal
- Shallow copy. Dereference the current array and references the
- array data \e d, which contains \e len bytes.
- Returns a reference to this array.
-
- Do not delete \e d later, because QGArray takes care of that.
-*/
-
-QGArray &QGArray::assign( const char *d, uint len )
-{
- if ( shd->count > 1 ) { // disconnect this
- shd->count--;
- shd = newData();
- CHECK_PTR( shd );
- } else {
- if ( shd->data )
- DELETE(shd->data);
- }
- shd->data = (char *)d;
- shd->len = len;
- return *this;
-}
-
-/*!
- \internal
- Deep copy. Dereference the current array and obtains a copy of the data
- contained in \e a instead. Returns a reference to this array.
- \sa assign(), operator=()
-*/
-
-QGArray &QGArray::duplicate( const QGArray &a )
-{
- if ( a.shd == shd ) { // a.duplicate(a) !
- if ( shd->count > 1 ) {
- shd->count--;
- register array_data *n = newData();
- CHECK_PTR( n );
- if ( (n->len=shd->len) ) {
- n->data = NEW(char,n->len);
- CHECK_PTR( n->data );
- if ( n->data )
- memcpy( n->data, shd->data, n->len );
- } else {
- n->data = 0;
- }
- shd = n;
- }
- return *this;
- }
- char *oldptr = 0;
- if ( shd->count > 1 ) { // disconnect this
- shd->count--;
- shd = newData();
- CHECK_PTR( shd );
- } else { // delete after copy was made
- oldptr = shd->data;
- }
- if ( a.shd->len ) { // duplicate data
- shd->data = NEW(char,a.shd->len);
- CHECK_PTR( shd->data );
- if ( shd->data )
- memcpy( shd->data, a.shd->data, a.shd->len );
- } else {
- shd->data = 0;
- }
- shd->len = a.shd->len;
- if ( oldptr )
- DELETE(oldptr);
- return *this;
-}
-
-/*!
- \internal
- Deep copy. Dereferences the current array and obtains a copy of the
- array data \e d instead. Returns a reference to this array.
- \sa assign(), operator=()
-*/
-
-QGArray &QGArray::duplicate( const char *d, uint len )
-{
- char *data;
- if ( d == 0 || len == 0 ) {
- data = 0;
- len = 0;
- } else {
- if ( shd->count == 1 && shd->len == len ) {
- memcpy( shd->data, d, len ); // use same buffer
- return *this;
- }
- data = NEW(char,len);
- CHECK_PTR( data );
- memcpy( data, d, len );
- }
- if ( shd->count > 1 ) { // detach
- shd->count--;
- shd = newData();
- CHECK_PTR( shd );
- } else { // just a single reference
- if ( shd->data )
- DELETE(shd->data);
- }
- shd->data = data;
- shd->len = len;
- return *this;
-}
-
-/*!
- \internal
- Resizes this array to \e len bytes and copies the \e len bytes at
- address \e into it.
-
- \warning This function disregards the reference count mechanism. If
- other QGArrays reference the same data as this, all will be updated.
-*/
-
-void QGArray::store( const char *d, uint len )
-{ // store, but not deref
- resize( len );
- memcpy( shd->data, d, len );
-}
-
-
-/*!
- \fn array_data *QGArray::sharedBlock() const
- \internal
- Returns a pointer to the shared array block.
-
- \warning
-
- Do not use this function. Using it is begging for trouble. We dare
- not remove it, for fear of breaking code, but we \e strongly
- discourage new use of it.
-*/
-
-/*!
- \fn void QGArray::setSharedBlock( array_data *p )
- \internal
- Sets the shared array block to \e p.
-
- \warning
-
- Do not use this function. Using it is begging for trouble. We dare
- not remove it, for fear of breaking code, but we \e strongly
- discourage new use of it.
-*/
-
-
-/*!
- \internal
- Sets raw data and returns a reference to the array.
-
- Dereferences the current array and sets the new array data to \e d and
- the new array size to \e len. Do not attempt to resize or re-assign the
- array data when raw data has been set.
- Call resetRawData(d,len) to reset the array.
-
- Setting raw data is useful because it set QArray data without allocating
- memory or copying data.
-
- Example of intended use:
- \code
- static uchar bindata[] = { 231, 1, 44, ... };
- QByteArray a;
- a.setRawData( bindata, sizeof(bindata) ); // a points to bindata
- QDataStream s( a, IO_ReadOnly ); // open on a's data
- s >> <something>; // read raw bindata
- s.close();
- a.resetRawData( bindata, sizeof(bindata) ); // finished
- \endcode
-
- Example of misuse (do not do this):
- \code
- static uchar bindata[] = { 231, 1, 44, ... };
- QByteArray a, b;
- a.setRawData( bindata, sizeof(bindata) ); // a points to bindata
- a.resize( 8 ); // will crash
- b = a; // will crash
- a[2] = 123; // might crash
- // forget to resetRawData - will crash
- \endcode
-
- \warning If you do not call resetRawData(), QGArray will attempt to
- deallocate or reallocate the raw data, which might not be too good.
- Be careful.
-*/
-
-QGArray &QGArray::setRawData( const char *d, uint len )
-{
- duplicate( 0, 0 ); // set null data
- shd->data = (char *)d;
- shd->len = len;
- return *this;
-}
-
-/*!
- \internal
- Resets raw data.
-
- The arguments must be the data and length that were passed to
- setRawData(). This is for consistency checking.
-*/
-
-void QGArray::resetRawData( const char *d, uint len )
-{
- if ( d != shd->data || len != shd->len ) {
-#if defined(CHECK_STATE)
- qWarning( "QGArray::resetRawData: Inconsistent arguments" );
-#endif
- return;
- }
- shd->data = 0;
- shd->len = 0;
-}
-
-
-/*!
- \internal
- Finds the first occurrence of \e d in the array from position \e index,
- where \e sz is the size of the \e d element.
-
- Note that \e index is given in units of \e sz, not bytes.
-
- This function only compares whole cells, not bytes.
-*/
-
-int QGArray::find( const char *d, uint index, uint sz ) const
-{
- index *= sz;
- if ( index >= shd->len ) {
-#if defined(CHECK_RANGE)
- qWarning( "QGArray::find: Index %d out of range", index/sz );
-#endif
- return -1;
- }
- register uint i;
- uint ii;
- switch ( sz ) {
- case 1: { // 8 bit elements
- register char *x = data() + index;
- char v = *d;
- for ( i=index; i<shd->len; i++ ) {
- if ( *x++ == v )
- break;
- }
- ii = i;
- }
- break;
- case 2: { // 16 bit elements
- register Q_INT16 *x = (Q_INT16*)(data() + index);
- Q_INT16 v = *((Q_INT16*)d);
- for ( i=index; i<shd->len; i+=2 ) {
- if ( *x++ == v )
- break;
- }
- ii = i/2;
- }
- break;
- case 4: { // 32 bit elements
- register Q_INT32 *x = (Q_INT32*)(data() + index);
- Q_INT32 v = *((Q_INT32*)d);
- for ( i=index; i<shd->len; i+=4 ) {
- if ( *x++ == v )
- break;
- }
- ii = i/4;
- }
- break;
- default: { // any size elements
- for ( i=index; i<shd->len; i+=sz ) {
- if ( memcmp( d, &shd->data[i], sz ) == 0 )
- break;
- }
- ii = i/sz;
- }
- break;
- }
- return i<shd->len ? (int)ii : -1;
-}
-
-/*!
- \internal
- Returns the number of occurrences of \e d in the array, where \e sz is
- the size of the \e d element.
-
- This function only compares whole cells, not bytes.
-*/
-
-int QGArray::contains( const char *d, uint sz ) const
-{
- register uint i = shd->len;
- int count = 0;
- switch ( sz ) {
- case 1: { // 8 bit elements
- register char *x = data();
- char v = *d;
- while ( i-- ) {
- if ( *x++ == v )
- count++;
- }
- }
- break;
- case 2: { // 16 bit elements
- register Q_INT16 *x = (Q_INT16*)data();
- Q_INT16 v = *((Q_INT16*)d);
- i /= 2;
- while ( i-- ) {
- if ( *x++ == v )
- count++;
- }
- }
- break;
- case 4: { // 32 bit elements
- register Q_INT32 *x = (Q_INT32*)data();
- Q_INT32 v = *((Q_INT32*)d);
- i /= 4;
- while ( i-- ) {
- if ( *x++ == v )
- count++;
- }
- }
- break;
- default: { // any size elements
- for ( i=0; i<shd->len; i+=sz ) {
- if ( memcmp(d, &shd->data[i], sz) == 0 )
- count++;
- }
- }
- break;
- }
- return count;
-}
-
-static int cmp_item_size = 0;
-
-#if defined(Q_C_CALLBACKS)
-extern "C" {
-#endif
-
-static int cmp_arr( const void *n1, const void *n2 )
-{
- return ( n1 && n2 ) ? memcmp( n1, n2, cmp_item_size )
- : (int)((long)n1 - (long)n2);
- // Qt 3.0: Add a virtual compareItems() method and call that instead
-}
-
-#if defined(Q_C_CALLBACKS)
-}
-#endif
-
-/*!
- \internal
-
- Sort the array.
-*/
-
-void QGArray::sort( uint sz )
-{
- int numItems = size() / sz;
- if ( numItems < 2 )
- return;
- cmp_item_size = sz;
- qsort( shd->data, numItems, sz, cmp_arr );
-}
-
-/*!
- \internal
-
- Binary search; assumes sorted array
-*/
-
-int QGArray::bsearch( const char *d, uint sz ) const
-{
- int numItems = size() / sz;
- if ( !numItems )
- return -1;
- cmp_item_size = sz;
- char* r = (char*)::bsearch( d, shd->data, numItems, sz, cmp_arr );
- if ( !r )
- return -1;
- while( (r >= shd->data + sz) && (cmp_arr( r - sz, d ) == 0) )
- r -= sz; // search to first of equal elements; bsearch is undef
- return (int)(( r - shd->data ) / sz);
-}
-
-
-/*!
- \fn char *QGArray::at( uint index ) const
- \internal
- Returns a pointer to the byte at offset \e index in the array.
-*/
-
-/*!
- \internal
- Expand the array if necessary, and copies (the first part of) its
- contents from the \e index*zx bytes at \e d.
-
- Returns TRUE if the operation succeeds, FALSE if it runs out of
- memory.
-
- \warning This function disregards the reference count mechanism. If
- other QGArrays reference the same data as this, all will be changed.
-*/
-
-bool QGArray::setExpand( uint index, const char *d, uint sz )
-{
- index *= sz;
- if ( index >= shd->len ) {
- if ( !resize( index+sz ) ) // no memory
- return FALSE;
- }
- memcpy( data() + index, d, sz );
- return TRUE;
-}
-
-
-/*!
- \internal
- Prints a warning message if at() or [] is given a bad index.
-*/
-
-void QGArray::msg_index( uint index )
-{
-#if defined(CHECK_RANGE)
- qWarning( "QGArray::at: Absolute index %d out of range", index );
-#else
- Q_UNUSED( index )
-#endif
-}
-
-
-/*!
- \internal
- Returns a new shared array block.
-*/
-
-QGArray::array_data * QGArray::newData()
-{
- return new array_data;
-}
-
-
-/*!
- \internal
- Deletes the shared array block.
-*/
-
-void QGArray::deleteData( array_data *p )
-{
- delete p;
- p = 0;
-}
diff --git a/qtools/qgarray.h b/qtools/qgarray.h
deleted file mode 100644
index 12c463b..0000000
--- a/qtools/qgarray.h
+++ /dev/null
@@ -1,120 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QGArray class
-**
-** Created : 930906
-**
-** 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 QGARRAY_H
-#define QGARRAY_H
-
-#ifndef QT_H
-#include "qshared.h"
-#endif // QT_H
-
-
-class Q_EXPORT QGArray // generic array
-{
-friend class QBuffer;
-public:
- //### DO NOT USE THIS. IT IS PUBLIC BUT DO NOT USE IT IN NEW CODE.
- struct array_data : public QShared { // shared array
- array_data() { data=0; len=0; }
- char *data; // actual array data
- uint len;
- };
- QGArray();
-protected:
- QGArray( int, int ); // dummy; does not alloc
- QGArray( int size ); // allocate 'size' bytes
- QGArray( const QGArray &a ); // shallow copy
- virtual ~QGArray();
-
- QGArray &operator=( const QGArray &a ) { return assign( a ); }
-
- virtual void detach() { duplicate(*this); }
-
- char *data() const { return shd->data; }
- uint nrefs() const { return shd->count; }
- uint size() const { return shd->len; }
- bool isEqual( const QGArray &a ) const;
-
- bool resize( uint newsize );
-
- bool fill( const char *d, int len, uint sz );
-
- QGArray &assign( const QGArray &a );
- QGArray &assign( const char *d, uint len );
- QGArray &duplicate( const QGArray &a );
- QGArray &duplicate( const char *d, uint len );
- void store( const char *d, uint len );
-
- array_data *sharedBlock() const { return shd; }
- void setSharedBlock( array_data *p ) { shd=(array_data*)p; }
-
- QGArray &setRawData( const char *d, uint len );
- void resetRawData( const char *d, uint len );
-
- int find( const char *d, uint index, uint sz ) const;
- int contains( const char *d, uint sz ) const;
-
- void sort( uint sz );
- int bsearch( const char *d, uint sz ) const;
-
- char *at( uint index ) const;
-
- bool setExpand( uint index, const char *d, uint sz );
-
-protected:
- virtual array_data *newData();
- virtual void deleteData( array_data *p );
-
-private:
- static void msg_index( uint );
- array_data *shd;
-};
-
-
-inline char *QGArray::at( uint index ) const
-{
-#if defined(CHECK_RANGE)
- if ( index >= size() ) {
- msg_index( index );
- index = 0;
- }
-#endif
- return &shd->data[index];
-}
-
-
-#endif // QGARRAY_H
diff --git a/qtools/qgcache.cpp b/qtools/qgcache.cpp
deleted file mode 100644
index 1fd876d..0000000
--- a/qtools/qgcache.cpp
+++ /dev/null
@@ -1,868 +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 "qlist.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 QList<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 QList<QCacheItem>::removeFirst(); }
- bool removeLast() { return QList<QCacheItem>::removeLast(); }
-
- QCacheItem *first() { return QList<QCacheItem>::first(); }
- QCacheItem *last() { return QList<QCacheItem>::last(); }
- QCacheItem *prev() { return QList<QCacheItem>::prev(); }
- QCacheItem *next() { return QList<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 )
- QList<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 )
-{
- QList<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 QListIterator<QCacheItem>
-{
-public:
- QCListIt( const QCList *p ): QListIterator<QCacheItem>( *p ) {}
- QCListIt( const QCListIt *p ): QListIterator<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 QString &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 QString &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 QString &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(*((QString*)(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((long)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 QString &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 QString(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( (long)key, ci );
- tCost += cost;
- return TRUE;
-}
-
-
-/*!
- \internal
- Removes an item from the cache.
-*/
-
-bool QGCache::remove_string( const QString &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 QString &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 (QString*)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( (long)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 (QString*)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 QString &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((long)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;
- register 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 (QString*)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)
- QString line;
- line.fill( '*', 80 );
- qDebug( line.ascii() );
- 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( line.ascii() );
-#endif
-}
-
-
-/*****************************************************************************
- 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.
-*/
-
-QString QGCacheIterator::getKeyString() const
-{
- QCacheItem *item = it->current();
- return item ? *((QString*)item->key) : QString::null;
-}
-
-/*!
- \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.
-*/
-
-long QGCacheIterator::getKeyInt() const
-{
- QCacheItem *item = it->current();
- return item ? (long)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 5c3e126..0000000
--- a/qtools/qgcache.h
+++ /dev/null
@@ -1,128 +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 QString &key, QCollection::Item,
- int cost, int priority );
- bool insert_other( const char *key, QCollection::Item,
- int cost, int priority );
- bool remove_string( const QString &key );
- bool remove_other( const char *key );
- QCollection::Item take_string( const QString &key );
- QCollection::Item take_other( const char *key );
-
- QCollection::Item find_string( const QString &key, bool ref=TRUE ) const;
- QCollection::Item find_other( const char *key, bool ref=TRUE ) const;
-
- void statistics() 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;
- QString getKeyString() const;
- const char *getKeyAscii() const;
- long 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/qgdict.cpp b/qtools/qgdict.cpp
deleted file mode 100644
index e55d059..0000000
--- a/qtools/qgdict.cpp
+++ /dev/null
@@ -1,1218 +0,0 @@
-/****************************************************************************
-**
-**
-** Implementation of QGDict and QGDictIterator classes
-**
-** Created : 920529
-**
-** 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 "qgdict.h"
-#include "qlist.h"
-#include "qstring.h"
-#include "qdatastream.h"
-#include <ctype.h>
-
-// NOT REVISED
-/*!
- \class QGDict qgdict.h
- \brief The QGDict class is an internal class for implementing QDict template classes.
-
- QGDict is a strictly internal class that acts as a base class for the
- \link collection.html collection classes\endlink QDict and QIntDict.
-
- QGDict has some virtual functions that can be reimplemented to customize
- the subclasses.
- <ul>
- <li> read() reads a collection/dictionary item from a QDataStream.
- <li> write() writes a collection/dictionary item to a QDataStream.
- </ul>
- Normally, you do not have to reimplement any of these functions.
-*/
-
-static const int op_find = 0;
-static const int op_insert = 1;
-static const int op_replace = 2;
-
-
-class QGDItList : public QList<QGDictIterator>
-{
-public:
- QGDItList() : QList<QGDictIterator>() {}
- QGDItList( const QGDItList &list ) : QList<QGDictIterator>(list) {}
- ~QGDItList() { clear(); }
- QGDItList &operator=(const QGDItList &list)
- { return (QGDItList&)QList<QGDictIterator>::operator=(list); }
-};
-
-
-/*****************************************************************************
- Default implementation of special and virtual functions
- *****************************************************************************/
-
-/*!
- \internal
- Returns the hash key for \e key, when key is a string.
-*/
-
-int QGDict::hashKeyString( const QString &key )
-{
-#if defined(CHECK_NULL)
- if ( key.isNull() )
- qWarning( "QGDict::hashStringKey: Invalid null key" );
-#endif
- int i;
- register uint h=0;
- uint g;
- int len = key.length();
- const QChar *p = key.unicode();
- if ( cases ) { // case sensitive
- for ( i=0; i<len; i++ ) {
- h = (h<<4) + p[i].cell();
- if ( (g = h & 0xf0000000) )
- h ^= g >> 24;
- h &= ~g;
- }
- } else { // case insensitive
- for ( i=0; i<len; i++ ) {
- h = (h<<4) + p[i].lower().cell();
- if ( (g = h & 0xf0000000) )
- h ^= g >> 24;
- h &= ~g;
- }
- }
- int index = h;
- if ( index < 0 ) // adjust index to table size
- index = -index;
- return index;
-}
-
-/*!
- \internal
- Returns the hash key for \a key, which is a C string.
-*/
-
-int QGDict::hashKeyAscii( const char *key )
-{
-#if defined(CHECK_NULL)
- if ( key == 0 )
- {
- qWarning( "QGDict::hashAsciiKey: Invalid null key" );
- return 0;
- }
-#endif
- register const char *k = key;
- register uint h=0;
- uint g;
- if ( cases ) { // case sensitive
- while ( *k ) {
- h = (h<<4) + *k++;
- if ( (g = h & 0xf0000000) )
- h ^= g >> 24;
- h &= ~g;
- }
- } else { // case insensitive
- while ( *k ) {
- h = (h<<4) + tolower(*k);
- if ( (g = h & 0xf0000000) )
- h ^= g >> 24;
- h &= ~g;
- k++;
- }
- }
- int index = h;
- if ( index < 0 ) // adjust index to table size
- index = -index;
- return index;
-}
-
-#ifndef QT_NO_DATASTREAM
-
-/*!
- Reads a collection/dictionary item from the stream \e s and returns a
- reference to the stream.
-
- The default implementation sets \e item to 0.
-
- \sa write()
-*/
-
-QDataStream& QGDict::read( QDataStream &s, QCollection::Item &item )
-{
- item = 0;
- return s;
-}
-
-/*!
- Writes a collection/dictionary item to the stream \e s and returns a
- reference to the stream.
-
- \sa read()
-*/
-
-QDataStream& QGDict::write( QDataStream &s, QCollection::Item ) const
-{
- return s;
-}
-#endif //QT_NO_DATASTREAM
-
-/*****************************************************************************
- QGDict member functions
- *****************************************************************************/
-
-/*!
- \internal
- Constructs a dictionary.
-*/
-
-QGDict::QGDict( uint len, KeyType kt, bool caseSensitive, bool copyKeys )
-{
- init( len, kt, caseSensitive, copyKeys );
-}
-
-
-void QGDict::init( uint len, KeyType kt, bool caseSensitive, bool copyKeys )
-{
- vec = new QBaseBucket *[vlen = len]; // allocate hash table
- CHECK_PTR( vec );
- memset( (char*)vec, 0, vlen*sizeof(QBaseBucket*) );
- numItems = 0;
- iterators = 0;
- // The caseSensitive and copyKey options don't make sense for
- // all dict types.
- switch ( (keytype = (uint)kt) ) {
- case StringKey:
- cases = caseSensitive;
- copyk = FALSE;
- break;
- case AsciiKey:
- cases = caseSensitive;
- copyk = copyKeys;
- break;
- default:
- cases = FALSE;
- copyk = FALSE;
- break;
- }
-}
-
-
-/*!
- \internal
- Constructs a copy of \e dict.
-*/
-
-QGDict::QGDict( const QGDict & dict )
- : QCollection( dict )
-{
- init( dict.vlen, (KeyType)dict.keytype, dict.cases, dict.copyk );
- QGDictIterator it( dict );
- while ( it.get() ) { // copy from other dict
- switch ( keytype ) {
- case StringKey:
- look_string( it.getKeyString(), it.get(), op_insert );
- break;
- case AsciiKey:
- look_ascii( it.getKeyAscii(), it.get(), op_insert );
- break;
- case IntKey:
- look_int( it.getKeyInt(), it.get(), op_insert );
- break;
- case PtrKey:
- look_ptr( it.getKeyPtr(), it.get(), op_insert );
- break;
- }
- ++it;
- }
-}
-
-
-/*!
- \internal
- Removes all items from the dictionary and destroys it.
-*/
-
-QGDict::~QGDict()
-{
- clear(); // delete everything
- delete [] vec;
- if ( !iterators ) // no iterators for this dict
- return;
- QGDictIterator *i = iterators->first();
- while ( i ) { // notify all iterators that
- i->dict = 0; // this dict is deleted
- i = iterators->next();
- }
- delete iterators;
-}
-
-
-/*!
- \internal
- Assigns \e dict to this dictionary.
-*/
-
-QGDict &QGDict::operator=( const QGDict &dict )
-{
- clear();
- QGDictIterator it( dict );
- while ( it.get() ) { // copy from other dict
- switch ( keytype ) {
- case StringKey:
- look_string( it.getKeyString(), it.get(), op_insert );
- break;
- case AsciiKey:
- look_ascii( it.getKeyAscii(), it.get(), op_insert );
- break;
- case IntKey:
- look_int( it.getKeyInt(), it.get(), op_insert );
- break;
- case PtrKey:
- look_ptr( it.getKeyPtr(), it.get(), op_insert );
- break;
- }
- ++it;
- }
- return *this;
-}
-
-
-/*! \fn QCollection::Item QGDictIterator::get() const
-
- \internal
-*/
-
-
-/*! \fn QString QGDictIterator::getKeyString() const
-
- \internal
-*/
-
-
-/*! \fn const char * QGDictIterator::getKeyAscii() const
-
- \internal
-*/
-
-
-/*! \fn void * QGDictIterator::getKeyPtr() const
-
- \internal
-*/
-
-
-/*! \fn long QGDictIterator::getKeyInt() const
-
- \internal
-*/
-
-
-/*!
- \fn uint QGDict::count() const
- \internal
- Returns the number of items in the dictionary.
-*/
-
-/*!
- \fn uint QGDict::size() const
- \internal
- Returns the size of the hash array.
-*/
-
-
-/*!
- \internal
- The do-it-all function; op is one of op_find, op_insert, op_replace
-*/
-
-QCollection::Item QGDict::look_string( const QString &key, QCollection::Item d, int op )
-{
- QStringBucket *n;
- int index = hashKeyString(key) % vlen;
- if ( op == op_find ) { // find
- if ( cases ) {
- for ( n=(QStringBucket*)vec[index]; n;
- n=(QStringBucket*)n->getNext() ) {
- if ( key == n->getKey() )
- return n->getData(); // item found
- }
- } else {
- QString k = key.lower();
- for ( n=(QStringBucket*)vec[index]; n;
- n=(QStringBucket*)n->getNext() ) {
- if ( k == n->getKey().lower() )
- return n->getData(); // item found
- }
- }
- return 0; // not found
- }
- if ( op == op_replace ) { // replace
- if ( vec[index] != 0 ) // maybe something there
- remove_string( key );
- }
- // op_insert or op_replace
- n = new QStringBucket(key,newItem(d),vec[index]);
- CHECK_PTR( n );
-#if defined(CHECK_NULL)
- if ( n->getData() == 0 )
- qWarning( "QDict: Cannot insert null item" );
-#endif
- vec[index] = n;
- numItems++;
- return n->getData();
-}
-
-
-/*! \internal */
-
-QCollection::Item QGDict::look_ascii( const char *key, QCollection::Item d, int op )
-{
- QAsciiBucket *n;
- int index = hashKeyAscii(key) % vlen;
- if ( op == op_find ) { // find
- if ( cases ) {
- for ( n=(QAsciiBucket*)vec[index]; n;
- n=(QAsciiBucket*)n->getNext() ) {
- if ( qstrcmp(n->getKey(),key) == 0 )
- return n->getData(); // item found
- }
- } else {
- for ( n=(QAsciiBucket*)vec[index]; n;
- n=(QAsciiBucket*)n->getNext() ) {
- if ( qstricmp(n->getKey(),key) == 0 )
- return n->getData(); // item found
- }
- }
- return 0; // not found
- }
- if ( op == op_replace ) { // replace
- if ( vec[index] != 0 ) // maybe something there
- remove_ascii( key );
- }
- // op_insert or op_replace
- n = new QAsciiBucket(copyk ? qstrdup(key) : key,newItem(d),vec[index]);
- CHECK_PTR( n );
-#if defined(CHECK_NULL)
- if ( n->getData() == 0 )
- qWarning( "QAsciiDict: Cannot insert null item" );
-#endif
- vec[index] = n;
- numItems++;
- return n->getData();
-}
-
-
-/*! \internal */
-
-QCollection::Item QGDict::look_int( long key, QCollection::Item d, int op )
-{
- QIntBucket *n;
- int index = (int)((ulong)key % vlen); // simple hash
- if ( op == op_find ) { // find
- for ( n=(QIntBucket*)vec[index]; n;
- n=(QIntBucket*)n->getNext() ) {
- if ( n->getKey() == key )
- return n->getData(); // item found
- }
- return 0; // not found
- }
- if ( op == op_replace ) { // replace
- if ( vec[index] != 0 ) // maybe something there
- remove_int( key );
- }
- // op_insert or op_replace
- n = new QIntBucket(key,newItem(d),vec[index]);
- CHECK_PTR( n );
-#if defined(CHECK_NULL)
- if ( n->getData() == 0 )
- qWarning( "QIntDict: Cannot insert null item" );
-#endif
- vec[index] = n;
- numItems++;
- return n->getData();
-}
-
-
-/*! \internal */
-
-QCollection::Item QGDict::look_ptr( void *key, QCollection::Item d, int op )
-{
- QPtrBucket *n;
- int index = (int)((ulong)key % vlen); // simple hash
- if ( op == op_find ) { // find
- for ( n=(QPtrBucket*)vec[index]; n;
- n=(QPtrBucket*)n->getNext() ) {
- if ( n->getKey() == key )
- return n->getData(); // item found
- }
- return 0; // not found
- }
- if ( op == op_replace ) { // replace
- if ( vec[index] != 0 ) // maybe something there
- remove_ptr( key );
- }
- // op_insert or op_replace
- n = new QPtrBucket(key,newItem(d),vec[index]);
- CHECK_PTR( n );
-#if defined(CHECK_NULL)
- if ( n->getData() == 0 )
- qWarning( "QPtrDict: Cannot insert null item" );
-#endif
- vec[index] = n;
- numItems++;
- return n->getData();
-}
-
-
-/*!
- \internal
- Changes the size of the hashtable.
- The contents of the dictionary are preserved,
- but all iterators on the dictionary become invalid.
-*/
-void QGDict::resize( uint newsize )
-{
- // Save old information
- QBaseBucket **old_vec = vec;
- uint old_vlen = vlen;
- bool old_copyk = copyk;
-
- vec = new QBaseBucket *[vlen = newsize];
- CHECK_PTR( vec );
- memset( (char*)vec, 0, vlen*sizeof(QBaseBucket*) );
- numItems = 0;
- copyk = FALSE;
-
- // Reinsert every item from vec, deleting vec as we go
- for ( uint index = 0; index < old_vlen; index++ ) {
- switch ( keytype ) {
- case StringKey:
- {
- QStringBucket *n=(QStringBucket *)old_vec[index];
- while ( n ) {
- look_string( n->getKey(), n->getData(), op_insert );
- QStringBucket *t=(QStringBucket *)n->getNext();
- delete n;
- n = t;
- }
- }
- break;
- case AsciiKey:
- {
- QAsciiBucket *n=(QAsciiBucket *)old_vec[index];
- while ( n ) {
- look_ascii( n->getKey(), n->getData(), op_insert );
- QAsciiBucket *t=(QAsciiBucket *)n->getNext();
- delete n;
- n = t;
- }
- }
- break;
- case IntKey:
- {
- QIntBucket *n=(QIntBucket *)old_vec[index];
- while ( n ) {
- look_int( n->getKey(), n->getData(), op_insert );
- QIntBucket *t=(QIntBucket *)n->getNext();
- delete n;
- n = t;
- }
- }
- break;
- case PtrKey:
- {
- QPtrBucket *n=(QPtrBucket *)old_vec[index];
- while ( n ) {
- look_ptr( n->getKey(), n->getData(), op_insert );
- QPtrBucket *t=(QPtrBucket *)n->getNext();
- delete n;
- n = t;
- }
- }
- break;
- }
- }
- delete [] old_vec;
-
- // Restore state
- copyk = old_copyk;
-
- // Invalidate all iterators, since order is lost
- if ( iterators && iterators->count() ) {
- QGDictIterator *i = iterators->first();
- while ( i ) {
- i->toFirst();
- i = iterators->next();
- }
- }
-}
-
-/*!
- \internal
- Unlinks the bucket with the specified key (and specified data pointer,
- if it is set).
-*/
-
-void QGDict::unlink_common( int index, QBaseBucket *node, QBaseBucket *prev )
-{
- if ( iterators && iterators->count() ) { // update iterators
- QGDictIterator *i = iterators->first();
- while ( i ) { // invalidate all iterators
- if ( i->curNode == node ) // referring to pending node
- i->operator++();
- i = iterators->next();
- }
- }
- if ( prev ) // unlink node
- prev->setNext( node->getNext() );
- else
- vec[index] = node->getNext();
- numItems--;
-}
-
-QStringBucket *QGDict::unlink_string( const QString &key, QCollection::Item d )
-{
- if ( numItems == 0 ) // nothing in dictionary
- return 0;
- QStringBucket *n;
- QStringBucket *prev = 0;
- int index = hashKeyString(key) % vlen;
- if ( cases ) {
- for ( n=(QStringBucket*)vec[index]; n;
- n=(QStringBucket*)n->getNext() ) {
- bool found = (key == n->getKey());
- if ( found && d )
- found = (n->getData() == d);
- if ( found ) {
- unlink_common(index,n,prev);
- return n;
- }
- prev = n;
- }
- } else {
- QString k = key.lower();
- for ( n=(QStringBucket*)vec[index]; n;
- n=(QStringBucket*)n->getNext() ) {
- bool found = (k == n->getKey().lower());
- if ( found && d )
- found = (n->getData() == d);
- if ( found ) {
- unlink_common(index,n,prev);
- return n;
- }
- prev = n;
- }
- }
- return 0;
-}
-
-QAsciiBucket *QGDict::unlink_ascii( const char *key, QCollection::Item d )
-{
- if ( numItems == 0 ) // nothing in dictionary
- return 0;
- QAsciiBucket *n;
- QAsciiBucket *prev = 0;
- int index = hashKeyAscii(key) % vlen;
- for ( n=(QAsciiBucket *)vec[index]; n; n=(QAsciiBucket *)n->getNext() ) {
- bool found = (cases ? qstrcmp(n->getKey(),key)
- : qstricmp(n->getKey(),key)) == 0;
- if ( found && d )
- found = (n->getData() == d);
- if ( found ) {
- unlink_common(index,n,prev);
- return n;
- }
- prev = n;
- }
- return 0;
-}
-
-QIntBucket *QGDict::unlink_int( long key, QCollection::Item d )
-{
- if ( numItems == 0 ) // nothing in dictionary
- return 0;
- QIntBucket *n;
- QIntBucket *prev = 0;
- int index = (int)((ulong)key % vlen);
- for ( n=(QIntBucket *)vec[index]; n; n=(QIntBucket *)n->getNext() ) {
- bool found = (n->getKey() == key);
- if ( found && d )
- found = (n->getData() == d);
- if ( found ) {
- unlink_common(index,n,prev);
- return n;
- }
- prev = n;
- }
- return 0;
-}
-
-QPtrBucket *QGDict::unlink_ptr( void *key, QCollection::Item d )
-{
- if ( numItems == 0 ) // nothing in dictionary
- return 0;
- QPtrBucket *n;
- QPtrBucket *prev = 0;
- int index = (int)((ulong)key % vlen);
- for ( n=(QPtrBucket *)vec[index]; n; n=(QPtrBucket *)n->getNext() ) {
- bool found = (n->getKey() == key);
- if ( found && d )
- found = (n->getData() == d);
- if ( found ) {
- unlink_common(index,n,prev);
- return n;
- }
- prev = n;
- }
- return 0;
-}
-
-
-/*!
- \internal
- Removes the item with the specified key. If item is non-null,
- the remove will match the \a item as well (used to remove an
- item when several items have the same key).
-*/
-
-bool QGDict::remove_string( const QString &key, QCollection::Item item )
-{
- QStringBucket *n = unlink_string( key, item );
- if ( n ) {
- deleteItem( n->getData() );
- delete n;
- return TRUE;
- } else {
- return FALSE;
- }
-}
-
-
-/*! \internal */
-
-bool QGDict::remove_ascii( const char *key, QCollection::Item item )
-{
- QAsciiBucket *n = unlink_ascii( key, item );
- if ( n ) {
- if ( copyk )
- delete [] (char *)n->getKey();
- deleteItem( n->getData() );
- delete n;
- }
- return n != 0;
-}
-
-
-/*! \internal */
-
-bool QGDict::remove_int( long key, QCollection::Item item )
-{
- QIntBucket *n = unlink_int( key, item );
- if ( n ) {
- deleteItem( n->getData() );
- delete n;
- }
- return n != 0;
-}
-
-
-/*! \internal */
-
-bool QGDict::remove_ptr( void *key, QCollection::Item item )
-{
- QPtrBucket *n = unlink_ptr( key, item );
- if ( n ) {
- deleteItem( n->getData() );
- delete n;
- }
- return n != 0;
-}
-
-
-/*! \internal */
-
-QCollection::Item QGDict::take_string( const QString &key )
-{
- QStringBucket *n = unlink_string( key );
- Item d;
- if ( n ) {
- d = n->getData();
- delete n;
- } else {
- d = 0;
- }
- return d;
-}
-
-
-/*! \internal */
-
-QCollection::Item QGDict::take_ascii( const char *key )
-{
- QAsciiBucket *n = unlink_ascii( key );
- Item d;
- if ( n ) {
- if ( copyk )
- delete [] (char *)n->getKey();
- d = n->getData();
- delete n;
- } else {
- d = 0;
- }
- return d;
-}
-
-
-/*! \internal */
-
-QCollection::Item QGDict::take_int( long key )
-{
- QIntBucket *n = unlink_int( key );
- Item d;
- if ( n ) {
- d = n->getData();
- delete n;
- } else {
- d = 0;
- }
- return d;
-}
-
-
-/*! \internal */
-
-QCollection::Item QGDict::take_ptr( void *key )
-{
- QPtrBucket *n = unlink_ptr( key );
- Item d;
- if ( n ) {
- d = n->getData();
- delete n;
- } else {
- d = 0;
- }
- return d;
-}
-
-
-/*!
- \internal
- Removes all items from the dictionary.
-*/
-
-void QGDict::clear()
-{
- if ( !numItems )
- return;
- numItems = 0; // disable remove() function
- for ( uint j=0; j<vlen; j++ ) { // destroy hash table
- if ( vec[j] ) {
- switch ( keytype ) {
- case StringKey:
- {
- QStringBucket *n=(QStringBucket *)vec[j];
- while ( n ) {
- QStringBucket *next = (QStringBucket*)n->getNext();
- deleteItem( n->getData() );
- delete n;
- n = next;
- }
- }
- break;
- case AsciiKey:
- {
- QAsciiBucket *n=(QAsciiBucket *)vec[j];
- while ( n ) {
- QAsciiBucket *next = (QAsciiBucket*)n->getNext();
- if ( copyk )
- delete [] (char *)n->getKey();
- deleteItem( n->getData() );
- delete n;
- n = next;
- }
- }
- break;
- case IntKey:
- {
- QIntBucket *n=(QIntBucket *)vec[j];
- while ( n ) {
- QIntBucket *next = (QIntBucket*)n->getNext();
- deleteItem( n->getData() );
- delete n;
- n = next;
- }
- }
- break;
- case PtrKey:
- {
- QPtrBucket *n=(QPtrBucket *)vec[j];
- while ( n ) {
- QPtrBucket *next = (QPtrBucket*)n->getNext();
- deleteItem( n->getData() );
- delete n;
- n = next;
- }
- }
- break;
- }
- vec[j] = 0; // detach list of buckets
- }
- }
- if ( iterators && iterators->count() ) { // invalidate all iterators
- QGDictIterator *i = iterators->first();
- while ( i ) {
- i->curNode = 0;
- i = iterators->next();
- }
- }
-}
-
-
-/*!
- \internal
- Outputs debug statistics.
-*/
-
-void QGDict::statistics() const
-{
-#if defined(DEBUG)
- QString line;
- line.fill( '-', 60 );
- double real, ideal;
- qDebug( line.ascii() );
- qDebug( "DICTIONARY STATISTICS:" );
- if ( count() == 0 ) {
- qDebug( "Empty!" );
- qDebug( line.ascii() );
- return;
- }
- real = 0.0;
- ideal = (float)count()/(2.0*size())*(count()+2.0*size()-1);
- uint i = 0;
- while ( i<size() ) {
- QBaseBucket *n = vec[i];
- int b = 0;
- while ( n ) { // count number of buckets
- b++;
- n = n->getNext();
- }
- real = real + (double)b * ((double)b+1.0)/2.0;
- char buf[80], *pbuf;
- if ( b > 78 )
- b = 78;
- pbuf = buf;
- while ( b-- )
- *pbuf++ = '*';
- *pbuf = '\0';
- qDebug( buf );
- i++;
- }
- qDebug( "Array size = %d", size() );
- qDebug( "# items = %d", count() );
- qDebug( "Real dist = %g", real );
- qDebug( "Rand dist = %g", ideal );
- qDebug( "Real/Rand = %g", real/ideal );
- qDebug( line.ascii() );
-#endif // DEBUG
-}
-
-
-/*****************************************************************************
- QGDict stream functions
- *****************************************************************************/
-#ifndef QT_NO_DATASTREAM
-QDataStream &operator>>( QDataStream &s, QGDict &dict )
-{
- return dict.read( s );
-}
-
-QDataStream &operator<<( QDataStream &s, const QGDict &dict )
-{
- return dict.write( s );
-}
-
-#if defined(_CC_DEC_) && defined(__alpha) && (__DECCXX_VER >= 50190001)
-#pragma message disable narrowptr
-#endif
-
-/*!
- \internal
- Reads a dictionary from the stream \e s.
-*/
-
-QDataStream &QGDict::read( QDataStream &s )
-{
- uint num;
- s >> num; // read number of items
- clear(); // clear dict
- while ( num-- ) { // read all items
- Item d;
- switch ( keytype ) {
- case StringKey:
- {
- QString k;
- s >> k;
- read( s, d );
- look_string( k, d, op_insert );
- }
- break;
- case AsciiKey:
- {
- char *k;
- s >> k;
- read( s, d );
- look_ascii( k, d, op_insert );
- if ( copyk )
- delete [] k;
- }
- break;
- case IntKey:
- {
- Q_UINT32 k;
- s >> k;
- read( s, d );
- look_int( k, d, op_insert );
- }
- break;
- case PtrKey:
- {
- Q_UINT32 k;
- s >> k;
- read( s, d );
- // ### cannot insert 0 - this renders the thing
- // useless since all pointers are written as 0,
- // but hey, serializing pointers? can it be done
- // at all, ever?
- if ( k )
- look_ptr( (void *)k, d, op_insert );
- }
- break;
- }
- }
- return s;
-}
-
-/*!
- \internal
- Writes the dictionary to the stream \e s.
-*/
-
-QDataStream& QGDict::write( QDataStream &s ) const
-{
- s << count(); // write number of items
- uint i = 0;
- while ( i<size() ) {
- QBaseBucket *n = vec[i];
- while ( n ) { // write all buckets
- switch ( keytype ) {
- case StringKey:
- s << ((QStringBucket*)n)->getKey();
- break;
- case AsciiKey:
- s << ((QAsciiBucket*)n)->getKey();
- break;
- case IntKey:
- s << (Q_UINT32)((QIntBucket*)n)->getKey();
- break;
- case PtrKey:
- s << (Q_UINT32)0; // ### cannot serialize a pointer
- break;
- }
- write( s, n->getData() ); // write data
- n = n->getNext();
- }
- i++;
- }
- return s;
-}
-#endif //QT_NO_DATASTREAM
-
-/*****************************************************************************
- QGDictIterator member functions
- *****************************************************************************/
-
-/*!
- \class QGDictIterator qgdict.h
- \brief An internal class for implementing QDictIterator and QIntDictIterator.
-
- QGDictIterator is a strictly internal class that does the heavy work for
- QDictIterator and QIntDictIterator.
-*/
-
-/*!
- \internal
- Constructs an iterator that operates on the dictionary \e d.
-*/
-
-QGDictIterator::QGDictIterator( const QGDict &d )
-{
- dict = (QGDict *)&d; // get reference to dict
- toFirst(); // set to first noe
- if ( !dict->iterators ) {
- dict->iterators = new QGDItList; // create iterator list
- CHECK_PTR( dict->iterators );
- }
- dict->iterators->append( this ); // attach iterator to dict
-}
-
-/*!
- \internal
- Constructs a copy of the iterator \e it.
-*/
-
-QGDictIterator::QGDictIterator( const QGDictIterator &it )
-{
- dict = it.dict;
- curNode = it.curNode;
- curIndex = it.curIndex;
- if ( dict )
- dict->iterators->append( this ); // attach iterator to dict
-}
-
-/*!
- \internal
- Assigns a copy of the iterator \e it and returns a reference to this
- iterator.
-*/
-
-QGDictIterator &QGDictIterator::operator=( const QGDictIterator &it )
-{
- if ( dict ) // detach from old dict
- dict->iterators->removeRef( this );
- dict = it.dict;
- curNode = it.curNode;
- curIndex = it.curIndex;
- if ( dict )
- dict->iterators->append( this ); // attach to new list
- return *this;
-}
-
-/*!
- \internal
- Destroys the iterator.
-*/
-
-QGDictIterator::~QGDictIterator()
-{
- if ( dict ) // detach iterator from dict
- dict->iterators->removeRef( this );
-}
-
-
-/*!
- \internal
- Sets the iterator to point to the first item in the dictionary.
-*/
-
-QCollection::Item QGDictIterator::toFirst()
-{
- if ( !dict ) {
-#if defined(CHECK_NULL)
- qWarning( "QGDictIterator::toFirst: Dictionary has been deleted" );
-#endif
- return 0;
- }
- if ( dict->count() == 0 ) { // empty dictionary
- curNode = 0;
- return 0;
- }
- register uint i = 0;
- register QBaseBucket **v = dict->vec;
- while ( !(*v++) )
- i++;
- curNode = dict->vec[i];
- curIndex = i;
- return curNode->getData();
-}
-
-
-/*!
- \internal
- Moves to the next item (postfix).
-*/
-
-QCollection::Item QGDictIterator::operator()()
-{
- if ( !dict ) {
-#if defined(CHECK_NULL)
- qWarning( "QGDictIterator::operator(): Dictionary has been deleted" );
-#endif
- return 0;
- }
- if ( !curNode )
- return 0;
- QCollection::Item d = curNode->getData();
- this->operator++();
- return d;
-}
-
-/*!
- \internal
- Moves to the next item (prefix).
-*/
-
-QCollection::Item QGDictIterator::operator++()
-{
- if ( !dict ) {
-#if defined(CHECK_NULL)
- qWarning( "QGDictIterator::operator++: Dictionary has been deleted" );
-#endif
- return 0;
- }
- if ( !curNode )
- return 0;
- curNode = curNode->getNext();
- if ( !curNode ) { // no next bucket
- register uint i = curIndex + 1; // look from next vec element
- register QBaseBucket **v = &dict->vec[i];
- while ( i < dict->size() && !(*v++) )
- i++;
- if ( i == dict->size() ) { // nothing found
- curNode = 0;
- return 0;
- }
- curNode = dict->vec[i];
- curIndex = i;
- }
- return curNode->getData();
-}
-
-/*!
- \internal
- Moves \e jumps positions forward.
-*/
-
-QCollection::Item QGDictIterator::operator+=( uint jumps )
-{
- while ( curNode && jumps-- )
- operator++();
- return curNode ? curNode->getData() : 0;
-}
diff --git a/qtools/qgdict.h b/qtools/qgdict.h
deleted file mode 100644
index 6243364..0000000
--- a/qtools/qgdict.h
+++ /dev/null
@@ -1,222 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QGDict and QGDictIterator classes
-**
-** Created : 920529
-**
-** 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 QGDICT_H
-#define QGDICT_H
-
-#ifndef QT_H
-#include "qcollection.h"
-#include "qstring.h"
-#endif // QT_H
-
-class QGDictIterator;
-class QGDItList;
-
-
-class QBaseBucket // internal dict node
-{
-public:
- QCollection::Item getData() { return data; }
- QCollection::Item setData( QCollection::Item d ) { return data = d; }
- QBaseBucket *getNext() { return next; }
- void setNext( QBaseBucket *n) { next = n; }
-protected:
- QBaseBucket( QCollection::Item d, QBaseBucket *n ) : data(d), next(n) {}
- QCollection::Item data;
- QBaseBucket *next;
-};
-
-class QStringBucket : public QBaseBucket
-{
-public:
- QStringBucket( const QString &k, QCollection::Item d, QBaseBucket *n )
- : QBaseBucket(d,n), key(k) {}
- const QString &getKey() const { return key; }
-private:
- QString key;
-};
-
-class QAsciiBucket : public QBaseBucket
-{
-public:
- QAsciiBucket( const char *k, QCollection::Item d, QBaseBucket *n )
- : QBaseBucket(d,n), key(k) {}
- const char *getKey() const { return key; }
-private:
- const char *key;
-};
-
-class QIntBucket : public QBaseBucket
-{
-public:
- QIntBucket( long k, QCollection::Item d, QBaseBucket *n )
- : QBaseBucket(d,n), key(k) {}
- long getKey() const { return key; }
-private:
- long key;
-};
-
-class QPtrBucket : public QBaseBucket
-{
-public:
- QPtrBucket( void *k, QCollection::Item d, QBaseBucket *n )
- : QBaseBucket(d,n), key(k) {}
- void *getKey() const { return key; }
-private:
- void *key;
-};
-
-
-class Q_EXPORT QGDict : public QCollection // generic dictionary class
-{
-public:
- uint count() const { return numItems; }
- uint size() const { return vlen; }
- QCollection::Item look_string( const QString& key, QCollection::Item,
- int );
- QCollection::Item look_ascii( const char *key, QCollection::Item, int );
- QCollection::Item look_int( long key, QCollection::Item, int );
- QCollection::Item look_ptr( void *key, QCollection::Item, int );
-#ifndef QT_NO_DATASTREAM
- QDataStream &read( QDataStream & );
- QDataStream &write( QDataStream & ) const;
-#endif
-protected:
- enum KeyType { StringKey, AsciiKey, IntKey, PtrKey };
-
- QGDict( uint len, KeyType kt, bool cs, bool ck );
- QGDict( const QGDict & );
- ~QGDict();
-
- QGDict &operator=( const QGDict & );
-
- bool remove_string( const QString &key, QCollection::Item item=0 );
- bool remove_ascii( const char *key, QCollection::Item item=0 );
- bool remove_int( long key, QCollection::Item item=0 );
- bool remove_ptr( void *key, QCollection::Item item=0 );
- QCollection::Item take_string( const QString &key );
- QCollection::Item take_ascii( const char *key );
- QCollection::Item take_int( long key );
- QCollection::Item take_ptr( void *key );
-
- void clear();
- void resize( uint );
-
- int hashKeyString( const QString & );
- int hashKeyAscii( const char * );
-
- void statistics() const;
-
-#ifndef QT_NO_DATASTREAM
- virtual QDataStream &read( QDataStream &, QCollection::Item & );
- virtual QDataStream &write( QDataStream &, QCollection::Item ) const;
-#endif
-private:
- QBaseBucket **vec;
- uint vlen;
- uint numItems;
- uint keytype : 2;
- uint cases : 1;
- uint copyk : 1;
- QGDItList *iterators;
- void unlink_common( int, QBaseBucket *, QBaseBucket * );
- QStringBucket *unlink_string( const QString &,
- QCollection::Item item = 0 );
- QAsciiBucket *unlink_ascii( const char *, QCollection::Item item = 0 );
- QIntBucket *unlink_int( long, QCollection::Item item = 0 );
- QPtrBucket *unlink_ptr( void *, QCollection::Item item = 0 );
- void init( uint, KeyType, bool, bool );
- friend class QGDictIterator;
-};
-
-
-class Q_EXPORT QGDictIterator // generic dictionary iterator
-{
-friend class QGDict;
-public:
- QGDictIterator( const QGDict & );
- QGDictIterator( const QGDictIterator & );
- QGDictIterator &operator=( const QGDictIterator & );
- ~QGDictIterator();
-
- QCollection::Item toFirst();
-
- QCollection::Item get() const;
- QString getKeyString() const;
- const char *getKeyAscii() const;
- long getKeyInt() const;
- void *getKeyPtr() const;
-
- QCollection::Item operator()();
- QCollection::Item operator++();
- QCollection::Item operator+=(uint);
-
-protected:
- QGDict *dict;
-
-private:
- QBaseBucket *curNode;
- uint curIndex;
-};
-
-inline QCollection::Item QGDictIterator::get() const
-{
- return curNode ? curNode->getData() : 0;
-}
-
-inline QString QGDictIterator::getKeyString() const
-{
- return curNode ? ((QStringBucket*)curNode)->getKey() : QString::null;
-}
-
-inline const char *QGDictIterator::getKeyAscii() const
-{
- return curNode ? ((QAsciiBucket*)curNode)->getKey() : 0;
-}
-
-inline long QGDictIterator::getKeyInt() const
-{
- return curNode ? ((QIntBucket*)curNode)->getKey() : 0;
-}
-
-inline void *QGDictIterator::getKeyPtr() const
-{
- return curNode ? ((QPtrBucket*)curNode)->getKey() : 0;
-}
-
-
-#endif // QGDICT_H
diff --git a/qtools/qgeneric.h b/qtools/qgeneric.h
deleted file mode 100644
index c2892a0..0000000
--- a/qtools/qgeneric.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/****************************************************************************
-**
-**
-** Macros for pasting tokens; utilized by our generic classes
-**
-** Created : 920529
-**
-** 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 QGENERIC_H
-#define QGENERIC_H
-
-#error "do not include qgeneric.h any more"
-
-#endif // QGENERIC_H
diff --git a/qtools/qglist.cpp b/qtools/qglist.cpp
deleted file mode 100644
index f464a73..0000000
--- a/qtools/qglist.cpp
+++ /dev/null
@@ -1,1223 +0,0 @@
-/****************************************************************************
-**
-**
-** Implementation of QGList and QGListIterator classes
-**
-** Created : 920624
-**
-** 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 "qglist.h"
-#include "qgvector.h"
-#include "qdatastream.h"
-
-
-// NOT REVISED
-/*!
- \class QLNode qglist.h
- \brief The QLNode class is an internal class for the QList template collection.
-
- QLNode is a doubly linked list node; it has three pointers:
- <ol>
- <li> Pointer to the previous node.
- <li> Pointer to the next node.
- <li> Pointer to the actual data.
- </ol>
-
- Sometimes it might be practical to have direct access to the list nodes
- in a QList, but it is seldom required.
-
- \warning Be very careful if you want to access the list nodes. The heap
- can easily get corrupted if you make a mistake.
-
- \sa QList::currentNode(), QList::removeNode(), QList::takeNode()
-*/
-
-/*!
- \fn QCollection::Item QLNode::getData()
- Returns a pointer (\c void*) to the actual data in the list node.
-*/
-
-
-/*!
- \class QGList qglist.h
- \brief The QGList class is an internal class for implementing Qt collection classes.
-
- QGList is a strictly internal class that acts as a base class for several
- \link collection.html collection classes\endlink; QList, QQueue and
- QStack.
-
- QGList has some virtual functions that can be reimplemented to customize
- the subclasses.
- <ul>
- <li> compareItems() compares two collection/list items.
- <li> read() reads a collection/list item from a QDataStream.
- <li> write() writes a collection/list item to a QDataStream.
- </ul>
- Normally, you do not have to reimplement any of these functions.
- If you still want to reimplement them, see the QStrList class (qstrlist.h),
- which is a good example.
-*/
-
-
-/*****************************************************************************
- Default implementation of virtual functions
- *****************************************************************************/
-
-/*!
- This virtual function compares two list items.
-
- Returns:
- <ul>
- <li> 0 if \e item1 == \e item2
- <li> non-zero if \e item1 != \e item2
- </ul>
-
- This function returns \e int rather than \e bool so that
- reimplementations can return three values and use it to sort by:
-
- <ul>
- <li> 0 if \e item1 == \e item2
- <li> \> 0 (positive integer) if \e item1 \> \e item2
- <li> \< 0 (negative integer) if \e item1 \< \e item2
- </ul>
-
- The QList::inSort() function requires that compareItems() is implemented
- as described here.
-
- This function should not modify the list because some const functions
- call compareItems().
-
- The default implementation compares the pointers:
- \code
-
- \endcode
-*/
-
-int QGList::compareItems( QCollection::Item item1, QCollection::Item item2 )
-{
- return item1 != item2; // compare pointers
-}
-
-#ifndef QT_NO_DATASTREAM
-/*!
- Reads a collection/list item from the stream \a s and returns a reference
- to the stream.
-
- The default implementation sets \a item to 0.
-
- \sa write()
-*/
-
-QDataStream &QGList::read( QDataStream &s, QCollection::Item &item )
-{
- item = 0;
- return s;
-}
-
-/*!
- Writes a collection/list item to the stream \a s and returns a reference
- to the stream.
-
- The default implementation does nothing.
-
- \sa read()
-*/
-
-QDataStream &QGList::write( QDataStream &s, QCollection::Item ) const
-{
- return s;
-}
-#endif // QT_NO_DATASTREAM
-
-/*****************************************************************************
- QGList member functions
- *****************************************************************************/
-
-/*!
- \internal
- Constructs an empty list.
-*/
-
-QGList::QGList()
-{
- firstNode = lastNode = curNode = 0; // initialize list
- numNodes = 0;
- curIndex = -1;
- iterators = 0; // initialize iterator list
-}
-
-/*!
- \internal
- Constructs a copy of \e list.
-*/
-
-QGList::QGList( const QGList & list )
- : QCollection( list )
-{
- firstNode = lastNode = curNode = 0; // initialize list
- numNodes = 0;
- curIndex = -1;
- iterators = 0; // initialize iterator list
- QLNode *n = list.firstNode;
- while ( n ) { // copy all items from list
- append( n->data );
- n = n->next;
- }
-}
-
-/*!
- \internal
- Removes all items from the list and destroys the list.
-*/
-
-QGList::~QGList()
-{
- clear();
- if ( !iterators ) // no iterators for this list
- return;
- QGListIterator *i = (QGListIterator*)iterators->first();
- while ( i ) { // notify all iterators that
- i->list = 0; // this list is deleted
- i->curNode = 0;
- i = (QGListIterator*)iterators->next();
- }
- delete iterators;
-}
-
-
-/*!
- \internal
- Assigns \e list to this list.
-*/
-
-QGList& QGList::operator=( const QGList &list )
-{
- clear();
- if ( list.count() > 0 ) {
- QLNode *n = list.firstNode;
- while ( n ) { // copy all items from list
- append( n->data );
- n = n->next;
- }
- curNode = firstNode;
- curIndex = 0;
- }
- return *this;
-}
-
-/*!
- Compares this list with \a list. Retruns TRUE if the lists
- contain the same data, else FALSE.
-*/
-
-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 ) {
- // should be mutable
- if ( ( (QGList*)this )->compareItems( n1->data, n2->data ) != 0 )
- return FALSE;
- n1 = n1->next;
- n2 = n2->next;
- }
-
- return TRUE;
-}
-
-/*!
- \fn uint QGList::count() const
- \internal
- Returns the number of items in the list.
-*/
-
-
-/*!
- \internal
- Returns the node at position \e index. Sets this node to current.
-*/
-
-QLNode *QGList::locate( uint index )
-{
- if ( index == (uint)curIndex ) // current node ?
- return curNode;
- if ( !curNode && firstNode ) { // set current node
- curNode = firstNode;
- curIndex = 0;
- }
- register QLNode *node;
- int distance = index - curIndex; // node distance to cur node
- bool forward; // direction to traverse
-
- if ( index >= numNodes ) {
-#if defined(CHECK_RANGE)
- qWarning( "QGList::locate: Index %d out of range", index );
-#endif
- return 0;
- }
-
- if ( distance < 0 )
- distance = -distance;
- if ( (uint)distance < index && (uint)distance < numNodes - index ) {
- node = curNode; // start from current node
- forward = index > (uint)curIndex;
- } else if ( index < numNodes - index ) { // start from first node
- node = firstNode;
- distance = index;
- forward = TRUE;
- } else { // start from last node
- node = lastNode;
- distance = numNodes - index - 1;
- if ( distance < 0 )
- distance = 0;
- forward = FALSE;
- }
- if ( forward ) { // now run through nodes
- while ( distance-- )
- node = node->next;
- } else {
- while ( distance-- )
- node = node->prev;
- }
- curIndex = index; // must update index
- return curNode = node;
-}
-
-
-/*!
- \internal
- Inserts an item at its sorted position in the list.
-*/
-
-void QGList::inSort( QCollection::Item d )
-{
- int index = 0;
- register QLNode *n = firstNode;
- while ( n && compareItems(n->data,d) < 0 ){ // find position in list
- n = n->next;
- index++;
- }
- insertAt( index, d );
-}
-
-
-/*!
- \internal
- Inserts an item at the start of the list.
-*/
-
-void QGList::prepend( QCollection::Item d )
-{
- register QLNode *n = new QLNode( newItem(d) );
- CHECK_PTR( n );
- n->prev = 0;
- if ( (n->next = firstNode) ) // list is not empty
- firstNode->prev = n;
- else // initialize list
- lastNode = n;
- firstNode = curNode = n; // curNode affected
- numNodes++;
- curIndex = 0;
-}
-
-
-/*!
- \internal
- Inserts an item at the end of the list.
-*/
-
-void QGList::append( QCollection::Item d )
-{
- register QLNode *n = new QLNode( newItem(d) );
- CHECK_PTR( n );
- n->next = 0;
- if ( (n->prev = lastNode) ) // list is not empty
- lastNode->next = n;
- else // initialize list
- firstNode = n;
- lastNode = curNode = n; // curNode affected
- curIndex = numNodes;
- numNodes++;
-}
-
-
-/*!
- \internal
- Inserts an item at position \e index in the list.
-*/
-
-bool QGList::insertAt( uint index, QCollection::Item d )
-{
- if ( index == 0 ) { // insert at head of list
- prepend( d );
- return TRUE;
- } else if ( index == numNodes ) { // append at tail of list
- append( d );
- return TRUE;
- }
- QLNode *nextNode = locate( index );
- if ( !nextNode ) // illegal position
- return FALSE;
- QLNode *prevNode = nextNode->prev;
- register QLNode *n = new QLNode( newItem(d) );
- CHECK_PTR( n );
- nextNode->prev = n;
- prevNode->next = n;
- n->prev = prevNode; // link new node into list
- n->next = nextNode;
- curNode = n; // curIndex set by locate()
- numNodes++;
- return TRUE;
-}
-
-
-/*!
- \internal
- Relinks node \e n and makes it the first node in the list.
-*/
-
-void QGList::relinkNode( QLNode *n )
-{
- if ( n == firstNode ) // already first
- return;
- curNode = n;
- unlink();
- n->prev = 0;
- if ( (n->next = firstNode) ) // list is not empty
- firstNode->prev = n;
- else // initialize list
- lastNode = n;
- firstNode = curNode = n; // curNode affected
- numNodes++;
- curIndex = 0;
-}
-
-
-/*!
- \internal
- Unlinks the current list node and returns a pointer to this node.
-*/
-
-QLNode *QGList::unlink()
-{
- if ( curNode == 0 ) // null current node
- return 0;
- register QLNode *n = curNode; // unlink this node
- if ( n == firstNode ) { // removing first node ?
- if ( (firstNode = n->next) ) {
- firstNode->prev = 0;
- } else {
- lastNode = curNode = 0; // list becomes empty
- curIndex = -1;
- }
- } else {
- if ( n == lastNode ) { // removing last node ?
- lastNode = n->prev;
- lastNode->next = 0;
- } else { // neither last nor first node
- n->prev->next = n->next;
- n->next->prev = n->prev;
- }
- }
- if ( n->next ) { // change current node
- curNode = n->next;
- } else if ( n->prev ) {
- curNode = n->prev;
- curIndex--;
- }
- if ( iterators && iterators->count() ) { // update iterators
- QGListIterator *i = (QGListIterator*)iterators->first();
- while ( i ) { // fix all iterators that
- if ( i->curNode == n ) // refers to pending node
- i->curNode = curNode;
- i = (QGListIterator*)iterators->next();
- }
- }
- numNodes--;
- return n;
-}
-
-
-/*!
- \internal
- Removes the node \e n from the list.
-*/
-
-bool QGList::removeNode( QLNode *n )
-{
-#if defined(CHECK_NULL)
- if ( n == 0 || (n->prev && n->prev->next != n) ||
- (n->next && n->next->prev != n) ) {
- qWarning( "QGList::removeNode: Corrupted node" );
- return FALSE;
- }
-#endif
- curNode = n;
- unlink(); // unlink node
- deleteItem( n->data ); // deallocate this node
- delete n;
- curNode = firstNode;
- curIndex = curNode ? 0 : -1;
- return TRUE;
-}
-
-/*!
- \internal
- Removes the item \e d from the list. Uses compareItems() to find the item.
-*/
-
-bool QGList::remove( QCollection::Item d )
-{
- if ( d ) { // find the item
- if ( find(d) == -1 )
- return FALSE;
- }
- QLNode *n = unlink(); // unlink node
- if ( !n )
- return FALSE;
- deleteItem( n->data ); // deallocate this node
- delete n;
- return TRUE;
-}
-
-/*!
- \internal
- Removes the item \e d from the list.
-*/
-
-bool QGList::removeRef( QCollection::Item d )
-{
- if ( d ) { // find the item
- if ( findRef(d) == -1 )
- return FALSE;
- }
- QLNode *n = unlink(); // unlink node
- if ( !n )
- return FALSE;
- deleteItem( n->data ); // deallocate this node
- delete n;
- return TRUE;
-}
-
-/*!
- \fn bool QGList::removeFirst()
- \internal
- Removes the first item in the list.
-*/
-
-/*!
- \fn bool QGList::removeLast()
- \internal
- Removes the last item in the list.
-*/
-
-/*!
- \internal
- Removes the item at position \e index from the list.
-*/
-
-bool QGList::removeAt( uint index )
-{
- if ( !locate(index) )
- return FALSE;
- QLNode *n = unlink(); // unlink node
- if ( !n )
- return FALSE;
- deleteItem( n->data ); // deallocate this node
- delete n;
- return TRUE;
-}
-
-
-/*!
- \internal
- Takes the node \e n out of the list.
-*/
-
-QCollection::Item QGList::takeNode( QLNode *n )
-{
-#if defined(CHECK_NULL)
- if ( n == 0 || (n->prev && n->prev->next != n) ||
- (n->next && n->next->prev != n) ) {
- qWarning( "QGList::takeNode: Corrupted node" );
- return 0;
- }
-#endif
- curNode = n;
- unlink(); // unlink node
- Item d = n->data;
- delete n; // delete the node, not data
- curNode = firstNode;
- curIndex = curNode ? 0 : -1;
- return d;
-}
-
-/*!
- \internal
- Takes the current item out of the list.
-*/
-
-QCollection::Item QGList::take()
-{
- QLNode *n = unlink(); // unlink node
- Item d = n ? n->data : 0;
- delete n; // delete node, keep contents
- return d;
-}
-
-/*!
- \internal
- Takes the item at position \e index out of the list.
-*/
-
-QCollection::Item QGList::takeAt( uint index )
-{
- if ( !locate(index) )
- return 0;
- QLNode *n = unlink(); // unlink node
- Item d = n ? n->data : 0;
- delete n; // delete node, keep contents
- return d;
-}
-
-/*!
- \internal
- Takes the first item out of the list.
-*/
-
-QCollection::Item QGList::takeFirst()
-{
- first();
- QLNode *n = unlink(); // unlink node
- Item d = n ? n->data : 0;
- delete n;
- return d;
-}
-
-/*!
- \internal
- Takes the last item out of the list.
-*/
-
-QCollection::Item QGList::takeLast()
-{
- last();
- QLNode *n = unlink(); // unlink node
- Item d = n ? n->data : 0;
- delete n;
- return d;
-}
-
-
-/*!
- \internal
- Removes all items from the list.
-*/
-
-void QGList::clear()
-{
- register QLNode *n = firstNode;
-
- firstNode = lastNode = curNode = 0; // initialize list
- numNodes = 0;
- curIndex = -1;
-
- if ( iterators && iterators->count() ) {
- QGListIterator *i = (QGListIterator*)iterators->first();
- while ( i ) { // notify all iterators that
- i->curNode = 0; // this list is empty
- i = (QGListIterator*)iterators->next();
- }
- }
-
- QLNode *prevNode;
- while ( n ) { // for all nodes ...
- deleteItem( n->data ); // deallocate data
- prevNode = n;
- n = n->next;
- delete prevNode; // deallocate node
- }
-}
-
-
-/*!
- \internal
- Finds an item in the list.
-*/
-
-int QGList::findRef( QCollection::Item d, bool fromStart )
-{
- register QLNode *n;
- int index;
- if ( fromStart ) { // start from first node
- n = firstNode;
- index = 0;
- } else { // start from current node
- n = curNode;
- index = curIndex;
- }
- while ( n && n->data != d ) { // find exact match
- n = n->next;
- index++;
- }
- curNode = n;
- curIndex = n ? index : -1;
- return curIndex; // return position of item
-}
-
-/*!
- \internal
- Finds an item in the list. Uses compareItems().
-*/
-
-int QGList::find( QCollection::Item d, bool fromStart )
-{
- register QLNode *n;
- int index;
- if ( fromStart ) { // start from first node
- n = firstNode;
- index = 0;
- } else { // start from current node
- n = curNode;
- index = curIndex;
- }
- while ( n && compareItems(n->data,d) ){ // find equal match
- n = n->next;
- index++;
- }
- curNode = n;
- curIndex = n ? index : -1;
- return curIndex; // return position of item
-}
-
-
-/*!
- \internal
- Counts the number an item occurs in the list.
-*/
-
-uint QGList::containsRef( QCollection::Item d ) const
-{
- register QLNode *n = firstNode;
- uint count = 0;
- while ( n ) { // for all nodes...
- if ( n->data == d ) // count # exact matches
- count++;
- n = n->next;
- }
- return count;
-}
-
-/*!
- \internal
- Counts the number an item occurs in the list. Uses compareItems().
-*/
-
-uint QGList::contains( QCollection::Item d ) const
-{
- register QLNode *n = firstNode;
- uint count = 0;
- QGList *that = (QGList*)this; // mutable for compareItems()
- while ( n ) { // for all nodes...
- if ( !that->compareItems(n->data,d) ) // count # equal matches
- count++;
- n = n->next;
- }
- return count;
-}
-
-
-/*!
- \fn QCollection::Item QGList::at( uint index )
- \internal
- Sets the item at position \e index to the current item.
-*/
-
-/*!
- \fn int QGList::at() const
- \internal
- Returns the current index.
-*/
-
-/*!
- \fn QLNode *QGList::currentNode() const
- \internal
- Returns the current node.
-*/
-
-/*!
- \fn QCollection::Item QGList::get() const
- \internal
- Returns the current item.
-*/
-
-/*!
- \fn QCollection::Item QGList::cfirst() const
- \internal
- Returns the first item in the list.
-*/
-
-/*!
- \fn QCollection::Item QGList::clast() const
- \internal
- Returns the last item in the list.
-*/
-
-
-/*!
- \internal
- Returns the first list item. Sets this to current.
-*/
-
-QCollection::Item QGList::first()
-{
- if ( firstNode ) {
- curIndex = 0;
- return (curNode=firstNode)->data;
- }
- return 0;
-}
-
-/*!
- \internal
- Returns the last list item. Sets this to current.
-*/
-
-QCollection::Item QGList::last()
-{
- if ( lastNode ) {
- curIndex = numNodes-1;
- return (curNode=lastNode)->data;
- }
- return 0;
-}
-
-/*!
- \internal
- Returns the next list item (after current). Sets this to current.
-*/
-
-QCollection::Item QGList::next()
-{
- if ( curNode ) {
- if ( curNode->next ) {
- curIndex++;
- curNode = curNode->next;
- return curNode->data;
- }
- curIndex = -1;
- curNode = 0;
- }
- return 0;
-}
-
-/*!
- \internal
- Returns the previous list item (before current). Sets this to current.
-*/
-
-QCollection::Item QGList::prev()
-{
- if ( curNode ) {
- if ( curNode->prev ) {
- curIndex--;
- curNode = curNode->prev;
- return curNode->data;
- }
- curIndex = -1;
- curNode = 0;
- }
- return 0;
-}
-
-
-/*!
- \internal
- Converts the list to a vector.
-*/
-
-void QGList::toVector( QGVector *vector ) const
-{
- vector->clear();
- if ( !vector->resize( count() ) )
- return;
- register 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;
- while( r <= last/2 ) {
- // Node r has only one child ?
- if ( last == 2*r ) {
- // Need for swapping ?
- if ( compareItems( heap[r], heap[ 2*r ] ) > 0 ) {
- QCollection::Item tmp = heap[r];
- heap[ r ] = heap[ 2*r ];
- heap[ 2*r ] = tmp;
- }
- // That's it ...
- r = last;
- } else {
- // Node has two children
- if ( compareItems( heap[r], heap[ 2*r ] ) > 0 &&
- compareItems( heap[ 2*r ], heap[ 2*r+1 ] ) <= 0 ) {
- // Swap with left child
- QCollection::Item tmp = heap[r];
- heap[ r ] = heap[ 2*r ];
- heap[ 2*r ] = tmp;
- r *= 2;
- } else if ( compareItems( heap[r], heap[ 2*r+1 ] ) > 0 &&
- compareItems( heap[ 2*r+1 ], heap[ 2*r ] ) < 0 ) {
- // Swap with right child
- QCollection::Item tmp = heap[r];
- heap[ r ] = heap[ 2*r+1 ];
- heap[ 2*r+1 ] = tmp;
- r = 2*r+1;
- } else {
- // We are done
- r = last;
- }
- }
- }
-}
-
-
-/*! Sorts the list by the result of the virtual compareItems() function.
-
- The Heap-Sort algorithm is used for sorting. It sorts n items with
- O(n*log n) compares. This is the asymptotic optimal solution of the
- sorting problem.
-*/
-
-void QGList::sort()
-{
- uint n = count();
- if ( n < 2 )
- return;
-
- // Create the heap
- QCollection::Item* realheap = new QCollection::Item[ n ];
- // Wow, what a fake. But I want the heap to be indexed as 1...n
- QCollection::Item* heap = realheap - 1;
- int size = 0;
- QLNode* insert = firstNode;
- for( ; insert != 0; insert = insert->next ) {
- heap[++size] = insert->data;
- int i = size;
- while( i > 1 && compareItems( heap[i], heap[ i / 2 ] ) < 0 ) {
- QCollection::Item tmp = heap[ i ];
- heap[ i ] = heap[ i/2 ];
- heap[ i/2 ] = tmp;
- i /= 2;
- }
- }
-
- insert = firstNode;
- // Now do the sorting
- for ( int i = n; i > 0; i-- ) {
- insert->data = heap[1];
- insert = insert->next;
- if ( i > 1 ) {
- heap[1] = heap[i];
- heapSortPushDown( heap, 1, i - 1 );
- }
- }
-
- delete [] realheap;
-}
-
-
-/*****************************************************************************
- QGList stream functions
- *****************************************************************************/
-
-#ifndef QT_NO_DATASTREAM
-QDataStream &operator>>( QDataStream &s, QGList &list )
-{ // read list
- return list.read( s );
-}
-
-QDataStream &operator<<( QDataStream &s, const QGList &list )
-{ // write list
- return list.write( s );
-}
-
-/*!
- \internal
- Reads a list from the stream \e s.
-*/
-
-QDataStream &QGList::read( QDataStream &s )
-{
- uint num;
- s >> num; // read number of items
- clear(); // clear list
- while ( num-- ) { // read all items
- Item d;
- read( s, d );
- CHECK_PTR( d );
- if ( !d ) // no memory
- break;
- QLNode *n = new QLNode( d );
- CHECK_PTR( n );
- if ( !n ) // no memory
- break;
- n->next = 0;
- if ( (n->prev = lastNode) ) // list is not empty
- lastNode->next = n;
- else // initialize list
- firstNode = n;
- lastNode = n;
- numNodes++;
- }
- curNode = firstNode;
- curIndex = curNode ? 0 : -1;
- return s;
-}
-
-/*!
- \internal
- Writes the list to the stream \e s.
-*/
-
-QDataStream &QGList::write( QDataStream &s ) const
-{
- s << count(); // write number of items
- QLNode *n = firstNode;
- while ( n ) { // write all items
- write( s, n->data );
- n = n->next;
- }
- return s;
-}
-
-#endif // QT_NO_DATASTREAM
-
-/*****************************************************************************
- QGListIterator member functions
- *****************************************************************************/
-
-/*!
- \class QGListIterator qglist.h
- \brief The QGListIterator class is an internal class for implementing QListIterator.
-
- QGListIterator is a strictly internal class that does the heavy work for
- QListIterator.
-*/
-
-/*!
- \internal
- Constructs an iterator that operates on the list \e l.
-*/
-
-QGListIterator::QGListIterator( const QGList &l )
-{
- list = (QGList *)&l; // get reference to list
- curNode = list->firstNode; // set to first node
- if ( !list->iterators ) {
- list->iterators = new QGList; // create iterator list
- CHECK_PTR( list->iterators );
- }
- list->iterators->append( this ); // attach iterator to list
-}
-
-/*!
- \internal
- Constructs a copy of the iterator \e it.
-*/
-
-QGListIterator::QGListIterator( const QGListIterator &it )
-{
- list = it.list;
- curNode = it.curNode;
- if ( list )
- list->iterators->append( this ); // attach iterator to list
-}
-
-/*!
- \internal
- Assigns a copy of the iterator \e it and returns a reference to this
- iterator.
-*/
-
-QGListIterator &QGListIterator::operator=( const QGListIterator &it )
-{
- if ( list ) // detach from old list
- list->iterators->removeRef( this );
- list = it.list;
- curNode = it.curNode;
- if ( list )
- list->iterators->append( this ); // attach to new list
- return *this;
-}
-
-/*!
- \internal
- Destroys the iterator.
-*/
-
-QGListIterator::~QGListIterator()
-{
- if ( list ) // detach iterator from list
- list->iterators->removeRef(this);
-}
-
-
-/*!
- \fn bool QGListIterator::atFirst() const
- \internal
- Returns TRUE if the iterator points to the first item, otherwise FALSE.
-*/
-
-/*!
- \fn bool QGListIterator::atLast() const
- \internal
- Returns TRUE if the iterator points to the last item, otherwise FALSE.
-*/
-
-
-/*!
- \internal
- Sets the list iterator to point to the first item in the list.
-*/
-
-QCollection::Item QGListIterator::toFirst()
-{
- if ( !list ) {
-#if defined(CHECK_NULL)
- qWarning( "QGListIterator::toFirst: List has been deleted" );
-#endif
- return 0;
- }
- return list->firstNode ? (curNode = list->firstNode)->getData() : 0;
-}
-
-/*!
- \internal
- Sets the list iterator to point to the last item in the list.
-*/
-
-QCollection::Item QGListIterator::toLast()
-{
- if ( !list ) {
-#if defined(CHECK_NULL)
- qWarning( "QGListIterator::toLast: List has been deleted" );
-#endif
- return 0;
- }
- return list->lastNode ? (curNode = list->lastNode)->getData() : 0;
-}
-
-
-/*!
- \fn QCollection::Item QGListIterator::get() const
- \internal
- Returns the iterator item.
-*/
-
-
-/*!
- \internal
- Moves to the next item (postfix).
-*/
-
-QCollection::Item QGListIterator::operator()()
-{
- if ( !curNode )
- return 0;
- QCollection::Item d = curNode->getData();
- curNode = curNode->next;
- return d;
-}
-
-/*!
- \internal
- Moves to the next item (prefix).
-*/
-
-QCollection::Item QGListIterator::operator++()
-{
- if ( !curNode )
- return 0;
- curNode = curNode->next;
- return curNode ? curNode->getData() : 0;
-}
-
-/*!
- \internal
- Moves \e jumps positions forward.
-*/
-
-QCollection::Item QGListIterator::operator+=( uint jumps )
-{
- while ( curNode && jumps-- )
- curNode = curNode->next;
- return curNode ? curNode->getData() : 0;
-}
-
-/*!
- \internal
- Moves to the previous item (prefix).
-*/
-
-QCollection::Item QGListIterator::operator--()
-{
- if ( !curNode )
- return 0;
- curNode = curNode->prev;
- return curNode ? curNode->getData() : 0;
-}
-
-/*!
- \internal
- Moves \e jumps positions backward.
-*/
-
-QCollection::Item QGListIterator::operator-=( uint jumps )
-{
- while ( curNode && jumps-- )
- curNode = curNode->prev;
- return curNode ? curNode->getData() : 0;
-}
diff --git a/qtools/qglist.h b/qtools/qglist.h
deleted file mode 100644
index f400b64..0000000
--- a/qtools/qglist.h
+++ /dev/null
@@ -1,257 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QGList and QGListIterator classes
-**
-** Created : 920624
-**
-** 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 QGLIST_H
-#define QGLIST_H
-
-#ifndef QT_H
-#include "qcollection.h"
-#endif // QT_H
-
-
-/*****************************************************************************
- QLNode class (internal doubly linked list node)
- *****************************************************************************/
-
-class Q_EXPORT QLNode
-{
-friend class QGList;
-friend class QGListIterator;
-public:
- QCollection::Item getData() { return data; }
-private:
- QCollection::Item data;
- QLNode *prev;
- QLNode *next;
- QLNode( QCollection::Item d ) { data = d; }
-};
-
-
-/*****************************************************************************
- QGList class
- *****************************************************************************/
-
-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
-
-#ifndef QT_NO_DATASTREAM
- QDataStream &read( QDataStream & ); // read list from stream
- QDataStream &write( QDataStream & ) const; // write list to stream
-#endif
-protected:
- QGList(); // create empty list
- QGList( const QGList & ); // make copy of other list
- virtual ~QGList();
-
- QGList &operator=( const QGList & ); // assign from other list
- bool operator==( const QGList& ) const;
-
- void inSort( QCollection::Item ); // add item sorted in list
- void append( QCollection::Item ); // add item at end of list
- bool insertAt( uint index, QCollection::Item ); // add item at i'th position
- void relinkNode( QLNode * ); // relink as first item
- bool removeNode( QLNode * ); // remove node
- bool remove( QCollection::Item = 0 ); // remove item (0=current)
- bool removeRef( QCollection::Item = 0 ); // remove item (0=current)
- bool removeFirst(); // remove first item
- bool removeLast(); // remove last item
- bool removeAt( uint index ); // remove item at i'th position
- QCollection::Item takeNode( QLNode * ); // take out node
- QCollection::Item take(); // take out current item
- QCollection::Item takeAt( uint index ); // take out item at i'th pos
- QCollection::Item takeFirst(); // take out first item
- QCollection::Item takeLast(); // take out last item
-
- void sort(); // sort all items;
- void clear(); // remove all items
-
- int findRef( QCollection::Item, bool = TRUE ); // find exact item in list
- int find( QCollection::Item, bool = TRUE ); // find equal item in list
-
- uint containsRef( QCollection::Item ) const; // get number of exact matches
- uint contains( QCollection::Item ) const; // get number of equal matches
-
- QCollection::Item at( uint index ); // access item at i'th pos
- int at() const; // get current index
- QLNode *currentNode() const; // get current node
-
- QCollection::Item get() const; // get current item
-
- QCollection::Item cfirst() const; // get ptr to first list item
- QCollection::Item clast() const; // get ptr to last list item
- QCollection::Item first(); // set first item in list curr
- QCollection::Item last(); // set last item in list curr
- 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
- virtual QDataStream &read( QDataStream &, QCollection::Item & );
- virtual QDataStream &write( QDataStream &, QCollection::Item ) const;
-#endif
-private:
- void prepend( QCollection::Item ); // add item at start of list
-
- void heapSortPushDown( QCollection::Item* heap, int first, int last );
-
- QLNode *firstNode; // first node
- QLNode *lastNode; // last node
- QLNode *curNode; // current node
- int curIndex; // current index
- uint numNodes; // number of nodes
- QGList *iterators; // list of iterators
-
- QLNode *locate( uint ); // get node at i'th pos
- QLNode *unlink(); // unlink node
-};
-
-
-inline uint QGList::count() const
-{
- return numNodes;
-}
-
-inline bool QGList::removeFirst()
-{
- first();
- return remove();
-}
-
-inline bool QGList::removeLast()
-{
- last();
- return remove();
-}
-
-inline int QGList::at() const
-{
- return curIndex;
-}
-
-inline QCollection::Item QGList::at( uint index )
-{
- QLNode *n = locate( index );
- return n ? n->data : 0;
-}
-
-inline QLNode *QGList::currentNode() const
-{
- return curNode;
-}
-
-inline QCollection::Item QGList::get() const
-{
- return curNode ? curNode->data : 0;
-}
-
-inline QCollection::Item QGList::cfirst() const
-{
- return firstNode ? firstNode->data : 0;
-}
-
-inline QCollection::Item QGList::clast() const
-{
- return lastNode ? lastNode->data : 0;
-}
-
-
-/*****************************************************************************
- QGList stream functions
- *****************************************************************************/
-
-#ifndef QT_NO_DATASTREAM
-Q_EXPORT QDataStream &operator>>( QDataStream &, QGList & );
-Q_EXPORT QDataStream &operator<<( QDataStream &, const QGList & );
-#endif
-
-/*****************************************************************************
- QGListIterator class
- *****************************************************************************/
-
-class Q_EXPORT QGListIterator // QGList iterator
-{
-friend class QGList;
-protected:
- QGListIterator( const QGList & );
- QGListIterator( const QGListIterator & );
- QGListIterator &operator=( const QGListIterator & );
- ~QGListIterator();
-
- bool atFirst() const; // test if at first item
- bool atLast() const; // test if at last item
- QCollection::Item toFirst(); // move to first item
- QCollection::Item toLast(); // move to last item
-
- QCollection::Item get() const; // get current item
- QCollection::Item operator()(); // get current and move to next
- QCollection::Item operator++(); // move to next item (prefix)
- QCollection::Item operator+=(uint); // move n positions forward
- QCollection::Item operator--(); // move to prev item (prefix)
- QCollection::Item operator-=(uint); // move n positions backward
-
-protected:
- QGList *list; // reference to list
-
-private:
- QLNode *curNode; // current node in list
-};
-
-
-inline bool QGListIterator::atFirst() const
-{
- return curNode == list->firstNode;
-}
-
-inline bool QGListIterator::atLast() const
-{
- return curNode == list->lastNode;
-}
-
-inline QCollection::Item QGListIterator::get() const
-{
- return curNode ? curNode->data : 0;
-}
-
-
-#endif // QGLIST_H
diff --git a/qtools/qglobal.cpp b/qtools/qglobal.cpp
deleted file mode 100644
index 50f5202..0000000
--- a/qtools/qglobal.cpp
+++ /dev/null
@@ -1,685 +0,0 @@
-/****************************************************************************
-**
-**
-** Global functions
-**
-** Created : 920604
-**
-** 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 "qglobal.h"
-#include "qasciidict.h"
-#include "qstring.h"
-#include <stdio.h>
-#include <stdarg.h>
-#include <stdlib.h>
-
-// NOT REVISED
-
-/*!
- \relates QApplication
- Returns the Qt version number for the library, typically "1.30"
- or "2.1.0".
-*/
-
-const char *qVersion()
-{
- return QT_VERSION_STR;
-}
-
-
-/*****************************************************************************
- System detection routines
- *****************************************************************************/
-
-static bool si_alreadyDone = FALSE;
-static int si_wordSize;
-static bool si_bigEndian;
-
-/*!
- \relates QApplication
- Obtains information about the system.
-
- The system's word size in bits (typically 32) is returned in \e *wordSize.
- The \e *bigEndian is set to TRUE if this is a big-endian machine,
- or to FALSE if this is a little-endian machine.
-
- This function calls qFatal() with a message if the computer is truly weird
- (i.e. different endianness for 16 bit and 32 bit integers).
-*/
-
-bool qSysInfo( int *wordSize, bool *bigEndian )
-{
-#if defined(CHECK_NULL)
- ASSERT( wordSize != 0 );
- ASSERT( bigEndian != 0 );
-#endif
-
- if ( si_alreadyDone ) { // run it only once
- *wordSize = si_wordSize;
- *bigEndian = si_bigEndian;
- return TRUE;
- }
- si_alreadyDone = TRUE;
-
- si_wordSize = 0;
- uint n = (uint)(~0);
- while ( n ) { // detect word size
- si_wordSize++;
- n /= 2;
- }
- *wordSize = si_wordSize;
-
- if ( *wordSize != 64 &&
- *wordSize != 32 &&
- *wordSize != 16 ) { // word size: 16, 32 or 64
-#if defined(CHECK_RANGE)
- qFatal( "qSysInfo: Unsupported system word size %d", *wordSize );
-#endif
- return FALSE;
- }
- if ( sizeof(Q_INT8) != 1 || sizeof(Q_INT16) != 2 || sizeof(Q_INT32) != 4 ||
- sizeof(float) != 4 || sizeof(double) != 8 ) {
-#if defined(CHECK_RANGE)
- qFatal( "qSysInfo: Unsupported system data type size" );
-#endif
- return FALSE;
- }
-
- bool be16, be32; // determine byte ordering
- short ns = 0x1234;
- int nl = 0x12345678;
-
- unsigned char *p = (unsigned char *)(&ns); // 16-bit integer
- be16 = *p == 0x12;
-
- p = (unsigned char *)(&nl); // 32-bit integer
- if ( p[0] == 0x12 && p[1] == 0x34 && p[2] == 0x56 && p[3] == 0x78 )
- be32 = TRUE;
- else
- if ( p[0] == 0x78 && p[1] == 0x56 && p[2] == 0x34 && p[3] == 0x12 )
- be32 = FALSE;
- else
- be32 = !be16;
-
- if ( be16 != be32 ) { // strange machine!
-#if defined(CHECK_RANGE)
- qFatal( "qSysInfo: Inconsistent system byte order" );
-#endif
- return FALSE;
- }
-
- *bigEndian = si_bigEndian = be32;
- return TRUE;
-}
-
-
-/*****************************************************************************
- Debug output routines
- *****************************************************************************/
-
-/*!
- \fn void qDebug( const char *msg, ... )
-
- \relates QApplication
- Prints a debug message, or calls the message handler (if it has been
- installed).
-
- This function takes a format string and a list of arguments, similar to
- the C printf() function.
-
- Example:
- \code
- qDebug( "my window handle = %x", myWidget->id() );
- \endcode
-
- Under X11, the text is printed to stderr. Under Windows, the text is
- sent to the debugger.
-
- \warning The internal buffer is limited to 8196 bytes (including the
- 0-terminator).
-
- \sa qWarning(), qFatal(), qInstallMsgHandler(),
- \link debug.html Debugging\endlink
-*/
-
-/*!
- \fn void qWarning( const char *msg, ... )
-
- \relates QApplication
- Prints a warning message, or calls the message handler (if it has been
- installed).
-
- This function takes a format string and a list of arguments, similar to
- the C printf() function.
-
- Example:
- \code
- void f( int c )
- {
- if ( c > 200 )
- qWarning( "f: bad argument, c == %d", c );
- }
- \endcode
-
- Under X11, the text is printed to stderr. Under Windows, the text is
- sent to the debugger.
-
- \warning The internal buffer is limited to 8196 bytes (including the
- 0-terminator).
-
- \sa qDebug(), qFatal(), qInstallMsgHandler(),
- \link debug.html Debugging\endlink
-*/
-
-/*!
- \fn void qFatal( const char *msg, ... )
-
- \relates QApplication
- Prints a fatal error message and exits, or calls the message handler (if it
- has been installed).
-
- This function takes a format string and a list of arguments, similar to
- the C printf() function.
-
- Example:
- \code
- int divide( int a, int b )
- {
- if ( b == 0 ) // program error
- qFatal( "divide: cannot divide by zero" );
- return a/b;
- }
- \endcode
-
- Under X11, the text is printed to stderr. Under Windows, the text is
- sent to the debugger.
-
- \warning The internal buffer is limited to 8196 bytes (including the
- 0-terminator).
-
- \sa qDebug(), qWarning(), qInstallMsgHandler(),
- \link debug.html Debugging\endlink
-*/
-
-
-static msg_handler handler = 0; // pointer to debug handler
-
-
-#ifdef _OS_MAC_
-
-static FILE * mac_debug=0;
-
-void qDebug( const char *msg, ... )
-{
- mac_debug=fopen( "debug.txt", "a+" );
- if(mac_debug) {
- char buf[8196];
- va_list ap;
- va_start( ap, msg ); // use variable arg list
- if ( handler ) {
- vsprintf( buf, msg, ap );
- va_end( ap );
- (*handler)( QtDebugMsg, buf );
- } else {
- vfprintf( mac_debug, msg, ap );
- va_end( ap );
- fprintf( mac_debug, "\n" ); // add newline
- fflush( mac_debug );
- }
- fclose(mac_debug);
- } else {
- exit(0);
- }
-}
-
-// copied... this looks really bad.
-void debug( const char *msg, ... )
-{
- mac_debug=fopen( "debug.txt", "a+" );
- if(mac_debug) {
- char buf[8196];
- va_list ap;
- va_start( ap, msg ); // use variable arg list
- if ( handler ) {
- vsprintf( buf, msg, ap );
- va_end( ap );
- (*handler)( QtDebugMsg, buf );
- } else {
- vfprintf( mac_debug, msg, ap );
- va_end( ap );
- fprintf( mac_debug, "\n" ); // add newline
- fflush( mac_debug );
- }
- fclose(mac_debug);
- }
-}
-
-void qWarning( const char *msg, ... )
-{
- mac_debug=fopen( "debug.txt", "a+" );
- if(mac_debug) {
- char buf[8196];
- va_list ap;
- va_start( ap, msg ); // use variable arg list
- if ( handler ) {
- vsprintf( buf, msg, ap );
- va_end( ap );
- (*handler)( QtDebugMsg, buf );
- } else {
- vfprintf( mac_debug, msg, ap );
- va_end( ap );
- fprintf( mac_debug, "\n" ); // add newline
- fflush( mac_debug );
- }
- fclose(mac_debug);
- }
-}
-
-// copied... this looks really bad.
-void warning( const char *msg, ... )
-{
- mac_debug=fopen( "debug.txt", "a+" );
- if(mac_debug) {
- char buf[8196];
- va_list ap;
- va_start( ap, msg ); // use variable arg list
- if ( handler ) {
- vsprintf( buf, msg, ap );
- va_end( ap );
- (*handler)( QtDebugMsg, buf );
- } else {
- vfprintf( mac_debug, msg, ap );
- va_end( ap );
- fprintf( mac_debug, "\n" ); // add newline
- fflush( mac_debug );
- }
- fclose(mac_debug);
- }
-}
-
-void qFatal( const char *msg, ... )
-{
- mac_debug=fopen( "debug.txt", "a+");
- if(mac_debug) {
- char buf[8196];
- va_list ap;
- va_start( ap, msg ); // use variable arg list
- if ( handler ) {
- vsprintf( buf, msg, ap );
- va_end( ap );
- (*handler)( QtDebugMsg, buf );
- } else {
- vfprintf( mac_debug, msg, ap );
- va_end( ap );
- fprintf( mac_debug, "\n" ); // add newline
- fflush( mac_debug );
- }
- fclose(mac_debug);
- }
- exit(0);
-}
-
-// copied... this looks really bad.
-void fatal( const char *msg, ... )
-{
- mac_debug=fopen( "debug.txt", "a+" );
- if(mac_debug) {
- char buf[8196];
- va_list ap;
- va_start( ap, msg ); // use variable arg list
- if ( handler ) {
- vsprintf( buf, msg, ap );
- va_end( ap );
- (*handler)( QtDebugMsg, buf );
- } else {
- vfprintf( mac_debug, msg, ap );
- va_end( ap );
- fprintf( mac_debug, "\n" ); // add newline
- fflush( mac_debug );
- }
- fclose(mac_debug);
- }
- exit(0);
-}
-
-#else
-
-void qDebug( const char *msg, ... )
-{
- char buf[8196];
- va_list ap;
- va_start( ap, msg ); // use variable arg list
- if ( handler ) {
- vsprintf( buf, msg, ap ); // ### vsnprintf would be great here
- va_end( ap );
- (*handler)( QtDebugMsg, buf );
- } else {
- vfprintf( stderr, msg, ap );
- va_end( ap );
- fprintf( stderr, "\n" ); // add newline
- }
-}
-
-// copied... this looks really bad.
-void debug( const char *msg, ... )
-{
- char buf[8196];
- va_list ap;
- va_start( ap, msg ); // use variable arg list
- if ( handler ) {
- vsprintf( buf, msg, ap );
- va_end( ap );
- (*handler)( QtDebugMsg, buf );
- } else {
- vfprintf( stderr, msg, ap );
- va_end( ap );
- fprintf( stderr, "\n" ); // add newline
- }
-}
-
-void qWarning( const char *msg, ... )
-{
- char buf[8196];
- va_list ap;
- va_start( ap, msg ); // use variable arg list
- if ( handler ) {
- vsprintf( buf, msg, ap );
- va_end( ap );
- (*handler)( QtWarningMsg, buf );
- } else {
- vfprintf( stderr, msg, ap );
- va_end( ap );
- fprintf( stderr, "\n" ); // add newline
- }
-}
-
-
-// again, copied
-void warning( const char *msg, ... )
-{
- char buf[8196];
- va_list ap;
- va_start( ap, msg ); // use variable arg list
- if ( handler ) {
- vsprintf( buf, msg, ap );
- va_end( ap );
- (*handler)( QtWarningMsg, buf );
- } else {
- vfprintf( stderr, msg, ap );
- va_end( ap );
- fprintf( stderr, "\n" ); // add newline
- }
-}
-
-void qFatal( const char *msg, ... )
-{
- char buf[8196];
- va_list ap;
- va_start( ap, msg ); // use variable arg list
- if ( handler ) {
- vsprintf( buf, msg, ap );
- va_end( ap );
- (*handler)( QtFatalMsg, buf );
- } else {
- vfprintf( stderr, msg, ap );
- va_end( ap );
- fprintf( stderr, "\n" ); // add newline
-#if defined(_OS_UNIX_) && defined(DEBUG)
- abort(); // trap; generates core dump
-#else
- exit( 1 ); // goodbye cruel world
-#endif
- }
-}
-
-// yet again, copied
-void fatal( const char *msg, ... )
-{
- char buf[8196];
- va_list ap;
- va_start( ap, msg ); // use variable arg list
- if ( handler ) {
- vsprintf( buf, msg, ap );
- va_end( ap );
- (*handler)( QtFatalMsg, buf );
- } else {
- vfprintf( stderr, msg, ap );
- va_end( ap );
- fprintf( stderr, "\n" ); // add newline
-#if defined(_OS_UNIX_) && defined(DEBUG)
- abort(); // trap; generates core dump
-#else
- exit( 1 ); // goodbye cruel world
-#endif
- }
-}
-
-#endif
-
-
-/*!
- \fn void ASSERT( bool test )
- \relates QApplication
- Prints a warning message containing the source code file name and line number
- if \e test is FALSE.
-
- This is really a macro defined in qglobal.h.
-
- ASSERT is useful for testing required conditions in your program.
-
- Example:
- \code
- //
- // File: div.cpp
- //
-
- #include <qglobal.h>
-
- int divide( int a, int b )
- {
- ASSERT( b != 0 ); // this is line 9
- return a/b;
- }
- \endcode
-
- If \c b is zero, the ASSERT statement will output the following message
- using the qWarning() function:
- \code
- ASSERT: "b == 0" in div.cpp (9)
- \endcode
-
- \sa qWarning(), \link debug.html Debugging\endlink
-*/
-
-
-/*!
- \fn void CHECK_PTR( void *p )
- \relates QApplication
- If \e p is null, a fatal messages says that the program ran out of memory
- and exits. If \e p is not null, nothing happens.
-
- This is really a macro defined in qglobal.h.
-
- Example:
- \code
- int *a;
- CHECK_PTR( a = new int[80] ); // never do this!
- // do this instead:
- a = new int[80];
- CHECK_PTR( a ); // this is fine
- \endcode
-
- \sa qFatal(), \link debug.html Debugging\endlink
-*/
-
-
-//
-// The CHECK_PTR macro calls this function to check if an allocation went ok.
-//
-
-bool qt_check_pointer( bool c, const char *n, int l )
-{
- if ( c )
- qFatal( "In file %s, line %d: Out of memory", n, l );
- return TRUE;
-}
-
-
-static bool firstObsoleteWarning(const char *obj, const char *oldfunc )
-{
- static QAsciiDict<int> *obsoleteDict = 0;
- if ( !obsoleteDict ) { // first time func is called
- obsoleteDict = new QAsciiDict<int>;
-#if defined(DEBUG)
- qDebug(
- "You are using obsolete functions in the Qt library. Call the function\n"
- "qSuppressObsoleteWarnings() to suppress obsolete warnings.\n"
- );
-#endif
- }
- QCString s( obj );
- s += "::";
- s += oldfunc;
- if ( obsoleteDict->find(s.data()) == 0 ) {
- obsoleteDict->insert( s.data(), (int*)1 ); // anything different from 0
- return TRUE;
- }
- return FALSE;
-}
-
-static bool suppressObsolete = FALSE;
-
-void qSuppressObsoleteWarnings( bool suppress )
-{
- suppressObsolete = suppress;
-}
-
-void qObsolete( const char *obj, const char *oldfunc, const char *newfunc )
-{
- if ( suppressObsolete )
- return;
- if ( !firstObsoleteWarning(obj, oldfunc) )
- return;
- if ( obj )
- qDebug( "%s::%s: This function is obsolete, use %s instead.",
- obj, oldfunc, newfunc );
- else
- qDebug( "%s: This function is obsolete, use %s instead.",
- oldfunc, newfunc );
-}
-
-void qObsolete( const char *obj, const char *oldfunc )
-{
- if ( suppressObsolete )
- return;
- if ( !firstObsoleteWarning(obj, oldfunc) )
- return;
- if ( obj )
- qDebug( "%s::%s: This function is obsolete.", obj, oldfunc );
- else
- qDebug( "%s: This function is obsolete.", oldfunc );
-}
-
-void qObsolete( const char *message )
-{
- if ( suppressObsolete )
- return;
- if ( !firstObsoleteWarning( "Qt", message) )
- return;
- qDebug( "%s", message );
-}
-
-
-/*!
- \relates QApplication
- Installs a Qt message handler. Returns a pointer to the message handler
- previously defined.
-
- The message handler is a function that prints out debug messages,
- warnings and fatal error messages. The Qt library (debug version)
- contains hundreds of warning messages that are printed when internal
- errors (usually invalid function arguments) occur. If you implement
- your own message handler, you get total control of these messages.
-
- The default message handler prints the message to the standard output
- under X11 or to the debugger under Windows. If it is a fatal message,
- the application aborts immediately.
-
- Only one message handler can be defined, since this is usually done on
- an application-wide basis to control debug output.
-
- To restore the message handler, call \c qInstallMsgHandler(0).
-
- Example:
- \code
- #include <qapplication.h>
- #include <stdio.h>
- #include <stdlib.h>
-
- void myMessageOutput( QtMsgType type, const char *msg )
- {
- switch ( type ) {
- case QtDebugMsg:
- fprintf( stderr, "Debug: %s\n", msg );
- break;
- case QtWarningMsg:
- fprintf( stderr, "Warning: %s\n", msg );
- break;
- case QtFatalMsg:
- fprintf( stderr, "Fatal: %s\n", msg );
- abort(); // dump core on purpose
- }
- }
-
- int main( int argc, char **argv )
- {
- qInstallMsgHandler( myMessageOutput );
- QApplication a( argc, argv );
- ...
- return a.exec();
- }
- \endcode
-
- \sa qDebug(), qWarning(), qFatal(), \link debug.html Debugging\endlink
-*/
-
-msg_handler qInstallMsgHandler( msg_handler h )
-{
- msg_handler old = handler;
- handler = h;
- return old;
-}
-
-
-#ifdef _WS_WIN_
-bool qt_winunicode=FALSE;
-#endif
diff --git a/qtools/qglobal.h b/qtools/qglobal.h
deleted file mode 100644
index 7dca39b..0000000
--- a/qtools/qglobal.h
+++ /dev/null
@@ -1,601 +0,0 @@
-/****************************************************************************
-**
-**
-** Global type declarations and definitions
-**
-** Created : 920529
-**
-** 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 QGLOBAL_H
-#define QGLOBAL_H
-
-
-#define QT_VERSION 223
-#define QT_VERSION_STR "2.2.3"
-
-
-//
-// The operating system, must be one of: (_OS_x_)
-//
-// MAC - Macintosh
-// MSDOS - MS-DOS and Windows
-// OS2 - OS/2
-// OS2EMX - XFree86 on OS/2 (not PM)
-// WIN32 - Win32 (Windows 95/98 and Windows NT)
-// SUN - SunOS
-// SOLARIS - Sun Solaris
-// HPUX - HP-UX
-// ULTRIX - DEC Ultrix
-// LINUX - Linux
-// FREEBSD - FreeBSD
-// NETBSD - NetBSD
-// OPENBSD - OpenBSD
-// IRIX - SGI Irix
-// OSF - OSF Unix
-// BSDI - BSDI Unix
-// SCO - SCO of some sort
-// AIX - AIX Unix
-// UNIXWARE - SCO UnixWare
-// GNU - GNU Hurd
-// DGUX - DG Unix
-// UNIX - Any UNIX bsd/sysv system
-//
-
-#if defined(macintosh)
-#define _OS_MAC_
-#elif defined(MSDOS) || defined(_MSDOS) || defined(__MSDOS__)
-#define _OS_MSDOS_
-#elif defined(OS2) || defined(_OS2) || defined(__OS2__)
-#if defined(__EMX__)
-#define _OS_OS2EMX_
-#else
-#define _OS_OS2_
-#endif
-#elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__)
-#define _OS_WIN32_
-#elif defined(__MWERKS__) && defined(__INTEL__)
-#define _OS_WIN32_
-#elif defined(sun) || defined(__sun) || defined(__sun__)
-#if defined(__SVR4)
-#define _OS_SOLARIS_
-#else
-#define _OS_SUN_
-#endif
-#elif defined(hpux) || defined(__hpux) || defined(__hpux__)
-#define _OS_HPUX_
-#elif defined(ultrix) || defined(__ultrix) || defined(__ultrix__)
-#define _OS_ULTRIX_
-#elif defined(reliantunix)
-#define _OS_RELIANTUNIX_
-#elif defined(linux) || defined(__linux) || defined(__linux__) || defined(__GNU__) || defined(__GLIBC__)
-#define _OS_LINUX_
-#elif defined(__FreeBSD__)
-#define _OS_FREEBSD_
-#elif defined(__NetBSD__)
-#define _OS_NETBSD_
-#elif defined(__OpenBSD__)
-#define _OS_OPENBSD_
-#elif defined(sgi) || defined(__sgi)
-#define _OS_IRIX_
-#elif defined(__osf__)
-#define _OS_OSF_
-#elif defined(bsdi) || defined(__bsdi__)
-#define _OS_BSDI_
-#elif defined(_AIX)
-#define _OS_AIX_
-#elif defined(__Lynx__)
-#define _OS_LYNXOS_
-#elif defined(_UNIXWARE)
-#define _OS_UNIXWARE_
-#elif defined(DGUX)
-#define _OS_DGUX_
-#elif defined(__QNX__)
-#define _OS_QNX_
-#elif defined(_SCO_DS) || defined(M_UNIX) || defined(M_XENIX)
-#define _OS_SCO_
-#elif defined(sco) || defined(_UNIXWARE7)
-#define _OS_UNIXWARE7_
-#elif !defined(_SCO_DS) && defined(__USLC__) && defined(__SCO_VERSION__)
-#define _OS_UNIXWARE7_
-#elif defined(__CYGWIN__)
-#define _OS_CYGWIN_
-#elif defined(__BEOS__)
-#define _OS_BEOS_
-#elif defined(__MINT__)
-#define _OS_MINT_
-#else
-#error "Qt has not been ported to this OS - talk to qt-bugs@trolltech.com"
-#endif
-
-#if defined(_OS_MAC_) || defined(_OS_MSDOS_) || defined(_OS_OS2_) || defined(_OS_WIN32_)
-#undef _OS_UNIX_
-#elif !defined(_OS_UNIX_)
-#define _OS_UNIX_
-// QT_CLEAN_NAMESPACE is not defined by default; it would break too
-// much code.
-#if !defined(QT_CLEAN_NAMESPACE) && !defined(UNIX)
-// ### remove 3.0
-#define UNIX
-#endif
-#endif
-
-
-//
-// The compiler, must be one of: (_CC_x_)
-//
-// SYM - Symantec C++ for both PC and Macintosh
-// MPW - MPW C++
-// MWERKS - Metrowerks CodeWarrior
-// MSVC - Microsoft Visual C/C++
-// BOR - Borland/Turbo C++
-// WAT - Watcom C++
-// GNU - GNU C++
-// COMEAU - Comeau C++
-// EDG - Edison Design Group C++
-// OC - CenterLine C++
-// SUN - Sun C++
-// DEC - DEC C++
-// HP - HPUX C++
-// USLC - SCO UnixWare7 C++
-// CDS - Reliant C++
-// KAI - KAI C++
-//
-
-
-// Should be sorted most-authorative to least-authorative
-
-#if defined(__SC__)
-#define _CC_SYM_
-#elif defined( __KCC )
-#define _CC_KAI_
-#define _CC_EDG_
-#define Q_HAS_BOOL_TYPE
-#elif defined(applec)
-#define _CC_MPW_
-#elif defined(__MWERKS__)
-#define _CC_MWERKS_
-#define Q_HAS_BOOL_TYPE
-#elif defined(_MSC_VER)
-#define _CC_MSVC_
-#elif defined(__BORLANDC__) || defined(__TURBOC__)
-#define _CC_BOR_
-#elif defined(__WATCOMC__)
-#define _CC_WAT_
-#define Q_HAS_BOOL_TYPE
-#elif defined(__GNUC__)
-#define _CC_GNU_
-#if __GNUC__ == 2 && __GNUC_MINOR__ <= 7
-#define Q_FULL_TEMPLATE_INSTANTIATION
-#define Q_TEMPLATE_NEEDS_CLASS_DECLARATION
-#define Q_TEMPLATE_NEEDS_EXPLICIT_CONVERSION
-#define Q_SPURIOUS_NON_VOID_WARNING
-#endif
-#if __GNUC__ == 2 && __GNUC_MINOR__ >= 95
-#define Q_DELETING_VOID_UNDEFINED
-#endif
-#if (defined(__arm__) || defined(__ARMEL__)) && !defined(QT_MOC_CPP)
-#define Q_PACKED __attribute__ ((packed))
-#endif
-#elif defined(__xlC__)
-#define _CC_XLC_
-#define Q_FULL_TEMPLATE_INSTANTIATION
-#if __xlC__ >= 0x400
-#define Q_HAS_BOOL_TYPE
-#endif
-#if __xlC__ <= 0x0306
-#define Q_TEMPLATE_NEEDS_EXPLICIT_CONVERSION
-#endif
-#elif defined(como40)
-#define _CC_EDG_
-#define _CC_COMEAU_
-#define Q_HAS_BOOL_TYPE
-#define Q_C_CALLBACKS
-#elif defined(__USLC__)
-#define _CC_USLC_
-#ifdef __EDG__ // UnixWare7
-#define Q_HAS_BOOL_TYPE
-#endif
-#elif defined(__DECCXX)
-#define _CC_DEC_
-#if __DECCXX_VER >= 60060005
-#define Q_HAS_BOOL_TYPE
-#endif
-#elif defined(__EDG) || defined(__EDG__)
-// one observed on SGI DCC, the other documented
-#define _CC_EDG_
-#elif defined(OBJECTCENTER) || defined(CENTERLINE_CLPP)
-#define _CC_OC_
-#if defined(_BOOL)
-#define Q_HAS_BOOL_TYPE
-#endif
-#elif defined(__SUNPRO_CC)
-#define _CC_SUN_
-#if __SUNPRO_CC >= 0x500
-#define Q_HAS_BOOL_TYPE
-#define Q_C_CALLBACKS
-#endif
-#elif defined(__CDS__)
-#define _CC_CDS_
-#define Q_HAS_BOOL_TYPE
-#elif defined(_OS_HPUX_)
-// this test is from aCC online help
-#if defined(__HP_aCC) || __cplusplus >= 199707L
-// this is the aCC
-#define _CC_HP_ACC_
-#define Q_HAS_BOOL_TYPE
-#else
-// this is the CC
-#define _CC_HP_
-#define Q_FULL_TEMPLATE_INSTANTIATION
-#define Q_TEMPLATE_NEEDS_EXPLICIT_CONVERSION
-#endif // __HP_aCC
-#else
-#error "Qt has not been tested with this compiler - talk to qt-bugs@trolltech.com"
-#endif
-
-#ifndef Q_PACKED
-#define Q_PACKED
-#endif
-
-// Window system setting
-
-#if defined(_OS_MAC_)
-#define _WS_MAC_
-#elif defined(_OS_MSDOS_)
-#define _WS_WIN16_
-#error "Qt requires Win32 and does not work with Windows 3.x"
-#elif defined(_WIN32_X11_)
-#define _WS_X11_
-#elif defined(_OS_WIN32_)
-#define _WS_WIN32_
-#elif defined(_OS_OS2_)
-#error "Qt does not work with OS/2 Presentation Manager or Workplace Shell"
-#elif defined(_OS_UNIX_)
-#ifdef QWS
-#define _WS_QWS_
-#else
-#define _WS_X11_
-#endif
-#endif
-
-#if defined(_WS_WIN16_) || defined(_WS_WIN32_)
-#define _WS_WIN_
-#endif
-
-
-//
-// Some classes do not permit copies to be made of an object.
-// These classes contains a private copy constructor and operator=
-// to disable copying (the compiler gives an error message).
-// Undefine Q_DISABLE_COPY to turn off this checking.
-//
-
-#define Q_DISABLE_COPY
-
-
-//
-// Useful type definitions for Qt
-//
-
-#if defined(bool)
-#define Q_HAS_BOOL_TYPE
-#elif __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 6)
-#define Q_HAS_BOOL_TYPE
-#elif _MSC_VER >= 1100 || __BORLANDC__ >= 0x500
-#define Q_HAS_BOOL_TYPE
-#elif defined(sgi) && defined(_BOOL)
-#define Q_HAS_BOOL_TYPE
-#endif
-
-#if (QT_VERSION >= 300)
-#error "Use an enum for bool"
-#endif
-
-#if !defined(Q_HAS_BOOL_TYPE)
-#if defined(_CC_MSVC_)
-#define _CC_BOOL_DEF_
-#define bool int
-#else
-typedef int bool;
-#endif
-#endif
-
-typedef unsigned char uchar;
-typedef unsigned short ushort;
-typedef unsigned uint;
-typedef unsigned long ulong;
-typedef char *pchar;
-typedef uchar *puchar;
-typedef const char *pcchar;
-
-
-//
-// Constant bool values
-//
-
-#ifndef TRUE
-const bool FALSE = 0;
-const bool TRUE = !0;
-#endif
-
-
-#if defined(_CC_MSVC_)
-// Workaround for static const members.
-#define QT_STATIC_CONST static
-#define QT_STATIC_CONST_IMPL
-#else
-#define QT_STATIC_CONST static const
-#define QT_STATIC_CONST_IMPL const
-#endif
-
-
-
-//
-// Utility macros and inline functions
-//
-
-#define QMAX(a,b) ((a) > (b) ? (a) : (b))
-#define QMIN(a,b) ((a) < (b) ? (a) : (b))
-#define QABS(a) ((a) >= 0 ? (a) : -(a))
-
-inline int qRound( double d )
-{
- return d > 0.0 ? int(d+0.5) : int(d-0.5);
-}
-
-
-//
-// Size-dependent types (architechture-dependent byte order)
-//
-
-// QT_CLEAN_NAMESPACE is not defined by default; it would break too
-// much code.
-#if !defined(QT_CLEAN_NAMESPACE)
-typedef signed char INT8; // 8 bit signed
-typedef unsigned char UINT8; // 8 bit unsigned
-typedef short INT16; // 16 bit signed
-typedef unsigned short UINT16; // 16 bit unsigned
-typedef int INT32; // 32 bit signed
-typedef unsigned int UINT32; // 32 bit unsigned
-#endif
-
-typedef signed char Q_INT8; // 8 bit signed
-typedef unsigned char Q_UINT8; // 8 bit unsigned
-typedef short Q_INT16; // 16 bit signed
-typedef unsigned short Q_UINT16; // 16 bit unsigned
-typedef int Q_INT32; // 32 bit signed
-typedef unsigned int Q_UINT32; // 32 bit unsigned
-typedef long Q_INT64; // up to 64 bit signed
-typedef unsigned long Q_UINT64; // up to 64 bit unsigned
-
-//
-// Data stream functions is provided by many classes (defined in qdatastream.h)
-//
-
-class QDataStream;
-
-
-
-#ifdef _WS_WIN_
-extern bool qt_winunicode;
-#endif
-
-#ifndef QT_H
-#include <qfeatures.h>
-#endif // QT_H
-
-//
-// Create Qt DLL if QT_DLL is defined (Windows only)
-//
-
-#if defined(_OS_WIN32_)
-#if defined(QT_NODLL)
-#undef QT_MAKEDLL
-#undef QT_DLL
-#endif
-#ifdef QT_DLL
-#if defined(QT_MAKEDLL) /* create a Qt DLL library */
-#undef QT_DLL
-#define Q_EXPORT __declspec(dllexport)
-#define Q_TEMPLATEDLL
-#undef Q_DISABLE_COPY /* avoid unresolved externals */
-#endif
-#endif
-#if defined(QT_DLL) /* use a Qt DLL library */
-#define Q_EXPORT __declspec(dllimport)
-#define Q_TEMPLATEDLL
-#undef Q_DISABLE_COPY /* avoid unresolved externals */
-#endif
-#else // ! _OS_WIN32_
-#undef QT_MAKEDLL /* ignore these for other platforms */
-#undef QT_DLL
-#endif
-
-#ifndef Q_EXPORT
-#define Q_EXPORT
-#endif
-
-//
-// System information
-//
-
-Q_EXPORT const char *qVersion();
-Q_EXPORT bool qSysInfo( int *wordSize, bool *bigEndian );
-
-
-//
-// Debugging and error handling
-//
-
-#if !defined(NO_CHECK)
-#define CHECK_STATE // check state of objects etc.
-#define CHECK_RANGE // check range of indexes etc.
-#define CHECK_NULL // check null pointers
-#define CHECK_MATH // check math functions
-#endif
-
-#if !defined(NO_DEBUG) && !defined(DEBUG)
-#define DEBUG // display debug messages
-#endif
-
-//
-// Avoid some particularly useless warnings from some stupid compilers.
-// To get ALL C++ compiler warnings, define CC_WARNINGS or comment out
-// the line "#define Q_NO_WARNINGS"
-//
-
-#if !defined(CC_WARNINGS)
-#define Q_NO_WARNINGS
-#endif
-#if defined(Q_NO_WARNINGS)
-#if defined(_CC_MSVC_)
-#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_)
-#pragma option -w-inl
-#pragma option -w-aus
-#pragma warn -inl
-#pragma warn -pia
-#pragma warn -ccc
-#pragma warn -rch
-#pragma warn -sig
-#elif defined(_CC_MWERKS_)
-#pragma warn_possunwant off
-#endif
-#endif // Q_NO_WARNINGS
-
-//
-// Avoid dead code
-//
-
-#if defined(_CC_EDG_) || defined(_CC_WAT_)
-#define Q_NO_DEAD_CODE
-#endif
-
-//
-// Use to avoid "unused parameter" warnings
-//
-
-#define Q_UNUSED(x) x=x;
-#define Q_CONST_UNUSED(x) (void)x;
-
-Q_EXPORT void qDebug( const char *, ... ) // print debug message
-#if defined(_CC_GNU_) && !defined(__INSURE__)
- __attribute__ ((format (printf, 1, 2)))
-#endif
-;
-
-Q_EXPORT void qWarning( const char *, ... ) // print warning message
-#if defined(_CC_GNU_) && !defined(__INSURE__)
- __attribute__ ((format (printf, 1, 2)))
-#endif
-;
-
-Q_EXPORT void qFatal( const char *, ... ) // print fatal message and exit
-#if defined(_CC_GNU_)
- __attribute__ ((format (printf, 1, 2)))
-#endif
-;
-
-
-// QT_CLEAN_NAMESPACE is not defined by default; it would break too
-// much code.
-#if !defined(QT_CLEAN_NAMESPACE)
-// in that case, also define the old ones...
-
-Q_EXPORT void debug( const char *, ... ) // print debug message
-#if defined(_CC_GNU_) && !defined(__INSURE__)
- __attribute__ ((format (printf, 1, 2)))
-#endif
-;
-
-Q_EXPORT void warning( const char *, ... ) // print warning message
-#if defined(_CC_GNU_) && !defined(__INSURE__)
- __attribute__ ((format (printf, 1, 2)))
-#endif
-;
-
-Q_EXPORT void fatal( const char *, ... ) // print fatal message and exit
-#if defined(_CC_GNU_) && !defined(__INSURE__)
- __attribute__ ((format (printf, 1, 2)))
-#endif
-;
-
-// okay, that was debug()/warning()/fatal()
-#endif
-
-#if !defined(ASSERT)
-#if defined(CHECK_STATE)
-#if defined(QT_FATAL_ASSERT)
-#define ASSERT(x) if ( !(x) )\
- qFatal("ASSERT: \"%s\" in %s (%d)",#x,__FILE__,__LINE__)
-#else
-#define ASSERT(x) if ( !(x) )\
- qWarning("ASSERT: \"%s\" in %s (%d)",#x,__FILE__,__LINE__)
-#endif
-#else
-#define ASSERT(x)
-#endif
-#endif
-
-Q_EXPORT bool qt_check_pointer( bool c, const char *, int );
-
-#if defined(CHECK_NULL)
-#define CHECK_PTR(p) (qt_check_pointer((p)==0,__FILE__,__LINE__))
-#else
-#define CHECK_PTR(p)
-#endif
-
-enum QtMsgType { QtDebugMsg, QtWarningMsg, QtFatalMsg };
-
-typedef void (*msg_handler)(QtMsgType, const char *);
-Q_EXPORT msg_handler qInstallMsgHandler( msg_handler );
-
-
-Q_EXPORT void qSuppressObsoleteWarnings( bool = TRUE );
-
-#if !defined(QT_REJECT_OBSOLETE)
-#define QT_OBSOLETE
-Q_EXPORT void qObsolete( const char *obj, const char *oldfunc,
- const char *newfunc );
-Q_EXPORT void qObsolete( const char *obj, const char *oldfunc );
-Q_EXPORT void qObsolete( const char *message );
-#endif
-
-// DvH: added to avoid warnings on recent gcc versions
-#define Q_DELETING_VOID_UNDEFINED
-
-#endif // QGLOBAL_H
diff --git a/qtools/qgvector.cpp b/qtools/qgvector.cpp
deleted file mode 100644
index 88409ce..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 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;
- register Item *start = &vec[0];
- register 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.doc b/qtools/qintdict.doc
deleted file mode 100644
index e027fb2..0000000
--- a/qtools/qintdict.doc
+++ /dev/null
@@ -1,475 +0,0 @@
-/****************************************************************************
-**
-**
-** QIntDict and QIntDictIterator 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.
-**
-**********************************************************************/
-
-
-/*****************************************************************************
- QIntDict documentation
- *****************************************************************************/
-
-/*!
- \class QIntDict qintdict.h
- \brief The QIntDict class is a template class that provides a dictionary based on \c long keys.
-
- \ingroup collection
- \ingroup tools
-
- QIntDict is implemented as a template class. Define a
- template instance QIntDict\<X\> to create a dictionary that operates on
- pointers to X, or X*.
-
- A dictionary is a collection that associates an item with a key.
- The key is used for inserting and looking up an item. QIntDict has
- \c long keys.
-
- The dictionary has very fast insertion and lookup.
-
- Example:
- \code
- #include <qintdict.h>
- #include <stdio.h>
-
- void main()
- {
- QIntDict<char> dict; // maps long ==> char*
-
- dict.insert( 33, "France" );
- dict.insert( 7, "Russia" );
- dict.insert( 49, "Norway" );
-
- printf( "%s\n", dict[49] );
- printf( "%s\n", dict[33] );
- printf( "%s\n", dict[7] );
-
- if ( !dict[39] )
- printf( "39 not defined\n" );
- }
- \endcode
-
- Program output:
- \code
- Norway
- France
- Russia
- 39 not defined
- \endcode
-
- The dictionary in our example maps \c long keys to \c char* items.
- QIntDict implements the \link operator[] [] operator\endlink to lookup
- an item.
-
- QIntDict is implemented by QGDict as a hash array with a fixed number of
- entries. Each array entry points to a singly linked list of buckets, in
- which the dictionary items are stored.
-
- When an item is inserted with a key, the key is converted (hashed) to
- an integer index into the hash array using the \c mod operation. The
- item is inserted before the first bucket in the list of buckets.
-
- Looking up an item is normally very fast. The key is again hashed to an
- array index. Then QIntDict scans the list of buckets and returns the item
- found or null if the item was not found. You cannot insert null pointers
- into a dictionary.
-
- The size of the hash array is very important. In order to get good
- performance, you should use a suitably large \link primes.html prime
- number\endlink. Suitable means equal to or larger than the maximum
- expected number of dictionary items.
-
- Items with equal keys are allowed. When inserting two items with the
- same key, only the last inserted item will be visible (last in, first out)
- until it is removed.
-
- Example:
- \code
- #include <qintdict.h>
- #include <stdio.h>
-
- void main()
- {
- QIntDict<char> dict; // maps long ==> char*
-
- dict.insert( 7, "Russia" );
- dict.insert( 7, "USSR" );
-
- printf( "%s\n", dict[7] );
- dict.remove( 7 ); // Gorbie was here
- printf( "%s\n", dict[7] );
- }
- \endcode
-
- Program output:
- \code
- USSR
- Russia
- \endcode
-
- The QIntDictIterator class can traverse the dictionary contents, but only
- in an arbitrary order. Multiple iterators may independently traverse the
- same dictionary.
-
- Calling setAutoDelete(TRUE) for a dictionary tells it to delete items
- that are removed . The default is to not delete items when they are
- removed.
-
- When inserting an item into a dictionary, only the pointer is copied, not
- the item itself. This is called a shallow copy. It is possible to make the
- dictionary copy all of the item's data (known as a deep copy) when an
- item is inserted. insert() calls the virtual function
- QCollection::newItem() for the item to be inserted.
- Inherit a dictionary and reimplement it if you want deep copies.
-
- When removing a dictionary item, the virtual function
- QCollection::deleteItem() is called. QIntDict's default implementation
- is to delete the item if auto-deletion is enabled.
-
- \sa QIntDictIterator, QDict, QAsciiDict, QPtrDict,
- \link collection.html Collection Classes\endlink
-*/
-
-
-/*!
- \fn QIntDict::QIntDict( int size )
- Constructs a dictionary using an internal hash array with the size
- \e size.
-
- Setting \e size to a suitably large \link primes.html prime number\endlink
- (equal to or greater than the expected number of entries) makes the hash
- distribution better and hence the loopup faster.
-*/
-
-/*!
- \fn QIntDict::QIntDict( const QIntDict<type> &dict )
- Constructs a copy of \e dict.
-
- Each item in \e dict are inserted into this dictionary.
- Only the pointers are copied (shallow copy).
-*/
-
-/*!
- \fn QIntDict::~QIntDict()
- Removes all items from the dictionary and destroys it.
-
- All iterators that access this dictionary will be reset.
-
- \sa setAutoDelete()
-*/
-
-/*!
- \fn QIntDict<type> &QIntDict::operator=(const QIntDict<type> &dict)
- Assigns \e dict to this dictionary and returns a reference to this
- dictionary.
-
- This dictionary is first cleared, then each item in \e dict is inserted
- into this dictionary.
- Only the pointers are copied (shallow copy), unless newItem() has been
- reimplemented.
-*/
-
-/*!
- \fn uint QIntDict::count() const
- Returns the number of items in the dictionary.
- \sa isEmpty()
-*/
-
-/*!
- \fn uint QIntDict::size() const
- Returns the size of the internal hash array (as specified in the
- constructor).
- \sa count()
-*/
-
-/*!
- \fn void QIntDict::resize( uint newsize )
- Changes the size of the hashtable the \a newsize.
- The contents of the dictionary are preserved,
- but all iterators on the dictionary become invalid.
-*/
-
-/*!
- \fn bool QIntDict::isEmpty() const
- Returns TRUE if the dictionary is empty, i.e. count() == 0. Returns FALSE
- otherwise.
- \sa count()
-*/
-
-/*!
- \fn void QIntDict::insert( long key, const type *item )
- Inserts the \e key with the \e item into the dictionary.
-
- The key does not have to be a unique dictionary key. If multiple items
- are inserted with the same key, only the last item will be visible.
-
- Null items are not allowed.
-
- \sa replace()
-*/
-
-/*!
- \fn void QIntDict::replace( long key, const type *item )
- Replaces an item which has a key equal to \e key with \e item.
-
- If the item does not already exist, it will be inserted.
-
- Null items are not allowed.
-
- Equivalent to:
- \code
- QIntDict<char> dict;
- ...
- if ( dict.find(key) )
- dict.remove( key );
- dict.insert( key, item );
- \endcode
-
- If there are two or more items with equal keys, then the last inserted
- of these will be replaced.
-
- \sa insert()
-*/
-
-/*!
- \fn bool QIntDict::remove( long key )
- Removes the item associated with \e key from the dictionary.
- Returns TRUE if successful, or FALSE if the key does not exist in the
- dictionary.
-
- If there are two or more items with equal keys, then the last inserted
- of these will be removed.
-
- The removed item is deleted if \link QCollection::setAutoDelete()
- auto-deletion\endlink is enabled.
-
- All dictionary iterators that refer to the removed item will be set to
- point to the next item in the dictionary traversing order.
-
- \sa take(), clear(), setAutoDelete()
-*/
-
-/*!
- \fn type *QIntDict::take( long key )
- Takes the item associated with \e key out of the dictionary without
- deleting it (even if \link QCollection::setAutoDelete()
- auto-deletion\endlink is enabled).
-
- If there are two or more items with equal keys, then the last inserted
- of these will be taken.
-
- Returns a pointer to the item taken out, or null if the key does not
- exist in the dictionary.
-
- All dictionary iterators that refer to the taken item will be set to
- point to the next item in the dictionary traversing order.
-
- \sa remove(), clear(), setAutoDelete()
-*/
-
-/*!
- \fn void QIntDict::clear()
- Removes all items from the dictionary.
-
- The removed items are deleted if \link QCollection::setAutoDelete()
- auto-deletion\endlink is enabled.
-
- All dictionary iterators that access this dictionary will be reset.
-
- \sa remove(), take(), setAutoDelete()
-*/
-
-/*!
- \fn type *QIntDict::find( long key ) const
- Returns the item associated with \e key, or null if the key does not
- exist in the dictionary.
-
- This function uses an internal hashing algorithm to optimize lookup.
-
- If there are two or more items with equal keys, then the last inserted
- of these will be found.
-
- Equivalent to the [] operator.
-
- \sa operator[]()
-*/
-
-/*!
- \fn type *QIntDict::operator[]( long key ) const
- Returns the item associated with \e key, or null if the key does not
- exist in the dictionary.
-
- This function uses an internal hashing algorithm to optimize lookup.
-
- If there are two or more items with equal keys, then the last inserted
- of these will be found.
-
- Equivalent to the find() function.
-
- \sa find()
-*/
-
-/*!
- \fn void QIntDict::statistics() const
- Debugging-only function that prints out the dictionary distribution
- using qDebug().
-*/
-
-
-/*****************************************************************************
- QIntDictIterator documentation
- *****************************************************************************/
-
-/*!
- \class QIntDictIterator qintdict.h
- \brief The QIntDictIterator class provides an iterator for QIntDict collections.
-
- \ingroup collection
- \ingroup tools
-
- QIntDictIterator is implemented as a template class.
- Define a template instance QIntDictIterator\<X\> to create a
- dictionary iterator that operates on QIntDict\<X\> (dictionary of X*).
-
- Example:
- \code
- #include <qintdict.h>
- #include <stdio.h>
-
- void main()
- {
- QIntDict<char> dict; // maps long ==> char*
-
- dict.insert( 33, "France" );
- dict.insert( 7, "Russia" );
- dict.insert( 49, "Norway" );
-
- QIntDictIterator<char> it( dict ); // iterator for dict
-
- while ( it.current() ) {
- printf( "%d -> %s\n", it.currentKey(), it.current() );
- ++it;
- }
- }
- \endcode
-
- Program output:
- \code
- 7 -> Russia
- 49 -> Norway
- 33 -> France
- \endcode
-
- Note that the traversal order is arbitrary, you are not guaranteed the
- order above.
-
- Multiple iterators may independently traverse the same dictionary.
- A QIntDict knows about all iterators that are operating on the dictionary.
- When an item is removed from the dictionary, QIntDict update all
- iterators that are referring the removed item to point to the next item
- in the traversing order.
-
- \sa QIntDict, \link collection.html Collection Classes\endlink
-*/
-
-/*!
- \fn QIntDictIterator::QIntDictIterator( const QIntDict<type> &dict )
- Constructs an iterator for \e dict. The current iterator item is
- set to point on the first item in the \e dict.
-*/
-
-/*!
- \fn QIntDictIterator::~QIntDictIterator()
- Destroys the iterator.
-*/
-
-/*!
- \fn uint QIntDictIterator::count() const
- Returns the number of items in the dictionary this iterator operates on.
- \sa isEmpty()
-*/
-
-/*!
- \fn bool QIntDictIterator::isEmpty() const
- Returns TRUE if the dictionary is empty, i.e. count() == 0. Returns FALSE
- otherwise.
- \sa count()
-*/
-
-/*!
- \fn type *QIntDictIterator::toFirst()
- Sets the current iterator item to point to the first item in the
- dictionary and returns a pointer to the item.
- If the dictionary is empty it sets the current item to null and
- returns null.
-*/
-
-/*!
- \fn QIntDictIterator::operator type *() const
- Cast operator. Returns a pointer to the current iterator item.
- Same as current().
-*/
-
-/*!
- \fn type *QIntDictIterator::current() const
- Returns a pointer to the current iterator item.
-*/
-
-/*!
- \fn long QIntDictIterator::currentKey() const
- Returns the key for the current iterator item.
-*/
-
-/*!
- \fn type *QIntDictIterator::operator()()
- Makes the succeeding item current and returns the original current item.
-
- If the current iterator item was the last item in the dictionary or if it
- was null, null is returned.
-*/
-
-/*!
- \fn type *QIntDictIterator::operator++()
- Prefix ++ makes the succeeding item current and returns the new current
- item.
-
- If the current iterator item was the last item in the dictionary or if it
- was null, null is returned.
-*/
-
-/*!
- \fn type *QIntDictIterator::operator+=( uint jump )
- Sets the current item to the item \e jump positions after the current item,
- and returns a pointer to that item.
-
- If that item is beyond the last item or if the dictionary is empty,
- it sets the current item to null and returns null.
-*/
diff --git a/qtools/qintdict.h b/qtools/qintdict.h
deleted file mode 100644
index ddc5fdf..0000000
--- a/qtools/qintdict.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QIntDict template class
-**
-** Created : 940624
-**
-** 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 QINTDICT_H
-#define QINTDICT_H
-
-#ifndef QT_H
-#include "qgdict.h"
-#endif // QT_H
-
-
-template<class type> class Q_EXPORT QIntDict : public QGDict
-{
-public:
- QIntDict(int size=17) : QGDict(size,IntKey,0,0) {}
- QIntDict( const QIntDict<type> &d ) : QGDict(d) {}
- ~QIntDict() { clear(); }
- QIntDict<type> &operator=(const QIntDict<type> &d)
- { return (QIntDict<type>&)QGDict::operator=(d); }
- uint count() const { return QGDict::count(); }
- uint size() const { return QGDict::size(); }
- bool isEmpty() const { return QGDict::count() == 0; }
- void insert( long k, const type *d )
- { QGDict::look_int(k,(Item)d,1); }
- void replace( long k, const type *d )
- { QGDict::look_int(k,(Item)d,2); }
- bool remove( long k ) { return QGDict::remove_int(k); }
- type *take( long k ) { return (type*)QGDict::take_int(k); }
- type *find( long k ) const
- { return (type *)((QGDict*)this)->QGDict::look_int(k,0,0); }
- type *operator[]( long k ) const
- { return (type *)((QGDict*)this)->QGDict::look_int(k,0,0); }
- void clear() { QGDict::clear(); }
- void resize( uint n ) { QGDict::resize(n); }
- void statistics() const { QGDict::statistics(); }
-private:
- void deleteItem( Item d );
-};
-
-#if defined(Q_DELETING_VOID_UNDEFINED)
-template<> inline void QIntDict<void>::deleteItem( QCollection::Item )
-{
-}
-#endif
-
-template<class type> inline void QIntDict<type>::deleteItem( QCollection::Item d )
-{
- if ( del_item ) delete (type *)d;
-}
-
-template<class type> class Q_EXPORT QIntDictIterator : public QGDictIterator
-{
-public:
- QIntDictIterator(const QIntDict<type> &d) :QGDictIterator((QGDict &)d) {}
- ~QIntDictIterator() {}
- uint count() const { return dict->count(); }
- bool isEmpty() const { return dict->count() == 0; }
- type *toFirst() { return (type *)QGDictIterator::toFirst(); }
- operator type *() const { return (type *)QGDictIterator::get(); }
- type *current() const { return (type *)QGDictIterator::get(); }
- long currentKey() const { return QGDictIterator::getKeyInt(); }
- type *operator()() { return (type *)QGDictIterator::operator()(); }
- type *operator++() { return (type *)QGDictIterator::operator++(); }
- type *operator+=(uint j) { return (type *)QGDictIterator::operator+=(j);}
-};
-
-
-#endif // QINTDICT_H
diff --git a/qtools/qiodevice.cpp b/qtools/qiodevice.cpp
deleted file mode 100644
index 43b2787..0000000
--- a/qtools/qiodevice.cpp
+++ /dev/null
@@ -1,638 +0,0 @@
-/****************************************************************************
-**
-**
-** Implementation of QIODevice class
-**
-** Created : 940913
-**
-** 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 "qiodevice.h"
-
-// NOT REVISED
-/*!
- \class QIODevice qiodevice.h
-
- \brief The QIODevice class is the base class of I/O devices.
-
- \ingroup io
-
- An I/O device represents a medium that one can read bytes from
- and/or write bytes to. The QIODevice class is the abstract
- superclass of all such devices; classes like QFile, QBuffer and
- QSocket inherit QIODevice and implement virtual functions like
- write() appropriately.
-
- While applications sometimes use QIODevice directly, mostly it is
- better to go through QTextStream and QDataStream, which provide
- stream operations on any QIODevice subclass. QTextStream provides
- text-oriented stream functionality (for human-readable ASCII files,
- for example), while QDataStream deals with binary data in a totally
- platform-independent manner.
-
- The public member functions in QIODevice roughly fall into two
- groups: The action functions and the state access functions. The
- most important action functions are: <ul>
-
- <li> open() opens a device for reading and/or writing, depending on
- the argument to open().
-
- <li> close() closes the device and tidies up.
-
- <li> readBlock() reads a block of data from the device.
-
- <li> writeBlock() writes a block of data to the device.
-
- <li> readLine() reads a line (of text, usually) from the device.
-
- <li> flush() ensures that all buffered data are written to the real device.
-
- </ul>There are also some other, less used, action functions: <ul>
-
- <li> getch() reads a single character.
-
- <li> ungetch() forgets the last call to getch(), if possible.
-
- <li> putch() writes a single character.
-
- <li> size() returns the size of the device, if there is one.
-
- <li> at() returns the current read/write pointer, if there is one
- for this device, or it moves the pointer.
-
- <li> atEnd() says whether there is more to read, if that is a
- meaningful question for this device.
-
- <li> reset() moves the read/write pointer to the start of the
- device, if that is possible for this device.
-
- </ul>The state access are all "get" functions. The QIODevice subclass
- calls setState() to update the state, and simple access functions
- tell the user of the device what the device's state is. Here are
- the settings, and their associated access functions: <ul>
-
- <li> Access type. Some devices are direct access (it is possible to
- read/write anywhere) while others are sequential. QIODevice
- provides the access functions isDirectAccess(), isSequentialAccess()
- and isCombinedAccess() to tell users what a given I/O device
- supports.
-
- <li> Buffering. Some devices are accessed in raw mode while others
- are buffered. Buffering usually provides greater efficiency,
- particularly for small read/write operations. isBuffered() tells
- the user whether a given device is buffered. (This can often be set
- by the application in the call to open().)
-
- <li> Synchronicity. Synchronous devices work there and then, for
- example files. When you read from a file, the file delivers its
- data right away. Others, such as a socket connected to a HTTP
- server, may not deliver the data until seconds after you ask to read
- it. isSynchronous() and isAsynchronous() tells the user how this
- device operates.
-
- <li> CR/LF translation. For simplicity, applications often like to
- see just a single CR/LF style, and QIODevice subclasses can provide
- that. isTranslated() returns TRUE if this object translates CR/LF
- to just LF. (This can often be set by the application in the call
- to open().)
-
- <li> Accessibility. Some files cannot be written, for example.
- isReadable(), isWritable and isReadWrite() tells the application
- whether it can read from and write to a given device. (This can
- often be set by the application in the call to open().)
-
- <li> Finally, isOpen() returns TRUE if the device is open. This can
- quite obviously be set using open() :)
-
- </ul>
-
- QIODevice provides numerous pure virtual functions you need to
- implement when subclassing it. Here is a skeleton subclass with all
- the members you are certain to need, and some it's likely that you
- will need:
-
- \code
- class YourDevice : public QIODevice
- {
- public:
- YourDevice();
- ~YourDevice();
-
- bool open( int mode );
- void close();
- void flush();
-
- uint size() const;
- int at() const; // not a pure virtual function
- bool at( int ); // not a pure virtual function
- bool atEnd() const; // not a pure virtual function
-
- int readBlock( char *data, uint maxlen );
- int writeBlock( const char *data, uint len );
- int readLine( char *data, uint maxlen );
-
- int getch();
- int putch( int );
- int ungetch( int );
- };
- \endcode
-
- The three non-pure virtual functions can be ignored if your device
- is sequential (e.g. an RS-232 port).
-
- \sa QDataStream, QTextStream
-*/
-
-
-/*!
- Constructs an I/O device.
-*/
-
-QIODevice::QIODevice()
-{
- ioMode = 0; // initial mode
- ioSt = IO_Ok;
- ioIndex = 0;
-}
-
-/*!
- Destructs the I/O device.
-*/
-
-QIODevice::~QIODevice()
-{
-}
-
-
-/*!
- \fn int QIODevice::flags() const
- Returns the current I/O device flags setting.
-
- Flags consists of mode flags and state flags.
-
- \sa mode(), state()
-*/
-
-/*!
- \fn int QIODevice::mode() const
- Returns bits OR'ed together that specify the current operation mode.
-
- These are the flags that were given to the open() function.
-
- The flags are: \c IO_ReadOnly, \c IO_WriteOnly, \c IO_ReadWrite,
- \c IO_Append, \c IO_Truncate and \c IO_Translate.
-*/
-
-/*!
- \fn int QIODevice::state() const
- Returns bits OR'ed together that specify the current state.
-
- The flags are: \c IO_Open.
-
- Subclasses may define more flags.
-*/
-
-/*!
- \fn bool QIODevice::isDirectAccess() const
- Returns TRUE if the I/O device is a direct access (not sequential) device,
- otherwise FALSE.
- \sa isSequentialAccess()
-*/
-
-/*!
- \fn bool QIODevice::isSequentialAccess() const
- Returns TRUE if the I/O device is a sequential access (not direct) device,
- otherwise FALSE. Operations involving size() and at(int) are not valid
- on sequential devices.
- \sa isDirectAccess()
-*/
-
-/*!
- \fn bool QIODevice::isCombinedAccess() const
- Returns TRUE if the I/O device is a combined access (both direct and
- sequential) device, otherwise FALSE.
-
- This access method is currently not in use.
-*/
-
-/*!
- \fn bool QIODevice::isBuffered() const
- Returns TRUE if the I/O device is a buffered (not raw) device, otherwise
- FALSE.
- \sa isRaw()
-*/
-
-/*!
- \fn bool QIODevice::isRaw() const
- Returns TRUE if the I/O device is a raw (not buffered) device, otherwise
- FALSE.
- \sa isBuffered()
-*/
-
-/*!
- \fn bool QIODevice::isSynchronous() const
- Returns TRUE if the I/O device is a synchronous device, otherwise
- FALSE.
- \sa isAsynchronous()
-*/
-
-/*!
- \fn bool QIODevice::isAsynchronous() const
- Returns TRUE if the I/O device is a asynchronous device, otherwise
- FALSE.
-
- This mode is currently not in use.
-
- \sa isSynchronous()
-*/
-
-/*!
- \fn bool QIODevice::isTranslated() const
- Returns TRUE if the I/O device translates carriage-return and linefeed
- characters.
-
- A QFile is translated if it is opened with the \c IO_Translate mode
- flag.
-*/
-
-/*!
- \fn bool QIODevice::isReadable() const
- Returns TRUE if the I/O device was opened using \c IO_ReadOnly or
- \c IO_ReadWrite mode.
- \sa isWritable(), isReadWrite()
-*/
-
-/*!
- \fn bool QIODevice::isWritable() const
- Returns TRUE if the I/O device was opened using \c IO_WriteOnly or
- \c IO_ReadWrite mode.
- \sa isReadable(), isReadWrite()
-*/
-
-/*!
- \fn bool QIODevice::isReadWrite() const
- Returns TRUE if the I/O device was opened using \c IO_ReadWrite mode.
- \sa isReadable(), isWritable()
-*/
-
-/*!
- \fn bool QIODevice::isInactive() const
- Returns TRUE if the I/O device state is 0, i.e. the device is not open.
- \sa isOpen()
-*/
-
-/*!
- \fn bool QIODevice::isOpen() const
- Returns TRUE if the I/O device state has been opened, otherwise FALSE.
- \sa isInactive()
-*/
-
-
-/*!
- \fn int QIODevice::status() const
- Returns the I/O device status.
-
- The I/O device status returns an error code. If open() returns FALSE
- or readBlock() or writeBlock() return -1, this function can be called to
- get the reason why the operation did not succeed.
-
- The status codes are:
- <ul>
- <li>\c IO_Ok The operation was successful.
- <li>\c IO_ReadError Could not read from the device.
- <li>\c IO_WriteError Could not write to the device.
- <li>\c IO_FatalError A fatal unrecoverable error occurred.
- <li>\c IO_OpenError Could not open the device.
- <li>\c IO_ConnectError Could not connect to the device.
- <li>\c IO_AbortError The operation was unexpectedly aborted.
- <li>\c IO_TimeOutError The operation timed out.
- <li>\c IO_OnCloseError An unspecified error happened on close.
- </ul>
-
- \sa resetStatus()
-*/
-
-/*!
- \fn void QIODevice::resetStatus()
-
- Sets the I/O device status to \c IO_Ok.
-
- \sa status()
-*/
-
-
-/*!
- \fn void QIODevice::setFlags( int f )
- \internal
- Used by subclasses to set the device flags.
-*/
-
-/*!
- \internal
- Used by subclasses to set the device type.
-*/
-
-void QIODevice::setType( int t )
-{
-#if defined(CHECK_RANGE)
- if ( (t & IO_TypeMask) != t )
- qWarning( "QIODevice::setType: Specified type out of range" );
-#endif
- ioMode &= ~IO_TypeMask; // reset type bits
- ioMode |= t;
-}
-
-/*!
- \internal
- Used by subclasses to set the device mode.
-*/
-
-void QIODevice::setMode( int m )
-{
-#if defined(CHECK_RANGE)
- if ( (m & IO_ModeMask) != m )
- qWarning( "QIODevice::setMode: Specified mode out of range" );
-#endif
- ioMode &= ~IO_ModeMask; // reset mode bits
- ioMode |= m;
-}
-
-/*!
- \internal
- Used by subclasses to set the device state.
-*/
-
-void QIODevice::setState( int s )
-{
-#if defined(CHECK_RANGE)
- if ( ((uint)s & IO_StateMask) != (uint)s )
- qWarning( "QIODevice::setState: Specified state out of range" );
-#endif
- ioMode &= ~IO_StateMask; // reset state bits
- ioMode |= (uint)s;
-}
-
-/*!
- \internal
- Used by subclasses to set the device status (not state).
-*/
-
-void QIODevice::setStatus( int s )
-{
- ioSt = s;
-}
-
-
-/*!
- \fn bool QIODevice::open( int mode )
- Opens the I/O device using the specified \e mode.
- Returns TRUE if successful, or FALSE if the device could not be opened.
-
- The mode parameter \e m must be a combination of the following flags.
- <ul>
- <li>\c IO_Raw specified raw (unbuffered) file access.
- <li>\c IO_ReadOnly opens a file in read-only mode.
- <li>\c IO_WriteOnly opens a file in write-only mode.
- <li>\c IO_ReadWrite opens a file in read/write mode.
- <li>\c IO_Append sets the file index to the end of the file.
- <li>\c IO_Truncate truncates the file.
- <li>\c IO_Translate enables carriage returns and linefeed translation
- for text files under MS-DOS, Window, OS/2 and Macintosh. On Unix systems
- this flag has no effect. Use with caution as it will also transform every linefeed
- written to the file into a CRLF pair. This is likely to corrupt your file when
- writing binary data to it. Cannot be combined with \c IO_Raw.
- </ul>
-
- This virtual function must be reimplemented by all subclasses.
-
- \sa close()
-*/
-
-/*!
- \fn void QIODevice::close()
- Closes the I/O device.
-
- This virtual function must be reimplemented by all subclasses.
-
- \sa open()
-*/
-
-/*!
- \fn void QIODevice::flush()
-
- Flushes an open I/O device.
-
- This virtual function must be reimplemented by all subclasses.
-*/
-
-
-/*!
- \fn uint QIODevice::size() const
- Virtual function that returns the size of the I/O device.
- \sa at()
-*/
-
-/*!
- Virtual function that returns the current I/O device index.
-
- This index is the data read/write head of the I/O device.
-
- \sa size()
-*/
-
-int QIODevice::at() const
-{
- return ioIndex;
-}
-
-/*!
- Virtual function that sets the I/O device index to \e pos.
- \sa size()
-*/
-
-bool QIODevice::at( int pos )
-{
-#if defined(CHECK_RANGE)
- if ( (uint)pos > size() ) {
- qWarning( "QIODevice::at: Index %d out of range", pos );
- return FALSE;
- }
-#endif
- ioIndex = pos;
- return TRUE;
-}
-
-/*!
- Virtual function that returns TRUE if the I/O device index is at the
- end of the input.
-*/
-
-bool QIODevice::atEnd() const
-{
- if ( isSequentialAccess() || isTranslated() ) {
- QIODevice* that = (QIODevice*)this;
- int c = that->getch();
- bool result = c < 0;
- that->ungetch(c);
- return result;
- } else {
- return at() == (int)size();
- }
-}
-
-/*!
- \fn bool QIODevice::reset()
- Sets the device index to 0.
- \sa at()
-*/
-
-
-/*!
- \fn int QIODevice::readBlock( char *data, uint maxlen )
- Reads at most \e maxlen bytes from the I/O device into \e data and
- returns the number of bytes actually read.
-
- This virtual function must be reimplemented by all subclasses.
-
- \sa writeBlock()
-*/
-
-/*!
- This convenience function returns all of the remaining data in the
- device. Note that this only works for direct access devices, such
- as QFile.
-
- \sa isDirectAccess()
-*/
-QByteArray QIODevice::readAll()
-{
- int n = size()-at();
- QByteArray ba(size()-at());
- char* c = ba.data();
- while ( n ) {
- int r = readBlock( c, n );
- if ( r < 0 )
- return QByteArray();
- n -= r;
- c += r;
- }
- return ba;
-}
-
-/*!
- \fn int QIODevice::writeBlock( const char *data, uint len )
- Writes \e len bytes from \e p to the I/O device and returns the number of
- bytes actually written.
-
- This virtual function must be reimplemented by all subclasses.
-
- \sa readBlock()
-*/
-
-/*!
- This convenience function is the same as calling
- writeBlock( data.data(), data.size() ).
-*/
-int QIODevice::writeBlock( const QByteArray& data )
-{
- return writeBlock( data.data(), data.size() );
-}
-
-/*!
- Reads a line of text, up to \e maxlen bytes including a terminating
- \0. If there is a newline at the end if the line, it is not stripped.
-
- Returns the number of bytes read, or -1 in case of error.
-
- This virtual function can be reimplemented much more efficiently by
- the most subclasses.
-
- \sa readBlock(), QTextStream::readLine()
-*/
-
-int QIODevice::readLine( char *data, uint maxlen )
-{
- if ( maxlen == 0 ) // application bug?
- return 0;
- int pos = at(); // get current position
- int s = (int)size(); // size of I/O device
- char *p = data;
- if ( pos >= s )
- return 0;
- while ( pos++ < s && --maxlen ) { // read one byte at a time
- readBlock( p, 1 );
- if ( *p++ == '\n' ) // end of line
- break;
- }
- *p++ = '\0';
- return (int)((long)p - (long)data);
-}
-
-
-/*!
- \fn int QIODevice::getch()
-
- Reads a single byte/character from the I/O device.
-
- Returns the byte/character read, or -1 if the end of the I/O device has been
- reached.
-
- This virtual function must be reimplemented by all subclasses.
-
- \sa putch(), ungetch()
-*/
-
-/*!
- \fn int QIODevice::putch( int ch )
-
- Writes the character \e ch to the I/O device.
-
- Returns \e ch, or -1 if some error occurred.
-
- This virtual function must be reimplemented by all subclasses.
-
- \sa getch(), ungetch()
-*/
-
-/*!
- \fn int QIODevice::ungetch( int ch )
-
- Puts the character \e ch back into the I/O device and decrements the
- index if it is not zero.
-
- This function is normally called to "undo" a getch() operation.
-
- Returns \e ch, or -1 if some error occurred.
-
- This virtual function must be reimplemented by all subclasses.
-
- \sa getch(), putch()
-*/
diff --git a/qtools/qiodevice.h b/qtools/qiodevice.h
deleted file mode 100644
index 1c54217..0000000
--- a/qtools/qiodevice.h
+++ /dev/null
@@ -1,155 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QIODevice class
-**
-** Created : 940913
-**
-** 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 QIODEVICE_H
-#define QIODEVICE_H
-
-#ifndef QT_H
-#include "qglobal.h"
-#include "qcstring.h"
-#endif // QT_H
-
-
-// IO device access types
-
-#define IO_Direct 0x0100 // direct access device
-#define IO_Sequential 0x0200 // sequential access device
-#define IO_Combined 0x0300 // combined direct/sequential
-#define IO_TypeMask 0x0f00
-
-// IO handling modes
-
-#define IO_Raw 0x0040 // raw access (not buffered)
-#define IO_Async 0x0080 // asynchronous mode
-
-// IO device open modes
-
-#define IO_ReadOnly 0x0001 // readable device
-#define IO_WriteOnly 0x0002 // writable device
-#define IO_ReadWrite 0x0003 // read+write device
-#define IO_Append 0x0004 // append
-#define IO_Truncate 0x0008 // truncate device
-#define IO_Translate 0x0010 // translate CR+LF
-#define IO_ModeMask 0x00ff
-
-// IO device state
-
-#define IO_Open 0x1000 // device is open
-#define IO_StateMask 0xf000
-
-
-// IO device status
-
-#define IO_Ok 0
-#define IO_ReadError 1 // read error
-#define IO_WriteError 2 // write error
-#define IO_FatalError 3 // fatal unrecoverable error
-#define IO_ResourceError 4 // resource limitation
-#define IO_OpenError 5 // cannot open device
-#define IO_ConnectError 5 // cannot connect to device
-#define IO_AbortError 6 // abort error
-#define IO_TimeOutError 7 // time out
-#define IO_UnspecifiedError 8 // unspecified error
-
-class Q_EXPORT QIODevice // IO device class
-{
-public:
- QIODevice();
- virtual ~QIODevice();
-
- int flags() const { return ioMode; }
- int mode() const { return ioMode & IO_ModeMask; }
- int state() const { return ioMode & IO_StateMask; }
-
- bool isDirectAccess() const { return ((ioMode & IO_Direct) == IO_Direct); }
- bool isSequentialAccess() const { return ((ioMode & IO_Sequential) == IO_Sequential); }
- bool isCombinedAccess() const { return ((ioMode & IO_Combined) == IO_Combined); }
- bool isBuffered() const { return ((ioMode & IO_Raw) != IO_Raw); }
- bool isRaw() const { return ((ioMode & IO_Raw) == IO_Raw); }
- bool isSynchronous() const { return ((ioMode & IO_Async) != IO_Async); }
- bool isAsynchronous() const { return ((ioMode & IO_Async) == IO_Async); }
- bool isTranslated() const { return ((ioMode & IO_Translate) == IO_Translate); }
- bool isReadable() const { return ((ioMode & IO_ReadOnly) == IO_ReadOnly); }
- bool isWritable() const { return ((ioMode & IO_WriteOnly) == IO_WriteOnly); }
- bool isReadWrite() const { return ((ioMode & IO_ReadWrite) == IO_ReadWrite); }
- bool isInactive() const { return state() == 0; }
- bool isOpen() const { return state() == IO_Open; }
-
- int status() const { return ioSt; }
- void resetStatus() { ioSt = IO_Ok; }
-
- virtual bool open( int mode ) = 0;
- virtual void close() = 0;
- virtual void flush() = 0;
-
- virtual uint size() const = 0;
- virtual int at() const;
- virtual bool at( int );
- virtual bool atEnd() const;
- bool reset() { return at(0); }
-
- virtual int readBlock( char *data, uint maxlen ) = 0;
- virtual int writeBlock( const char *data, uint len ) = 0;
- virtual int readLine( char *data, uint maxlen );
- int writeBlock( const QByteArray& data );
- QByteArray readAll();
-
- virtual int getch() = 0;
- virtual int putch( int ) = 0;
- virtual int ungetch( int ) = 0;
-
-protected:
- void setFlags( int f ) { ioMode = f; }
- void setType( int );
- void setMode( int );
- void setState( int );
- void setStatus( int );
- int ioIndex;
-
-private:
- int ioMode;
- int ioSt;
-
-private: // Disabled copy constructor and operator=
-#if defined(Q_DISABLE_COPY)
- QIODevice( const QIODevice & );
- QIODevice &operator=( const QIODevice & );
-#endif
-};
-
-
-#endif // QIODEVICE_H
diff --git a/qtools/qlist.doc b/qtools/qlist.doc
deleted file mode 100644
index 98decd1..0000000
--- a/qtools/qlist.doc
+++ /dev/null
@@ -1,1048 +0,0 @@
-/****************************************************************************
-**
-**
-** QList and QListIterator 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.
-**
-**********************************************************************/
-
-
-/*****************************************************************************
- QList documentation
- *****************************************************************************/
-
-/*!
- \class QList qlist.h
- \brief The QList class is a template class that provides doubly linked lists.
-
- \ingroup collection
- \ingroup tools
-
- In Qt 2.0 QList is only implemented as a template class. Define a
- template instance QList\<X\> to create a list that operates on pointers
- to X, or X*.
-
- Example:
- \code
- #include <qlist.h>
- #include <qstring.h>
- #include <stdio.h>
-
- class Employee
- {
- public:
- Employee( const QString& name, int salary ) { n=name; s=salary; }
- QString name() const { return n; }
- int salary() const { return s; }
- private:
- QString n;
- int s;
- };
-
- void main()
- {
- QList<Employee> list; // list of pointers to Employee
- list.setAutoDelete( TRUE ); // delete items when they are removed
-
- list.append( new Employee("Bill", 50000) );
- list.append( new Employee("Steve",80000) );
- list.append( new Employee("Ron", 60000) );
-
- Employee *emp;
- for ( emp=list.first(); emp != 0; emp=list.next() )
- printf( "%s earns %d\n", emp->name().latin1(), emp->salary() );
- }
- \endcode
-
- Program output:
- \code
- Bill earns 50000
- Steve earns 80000
- Ron earns 60000
- \endcode
-
- The list class is indexable and has a \link at() current index\endlink
- and a \link current() current item\endlink. The first item corresponds
- to index 0. The current index is -1 if the current item is null.
-
- QList has several member functions for traversing the list, but using
- a QListIterator can be more practical. Multiple list iterators may
- traverse the same list, independent of each other and independent of
- the current list item.
-
- In the example above, we make the call setAutoDelete(TRUE).
- Enabling auto-deletion tells the list to delete items that are removed
- from the list. The default is to not delete items when they are
- removed, but that would cause a memory leak in our example since we have
- no other references to the list items.
-
- List items are stored as \c void* in an internal QLNode, which also
- holds pointers to the next and previous list items. The functions
- currentNode(), removeNode() and takeNode() operate directly on the
- QLNode, but they should be used with care.
-
- When inserting an item into a list, only the pointer is copied, not the
- item itself. This is called a shallow copy. It is possible to make the
- list copy all of the item's data (known as a deep copy) when an item is
- inserted. insert(), inSort() and append() call the virtual function
- QCollection::newItem() for the item to be inserted.
- Inherit a list and reimplement it if you want deep copies.
-
- When removing an item from a list, the virtual function
- QCollection::deleteItem() is called. QList's default implementation
- is to delete the item if auto-deletion is enabled.
-
- The virtual function QGList::compareItems() can be reimplemented to
- compare two list items. This function is called from all list functions
- that need to compare list items, for instance remove(const type*).
- If you only want to deal with pointers, there are functions that
- compare pointers instead, for instance removeRef(const type*).
- These functions are somewhat faster than those that call compareItems().
-
- The QStrList class in qstrlist.h is a list of \c char*. QStrList is
- a good example of a list that reimplements newItem(), deleteItem() and
- compareItems()
-
- \sa QListIterator, \link collection.html Collection Classes\endlink
-*/
-
-
-/*!
- \fn QList::QList()
- Constructs an empty list.
-*/
-
-/*!
- \fn QList::QList( const QList<type> &list )
- Constructs a copy of \e list.
-
- Each item in \e list is \link append() appended\endlink to this list.
- Only the pointers are copied (shallow copy).
-*/
-
-/*!
- \fn QList::~QList()
- Removes all items from the list and destroys the list.
-
- All list iterators that access this list will be reset.
-
- \sa setAutoDelete()
-*/
-
-/*!
- \fn QList<type> &QList::operator=(const QList<type> &list)
- Assigns \e list to this list and returns a reference to this list.
-
- This list is first cleared, then each item in \e list is
- \link append() appended\endlink to this list. Only the pointers are copied
- (shallow copy), unless newItem() has been reimplemented().
-*/
-
-/*!
- \fn bool QList::operator==(const QList<type> &list ) const
-
- Compares this list with \a list. Retruns TRUE if the lists
- contain the same data, else FALSE.
-*/
-
-/*!
- \fn uint QList::count() const
- Returns the number of items in the list.
- \sa isEmpty()
-*/
-
-/*!
- \fn void QList::sort()
-
- Sorts the list by the result of the virtual compareItems() function.
-
- The Heap-Sort algorithm is used for sorting. It sorts n items with
- O(n*log n) compares. This is the asymptotic optimal solution of the
- sorting problem.
-
- If the items in your list support operator< and operator== then you
- might be better off with QSortedList since it implements the
- compareItems() function for you using these two operators.
-
- \sa inSort()
-*/
-
-/*!
- \fn bool QList::isEmpty() const
- Returns TRUE if the list is empty, i.e. count() == 0. Returns FALSE
- otherwise.
- \sa count()
-*/
-
-/*!
- \fn bool QList::insert( uint index, const type *item )
- Inserts the \e item at the position \e index in the list.
-
- Returns TRUE if successful, or FALSE if \e index is out of range.
- The valid range is <code>0 .. count()</code> inclusive.
- The item is appended if \e index == count().
-
- The inserted item becomes the current list item.
-
- The \e item must not be a null pointer.
-
- \sa append(), current()
-*/
-
-/*!
- \fn void QList::inSort( const type *item )
- Inserts the \e item at its sorted position in the list.
-
- The sort order depends on the virtual QGList::compareItems() function.
- All items must be inserted with inSort() to maintain the sorting order.
-
- The inserted item becomes the current list item.
-
- The \e item must not be a null pointer.
-
- Please note that inSort is slow. If you want to insert lots of items
- in a list and sort after inserting then you should use sort().
- inSort() takes up to O(n) compares. That means inserting n items in
- your list will need O(n^2) compares while sort() only needs O(n*logn)
- for the same task. So you inSort() only if you already have a pre-sorted
- list and want to insert only few additional items.
-
- \sa insert(), QGList::compareItems(), current(), sort()
-*/
-
-/*!
- \fn void QList::append( const type *item )
- Inserts the \e item at the end of the list.
-
- The inserted item becomes the current list item.
- This is equivalent to \c insert(count(),item).
-
-
- The \e item must not be a null pointer.
-
- \sa insert(), current(), prepend()
-*/
-
-/*!
- \fn void QList::prepend( const type *item )
-
- Inserts the \e item at the start of the list.
-
- The inserted item becomes the current list item.
- This is equivalent to \c insert(0,item).
-
- The \e item must not be a null pointer.
-
- \sa append(), insert(), current()
-*/
-
-/*!
- \fn bool QList::remove( uint index )
- Removes the item at position \e index in the list.
-
- Returns TRUE if successful, or FALSE if \e index is out of range.
- The valid range is <code>0 .. (count() - 1)</code> inclusive.
-
- The removed item is deleted if \link QCollection::setAutoDelete()
- auto-deletion\endlink is enabled.
-
- The item after the removed item becomes the new current list item if
- the removed item is not the last item in the list. If the last item
- is removed, the new last item becomes the current item in Qt 2.x.
- In 3.0, the current item will be set to null. The current item is
- set to null if the list becomes empty.
-
- All list iterators that refer to the removed item will be set to point
- to the new current item.
-
- \sa take(), clear(), setAutoDelete(), current() removeRef()
-*/
-
-/*!
- \fn bool QList::remove()
- Removes the current list item.
-
- Returns TRUE if successful, or FALSE if the current item is null.
-
- The removed item is deleted if \link QCollection::setAutoDelete()
- auto-deletion\endlink is enabled.
-
- The item after the removed item becomes the new current list item if
- the removed item is not the last item in the list. If the last item
- is removed, the new last item becomes the current item in Qt 2.x.
- In 3.0, the current item will be set to null. The current item is
- set to null if the list becomes empty.
-
- All list iterators that refer to the removed item will be set to point
- to the new current item.
-
- \sa take(), clear(), setAutoDelete(), current() removeRef()
-*/
-
-/*!
- \fn bool QList::remove( const type *item )
- Removes the first occurrence of \e item from the list.
-
- Returns TRUE if successful, or FALSE if the item could not be found in the
- list.
-
- The removed item is deleted if \link QCollection::setAutoDelete()
- auto-deletion\endlink is enabled.
-
- The compareItems() function is called when searching for the item
- in the list. If compareItems() is not reimplemented, it is more
- efficient to call removeRef().
-
- The item after the removed item becomes the new current list item if
- the removed item is not the last item in the list. If the last item
- is removed, the new last item becomes the current item in Qt 2.x.
- In 3.0, the current item will be set to null. The current item is
- set to null if the list becomes empty.
-
- All list iterators that refer to the removed item will be set to point
- to the new current item.
-
- \sa removeRef(), take(), clear(), setAutoDelete(), compareItems(), current()
-*/
-
-/*!
- \fn bool QList::removeRef( const type *item )
- Removes the first occurrence of \e item from the list.
-
- Returns TRUE if successful, or FALSE if the item cannot be found in the
- list.
-
- The removed item is deleted if \link QCollection::setAutoDelete()
- auto-deletion\endlink is enabled.
-
- The list is scanned until the pointer \e item is found. It is removed
- if it is found.
-
- Equivalent to:
- \code
- if ( list.findRef(item) != -1 )
- list.remove();
- \endcode
-
- The item after the removed item becomes the new current list item if
- the removed item is not the last item in the list. If the last item
- is removed, the new last item becomes the current item in Qt 2.x.
- In 3.0, the current item will be set to null. The current item is
- set to null if the list becomes empty.
-
- All list iterators that refer to the removed item will be set to point
- to the new current item.
-
- \sa remove(), clear(), setAutoDelete(), current()
-*/
-
-/*!
- \fn void QList::removeNode( QLNode *node )
- Removes the \e node from the list.
-
- This node must exist in the list, otherwise the program may crash.
-
- The removed item is deleted if \link QCollection::setAutoDelete()
- auto-deletion\endlink is enabled.
-
- The first item in the list will become the new current list item.
- The current item is set to null if the list becomes empty.
-
- All list iterators that refer to the removed item will be set to point to
- the item succeeding this item, or the preceding item if the removed item
- was the last item.
-
- \warning Do not call this function unless you are an expert.
-
- \sa takeNode(), currentNode() remove() removeRef()
-*/
-
-/*!
- \fn bool QList::removeFirst()
- Removes the first item from the list.
- Returns TRUE if successful, or FALSE if the list is empty.
-
- The removed item is deleted if \link QCollection::setAutoDelete()
- auto-deletion\endlink is enabled.
-
- The first item in the list becomes the new current list item.
- The current item is set to null if the list becomes empty.
-
- All list iterators that refer to the removed item will be set to point
- to the new current item.
-
- \sa removeLast(), setAutoDelete(), current() remove()
-*/
-
-/*!
- \fn bool QList::removeLast()
- Removes the last item from the list.
- Returns TRUE if successful, or FALSE if the list is empty.
-
- The removed item is deleted if \link QCollection::setAutoDelete()
- auto-deletion\endlink is enabled.
-
- The last item in the list becomes the new current list item.
- The current item is set to null if the list becomes empty.
-
- All list iterators that refer to the removed item will be set to point
- to the new current item.
-
- \sa removeFirst(), setAutoDelete(), current()
-*/
-
-/*!
- \fn type *QList::take( uint index )
- Takes the item at position \e index out of the list without
- deleting it (even if \link QCollection::setAutoDelete()
- auto-deletion\endlink is enabled).
-
- Returns a pointer to the item taken out of the list, or null if
- the index is out of range.
- The valid range is <code>0 .. (count() - 1)</code> inclusive.
-
- The item after the taken item becomes the new current list item if
- the taken item is not the last item in the list. If the last item
- is taken, the new last item becomes the current item in Qt 2.x. In
- 3.0, the current item will be set to null. The current item is set
- to null if the list becomes empty.
-
- All list iterators that refer to the taken item will be set to point to
- the new current item.
-
- \sa remove(), clear(), current()
-*/
-
-/*!
- \fn type *QList::take()
- Takes the current item out of the list without deleting it (even if
- \link QCollection::setAutoDelete() auto-deletion\endlink is enabled).
- Returns a pointer to the item taken out of the list, or null if
- the current item is null.
-
- The item after the taken item becomes the new current list item if
- the taken item is not the last item in the list. If the last item
- is taken, the new last item becomes the current item in Qt 2.x. In
- 3.0, the current item will be set to null. The current item is set
- to null if the list becomes empty.
-
- All list iterators that refer to the taken item will be set to point to
- the new current item.
-
- \sa remove(), clear(), current()
-*/
-
-/*!
- \fn type *QList::takeNode( QLNode *node )
- Takes the \e node out of the list without deleting its item (even if
- \link QCollection::setAutoDelete() auto-deletion\endlink is enabled).
- Returns a pointer to the item taken out of the list.
-
- This node must exist in the list, otherwise the program may crash.
-
- The first item in the list becomes the new current list item.
-
- All list iterators that refer to the taken item will be set to point to
- the item succeeding this item, or the preceding item if the taken item
- was the last item.
-
- \warning Do not call this function unless you are an expert.
-
- \sa removeNode(), currentNode()
-*/
-
-/*!
- \fn void QList::clear()
- Removes all items from the list.
-
- The removed items are deleted if \link QCollection::setAutoDelete()
- auto-deletion\endlink is enabled.
-
- All list iterators that access this list will be reset.
-
- \sa remove(), take(), setAutoDelete()
-*/
-
-/*!
- \fn int QList::find( const type *item )
- Finds the first occurrence of \e item in the list.
-
- If the item is found, the list sets the current item to point to
- the found item and returns the index of this item.
- If the item is not found, the list sets the current item to null,
- the current index to -1 and returns -1.
-
- The compareItems() function is called when searching for the item
- in the list. If compareItems() is not reimplemented, it is more
- efficient to call findRef().
-
- \sa findNext(), findRef(), compareItems(), current()
-*/
-
-/*!
- \fn int QList::findNext( const type *item )
- Finds the next occurrence of \e item in the list, starting from
- the current list item.
-
- If the item is found, the list sets the current item to point to
- the found item and returns the index of this item.
- If the item is not found, the list sets the current item to null,
- the current index to -1 and returns -1.
-
- The compareItems() function is called when searching for the item
- in the list. If compareItems() is not reimplemented, it is more
- efficient to call findNextRef().
-
- \sa find(), findNextRef(), compareItems(), current()
-*/
-
-/*!
- \fn int QList::findRef( const type *item )
- Finds the first occurrence of \e item in the list.
-
- If the item is found, the list sets the current item to point to
- the found item and returns the index of this item.
- If the item is not found, the list sets the current item to null,
- the current index to -1 and returns -1.
-
- Calling this function is must faster than find(), because find()
- compares \e item with each list item using compareItems().
- This function only compares the pointers.
-
- \sa findNextRef(), find(), current()
-*/
-
-/*!
- \fn int QList::findNextRef( const type *item )
- Finds the next occurrence of \e item in the list, starting from the
- current list item.
-
- If the item is found, the list sets the current item to point to
- the found item and returns the index of this item.
- If the item is not found, the list sets the current item to null,
- the current index to -1 and returns -1.
-
- Calling this function is must faster than findNext(), because findNext()
- compares \e item with each list item using compareItems().
- This function only compares the pointers.
-
- \sa findRef(), findNext(), current()
-*/
-
-/*!
- \fn uint QList::contains( const type *item ) const
- Counts and returns the number of occurrences of \e item in the list.
-
- The compareItems() function is called when looking for the \e item
- in the list. If compareItems() is not reimplemented, it is more
- efficient to call containsRef().
-
- Does not affect the current list item.
-
- \sa containsRef(), compareItems()
-*/
-
-/*!
- \fn uint QList::containsRef( const type *item ) const
- Counts and returns the number of occurrences of \e item in the list.
-
- Calling this function is must faster than contains(), because contains()
- compares \e item with each list item using compareItems().
- This function only compares the pointers.
-
- Does not affect the current list item.
-
- \sa contains()
-*/
-
-/*!
- \fn type *QList::at( uint index )
- Returns a pointer to the item at position \e index in the list, or
- null if the index is out of range.
-
- Sets the current list item to this item if \e index is valid.
- The valid range is <code>0 .. (count() - 1)</code> inclusive.
-
- This function is very efficient. It starts scanning from the first
- item, last item or current item, whichever is closest to \e index.
-
- \sa current()
-*/
-
-/*!
- \fn int QList::at() const
- Returns the index of the current list item. The returned value is -1
- if the current item is null.
- \sa current()
-*/
-
-/*!
- \fn type *QList::current() const
- Returns a pointer to the current list item. The current item may be
- null (implies that the current index is -1).
- \sa at()
-*/
-
-/*!
- \fn QLNode *QList::currentNode() const
- Returns a pointer to the current list node.
-
- The node can be kept and removed later using removeNode().
- The advantage is that the item can be removed directly without
- searching the list.
-
- \warning Do not call this function unless you are an expert.
-
- \sa removeNode(), takeNode(), current()
-*/
-
-/*!
- \fn type *QList::getFirst() const
- Returns a pointer to the first item in the list, or null if the
- list is empty.
-
- Does not affect the current list item.
-
- \sa first(), getLast()
-*/
-
-/*!
- \fn type *QList::getLast() const
- Returns a pointer to the last item in the list, or null if the
- list is empty.
-
- Does not affect the current list item.
-
- \sa last(), getFirst()
-*/
-
-/*!
- \fn type *QList::first()
- Returns a pointer to the first item in the list and makes this the
- current list item, or null if the list is empty.
- \sa getFirst(), last(), next(), prev(), current()
-*/
-
-/*!
- \fn type *QList::last()
- Returns a pointer to the last item in the list and makes this the
- current list item, or null if the list is empty.
- \sa getLast(), first(), next(), prev(), current()
-*/
-
-/*!
- \fn type *QList::next()
- Returns a pointer to the item succeeding the current item.
- Returns null if the current item is null or equal to the last item.
-
- Makes the succeeding item current. If the current item before this
- function call was the last item, the current item will be set to null.
- If the current item was null, this function does nothing.
-
- \sa first(), last(), prev(), current()
-*/
-
-/*!
- \fn type *QList::prev()
- Returns a pointer to the item preceding the current item.
- Returns null if the current item is null or equal to the first item.
-
- Makes the preceding item current. If the current item before this
- function call was the first item, the current item will be set to null.
- If the current item was null, this function does nothing.
-
- \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
- *****************************************************************************/
-
-/*!
- \class QListIterator qlist.h
- \brief The QListIterator class provides an iterator for QList collections.
-
- \ingroup collection
- \ingroup tools
-
- Define a template instance QListIterator\<X\> to create a list iterator
- that operates on QList\<X\> (list of X*).
-
- Example:
- \code
- #include <qlist.h>
- #include <qstring.h>
- #include <stdio.h>
-
- class Employee
- {
- public:
- Employee( const char *name, int salary ) { n=name; s=salary; }
- const char *name() const { return n; }
- int salary() const { return s; }
- private:
- QString n;
- int s;
- };
-
- void main()
- {
- QList<Employee> list; // list of pointers to Employee
- list.setAutoDelete( TRUE ); // delete items when they are removed
-
- list.append( new Employee("Bill", 50000) );
- list.append( new Employee("Steve",80000) );
- list.append( new Employee("Ron", 60000) );
-
- QListIterator<Employee> it(list); // iterator for employee list
- for ( ; it.current(); ++it ) {
- Employee *emp = it.current();
- printf( "%s earns %d\n", emp->name().latin1(), emp->salary() );
- }
- }
- \endcode
-
- Program output:
- \code
- Bill earns 50000
- Steve earns 80000
- Ron earns 60000
- \endcode
-
- Although QList has member functions to traverse the doubly linked list
- structure, using a list iterator is a much more robust way of traversing
- the list, because multiple list iterators can operate on the same list,
- independent of each other and independent of the QList's current item.
- An iterator has its own current list item and can get the next and
- previous list items. It can only traverse the list, never modify it.
-
- A QList knows about all list iterators that are operating on the list.
- When an item is removed from the list, the list update all iterators
- that are pointing the removed item to point to the new current list item.
-
- Example:
- \code
- #include <qlist.h>
- #include <qstring.h>
- #include <stdio.h>
-
- class Employee
- {
- ... // same as above
- };
-
- void main()
- {
- QList<Employee> list; // list of pointers to Employee
- list.setAutoDelete( TRUE ); // delete items when they are removed
-
- list.append( new Employee("Bill", 50000) );
- list.append( new Employee("Steve",80000) );
- list.append( new Employee("Ron", 60000) );
-
- QListIterator<Employee> it(list);
-
- list.at( 1 ); // current list item: "Steve"
- it.toLast(); // it: "Ron"
- --it; // it: "Steve"
-
- // Now, both the list and the iterator are referring the same item
-
- list.remove();
- printf( "%s\n", it.current()->name().latin1() );
- }
- \endcode
-
- Program output:
- \code
- Ron
- \endcode
-
- \sa QList, \link collection.html collection classes\endlink
-*/
-
-/*!
- \fn QListIterator::QListIterator( const QList<type> &list )
- Constructs an iterator for \e list. The current iterator item is
- set to point on the first item in the \e list.
-*/
-
-/*!
- \fn QListIterator::~QListIterator()
- Destroys the iterator.
-*/
-
-/*!
- \fn uint QListIterator::count() const
- Returns the number of items in the list this iterator operates on.
- \sa isEmpty()
-*/
-
-/*!
- \fn bool QListIterator::isEmpty() const
- Returns TRUE if the list is empty, i.e. count() == 0, otherwise FALSE.
- \sa count()
-*/
-
-/*!
- \fn bool QListIterator::atFirst() const
- Returns TRUE if the current iterator item is the first list item, otherwise
- FALSE.
- \sa toFirst(), atLast()
-*/
-
-/*!
- \fn bool QListIterator::atLast() const
- Returns TRUE if the current iterator item is the last list item, otherwise
- FALSE.
- \sa toLast(), atFirst()
-*/
-
-/*!
- \fn type *QListIterator::toFirst()
- Sets the current iterator item to point to the first list item and returns
- a pointer to the item. Sets the current item to null and returns null
- if the list is empty.
- \sa toLast(), atFirst()
-*/
-
-/*!
- \fn type *QListIterator::toLast()
- Sets the current iterator item to point to the last list item and returns
- a pointer to the item. Sets the current item to null and returns null
- if the list is empty.
- \sa toFirst(), atLast()
-*/
-
-/*!
- \fn QListIterator::operator type *() const
- Cast operator. Returns a pointer to the current iterator item.
- Same as current().
-*/
-
-/*!
- \fn type *QListIterator::operator*()
- Asterix operator. Returns a pointer to the current iterator item.
- Same as current().
-*/
-
-/*!
- \fn type *QListIterator::current() const
- Returns a pointer to the current iterator item.
-*/
-
-/*!
- \fn type *QListIterator::operator()()
- Makes the succeeding item current and returns the original current item.
-
- If the current iterator item was the last item in the list or if it was
- null, null is returned.
-*/
-
-/*!
- \fn char *QStrListIterator::operator()()
- Makes the succeeding item current and returns the original current item.
-
- If the current iterator item was the last item in the list or if it was
- null, null is returned.
-*/
-
-/*!
- \fn type *QListIterator::operator++()
- Prefix ++ makes the succeeding item current and returns the new current
- item.
-
- If the current iterator item was the last item in the list or if it was
- null, null is returned.
-*/
-
-/*!
- \fn type *QListIterator::operator+=( uint jump )
- Sets the current item to the item \e jump positions after the current item,
- and returns a pointer to that item.
-
- If that item is beyond the last item or if the dictionary is empty,
- it sets the current item to null and returns null
-*/
-
-/*!
- \fn type *QListIterator::operator--()
- Prefix -- makes the preceding item current and returns the new current
- item.
-
- If the current iterator item was the first item in the list or if it was
- null, null is returned.
-*/
-
-/*!
- \fn type *QListIterator::operator-=( uint jump )
- Returns the item \e jump positions before the current item, or null if
- it is beyond the first item. Makes this the current item.
-*/
-
-/*!
- \fn QListIterator<type>& QListIterator::operator=( const QListIterator<type> &it )
- Assignment. Makes a copy of the iterator \a it and returns a reference
- to this iterator.
-*/
-
-
-/*****************************************************************************
- QStrList documentation
- *****************************************************************************/
-
-typedef QList<char> QStrList
-
-/*!
- \class QStrList qstrlist.h
- \brief The QStrList class provides a doubly linked list of \c char*.
-
- \inherit QList
-
- \ingroup collection
- \ingroup tools
-
- This class is a QList\<char\> instance (a list of char*).
-
- QStrList can make deep or shallow copies of the strings that are inserted.
-
- A deep copy means to allocate space for the string and then copy the string
- data into it. A shallow copy is just a copy of the pointer value and not
- the string data.
-
- The disadvantage with shallow copies is that since a pointer can only
- be deleted once, the program must put all strings in a central place and
- know when it is safe to delete them (i.e. when the strings are no longer
- referenced by other parts of the program). This can make the program
- more complex. The advantage of shallow copies is that shallow copies
- consume far less memory than deep copies. It is also much faster
- to copy a pointer (typically 4 or 8 bytes) than to copy string data.
-
- A QStrList that operates on deep copies will by default turn on
- auto-deletion (see setAutoDelete()). Thus, by default, QStrList will
- deallocate any string copies it allocates.
-
- The virtual compareItems() function is reimplemented and does a case
- sensitive string comparison. The inSort() function will insert
- strings in a sorted order.
-
- The QStrListIterator class is an iterator for QStrList.
-*/
-
-/*!
- \fn QStrList::QStrList( bool deepCopies )
- Constructs an empty list of strings. Will make deep copies of all inserted
- strings if \e deepCopies is TRUE, or uses shallow copies if \e deepCopies
- is FALSE.
-*/
-
-/*!
- \fn QStrList::QStrList( const QStrList &list )
- Constructs a copy of \e list.
-
- If \e list has deep copies, this list will also get deep copies.
- Only the pointers are copied (shallow copy) if the other list does not
- use deep copies.
-*/
-
-/*!
- \fn QStrList::~QStrList()
- Destroys the list. All strings are removed.
-*/
-
-/*!
- \fn QStrList& QStrList::operator=( const QStrList& list )
- Assigns \e list to this list and returns a reference to this list.
-
- If \e list has deep copies, this list will also get deep copies.
- Only the pointers are copied (shallow copy) if the other list does not
- use deep copies.
-*/
-
-
-/*****************************************************************************
- QStrIList documentation
- *****************************************************************************/
-
-/*!
- \class QStrIList qstrlist.h
- \brief The QStrIList class provides a doubly linked list of \c char* with
-case insensitive compare.
-
- \ingroup collection
- \ingroup tools
-
- This class is a QList\<char\> instance (a list of char*).
-
- QStrIList is similar to QStrList except that it is case insensitive.
- The virtual compareItems() function is reimplemented and does a
- case insensitive string comparison.
- The inSort() function will insert strings in a sorted order.
-
- The QStrListIterator class is an iterator for QStrList.
-*/
-
-/*!
- \fn QStrIList::QStrIList( bool deepCopies )
- Constructs a list of strings. Will make deep copies of all inserted
- strings if \e deepCopies is TRUE, or uses shallow copies if \e deepCopies
- is FALSE.
-*/
-
-/*!
- \fn QStrIList::~QStrIList()
- Destroys the list. All strings are removed.
-*/
-
-
-/*****************************************************************************
- QStrListIterator documentation
- *****************************************************************************/
-
-/*!
- \class QStrListIterator qstrlist.h
- \brief The QStrListIterator class is an iterator for the QStrList and QStrIList classes.
-
- \inherit QListIterator
-
- \ingroup tools
-
- This class is a QListIterator\<char\> instance.
- It can traverse the strings in the QStrList and QStrIList classes.
-*/
diff --git a/qtools/qlist.h b/qtools/qlist.h
deleted file mode 100644
index a4608fb..0000000
--- a/qtools/qlist.h
+++ /dev/null
@@ -1,139 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QList template/macro class
-**
-** Created : 920701
-**
-** 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 QLIST_H
-#define QLIST_H
-
-#ifndef QT_H
-#include "qglist.h"
-#endif // QT_H
-
-
-template<class type> class Q_EXPORT QList : public QGList
-{
-public:
- QList() {}
- QList( const QList<type> &l ) : QGList(l) {}
- ~QList() { clear(); }
- QList<type> &operator=(const QList<type> &l)
- { return (QList<type>&)QGList::operator=(l); }
- bool operator==( const QList<type> &list ) const
- { return QGList::operator==( list ); }
- uint count() const { return QGList::count(); }
- bool isEmpty() const { return QGList::count() == 0; }
- bool insert( uint i, const type *d){ return QGList::insertAt(i,(QCollection::Item)d); }
- void inSort( const type *d ) { QGList::inSort((QCollection::Item)d); }
- void prepend( const type *d ) { QGList::insertAt(0,(QCollection::Item)d); }
- void append( const type *d ) { QGList::append((QCollection::Item)d); }
- bool remove( uint i ) { return QGList::removeAt(i); }
- bool remove() { return QGList::remove((QCollection::Item)0); }
- bool remove( const type *d ) { return QGList::remove((QCollection::Item)d); }
- bool removeRef( const type *d ) { return QGList::removeRef((QCollection::Item)d); }
- void removeNode( QLNode *n ) { QGList::removeNode(n); }
- bool removeFirst() { return QGList::removeFirst(); }
- bool removeLast() { return QGList::removeLast(); }
- type *take( uint i ) { return (type *)QGList::takeAt(i); }
- type *take() { return (type *)QGList::take(); }
- type *takeNode( QLNode *n ) { return (type *)QGList::takeNode(n); }
- void clear() { QGList::clear(); }
- void sort() { QGList::sort(); }
- int find( const type *d ) { return QGList::find((QCollection::Item)d); }
- int findNext( const type *d ) { return QGList::find((QCollection::Item)d,FALSE); }
- int findRef( const type *d ) { return QGList::findRef((QCollection::Item)d); }
- int findNextRef( const type *d ){ return QGList::findRef((QCollection::Item)d,FALSE);}
- uint contains( const type *d ) const { return QGList::contains((QCollection::Item)d); }
- uint containsRef( const type *d ) const
- { return QGList::containsRef((QCollection::Item)d); }
- type *at( uint i ) { return (type *)QGList::at(i); }
- int at() const { return QGList::at(); }
- type *current() const { return (type *)QGList::get(); }
- QLNode *currentNode() const { return QGList::currentNode(); }
- type *getFirst() const { return (type *)QGList::cfirst(); }
- type *getLast() const { return (type *)QGList::clast(); }
- type *first() { return (type *)QGList::first(); }
- 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 );
-};
-
-#if defined(Q_DELETING_VOID_UNDEFINED)
-template<> inline void QList<void>::deleteItem( QCollection::Item )
-{
-}
-#endif
-
-template<class type> inline void QList<type>::deleteItem( QCollection::Item d )
-{
- if ( del_item ) delete (type *)d;
-}
-
-
-template<class type> class Q_EXPORT QListIterator : public QGListIterator
-{
-public:
- QListIterator(const QList<type> &l) :QGListIterator((QGList &)l) {}
- ~QListIterator() {}
- uint count() const { return list->count(); }
- bool isEmpty() const { return list->count() == 0; }
- bool atFirst() const { return QGListIterator::atFirst(); }
- bool atLast() const { return QGListIterator::atLast(); }
- type *toFirst() { return (type *)QGListIterator::toFirst(); }
- type *toLast() { return (type *)QGListIterator::toLast(); }
- operator type *() const { return (type *)QGListIterator::get(); }
- type *operator*() { return (type *)QGListIterator::get(); }
-
- // No good, since QList<char> (ie. QStrList fails...
- //
- // MSVC++ gives warning
- // Sunpro C++ 4.1 gives error
- // type *operator->() { return (type *)QGListIterator::get(); }
-
- type *current() const { return (type *)QGListIterator::get(); }
- type *operator()() { return (type *)QGListIterator::operator()();}
- type *operator++() { return (type *)QGListIterator::operator++(); }
- type *operator+=(uint j) { return (type *)QGListIterator::operator+=(j);}
- type *operator--() { return (type *)QGListIterator::operator--(); }
- type *operator-=(uint j) { return (type *)QGListIterator::operator-=(j);}
- QListIterator<type>& operator=(const QListIterator<type>&it)
- { QGListIterator::operator=(it); return *this; }
-};
-
-
-#endif // QLIST_H
diff --git a/qtools/qmap.cpp b/qtools/qmap.cpp
deleted file mode 100644
index 1d2510a..0000000
--- a/qtools/qmap.cpp
+++ /dev/null
@@ -1,254 +0,0 @@
-/****************************************************************************
-**
-**
-** Implementation of QMap
-**
-** Created : 990406
-**
-** 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 "qmap.h"
-
-typedef QMapNodeBase* NodePtr;
-typedef QMapNodeBase Node;
-
-
-void QMapPrivateBase::rotateLeft( NodePtr x, NodePtr& root)
-{
- NodePtr y = x->right;
- x->right = y->left;
- if (y->left !=0)
- y->left->parent = x;
- y->parent = x->parent;
- if (x == root)
- root = y;
- else if (x == x->parent->left)
- x->parent->left = y;
- else
- x->parent->right = y;
- y->left = x;
- x->parent = y;
-}
-
-
-void QMapPrivateBase::rotateRight( NodePtr x, NodePtr& root )
-{
- NodePtr y = x->left;
- x->left = y->right;
- if (y->right != 0)
- y->right->parent = x;
- y->parent = x->parent;
- if (x == root)
- root = y;
- else if (x == x->parent->right)
- x->parent->right = y;
- else
- x->parent->left = y;
- y->right = x;
- x->parent = y;
-}
-
-
-void QMapPrivateBase::rebalance( NodePtr x, NodePtr& root)
-{
- x->color = Node::Red;
- while ( x != root && x->parent->color == Node::Red ) {
- if ( x->parent == x->parent->parent->left ) {
- NodePtr y = x->parent->parent->right;
- if (y && y->color == Node::Red) {
- x->parent->color = Node::Black;
- y->color = Node::Black;
- x->parent->parent->color = Node::Red;
- x = x->parent->parent;
- } else {
- if (x == x->parent->right) {
- x = x->parent;
- rotateLeft( x, root );
- }
- x->parent->color = Node::Black;
- x->parent->parent->color = Node::Red;
- rotateRight (x->parent->parent, root );
- }
- } else {
- NodePtr y = x->parent->parent->left;
- if ( y && y->color == Node::Red ) {
- x->parent->color = Node::Black;
- y->color = Node::Black;
- x->parent->parent->color = Node::Red;
- x = x->parent->parent;
- } else {
- if (x == x->parent->left) {
- x = x->parent;
- rotateRight( x, root );
- }
- x->parent->color = Node::Black;
- x->parent->parent->color = Node::Red;
- rotateLeft( x->parent->parent, root );
- }
- }
- }
- root->color = Node::Black;
-}
-
-
-NodePtr QMapPrivateBase::removeAndRebalance( NodePtr z, NodePtr& root,
- NodePtr& leftmost,
- NodePtr& rightmost )
-{
- NodePtr y = z;
- NodePtr x;
- NodePtr x_parent;
- if (y->left == 0) {
- x = y->right;
- } else {
- if (y->right == 0)
- x = y->left;
- else
- {
- y = y->right;
- while (y->left != 0)
- y = y->left;
- x = y->right;
- }
- }
- if (y != z) {
- z->left->parent = y;
- y->left = z->left;
- if (y != z->right) {
- x_parent = y->parent;
- if (x)
- x->parent = y->parent;
- y->parent->left = x;
- y->right = z->right;
- z->right->parent = y;
- } else {
- x_parent = y;
- }
- if (root == z)
- root = y;
- else if (z->parent->left == z)
- z->parent->left = y;
- else
- z->parent->right = y;
- y->parent = z->parent;
- // Swap the colors
- Node::Color c = y->color;
- y->color = z->color;
- z->color = c;
- y = z;
- } else {
- x_parent = y->parent;
- if (x)
- x->parent = y->parent;
- if (root == z)
- root = x;
- else if (z->parent->left == z)
- z->parent->left = x;
- else
- z->parent->right = x;
- if ( leftmost == z ) {
- if (z->right == 0)
- leftmost = z->parent;
- else
- leftmost = x->minimum();
- }
- if (rightmost == z) {
- if (z->left == 0)
- rightmost = z->parent;
- else
- rightmost = x->maximum();
- }
- }
- if (y->color != Node::Red) {
- while (x != root && (x == 0 || x->color == Node::Black)) {
- if (x == x_parent->left) {
- NodePtr w = x_parent->right;
- if (w->color == Node::Red) {
- w->color = Node::Black;
- x_parent->color = Node::Red;
- rotateLeft(x_parent, root);
- w = x_parent->right;
- }
- if ((w->left == 0 || w->left->color == Node::Black) &&
- (w->right == 0 || w->right->color == Node::Black)) {
- w->color = Node::Red;
- x = x_parent;
- x_parent = x_parent->parent;
- } else {
- if (w->right == 0 || w->right->color == Node::Black) {
- if (w->left)
- w->left->color = Node::Black;
- w->color = Node::Red;
- rotateRight(w, root);
- w = x_parent->right;
- }
- w->color = x_parent->color;
- x_parent->color = Node::Black;
- if (w->right)
- w->right->color = Node::Black;
- rotateLeft(x_parent, root);
- break;
- }
- } else {
- NodePtr w = x_parent->left;
- if (w->color == Node::Red) {
- w->color = Node::Black;
- x_parent->color = Node::Red;
- rotateRight(x_parent, root);
- w = x_parent->left;
- }
- if ((w->right == 0 || w->right->color == Node::Black) &&
- (w->left == 0 || w->left->color == Node::Black)) {
- w->color = Node::Red;
- x = x_parent;
- x_parent = x_parent->parent;
- } else {
- if (w->left == 0 || w->left->color == Node::Black) {
- if (w->right)
- w->right->color = Node::Black;
- w->color = Node::Red;
- rotateLeft(w, root);
- w = x_parent->left;
- }
- w->color = x_parent->color;
- x_parent->color = Node::Black;
- if (w->left)
- w->left->color = Node::Black;
- rotateRight(x_parent, root);
- break;
- }
- }
- }
- if (x)
- x->color = Node::Black;
- }
- return y;
-}
diff --git a/qtools/qmap.h b/qtools/qmap.h
deleted file mode 100644
index f384a3d..0000000
--- a/qtools/qmap.h
+++ /dev/null
@@ -1,606 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QMap class
-**
-** Created : 990406
-**
-** 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 QMAP_H
-#define QMAP_H
-
-#ifndef QT_H
-#include "qshared.h"
-#include "qdatastream.h"
-#endif // QT_H
-
-
-struct QMapNodeBase
-{
- enum Color { Red, Black };
-
- QMapNodeBase* left;
- QMapNodeBase* right;
- QMapNodeBase* parent;
-
- Color color;
-
- QMapNodeBase* minimum() {
- QMapNodeBase* x = this;
- while ( x->left )
- x = x->left;
- return x;
- }
-
- QMapNodeBase* maximum() {
- QMapNodeBase* x = this;
- while ( x->right )
- x = x->right;
- return x;
- }
-};
-
-
-template <class K, class T>
-struct QMapNode : public QMapNodeBase
-{
- QMapNode( const K& _key, const T& _data ) { data = _data; key = _key; }
- QMapNode( const K& _key ) { key = _key; }
- QMapNode( const QMapNode<K,T>& _n ) { key = _n.key; data = _n.data; }
- QMapNode() { }
- T data;
- K key;
-};
-
-
-template<class K, class T>
-class Q_EXPORT QMapIterator
-{
- public:
- /**
- * Typedefs
- */
- typedef QMapNode< K, T >* NodePtr;
-
- /**
- * Variables
- */
- QMapNode<K,T>* node;
-
- /**
- * Functions
- */
- QMapIterator() : node( 0 ) {}
- QMapIterator( QMapNode<K,T>* p ) : node( p ) {}
- QMapIterator( const QMapIterator<K,T>& it ) : node( it.node ) {}
-
- bool operator==( const QMapIterator<K,T>& it ) const { return node == it.node; }
- bool operator!=( const QMapIterator<K,T>& it ) const { return node != it.node; }
- T& operator*() { return node->data; }
- const T& operator*() const { return node->data; }
-
- // Cannot have this - some compilers are too stupid
- //T* operator->() const { return &(node->data); }
-
- const K& key() const { return node->key; }
- T& data() { return node->data; }
- const T& data() const { return node->data; }
-
-private:
- int inc() {
- QMapNodeBase* tmp = node;
- if ( tmp->right ) {
- tmp = tmp->right;
- while ( tmp->left )
- tmp = tmp->left;
- } else {
- QMapNodeBase* y = tmp->parent;
- while (tmp == y->right) {
- tmp = y;
- y = y->parent;
- }
- if (tmp->right != y)
- tmp = y;
- }
- node = (NodePtr)tmp;
- return 0;
- }
-
- int dec() {
- QMapNodeBase* tmp = node;
- if (tmp->color == QMapNodeBase::Red &&
- tmp->parent->parent == tmp ) {
- tmp = tmp->right;
- } else if (tmp->left != 0) {
- QMapNodeBase* y = tmp->left;
- while ( y->right )
- y = y->right;
- tmp = y;
- } else {
- QMapNodeBase* y = tmp->parent;
- while (tmp == y->left) {
- tmp = y;
- y = y->parent;
- }
- tmp = y;
- }
- node = (NodePtr)tmp;
- return 0;
- }
-
-public:
- QMapIterator<K,T>& operator++() {
- inc();
- return *this;
- }
-
- QMapIterator<K,T> operator++(int) {
- QMapIterator<K,T> tmp = *this;
- inc();
- return tmp;
- }
-
- QMapIterator<K,T>& operator--() {
- dec();
- return *this;
- }
-
- QMapIterator<K,T> operator--(int) {
- QMapIterator<K,T> tmp = *this;
- dec();
- return tmp;
- }
-};
-
-template<class K, class T>
-class Q_EXPORT QMapConstIterator
-{
- public:
- /**
- * Typedefs
- */
- typedef QMapNode< K, T >* NodePtr;
-
- /**
- * Variables
- */
- QMapNode<K,T>* node;
-
- /**
- * Functions
- */
- QMapConstIterator() : node( 0 ) {}
- QMapConstIterator( QMapNode<K,T>* p ) : node( p ) {}
- QMapConstIterator( const QMapConstIterator<K,T>& it ) : node( it.node ) {}
- QMapConstIterator( const QMapIterator<K,T>& it ) : node( it.node ) {}
-
- bool operator==( const QMapConstIterator<K,T>& it ) const { return node == it.node; }
- bool operator!=( const QMapConstIterator<K,T>& it ) const { return node != it.node; }
- const T& operator*() const { return node->data; }
-
- // Cannot have this - some compilers are too stupid
- //const T* operator->() const { return &(node->data); }
-
- const K& key() const { return node->key; }
- const T& data() const { return node->data; }
-
-private:
- int inc() {
- QMapNodeBase* tmp = node;
- if ( tmp->right ) {
- tmp = tmp->right;
- while ( tmp->left )
- tmp = tmp->left;
- } else {
- QMapNodeBase* y = tmp->parent;
- while (tmp == y->right) {
- tmp = y;
- y = y->parent;
- }
- if (tmp->right != y)
- tmp = y;
- }
- node = (NodePtr)tmp;
- return 0;
- }
-
- int dec() {
- QMapNodeBase* tmp = node;
- if (tmp->color == QMapNodeBase::Red &&
- tmp->parent->parent == tmp ) {
- tmp = tmp->right;
- } else if (tmp->left != 0) {
- QMapNodeBase* y = tmp->left;
- while ( y->right )
- y = y->right;
- tmp = y;
- } else {
- QMapNodeBase* y = tmp->parent;
- while (tmp == y->left) {
- tmp = y;
- y = y->parent;
- }
- tmp = y;
- }
- node = (NodePtr)tmp;
- return 0;
- }
-
-public:
- QMapConstIterator<K,T>& operator++() {
- inc();
- return *this;
- }
-
- QMapConstIterator<K,T> operator++(int) {
- QMapConstIterator<K,T> tmp = *this;
- inc();
- return tmp;
- }
-
- QMapConstIterator<K,T>& operator--() {
- dec();
- return *this;
- }
-
- QMapConstIterator<K,T> operator--(int) {
- QMapConstIterator<K,T> tmp = *this;
- dec();
- return tmp;
- }
-};
-
-
-class Q_EXPORT QMapPrivateBase : public QShared
-{
-public:
- QMapPrivateBase() {
- node_count = 0;
- }
- QMapPrivateBase( const QMapPrivateBase* _map) {
- node_count = _map->node_count;
- }
-
- /**
- * Implementations of basic tree algorithms
- */
- void rotateLeft( QMapNodeBase* x, QMapNodeBase*& root);
- void rotateRight( QMapNodeBase* x, QMapNodeBase*& root );
- void rebalance( QMapNodeBase* x, QMapNodeBase*& root );
- QMapNodeBase* removeAndRebalance( QMapNodeBase* z, QMapNodeBase*& root,
- QMapNodeBase*& leftmost,
- QMapNodeBase*& rightmost );
-
- /**
- * Variables
- */
- int node_count;
-};
-
-
-template <class Key, class T>
-class QMapPrivate : public QMapPrivateBase
-{
-public:
- /**
- * Typedefs
- */
- typedef QMapIterator< Key, T > Iterator;
- typedef QMapConstIterator< Key, T > ConstIterator;
- typedef QMapNode< Key, T > Node;
- typedef QMapNode< Key, T >* NodePtr;
-
- /**
- * Functions
- */
- QMapPrivate() {
- header = new Node;
- header->color = QMapNodeBase::Red; // Mark the header
- header->parent = 0;
- header->left = header->right = header;
- }
- QMapPrivate( const QMapPrivate< Key, T >* _map ) : QMapPrivateBase( _map ) {
- header = new Node;
- header->color = QMapNodeBase::Red; // Mark the header
- if ( _map->header->parent == 0 ) {
- header->parent = 0;
- header->left = header->right = header;
- } else {
- header->parent = copy( (NodePtr)(_map->header->parent) );
- header->parent->parent = header;
- header->left = header->parent->minimum();
- header->right = header->parent->maximum();
- }
- }
- ~QMapPrivate() { clear(); delete header; }
-
- NodePtr copy( NodePtr p ) {
- if ( !p )
- return 0;
- NodePtr n = new Node( *p );
- n->color = p->color;
- if ( p->left ) {
- n->left = copy( (NodePtr)(p->left) );
- n->left->parent = n;
- } else {
- n->left = 0;
- }
- if ( p->right ) {
- n->right = copy( (NodePtr)(p->right) );
- n->right->parent = n;
- } else {
- n->right = 0;
- }
- return n;
- }
-
- void clear() {
- clear( (NodePtr)(header->parent) );
- header->color = QMapNodeBase::Red;
- header->parent = 0;
- header->left = header->right = header;
- node_count = 0;
- }
-
- void clear( NodePtr p ) {
- while ( p != 0 ) {
- clear( (NodePtr)p->right );
- NodePtr y = (NodePtr)p->left;
- delete p;
- p = y;
- }
- }
-
- Iterator begin() { return Iterator( (NodePtr)(header->left ) ); }
- Iterator end() { return Iterator( header ); }
- ConstIterator begin() const { return ConstIterator( (NodePtr)(header->left ) ); }
- ConstIterator end() const { return ConstIterator( header ); }
-
- ConstIterator find(const Key& k) const {
- QMapNodeBase* y = header; // Last node
- QMapNodeBase* x = header->parent; // Root node.
-
- while ( x != 0 ) {
- // If as k <= key(x) go left
- if ( !( key(x) < k ) ) {
- y = x;
- x = x->left;
- } else {
- x = x->right;
- }
- }
-
- // Was k bigger/smaller then the biggest/smallest
- // element of the tree ? Return end()
- if ( y == header || k < key(y) )
- return ConstIterator( header );
- return ConstIterator( (NodePtr)y );
- }
-
- void remove( Iterator it ) {
- NodePtr del = (NodePtr) removeAndRebalance( it.node, header->parent, header->left, header->right );
- delete del;
- --node_count;
- }
-
-#ifdef QT_QMAP_DEBUG
- void inorder( QMapNodeBase* x = 0, int level = 0 ){
- if ( !x )
- x = header->parent;
- if ( x->left )
- inorder( x->left, level + 1 );
- //cout << level << " Key=" << key(x) << " Value=" << ((NodePtr)x)->data << endl;
- if ( x->right )
- inorder( x->right, level + 1 );
- }
-#endif
-
- Iterator insertMulti(const Key& v){
- QMapNodeBase* y = header;
- QMapNodeBase* x = header->parent;
- while (x != 0){
- y = x;
- x = ( v < key(x) ) ? x->left : x->right;
- }
- return insert(x, y, v);
- }
-
- Iterator insertSingle( const Key& k ) {
- // Search correct position in the tree
- QMapNodeBase* y = header;
- QMapNodeBase* x = header->parent;
- bool result = TRUE;
- while ( x != 0 ) {
- result = ( k < key(x) );
- y = x;
- x = result ? x->left : x->right;
- }
- // Get iterator on the last not empty one
- Iterator j( (NodePtr)y );
- if ( result ) {
- // Smaller then the leftmost one ?
- if ( j == begin() ) {
- return insert(x, y, k );
- } else {
- // Perhaps daddy is the right one ?
- --j;
- }
- }
- // Really bigger ?
- if ( (j.node->key) < k )
- return insert(x, y, k );
- // We are going to replace a node
- return j;
- }
-
- Iterator insert( QMapNodeBase* x, QMapNodeBase* y, const Key& k ) {
- NodePtr z = new Node( k );
- if (y == header || x != 0 || k < key(y) ) {
- y->left = z; // also makes leftmost = z when y == header
- if ( y == header ) {
- header->parent = z;
- header->right = z;
- } else if ( y == header->left )
- header->left = z; // maintain leftmost pointing to min node
- } else {
- y->right = z;
- if ( y == header->right )
- header->right = z; // maintain rightmost pointing to max node
- }
- z->parent = y;
- z->left = 0;
- z->right = 0;
- rebalance( z, header->parent );
- ++node_count;
- return Iterator(z);
- }
-
-protected:
- /**
- * Helpers
- */
- const Key& key( QMapNodeBase* b ) const { return ((NodePtr)b)->key; }
-
- /**
- * Variables
- */
- NodePtr header;
-};
-
-
-template<class Key, class T>
-class Q_EXPORT QMap
-{
-public:
- /**
- * Typedefs
- */
- typedef QMapIterator< Key, T > Iterator;
- typedef QMapConstIterator< Key, T > ConstIterator;
- typedef T ValueType;
- typedef QMapPrivate< Key, T > Priv;
-
- /**
- * API
- */
- QMap() { sh = new QMapPrivate< Key, T >; }
- QMap( const QMap<Key,T>& m ) { sh = m.sh; sh->ref(); }
- ~QMap() { if ( sh->deref() ) delete sh; }
-
- QMap<Key,T>& operator= ( const QMap<Key,T>& m )
- { m.sh->ref(); if ( sh->deref() ) delete sh; sh = m.sh; return *this; }
-
- Iterator begin() { detach(); return sh->begin(); }
- Iterator end() { detach(); return sh->end(); }
- ConstIterator begin() const { return ((const Priv*)sh)->begin(); }
- ConstIterator end() const { return ((const Priv*)sh)->end(); }
-
- Iterator find ( const Key& k )
- { detach(); return Iterator( sh->find( k ).node ); }
- ConstIterator find ( const Key& k ) const
- { return sh->find( k ); }
- T& operator[] ( const Key& k ) {
- detach(); QMapNode<Key,T>* p = sh->find( k ).node;
- if ( p != sh->end().node ) return p->data;
- return insert( k, T() ).data(); }
- const T& operator[] ( const Key& k ) const
- { return sh->find( k ).data(); }
- bool contains ( const Key& k ) const
- { return find( k ) != end(); }
- //{ return sh->find( k ) != ((const Priv*)sh)->end(); }
-
- uint count() const { return sh->node_count; }
-
- bool isEmpty() const { return sh->node_count == 0; }
-
- Iterator insert( const Key& key, const T& value ) {
- detach();
- Iterator it = sh->insertSingle( key );
- it.data() = value;
- return it;
- }
-
- void remove( Iterator it ) { detach(); sh->remove( it ); }
- void remove( const Key& k ) {
- detach();
- Iterator it( sh->find( k ).node );
- if ( it != end() )
- sh->remove( it );
- }
-
- Iterator replace( const Key& k, const T& v ) {
- remove( k );
- return insert( k, v );
- }
-
- void clear() { if ( sh->count == 1 ) sh->clear(); else { sh->deref(); sh = new QMapPrivate<Key,T>; } }
-
-#if defined(Q_FULL_TEMPLATE_INSTANTIATION)
- bool operator==( const QMap<Key,T>& ) const { return FALSE; }
-#endif
-
-protected:
- /**
- * Helpers
- */
- void detach() { if ( sh->count > 1 ) { sh->deref(); sh = new QMapPrivate<Key,T>( sh ); } }
-
- Priv* sh;
-};
-
-
-#ifndef QT_NO_DATASTREAM
-template<class Key, class T>
-inline QDataStream& operator>>( QDataStream& s, QMap<Key,T>& m ) {
- m.clear();
- Q_UINT32 c;
- s >> c;
- for( Q_UINT32 i = 0; i < c; ++i ) {
- Key k; T t;
- s >> k >> t;
- m.insert( k, t );
- }
- return s;
-}
-
-
-template<class Key, class T>
-inline QDataStream& operator<<( QDataStream& s, const QMap<Key,T>& m ) {
- s << (Q_UINT32)m.count();
- QMapConstIterator<Key,T> it = m.begin();
- for( ; it != m.end(); ++it )
- s << it.key() << it.data();
- return s;
-}
-#endif
-
-#endif // QMAP_H
diff --git a/qtools/qmodules.h b/qtools/qmodules.h
deleted file mode 100644
index 08f0baf..0000000
--- a/qtools/qmodules.h
+++ /dev/null
@@ -1,11 +0,0 @@
-// These modules are licensed to you
-#define QT_MODULE_TOOLS
-#define QT_MODULE_KERNEL
-#define QT_MODULE_WIDGETS
-#define QT_MODULE_DIALOGS
-#define QT_MODULE_ICONVIEW
-#define QT_MODULE_WORKSPACE
-#define QT_MODULE_NETWORK
-#define QT_MODULE_CANVAS
-#define QT_MODULE_TABLE
-#define QT_MODULE_XML
diff --git a/qtools/qptrdict.doc b/qtools/qptrdict.doc
deleted file mode 100644
index bff6a15..0000000
--- a/qtools/qptrdict.doc
+++ /dev/null
@@ -1,486 +0,0 @@
-/****************************************************************************
-**
-**
-** QPtrDict and QPtrDictIterator 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.
-**
-**********************************************************************/
-
-
-/*****************************************************************************
- QPtrDict documentation
- *****************************************************************************/
-
-/*!
- \class QPtrDict qptrdict.h
- \brief The QPtrDict class is a template class that provides a dictionary based on \c void* keys.
-
- \ingroup collection
- \ingroup tools
-
- QPtrDict is implemented as a template class. Define a
- template instance QPtrDict\<X\> to create a dictionary that operates on
- pointers to X, or X*.
-
- A dictionary is a collection that associates an item with a key.
- The key is used for inserting and looking up an item. QPtrDict has
- \c void* keys.
-
- The dictionary has very fast insertion and lookup.
-
- Example:
- \code
- #include <qptrdict.h>
- #include <stdio.h>
-
- void main()
- {
- int *a = new int[12];
- int *b = new int[10];
- int *c = new int[18];
- int *d = new int[13];
-
- QPtrDict<char> dict; // maps void* -> char*
-
- dict.insert( a, "a is int[12]" ); // describe pointers
- dict.insert( b, "b is int[10]" );
- dict.insert( c, "c is int[18]" );
-
- printf( "%s\n", dict[a] ); // print descriptions
- printf( "%s\n", dict[b] );
- printf( "%s\n", dict[c] );
-
- if ( !dict[d] )
- printf( "d not in dictionary\n" );
- }
- \endcode
-
- Program output:
- \code
- a is int[12]
- b is int[10]
- c is int[18]
- d not in dictionary
- \endcode
-
- The dictionary in our example maps \c int* keys to \c char* items.
- QPtrDict implements the \link operator[] [] operator\endlink to lookup
- an item.
-
- QPtrDict is implemented by QGDict as a hash array with a fixed number of
- entries. Each array entry points to a singly linked list of buckets, in
- which the dictionary items are stored.
-
- When an item is inserted with a key, the key is converted (hashed) to
- an integer index into the hash array using the \c mod operation. The
- item is inserted before the first bucket in the list of buckets.
-
- Looking up an item is normally very fast. The key is again hashed to an
- array index. Then QPtrDict scans the list of buckets and returns the item
- found or null if the item was not found. You cannot insert null pointers
- into a dictionary.
-
- The size of the hash array is very important. In order to get good
- performance, you should use a suitably large \link primes.html prime
- number\endlink. Suitable means equal to or larger than the maximum
- expected number of dictionary items.
-
- Items with equal keys are allowed. When inserting two items with the
- same key, only the last inserted item will be visible (last in, first out)
- until it is removed.
-
- Example:
- \code
- #include <qptrdict.h>
- #include <stdio.h>
-
- void main()
- {
- QPtrDict<char> dict; // maps char* ==> char*
-
- double *ptr = new double[28];
- dict.insert( ptr, "first" );
- dict.insert( ptr, "second" );
-
- printf( "%s\n", dict[ptr] );
- dict.remove( ptr );
- printf( "%s\n", dict[ptr] );
- }
- \endcode
-
- Program output:
- \code
- second
- first
- \endcode
-
- The QPtrDictIterator class can traverse the dictionary contents, but only
- in an arbitrary order. Multiple iterators may independently traverse the
- same dictionary.
-
- Calling setAutoDelete(TRUE) for a dictionary tells it to delete items
- that are removed . The default is to not delete items when they are
- removed.
-
- When inserting an item into a dictionary, only the pointer is copied, not
- the item itself. This is called a shallow copy. It is possible to make the
- dictionary copy all of the item's data (known as a deep copy) when an
- item is inserted. insert() calls the virtual function
- QCollection::newItem() for the item to be inserted.
- Inherit a dictionary and reimplement it if you want deep copies.
-
- When removing a dictionary item, the virtual function
- QCollection::deleteItem() is called. QPtrDict's default implementation
- is to delete the item if auto-deletion is enabled.
-
- \sa QPtrDictIterator, QDict, QAsciiDict, QIntDict,
- \link collection.html Collection Classes\endlink
-*/
-
-
-/*!
- \fn QPtrDict::QPtrDict( int size )
- Constructs a dictionary using an internal hash array with the size
- \e size.
-
- Setting \e size to a suitably large \link primes.html prime number\endlink
- (equal to or greater than the expected number of entries) makes the hash
- distribution better and hence the loopup faster.
-*/
-
-/*!
- \fn QPtrDict::QPtrDict( const QPtrDict<type> &dict )
- Constructs a copy of \e dict.
-
- Each item in \e dict are inserted into this dictionary.
- Only the pointers are copied (shallow copy).
-*/
-
-/*!
- \fn QPtrDict::~QPtrDict()
- Removes all items from the dictionary and destroys it.
-
- All iterators that access this dictionary will be reset.
-
- \sa setAutoDelete()
-*/
-
-/*!
- \fn QPtrDict<type> &QPtrDict::operator=(const QPtrDict<type> &dict)
- Assigns \e dict to this dictionary and returns a reference to this
- dictionary.
-
- This dictionary is first cleared, then each item in \e dict is inserted
- into this dictionary.
- Only the pointers are copied (shallow copy), unless newItem() has been
- reimplemented().
-*/
-
-/*!
- \fn uint QPtrDict::count() const
- Returns the number of items in the dictionary.
- \sa isEmpty()
-*/
-
-/*!
- \fn uint QPtrDict::size() const
- Returns the size of the internal hash array (as specified in the
- constructor).
- \sa count()
-*/
-
-/*!
- \fn void QPtrDict::resize( uint newsize )
- Changes the size of the hashtable the \a newsize.
- The contents of the dictionary are preserved,
- but all iterators on the dictionary become invalid.
-*/
-
-/*!
- \fn bool QPtrDict::isEmpty() const
- Returns TRUE if the dictionary is empty, i.e. count() == 0. Returns FALSE
- otherwise.
- \sa count()
-*/
-
-/*!
- \fn void QPtrDict::insert( void *key, const type *item )
- Inserts the \e key with the \e item into the dictionary.
-
- The key does not have to be a unique dictionary key. If multiple items
- are inserted with the same key, only the last item will be visible.
-
- Null items are not allowed.
-
- \sa replace()
-*/
-
-/*!
- \fn void QPtrDict::replace( void *key, const type *item )
- Replaces an item which has a key equal to \e key with \e item.
-
- If the item does not already exist, it will be inserted.
-
- Null items are not allowed.
-
- Equivalent to:
- \code
- QPtrDict<char> dict;
- ...
- if ( dict.find(key) )
- dict.remove( key );
- dict.insert( key, item );
- \endcode
-
- If there are two or more items with equal keys, then the last inserted
- of these will be replaced.
-
- \sa insert()
-*/
-
-/*!
- \fn bool QPtrDict::remove( void *key )
- Removes the item associated with \e key from the dictionary.
- Returns TRUE if successful, or FALSE if the key does not exist in the
- dictionary.
-
- If there are two or more items with equal keys, then the last inserted
- of these will be removed.
-
- The removed item is deleted if \link QCollection::setAutoDelete()
- auto-deletion\endlink is enabled.
-
- All dictionary iterators that refer to the removed item will be set to
- point to the next item in the dictionary traversing order.
-
- \sa take(), clear(), setAutoDelete()
-*/
-
-/*!
- \fn type *QPtrDict::take( void *key )
- Takes the item associated with \e key out of the dictionary without
- deleting it (even if \link QCollection::setAutoDelete()
- auto-deletion\endlink is enabled).
-
- If there are two or more items with equal keys, then the last inserted
- of these will be taken.
-
- Returns a pointer to the item taken out, or null if the key does not
- exist in the dictionary.
-
- All dictionary iterators that refer to the taken item will be set to
- point to the next item in the dictionary traversing order.
-
- \sa remove(), clear(), setAutoDelete()
-*/
-
-/*!
- \fn void QPtrDict::clear()
- Removes all items from the dictionary.
-
- The removed items are deleted if \link QCollection::setAutoDelete()
- auto-deletion\endlink is enabled.
-
- All dictionary iterators that access this dictionary will be reset.
-
- \sa remove(), take(), setAutoDelete()
-*/
-
-/*!
- \fn type *QPtrDict::find( void *key ) const
- Returns the item associated with \e key, or null if the key does not
- exist in the dictionary.
-
- This function uses an internal hashing algorithm to optimize lookup.
-
- If there are two or more items with equal keys, then the last inserted
- of these will be found.
-
- Equivalent to the [] operator.
-
- \sa operator[]()
-*/
-
-/*!
- \fn type *QPtrDict::operator[]( void *key ) const
- Returns the item associated with \e key, or null if the key does not
- exist in the dictionary.
-
- This function uses an internal hashing algorithm to optimize lookup.
-
- If there are two or more items with equal keys, then the last inserted
- of these will be found.
-
- Equivalent to the find() function.
-
- \sa find()
-*/
-
-/*!
- \fn void QPtrDict::statistics() const
- Debugging-only function that prints out the dictionary distribution
- using qDebug().
-*/
-
-
-/*****************************************************************************
- QPtrDictIterator documentation
- *****************************************************************************/
-
-/*!
- \class QPtrDictIterator qptrdict.h
- \brief The QPtrDictIterator class provides an iterator for QPtrDict collections.
-
- \ingroup collection
- \ingroup tools
-
- QPtrDictIterator is implemented as a template class.
- Define a template instance QPtrDictIterator\<X\> to create a
- dictionary iterator that operates on QPtrDict\<X\> (dictionary of X*).
-
- Example:
- \code
- #include <qptrdict.h>
- #include <stdio.h>
-
- void main()
- {
- int *a = new int[12];
- int *b = new int[10];
- int *c = new int[18];
- int *d = new int[13];
-
- QPtrDict<char> dict; // maps void* -> char*
-
- dict.insert( a, "a is int[12]" ); // describe pointers
- dict.insert( b, "b is int[10]" );
- dict.insert( c, "c is int[18]" );
-
- QPtrDictIterator<char> it( dict ); // iterator for dict
-
- while ( it.current() ) {
- printf( "%x -> %s\n", it.currentKey(), it.current() );
- ++it;
- }
- }
- \endcode
-
- Program output:
- \code
- 804a788 -> a is int[12]
- 804a7f0 -> c is int[18]
- 804a7c0 -> b is int[10]
- \endcode
-
- Note that the traversal order is arbitrary, you are not guaranteed the
- order above.
-
- Multiple iterators may independently traverse the same dictionary.
- A QPtrDict knows about all iterators that are operating on the dictionary.
- When an item is removed from the dictionary, QPtrDict update all
- iterators that are referring the removed item to point to the next item
- in the traversing order.
-
- \sa QPtrDict, \link collection.html Collection Classes\endlink
-*/
-
-/*!
- \fn QPtrDictIterator::QPtrDictIterator( const QPtrDict<type> &dict )
- Constructs an iterator for \e dict. The current iterator item is
- set to point on the first item in the \e dict.
-*/
-
-/*!
- \fn QPtrDictIterator::~QPtrDictIterator()
- Destroys the iterator.
-*/
-
-/*!
- \fn uint QPtrDictIterator::count() const
- Returns the number of items in the dictionary this iterator operates on.
- \sa isEmpty()
-*/
-
-/*!
- \fn bool QPtrDictIterator::isEmpty() const
- Returns TRUE if the dictionary is empty, i.e. count() == 0. Returns FALSE
- otherwise.
- \sa count()
-*/
-
-/*!
- \fn type *QPtrDictIterator::toFirst()
- Sets the current iterator item to point to the first item in the
- dictionary and returns a pointer to the item.
- If the dictionary is empty it sets the current item to null and
- returns null.
-*/
-
-/*!
- \fn QPtrDictIterator::operator type *() const
- Cast operator. Returns a pointer to the current iterator item.
- Same as current().
-*/
-
-/*!
- \fn type *QPtrDictIterator::current() const
- Returns a pointer to the current iterator item.
-*/
-
-/*!
- \fn void *QPtrDictIterator::currentKey() const
- Returns the key for the current iterator item.
-*/
-
-/*!
- \fn type *QPtrDictIterator::operator()()
- Makes the succeeding item current and returns the original current item.
-
- If the current iterator item was the last item in the dictionary or if it
- was null, null is returned.
-*/
-
-/*!
- \fn type *QPtrDictIterator::operator++()
- Prefix ++ makes the succeeding item current and returns the new current
- item.
-
- If the current iterator item was the last item in the dictionary or if it
- was null, null is returned.
-*/
-
-/*!
- \fn type *QPtrDictIterator::operator+=( uint jump )
- Sets the current item to the item \e jump positions after the current item,
- and returns a pointer to that item.
-
- If that item is beyond the last item or if the dictionary is empty,
- it sets the current item to null and returns null.
-*/
diff --git a/qtools/qptrdict.h b/qtools/qptrdict.h
deleted file mode 100644
index c075e30..0000000
--- a/qtools/qptrdict.h
+++ /dev/null
@@ -1,103 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QPtrDict template class
-**
-** Created : 970415
-**
-** 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 QPTRDICT_H
-#define QPTRDICT_H
-
-#ifndef QT_H
-#include "qgdict.h"
-#endif // QT_H
-
-
-template<class type> class Q_EXPORT QPtrDict : public QGDict
-{
-public:
- QPtrDict(int size=17) : QGDict(size,PtrKey,0,0) {}
- QPtrDict( const QPtrDict<type> &d ) : QGDict(d) {}
- ~QPtrDict() { clear(); }
- QPtrDict<type> &operator=(const QPtrDict<type> &d)
- { return (QPtrDict<type>&)QGDict::operator=(d); }
- uint count() const { return QGDict::count(); }
- uint size() const { return QGDict::size(); }
- bool isEmpty() const { return QGDict::count() == 0; }
- void insert( void *k, const type *d )
- { QGDict::look_ptr(k,(Item)d,1); }
- void replace( void *k, const type *d )
- { QGDict::look_ptr(k,(Item)d,2); }
- bool remove( void *k ) { return QGDict::remove_ptr(k); }
- type *take( void *k ) { return (type*)QGDict::take_ptr(k); }
- type *find( void *k ) const
- { return (type *)((QGDict*)this)->QGDict::look_ptr(k,0,0); }
- type *operator[]( void *k ) const
- { return (type *)((QGDict*)this)->QGDict::look_ptr(k,0,0); }
- void clear() { QGDict::clear(); }
- void resize( uint n ) { QGDict::resize(n); }
- void statistics() const { QGDict::statistics(); }
-private:
- void deleteItem( Item d );
-};
-
-#if defined(Q_DELETING_VOID_UNDEFINED)
-template<> inline void QPtrDict<void>::deleteItem( QCollection::Item )
-{
-}
-#endif
-
-template<class type> inline void QPtrDict<type>::deleteItem( QCollection::Item d )
-{
- if ( del_item ) delete (type *)d;
-}
-
-
-template<class type> class Q_EXPORT QPtrDictIterator : public QGDictIterator
-{
-public:
- QPtrDictIterator(const QPtrDict<type> &d) :QGDictIterator((QGDict &)d) {}
- ~QPtrDictIterator() {}
- uint count() const { return dict->count(); }
- bool isEmpty() const { return dict->count() == 0; }
- type *toFirst() { return (type *)QGDictIterator::toFirst(); }
- operator type *() const { return (type *)QGDictIterator::get(); }
- type *current() const { return (type *)QGDictIterator::get(); }
- void *currentKey() const { return QGDictIterator::getKeyPtr(); }
- type *operator()() { return (type *)QGDictIterator::operator()(); }
- type *operator++() { return (type *)QGDictIterator::operator++(); }
- type *operator+=(uint j) { return (type *)QGDictIterator::operator+=(j);}
-};
-
-
-#endif // QPTRDICT_H
diff --git a/qtools/qqueue.h b/qtools/qqueue.h
deleted file mode 100644
index 94bc130..0000000
--- a/qtools/qqueue.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QQueue template/macro class
-**
-** Created : 920917
-**
-** 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 QQUEUE_H
-#define QQUEUE_H
-
-#ifndef QT_H
-#include "qglist.h"
-#endif // QT_H
-
-
-template<class type> class QQueue : private QGList
-{
-public:
- QQueue() {}
- QQueue( const QQueue<type> &q ) : QGList(q) {}
- ~QQueue() { clear(); }
- QQueue<type>& operator=(const QQueue<type> &q)
- { return (QQueue<type>&)QGList::operator=(q); }
- bool autoDelete() const { return QCollection::autoDelete(); }
- void setAutoDelete( bool del ) { QCollection::setAutoDelete(del); }
- uint count() const { return QGList::count(); }
- bool isEmpty() const { return QGList::count() == 0; }
- void enqueue( const type *d ) { QGList::append(Item(d)); }
- type *dequeue() { return (type *)QGList::takeFirst();}
- bool remove() { return QGList::removeFirst(); }
- void clear() { QGList::clear(); }
- type *head() const { return (type *)QGList::cfirst(); }
- operator type *() const { return (type *)QGList::cfirst(); }
- type *current() const { return (type *)QGList::cfirst(); }
-private:
- void deleteItem( Item d ) { if ( del_item ) delete (type *)d; }
-};
-
-
-#endif // QQUEUE_H
diff --git a/qtools/qregexp.cpp b/qtools/qregexp.cpp
deleted file mode 100644
index 671867e..0000000
--- a/qtools/qregexp.cpp
+++ /dev/null
@@ -1,1091 +0,0 @@
-/****************************************************************************
-**
-**
-** Implementation of QRegExp class
-**
-** Created : 950126
-**
-** 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 "qregexp.h"
-#include <ctype.h>
-#include <stdlib.h>
-
-// NOT REVISED
-/*!
- \class QRegExp qregexp.h
- \ingroup tools
- \ingroup misc
- \brief The QRegExp class provides pattern matching using regular
- expressions or wildcards.
-
- QRegExp knows these regexp primitives:
- <ul plain>
- <li><dfn>c</dfn> matches the character 'c'
- <li><dfn>.</dfn> matches any character
- <li><dfn>^</dfn> matches start of input
- <li><dfn>$</dfn> matches end of input
- <li><dfn>[]</dfn> matches a defined set of characters - see below.
- <li><dfn>a*</dfn> matches a sequence of zero or more a's
- <li><dfn>a+</dfn> matches a sequence of one or more a's
- <li><dfn>a?</dfn> matches an optional a
- <li><dfn>\c</dfn> escape code for matching special characters such
- as \, [, *, +, . etc.
- <li><dfn>\t</dfn> matches the TAB character (9)
- <li><dfn>\n</dfn> matches newline (10)
- <li><dfn>\r</dfn> matches return (13)
- <li><dfn>\s</dfn> matches a white space (defined as any character
- for which QChar::isSpace() returns TRUE. This includes at least
- ASCII characters 9 (TAB), 10 (LF), 11 (VT), 12(FF), 13 (CR) and 32
- (Space)).
- <li><dfn>\d</dfn> matches a digit (defined as any character for
- which QChar::isDigit() returns TRUE. This includes at least ASCII
- characters '0'-'9').
- <li><dfn>\x1f6b</dfn> matches the character with unicode point U1f6b
- (hexadecimal 1f6b). \x0012 will match the ASCII/Latin1 character
- 0x12 (18 decimal, 12 hexadecimal).
- <li><dfn>\022</dfn> matches the ASCII/Latin1 character 022 (18
- decimal, 22 octal).
- </ul>
-
- In wildcard mode, it only knows four primitives:
- <ul plain>
- <li><dfn>c</dfn> matches the character 'c'
- <li><dfn>?</dfn> matches any character
- <li><dfn>*</dfn> matches any sequence of characters
- <li><dfn>[]</dfn> matches a defined set of characters - see below.
- </ul>
-
- QRegExp supports Unicode both in the pattern strings and in the
- strings to be matched.
-
- When writing regular expressions in C++ code, remember that C++
- processes \ characters. So in order to match e.g. a "." character,
- you must write "\\." in C++ source, not "\.".
-
- A character set matches a defined set of characters. For example,
- [BSD] matches any of 'B', 'D' and 'S'. Within a character set, the
- special characters '.', '*', '?', '^', '$', '+' and '[' lose their
- special meanings. The following special characters apply:
- <ul plain>
- <li><dfn>^</dfn> When placed first in the list, changes the
- character set to match any character \e not in the list. To include
- the character '^' itself in the set, escape it or place it anywhere
- but first.
- <li><dfn>-</dfn> Defines a range of characters. To include the
- character '-' itself in the set, escape it or place it last.
- <li><dfn>]</dfn> Ends the character set definition. To include the
- character ']' itself in the set, escape it or place it first (but
- after the negation operator '^', if present)
- </ul>
- Thus, [a-zA-Z0-9.] matches upper and lower case ASCII letters,
- digits and dot; and [^\s] matches everything except white space.
-
- \bug Case insensitive matching is not supported for non-ASCII/Latin1
- (non-8bit) characters. Any character with a non-zero QChar.row() is
- matched case sensitively even if the QRegExp is in case insensitive
- mode.
-
- \note In Qt 3.0, the language of regular expressions will contain
- five more special characters, namely '(', ')', '{', '|' and '}'. To
- ease porting, it's a good idea to escape these characters with a
- backslash in all the regular expressions you'll write from now on.
-*/
-
-
-//
-// The regexp pattern is internally represented as an array of uints,
-// each element containing an 16-bit character or a 32-bit code
-// (listed below). User-defined character classes (e.g. [a-zA-Z])
-// are encoded as this:
-// uint no: 1 2 3 ...
-// value: CCL | n from | to from | to
-//
-// where n is the (16-bit) number of following range definitions and
-// from and to define the ranges inclusive. from <= to is always true,
-// otherwise it is a built-in charclass (Pxx, eg \s - PWS). Single
-// characters in the class are coded as from==to. Negated classes
-// (e.g. [^a-z]) use CCN instead of CCL.
-
-const uint END = 0x00000000;
-const uint PWS = 0x10010000; // predef charclass: whitespace (\s)
-const uint PDG = 0x10020000; // predef charclass: digit (\d)
-const uint CCL = 0x20010000; // character class []
-const uint CCN = 0x20020000; // neg character class [^]
-const uint CHR = 0x40000000; // character
-const uint BOL = 0x80010000; // beginning of line ^
-const uint EOL = 0x80020000; // end of line $
-const uint BOW = 0x80030000; // beginning of word \<
-const uint EOW = 0x80040000; // end of word \>
-const uint ANY = 0x80050000; // any character .
-const uint CLO = 0x80070000; // Kleene closure *
-const uint OPT = 0x80080000; // Optional closure ?
-
-const uint MCC = 0x20000000; // character class bitmask
-const uint MCD = 0xffff0000; // code mask
-const uint MVL = 0x0000ffff; // value mask
-
-//
-// QRegExp::error codes (internal)
-//
-
-const int PatOk = 0; // pattern ok
-const int PatNull = 1; // no pattern defined
-const int PatSyntax = 2; // pattern syntax error
-const int PatOverflow = 4; // pattern too long
-
-
-/*****************************************************************************
- QRegExp member functions
- *****************************************************************************/
-
-/*!
- Constructs an empty regular expression.
-*/
-
-QRegExp::QRegExp()
-{
- rxdata = 0;
- cs = TRUE;
- wc = FALSE;
- error = PatOk;
-}
-
-/*!
- Constructs a regular expression.
-
- \arg \e pattern is the regular expression pattern string.
- \arg \e caseSensitive specifies whether or not to use case sensitive
- matching.
- \arg \e wildcard specifies whether the pattern string should be used for
- wildcard matching (also called globbing expression), normally used for
- matching file names.
-
- \sa setWildcard()
-*/
-
-QRegExp::QRegExp( const QString &pattern, bool caseSensitive, bool wildcard )
-{
- rxstring = pattern;
- rxdata = 0;
- cs = caseSensitive;
- wc = wildcard;
- compile();
-}
-
-/*!
- Constructs a regular expression which is a copy of \e r.
- \sa operator=(const QRegExp&)
-*/
-
-QRegExp::QRegExp( const QRegExp &r )
-{
- rxstring = r.pattern();
- rxdata = 0;
- cs = r.caseSensitive();
- wc = r.wildcard();
- compile();
-}
-
-/*!
- Destructs the regular expression and cleans up its internal data.
-*/
-
-QRegExp::~QRegExp()
-{
- if ( rxdata ) // Avoid purify complaints
- delete [] rxdata;
-}
-
-/*!
- Copies the regexp \e r and returns a reference to this regexp.
- The case sensitivity and wildcard options are copied, as well.
-*/
-
-QRegExp &QRegExp::operator=( const QRegExp &r )
-{
- rxstring = r.rxstring;
- cs = r.cs;
- wc = r.wc;
- compile();
- return *this;
-}
-
-/*!
- \obsolete
- Consider using setPattern() instead of this method.
-
- Sets the pattern string to \e pattern and returns a reference to this regexp.
- The case sensitivity or wildcard options do not change.
-*/
-
-QRegExp &QRegExp::operator=( const QString &pattern )
-{
- rxstring = pattern;
- compile();
- return *this;
-}
-
-
-/*!
- Returns TRUE if this regexp is equal to \e r.
-
- Two regexp objects are equal if they have equal pattern strings,
- case sensitivity options and wildcard options.
-*/
-
-bool QRegExp::operator==( const QRegExp &r ) const
-{
- return rxstring == r.rxstring && cs == r.cs && wc == r.wc;
-}
-
-/*!
- \fn bool QRegExp::operator!=( const QRegExp &r ) const
-
- Returns TRUE if this regexp is \e not equal to \e r.
-
- \sa operator==()
-*/
-
-/*!
- \fn bool QRegExp::isEmpty() const
- Returns TRUE if the regexp is empty.
-*/
-
-/*!
- \fn bool QRegExp::isValid() const
- Returns TRUE if the regexp is valid, or FALSE if it is invalid.
-
- The pattern "[a-z" is an example of an invalid pattern, since it lacks a
- closing bracket.
-*/
-
-
-/*!
- \fn bool QRegExp::wildcard() const
- Returns TRUE if wildcard mode is on, otherwise FALSE. \sa setWildcard().
-*/
-
-/*!
- Sets the wildcard option for the regular expression. The default
- is FALSE.
-
- Setting \e wildcard to TRUE makes it convenient to match filenames
- instead of plain text.
-
- For example, "qr*.cpp" matches the string "qregexp.cpp" in wildcard mode,
- but not "qicpp" (which would be matched in normal mode).
-
- \sa wildcard()
-*/
-
-void QRegExp::setWildcard( bool wildcard )
-{
- if ( wildcard != wc ) {
- wc = wildcard;
- compile();
- }
-}
-
-/*!
- \fn bool QRegExp::caseSensitive() const
-
- Returns TRUE if case sensitivity is enabled, otherwise FALSE. The
- default is TRUE.
-
- \sa setCaseSensitive()
-*/
-
-/*!
- Enables or disables case sensitive matching.
-
- In case sensitive mode, "a.e" matches "axe" but not "Axe".
-
- See also: caseSensitive()
-*/
-
-void QRegExp::setCaseSensitive( bool enable )
-{
- if ( cs != enable ) {
- cs = enable;
- compile();
- }
-}
-
-
-/*!
- \fn QString QRegExp::pattern() const
- Returns the pattern string of the regexp.
-*/
-
-
-/*!
- \fn void QRegExp::setPattern(const QString & pattern)
- Sets the pattern string to \a pattern and returns a reference to this regexp.
- The case sensitivity or wildcard options do not change.
-*/
-
-static inline bool iswordchar( int x )
-{
- return isalnum(x) || x == '_'; //# Only 8-bit support
-}
-
-
-/*!
- \internal
- Match character class
-*/
-
-static bool matchcharclass( uint *rxd, QChar c )
-{
- uint *d = rxd;
- uint clcode = *d & MCD;
- bool neg = clcode == CCN;
- if ( clcode != CCL && clcode != CCN)
- qWarning("QRegExp: Internal error, please report to qt-bugs@trolltech.com");
- uint numFields = *d & MVL;
- uint cval = (((uint)(c.row())) << 8) | ((uint)c.cell());
- bool found = FALSE;
- for ( int i = 0; i < (int)numFields; i++ ) {
- d++;
- if ( *d == PWS && c.isSpace() ) {
- found = TRUE;
- break;
- }
- if ( *d == PDG && c.isDigit() ) {
- found = TRUE;
- break;
- }
- else {
- uint from = ( *d & MCD ) >> 16;
- uint to = *d & MVL;
- if ( (cval >= from) && (cval <= to) ) {
- found = TRUE;
- break;
- }
- }
- }
- return neg ? !found : found;
-}
-
-
-
-/*
- Internal: Recursively match string.
-*/
-
-static int matchstring( uint *rxd, const QChar *str, uint strlength,
- const QChar *bol, bool cs )
-{
- const QChar *p = str;
- const QChar *start = p;
- uint pl = strlength;
- uint *d = rxd;
-
- //### in all cases here: handle pl == 0! (don't read past strlen)
- while ( *d ) {
- if ( *d & CHR ) { // match char
- if ( !pl )
- return -1;
- QChar c( *d );
- if ( !cs && !c.row() ) { // case insensitive, #Only 8bit
- if ( p->row() || tolower(p->cell()) != c.cell() )
- return -1;
- p++;
- pl--;
- } else { // case insensitive
- if ( *p != c )
- return -1;
- p++;
- pl--;
- }
- d++;
- }
- else if ( *d & MCC ) { // match char class
- if ( !pl )
- return -1;
- if ( !matchcharclass( d, *p ) )
- return -1;
- p++;
- pl--;
- d += (*d & MVL) + 1;
- }
- else switch ( *d++ ) {
- case PWS: // match whitespace
- if ( !pl || !p->isSpace() )
- return -1;
- p++;
- pl--;
- break;
- case PDG: // match digits
- if ( !pl || !p->isDigit() )
- return -1;
- p++;
- pl--;
- break;
- case ANY: // match anything
- if ( !pl )
- return -1;
- p++;
- pl--;
- break;
- case BOL: // match beginning of line
- if ( p != bol )
- return -1;
- break;
- case EOL: // match end of line
- if ( pl )
- return -1;
- break;
- case BOW: // match beginning of word
- if ( !iswordchar(*p) || (p > bol && iswordchar(*(p-1)) ) )
- return -1;
- break;
- case EOW: // match end of word
- if ( iswordchar(*p) || p == bol || !iswordchar(*(p-1)) )
- return -1;
- break;
- case CLO: // Kleene closure
- {
- const QChar *first_p = p;
- if ( *d & CHR ) { // match char
- QChar c( *d );
- if ( !cs && !c.row() ) { // case insensitive, #only 8bit
- while ( pl && !p->row() && tolower(p->cell())==c.cell() ) {
- p++;
- pl--;
- }
- }
- else { // case sensitive
- while ( pl && *p == c ) {
- p++;
- pl--;
- }
- }
- d++;
- }
- else if ( *d & MCC ) { // match char class
- while( pl && matchcharclass( d, *p ) ) {
- p++;
- pl--;
- }
- d += (*d & MVL) + 1;
- }
- else if ( *d == PWS ) {
- while ( pl && p->isSpace() ) {
- p++;
- pl--;
- }
- d++;
- }
- else if ( *d == PDG ) {
- while ( pl && p->isDigit() ) {
- p++;
- pl--;
- }
- d++;
- }
- else if ( *d == ANY ) {
- p += pl;
- pl = 0;
- d++;
- }
- else {
- return -1; // error
- }
- d++; // skip CLO's END
- while ( p >= first_p ) { // go backwards
- int end = matchstring( d, p, pl, bol, cs );
- if ( end >= 0 )
- return ( p - start ) + end;
- if ( !p )
- return -1;
- --p;
- ++pl;
- }
- }
- return -1;
- case OPT: // optional closure
- {
- const QChar *first_p = p;
- if ( *d & CHR ) { // match char
- QChar c( *d );
- if ( !cs && !c.row() ) { // case insensitive, #only 8bit
- if ( pl && !p->row() && tolower(p->cell()) == c.cell() ) {
- p++;
- pl--;
- }
- }
- else { // case sensitive
- if ( pl && *p == c ) {
- p++;
- pl--;
- }
- }
- d++;
- }
- else if ( *d & MCC ) { // match char class
- if ( pl && matchcharclass( d, *p ) ) {
- p++;
- pl--;
- }
- d += (*d & MVL) + 1;
- }
- else if ( *d == PWS ) {
- if ( pl && p->isSpace() ) {
- p++;
- pl--;
- }
- d++;
- }
- else if ( *d == PDG ) {
- if ( pl && p->isDigit() ) {
- p++;
- pl--;
- }
- d++;
- }
- else if ( *d == ANY ) {
- if ( pl ) {
- p++;
- pl--;
- }
- d++;
- }
- else {
- return -1; // error
- }
- d++; // skip OPT's END
- while ( p >= first_p ) { // go backwards
- int end = matchstring( d, p, pl, bol, cs );
- if ( end >= 0 )
- return ( p - start ) + end;
- if ( !p )
- return -1;
- --p;
- ++pl;
- }
- }
- return -1;
-
- default: // error
- return -1;
- }
- }
- return p - start;
-}
-
-
-/*!
- \internal
- Recursively match string.
-*/
-
-// This is obsolete now, but since it is protected (not private), it
-// is still implemented on the off-chance that somebody has made a
-// class derived from QRegExp and calls this directly.
-// Qt 3.0: Remove this?
-
-
-const QChar *QRegExp::matchstr( uint *rxd, const QChar *str, uint strlength,
- const QChar *bol ) const
-{
- int len = matchstring( rxd, str, strlength, bol, cs );
- if ( len < 0 )
- return 0;
- return str + len;
-}
-
-/*!
- Attempts to match in \e str, starting from position \e index.
- Returns the position of the match, or -1 if there was no match.
-
- If \e len is not a null pointer, the length of the match is stored in
- \e *len.
-
- If \e indexIsStart is TRUE (the default), the position \e index in
- the string will match the start-of-input primitive (^) in the
- regexp, if present. Otherwise, position 0 in \e str will match.
-
- Example:
- \code
- QRegExp r("[0-9]*\\.[0-9]+"); // matches floating point
- int len;
- r.match("pi = 3.1416", 0, &len); // returns 5, len == 6
- \endcode
-
- \note In Qt 3.0, this function will be replaced by find().
-*/
-
-int QRegExp::match( const QString &str, int index, int *len,
- bool indexIsStart ) const
-{
- if ( !isValid() || isEmpty() )
- return -1;
- if ( str.length() < (uint)index )
- return -1;
- const QChar *start = str.unicode();
- const QChar *p = start + index;
- uint pl = str.length() - index;
- uint *d = rxdata;
- int ep = -1;
-
- if ( *d == BOL ) { // match from beginning of line
- ep = matchstring( d, p, pl, indexIsStart ? p : start, cs );
- } else {
- if ( *d & CHR ) {
- QChar c( *d );
- if ( !cs && !c.row() ) { // case sensitive, # only 8bit
- while ( pl && ( p->row() || tolower(p->cell()) != c.cell() ) ) {
- p++;
- pl--;
- }
- } else { // case insensitive
- while ( pl && *p != c ) {
- p++;
- pl--;
- }
- }
- }
- while( 1 ) { // regular match
- ep = matchstring( d, p, pl, indexIsStart ? start+index : start, cs );
- if ( ep >= 0 )
- break;
- if ( !pl )
- break;
- p++;
- pl--;
- }
- }
- if ( len )
- *len = ep >= 0 ? ep : 0; // No match -> 0, for historical reasons
- return ep >= 0 ? (int)(p - start) : -1; // return index;
-}
-
-/*! \fn int QRegExp::find( const QString& str, int index )
-
- Attempts to match in \e str, starting from position \e index.
- Returns the position of the match, or -1 if there was no match.
-
- \sa match()
-*/
-
-//
-// Translate wildcard pattern to standard regexp pattern.
-// Ex: *.cpp ==> ^.*\.cpp$
-//
-
-static QString wc2rx( const QString &pattern )
-{
- int patlen = (int)pattern.length();
- QString wcpattern = QString::fromLatin1("^");
-
- QChar c;
- for( int i = 0; i < patlen; i++ ) {
- c = pattern[i];
- switch ( (char)c ) {
- case '*': // '*' ==> '.*'
- wcpattern += '.';
- break;
- case '?': // '?' ==> '.'
- c = '.';
- break;
- case '.': // quote special regexp chars
- case '+':
- case '\\':
- case '$':
- case '^':
- wcpattern += '\\';
- break;
- case '[':
- if ( (char)pattern[i+1] == '^' ) { // don't quote '^' after '['
- wcpattern += '[';
- c = pattern[i+1];
- i++;
- }
- break;
- }
- wcpattern += c;
-
- }
- wcpattern += '$';
- return wcpattern; // return new regexp pattern
-}
-
-
-//
-// Internal: Get char value and increment pointer.
-//
-
-static uint char_val( const QChar **str, uint *strlength ) // get char value
-{
- const QChar *p = *str;
- uint pl = *strlength;
- uint len = 1;
- uint v = 0;
- if ( (char)*p == '\\' ) { // escaped code
- p++;
- pl--;
- if ( !pl ) { // it is just a '\'
- (*str)++;
- (*strlength)--;
- return '\\';
- }
- len++; // length at least 2
- int i;
- char c;
- char ch = tolower((char)*p);
- switch ( ch ) {
- case 'b': v = '\b'; break; // bell
- case 'f': v = '\f'; break; // form feed
- case 'n': v = '\n'; break; // newline
- case 'r': v = '\r'; break; // return
- case 't': v = '\t'; break; // tab
- case 's': v = PWS; break; // whitespace charclass
- case 'd': v = PDG; break; // digit charclass
- case '<': v = BOW; break; // word beginning matcher
- case '>': v = EOW; break; // word ending matcher
-
- case 'x': { // hex code
- p++;
- pl--;
- for ( i = 0; (i < 4) && pl; i++ ) { //up to 4 hex digits
- c = tolower((char)*p);
- bool a = ( c >= 'a' && c <= 'f' );
- if ( (c >= '0' && c <= '9') || a ) {
- v <<= 4;
- v += a ? 10 + c - 'a' : c - '0';
- len++;
- }
- else {
- break;
- }
- p++;
- pl--;
- }
- }
- break;
-
- default: {
- if ( ch >= '0' && ch <= '7' ) { //octal code
- len--;
- for ( i = 0; (i < 3) && pl; i++ ) { // up to 3 oct digits
- c = (char)*p;
- if ( c >= '0' && c <= '7' ) {
- v <<= 3;
- v += c - '0';
- len++;
- }
- else {
- break;
- }
- p++;
- pl--;
- }
- }
- else { // not an octal number
- v = (((uint)(p->row())) << 8) | ((uint)p->cell());
- }
- }
- }
- } else {
- v = (((uint)(p->row())) << 8) | ((uint)p->cell());
- }
- *str += len;
- *strlength -= len;
- return v;
-}
-
-
-#if defined(DEBUG)
-static uint *dump( uint *p )
-{
- while ( *p != END ) {
- if ( *p & CHR ) {
- QChar uc = (QChar)*p;
- char c = (char)uc;
- uint u = (((uint)(uc.row())) << 8) | ((uint)uc.cell());
- qDebug( "\tCHR\tU%04x (%c)", u, (c ? c : ' '));
- p++;
- }
- else if ( *p & MCC ) {
- uint clcode = *p & MCD;
- uint numFields = *p & MVL;
- if ( clcode == CCL )
- qDebug( "\tCCL\t%i", numFields );
- else if ( clcode == CCN )
- qDebug( "\tCCN\t%i", numFields );
- else
- qDebug("coding error!");
- for ( int i = 0; i < (int)numFields; i++ ) {
- p++;
- if ( *p == PWS )
- qDebug( "\t\tPWS" );
- else if ( *p == PDG )
- qDebug( "\t\tPDG" );
- else {
- uint from = ( *p & MCD ) >> 16;
- uint to = *p & MVL;
- char fc = (char)QChar(from);
- char tc = (char)QChar(to);
- qDebug( "\t\tU%04x (%c) - U%04x (%c)", from,
- (fc ? fc : ' '), to, (tc ? tc : ' ') );
- }
- }
- p++;
- }
- else switch ( *p++ ) {
- case PWS:
- qDebug( "\tPWS" );
- break;
- case PDG:
- qDebug( "\tPDG" );
- break;
- case BOL:
- qDebug( "\tBOL" );
- break;
- case EOL:
- qDebug( "\tEOL" );
- break;
- case BOW:
- qDebug( "\tBOW" );
- break;
- case EOW:
- qDebug( "\tEOW" );
- break;
- case ANY:
- qDebug( "\tANY" );
- break;
- case CLO:
- qDebug( "\tCLO" );
- p = dump( p );
- break;
- case OPT:
- qDebug( "\tOPT" );
- p = dump( p );
- break;
- }
- }
- qDebug( "\tEND" );
- return p+1;
-}
-#endif // DEBUG
-
-
-static const int maxlen = 1024; // max length of regexp array
-static uint rxarray[ maxlen ]; // tmp regexp array
-
-/*!
- \internal
- Compiles the regular expression and stores the result in rxdata.
- The 'error' flag is set to non-zero if an error is detected.
- NOTE! This function is not reentrant!
-*/
-
-void QRegExp::compile()
-{
- if ( rxdata ) { // delete old data
- delete [] rxdata;
- rxdata = 0;
- }
- if ( rxstring.isEmpty() ) { // no regexp pattern set
- error = PatNull;
- return;
- }
-
- error = PatOk; // assume pattern is ok
-
- QString pattern;
- if ( wc )
- pattern = wc2rx(rxstring);
- else
- pattern = rxstring;
- const QChar *start = pattern.unicode(); // pattern pointer
- const QChar *p = start; // pattern pointer
- uint pl = pattern.length();
- uint *d = rxarray; // data pointer
- uint *prev_d = 0;
-
-#define GEN(x) *d++ = (x)
-
- while ( pl ) {
- char ch = (char)*p;
- switch ( ch ) {
-
- case '^': // beginning of line
- prev_d = d;
- GEN( p == start ? BOL : (CHR | ch) );
- p++;
- pl--;
- break;
-
- case '$': // end of line
- prev_d = d;
- GEN( pl == 1 ? EOL : (CHR | ch) );
- p++;
- pl--;
- break;
-
- case '.': // any char
- prev_d = d;
- GEN( ANY );
- p++;
- pl--;
- break;
-
- case '[': // character class
- {
- prev_d = d;
- p++;
- pl--;
- if ( !pl ) {
- error = PatSyntax;
- return;
- }
- bool firstIsEscaped = ( (char)*p == '\\' );
- uint cch = char_val( &p, &pl );
- if ( cch == '^' && !firstIsEscaped ) { // negate!
- GEN( CCN );
- if ( !pl ) {
- error = PatSyntax;
- return;
- }
- cch = char_val( &p, &pl );
- } else {
- GEN( CCL );
- }
- uint numFields = 0;
- while ( pl ) {
- if ((pl>2) && ((char)*p == '-') && ((char)*(p+1) != ']')) {
- // Found a range
- char_val( &p, &pl ); // Read the '-'
- uint cch2 = char_val( &p, &pl ); // Read the range end
- if ( cch > cch2 ) { // swap start and stop
- int tmp = cch;
- cch = cch2;
- cch2 = tmp;
- }
- GEN( (cch << 16) | cch2 ); // from < to
- numFields++;
- }
- else {
- // Found a single character
- if ( cch & MCD ) // It's a code; will not be mistaken
- GEN( cch ); // for a range, since from > to
- else
- GEN( (cch << 16) | cch ); // from == to range
- numFields++;
- }
- if ( d >= rxarray + maxlen ) { // pattern too long
- error = PatOverflow;
- return;
- }
- if ( !pl ) { // At least ']' should be left
- error = PatSyntax;
- return;
- }
- bool nextIsEscaped = ( (char)*p == '\\' );
- cch = char_val( &p, &pl );
- if ( cch == (uint)']' && !nextIsEscaped )
- break;
- if ( !pl ) { // End, should have seen ']'
- error = PatSyntax;
- return;
- }
- }
- *prev_d |= numFields; // Store number of fields
- }
- break;
-
- case '*': // Kleene closure, or
- case '+': // positive closure, or
- case '?': // optional closure
- {
- if ( prev_d == 0 ) { // no previous expression
- error = PatSyntax; // empty closure
- return;
- }
- switch ( *prev_d ) { // test if invalid closure
- case BOL:
- case BOW:
- case EOW:
- case CLO:
- case OPT:
- error = PatSyntax;
- return;
- }
- int ddiff = d - prev_d;
- if ( *p == '+' ) { // convert to Kleene closure
- if ( d + ddiff >= rxarray + maxlen ) {
- error = PatOverflow; // pattern too long
- return;
- }
- memcpy( d, prev_d, ddiff*sizeof(uint) );
- d += ddiff;
- prev_d += ddiff;
- }
- memmove( prev_d+1, prev_d, ddiff*sizeof(uint) );
- *prev_d = ch == '?' ? OPT : CLO;
- d++;
- GEN( END );
- p++;
- pl--;
- }
- break;
-
- default:
- {
- prev_d = d;
- uint cv = char_val( &p, &pl );
- if ( cv & MCD ) { // It's a code
- GEN( cv );
- }
- else {
- if ( !cs && cv <= 0xff ) // #only 8bit support
- cv = tolower( cv );
- GEN( CHR | cv );
- }
- }
- }
- if ( d >= rxarray + maxlen ) { // oops!
- error = PatOverflow; // pattern too long
- return;
- }
- }
- GEN( END );
- int len = d - rxarray;
- rxdata = new uint[ len ]; // copy from rxarray to rxdata
- CHECK_PTR( rxdata );
- memcpy( rxdata, rxarray, len*sizeof(uint) );
-#if defined(DEBUG)
- //dump( rxdata ); // uncomment this line for debugging
-#endif
-}
diff --git a/qtools/qregexp.h b/qtools/qregexp.h
deleted file mode 100644
index 25868ce..0000000
--- a/qtools/qregexp.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QRegExp class
-**
-** Created : 950126
-**
-** 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 QREGEXP_H
-#define QREGEXP_H
-
-#ifndef QT_H
-#include "qstring.h"
-#endif // QT_H
-
-
-class Q_EXPORT QRegExp
-{
-public:
- QRegExp();
- QRegExp( const QString &, bool caseSensitive=TRUE, bool wildcard=FALSE );
- QRegExp( const QRegExp & );
- ~QRegExp();
- QRegExp &operator=( const QRegExp & );
- QRegExp &operator=( const QString &pattern );
-
- bool operator==( const QRegExp & ) const;
- bool operator!=( const QRegExp &r ) const
- { return !(this->operator==(r)); }
-
- bool isEmpty() const { return rxdata == 0; }
- bool isValid() const { return error == 0; }
-
- bool caseSensitive() const { return cs; }
- void setCaseSensitive( bool );
-
- bool wildcard() const { return wc; }
- void setWildcard( bool );
-
- QString pattern() const { return rxstring; }
- // ### in Qt 3.0, provide a real implementation
- void setPattern( const QString& pattern )
- { operator=( pattern ); }
-
- int match( const QString &str, int index=0, int *len=0,
- bool indexIsStart = TRUE ) const;
- int find( const QString& str, int index )
- { return match( str, index ); }
-
-protected:
- void compile();
- const QChar *matchstr( uint *, const QChar *, uint, const QChar * ) const;
-
-private:
- QString rxstring; // regular expression pattern
- uint *rxdata; // compiled regexp pattern
- int error; // error status
- bool cs; // case sensitive
- bool wc; // wildcard
-};
-
-
-#endif // QREGEXP_H
diff --git a/qtools/qshared.h b/qtools/qshared.h
deleted file mode 100644
index 79fab7b..0000000
--- a/qtools/qshared.h
+++ /dev/null
@@ -1,55 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QShared struct
-**
-** Created : 940112
-**
-** 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 QSHARED_H
-#define QSHARED_H
-
-#ifndef QT_H
-#include "qglobal.h"
-#endif // QT_H
-
-
-struct QShared
-{
- QShared() { count = 1; }
- void ref() { count++; }
- bool deref() { return !--count; }
- uint count;
-};
-
-
-#endif // QSHARED_H
diff --git a/qtools/qsortedlist.doc b/qtools/qsortedlist.doc
deleted file mode 100644
index 6f16f19..0000000
--- a/qtools/qsortedlist.doc
+++ /dev/null
@@ -1,94 +0,0 @@
-/****************************************************************************
-**
-**
-** QSortedList 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.
-**
-**********************************************************************/
-
-
-/*****************************************************************************
- QSortedList documentation
- *****************************************************************************/
-
-/*!
- \class QSortedList qsortedlist.h
- \brief The QSortedList class provides a list sorted by operator< and operator==
-
- \ingroup collection
- \ingroup tools
-
- If you want to sort a QList you have to reimplement the
- QGList::compareItems() method. If the elements of your list support
- operator<() and operator==() then you can use QSortedList instead.
- Its compareItems() calls operator<() and operator==() and returns an
- appropriate result.
-
- Otherwise, this is as QList.
-
- \sa QList, \link collection.html Collection Classes\endlink
-*/
-
-
-/*!
- \fn QSortedList::QSortedList()
- Constructs an empty list.
-*/
-
-/*!
- \fn QSortedList::QSortedList( const QSortedList<type> &list )
- Constructs a copy of \e list.
-
- Each item in \e list is copied to this new list.
-*/
-
-/*!
- \fn QSortedList::~QSortedList()
- Removes all items from the list and destroys the list.
-
- All list iterators that access this list will be reset.
-*/
-
-/*!
- \fn QSortedList<type>& QSortedList::operator=(const QSortedList<type>& list)
- Assigns \e list to this list and returns a reference to this list.
-
- This list is first cleared, then each item in \e list is
- appended to this list. Only the pointers are copied
- (shallow copy), unless newItem() has been reimplemented().
-*/
-
-/*!
- \fn int QSortedList::compareItems( QCollection::Item s1, QCollection::Item s2 )
-
- \reimp
-
- This reimplementation uses operator< and operator== to compare.
-*/
diff --git a/qtools/qsortedlist.h b/qtools/qsortedlist.h
deleted file mode 100644
index aeadd90..0000000
--- a/qtools/qsortedlist.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QList template/macro class
-**
-** Created : 920701
-**
-** 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 QSORTEDLIST_H
-#define QSORTEDLIST_H
-
-#ifndef QT_H
-#include "qlist.h"
-#endif // QT_H
-
-
-template<class type> class Q_EXPORT QSortedList : public QList<type>
-{
-public:
- QSortedList() {}
- QSortedList( const QSortedList<type> &l ) : QList<type>(l) {}
- ~QSortedList() { clear(); }
- QSortedList<type> &operator=(const QSortedList<type> &l)
- { return (QSortedList<type>&)QList<type>::operator=(l); }
-
- virtual int compareItems( QCollection::Item s1, QCollection::Item s2 )
- { if ( *((type*)s1) == *((type*)s2) ) return 0; return ( *((type*)s1) < *((type*)s2) ? -1 : 1 ); }
-};
-
-#endif
diff --git a/qtools/qstack.doc b/qtools/qstack.doc
deleted file mode 100644
index ece1e2a..0000000
--- a/qtools/qstack.doc
+++ /dev/null
@@ -1,135 +0,0 @@
-/****************************************************************************
-**
-**
-** QStack 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.
-**
-**********************************************************************/
-
-
-/*****************************************************************************
- QStack documentation
- *****************************************************************************/
-
-/*!
- \class QStack qstack.h
- \brief The QStack class is a template class that provides a stack.
-
- \ingroup collection
- \ingroup tools
-
- QStack is implemented as a template class. Define a template
- instance QStack\<X\> to create a stack that operates on pointers to
- X, or X*.
-
- A stack is a Last In, First Out (LIFO) structure. Items are added to
- the top of the stack with push() and retrieved from the top
- with pop().
-
- \sa \link collection.html Collection Classes\endlink
-*/
-
-/*! \fn QStack::QStack ()
- Creates and empty stack.
-*/
-
-/*! \fn QStack::QStack (const QStack<type>& s)
- Creates a stack by making a shallow copy of another stack.
-*/
-
-/*! \fn QStack::~QStack ()
- Destroys the stack. All items will be deleted if autoDelete() is TRUE.
-*/
-
-/*! \fn QStack<type>& QStack::operator= (const QStack<type>& s)
- Sets the contents of this stack by making a shallow copy of another stack.
- Elements currently in this stack will be deleted if autoDelete() is TRUE.
-*/
-
-/*! \fn bool QStack::isEmpty () const
- Returns TRUE is the stack contains no elements to be \link pop() popped\endlink.
-*/
-
-/*! \fn void QStack::push (const type* d)
- Adds an element to the top of the stack. Last in, first out.
-*/
-
-/*! \fn type* QStack::pop ()
- Removes the top item from the stack and returns it.
-*/
-
-/*! \fn bool QStack::remove ()
- Removes the top item from the stack and deletes it if
- autoDelete() is TRUE. Returns TRUE if there was an item to pop.
-
- \sa clear()
-*/
-
-/*! \fn void QStack::clear()
- Removes all items from the stack, deleting them if
- autoDelete() is TRUE.
-
- \sa remove()
-*/
-
-/*! \fn uint QStack::count() const
- Returns the number of items in the stack.
-
- \sa isEmpty()
-*/
-
-/*! \fn type* QStack::top () const
- Returns a reference to the top item on the stack (most recently pushed).
- The stack is not changed.
-*/
-
-/*! \fn QStack::operator type* ()const
- Returns a reference to the top item on the stack (most recently pushed).
- The stack is not changed.
-*/
-
-/*! \fn type* QStack::current () const
- Returns a reference to the top item on the stack (most recently pushed).
- The stack is not changed.
-*/
-
-/*! \fn bool QStack::autoDelete() const
-
- The same as QCollection::autoDelete().
-
- \sa setAutoDelete()
-*/
-
-/*! \fn void QStack::setAutoDelete( bool enable )
-
- The same as QCollection::setAutoDelete().
-
- \sa autoDelete()
-*/
diff --git a/qtools/qstack.h b/qtools/qstack.h
deleted file mode 100644
index c23215c..0000000
--- a/qtools/qstack.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QStack template/macro class
-**
-** Created : 920917
-**
-** 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 QSTACK_H
-#define QSTACK_H
-
-#ifndef QT_H
-#include "qglist.h"
-#endif // QT_H
-
-
-template<class type> class QStack : private QGList
-{
-public:
- QStack() {}
- QStack( const QStack<type> &s ) : QGList(s) {}
- ~QStack() { clear(); }
- QStack<type> &operator=(const QStack<type> &s)
- { return (QStack<type>&)QGList::operator=(s); }
- bool autoDelete() const { return QCollection::autoDelete(); }
- void setAutoDelete( bool del ) { QCollection::setAutoDelete(del); }
- uint count() const { return QGList::count(); }
- bool isEmpty() const { return QGList::count() == 0; }
- void push( const type *d ) { QGList::insertAt(0,Item(d)); }
- type *pop() { return (type *)QGList::takeFirst(); }
- bool remove() { return QGList::removeFirst(); }
- void clear() { QGList::clear(); }
- type *top() const { return (type *)QGList::cfirst(); }
- operator type *() const { return (type *)QGList::cfirst(); }
- type *current() const { return (type *)QGList::cfirst(); }
-private:
- void deleteItem( Item d ) { if ( del_item ) delete (type *)d; }
-};
-
-
-#endif // QSTACK_H
diff --git a/qtools/qstring.cpp b/qtools/qstring.cpp
deleted file mode 100644
index e073168..0000000
--- a/qtools/qstring.cpp
+++ /dev/null
@@ -1,15222 +0,0 @@
-/****************************************************************************
-**
-**
-** Implementation of the QString class and related Unicode functions
-**
-** Created : 920722
-**
-** 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.
-**
-**********************************************************************/
-
-// Don't define it while compiling this module, or USERS of Qt will
-// not be able to link.
-#ifdef QT_NO_CAST_ASCII
-#undef QT_NO_CAST_ASCII
-#endif
-
-#include "qstring.h"
-#include "qregexp.h"
-#include "qdatastream.h"
-#include "qtextcodec.h"
-#include "qstack.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <ctype.h>
-#include <limits.h>
-
-
-/* -------------------------------------------------------------------------
- * unicode information
- * these tables are generated from the unicode reference file
- * ftp://ftp.unicode.org/Public/3.0-Update/UnicodeData-3.0.0.html
- *
- * Lars Knoll <knoll@mpi-hd.mpg.de>
- * -------------------------------------------------------------------------
- */
-
-/* Perl script to generate (run perl -x tools/qstring.cpp)
-
-#!perl
-
-sub numberize
-{
- my(%r, $n, $id);
- for $id ( @_ ) {
- $id="" if $id eq "EMPTY";
- $r{$id}=$n++;
- }
- return %r;
-}
-
-
-# Code to integer mappings...
-#
-%category_code = numberize(qw{
- EMPTY
- Mn Mc Me
- Nd Nl No
- Zs Zl Zp
- Cc Cf Cs Co Cn
-
- Lu Ll Lt Lm Lo
- Pc Pd Ps Pe Pi Pf Po
- Sm Sc Sk So
-});
-%bidi_category_code = numberize(qw{
- L R EN ES ET AN CS B S WS ON LRE LRO AL RLE RLO PDF NSM BN});
-%character_decomposition_tag = numberize(qw{
- <single> <canonical> <font> <noBreak> <initial> <medial>
- <final> <isolated> <circle> <super> <sub> <vertical>
- <wide> <narrow> <small> <square> <compat> <fraction>
-});
-%mirrored_code = numberize(qw{N Y});
-
-%joining_code = numberize(qw{U D R C});
-
-# Read data into hashes...
-#
-open IN, "UnicodeData.txt";
-$position = 1;
-while (<IN>) {
- @fields = split /;/;
- $code = shift @fields;
- for $n (qw{
- name category combining_class bidi_category
- character_decomposition decimal_digit_value digit_value
- numeric_value mirrored oldname comment
- uppercase lowercase titlecase})
- {
- $id = shift @fields;
- $codes = "${n}_code";
- if ( defined %$codes && defined $$codes{$id} ) {
- $id = $$codes{$id};
- }
- ${$n}{$code}=$id;
- }
- $decomp = $character_decomposition{$code};
- if ( length $decomp == 0 ) {
- $decomp = "<single>";
- }
- if (substr($decomp, 0, 1) ne '<') {
- $decomp = "<canonical> " . $decomp;
- }
- @fields = split(" ", $decomp);
- $tag = shift @fields;
- $tag = $character_decomposition_tag{$tag};
- $decomp = join( ", 0x", @fields );
- $decomp = "0x".$decomp;
- $decomposition{$code} = $decomp;
- $decomposition_tag{$code} = $tag;
- $decomposition_pos{$code} = $position;
- $len = scalar(@fields);
- $decomposition_len{$code} = $len;
-
-# we use canonical decompositions longer than 1 char
-# and all arabic ligatures for the ligature table
- if(($len > 1 and $tag == 1) or ($tag > 3 and $tag < 8)) {
-# ligature to add...
- $start = shift @fields;
- $ligature{$start} = $ligature{$start}." ".$code;
- }
-
-# adjust position
- if($len != 0) {
- $position += $len + 3;
- }
-
-
-}
-
-open IN2, "ArabicShaping.txt";
-$position = 1;
-while (<IN2>) {
- @fields = split /;/;
- $code = shift @fields;
- $dummy = shift @fields;
- $join = shift @fields;
- $join =~ s/ //g;
- $join = $joining_code{$join};
- $joining{$code}=$join;
-}
-
-# Build pages...
-#
-$rowtable_txt =
- "static const Q_UINT8 * const unicode_info[256] = {";
-for $row ( 0..255 ) {
- $nonzero=0;
- $txt = "";
- for $cell ( 0..255 ) {
- $code = sprintf("%02X%02X",$row,$cell);
- $info = $category{$code};
- $info = 0 if !defined $info;
- $txt .= "\n " if $cell%8 == 0;
- $txt .= "$info, ";
- }
- $therow = $row{$txt};
- if ( !defined $therow ) {
- $size+=256;
- $therow = "ui_".sprintf("%02X",$row);
- $rowtext{$therow} =
- "static const Q_UINT8 ${therow}[] = {$txt\n};\n\n";
- $row{$txt}=$therow;
- }
- $rowtable_txt .= "\n " if $row%8 == 0;
- $rowtable_txt .= "$therow, ";
-}
-
-print "// START OF GENERATED DATA\n\n";
-print "#ifndef QT_NO_UNICODETABLES\n\n";
-
-# Print pages...
-#
-for $r ( sort keys %rowtext ) {
- print $rowtext{$r};
-}
-print "$rowtable_txt\n};\n";
-$size += 256*4;
-print "// $size bytes\n\n";
-
-# Build decomposition tables
-#
-$rowtable_txt =
- "static const Q_UINT16 * const decomposition_info[256] = {";
-$table_txt =
- "static const Q_UINT16 decomposition_map[] = {\n 0,\n";
-for $row ( 0..255 ) {
- $nonzero=0;
- $txt = "";
- for $cell ( 0..255 ) {
- $code = sprintf("%02X%02X",$row,$cell);
- $txt .= "\n " if $cell%8 == 0;
- if( $decomposition_tag{$code} != 0 ) {
- $txt .= " $decomposition_pos{$code},";
- $table_txt .= " $decomposition_tag{$code},";
- $table_txt .= " 0x$code,";
- $table_txt .= " $decomposition{$code}, 0,\n";
- $size += 2 * $decomposition_len{$code} + 6;
- } else {
- $txt .= " 0,";
- }
- }
- $therow = $row{$txt};
- if ( !defined $therow ) {
- $size+=512;
- $therow = "di_".sprintf("%02X",$row);
- $dec_rowtext{$therow} =
- "static const Q_UINT16 ${therow}[] = {$txt\n};\n\n";
- $row{$txt}=$therow;
- }
- $rowtable_txt .= "\n " if $row%8 == 0;
- $rowtable_txt .= "$therow, ";
-}
-
-# Print decomposition tables
-#
-print "$table_txt\n};\n\n";
-for $r ( sort keys %dec_rowtext ) {
- print $dec_rowtext{$r};
-}
-print "$rowtable_txt\n};\n";
-$size += 256*4;
-print "// $size bytes\n\n";
-
-
-# build ligature tables
-#
-$size = 0;
-$position = 1;
-$rowtable_txt =
- "static const Q_UINT16 * const ligature_info[256] = {";
-$table_txt =
- "static const Q_UINT16 ligature_map[] = {\n 0,\n";
-for $lig_row ( 0..255 ) {
- $nonzero=0;
- $txt = "";
- for $cell ( 0..255 ) {
- $code = sprintf("%02X%02X",$lig_row,$cell);
- $txt .= "\n " if $cell%8 == 0;
- if( defined $ligature{$code} ) {
- $txt .= " $position,";
- @ligature = split(" ", $ligature{$code});
-# we need to sort ligatures according to their length.
-# long ones have to come first!
- @ligature_sort = sort { $decomposition_len{$b} <=> $decomposition_len{$a} } @ligature;
-# now replace each code by it's position in
-# the decomposition map.
- undef(@lig_pos);
- for $n (@ligature_sort) {
- push(@lig_pos, $decomposition_pos{$n});
- }
-# debug info
- if( 0 ) {
- print "ligatures: $ligature{$code}\n";
- $sort = join(" ", @ligature_sort);
- print "sorted : $sort\n";
- }
- $lig = join(", ", @lig_pos);
- $table_txt .= " $lig, 0,\n";
- $size += 2 * scalar(@ligature) + 2;
- $position += scalar(@ligature) + 1;
- } else {
- $txt .= " 0,";
- }
- }
- $therow = $lig_row{$txt};
- if ( !defined $therow ) {
- $size+=512;
- $therow = "li_".sprintf("%02X",$lig_row);
- $lig_rowtext{$therow} =
- "static const Q_UINT16 ${therow}[] = {$txt\n};\n\n";
- $lig_row{$txt}=$therow;
- }
- $rowtable_txt .= "\n " if $lig_row%8 == 0;
- $rowtable_txt .= "$therow, ";
-}
-
-# Print ligature tables
-#
-print "$table_txt\n};\n\n";
-for $r ( sort keys %lig_rowtext ) {
- print $lig_rowtext{$r};
-}
-print "$rowtable_txt\n};\n";
-$size += 256*4;
-print "// $size bytes\n\n";
-
-
-
-# Build direction/joining/mirrored pages...
-#
-$rowtable_txt =
- "static const Q_UINT8 * const direction_info[256] = {";
-for $dir_row ( 0..255 ) {
- $nonzero=0;
- $txt = "";
- for $cell ( 0..255 ) {
- $code = sprintf("%02X%02X",$dir_row,$cell);
- $dir = $bidi_category{$code};
- $dir = 0 if !defined $dir;
- $join = $joining{$code};
- $join = 0 if !defined $join;
- $mirr = $mirrored{$code};
- $mirr = 0 if !defined $mirr;
- $info = $dir + 32*$join + 128*$mirr;
- $txt .= "\n " if $cell%8 == 0;
- $txt .= "$info, ";
- }
- $therow = $dir_row{$txt};
- if ( !defined $therow ) {
- $size+=256;
- $therow = "dir_".sprintf("%02X",$dir_row);
- $dir_rowtext{$therow} =
- "static const Q_UINT8 ${therow}[] = {$txt\n};\n\n";
- $dir_row{$txt}=$therow;
- }
- $rowtable_txt .= "\n " if $dir_row%8 == 0;
- $rowtable_txt .= "$therow, ";
-}
-
-# Print pages...
-#
-for $r ( sort keys %dir_rowtext ) {
- print $dir_rowtext{$r};
-}
-print "$rowtable_txt\n};\n";
-$size += 256*4;
-print "// $size bytes\n\n";
-
-
-
-print "#endif\n\n";
-print "// END OF GENERATED DATA\n\n";
-
-
-__END__
-
-*/
-
-
-// START OF GENERATED DATA
-
-static const Q_UINT8 ui_00[] = {
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 7, 26, 26, 26, 28, 26, 26, 26,
- 22, 23, 26, 27, 26, 21, 26, 26,
- 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 26, 26, 27, 27, 27, 26,
- 26, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 22, 26, 23, 29, 20,
- 29, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 22, 27, 23, 27, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 7, 26, 28, 28, 28, 28, 30, 30,
- 29, 30, 16, 24, 27, 21, 30, 29,
- 30, 27, 6, 6, 29, 16, 30, 26,
- 29, 6, 16, 25, 6, 6, 6, 26,
- 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 27,
- 15, 15, 15, 15, 15, 15, 15, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 27,
- 16, 16, 16, 16, 16, 16, 16, 16,
-};
-
-#ifndef QT_NO_UNICODETABLES
-
-static const Q_UINT8 ui_01[] = {
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 16, 15, 16, 15, 16, 15, 16, 15,
- 16, 15, 16, 15, 16, 15, 16, 15,
- 16, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 15, 16, 15, 16, 15, 16, 16,
- 16, 15, 15, 16, 15, 16, 15, 15,
- 16, 15, 15, 15, 16, 16, 15, 15,
- 15, 15, 16, 15, 15, 16, 15, 15,
- 15, 16, 16, 16, 15, 15, 16, 15,
- 15, 16, 15, 16, 15, 16, 15, 15,
- 16, 15, 16, 16, 15, 16, 15, 15,
- 16, 15, 15, 15, 16, 15, 16, 15,
- 15, 16, 16, 19, 15, 16, 16, 16,
- 19, 19, 19, 19, 15, 17, 16, 15,
- 17, 16, 15, 17, 16, 15, 16, 15,
- 16, 15, 16, 15, 16, 15, 16, 15,
- 16, 15, 16, 15, 16, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 16, 15, 17, 16, 15, 16, 15, 15,
- 15, 16, 15, 16, 15, 16, 15, 16,
-};
-
-static const Q_UINT8 ui_02[] = {
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 0, 0, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 0, 0, 0, 0,
- 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, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 0, 0,
- 18, 18, 18, 18, 18, 18, 18, 18,
- 18, 29, 29, 18, 18, 18, 18, 18,
- 18, 18, 29, 29, 29, 29, 29, 29,
- 29, 29, 29, 29, 29, 29, 29, 29,
- 18, 18, 29, 29, 29, 29, 29, 29,
- 29, 29, 29, 29, 29, 29, 29, 29,
- 18, 18, 18, 18, 18, 29, 29, 29,
- 29, 29, 29, 29, 29, 29, 18, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_03[] = {
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 1, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 29, 29, 0, 0,
- 0, 0, 18, 0, 0, 0, 26, 0,
- 0, 0, 0, 0, 29, 29, 15, 26,
- 15, 15, 15, 0, 15, 0, 15, 15,
- 16, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 0, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 0,
- 16, 16, 15, 15, 15, 16, 16, 16,
- 0, 0, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 16, 16, 16, 16, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_04[] = {
- 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 30, 1, 1, 1, 1, 0,
- 3, 3, 0, 0, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 15, 16, 15, 16, 0, 0, 15,
- 16, 0, 0, 15, 16, 0, 0, 0,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 0, 0,
- 15, 16, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_05[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 0,
- 0, 18, 26, 26, 26, 26, 26, 26,
- 0, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 0, 26, 21, 0, 0, 0, 0, 0,
- 0, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 0, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 0, 1, 1, 1, 26, 1,
- 26, 1, 1, 26, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 0, 0, 0, 0, 0,
- 19, 19, 19, 26, 26, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_06[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 26, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 26, 0, 0, 0, 26,
- 0, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 0, 0, 0, 0, 0,
- 18, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 26, 26, 26, 26, 0, 0,
- 1, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 26, 19, 1, 1,
- 1, 1, 1, 1, 1, 3, 3, 1,
- 1, 1, 1, 1, 1, 18, 18, 1,
- 1, 30, 1, 1, 1, 1, 0, 0,
- 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 19, 19, 19, 30, 30, 0,
-};
-
-static const Q_UINT8 ui_07[] = {
- 26, 26, 26, 26, 26, 26, 26, 26,
- 26, 26, 26, 26, 26, 26, 0, 11,
- 19, 1, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 0, 0, 0,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_08[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_09[] = {
- 0, 1, 1, 2, 0, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 0, 0, 1, 19, 2, 2,
- 2, 1, 1, 1, 1, 1, 1, 1,
- 1, 2, 2, 2, 2, 1, 0, 0,
- 19, 1, 1, 1, 1, 0, 0, 0,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 1, 1, 26, 26, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4,
- 26, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 2, 2, 0, 19, 19, 19,
- 19, 19, 19, 19, 19, 0, 0, 19,
- 19, 0, 0, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 0, 19, 19, 19, 19, 19, 19,
- 19, 0, 19, 0, 0, 0, 19, 19,
- 19, 19, 0, 0, 1, 0, 2, 2,
- 2, 1, 1, 1, 1, 0, 0, 2,
- 2, 0, 0, 2, 2, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 2,
- 0, 0, 0, 0, 19, 19, 0, 19,
- 19, 19, 1, 1, 0, 0, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4,
- 19, 19, 28, 28, 6, 6, 6, 6,
- 6, 6, 30, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_0A[] = {
- 0, 0, 1, 0, 0, 19, 19, 19,
- 19, 19, 19, 0, 0, 0, 0, 19,
- 19, 0, 0, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 0, 19, 19, 19, 19, 19, 19,
- 19, 0, 19, 19, 0, 19, 19, 0,
- 19, 19, 0, 0, 1, 0, 2, 2,
- 2, 1, 1, 0, 0, 0, 0, 1,
- 1, 0, 0, 1, 1, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 19, 19, 19, 19, 0, 19, 0,
- 0, 0, 0, 0, 0, 0, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4,
- 1, 1, 19, 19, 19, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1, 1, 2, 0, 19, 19, 19,
- 19, 19, 19, 19, 0, 19, 0, 19,
- 19, 19, 0, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 0, 19, 19, 19, 19, 19, 19,
- 19, 0, 19, 19, 0, 19, 19, 19,
- 19, 19, 0, 0, 1, 19, 2, 2,
- 2, 1, 1, 1, 1, 1, 0, 1,
- 1, 2, 0, 2, 2, 1, 0, 0,
- 19, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 19, 0, 0, 0, 0, 0, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_0B[] = {
- 0, 1, 2, 2, 0, 19, 19, 19,
- 19, 19, 19, 19, 19, 0, 0, 19,
- 19, 0, 0, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 0, 19, 19, 19, 19, 19, 19,
- 19, 0, 19, 19, 0, 0, 19, 19,
- 19, 19, 0, 0, 1, 19, 2, 1,
- 2, 1, 1, 1, 0, 0, 0, 2,
- 2, 0, 0, 2, 2, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 1, 2,
- 0, 0, 0, 0, 19, 19, 0, 19,
- 19, 19, 0, 0, 0, 0, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4,
- 30, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 1, 2, 0, 19, 19, 19,
- 19, 19, 19, 0, 0, 0, 19, 19,
- 19, 0, 19, 19, 19, 19, 0, 0,
- 0, 19, 19, 0, 19, 0, 19, 19,
- 0, 0, 0, 19, 19, 0, 0, 0,
- 19, 19, 19, 0, 0, 0, 19, 19,
- 19, 19, 19, 19, 19, 19, 0, 19,
- 19, 19, 0, 0, 0, 0, 2, 2,
- 1, 2, 2, 0, 0, 0, 2, 2,
- 2, 0, 2, 2, 2, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 2,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 4,
- 4, 4, 4, 4, 4, 4, 4, 4,
- 6, 6, 6, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_0C[] = {
- 0, 2, 2, 2, 0, 19, 19, 19,
- 19, 19, 19, 19, 19, 0, 19, 19,
- 19, 0, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 0, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 0, 19, 19, 19,
- 19, 19, 0, 0, 0, 0, 1, 1,
- 1, 2, 2, 2, 2, 0, 1, 1,
- 1, 0, 1, 1, 1, 1, 0, 0,
- 0, 0, 0, 0, 0, 1, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 19, 19, 0, 0, 0, 0, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 2, 2, 0, 19, 19, 19,
- 19, 19, 19, 19, 19, 0, 19, 19,
- 19, 0, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 0, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 0, 19, 19, 19,
- 19, 19, 0, 0, 0, 0, 2, 1,
- 2, 2, 2, 2, 2, 0, 1, 2,
- 2, 0, 2, 2, 1, 1, 0, 0,
- 0, 0, 0, 0, 0, 2, 2, 0,
- 0, 0, 0, 0, 0, 0, 19, 0,
- 19, 19, 0, 0, 0, 0, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_0D[] = {
- 0, 0, 2, 2, 0, 19, 19, 19,
- 19, 19, 19, 19, 19, 0, 19, 19,
- 19, 0, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 0, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 0, 0, 0, 0, 2, 2,
- 2, 1, 1, 1, 0, 0, 2, 2,
- 2, 0, 2, 2, 2, 1, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 2,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 19, 19, 0, 0, 0, 0, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 2, 2, 0, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 0,
- 0, 0, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 0, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 0, 19, 0, 0,
- 19, 19, 19, 19, 19, 19, 19, 0,
- 0, 0, 1, 0, 0, 0, 0, 2,
- 2, 2, 1, 1, 1, 0, 1, 0,
- 2, 2, 2, 2, 2, 2, 2, 2,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 2, 2, 26, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_0E[] = {
- 0, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 1, 19, 19, 1, 1, 1, 1,
- 1, 1, 1, 0, 0, 0, 0, 28,
- 19, 19, 19, 19, 19, 19, 18, 1,
- 1, 1, 1, 1, 1, 1, 1, 26,
- 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 26, 26, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 19, 19, 0, 19, 0, 0, 19,
- 19, 0, 19, 0, 0, 19, 0, 0,
- 0, 0, 0, 0, 19, 19, 19, 19,
- 0, 19, 19, 19, 19, 19, 19, 19,
- 0, 19, 19, 19, 0, 19, 0, 19,
- 0, 0, 19, 19, 0, 19, 19, 19,
- 19, 1, 19, 19, 1, 1, 1, 1,
- 1, 1, 0, 1, 1, 19, 0, 0,
- 19, 19, 19, 19, 19, 0, 18, 0,
- 1, 1, 1, 1, 1, 1, 0, 0,
- 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 0, 0, 19, 19, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_0F[] = {
- 19, 30, 30, 30, 26, 26, 26, 26,
- 26, 26, 26, 26, 26, 26, 26, 26,
- 26, 26, 26, 30, 30, 30, 30, 30,
- 1, 1, 30, 30, 30, 30, 30, 30,
- 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 30, 1, 30, 1,
- 30, 1, 22, 23, 22, 23, 2, 2,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 0, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 0, 0, 0, 0, 0,
- 0, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 2,
- 1, 1, 1, 1, 1, 26, 1, 1,
- 19, 19, 19, 19, 0, 0, 0, 0,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 0, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 0, 30, 30,
- 30, 30, 30, 30, 30, 30, 1, 30,
- 30, 30, 30, 30, 30, 0, 0, 30,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_10[] = {
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 0, 19, 19, 19, 19, 19,
- 0, 19, 19, 0, 2, 1, 1, 1,
- 1, 2, 1, 0, 0, 0, 1, 1,
- 2, 1, 0, 0, 0, 0, 0, 0,
- 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 26, 26, 26, 26, 26, 26,
- 19, 19, 19, 19, 19, 19, 2, 2,
- 1, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 0,
- 0, 0, 0, 26, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_11[] = {
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 0, 0, 0, 0, 0, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 0, 0, 0, 0, 0,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_12[] = {
- 19, 19, 19, 19, 19, 19, 19, 0,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 0,
- 19, 0, 19, 19, 19, 19, 0, 0,
- 19, 19, 19, 19, 19, 19, 19, 0,
- 19, 0, 19, 19, 19, 19, 0, 0,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 0,
- 19, 0, 19, 19, 19, 19, 0, 0,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 0,
- 19, 0, 19, 19, 19, 19, 0, 0,
- 19, 19, 19, 19, 19, 19, 19, 0,
- 19, 0, 19, 19, 19, 19, 0, 0,
- 19, 19, 19, 19, 19, 19, 19, 0,
- 19, 19, 19, 19, 19, 19, 19, 0,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 0,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
-};
-
-static const Q_UINT8 ui_13[] = {
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 0,
- 19, 0, 19, 19, 19, 19, 0, 0,
- 19, 19, 19, 19, 19, 19, 19, 0,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 0,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 0, 0, 0, 0, 0,
- 0, 26, 26, 26, 26, 26, 26, 26,
- 26, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_14[] = {
- 0, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
-};
-
-static const Q_UINT8 ui_15[] = {
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
-};
-
-static const Q_UINT8 ui_16[] = {
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 26, 26, 19,
- 19, 19, 19, 19, 19, 19, 19, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 7, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 22, 23, 0, 0, 0,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 26, 26, 26, 6, 6,
- 6, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_17[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 2, 2, 2, 1,
- 1, 1, 1, 1, 1, 1, 2, 2,
- 2, 2, 2, 2, 2, 2, 1, 2,
- 2, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 26, 26, 26, 26,
- 26, 26, 26, 28, 26, 0, 0, 0,
- 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_18[] = {
- 26, 26, 26, 26, 26, 26, 21, 26,
- 26, 26, 26, 11, 11, 11, 11, 0,
- 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 0, 0, 0, 0, 0, 0,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 18, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 1, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_1E[] = {
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 16, 16,
- 16, 16, 16, 16, 0, 0, 0, 0,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 15, 16, 15, 16, 15, 16,
- 15, 16, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_1F[] = {
- 16, 16, 16, 16, 16, 16, 16, 16,
- 15, 15, 15, 15, 15, 15, 15, 15,
- 16, 16, 16, 16, 16, 16, 0, 0,
- 15, 15, 15, 15, 15, 15, 0, 0,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 15, 15, 15, 15, 15, 15, 15, 15,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 15, 15, 15, 15, 15, 15, 15, 15,
- 16, 16, 16, 16, 16, 16, 0, 0,
- 15, 15, 15, 15, 15, 15, 0, 0,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 0, 15, 0, 15, 0, 15, 0, 15,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 15, 15, 15, 15, 15, 15, 15, 15,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 0, 0,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 17, 17, 17, 17, 17, 17, 17, 17,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 17, 17, 17, 17, 17, 17, 17, 17,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 17, 17, 17, 17, 17, 17, 17, 17,
- 16, 16, 16, 16, 16, 0, 16, 16,
- 15, 15, 15, 15, 17, 29, 16, 29,
- 29, 29, 16, 16, 16, 0, 16, 16,
- 15, 15, 15, 15, 17, 29, 29, 29,
- 16, 16, 16, 16, 0, 0, 16, 16,
- 15, 15, 15, 15, 0, 29, 29, 29,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 15, 15, 15, 15, 15, 29, 29, 29,
- 0, 0, 16, 16, 16, 0, 16, 16,
- 15, 15, 15, 15, 17, 29, 29, 0,
-};
-
-static const Q_UINT8 ui_20[] = {
- 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 7, 7, 11, 11, 11, 11,
- 21, 21, 21, 21, 21, 21, 26, 26,
- 24, 25, 22, 24, 24, 25, 22, 24,
- 26, 26, 26, 26, 26, 26, 26, 26,
- 8, 9, 11, 11, 11, 11, 11, 7,
- 26, 26, 26, 26, 26, 26, 26, 26,
- 26, 24, 25, 26, 26, 26, 26, 20,
- 20, 26, 26, 26, 27, 22, 23, 0,
- 26, 26, 26, 26, 26, 26, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 11, 11, 11, 11, 11, 11,
- 6, 0, 0, 0, 6, 6, 6, 6,
- 6, 6, 27, 27, 27, 22, 23, 16,
- 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 27, 27, 27, 22, 23, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 28, 28, 28, 28, 28, 28, 28, 28,
- 28, 28, 28, 28, 28, 28, 28, 28,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 3, 3, 3,
- 3, 1, 3, 3, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_21[] = {
- 30, 30, 15, 30, 30, 30, 30, 15,
- 30, 30, 16, 15, 15, 15, 16, 16,
- 15, 15, 15, 16, 30, 15, 30, 30,
- 30, 15, 15, 15, 15, 15, 30, 30,
- 30, 30, 30, 30, 15, 30, 15, 30,
- 15, 30, 15, 15, 15, 15, 30, 16,
- 15, 15, 30, 15, 16, 19, 19, 19,
- 19, 16, 30, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6,
- 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 5, 5, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 27, 27, 27, 27, 27, 30, 30, 30,
- 30, 30, 27, 27, 30, 30, 30, 30,
- 27, 30, 30, 27, 30, 30, 27, 30,
- 30, 30, 30, 30, 30, 30, 27, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 27, 27,
- 30, 30, 27, 30, 27, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_22[] = {
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 27, 27, 27, 27, 27, 27,
- 27, 27, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_23[] = {
- 30, 30, 30, 30, 30, 30, 30, 30,
- 27, 27, 27, 27, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 27, 27, 30, 30, 30, 30, 30, 30,
- 30, 22, 23, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 0, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_24[] = {
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 6, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_25[] = {
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 27,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 27, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_26[] = {
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 0, 0, 0, 0,
- 0, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 27,
- 30, 30, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_27[] = {
- 0, 30, 30, 30, 30, 0, 30, 30,
- 30, 30, 0, 0, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 0, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 0, 30, 0, 30,
- 30, 30, 30, 0, 0, 0, 30, 0,
- 30, 30, 30, 30, 30, 30, 30, 0,
- 0, 30, 30, 30, 30, 30, 30, 30,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 6, 6, 30, 0, 0, 0,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 0, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_28[] = {
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
-};
-
-static const Q_UINT8 ui_2E[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 0, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_2F[] = {
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_30[] = {
- 7, 26, 26, 26, 30, 18, 19, 5,
- 22, 23, 22, 23, 22, 23, 22, 23,
- 22, 23, 30, 30, 22, 23, 22, 23,
- 22, 23, 22, 23, 21, 22, 23, 23,
- 30, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 1, 1, 1, 1, 1, 1,
- 21, 18, 18, 18, 18, 18, 30, 30,
- 5, 5, 5, 0, 0, 0, 30, 30,
- 0, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 0, 0, 0,
- 0, 1, 1, 29, 29, 18, 18, 0,
- 0, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 20, 18, 18, 18, 0,
-};
-
-static const Q_UINT8 ui_31[] = {
- 0, 0, 0, 0, 0, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 0, 0, 0,
- 0, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 0,
- 30, 30, 6, 6, 6, 6, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_32[] = {
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 0, 0, 0,
- 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 0, 0, 0, 30,
- 6, 6, 6, 6, 6, 6, 6, 6,
- 6, 6, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 0, 0, 0, 0,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 0,
-};
-
-static const Q_UINT8 ui_33[] = {
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 0,
- 0, 0, 0, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 0, 0,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 0,
-};
-
-static const Q_UINT8 ui_34[] = {
- 19, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_4D[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 19, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_9F[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 19, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_A4[] = {
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 0, 0, 0,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 0, 0, 30, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 30, 30, 30, 0, 30, 30, 30,
- 30, 30, 30, 30, 30, 30, 30, 30,
- 30, 0, 30, 30, 30, 0, 30, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_D7[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 19, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_D8[] = {
- 12, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_DB[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 12,
- 12, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 12,
-};
-
-static const Q_UINT8 ui_DF[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 12,
-};
-
-static const Q_UINT8 ui_E0[] = {
- 13, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_F8[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 13,
-};
-
-static const Q_UINT8 ui_FA[] = {
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_FB[] = {
- 16, 16, 16, 16, 16, 16, 16, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 16, 16, 16, 16, 16,
- 0, 0, 0, 0, 0, 19, 1, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 27, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 0,
- 19, 19, 19, 19, 19, 0, 19, 0,
- 19, 19, 0, 19, 19, 0, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
-};
-
-static const Q_UINT8 ui_FD[] = {
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 22, 23,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 0, 0, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 ui_FE[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 1, 1, 1, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 26, 21, 21, 20, 20, 22, 23, 22,
- 23, 22, 23, 22, 23, 22, 23, 22,
- 23, 22, 23, 22, 23, 0, 0, 0,
- 0, 26, 26, 26, 26, 20, 20, 20,
- 26, 26, 26, 0, 26, 26, 26, 26,
- 21, 22, 23, 22, 23, 22, 23, 26,
- 26, 26, 27, 21, 27, 27, 27, 0,
- 26, 28, 26, 26, 0, 0, 0, 0,
- 19, 19, 19, 0, 19, 0, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 0, 0, 11,
-};
-
-static const Q_UINT8 ui_FF[] = {
- 0, 26, 26, 26, 28, 26, 26, 26,
- 22, 23, 26, 27, 26, 21, 26, 26,
- 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 26, 26, 27, 27, 27, 26,
- 26, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 15, 15, 15, 15, 15,
- 15, 15, 15, 22, 26, 23, 29, 20,
- 29, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 16, 16, 16, 16, 16,
- 16, 16, 16, 22, 27, 23, 27, 0,
- 0, 26, 22, 23, 26, 20, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 18, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 18, 18,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 19,
- 19, 19, 19, 19, 19, 19, 19, 0,
- 0, 0, 19, 19, 19, 19, 19, 19,
- 0, 0, 19, 19, 19, 19, 19, 19,
- 0, 0, 19, 19, 19, 19, 19, 19,
- 0, 0, 19, 19, 19, 0, 0, 0,
- 28, 28, 27, 29, 30, 28, 28, 0,
- 30, 27, 27, 27, 27, 30, 30, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 11, 11, 11, 30, 30, 0, 0,
-};
-
-static const Q_UINT8 * const unicode_info[256] = {
- ui_00, ui_01, ui_02, ui_03, ui_04, ui_05, ui_06, ui_07,
- ui_08, ui_09, ui_0A, ui_0B, ui_0C, ui_0D, ui_0E, ui_0F,
- ui_10, ui_11, ui_12, ui_13, ui_14, ui_15, ui_16, ui_17,
- ui_18, ui_08, ui_08, ui_08, ui_08, ui_08, ui_1E, ui_1F,
- ui_20, ui_21, ui_22, ui_23, ui_24, ui_25, ui_26, ui_27,
- ui_28, ui_08, ui_08, ui_08, ui_08, ui_08, ui_2E, ui_2F,
- ui_30, ui_31, ui_32, ui_33, ui_34, ui_08, ui_08, ui_08,
- ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
- ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
- ui_08, ui_08, ui_08, ui_08, ui_08, ui_4D, ui_34, ui_08,
- ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
- ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
- ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
- ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
- ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
- ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
- ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
- ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
- ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
- ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_9F,
- ui_15, ui_15, ui_15, ui_15, ui_A4, ui_08, ui_08, ui_08,
- ui_08, ui_08, ui_08, ui_08, ui_34, ui_08, ui_08, ui_08,
- ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
- ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
- ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
- ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
- ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_D7,
- ui_D8, ui_08, ui_08, ui_DB, ui_D8, ui_08, ui_08, ui_DF,
- ui_E0, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
- ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
- ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08, ui_08,
- ui_F8, ui_15, ui_FA, ui_FB, ui_15, ui_FD, ui_FE, ui_FF,
-};
-// 15616 bytes
-
-static const Q_UINT16 decomposition_map [] = {
- 0,
- 3, 0x00A0, 0x0020, 0,
- 16, 0x00A8, 0x0020, 0x0308, 0,
- 9, 0x00AA, 0x0061, 0,
- 16, 0x00AF, 0x0020, 0x0304, 0,
- 9, 0x00B2, 0x0032, 0,
- 9, 0x00B3, 0x0033, 0,
- 16, 0x00B4, 0x0020, 0x0301, 0,
- 16, 0x00B5, 0x03BC, 0,
- 16, 0x00B8, 0x0020, 0x0327, 0,
- 9, 0x00B9, 0x0031, 0,
- 9, 0x00BA, 0x006F, 0,
- 17, 0x00BC, 0x0031, 0x2044, 0x0034, 0,
- 17, 0x00BD, 0x0031, 0x2044, 0x0032, 0,
- 17, 0x00BE, 0x0033, 0x2044, 0x0034, 0,
- 1, 0x00C0, 0x0041, 0x0300, 0,
- 1, 0x00C1, 0x0041, 0x0301, 0,
- 1, 0x00C2, 0x0041, 0x0302, 0,
- 1, 0x00C3, 0x0041, 0x0303, 0,
- 1, 0x00C4, 0x0041, 0x0308, 0,
- 1, 0x00C5, 0x0041, 0x030A, 0,
- 1, 0x00C7, 0x0043, 0x0327, 0,
- 1, 0x00C8, 0x0045, 0x0300, 0,
- 1, 0x00C9, 0x0045, 0x0301, 0,
- 1, 0x00CA, 0x0045, 0x0302, 0,
- 1, 0x00CB, 0x0045, 0x0308, 0,
- 1, 0x00CC, 0x0049, 0x0300, 0,
- 1, 0x00CD, 0x0049, 0x0301, 0,
- 1, 0x00CE, 0x0049, 0x0302, 0,
- 1, 0x00CF, 0x0049, 0x0308, 0,
- 1, 0x00D1, 0x004E, 0x0303, 0,
- 1, 0x00D2, 0x004F, 0x0300, 0,
- 1, 0x00D3, 0x004F, 0x0301, 0,
- 1, 0x00D4, 0x004F, 0x0302, 0,
- 1, 0x00D5, 0x004F, 0x0303, 0,
- 1, 0x00D6, 0x004F, 0x0308, 0,
- 1, 0x00D9, 0x0055, 0x0300, 0,
- 1, 0x00DA, 0x0055, 0x0301, 0,
- 1, 0x00DB, 0x0055, 0x0302, 0,
- 1, 0x00DC, 0x0055, 0x0308, 0,
- 1, 0x00DD, 0x0059, 0x0301, 0,
- 1, 0x00E0, 0x0061, 0x0300, 0,
- 1, 0x00E1, 0x0061, 0x0301, 0,
- 1, 0x00E2, 0x0061, 0x0302, 0,
- 1, 0x00E3, 0x0061, 0x0303, 0,
- 1, 0x00E4, 0x0061, 0x0308, 0,
- 1, 0x00E5, 0x0061, 0x030A, 0,
- 1, 0x00E7, 0x0063, 0x0327, 0,
- 1, 0x00E8, 0x0065, 0x0300, 0,
- 1, 0x00E9, 0x0065, 0x0301, 0,
- 1, 0x00EA, 0x0065, 0x0302, 0,
- 1, 0x00EB, 0x0065, 0x0308, 0,
- 1, 0x00EC, 0x0069, 0x0300, 0,
- 1, 0x00ED, 0x0069, 0x0301, 0,
- 1, 0x00EE, 0x0069, 0x0302, 0,
- 1, 0x00EF, 0x0069, 0x0308, 0,
- 1, 0x00F1, 0x006E, 0x0303, 0,
- 1, 0x00F2, 0x006F, 0x0300, 0,
- 1, 0x00F3, 0x006F, 0x0301, 0,
- 1, 0x00F4, 0x006F, 0x0302, 0,
- 1, 0x00F5, 0x006F, 0x0303, 0,
- 1, 0x00F6, 0x006F, 0x0308, 0,
- 1, 0x00F9, 0x0075, 0x0300, 0,
- 1, 0x00FA, 0x0075, 0x0301, 0,
- 1, 0x00FB, 0x0075, 0x0302, 0,
- 1, 0x00FC, 0x0075, 0x0308, 0,
- 1, 0x00FD, 0x0079, 0x0301, 0,
- 1, 0x00FF, 0x0079, 0x0308, 0,
- 1, 0x0100, 0x0041, 0x0304, 0,
- 1, 0x0101, 0x0061, 0x0304, 0,
- 1, 0x0102, 0x0041, 0x0306, 0,
- 1, 0x0103, 0x0061, 0x0306, 0,
- 1, 0x0104, 0x0041, 0x0328, 0,
- 1, 0x0105, 0x0061, 0x0328, 0,
- 1, 0x0106, 0x0043, 0x0301, 0,
- 1, 0x0107, 0x0063, 0x0301, 0,
- 1, 0x0108, 0x0043, 0x0302, 0,
- 1, 0x0109, 0x0063, 0x0302, 0,
- 1, 0x010A, 0x0043, 0x0307, 0,
- 1, 0x010B, 0x0063, 0x0307, 0,
- 1, 0x010C, 0x0043, 0x030C, 0,
- 1, 0x010D, 0x0063, 0x030C, 0,
- 1, 0x010E, 0x0044, 0x030C, 0,
- 1, 0x010F, 0x0064, 0x030C, 0,
- 1, 0x0112, 0x0045, 0x0304, 0,
- 1, 0x0113, 0x0065, 0x0304, 0,
- 1, 0x0114, 0x0045, 0x0306, 0,
- 1, 0x0115, 0x0065, 0x0306, 0,
- 1, 0x0116, 0x0045, 0x0307, 0,
- 1, 0x0117, 0x0065, 0x0307, 0,
- 1, 0x0118, 0x0045, 0x0328, 0,
- 1, 0x0119, 0x0065, 0x0328, 0,
- 1, 0x011A, 0x0045, 0x030C, 0,
- 1, 0x011B, 0x0065, 0x030C, 0,
- 1, 0x011C, 0x0047, 0x0302, 0,
- 1, 0x011D, 0x0067, 0x0302, 0,
- 1, 0x011E, 0x0047, 0x0306, 0,
- 1, 0x011F, 0x0067, 0x0306, 0,
- 1, 0x0120, 0x0047, 0x0307, 0,
- 1, 0x0121, 0x0067, 0x0307, 0,
- 1, 0x0122, 0x0047, 0x0327, 0,
- 1, 0x0123, 0x0067, 0x0327, 0,
- 1, 0x0124, 0x0048, 0x0302, 0,
- 1, 0x0125, 0x0068, 0x0302, 0,
- 1, 0x0128, 0x0049, 0x0303, 0,
- 1, 0x0129, 0x0069, 0x0303, 0,
- 1, 0x012A, 0x0049, 0x0304, 0,
- 1, 0x012B, 0x0069, 0x0304, 0,
- 1, 0x012C, 0x0049, 0x0306, 0,
- 1, 0x012D, 0x0069, 0x0306, 0,
- 1, 0x012E, 0x0049, 0x0328, 0,
- 1, 0x012F, 0x0069, 0x0328, 0,
- 1, 0x0130, 0x0049, 0x0307, 0,
- 16, 0x0132, 0x0049, 0x004A, 0,
- 16, 0x0133, 0x0069, 0x006A, 0,
- 1, 0x0134, 0x004A, 0x0302, 0,
- 1, 0x0135, 0x006A, 0x0302, 0,
- 1, 0x0136, 0x004B, 0x0327, 0,
- 1, 0x0137, 0x006B, 0x0327, 0,
- 1, 0x0139, 0x004C, 0x0301, 0,
- 1, 0x013A, 0x006C, 0x0301, 0,
- 1, 0x013B, 0x004C, 0x0327, 0,
- 1, 0x013C, 0x006C, 0x0327, 0,
- 1, 0x013D, 0x004C, 0x030C, 0,
- 1, 0x013E, 0x006C, 0x030C, 0,
- 16, 0x013F, 0x004C, 0x00B7, 0,
- 16, 0x0140, 0x006C, 0x00B7, 0,
- 1, 0x0143, 0x004E, 0x0301, 0,
- 1, 0x0144, 0x006E, 0x0301, 0,
- 1, 0x0145, 0x004E, 0x0327, 0,
- 1, 0x0146, 0x006E, 0x0327, 0,
- 1, 0x0147, 0x004E, 0x030C, 0,
- 1, 0x0148, 0x006E, 0x030C, 0,
- 16, 0x0149, 0x02BC, 0x006E, 0,
- 1, 0x014C, 0x004F, 0x0304, 0,
- 1, 0x014D, 0x006F, 0x0304, 0,
- 1, 0x014E, 0x004F, 0x0306, 0,
- 1, 0x014F, 0x006F, 0x0306, 0,
- 1, 0x0150, 0x004F, 0x030B, 0,
- 1, 0x0151, 0x006F, 0x030B, 0,
- 1, 0x0154, 0x0052, 0x0301, 0,
- 1, 0x0155, 0x0072, 0x0301, 0,
- 1, 0x0156, 0x0052, 0x0327, 0,
- 1, 0x0157, 0x0072, 0x0327, 0,
- 1, 0x0158, 0x0052, 0x030C, 0,
- 1, 0x0159, 0x0072, 0x030C, 0,
- 1, 0x015A, 0x0053, 0x0301, 0,
- 1, 0x015B, 0x0073, 0x0301, 0,
- 1, 0x015C, 0x0053, 0x0302, 0,
- 1, 0x015D, 0x0073, 0x0302, 0,
- 1, 0x015E, 0x0053, 0x0327, 0,
- 1, 0x015F, 0x0073, 0x0327, 0,
- 1, 0x0160, 0x0053, 0x030C, 0,
- 1, 0x0161, 0x0073, 0x030C, 0,
- 1, 0x0162, 0x0054, 0x0327, 0,
- 1, 0x0163, 0x0074, 0x0327, 0,
- 1, 0x0164, 0x0054, 0x030C, 0,
- 1, 0x0165, 0x0074, 0x030C, 0,
- 1, 0x0168, 0x0055, 0x0303, 0,
- 1, 0x0169, 0x0075, 0x0303, 0,
- 1, 0x016A, 0x0055, 0x0304, 0,
- 1, 0x016B, 0x0075, 0x0304, 0,
- 1, 0x016C, 0x0055, 0x0306, 0,
- 1, 0x016D, 0x0075, 0x0306, 0,
- 1, 0x016E, 0x0055, 0x030A, 0,
- 1, 0x016F, 0x0075, 0x030A, 0,
- 1, 0x0170, 0x0055, 0x030B, 0,
- 1, 0x0171, 0x0075, 0x030B, 0,
- 1, 0x0172, 0x0055, 0x0328, 0,
- 1, 0x0173, 0x0075, 0x0328, 0,
- 1, 0x0174, 0x0057, 0x0302, 0,
- 1, 0x0175, 0x0077, 0x0302, 0,
- 1, 0x0176, 0x0059, 0x0302, 0,
- 1, 0x0177, 0x0079, 0x0302, 0,
- 1, 0x0178, 0x0059, 0x0308, 0,
- 1, 0x0179, 0x005A, 0x0301, 0,
- 1, 0x017A, 0x007A, 0x0301, 0,
- 1, 0x017B, 0x005A, 0x0307, 0,
- 1, 0x017C, 0x007A, 0x0307, 0,
- 1, 0x017D, 0x005A, 0x030C, 0,
- 1, 0x017E, 0x007A, 0x030C, 0,
- 16, 0x017F, 0x0073, 0,
- 1, 0x01A0, 0x004F, 0x031B, 0,
- 1, 0x01A1, 0x006F, 0x031B, 0,
- 1, 0x01AF, 0x0055, 0x031B, 0,
- 1, 0x01B0, 0x0075, 0x031B, 0,
- 16, 0x01C4, 0x0044, 0x017D, 0,
- 16, 0x01C5, 0x0044, 0x017E, 0,
- 16, 0x01C6, 0x0064, 0x017E, 0,
- 16, 0x01C7, 0x004C, 0x004A, 0,
- 16, 0x01C8, 0x004C, 0x006A, 0,
- 16, 0x01C9, 0x006C, 0x006A, 0,
- 16, 0x01CA, 0x004E, 0x004A, 0,
- 16, 0x01CB, 0x004E, 0x006A, 0,
- 16, 0x01CC, 0x006E, 0x006A, 0,
- 1, 0x01CD, 0x0041, 0x030C, 0,
- 1, 0x01CE, 0x0061, 0x030C, 0,
- 1, 0x01CF, 0x0049, 0x030C, 0,
- 1, 0x01D0, 0x0069, 0x030C, 0,
- 1, 0x01D1, 0x004F, 0x030C, 0,
- 1, 0x01D2, 0x006F, 0x030C, 0,
- 1, 0x01D3, 0x0055, 0x030C, 0,
- 1, 0x01D4, 0x0075, 0x030C, 0,
- 1, 0x01D5, 0x00DC, 0x0304, 0,
- 1, 0x01D6, 0x00FC, 0x0304, 0,
- 1, 0x01D7, 0x00DC, 0x0301, 0,
- 1, 0x01D8, 0x00FC, 0x0301, 0,
- 1, 0x01D9, 0x00DC, 0x030C, 0,
- 1, 0x01DA, 0x00FC, 0x030C, 0,
- 1, 0x01DB, 0x00DC, 0x0300, 0,
- 1, 0x01DC, 0x00FC, 0x0300, 0,
- 1, 0x01DE, 0x00C4, 0x0304, 0,
- 1, 0x01DF, 0x00E4, 0x0304, 0,
- 1, 0x01E0, 0x0226, 0x0304, 0,
- 1, 0x01E1, 0x0227, 0x0304, 0,
- 1, 0x01E2, 0x00C6, 0x0304, 0,
- 1, 0x01E3, 0x00E6, 0x0304, 0,
- 1, 0x01E6, 0x0047, 0x030C, 0,
- 1, 0x01E7, 0x0067, 0x030C, 0,
- 1, 0x01E8, 0x004B, 0x030C, 0,
- 1, 0x01E9, 0x006B, 0x030C, 0,
- 1, 0x01EA, 0x004F, 0x0328, 0,
- 1, 0x01EB, 0x006F, 0x0328, 0,
- 1, 0x01EC, 0x01EA, 0x0304, 0,
- 1, 0x01ED, 0x01EB, 0x0304, 0,
- 1, 0x01EE, 0x01B7, 0x030C, 0,
- 1, 0x01EF, 0x0292, 0x030C, 0,
- 1, 0x01F0, 0x006A, 0x030C, 0,
- 16, 0x01F1, 0x0044, 0x005A, 0,
- 16, 0x01F2, 0x0044, 0x007A, 0,
- 16, 0x01F3, 0x0064, 0x007A, 0,
- 1, 0x01F4, 0x0047, 0x0301, 0,
- 1, 0x01F5, 0x0067, 0x0301, 0,
- 1, 0x01F8, 0x004E, 0x0300, 0,
- 1, 0x01F9, 0x006E, 0x0300, 0,
- 1, 0x01FA, 0x00C5, 0x0301, 0,
- 1, 0x01FB, 0x00E5, 0x0301, 0,
- 1, 0x01FC, 0x00C6, 0x0301, 0,
- 1, 0x01FD, 0x00E6, 0x0301, 0,
- 1, 0x01FE, 0x00D8, 0x0301, 0,
- 1, 0x01FF, 0x00F8, 0x0301, 0,
- 1, 0x0200, 0x0041, 0x030F, 0,
- 1, 0x0201, 0x0061, 0x030F, 0,
- 1, 0x0202, 0x0041, 0x0311, 0,
- 1, 0x0203, 0x0061, 0x0311, 0,
- 1, 0x0204, 0x0045, 0x030F, 0,
- 1, 0x0205, 0x0065, 0x030F, 0,
- 1, 0x0206, 0x0045, 0x0311, 0,
- 1, 0x0207, 0x0065, 0x0311, 0,
- 1, 0x0208, 0x0049, 0x030F, 0,
- 1, 0x0209, 0x0069, 0x030F, 0,
- 1, 0x020A, 0x0049, 0x0311, 0,
- 1, 0x020B, 0x0069, 0x0311, 0,
- 1, 0x020C, 0x004F, 0x030F, 0,
- 1, 0x020D, 0x006F, 0x030F, 0,
- 1, 0x020E, 0x004F, 0x0311, 0,
- 1, 0x020F, 0x006F, 0x0311, 0,
- 1, 0x0210, 0x0052, 0x030F, 0,
- 1, 0x0211, 0x0072, 0x030F, 0,
- 1, 0x0212, 0x0052, 0x0311, 0,
- 1, 0x0213, 0x0072, 0x0311, 0,
- 1, 0x0214, 0x0055, 0x030F, 0,
- 1, 0x0215, 0x0075, 0x030F, 0,
- 1, 0x0216, 0x0055, 0x0311, 0,
- 1, 0x0217, 0x0075, 0x0311, 0,
- 1, 0x0218, 0x0053, 0x0326, 0,
- 1, 0x0219, 0x0073, 0x0326, 0,
- 1, 0x021A, 0x0054, 0x0326, 0,
- 1, 0x021B, 0x0074, 0x0326, 0,
- 1, 0x021E, 0x0048, 0x030C, 0,
- 1, 0x021F, 0x0068, 0x030C, 0,
- 1, 0x0226, 0x0041, 0x0307, 0,
- 1, 0x0227, 0x0061, 0x0307, 0,
- 1, 0x0228, 0x0045, 0x0327, 0,
- 1, 0x0229, 0x0065, 0x0327, 0,
- 1, 0x022A, 0x00D6, 0x0304, 0,
- 1, 0x022B, 0x00F6, 0x0304, 0,
- 1, 0x022C, 0x00D5, 0x0304, 0,
- 1, 0x022D, 0x00F5, 0x0304, 0,
- 1, 0x022E, 0x004F, 0x0307, 0,
- 1, 0x022F, 0x006F, 0x0307, 0,
- 1, 0x0230, 0x022E, 0x0304, 0,
- 1, 0x0231, 0x022F, 0x0304, 0,
- 1, 0x0232, 0x0059, 0x0304, 0,
- 1, 0x0233, 0x0079, 0x0304, 0,
- 9, 0x02B0, 0x0068, 0,
- 9, 0x02B1, 0x0266, 0,
- 9, 0x02B2, 0x006A, 0,
- 9, 0x02B3, 0x0072, 0,
- 9, 0x02B4, 0x0279, 0,
- 9, 0x02B5, 0x027B, 0,
- 9, 0x02B6, 0x0281, 0,
- 9, 0x02B7, 0x0077, 0,
- 9, 0x02B8, 0x0079, 0,
- 16, 0x02D8, 0x0020, 0x0306, 0,
- 16, 0x02D9, 0x0020, 0x0307, 0,
- 16, 0x02DA, 0x0020, 0x030A, 0,
- 16, 0x02DB, 0x0020, 0x0328, 0,
- 16, 0x02DC, 0x0020, 0x0303, 0,
- 16, 0x02DD, 0x0020, 0x030B, 0,
- 9, 0x02E0, 0x0263, 0,
- 9, 0x02E1, 0x006C, 0,
- 9, 0x02E2, 0x0073, 0,
- 9, 0x02E3, 0x0078, 0,
- 9, 0x02E4, 0x0295, 0,
- 1, 0x0340, 0x0300, 0,
- 1, 0x0341, 0x0301, 0,
- 1, 0x0343, 0x0313, 0,
- 1, 0x0344, 0x0308, 0x0301, 0,
- 1, 0x0374, 0x02B9, 0,
- 16, 0x037A, 0x0020, 0x0345, 0,
- 1, 0x037E, 0x003B, 0,
- 16, 0x0384, 0x0020, 0x0301, 0,
- 1, 0x0385, 0x00A8, 0x0301, 0,
- 1, 0x0386, 0x0391, 0x0301, 0,
- 1, 0x0387, 0x00B7, 0,
- 1, 0x0388, 0x0395, 0x0301, 0,
- 1, 0x0389, 0x0397, 0x0301, 0,
- 1, 0x038A, 0x0399, 0x0301, 0,
- 1, 0x038C, 0x039F, 0x0301, 0,
- 1, 0x038E, 0x03A5, 0x0301, 0,
- 1, 0x038F, 0x03A9, 0x0301, 0,
- 1, 0x0390, 0x03CA, 0x0301, 0,
- 1, 0x03AA, 0x0399, 0x0308, 0,
- 1, 0x03AB, 0x03A5, 0x0308, 0,
- 1, 0x03AC, 0x03B1, 0x0301, 0,
- 1, 0x03AD, 0x03B5, 0x0301, 0,
- 1, 0x03AE, 0x03B7, 0x0301, 0,
- 1, 0x03AF, 0x03B9, 0x0301, 0,
- 1, 0x03B0, 0x03CB, 0x0301, 0,
- 1, 0x03CA, 0x03B9, 0x0308, 0,
- 1, 0x03CB, 0x03C5, 0x0308, 0,
- 1, 0x03CC, 0x03BF, 0x0301, 0,
- 1, 0x03CD, 0x03C5, 0x0301, 0,
- 1, 0x03CE, 0x03C9, 0x0301, 0,
- 16, 0x03D0, 0x03B2, 0,
- 16, 0x03D1, 0x03B8, 0,
- 16, 0x03D2, 0x03A5, 0,
- 1, 0x03D3, 0x03D2, 0x0301, 0,
- 1, 0x03D4, 0x03D2, 0x0308, 0,
- 16, 0x03D5, 0x03C6, 0,
- 16, 0x03D6, 0x03C0, 0,
- 16, 0x03F0, 0x03BA, 0,
- 16, 0x03F1, 0x03C1, 0,
- 16, 0x03F2, 0x03C2, 0,
- 1, 0x0400, 0x0415, 0x0300, 0,
- 1, 0x0401, 0x0415, 0x0308, 0,
- 1, 0x0403, 0x0413, 0x0301, 0,
- 1, 0x0407, 0x0406, 0x0308, 0,
- 1, 0x040C, 0x041A, 0x0301, 0,
- 1, 0x040D, 0x0418, 0x0300, 0,
- 1, 0x040E, 0x0423, 0x0306, 0,
- 1, 0x0419, 0x0418, 0x0306, 0,
- 1, 0x0439, 0x0438, 0x0306, 0,
- 1, 0x0450, 0x0435, 0x0300, 0,
- 1, 0x0451, 0x0435, 0x0308, 0,
- 1, 0x0453, 0x0433, 0x0301, 0,
- 1, 0x0457, 0x0456, 0x0308, 0,
- 1, 0x045C, 0x043A, 0x0301, 0,
- 1, 0x045D, 0x0438, 0x0300, 0,
- 1, 0x045E, 0x0443, 0x0306, 0,
- 1, 0x0476, 0x0474, 0x030F, 0,
- 1, 0x0477, 0x0475, 0x030F, 0,
- 1, 0x04C1, 0x0416, 0x0306, 0,
- 1, 0x04C2, 0x0436, 0x0306, 0,
- 1, 0x04D0, 0x0410, 0x0306, 0,
- 1, 0x04D1, 0x0430, 0x0306, 0,
- 1, 0x04D2, 0x0410, 0x0308, 0,
- 1, 0x04D3, 0x0430, 0x0308, 0,
- 1, 0x04D6, 0x0415, 0x0306, 0,
- 1, 0x04D7, 0x0435, 0x0306, 0,
- 1, 0x04DA, 0x04D8, 0x0308, 0,
- 1, 0x04DB, 0x04D9, 0x0308, 0,
- 1, 0x04DC, 0x0416, 0x0308, 0,
- 1, 0x04DD, 0x0436, 0x0308, 0,
- 1, 0x04DE, 0x0417, 0x0308, 0,
- 1, 0x04DF, 0x0437, 0x0308, 0,
- 1, 0x04E2, 0x0418, 0x0304, 0,
- 1, 0x04E3, 0x0438, 0x0304, 0,
- 1, 0x04E4, 0x0418, 0x0308, 0,
- 1, 0x04E5, 0x0438, 0x0308, 0,
- 1, 0x04E6, 0x041E, 0x0308, 0,
- 1, 0x04E7, 0x043E, 0x0308, 0,
- 1, 0x04EA, 0x04E8, 0x0308, 0,
- 1, 0x04EB, 0x04E9, 0x0308, 0,
- 1, 0x04EC, 0x042D, 0x0308, 0,
- 1, 0x04ED, 0x044D, 0x0308, 0,
- 1, 0x04EE, 0x0423, 0x0304, 0,
- 1, 0x04EF, 0x0443, 0x0304, 0,
- 1, 0x04F0, 0x0423, 0x0308, 0,
- 1, 0x04F1, 0x0443, 0x0308, 0,
- 1, 0x04F2, 0x0423, 0x030B, 0,
- 1, 0x04F3, 0x0443, 0x030B, 0,
- 1, 0x04F4, 0x0427, 0x0308, 0,
- 1, 0x04F5, 0x0447, 0x0308, 0,
- 1, 0x04F8, 0x042B, 0x0308, 0,
- 1, 0x04F9, 0x044B, 0x0308, 0,
- 16, 0x0587, 0x0565, 0x0582, 0,
- 1, 0x0622, 0x0627, 0x0653, 0,
- 1, 0x0623, 0x0627, 0x0654, 0,
- 1, 0x0624, 0x0648, 0x0654, 0,
- 1, 0x0625, 0x0627, 0x0655, 0,
- 1, 0x0626, 0x064A, 0x0654, 0,
- 16, 0x0675, 0x0627, 0x0674, 0,
- 16, 0x0676, 0x0648, 0x0674, 0,
- 16, 0x0677, 0x06C7, 0x0674, 0,
- 16, 0x0678, 0x064A, 0x0674, 0,
- 1, 0x06C0, 0x06D5, 0x0654, 0,
- 1, 0x06C2, 0x06C1, 0x0654, 0,
- 1, 0x06D3, 0x06D2, 0x0654, 0,
- 1, 0x0929, 0x0928, 0x093C, 0,
- 1, 0x0931, 0x0930, 0x093C, 0,
- 1, 0x0934, 0x0933, 0x093C, 0,
- 1, 0x0958, 0x0915, 0x093C, 0,
- 1, 0x0959, 0x0916, 0x093C, 0,
- 1, 0x095A, 0x0917, 0x093C, 0,
- 1, 0x095B, 0x091C, 0x093C, 0,
- 1, 0x095C, 0x0921, 0x093C, 0,
- 1, 0x095D, 0x0922, 0x093C, 0,
- 1, 0x095E, 0x092B, 0x093C, 0,
- 1, 0x095F, 0x092F, 0x093C, 0,
- 1, 0x09CB, 0x09C7, 0x09BE, 0,
- 1, 0x09CC, 0x09C7, 0x09D7, 0,
- 1, 0x09DC, 0x09A1, 0x09BC, 0,
- 1, 0x09DD, 0x09A2, 0x09BC, 0,
- 1, 0x09DF, 0x09AF, 0x09BC, 0,
- 1, 0x0A33, 0x0A32, 0x0A3C, 0,
- 1, 0x0A36, 0x0A38, 0x0A3C, 0,
- 1, 0x0A59, 0x0A16, 0x0A3C, 0,
- 1, 0x0A5A, 0x0A17, 0x0A3C, 0,
- 1, 0x0A5B, 0x0A1C, 0x0A3C, 0,
- 1, 0x0A5E, 0x0A2B, 0x0A3C, 0,
- 1, 0x0B48, 0x0B47, 0x0B56, 0,
- 1, 0x0B4B, 0x0B47, 0x0B3E, 0,
- 1, 0x0B4C, 0x0B47, 0x0B57, 0,
- 1, 0x0B5C, 0x0B21, 0x0B3C, 0,
- 1, 0x0B5D, 0x0B22, 0x0B3C, 0,
- 1, 0x0B94, 0x0B92, 0x0BD7, 0,
- 1, 0x0BCA, 0x0BC6, 0x0BBE, 0,
- 1, 0x0BCB, 0x0BC7, 0x0BBE, 0,
- 1, 0x0BCC, 0x0BC6, 0x0BD7, 0,
- 1, 0x0C48, 0x0C46, 0x0C56, 0,
- 1, 0x0CC0, 0x0CBF, 0x0CD5, 0,
- 1, 0x0CC7, 0x0CC6, 0x0CD5, 0,
- 1, 0x0CC8, 0x0CC6, 0x0CD6, 0,
- 1, 0x0CCA, 0x0CC6, 0x0CC2, 0,
- 1, 0x0CCB, 0x0CCA, 0x0CD5, 0,
- 1, 0x0D4A, 0x0D46, 0x0D3E, 0,
- 1, 0x0D4B, 0x0D47, 0x0D3E, 0,
- 1, 0x0D4C, 0x0D46, 0x0D57, 0,
- 1, 0x0DDA, 0x0DD9, 0x0DCA, 0,
- 1, 0x0DDC, 0x0DD9, 0x0DCF, 0,
- 1, 0x0DDD, 0x0DDC, 0x0DCA, 0,
- 1, 0x0DDE, 0x0DD9, 0x0DDF, 0,
- 16, 0x0E33, 0x0E4D, 0x0E32, 0,
- 16, 0x0EB3, 0x0ECD, 0x0EB2, 0,
- 16, 0x0EDC, 0x0EAB, 0x0E99, 0,
- 16, 0x0EDD, 0x0EAB, 0x0EA1, 0,
- 3, 0x0F0C, 0x0F0B, 0,
- 1, 0x0F43, 0x0F42, 0x0FB7, 0,
- 1, 0x0F4D, 0x0F4C, 0x0FB7, 0,
- 1, 0x0F52, 0x0F51, 0x0FB7, 0,
- 1, 0x0F57, 0x0F56, 0x0FB7, 0,
- 1, 0x0F5C, 0x0F5B, 0x0FB7, 0,
- 1, 0x0F69, 0x0F40, 0x0FB5, 0,
- 1, 0x0F73, 0x0F71, 0x0F72, 0,
- 1, 0x0F75, 0x0F71, 0x0F74, 0,
- 1, 0x0F76, 0x0FB2, 0x0F80, 0,
- 16, 0x0F77, 0x0FB2, 0x0F81, 0,
- 1, 0x0F78, 0x0FB3, 0x0F80, 0,
- 16, 0x0F79, 0x0FB3, 0x0F81, 0,
- 1, 0x0F81, 0x0F71, 0x0F80, 0,
- 1, 0x0F93, 0x0F92, 0x0FB7, 0,
- 1, 0x0F9D, 0x0F9C, 0x0FB7, 0,
- 1, 0x0FA2, 0x0FA1, 0x0FB7, 0,
- 1, 0x0FA7, 0x0FA6, 0x0FB7, 0,
- 1, 0x0FAC, 0x0FAB, 0x0FB7, 0,
- 1, 0x0FB9, 0x0F90, 0x0FB5, 0,
- 1, 0x1026, 0x1025, 0x102E, 0,
- 1, 0x1E00, 0x0041, 0x0325, 0,
- 1, 0x1E01, 0x0061, 0x0325, 0,
- 1, 0x1E02, 0x0042, 0x0307, 0,
- 1, 0x1E03, 0x0062, 0x0307, 0,
- 1, 0x1E04, 0x0042, 0x0323, 0,
- 1, 0x1E05, 0x0062, 0x0323, 0,
- 1, 0x1E06, 0x0042, 0x0331, 0,
- 1, 0x1E07, 0x0062, 0x0331, 0,
- 1, 0x1E08, 0x00C7, 0x0301, 0,
- 1, 0x1E09, 0x00E7, 0x0301, 0,
- 1, 0x1E0A, 0x0044, 0x0307, 0,
- 1, 0x1E0B, 0x0064, 0x0307, 0,
- 1, 0x1E0C, 0x0044, 0x0323, 0,
- 1, 0x1E0D, 0x0064, 0x0323, 0,
- 1, 0x1E0E, 0x0044, 0x0331, 0,
- 1, 0x1E0F, 0x0064, 0x0331, 0,
- 1, 0x1E10, 0x0044, 0x0327, 0,
- 1, 0x1E11, 0x0064, 0x0327, 0,
- 1, 0x1E12, 0x0044, 0x032D, 0,
- 1, 0x1E13, 0x0064, 0x032D, 0,
- 1, 0x1E14, 0x0112, 0x0300, 0,
- 1, 0x1E15, 0x0113, 0x0300, 0,
- 1, 0x1E16, 0x0112, 0x0301, 0,
- 1, 0x1E17, 0x0113, 0x0301, 0,
- 1, 0x1E18, 0x0045, 0x032D, 0,
- 1, 0x1E19, 0x0065, 0x032D, 0,
- 1, 0x1E1A, 0x0045, 0x0330, 0,
- 1, 0x1E1B, 0x0065, 0x0330, 0,
- 1, 0x1E1C, 0x0228, 0x0306, 0,
- 1, 0x1E1D, 0x0229, 0x0306, 0,
- 1, 0x1E1E, 0x0046, 0x0307, 0,
- 1, 0x1E1F, 0x0066, 0x0307, 0,
- 1, 0x1E20, 0x0047, 0x0304, 0,
- 1, 0x1E21, 0x0067, 0x0304, 0,
- 1, 0x1E22, 0x0048, 0x0307, 0,
- 1, 0x1E23, 0x0068, 0x0307, 0,
- 1, 0x1E24, 0x0048, 0x0323, 0,
- 1, 0x1E25, 0x0068, 0x0323, 0,
- 1, 0x1E26, 0x0048, 0x0308, 0,
- 1, 0x1E27, 0x0068, 0x0308, 0,
- 1, 0x1E28, 0x0048, 0x0327, 0,
- 1, 0x1E29, 0x0068, 0x0327, 0,
- 1, 0x1E2A, 0x0048, 0x032E, 0,
- 1, 0x1E2B, 0x0068, 0x032E, 0,
- 1, 0x1E2C, 0x0049, 0x0330, 0,
- 1, 0x1E2D, 0x0069, 0x0330, 0,
- 1, 0x1E2E, 0x00CF, 0x0301, 0,
- 1, 0x1E2F, 0x00EF, 0x0301, 0,
- 1, 0x1E30, 0x004B, 0x0301, 0,
- 1, 0x1E31, 0x006B, 0x0301, 0,
- 1, 0x1E32, 0x004B, 0x0323, 0,
- 1, 0x1E33, 0x006B, 0x0323, 0,
- 1, 0x1E34, 0x004B, 0x0331, 0,
- 1, 0x1E35, 0x006B, 0x0331, 0,
- 1, 0x1E36, 0x004C, 0x0323, 0,
- 1, 0x1E37, 0x006C, 0x0323, 0,
- 1, 0x1E38, 0x1E36, 0x0304, 0,
- 1, 0x1E39, 0x1E37, 0x0304, 0,
- 1, 0x1E3A, 0x004C, 0x0331, 0,
- 1, 0x1E3B, 0x006C, 0x0331, 0,
- 1, 0x1E3C, 0x004C, 0x032D, 0,
- 1, 0x1E3D, 0x006C, 0x032D, 0,
- 1, 0x1E3E, 0x004D, 0x0301, 0,
- 1, 0x1E3F, 0x006D, 0x0301, 0,
- 1, 0x1E40, 0x004D, 0x0307, 0,
- 1, 0x1E41, 0x006D, 0x0307, 0,
- 1, 0x1E42, 0x004D, 0x0323, 0,
- 1, 0x1E43, 0x006D, 0x0323, 0,
- 1, 0x1E44, 0x004E, 0x0307, 0,
- 1, 0x1E45, 0x006E, 0x0307, 0,
- 1, 0x1E46, 0x004E, 0x0323, 0,
- 1, 0x1E47, 0x006E, 0x0323, 0,
- 1, 0x1E48, 0x004E, 0x0331, 0,
- 1, 0x1E49, 0x006E, 0x0331, 0,
- 1, 0x1E4A, 0x004E, 0x032D, 0,
- 1, 0x1E4B, 0x006E, 0x032D, 0,
- 1, 0x1E4C, 0x00D5, 0x0301, 0,
- 1, 0x1E4D, 0x00F5, 0x0301, 0,
- 1, 0x1E4E, 0x00D5, 0x0308, 0,
- 1, 0x1E4F, 0x00F5, 0x0308, 0,
- 1, 0x1E50, 0x014C, 0x0300, 0,
- 1, 0x1E51, 0x014D, 0x0300, 0,
- 1, 0x1E52, 0x014C, 0x0301, 0,
- 1, 0x1E53, 0x014D, 0x0301, 0,
- 1, 0x1E54, 0x0050, 0x0301, 0,
- 1, 0x1E55, 0x0070, 0x0301, 0,
- 1, 0x1E56, 0x0050, 0x0307, 0,
- 1, 0x1E57, 0x0070, 0x0307, 0,
- 1, 0x1E58, 0x0052, 0x0307, 0,
- 1, 0x1E59, 0x0072, 0x0307, 0,
- 1, 0x1E5A, 0x0052, 0x0323, 0,
- 1, 0x1E5B, 0x0072, 0x0323, 0,
- 1, 0x1E5C, 0x1E5A, 0x0304, 0,
- 1, 0x1E5D, 0x1E5B, 0x0304, 0,
- 1, 0x1E5E, 0x0052, 0x0331, 0,
- 1, 0x1E5F, 0x0072, 0x0331, 0,
- 1, 0x1E60, 0x0053, 0x0307, 0,
- 1, 0x1E61, 0x0073, 0x0307, 0,
- 1, 0x1E62, 0x0053, 0x0323, 0,
- 1, 0x1E63, 0x0073, 0x0323, 0,
- 1, 0x1E64, 0x015A, 0x0307, 0,
- 1, 0x1E65, 0x015B, 0x0307, 0,
- 1, 0x1E66, 0x0160, 0x0307, 0,
- 1, 0x1E67, 0x0161, 0x0307, 0,
- 1, 0x1E68, 0x1E62, 0x0307, 0,
- 1, 0x1E69, 0x1E63, 0x0307, 0,
- 1, 0x1E6A, 0x0054, 0x0307, 0,
- 1, 0x1E6B, 0x0074, 0x0307, 0,
- 1, 0x1E6C, 0x0054, 0x0323, 0,
- 1, 0x1E6D, 0x0074, 0x0323, 0,
- 1, 0x1E6E, 0x0054, 0x0331, 0,
- 1, 0x1E6F, 0x0074, 0x0331, 0,
- 1, 0x1E70, 0x0054, 0x032D, 0,
- 1, 0x1E71, 0x0074, 0x032D, 0,
- 1, 0x1E72, 0x0055, 0x0324, 0,
- 1, 0x1E73, 0x0075, 0x0324, 0,
- 1, 0x1E74, 0x0055, 0x0330, 0,
- 1, 0x1E75, 0x0075, 0x0330, 0,
- 1, 0x1E76, 0x0055, 0x032D, 0,
- 1, 0x1E77, 0x0075, 0x032D, 0,
- 1, 0x1E78, 0x0168, 0x0301, 0,
- 1, 0x1E79, 0x0169, 0x0301, 0,
- 1, 0x1E7A, 0x016A, 0x0308, 0,
- 1, 0x1E7B, 0x016B, 0x0308, 0,
- 1, 0x1E7C, 0x0056, 0x0303, 0,
- 1, 0x1E7D, 0x0076, 0x0303, 0,
- 1, 0x1E7E, 0x0056, 0x0323, 0,
- 1, 0x1E7F, 0x0076, 0x0323, 0,
- 1, 0x1E80, 0x0057, 0x0300, 0,
- 1, 0x1E81, 0x0077, 0x0300, 0,
- 1, 0x1E82, 0x0057, 0x0301, 0,
- 1, 0x1E83, 0x0077, 0x0301, 0,
- 1, 0x1E84, 0x0057, 0x0308, 0,
- 1, 0x1E85, 0x0077, 0x0308, 0,
- 1, 0x1E86, 0x0057, 0x0307, 0,
- 1, 0x1E87, 0x0077, 0x0307, 0,
- 1, 0x1E88, 0x0057, 0x0323, 0,
- 1, 0x1E89, 0x0077, 0x0323, 0,
- 1, 0x1E8A, 0x0058, 0x0307, 0,
- 1, 0x1E8B, 0x0078, 0x0307, 0,
- 1, 0x1E8C, 0x0058, 0x0308, 0,
- 1, 0x1E8D, 0x0078, 0x0308, 0,
- 1, 0x1E8E, 0x0059, 0x0307, 0,
- 1, 0x1E8F, 0x0079, 0x0307, 0,
- 1, 0x1E90, 0x005A, 0x0302, 0,
- 1, 0x1E91, 0x007A, 0x0302, 0,
- 1, 0x1E92, 0x005A, 0x0323, 0,
- 1, 0x1E93, 0x007A, 0x0323, 0,
- 1, 0x1E94, 0x005A, 0x0331, 0,
- 1, 0x1E95, 0x007A, 0x0331, 0,
- 1, 0x1E96, 0x0068, 0x0331, 0,
- 1, 0x1E97, 0x0074, 0x0308, 0,
- 1, 0x1E98, 0x0077, 0x030A, 0,
- 1, 0x1E99, 0x0079, 0x030A, 0,
- 16, 0x1E9A, 0x0061, 0x02BE, 0,
- 1, 0x1E9B, 0x017F, 0x0307, 0,
- 1, 0x1EA0, 0x0041, 0x0323, 0,
- 1, 0x1EA1, 0x0061, 0x0323, 0,
- 1, 0x1EA2, 0x0041, 0x0309, 0,
- 1, 0x1EA3, 0x0061, 0x0309, 0,
- 1, 0x1EA4, 0x00C2, 0x0301, 0,
- 1, 0x1EA5, 0x00E2, 0x0301, 0,
- 1, 0x1EA6, 0x00C2, 0x0300, 0,
- 1, 0x1EA7, 0x00E2, 0x0300, 0,
- 1, 0x1EA8, 0x00C2, 0x0309, 0,
- 1, 0x1EA9, 0x00E2, 0x0309, 0,
- 1, 0x1EAA, 0x00C2, 0x0303, 0,
- 1, 0x1EAB, 0x00E2, 0x0303, 0,
- 1, 0x1EAC, 0x1EA0, 0x0302, 0,
- 1, 0x1EAD, 0x1EA1, 0x0302, 0,
- 1, 0x1EAE, 0x0102, 0x0301, 0,
- 1, 0x1EAF, 0x0103, 0x0301, 0,
- 1, 0x1EB0, 0x0102, 0x0300, 0,
- 1, 0x1EB1, 0x0103, 0x0300, 0,
- 1, 0x1EB2, 0x0102, 0x0309, 0,
- 1, 0x1EB3, 0x0103, 0x0309, 0,
- 1, 0x1EB4, 0x0102, 0x0303, 0,
- 1, 0x1EB5, 0x0103, 0x0303, 0,
- 1, 0x1EB6, 0x1EA0, 0x0306, 0,
- 1, 0x1EB7, 0x1EA1, 0x0306, 0,
- 1, 0x1EB8, 0x0045, 0x0323, 0,
- 1, 0x1EB9, 0x0065, 0x0323, 0,
- 1, 0x1EBA, 0x0045, 0x0309, 0,
- 1, 0x1EBB, 0x0065, 0x0309, 0,
- 1, 0x1EBC, 0x0045, 0x0303, 0,
- 1, 0x1EBD, 0x0065, 0x0303, 0,
- 1, 0x1EBE, 0x00CA, 0x0301, 0,
- 1, 0x1EBF, 0x00EA, 0x0301, 0,
- 1, 0x1EC0, 0x00CA, 0x0300, 0,
- 1, 0x1EC1, 0x00EA, 0x0300, 0,
- 1, 0x1EC2, 0x00CA, 0x0309, 0,
- 1, 0x1EC3, 0x00EA, 0x0309, 0,
- 1, 0x1EC4, 0x00CA, 0x0303, 0,
- 1, 0x1EC5, 0x00EA, 0x0303, 0,
- 1, 0x1EC6, 0x1EB8, 0x0302, 0,
- 1, 0x1EC7, 0x1EB9, 0x0302, 0,
- 1, 0x1EC8, 0x0049, 0x0309, 0,
- 1, 0x1EC9, 0x0069, 0x0309, 0,
- 1, 0x1ECA, 0x0049, 0x0323, 0,
- 1, 0x1ECB, 0x0069, 0x0323, 0,
- 1, 0x1ECC, 0x004F, 0x0323, 0,
- 1, 0x1ECD, 0x006F, 0x0323, 0,
- 1, 0x1ECE, 0x004F, 0x0309, 0,
- 1, 0x1ECF, 0x006F, 0x0309, 0,
- 1, 0x1ED0, 0x00D4, 0x0301, 0,
- 1, 0x1ED1, 0x00F4, 0x0301, 0,
- 1, 0x1ED2, 0x00D4, 0x0300, 0,
- 1, 0x1ED3, 0x00F4, 0x0300, 0,
- 1, 0x1ED4, 0x00D4, 0x0309, 0,
- 1, 0x1ED5, 0x00F4, 0x0309, 0,
- 1, 0x1ED6, 0x00D4, 0x0303, 0,
- 1, 0x1ED7, 0x00F4, 0x0303, 0,
- 1, 0x1ED8, 0x1ECC, 0x0302, 0,
- 1, 0x1ED9, 0x1ECD, 0x0302, 0,
- 1, 0x1EDA, 0x01A0, 0x0301, 0,
- 1, 0x1EDB, 0x01A1, 0x0301, 0,
- 1, 0x1EDC, 0x01A0, 0x0300, 0,
- 1, 0x1EDD, 0x01A1, 0x0300, 0,
- 1, 0x1EDE, 0x01A0, 0x0309, 0,
- 1, 0x1EDF, 0x01A1, 0x0309, 0,
- 1, 0x1EE0, 0x01A0, 0x0303, 0,
- 1, 0x1EE1, 0x01A1, 0x0303, 0,
- 1, 0x1EE2, 0x01A0, 0x0323, 0,
- 1, 0x1EE3, 0x01A1, 0x0323, 0,
- 1, 0x1EE4, 0x0055, 0x0323, 0,
- 1, 0x1EE5, 0x0075, 0x0323, 0,
- 1, 0x1EE6, 0x0055, 0x0309, 0,
- 1, 0x1EE7, 0x0075, 0x0309, 0,
- 1, 0x1EE8, 0x01AF, 0x0301, 0,
- 1, 0x1EE9, 0x01B0, 0x0301, 0,
- 1, 0x1EEA, 0x01AF, 0x0300, 0,
- 1, 0x1EEB, 0x01B0, 0x0300, 0,
- 1, 0x1EEC, 0x01AF, 0x0309, 0,
- 1, 0x1EED, 0x01B0, 0x0309, 0,
- 1, 0x1EEE, 0x01AF, 0x0303, 0,
- 1, 0x1EEF, 0x01B0, 0x0303, 0,
- 1, 0x1EF0, 0x01AF, 0x0323, 0,
- 1, 0x1EF1, 0x01B0, 0x0323, 0,
- 1, 0x1EF2, 0x0059, 0x0300, 0,
- 1, 0x1EF3, 0x0079, 0x0300, 0,
- 1, 0x1EF4, 0x0059, 0x0323, 0,
- 1, 0x1EF5, 0x0079, 0x0323, 0,
- 1, 0x1EF6, 0x0059, 0x0309, 0,
- 1, 0x1EF7, 0x0079, 0x0309, 0,
- 1, 0x1EF8, 0x0059, 0x0303, 0,
- 1, 0x1EF9, 0x0079, 0x0303, 0,
- 1, 0x1F00, 0x03B1, 0x0313, 0,
- 1, 0x1F01, 0x03B1, 0x0314, 0,
- 1, 0x1F02, 0x1F00, 0x0300, 0,
- 1, 0x1F03, 0x1F01, 0x0300, 0,
- 1, 0x1F04, 0x1F00, 0x0301, 0,
- 1, 0x1F05, 0x1F01, 0x0301, 0,
- 1, 0x1F06, 0x1F00, 0x0342, 0,
- 1, 0x1F07, 0x1F01, 0x0342, 0,
- 1, 0x1F08, 0x0391, 0x0313, 0,
- 1, 0x1F09, 0x0391, 0x0314, 0,
- 1, 0x1F0A, 0x1F08, 0x0300, 0,
- 1, 0x1F0B, 0x1F09, 0x0300, 0,
- 1, 0x1F0C, 0x1F08, 0x0301, 0,
- 1, 0x1F0D, 0x1F09, 0x0301, 0,
- 1, 0x1F0E, 0x1F08, 0x0342, 0,
- 1, 0x1F0F, 0x1F09, 0x0342, 0,
- 1, 0x1F10, 0x03B5, 0x0313, 0,
- 1, 0x1F11, 0x03B5, 0x0314, 0,
- 1, 0x1F12, 0x1F10, 0x0300, 0,
- 1, 0x1F13, 0x1F11, 0x0300, 0,
- 1, 0x1F14, 0x1F10, 0x0301, 0,
- 1, 0x1F15, 0x1F11, 0x0301, 0,
- 1, 0x1F18, 0x0395, 0x0313, 0,
- 1, 0x1F19, 0x0395, 0x0314, 0,
- 1, 0x1F1A, 0x1F18, 0x0300, 0,
- 1, 0x1F1B, 0x1F19, 0x0300, 0,
- 1, 0x1F1C, 0x1F18, 0x0301, 0,
- 1, 0x1F1D, 0x1F19, 0x0301, 0,
- 1, 0x1F20, 0x03B7, 0x0313, 0,
- 1, 0x1F21, 0x03B7, 0x0314, 0,
- 1, 0x1F22, 0x1F20, 0x0300, 0,
- 1, 0x1F23, 0x1F21, 0x0300, 0,
- 1, 0x1F24, 0x1F20, 0x0301, 0,
- 1, 0x1F25, 0x1F21, 0x0301, 0,
- 1, 0x1F26, 0x1F20, 0x0342, 0,
- 1, 0x1F27, 0x1F21, 0x0342, 0,
- 1, 0x1F28, 0x0397, 0x0313, 0,
- 1, 0x1F29, 0x0397, 0x0314, 0,
- 1, 0x1F2A, 0x1F28, 0x0300, 0,
- 1, 0x1F2B, 0x1F29, 0x0300, 0,
- 1, 0x1F2C, 0x1F28, 0x0301, 0,
- 1, 0x1F2D, 0x1F29, 0x0301, 0,
- 1, 0x1F2E, 0x1F28, 0x0342, 0,
- 1, 0x1F2F, 0x1F29, 0x0342, 0,
- 1, 0x1F30, 0x03B9, 0x0313, 0,
- 1, 0x1F31, 0x03B9, 0x0314, 0,
- 1, 0x1F32, 0x1F30, 0x0300, 0,
- 1, 0x1F33, 0x1F31, 0x0300, 0,
- 1, 0x1F34, 0x1F30, 0x0301, 0,
- 1, 0x1F35, 0x1F31, 0x0301, 0,
- 1, 0x1F36, 0x1F30, 0x0342, 0,
- 1, 0x1F37, 0x1F31, 0x0342, 0,
- 1, 0x1F38, 0x0399, 0x0313, 0,
- 1, 0x1F39, 0x0399, 0x0314, 0,
- 1, 0x1F3A, 0x1F38, 0x0300, 0,
- 1, 0x1F3B, 0x1F39, 0x0300, 0,
- 1, 0x1F3C, 0x1F38, 0x0301, 0,
- 1, 0x1F3D, 0x1F39, 0x0301, 0,
- 1, 0x1F3E, 0x1F38, 0x0342, 0,
- 1, 0x1F3F, 0x1F39, 0x0342, 0,
- 1, 0x1F40, 0x03BF, 0x0313, 0,
- 1, 0x1F41, 0x03BF, 0x0314, 0,
- 1, 0x1F42, 0x1F40, 0x0300, 0,
- 1, 0x1F43, 0x1F41, 0x0300, 0,
- 1, 0x1F44, 0x1F40, 0x0301, 0,
- 1, 0x1F45, 0x1F41, 0x0301, 0,
- 1, 0x1F48, 0x039F, 0x0313, 0,
- 1, 0x1F49, 0x039F, 0x0314, 0,
- 1, 0x1F4A, 0x1F48, 0x0300, 0,
- 1, 0x1F4B, 0x1F49, 0x0300, 0,
- 1, 0x1F4C, 0x1F48, 0x0301, 0,
- 1, 0x1F4D, 0x1F49, 0x0301, 0,
- 1, 0x1F50, 0x03C5, 0x0313, 0,
- 1, 0x1F51, 0x03C5, 0x0314, 0,
- 1, 0x1F52, 0x1F50, 0x0300, 0,
- 1, 0x1F53, 0x1F51, 0x0300, 0,
- 1, 0x1F54, 0x1F50, 0x0301, 0,
- 1, 0x1F55, 0x1F51, 0x0301, 0,
- 1, 0x1F56, 0x1F50, 0x0342, 0,
- 1, 0x1F57, 0x1F51, 0x0342, 0,
- 1, 0x1F59, 0x03A5, 0x0314, 0,
- 1, 0x1F5B, 0x1F59, 0x0300, 0,
- 1, 0x1F5D, 0x1F59, 0x0301, 0,
- 1, 0x1F5F, 0x1F59, 0x0342, 0,
- 1, 0x1F60, 0x03C9, 0x0313, 0,
- 1, 0x1F61, 0x03C9, 0x0314, 0,
- 1, 0x1F62, 0x1F60, 0x0300, 0,
- 1, 0x1F63, 0x1F61, 0x0300, 0,
- 1, 0x1F64, 0x1F60, 0x0301, 0,
- 1, 0x1F65, 0x1F61, 0x0301, 0,
- 1, 0x1F66, 0x1F60, 0x0342, 0,
- 1, 0x1F67, 0x1F61, 0x0342, 0,
- 1, 0x1F68, 0x03A9, 0x0313, 0,
- 1, 0x1F69, 0x03A9, 0x0314, 0,
- 1, 0x1F6A, 0x1F68, 0x0300, 0,
- 1, 0x1F6B, 0x1F69, 0x0300, 0,
- 1, 0x1F6C, 0x1F68, 0x0301, 0,
- 1, 0x1F6D, 0x1F69, 0x0301, 0,
- 1, 0x1F6E, 0x1F68, 0x0342, 0,
- 1, 0x1F6F, 0x1F69, 0x0342, 0,
- 1, 0x1F70, 0x03B1, 0x0300, 0,
- 1, 0x1F71, 0x03AC, 0,
- 1, 0x1F72, 0x03B5, 0x0300, 0,
- 1, 0x1F73, 0x03AD, 0,
- 1, 0x1F74, 0x03B7, 0x0300, 0,
- 1, 0x1F75, 0x03AE, 0,
- 1, 0x1F76, 0x03B9, 0x0300, 0,
- 1, 0x1F77, 0x03AF, 0,
- 1, 0x1F78, 0x03BF, 0x0300, 0,
- 1, 0x1F79, 0x03CC, 0,
- 1, 0x1F7A, 0x03C5, 0x0300, 0,
- 1, 0x1F7B, 0x03CD, 0,
- 1, 0x1F7C, 0x03C9, 0x0300, 0,
- 1, 0x1F7D, 0x03CE, 0,
- 1, 0x1F80, 0x1F00, 0x0345, 0,
- 1, 0x1F81, 0x1F01, 0x0345, 0,
- 1, 0x1F82, 0x1F02, 0x0345, 0,
- 1, 0x1F83, 0x1F03, 0x0345, 0,
- 1, 0x1F84, 0x1F04, 0x0345, 0,
- 1, 0x1F85, 0x1F05, 0x0345, 0,
- 1, 0x1F86, 0x1F06, 0x0345, 0,
- 1, 0x1F87, 0x1F07, 0x0345, 0,
- 1, 0x1F88, 0x1F08, 0x0345, 0,
- 1, 0x1F89, 0x1F09, 0x0345, 0,
- 1, 0x1F8A, 0x1F0A, 0x0345, 0,
- 1, 0x1F8B, 0x1F0B, 0x0345, 0,
- 1, 0x1F8C, 0x1F0C, 0x0345, 0,
- 1, 0x1F8D, 0x1F0D, 0x0345, 0,
- 1, 0x1F8E, 0x1F0E, 0x0345, 0,
- 1, 0x1F8F, 0x1F0F, 0x0345, 0,
- 1, 0x1F90, 0x1F20, 0x0345, 0,
- 1, 0x1F91, 0x1F21, 0x0345, 0,
- 1, 0x1F92, 0x1F22, 0x0345, 0,
- 1, 0x1F93, 0x1F23, 0x0345, 0,
- 1, 0x1F94, 0x1F24, 0x0345, 0,
- 1, 0x1F95, 0x1F25, 0x0345, 0,
- 1, 0x1F96, 0x1F26, 0x0345, 0,
- 1, 0x1F97, 0x1F27, 0x0345, 0,
- 1, 0x1F98, 0x1F28, 0x0345, 0,
- 1, 0x1F99, 0x1F29, 0x0345, 0,
- 1, 0x1F9A, 0x1F2A, 0x0345, 0,
- 1, 0x1F9B, 0x1F2B, 0x0345, 0,
- 1, 0x1F9C, 0x1F2C, 0x0345, 0,
- 1, 0x1F9D, 0x1F2D, 0x0345, 0,
- 1, 0x1F9E, 0x1F2E, 0x0345, 0,
- 1, 0x1F9F, 0x1F2F, 0x0345, 0,
- 1, 0x1FA0, 0x1F60, 0x0345, 0,
- 1, 0x1FA1, 0x1F61, 0x0345, 0,
- 1, 0x1FA2, 0x1F62, 0x0345, 0,
- 1, 0x1FA3, 0x1F63, 0x0345, 0,
- 1, 0x1FA4, 0x1F64, 0x0345, 0,
- 1, 0x1FA5, 0x1F65, 0x0345, 0,
- 1, 0x1FA6, 0x1F66, 0x0345, 0,
- 1, 0x1FA7, 0x1F67, 0x0345, 0,
- 1, 0x1FA8, 0x1F68, 0x0345, 0,
- 1, 0x1FA9, 0x1F69, 0x0345, 0,
- 1, 0x1FAA, 0x1F6A, 0x0345, 0,
- 1, 0x1FAB, 0x1F6B, 0x0345, 0,
- 1, 0x1FAC, 0x1F6C, 0x0345, 0,
- 1, 0x1FAD, 0x1F6D, 0x0345, 0,
- 1, 0x1FAE, 0x1F6E, 0x0345, 0,
- 1, 0x1FAF, 0x1F6F, 0x0345, 0,
- 1, 0x1FB0, 0x03B1, 0x0306, 0,
- 1, 0x1FB1, 0x03B1, 0x0304, 0,
- 1, 0x1FB2, 0x1F70, 0x0345, 0,
- 1, 0x1FB3, 0x03B1, 0x0345, 0,
- 1, 0x1FB4, 0x03AC, 0x0345, 0,
- 1, 0x1FB6, 0x03B1, 0x0342, 0,
- 1, 0x1FB7, 0x1FB6, 0x0345, 0,
- 1, 0x1FB8, 0x0391, 0x0306, 0,
- 1, 0x1FB9, 0x0391, 0x0304, 0,
- 1, 0x1FBA, 0x0391, 0x0300, 0,
- 1, 0x1FBB, 0x0386, 0,
- 1, 0x1FBC, 0x0391, 0x0345, 0,
- 16, 0x1FBD, 0x0020, 0x0313, 0,
- 1, 0x1FBE, 0x03B9, 0,
- 16, 0x1FBF, 0x0020, 0x0313, 0,
- 16, 0x1FC0, 0x0020, 0x0342, 0,
- 1, 0x1FC1, 0x00A8, 0x0342, 0,
- 1, 0x1FC2, 0x1F74, 0x0345, 0,
- 1, 0x1FC3, 0x03B7, 0x0345, 0,
- 1, 0x1FC4, 0x03AE, 0x0345, 0,
- 1, 0x1FC6, 0x03B7, 0x0342, 0,
- 1, 0x1FC7, 0x1FC6, 0x0345, 0,
- 1, 0x1FC8, 0x0395, 0x0300, 0,
- 1, 0x1FC9, 0x0388, 0,
- 1, 0x1FCA, 0x0397, 0x0300, 0,
- 1, 0x1FCB, 0x0389, 0,
- 1, 0x1FCC, 0x0397, 0x0345, 0,
- 1, 0x1FCD, 0x1FBF, 0x0300, 0,
- 1, 0x1FCE, 0x1FBF, 0x0301, 0,
- 1, 0x1FCF, 0x1FBF, 0x0342, 0,
- 1, 0x1FD0, 0x03B9, 0x0306, 0,
- 1, 0x1FD1, 0x03B9, 0x0304, 0,
- 1, 0x1FD2, 0x03CA, 0x0300, 0,
- 1, 0x1FD3, 0x0390, 0,
- 1, 0x1FD6, 0x03B9, 0x0342, 0,
- 1, 0x1FD7, 0x03CA, 0x0342, 0,
- 1, 0x1FD8, 0x0399, 0x0306, 0,
- 1, 0x1FD9, 0x0399, 0x0304, 0,
- 1, 0x1FDA, 0x0399, 0x0300, 0,
- 1, 0x1FDB, 0x038A, 0,
- 1, 0x1FDD, 0x1FFE, 0x0300, 0,
- 1, 0x1FDE, 0x1FFE, 0x0301, 0,
- 1, 0x1FDF, 0x1FFE, 0x0342, 0,
- 1, 0x1FE0, 0x03C5, 0x0306, 0,
- 1, 0x1FE1, 0x03C5, 0x0304, 0,
- 1, 0x1FE2, 0x03CB, 0x0300, 0,
- 1, 0x1FE3, 0x03B0, 0,
- 1, 0x1FE4, 0x03C1, 0x0313, 0,
- 1, 0x1FE5, 0x03C1, 0x0314, 0,
- 1, 0x1FE6, 0x03C5, 0x0342, 0,
- 1, 0x1FE7, 0x03CB, 0x0342, 0,
- 1, 0x1FE8, 0x03A5, 0x0306, 0,
- 1, 0x1FE9, 0x03A5, 0x0304, 0,
- 1, 0x1FEA, 0x03A5, 0x0300, 0,
- 1, 0x1FEB, 0x038E, 0,
- 1, 0x1FEC, 0x03A1, 0x0314, 0,
- 1, 0x1FED, 0x00A8, 0x0300, 0,
- 1, 0x1FEE, 0x0385, 0,
- 1, 0x1FEF, 0x0060, 0,
- 1, 0x1FF2, 0x1F7C, 0x0345, 0,
- 1, 0x1FF3, 0x03C9, 0x0345, 0,
- 1, 0x1FF4, 0x03CE, 0x0345, 0,
- 1, 0x1FF6, 0x03C9, 0x0342, 0,
- 1, 0x1FF7, 0x1FF6, 0x0345, 0,
- 1, 0x1FF8, 0x039F, 0x0300, 0,
- 1, 0x1FF9, 0x038C, 0,
- 1, 0x1FFA, 0x03A9, 0x0300, 0,
- 1, 0x1FFB, 0x038F, 0,
- 1, 0x1FFC, 0x03A9, 0x0345, 0,
- 1, 0x1FFD, 0x00B4, 0,
- 16, 0x1FFE, 0x0020, 0x0314, 0,
- 1, 0x2000, 0x2002, 0,
- 1, 0x2001, 0x2003, 0,
- 16, 0x2002, 0x0020, 0,
- 16, 0x2003, 0x0020, 0,
- 16, 0x2004, 0x0020, 0,
- 16, 0x2005, 0x0020, 0,
- 16, 0x2006, 0x0020, 0,
- 3, 0x2007, 0x0020, 0,
- 16, 0x2008, 0x0020, 0,
- 16, 0x2009, 0x0020, 0,
- 16, 0x200A, 0x0020, 0,
- 3, 0x2011, 0x2010, 0,
- 16, 0x2017, 0x0020, 0x0333, 0,
- 16, 0x2024, 0x002E, 0,
- 16, 0x2025, 0x002E, 0x002E, 0,
- 16, 0x2026, 0x002E, 0x002E, 0x002E, 0,
- 3, 0x202F, 0x0020, 0,
- 16, 0x2033, 0x2032, 0x2032, 0,
- 16, 0x2034, 0x2032, 0x2032, 0x2032, 0,
- 16, 0x2036, 0x2035, 0x2035, 0,
- 16, 0x2037, 0x2035, 0x2035, 0x2035, 0,
- 16, 0x203C, 0x0021, 0x0021, 0,
- 16, 0x203E, 0x0020, 0x0305, 0,
- 16, 0x2048, 0x003F, 0x0021, 0,
- 16, 0x2049, 0x0021, 0x003F, 0,
- 9, 0x2070, 0x0030, 0,
- 9, 0x2074, 0x0034, 0,
- 9, 0x2075, 0x0035, 0,
- 9, 0x2076, 0x0036, 0,
- 9, 0x2077, 0x0037, 0,
- 9, 0x2078, 0x0038, 0,
- 9, 0x2079, 0x0039, 0,
- 9, 0x207A, 0x002B, 0,
- 9, 0x207B, 0x2212, 0,
- 9, 0x207C, 0x003D, 0,
- 9, 0x207D, 0x0028, 0,
- 9, 0x207E, 0x0029, 0,
- 9, 0x207F, 0x006E, 0,
- 10, 0x2080, 0x0030, 0,
- 10, 0x2081, 0x0031, 0,
- 10, 0x2082, 0x0032, 0,
- 10, 0x2083, 0x0033, 0,
- 10, 0x2084, 0x0034, 0,
- 10, 0x2085, 0x0035, 0,
- 10, 0x2086, 0x0036, 0,
- 10, 0x2087, 0x0037, 0,
- 10, 0x2088, 0x0038, 0,
- 10, 0x2089, 0x0039, 0,
- 10, 0x208A, 0x002B, 0,
- 10, 0x208B, 0x2212, 0,
- 10, 0x208C, 0x003D, 0,
- 10, 0x208D, 0x0028, 0,
- 10, 0x208E, 0x0029, 0,
- 16, 0x20A8, 0x0052, 0x0073, 0,
- 16, 0x2100, 0x0061, 0x002F, 0x0063, 0,
- 16, 0x2101, 0x0061, 0x002F, 0x0073, 0,
- 2, 0x2102, 0x0043, 0,
- 16, 0x2103, 0x00B0, 0x0043, 0,
- 16, 0x2105, 0x0063, 0x002F, 0x006F, 0,
- 16, 0x2106, 0x0063, 0x002F, 0x0075, 0,
- 16, 0x2107, 0x0190, 0,
- 16, 0x2109, 0x00B0, 0x0046, 0,
- 2, 0x210A, 0x0067, 0,
- 2, 0x210B, 0x0048, 0,
- 2, 0x210C, 0x0048, 0,
- 2, 0x210D, 0x0048, 0,
- 2, 0x210E, 0x0068, 0,
- 2, 0x210F, 0x0127, 0,
- 2, 0x2110, 0x0049, 0,
- 2, 0x2111, 0x0049, 0,
- 2, 0x2112, 0x004C, 0,
- 2, 0x2113, 0x006C, 0,
- 2, 0x2115, 0x004E, 0,
- 16, 0x2116, 0x004E, 0x006F, 0,
- 2, 0x2119, 0x0050, 0,
- 2, 0x211A, 0x0051, 0,
- 2, 0x211B, 0x0052, 0,
- 2, 0x211C, 0x0052, 0,
- 2, 0x211D, 0x0052, 0,
- 9, 0x2120, 0x0053, 0x004D, 0,
- 16, 0x2121, 0x0054, 0x0045, 0x004C, 0,
- 9, 0x2122, 0x0054, 0x004D, 0,
- 2, 0x2124, 0x005A, 0,
- 1, 0x2126, 0x03A9, 0,
- 2, 0x2128, 0x005A, 0,
- 1, 0x212A, 0x004B, 0,
- 1, 0x212B, 0x00C5, 0,
- 2, 0x212C, 0x0042, 0,
- 2, 0x212D, 0x0043, 0,
- 2, 0x212F, 0x0065, 0,
- 2, 0x2130, 0x0045, 0,
- 2, 0x2131, 0x0046, 0,
- 2, 0x2133, 0x004D, 0,
- 2, 0x2134, 0x006F, 0,
- 16, 0x2135, 0x05D0, 0,
- 16, 0x2136, 0x05D1, 0,
- 16, 0x2137, 0x05D2, 0,
- 16, 0x2138, 0x05D3, 0,
- 2, 0x2139, 0x0069, 0,
- 17, 0x2153, 0x0031, 0x2044, 0x0033, 0,
- 17, 0x2154, 0x0032, 0x2044, 0x0033, 0,
- 17, 0x2155, 0x0031, 0x2044, 0x0035, 0,
- 17, 0x2156, 0x0032, 0x2044, 0x0035, 0,
- 17, 0x2157, 0x0033, 0x2044, 0x0035, 0,
- 17, 0x2158, 0x0034, 0x2044, 0x0035, 0,
- 17, 0x2159, 0x0031, 0x2044, 0x0036, 0,
- 17, 0x215A, 0x0035, 0x2044, 0x0036, 0,
- 17, 0x215B, 0x0031, 0x2044, 0x0038, 0,
- 17, 0x215C, 0x0033, 0x2044, 0x0038, 0,
- 17, 0x215D, 0x0035, 0x2044, 0x0038, 0,
- 17, 0x215E, 0x0037, 0x2044, 0x0038, 0,
- 17, 0x215F, 0x0031, 0x2044, 0,
- 16, 0x2160, 0x0049, 0,
- 16, 0x2161, 0x0049, 0x0049, 0,
- 16, 0x2162, 0x0049, 0x0049, 0x0049, 0,
- 16, 0x2163, 0x0049, 0x0056, 0,
- 16, 0x2164, 0x0056, 0,
- 16, 0x2165, 0x0056, 0x0049, 0,
- 16, 0x2166, 0x0056, 0x0049, 0x0049, 0,
- 16, 0x2167, 0x0056, 0x0049, 0x0049, 0x0049, 0,
- 16, 0x2168, 0x0049, 0x0058, 0,
- 16, 0x2169, 0x0058, 0,
- 16, 0x216A, 0x0058, 0x0049, 0,
- 16, 0x216B, 0x0058, 0x0049, 0x0049, 0,
- 16, 0x216C, 0x004C, 0,
- 16, 0x216D, 0x0043, 0,
- 16, 0x216E, 0x0044, 0,
- 16, 0x216F, 0x004D, 0,
- 16, 0x2170, 0x0069, 0,
- 16, 0x2171, 0x0069, 0x0069, 0,
- 16, 0x2172, 0x0069, 0x0069, 0x0069, 0,
- 16, 0x2173, 0x0069, 0x0076, 0,
- 16, 0x2174, 0x0076, 0,
- 16, 0x2175, 0x0076, 0x0069, 0,
- 16, 0x2176, 0x0076, 0x0069, 0x0069, 0,
- 16, 0x2177, 0x0076, 0x0069, 0x0069, 0x0069, 0,
- 16, 0x2178, 0x0069, 0x0078, 0,
- 16, 0x2179, 0x0078, 0,
- 16, 0x217A, 0x0078, 0x0069, 0,
- 16, 0x217B, 0x0078, 0x0069, 0x0069, 0,
- 16, 0x217C, 0x006C, 0,
- 16, 0x217D, 0x0063, 0,
- 16, 0x217E, 0x0064, 0,
- 16, 0x217F, 0x006D, 0,
- 1, 0x219A, 0x2190, 0x0338, 0,
- 1, 0x219B, 0x2192, 0x0338, 0,
- 1, 0x21AE, 0x2194, 0x0338, 0,
- 1, 0x21CD, 0x21D0, 0x0338, 0,
- 1, 0x21CE, 0x21D4, 0x0338, 0,
- 1, 0x21CF, 0x21D2, 0x0338, 0,
- 1, 0x2204, 0x2203, 0x0338, 0,
- 1, 0x2209, 0x2208, 0x0338, 0,
- 1, 0x220C, 0x220B, 0x0338, 0,
- 1, 0x2224, 0x2223, 0x0338, 0,
- 1, 0x2226, 0x2225, 0x0338, 0,
- 16, 0x222C, 0x222B, 0x222B, 0,
- 16, 0x222D, 0x222B, 0x222B, 0x222B, 0,
- 16, 0x222F, 0x222E, 0x222E, 0,
- 16, 0x2230, 0x222E, 0x222E, 0x222E, 0,
- 1, 0x2241, 0x223C, 0x0338, 0,
- 1, 0x2244, 0x2243, 0x0338, 0,
- 1, 0x2247, 0x2245, 0x0338, 0,
- 1, 0x2249, 0x2248, 0x0338, 0,
- 1, 0x2260, 0x003D, 0x0338, 0,
- 1, 0x2262, 0x2261, 0x0338, 0,
- 1, 0x226D, 0x224D, 0x0338, 0,
- 1, 0x226E, 0x003C, 0x0338, 0,
- 1, 0x226F, 0x003E, 0x0338, 0,
- 1, 0x2270, 0x2264, 0x0338, 0,
- 1, 0x2271, 0x2265, 0x0338, 0,
- 1, 0x2274, 0x2272, 0x0338, 0,
- 1, 0x2275, 0x2273, 0x0338, 0,
- 1, 0x2278, 0x2276, 0x0338, 0,
- 1, 0x2279, 0x2277, 0x0338, 0,
- 1, 0x2280, 0x227A, 0x0338, 0,
- 1, 0x2281, 0x227B, 0x0338, 0,
- 1, 0x2284, 0x2282, 0x0338, 0,
- 1, 0x2285, 0x2283, 0x0338, 0,
- 1, 0x2288, 0x2286, 0x0338, 0,
- 1, 0x2289, 0x2287, 0x0338, 0,
- 1, 0x22AC, 0x22A2, 0x0338, 0,
- 1, 0x22AD, 0x22A8, 0x0338, 0,
- 1, 0x22AE, 0x22A9, 0x0338, 0,
- 1, 0x22AF, 0x22AB, 0x0338, 0,
- 1, 0x22E0, 0x227C, 0x0338, 0,
- 1, 0x22E1, 0x227D, 0x0338, 0,
- 1, 0x22E2, 0x2291, 0x0338, 0,
- 1, 0x22E3, 0x2292, 0x0338, 0,
- 1, 0x22EA, 0x22B2, 0x0338, 0,
- 1, 0x22EB, 0x22B3, 0x0338, 0,
- 1, 0x22EC, 0x22B4, 0x0338, 0,
- 1, 0x22ED, 0x22B5, 0x0338, 0,
- 1, 0x2329, 0x3008, 0,
- 1, 0x232A, 0x3009, 0,
- 8, 0x2460, 0x0031, 0,
- 8, 0x2461, 0x0032, 0,
- 8, 0x2462, 0x0033, 0,
- 8, 0x2463, 0x0034, 0,
- 8, 0x2464, 0x0035, 0,
- 8, 0x2465, 0x0036, 0,
- 8, 0x2466, 0x0037, 0,
- 8, 0x2467, 0x0038, 0,
- 8, 0x2468, 0x0039, 0,
- 8, 0x2469, 0x0031, 0x0030, 0,
- 8, 0x246A, 0x0031, 0x0031, 0,
- 8, 0x246B, 0x0031, 0x0032, 0,
- 8, 0x246C, 0x0031, 0x0033, 0,
- 8, 0x246D, 0x0031, 0x0034, 0,
- 8, 0x246E, 0x0031, 0x0035, 0,
- 8, 0x246F, 0x0031, 0x0036, 0,
- 8, 0x2470, 0x0031, 0x0037, 0,
- 8, 0x2471, 0x0031, 0x0038, 0,
- 8, 0x2472, 0x0031, 0x0039, 0,
- 8, 0x2473, 0x0032, 0x0030, 0,
- 16, 0x2474, 0x0028, 0x0031, 0x0029, 0,
- 16, 0x2475, 0x0028, 0x0032, 0x0029, 0,
- 16, 0x2476, 0x0028, 0x0033, 0x0029, 0,
- 16, 0x2477, 0x0028, 0x0034, 0x0029, 0,
- 16, 0x2478, 0x0028, 0x0035, 0x0029, 0,
- 16, 0x2479, 0x0028, 0x0036, 0x0029, 0,
- 16, 0x247A, 0x0028, 0x0037, 0x0029, 0,
- 16, 0x247B, 0x0028, 0x0038, 0x0029, 0,
- 16, 0x247C, 0x0028, 0x0039, 0x0029, 0,
- 16, 0x247D, 0x0028, 0x0031, 0x0030, 0x0029, 0,
- 16, 0x247E, 0x0028, 0x0031, 0x0031, 0x0029, 0,
- 16, 0x247F, 0x0028, 0x0031, 0x0032, 0x0029, 0,
- 16, 0x2480, 0x0028, 0x0031, 0x0033, 0x0029, 0,
- 16, 0x2481, 0x0028, 0x0031, 0x0034, 0x0029, 0,
- 16, 0x2482, 0x0028, 0x0031, 0x0035, 0x0029, 0,
- 16, 0x2483, 0x0028, 0x0031, 0x0036, 0x0029, 0,
- 16, 0x2484, 0x0028, 0x0031, 0x0037, 0x0029, 0,
- 16, 0x2485, 0x0028, 0x0031, 0x0038, 0x0029, 0,
- 16, 0x2486, 0x0028, 0x0031, 0x0039, 0x0029, 0,
- 16, 0x2487, 0x0028, 0x0032, 0x0030, 0x0029, 0,
- 16, 0x2488, 0x0031, 0x002E, 0,
- 16, 0x2489, 0x0032, 0x002E, 0,
- 16, 0x248A, 0x0033, 0x002E, 0,
- 16, 0x248B, 0x0034, 0x002E, 0,
- 16, 0x248C, 0x0035, 0x002E, 0,
- 16, 0x248D, 0x0036, 0x002E, 0,
- 16, 0x248E, 0x0037, 0x002E, 0,
- 16, 0x248F, 0x0038, 0x002E, 0,
- 16, 0x2490, 0x0039, 0x002E, 0,
- 16, 0x2491, 0x0031, 0x0030, 0x002E, 0,
- 16, 0x2492, 0x0031, 0x0031, 0x002E, 0,
- 16, 0x2493, 0x0031, 0x0032, 0x002E, 0,
- 16, 0x2494, 0x0031, 0x0033, 0x002E, 0,
- 16, 0x2495, 0x0031, 0x0034, 0x002E, 0,
- 16, 0x2496, 0x0031, 0x0035, 0x002E, 0,
- 16, 0x2497, 0x0031, 0x0036, 0x002E, 0,
- 16, 0x2498, 0x0031, 0x0037, 0x002E, 0,
- 16, 0x2499, 0x0031, 0x0038, 0x002E, 0,
- 16, 0x249A, 0x0031, 0x0039, 0x002E, 0,
- 16, 0x249B, 0x0032, 0x0030, 0x002E, 0,
- 16, 0x249C, 0x0028, 0x0061, 0x0029, 0,
- 16, 0x249D, 0x0028, 0x0062, 0x0029, 0,
- 16, 0x249E, 0x0028, 0x0063, 0x0029, 0,
- 16, 0x249F, 0x0028, 0x0064, 0x0029, 0,
- 16, 0x24A0, 0x0028, 0x0065, 0x0029, 0,
- 16, 0x24A1, 0x0028, 0x0066, 0x0029, 0,
- 16, 0x24A2, 0x0028, 0x0067, 0x0029, 0,
- 16, 0x24A3, 0x0028, 0x0068, 0x0029, 0,
- 16, 0x24A4, 0x0028, 0x0069, 0x0029, 0,
- 16, 0x24A5, 0x0028, 0x006A, 0x0029, 0,
- 16, 0x24A6, 0x0028, 0x006B, 0x0029, 0,
- 16, 0x24A7, 0x0028, 0x006C, 0x0029, 0,
- 16, 0x24A8, 0x0028, 0x006D, 0x0029, 0,
- 16, 0x24A9, 0x0028, 0x006E, 0x0029, 0,
- 16, 0x24AA, 0x0028, 0x006F, 0x0029, 0,
- 16, 0x24AB, 0x0028, 0x0070, 0x0029, 0,
- 16, 0x24AC, 0x0028, 0x0071, 0x0029, 0,
- 16, 0x24AD, 0x0028, 0x0072, 0x0029, 0,
- 16, 0x24AE, 0x0028, 0x0073, 0x0029, 0,
- 16, 0x24AF, 0x0028, 0x0074, 0x0029, 0,
- 16, 0x24B0, 0x0028, 0x0075, 0x0029, 0,
- 16, 0x24B1, 0x0028, 0x0076, 0x0029, 0,
- 16, 0x24B2, 0x0028, 0x0077, 0x0029, 0,
- 16, 0x24B3, 0x0028, 0x0078, 0x0029, 0,
- 16, 0x24B4, 0x0028, 0x0079, 0x0029, 0,
- 16, 0x24B5, 0x0028, 0x007A, 0x0029, 0,
- 8, 0x24B6, 0x0041, 0,
- 8, 0x24B7, 0x0042, 0,
- 8, 0x24B8, 0x0043, 0,
- 8, 0x24B9, 0x0044, 0,
- 8, 0x24BA, 0x0045, 0,
- 8, 0x24BB, 0x0046, 0,
- 8, 0x24BC, 0x0047, 0,
- 8, 0x24BD, 0x0048, 0,
- 8, 0x24BE, 0x0049, 0,
- 8, 0x24BF, 0x004A, 0,
- 8, 0x24C0, 0x004B, 0,
- 8, 0x24C1, 0x004C, 0,
- 8, 0x24C2, 0x004D, 0,
- 8, 0x24C3, 0x004E, 0,
- 8, 0x24C4, 0x004F, 0,
- 8, 0x24C5, 0x0050, 0,
- 8, 0x24C6, 0x0051, 0,
- 8, 0x24C7, 0x0052, 0,
- 8, 0x24C8, 0x0053, 0,
- 8, 0x24C9, 0x0054, 0,
- 8, 0x24CA, 0x0055, 0,
- 8, 0x24CB, 0x0056, 0,
- 8, 0x24CC, 0x0057, 0,
- 8, 0x24CD, 0x0058, 0,
- 8, 0x24CE, 0x0059, 0,
- 8, 0x24CF, 0x005A, 0,
- 8, 0x24D0, 0x0061, 0,
- 8, 0x24D1, 0x0062, 0,
- 8, 0x24D2, 0x0063, 0,
- 8, 0x24D3, 0x0064, 0,
- 8, 0x24D4, 0x0065, 0,
- 8, 0x24D5, 0x0066, 0,
- 8, 0x24D6, 0x0067, 0,
- 8, 0x24D7, 0x0068, 0,
- 8, 0x24D8, 0x0069, 0,
- 8, 0x24D9, 0x006A, 0,
- 8, 0x24DA, 0x006B, 0,
- 8, 0x24DB, 0x006C, 0,
- 8, 0x24DC, 0x006D, 0,
- 8, 0x24DD, 0x006E, 0,
- 8, 0x24DE, 0x006F, 0,
- 8, 0x24DF, 0x0070, 0,
- 8, 0x24E0, 0x0071, 0,
- 8, 0x24E1, 0x0072, 0,
- 8, 0x24E2, 0x0073, 0,
- 8, 0x24E3, 0x0074, 0,
- 8, 0x24E4, 0x0075, 0,
- 8, 0x24E5, 0x0076, 0,
- 8, 0x24E6, 0x0077, 0,
- 8, 0x24E7, 0x0078, 0,
- 8, 0x24E8, 0x0079, 0,
- 8, 0x24E9, 0x007A, 0,
- 8, 0x24EA, 0x0030, 0,
- 16, 0x2E9F, 0x6BCD, 0,
- 16, 0x2EF3, 0x9F9F, 0,
- 16, 0x2F00, 0x4E00, 0,
- 16, 0x2F01, 0x4E28, 0,
- 16, 0x2F02, 0x4E36, 0,
- 16, 0x2F03, 0x4E3F, 0,
- 16, 0x2F04, 0x4E59, 0,
- 16, 0x2F05, 0x4E85, 0,
- 16, 0x2F06, 0x4E8C, 0,
- 16, 0x2F07, 0x4EA0, 0,
- 16, 0x2F08, 0x4EBA, 0,
- 16, 0x2F09, 0x513F, 0,
- 16, 0x2F0A, 0x5165, 0,
- 16, 0x2F0B, 0x516B, 0,
- 16, 0x2F0C, 0x5182, 0,
- 16, 0x2F0D, 0x5196, 0,
- 16, 0x2F0E, 0x51AB, 0,
- 16, 0x2F0F, 0x51E0, 0,
- 16, 0x2F10, 0x51F5, 0,
- 16, 0x2F11, 0x5200, 0,
- 16, 0x2F12, 0x529B, 0,
- 16, 0x2F13, 0x52F9, 0,
- 16, 0x2F14, 0x5315, 0,
- 16, 0x2F15, 0x531A, 0,
- 16, 0x2F16, 0x5338, 0,
- 16, 0x2F17, 0x5341, 0,
- 16, 0x2F18, 0x535C, 0,
- 16, 0x2F19, 0x5369, 0,
- 16, 0x2F1A, 0x5382, 0,
- 16, 0x2F1B, 0x53B6, 0,
- 16, 0x2F1C, 0x53C8, 0,
- 16, 0x2F1D, 0x53E3, 0,
- 16, 0x2F1E, 0x56D7, 0,
- 16, 0x2F1F, 0x571F, 0,
- 16, 0x2F20, 0x58EB, 0,
- 16, 0x2F21, 0x5902, 0,
- 16, 0x2F22, 0x590A, 0,
- 16, 0x2F23, 0x5915, 0,
- 16, 0x2F24, 0x5927, 0,
- 16, 0x2F25, 0x5973, 0,
- 16, 0x2F26, 0x5B50, 0,
- 16, 0x2F27, 0x5B80, 0,
- 16, 0x2F28, 0x5BF8, 0,
- 16, 0x2F29, 0x5C0F, 0,
- 16, 0x2F2A, 0x5C22, 0,
- 16, 0x2F2B, 0x5C38, 0,
- 16, 0x2F2C, 0x5C6E, 0,
- 16, 0x2F2D, 0x5C71, 0,
- 16, 0x2F2E, 0x5DDB, 0,
- 16, 0x2F2F, 0x5DE5, 0,
- 16, 0x2F30, 0x5DF1, 0,
- 16, 0x2F31, 0x5DFE, 0,
- 16, 0x2F32, 0x5E72, 0,
- 16, 0x2F33, 0x5E7A, 0,
- 16, 0x2F34, 0x5E7F, 0,
- 16, 0x2F35, 0x5EF4, 0,
- 16, 0x2F36, 0x5EFE, 0,
- 16, 0x2F37, 0x5F0B, 0,
- 16, 0x2F38, 0x5F13, 0,
- 16, 0x2F39, 0x5F50, 0,
- 16, 0x2F3A, 0x5F61, 0,
- 16, 0x2F3B, 0x5F73, 0,
- 16, 0x2F3C, 0x5FC3, 0,
- 16, 0x2F3D, 0x6208, 0,
- 16, 0x2F3E, 0x6236, 0,
- 16, 0x2F3F, 0x624B, 0,
- 16, 0x2F40, 0x652F, 0,
- 16, 0x2F41, 0x6534, 0,
- 16, 0x2F42, 0x6587, 0,
- 16, 0x2F43, 0x6597, 0,
- 16, 0x2F44, 0x65A4, 0,
- 16, 0x2F45, 0x65B9, 0,
- 16, 0x2F46, 0x65E0, 0,
- 16, 0x2F47, 0x65E5, 0,
- 16, 0x2F48, 0x66F0, 0,
- 16, 0x2F49, 0x6708, 0,
- 16, 0x2F4A, 0x6728, 0,
- 16, 0x2F4B, 0x6B20, 0,
- 16, 0x2F4C, 0x6B62, 0,
- 16, 0x2F4D, 0x6B79, 0,
- 16, 0x2F4E, 0x6BB3, 0,
- 16, 0x2F4F, 0x6BCB, 0,
- 16, 0x2F50, 0x6BD4, 0,
- 16, 0x2F51, 0x6BDB, 0,
- 16, 0x2F52, 0x6C0F, 0,
- 16, 0x2F53, 0x6C14, 0,
- 16, 0x2F54, 0x6C34, 0,
- 16, 0x2F55, 0x706B, 0,
- 16, 0x2F56, 0x722A, 0,
- 16, 0x2F57, 0x7236, 0,
- 16, 0x2F58, 0x723B, 0,
- 16, 0x2F59, 0x723F, 0,
- 16, 0x2F5A, 0x7247, 0,
- 16, 0x2F5B, 0x7259, 0,
- 16, 0x2F5C, 0x725B, 0,
- 16, 0x2F5D, 0x72AC, 0,
- 16, 0x2F5E, 0x7384, 0,
- 16, 0x2F5F, 0x7389, 0,
- 16, 0x2F60, 0x74DC, 0,
- 16, 0x2F61, 0x74E6, 0,
- 16, 0x2F62, 0x7518, 0,
- 16, 0x2F63, 0x751F, 0,
- 16, 0x2F64, 0x7528, 0,
- 16, 0x2F65, 0x7530, 0,
- 16, 0x2F66, 0x758B, 0,
- 16, 0x2F67, 0x7592, 0,
- 16, 0x2F68, 0x7676, 0,
- 16, 0x2F69, 0x767D, 0,
- 16, 0x2F6A, 0x76AE, 0,
- 16, 0x2F6B, 0x76BF, 0,
- 16, 0x2F6C, 0x76EE, 0,
- 16, 0x2F6D, 0x77DB, 0,
- 16, 0x2F6E, 0x77E2, 0,
- 16, 0x2F6F, 0x77F3, 0,
- 16, 0x2F70, 0x793A, 0,
- 16, 0x2F71, 0x79B8, 0,
- 16, 0x2F72, 0x79BE, 0,
- 16, 0x2F73, 0x7A74, 0,
- 16, 0x2F74, 0x7ACB, 0,
- 16, 0x2F75, 0x7AF9, 0,
- 16, 0x2F76, 0x7C73, 0,
- 16, 0x2F77, 0x7CF8, 0,
- 16, 0x2F78, 0x7F36, 0,
- 16, 0x2F79, 0x7F51, 0,
- 16, 0x2F7A, 0x7F8A, 0,
- 16, 0x2F7B, 0x7FBD, 0,
- 16, 0x2F7C, 0x8001, 0,
- 16, 0x2F7D, 0x800C, 0,
- 16, 0x2F7E, 0x8012, 0,
- 16, 0x2F7F, 0x8033, 0,
- 16, 0x2F80, 0x807F, 0,
- 16, 0x2F81, 0x8089, 0,
- 16, 0x2F82, 0x81E3, 0,
- 16, 0x2F83, 0x81EA, 0,
- 16, 0x2F84, 0x81F3, 0,
- 16, 0x2F85, 0x81FC, 0,
- 16, 0x2F86, 0x820C, 0,
- 16, 0x2F87, 0x821B, 0,
- 16, 0x2F88, 0x821F, 0,
- 16, 0x2F89, 0x826E, 0,
- 16, 0x2F8A, 0x8272, 0,
- 16, 0x2F8B, 0x8278, 0,
- 16, 0x2F8C, 0x864D, 0,
- 16, 0x2F8D, 0x866B, 0,
- 16, 0x2F8E, 0x8840, 0,
- 16, 0x2F8F, 0x884C, 0,
- 16, 0x2F90, 0x8863, 0,
- 16, 0x2F91, 0x897E, 0,
- 16, 0x2F92, 0x898B, 0,
- 16, 0x2F93, 0x89D2, 0,
- 16, 0x2F94, 0x8A00, 0,
- 16, 0x2F95, 0x8C37, 0,
- 16, 0x2F96, 0x8C46, 0,
- 16, 0x2F97, 0x8C55, 0,
- 16, 0x2F98, 0x8C78, 0,
- 16, 0x2F99, 0x8C9D, 0,
- 16, 0x2F9A, 0x8D64, 0,
- 16, 0x2F9B, 0x8D70, 0,
- 16, 0x2F9C, 0x8DB3, 0,
- 16, 0x2F9D, 0x8EAB, 0,
- 16, 0x2F9E, 0x8ECA, 0,
- 16, 0x2F9F, 0x8F9B, 0,
- 16, 0x2FA0, 0x8FB0, 0,
- 16, 0x2FA1, 0x8FB5, 0,
- 16, 0x2FA2, 0x9091, 0,
- 16, 0x2FA3, 0x9149, 0,
- 16, 0x2FA4, 0x91C6, 0,
- 16, 0x2FA5, 0x91CC, 0,
- 16, 0x2FA6, 0x91D1, 0,
- 16, 0x2FA7, 0x9577, 0,
- 16, 0x2FA8, 0x9580, 0,
- 16, 0x2FA9, 0x961C, 0,
- 16, 0x2FAA, 0x96B6, 0,
- 16, 0x2FAB, 0x96B9, 0,
- 16, 0x2FAC, 0x96E8, 0,
- 16, 0x2FAD, 0x9751, 0,
- 16, 0x2FAE, 0x975E, 0,
- 16, 0x2FAF, 0x9762, 0,
- 16, 0x2FB0, 0x9769, 0,
- 16, 0x2FB1, 0x97CB, 0,
- 16, 0x2FB2, 0x97ED, 0,
- 16, 0x2FB3, 0x97F3, 0,
- 16, 0x2FB4, 0x9801, 0,
- 16, 0x2FB5, 0x98A8, 0,
- 16, 0x2FB6, 0x98DB, 0,
- 16, 0x2FB7, 0x98DF, 0,
- 16, 0x2FB8, 0x9996, 0,
- 16, 0x2FB9, 0x9999, 0,
- 16, 0x2FBA, 0x99AC, 0,
- 16, 0x2FBB, 0x9AA8, 0,
- 16, 0x2FBC, 0x9AD8, 0,
- 16, 0x2FBD, 0x9ADF, 0,
- 16, 0x2FBE, 0x9B25, 0,
- 16, 0x2FBF, 0x9B2F, 0,
- 16, 0x2FC0, 0x9B32, 0,
- 16, 0x2FC1, 0x9B3C, 0,
- 16, 0x2FC2, 0x9B5A, 0,
- 16, 0x2FC3, 0x9CE5, 0,
- 16, 0x2FC4, 0x9E75, 0,
- 16, 0x2FC5, 0x9E7F, 0,
- 16, 0x2FC6, 0x9EA5, 0,
- 16, 0x2FC7, 0x9EBB, 0,
- 16, 0x2FC8, 0x9EC3, 0,
- 16, 0x2FC9, 0x9ECD, 0,
- 16, 0x2FCA, 0x9ED1, 0,
- 16, 0x2FCB, 0x9EF9, 0,
- 16, 0x2FCC, 0x9EFD, 0,
- 16, 0x2FCD, 0x9F0E, 0,
- 16, 0x2FCE, 0x9F13, 0,
- 16, 0x2FCF, 0x9F20, 0,
- 16, 0x2FD0, 0x9F3B, 0,
- 16, 0x2FD1, 0x9F4A, 0,
- 16, 0x2FD2, 0x9F52, 0,
- 16, 0x2FD3, 0x9F8D, 0,
- 16, 0x2FD4, 0x9F9C, 0,
- 16, 0x2FD5, 0x9FA0, 0,
- 12, 0x3000, 0x0020, 0,
- 16, 0x3036, 0x3012, 0,
- 16, 0x3038, 0x5341, 0,
- 16, 0x3039, 0x5344, 0,
- 16, 0x303A, 0x5345, 0,
- 1, 0x304C, 0x304B, 0x3099, 0,
- 1, 0x304E, 0x304D, 0x3099, 0,
- 1, 0x3050, 0x304F, 0x3099, 0,
- 1, 0x3052, 0x3051, 0x3099, 0,
- 1, 0x3054, 0x3053, 0x3099, 0,
- 1, 0x3056, 0x3055, 0x3099, 0,
- 1, 0x3058, 0x3057, 0x3099, 0,
- 1, 0x305A, 0x3059, 0x3099, 0,
- 1, 0x305C, 0x305B, 0x3099, 0,
- 1, 0x305E, 0x305D, 0x3099, 0,
- 1, 0x3060, 0x305F, 0x3099, 0,
- 1, 0x3062, 0x3061, 0x3099, 0,
- 1, 0x3065, 0x3064, 0x3099, 0,
- 1, 0x3067, 0x3066, 0x3099, 0,
- 1, 0x3069, 0x3068, 0x3099, 0,
- 1, 0x3070, 0x306F, 0x3099, 0,
- 1, 0x3071, 0x306F, 0x309A, 0,
- 1, 0x3073, 0x3072, 0x3099, 0,
- 1, 0x3074, 0x3072, 0x309A, 0,
- 1, 0x3076, 0x3075, 0x3099, 0,
- 1, 0x3077, 0x3075, 0x309A, 0,
- 1, 0x3079, 0x3078, 0x3099, 0,
- 1, 0x307A, 0x3078, 0x309A, 0,
- 1, 0x307C, 0x307B, 0x3099, 0,
- 1, 0x307D, 0x307B, 0x309A, 0,
- 1, 0x3094, 0x3046, 0x3099, 0,
- 16, 0x309B, 0x0020, 0x3099, 0,
- 16, 0x309C, 0x0020, 0x309A, 0,
- 1, 0x309E, 0x309D, 0x3099, 0,
- 1, 0x30AC, 0x30AB, 0x3099, 0,
- 1, 0x30AE, 0x30AD, 0x3099, 0,
- 1, 0x30B0, 0x30AF, 0x3099, 0,
- 1, 0x30B2, 0x30B1, 0x3099, 0,
- 1, 0x30B4, 0x30B3, 0x3099, 0,
- 1, 0x30B6, 0x30B5, 0x3099, 0,
- 1, 0x30B8, 0x30B7, 0x3099, 0,
- 1, 0x30BA, 0x30B9, 0x3099, 0,
- 1, 0x30BC, 0x30BB, 0x3099, 0,
- 1, 0x30BE, 0x30BD, 0x3099, 0,
- 1, 0x30C0, 0x30BF, 0x3099, 0,
- 1, 0x30C2, 0x30C1, 0x3099, 0,
- 1, 0x30C5, 0x30C4, 0x3099, 0,
- 1, 0x30C7, 0x30C6, 0x3099, 0,
- 1, 0x30C9, 0x30C8, 0x3099, 0,
- 1, 0x30D0, 0x30CF, 0x3099, 0,
- 1, 0x30D1, 0x30CF, 0x309A, 0,
- 1, 0x30D3, 0x30D2, 0x3099, 0,
- 1, 0x30D4, 0x30D2, 0x309A, 0,
- 1, 0x30D6, 0x30D5, 0x3099, 0,
- 1, 0x30D7, 0x30D5, 0x309A, 0,
- 1, 0x30D9, 0x30D8, 0x3099, 0,
- 1, 0x30DA, 0x30D8, 0x309A, 0,
- 1, 0x30DC, 0x30DB, 0x3099, 0,
- 1, 0x30DD, 0x30DB, 0x309A, 0,
- 1, 0x30F4, 0x30A6, 0x3099, 0,
- 1, 0x30F7, 0x30EF, 0x3099, 0,
- 1, 0x30F8, 0x30F0, 0x3099, 0,
- 1, 0x30F9, 0x30F1, 0x3099, 0,
- 1, 0x30FA, 0x30F2, 0x3099, 0,
- 1, 0x30FE, 0x30FD, 0x3099, 0,
- 16, 0x3131, 0x1100, 0,
- 16, 0x3132, 0x1101, 0,
- 16, 0x3133, 0x11AA, 0,
- 16, 0x3134, 0x1102, 0,
- 16, 0x3135, 0x11AC, 0,
- 16, 0x3136, 0x11AD, 0,
- 16, 0x3137, 0x1103, 0,
- 16, 0x3138, 0x1104, 0,
- 16, 0x3139, 0x1105, 0,
- 16, 0x313A, 0x11B0, 0,
- 16, 0x313B, 0x11B1, 0,
- 16, 0x313C, 0x11B2, 0,
- 16, 0x313D, 0x11B3, 0,
- 16, 0x313E, 0x11B4, 0,
- 16, 0x313F, 0x11B5, 0,
- 16, 0x3140, 0x111A, 0,
- 16, 0x3141, 0x1106, 0,
- 16, 0x3142, 0x1107, 0,
- 16, 0x3143, 0x1108, 0,
- 16, 0x3144, 0x1121, 0,
- 16, 0x3145, 0x1109, 0,
- 16, 0x3146, 0x110A, 0,
- 16, 0x3147, 0x110B, 0,
- 16, 0x3148, 0x110C, 0,
- 16, 0x3149, 0x110D, 0,
- 16, 0x314A, 0x110E, 0,
- 16, 0x314B, 0x110F, 0,
- 16, 0x314C, 0x1110, 0,
- 16, 0x314D, 0x1111, 0,
- 16, 0x314E, 0x1112, 0,
- 16, 0x314F, 0x1161, 0,
- 16, 0x3150, 0x1162, 0,
- 16, 0x3151, 0x1163, 0,
- 16, 0x3152, 0x1164, 0,
- 16, 0x3153, 0x1165, 0,
- 16, 0x3154, 0x1166, 0,
- 16, 0x3155, 0x1167, 0,
- 16, 0x3156, 0x1168, 0,
- 16, 0x3157, 0x1169, 0,
- 16, 0x3158, 0x116A, 0,
- 16, 0x3159, 0x116B, 0,
- 16, 0x315A, 0x116C, 0,
- 16, 0x315B, 0x116D, 0,
- 16, 0x315C, 0x116E, 0,
- 16, 0x315D, 0x116F, 0,
- 16, 0x315E, 0x1170, 0,
- 16, 0x315F, 0x1171, 0,
- 16, 0x3160, 0x1172, 0,
- 16, 0x3161, 0x1173, 0,
- 16, 0x3162, 0x1174, 0,
- 16, 0x3163, 0x1175, 0,
- 16, 0x3164, 0x1160, 0,
- 16, 0x3165, 0x1114, 0,
- 16, 0x3166, 0x1115, 0,
- 16, 0x3167, 0x11C7, 0,
- 16, 0x3168, 0x11C8, 0,
- 16, 0x3169, 0x11CC, 0,
- 16, 0x316A, 0x11CE, 0,
- 16, 0x316B, 0x11D3, 0,
- 16, 0x316C, 0x11D7, 0,
- 16, 0x316D, 0x11D9, 0,
- 16, 0x316E, 0x111C, 0,
- 16, 0x316F, 0x11DD, 0,
- 16, 0x3170, 0x11DF, 0,
- 16, 0x3171, 0x111D, 0,
- 16, 0x3172, 0x111E, 0,
- 16, 0x3173, 0x1120, 0,
- 16, 0x3174, 0x1122, 0,
- 16, 0x3175, 0x1123, 0,
- 16, 0x3176, 0x1127, 0,
- 16, 0x3177, 0x1129, 0,
- 16, 0x3178, 0x112B, 0,
- 16, 0x3179, 0x112C, 0,
- 16, 0x317A, 0x112D, 0,
- 16, 0x317B, 0x112E, 0,
- 16, 0x317C, 0x112F, 0,
- 16, 0x317D, 0x1132, 0,
- 16, 0x317E, 0x1136, 0,
- 16, 0x317F, 0x1140, 0,
- 16, 0x3180, 0x1147, 0,
- 16, 0x3181, 0x114C, 0,
- 16, 0x3182, 0x11F1, 0,
- 16, 0x3183, 0x11F2, 0,
- 16, 0x3184, 0x1157, 0,
- 16, 0x3185, 0x1158, 0,
- 16, 0x3186, 0x1159, 0,
- 16, 0x3187, 0x1184, 0,
- 16, 0x3188, 0x1185, 0,
- 16, 0x3189, 0x1188, 0,
- 16, 0x318A, 0x1191, 0,
- 16, 0x318B, 0x1192, 0,
- 16, 0x318C, 0x1194, 0,
- 16, 0x318D, 0x119E, 0,
- 16, 0x318E, 0x11A1, 0,
- 9, 0x3192, 0x4E00, 0,
- 9, 0x3193, 0x4E8C, 0,
- 9, 0x3194, 0x4E09, 0,
- 9, 0x3195, 0x56DB, 0,
- 9, 0x3196, 0x4E0A, 0,
- 9, 0x3197, 0x4E2D, 0,
- 9, 0x3198, 0x4E0B, 0,
- 9, 0x3199, 0x7532, 0,
- 9, 0x319A, 0x4E59, 0,
- 9, 0x319B, 0x4E19, 0,
- 9, 0x319C, 0x4E01, 0,
- 9, 0x319D, 0x5929, 0,
- 9, 0x319E, 0x5730, 0,
- 9, 0x319F, 0x4EBA, 0,
- 16, 0x3200, 0x0028, 0x1100, 0x0029, 0,
- 16, 0x3201, 0x0028, 0x1102, 0x0029, 0,
- 16, 0x3202, 0x0028, 0x1103, 0x0029, 0,
- 16, 0x3203, 0x0028, 0x1105, 0x0029, 0,
- 16, 0x3204, 0x0028, 0x1106, 0x0029, 0,
- 16, 0x3205, 0x0028, 0x1107, 0x0029, 0,
- 16, 0x3206, 0x0028, 0x1109, 0x0029, 0,
- 16, 0x3207, 0x0028, 0x110B, 0x0029, 0,
- 16, 0x3208, 0x0028, 0x110C, 0x0029, 0,
- 16, 0x3209, 0x0028, 0x110E, 0x0029, 0,
- 16, 0x320A, 0x0028, 0x110F, 0x0029, 0,
- 16, 0x320B, 0x0028, 0x1110, 0x0029, 0,
- 16, 0x320C, 0x0028, 0x1111, 0x0029, 0,
- 16, 0x320D, 0x0028, 0x1112, 0x0029, 0,
- 16, 0x320E, 0x0028, 0x1100, 0x1161, 0x0029, 0,
- 16, 0x320F, 0x0028, 0x1102, 0x1161, 0x0029, 0,
- 16, 0x3210, 0x0028, 0x1103, 0x1161, 0x0029, 0,
- 16, 0x3211, 0x0028, 0x1105, 0x1161, 0x0029, 0,
- 16, 0x3212, 0x0028, 0x1106, 0x1161, 0x0029, 0,
- 16, 0x3213, 0x0028, 0x1107, 0x1161, 0x0029, 0,
- 16, 0x3214, 0x0028, 0x1109, 0x1161, 0x0029, 0,
- 16, 0x3215, 0x0028, 0x110B, 0x1161, 0x0029, 0,
- 16, 0x3216, 0x0028, 0x110C, 0x1161, 0x0029, 0,
- 16, 0x3217, 0x0028, 0x110E, 0x1161, 0x0029, 0,
- 16, 0x3218, 0x0028, 0x110F, 0x1161, 0x0029, 0,
- 16, 0x3219, 0x0028, 0x1110, 0x1161, 0x0029, 0,
- 16, 0x321A, 0x0028, 0x1111, 0x1161, 0x0029, 0,
- 16, 0x321B, 0x0028, 0x1112, 0x1161, 0x0029, 0,
- 16, 0x321C, 0x0028, 0x110C, 0x116E, 0x0029, 0,
- 16, 0x3220, 0x0028, 0x4E00, 0x0029, 0,
- 16, 0x3221, 0x0028, 0x4E8C, 0x0029, 0,
- 16, 0x3222, 0x0028, 0x4E09, 0x0029, 0,
- 16, 0x3223, 0x0028, 0x56DB, 0x0029, 0,
- 16, 0x3224, 0x0028, 0x4E94, 0x0029, 0,
- 16, 0x3225, 0x0028, 0x516D, 0x0029, 0,
- 16, 0x3226, 0x0028, 0x4E03, 0x0029, 0,
- 16, 0x3227, 0x0028, 0x516B, 0x0029, 0,
- 16, 0x3228, 0x0028, 0x4E5D, 0x0029, 0,
- 16, 0x3229, 0x0028, 0x5341, 0x0029, 0,
- 16, 0x322A, 0x0028, 0x6708, 0x0029, 0,
- 16, 0x322B, 0x0028, 0x706B, 0x0029, 0,
- 16, 0x322C, 0x0028, 0x6C34, 0x0029, 0,
- 16, 0x322D, 0x0028, 0x6728, 0x0029, 0,
- 16, 0x322E, 0x0028, 0x91D1, 0x0029, 0,
- 16, 0x322F, 0x0028, 0x571F, 0x0029, 0,
- 16, 0x3230, 0x0028, 0x65E5, 0x0029, 0,
- 16, 0x3231, 0x0028, 0x682A, 0x0029, 0,
- 16, 0x3232, 0x0028, 0x6709, 0x0029, 0,
- 16, 0x3233, 0x0028, 0x793E, 0x0029, 0,
- 16, 0x3234, 0x0028, 0x540D, 0x0029, 0,
- 16, 0x3235, 0x0028, 0x7279, 0x0029, 0,
- 16, 0x3236, 0x0028, 0x8CA1, 0x0029, 0,
- 16, 0x3237, 0x0028, 0x795D, 0x0029, 0,
- 16, 0x3238, 0x0028, 0x52B4, 0x0029, 0,
- 16, 0x3239, 0x0028, 0x4EE3, 0x0029, 0,
- 16, 0x323A, 0x0028, 0x547C, 0x0029, 0,
- 16, 0x323B, 0x0028, 0x5B66, 0x0029, 0,
- 16, 0x323C, 0x0028, 0x76E3, 0x0029, 0,
- 16, 0x323D, 0x0028, 0x4F01, 0x0029, 0,
- 16, 0x323E, 0x0028, 0x8CC7, 0x0029, 0,
- 16, 0x323F, 0x0028, 0x5354, 0x0029, 0,
- 16, 0x3240, 0x0028, 0x796D, 0x0029, 0,
- 16, 0x3241, 0x0028, 0x4F11, 0x0029, 0,
- 16, 0x3242, 0x0028, 0x81EA, 0x0029, 0,
- 16, 0x3243, 0x0028, 0x81F3, 0x0029, 0,
- 8, 0x3260, 0x1100, 0,
- 8, 0x3261, 0x1102, 0,
- 8, 0x3262, 0x1103, 0,
- 8, 0x3263, 0x1105, 0,
- 8, 0x3264, 0x1106, 0,
- 8, 0x3265, 0x1107, 0,
- 8, 0x3266, 0x1109, 0,
- 8, 0x3267, 0x110B, 0,
- 8, 0x3268, 0x110C, 0,
- 8, 0x3269, 0x110E, 0,
- 8, 0x326A, 0x110F, 0,
- 8, 0x326B, 0x1110, 0,
- 8, 0x326C, 0x1111, 0,
- 8, 0x326D, 0x1112, 0,
- 8, 0x326E, 0x1100, 0x1161, 0,
- 8, 0x326F, 0x1102, 0x1161, 0,
- 8, 0x3270, 0x1103, 0x1161, 0,
- 8, 0x3271, 0x1105, 0x1161, 0,
- 8, 0x3272, 0x1106, 0x1161, 0,
- 8, 0x3273, 0x1107, 0x1161, 0,
- 8, 0x3274, 0x1109, 0x1161, 0,
- 8, 0x3275, 0x110B, 0x1161, 0,
- 8, 0x3276, 0x110C, 0x1161, 0,
- 8, 0x3277, 0x110E, 0x1161, 0,
- 8, 0x3278, 0x110F, 0x1161, 0,
- 8, 0x3279, 0x1110, 0x1161, 0,
- 8, 0x327A, 0x1111, 0x1161, 0,
- 8, 0x327B, 0x1112, 0x1161, 0,
- 8, 0x3280, 0x4E00, 0,
- 8, 0x3281, 0x4E8C, 0,
- 8, 0x3282, 0x4E09, 0,
- 8, 0x3283, 0x56DB, 0,
- 8, 0x3284, 0x4E94, 0,
- 8, 0x3285, 0x516D, 0,
- 8, 0x3286, 0x4E03, 0,
- 8, 0x3287, 0x516B, 0,
- 8, 0x3288, 0x4E5D, 0,
- 8, 0x3289, 0x5341, 0,
- 8, 0x328A, 0x6708, 0,
- 8, 0x328B, 0x706B, 0,
- 8, 0x328C, 0x6C34, 0,
- 8, 0x328D, 0x6728, 0,
- 8, 0x328E, 0x91D1, 0,
- 8, 0x328F, 0x571F, 0,
- 8, 0x3290, 0x65E5, 0,
- 8, 0x3291, 0x682A, 0,
- 8, 0x3292, 0x6709, 0,
- 8, 0x3293, 0x793E, 0,
- 8, 0x3294, 0x540D, 0,
- 8, 0x3295, 0x7279, 0,
- 8, 0x3296, 0x8CA1, 0,
- 8, 0x3297, 0x795D, 0,
- 8, 0x3298, 0x52B4, 0,
- 8, 0x3299, 0x79D8, 0,
- 8, 0x329A, 0x7537, 0,
- 8, 0x329B, 0x5973, 0,
- 8, 0x329C, 0x9069, 0,
- 8, 0x329D, 0x512A, 0,
- 8, 0x329E, 0x5370, 0,
- 8, 0x329F, 0x6CE8, 0,
- 8, 0x32A0, 0x9805, 0,
- 8, 0x32A1, 0x4F11, 0,
- 8, 0x32A2, 0x5199, 0,
- 8, 0x32A3, 0x6B63, 0,
- 8, 0x32A4, 0x4E0A, 0,
- 8, 0x32A5, 0x4E2D, 0,
- 8, 0x32A6, 0x4E0B, 0,
- 8, 0x32A7, 0x5DE6, 0,
- 8, 0x32A8, 0x53F3, 0,
- 8, 0x32A9, 0x533B, 0,
- 8, 0x32AA, 0x5B97, 0,
- 8, 0x32AB, 0x5B66, 0,
- 8, 0x32AC, 0x76E3, 0,
- 8, 0x32AD, 0x4F01, 0,
- 8, 0x32AE, 0x8CC7, 0,
- 8, 0x32AF, 0x5354, 0,
- 8, 0x32B0, 0x591C, 0,
- 16, 0x32C0, 0x0031, 0x6708, 0,
- 16, 0x32C1, 0x0032, 0x6708, 0,
- 16, 0x32C2, 0x0033, 0x6708, 0,
- 16, 0x32C3, 0x0034, 0x6708, 0,
- 16, 0x32C4, 0x0035, 0x6708, 0,
- 16, 0x32C5, 0x0036, 0x6708, 0,
- 16, 0x32C6, 0x0037, 0x6708, 0,
- 16, 0x32C7, 0x0038, 0x6708, 0,
- 16, 0x32C8, 0x0039, 0x6708, 0,
- 16, 0x32C9, 0x0031, 0x0030, 0x6708, 0,
- 16, 0x32CA, 0x0031, 0x0031, 0x6708, 0,
- 16, 0x32CB, 0x0031, 0x0032, 0x6708, 0,
- 8, 0x32D0, 0x30A2, 0,
- 8, 0x32D1, 0x30A4, 0,
- 8, 0x32D2, 0x30A6, 0,
- 8, 0x32D3, 0x30A8, 0,
- 8, 0x32D4, 0x30AA, 0,
- 8, 0x32D5, 0x30AB, 0,
- 8, 0x32D6, 0x30AD, 0,
- 8, 0x32D7, 0x30AF, 0,
- 8, 0x32D8, 0x30B1, 0,
- 8, 0x32D9, 0x30B3, 0,
- 8, 0x32DA, 0x30B5, 0,
- 8, 0x32DB, 0x30B7, 0,
- 8, 0x32DC, 0x30B9, 0,
- 8, 0x32DD, 0x30BB, 0,
- 8, 0x32DE, 0x30BD, 0,
- 8, 0x32DF, 0x30BF, 0,
- 8, 0x32E0, 0x30C1, 0,
- 8, 0x32E1, 0x30C4, 0,
- 8, 0x32E2, 0x30C6, 0,
- 8, 0x32E3, 0x30C8, 0,
- 8, 0x32E4, 0x30CA, 0,
- 8, 0x32E5, 0x30CB, 0,
- 8, 0x32E6, 0x30CC, 0,
- 8, 0x32E7, 0x30CD, 0,
- 8, 0x32E8, 0x30CE, 0,
- 8, 0x32E9, 0x30CF, 0,
- 8, 0x32EA, 0x30D2, 0,
- 8, 0x32EB, 0x30D5, 0,
- 8, 0x32EC, 0x30D8, 0,
- 8, 0x32ED, 0x30DB, 0,
- 8, 0x32EE, 0x30DE, 0,
- 8, 0x32EF, 0x30DF, 0,
- 8, 0x32F0, 0x30E0, 0,
- 8, 0x32F1, 0x30E1, 0,
- 8, 0x32F2, 0x30E2, 0,
- 8, 0x32F3, 0x30E4, 0,
- 8, 0x32F4, 0x30E6, 0,
- 8, 0x32F5, 0x30E8, 0,
- 8, 0x32F6, 0x30E9, 0,
- 8, 0x32F7, 0x30EA, 0,
- 8, 0x32F8, 0x30EB, 0,
- 8, 0x32F9, 0x30EC, 0,
- 8, 0x32FA, 0x30ED, 0,
- 8, 0x32FB, 0x30EF, 0,
- 8, 0x32FC, 0x30F0, 0,
- 8, 0x32FD, 0x30F1, 0,
- 8, 0x32FE, 0x30F2, 0,
- 15, 0x3300, 0x30A2, 0x30D1, 0x30FC, 0x30C8, 0,
- 15, 0x3301, 0x30A2, 0x30EB, 0x30D5, 0x30A1, 0,
- 15, 0x3302, 0x30A2, 0x30F3, 0x30DA, 0x30A2, 0,
- 15, 0x3303, 0x30A2, 0x30FC, 0x30EB, 0,
- 15, 0x3304, 0x30A4, 0x30CB, 0x30F3, 0x30B0, 0,
- 15, 0x3305, 0x30A4, 0x30F3, 0x30C1, 0,
- 15, 0x3306, 0x30A6, 0x30A9, 0x30F3, 0,
- 15, 0x3307, 0x30A8, 0x30B9, 0x30AF, 0x30FC, 0x30C9, 0,
- 15, 0x3308, 0x30A8, 0x30FC, 0x30AB, 0x30FC, 0,
- 15, 0x3309, 0x30AA, 0x30F3, 0x30B9, 0,
- 15, 0x330A, 0x30AA, 0x30FC, 0x30E0, 0,
- 15, 0x330B, 0x30AB, 0x30A4, 0x30EA, 0,
- 15, 0x330C, 0x30AB, 0x30E9, 0x30C3, 0x30C8, 0,
- 15, 0x330D, 0x30AB, 0x30ED, 0x30EA, 0x30FC, 0,
- 15, 0x330E, 0x30AC, 0x30ED, 0x30F3, 0,
- 15, 0x330F, 0x30AC, 0x30F3, 0x30DE, 0,
- 15, 0x3310, 0x30AE, 0x30AC, 0,
- 15, 0x3311, 0x30AE, 0x30CB, 0x30FC, 0,
- 15, 0x3312, 0x30AD, 0x30E5, 0x30EA, 0x30FC, 0,
- 15, 0x3313, 0x30AE, 0x30EB, 0x30C0, 0x30FC, 0,
- 15, 0x3314, 0x30AD, 0x30ED, 0,
- 15, 0x3315, 0x30AD, 0x30ED, 0x30B0, 0x30E9, 0x30E0, 0,
- 15, 0x3316, 0x30AD, 0x30ED, 0x30E1, 0x30FC, 0x30C8, 0x30EB, 0,
- 15, 0x3317, 0x30AD, 0x30ED, 0x30EF, 0x30C3, 0x30C8, 0,
- 15, 0x3318, 0x30B0, 0x30E9, 0x30E0, 0,
- 15, 0x3319, 0x30B0, 0x30E9, 0x30E0, 0x30C8, 0x30F3, 0,
- 15, 0x331A, 0x30AF, 0x30EB, 0x30BC, 0x30A4, 0x30ED, 0,
- 15, 0x331B, 0x30AF, 0x30ED, 0x30FC, 0x30CD, 0,
- 15, 0x331C, 0x30B1, 0x30FC, 0x30B9, 0,
- 15, 0x331D, 0x30B3, 0x30EB, 0x30CA, 0,
- 15, 0x331E, 0x30B3, 0x30FC, 0x30DD, 0,
- 15, 0x331F, 0x30B5, 0x30A4, 0x30AF, 0x30EB, 0,
- 15, 0x3320, 0x30B5, 0x30F3, 0x30C1, 0x30FC, 0x30E0, 0,
- 15, 0x3321, 0x30B7, 0x30EA, 0x30F3, 0x30B0, 0,
- 15, 0x3322, 0x30BB, 0x30F3, 0x30C1, 0,
- 15, 0x3323, 0x30BB, 0x30F3, 0x30C8, 0,
- 15, 0x3324, 0x30C0, 0x30FC, 0x30B9, 0,
- 15, 0x3325, 0x30C7, 0x30B7, 0,
- 15, 0x3326, 0x30C9, 0x30EB, 0,
- 15, 0x3327, 0x30C8, 0x30F3, 0,
- 15, 0x3328, 0x30CA, 0x30CE, 0,
- 15, 0x3329, 0x30CE, 0x30C3, 0x30C8, 0,
- 15, 0x332A, 0x30CF, 0x30A4, 0x30C4, 0,
- 15, 0x332B, 0x30D1, 0x30FC, 0x30BB, 0x30F3, 0x30C8, 0,
- 15, 0x332C, 0x30D1, 0x30FC, 0x30C4, 0,
- 15, 0x332D, 0x30D0, 0x30FC, 0x30EC, 0x30EB, 0,
- 15, 0x332E, 0x30D4, 0x30A2, 0x30B9, 0x30C8, 0x30EB, 0,
- 15, 0x332F, 0x30D4, 0x30AF, 0x30EB, 0,
- 15, 0x3330, 0x30D4, 0x30B3, 0,
- 15, 0x3331, 0x30D3, 0x30EB, 0,
- 15, 0x3332, 0x30D5, 0x30A1, 0x30E9, 0x30C3, 0x30C9, 0,
- 15, 0x3333, 0x30D5, 0x30A3, 0x30FC, 0x30C8, 0,
- 15, 0x3334, 0x30D6, 0x30C3, 0x30B7, 0x30A7, 0x30EB, 0,
- 15, 0x3335, 0x30D5, 0x30E9, 0x30F3, 0,
- 15, 0x3336, 0x30D8, 0x30AF, 0x30BF, 0x30FC, 0x30EB, 0,
- 15, 0x3337, 0x30DA, 0x30BD, 0,
- 15, 0x3338, 0x30DA, 0x30CB, 0x30D2, 0,
- 15, 0x3339, 0x30D8, 0x30EB, 0x30C4, 0,
- 15, 0x333A, 0x30DA, 0x30F3, 0x30B9, 0,
- 15, 0x333B, 0x30DA, 0x30FC, 0x30B8, 0,
- 15, 0x333C, 0x30D9, 0x30FC, 0x30BF, 0,
- 15, 0x333D, 0x30DD, 0x30A4, 0x30F3, 0x30C8, 0,
- 15, 0x333E, 0x30DC, 0x30EB, 0x30C8, 0,
- 15, 0x333F, 0x30DB, 0x30F3, 0,
- 15, 0x3340, 0x30DD, 0x30F3, 0x30C9, 0,
- 15, 0x3341, 0x30DB, 0x30FC, 0x30EB, 0,
- 15, 0x3342, 0x30DB, 0x30FC, 0x30F3, 0,
- 15, 0x3343, 0x30DE, 0x30A4, 0x30AF, 0x30ED, 0,
- 15, 0x3344, 0x30DE, 0x30A4, 0x30EB, 0,
- 15, 0x3345, 0x30DE, 0x30C3, 0x30CF, 0,
- 15, 0x3346, 0x30DE, 0x30EB, 0x30AF, 0,
- 15, 0x3347, 0x30DE, 0x30F3, 0x30B7, 0x30E7, 0x30F3, 0,
- 15, 0x3348, 0x30DF, 0x30AF, 0x30ED, 0x30F3, 0,
- 15, 0x3349, 0x30DF, 0x30EA, 0,
- 15, 0x334A, 0x30DF, 0x30EA, 0x30D0, 0x30FC, 0x30EB, 0,
- 15, 0x334B, 0x30E1, 0x30AC, 0,
- 15, 0x334C, 0x30E1, 0x30AC, 0x30C8, 0x30F3, 0,
- 15, 0x334D, 0x30E1, 0x30FC, 0x30C8, 0x30EB, 0,
- 15, 0x334E, 0x30E4, 0x30FC, 0x30C9, 0,
- 15, 0x334F, 0x30E4, 0x30FC, 0x30EB, 0,
- 15, 0x3350, 0x30E6, 0x30A2, 0x30F3, 0,
- 15, 0x3351, 0x30EA, 0x30C3, 0x30C8, 0x30EB, 0,
- 15, 0x3352, 0x30EA, 0x30E9, 0,
- 15, 0x3353, 0x30EB, 0x30D4, 0x30FC, 0,
- 15, 0x3354, 0x30EB, 0x30FC, 0x30D6, 0x30EB, 0,
- 15, 0x3355, 0x30EC, 0x30E0, 0,
- 15, 0x3356, 0x30EC, 0x30F3, 0x30C8, 0x30B2, 0x30F3, 0,
- 15, 0x3357, 0x30EF, 0x30C3, 0x30C8, 0,
- 16, 0x3358, 0x0030, 0x70B9, 0,
- 16, 0x3359, 0x0031, 0x70B9, 0,
- 16, 0x335A, 0x0032, 0x70B9, 0,
- 16, 0x335B, 0x0033, 0x70B9, 0,
- 16, 0x335C, 0x0034, 0x70B9, 0,
- 16, 0x335D, 0x0035, 0x70B9, 0,
- 16, 0x335E, 0x0036, 0x70B9, 0,
- 16, 0x335F, 0x0037, 0x70B9, 0,
- 16, 0x3360, 0x0038, 0x70B9, 0,
- 16, 0x3361, 0x0039, 0x70B9, 0,
- 16, 0x3362, 0x0031, 0x0030, 0x70B9, 0,
- 16, 0x3363, 0x0031, 0x0031, 0x70B9, 0,
- 16, 0x3364, 0x0031, 0x0032, 0x70B9, 0,
- 16, 0x3365, 0x0031, 0x0033, 0x70B9, 0,
- 16, 0x3366, 0x0031, 0x0034, 0x70B9, 0,
- 16, 0x3367, 0x0031, 0x0035, 0x70B9, 0,
- 16, 0x3368, 0x0031, 0x0036, 0x70B9, 0,
- 16, 0x3369, 0x0031, 0x0037, 0x70B9, 0,
- 16, 0x336A, 0x0031, 0x0038, 0x70B9, 0,
- 16, 0x336B, 0x0031, 0x0039, 0x70B9, 0,
- 16, 0x336C, 0x0032, 0x0030, 0x70B9, 0,
- 16, 0x336D, 0x0032, 0x0031, 0x70B9, 0,
- 16, 0x336E, 0x0032, 0x0032, 0x70B9, 0,
- 16, 0x336F, 0x0032, 0x0033, 0x70B9, 0,
- 16, 0x3370, 0x0032, 0x0034, 0x70B9, 0,
- 15, 0x3371, 0x0068, 0x0050, 0x0061, 0,
- 15, 0x3372, 0x0064, 0x0061, 0,
- 15, 0x3373, 0x0041, 0x0055, 0,
- 15, 0x3374, 0x0062, 0x0061, 0x0072, 0,
- 15, 0x3375, 0x006F, 0x0056, 0,
- 15, 0x3376, 0x0070, 0x0063, 0,
- 15, 0x337B, 0x5E73, 0x6210, 0,
- 15, 0x337C, 0x662D, 0x548C, 0,
- 15, 0x337D, 0x5927, 0x6B63, 0,
- 15, 0x337E, 0x660E, 0x6CBB, 0,
- 15, 0x337F, 0x682A, 0x5F0F, 0x4F1A, 0x793E, 0,
- 15, 0x3380, 0x0070, 0x0041, 0,
- 15, 0x3381, 0x006E, 0x0041, 0,
- 15, 0x3382, 0x03BC, 0x0041, 0,
- 15, 0x3383, 0x006D, 0x0041, 0,
- 15, 0x3384, 0x006B, 0x0041, 0,
- 15, 0x3385, 0x004B, 0x0042, 0,
- 15, 0x3386, 0x004D, 0x0042, 0,
- 15, 0x3387, 0x0047, 0x0042, 0,
- 15, 0x3388, 0x0063, 0x0061, 0x006C, 0,
- 15, 0x3389, 0x006B, 0x0063, 0x0061, 0x006C, 0,
- 15, 0x338A, 0x0070, 0x0046, 0,
- 15, 0x338B, 0x006E, 0x0046, 0,
- 15, 0x338C, 0x03BC, 0x0046, 0,
- 15, 0x338D, 0x03BC, 0x0067, 0,
- 15, 0x338E, 0x006D, 0x0067, 0,
- 15, 0x338F, 0x006B, 0x0067, 0,
- 15, 0x3390, 0x0048, 0x007A, 0,
- 15, 0x3391, 0x006B, 0x0048, 0x007A, 0,
- 15, 0x3392, 0x004D, 0x0048, 0x007A, 0,
- 15, 0x3393, 0x0047, 0x0048, 0x007A, 0,
- 15, 0x3394, 0x0054, 0x0048, 0x007A, 0,
- 15, 0x3395, 0x03BC, 0x2113, 0,
- 15, 0x3396, 0x006D, 0x2113, 0,
- 15, 0x3397, 0x0064, 0x2113, 0,
- 15, 0x3398, 0x006B, 0x2113, 0,
- 15, 0x3399, 0x0066, 0x006D, 0,
- 15, 0x339A, 0x006E, 0x006D, 0,
- 15, 0x339B, 0x03BC, 0x006D, 0,
- 15, 0x339C, 0x006D, 0x006D, 0,
- 15, 0x339D, 0x0063, 0x006D, 0,
- 15, 0x339E, 0x006B, 0x006D, 0,
- 15, 0x339F, 0x006D, 0x006D, 0x00B2, 0,
- 15, 0x33A0, 0x0063, 0x006D, 0x00B2, 0,
- 15, 0x33A1, 0x006D, 0x00B2, 0,
- 15, 0x33A2, 0x006B, 0x006D, 0x00B2, 0,
- 15, 0x33A3, 0x006D, 0x006D, 0x00B3, 0,
- 15, 0x33A4, 0x0063, 0x006D, 0x00B3, 0,
- 15, 0x33A5, 0x006D, 0x00B3, 0,
- 15, 0x33A6, 0x006B, 0x006D, 0x00B3, 0,
- 15, 0x33A7, 0x006D, 0x2215, 0x0073, 0,
- 15, 0x33A8, 0x006D, 0x2215, 0x0073, 0x00B2, 0,
- 15, 0x33A9, 0x0050, 0x0061, 0,
- 15, 0x33AA, 0x006B, 0x0050, 0x0061, 0,
- 15, 0x33AB, 0x004D, 0x0050, 0x0061, 0,
- 15, 0x33AC, 0x0047, 0x0050, 0x0061, 0,
- 15, 0x33AD, 0x0072, 0x0061, 0x0064, 0,
- 15, 0x33AE, 0x0072, 0x0061, 0x0064, 0x2215, 0x0073, 0,
- 15, 0x33AF, 0x0072, 0x0061, 0x0064, 0x2215, 0x0073, 0x00B2, 0,
- 15, 0x33B0, 0x0070, 0x0073, 0,
- 15, 0x33B1, 0x006E, 0x0073, 0,
- 15, 0x33B2, 0x03BC, 0x0073, 0,
- 15, 0x33B3, 0x006D, 0x0073, 0,
- 15, 0x33B4, 0x0070, 0x0056, 0,
- 15, 0x33B5, 0x006E, 0x0056, 0,
- 15, 0x33B6, 0x03BC, 0x0056, 0,
- 15, 0x33B7, 0x006D, 0x0056, 0,
- 15, 0x33B8, 0x006B, 0x0056, 0,
- 15, 0x33B9, 0x004D, 0x0056, 0,
- 15, 0x33BA, 0x0070, 0x0057, 0,
- 15, 0x33BB, 0x006E, 0x0057, 0,
- 15, 0x33BC, 0x03BC, 0x0057, 0,
- 15, 0x33BD, 0x006D, 0x0057, 0,
- 15, 0x33BE, 0x006B, 0x0057, 0,
- 15, 0x33BF, 0x004D, 0x0057, 0,
- 15, 0x33C0, 0x006B, 0x03A9, 0,
- 15, 0x33C1, 0x004D, 0x03A9, 0,
- 15, 0x33C2, 0x0061, 0x002E, 0x006D, 0x002E, 0,
- 15, 0x33C3, 0x0042, 0x0071, 0,
- 15, 0x33C4, 0x0063, 0x0063, 0,
- 15, 0x33C5, 0x0063, 0x0064, 0,
- 15, 0x33C6, 0x0043, 0x2215, 0x006B, 0x0067, 0,
- 15, 0x33C7, 0x0043, 0x006F, 0x002E, 0,
- 15, 0x33C8, 0x0064, 0x0042, 0,
- 15, 0x33C9, 0x0047, 0x0079, 0,
- 15, 0x33CA, 0x0068, 0x0061, 0,
- 15, 0x33CB, 0x0048, 0x0050, 0,
- 15, 0x33CC, 0x0069, 0x006E, 0,
- 15, 0x33CD, 0x004B, 0x004B, 0,
- 15, 0x33CE, 0x004B, 0x004D, 0,
- 15, 0x33CF, 0x006B, 0x0074, 0,
- 15, 0x33D0, 0x006C, 0x006D, 0,
- 15, 0x33D1, 0x006C, 0x006E, 0,
- 15, 0x33D2, 0x006C, 0x006F, 0x0067, 0,
- 15, 0x33D3, 0x006C, 0x0078, 0,
- 15, 0x33D4, 0x006D, 0x0062, 0,
- 15, 0x33D5, 0x006D, 0x0069, 0x006C, 0,
- 15, 0x33D6, 0x006D, 0x006F, 0x006C, 0,
- 15, 0x33D7, 0x0050, 0x0048, 0,
- 15, 0x33D8, 0x0070, 0x002E, 0x006D, 0x002E, 0,
- 15, 0x33D9, 0x0050, 0x0050, 0x004D, 0,
- 15, 0x33DA, 0x0050, 0x0052, 0,
- 15, 0x33DB, 0x0073, 0x0072, 0,
- 15, 0x33DC, 0x0053, 0x0076, 0,
- 15, 0x33DD, 0x0057, 0x0062, 0,
- 16, 0x33E0, 0x0031, 0x65E5, 0,
- 16, 0x33E1, 0x0032, 0x65E5, 0,
- 16, 0x33E2, 0x0033, 0x65E5, 0,
- 16, 0x33E3, 0x0034, 0x65E5, 0,
- 16, 0x33E4, 0x0035, 0x65E5, 0,
- 16, 0x33E5, 0x0036, 0x65E5, 0,
- 16, 0x33E6, 0x0037, 0x65E5, 0,
- 16, 0x33E7, 0x0038, 0x65E5, 0,
- 16, 0x33E8, 0x0039, 0x65E5, 0,
- 16, 0x33E9, 0x0031, 0x0030, 0x65E5, 0,
- 16, 0x33EA, 0x0031, 0x0031, 0x65E5, 0,
- 16, 0x33EB, 0x0031, 0x0032, 0x65E5, 0,
- 16, 0x33EC, 0x0031, 0x0033, 0x65E5, 0,
- 16, 0x33ED, 0x0031, 0x0034, 0x65E5, 0,
- 16, 0x33EE, 0x0031, 0x0035, 0x65E5, 0,
- 16, 0x33EF, 0x0031, 0x0036, 0x65E5, 0,
- 16, 0x33F0, 0x0031, 0x0037, 0x65E5, 0,
- 16, 0x33F1, 0x0031, 0x0038, 0x65E5, 0,
- 16, 0x33F2, 0x0031, 0x0039, 0x65E5, 0,
- 16, 0x33F3, 0x0032, 0x0030, 0x65E5, 0,
- 16, 0x33F4, 0x0032, 0x0031, 0x65E5, 0,
- 16, 0x33F5, 0x0032, 0x0032, 0x65E5, 0,
- 16, 0x33F6, 0x0032, 0x0033, 0x65E5, 0,
- 16, 0x33F7, 0x0032, 0x0034, 0x65E5, 0,
- 16, 0x33F8, 0x0032, 0x0035, 0x65E5, 0,
- 16, 0x33F9, 0x0032, 0x0036, 0x65E5, 0,
- 16, 0x33FA, 0x0032, 0x0037, 0x65E5, 0,
- 16, 0x33FB, 0x0032, 0x0038, 0x65E5, 0,
- 16, 0x33FC, 0x0032, 0x0039, 0x65E5, 0,
- 16, 0x33FD, 0x0033, 0x0030, 0x65E5, 0,
- 16, 0x33FE, 0x0033, 0x0031, 0x65E5, 0,
- 1, 0xF900, 0x8C48, 0,
- 1, 0xF901, 0x66F4, 0,
- 1, 0xF902, 0x8ECA, 0,
- 1, 0xF903, 0x8CC8, 0,
- 1, 0xF904, 0x6ED1, 0,
- 1, 0xF905, 0x4E32, 0,
- 1, 0xF906, 0x53E5, 0,
- 1, 0xF907, 0x9F9C, 0,
- 1, 0xF908, 0x9F9C, 0,
- 1, 0xF909, 0x5951, 0,
- 1, 0xF90A, 0x91D1, 0,
- 1, 0xF90B, 0x5587, 0,
- 1, 0xF90C, 0x5948, 0,
- 1, 0xF90D, 0x61F6, 0,
- 1, 0xF90E, 0x7669, 0,
- 1, 0xF90F, 0x7F85, 0,
- 1, 0xF910, 0x863F, 0,
- 1, 0xF911, 0x87BA, 0,
- 1, 0xF912, 0x88F8, 0,
- 1, 0xF913, 0x908F, 0,
- 1, 0xF914, 0x6A02, 0,
- 1, 0xF915, 0x6D1B, 0,
- 1, 0xF916, 0x70D9, 0,
- 1, 0xF917, 0x73DE, 0,
- 1, 0xF918, 0x843D, 0,
- 1, 0xF919, 0x916A, 0,
- 1, 0xF91A, 0x99F1, 0,
- 1, 0xF91B, 0x4E82, 0,
- 1, 0xF91C, 0x5375, 0,
- 1, 0xF91D, 0x6B04, 0,
- 1, 0xF91E, 0x721B, 0,
- 1, 0xF91F, 0x862D, 0,
- 1, 0xF920, 0x9E1E, 0,
- 1, 0xF921, 0x5D50, 0,
- 1, 0xF922, 0x6FEB, 0,
- 1, 0xF923, 0x85CD, 0,
- 1, 0xF924, 0x8964, 0,
- 1, 0xF925, 0x62C9, 0,
- 1, 0xF926, 0x81D8, 0,
- 1, 0xF927, 0x881F, 0,
- 1, 0xF928, 0x5ECA, 0,
- 1, 0xF929, 0x6717, 0,
- 1, 0xF92A, 0x6D6A, 0,
- 1, 0xF92B, 0x72FC, 0,
- 1, 0xF92C, 0x90CE, 0,
- 1, 0xF92D, 0x4F86, 0,
- 1, 0xF92E, 0x51B7, 0,
- 1, 0xF92F, 0x52DE, 0,
- 1, 0xF930, 0x64C4, 0,
- 1, 0xF931, 0x6AD3, 0,
- 1, 0xF932, 0x7210, 0,
- 1, 0xF933, 0x76E7, 0,
- 1, 0xF934, 0x8001, 0,
- 1, 0xF935, 0x8606, 0,
- 1, 0xF936, 0x865C, 0,
- 1, 0xF937, 0x8DEF, 0,
- 1, 0xF938, 0x9732, 0,
- 1, 0xF939, 0x9B6F, 0,
- 1, 0xF93A, 0x9DFA, 0,
- 1, 0xF93B, 0x788C, 0,
- 1, 0xF93C, 0x797F, 0,
- 1, 0xF93D, 0x7DA0, 0,
- 1, 0xF93E, 0x83C9, 0,
- 1, 0xF93F, 0x9304, 0,
- 1, 0xF940, 0x9E7F, 0,
- 1, 0xF941, 0x8AD6, 0,
- 1, 0xF942, 0x58DF, 0,
- 1, 0xF943, 0x5F04, 0,
- 1, 0xF944, 0x7C60, 0,
- 1, 0xF945, 0x807E, 0,
- 1, 0xF946, 0x7262, 0,
- 1, 0xF947, 0x78CA, 0,
- 1, 0xF948, 0x8CC2, 0,
- 1, 0xF949, 0x96F7, 0,
- 1, 0xF94A, 0x58D8, 0,
- 1, 0xF94B, 0x5C62, 0,
- 1, 0xF94C, 0x6A13, 0,
- 1, 0xF94D, 0x6DDA, 0,
- 1, 0xF94E, 0x6F0F, 0,
- 1, 0xF94F, 0x7D2F, 0,
- 1, 0xF950, 0x7E37, 0,
- 1, 0xF951, 0x96FB, 0,
- 1, 0xF952, 0x52D2, 0,
- 1, 0xF953, 0x808B, 0,
- 1, 0xF954, 0x51DC, 0,
- 1, 0xF955, 0x51CC, 0,
- 1, 0xF956, 0x7A1C, 0,
- 1, 0xF957, 0x7DBE, 0,
- 1, 0xF958, 0x83F1, 0,
- 1, 0xF959, 0x9675, 0,
- 1, 0xF95A, 0x8B80, 0,
- 1, 0xF95B, 0x62CF, 0,
- 1, 0xF95C, 0x6A02, 0,
- 1, 0xF95D, 0x8AFE, 0,
- 1, 0xF95E, 0x4E39, 0,
- 1, 0xF95F, 0x5BE7, 0,
- 1, 0xF960, 0x6012, 0,
- 1, 0xF961, 0x7387, 0,
- 1, 0xF962, 0x7570, 0,
- 1, 0xF963, 0x5317, 0,
- 1, 0xF964, 0x78FB, 0,
- 1, 0xF965, 0x4FBF, 0,
- 1, 0xF966, 0x5FA9, 0,
- 1, 0xF967, 0x4E0D, 0,
- 1, 0xF968, 0x6CCC, 0,
- 1, 0xF969, 0x6578, 0,
- 1, 0xF96A, 0x7D22, 0,
- 1, 0xF96B, 0x53C3, 0,
- 1, 0xF96C, 0x585E, 0,
- 1, 0xF96D, 0x7701, 0,
- 1, 0xF96E, 0x8449, 0,
- 1, 0xF96F, 0x8AAA, 0,
- 1, 0xF970, 0x6BBA, 0,
- 1, 0xF971, 0x8FB0, 0,
- 1, 0xF972, 0x6C88, 0,
- 1, 0xF973, 0x62FE, 0,
- 1, 0xF974, 0x82E5, 0,
- 1, 0xF975, 0x63A0, 0,
- 1, 0xF976, 0x7565, 0,
- 1, 0xF977, 0x4EAE, 0,
- 1, 0xF978, 0x5169, 0,
- 1, 0xF979, 0x51C9, 0,
- 1, 0xF97A, 0x6881, 0,
- 1, 0xF97B, 0x7CE7, 0,
- 1, 0xF97C, 0x826F, 0,
- 1, 0xF97D, 0x8AD2, 0,
- 1, 0xF97E, 0x91CF, 0,
- 1, 0xF97F, 0x52F5, 0,
- 1, 0xF980, 0x5442, 0,
- 1, 0xF981, 0x5973, 0,
- 1, 0xF982, 0x5EEC, 0,
- 1, 0xF983, 0x65C5, 0,
- 1, 0xF984, 0x6FFE, 0,
- 1, 0xF985, 0x792A, 0,
- 1, 0xF986, 0x95AD, 0,
- 1, 0xF987, 0x9A6A, 0,
- 1, 0xF988, 0x9E97, 0,
- 1, 0xF989, 0x9ECE, 0,
- 1, 0xF98A, 0x529B, 0,
- 1, 0xF98B, 0x66C6, 0,
- 1, 0xF98C, 0x6B77, 0,
- 1, 0xF98D, 0x8F62, 0,
- 1, 0xF98E, 0x5E74, 0,
- 1, 0xF98F, 0x6190, 0,
- 1, 0xF990, 0x6200, 0,
- 1, 0xF991, 0x649A, 0,
- 1, 0xF992, 0x6F23, 0,
- 1, 0xF993, 0x7149, 0,
- 1, 0xF994, 0x7489, 0,
- 1, 0xF995, 0x79CA, 0,
- 1, 0xF996, 0x7DF4, 0,
- 1, 0xF997, 0x806F, 0,
- 1, 0xF998, 0x8F26, 0,
- 1, 0xF999, 0x84EE, 0,
- 1, 0xF99A, 0x9023, 0,
- 1, 0xF99B, 0x934A, 0,
- 1, 0xF99C, 0x5217, 0,
- 1, 0xF99D, 0x52A3, 0,
- 1, 0xF99E, 0x54BD, 0,
- 1, 0xF99F, 0x70C8, 0,
- 1, 0xF9A0, 0x88C2, 0,
- 1, 0xF9A1, 0x8AAA, 0,
- 1, 0xF9A2, 0x5EC9, 0,
- 1, 0xF9A3, 0x5FF5, 0,
- 1, 0xF9A4, 0x637B, 0,
- 1, 0xF9A5, 0x6BAE, 0,
- 1, 0xF9A6, 0x7C3E, 0,
- 1, 0xF9A7, 0x7375, 0,
- 1, 0xF9A8, 0x4EE4, 0,
- 1, 0xF9A9, 0x56F9, 0,
- 1, 0xF9AA, 0x5BE7, 0,
- 1, 0xF9AB, 0x5DBA, 0,
- 1, 0xF9AC, 0x601C, 0,
- 1, 0xF9AD, 0x73B2, 0,
- 1, 0xF9AE, 0x7469, 0,
- 1, 0xF9AF, 0x7F9A, 0,
- 1, 0xF9B0, 0x8046, 0,
- 1, 0xF9B1, 0x9234, 0,
- 1, 0xF9B2, 0x96F6, 0,
- 1, 0xF9B3, 0x9748, 0,
- 1, 0xF9B4, 0x9818, 0,
- 1, 0xF9B5, 0x4F8B, 0,
- 1, 0xF9B6, 0x79AE, 0,
- 1, 0xF9B7, 0x91B4, 0,
- 1, 0xF9B8, 0x96B8, 0,
- 1, 0xF9B9, 0x60E1, 0,
- 1, 0xF9BA, 0x4E86, 0,
- 1, 0xF9BB, 0x50DA, 0,
- 1, 0xF9BC, 0x5BEE, 0,
- 1, 0xF9BD, 0x5C3F, 0,
- 1, 0xF9BE, 0x6599, 0,
- 1, 0xF9BF, 0x6A02, 0,
- 1, 0xF9C0, 0x71CE, 0,
- 1, 0xF9C1, 0x7642, 0,
- 1, 0xF9C2, 0x84FC, 0,
- 1, 0xF9C3, 0x907C, 0,
- 1, 0xF9C4, 0x9F8D, 0,
- 1, 0xF9C5, 0x6688, 0,
- 1, 0xF9C6, 0x962E, 0,
- 1, 0xF9C7, 0x5289, 0,
- 1, 0xF9C8, 0x677B, 0,
- 1, 0xF9C9, 0x67F3, 0,
- 1, 0xF9CA, 0x6D41, 0,
- 1, 0xF9CB, 0x6E9C, 0,
- 1, 0xF9CC, 0x7409, 0,
- 1, 0xF9CD, 0x7559, 0,
- 1, 0xF9CE, 0x786B, 0,
- 1, 0xF9CF, 0x7D10, 0,
- 1, 0xF9D0, 0x985E, 0,
- 1, 0xF9D1, 0x516D, 0,
- 1, 0xF9D2, 0x622E, 0,
- 1, 0xF9D3, 0x9678, 0,
- 1, 0xF9D4, 0x502B, 0,
- 1, 0xF9D5, 0x5D19, 0,
- 1, 0xF9D6, 0x6DEA, 0,
- 1, 0xF9D7, 0x8F2A, 0,
- 1, 0xF9D8, 0x5F8B, 0,
- 1, 0xF9D9, 0x6144, 0,
- 1, 0xF9DA, 0x6817, 0,
- 1, 0xF9DB, 0x7387, 0,
- 1, 0xF9DC, 0x9686, 0,
- 1, 0xF9DD, 0x5229, 0,
- 1, 0xF9DE, 0x540F, 0,
- 1, 0xF9DF, 0x5C65, 0,
- 1, 0xF9E0, 0x6613, 0,
- 1, 0xF9E1, 0x674E, 0,
- 1, 0xF9E2, 0x68A8, 0,
- 1, 0xF9E3, 0x6CE5, 0,
- 1, 0xF9E4, 0x7406, 0,
- 1, 0xF9E5, 0x75E2, 0,
- 1, 0xF9E6, 0x7F79, 0,
- 1, 0xF9E7, 0x88CF, 0,
- 1, 0xF9E8, 0x88E1, 0,
- 1, 0xF9E9, 0x91CC, 0,
- 1, 0xF9EA, 0x96E2, 0,
- 1, 0xF9EB, 0x533F, 0,
- 1, 0xF9EC, 0x6EBA, 0,
- 1, 0xF9ED, 0x541D, 0,
- 1, 0xF9EE, 0x71D0, 0,
- 1, 0xF9EF, 0x7498, 0,
- 1, 0xF9F0, 0x85FA, 0,
- 1, 0xF9F1, 0x96A3, 0,
- 1, 0xF9F2, 0x9C57, 0,
- 1, 0xF9F3, 0x9E9F, 0,
- 1, 0xF9F4, 0x6797, 0,
- 1, 0xF9F5, 0x6DCB, 0,
- 1, 0xF9F6, 0x81E8, 0,
- 1, 0xF9F7, 0x7ACB, 0,
- 1, 0xF9F8, 0x7B20, 0,
- 1, 0xF9F9, 0x7C92, 0,
- 1, 0xF9FA, 0x72C0, 0,
- 1, 0xF9FB, 0x7099, 0,
- 1, 0xF9FC, 0x8B58, 0,
- 1, 0xF9FD, 0x4EC0, 0,
- 1, 0xF9FE, 0x8336, 0,
- 1, 0xF9FF, 0x523A, 0,
- 1, 0xFA00, 0x5207, 0,
- 1, 0xFA01, 0x5EA6, 0,
- 1, 0xFA02, 0x62D3, 0,
- 1, 0xFA03, 0x7CD6, 0,
- 1, 0xFA04, 0x5B85, 0,
- 1, 0xFA05, 0x6D1E, 0,
- 1, 0xFA06, 0x66B4, 0,
- 1, 0xFA07, 0x8F3B, 0,
- 1, 0xFA08, 0x884C, 0,
- 1, 0xFA09, 0x964D, 0,
- 1, 0xFA0A, 0x898B, 0,
- 1, 0xFA0B, 0x5ED3, 0,
- 1, 0xFA0C, 0x5140, 0,
- 1, 0xFA0D, 0x55C0, 0,
- 1, 0xFA10, 0x585A, 0,
- 1, 0xFA12, 0x6674, 0,
- 1, 0xFA15, 0x51DE, 0,
- 1, 0xFA16, 0x732A, 0,
- 1, 0xFA17, 0x76CA, 0,
- 1, 0xFA18, 0x793C, 0,
- 1, 0xFA19, 0x795E, 0,
- 1, 0xFA1A, 0x7965, 0,
- 1, 0xFA1B, 0x798F, 0,
- 1, 0xFA1C, 0x9756, 0,
- 1, 0xFA1D, 0x7CBE, 0,
- 1, 0xFA1E, 0x7FBD, 0,
- 1, 0xFA20, 0x8612, 0,
- 1, 0xFA22, 0x8AF8, 0,
- 1, 0xFA25, 0x9038, 0,
- 1, 0xFA26, 0x90FD, 0,
- 1, 0xFA2A, 0x98EF, 0,
- 1, 0xFA2B, 0x98FC, 0,
- 1, 0xFA2C, 0x9928, 0,
- 1, 0xFA2D, 0x9DB4, 0,
- 16, 0xFB00, 0x0066, 0x0066, 0,
- 16, 0xFB01, 0x0066, 0x0069, 0,
- 16, 0xFB02, 0x0066, 0x006C, 0,
- 16, 0xFB03, 0x0066, 0x0066, 0x0069, 0,
- 16, 0xFB04, 0x0066, 0x0066, 0x006C, 0,
- 16, 0xFB05, 0x017F, 0x0074, 0,
- 16, 0xFB06, 0x0073, 0x0074, 0,
- 16, 0xFB13, 0x0574, 0x0576, 0,
- 16, 0xFB14, 0x0574, 0x0565, 0,
- 16, 0xFB15, 0x0574, 0x056B, 0,
- 16, 0xFB16, 0x057E, 0x0576, 0,
- 16, 0xFB17, 0x0574, 0x056D, 0,
- 1, 0xFB1D, 0x05D9, 0x05B4, 0,
- 1, 0xFB1F, 0x05F2, 0x05B7, 0,
- 2, 0xFB20, 0x05E2, 0,
- 2, 0xFB21, 0x05D0, 0,
- 2, 0xFB22, 0x05D3, 0,
- 2, 0xFB23, 0x05D4, 0,
- 2, 0xFB24, 0x05DB, 0,
- 2, 0xFB25, 0x05DC, 0,
- 2, 0xFB26, 0x05DD, 0,
- 2, 0xFB27, 0x05E8, 0,
- 2, 0xFB28, 0x05EA, 0,
- 2, 0xFB29, 0x002B, 0,
- 1, 0xFB2A, 0x05E9, 0x05C1, 0,
- 1, 0xFB2B, 0x05E9, 0x05C2, 0,
- 1, 0xFB2C, 0xFB49, 0x05C1, 0,
- 1, 0xFB2D, 0xFB49, 0x05C2, 0,
- 1, 0xFB2E, 0x05D0, 0x05B7, 0,
- 1, 0xFB2F, 0x05D0, 0x05B8, 0,
- 1, 0xFB30, 0x05D0, 0x05BC, 0,
- 1, 0xFB31, 0x05D1, 0x05BC, 0,
- 1, 0xFB32, 0x05D2, 0x05BC, 0,
- 1, 0xFB33, 0x05D3, 0x05BC, 0,
- 1, 0xFB34, 0x05D4, 0x05BC, 0,
- 1, 0xFB35, 0x05D5, 0x05BC, 0,
- 1, 0xFB36, 0x05D6, 0x05BC, 0,
- 1, 0xFB38, 0x05D8, 0x05BC, 0,
- 1, 0xFB39, 0x05D9, 0x05BC, 0,
- 1, 0xFB3A, 0x05DA, 0x05BC, 0,
- 1, 0xFB3B, 0x05DB, 0x05BC, 0,
- 1, 0xFB3C, 0x05DC, 0x05BC, 0,
- 1, 0xFB3E, 0x05DE, 0x05BC, 0,
- 1, 0xFB40, 0x05E0, 0x05BC, 0,
- 1, 0xFB41, 0x05E1, 0x05BC, 0,
- 1, 0xFB43, 0x05E3, 0x05BC, 0,
- 1, 0xFB44, 0x05E4, 0x05BC, 0,
- 1, 0xFB46, 0x05E6, 0x05BC, 0,
- 1, 0xFB47, 0x05E7, 0x05BC, 0,
- 1, 0xFB48, 0x05E8, 0x05BC, 0,
- 1, 0xFB49, 0x05E9, 0x05BC, 0,
- 1, 0xFB4A, 0x05EA, 0x05BC, 0,
- 1, 0xFB4B, 0x05D5, 0x05B9, 0,
- 1, 0xFB4C, 0x05D1, 0x05BF, 0,
- 1, 0xFB4D, 0x05DB, 0x05BF, 0,
- 1, 0xFB4E, 0x05E4, 0x05BF, 0,
- 16, 0xFB4F, 0x05D0, 0x05DC, 0,
- 7, 0xFB50, 0x0671, 0,
- 6, 0xFB51, 0x0671, 0,
- 7, 0xFB52, 0x067B, 0,
- 6, 0xFB53, 0x067B, 0,
- 4, 0xFB54, 0x067B, 0,
- 5, 0xFB55, 0x067B, 0,
- 7, 0xFB56, 0x067E, 0,
- 6, 0xFB57, 0x067E, 0,
- 4, 0xFB58, 0x067E, 0,
- 5, 0xFB59, 0x067E, 0,
- 7, 0xFB5A, 0x0680, 0,
- 6, 0xFB5B, 0x0680, 0,
- 4, 0xFB5C, 0x0680, 0,
- 5, 0xFB5D, 0x0680, 0,
- 7, 0xFB5E, 0x067A, 0,
- 6, 0xFB5F, 0x067A, 0,
- 4, 0xFB60, 0x067A, 0,
- 5, 0xFB61, 0x067A, 0,
- 7, 0xFB62, 0x067F, 0,
- 6, 0xFB63, 0x067F, 0,
- 4, 0xFB64, 0x067F, 0,
- 5, 0xFB65, 0x067F, 0,
- 7, 0xFB66, 0x0679, 0,
- 6, 0xFB67, 0x0679, 0,
- 4, 0xFB68, 0x0679, 0,
- 5, 0xFB69, 0x0679, 0,
- 7, 0xFB6A, 0x06A4, 0,
- 6, 0xFB6B, 0x06A4, 0,
- 4, 0xFB6C, 0x06A4, 0,
- 5, 0xFB6D, 0x06A4, 0,
- 7, 0xFB6E, 0x06A6, 0,
- 6, 0xFB6F, 0x06A6, 0,
- 4, 0xFB70, 0x06A6, 0,
- 5, 0xFB71, 0x06A6, 0,
- 7, 0xFB72, 0x0684, 0,
- 6, 0xFB73, 0x0684, 0,
- 4, 0xFB74, 0x0684, 0,
- 5, 0xFB75, 0x0684, 0,
- 7, 0xFB76, 0x0683, 0,
- 6, 0xFB77, 0x0683, 0,
- 4, 0xFB78, 0x0683, 0,
- 5, 0xFB79, 0x0683, 0,
- 7, 0xFB7A, 0x0686, 0,
- 6, 0xFB7B, 0x0686, 0,
- 4, 0xFB7C, 0x0686, 0,
- 5, 0xFB7D, 0x0686, 0,
- 7, 0xFB7E, 0x0687, 0,
- 6, 0xFB7F, 0x0687, 0,
- 4, 0xFB80, 0x0687, 0,
- 5, 0xFB81, 0x0687, 0,
- 7, 0xFB82, 0x068D, 0,
- 6, 0xFB83, 0x068D, 0,
- 7, 0xFB84, 0x068C, 0,
- 6, 0xFB85, 0x068C, 0,
- 7, 0xFB86, 0x068E, 0,
- 6, 0xFB87, 0x068E, 0,
- 7, 0xFB88, 0x0688, 0,
- 6, 0xFB89, 0x0688, 0,
- 7, 0xFB8A, 0x0698, 0,
- 6, 0xFB8B, 0x0698, 0,
- 7, 0xFB8C, 0x0691, 0,
- 6, 0xFB8D, 0x0691, 0,
- 7, 0xFB8E, 0x06A9, 0,
- 6, 0xFB8F, 0x06A9, 0,
- 4, 0xFB90, 0x06A9, 0,
- 5, 0xFB91, 0x06A9, 0,
- 7, 0xFB92, 0x06AF, 0,
- 6, 0xFB93, 0x06AF, 0,
- 4, 0xFB94, 0x06AF, 0,
- 5, 0xFB95, 0x06AF, 0,
- 7, 0xFB96, 0x06B3, 0,
- 6, 0xFB97, 0x06B3, 0,
- 4, 0xFB98, 0x06B3, 0,
- 5, 0xFB99, 0x06B3, 0,
- 7, 0xFB9A, 0x06B1, 0,
- 6, 0xFB9B, 0x06B1, 0,
- 4, 0xFB9C, 0x06B1, 0,
- 5, 0xFB9D, 0x06B1, 0,
- 7, 0xFB9E, 0x06BA, 0,
- 6, 0xFB9F, 0x06BA, 0,
- 7, 0xFBA0, 0x06BB, 0,
- 6, 0xFBA1, 0x06BB, 0,
- 4, 0xFBA2, 0x06BB, 0,
- 5, 0xFBA3, 0x06BB, 0,
- 7, 0xFBA4, 0x06C0, 0,
- 6, 0xFBA5, 0x06C0, 0,
- 7, 0xFBA6, 0x06C1, 0,
- 6, 0xFBA7, 0x06C1, 0,
- 4, 0xFBA8, 0x06C1, 0,
- 5, 0xFBA9, 0x06C1, 0,
- 7, 0xFBAA, 0x06BE, 0,
- 6, 0xFBAB, 0x06BE, 0,
- 4, 0xFBAC, 0x06BE, 0,
- 5, 0xFBAD, 0x06BE, 0,
- 7, 0xFBAE, 0x06D2, 0,
- 6, 0xFBAF, 0x06D2, 0,
- 7, 0xFBB0, 0x06D3, 0,
- 6, 0xFBB1, 0x06D3, 0,
- 7, 0xFBD3, 0x06AD, 0,
- 6, 0xFBD4, 0x06AD, 0,
- 4, 0xFBD5, 0x06AD, 0,
- 5, 0xFBD6, 0x06AD, 0,
- 7, 0xFBD7, 0x06C7, 0,
- 6, 0xFBD8, 0x06C7, 0,
- 7, 0xFBD9, 0x06C6, 0,
- 6, 0xFBDA, 0x06C6, 0,
- 7, 0xFBDB, 0x06C8, 0,
- 6, 0xFBDC, 0x06C8, 0,
- 7, 0xFBDD, 0x0677, 0,
- 7, 0xFBDE, 0x06CB, 0,
- 6, 0xFBDF, 0x06CB, 0,
- 7, 0xFBE0, 0x06C5, 0,
- 6, 0xFBE1, 0x06C5, 0,
- 7, 0xFBE2, 0x06C9, 0,
- 6, 0xFBE3, 0x06C9, 0,
- 7, 0xFBE4, 0x06D0, 0,
- 6, 0xFBE5, 0x06D0, 0,
- 4, 0xFBE6, 0x06D0, 0,
- 5, 0xFBE7, 0x06D0, 0,
- 4, 0xFBE8, 0x0649, 0,
- 5, 0xFBE9, 0x0649, 0,
- 7, 0xFBEA, 0x0626, 0x0627, 0,
- 6, 0xFBEB, 0x0626, 0x0627, 0,
- 7, 0xFBEC, 0x0626, 0x06D5, 0,
- 6, 0xFBED, 0x0626, 0x06D5, 0,
- 7, 0xFBEE, 0x0626, 0x0648, 0,
- 6, 0xFBEF, 0x0626, 0x0648, 0,
- 7, 0xFBF0, 0x0626, 0x06C7, 0,
- 6, 0xFBF1, 0x0626, 0x06C7, 0,
- 7, 0xFBF2, 0x0626, 0x06C6, 0,
- 6, 0xFBF3, 0x0626, 0x06C6, 0,
- 7, 0xFBF4, 0x0626, 0x06C8, 0,
- 6, 0xFBF5, 0x0626, 0x06C8, 0,
- 7, 0xFBF6, 0x0626, 0x06D0, 0,
- 6, 0xFBF7, 0x0626, 0x06D0, 0,
- 4, 0xFBF8, 0x0626, 0x06D0, 0,
- 7, 0xFBF9, 0x0626, 0x0649, 0,
- 6, 0xFBFA, 0x0626, 0x0649, 0,
- 4, 0xFBFB, 0x0626, 0x0649, 0,
- 7, 0xFBFC, 0x06CC, 0,
- 6, 0xFBFD, 0x06CC, 0,
- 4, 0xFBFE, 0x06CC, 0,
- 5, 0xFBFF, 0x06CC, 0,
- 7, 0xFC00, 0x0626, 0x062C, 0,
- 7, 0xFC01, 0x0626, 0x062D, 0,
- 7, 0xFC02, 0x0626, 0x0645, 0,
- 7, 0xFC03, 0x0626, 0x0649, 0,
- 7, 0xFC04, 0x0626, 0x064A, 0,
- 7, 0xFC05, 0x0628, 0x062C, 0,
- 7, 0xFC06, 0x0628, 0x062D, 0,
- 7, 0xFC07, 0x0628, 0x062E, 0,
- 7, 0xFC08, 0x0628, 0x0645, 0,
- 7, 0xFC09, 0x0628, 0x0649, 0,
- 7, 0xFC0A, 0x0628, 0x064A, 0,
- 7, 0xFC0B, 0x062A, 0x062C, 0,
- 7, 0xFC0C, 0x062A, 0x062D, 0,
- 7, 0xFC0D, 0x062A, 0x062E, 0,
- 7, 0xFC0E, 0x062A, 0x0645, 0,
- 7, 0xFC0F, 0x062A, 0x0649, 0,
- 7, 0xFC10, 0x062A, 0x064A, 0,
- 7, 0xFC11, 0x062B, 0x062C, 0,
- 7, 0xFC12, 0x062B, 0x0645, 0,
- 7, 0xFC13, 0x062B, 0x0649, 0,
- 7, 0xFC14, 0x062B, 0x064A, 0,
- 7, 0xFC15, 0x062C, 0x062D, 0,
- 7, 0xFC16, 0x062C, 0x0645, 0,
- 7, 0xFC17, 0x062D, 0x062C, 0,
- 7, 0xFC18, 0x062D, 0x0645, 0,
- 7, 0xFC19, 0x062E, 0x062C, 0,
- 7, 0xFC1A, 0x062E, 0x062D, 0,
- 7, 0xFC1B, 0x062E, 0x0645, 0,
- 7, 0xFC1C, 0x0633, 0x062C, 0,
- 7, 0xFC1D, 0x0633, 0x062D, 0,
- 7, 0xFC1E, 0x0633, 0x062E, 0,
- 7, 0xFC1F, 0x0633, 0x0645, 0,
- 7, 0xFC20, 0x0635, 0x062D, 0,
- 7, 0xFC21, 0x0635, 0x0645, 0,
- 7, 0xFC22, 0x0636, 0x062C, 0,
- 7, 0xFC23, 0x0636, 0x062D, 0,
- 7, 0xFC24, 0x0636, 0x062E, 0,
- 7, 0xFC25, 0x0636, 0x0645, 0,
- 7, 0xFC26, 0x0637, 0x062D, 0,
- 7, 0xFC27, 0x0637, 0x0645, 0,
- 7, 0xFC28, 0x0638, 0x0645, 0,
- 7, 0xFC29, 0x0639, 0x062C, 0,
- 7, 0xFC2A, 0x0639, 0x0645, 0,
- 7, 0xFC2B, 0x063A, 0x062C, 0,
- 7, 0xFC2C, 0x063A, 0x0645, 0,
- 7, 0xFC2D, 0x0641, 0x062C, 0,
- 7, 0xFC2E, 0x0641, 0x062D, 0,
- 7, 0xFC2F, 0x0641, 0x062E, 0,
- 7, 0xFC30, 0x0641, 0x0645, 0,
- 7, 0xFC31, 0x0641, 0x0649, 0,
- 7, 0xFC32, 0x0641, 0x064A, 0,
- 7, 0xFC33, 0x0642, 0x062D, 0,
- 7, 0xFC34, 0x0642, 0x0645, 0,
- 7, 0xFC35, 0x0642, 0x0649, 0,
- 7, 0xFC36, 0x0642, 0x064A, 0,
- 7, 0xFC37, 0x0643, 0x0627, 0,
- 7, 0xFC38, 0x0643, 0x062C, 0,
- 7, 0xFC39, 0x0643, 0x062D, 0,
- 7, 0xFC3A, 0x0643, 0x062E, 0,
- 7, 0xFC3B, 0x0643, 0x0644, 0,
- 7, 0xFC3C, 0x0643, 0x0645, 0,
- 7, 0xFC3D, 0x0643, 0x0649, 0,
- 7, 0xFC3E, 0x0643, 0x064A, 0,
- 7, 0xFC3F, 0x0644, 0x062C, 0,
- 7, 0xFC40, 0x0644, 0x062D, 0,
- 7, 0xFC41, 0x0644, 0x062E, 0,
- 7, 0xFC42, 0x0644, 0x0645, 0,
- 7, 0xFC43, 0x0644, 0x0649, 0,
- 7, 0xFC44, 0x0644, 0x064A, 0,
- 7, 0xFC45, 0x0645, 0x062C, 0,
- 7, 0xFC46, 0x0645, 0x062D, 0,
- 7, 0xFC47, 0x0645, 0x062E, 0,
- 7, 0xFC48, 0x0645, 0x0645, 0,
- 7, 0xFC49, 0x0645, 0x0649, 0,
- 7, 0xFC4A, 0x0645, 0x064A, 0,
- 7, 0xFC4B, 0x0646, 0x062C, 0,
- 7, 0xFC4C, 0x0646, 0x062D, 0,
- 7, 0xFC4D, 0x0646, 0x062E, 0,
- 7, 0xFC4E, 0x0646, 0x0645, 0,
- 7, 0xFC4F, 0x0646, 0x0649, 0,
- 7, 0xFC50, 0x0646, 0x064A, 0,
- 7, 0xFC51, 0x0647, 0x062C, 0,
- 7, 0xFC52, 0x0647, 0x0645, 0,
- 7, 0xFC53, 0x0647, 0x0649, 0,
- 7, 0xFC54, 0x0647, 0x064A, 0,
- 7, 0xFC55, 0x064A, 0x062C, 0,
- 7, 0xFC56, 0x064A, 0x062D, 0,
- 7, 0xFC57, 0x064A, 0x062E, 0,
- 7, 0xFC58, 0x064A, 0x0645, 0,
- 7, 0xFC59, 0x064A, 0x0649, 0,
- 7, 0xFC5A, 0x064A, 0x064A, 0,
- 7, 0xFC5B, 0x0630, 0x0670, 0,
- 7, 0xFC5C, 0x0631, 0x0670, 0,
- 7, 0xFC5D, 0x0649, 0x0670, 0,
- 7, 0xFC5E, 0x0020, 0x064C, 0x0651, 0,
- 7, 0xFC5F, 0x0020, 0x064D, 0x0651, 0,
- 7, 0xFC60, 0x0020, 0x064E, 0x0651, 0,
- 7, 0xFC61, 0x0020, 0x064F, 0x0651, 0,
- 7, 0xFC62, 0x0020, 0x0650, 0x0651, 0,
- 7, 0xFC63, 0x0020, 0x0651, 0x0670, 0,
- 6, 0xFC64, 0x0626, 0x0631, 0,
- 6, 0xFC65, 0x0626, 0x0632, 0,
- 6, 0xFC66, 0x0626, 0x0645, 0,
- 6, 0xFC67, 0x0626, 0x0646, 0,
- 6, 0xFC68, 0x0626, 0x0649, 0,
- 6, 0xFC69, 0x0626, 0x064A, 0,
- 6, 0xFC6A, 0x0628, 0x0631, 0,
- 6, 0xFC6B, 0x0628, 0x0632, 0,
- 6, 0xFC6C, 0x0628, 0x0645, 0,
- 6, 0xFC6D, 0x0628, 0x0646, 0,
- 6, 0xFC6E, 0x0628, 0x0649, 0,
- 6, 0xFC6F, 0x0628, 0x064A, 0,
- 6, 0xFC70, 0x062A, 0x0631, 0,
- 6, 0xFC71, 0x062A, 0x0632, 0,
- 6, 0xFC72, 0x062A, 0x0645, 0,
- 6, 0xFC73, 0x062A, 0x0646, 0,
- 6, 0xFC74, 0x062A, 0x0649, 0,
- 6, 0xFC75, 0x062A, 0x064A, 0,
- 6, 0xFC76, 0x062B, 0x0631, 0,
- 6, 0xFC77, 0x062B, 0x0632, 0,
- 6, 0xFC78, 0x062B, 0x0645, 0,
- 6, 0xFC79, 0x062B, 0x0646, 0,
- 6, 0xFC7A, 0x062B, 0x0649, 0,
- 6, 0xFC7B, 0x062B, 0x064A, 0,
- 6, 0xFC7C, 0x0641, 0x0649, 0,
- 6, 0xFC7D, 0x0641, 0x064A, 0,
- 6, 0xFC7E, 0x0642, 0x0649, 0,
- 6, 0xFC7F, 0x0642, 0x064A, 0,
- 6, 0xFC80, 0x0643, 0x0627, 0,
- 6, 0xFC81, 0x0643, 0x0644, 0,
- 6, 0xFC82, 0x0643, 0x0645, 0,
- 6, 0xFC83, 0x0643, 0x0649, 0,
- 6, 0xFC84, 0x0643, 0x064A, 0,
- 6, 0xFC85, 0x0644, 0x0645, 0,
- 6, 0xFC86, 0x0644, 0x0649, 0,
- 6, 0xFC87, 0x0644, 0x064A, 0,
- 6, 0xFC88, 0x0645, 0x0627, 0,
- 6, 0xFC89, 0x0645, 0x0645, 0,
- 6, 0xFC8A, 0x0646, 0x0631, 0,
- 6, 0xFC8B, 0x0646, 0x0632, 0,
- 6, 0xFC8C, 0x0646, 0x0645, 0,
- 6, 0xFC8D, 0x0646, 0x0646, 0,
- 6, 0xFC8E, 0x0646, 0x0649, 0,
- 6, 0xFC8F, 0x0646, 0x064A, 0,
- 6, 0xFC90, 0x0649, 0x0670, 0,
- 6, 0xFC91, 0x064A, 0x0631, 0,
- 6, 0xFC92, 0x064A, 0x0632, 0,
- 6, 0xFC93, 0x064A, 0x0645, 0,
- 6, 0xFC94, 0x064A, 0x0646, 0,
- 6, 0xFC95, 0x064A, 0x0649, 0,
- 6, 0xFC96, 0x064A, 0x064A, 0,
- 4, 0xFC97, 0x0626, 0x062C, 0,
- 4, 0xFC98, 0x0626, 0x062D, 0,
- 4, 0xFC99, 0x0626, 0x062E, 0,
- 4, 0xFC9A, 0x0626, 0x0645, 0,
- 4, 0xFC9B, 0x0626, 0x0647, 0,
- 4, 0xFC9C, 0x0628, 0x062C, 0,
- 4, 0xFC9D, 0x0628, 0x062D, 0,
- 4, 0xFC9E, 0x0628, 0x062E, 0,
- 4, 0xFC9F, 0x0628, 0x0645, 0,
- 4, 0xFCA0, 0x0628, 0x0647, 0,
- 4, 0xFCA1, 0x062A, 0x062C, 0,
- 4, 0xFCA2, 0x062A, 0x062D, 0,
- 4, 0xFCA3, 0x062A, 0x062E, 0,
- 4, 0xFCA4, 0x062A, 0x0645, 0,
- 4, 0xFCA5, 0x062A, 0x0647, 0,
- 4, 0xFCA6, 0x062B, 0x0645, 0,
- 4, 0xFCA7, 0x062C, 0x062D, 0,
- 4, 0xFCA8, 0x062C, 0x0645, 0,
- 4, 0xFCA9, 0x062D, 0x062C, 0,
- 4, 0xFCAA, 0x062D, 0x0645, 0,
- 4, 0xFCAB, 0x062E, 0x062C, 0,
- 4, 0xFCAC, 0x062E, 0x0645, 0,
- 4, 0xFCAD, 0x0633, 0x062C, 0,
- 4, 0xFCAE, 0x0633, 0x062D, 0,
- 4, 0xFCAF, 0x0633, 0x062E, 0,
- 4, 0xFCB0, 0x0633, 0x0645, 0,
- 4, 0xFCB1, 0x0635, 0x062D, 0,
- 4, 0xFCB2, 0x0635, 0x062E, 0,
- 4, 0xFCB3, 0x0635, 0x0645, 0,
- 4, 0xFCB4, 0x0636, 0x062C, 0,
- 4, 0xFCB5, 0x0636, 0x062D, 0,
- 4, 0xFCB6, 0x0636, 0x062E, 0,
- 4, 0xFCB7, 0x0636, 0x0645, 0,
- 4, 0xFCB8, 0x0637, 0x062D, 0,
- 4, 0xFCB9, 0x0638, 0x0645, 0,
- 4, 0xFCBA, 0x0639, 0x062C, 0,
- 4, 0xFCBB, 0x0639, 0x0645, 0,
- 4, 0xFCBC, 0x063A, 0x062C, 0,
- 4, 0xFCBD, 0x063A, 0x0645, 0,
- 4, 0xFCBE, 0x0641, 0x062C, 0,
- 4, 0xFCBF, 0x0641, 0x062D, 0,
- 4, 0xFCC0, 0x0641, 0x062E, 0,
- 4, 0xFCC1, 0x0641, 0x0645, 0,
- 4, 0xFCC2, 0x0642, 0x062D, 0,
- 4, 0xFCC3, 0x0642, 0x0645, 0,
- 4, 0xFCC4, 0x0643, 0x062C, 0,
- 4, 0xFCC5, 0x0643, 0x062D, 0,
- 4, 0xFCC6, 0x0643, 0x062E, 0,
- 4, 0xFCC7, 0x0643, 0x0644, 0,
- 4, 0xFCC8, 0x0643, 0x0645, 0,
- 4, 0xFCC9, 0x0644, 0x062C, 0,
- 4, 0xFCCA, 0x0644, 0x062D, 0,
- 4, 0xFCCB, 0x0644, 0x062E, 0,
- 4, 0xFCCC, 0x0644, 0x0645, 0,
- 4, 0xFCCD, 0x0644, 0x0647, 0,
- 4, 0xFCCE, 0x0645, 0x062C, 0,
- 4, 0xFCCF, 0x0645, 0x062D, 0,
- 4, 0xFCD0, 0x0645, 0x062E, 0,
- 4, 0xFCD1, 0x0645, 0x0645, 0,
- 4, 0xFCD2, 0x0646, 0x062C, 0,
- 4, 0xFCD3, 0x0646, 0x062D, 0,
- 4, 0xFCD4, 0x0646, 0x062E, 0,
- 4, 0xFCD5, 0x0646, 0x0645, 0,
- 4, 0xFCD6, 0x0646, 0x0647, 0,
- 4, 0xFCD7, 0x0647, 0x062C, 0,
- 4, 0xFCD8, 0x0647, 0x0645, 0,
- 4, 0xFCD9, 0x0647, 0x0670, 0,
- 4, 0xFCDA, 0x064A, 0x062C, 0,
- 4, 0xFCDB, 0x064A, 0x062D, 0,
- 4, 0xFCDC, 0x064A, 0x062E, 0,
- 4, 0xFCDD, 0x064A, 0x0645, 0,
- 4, 0xFCDE, 0x064A, 0x0647, 0,
- 5, 0xFCDF, 0x0626, 0x0645, 0,
- 5, 0xFCE0, 0x0626, 0x0647, 0,
- 5, 0xFCE1, 0x0628, 0x0645, 0,
- 5, 0xFCE2, 0x0628, 0x0647, 0,
- 5, 0xFCE3, 0x062A, 0x0645, 0,
- 5, 0xFCE4, 0x062A, 0x0647, 0,
- 5, 0xFCE5, 0x062B, 0x0645, 0,
- 5, 0xFCE6, 0x062B, 0x0647, 0,
- 5, 0xFCE7, 0x0633, 0x0645, 0,
- 5, 0xFCE8, 0x0633, 0x0647, 0,
- 5, 0xFCE9, 0x0634, 0x0645, 0,
- 5, 0xFCEA, 0x0634, 0x0647, 0,
- 5, 0xFCEB, 0x0643, 0x0644, 0,
- 5, 0xFCEC, 0x0643, 0x0645, 0,
- 5, 0xFCED, 0x0644, 0x0645, 0,
- 5, 0xFCEE, 0x0646, 0x0645, 0,
- 5, 0xFCEF, 0x0646, 0x0647, 0,
- 5, 0xFCF0, 0x064A, 0x0645, 0,
- 5, 0xFCF1, 0x064A, 0x0647, 0,
- 5, 0xFCF2, 0x0640, 0x064E, 0x0651, 0,
- 5, 0xFCF3, 0x0640, 0x064F, 0x0651, 0,
- 5, 0xFCF4, 0x0640, 0x0650, 0x0651, 0,
- 7, 0xFCF5, 0x0637, 0x0649, 0,
- 7, 0xFCF6, 0x0637, 0x064A, 0,
- 7, 0xFCF7, 0x0639, 0x0649, 0,
- 7, 0xFCF8, 0x0639, 0x064A, 0,
- 7, 0xFCF9, 0x063A, 0x0649, 0,
- 7, 0xFCFA, 0x063A, 0x064A, 0,
- 7, 0xFCFB, 0x0633, 0x0649, 0,
- 7, 0xFCFC, 0x0633, 0x064A, 0,
- 7, 0xFCFD, 0x0634, 0x0649, 0,
- 7, 0xFCFE, 0x0634, 0x064A, 0,
- 7, 0xFCFF, 0x062D, 0x0649, 0,
- 7, 0xFD00, 0x062D, 0x064A, 0,
- 7, 0xFD01, 0x062C, 0x0649, 0,
- 7, 0xFD02, 0x062C, 0x064A, 0,
- 7, 0xFD03, 0x062E, 0x0649, 0,
- 7, 0xFD04, 0x062E, 0x064A, 0,
- 7, 0xFD05, 0x0635, 0x0649, 0,
- 7, 0xFD06, 0x0635, 0x064A, 0,
- 7, 0xFD07, 0x0636, 0x0649, 0,
- 7, 0xFD08, 0x0636, 0x064A, 0,
- 7, 0xFD09, 0x0634, 0x062C, 0,
- 7, 0xFD0A, 0x0634, 0x062D, 0,
- 7, 0xFD0B, 0x0634, 0x062E, 0,
- 7, 0xFD0C, 0x0634, 0x0645, 0,
- 7, 0xFD0D, 0x0634, 0x0631, 0,
- 7, 0xFD0E, 0x0633, 0x0631, 0,
- 7, 0xFD0F, 0x0635, 0x0631, 0,
- 7, 0xFD10, 0x0636, 0x0631, 0,
- 6, 0xFD11, 0x0637, 0x0649, 0,
- 6, 0xFD12, 0x0637, 0x064A, 0,
- 6, 0xFD13, 0x0639, 0x0649, 0,
- 6, 0xFD14, 0x0639, 0x064A, 0,
- 6, 0xFD15, 0x063A, 0x0649, 0,
- 6, 0xFD16, 0x063A, 0x064A, 0,
- 6, 0xFD17, 0x0633, 0x0649, 0,
- 6, 0xFD18, 0x0633, 0x064A, 0,
- 6, 0xFD19, 0x0634, 0x0649, 0,
- 6, 0xFD1A, 0x0634, 0x064A, 0,
- 6, 0xFD1B, 0x062D, 0x0649, 0,
- 6, 0xFD1C, 0x062D, 0x064A, 0,
- 6, 0xFD1D, 0x062C, 0x0649, 0,
- 6, 0xFD1E, 0x062C, 0x064A, 0,
- 6, 0xFD1F, 0x062E, 0x0649, 0,
- 6, 0xFD20, 0x062E, 0x064A, 0,
- 6, 0xFD21, 0x0635, 0x0649, 0,
- 6, 0xFD22, 0x0635, 0x064A, 0,
- 6, 0xFD23, 0x0636, 0x0649, 0,
- 6, 0xFD24, 0x0636, 0x064A, 0,
- 6, 0xFD25, 0x0634, 0x062C, 0,
- 6, 0xFD26, 0x0634, 0x062D, 0,
- 6, 0xFD27, 0x0634, 0x062E, 0,
- 6, 0xFD28, 0x0634, 0x0645, 0,
- 6, 0xFD29, 0x0634, 0x0631, 0,
- 6, 0xFD2A, 0x0633, 0x0631, 0,
- 6, 0xFD2B, 0x0635, 0x0631, 0,
- 6, 0xFD2C, 0x0636, 0x0631, 0,
- 4, 0xFD2D, 0x0634, 0x062C, 0,
- 4, 0xFD2E, 0x0634, 0x062D, 0,
- 4, 0xFD2F, 0x0634, 0x062E, 0,
- 4, 0xFD30, 0x0634, 0x0645, 0,
- 4, 0xFD31, 0x0633, 0x0647, 0,
- 4, 0xFD32, 0x0634, 0x0647, 0,
- 4, 0xFD33, 0x0637, 0x0645, 0,
- 5, 0xFD34, 0x0633, 0x062C, 0,
- 5, 0xFD35, 0x0633, 0x062D, 0,
- 5, 0xFD36, 0x0633, 0x062E, 0,
- 5, 0xFD37, 0x0634, 0x062C, 0,
- 5, 0xFD38, 0x0634, 0x062D, 0,
- 5, 0xFD39, 0x0634, 0x062E, 0,
- 5, 0xFD3A, 0x0637, 0x0645, 0,
- 5, 0xFD3B, 0x0638, 0x0645, 0,
- 6, 0xFD3C, 0x0627, 0x064B, 0,
- 7, 0xFD3D, 0x0627, 0x064B, 0,
- 4, 0xFD50, 0x062A, 0x062C, 0x0645, 0,
- 6, 0xFD51, 0x062A, 0x062D, 0x062C, 0,
- 4, 0xFD52, 0x062A, 0x062D, 0x062C, 0,
- 4, 0xFD53, 0x062A, 0x062D, 0x0645, 0,
- 4, 0xFD54, 0x062A, 0x062E, 0x0645, 0,
- 4, 0xFD55, 0x062A, 0x0645, 0x062C, 0,
- 4, 0xFD56, 0x062A, 0x0645, 0x062D, 0,
- 4, 0xFD57, 0x062A, 0x0645, 0x062E, 0,
- 6, 0xFD58, 0x062C, 0x0645, 0x062D, 0,
- 4, 0xFD59, 0x062C, 0x0645, 0x062D, 0,
- 6, 0xFD5A, 0x062D, 0x0645, 0x064A, 0,
- 6, 0xFD5B, 0x062D, 0x0645, 0x0649, 0,
- 4, 0xFD5C, 0x0633, 0x062D, 0x062C, 0,
- 4, 0xFD5D, 0x0633, 0x062C, 0x062D, 0,
- 6, 0xFD5E, 0x0633, 0x062C, 0x0649, 0,
- 6, 0xFD5F, 0x0633, 0x0645, 0x062D, 0,
- 4, 0xFD60, 0x0633, 0x0645, 0x062D, 0,
- 4, 0xFD61, 0x0633, 0x0645, 0x062C, 0,
- 6, 0xFD62, 0x0633, 0x0645, 0x0645, 0,
- 4, 0xFD63, 0x0633, 0x0645, 0x0645, 0,
- 6, 0xFD64, 0x0635, 0x062D, 0x062D, 0,
- 4, 0xFD65, 0x0635, 0x062D, 0x062D, 0,
- 6, 0xFD66, 0x0635, 0x0645, 0x0645, 0,
- 6, 0xFD67, 0x0634, 0x062D, 0x0645, 0,
- 4, 0xFD68, 0x0634, 0x062D, 0x0645, 0,
- 6, 0xFD69, 0x0634, 0x062C, 0x064A, 0,
- 6, 0xFD6A, 0x0634, 0x0645, 0x062E, 0,
- 4, 0xFD6B, 0x0634, 0x0645, 0x062E, 0,
- 6, 0xFD6C, 0x0634, 0x0645, 0x0645, 0,
- 4, 0xFD6D, 0x0634, 0x0645, 0x0645, 0,
- 6, 0xFD6E, 0x0636, 0x062D, 0x0649, 0,
- 6, 0xFD6F, 0x0636, 0x062E, 0x0645, 0,
- 4, 0xFD70, 0x0636, 0x062E, 0x0645, 0,
- 6, 0xFD71, 0x0637, 0x0645, 0x062D, 0,
- 4, 0xFD72, 0x0637, 0x0645, 0x062D, 0,
- 4, 0xFD73, 0x0637, 0x0645, 0x0645, 0,
- 6, 0xFD74, 0x0637, 0x0645, 0x064A, 0,
- 6, 0xFD75, 0x0639, 0x062C, 0x0645, 0,
- 6, 0xFD76, 0x0639, 0x0645, 0x0645, 0,
- 4, 0xFD77, 0x0639, 0x0645, 0x0645, 0,
- 6, 0xFD78, 0x0639, 0x0645, 0x0649, 0,
- 6, 0xFD79, 0x063A, 0x0645, 0x0645, 0,
- 6, 0xFD7A, 0x063A, 0x0645, 0x064A, 0,
- 6, 0xFD7B, 0x063A, 0x0645, 0x0649, 0,
- 6, 0xFD7C, 0x0641, 0x062E, 0x0645, 0,
- 4, 0xFD7D, 0x0641, 0x062E, 0x0645, 0,
- 6, 0xFD7E, 0x0642, 0x0645, 0x062D, 0,
- 6, 0xFD7F, 0x0642, 0x0645, 0x0645, 0,
- 6, 0xFD80, 0x0644, 0x062D, 0x0645, 0,
- 6, 0xFD81, 0x0644, 0x062D, 0x064A, 0,
- 6, 0xFD82, 0x0644, 0x062D, 0x0649, 0,
- 4, 0xFD83, 0x0644, 0x062C, 0x062C, 0,
- 6, 0xFD84, 0x0644, 0x062C, 0x062C, 0,
- 6, 0xFD85, 0x0644, 0x062E, 0x0645, 0,
- 4, 0xFD86, 0x0644, 0x062E, 0x0645, 0,
- 6, 0xFD87, 0x0644, 0x0645, 0x062D, 0,
- 4, 0xFD88, 0x0644, 0x0645, 0x062D, 0,
- 4, 0xFD89, 0x0645, 0x062D, 0x062C, 0,
- 4, 0xFD8A, 0x0645, 0x062D, 0x0645, 0,
- 6, 0xFD8B, 0x0645, 0x062D, 0x064A, 0,
- 4, 0xFD8C, 0x0645, 0x062C, 0x062D, 0,
- 4, 0xFD8D, 0x0645, 0x062C, 0x0645, 0,
- 4, 0xFD8E, 0x0645, 0x062E, 0x062C, 0,
- 4, 0xFD8F, 0x0645, 0x062E, 0x0645, 0,
- 4, 0xFD92, 0x0645, 0x062C, 0x062E, 0,
- 4, 0xFD93, 0x0647, 0x0645, 0x062C, 0,
- 4, 0xFD94, 0x0647, 0x0645, 0x0645, 0,
- 4, 0xFD95, 0x0646, 0x062D, 0x0645, 0,
- 6, 0xFD96, 0x0646, 0x062D, 0x0649, 0,
- 6, 0xFD97, 0x0646, 0x062C, 0x0645, 0,
- 4, 0xFD98, 0x0646, 0x062C, 0x0645, 0,
- 6, 0xFD99, 0x0646, 0x062C, 0x0649, 0,
- 6, 0xFD9A, 0x0646, 0x0645, 0x064A, 0,
- 6, 0xFD9B, 0x0646, 0x0645, 0x0649, 0,
- 6, 0xFD9C, 0x064A, 0x0645, 0x0645, 0,
- 4, 0xFD9D, 0x064A, 0x0645, 0x0645, 0,
- 6, 0xFD9E, 0x0628, 0x062E, 0x064A, 0,
- 6, 0xFD9F, 0x062A, 0x062C, 0x064A, 0,
- 6, 0xFDA0, 0x062A, 0x062C, 0x0649, 0,
- 6, 0xFDA1, 0x062A, 0x062E, 0x064A, 0,
- 6, 0xFDA2, 0x062A, 0x062E, 0x0649, 0,
- 6, 0xFDA3, 0x062A, 0x0645, 0x064A, 0,
- 6, 0xFDA4, 0x062A, 0x0645, 0x0649, 0,
- 6, 0xFDA5, 0x062C, 0x0645, 0x064A, 0,
- 6, 0xFDA6, 0x062C, 0x062D, 0x0649, 0,
- 6, 0xFDA7, 0x062C, 0x0645, 0x0649, 0,
- 6, 0xFDA8, 0x0633, 0x062E, 0x0649, 0,
- 6, 0xFDA9, 0x0635, 0x062D, 0x064A, 0,
- 6, 0xFDAA, 0x0634, 0x062D, 0x064A, 0,
- 6, 0xFDAB, 0x0636, 0x062D, 0x064A, 0,
- 6, 0xFDAC, 0x0644, 0x062C, 0x064A, 0,
- 6, 0xFDAD, 0x0644, 0x0645, 0x064A, 0,
- 6, 0xFDAE, 0x064A, 0x062D, 0x064A, 0,
- 6, 0xFDAF, 0x064A, 0x062C, 0x064A, 0,
- 6, 0xFDB0, 0x064A, 0x0645, 0x064A, 0,
- 6, 0xFDB1, 0x0645, 0x0645, 0x064A, 0,
- 6, 0xFDB2, 0x0642, 0x0645, 0x064A, 0,
- 6, 0xFDB3, 0x0646, 0x062D, 0x064A, 0,
- 4, 0xFDB4, 0x0642, 0x0645, 0x062D, 0,
- 4, 0xFDB5, 0x0644, 0x062D, 0x0645, 0,
- 6, 0xFDB6, 0x0639, 0x0645, 0x064A, 0,
- 6, 0xFDB7, 0x0643, 0x0645, 0x064A, 0,
- 4, 0xFDB8, 0x0646, 0x062C, 0x062D, 0,
- 6, 0xFDB9, 0x0645, 0x062E, 0x064A, 0,
- 4, 0xFDBA, 0x0644, 0x062C, 0x0645, 0,
- 6, 0xFDBB, 0x0643, 0x0645, 0x0645, 0,
- 6, 0xFDBC, 0x0644, 0x062C, 0x0645, 0,
- 6, 0xFDBD, 0x0646, 0x062C, 0x062D, 0,
- 6, 0xFDBE, 0x062C, 0x062D, 0x064A, 0,
- 6, 0xFDBF, 0x062D, 0x062C, 0x064A, 0,
- 6, 0xFDC0, 0x0645, 0x062C, 0x064A, 0,
- 6, 0xFDC1, 0x0641, 0x0645, 0x064A, 0,
- 6, 0xFDC2, 0x0628, 0x062D, 0x064A, 0,
- 4, 0xFDC3, 0x0643, 0x0645, 0x0645, 0,
- 4, 0xFDC4, 0x0639, 0x062C, 0x0645, 0,
- 4, 0xFDC5, 0x0635, 0x0645, 0x0645, 0,
- 6, 0xFDC6, 0x0633, 0x062E, 0x064A, 0,
- 6, 0xFDC7, 0x0646, 0x062C, 0x064A, 0,
- 7, 0xFDF0, 0x0635, 0x0644, 0x06D2, 0,
- 7, 0xFDF1, 0x0642, 0x0644, 0x06D2, 0,
- 7, 0xFDF2, 0x0627, 0x0644, 0x0644, 0x0647, 0,
- 7, 0xFDF3, 0x0627, 0x0643, 0x0628, 0x0631, 0,
- 7, 0xFDF4, 0x0645, 0x062D, 0x0645, 0x062F, 0,
- 7, 0xFDF5, 0x0635, 0x0644, 0x0639, 0x0645, 0,
- 7, 0xFDF6, 0x0631, 0x0633, 0x0648, 0x0644, 0,
- 7, 0xFDF7, 0x0639, 0x0644, 0x064A, 0x0647, 0,
- 7, 0xFDF8, 0x0648, 0x0633, 0x0644, 0x0645, 0,
- 7, 0xFDF9, 0x0635, 0x0644, 0x0649, 0,
- 7, 0xFDFA, 0x0635, 0x0644, 0x0649, 0x0020, 0x0627, 0x0644, 0x0644, 0x0647, 0x0020, 0x0639, 0x0644, 0x064A, 0x0647, 0x0020, 0x0648, 0x0633, 0x0644, 0x0645, 0,
- 7, 0xFDFB, 0x062C, 0x0644, 0x0020, 0x062C, 0x0644, 0x0627, 0x0644, 0x0647, 0,
- 11, 0xFE30, 0x2025, 0,
- 11, 0xFE31, 0x2014, 0,
- 11, 0xFE32, 0x2013, 0,
- 11, 0xFE33, 0x005F, 0,
- 11, 0xFE34, 0x005F, 0,
- 11, 0xFE35, 0x0028, 0,
- 11, 0xFE36, 0x0029, 0,
- 11, 0xFE37, 0x007B, 0,
- 11, 0xFE38, 0x007D, 0,
- 11, 0xFE39, 0x3014, 0,
- 11, 0xFE3A, 0x3015, 0,
- 11, 0xFE3B, 0x3010, 0,
- 11, 0xFE3C, 0x3011, 0,
- 11, 0xFE3D, 0x300A, 0,
- 11, 0xFE3E, 0x300B, 0,
- 11, 0xFE3F, 0x3008, 0,
- 11, 0xFE40, 0x3009, 0,
- 11, 0xFE41, 0x300C, 0,
- 11, 0xFE42, 0x300D, 0,
- 11, 0xFE43, 0x300E, 0,
- 11, 0xFE44, 0x300F, 0,
- 16, 0xFE49, 0x203E, 0,
- 16, 0xFE4A, 0x203E, 0,
- 16, 0xFE4B, 0x203E, 0,
- 16, 0xFE4C, 0x203E, 0,
- 16, 0xFE4D, 0x005F, 0,
- 16, 0xFE4E, 0x005F, 0,
- 16, 0xFE4F, 0x005F, 0,
- 14, 0xFE50, 0x002C, 0,
- 14, 0xFE51, 0x3001, 0,
- 14, 0xFE52, 0x002E, 0,
- 14, 0xFE54, 0x003B, 0,
- 14, 0xFE55, 0x003A, 0,
- 14, 0xFE56, 0x003F, 0,
- 14, 0xFE57, 0x0021, 0,
- 14, 0xFE58, 0x2014, 0,
- 14, 0xFE59, 0x0028, 0,
- 14, 0xFE5A, 0x0029, 0,
- 14, 0xFE5B, 0x007B, 0,
- 14, 0xFE5C, 0x007D, 0,
- 14, 0xFE5D, 0x3014, 0,
- 14, 0xFE5E, 0x3015, 0,
- 14, 0xFE5F, 0x0023, 0,
- 14, 0xFE60, 0x0026, 0,
- 14, 0xFE61, 0x002A, 0,
- 14, 0xFE62, 0x002B, 0,
- 14, 0xFE63, 0x002D, 0,
- 14, 0xFE64, 0x003C, 0,
- 14, 0xFE65, 0x003E, 0,
- 14, 0xFE66, 0x003D, 0,
- 14, 0xFE68, 0x005C, 0,
- 14, 0xFE69, 0x0024, 0,
- 14, 0xFE6A, 0x0025, 0,
- 14, 0xFE6B, 0x0040, 0,
- 7, 0xFE70, 0x0020, 0x064B, 0,
- 5, 0xFE71, 0x0640, 0x064B, 0,
- 7, 0xFE72, 0x0020, 0x064C, 0,
- 7, 0xFE74, 0x0020, 0x064D, 0,
- 7, 0xFE76, 0x0020, 0x064E, 0,
- 5, 0xFE77, 0x0640, 0x064E, 0,
- 7, 0xFE78, 0x0020, 0x064F, 0,
- 5, 0xFE79, 0x0640, 0x064F, 0,
- 7, 0xFE7A, 0x0020, 0x0650, 0,
- 5, 0xFE7B, 0x0640, 0x0650, 0,
- 7, 0xFE7C, 0x0020, 0x0651, 0,
- 5, 0xFE7D, 0x0640, 0x0651, 0,
- 7, 0xFE7E, 0x0020, 0x0652, 0,
- 5, 0xFE7F, 0x0640, 0x0652, 0,
- 7, 0xFE80, 0x0621, 0,
- 7, 0xFE81, 0x0622, 0,
- 6, 0xFE82, 0x0622, 0,
- 7, 0xFE83, 0x0623, 0,
- 6, 0xFE84, 0x0623, 0,
- 7, 0xFE85, 0x0624, 0,
- 6, 0xFE86, 0x0624, 0,
- 7, 0xFE87, 0x0625, 0,
- 6, 0xFE88, 0x0625, 0,
- 7, 0xFE89, 0x0626, 0,
- 6, 0xFE8A, 0x0626, 0,
- 4, 0xFE8B, 0x0626, 0,
- 5, 0xFE8C, 0x0626, 0,
- 7, 0xFE8D, 0x0627, 0,
- 6, 0xFE8E, 0x0627, 0,
- 7, 0xFE8F, 0x0628, 0,
- 6, 0xFE90, 0x0628, 0,
- 4, 0xFE91, 0x0628, 0,
- 5, 0xFE92, 0x0628, 0,
- 7, 0xFE93, 0x0629, 0,
- 6, 0xFE94, 0x0629, 0,
- 7, 0xFE95, 0x062A, 0,
- 6, 0xFE96, 0x062A, 0,
- 4, 0xFE97, 0x062A, 0,
- 5, 0xFE98, 0x062A, 0,
- 7, 0xFE99, 0x062B, 0,
- 6, 0xFE9A, 0x062B, 0,
- 4, 0xFE9B, 0x062B, 0,
- 5, 0xFE9C, 0x062B, 0,
- 7, 0xFE9D, 0x062C, 0,
- 6, 0xFE9E, 0x062C, 0,
- 4, 0xFE9F, 0x062C, 0,
- 5, 0xFEA0, 0x062C, 0,
- 7, 0xFEA1, 0x062D, 0,
- 6, 0xFEA2, 0x062D, 0,
- 4, 0xFEA3, 0x062D, 0,
- 5, 0xFEA4, 0x062D, 0,
- 7, 0xFEA5, 0x062E, 0,
- 6, 0xFEA6, 0x062E, 0,
- 4, 0xFEA7, 0x062E, 0,
- 5, 0xFEA8, 0x062E, 0,
- 7, 0xFEA9, 0x062F, 0,
- 6, 0xFEAA, 0x062F, 0,
- 7, 0xFEAB, 0x0630, 0,
- 6, 0xFEAC, 0x0630, 0,
- 7, 0xFEAD, 0x0631, 0,
- 6, 0xFEAE, 0x0631, 0,
- 7, 0xFEAF, 0x0632, 0,
- 6, 0xFEB0, 0x0632, 0,
- 7, 0xFEB1, 0x0633, 0,
- 6, 0xFEB2, 0x0633, 0,
- 4, 0xFEB3, 0x0633, 0,
- 5, 0xFEB4, 0x0633, 0,
- 7, 0xFEB5, 0x0634, 0,
- 6, 0xFEB6, 0x0634, 0,
- 4, 0xFEB7, 0x0634, 0,
- 5, 0xFEB8, 0x0634, 0,
- 7, 0xFEB9, 0x0635, 0,
- 6, 0xFEBA, 0x0635, 0,
- 4, 0xFEBB, 0x0635, 0,
- 5, 0xFEBC, 0x0635, 0,
- 7, 0xFEBD, 0x0636, 0,
- 6, 0xFEBE, 0x0636, 0,
- 4, 0xFEBF, 0x0636, 0,
- 5, 0xFEC0, 0x0636, 0,
- 7, 0xFEC1, 0x0637, 0,
- 6, 0xFEC2, 0x0637, 0,
- 4, 0xFEC3, 0x0637, 0,
- 5, 0xFEC4, 0x0637, 0,
- 7, 0xFEC5, 0x0638, 0,
- 6, 0xFEC6, 0x0638, 0,
- 4, 0xFEC7, 0x0638, 0,
- 5, 0xFEC8, 0x0638, 0,
- 7, 0xFEC9, 0x0639, 0,
- 6, 0xFECA, 0x0639, 0,
- 4, 0xFECB, 0x0639, 0,
- 5, 0xFECC, 0x0639, 0,
- 7, 0xFECD, 0x063A, 0,
- 6, 0xFECE, 0x063A, 0,
- 4, 0xFECF, 0x063A, 0,
- 5, 0xFED0, 0x063A, 0,
- 7, 0xFED1, 0x0641, 0,
- 6, 0xFED2, 0x0641, 0,
- 4, 0xFED3, 0x0641, 0,
- 5, 0xFED4, 0x0641, 0,
- 7, 0xFED5, 0x0642, 0,
- 6, 0xFED6, 0x0642, 0,
- 4, 0xFED7, 0x0642, 0,
- 5, 0xFED8, 0x0642, 0,
- 7, 0xFED9, 0x0643, 0,
- 6, 0xFEDA, 0x0643, 0,
- 4, 0xFEDB, 0x0643, 0,
- 5, 0xFEDC, 0x0643, 0,
- 7, 0xFEDD, 0x0644, 0,
- 6, 0xFEDE, 0x0644, 0,
- 4, 0xFEDF, 0x0644, 0,
- 5, 0xFEE0, 0x0644, 0,
- 7, 0xFEE1, 0x0645, 0,
- 6, 0xFEE2, 0x0645, 0,
- 4, 0xFEE3, 0x0645, 0,
- 5, 0xFEE4, 0x0645, 0,
- 7, 0xFEE5, 0x0646, 0,
- 6, 0xFEE6, 0x0646, 0,
- 4, 0xFEE7, 0x0646, 0,
- 5, 0xFEE8, 0x0646, 0,
- 7, 0xFEE9, 0x0647, 0,
- 6, 0xFEEA, 0x0647, 0,
- 4, 0xFEEB, 0x0647, 0,
- 5, 0xFEEC, 0x0647, 0,
- 7, 0xFEED, 0x0648, 0,
- 6, 0xFEEE, 0x0648, 0,
- 7, 0xFEEF, 0x0649, 0,
- 6, 0xFEF0, 0x0649, 0,
- 7, 0xFEF1, 0x064A, 0,
- 6, 0xFEF2, 0x064A, 0,
- 4, 0xFEF3, 0x064A, 0,
- 5, 0xFEF4, 0x064A, 0,
- 7, 0xFEF5, 0x0644, 0x0622, 0,
- 6, 0xFEF6, 0x0644, 0x0622, 0,
- 7, 0xFEF7, 0x0644, 0x0623, 0,
- 6, 0xFEF8, 0x0644, 0x0623, 0,
- 7, 0xFEF9, 0x0644, 0x0625, 0,
- 6, 0xFEFA, 0x0644, 0x0625, 0,
- 7, 0xFEFB, 0x0644, 0x0627, 0,
- 6, 0xFEFC, 0x0644, 0x0627, 0,
- 12, 0xFF01, 0x0021, 0,
- 12, 0xFF02, 0x0022, 0,
- 12, 0xFF03, 0x0023, 0,
- 12, 0xFF04, 0x0024, 0,
- 12, 0xFF05, 0x0025, 0,
- 12, 0xFF06, 0x0026, 0,
- 12, 0xFF07, 0x0027, 0,
- 12, 0xFF08, 0x0028, 0,
- 12, 0xFF09, 0x0029, 0,
- 12, 0xFF0A, 0x002A, 0,
- 12, 0xFF0B, 0x002B, 0,
- 12, 0xFF0C, 0x002C, 0,
- 12, 0xFF0D, 0x002D, 0,
- 12, 0xFF0E, 0x002E, 0,
- 12, 0xFF0F, 0x002F, 0,
- 12, 0xFF10, 0x0030, 0,
- 12, 0xFF11, 0x0031, 0,
- 12, 0xFF12, 0x0032, 0,
- 12, 0xFF13, 0x0033, 0,
- 12, 0xFF14, 0x0034, 0,
- 12, 0xFF15, 0x0035, 0,
- 12, 0xFF16, 0x0036, 0,
- 12, 0xFF17, 0x0037, 0,
- 12, 0xFF18, 0x0038, 0,
- 12, 0xFF19, 0x0039, 0,
- 12, 0xFF1A, 0x003A, 0,
- 12, 0xFF1B, 0x003B, 0,
- 12, 0xFF1C, 0x003C, 0,
- 12, 0xFF1D, 0x003D, 0,
- 12, 0xFF1E, 0x003E, 0,
- 12, 0xFF1F, 0x003F, 0,
- 12, 0xFF20, 0x0040, 0,
- 12, 0xFF21, 0x0041, 0,
- 12, 0xFF22, 0x0042, 0,
- 12, 0xFF23, 0x0043, 0,
- 12, 0xFF24, 0x0044, 0,
- 12, 0xFF25, 0x0045, 0,
- 12, 0xFF26, 0x0046, 0,
- 12, 0xFF27, 0x0047, 0,
- 12, 0xFF28, 0x0048, 0,
- 12, 0xFF29, 0x0049, 0,
- 12, 0xFF2A, 0x004A, 0,
- 12, 0xFF2B, 0x004B, 0,
- 12, 0xFF2C, 0x004C, 0,
- 12, 0xFF2D, 0x004D, 0,
- 12, 0xFF2E, 0x004E, 0,
- 12, 0xFF2F, 0x004F, 0,
- 12, 0xFF30, 0x0050, 0,
- 12, 0xFF31, 0x0051, 0,
- 12, 0xFF32, 0x0052, 0,
- 12, 0xFF33, 0x0053, 0,
- 12, 0xFF34, 0x0054, 0,
- 12, 0xFF35, 0x0055, 0,
- 12, 0xFF36, 0x0056, 0,
- 12, 0xFF37, 0x0057, 0,
- 12, 0xFF38, 0x0058, 0,
- 12, 0xFF39, 0x0059, 0,
- 12, 0xFF3A, 0x005A, 0,
- 12, 0xFF3B, 0x005B, 0,
- 12, 0xFF3C, 0x005C, 0,
- 12, 0xFF3D, 0x005D, 0,
- 12, 0xFF3E, 0x005E, 0,
- 12, 0xFF3F, 0x005F, 0,
- 12, 0xFF40, 0x0060, 0,
- 12, 0xFF41, 0x0061, 0,
- 12, 0xFF42, 0x0062, 0,
- 12, 0xFF43, 0x0063, 0,
- 12, 0xFF44, 0x0064, 0,
- 12, 0xFF45, 0x0065, 0,
- 12, 0xFF46, 0x0066, 0,
- 12, 0xFF47, 0x0067, 0,
- 12, 0xFF48, 0x0068, 0,
- 12, 0xFF49, 0x0069, 0,
- 12, 0xFF4A, 0x006A, 0,
- 12, 0xFF4B, 0x006B, 0,
- 12, 0xFF4C, 0x006C, 0,
- 12, 0xFF4D, 0x006D, 0,
- 12, 0xFF4E, 0x006E, 0,
- 12, 0xFF4F, 0x006F, 0,
- 12, 0xFF50, 0x0070, 0,
- 12, 0xFF51, 0x0071, 0,
- 12, 0xFF52, 0x0072, 0,
- 12, 0xFF53, 0x0073, 0,
- 12, 0xFF54, 0x0074, 0,
- 12, 0xFF55, 0x0075, 0,
- 12, 0xFF56, 0x0076, 0,
- 12, 0xFF57, 0x0077, 0,
- 12, 0xFF58, 0x0078, 0,
- 12, 0xFF59, 0x0079, 0,
- 12, 0xFF5A, 0x007A, 0,
- 12, 0xFF5B, 0x007B, 0,
- 12, 0xFF5C, 0x007C, 0,
- 12, 0xFF5D, 0x007D, 0,
- 12, 0xFF5E, 0x007E, 0,
- 13, 0xFF61, 0x3002, 0,
- 13, 0xFF62, 0x300C, 0,
- 13, 0xFF63, 0x300D, 0,
- 13, 0xFF64, 0x3001, 0,
- 13, 0xFF65, 0x30FB, 0,
- 13, 0xFF66, 0x30F2, 0,
- 13, 0xFF67, 0x30A1, 0,
- 13, 0xFF68, 0x30A3, 0,
- 13, 0xFF69, 0x30A5, 0,
- 13, 0xFF6A, 0x30A7, 0,
- 13, 0xFF6B, 0x30A9, 0,
- 13, 0xFF6C, 0x30E3, 0,
- 13, 0xFF6D, 0x30E5, 0,
- 13, 0xFF6E, 0x30E7, 0,
- 13, 0xFF6F, 0x30C3, 0,
- 13, 0xFF70, 0x30FC, 0,
- 13, 0xFF71, 0x30A2, 0,
- 13, 0xFF72, 0x30A4, 0,
- 13, 0xFF73, 0x30A6, 0,
- 13, 0xFF74, 0x30A8, 0,
- 13, 0xFF75, 0x30AA, 0,
- 13, 0xFF76, 0x30AB, 0,
- 13, 0xFF77, 0x30AD, 0,
- 13, 0xFF78, 0x30AF, 0,
- 13, 0xFF79, 0x30B1, 0,
- 13, 0xFF7A, 0x30B3, 0,
- 13, 0xFF7B, 0x30B5, 0,
- 13, 0xFF7C, 0x30B7, 0,
- 13, 0xFF7D, 0x30B9, 0,
- 13, 0xFF7E, 0x30BB, 0,
- 13, 0xFF7F, 0x30BD, 0,
- 13, 0xFF80, 0x30BF, 0,
- 13, 0xFF81, 0x30C1, 0,
- 13, 0xFF82, 0x30C4, 0,
- 13, 0xFF83, 0x30C6, 0,
- 13, 0xFF84, 0x30C8, 0,
- 13, 0xFF85, 0x30CA, 0,
- 13, 0xFF86, 0x30CB, 0,
- 13, 0xFF87, 0x30CC, 0,
- 13, 0xFF88, 0x30CD, 0,
- 13, 0xFF89, 0x30CE, 0,
- 13, 0xFF8A, 0x30CF, 0,
- 13, 0xFF8B, 0x30D2, 0,
- 13, 0xFF8C, 0x30D5, 0,
- 13, 0xFF8D, 0x30D8, 0,
- 13, 0xFF8E, 0x30DB, 0,
- 13, 0xFF8F, 0x30DE, 0,
- 13, 0xFF90, 0x30DF, 0,
- 13, 0xFF91, 0x30E0, 0,
- 13, 0xFF92, 0x30E1, 0,
- 13, 0xFF93, 0x30E2, 0,
- 13, 0xFF94, 0x30E4, 0,
- 13, 0xFF95, 0x30E6, 0,
- 13, 0xFF96, 0x30E8, 0,
- 13, 0xFF97, 0x30E9, 0,
- 13, 0xFF98, 0x30EA, 0,
- 13, 0xFF99, 0x30EB, 0,
- 13, 0xFF9A, 0x30EC, 0,
- 13, 0xFF9B, 0x30ED, 0,
- 13, 0xFF9C, 0x30EF, 0,
- 13, 0xFF9D, 0x30F3, 0,
- 13, 0xFF9E, 0x3099, 0,
- 13, 0xFF9F, 0x309A, 0,
- 13, 0xFFA0, 0x3164, 0,
- 13, 0xFFA1, 0x3131, 0,
- 13, 0xFFA2, 0x3132, 0,
- 13, 0xFFA3, 0x3133, 0,
- 13, 0xFFA4, 0x3134, 0,
- 13, 0xFFA5, 0x3135, 0,
- 13, 0xFFA6, 0x3136, 0,
- 13, 0xFFA7, 0x3137, 0,
- 13, 0xFFA8, 0x3138, 0,
- 13, 0xFFA9, 0x3139, 0,
- 13, 0xFFAA, 0x313A, 0,
- 13, 0xFFAB, 0x313B, 0,
- 13, 0xFFAC, 0x313C, 0,
- 13, 0xFFAD, 0x313D, 0,
- 13, 0xFFAE, 0x313E, 0,
- 13, 0xFFAF, 0x313F, 0,
- 13, 0xFFB0, 0x3140, 0,
- 13, 0xFFB1, 0x3141, 0,
- 13, 0xFFB2, 0x3142, 0,
- 13, 0xFFB3, 0x3143, 0,
- 13, 0xFFB4, 0x3144, 0,
- 13, 0xFFB5, 0x3145, 0,
- 13, 0xFFB6, 0x3146, 0,
- 13, 0xFFB7, 0x3147, 0,
- 13, 0xFFB8, 0x3148, 0,
- 13, 0xFFB9, 0x3149, 0,
- 13, 0xFFBA, 0x314A, 0,
- 13, 0xFFBB, 0x314B, 0,
- 13, 0xFFBC, 0x314C, 0,
- 13, 0xFFBD, 0x314D, 0,
- 13, 0xFFBE, 0x314E, 0,
- 13, 0xFFC2, 0x314F, 0,
- 13, 0xFFC3, 0x3150, 0,
- 13, 0xFFC4, 0x3151, 0,
- 13, 0xFFC5, 0x3152, 0,
- 13, 0xFFC6, 0x3153, 0,
- 13, 0xFFC7, 0x3154, 0,
- 13, 0xFFCA, 0x3155, 0,
- 13, 0xFFCB, 0x3156, 0,
- 13, 0xFFCC, 0x3157, 0,
- 13, 0xFFCD, 0x3158, 0,
- 13, 0xFFCE, 0x3159, 0,
- 13, 0xFFCF, 0x315A, 0,
- 13, 0xFFD2, 0x315B, 0,
- 13, 0xFFD3, 0x315C, 0,
- 13, 0xFFD4, 0x315D, 0,
- 13, 0xFFD5, 0x315E, 0,
- 13, 0xFFD6, 0x315F, 0,
- 13, 0xFFD7, 0x3160, 0,
- 13, 0xFFDA, 0x3161, 0,
- 13, 0xFFDB, 0x3162, 0,
- 13, 0xFFDC, 0x3163, 0,
- 12, 0xFFE0, 0x00A2, 0,
- 12, 0xFFE1, 0x00A3, 0,
- 12, 0xFFE2, 0x00AC, 0,
- 12, 0xFFE3, 0x00AF, 0,
- 12, 0xFFE4, 0x00A6, 0,
- 12, 0xFFE5, 0x00A5, 0,
- 12, 0xFFE6, 0x20A9, 0,
- 13, 0xFFE8, 0x2502, 0,
- 13, 0xFFE9, 0x2190, 0,
- 13, 0xFFEA, 0x2191, 0,
- 13, 0xFFEB, 0x2192, 0,
- 13, 0xFFEC, 0x2193, 0,
- 13, 0xFFED, 0x25A0, 0,
- 13, 0xFFEE, 0x25CB, 0,
-
-};
-
-static const Q_UINT16 di_00[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 0, 0, 0, 0, 0,
- 5, 0, 10, 0, 0, 0, 0, 14,
- 0, 0, 19, 23, 27, 32, 0, 0,
- 36, 41, 45, 0, 49, 55, 61, 0,
- 67, 72, 77, 82, 87, 92, 0, 97,
- 102, 107, 112, 117, 122, 127, 132, 137,
- 0, 142, 147, 152, 157, 162, 167, 0,
- 0, 172, 177, 182, 187, 192, 0, 0,
- 197, 202, 207, 212, 217, 222, 0, 227,
- 232, 237, 242, 247, 252, 257, 262, 267,
- 0, 272, 277, 282, 287, 292, 297, 0,
- 0, 302, 307, 312, 317, 322, 0, 327,
-};
-
-static const Q_UINT16 di_01[] = {
- 332, 337, 342, 347, 352, 357, 362, 367,
- 372, 377, 382, 387, 392, 397, 402, 407,
- 0, 0, 412, 417, 422, 427, 432, 437,
- 442, 447, 452, 457, 462, 467, 472, 477,
- 482, 487, 492, 497, 502, 507, 0, 0,
- 512, 517, 522, 527, 532, 537, 542, 547,
- 552, 0, 557, 562, 567, 572, 577, 582,
- 0, 587, 592, 597, 602, 607, 612, 617,
- 622, 0, 0, 627, 632, 637, 642, 647,
- 652, 657, 0, 0, 662, 667, 672, 677,
- 682, 687, 0, 0, 692, 697, 702, 707,
- 712, 717, 722, 727, 732, 737, 742, 747,
- 752, 757, 762, 767, 772, 777, 0, 0,
- 782, 787, 792, 797, 802, 807, 812, 817,
- 822, 827, 832, 837, 842, 847, 852, 857,
- 862, 867, 872, 877, 882, 887, 892, 897,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 901, 906, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 911,
- 916, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 921, 926, 931, 936,
- 941, 946, 951, 956, 961, 966, 971, 976,
- 981, 986, 991, 996, 1001, 1006, 1011, 1016,
- 1021, 1026, 1031, 1036, 1041, 0, 1046, 1051,
- 1056, 1061, 1066, 1071, 0, 0, 1076, 1081,
- 1086, 1091, 1096, 1101, 1106, 1111, 1116, 1121,
- 1126, 1131, 1136, 1141, 1146, 1151, 0, 0,
- 1156, 1161, 1166, 1171, 1176, 1181, 1186, 1191,
-};
-
-static const Q_UINT16 di_02[] = {
- 1196, 1201, 1206, 1211, 1216, 1221, 1226, 1231,
- 1236, 1241, 1246, 1251, 1256, 1261, 1266, 1271,
- 1276, 1281, 1286, 1291, 1296, 1301, 1306, 1311,
- 1316, 1321, 1326, 1331, 0, 0, 1336, 1341,
- 0, 0, 0, 0, 0, 0, 1346, 1351,
- 1356, 1361, 1366, 1371, 1376, 1381, 1386, 1391,
- 1396, 1401, 1406, 1411, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 1416, 1420, 1424, 1428, 1432, 1436, 1440, 1444,
- 1448, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 1452, 1457, 1462, 1467, 1472, 1477, 0, 0,
- 1482, 1486, 1490, 1494, 1498, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 di_03[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 1502, 1506, 0, 1510, 1514, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1519, 0, 0, 0,
- 0, 0, 1523, 0, 0, 0, 1528, 0,
- 0, 0, 0, 0, 1532, 1537, 1542, 1547,
- 1551, 1556, 1561, 0, 1566, 0, 1571, 1576,
- 1581, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 1586, 1591, 1596, 1601, 1606, 1611,
- 1616, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 1621, 1626, 1631, 1636, 1641, 0,
- 1646, 1650, 1654, 1658, 1663, 1668, 1672, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 1676, 1680, 1684, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 di_04[] = {
- 1688, 1693, 0, 1698, 0, 0, 0, 1703,
- 0, 0, 0, 0, 1708, 1713, 1718, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1723, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1728, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 1733, 1738, 0, 1743, 0, 0, 0, 1748,
- 0, 0, 0, 0, 1753, 1758, 1763, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 1768, 1773,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1778, 1783, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 1788, 1793, 1798, 1803, 0, 0, 1808, 1813,
- 0, 0, 1818, 1823, 1828, 1833, 1838, 1843,
- 0, 0, 1848, 1853, 1858, 1863, 1868, 1873,
- 0, 0, 1878, 1883, 1888, 1893, 1898, 1903,
- 1908, 1913, 1918, 1923, 1928, 1933, 0, 0,
- 1938, 1943, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 di_05[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 1948,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 di_06[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 1953, 1958, 1963, 1968, 1973, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 1978, 1983, 1988,
- 1993, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 1998, 0, 2003, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 2008, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 di_07[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 di_09[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 2013, 0, 0, 0, 0, 0, 0,
- 0, 2018, 0, 0, 2023, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 2028, 2033, 2038, 2043, 2048, 2053, 2058, 2063,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 2068, 2073, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 2078, 2083, 0, 2088,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 di_0A[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 2093, 0, 0, 2098, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 2103, 2108, 2113, 0, 0, 2118, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 di_0B[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 2123, 0, 0, 2128, 2133, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 2138, 2143, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 2148, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 2153, 2158, 2163, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 di_0C[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 2168, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 2173, 0, 0, 0, 0, 0, 0, 2178,
- 2183, 0, 2188, 2193, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 di_0D[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 2198, 2203, 2208, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 2213, 0, 2218, 2223, 2228, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 di_0E[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 2233, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 2238, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 2243, 2248, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 di_0F[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 2253, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 2257, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 2262, 0, 0,
- 0, 0, 2267, 0, 0, 0, 0, 2272,
- 0, 0, 0, 0, 2277, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 2282, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 2287, 0, 2292, 2297, 2302,
- 2307, 2312, 0, 0, 0, 0, 0, 0,
- 0, 2317, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 2322, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 2327, 0, 0,
- 0, 0, 2332, 0, 0, 0, 0, 2337,
- 0, 0, 0, 0, 2342, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 2347, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 di_10[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 2352, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 di_1E[] = {
- 2357, 2362, 2367, 2372, 2377, 2382, 2387, 2392,
- 2397, 2402, 2407, 2412, 2417, 2422, 2427, 2432,
- 2437, 2442, 2447, 2452, 2457, 2462, 2467, 2472,
- 2477, 2482, 2487, 2492, 2497, 2502, 2507, 2512,
- 2517, 2522, 2527, 2532, 2537, 2542, 2547, 2552,
- 2557, 2562, 2567, 2572, 2577, 2582, 2587, 2592,
- 2597, 2602, 2607, 2612, 2617, 2622, 2627, 2632,
- 2637, 2642, 2647, 2652, 2657, 2662, 2667, 2672,
- 2677, 2682, 2687, 2692, 2697, 2702, 2707, 2712,
- 2717, 2722, 2727, 2732, 2737, 2742, 2747, 2752,
- 2757, 2762, 2767, 2772, 2777, 2782, 2787, 2792,
- 2797, 2802, 2807, 2812, 2817, 2822, 2827, 2832,
- 2837, 2842, 2847, 2852, 2857, 2862, 2867, 2872,
- 2877, 2882, 2887, 2892, 2897, 2902, 2907, 2912,
- 2917, 2922, 2927, 2932, 2937, 2942, 2947, 2952,
- 2957, 2962, 2967, 2972, 2977, 2982, 2987, 2992,
- 2997, 3002, 3007, 3012, 3017, 3022, 3027, 3032,
- 3037, 3042, 3047, 3052, 3057, 3062, 3067, 3072,
- 3077, 3082, 3087, 3092, 3097, 3102, 3107, 3112,
- 3117, 3122, 3127, 3132, 0, 0, 0, 0,
- 3137, 3142, 3147, 3152, 3157, 3162, 3167, 3172,
- 3177, 3182, 3187, 3192, 3197, 3202, 3207, 3212,
- 3217, 3222, 3227, 3232, 3237, 3242, 3247, 3252,
- 3257, 3262, 3267, 3272, 3277, 3282, 3287, 3292,
- 3297, 3302, 3307, 3312, 3317, 3322, 3327, 3332,
- 3337, 3342, 3347, 3352, 3357, 3362, 3367, 3372,
- 3377, 3382, 3387, 3392, 3397, 3402, 3407, 3412,
- 3417, 3422, 3427, 3432, 3437, 3442, 3447, 3452,
- 3457, 3462, 3467, 3472, 3477, 3482, 3487, 3492,
- 3497, 3502, 3507, 3512, 3517, 3522, 3527, 3532,
- 3537, 3542, 3547, 3552, 3557, 3562, 3567, 3572,
- 3577, 3582, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 di_1F[] = {
- 3587, 3592, 3597, 3602, 3607, 3612, 3617, 3622,
- 3627, 3632, 3637, 3642, 3647, 3652, 3657, 3662,
- 3667, 3672, 3677, 3682, 3687, 3692, 0, 0,
- 3697, 3702, 3707, 3712, 3717, 3722, 0, 0,
- 3727, 3732, 3737, 3742, 3747, 3752, 3757, 3762,
- 3767, 3772, 3777, 3782, 3787, 3792, 3797, 3802,
- 3807, 3812, 3817, 3822, 3827, 3832, 3837, 3842,
- 3847, 3852, 3857, 3862, 3867, 3872, 3877, 3882,
- 3887, 3892, 3897, 3902, 3907, 3912, 0, 0,
- 3917, 3922, 3927, 3932, 3937, 3942, 0, 0,
- 3947, 3952, 3957, 3962, 3967, 3972, 3977, 3982,
- 0, 3987, 0, 3992, 0, 3997, 0, 4002,
- 4007, 4012, 4017, 4022, 4027, 4032, 4037, 4042,
- 4047, 4052, 4057, 4062, 4067, 4072, 4077, 4082,
- 4087, 4092, 4096, 4101, 4105, 4110, 4114, 4119,
- 4123, 4128, 4132, 4137, 4141, 4146, 0, 0,
- 4150, 4155, 4160, 4165, 4170, 4175, 4180, 4185,
- 4190, 4195, 4200, 4205, 4210, 4215, 4220, 4225,
- 4230, 4235, 4240, 4245, 4250, 4255, 4260, 4265,
- 4270, 4275, 4280, 4285, 4290, 4295, 4300, 4305,
- 4310, 4315, 4320, 4325, 4330, 4335, 4340, 4345,
- 4350, 4355, 4360, 4365, 4370, 4375, 4380, 4385,
- 4390, 4395, 4400, 4405, 4410, 0, 4415, 4420,
- 4425, 4430, 4435, 4440, 4444, 4449, 4454, 4458,
- 4463, 4468, 4473, 4478, 4483, 0, 4488, 4493,
- 4498, 4503, 4507, 4512, 4516, 4521, 4526, 4531,
- 4536, 4541, 4546, 4551, 0, 0, 4555, 4560,
- 4565, 4570, 4575, 4580, 0, 4584, 4589, 4594,
- 4599, 4604, 4609, 4614, 4618, 4623, 4628, 4633,
- 4638, 4643, 4648, 4653, 4657, 4662, 4667, 4671,
- 0, 0, 4675, 4680, 4685, 0, 4690, 4695,
- 4700, 4705, 4709, 4714, 4718, 4723, 4727, 0,
-};
-
-static const Q_UINT16 di_20[] = {
- 4732, 4736, 4740, 4744, 4748, 4752, 4756, 4760,
- 4764, 4768, 4772, 0, 0, 0, 0, 0,
- 0, 4776, 0, 0, 0, 0, 0, 4780,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 4785, 4789, 4794, 0,
- 0, 0, 0, 0, 0, 0, 0, 4800,
- 0, 0, 0, 4804, 4809, 0, 4815, 4820,
- 0, 0, 0, 0, 4826, 0, 4831, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 4836, 4841, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 4846, 0, 0, 0, 4850, 4854, 4858, 4862,
- 4866, 4870, 4874, 4878, 4882, 4886, 4890, 4894,
- 4898, 4902, 4906, 4910, 4914, 4918, 4922, 4926,
- 4930, 4934, 4938, 4942, 4946, 4950, 4954, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 4958, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 di_21[] = {
- 4963, 4969, 4975, 4979, 0, 4984, 4990, 4996,
- 0, 5000, 5005, 5009, 5013, 5017, 5021, 5025,
- 5029, 5033, 5037, 5041, 0, 5045, 5049, 0,
- 0, 5054, 5058, 5062, 5066, 5070, 0, 0,
- 5074, 5079, 5085, 0, 5090, 0, 5094, 0,
- 5098, 0, 5102, 5106, 5110, 5114, 0, 5118,
- 5122, 5126, 0, 5130, 5134, 5138, 5142, 5146,
- 5150, 5154, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 5158, 5164, 5170, 5176, 5182,
- 5188, 5194, 5200, 5206, 5212, 5218, 5224, 5230,
- 5235, 5239, 5244, 5250, 5255, 5259, 5264, 5270,
- 5277, 5282, 5286, 5291, 5297, 5301, 5305, 5309,
- 5313, 5317, 5322, 5328, 5333, 5337, 5342, 5348,
- 5355, 5360, 5364, 5369, 5375, 5379, 5383, 5387,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 5391, 5396, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 5401, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 5406, 5411, 5416,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 di_22[] = {
- 0, 0, 0, 0, 5421, 0, 0, 0,
- 0, 5426, 0, 0, 5431, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 5436, 0, 5441, 0,
- 0, 0, 0, 0, 5446, 5451, 0, 5457,
- 5462, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 5468, 0, 0, 5473, 0, 0, 5478,
- 0, 5483, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 5488, 0, 5493, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 5498, 5503, 5508,
- 5513, 5518, 0, 0, 5523, 5528, 0, 0,
- 5533, 5538, 0, 0, 0, 0, 0, 0,
- 5543, 5548, 0, 0, 5553, 5558, 0, 0,
- 5563, 5568, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 5573, 5578, 5583, 5588,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 5593, 5598, 5603, 5608, 0, 0, 0, 0,
- 0, 0, 5613, 5618, 5623, 5628, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 di_23[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 5633, 5637, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 di_24[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 5641, 5645, 5649, 5653, 5657, 5661, 5665, 5669,
- 5673, 5677, 5682, 5687, 5692, 5697, 5702, 5707,
- 5712, 5717, 5722, 5727, 5732, 5738, 5744, 5750,
- 5756, 5762, 5768, 5774, 5780, 5786, 5793, 5800,
- 5807, 5814, 5821, 5828, 5835, 5842, 5849, 5856,
- 5863, 5868, 5873, 5878, 5883, 5888, 5893, 5898,
- 5903, 5908, 5914, 5920, 5926, 5932, 5938, 5944,
- 5950, 5956, 5962, 5968, 5974, 5980, 5986, 5992,
- 5998, 6004, 6010, 6016, 6022, 6028, 6034, 6040,
- 6046, 6052, 6058, 6064, 6070, 6076, 6082, 6088,
- 6094, 6100, 6106, 6112, 6118, 6124, 6130, 6134,
- 6138, 6142, 6146, 6150, 6154, 6158, 6162, 6166,
- 6170, 6174, 6178, 6182, 6186, 6190, 6194, 6198,
- 6202, 6206, 6210, 6214, 6218, 6222, 6226, 6230,
- 6234, 6238, 6242, 6246, 6250, 6254, 6258, 6262,
- 6266, 6270, 6274, 6278, 6282, 6286, 6290, 6294,
- 6298, 6302, 6306, 6310, 6314, 6318, 6322, 6326,
- 6330, 6334, 6338, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 di_2E[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 6342,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 6346, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 di_2F[] = {
- 6350, 6354, 6358, 6362, 6366, 6370, 6374, 6378,
- 6382, 6386, 6390, 6394, 6398, 6402, 6406, 6410,
- 6414, 6418, 6422, 6426, 6430, 6434, 6438, 6442,
- 6446, 6450, 6454, 6458, 6462, 6466, 6470, 6474,
- 6478, 6482, 6486, 6490, 6494, 6498, 6502, 6506,
- 6510, 6514, 6518, 6522, 6526, 6530, 6534, 6538,
- 6542, 6546, 6550, 6554, 6558, 6562, 6566, 6570,
- 6574, 6578, 6582, 6586, 6590, 6594, 6598, 6602,
- 6606, 6610, 6614, 6618, 6622, 6626, 6630, 6634,
- 6638, 6642, 6646, 6650, 6654, 6658, 6662, 6666,
- 6670, 6674, 6678, 6682, 6686, 6690, 6694, 6698,
- 6702, 6706, 6710, 6714, 6718, 6722, 6726, 6730,
- 6734, 6738, 6742, 6746, 6750, 6754, 6758, 6762,
- 6766, 6770, 6774, 6778, 6782, 6786, 6790, 6794,
- 6798, 6802, 6806, 6810, 6814, 6818, 6822, 6826,
- 6830, 6834, 6838, 6842, 6846, 6850, 6854, 6858,
- 6862, 6866, 6870, 6874, 6878, 6882, 6886, 6890,
- 6894, 6898, 6902, 6906, 6910, 6914, 6918, 6922,
- 6926, 6930, 6934, 6938, 6942, 6946, 6950, 6954,
- 6958, 6962, 6966, 6970, 6974, 6978, 6982, 6986,
- 6990, 6994, 6998, 7002, 7006, 7010, 7014, 7018,
- 7022, 7026, 7030, 7034, 7038, 7042, 7046, 7050,
- 7054, 7058, 7062, 7066, 7070, 7074, 7078, 7082,
- 7086, 7090, 7094, 7098, 7102, 7106, 7110, 7114,
- 7118, 7122, 7126, 7130, 7134, 7138, 7142, 7146,
- 7150, 7154, 7158, 7162, 7166, 7170, 7174, 7178,
- 7182, 7186, 7190, 7194, 7198, 7202, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 di_30[] = {
- 7206, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 7210, 0,
- 7214, 7218, 7222, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 7226, 0, 7231, 0,
- 7236, 0, 7241, 0, 7246, 0, 7251, 0,
- 7256, 0, 7261, 0, 7266, 0, 7271, 0,
- 7276, 0, 7281, 0, 0, 7286, 0, 7291,
- 0, 7296, 0, 0, 0, 0, 0, 0,
- 7301, 7306, 0, 7311, 7316, 0, 7321, 7326,
- 0, 7331, 7336, 0, 7341, 7346, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 7351, 0, 0, 0,
- 0, 0, 0, 7356, 7361, 0, 7366, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 7371, 0, 7376, 0,
- 7381, 0, 7386, 0, 7391, 0, 7396, 0,
- 7401, 0, 7406, 0, 7411, 0, 7416, 0,
- 7421, 0, 7426, 0, 0, 7431, 0, 7436,
- 0, 7441, 0, 0, 0, 0, 0, 0,
- 7446, 7451, 0, 7456, 7461, 0, 7466, 7471,
- 0, 7476, 7481, 0, 7486, 7491, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 7496, 0, 0, 7501,
- 7506, 7511, 7516, 0, 0, 0, 7521, 0,
-};
-
-static const Q_UINT16 di_31[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 7526, 7530, 7534, 7538, 7542, 7546, 7550,
- 7554, 7558, 7562, 7566, 7570, 7574, 7578, 7582,
- 7586, 7590, 7594, 7598, 7602, 7606, 7610, 7614,
- 7618, 7622, 7626, 7630, 7634, 7638, 7642, 7646,
- 7650, 7654, 7658, 7662, 7666, 7670, 7674, 7678,
- 7682, 7686, 7690, 7694, 7698, 7702, 7706, 7710,
- 7714, 7718, 7722, 7726, 7730, 7734, 7738, 7742,
- 7746, 7750, 7754, 7758, 7762, 7766, 7770, 7774,
- 7778, 7782, 7786, 7790, 7794, 7798, 7802, 7806,
- 7810, 7814, 7818, 7822, 7826, 7830, 7834, 7838,
- 7842, 7846, 7850, 7854, 7858, 7862, 7866, 7870,
- 7874, 7878, 7882, 7886, 7890, 7894, 7898, 0,
- 0, 0, 7902, 7906, 7910, 7914, 7918, 7922,
- 7926, 7930, 7934, 7938, 7942, 7946, 7950, 7954,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 di_32[] = {
- 7958, 7964, 7970, 7976, 7982, 7988, 7994, 8000,
- 8006, 8012, 8018, 8024, 8030, 8036, 8042, 8049,
- 8056, 8063, 8070, 8077, 8084, 8091, 8098, 8105,
- 8112, 8119, 8126, 8133, 8140, 0, 0, 0,
- 8147, 8153, 8159, 8165, 8171, 8177, 8183, 8189,
- 8195, 8201, 8207, 8213, 8219, 8225, 8231, 8237,
- 8243, 8249, 8255, 8261, 8267, 8273, 8279, 8285,
- 8291, 8297, 8303, 8309, 8315, 8321, 8327, 8333,
- 8339, 8345, 8351, 8357, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 8363, 8367, 8371, 8375, 8379, 8383, 8387, 8391,
- 8395, 8399, 8403, 8407, 8411, 8415, 8419, 8424,
- 8429, 8434, 8439, 8444, 8449, 8454, 8459, 8464,
- 8469, 8474, 8479, 8484, 0, 0, 0, 0,
- 8489, 8493, 8497, 8501, 8505, 8509, 8513, 8517,
- 8521, 8525, 8529, 8533, 8537, 8541, 8545, 8549,
- 8553, 8557, 8561, 8565, 8569, 8573, 8577, 8581,
- 8585, 8589, 8593, 8597, 8601, 8605, 8609, 8613,
- 8617, 8621, 8625, 8629, 8633, 8637, 8641, 8645,
- 8649, 8653, 8657, 8661, 8665, 8669, 8673, 8677,
- 8681, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 8685, 8690, 8695, 8700, 8705, 8710, 8715, 8720,
- 8725, 8730, 8736, 8742, 0, 0, 0, 0,
- 8748, 8752, 8756, 8760, 8764, 8768, 8772, 8776,
- 8780, 8784, 8788, 8792, 8796, 8800, 8804, 8808,
- 8812, 8816, 8820, 8824, 8828, 8832, 8836, 8840,
- 8844, 8848, 8852, 8856, 8860, 8864, 8868, 8872,
- 8876, 8880, 8884, 8888, 8892, 8896, 8900, 8904,
- 8908, 8912, 8916, 8920, 8924, 8928, 8932, 0,
-};
-
-static const Q_UINT16 di_33[] = {
- 8936, 8943, 8950, 8957, 8963, 8970, 8976, 8982,
- 8990, 8997, 9003, 9009, 9015, 9022, 9029, 9035,
- 9041, 9046, 9052, 9059, 9066, 9071, 9079, 9088,
- 9096, 9102, 9110, 9118, 9125, 9131, 9137, 9143,
- 9150, 9158, 9165, 9171, 9177, 9183, 9188, 9193,
- 9198, 9203, 9209, 9215, 9223, 9229, 9236, 9244,
- 9250, 9255, 9260, 9268, 9275, 9283, 9289, 9297,
- 9302, 9308, 9314, 9320, 9326, 9332, 9339, 9345,
- 9350, 9356, 9362, 9368, 9375, 9381, 9387, 9393,
- 9401, 9408, 9413, 9421, 9426, 9433, 9440, 9446,
- 9452, 9458, 9465, 9470, 9476, 9483, 9488, 9496,
- 9502, 9507, 9512, 9517, 9522, 9527, 9532, 9537,
- 9542, 9547, 9552, 9558, 9564, 9570, 9576, 9582,
- 9588, 9594, 9600, 9606, 9612, 9618, 9624, 9630,
- 9636, 9642, 9648, 9653, 9658, 9664, 9669, 0,
- 0, 0, 0, 9674, 9679, 9684, 9689, 9694,
- 9701, 9706, 9711, 9716, 9721, 9726, 9731, 9736,
- 9741, 9747, 9754, 9759, 9764, 9769, 9774, 9779,
- 9784, 9789, 9795, 9801, 9807, 9813, 9818, 9823,
- 9828, 9833, 9838, 9843, 9848, 9853, 9858, 9863,
- 9869, 9875, 9880, 9886, 9892, 9898, 9903, 9909,
- 9915, 9922, 9927, 9933, 9939, 9945, 9951, 9959,
- 9968, 9973, 9978, 9983, 9988, 9993, 9998, 10003,
- 10008, 10013, 10018, 10023, 10028, 10033, 10038, 10043,
- 10048, 10053, 10058, 10065, 10070, 10075, 10080, 10087,
- 10093, 10098, 10103, 10108, 10113, 10118, 10123, 10128,
- 10133, 10138, 10143, 10149, 10154, 10159, 10165, 10171,
- 10176, 10183, 10189, 10194, 10199, 10204, 0, 0,
- 10209, 10214, 10219, 10224, 10229, 10234, 10239, 10244,
- 10249, 10254, 10260, 10266, 10272, 10278, 10284, 10290,
- 10296, 10302, 10308, 10314, 10320, 10326, 10332, 10338,
- 10344, 10350, 10356, 10362, 10368, 10374, 10380, 0,
-};
-
-static const Q_UINT16 di_F9[] = {
- 10386, 10390, 10394, 10398, 10402, 10406, 10410, 10414,
- 10418, 10422, 10426, 10430, 10434, 10438, 10442, 10446,
- 10450, 10454, 10458, 10462, 10466, 10470, 10474, 10478,
- 10482, 10486, 10490, 10494, 10498, 10502, 10506, 10510,
- 10514, 10518, 10522, 10526, 10530, 10534, 10538, 10542,
- 10546, 10550, 10554, 10558, 10562, 10566, 10570, 10574,
- 10578, 10582, 10586, 10590, 10594, 10598, 10602, 10606,
- 10610, 10614, 10618, 10622, 10626, 10630, 10634, 10638,
- 10642, 10646, 10650, 10654, 10658, 10662, 10666, 10670,
- 10674, 10678, 10682, 10686, 10690, 10694, 10698, 10702,
- 10706, 10710, 10714, 10718, 10722, 10726, 10730, 10734,
- 10738, 10742, 10746, 10750, 10754, 10758, 10762, 10766,
- 10770, 10774, 10778, 10782, 10786, 10790, 10794, 10798,
- 10802, 10806, 10810, 10814, 10818, 10822, 10826, 10830,
- 10834, 10838, 10842, 10846, 10850, 10854, 10858, 10862,
- 10866, 10870, 10874, 10878, 10882, 10886, 10890, 10894,
- 10898, 10902, 10906, 10910, 10914, 10918, 10922, 10926,
- 10930, 10934, 10938, 10942, 10946, 10950, 10954, 10958,
- 10962, 10966, 10970, 10974, 10978, 10982, 10986, 10990,
- 10994, 10998, 11002, 11006, 11010, 11014, 11018, 11022,
- 11026, 11030, 11034, 11038, 11042, 11046, 11050, 11054,
- 11058, 11062, 11066, 11070, 11074, 11078, 11082, 11086,
- 11090, 11094, 11098, 11102, 11106, 11110, 11114, 11118,
- 11122, 11126, 11130, 11134, 11138, 11142, 11146, 11150,
- 11154, 11158, 11162, 11166, 11170, 11174, 11178, 11182,
- 11186, 11190, 11194, 11198, 11202, 11206, 11210, 11214,
- 11218, 11222, 11226, 11230, 11234, 11238, 11242, 11246,
- 11250, 11254, 11258, 11262, 11266, 11270, 11274, 11278,
- 11282, 11286, 11290, 11294, 11298, 11302, 11306, 11310,
- 11314, 11318, 11322, 11326, 11330, 11334, 11338, 11342,
- 11346, 11350, 11354, 11358, 11362, 11366, 11370, 11374,
- 11378, 11382, 11386, 11390, 11394, 11398, 11402, 11406,
-};
-
-static const Q_UINT16 di_FA[] = {
- 11410, 11414, 11418, 11422, 11426, 11430, 11434, 11438,
- 11442, 11446, 11450, 11454, 11458, 11462, 0, 0,
- 11466, 0, 11470, 0, 0, 11474, 11478, 11482,
- 11486, 11490, 11494, 11498, 11502, 11506, 11510, 0,
- 11514, 0, 11518, 0, 0, 11522, 11526, 0,
- 0, 0, 11530, 11534, 11538, 11542, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 di_FB[] = {
- 11546, 11551, 11556, 11561, 11567, 11573, 11578, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 11583, 11588, 11593, 11598, 11603,
- 0, 0, 0, 0, 0, 11608, 0, 11613,
- 11618, 11622, 11626, 11630, 11634, 11638, 11642, 11646,
- 11650, 11654, 11658, 11663, 11668, 11673, 11678, 11683,
- 11688, 11693, 11698, 11703, 11708, 11713, 11718, 0,
- 11723, 11728, 11733, 11738, 11743, 0, 11748, 0,
- 11753, 11758, 0, 11763, 11768, 0, 11773, 11778,
- 11783, 11788, 11793, 11798, 11803, 11808, 11813, 11818,
- 11823, 11827, 11831, 11835, 11839, 11843, 11847, 11851,
- 11855, 11859, 11863, 11867, 11871, 11875, 11879, 11883,
- 11887, 11891, 11895, 11899, 11903, 11907, 11911, 11915,
- 11919, 11923, 11927, 11931, 11935, 11939, 11943, 11947,
- 11951, 11955, 11959, 11963, 11967, 11971, 11975, 11979,
- 11983, 11987, 11991, 11995, 11999, 12003, 12007, 12011,
- 12015, 12019, 12023, 12027, 12031, 12035, 12039, 12043,
- 12047, 12051, 12055, 12059, 12063, 12067, 12071, 12075,
- 12079, 12083, 12087, 12091, 12095, 12099, 12103, 12107,
- 12111, 12115, 12119, 12123, 12127, 12131, 12135, 12139,
- 12143, 12147, 12151, 12155, 12159, 12163, 12167, 12171,
- 12175, 12179, 12183, 12187, 12191, 12195, 12199, 12203,
- 12207, 12211, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 12215, 12219, 12223, 12227, 12231,
- 12235, 12239, 12243, 12247, 12251, 12255, 12259, 12263,
- 12267, 12271, 12275, 12279, 12283, 12287, 12291, 12295,
- 12299, 12303, 12307, 12312, 12317, 12322, 12327, 12332,
- 12337, 12342, 12347, 12352, 12357, 12362, 12367, 12372,
- 12377, 12382, 12387, 12392, 12397, 12401, 12405, 12409,
-};
-
-static const Q_UINT16 di_FC[] = {
- 12413, 12418, 12423, 12428, 12433, 12438, 12443, 12448,
- 12453, 12458, 12463, 12468, 12473, 12478, 12483, 12488,
- 12493, 12498, 12503, 12508, 12513, 12518, 12523, 12528,
- 12533, 12538, 12543, 12548, 12553, 12558, 12563, 12568,
- 12573, 12578, 12583, 12588, 12593, 12598, 12603, 12608,
- 12613, 12618, 12623, 12628, 12633, 12638, 12643, 12648,
- 12653, 12658, 12663, 12668, 12673, 12678, 12683, 12688,
- 12693, 12698, 12703, 12708, 12713, 12718, 12723, 12728,
- 12733, 12738, 12743, 12748, 12753, 12758, 12763, 12768,
- 12773, 12778, 12783, 12788, 12793, 12798, 12803, 12808,
- 12813, 12818, 12823, 12828, 12833, 12838, 12843, 12848,
- 12853, 12858, 12863, 12868, 12873, 12878, 12883, 12889,
- 12895, 12901, 12907, 12913, 12919, 12924, 12929, 12934,
- 12939, 12944, 12949, 12954, 12959, 12964, 12969, 12974,
- 12979, 12984, 12989, 12994, 12999, 13004, 13009, 13014,
- 13019, 13024, 13029, 13034, 13039, 13044, 13049, 13054,
- 13059, 13064, 13069, 13074, 13079, 13084, 13089, 13094,
- 13099, 13104, 13109, 13114, 13119, 13124, 13129, 13134,
- 13139, 13144, 13149, 13154, 13159, 13164, 13169, 13174,
- 13179, 13184, 13189, 13194, 13199, 13204, 13209, 13214,
- 13219, 13224, 13229, 13234, 13239, 13244, 13249, 13254,
- 13259, 13264, 13269, 13274, 13279, 13284, 13289, 13294,
- 13299, 13304, 13309, 13314, 13319, 13324, 13329, 13334,
- 13339, 13344, 13349, 13354, 13359, 13364, 13369, 13374,
- 13379, 13384, 13389, 13394, 13399, 13404, 13409, 13414,
- 13419, 13424, 13429, 13434, 13439, 13444, 13449, 13454,
- 13459, 13464, 13469, 13474, 13479, 13484, 13489, 13494,
- 13499, 13504, 13509, 13514, 13519, 13524, 13529, 13534,
- 13539, 13544, 13549, 13554, 13559, 13564, 13569, 13574,
- 13579, 13584, 13589, 13594, 13599, 13604, 13609, 13614,
- 13619, 13624, 13629, 13635, 13641, 13647, 13652, 13657,
- 13662, 13667, 13672, 13677, 13682, 13687, 13692, 13697,
-};
-
-static const Q_UINT16 di_FD[] = {
- 13702, 13707, 13712, 13717, 13722, 13727, 13732, 13737,
- 13742, 13747, 13752, 13757, 13762, 13767, 13772, 13777,
- 13782, 13787, 13792, 13797, 13802, 13807, 13812, 13817,
- 13822, 13827, 13832, 13837, 13842, 13847, 13852, 13857,
- 13862, 13867, 13872, 13877, 13882, 13887, 13892, 13897,
- 13902, 13907, 13912, 13917, 13922, 13927, 13932, 13937,
- 13942, 13947, 13952, 13957, 13962, 13967, 13972, 13977,
- 13982, 13987, 13992, 13997, 14002, 14007, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 14012, 14018, 14024, 14030, 14036, 14042, 14048, 14054,
- 14060, 14066, 14072, 14078, 14084, 14090, 14096, 14102,
- 14108, 14114, 14120, 14126, 14132, 14138, 14144, 14150,
- 14156, 14162, 14168, 14174, 14180, 14186, 14192, 14198,
- 14204, 14210, 14216, 14222, 14228, 14234, 14240, 14246,
- 14252, 14258, 14264, 14270, 14276, 14282, 14288, 14294,
- 14300, 14306, 14312, 14318, 14324, 14330, 14336, 14342,
- 14348, 14354, 14360, 14366, 14372, 14378, 14384, 14390,
- 0, 0, 14396, 14402, 14408, 14414, 14420, 14426,
- 14432, 14438, 14444, 14450, 14456, 14462, 14468, 14474,
- 14480, 14486, 14492, 14498, 14504, 14510, 14516, 14522,
- 14528, 14534, 14540, 14546, 14552, 14558, 14564, 14570,
- 14576, 14582, 14588, 14594, 14600, 14606, 14612, 14618,
- 14624, 14630, 14636, 14642, 14648, 14654, 14660, 14666,
- 14672, 14678, 14684, 14690, 14696, 14702, 14708, 14714,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 14720, 14726, 14732, 14739, 14746, 14753, 14760, 14767,
- 14774, 14781, 14787, 14808, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 di_FE[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 14819, 14823, 14827, 14831, 14835, 14839, 14843, 14847,
- 14851, 14855, 14859, 14863, 14867, 14871, 14875, 14879,
- 14883, 14887, 14891, 14895, 14899, 0, 0, 0,
- 0, 14903, 14907, 14911, 14915, 14919, 14923, 14927,
- 14931, 14935, 14939, 0, 14943, 14947, 14951, 14955,
- 14959, 14963, 14967, 14971, 14975, 14979, 14983, 14987,
- 14991, 14995, 14999, 15003, 15007, 15011, 15015, 0,
- 15019, 15023, 15027, 15031, 0, 0, 0, 0,
- 15035, 15040, 15045, 0, 15050, 0, 15055, 15060,
- 15065, 15070, 15075, 15080, 15085, 15090, 15095, 15100,
- 15105, 15109, 15113, 15117, 15121, 15125, 15129, 15133,
- 15137, 15141, 15145, 15149, 15153, 15157, 15161, 15165,
- 15169, 15173, 15177, 15181, 15185, 15189, 15193, 15197,
- 15201, 15205, 15209, 15213, 15217, 15221, 15225, 15229,
- 15233, 15237, 15241, 15245, 15249, 15253, 15257, 15261,
- 15265, 15269, 15273, 15277, 15281, 15285, 15289, 15293,
- 15297, 15301, 15305, 15309, 15313, 15317, 15321, 15325,
- 15329, 15333, 15337, 15341, 15345, 15349, 15353, 15357,
- 15361, 15365, 15369, 15373, 15377, 15381, 15385, 15389,
- 15393, 15397, 15401, 15405, 15409, 15413, 15417, 15421,
- 15425, 15429, 15433, 15437, 15441, 15445, 15449, 15453,
- 15457, 15461, 15465, 15469, 15473, 15477, 15481, 15485,
- 15489, 15493, 15497, 15501, 15505, 15509, 15513, 15517,
- 15521, 15525, 15529, 15533, 15537, 15541, 15545, 15549,
- 15553, 15557, 15561, 15565, 15569, 15573, 15578, 15583,
- 15588, 15593, 15598, 15603, 15608, 0, 0, 0,
-};
-
-static const Q_UINT16 di_FF[] = {
- 0, 15613, 15617, 15621, 15625, 15629, 15633, 15637,
- 15641, 15645, 15649, 15653, 15657, 15661, 15665, 15669,
- 15673, 15677, 15681, 15685, 15689, 15693, 15697, 15701,
- 15705, 15709, 15713, 15717, 15721, 15725, 15729, 15733,
- 15737, 15741, 15745, 15749, 15753, 15757, 15761, 15765,
- 15769, 15773, 15777, 15781, 15785, 15789, 15793, 15797,
- 15801, 15805, 15809, 15813, 15817, 15821, 15825, 15829,
- 15833, 15837, 15841, 15845, 15849, 15853, 15857, 15861,
- 15865, 15869, 15873, 15877, 15881, 15885, 15889, 15893,
- 15897, 15901, 15905, 15909, 15913, 15917, 15921, 15925,
- 15929, 15933, 15937, 15941, 15945, 15949, 15953, 15957,
- 15961, 15965, 15969, 15973, 15977, 15981, 15985, 0,
- 0, 15989, 15993, 15997, 16001, 16005, 16009, 16013,
- 16017, 16021, 16025, 16029, 16033, 16037, 16041, 16045,
- 16049, 16053, 16057, 16061, 16065, 16069, 16073, 16077,
- 16081, 16085, 16089, 16093, 16097, 16101, 16105, 16109,
- 16113, 16117, 16121, 16125, 16129, 16133, 16137, 16141,
- 16145, 16149, 16153, 16157, 16161, 16165, 16169, 16173,
- 16177, 16181, 16185, 16189, 16193, 16197, 16201, 16205,
- 16209, 16213, 16217, 16221, 16225, 16229, 16233, 16237,
- 16241, 16245, 16249, 16253, 16257, 16261, 16265, 16269,
- 16273, 16277, 16281, 16285, 16289, 16293, 16297, 16301,
- 16305, 16309, 16313, 16317, 16321, 16325, 16329, 16333,
- 16337, 16341, 16345, 16349, 16353, 16357, 16361, 0,
- 0, 0, 16365, 16369, 16373, 16377, 16381, 16385,
- 0, 0, 16389, 16393, 16397, 16401, 16405, 16409,
- 0, 0, 16413, 16417, 16421, 16425, 16429, 16433,
- 0, 0, 16437, 16441, 16445, 0, 0, 0,
- 16449, 16453, 16457, 16461, 16465, 16469, 16473, 0,
- 16477, 16481, 16485, 16489, 16493, 16497, 16501, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 * const decomposition_info[256] = {
- di_00, di_01, di_02, di_03, di_04, di_05, di_06, di_07,
- di_07, di_09, di_0A, di_0B, di_0C, di_0D, di_0E, di_0F,
- di_10, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
- di_07, di_07, di_07, di_07, di_07, di_07, di_1E, di_1F,
- di_20, di_21, di_22, di_23, di_24, di_07, di_07, di_07,
- di_07, di_07, di_07, di_07, di_07, di_07, di_2E, di_2F,
- di_30, di_31, di_32, di_33, di_07, di_07, di_07, di_07,
- di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
- di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
- di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
- di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
- di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
- di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
- di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
- di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
- di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
- di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
- di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
- di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
- di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
- di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
- di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
- di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
- di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
- di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
- di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
- di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
- di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
- di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
- di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
- di_07, di_07, di_07, di_07, di_07, di_07, di_07, di_07,
- di_07, di_F9, di_FA, di_FB, di_FC, di_FD, di_FE, di_FF,
-};
-// 68080 bytes
-
-static const Q_UINT16 ligature_map [] = {
- 0,
- 12883, 12889, 12895, 12901, 12907, 12913, 15035, 15045, 15050, 15055, 15065, 15075, 15085, 15095, 0,
- 5503, 0,
- 5488, 0,
- 5508, 0,
- 67, 72, 77, 82, 87, 92, 332, 342, 352, 966, 1196, 1206, 1346, 2357, 3137, 3147, 0,
- 2367, 2377, 2387, 0,
- 97, 362, 372, 382, 392, 0,
- 402, 2407, 2417, 2427, 2437, 2447, 0,
- 102, 107, 112, 117, 412, 422, 432, 442, 452, 1216, 1226, 1356, 2477, 2487, 3257, 3267, 3277, 0,
- 2507, 0,
- 462, 472, 482, 492, 1076, 1146, 2517, 0,
- 502, 1336, 2527, 2537, 2547, 2557, 2567, 0,
- 122, 127, 132, 137, 512, 522, 532, 542, 552, 976, 1236, 1246, 2577, 3337, 3347, 0,
- 567, 0,
- 577, 1086, 2597, 2607, 2617, 0,
- 587, 597, 607, 2627, 2647, 2657, 0,
- 2667, 2677, 2687, 0,
- 142, 627, 637, 647, 1156, 2697, 2707, 2717, 2727, 0,
- 147, 152, 157, 162, 167, 662, 672, 682, 901, 986, 1096, 1256, 1266, 1386, 3357, 3367, 0,
- 2777, 2787, 0,
- 692, 702, 712, 1276, 1286, 2797, 2807, 2827, 0,
- 722, 732, 742, 752, 1316, 2837, 2847, 0,
- 762, 772, 1326, 2887, 2897, 2907, 2917, 0,
- 172, 177, 182, 187, 782, 792, 802, 812, 822, 832, 911, 996, 1296, 1306, 2927, 2937, 2947, 3477, 3487, 0,
- 2977, 2987, 0,
- 842, 2997, 3007, 3017, 3027, 3037, 0,
- 3047, 3057, 0,
- 192, 852, 862, 1406, 3067, 3547, 3557, 3567, 3577, 0,
- 867, 877, 887, 3077, 3087, 3097, 0,
- 197, 202, 207, 212, 217, 222, 337, 347, 357, 971, 1201, 1211, 1351, 2362, 3142, 3152, 0,
- 2372, 2382, 2392, 0,
- 227, 367, 377, 387, 397, 0,
- 407, 2412, 2422, 2432, 2442, 2452, 0,
- 232, 237, 242, 247, 417, 427, 437, 447, 457, 1221, 1231, 1361, 2482, 2492, 3262, 3272, 3282, 0,
- 2512, 0,
- 467, 477, 487, 497, 1081, 1151, 2522, 0,
- 507, 1341, 2532, 2542, 2552, 2562, 2572, 3107, 0,
- 252, 257, 262, 267, 517, 527, 537, 547, 981, 1241, 1251, 2582, 3342, 3352, 0,
- 572, 1126, 0,
- 582, 1091, 2602, 2612, 2622, 0,
- 592, 602, 612, 2632, 2652, 2662, 0,
- 2672, 2682, 2692, 0,
- 272, 632, 642, 652, 1161, 2702, 2712, 2722, 2732, 0,
- 277, 282, 287, 292, 297, 667, 677, 687, 906, 991, 1101, 1261, 1271, 1391, 3362, 3372, 0,
- 2782, 2792, 0,
- 697, 707, 717, 1281, 1291, 2802, 2812, 2832, 0,
- 727, 737, 747, 757, 1321, 2842, 2852, 0,
- 767, 777, 1331, 2892, 2902, 2912, 2922, 3112, 0,
- 302, 307, 312, 317, 787, 797, 807, 817, 827, 837, 916, 1001, 1301, 1311, 2932, 2942, 2952, 3482, 3492, 0,
- 2982, 2992, 0,
- 847, 3002, 3012, 3022, 3032, 3042, 3117, 0,
- 3052, 3062, 0,
- 322, 327, 857, 1411, 3072, 3122, 3552, 3562, 3572, 3582, 0,
- 872, 882, 892, 3082, 3092, 3102, 0,
- 1537, 4468, 4662, 0,
- 3157, 3167, 3177, 3187, 0,
- 1046, 0,
- 1166, 0,
- 1066, 1176, 0,
- 2397, 0,
- 3287, 3297, 3307, 3317, 0,
- 2587, 0,
- 3377, 3387, 3397, 3407, 0,
- 1376, 2737, 2747, 0,
- 1366, 0,
- 1186, 0,
- 1006, 1016, 1026, 1036, 0,
- 3162, 3172, 3182, 3192, 0,
- 1051, 0,
- 1171, 0,
- 1071, 1181, 0,
- 2402, 0,
- 3292, 3302, 3312, 3322, 0,
- 2592, 0,
- 3382, 3392, 3402, 3412, 0,
- 1381, 2742, 2752, 0,
- 1371, 0,
- 1191, 0,
- 1011, 1021, 1031, 1041, 0,
- 3207, 3217, 3227, 3237, 0,
- 3212, 3222, 3232, 3242, 0,
- 2457, 2467, 0,
- 2462, 2472, 0,
- 2757, 2767, 0,
- 2762, 2772, 0,
- 2857, 0,
- 2862, 0,
- 2867, 0,
- 2872, 0,
- 2957, 0,
- 2962, 0,
- 2967, 0,
- 2972, 0,
- 3132, 0,
- 3427, 3437, 3447, 3457, 3467, 0,
- 3432, 3442, 3452, 3462, 3472, 0,
- 3497, 3507, 3517, 3527, 3537, 0,
- 3502, 3512, 3522, 3532, 3542, 0,
- 1116, 0,
- 1106, 0,
- 1111, 0,
- 1056, 0,
- 1061, 0,
- 2497, 0,
- 2502, 0,
- 1396, 0,
- 1401, 0,
- 1121, 0,
- 1514, 0,
- 1542, 3627, 3632, 4425, 4430, 4435, 4444, 0,
- 1551, 3697, 3702, 4498, 0,
- 1556, 3767, 3772, 4507, 4516, 0,
- 1561, 1586, 3847, 3852, 4565, 4570, 4575, 0,
- 1566, 3917, 3922, 4700, 0,
- 4657, 0,
- 1571, 1591, 3987, 4638, 4643, 4648, 0,
- 1576, 4047, 4052, 4709, 4718, 0,
- 4410, 0,
- 4483, 0,
- 1596, 3587, 3592, 4087, 4390, 4395, 4405, 4415, 0,
- 1601, 3667, 3672, 4096, 0,
- 1606, 3727, 3732, 4105, 4478, 4488, 0,
- 1611, 1621, 3807, 3812, 4114, 4536, 4541, 4555, 0,
- 1631, 3887, 3892, 4123, 0,
- 4618, 4623, 0,
- 1626, 1636, 3947, 3952, 4132, 4599, 4604, 4628, 0,
- 1641, 4007, 4012, 4141, 4680, 4690, 0,
- 1581, 4546, 4560, 0,
- 1616, 4609, 4633, 0,
- 4685, 0,
- 1658, 1663, 0,
- 1703, 0,
- 1788, 1798, 0,
- 1698, 0,
- 1688, 1693, 1808, 0,
- 1778, 1828, 0,
- 1838, 0,
- 1713, 1723, 1848, 1858, 0,
- 1708, 0,
- 1868, 0,
- 1718, 1898, 1908, 1918, 0,
- 1928, 0,
- 1938, 0,
- 1888, 0,
- 1793, 1803, 0,
- 1743, 0,
- 1733, 1738, 1813, 0,
- 1783, 1833, 0,
- 1843, 0,
- 1728, 1758, 1853, 1863, 0,
- 1753, 0,
- 1873, 0,
- 1763, 1903, 1913, 1923, 0,
- 1933, 0,
- 1943, 0,
- 1893, 0,
- 1748, 0,
- 1768, 0,
- 1773, 0,
- 1818, 0,
- 1823, 0,
- 1878, 0,
- 1883, 0,
- 11678, 11683, 11688, 0,
- 11693, 11803, 0,
- 11698, 0,
- 11703, 0,
- 11708, 0,
- 11713, 11798, 0,
- 11718, 0,
- 11723, 0,
- 11608, 11728, 0,
- 11733, 0,
- 11738, 11808, 0,
- 11743, 0,
- 11748, 0,
- 11753, 0,
- 11758, 0,
- 11763, 0,
- 11768, 11813, 0,
- 11773, 0,
- 11778, 0,
- 11783, 0,
- 11658, 11663, 11788, 0,
- 11793, 0,
- 11613, 0,
- 15105, 0,
- 15109, 15113, 0,
- 15117, 15121, 0,
- 15125, 15129, 0,
- 15133, 15137, 0,
- 12307, 12312, 12317, 12322, 12327, 12332, 12337, 12342, 12347, 12352, 12357, 12362, 12367, 12372, 12377, 12382, 12387, 12392, 12413, 12418, 12423, 12428, 12433, 12919, 12924, 12929, 12934, 12939, 12944, 13174, 13179, 13184, 13189, 13194, 13534, 13539, 15141, 15145, 15149, 15153, 0,
- 14732, 14739, 1958, 1968, 14007, 14002, 1953, 15157, 15161, 0,
- 14468, 14684, 12448, 12453, 12458, 12463, 12949, 12954, 12959, 12964, 12969, 12974, 13199, 13204, 13209, 13214, 13219, 13544, 13549, 12438, 12443, 15165, 15169, 15173, 15177, 0,
- 15181, 15185, 0,
- 14012, 14018, 14024, 14030, 14036, 14042, 14048, 14054, 14474, 14480, 14486, 14492, 14498, 14504, 13229, 13234, 13239, 13244, 13559, 13554, 12468, 12473, 12478, 12483, 12488, 12493, 12979, 12984, 12989, 12994, 12999, 13004, 13224, 15189, 15193, 15197, 15201, 0,
- 12498, 12503, 12508, 12513, 13009, 13014, 13019, 13024, 13029, 13034, 13249, 13564, 13569, 15205, 15209, 15213, 15217, 0,
- 14808, 14660, 14060, 14066, 14510, 14516, 14522, 12518, 12523, 13254, 13259, 13707, 13712, 13847, 13852, 15221, 15225, 15229, 15233, 0,
- 14072, 14078, 14666, 13264, 13269, 13697, 13702, 13842, 13837, 12528, 12533, 15237, 15241, 15245, 15249, 0,
- 12538, 12543, 12548, 13274, 13279, 13717, 13722, 13857, 13862, 15253, 15257, 15261, 15265, 0,
- 15269, 15273, 0,
- 12868, 15277, 15281, 0,
- 14760, 12873, 15285, 15289, 0,
- 15293, 15297, 0,
- 14084, 14090, 14096, 14102, 14108, 14114, 14120, 14126, 14528, 14708, 13677, 13682, 13772, 13817, 13822, 13912, 13947, 13962, 13967, 13972, 12553, 12558, 12563, 12568, 13284, 13289, 13294, 13299, 13574, 13579, 15301, 15305, 15309, 15313, 0,
- 14150, 14156, 14162, 14168, 14174, 14180, 14186, 14540, 13767, 13827, 13832, 13887, 13892, 13897, 13902, 13907, 13927, 13932, 13937, 13942, 13952, 13977, 13982, 13987, 13584, 13589, 13687, 13692, 13747, 13752, 13757, 13762, 15317, 15321, 15325, 15329, 0,
- 14787, 14753, 14781, 14138, 14132, 14144, 14534, 14702, 14720, 12573, 12578, 13304, 13309, 13314, 13727, 13732, 13777, 13872, 13917, 13867, 15333, 15337, 15341, 15345, 0,
- 14192, 14198, 14204, 14546, 13319, 13324, 13329, 13334, 13737, 13742, 13782, 13877, 13882, 13922, 12583, 12588, 12593, 12598, 15349, 15353, 15357, 15361, 0,
- 14210, 14216, 14222, 14228, 13647, 13652, 13787, 13792, 13992, 13957, 12603, 12608, 13339, 15365, 15369, 15373, 15377, 0,
- 12613, 13344, 13997, 15381, 15385, 15389, 15393, 0,
- 14767, 14696, 14234, 14240, 14246, 14252, 14612, 12618, 12623, 13349, 13354, 13657, 13662, 13797, 13802, 15397, 15401, 15405, 15409, 0,
- 14258, 14264, 14270, 13359, 13364, 13667, 13672, 13812, 13807, 12628, 12633, 15413, 15417, 15421, 15425, 0,
- 13629, 13635, 13641, 15040, 15060, 15070, 15080, 15090, 15100, 0,
- 14276, 14282, 14678, 12653, 12658, 12663, 13039, 13044, 13369, 13374, 13379, 13384, 12638, 12643, 12648, 15429, 15433, 15437, 15441, 0,
- 14600, 14726, 14294, 14288, 14588, 12668, 12673, 12678, 12683, 13049, 13054, 13389, 13394, 15445, 15449, 15453, 15457, 0,
- 14618, 14642, 14690, 12703, 12708, 12713, 12718, 12723, 13059, 13064, 13069, 13074, 13079, 13399, 13404, 13409, 13414, 13419, 13594, 13599, 12688, 12693, 12698, 15461, 15465, 15469, 15473, 0,
- 14648, 14300, 14306, 14312, 14318, 14324, 14330, 14336, 14342, 14348, 14552, 14558, 14606, 14636, 12728, 12733, 12738, 12743, 12748, 12753, 13084, 13089, 13094, 13424, 13429, 13434, 13439, 13444, 13604, 15573, 15578, 15583, 15588, 15593, 15598, 15603, 15608, 15477, 15481, 15485, 15489, 0,
- 14746, 14354, 14360, 14366, 14372, 14378, 14384, 14390, 14396, 14582, 14630, 14672, 12758, 12763, 12768, 12773, 12778, 12783, 13099, 13104, 13449, 13454, 13459, 13464, 15493, 15497, 15501, 15505, 0,
- 14414, 14420, 14426, 14432, 14438, 14444, 14450, 14594, 14624, 14654, 14714, 13134, 13469, 13474, 13479, 13484, 13489, 13609, 13614, 12788, 12793, 12798, 12803, 12808, 12813, 13109, 13114, 13119, 13124, 13129, 15509, 15513, 15517, 15521, 0,
- 14402, 14408, 12823, 12828, 12833, 13494, 13504, 13499, 12818, 15525, 15529, 15533, 15537, 0,
- 14774, 1963, 15541, 15545, 0,
- 12878, 13139, 12299, 12303, 15549, 15553, 0,
- 14456, 14462, 14564, 14570, 14576, 12858, 12863, 13144, 13149, 13154, 13159, 13164, 13169, 13509, 13514, 13519, 13524, 13529, 13619, 13624, 1973, 12838, 12843, 12848, 12853, 15557, 15561, 15565, 15569, 0,
- 11823, 11827, 0,
- 12255, 0,
- 11911, 11915, 11919, 11923, 0,
- 11879, 11883, 11887, 11891, 0,
- 11831, 11835, 11839, 11843, 0,
- 11847, 11851, 11855, 11859, 0,
- 11895, 11899, 11903, 11907, 0,
- 11863, 11867, 11871, 11875, 0,
- 11975, 11979, 11983, 11987, 0,
- 11959, 11963, 11967, 11971, 0,
- 11991, 11995, 11999, 12003, 0,
- 12007, 12011, 12015, 12019, 0,
- 12047, 12051, 0,
- 12031, 12035, 0,
- 12023, 12027, 0,
- 12039, 12043, 0,
- 12063, 12067, 0,
- 12055, 12059, 0,
- 11927, 11931, 11935, 11939, 0,
- 11943, 11947, 11951, 11955, 0,
- 12071, 12075, 12079, 12083, 0,
- 12215, 12219, 12223, 12227, 0,
- 12087, 12091, 12095, 12099, 0,
- 12119, 12123, 12127, 12131, 0,
- 12103, 12107, 12111, 12115, 0,
- 12135, 12139, 0,
- 12143, 12147, 12151, 12155, 0,
- 12183, 12187, 12191, 12195, 0,
- 12159, 12163, 0,
- 2003, 12167, 12171, 12175, 12179, 0,
- 12267, 12271, 0,
- 12239, 12243, 0,
- 12231, 12235, 0,
- 12247, 12251, 0,
- 12275, 12279, 0,
- 12259, 12263, 0,
- 12397, 12401, 12405, 12409, 0,
- 12283, 12287, 12291, 12295, 0,
- 2008, 12199, 12203, 0,
- 12207, 12211, 0,
- 1998, 0,
- 2028, 0,
- 2033, 0,
- 2038, 0,
- 2043, 0,
- 2048, 0,
- 2053, 0,
- 2013, 0,
- 2058, 0,
- 2063, 0,
- 2018, 0,
- 2023, 0,
- 2078, 0,
- 2083, 0,
- 2088, 0,
- 2068, 2073, 0,
- 2103, 0,
- 2108, 0,
- 2113, 0,
- 2118, 0,
- 2093, 0,
- 2098, 0,
- 2138, 0,
- 2143, 0,
- 2123, 2128, 2133, 0,
- 2148, 0,
- 2153, 2163, 0,
- 2158, 0,
- 2168, 0,
- 2173, 0,
- 2178, 2183, 2188, 0,
- 2193, 0,
- 2198, 2208, 0,
- 2203, 0,
- 2213, 2218, 2228, 0,
- 2223, 0,
- 2282, 0,
- 2257, 0,
- 2262, 0,
- 2267, 0,
- 2272, 0,
- 2277, 0,
- 2287, 2292, 2317, 0,
- 2347, 0,
- 2322, 0,
- 2327, 0,
- 2332, 0,
- 2337, 0,
- 2342, 0,
- 2297, 0,
- 2307, 0,
- 2352, 0,
- 2637, 0,
- 2642, 0,
- 2817, 0,
- 2822, 0,
- 2877, 0,
- 2882, 0,
- 3197, 3247, 0,
- 3202, 3252, 0,
- 3327, 0,
- 3332, 0,
- 3417, 0,
- 3422, 0,
- 3597, 3607, 3617, 4150, 0,
- 3602, 3612, 3622, 4155, 0,
- 4160, 0,
- 4165, 0,
- 4170, 0,
- 4175, 0,
- 4180, 0,
- 4185, 0,
- 3637, 3647, 3657, 4190, 0,
- 3642, 3652, 3662, 4195, 0,
- 4200, 0,
- 4205, 0,
- 4210, 0,
- 4215, 0,
- 4220, 0,
- 4225, 0,
- 3677, 3687, 0,
- 3682, 3692, 0,
- 3707, 3717, 0,
- 3712, 3722, 0,
- 3737, 3747, 3757, 4230, 0,
- 3742, 3752, 3762, 4235, 0,
- 4240, 0,
- 4245, 0,
- 4250, 0,
- 4255, 0,
- 4260, 0,
- 4265, 0,
- 3777, 3787, 3797, 4270, 0,
- 3782, 3792, 3802, 4275, 0,
- 4280, 0,
- 4285, 0,
- 4290, 0,
- 4295, 0,
- 4300, 0,
- 4305, 0,
- 3817, 3827, 3837, 0,
- 3822, 3832, 3842, 0,
- 3857, 3867, 3877, 0,
- 3862, 3872, 3882, 0,
- 3897, 3907, 0,
- 3902, 3912, 0,
- 3927, 3937, 0,
- 3932, 3942, 0,
- 3957, 3967, 3977, 0,
- 3962, 3972, 3982, 0,
- 3992, 3997, 4002, 0,
- 4017, 4027, 4037, 4310, 0,
- 4022, 4032, 4042, 4315, 0,
- 4320, 0,
- 4325, 0,
- 4330, 0,
- 4335, 0,
- 4340, 0,
- 4345, 0,
- 4057, 4067, 4077, 4350, 0,
- 4062, 4072, 4082, 4355, 0,
- 4360, 0,
- 4365, 0,
- 4370, 0,
- 4375, 0,
- 4380, 0,
- 4385, 0,
- 4400, 0,
- 4473, 0,
- 4675, 0,
- 4420, 0,
- 4521, 4526, 4531, 0,
- 4493, 0,
- 4695, 0,
- 4584, 4589, 4594, 0,
- 5391, 0,
- 5396, 0,
- 5401, 0,
- 5406, 0,
- 5416, 0,
- 5411, 0,
- 5421, 0,
- 5426, 0,
- 5431, 0,
- 5436, 0,
- 5441, 0,
- 5468, 0,
- 5473, 0,
- 5478, 0,
- 5483, 0,
- 5498, 0,
- 5493, 0,
- 5513, 0,
- 5518, 0,
- 5523, 0,
- 5528, 0,
- 5533, 0,
- 5538, 0,
- 5543, 0,
- 5548, 0,
- 5593, 0,
- 5598, 0,
- 5553, 0,
- 5558, 0,
- 5563, 0,
- 5568, 0,
- 5603, 0,
- 5608, 0,
- 5573, 0,
- 5578, 0,
- 5583, 0,
- 5588, 0,
- 5613, 0,
- 5618, 0,
- 5623, 0,
- 5628, 0,
- 7351, 0,
- 7226, 0,
- 7231, 0,
- 7236, 0,
- 7241, 0,
- 7246, 0,
- 7251, 0,
- 7256, 0,
- 7261, 0,
- 7266, 0,
- 7271, 0,
- 7276, 0,
- 7281, 0,
- 7286, 0,
- 7291, 0,
- 7296, 0,
- 7301, 7306, 0,
- 7311, 7316, 0,
- 7321, 7326, 0,
- 7331, 7336, 0,
- 7341, 7346, 0,
- 7366, 0,
- 7496, 0,
- 7371, 0,
- 7376, 0,
- 7381, 0,
- 7386, 0,
- 7391, 0,
- 7396, 0,
- 7401, 0,
- 7406, 0,
- 7411, 0,
- 7416, 0,
- 7421, 0,
- 7426, 0,
- 7431, 0,
- 7436, 0,
- 7441, 0,
- 7446, 7451, 0,
- 7456, 7461, 0,
- 7466, 7471, 0,
- 7476, 7481, 0,
- 7486, 7491, 0,
- 7501, 0,
- 7506, 0,
- 7511, 0,
- 7516, 0,
- 7521, 0,
- 11668, 11673, 0,
-
-};
-
-static const Q_UINT16 li_00[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 0, 0, 0, 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, 18, 20, 0,
- 0, 22, 39, 43, 49, 56, 74, 76,
- 84, 92, 108, 110, 116, 123, 127, 137,
- 154, 0, 157, 166, 174, 182, 202, 205,
- 212, 215, 225, 0, 0, 0, 0, 0,
- 0, 232, 249, 253, 259, 266, 284, 286,
- 294, 303, 318, 321, 327, 334, 338, 348,
- 365, 0, 368, 377, 385, 394, 414, 417,
- 425, 428, 439, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 446, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 450, 0, 455, 457, 459, 462,
- 0, 0, 464, 0, 0, 0, 0, 469,
- 0, 0, 0, 0, 471, 476, 480, 0,
- 482, 0, 0, 0, 484, 0, 0, 0,
- 0, 0, 489, 0, 494, 496, 498, 501,
- 0, 0, 503, 0, 0, 0, 0, 508,
- 0, 0, 0, 0, 510, 515, 519, 0,
- 521, 0, 0, 0, 523, 0, 0, 0,
-};
-
-static const Q_UINT16 li_01[] = {
- 0, 0, 528, 533, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 538, 541, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 544, 547, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 550, 552, 0, 0, 0, 0,
- 554, 556, 0, 0, 0, 0, 0, 0,
- 558, 560, 562, 564, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 566,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 568, 574, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 580,
- 586, 0, 0, 0, 0, 0, 0, 592,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 594, 596, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 li_02[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 598, 600,
- 602, 604, 0, 0, 0, 0, 606, 608,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 610, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 li_03[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 612, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 614, 0, 0, 0, 622, 0, 627,
- 0, 633, 0, 0, 0, 0, 0, 641,
- 0, 646, 0, 0, 0, 648, 0, 0,
- 0, 655, 0, 0, 661, 0, 663, 0,
- 0, 665, 0, 0, 0, 674, 0, 679,
- 0, 686, 0, 0, 0, 0, 0, 695,
- 0, 700, 0, 0, 0, 703, 0, 0,
- 0, 712, 719, 723, 0, 0, 727, 0,
- 0, 0, 729, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 li_04[] = {
- 0, 0, 0, 0, 0, 0, 732, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 734, 0, 0, 737, 0, 739, 743, 746,
- 748, 0, 753, 0, 0, 0, 755, 0,
- 0, 0, 0, 757, 0, 0, 0, 762,
- 0, 0, 0, 764, 0, 766, 0, 0,
- 768, 0, 0, 771, 0, 773, 777, 780,
- 782, 0, 787, 0, 0, 0, 789, 0,
- 0, 0, 0, 791, 0, 0, 0, 796,
- 0, 0, 0, 798, 0, 800, 0, 0,
- 0, 0, 0, 0, 0, 0, 802, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 804, 806, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 808, 810, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 812, 814, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 li_05[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 816, 820, 823, 825, 827, 829, 832, 0,
- 834, 836, 839, 841, 844, 0, 846, 0,
- 848, 850, 0, 852, 854, 0, 857, 859,
- 861, 863, 867, 0, 0, 0, 0, 0,
- 0, 0, 869, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 li_06[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 871, 873, 876, 879, 882, 885, 926,
- 936, 962, 965, 1003, 1021, 1041, 1057, 1071,
- 1074, 1078, 1083, 1086, 1121, 1158, 1183, 1206,
- 1224, 1232, 1252, 0, 0, 0, 0, 0,
- 1268, 1278, 1298, 1316, 1344, 1386, 1415, 1450,
- 1464, 1469, 1476, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1506, 0, 0, 0, 0, 0, 1509,
- 0, 1511, 1516, 1521, 0, 0, 1526, 1531,
- 1536, 0, 0, 1541, 1546, 0, 1551, 1556,
- 1561, 0, 0, 0, 1564, 1567, 1570, 0,
- 0, 1573, 0, 0, 0, 0, 0, 0,
- 1576, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1579, 0, 1584, 0,
- 0, 1589, 0, 0, 0, 1594, 0, 1599,
- 0, 1604, 0, 1609, 0, 0, 0, 0,
- 0, 0, 1614, 1617, 0, 0, 1622, 0,
- 1627, 1630, 0, 0, 0, 1636, 1639, 1642,
- 1645, 1648, 0, 1651, 1654, 0, 0, 0,
- 1659, 0, 1664, 1668, 0, 1671, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 li_07[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 li_09[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 1673, 1675, 1677,
- 0, 0, 0, 0, 1679, 0, 0, 0,
- 0, 1681, 1683, 0, 0, 0, 0, 0,
- 1685, 0, 0, 1687, 0, 0, 0, 1689,
- 1691, 0, 0, 1693, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1695, 1697, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 1699,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 1701,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 li_0A[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 1704, 1706,
- 0, 0, 0, 0, 1708, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 1710, 0, 0, 0, 0,
- 0, 0, 1712, 0, 0, 0, 0, 0,
- 1714, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 li_0B[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1716, 1718, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 1720,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 1724, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 1726, 1729,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 li_0C[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 1731, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 1733,
- 0, 0, 0, 0, 0, 0, 1735, 0,
- 0, 0, 1739, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 li_0D[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 1741, 1744,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1746, 0, 0, 1750, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 li_0F[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 1752, 0, 1754, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1756, 0, 0, 0,
- 0, 1758, 0, 0, 0, 0, 1760, 0,
- 0, 0, 0, 1762, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 1764, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 1768, 0, 1770, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1772, 0, 0, 0,
- 0, 1774, 0, 0, 0, 0, 1776, 0,
- 0, 0, 0, 1778, 0, 0, 0, 0,
- 0, 0, 1780, 1782, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 li_10[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 1784, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 li_1E[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 1786, 1788,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 1790, 1792, 0, 0, 0, 0,
- 0, 0, 1794, 1796, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 1798, 1801, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 1804, 1806, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 1808, 1810, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 li_1F[] = {
- 1812, 1817, 1822, 1824, 1826, 1828, 1830, 1832,
- 1834, 1839, 1844, 1846, 1848, 1850, 1852, 1854,
- 1856, 1859, 0, 0, 0, 0, 0, 0,
- 1862, 1865, 0, 0, 0, 0, 0, 0,
- 1868, 1873, 1878, 1880, 1882, 1884, 1886, 1888,
- 1890, 1895, 1900, 1902, 1904, 1906, 1908, 1910,
- 1912, 1916, 0, 0, 0, 0, 0, 0,
- 1920, 1924, 0, 0, 0, 0, 0, 0,
- 1928, 1931, 0, 0, 0, 0, 0, 0,
- 1934, 1937, 0, 0, 0, 0, 0, 0,
- 1940, 1944, 0, 0, 0, 0, 0, 0,
- 0, 1948, 0, 0, 0, 0, 0, 0,
- 1952, 1957, 1962, 1964, 1966, 1968, 1970, 1972,
- 1974, 1979, 1984, 1986, 1988, 1990, 1992, 1994,
- 1996, 0, 0, 0, 1998, 0, 0, 0,
- 0, 0, 0, 0, 2000, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 2002, 0,
- 0, 0, 0, 0, 0, 0, 0, 2004,
- 0, 0, 0, 0, 0, 0, 2008, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 2010, 0,
- 0, 0, 0, 0, 0, 0, 2012, 0,
-};
-
-static const Q_UINT16 li_21[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 2016, 0, 2018, 0, 2020, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 2022, 0, 2024, 0, 2026, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 li_22[] = {
- 0, 0, 0, 2028, 0, 0, 0, 0,
- 2030, 0, 0, 2032, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 2034, 0, 2036, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 2038, 0, 0, 0,
- 0, 0, 0, 2040, 0, 2042, 0, 0,
- 2044, 0, 0, 0, 0, 2046, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 2048, 0, 0, 2050, 2052, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 2054, 2056, 0, 0, 2058, 2060,
- 0, 0, 2062, 2064, 2066, 2068, 0, 0,
- 0, 0, 2070, 2072, 0, 0, 2074, 2076,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 2078, 2080, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 2082, 0, 0, 0, 0, 0,
- 2084, 2086, 0, 2088, 0, 0, 0, 0,
- 0, 0, 2090, 2092, 2094, 2096, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 li_30[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 2098, 0,
- 0, 0, 0, 2100, 0, 2102, 0, 2104,
- 0, 2106, 0, 2108, 0, 2110, 0, 2112,
- 0, 2114, 0, 2116, 0, 2118, 0, 2120,
- 0, 2122, 0, 0, 2124, 0, 2126, 0,
- 2128, 0, 0, 0, 0, 0, 0, 2130,
- 0, 0, 2133, 0, 0, 2136, 0, 0,
- 2139, 0, 0, 2142, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 2145, 0, 0,
- 0, 0, 0, 0, 0, 0, 2147, 0,
- 0, 0, 0, 2149, 0, 2151, 0, 2153,
- 0, 2155, 0, 2157, 0, 2159, 0, 2161,
- 0, 2163, 0, 2165, 0, 2167, 0, 2169,
- 0, 2171, 0, 0, 2173, 0, 2175, 0,
- 2177, 0, 0, 0, 0, 0, 0, 2179,
- 0, 0, 2182, 0, 0, 2185, 0, 0,
- 2188, 0, 0, 2191, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 2194,
- 2196, 2198, 2200, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 2202, 0, 0,
-};
-
-static const Q_UINT16 li_FB[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 2204, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 * const ligature_info[256] = {
- li_00, li_01, li_02, li_03, li_04, li_05, li_06, li_07,
- li_07, li_09, li_0A, li_0B, li_0C, li_0D, li_07, li_0F,
- li_10, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
- li_07, li_07, li_07, li_07, li_07, li_07, li_1E, li_1F,
- li_07, li_21, li_22, li_07, li_07, li_07, li_07, li_07,
- li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
- li_30, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
- li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
- li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
- li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
- li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
- li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
- li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
- li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
- li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
- li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
- li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
- li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
- li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
- li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
- li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
- li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
- li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
- li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
- li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
- li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
- li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
- li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
- li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
- li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
- li_07, li_07, li_07, li_07, li_07, li_07, li_07, li_07,
- li_07, li_07, li_07, li_FB, li_07, li_07, li_07, li_07,
-};
-// 16188 bytes
-
-static const Q_UINT8 dir_00[] = {
- 18, 18, 18, 18, 18, 18, 18, 18,
- 18, 8, 7, 8, 9, 7, 18, 18,
- 18, 18, 18, 18, 18, 18, 18, 18,
- 18, 18, 18, 18, 7, 7, 7, 8,
- 9, 10, 10, 4, 4, 4, 10, 10,
- 138, 138, 10, 4, 6, 4, 6, 3,
- 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 6, 10, 138, 10, 138, 10,
- 10, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 138, 10, 138, 10, 10,
- 10, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 138, 10, 138, 10, 18,
- 18, 18, 18, 18, 18, 7, 18, 18,
- 18, 18, 18, 18, 18, 18, 18, 18,
- 18, 18, 18, 18, 18, 18, 18, 18,
- 18, 18, 18, 18, 18, 18, 18, 18,
- 6, 10, 4, 4, 4, 4, 10, 10,
- 10, 10, 0, 138, 10, 10, 10, 10,
- 4, 4, 2, 2, 10, 0, 10, 10,
- 10, 2, 0, 138, 10, 10, 10, 10,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 10,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 10,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_01[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_02[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 10, 10, 0, 0, 0, 0, 0,
- 0, 0, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 0, 0, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 0, 0, 0, 0, 0, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_03[] = {
- 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 17, 17, 17, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 10, 10, 0, 0,
- 0, 0, 0, 0, 0, 0, 10, 0,
- 0, 0, 0, 0, 10, 10, 0, 10,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_04[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 17, 17, 17, 17, 0,
- 17, 17, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_05[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 10, 0, 0, 0, 0, 0,
- 0, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 0, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 0, 17, 17, 17, 1, 17,
- 1, 17, 17, 1, 17, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 0, 0, 0, 0, 0,
- 1, 1, 1, 1, 1, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_06[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 6, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 13, 0, 0, 0, 13,
- 0, 13, 77, 77, 77, 77, 45, 77,
- 45, 77, 45, 45, 45, 45, 45, 77,
- 77, 77, 77, 45, 45, 45, 45, 45,
- 45, 45, 45, 0, 0, 0, 0, 0,
- 109, 45, 45, 45, 45, 45, 45, 45,
- 77, 77, 45, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 5, 5, 5, 5, 5, 5, 5, 5,
- 5, 5, 4, 5, 5, 13, 0, 0,
- 17, 13, 77, 77, 13, 77, 77, 77,
- 45, 45, 45, 45, 45, 45, 45, 45,
- 45, 45, 45, 45, 45, 45, 45, 45,
- 77, 77, 77, 77, 77, 77, 77, 77,
- 77, 77, 77, 77, 77, 77, 77, 77,
- 77, 77, 45, 45, 45, 45, 45, 45,
- 45, 45, 45, 45, 45, 45, 45, 45,
- 45, 45, 45, 45, 45, 45, 45, 45,
- 45, 45, 45, 45, 45, 45, 45, 45,
- 45, 45, 45, 45, 45, 45, 45, 45,
- 77, 45, 77, 77, 77, 77, 77, 77,
- 77, 77, 77, 77, 45, 77, 45, 77,
- 45, 45, 77, 77, 13, 13, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 13, 13, 17,
- 17, 10, 17, 17, 17, 17, 0, 0,
- 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 45, 45, 45, 13, 13, 0,
-};
-
-static const Q_UINT8 dir_07[] = {
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 0, 18,
- 77, 17, 45, 45, 45, 77, 77, 77,
- 77, 77, 45, 45, 45, 45, 77, 45,
- 45, 45, 45, 45, 45, 45, 45, 45,
- 77, 45, 77, 45, 77, 0, 0, 0,
- 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_09[] = {
- 0, 17, 17, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 17, 17, 17, 17, 17, 17, 17,
- 17, 0, 0, 0, 0, 17, 0, 0,
- 0, 17, 17, 17, 17, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 17, 17, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 17, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 17, 17, 17, 17, 0, 0, 0,
- 0, 0, 0, 0, 0, 17, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 17, 17, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 4, 4, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_0A[] = {
- 0, 0, 17, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 17, 17, 0, 0, 0, 0, 17,
- 17, 0, 0, 17, 17, 17, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 17, 17, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 17, 17, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 0,
- 0, 17, 17, 17, 17, 17, 0, 17,
- 17, 0, 0, 0, 0, 17, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_0B[] = {
- 0, 17, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 17, 0, 0, 17,
- 0, 17, 17, 17, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 17, 0, 0,
- 0, 0, 0, 0, 0, 0, 17, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 17, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 17, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 17, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_0C[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 17, 17,
- 17, 0, 0, 0, 0, 0, 17, 17,
- 17, 0, 17, 17, 17, 17, 0, 0,
- 0, 0, 0, 0, 0, 17, 17, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 17,
- 0, 0, 0, 0, 0, 0, 17, 0,
- 0, 0, 0, 0, 17, 17, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_0D[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 17, 17, 17, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 17, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 17, 0, 0, 0, 0, 0,
- 0, 0, 17, 17, 17, 0, 17, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_0E[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 17, 0, 0, 17, 17, 17, 17,
- 17, 17, 17, 0, 0, 0, 0, 4,
- 0, 0, 0, 0, 0, 0, 0, 17,
- 17, 17, 17, 17, 17, 17, 17, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 17, 0, 0, 17, 17, 17, 17,
- 17, 17, 0, 17, 17, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 17, 17, 17, 17, 17, 17, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_0F[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 17, 17, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 17, 0, 17,
- 0, 17, 10, 10, 10, 10, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 0,
- 17, 17, 17, 17, 17, 0, 17, 17,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 17, 17, 17, 17, 17, 17, 17, 17,
- 0, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 17, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_10[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 17, 17, 17,
- 17, 0, 17, 0, 0, 0, 17, 17,
- 0, 17, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 17, 17, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_16[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 9, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 10, 10, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_17[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 17,
- 17, 17, 17, 17, 17, 17, 0, 0,
- 0, 0, 0, 0, 0, 0, 17, 0,
- 0, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 0, 0, 0, 0,
- 0, 0, 0, 4, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_18[] = {
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 18, 18, 18, 18, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 17, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_1F[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 10, 0, 10,
- 10, 10, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 10, 10, 10,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 10, 10, 10,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 10, 10, 10,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 10, 10, 0,
-};
-
-static const Q_UINT8 dir_20[] = {
- 9, 9, 9, 9, 9, 9, 9, 9,
- 9, 9, 9, 18, 18, 18, 0, 1,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 9, 7, 11, 14, 16, 12, 15, 9,
- 4, 4, 4, 4, 4, 10, 10, 10,
- 10, 138, 138, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 138, 138, 0,
- 10, 10, 10, 10, 10, 10, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 18, 18, 18, 18, 18, 18,
- 2, 0, 0, 0, 2, 2, 2, 2,
- 2, 2, 4, 4, 10, 138, 138, 0,
- 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 4, 4, 10, 138, 138, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 4, 4, 4, 4, 4, 4, 4, 4,
- 4, 4, 4, 4, 4, 4, 4, 4,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 17, 17, 17, 17,
- 17, 17, 17, 17, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_21[] = {
- 10, 10, 0, 10, 10, 10, 10, 0,
- 10, 10, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 10, 0, 10, 10,
- 10, 0, 0, 0, 0, 0, 10, 10,
- 10, 10, 10, 10, 0, 10, 0, 10,
- 0, 10, 0, 0, 0, 0, 4, 0,
- 0, 0, 10, 0, 0, 0, 0, 0,
- 0, 0, 10, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_22[] = {
- 10, 138, 138, 138, 138, 10, 10, 10,
- 138, 138, 138, 138, 138, 138, 10, 10,
- 10, 138, 4, 4, 10, 138, 138, 10,
- 10, 10, 138, 138, 138, 138, 10, 138,
- 138, 138, 138, 10, 138, 10, 138, 10,
- 10, 10, 10, 138, 138, 138, 138, 138,
- 138, 138, 138, 138, 10, 10, 10, 10,
- 10, 138, 10, 138, 138, 138, 138, 138,
- 138, 138, 138, 138, 138, 138, 138, 138,
- 138, 138, 138, 138, 138, 10, 10, 10,
- 10, 10, 138, 138, 138, 138, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 138,
- 138, 10, 138, 10, 138, 138, 138, 138,
- 138, 138, 138, 138, 10, 10, 138, 138,
- 138, 138, 138, 138, 138, 138, 138, 138,
- 138, 138, 138, 138, 138, 138, 138, 138,
- 138, 138, 138, 138, 138, 138, 138, 138,
- 138, 138, 138, 138, 138, 10, 10, 138,
- 138, 138, 138, 10, 10, 10, 10, 10,
- 138, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 138, 138, 10, 10, 138, 138,
- 138, 138, 138, 138, 138, 138, 138, 138,
- 138, 138, 138, 138, 138, 138, 138, 138,
- 138, 10, 10, 10, 10, 10, 138, 138,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 138, 138, 138, 138, 138, 10, 10,
- 138, 138, 10, 10, 10, 10, 138, 138,
- 138, 138, 138, 138, 138, 138, 138, 138,
- 138, 138, 138, 138, 138, 138, 138, 138,
- 138, 138, 138, 138, 138, 138, 10, 10,
- 138, 138, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_23[] = {
- 10, 10, 10, 10, 10, 10, 10, 10,
- 138, 138, 138, 138, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 138, 138, 10, 10, 10, 10, 10, 10,
- 10, 138, 138, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 10, 0, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 0, 10, 10,
- 10, 10, 10, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_24[] = {
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 2, 2, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 2, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_25[] = {
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_26[] = {
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 0, 0, 0, 0,
- 0, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_27[] = {
- 0, 10, 10, 10, 10, 0, 10, 10,
- 10, 10, 0, 0, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 0, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 0, 10, 0, 10,
- 10, 10, 10, 0, 0, 0, 10, 0,
- 10, 10, 10, 10, 10, 10, 10, 0,
- 0, 10, 10, 10, 10, 10, 10, 10,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 0, 0, 0,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 0, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_28[] = {
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
-};
-
-static const Q_UINT8 dir_2E[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 0, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_2F[] = {
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_30[] = {
- 9, 10, 10, 10, 10, 0, 0, 0,
- 138, 138, 138, 138, 138, 138, 138, 138,
- 138, 138, 10, 10, 138, 138, 138, 138,
- 138, 138, 138, 138, 10, 10, 10, 10,
- 10, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 17, 17, 17, 17, 17, 17,
- 10, 0, 0, 0, 0, 0, 10, 10,
- 0, 0, 0, 0, 0, 0, 10, 10,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 17, 17, 10, 10, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 10, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_A4[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 0, 0, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 0, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 0, 10, 10, 10, 0, 10, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_FB[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 1, 17, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 1, 4, 1, 1, 1, 1, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 0,
- 1, 1, 1, 1, 1, 0, 1, 0,
- 1, 1, 0, 1, 1, 0, 1, 1,
- 1, 1, 1, 1, 1, 1, 1, 1,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
-};
-
-static const Q_UINT8 dir_FC[] = {
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
-};
-
-static const Q_UINT8 dir_FD[] = {
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 10, 10,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 0, 0, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 0, 0, 0, 0,
-};
-
-static const Q_UINT8 dir_FE[] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 17, 17, 17, 17, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 10,
- 10, 10, 10, 10, 10, 0, 0, 0,
- 0, 10, 10, 10, 10, 10, 10, 10,
- 6, 10, 6, 0, 10, 6, 10, 10,
- 10, 10, 10, 10, 10, 10, 10, 4,
- 10, 10, 4, 4, 10, 10, 10, 0,
- 10, 4, 4, 10, 0, 0, 0, 0,
- 13, 13, 13, 0, 13, 0, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 13, 13, 13,
- 13, 13, 13, 13, 13, 0, 0, 18,
-};
-
-static const Q_UINT8 dir_FF[] = {
- 0, 10, 10, 4, 4, 4, 10, 10,
- 10, 10, 10, 4, 6, 4, 6, 3,
- 2, 2, 2, 2, 2, 2, 2, 2,
- 2, 2, 6, 10, 10, 10, 10, 10,
- 10, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 10, 10, 10, 10, 10,
- 10, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 10, 10, 10, 10, 0,
- 0, 10, 10, 10, 10, 10, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 4, 4, 10, 10, 10, 4, 4, 0,
- 10, 10, 10, 10, 10, 10, 10, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 18, 18, 18, 10, 10, 0, 0,
-};
-
-static const Q_UINT8 * const direction_info[256] = {
- dir_00, dir_01, dir_02, dir_03, dir_04, dir_05, dir_06, dir_07,
- dir_01, dir_09, dir_0A, dir_0B, dir_0C, dir_0D, dir_0E, dir_0F,
- dir_10, dir_01, dir_01, dir_01, dir_01, dir_01, dir_16, dir_17,
- dir_18, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_1F,
- dir_20, dir_21, dir_22, dir_23, dir_24, dir_25, dir_26, dir_27,
- dir_28, dir_01, dir_01, dir_01, dir_01, dir_01, dir_2E, dir_2F,
- dir_30, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
- dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
- dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
- dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
- dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
- dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
- dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
- dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
- dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
- dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
- dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
- dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
- dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
- dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
- dir_01, dir_01, dir_01, dir_01, dir_A4, dir_01, dir_01, dir_01,
- dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
- dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
- dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
- dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
- dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
- dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
- dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
- dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
- dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
- dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01, dir_01,
- dir_01, dir_01, dir_01, dir_FB, dir_FC, dir_FD, dir_FE, dir_FF,
-};
-// 26940 bytes
-
-#endif
-
-// END OF GENERATED DATA
-
-// This is generated too. Script?
-
-#ifndef QT_NO_UNICODETABLES
-
-static const Q_UINT16 case_0 [] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67,
- 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,
- 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77,
- 0x78, 0x79, 0x7a, 0, 0, 0, 0, 0,
- 0, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47,
- 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,
- 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,
- 0x58, 0x59, 0x5a, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0x0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0x0, 0, 0,
- 0, 0, 0x0, 0, 0, 0, 0, 0,
- 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7,
- 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef,
- 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0,
- 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0x0,
- 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7,
- 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf,
- 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0,
- 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0x178,
-};
-
-static const Q_UINT16 case_1 [] = {
- 0x101, 0x100, 0x103, 0x102, 0x105, 0x104, 0x107, 0x106,
- 0x109, 0x108, 0x10b, 0x10a, 0x10d, 0x10c, 0x10f, 0x10e,
- 0x111, 0x110, 0x113, 0x112, 0x115, 0x114, 0x117, 0x116,
- 0x119, 0x118, 0x11b, 0x11a, 0x11d, 0x11c, 0x11f, 0x11e,
- 0x121, 0x120, 0x123, 0x122, 0x125, 0x124, 0x127, 0x126,
- 0x129, 0x128, 0x12b, 0x12a, 0x12d, 0x12c, 0x12f, 0x12e,
- 0x69, 0x49, 0x133, 0x132, 0x135, 0x134, 0x137, 0x136,
- 0x0, 0x13a, 0x139, 0x13c, 0x13b, 0x13e, 0x13d, 0x140,
- 0x13f, 0x142, 0x141, 0x144, 0x143, 0x146, 0x145, 0x148,
- 0x147, 0x0, 0x14b, 0x14a, 0x14d, 0x14c, 0x14f, 0x14e,
- 0x151, 0x150, 0x153, 0x152, 0x155, 0x154, 0x157, 0x156,
- 0x159, 0x158, 0x15b, 0x15a, 0x15d, 0x15c, 0x15f, 0x15e,
- 0x161, 0x160, 0x163, 0x162, 0x165, 0x164, 0x167, 0x166,
- 0x169, 0x168, 0x16b, 0x16a, 0x16d, 0x16c, 0x16f, 0x16e,
- 0x171, 0x170, 0x173, 0x172, 0x175, 0x174, 0x177, 0x176,
- 0xff, 0x17a, 0x179, 0x17c, 0x17b, 0x17e, 0x17d, 0x53,
- 0x0, 0x253, 0x183, 0x182, 0x185, 0x184, 0x254, 0x188,
- 0x187, 0x256, 0x257, 0x18c, 0x18b, 0x0, 0x1dd, 0x259,
- 0x25b, 0x192, 0x191, 0x260, 0x263, 0x3d9, 0x269, 0x268,
- 0x199, 0x198, 0x51, 0x0, 0x26f, 0x272, 0x0, 0x275,
- 0x1a1, 0x1a0, 0x1a3, 0x1a2, 0x1a5, 0x1a4, 0x280, 0x1a8,
- 0x1a7, 0x283, 0, 0x0, 0x1ad, 0x1ac, 0x288, 0x1b0,
- 0x1af, 0x28a, 0x28b, 0x1b4, 0x1b3, 0x1b6, 0x1b5, 0x292,
- 0x1b9, 0x1b8, 0x0, 0, 0x1bd, 0x1bc, 0, 0,
- 0, 0, 0, 0, 0x1c6, 0, 0x1c4, 0x1c9,
- 0, 0x1c7, 0x1cc, 0, 0x1ca, 0x1ce, 0x1cd, 0x1d0,
- 0x1cf, 0x1d2, 0x1d1, 0x1d4, 0x1d3, 0x1d6, 0x1d5, 0x1d8,
- 0x1d7, 0x1da, 0x1d9, 0x1dc, 0x1db, 0x18e, 0x1df, 0x1de,
- 0x1e1, 0x1e0, 0x1e3, 0x1e2, 0x1e5, 0x1e4, 0x1e7, 0x1e6,
- 0x1e9, 0x1e8, 0x1eb, 0x1ea, 0x1ed, 0x1ec, 0x1ef, 0x1ee,
- 0x0, 0x1f3, 0, 0x1f1, 0x1f5, 0x1f4, 0, 0,
- 0, 0, 0x1fb, 0x1fa, 0x1fd, 0x1fc, 0x1ff, 0x1fe,
-};
-
-static const Q_UINT16 case_2 [] = {
- 0x201, 0x200, 0x203, 0x202, 0x205, 0x204, 0x207, 0x206,
- 0x209, 0x208, 0x20b, 0x20a, 0x20d, 0x20c, 0x20f, 0x20e,
- 0x211, 0x210, 0x213, 0x212, 0x215, 0x214, 0x217, 0x216,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0x0, 0x0, 0x0, 0x181, 0x186, 0x0, 0x189, 0x18a,
- 0x0, 0x18f, 0x0, 0x190, 0x0, 0x0, 0x0, 0x0,
- 0x193, 0x0, 0x0, 0x194, 0x0, 0x0, 0x631, 0x579,
- 0x197, 0x196, 0x0, 0x0, 0x0, 0x0, 0x0, 0x19c,
- 0x0, 0x0, 0x19d, 0x0, 0x0, 0x19f, 0x0, 0x0,
- 0x0, 0x0, 0x7e1, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x1a6, 0x0, 0x0, 0x1a9, 0x0, 0x0, 0x0, 0x0,
- 0x1ae, 0x0, 0x1b1, 0x1b2, 0x0, 0xa21, 0x971, 0x0,
- 0x0, 0x0, 0x1b7, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 case_3 [] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0x3ac, 0,
- 0x3ad, 0x3ae, 0x3af, 0, 0x3cc, 0, 0x3cd, 0x3ce,
- 0x0, 0x3b1, 0x3b2, 0x3b3, 0x3b4, 0x3b5, 0x3b6, 0x3b7,
- 0x3b8, 0x3b9, 0x3ba, 0x3bb, 0x3bc, 0x3bd, 0x3be, 0x3bf,
- 0x3c0, 0x3c1, 0, 0x3c3, 0x3c4, 0x3c5, 0x3c6, 0x3c7,
- 0x3c8, 0x3c9, 0x3ca, 0x3cb, 0x386, 0x388, 0x389, 0x38a,
- 0x0, 0x391, 0x392, 0x393, 0x394, 0x395, 0x396, 0x397,
- 0x398, 0x399, 0x39a, 0x39b, 0x39c, 0x39d, 0x39e, 0x39f,
- 0x3a0, 0x3a1, 0x3a3, 0x3a3, 0x3a4, 0x3a5, 0x3a6, 0x3a7,
- 0x3a8, 0x3a9, 0x3aa, 0x3ab, 0x38c, 0x38e, 0x38f, 0,
- 0x392, 0x398, 0x0, 0x0, 0x0, 0x3a6, 0x3a0, 0,
- 0, 0, 0x0, 0, 0x0, 0, 0x0, 0,
- 0x0, 0, 0x3e3, 0x3e2, 0x3e5, 0x3e4, 0x3e7, 0x3e6,
- 0x3e9, 0x3e8, 0x3eb, 0x3ea, 0x3ed, 0x3ec, 0x3ef, 0x3ee,
- 0x39a, 0x3a1, 0x3a3, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 case_4 [] = {
- 0, 0x451, 0x452, 0x453, 0x454, 0x455, 0x456, 0x457,
- 0x458, 0x459, 0x45a, 0x45b, 0x45c, 0, 0x45e, 0x45f,
- 0x430, 0x431, 0x432, 0x433, 0x434, 0x435, 0x436, 0x437,
- 0x438, 0x439, 0x43a, 0x43b, 0x43c, 0x43d, 0x43e, 0x43f,
- 0x440, 0x441, 0x442, 0x443, 0x444, 0x445, 0x446, 0x447,
- 0x448, 0x449, 0x44a, 0x44b, 0x44c, 0x44d, 0x44e, 0x44f,
- 0x410, 0x411, 0x412, 0x413, 0x414, 0x415, 0x416, 0x417,
- 0x418, 0x419, 0x41a, 0x41b, 0x41c, 0x41d, 0x41e, 0x41f,
- 0x420, 0x421, 0x422, 0x423, 0x424, 0x425, 0x426, 0x427,
- 0x428, 0x429, 0x42a, 0x42b, 0x42c, 0x42d, 0x42e, 0x42f,
- 0, 0x401, 0x402, 0x403, 0x404, 0x405, 0x406, 0x407,
- 0x408, 0x409, 0x40a, 0x40b, 0x40c, 0, 0x40e, 0x40f,
- 0x461, 0x460, 0x463, 0x462, 0x465, 0x464, 0x467, 0x466,
- 0x469, 0x468, 0x46b, 0x46a, 0x46d, 0x46c, 0x46f, 0x46e,
- 0x471, 0x470, 0x473, 0x472, 0x475, 0x474, 0x477, 0x476,
- 0x479, 0x478, 0x47b, 0x47a, 0x47d, 0x47c, 0x47f, 0x47e,
- 0x481, 0x480, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0x491, 0x490, 0x493, 0x492, 0x495, 0x494, 0x497, 0x496,
- 0x499, 0x498, 0x49b, 0x49a, 0x49d, 0x49c, 0x49f, 0x49e,
- 0x4a1, 0x4a0, 0x4a3, 0x4a2, 0x4a5, 0x4a4, 0x4a7, 0x4a6,
- 0x4a9, 0x4a8, 0x4ab, 0x4aa, 0x4ad, 0x4ac, 0x4af, 0x4ae,
- 0x4b1, 0x4b0, 0x4b3, 0x4b2, 0x4b5, 0x4b4, 0x4b7, 0x4b6,
- 0x4b9, 0x4b8, 0x4bb, 0x4ba, 0x4bd, 0x4bc, 0x4bf, 0x4be,
- 0, 0x4c2, 0x4c1, 0x4c4, 0x4c3, 0, 0, 0x4c8,
- 0x4c7, 0, 0, 0x4cc, 0x4cb, 0, 0, 0,
- 0x4d1, 0x4d0, 0x4d3, 0x4d2, 0x4d5, 0x4d4, 0x4d7, 0x4d6,
- 0x4d9, 0x4d8, 0x4db, 0x4da, 0x4dd, 0x4dc, 0x4df, 0x4de,
- 0x4e1, 0x4e0, 0x4e3, 0x4e2, 0x4e5, 0x4e4, 0x4e7, 0x4e6,
- 0x4e9, 0x4e8, 0x4eb, 0x4ea, 0, 0, 0x4ef, 0x4ee,
- 0x4f1, 0x4f0, 0x4f3, 0x4f2, 0x4f5, 0x4f4, 0, 0,
- 0x4f9, 0x4f8, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 case_5 [] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0x561, 0x562, 0x563, 0x564, 0x565, 0x566, 0x567,
- 0x568, 0x569, 0x56a, 0x56b, 0x56c, 0x56d, 0x56e, 0x56f,
- 0x570, 0x571, 0x572, 0x573, 0x574, 0x575, 0x576, 0x577,
- 0x578, 0x579, 0x57a, 0x57b, 0x57c, 0x57d, 0x57e, 0x57f,
- 0x580, 0x581, 0x582, 0x583, 0x584, 0x585, 0x586, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0x531, 0x532, 0x533, 0x534, 0x535, 0x536, 0x537,
- 0x538, 0x539, 0x53a, 0x53b, 0x53c, 0x53d, 0x53e, 0x53f,
- 0x540, 0x541, 0x542, 0x543, 0x544, 0x545, 0x546, 0x547,
- 0x548, 0x549, 0x54a, 0x54b, 0x54c, 0x54d, 0x54e, 0x54f,
- 0x550, 0x551, 0x552, 0x553, 0x554, 0x555, 0x556, 0x0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 case_10 [] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0x10d0, 0x10d1, 0x10d2, 0x10d3, 0x10d4, 0x10d5, 0x10d6, 0x10d7,
- 0x10d8, 0x10d9, 0x10da, 0x10db, 0x10dc, 0x10dd, 0x10de, 0x10df,
- 0x10e0, 0x10e1, 0x10e2, 0x10e3, 0x10e4, 0x10e5, 0x10e6, 0x10e7,
- 0x10e8, 0x10e9, 0x10ea, 0x10eb, 0x10ec, 0x10ed, 0x10ee, 0x10ef,
- 0x10f0, 0x10f1, 0x10f2, 0x10f3, 0x10f4, 0x10f5, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 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, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 case_1e [] = {
- 0x1e01, 0x1e00, 0x1e03, 0x1e02, 0x1e05, 0x1e04, 0x1e07, 0x1e06,
- 0x1e09, 0x1e08, 0x1e0b, 0x1e0a, 0x1e0d, 0x1e0c, 0x1e0f, 0x1e0e,
- 0x1e11, 0x1e10, 0x1e13, 0x1e12, 0x1e15, 0x1e14, 0x1e17, 0x1e16,
- 0x1e19, 0x1e18, 0x1e1b, 0x1e1a, 0x1e1d, 0x1e1c, 0x1e1f, 0x1e1e,
- 0x1e21, 0x1e20, 0x1e23, 0x1e22, 0x1e25, 0x1e24, 0x1e27, 0x1e26,
- 0x1e29, 0x1e28, 0x1e2b, 0x1e2a, 0x1e2d, 0x1e2c, 0x1e2f, 0x1e2e,
- 0x1e31, 0x1e30, 0x1e33, 0x1e32, 0x1e35, 0x1e34, 0x1e37, 0x1e36,
- 0x1e39, 0x1e38, 0x1e3b, 0x1e3a, 0x1e3d, 0x1e3c, 0x1e3f, 0x1e3e,
- 0x1e41, 0x1e40, 0x1e43, 0x1e42, 0x1e45, 0x1e44, 0x1e47, 0x1e46,
- 0x1e49, 0x1e48, 0x1e4b, 0x1e4a, 0x1e4d, 0x1e4c, 0x1e4f, 0x1e4e,
- 0x1e51, 0x1e50, 0x1e53, 0x1e52, 0x1e55, 0x1e54, 0x1e57, 0x1e56,
- 0x1e59, 0x1e58, 0x1e5b, 0x1e5a, 0x1e5d, 0x1e5c, 0x1e5f, 0x1e5e,
- 0x1e61, 0x1e60, 0x1e63, 0x1e62, 0x1e65, 0x1e64, 0x1e67, 0x1e66,
- 0x1e69, 0x1e68, 0x1e6b, 0x1e6a, 0x1e6d, 0x1e6c, 0x1e6f, 0x1e6e,
- 0x1e71, 0x1e70, 0x1e73, 0x1e72, 0x1e75, 0x1e74, 0x1e77, 0x1e76,
- 0x1e79, 0x1e78, 0x1e7b, 0x1e7a, 0x1e7d, 0x1e7c, 0x1e7f, 0x1e7e,
- 0x1e81, 0x1e80, 0x1e83, 0x1e82, 0x1e85, 0x1e84, 0x1e87, 0x1e86,
- 0x1e89, 0x1e88, 0x1e8b, 0x1e8a, 0x1e8d, 0x1e8c, 0x1e8f, 0x1e8e,
- 0x1e91, 0x1e90, 0x1e93, 0x1e92, 0x1e95, 0x1e94, 0x0, 0x0,
- 0x0, 0x0, 0x0, 0x1e60, 0, 0, 0, 0,
- 0x1ea1, 0x1ea0, 0x1ea3, 0x1ea2, 0x1ea5, 0x1ea4, 0x1ea7, 0x1ea6,
- 0x1ea9, 0x1ea8, 0x1eab, 0x1eaa, 0x1ead, 0x1eac, 0x1eaf, 0x1eae,
- 0x1eb1, 0x1eb0, 0x1eb3, 0x1eb2, 0x1eb5, 0x1eb4, 0x1eb7, 0x1eb6,
- 0x1eb9, 0x1eb8, 0x1ebb, 0x1eba, 0x1ebd, 0x1ebc, 0x1ebf, 0x1ebe,
- 0x1ec1, 0x1ec0, 0x1ec3, 0x1ec2, 0x1ec5, 0x1ec4, 0x1ec7, 0x1ec6,
- 0x1ec9, 0x1ec8, 0x1ecb, 0x1eca, 0x1ecd, 0x1ecc, 0x1ecf, 0x1ece,
- 0x1ed1, 0x1ed0, 0x1ed3, 0x1ed2, 0x1ed5, 0x1ed4, 0x1ed7, 0x1ed6,
- 0x1ed9, 0x1ed8, 0x1edb, 0x1eda, 0x1edd, 0x1edc, 0x1edf, 0x1ede,
- 0x1ee1, 0x1ee0, 0x1ee3, 0x1ee2, 0x1ee5, 0x1ee4, 0x1ee7, 0x1ee6,
- 0x1ee9, 0x1ee8, 0x1eeb, 0x1eea, 0x1eed, 0x1eec, 0x1eef, 0x1eee,
- 0x1ef1, 0x1ef0, 0x1ef3, 0x1ef2, 0x1ef5, 0x1ef4, 0x1ef7, 0x1ef6,
- 0x1ef9, 0x1ef8, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 case_1f [] = {
- 0x1f08, 0x1f09, 0x1f0a, 0x1f0b, 0x1f0c, 0x1f0d, 0x1f0e, 0x1f0f,
- 0x1f00, 0x1f01, 0x1f02, 0x1f03, 0x1f04, 0x1f05, 0x1f06, 0x1f07,
- 0x1f18, 0x1f19, 0x1f1a, 0x1f1b, 0x1f1c, 0x1f1d, 0, 0,
- 0x1f10, 0x1f11, 0x1f12, 0x1f13, 0x1f14, 0x1f15, 0, 0,
- 0x1f28, 0x1f29, 0x1f2a, 0x1f2b, 0x1f2c, 0x1f2d, 0x1f2e, 0x1f2f,
- 0x1f20, 0x1f21, 0x1f22, 0x1f23, 0x1f24, 0x1f25, 0x1f26, 0x1f27,
- 0x1f38, 0x1f39, 0x1f3a, 0x1f3b, 0x1f3c, 0x1f3d, 0x1f3e, 0x1f3f,
- 0x1f30, 0x1f31, 0x1f32, 0x1f33, 0x1f34, 0x1f35, 0x1f36, 0x1f37,
- 0x1f48, 0x1f49, 0x1f4a, 0x1f4b, 0x1f4c, 0x1f4d, 0, 0,
- 0x1f40, 0x1f41, 0x1f42, 0x1f43, 0x1f44, 0x1f45, 0, 0,
- 0x0, 0x1f59, 0x0, 0x1f5b, 0x0, 0x1f5d, 0x0, 0x1f5f,
- 0, 0x1f51, 0, 0x1f53, 0, 0x1f55, 0, 0x1f57,
- 0x1f68, 0x1f69, 0x1f6a, 0x1f6b, 0x1f6c, 0x1f6d, 0x1f6e, 0x1f6f,
- 0x1f60, 0x1f61, 0x1f62, 0x1f63, 0x1f64, 0x1f65, 0x1f66, 0x1f67,
- 0x1fba, 0x1fbb, 0x1fc8, 0x1fc9, 0x1fca, 0x1fcb, 0x1fda, 0x1fdb,
- 0x1ff8, 0x1ff9, 0x1fea, 0x1feb, 0x1ffa, 0x1ffb, 0, 0,
- 0x1f88, 0x1f89, 0x1f8a, 0x1f8b, 0x1f8c, 0x1f8d, 0x1f8e, 0x1f8f,
- 0x1f80, 0x1f81, 0x1f82, 0x1f83, 0x1f84, 0x1f85, 0x1f86, 0x1f87,
- 0x1f98, 0x1f99, 0x1f9a, 0x1f9b, 0x1f9c, 0x1f9d, 0x1f9e, 0x1f9f,
- 0x1f90, 0x1f91, 0x1f92, 0x1f93, 0x1f94, 0x1f95, 0x1f96, 0x1f97,
- 0x1fa8, 0x1fa9, 0x1faa, 0x1fab, 0x1fac, 0x1fad, 0x1fae, 0x1faf,
- 0x1fa0, 0x1fa1, 0x1fa2, 0x1fa3, 0x1fa4, 0x1fa5, 0x1fa6, 0x1fa7,
- 0x1fb8, 0x1fb9, 0x0, 0x1fbc, 0x0, 0, 0x0, 0x0,
- 0x1fb0, 0x1fb1, 0x1f70, 0x1f71, 0x1fb3, 0, 0x399, 0,
- 0, 0, 0x0, 0x1fcc, 0x0, 0, 0x0, 0x0,
- 0x1f72, 0x1f73, 0x1f74, 0x1f75, 0x1fc3, 0, 0, 0,
- 0x1fd8, 0x1fd9, 0x0, 0x0, 0, 0, 0x0, 0x0,
- 0x1fd0, 0x1fd1, 0x1f76, 0x1f77, 0, 0, 0, 0,
- 0x1fe8, 0x1fe9, 0x0, 0x0, 0x0, 0x1fec, 0x0, 0x0,
- 0x1fe0, 0x1fe1, 0x1f7a, 0x1f7b, 0x1fe5, 0, 0, 0,
- 0, 0, 0x0, 0x1ffc, 0x0, 0, 0x0, 0x0,
- 0x1f78, 0x1f79, 0x1f7c, 0x1f7d, 0x1ff3, 0, 0, 0,
-};
-
-static const Q_UINT16 case_20 [] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0x0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 case_21 [] = {
- 0, 0, 0x0, 0, 0, 0, 0, 0x0,
- 0, 0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x0, 0x0, 0x0, 0, 0x0, 0, 0,
- 0x761, 0x0, 0x0, 0x0, 0x0, 0x0, 0, 0,
- 0, 0, 0, 0, 0x0, 0, 0x0, 0,
- 0x0, 0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0x0, 0x0, 0, 0x0, 0x0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 case_fb [] = {
- 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0x0, 0x0, 0x0, 0x0, 0x0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 case_ff [] = {
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0xff41, 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47,
- 0xff48, 0xff49, 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f,
- 0xff50, 0xff51, 0xff52, 0xff53, 0xff54, 0xff55, 0xff56, 0xff57,
- 0xff58, 0xff59, 0xff5a, 0, 0, 0, 0, 0,
- 0, 0xff21, 0xff22, 0xff23, 0xff24, 0xff25, 0xff26, 0xff27,
- 0xff28, 0xff29, 0xff2a, 0xff2b, 0xff2c, 0xff2d, 0xff2e, 0xff2f,
- 0xff30, 0xff31, 0xff32, 0xff33, 0xff34, 0xff35, 0xff36, 0xff37,
- 0xff38, 0xff39, 0xff3a, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
-};
-
-static const Q_UINT16 * const case_info[256] = {
-
- case_0, case_1, case_2, case_3, case_4, case_5, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- case_10, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, case_1e, case_1f,
- case_20, case_21, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, case_fb, 0, 0, 0, case_ff,
-};
-
-static const Q_INT8 num_0 [] = {
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- 0, 1, 2, 3, 4, 5, 6, 7,
- 8, 9, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, 2, 3, -1, -1, -1, -1,
- -1, 1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
-};
-
-static const Q_INT8 num_6 [] = {
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- 0, 1, 2, 3, 4, 5, 6, 7,
- 8, 9, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- 0, 1, 2, 3, 4, 5, 6, 7,
- 8, 9, -1, -1, -1, -1, -1, -1,
-};
-
-static const Q_INT8 num_9 [] = {
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 0, 1,
- 2, 3, 4, 5, 6, 7, 8, 9,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 0, 1,
- 2, 3, 4, 5, 6, 7, 8, 9,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
-};
-
-static const Q_INT8 num_b [] = {
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 0, 1,
- 2, 3, 4, 5, 6, 7, 8, 9,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, 1,
- 2, 3, 4, 5, 6, 7, 8, 9,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
-};
-
-static const Q_INT8 num_d [] = {
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, 0, 1,
- 2, 3, 4, 5, 6, 7, 8, 9,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
-};
-
-static const Q_INT8 num_e [] = {
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- 0, 1, 2, 3, 4, 5, 6, 7,
- 8, 9, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- 0, 1, 2, 3, 4, 5, 6, 7,
- 8, 9, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
-};
-
-static const Q_INT8 num_f [] = {
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- 0, 1, 2, 3, 4, 5, 6, 7,
- 8, 9, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
-};
-
-static const Q_INT8 num_20 [] = {
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- 0, -1, -1, -1, 4, 5, 6, 7,
- 8, 9, -1, -1, -1, -1, -1, -1,
- 0, 1, 2, 3, 4, 5, 6, 7,
- 8, 9, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
-};
-
-static const Q_INT8 num_ff [] = {
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- 0, 1, 2, 3, 4, 5, 6, 7,
- 8, 9, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
- -1, -1, -1, -1, -1, -1, -1, -1,
-};
-
-static const Q_INT8 * const decimal_info[256] = {
- num_0, 0, 0, 0, 0, 0, num_6, 0,
- 0, num_9, num_9, num_b, num_9, num_d, num_e, num_f,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- num_20, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, num_ff,
-};
-
-static const Q_UINT16 symmetricPairs[] = {
- 0x0028, 0x0029, 0x0029, 0x0028, 0x003C, 0x003E, 0x003E, 0x003C,
- 0x005B, 0x005D, 0x005D, 0x005B, 0x007B, 0x007D, 0x007D, 0x007B,
- 0x2045, 0x2046, 0x2046, 0x2045, 0x207D, 0x207E, 0x207E, 0x207D,
- 0x208D, 0x208E, 0x208E, 0x208D, 0x3008, 0x3009, 0x3009, 0x3008,
- 0x300A, 0x300B, 0x300B, 0x300A, 0x300C, 0x300D, 0x300D, 0x300C,
- 0x300E, 0x300F, 0x300F, 0x300E, 0x3010, 0x3011, 0x3011, 0x3010,
- 0x3014, 0x3015, 0x3015, 0x3014, 0x3016, 0x3017, 0x3017, 0x3016,
- 0x3018, 0x3019, 0x3019, 0x3018, 0x301A, 0x301B, 0x301B, 0x301A,
- 0xFD3E, 0xFD3F, 0xFD3F, 0xFD3E, 0xFE59, 0xFE5A, 0xFE5A, 0xFE59,
- 0xFE5B, 0xFE5C, 0xFE5C, 0xFE5B, 0xFE5D, 0xFE5E, 0xFE5E, 0xFE5D,
- 0xFF08, 0xFF09, 0xFF09, 0xFF08, 0xFF3B, 0xFF3D, 0xFF3D, 0xFF3B,
- 0xFF5B, 0xFF5D, 0xFF5D, 0xFF5B, 0xFF62, 0xFF63, 0xFF63, 0xFF62,
-};
-
-static int symmetricPairsSize =
- sizeof(symmetricPairs)/sizeof(symmetricPairs[0]);
-
-/*
- * ----------------------------------------------------------------------
- * End of unicode tables
- * ----------------------------------------------------------------------
- */
-
-#endif
-
-
-static int ucstrcmp( const QString &as, const QString &bs )
-{
- const QChar *a = as.unicode();
- const QChar *b = bs.unicode();
- if ( a == b )
- return 0;
- if ( a == 0 )
- return 1;
- if ( b == 0 )
- return -1;
- int l=QMIN(as.length(),bs.length());
- while ( l-- && *a == *b )
- a++,b++;
- if ( l==-1 )
- return ( as.length()-bs.length() );
- return a->unicode() - b->unicode();
-}
-
-static int ucstrncmp( const QChar *a, const QChar *b, int l )
-{
- while ( l-- && *a == *b )
- a++,b++;
- if ( l==-1 )
- return 0;
- return a->unicode() - b->unicode();
-}
-
-static int ucstrnicmp( const QChar *a, const QChar *b, int l )
-{
- while ( l-- && a->lower() == b->lower() )
- a++,b++;
- if ( l==-1 )
- return 0;
- QChar al = a->lower();
- QChar bl = b->lower();
- return al.unicode() - bl.unicode();
-}
-
-// NOT REVISED
-/*! \class QCharRef qstring.h
- \brief The QCharRef class is a helper class for QString.
-
- It provides the ability to work on characters in a QString in a natural
- fashion.
-
- When you get an object of type QCharRef, you can assign to it, which
- will operate on the string from which you got it. That is its whole
- purpose in life. It becomes invalid once further modifications are
- made to the string: If you want to keep it, copy it into a QChar.
-
- Most of the QChar member functions also exist in QCharRef. However,
- they are not explicitly documented here.
-
- \sa QString::operator[]() QString::at() QChar
-*/
-
-/*! \class QChar qstring.h
-
-\brief The QChar class provides a light-weight Unicode character.
-
-Unicode characters are (so far) 16-bit entities without any markup or
-structure. This class represents such an entity. It is rather
-light-weight, so it can be used everywhere. Most compilers treat it
-approximately like "short int". (In a few years, it may be necessary
-to make QChar 32-bit, once more than 65536 Unicode code points have
-been defined and come into use.)
-
-QChar provides a full complement of testing/classification functions,
-conversion to and from other formats, from composed to decomposed
-unicode, and will try to compare and case-convert if you ask it to.
-
-The classification functions include functions like those in ctype.h,
-but operating on the full range of unicode characters. They all
-return TRUE if the character is a certain type of character, and FALSE
-otherwise.
-
-These functions are: isNull() (returns TRUE if the character is
-U+0000), isPrint() (TRUE if the character is any sort of printable
-character, including whitespace), isPunct() (any sort of punctation),
-isMark() (Unicode Marks), isLetter (letters), isNumber() (any sort of
-numeric characters), isLetterOrNumber(), and isDigit() (decimal digits).
-All of these are wrappers around category(), which returns the
-unicode-defined category of each character.
-
-QChar further provides direction(), which indicates the "natural"
-writing direction of this character, joining(), which indicates how
-this character joins with its neighbors (needed mostly for Arabic)
-and finally mirrored(), which indicates whether this character needs
-to be mirrored when it is printed in its unnatural writing
-direction.
-
-Composed Unicode characters (like &aring;) can be converted to
-decomposed Unicode ("a" followed by "ring above") using
-decomposition().
-
-In Unicode, comparison is not necessarily possible, and case
-conversion is at best very hard. Unicode, covering the "entire"
-globe, also includes a globe-sized collection of case and sorting
-problems. Qt tries, but not very hard: operator== and friends will do
-comparison based purely on the numeric Unicode value (code point) of
-the characters, and upper() and lower() will do case changes when the
-character has a well-defined upper/lower-case equivalent. There is no
-provision for locale-dependent case folding rules or comparison: These
-functions are meant to be fast, so they can be used unambiguously in
-data structures.
-
-The conversion functions include unicode() (to a scalar), latin1() (to
-scalar, but converts all non-Latin1 characters to 0), row() (gives the
-Unicode row), cell() (gives the unicode cell), digitValue() (gives the
-integer value of any of the numerous digit characters), and a host of
-constructors.
-
-\sa QString QCharRef \link unicode.html About Unicode \endlink
-*/
-
-/*! \enum QChar::Category
-
-This enum maps the Unicode character categories. The currently known
-categories are: <ul>
-
-<li> \c NoCategory - used when Qt is dazed and confused and cannot
-make sense of anything.
-
-<li> \c Mark_NonSpacing - (Mn) -
-
-<li> \c Mark_SpacingCombining - (Mc) -
-
-<li> \c Mark_Enclosing - (Me) -
-
-<li> \c Number_DecimalDigit - (Nd) -
-
-<li> \c Number_Letter - (Nl) -
-
-<li> \c Number_Other - (No) -
-
-<li> \c Separator_Space - (Zs) -
-
-<li> \c Separator_Line - (Zl) -
-
-<li> \c Separator_Paragraph - (Zp) -
-
-<li> \c Other_Control - (Cc) -
-
-<li> \c Other_Format - (Cf) -
-
-<li> \c Other_Surrogate - (Cs) -
-
-<li> \c Other_PrivateUse - (Co) -
-
-<li> \c Other_NotAssigned - (Cn) -
-
-<li> \c Letter_Uppercase - (Lu) -
-
-<li> \c Letter_Lowercase - (Ll) -
-
-<li> \c Letter_Titlecase - (Lt) -
-
-<li> \c Letter_Modifier - (Lm) -
-
-<li> \c Letter_Other - (Lo) -
-
-<li> \c Punctuation_Connector - (Pc) -
-
-<li> \c Punctuation_Dask - (Pd) -
-
-<li> \c Punctuation_Open - (Ps) -
-
-<li> \c Punctuation_Close - (Pe) -
-
-<li> \c Punctuation_InitialQuote - (Pi) -
-
-<li> \c Punctuation_FinalQuote - (Pf) -
-
-<li> \c Punctuation_Other - (Po) -
-
-<li> \c Symbol_Math - (Sm) -
-
-<li> \c Symbol_Currency - (Sc) -
-
-<li> \c Symbol_Modifier - (Sk) -
-
-<li> \c Symbol_Other - (So) -
-
-</ul>
-*/
-
-/*! \enum QChar::Direction
-
- This enum type defines the Unicode direction attributes.
- See <a href="http://www.unicode.org">the Unicode Standard</a>
- for a description of the values.
-
- In order to conform to C/C++ naming conventions "Dir" is
- prepended to the codes used in The Unicode Standard.
-*/
-
-/*! \enum QChar::Decomposition
-
- This enum type defines the Unicode decomposition attributes.
- See <a href="http://www.unicode.org">the Unicode Standard</a>
- for a description of the values.
-*/
-
-/*! \enum QChar::Joining
-
- This enum type defines the Unicode decomposition attributes.
- See <a href="http://www.unicode.org">the Unicode Standard</a>
- for a description of the values.
-*/
-
-
-
-/*! \fn QChar::QChar()
-
-Constructs a null QChar (one that isNull()).
-*/
-
-
-/*! \fn QChar::QChar( char c )
-
-Constructs a QChar corresponding to ASCII/Latin1 character \a c.
-*/
-
-
-/*! \fn QChar::QChar( uchar c )
-
-Constructs a QChar corresponding to ASCII/Latin1 character \a c.
-*/
-
-
-/*! \fn QChar::QChar( uchar c, uchar r )
-
-Constructs a QChar for Unicode cell \a c in row \a r.
-*/
-
-
-/*! \fn QChar::QChar( const QChar& c )
-
-Constructs a copy of \a c. This is a deep copy, if such a
-light-weight object can be said to have deep copies.
-*/
-
-
-/*! \fn QChar::QChar( ushort rc )
-
-Constructs a QChar for the character with Unicode code point \a rc.
-*/
-
-
-/*! \fn QChar::QChar( short rc )
-
-Constructs a QChar for the character with Unicode code point \a rc.
-*/
-
-
-/*! \fn QChar::QChar( uint rc )
-
-Constructs a QChar for the character with Unicode code point \a rc.
-*/
-
-
-/*! \fn QChar::QChar( int rc )
-
-Constructs a QChar for the character with Unicode code point \a rc.
-*/
-
-
-/*! \fn bool QChar::networkOrdered ()
-
- Returns TRUE if this character is in network byte order (MSB first),
- and FALSE if it is not. This is a platform-dependent property, so
- we strongly advise against using this function in portable code.
-*/
-
-
-/*!
- \fn bool QChar::isNull() const
- Returns TRUE if the characters is the unicode character 0x0000,
- ie. ASCII NUL.
-*/
-
-/*!
- \fn uchar QChar::cell () const
- Returns the cell (least significant byte) of the Unicode character.
-*/
-/*!
- \fn uchar QChar::row () const
- Returns the row (most significant byte) of the Unicode character.
-*/
-/*!
- \fn uchar& QChar::cell ()
- Returns a reference to the cell (least significant byte) of the Unicode character.
-*/
-/*!
- \fn uchar& QChar::row ()
- Returns a reference to the row (most significant byte) of the Unicode character.
-*/
-
-/*!
- Returns whether the character is a printable character. This is
- any character not of category Cc or Cn. Note that this gives no indication
- of whether the character is available in some font.
-*/
-bool QChar::isPrint() const
-{
- Category c = category();
- return !(c == Other_Control || c == Other_NotAssigned);
-}
-
-/*!
- Returns whether the character is a separator
- character (Separator_* categories).
-*/
-bool QChar::isSpace() const
-{
- if( !row() )
- if( cell() >= 9 && cell() <=13 ) return TRUE;
- Category c = category();
- return c >= Separator_Space && c <= Separator_Paragraph;
-}
-
-/*!
- Returns whether the character is a mark (Mark_* categories).
-*/
-bool QChar::isMark() const
-{
- Category c = category();
- return c >= Mark_NonSpacing && c <= Mark_Enclosing;
-}
-
-/*!
- Returns whether the character is punctuation (Punctuation_* categories).
-*/
-bool QChar::isPunct() const
-{
- Category c = category();
- return (c >= Punctuation_Connector && c <= Punctuation_Other);
-}
-
-/*!
- Returns whether the character is a letter (Letter_* categories).
-*/
-bool QChar::isLetter() const
-{
- Category c = category();
- return (c >= Letter_Uppercase && c <= Letter_Other);
-}
-
-/*!
- Returns whether the character is a number (of any sort - Number_* categories).
-
- \sa isDigit()
-*/
-bool QChar::isNumber() const
-{
- Category c = category();
- return c >= Number_DecimalDigit && c <= Number_Other;
-}
-
-/*!
- Returns whether the character is a letter or number (Letter_* or Number_* categories).
-*/
-bool QChar::isLetterOrNumber() const
-{
- Category c = category();
- return (c >= Letter_Uppercase && c <= Letter_Other)
- || (c >= Number_DecimalDigit && c <= Number_Other);
-}
-
-
-/*!
- Returns whether the character is a decimal digit (Number_DecimalDigit).
- */
-bool QChar::isDigit() const
-{
- return (category() == Number_DecimalDigit);
-}
-
-/*!
- Returns the numeric value of the digit, or -1 if the character is not
- a digit.
-*/
-int QChar::digitValue() const
-{
-#ifndef QT_NO_UNICODETABLES
- const Q_INT8 *dec_row = decimal_info[row()];
- if( !dec_row )
- return -1;
- return decimal_info[row()][cell()];
-#else
- // ##### just latin1
- if ( rw != 0 || cl < '0' || cl > '9' )
- return -1;
- else
- return cl - '0';
-#endif
-}
-
-/*!
- Returns the character category.
-
- \sa Category
-*/
-QChar::Category QChar::category() const
-{
-#ifndef QT_NO_UNICODETABLES
- return (Category)(unicode_info[row()][cell()]);
-#else
-// ### just ASCII
- if ( rw == 0 ) {
- return (Category)(ui_00[cell()]);
- }
- return Letter_Uppercase; //#######
-#endif
-}
-
-/*!
- Returns the characters directionality.
-
- \sa Direction
-*/
-QChar::Direction QChar::direction() const
-{
-#ifndef QT_NO_UNICODETABLES
- const Q_UINT8 *rowp = direction_info[row()];
- if(!rowp) return QChar::DirL;
- return (Direction) ( *(rowp+cell()) &0x1f );
-#else
- return DirL;
-#endif
-}
-
-/*!
- This function is not supported (it may change to use Unicode
- character classes).
-
- Returns information about the joining properties of the
- character (needed for arabic).
-*/
-QChar::Joining QChar::joining() const
-{
-#ifndef QT_NO_UNICODETABLES
- const Q_UINT8 *rowp = direction_info[row()];
- if ( !rowp )
- return QChar::OtherJoining;
- return (Joining) ((*(rowp+cell()) >> 5) &0x3);
-#else
- return OtherJoining;
-#endif
-}
-
-
-/*!
- Returns whether the character is a mirrored character (one that
- should be reversed if the text direction is reversed).
-*/
-bool QChar::mirrored() const
-{
-#ifndef QT_NO_UNICODETABLES
- const Q_UINT8 *rowp = direction_info[row()];
- if ( !rowp )
- return FALSE;
- return *(rowp+cell())>128;
-#else
- return FALSE;
-#endif
-}
-
-/*!
- Returns the mirrored char if this character is a mirrored char, the char
- itself otherwise
-*/
-QChar QChar::mirroredChar() const
-{
-#ifndef QT_NO_UNICODETABLES
- if(!mirrored()) return *this;
-
- int i;
- int c = unicode();
- for (i = 0; i < symmetricPairsSize; i += 2) {
- if (symmetricPairs[i] == c)
- return symmetricPairs[i+1];
- }
- return 0;
-#else
- return *this;
-#endif
-}
-
-/*!
- Decomposes a character into its parts. Returns QString::null if
- no decomposition exists.
-*/
-QString QChar::decomposition() const
-{
-#ifndef QT_NO_UNICODETABLES
- const Q_UINT16 *r = decomposition_info[row()];
- if(!r) return QString::null;
-
- Q_UINT16 pos = r[cell()];
- if(!pos) return QString::null;
- pos+=2;
-
- QString s;
- Q_UINT16 c;
- while((c = decomposition_map[pos++]) != 0) s += QChar(c);
-
- return s;
-#else
- return null;
-#endif
-}
-
-/*!
- Returns the tag defining the composition of the character.
- Returns QChar::Single if no decomposition exists.
-*/
-QChar::Decomposition QChar::decompositionTag() const
-{
-#ifndef QT_NO_UNICODETABLES
- const Q_UINT16 *r = decomposition_info[row()];
- if(!r) return QChar::Single;
-
- Q_UINT16 pos = r[cell()];
- if(!pos) return QChar::Single;
-
- return (QChar::Decomposition) decomposition_map[pos];
-#else
- return Single; // ########### FIX eg. just latin1
-#endif
-}
-
-/*!
- Returns the lowercase equivalent if the character is uppercase,
- or the character itself otherwise.
-*/
-QChar QChar::lower() const
-{
-#ifndef QT_NO_UNICODETABLES
- if(category() != Letter_Uppercase) return *this;
- Q_UINT16 lower = *(case_info[row()]+cell());
- if(lower == 0) return *this;
- return lower;
-#else
- if (row())
- return *this;
- else
- return QChar(tolower(latin1()));
-#endif
-}
-
-/*!
- Returns the uppercase equivalent if the character is lowercase,
- or the character itself otherwise.
-*/
-QChar QChar::upper() const
-{
-#ifndef QT_NO_UNICODETABLES
- if(category() != Letter_Lowercase) return *this;
- Q_UINT16 upper = *(case_info[row()]+cell());
- if(upper == 0) return *this;
- return upper;
-#else
- if (row())
- return *this;
- else
- return QChar(toupper(latin1()));
-#endif
-}
-
-/*!
- \fn QChar::operator char() const
-
- Returns the Latin1 character equivalent to the QChar,
- or 0. This is mainly useful for non-internationalized software.
-
- \sa unicode()
-*/
-
-/*!
- \fn ushort QChar::unicode() const
-
- Returns the numeric Unicode value equal to the QChar. Normally, you
- should use QChar objects as they are equivalent, but for some low-level
- tasks (eg. indexing into an array of Unicode information), this function
- is useful.
-*/
-
-/*****************************************************************************
- Documentation of QChar related functions
- *****************************************************************************/
-
-/*!
- \fn int operator==( QChar c1, QChar c2 )
- \relates QChar
-
- Returns TRUE if \a c1 and \a c2 are the same Unicode character.
-*/
-
-/*!
- \fn int operator==( char ch, QChar c )
- \relates QChar
-
- Returns TRUE if \a c is the ASCII/Latin1 character \a ch.
-*/
-
-/*!
- \fn int operator==( QChar c, char ch )
- \relates QChar
-
- Returns TRUE if \a c is the ASCII/Latin1 character \a ch.
-*/
-
-/*!
- \fn int operator!=( QChar c1, QChar c2 )
- \relates QChar
-
- Returns TRUE if \a c1 and \a c2 are not the same Unicode character.
-*/
-
-/*!
- \fn int operator!=( char ch, QChar c )
- \relates QChar
-
- Returns TRUE if \a c is not the ASCII/Latin1 character \a ch.
-*/
-
-/*!
- \fn int operator!=( QChar c, char ch )
- \relates QChar
-
- Returns TRUE if \a c is not the ASCII/Latin1 character \a ch.
-*/
-
-/*!
- \fn int operator<=( QChar c1, QChar c2 )
- \relates QChar
-
- Returns TRUE if the numeric Unicode value of \a c1 is less than that
- of \a c2, or they are the same Unicode character.
-*/
-
-/*!
- \fn int operator<=( QChar c, char ch )
- \relates QChar
-
- Returns TRUE if the numeric Unicode value of \a c is less than or
- equal to that of the ASCII/Latin1 character \a ch.
-*/
-
-/*!
- \fn int operator<=( char ch, QChar c )
- \relates QChar
-
- Returns TRUE if the numeric Unicode value of the ASCII/Latin1
- character \a ch is less than or equal to that of \a c.
-*/
-
-/*!
- \fn int operator>=( QChar c1, QChar c2 )
- \relates QChar
-
- Returns TRUE if the numeric Unicode value of \a c1 is greater than that
- of \a c2, or they are the same Unicode character.
-*/
-
-/*!
- \fn int operator>=( QChar c, char ch )
- \relates QChar
-
- Returns TRUE if the numeric Unicode value of \a c is greater than or
- equal to that of the ASCII/Latin1 character \a ch.
-*/
-
-/*!
- \fn int operator>=( char ch, QChar c )
- \relates QChar
-
- Returns TRUE if the numeric Unicode value of the ASCII/Latin1
- character \a ch is greater than or equal to that of \a c.
-*/
-
-/*!
- \fn int operator<( QChar c1, QChar c2 )
- \relates QChar
-
- Returns TRUE if the numeric Unicode value of \a c1 is less than that
- of \a c2.
-*/
-
-/*!
- \fn int operator<( QChar c, char ch )
- \relates QChar
-
- Returns TRUE if the numeric Unicode value of \a c is less than that
- of the ASCII/Latin1 character \a ch.
-*/
-
-/*!
- \fn int operator<( char ch, QChar c )
- \relates QChar
-
- Returns TRUE if the numeric Unicode value of the ASCII/Latin1
- character \a ch is less than that of \a c.
-*/
-
-/*!
- \fn int operator>( QChar c1, QChar c2 )
- \relates QChar
-
- Returns TRUE if the numeric Unicode value of \a c1 is greater than
- that of \a c2.
-*/
-
-/*!
- \fn int operator>( QChar c, char ch )
- \relates QChar
-
- Returns TRUE if the numeric Unicode value of \a c is greater than
- that of the ASCII/Latin1 character \a ch.
-*/
-
-/*!
- \fn int operator>( char ch, QChar c )
- \relates QChar
-
- Returns TRUE if the numeric Unicode value of the ASCII/Latin1
- character \a ch is greater than that of \a c.
-*/
-
-#ifndef QT_NO_UNICODETABLES
-
-// small class used internally in QString::Compose()
-class QLigature
-{
-public:
- QLigature( QChar c );
-
- Q_UINT16 first() { cur = ligatures; return cur ? *cur : 0; }
- Q_UINT16 next() { return cur && *cur ? *(cur++) : 0; }
- Q_UINT16 current() { return cur ? *cur : 0; }
-
- int match(QString & str, unsigned int index);
- QChar head();
- QChar::Decomposition tag();
-
-private:
- Q_UINT16 *ligatures;
- Q_UINT16 *cur;
-};
-
-QLigature::QLigature( QChar c )
-{
- const Q_UINT16 *r = ligature_info[c.row()];
- if( !r )
- ligatures = 0;
- else
- {
- const Q_UINT16 pos = r[c.cell()];
- ligatures = (Q_UINT16 *)&(ligature_map[pos]);
- }
- cur = ligatures;
-}
-
-QChar QLigature::head()
-{
- if(current())
- return QChar(decomposition_map[current()+1]);
-
- return QChar::null;
-}
-
-QChar::Decomposition QLigature::tag()
-{
- if(current())
- return (QChar::Decomposition) decomposition_map[current()];
-
- return QChar::Canonical;
-}
-
-int QLigature::match(QString & str, unsigned int index)
-{
- unsigned int i=index;
-
- if(!current()) return 0;
-
- Q_UINT16 lig = current() + 2;
- Q_UINT16 ch;
-
- while ((i < str.length()) && (ch = decomposition_map[lig])) {
- if (str[(int)i] != QChar(ch))
- return 0;
- i++; lig++;
- }
-
- if (!decomposition_map[lig])
- {
- return i-index;
- }
- return 0;
-}
-
-#endif
-
-// this function is just used in QString::compose()
-static inline bool format(QChar::Decomposition tag, QString & str,
- int index, int len)
-{
- unsigned int l = index + len;
- unsigned int r = index;
-
- bool left = FALSE, right = FALSE;
-
- left = ((l < str.length()) &&
- ((str[(int)l].joining() == QChar::Dual) ||
- (str[(int)l].joining() == QChar::Right)));
- if (r > 0) {
- r--;
- //printf("joining(right) = %d\n", str[(int)r].joining());
- right = (str[(int)r].joining() == QChar::Dual);
- }
-
-
- switch (tag) {
- case QChar::Medial:
- return (left & right);
- case QChar::Initial:
- return (left && !right);
- case QChar::Final:
- return (right);// && !left);
- case QChar::Isolated:
- default:
- return (!right && !left);
- }
-} // format()
-
-/*
- QString::compose() and visual() were developed by Gordon Tisher
- <tisher@uniserve.ca>, with input from Lars Knoll <knoll@mpi-hd.mpg.de>,
- who developed the unicode data tables.
-*/
-/*!
- Note that this function is not supported in Qt 2.0, and is merely
- for experimental and illustrative purposes. It is mainly of interest
- to those experimenting with Arabic and other composition-rich texts.
-
- Applies possible ligatures to a QString, useful when composition-rich
- text requires rendering with glyph-poor fonts, but also
- makes compositions such as QChar(0x0041) ('A') and QChar(0x0308)
- (Unicode accent diaresis) giving QChar(0x00c4) (German A Umlaut).
-*/
-void QString::compose()
-{
-#ifndef QT_NO_UNICODETABLES
- unsigned int index=0, len;
- unsigned int cindex = 0;
-
- QChar code, head;
-
- QArray<QChar> dia;
-
- QString composed = *this;
-
- while (index < length()) {
- code = at(index);
- //printf("\n\nligature for 0x%x:\n", code.unicode());
- QLigature ligature(code);
- ligature.first();
- while(ligature.current()) {
- if ((len = ligature.match(*this, index)) != 0) {
- head = ligature.head();
- unsigned short code = head.unicode();
- // we exclude Arabic presentation forms A and a few
- // other ligatures, which are undefined in most fonts
- if(!(code > 0xfb50 && code < 0xfe80) &&
- !(code > 0xfb00 && code < 0xfb2a)) {
- // joining info is only needed for arabic
- if (format(ligature.tag(), *this, index, len)) {
- //printf("using ligature 0x%x, len=%d\n",code,len);
- // replace letter
- composed.replace(cindex, len, QChar(head));
- index += len-1;
- // we continue searching in case we have a final
- // form because medial ones are preferred.
- if ( len != 1 || ligature.tag() !=QChar::Final )
- break;
- }
- }
- }
- ligature.next();
- }
- cindex++;
- index++;
- }
- *this = composed;
-#endif
-}
-
-static QChar LRM ((ushort)0x200e);
-static QChar RLM ((ushort)0x200f);
-static QChar LRE ((ushort)0x202a);
-static QChar RLE ((ushort)0x202b);
-static QChar RLO ((ushort)0x202e);
-static QChar LRO ((ushort)0x202d);
-static QChar PDF ((ushort)0x202c);
-
-#if 0
-static inline bool is_arabic(unsigned short x) {
- return (((x >= 0x0600) && (x <= 0x07bf)) ||
- ((x >= 0xfb50) && (x <= 0xfdff)) ||
- ((x >= 0xfe70) && (x <= 0xfeff)));
-}
-#endif
-
-static inline bool is_neutral(unsigned short dir) {
- return ((dir == QChar::DirB) ||
- (dir == QChar::DirS) ||
- (dir == QChar::DirWS) ||
- (dir == QChar::DirON) ||
- (dir == QChar::DirNSM));
-}
-
-/*!
- This function returns the basic directionality of the string (QChar::DirR for
- right to left and QChar::DirL for left to right). Useful to find the right
- alignment.
- */
-QChar::Direction QString::basicDirection()
-{
-#ifndef QT_NO_UNICODETABLES
- // find base direction
- unsigned int pos = 0;
- while ((pos < length()) &&
- (at(pos) != RLE) &&
- (at(pos) != LRE) &&
- (at(pos) != RLO) &&
- (at(pos) != LRO) &&
- (at(pos).direction() > 1) &&
- (at(pos).direction() != QChar::DirAL)) // not R and not L
- pos++;
-
- if ((at(pos).direction() == QChar::DirR) ||
- (at(pos).direction() == QChar::DirAL) ||
- (at(pos) == RLE) ||
- (at(pos) == RLO))
- return QChar::DirR;
-#endif
-
- return QChar::DirL;
-}
-
-#ifndef QT_NO_UNICODETABLES
-// reverses part of the QChar array to get visual ordering
-// called from QString::visual()
-//
-static unsigned int reverse( QString &chars, unsigned char *level,
- unsigned int a, unsigned int b)
-{
- unsigned int c = a;
- unsigned char lev = level[c];
-
- while ((c < b) && (level[c] >= lev)) {
- if (level[c] > lev)
- c = reverse(chars, level, c, b);
- c++;
- }
-
- if (lev > 0) {
- QChar temp;
- unsigned int d = a, e = c-1;
- while (d < e) {
- temp = chars[(int)d];
- chars[(int)d] = chars[(int)e];
- chars[(int)e] = temp;
-
- d++; e--;
- }
- }
-
- return c;
-}
-
-// small class used for the ordering algorithm in QString::visual()
-class QBidiState {
-public:
- unsigned char level;
- signed char override;
-
- QBidiState(unsigned char l, signed char o) : level(l), override(o) {};
-};
-
-// matrix for resolving neutral types
-
-#define NEG1 (QChar::Direction)(-1)
-
-static QChar::Direction resolv[5][5] =
-{
- { NEG1, QChar::DirR, QChar::DirL, QChar::DirEN, QChar::DirAN },
- { QChar::DirR, QChar::DirR, NEG1, QChar::DirR, QChar::DirR },
- { QChar::DirL, NEG1, QChar::DirL, QChar::DirL, NEG1 },
- { QChar::DirEN, QChar::DirR, QChar::DirL, QChar::DirEN, QChar::DirR },
- { QChar::DirAN, QChar::DirR, NEG1, NEG1, QChar::DirAN }
-};
-
-#endif
-
-/*!
- This function returns the QString ordered visually. Useful for
- painting the string or when transforming to a visually ordered
- encoding.
-*/
-QString QString::visual(int index, int len)
-{
-#ifndef QT_NO_UNICODETABLES
- // #### This needs much more optimizing - it is called for
- // #### every text operation.
-
- unsigned char *level;
- QChar::Direction *dir;
- unsigned char base = 0;
-
- unsigned int l = length();
-
- // check bounds
- if (len == -1)
- len = length()-index;
- if ((uint)index > l)
- return QString::null;
-
- // find base direction
- unsigned int pos = 0;
- while ((pos < length()) &&
- (at(pos) != RLE) &&
- (at(pos) != LRE) &&
- (at(pos) != RLO) &&
- (at(pos) != LRO) &&
- (at(pos).direction() > 1) &&
- (at(pos).direction() != QChar::DirAL)
- ) // not R and not L
- pos++;
-
- if ((pos < length()) &&
- ((at(pos).direction() == QChar::DirR) ||
- (at(pos).direction() == QChar::DirAL) ||
- (at(pos) == RLE) ||
- (at(pos) == RLO)))
- base = 1;
-
- // is there any BiDi char at all?
- if ( base == 0 && pos == l ) {
- return mid(index, len);
- }
-
-
- level = new uchar[l];
- dir = new QChar::Direction[l];
-
- // explicit override pass
- //unsigned int code_count = 0;
-
- QStack<QBidiState> stack;
- stack.setAutoDelete(TRUE);
-
- unsigned char clevel = base;
- signed char override = -1;
-
- for (pos = 0; pos < l; pos++) {
-
- if (at(pos) == RLE) {
- //code_count++;
- stack.push(new QBidiState(clevel, override));
- if (clevel < 254)
- clevel += 1 + clevel % 2;
- override = -1;
- }
- else if (at(pos) == LRE) {
- //code_count++;
- stack.push(new QBidiState(clevel, override));
- if (clevel < 254)
- clevel += 2 - clevel % 2;
- override = -1;
- }
- else if (at(pos) == RLO) {
- //code_count++;
- stack.push(new QBidiState(clevel, override));
- if (clevel < 254)
- clevel += 1 + clevel % 2;
- override = QChar::DirR;
- }
- else if (at(pos) == LRO) {
- //code_count++;
- stack.push(new QBidiState(clevel, override));
- if (clevel < 254)
- clevel += 2 - clevel % 2;
- override = QChar::DirL;
- }
- else if (at(pos) == PDF) {
- //code_count++;
- if (!stack.isEmpty()) {
- override = stack.top()->override;
- clevel = stack.top()->level;
- stack.remove();
- }
- }
-
- // TODO: catch block separators (newlines, paras, etc.)
-
- level[pos] = clevel;
- if (override != -1)
- dir[pos] = (QChar::Direction) override;
- else
- dir[pos] = at(pos).direction();
- }
-
- // weak type pass
- for (pos = 0; pos < l; pos++) {
-
- int i;
-
- switch (at(pos).direction()) {
- case QChar::DirEN:
- i = pos-1;
- while ((i >= 0) &&
- !(at(i).direction() == QChar::DirAN) &&
- !(at(i).direction() == QChar::DirAL) &&
- !(at(i).direction() == QChar::DirB))
- i--;
-
- if ((i >= 0) &&
- ((at(i).direction() == QChar::DirAN) ||
- (at(i).direction() == QChar::DirAL)))
- dir[pos] = QChar::DirAN;
-
- break;
- case QChar::DirES:
- case QChar::DirCS:
- if ((pos > 0) && (pos < l-1) &&
- (dir[pos-1] == dir[pos+1]))
- dir[pos] = dir[pos-1];
- else
- dir[pos] = QChar::DirON;
-
- break;
- case QChar::DirET:
- if (((pos > 0) && (dir[pos-1] == QChar::DirEN)) ||
- ((pos < l-1) && (dir[pos+1] == QChar::DirEN)))
- dir[pos] = QChar::DirEN;
- else
- dir[pos] = QChar::DirON;
-
- break;
- case QChar::DirAL:
- dir[pos] = QChar::DirR;
- break;
- default:
- break;
- }
- }
-
- // neutral type pass
- for (pos = 0; pos < l; pos++) {
- QChar::Direction left,right; // declaring l here shadowed previous l
-
- if (is_neutral(dir[pos])) {
- if (pos > 0)
- left = dir[pos-1];
- else
- left = (base == 0 ? QChar::DirL : QChar::DirR);
-
- int i = pos;
-
- while ((i < (int)l-1) && is_neutral(dir[i+1]))
- i++;
-
- if (i < (int)l-1)
- right = dir[i+1];
- else
- right = (base == 0 ? QChar::DirL : QChar::DirR);
-
- for (int j=pos; j <= i; j++) {
- int a = 1, b = 1;
- while ((a < 5) && (left != resolv[0][a]))
- a++;
- while ((b < 5) && (right != resolv[0][b]))
- b++;
- if ((a == 5) || (b == 5))
- dir[j] = (base == 0 ? QChar::DirL : QChar::DirR);
- else
- dir[j] = resolv[a][b];
-
- if (dir[j] == (QChar::Direction)(-1))
- dir[j] = (base == 0 ? QChar::DirL : QChar::DirR);
- }
- }
- }
-
- // implicit level pass
- QChar::Direction prec = (base == 0 ? QChar::DirL : QChar::DirR);
-
- for (pos = 0; pos < l; pos++) {
- if (level[pos] % 2) {
- switch (dir[pos]) {
- case QChar::DirL:
- case QChar::DirAN:
- case QChar::DirEN:
- level[pos] += 1;
- break;
- default:
- break;
- }
- } else {
- switch (dir[pos]) {
- case QChar::DirL:
- // do nothing
- break;
- case QChar::DirR:
- level[pos] += 1;
- break;
- case QChar::DirEN:
- if (prec == QChar::DirL)
- continue;
- // fall through
- case QChar::DirAN:
- level[pos] += 2;
- break;
- default:
- break;
- }
- }
-
- prec = dir[pos];
- }
-
- // now do the work!
- QString ret(*this);
- reverse(ret, level, index, index+len);
-
- delete [] level;
- delete [] dir;
-
- return ret;
-#else
- return mid(index,len);
-#endif
-}
-
-
-
-// These macros are used for efficient allocation of QChar strings.
-// IMPORTANT! If you change these, make sure you also change the
-// "delete unicode" statement in ~QStringData() in qstring.h correspondingly!
-
-#define QT_ALLOC_QCHAR_VEC( N ) (QChar*) new char[ sizeof(QChar)*( N ) ]
-#define QT_DELETE_QCHAR_VEC( P ) delete[] ((char*)( P ))
-
-
-/*!
- This utility function converts the 8-bit string
- \a ba to Unicode, returning the result.
-
- The caller is responsible for deleting the return value with delete[].
-*/
-
-QChar* QString::asciiToUnicode( const QByteArray& ba, uint* len )
-{
- if ( ba.isNull() ) {
- *len = 0;
- return 0;
- }
- int l = 0;
- while ( l < (int)ba.size() && ba[l] )
- l++;
- char* str = ba.data();
- QChar *uc = new QChar[ l ]; // Can't use macro, since function is public
- QChar *result = uc;
- if ( len )
- *len = l;
- while (l--)
- *uc++ = *str++;
- return result;
-}
-
-static QChar* internalAsciiToUnicode( const QByteArray& ba, uint* len )
-{
- if ( ba.isNull() ) {
- *len = 0;
- return 0;
- }
- int l = 0;
- while ( l < (int)ba.size() && ba[l] )
- l++;
- char* str = ba.data();
- QChar *uc = QT_ALLOC_QCHAR_VEC( l );
- QChar *result = uc;
- if ( len )
- *len = l;
- while (l--)
- *uc++ = *str++;
- return result;
-}
-
-/*!
- This utility function converts the NUL-terminated 8-bit string
- \a str to Unicode, returning the result and setting \a len to
- the length of the Unicode string.
-
- The caller is responsible for deleting the return value with delete[].
-*/
-
-QChar* QString::asciiToUnicode( const char *str, uint* len, uint maxlen )
-{
- QChar* result = 0;
- uint l = 0;
- if ( str ) {
- if ( maxlen != (uint)-1 ) {
- while ( l < maxlen && str[l] )
- l++;
- } else {
- // Faster?
- l = qstrlen(str);
- }
- QChar *uc = new QChar[ l ]; // Can't use macro since function is public
- result = uc;
- uint i = l;
- while ( i-- )
- *uc++ = *str++;
- }
- if ( len )
- *len = l;
- return result;
-}
-
-static QChar* internalAsciiToUnicode( const char *str, uint* len,
- uint maxlen = (uint)-1 )
-{
- QChar* result = 0;
- uint l = 0;
- if ( str ) {
- if ( maxlen != (uint)-1 ) {
- while ( l < maxlen && str[l] )
- l++;
- } else {
- // Faster?
- l = qstrlen(str);
- }
- QChar *uc = QT_ALLOC_QCHAR_VEC( l );
- result = uc;
- uint i = l;
- while ( i-- )
- *uc++ = *str++;
- }
- if ( len )
- *len = l;
- return result;
-}
-
-/*!
- This utility function converts \a l 16-bit characters from
- \a uc to ASCII, returning a NUL-terminated string.
-
- The caller is responsible for deleting the string with delete[].
-*/
-char* QString::unicodeToAscii(const QChar *uc, uint l)
-{
- if (!uc) {
- return 0;
- }
- char *a = new char[l+1];
- char *result = a;
- while (l--)
- *a++ = *uc++;
- *a = '\0';
- return result;
-}
-
-/*****************************************************************************
- QString member functions
- *****************************************************************************/
-
-/*!
- \class QString qstring.h
-
- \brief The QString class provides an abstraction of Unicode text and
- the classic C null-terminated char array (<var>char*</var>).
-
- \ingroup tools
- \ingroup shared
-
- QString uses \link shclass.html implicit sharing\endlink, and so it
- is very efficient and easy to use.
-
- In all QString methods that take <var>const char*</var> parameters,
- the <var>const char*</var> is interpreted as a classic C-style
- 0-terminated ASCII string. It is legal for the <var>const
- char*</var> parameter to be 0. The results are undefined if the
- <var>const char*</var> string is not 0-terminated. Functions that
- copy classic C strings into a QString will not copy the terminating
- 0-character. The QChar array of the QString (as returned by
- unicode()) is not terminated by a null.
-
- A QString that has not been assigned to anything is \a null, i.e. both
- the length and data pointer is 0. A QString that references the empty
- string ("", a single '\0' char) is \a empty. Both null and empty
- QStrings are legal parameters to the methods. Assigning <var>const char
- * 0</var> to QString gives a null QString.
-
- Note that if you find that you are mixing usage of QCString, QString,
- and QByteArray, this causes lots of unnecessary copying and might
- indicate that the true nature of the data you are dealing with is
- uncertain. If the data is NUL-terminated 8-bit data, use QCString;
- if it is unterminated (ie. contains NULs) 8-bit data, use QByteArray;
- if it is text, use QString.
-
- \sa QChar \link shclass.html Shared classes\endlink
-*/
-
-Q_EXPORT QStringData *QString::shared_null = 0;
-QT_STATIC_CONST_IMPL QString QString::null;
-QT_STATIC_CONST_IMPL QChar QChar::null;
-QT_STATIC_CONST_IMPL QChar QChar::replacement((ushort)0xfffd);
-QT_STATIC_CONST_IMPL QChar QChar::byteOrderMark((ushort)0xfeff);
-QT_STATIC_CONST_IMPL QChar QChar::byteOrderSwapped((ushort)0xfffe);
-QT_STATIC_CONST_IMPL QChar QChar::nbsp((ushort)0x00a0);
-
-QStringData* QString::makeSharedNull()
-{
- return shared_null=new QStringData;
-}
-
-// Uncomment this to get some useful statistics.
-// #define Q2HELPER(x) x
-
-#ifdef Q2HELPER
-static int stat_construct_charstar=0;
-static int stat_construct_charstar_size=0;
-static int stat_construct_null=0;
-static int stat_construct_int=0;
-static int stat_construct_int_size=0;
-static int stat_construct_ba=0;
-static int stat_get_ascii=0;
-static int stat_get_ascii_size=0;
-static int stat_copy_on_write=0;
-static int stat_copy_on_write_size=0;
-static int stat_fast_copy=0;
-Q_EXPORT void qt_qstring_stats()
-{
- qDebug("construct_charstar = %d (%d chars)", stat_construct_charstar, stat_construct_charstar_size);
- qDebug("construct_null = %d", stat_construct_null);
- qDebug("construct_int = %d (%d chars)", stat_construct_int, stat_construct_int_size);
- qDebug("construct_ba = %d", stat_construct_ba);
- qDebug("get_ascii = %d (%d chars)", stat_get_ascii, stat_get_ascii_size);
- qDebug("copy_on_write = %d (%d chars)", stat_copy_on_write, stat_copy_on_write_size);
- qDebug("fast_copy = %d", stat_fast_copy);
-}
-#else
-#define Q2HELPER(x)
-#endif
-
-/*!
- \fn QString::QString()
-
- Constructs a null string.
- \sa isNull()
-*/
-
-/*!
- Constructs a string containing the one character \a ch.
-*/
-QString::QString( QChar ch )
-{
- d = new QStringData( QT_ALLOC_QCHAR_VEC( 1 ), 1, 1 );
- d->unicode[0] = ch;
-}
-
-/*!
- Constructs an implicitly-shared copy of \a s.
-*/
-QString::QString( const QString &s ) :
- d(s.d)
-{
- Q2HELPER(stat_fast_copy++)
- d->ref();
-}
-
-/*!
- Private function.
-
- Constructs a string with preallocated space for \a size characters.
-
- The string is empty.
-
- \sa isNull()
-*/
-
-QString::QString( int size, bool /*dummy*/ )
-{
- if ( size ) {
- Q2HELPER(stat_construct_int++)
- int l = size;
- Q2HELPER(stat_construct_int_size+=l)
- QChar* uc = QT_ALLOC_QCHAR_VEC( l );
- d = new QStringData( uc, 0, l );
- } else {
- Q2HELPER(stat_construct_null++)
- d = shared_null ? shared_null : (shared_null=new QStringData);
- d->ref();
- }
-}
-
-/*!
- Constructs a string that is a deep copy of \a ba interpreted as
- a classic C string.
-*/
-
-QString::QString( const QByteArray& ba )
-{
- Q2HELPER(stat_construct_ba++)
- uint l;
- QChar *uc = internalAsciiToUnicode(ba,&l);
- d = new QStringData(uc,l,l);
-}
-
-QString::QString( const QCString& ba )
-{
- Q2HELPER(stat_construct_ba++)
- uint l;
- QChar *uc = internalAsciiToUnicode(ba,&l);
- d = new QStringData(uc,l,l);
-}
-
-/*!
- Constructs a string that is a deep copy of the
- first \a length QChar in the array \a unicode.
-
- If \a unicode and \a length are 0, a null string is created.
-
- If only \a unicode is 0, the string is empty, but has
- \a length characters of space preallocated - QString expands
- automatically anyway, but this may speed some cases up a little.
-
- \sa isNull()
-*/
-
-QString::QString( const QChar* unicode, uint length )
-{
- if ( !unicode && !length ) {
- d = shared_null ? shared_null : makeSharedNull();
- d->ref();
- } else {
- QChar* uc = QT_ALLOC_QCHAR_VEC( length );
- if ( unicode )
- memcpy(uc, unicode, length*sizeof(QChar));
- d = new QStringData(uc,unicode ? length : 0,length);
- }
-}
-
-/*!
- Constructs a string that is a deep copy of \a str, interpreted as a
- classic C string.
-
- If \a str is 0 a null string is created.
-
- This is a cast constructor, but it is perfectly safe: converting a Latin1
- const char* to QString preserves all the information.
- You can disable this constructor by
- defining QT_NO_CAST_ASCII when you compile your applications.
- You can also make QString objects by using setLatin1()/fromLatin1(), or
- fromLocal8Bit(), fromUtf8(), or whatever encoding is appropriate for
- the 8-bit data you have.
-
- \sa isNull()
-*/
-
-QString::QString( const char *str )
-{
- Q2HELPER(stat_construct_charstar++)
- uint l;
- QChar *uc = internalAsciiToUnicode(str,&l);
- Q2HELPER(stat_construct_charstar_size+=l)
- d = new QStringData(uc,l,l);
-}
-
-
-/*! \fn QString::~QString()
-
-Destroys the string and frees the "real" string, if this was the last
-copy of that string.
-*/
-
-
-/*!
- Deallocates any space reserved solely by this QString.
-*/
-
-void QString::real_detach()
-{
- setLength( length() );
-}
-
-void QString::deref()
-{
- if ( d->deref() ) {
- if ( d == shared_null )
- shared_null = 0;
- delete d;
- d = 0; // helps debugging
- }
-}
-
-void QStringData::deleteSelf()
-{
- delete this;
-}
-
-/*!
- \fn QString& QString::operator=( QChar c )
- Sets the string to contain just the single character \a c.
-*/
-
-/*!
- \fn QString& QString::operator=( char c )
- Sets the string to contain just the single character \a c.
-*/
-
-/*!
- Assigns a shallow copy of \a s to this string and returns a
- reference to this string.
-*/
-QString &QString::operator=( const QString &s )
-{
- Q2HELPER(stat_fast_copy++)
- s.d->ref();
- deref();
- d = s.d;
- return *this;
-}
-
-/*!
- Assigns a deep copy of \a cs, interpreted as a classic C string, to
- this string and returns a reference to this string.
-*/
-QString &QString::operator=( const QCString& cs )
-{
- return setLatin1(cs);
-}
-
-
-/*!
- Assigns a deep copy of \a str, interpreted as a classic C string,
- to this string and returns a reference to this string.
-
- If \a str is 0 a null string is created.
-
- \sa isNull()
-*/
-QString &QString::operator=( const char *str )
-{
- return setLatin1(str);
-}
-
-
-/*!
- \fn bool QString::isNull() const
-
- Returns TRUE if the string is null.
- A null string is also an empty string.
-
- Example:
- \code
- QString a; // a.unicode() == 0, a.length() == 0
- QString b = ""; // b.unicode() == "", b.length() == 0
- a.isNull(); // TRUE, because a.unicode() == 0
- a.isEmpty(); // TRUE, because a.length() == 0
- b.isNull(); // FALSE, because b.unicode() != 0
- b.isEmpty(); // TRUE, because b.length() == 0
- \endcode
-
- \sa isEmpty(), length()
-*/
-
-/*!
- \fn bool QString::isEmpty() const
-
- Returns TRUE if the string is empty, i.e. if length() == 0.
- An empty string is not always a null string.
-
- See example in isNull().
-
- \sa isNull(), length()
-*/
-
-/*!
- \fn uint QString::length() const
-
- Returns the length of the string.
-
- Null strings and empty strings have zero length.
-
- \sa isNull(), isEmpty()
-*/
-
-/*!
- Truncates the string at position \a newLen if newLen is less than the
- current length . Otherwise, nothing happens.
-
- Example:
- \code
- QString s = "truncate this string";
- s.truncate( 5 ); // s == "trunc"
- \endcode
-
- In Qt 1.x, it was possible to "truncate" a string to a longer
- length. This is no longer possible.
-
-*/
-
-void QString::truncate( uint newLen )
-{
- if ( newLen < d->len )
- setLength( newLen );
-}
-
-/*### Make this public in 3.0
- Ensures that at least \a newLen characters are allocated, and
- sets the length to \a newLen. This function always detaches the
- string from other references to the same data. Any new space
- allocated is \e not defined.
-
- If \a newLen is 0, this string becomes empty, unless this string is
- null, in which case it remains null.
-
- \sa truncate(), isNull(), isEmpty()
-*/
-
-void QString::setLength( uint newLen )
-{
- if ( d->count != 1 || newLen > d->maxl || // detach, grow, or
- ( newLen*4 < d->maxl && d->maxl > 4 ) ) { // shrink
- Q2HELPER(stat_copy_on_write++)
- Q2HELPER(stat_copy_on_write_size+=d->len)
- uint newMax = 4;
- while ( newMax < newLen )
- newMax *= 2;
- QChar* nd = QT_ALLOC_QCHAR_VEC( newMax );
- uint len = QMIN( d->len, newLen );
- if ( d->unicode )
- memcpy( nd, d->unicode, sizeof(QChar)*len );
- deref();
- d = new QStringData( nd, newLen, newMax );
- } else {
- d->len = newLen;
- d->dirtyascii = 1;
- }
-}
-
-/*! Returns a string equal to this one, but with the lowest-numbered
- occurrence of \c %i (for a positive integer i) replaced by \a a.
-
- \code
- label.setText( tr("Rename %1 to %2?").arg(oldName).arg(newName) );
- \endcode
-
- \a fieldwidth is the minimum amount of space \a a is padded to. A
- positive value produces right-aligned text, while a negative value
- produces left aligned text.
-
- \warning Using arg() for constructing "real" sentences
- programmatically is likely to lead to translation problems.
- Inserting objects like numbers or file names is fairly safe.
-
- \warning Relying on spaces to create alignment is prone to lead to
- translation problems.
-
- If there is no \c %i pattern, a warning message (qWarning()) is
- printed and the text as appended at the end of the string. This is
- error recovery and should not occur in correct code.
-
- \sa QObject::tr()
-*/
-QString QString::arg(const QString& a, int fieldwidth) const
-{
- int pos, len;
- QString r = *this;
-
- if ( !findArg( pos, len ) ) {
- qWarning( "QString::arg(): Argument missing: %s, %s",
- (const char *)this, (const char *)a );
- // Make sure the text at least appears SOMEWHERE
- r += ' ';
- pos = r.length();
- len = 0;
- }
-
- r.replace( pos, len, a );
- if ( fieldwidth < 0 ) {
- QString s;
- while ( (uint)-fieldwidth > a.length() ) {
- s += ' ';
- fieldwidth++;
- }
- r.insert( pos + a.length(), s );
- } else if ( fieldwidth ) {
- QString s;
- while ( (uint)fieldwidth > a.length() ) {
- s += ' ';
- fieldwidth--;
- }
- r.insert( pos, s );
- }
-
- return r;
-}
-
-
-/*! \overload
-
- \a a is expressed in to \a base notation, which is decimal by
- default and must be in the range 2-36 inclusive.
-*/
-QString QString::arg(long a, int fieldwidth, int base) const
-{
- return arg( QString::number( a, base ), fieldwidth );
-}
-
-/*! \overload
-
- \a a is expressed in to \a base notation, which is decimal by
- default and must be in the range 2-36 inclusive.
-*/
-QString QString::arg(ulong a, int fieldwidth, int base) const
-{
- return arg( QString::number( a, base ), fieldwidth );
-}
-
-/*!
- \overload QString QString::arg(int a, int fieldwidth, int base) const
-
- \a a is expressed in to \a base notation, which is decimal by
- default and must be in the range 2-36 inclusive.
-
-*/
-
-/*!
- \overload QString QString::arg(uint a, int fieldwidth, int base) const
-
- \a a is expressed in to \a base notation, which is decimal by
- default and must be in the range 2-36 inclusive.
-*/
-
-/*!
- \overload QString QString::arg(short a, int fieldwidth, int base) const
-
- \a a is expressed in to \a base notation, which is decimal by
- default and must be in the range 2-36 inclusive.
-*/
-
-/*!
- \overload QString QString::arg(ushort a, int fieldwidth, int base) const
-
- \a a is expressed in to \a base notation, which is decimal by
- default and must be in the range 2-36 inclusive.
-*/
-
-
-/*! \overload
-
- \a a is assumed to be in the Latin1 character set.
-*/
-QString QString::arg(char a, int fieldwidth) const
-{
- QString c;
- c += a;
- return arg( c, fieldwidth );
-}
-
-/*! \overload
-*/
-QString QString::arg(QChar a, int fieldwidth) const
-{
- QString c;
- c += a;
- return arg( c, fieldwidth );
-}
-
-/*! \overload
-
- \a is formatted according to the \a fmt format specified, which is
- 'g' by default and can be any of 'f', 'F', 'e', 'E', 'g' or 'G', all
- of which have the same meaning as for sprintf(). \a prec determines
- the precision, just as for number() and sprintf().
-*/
-QString QString::arg(double a, int fieldwidth, char fmt, int prec) const
-{
- return arg( QString::number( a, fmt, prec ), fieldwidth );
-}
-
-
-/*!
- Just 1-digit arguments.
-*/
-bool QString::findArg(int& pos, int& len) const
-{
- char lowest=0;
- for (uint i=0; i<length(); i++) {
- if ( at(i) == '%' && i+1<length() ) {
- char dig = at(i+1);
- if ( dig >= '0' && dig <= '9' ) {
- if ( !lowest || dig < lowest ) {
- lowest = dig;
- pos = i;
- len = 2;
- }
- }
- }
- }
- return lowest != 0;
-}
-
-/*!
- Safely builds a formatted string from a format string and an
- arbitrary list of arguments. The format string supports all
- the escape sequences of printf() in the standard C library.
-
- The %s escape sequence expects a utf8() encoded string.
- The format string \e cformat is expected to be in latin1. If you need a unicode
- format string, use QString::arg() instead. For typesafe
- string building, with full Unicode support, you can use QTextOStream
- like this:
-
- \code
- QString str;
- QString s = ...;
- int x = ...;
- QTextOStream(&str) << s << " : " << x;
- \endcode
-
- For \link QObject::tr() translations,\endlink especially if the
- strings contains more than one escape sequence, you should consider
- using the arg() function instead. This allows the order of the
- replacements to be controlled by the translator, and has Unicode
- support.
-
- \sa arg()
-*/
-
-QString &QString::sprintf( const char* cformat, ... )
-{
- va_list ap;
- va_start( ap, cformat );
-
- if ( !cformat || !*cformat ) {
- // Qt 1.x compat
- *this = QString::fromLatin1( "" );
- return *this;
- }
- QString format = QString::fromLatin1( cformat );
-
- static QRegExp *escape = 0;
- if (!escape)
- escape = new QRegExp( "%#?0?-? ?\\+?'?[0-9*]*\\.?[0-9*]*h?l?L?q?Z?" );
-
- QString result;
- uint last = 0;
-
- int len = 0;
- int pos;
- while ( 1 ) {
- pos = escape->match( format, last, &len );
- // Non-escaped text
- if ( pos > (int)last )
- result += format.mid(last,pos-last);
- if ( pos < 0 ) {
- // The rest
- if ( last < format.length() )
- result += format.mid(last);
- break;
- }
- last = pos + len + 1;
-
- // Escape
- QString f = format.mid( pos, len );
- uint width, decimals;
- int params = 0;
- int wpos = f.find('*');
- if ( wpos >= 0 ) {
- params++;
- width = va_arg( ap, int );
- if ( f.find('*', wpos + 1) >= 0 ) {
- decimals = va_arg( ap, int );
- params++;
- } else {
- decimals = 0;
- }
- } else {
- decimals = width = 0;
- }
- QString replacement;
- if ( format[pos+len] == 's' ||
- format[pos+len] == 'S' ||
- format[pos+len] == 'c' )
- {
- bool rightjust = ( f.find('-') < 0 );
- // Yes, %-5s really means left adjust in sprintf
-
- if ( wpos < 0 ) {
- QRegExp num( QString::fromLatin1("[0-9]+") );
- QRegExp dot( QString::fromLatin1("\\.") );
- int nlen;
- int p = num.match( f, 0, &nlen );
- int q = dot.match( f, 0 );
- if ( q < 0 || (p < q && p >= 0) )
- width = f.mid( p, nlen ).toInt();
- if ( q >= 0 ) {
- p = num.match( f, q );
- // "decimals" is used to specify string truncation
- if ( p >= 0 )
- decimals = f.mid( p, nlen ).toInt();
- }
- }
-
- if ( format[pos+len] == 's' ) {
-#ifndef QT_NO_TEXTCODEC
- QString s = QString::fromUtf8(va_arg(ap, char*));
-#else
- QString s = QString::fromLatin1(va_arg(ap, char*));
-#endif
- if ( decimals <= 0 )
- replacement = s;
- else
- replacement = s.left(decimals);
- } else {
- int ch = va_arg(ap, int);
- replacement = QChar((ushort)ch);
- }
- if ( replacement.length() < width ) {
- replacement = rightjust
- ? replacement.rightJustify(width)
- : replacement.leftJustify(width);
- }
- } else if ( format[pos+len] == '%' ) {
- replacement = '%';
- } else if ( format[pos+len] == 'n' ) {
- int* n = va_arg(ap, int*);
- *n = result.length();
- } else {
- char in[64], out[330] = "";
- strncpy(in,f.latin1(),63);
- char fch = format[pos+len].latin1();
- in[f.length()] = fch;
- switch ( fch ) {
- case 'd': case 'i': case 'o': case 'u': case 'x': case 'X': {
- int value = va_arg(ap, int);
- switch (params) {
- case 0: ::sprintf( out, in, value ); break;
- case 1: ::sprintf( out, in, width, value ); break;
- case 2: ::sprintf( out, in, width, decimals, value ); break;
- }
- } break;
- case 'e': case 'E': case 'f': case 'g': case 'G': {
- double value = va_arg(ap, double);
- switch (params) {
- case 0: ::sprintf( out, in, value ); break;
- case 1: ::sprintf( out, in, width, value ); break;
- case 2: ::sprintf( out, in, width, decimals, value ); break;
- }
- } break;
- case 'p': {
- void* value = va_arg(ap, void*);
- switch (params) {
- case 0: ::sprintf( out, in, value ); break;
- case 1: ::sprintf( out, in, width, value ); break;
- case 2: ::sprintf( out, in, width, decimals, value ); break;
- }
- } break;
- }
- replacement = QString::fromLatin1(out);
- }
- result += replacement;
- }
- *this = result;
-
- va_end( ap );
- return *this;
-}
-
-/*!
- Fills the string with \a len characters of value \a c.
-
- If \a len is negative, the current string length is used.
-*/
-
-void QString::fill( QChar c, int len )
-{
- if ( len < 0 )
- len = length();
- if ( len == 0 ) {
- *this = "";
- } else {
- deref();
- QChar * nd = QT_ALLOC_QCHAR_VEC( len );
- d = new QStringData(nd,len,len);
- while (len--) *nd++ = c;
- }
-}
-
-
-/*!
- \fn QString QString::copy() const
-
- \obsolete
-
- Returns a deep copy of this string.
-
- Doing this is redundant in Qt 2.x, since QString is implicitly
- shared, and so will automatically be deeply copied as necessary.
-*/
-
-/*!
- Finds the first occurrence of the character \a c, starting at
- position \a index. If \a index is -1, the search starts at the
- last character; if -2, at the next to last character; etc.
-
- The search is case sensitive if \a cs is TRUE, or case insensitive
- if \a cs is FALSE.
-
- Returns the position of \a c, or -1 if \a c could not be found.
-*/
-
-int QString::find( QChar c, int index, bool cs ) const
-{
- if ( index < 0 )
- index += length();
- if ( (uint)index >= length() ) // index outside string
- return -1;
- register const QChar *uc;
- uc = unicode()+index;
- int n = length()-index;
- if ( cs ) {
- while ( n-- && *uc != c )
- uc++;
- } else {
- c = c.lower();
- while ( n-- && uc->lower() != c )
- uc++;
- }
- if ( uint(uc - unicode()) >= length() )
- return -1;
- return (int)(uc - unicode());
-}
-
-/*!
- Finds the first occurrence of the string \a str, starting at position
- \a index. If \a index is -1, the search starts at the last character;
- if -2, at the next to last character; etc.
-
- The search is case sensitive if \a cs is TRUE, or case insensitive if
- \a cs is FALSE.
-
- Returns the position of \a str, or -1 if \a str could not be found.
-*/
-
-int QString::find( const QString& str, int index, bool cs ) const
-{
- /*
- We use some weird hashing for efficiency's sake. Instead of
- comparing strings, we compare the hash value of str with that of
- a part of this QString. Only if that matches, we call ucstrncmp
- or ucstrnicmp.
-
- The hash value of a string is the sum of the cells of its
- QChars.
- */
- if ( index < 0 )
- index += length();
- int lstr = str.length();
- int lthis = length() - index;
- if ( (uint)lthis > length() )
- return -1;
- int delta = lthis - lstr;
- if ( delta < 0 )
- return -1;
-
- const QChar *uthis = unicode() + index;
- const QChar *ustr = str.unicode();
- uint hthis = 0;
- uint hstr = 0;
- int i;
- if ( cs ) {
- for ( i = 0; i < lstr; i++ ) {
- hthis += uthis[i].cell();
- hstr += ustr[i].cell();
- }
- i = 0;
- while ( TRUE ) {
- if ( hthis == hstr && ucstrncmp(uthis + i, ustr, lstr) == 0 )
- return index + i;
- if ( i == delta )
- return -1;
- hthis += uthis[i + lstr].cell();
- hthis -= uthis[i].cell();
- i++;
- }
- } else {
- for ( i = 0; i < lstr; i++ ) {
- hthis += uthis[i].lower().cell();
- hstr += ustr[i].lower().cell();
- }
- i = 0;
- while ( TRUE ) {
- if ( hthis == hstr && ucstrnicmp(uthis + i, ustr, lstr) == 0 )
- return index + i;
- if ( i == delta )
- return -1;
- hthis += uthis[i + lstr].lower().cell();
- hthis -= uthis[i].lower().cell();
- i++;
- }
- }
-#if defined(Q_SPURIOUS_NON_VOID_WARNING)
- return -1;
-#endif
-}
-
-/*!
- \fn int QString::findRev( const char* str, int index ) const
-
- Equivalent to findRev(QString(str), index).
-*/
-
-/*!
- \fn int QString::find( const char* str, int index ) const
-
- Equivalent to find(QString(str), index).
-*/
-
-/*!
- Finds the first occurrence of the character \a c, starting at
- position \a index and searching backwards. If \a index is -1,
- the search starts at the last character; if -2, at the next to
- last character; etc.
-
- The search is case sensitive if \a cs is TRUE, or case insensitive if \a
- cs is FALSE.
-
- Returns the position of \a c, or -1 if \a c could not be found.
-*/
-
-int QString::findRev( QChar c, int index, bool cs ) const
-{
- QString t( c );
- return findRev( t, index, cs );
-}
-
-/*!
- Finds the first occurrence of the string \a str, starting at
- position \a index and searching backwards. If \a index is -1,
- the search starts at the last character; -2, at the next to last
- character; etc.
-
- The search is case sensitive if \a cs is TRUE, or case insensitive if \e
- cs is FALSE.
-
- Returns the position of \a str, or -1 if \a str could not be found.
-*/
-
-int QString::findRev( const QString& str, int index, bool cs ) const
-{
- /*
- See QString::find() for explanations.
- */
- int lthis = length();
- if ( index < 0 )
- index += lthis;
-
- int lstr = str.length();
- int delta = lthis - lstr;
- if ( index < 0 || index > lthis || delta < 0 )
- return -1;
- if ( index > delta )
- index = delta;
-
- const QChar *uthis = unicode();
- const QChar *ustr = str.unicode();
- uint hthis = 0;
- uint hstr = 0;
- int i;
- if ( cs ) {
- for ( i = 0; i < lstr; i++ ) {
- hthis += uthis[index + i].cell();
- hstr += ustr[i].cell();
- }
- i = index;
- while ( TRUE ) {
- if ( hthis == hstr && ucstrncmp(uthis + i, ustr, lstr) == 0 )
- return i;
- if ( i == 0 )
- return -1;
- i--;
- hthis -= uthis[i + lstr].cell();
- hthis += uthis[i].cell();
- }
- } else {
- for ( i = 0; i < lstr; i++ ) {
- hthis += uthis[index + i].lower().cell();
- hstr += ustr[i].lower().cell();
- }
- i = index;
- while ( TRUE ) {
- if ( hthis == hstr && ucstrnicmp(uthis + i, ustr, lstr) == 0 )
- return i;
- if ( i == 0 )
- return -1;
- i--;
- hthis -= uthis[i + lstr].lower().cell();
- hthis += uthis[i].lower().cell();
- }
- }
-#if defined(Q_SPURIOUS_NON_VOID_WARNING)
- return -1;
-#endif
-}
-
-
-/*!
- Returns the number of times the character \a c occurs in the string.
-
- The match is case sensitive if \a cs is TRUE, or case insensitive if \a cs
- is FALSE.
-*/
-
-int QString::contains( QChar c, bool cs ) const
-{
- int count = 0;
- const QChar *uc = unicode();
- if ( !uc )
- return 0;
- int n = length();
- if ( cs ) { // case sensitive
- while ( n-- )
- if ( *uc++ == c )
- count++;
- } else { // case insensitive
- c = c.lower();
- while ( n-- ) {
- if ( uc->lower() == c )
- count++;
- uc++;
- }
- }
- return count;
-}
-
-/*!
- \overload
-*/
-int QString::contains( const char* str, bool cs ) const
-{
- return contains(QString(str),cs);
-}
-
-/*!
- \overload int QString::contains (char c, bool cs) const
-*/
-
-/*!
- \overload int QString::find (char c, int index, bool cs) const
-
-*/
-
-/*!
- \overload int QString::findRev (char c, int index, bool cs) const
-
-*/
-
-/*!
- Returns the number of times \a str occurs in the string.
-
- The match is case sensitive if \a cs is TRUE, or case insensitive if \e
- cs is FALSE.
-
- This function counts overlapping substrings, for example, "banana"
- contains two occurrences of "ana".
-
- \sa findRev()
-*/
-
-int QString::contains( const QString &str, bool cs ) const
-{
- int count = 0;
- const QChar *uc = unicode();
- if ( !uc )
- return 0;
- int len = str.length();
- int n = length();
- while ( n-- ) { // counts overlapping strings
- // ### Doesn't account for length of this - searches over "end"
- if ( cs ) {
- if ( ucstrncmp( uc, str.unicode(), len ) == 0 )
- count++;
- } else {
- if ( ucstrnicmp(uc, str.unicode(), len) == 0 )
- count++;
- }
- uc++;
- }
- return count;
-}
-
-/*!
- Returns a substring that contains the \a len leftmost characters
- of the string.
-
- The whole string is returned if \a len exceeds the length of the
- string.
-
-
- Example:
- \code
- QString s = "Pineapple";
- QString t = s.left( 4 ); // t == "Pine"
- \endcode
-
- \sa right(), mid(), isEmpty()
-*/
-
-QString QString::left( uint len ) const
-{
- if ( isEmpty() ) {
- return QString();
- } else if ( len == 0 ) { // ## just for 1.x compat:
- return QString::fromLatin1("");
- } else if ( len > length() ) {
- return *this;
- } else {
- QString s( len, TRUE );
- memcpy( s.d->unicode, d->unicode, len*sizeof(QChar) );
- s.d->len = len;
- return s;
- }
-}
-
-/*!
- Returns a substring that contains the \a len rightmost characters
- of the string.
-
- The whole string is returned if \a len exceeds the length of the
- string.
-
- Example:
- \code
- QString s = "Pineapple";
- QString t = s.right( 5 ); // t == "apple"
- \endcode
-
- \sa left(), mid(), isEmpty()
-*/
-
-QString QString::right( uint len ) const
-{
- if ( isEmpty() ) {
- return QString();
- } else if ( len == 0 ) { // ## just for 1.x compat:
- return QString::fromLatin1("");
- } else {
- uint l = length();
- if ( len > l )
- len = l;
- QString s( len, TRUE );
- memcpy( s.d->unicode, d->unicode+(l-len), len*sizeof(QChar) );
- s.d->len = len;
- return s;
- }
-}
-
-/*!
- Returns a substring that contains the \a len characters of this
- string, starting at position \a index.
-
- Returns a null string if the string is empty or \a index is out
- of range. Returns the whole string from \a index if \a index+len exceeds
- the length of the string.
-
- Example:
- \code
- QString s = "Five pineapples";
- QString t = s.mid( 5, 4 ); // t == "pine"
- \endcode
-
- \sa left(), right()
-*/
-
-QString QString::mid( uint index, uint len ) const
-{
- uint slen = length();
- if ( isEmpty() || index >= slen ) {
- return QString();
- } else if ( len == 0 ) { // ## just for 1.x compat:
- return QString::fromLatin1("");
- } else {
- if ( len > slen-index )
- len = slen - index;
- if ( index == 0 && len == length() )
- return *this;
- register const QChar *p = unicode()+index;
- QString s( len, TRUE );
- memcpy( s.d->unicode, p, len*sizeof(QChar) );
- s.d->len = len;
- return s;
- }
-}
-
-/*!
- Returns a string of length \a width that contains this
- string and padded by the \a fill character.
-
- If the length of the string exceeds \a width and \a truncate is FALSE,
- then the returned string is a copy of the string.
- If the length of the string exceeds \a width and \a truncate is TRUE,
- then the returned string is a left(\a width).
-
- Example:
- \code
- QString s("apple");
- QString t = s.leftJustify(8, '.'); // t == "apple..."
- \endcode
-
- \sa rightJustify()
-*/
-
-QString QString::leftJustify( uint width, QChar fill, bool truncate ) const
-{
- QString result;
- int len = length();
- int padlen = width - len;
- if ( padlen > 0 ) {
- result.setLength(len+padlen);
- if ( len )
- memcpy( result.d->unicode, unicode(), sizeof(QChar)*len );
- QChar* uc = result.d->unicode + len;
- while (padlen--)
- *uc++ = fill;
- } else {
- if ( truncate )
- result = left( width );
- else
- result = *this;
- }
- return result;
-}
-
-/*!
- Returns a string of length \a width that contains pad
- characters followed by the string.
-
- If the length of the string exceeds \a width and \a truncate is FALSE,
- then the returned string is a copy of the string.
- If the length of the string exceeds \a width and \a truncate is TRUE,
- then the returned string is a left(\a width).
-
- Example:
- \code
- QString s("pie");
- QString t = s.rightJustify(8, '.'); // t == ".....pie"
- \endcode
-
- \sa leftJustify()
-*/
-
-QString QString::rightJustify( uint width, QChar fill, bool truncate ) const
-{
- QString result;
- int len = length();
- int padlen = width - len;
- if ( padlen > 0 ) {
- result.setLength( len+padlen );
- QChar* uc = result.d->unicode;
- while (padlen--)
- *uc++ = fill;
- if ( len )
- memcpy( uc, unicode(), sizeof(QChar)*len );
- } else {
- if ( truncate )
- result = left( width );
- else
- result = *this;
- }
- return result;
-}
-
-/*!
- Returns a new string that is the string converted to lower case.
-
- Example:
- \code
- QString s("TeX");
- QString t = s.lower(); // t == "tex"
- \endcode
-
- \sa upper()
-*/
-
-QString QString::lower() const
-{
- QString s(*this);
- int l=length();
- if ( l ) {
- s.real_detach(); // could do this only when we find a change
- register QChar *p=s.d->unicode;
- if ( p ) {
- while ( l-- ) {
- *p = p->lower();
- p++;
- }
- }
- }
- return s;
-}
-
-/*!
- Returns a new string that is the string converted to upper case.
-
- Example:
- \code
- QString s("TeX");
- QString t = s.upper(); // t == "TEX"
- \endcode
-
- \sa lower()
-*/
-
-QString QString::upper() const
-{
- QString s(*this);
- int l=length();
- if ( l ) {
- s.real_detach(); // could do this only when we find a change
- register QChar *p=s.d->unicode;
- if ( p ) {
- while ( l-- ) {
- *p = p->upper();
- p++;
- }
- }
- }
- return s;
-}
-
-
-/*!
- Returns a new string that has white space removed from the start and the end.
-
- White space means any character for which QChar::isSpace() returns
- TRUE. This includes ASCII characters 9 (TAB), 10 (LF), 11 (VT), 12
- (FF), 13 (CR), and 32 (Space).
-
- Example:
- \code
- QString s = " space ";
- QString t = s.stripWhiteSpace(); // t == "space"
- \endcode
-
- \sa simplifyWhiteSpace()
-*/
-
-QString QString::stripWhiteSpace() const
-{
- if ( isEmpty() ) // nothing to do
- return *this;
- if ( !at(0).isSpace() && !at(length()-1).isSpace() )
- return *this;
-
- register const QChar *s = unicode();
- QString result = fromLatin1("");
-
- int start = 0;
- int end = length() - 1;
- while ( start<=end && s[start].isSpace() ) // skip white space from start
- start++;
- if ( start > end ) { // only white space
- return result;
- }
- while ( end && s[end].isSpace() ) // skip white space from end
- end--;
- int l = end - start + 1;
- result.setLength( l );
- if ( l )
- memcpy( result.d->unicode, &s[start], sizeof(QChar)*l );
- return result;
-}
-
-
-/*!
- Returns a new string that has white space removed from the start and the end,
- plus any sequence of internal white space replaced with a single space
- (ASCII 32).
-
- White space means any character for which QChar::isSpace() returns
- TRUE. This includes ASCII characters 9 (TAB), 10 (LF), 11 (VT), 12
- (FF), 13 (CR), and 32 (Space).
-
- \code
- QString s = " lots\t of\nwhite space ";
- QString t = s.simplifyWhiteSpace(); // t == "lots of white space"
- \endcode
-
- \sa stripWhiteSpace()
-*/
-
-QString QString::simplifyWhiteSpace() const
-{
- if ( isEmpty() ) // nothing to do
- return *this;
- QString result;
- result.setLength( length() );
- const QChar *from = unicode();
- const QChar *fromend = from+length();
- int outc=0;
- QChar *to = result.d->unicode;
- while ( TRUE ) {
- while ( from!=fromend && from->isSpace() )
- from++;
- while ( from!=fromend && !from->isSpace() )
- to[outc++] = *from++;
- if ( from!=fromend )
- to[outc++] = ' ';
- else
- break;
- }
- if ( outc > 0 && to[outc-1] == ' ' )
- outc--;
- result.truncate( outc );
- return result;
-}
-
-
-/*!
- Insert \a s into the string before position \a index.
-
- If \a index is beyond the end of the string, the string is extended with
- spaces (ASCII 32) to length \a index and \a s is then appended.
-
- \code
- QString s = "I like fish";
- s.insert( 2, "don't "); // s == "I don't like fish"
- s = "x";
- s.insert( 3, "yz" ); // s == "x yz"
- \endcode
-*/
-
-QString &QString::insert( uint index, const QString &s )
-{
- // the sub function takes care of &s == this case.
- return insert( index, s.unicode(), s.length() );
-}
-
-/*!
- Insert \a len units of QChar data from \a s into the string before
- position \a index.
-*/
-
-QString &QString::insert( uint index, const QChar* s, uint len )
-{
- if ( len == 0 )
- return *this;
- uint olen = length();
- int nlen = olen + len;
-
- int df = s - d->unicode; // ### pointer subtraction, cast down to int
- if ( df >= 0 && (uint)df < d->maxl ) {
- // Part of me - take a copy.
- QChar *tmp = QT_ALLOC_QCHAR_VEC( len );
- memcpy(tmp,s,len*sizeof(QChar));
- insert(index,tmp,len);
- QT_DELETE_QCHAR_VEC( tmp );
- return *this;
- }
-
- if ( index >= olen ) { // insert after end of string
- setLength( len+index );
- int n = index-olen;
- QChar* uc = d->unicode+olen;
- while (n--)
- *uc++ = ' ';
- memcpy( d->unicode+index, s, sizeof(QChar)*len );
- } else { // normal insert
- setLength( nlen );
- memmove( d->unicode+index+len, unicode()+index,
- sizeof(QChar)*(olen-index) );
- memcpy( d->unicode+index, s, sizeof(QChar)*len );
- }
- return *this;
-}
-
-/*!
- Insert \a c into the string at (before) position \a index and returns
- a reference to the string.
-
- If \a index is beyond the end of the string, the string is extended with
- spaces (ASCII 32) to length \a index and \a c is then appended.
-
- Example:
- \code
- QString s = "Ys";
- s.insert( 1, 'e' ); // s == "Yes"
- s.insert( 3, '!'); // s == "Yes!"
- \endcode
-
- \sa remove(), replace()
-*/
-
-QString &QString::insert( uint index, QChar c ) // insert char
-{
- QString s( c );
- return insert( index, s );
-}
-
-/*!
- \overload QString& QString::insert( uint index, char c )
-*/
-
-/*!
- \fn QString &QString::prepend( const QString &s )
-
- Prepend \a s to the string. Equivalent to insert(0,s).
-
- \sa insert()
-*/
-
-/*!
- \fn QString& QString::prepend( char ch )
- Prepends \a ch to the string and returns a reference to the result.
-
- \sa insert()
- */
-
-/*!
- \fn QString& QString::prepend( QChar ch )
- Prepends \a ch to the string and returns a reference to the result.
-
- \sa insert()
- */
-
-
-/*!
- Removes \a len characters starting at position \a index from the
- string and returns a reference to the string.
-
- If \a index is too big, nothing happens. If \a index is valid, but
- \a len is too large, the rest of the string is removed.
-
- \code
- QString s = "Montreal";
- s.remove( 1, 4 );
- // s == "Meal"
- \endcode
-
- \sa insert(), replace()
-*/
-
-QString &QString::remove( uint index, uint len )
-{
- uint olen = length();
- if ( index + len >= olen ) { // range problems
- if ( index < olen ) { // index ok
- setLength( index );
- }
- } else if ( len != 0 ) {
- real_detach();
- memmove( d->unicode+index, d->unicode+index+len,
- sizeof(QChar)*(olen-index-len) );
- setLength( olen-len );
- }
- return *this;
-}
-
-/*!
- Replaces \a len characters starting at position \a index from the
- string with \a s, and returns a reference to the string.
-
- If \a index is too big, nothing is deleted and \a s is inserted at the
- end of the string. If \a index is valid, but \a len is too large, \e
- str replaces the rest of the string.
-
- \code
- QString s = "Say yes!";
- s.replace( 4, 3, "NO" ); // s == "Say NO!"
- \endcode
-
- \sa insert(), remove()
-*/
-
-QString &QString::replace( uint index, uint len, const QString &s )
-{
- return replace( index, len, s.unicode(), s.length() );
-}
-
-
-/*!
- Replaces \a len characters starting at position \a index by
- \a slen units ot QChar data from \a s, and returns a reference to the string.
-
- \sa insert(), remove()
-*/
-
-QString &QString::replace( uint index, uint len, const QChar* s, uint slen )
-{
- if ( len == slen && index + len <= length() ) {
- // Optimized common case: replace without size change
- real_detach();
- memcpy( d->unicode+index, s, len*sizeof(QChar) );
- } else {
- int df = s - d->unicode; // ### pointer subtraction, cast down to int
- if ( df >= 0 && (uint)df < d->maxl ) {
- // Part of me - take a copy.
- QChar *tmp = QT_ALLOC_QCHAR_VEC( slen );
- memcpy(tmp,s,slen*sizeof(QChar));
- replace(index,len,tmp,slen);
- QT_DELETE_QCHAR_VEC( tmp );
- return *this;
- }
-
- remove( index, len );
- insert( index, s, slen );
- }
- return *this;
-}
-
-
-
-/*!
- Finds the first occurrence of the regular expression \a rx, starting at
- position \a index. If \a index is -1, the search starts at the last
- character; if -2, at the next to last character; etc.
-
- Returns the position of the next match, or -1 if \a rx was not found.
-
- \sa findRev() replace() contains()
-*/
-
-int QString::find( const QRegExp &rx, int index ) const
-{
- if ( index < 0 )
- index += length();
- return rx.match( *this, index );
-}
-
-/*!
- Finds the first occurrence of the regular expression \a rx, starting at
- position \a index and searching backwards. If \a index is -1, the
- search starts at the last character; if -2, at the next to last
- character; etc.
-
- Returns the position of the next match (backwards), or -1 if \a rx was not
- found.
-
- \sa find()
-*/
-
-int QString::findRev( const QRegExp &rx, int index ) const
-{
- if ( index < 0 ) // neg index ==> start from end
- index += length();
- if ( (uint)index > length() ) // bad index
- return -1;
- while( index >= 0 ) {
- if ( rx.match( *this, index ) == index )
- return index;
- index--;
- }
- return -1;
-}
-
-/*!
- Counts the number of overlapping occurrences of \a rx in the string.
-
- Example:
- \code
- QString s = "banana and panama";
- QRegExp r = QRegExp("a[nm]a", TRUE, FALSE);
- s.contains( r ); // 4 matches
- \endcode
-
- \sa find() findRev()
-*/
-
-int QString::contains( const QRegExp &rx ) const
-{
- if ( isEmpty() )
- return rx.match( *this ) < 0 ? 0 : 1;
- int count = 0;
- int index = -1;
- int len = length();
- while ( index < len-1 ) { // count overlapping matches
- index = rx.match( *this, index+1 );
- if ( index < 0 )
- break;
- count++;
- }
- return count;
-}
-
-
-/*!
- Replaces every occurrence of \a rx in the string with \a str.
- Returns a reference to the string.
-
- Examples:
- \code
- QString s = "banana";
- s.replace( QRegExp("a.*a"), "" ); // becomes "b"
-
- QString s = "banana";
- s.replace( QRegExp("^[bn]a"), " " ); // becomes " nana"
-
- QString s = "banana";
- s.replace( QRegExp("^[bn]a"), "" ); // NOTE! becomes ""
- \endcode
-
- \sa find() findRev()
-*/
-
-QString &QString::replace( const QRegExp &rx, const QString &str )
-{
- if ( isEmpty() )
- return *this;
- int index = 0;
- int slen = str.length();
- int len;
- while ( index < (int)length() ) {
- index = rx.match( *this, index, &len, FALSE );
- if ( index >= 0 ) {
- replace( index, len, str );
- index += slen;
- if ( !len )
- break; // Avoid infinite loop on 0-length matches, e.g. [a-z]*
- }
- else
- break;
- }
- return *this;
-}
-
-static bool
-ok_in_base( QChar c, int base )
-{
- if ( base <= 10 )
- return c.isDigit() && c.digitValue() < base;
- else
- return c.isDigit() || (c >= 'a' && c < char('a'+base-10))
- || (c >= 'A' && c < char('A'+base-10));
-}
-
-/*!
- Returns the string converted to a <code>long</code> value.
-
- If \a ok is non-null, \a *ok is set to TRUE if there are no
- conceivable errors, and FALSE if the string is not a number at all, or if
- it has trailing garbage.
-*/
-
-long QString::toLong( bool *ok, int base ) const
-{
- const QChar *p = unicode();
- long val=0;
- int l = length();
- const long max_mult = INT_MAX / base;
- bool is_ok = FALSE;
- int neg = 0;
- if ( !p )
- goto bye;
- while ( l && p->isSpace() ) // skip leading space
- l--,p++;
- if ( l && *p == '-' ) {
- l--;
- p++;
- neg = 1;
- } else if ( *p == '+' ) {
- l--;
- p++;
- }
-
- // NOTE: toULong() code is similar
- if ( !l || !ok_in_base(*p,base) )
- goto bye;
- while ( l && ok_in_base(*p,base) ) {
- l--;
- int dv;
- if ( p->isDigit() ) {
- dv = p->digitValue();
- } else {
- if ( *p >= 'a' && *p <= 'z' )
- dv = *p - 'a' + 10;
- else
- dv = *p - 'A' + 10;
- }
- if ( val > max_mult || (val == max_mult && dv > (INT_MAX%base)+neg) )
- goto bye;
- val = base*val + dv;
- p++;
- }
- if ( neg )
- val = -val;
- while ( l && p->isSpace() ) // skip trailing space
- l--,p++;
- if ( !l )
- is_ok = TRUE;
-bye:
- if ( ok )
- *ok = is_ok;
- return is_ok ? val : 0;
-}
-
-/*!
- Returns the string converted to an <code>unsigned long</code>
- value.
-
- If \a ok is non-null, \a *ok is set to TRUE if there are no
- conceivable errors, and FALSE if the string is not a number at all,
- or if it has trailing garbage.
-*/
-
-ulong QString::toULong( bool *ok, int base ) const
-{
- const QChar *p = unicode();
- ulong val=0;
- int l = length();
- const ulong max_mult = 429496729; // UINT_MAX/10, rounded down
- bool is_ok = FALSE;
- if ( !p )
- goto bye;
- while ( l && p->isSpace() ) // skip leading space
- l--,p++;
- if ( *p == '+' )
- l--,p++;
-
- // NOTE: toLong() code is similar
- if ( !l || !ok_in_base(*p,base) )
- goto bye;
- while ( l && ok_in_base(*p,base) ) {
- l--;
- uint dv;
- if ( p->isDigit() ) {
- dv = p->digitValue();
- } else {
- if ( *p >= 'a' && *p <= 'z' )
- dv = *p - 'a' + 10;
- else
- dv = *p - 'A' + 10;
- }
- if ( val > max_mult || (val == max_mult && dv > (UINT_MAX%base)) )
- goto bye;
- val = base*val + dv;
- p++;
- }
-
- while ( l && p->isSpace() ) // skip trailing space
- l--,p++;
- if ( !l )
- is_ok = TRUE;
-bye:
- if ( ok )
- *ok = is_ok;
- return is_ok ? val : 0;
-}
-
-/*!
- Returns the string converted to a <code>short</code> value.
-
- If \a ok is non-null, \a *ok is set to TRUE if there are no
- conceivable errors, and FALSE if the string is not a number at all, or if
- it has trailing garbage.
-*/
-
-short QString::toShort( bool *ok, int base ) const
-{
- long v = toLong( ok, base );
- if ( ok && *ok && (v < -32768 || v > 32767) ) {
- *ok = FALSE;
- v = 0;
- }
- return (short)v;
-}
-
-/*!
- Returns the string converted to an <code>unsigned short</code> value.
-
- If \a ok is non-null, \a *ok is set to TRUE if there are no
- conceivable errors, and FALSE if the string is not a number at all, or if
- it has trailing garbage.
-*/
-
-ushort QString::toUShort( bool *ok, int base ) const
-{
- ulong v = toULong( ok, base );
- if ( ok && *ok && (v > 65535) ) {
- *ok = FALSE;
- v = 0;
- }
- return (ushort)v;
-}
-
-
-/*!
- Returns the string converted to a <code>int</code> value.
-
- \code
- QString str("FF");
- bool ok;
- int hex = str.toInt( &ok, 16 ); // will return 255, and ok set to TRUE
- int dec = str.toInt( &ok, 10 ); // will return 0, and ok set to FALSE
- \endcode
-
- If \a ok is non-null, \a *ok is set to TRUE if there are no
- conceivable errors, and FALSE if the string is not a number at all,
- or if it has trailing garbage.
-*/
-
-int QString::toInt( bool *ok, int base ) const
-{
- return (int)toLong( ok, base );
-}
-
-/*!
- Returns the string converted to an <code>unsigned int</code> value.
-
- If \a ok is non-null, \a *ok is set to TRUE if there are no
- conceivable errors, and FALSE if the string is not a number at all,
- or if it has trailing garbage.
-*/
-
-uint QString::toUInt( bool *ok, int base ) const
-{
- return (uint)toULong( ok, base );
-}
-
-/*!
- Returns the string converted to a <code>double</code> value.
-
- If \a ok is non-null, \a *ok is set to TRUE if there are no conceivable
- errors, and FALSE if the string is not a number at all, or if it has
- trailing garbage.
-*/
-
-double QString::toDouble( bool *ok ) const
-{
- char *end;
-
- QCString a = latin1();
- // Just latin1() is not sufficient, since U0131 would look like '1'.
- for (uint i=0; i<d->len; i++)
- if ( d->unicode[i].row() )
- a[(int)i]='z';
-
- double val = strtod( a.data() ? a.data() : "", &end );
- if ( ok )
- *ok = ( a && *a && ( end == 0 || *end == '\0' ) );
- return val;
-}
-
-/*!
- Returns the string converted to a <code>float</code> value.
-
- If \a ok is non-null, \a *ok is set to TRUE if there are no
- conceivable errors, and FALSE if the string is not a number at all,
- or if it has trailing garbage.
-*/
-
-float QString::toFloat( bool *ok ) const
-{
- return (float)toDouble( ok );
-}
-
-
-/*!
- Sets the string to the printed value of \a n and returns a
- reference to the string.
-
- The value is converted to \a base notation (default is decimal).
- The base must be a value from 2 to 36.
-*/
-
-QString &QString::setNum( long n, int base )
-{
-#if defined(CHECK_RANGE)
- if ( base < 2 || base > 36 ) {
- qWarning( "QString::setNum: Invalid base %d", base );
- base = 10;
- }
-#endif
- char charbuf[65*sizeof(QChar)];
- QChar *buf = (QChar*)charbuf;
- QChar *p = &buf[64];
- int len = 0;
- bool neg;
- if ( n < 0 ) {
- neg = TRUE;
- if ( n == INT_MIN ) {
- // Cannot always negate this special case
- QString s1, s2;
- s1.setNum(n/base);
- s2.setNum((-(n+base))%base);
- *this = s1 + s2;
- return *this;
- }
- n = -n;
- } else {
- neg = FALSE;
- }
- do {
- *--p = "0123456789abcdefghijklmnopqrstuvwxyz"[((int)(n%base))];
- n /= base;
- len++;
- } while ( n );
- if ( neg ) {
- *--p = '-';
- len++;
- }
- return setUnicode( p, len );
-}
-
-/*!
- Sets the string to the printed unsigned value of \a n and
- returns a reference to the string.
-
- The value is converted to \a base notation (default is decimal).
- The base must be a value from 2 to 36.
-*/
-
-QString &QString::setNum( ulong n, int base )
-{
-#if defined(CHECK_RANGE)
- if ( base < 2 || base > 36 ) {
- qWarning( "QString::setNum: Invalid base %d", base );
- base = 10;
- }
-#endif
- char charbuf[65*sizeof(QChar)];
- QChar *buf = (QChar*)charbuf;
- QChar *p = &buf[64];
- int len = 0;
- do {
- *--p = "0123456789abcdefghijklmnopqrstuvwxyz"[((int)(n%base))];
- n /= base;
- len++;
- } while ( n );
- return setUnicode(p,len);
-}
-
-/*!
- \fn QString &QString::setNum( int n, int base )
- Sets the string to the printed value of \a n and returns a reference
- to the string.
-*/
-
-/*!
- \fn QString &QString::setNum( uint n, int base )
- Sets the string to the printed unsigned value of \a n and returns a
- reference to the string.
-*/
-
-/*!
- \fn QString &QString::setNum( short n, int base )
- Sets the string to the printed value of \a n and returns a reference
- to the string.
-*/
-
-/*!
- \fn QString &QString::setNum( ushort n, int base )
- Sets the string to the printed unsigned value of \a n and returns a
- reference to the string.
-*/
-
-/*! Sets the string to the printed value of \a n, formatted in the \a f
- format with \a prec precision, and returns a reference to the
- string.
-
- \a f can be 'f', 'F', 'e', 'E', 'g' or 'G', all of which have the
- same meaning as for sprintf().
-*/
-
-QString &QString::setNum( double n, char f, int prec )
-{
-#if defined(CHECK_RANGE)
- if ( !(f=='f' || f=='F' || f=='e' || f=='E' || f=='g' || f=='G') ) {
- qWarning( "QString::setNum: Invalid format char '%c'", f );
- f = 'f';
- }
-#endif
- char format[20];
- char buf[120]; // enough for 99 precision?
- char *fs = format; // generate format string
- *fs++ = '%'; // "%.<prec>l<f>"
- if ( prec >= 0 ) {
- if ( prec > 99 ) // buf big enough for precision?
- prec = 99;
- *fs++ = '.';
- if ( prec >= 10 ) {
- *fs++ = prec / 10 + '0';
- *fs++ = prec % 10 + '0';
- } else {
- *fs++ = prec + '0';
- }
- }
- *fs++ = 'l';
- *fs++ = f;
- *fs = '\0';
- ::sprintf( buf, format, n );
- return setLatin1(buf);
-}
-
-/*!
- \overload QString &QString::setNum( float n, char f, int prec )
-*/
-
-
-/*!
- A convenience factory function that returns a string representation
- of the number \a n.
-
- \sa setNum()
- */
-QString QString::number( long n, int base )
-{
- QString s;
- s.setNum( n, base );
- return s;
-}
-
-/*!
- A convenience factory function that returns a string representation
- of the number \a n.
-
- \sa setNum()
- */
-QString QString::number( ulong n, int base )
-{
- QString s;
- s.setNum( n, base );
- return s;
-}
-
-/*!
- A convenience factory function that returns a string representation
- of the number \a n.
-
- \sa setNum()
- */
-QString QString::number( int n, int base )
-{
- QString s;
- s.setNum( n, base );
- return s;
-}
-
-/*!
- A convenience factory function that returns a string representation
- of the number \a n.
-
- \sa setNum()
- */
-QString QString::number( uint n, int base )
-{
- QString s;
- s.setNum( n, base );
- return s;
-}
-
-/*!
- This static function returns the printed value of \a n, formatted in the
- \a f format with \a prec precision.
-
- \a f can be 'f', 'F', 'e', 'E', 'g' or 'G', all of which have the
- same meaning as for sprintf().
-
- \sa setNum()
- */
-QString QString::number( double n, char f, int prec )
-{
- QString s;
- s.setNum( n, f, prec );
- return s;
-}
-
-
-/*! \obsolete
-
- Sets the character at position \a index to \a c and expands the
- string if necessary, filling with spaces.
-
- This method is redundant in Qt 2.x, because operator[] will expand
- the string as necessary.
-*/
-
-void QString::setExpand( uint index, QChar c )
-{
- int spaces = index - d->len;
- at(index) = c;
- while (spaces-->0)
- d->unicode[--index]=' ';
-}
-
-
-/*!
- \fn const char* QString::data() const
-
- \obsolete
-
- Returns a pointer to a 0-terminated classic C string.
-
- In Qt 1.x, this returned a char* allowing direct manipulation of the
- string as a sequence of bytes. In Qt 2.x where QString is a Unicode
- string, char* conversion constructs a temporary string, and hence
- direct character operations are meaningless.
-*/
-
-/*!
- \fn bool QString::operator!() const
- Returns TRUE if it is a null string, otherwise FALSE. Thus
- you can write:
-
-\code
- QString name = getName();
- if ( !name )
- name = "Rodney";
-\endcode
-
- Note that if you say:
-
-\code
- QString name = getName();
- if ( name )
- doSomethingWith(name);
-\endcode
-
- Then this will call <tt>operator const char*()</tt>, which will do what
- you want, but rather inefficiently - you may wish to define the macro
- QT_NO_ASCII_CAST when writing code which you wish to strictly remain
- Unicode-clean.
-
- When you want the above semantics, use <tt>!isNull()</tt>
- or even <tt>!!</tt>:
-
-\code
- QString name = getName();
- if ( !!name )
- doSomethingWith(name);
-\endcode
-*/
-
-
-/*!
- \fn QString& QString::append( const QString& str )
- Appends \a str to the string and returns a reference to the result.
- Equivalent to operator+=().
- */
-
-/*!
- \fn QString& QString::append( char ch )
- Appends \a ch to the string and returns a reference to the result.
- Equivalent to operator+=().
- */
-
-/*!
- \fn QString& QString::append( QChar ch )
- Appends \a ch to the string and returns a reference to the result.
- Equivalent to operator+=().
- */
-
-/*!
- Appends \a str to the string and returns a reference to the string.
-*/
-QString& QString::operator+=( const QString &str )
-{
- uint len1 = length();
- uint len2 = str.length();
- if ( len2 ) {
- setLength(len1+len2);
- memcpy( d->unicode+len1, str.unicode(), sizeof(QChar)*len2 );
- } else if ( isNull() && !str.isNull() ) { // ## just for 1.x compat:
- *this = fromLatin1("");
- }
- return *this;
-}
-
-/*!
- Appends \a c to the string and returns a reference to the string.
-*/
-
-QString &QString::operator+=( QChar c )
-{
- setLength(length()+1);
- d->unicode[length()-1] = c;
- return *this;
-}
-
-/*!
- Appends \a c to the string and returns a reference to the string.
-*/
-
-QString &QString::operator+=( char c )
-{
- setLength(length()+1);
- d->unicode[length()-1] = c;
- return *this;
-}
-
-
-
-/*! \fn char QChar::latin1() const
-
- Returns a latin-1 copy of this character, if this character is in
- the latin-1 character set. If not, this function returns 0.
-*/
-
-
-/*!
- Returns a Latin-1 representation of the string. Note that the returned
- value is undefined if the string contains non-Latin-1 characters. If you
- want to convert strings into formats other than Unicode, see the
- QTextCodec classes.
-
- This function is mainly useful for boot-strapping legacy code to
- use Unicode.
-
- The result remains valid so long as one unmodified
- copy of the source string exists.
-
- \sa utf8(), local8Bit()
-*/
-const char* QString::latin1() const
-{
- if ( d->ascii ) {
- if ( d->dirtyascii )
- delete [] d->ascii;
- else
- return d->ascii;
- }
- Q2HELPER(stat_get_ascii++)
- Q2HELPER(stat_get_ascii_size+=d->len)
- d->ascii = unicodeToAscii( d->unicode, d->len );
- d->dirtyascii = 0;
- return d->ascii;
-}
-
-/*! \obsolete
-
- This functions simply calls latin1() and returns the result.
-*/
-const char* QString::ascii() const
-{
- return latin1();
-}
-
-#ifndef QT_NO_TEXTCODEC
-/*!
- Returns the string encoded in UTF8 format.
-
- See QTextCodec for more diverse coding/decoding of Unicode strings.
-
- \sa QString::fromUtf8(), local8Bit(), latin1()
-*/
-QCString QString::utf8() const
-{
- static QTextCodec* codec = QTextCodec::codecForMib(106);
- return codec
- ? codec->fromUnicode(*this)
- : QCString(latin1());
-}
-
-/*!
- Returns the unicode string decoded from the
- first \a len bytes of \a utf8. If \a len is -1 (the default), the
- length of \a utf8 is used. If trailing partial characters are in
- \a utf8, they are ignored.
-
- See QTextCodec for more diverse coding/decoding of Unicode strings.
-*/
-QString QString::fromUtf8(const char* utf8, int len)
-{
- static QTextCodec* codec = QTextCodec::codecForMib(106);
- if ( len < 0 ) len = qstrlen(utf8);
- return codec
- ? codec->toUnicode(utf8, len)
- : QString::fromLatin1(utf8, len);
-}
-#endif // QT_NO_TEXTCODEC
-/*!
- Creates a QString from Latin1 text. This is the same as the
- QString(const char*) constructor, but you can make that constructor
- invisible if you compile with the define QT_NO_CAST_ASCII, in which
- case you can explicitly create a QString from Latin-1 text using
- this function.
-*/
-QString QString::fromLatin1(const char* chars, int len)
-{
- uint l;
- QChar *uc;
- if ( len < 0 ) {
- uc = internalAsciiToUnicode(chars,&l);
- } else {
- uc = internalAsciiToUnicode(chars,&l,len);
- }
- return QString(new QStringData(uc,l,l), TRUE);
-}
-
-/*!
- \fn const QChar* QString::unicode() const
-
- Returns the Unicode representation of the string. The result
- remains valid until the string is modified.
-*/
-
-/*!
- Returns the string encoded in a locale-specific format. On X11, this
- is the QTextCodec::codecForLocale(). On Windows, it is a system-defined
- encoding.
-
- See QTextCodec for more diverse coding/decoding of Unicode strings.
-
- \sa QString::fromLocal8Bit(), latin1(), utf8()
-*/
-
-
-QCString QString::local8Bit() const
-{
-#ifdef QT_NO_TEXTCODEC
- return latin1();
-#else
-#ifdef _WS_X11_
- static QTextCodec* codec = QTextCodec::codecForLocale();
- return codec
- ? codec->fromUnicode(*this)
- : QCString(latin1());
-#endif
-#ifdef _WS_MAC_
- static QTextCodec* codec = QTextCodec::codecForLocale();
- return codec
- ? codec->fromUnicode(*this)
- : QCString(latin1());
-#endif
-#ifdef _WS_WIN_
- return qt_winQString2MB( *this );
-#endif
-#ifdef _WS_QWS_
- return utf8(); // ##### if there is ANY 8 bit format supported?
-#endif
-#endif
-}
-
-/*!
- Returns the unicode string decoded from the
- first \a len bytes of \a local8Bit. If \a len is -1 (the default), the
- length of \a local8Bit is used. If trailing partial characters are in
- \a local8Bit, they are ignored.
-
- \a local8Bit is assumed to be encoded in a locale-specific format.
-
- See QTextCodec for more diverse coding/decoding of Unicode strings.
-*/
-QString QString::fromLocal8Bit(const char* local8Bit, int len)
-{
-#ifdef QT_NO_TEXTCODEC
- return fromLatin1( local8Bit, len );
-#else
-
- if ( !local8Bit )
- return QString::null;
-#ifdef _WS_X11_
- static QTextCodec* codec = QTextCodec::codecForLocale();
- if ( len < 0 ) len = qstrlen(local8Bit);
- return codec
- ? codec->toUnicode(local8Bit, len)
- : QString::fromLatin1(local8Bit,len);
-#endif
-#ifdef _WS_MAC_
- static QTextCodec* codec = QTextCodec::codecForLocale();
- if ( len < 0 ) len = qstrlen(local8Bit);
- return codec
- ? codec->toUnicode(local8Bit, len)
- : QString::fromLatin1(local8Bit,len);
-#endif
-// Should this be OS_WIN32?
-#ifdef _WS_WIN_
- if ( len >= 0 ) {
- QCString s(local8Bit,len+1);
- return qt_winMB2QString(s);
- }
- return qt_winMB2QString( local8Bit );
-#endif
-#ifdef _WS_QWS_
- return fromUtf8(local8Bit,len);
-#endif
-#endif // QT_NO_TEXTCODEC
-}
-
-/*!
- \fn QString::operator const char *() const
-
- Returns latin1(). Be sure to see the warnings documented there.
- Note that for new code which you wish to be strictly Unicode-clean,
- you can define the macro QT_NO_ASCII_CAST when compiling your code
- to hide this function so that automatic casts are not done. This
- has the added advantage that you catch the programming error
- described under operator!().
-*/
-
-/*!
- \fn QChar QString::at( uint ) const
-
- Returns the character at \a i, or 0 if \a i is beyond the length
- of the string.
-
- Note: If this QString is not const or const&, the non-const at()
- will be used instead, which will expand the string if \a i is beyond
- the length of the string.
-*/
-
-/*!
- \fn QChar QString::constref(uint i) const
- Equivalent to at(i), this returns the QChar at \a i by value.
-
- \sa ref()
-*/
-
-/*!
- \fn QChar& QString::ref(uint i)
- Returns the QChar at \a i by reference.
-
- \sa constref()
-*/
-
-/*!
- \fn QChar QString::operator[](int) const
-
- Returns the character at \a i, or QChar::null if \a i is beyond the
- length of the string.
-
- Note: If this QString is not const or const&, the non-const operator[]
- will be used instead, which will expand the string if \a i is beyond
- the length of the string.
-*/
-
-/*!
- \fn QCharRef QString::operator[](int)
-
- Returns an object that references the character at \a i.
- This reference
- can then be assigned to, or otherwise used immediately, but
- becomes invalid once further modifications are made to the string.
- The QCharRef internal class can be used much like a constant QChar, but
- if you assign to it, you change the original string (which enlarges
- and detaches itself). You will get compilation errors if you try to
- use the result as anything but a QChar.
-*/
-
-/*!
- \fn QCharRef QString::at( uint i )
- Returns a reference to the character at \a i, expanding
- the string with QChar::null if necessary. The resulting reference
- can then be assigned to, or otherwise used immediately, but
- becomes invalid once further modifications are made to the string.
-*/
-
-/*!
- Internal chunk of code to handle the
- uncommon cases of at() above.
-*/
-void QString::subat( uint i )
-{
- uint olen = d->len;
- if ( i >= olen ) {
- setLength( i+1 ); // i is index; i+1 is needed length
- for ( uint j=olen; j<=i; j++ )
- d->unicode[j] = QChar::null;
- } else {
- // Just be sure to detach
- real_detach();
- }
-}
-
-
-/*!
- Resizes the string to \a len unicode characters and copies \a unicode
- into the string. If \a unicode is null, nothing is copied, but the
- string is resized to \a len anyway. If \a len is zero, the string
- becomes a \link isNull() null\endlink string.
-
- \sa setLatin1(), isNull()
-*/
-
-QString& QString::setUnicode( const QChar *unicode, uint len )
-{
- if ( len == 0 ) { // set to null string
- if ( d != shared_null ) { // beware of nullstring being set to nullstring
- deref();
- d = shared_null ? shared_null : makeSharedNull();
- d->ref();
- }
- } else if ( d->count != 1 || len > d->maxl ||
- ( len*4 < d->maxl && d->maxl > 4 ) ) { // detach, grown or shrink
- Q2HELPER(stat_copy_on_write++)
- Q2HELPER(stat_copy_on_write_size+=d->len)
- uint newMax = 4;
- while ( newMax < len )
- newMax *= 2;
- QChar* nd = QT_ALLOC_QCHAR_VEC( newMax );
- if ( unicode )
- memcpy( nd, unicode, sizeof(QChar)*len );
- deref();
- d = new QStringData( nd, len, newMax );
- } else {
- d->len = len;
- d->dirtyascii = 1;
- if ( unicode )
- memcpy( d->unicode, unicode, sizeof(QChar)*len );
- }
- return *this;
-}
-
-/*!
- Resizes the string to \a len unicode characters and copies
- \a unicode_as_ushorts into the string (on some X11 client
- platforms this will involve a byte-swapping pass).
-
- If \a unicode is null, nothing is copied, but the
- string is resized to \a len anyway. If \a len is zero, the string
- becomes a \link isNull() null\endlink string.
-
- \sa setLatin1(), isNull()
-*/
-QString& QString::setUnicodeCodes( const ushort* unicode_as_ushorts, uint len )
-{
- setUnicode((const QChar*)unicode_as_ushorts, len);
- QChar t(0x1234);
- if ( unicode_as_ushorts && *((ushort*)&t) == 0x3412 ) {
- // Need to byteswap
- char* b = (char*)d->unicode;
- while ( len-- ) {
- char c = b[0];
- b[0] = b[1];
- b[1] = c;
- b += sizeof(QChar);
- }
- }
- return *this;
-}
-
-
-/*!
- Sets this string to \a str, interpreted as a classic Latin 1 C string.
- If the \a len argument is negative (default), it is set to strlen(str).
-
- If \a str is 0 a null string is created. If \a str is "" an empty
- string is created.
-
- \sa isNull(), isEmpty()
-*/
-
-QString &QString::setLatin1( const char *str, int len )
-{
- if ( str == 0 )
- return setUnicode(0,0);
- if ( len < 0 )
- len = qstrlen(str);
- if ( len == 0 ) { // won't make a null string
- deref();
- uint l;
- QChar *uc = internalAsciiToUnicode(str,&l);
- d = new QStringData(uc,l,l);
- } else {
- setUnicode( 0, len ); // resize but not copy
- QChar *p = d->unicode;
- while ( len-- )
- *p++ = *str++;
- }
- return *this;
-}
-
-
-/*!
- \fn int QString::compare (const QString & s1, const QString & s2)
-
- Compare \a s1 to \a s2 returning an integer less than, equal to, or
- greater than zero if s1 is, respectively, lexically less than, equal to,
- or greater than s2.
-*/
-
-/*!
- Compares this string to \a s, returning an integer less than, equal to, or
- greater than zero if it is, respectively, lexically less than, equal to,
- or greater than \a s.
-*/
-int QString::compare( const QString& s ) const
-{
- return ucstrcmp(*this,s);
-}
-
-bool operator==( const QString &s1, const QString &s2 )
-{
- return (s1.length() == s2.length()) && s1.isNull() == s2.isNull() &&
- (memcmp((char*)s1.unicode(),(char*)s2.unicode(),
- s1.length()*sizeof(QChar)) ==0);
-}
-
-bool operator!=( const QString &s1, const QString &s2 )
-{ return !(s1==s2); }
-
-bool operator<( const QString &s1, const QString &s2 )
-{ return ucstrcmp(s1,s2) < 0; }
-
-bool operator<=( const QString &s1, const QString &s2 )
-{ return ucstrcmp(s1,s2) <= 0; }
-
-bool operator>( const QString &s1, const QString &s2 )
-{ return ucstrcmp(s1,s2) > 0; }
-
-bool operator>=( const QString &s1, const QString &s2 )
-{ return ucstrcmp(s1,s2) >= 0; }
-
-
-bool operator==( const QString &s1, const char *s2 )
-{ return s1==QString(s2); }
-
-bool operator==( const char *s1, const QString &s2 )
-{ return QString(s1)==s2; }
-
-bool operator!=( const QString &s1, const char *s2 )
-{ return !(s1==s2); }
-
-bool operator!=( const char *s1, const QString &s2 )
-{ return !(s1==s2); }
-
-bool operator<( const QString &s1, const char *s2 )
-{ return ucstrcmp(s1,s2) < 0; }
-
-bool operator<( const char *s1, const QString &s2 )
-{ return ucstrcmp(s1,s2) < 0; }
-
-bool operator<=( const QString &s1, const char *s2 )
-{ return ucstrcmp(s1,s2) <= 0; }
-
-bool operator<=( const char *s1, const QString &s2 )
-{ return ucstrcmp(s1,s2) <= 0; }
-
-bool operator>( const QString &s1, const char *s2 )
-{ return ucstrcmp(s1,s2) > 0; }
-
-bool operator>( const char *s1, const QString &s2 )
-{ return ucstrcmp(s1,s2) > 0; }
-
-bool operator>=( const QString &s1, const char *s2 )
-{ return ucstrcmp(s1,s2) >= 0; }
-
-bool operator>=( const char *s1, const QString &s2 )
-{ return ucstrcmp(s1,s2) >= 0; }
-
-
-/*****************************************************************************
- Documentation for QString related functions
- *****************************************************************************/
-
-/*!
- \fn bool operator==( const QString &s1, const QString &s2 )
- \relates QString
- Returns TRUE if the two strings are equal, or FALSE if they are different.
- A null string is different from an empty, non-null string.
-
- Equivalent to <code>qstrcmp(s1,s2) == 0</code>.
-*/
-
-/*!
- \fn bool operator==( const QString &s1, const char *s2 )
- \relates QString
- Returns TRUE if the two strings are equal, or FALSE if they are different.
-
- Equivalent to <code>qstrcmp(s1,s2) == 0</code>.
-*/
-
-/*!
- \fn bool operator==( const char *s1, const QString &s2 )
- \relates QString
- Returns TRUE if the two strings are equal, or FALSE if they are different.
-
- Equivalent to <code>qstrcmp(s1,s2) == 0</code>.
-*/
-
-/*!
- \fn bool operator!=( const QString &s1, const QString &s2 )
- \relates QString
- Returns TRUE if the two strings are different, or FALSE if they are equal.
-
- Equivalent to <code>qstrcmp(s1,s2) != 0</code>.
-*/
-
-/*!
- \fn bool operator!=( const QString &s1, const char *s2 )
- \relates QString
- Returns TRUE if the two strings are different, or FALSE if they are equal.
-
- Equivalent to <code>qstrcmp(s1,s2) != 0</code>.
-*/
-
-/*!
- \fn bool operator!=( const char *s1, const QString &s2 )
- \relates QString
- Returns TRUE if the two strings are different, or FALSE if they are equal.
-
- Equivalent to <code>qstrcmp(s1,s2) != 0</code>.
-*/
-
-/*!
- \fn bool operator<( const QString &s1, const char *s2 )
- \relates QString
- Returns TRUE if \a s1 is alphabetically less than \a s2, otherwise FALSE.
-
- Equivalent to <code>qstrcmp(s1,s2) \< 0</code>.
-*/
-
-/*!
- \fn bool operator<( const char *s1, const QString &s2 )
- \relates QString
- Returns TRUE if \a s1 is alphabetically less than \a s2, otherwise FALSE.
-
- Equivalent to <code>qstrcmp(s1,s2) \< 0</code>.
-*/
-
-/*!
- \fn bool operator<=( const QString &s1, const char *s2 )
- \relates QString
- Returns TRUE if \a s1 is alphabetically less than or equal to \a s2,
- otherwise FALSE.
-
- Equivalent to <code>qstrcmp(s1,s2) \<= 0</code>.
-*/
-
-/*!
- \fn bool operator<=( const char *s1, const QString &s2 )
- \relates QString
- Returns TRUE if \a s1 is alphabetically less than or equal to \a s2,
- otherwise FALSE.
-
- Equivalent to <code>qstrcmp(s1,s2) \<= 0</code>.
-*/
-
-/*!
- \fn bool operator>( const QString &s1, const char *s2 )
- \relates QString
- Returns TRUE if \a s1 is alphabetically greater than \a s2, otherwise FALSE.
-
- Equivalent to <code>qstrcmp(s1,s2) \> 0</code>.
-*/
-
-/*!
- \fn bool operator>( const char *s1, const QString &s2 )
- \relates QString
- Returns TRUE if \a s1 is alphabetically greater than \a s2, otherwise FALSE.
-
- Equivalent to <code>qstrcmp(s1,s2) \> 0</code>.
-*/
-
-/*!
- \fn bool operator>=( const QString &s1, const char *s2 )
- \relates QString
- Returns TRUE if \a s1 is alphabetically greater than or equal to \a s2,
- otherwise FALSE.
-
- Equivalent to <code>qstrcmp(s1,s2) \>= 0</code>.
-*/
-
-/*!
- \fn bool operator>=( const char *s1, const QString &s2 )
- \relates QString
- Returns TRUE if \a s1 is alphabetically greater than or equal to \a s2,
- otherwise FALSE.
-
- Equivalent to <code>qstrcmp(s1,s2) \>= 0</code>.
-*/
-
-/*!
- \fn QString operator+( const QString &s1, const QString &s2 )
- \relates QString
- Returns the concatenated string of s1 and s2.
-*/
-
-/*!
- \fn QString operator+( const QString &s1, const char *s2 )
- \relates QString
- Returns the concatenated string of s1 and s2.
-*/
-
-/*!
- \fn QString operator+( const char *s1, const QString &s2 )
- \relates QString
- Returns the concatenated string of s1 and s2.
-*/
-
-/*!
- \fn QString operator+( const QString &s, char c )
- \relates QString
- Returns the concatenated string of s and c.
-*/
-
-/*!
- \fn QString operator+( char c, const QString &s )
- \relates QString
- Returns the concatenated string of c and s.
-*/
-
-
-/*****************************************************************************
- QString stream functions
- *****************************************************************************/
-#ifndef QT_NO_DATASTREAM
-/*!
- \relates QString
- Writes a string to the stream.
-
- \sa \link datastreamformat.html Format of the QDataStream operators \endlink
-*/
-
-QDataStream &operator<<( QDataStream &s, const QString &str )
-{
- if ( s.version() == 1 ) {
- QCString l( str.latin1() );
- s << l;
- }
- else {
- const char* ub = (const char*)str.unicode();
- if ( ub || s.version() < 3 ) {
- if ( QChar::networkOrdered() ==
- (s.byteOrder()==QDataStream::BigEndian) ) {
- s.writeBytes( ub, sizeof(QChar)*str.length() );
- } else {
- static const uint auto_size = 1024;
- char t[auto_size];
- char *b;
- if ( str.length()*sizeof(QChar) > auto_size ) {
- b = new char[str.length()*sizeof(QChar)];
- } else {
- b = t;
- }
- int l = str.length();
- char *c=b;
- while ( l-- ) {
- *c++ = ub[1];
- *c++ = ub[0];
- ub+=sizeof(QChar);
- }
- s.writeBytes( b, sizeof(QChar)*str.length() );
- if ( str.length()*sizeof(QChar) > auto_size )
- delete [] b;
- }
- } else {
- // write null marker
- s << (Q_UINT32)0xffffffff;
- }
- }
- return s;
-}
-
-/*!
- \relates QString
- Reads a string from the stream.
-
- \sa \link datastreamformat.html Format of the QDataStream operators \endlink
-*/
-
-QDataStream &operator>>( QDataStream &s, QString &str )
-{
-#ifdef QT_QSTRING_UCS_4
-#if defined(_CC_GNU_)
-#warning "operator>> not working properly"
-#endif
-#endif
- if ( s.version() == 1 ) {
- QCString l;
- s >> l;
- str = QString( l );
- }
- else {
- Q_UINT32 bytes;
- s >> bytes; // read size of string
- if ( bytes == 0xffffffff ) { // null string
- str = QString::null;
- } else if ( bytes > 0 ) { // not empty
- str.setLength( bytes/2 );
- char* b = (char*)str.d->unicode;
- s.readRawBytes( b, bytes );
- if ( QChar::networkOrdered() !=
- (s.byteOrder()==QDataStream::BigEndian) ) {
- bytes /= 2;
- while ( bytes-- ) {
- char c = b[0];
- b[0] = b[1];
- b[1] = c;
- b += 2;
- }
- }
- } else {
- str = "";
- }
- }
- return s;
-}
-#endif // QT_NO_DATASTREAM
-
-/*****************************************************************************
- QConstString member functions
- *****************************************************************************/
-
-/*!
- \class QConstString qstring.h
- \brief A QString which uses constant Unicode data.
-
- In order to minimize copying, highly optimized applications can use
- QConstString to provide a QString-compatible object from existing
- Unicode data. It is then the user's responsibility to make sure
- that the Unicode data must exist for the entire lifetime of the
- QConstString object.
-*/
-
-/*!
- Constructs a QConstString that uses the first \a length Unicode
- characters in the array \a unicode. Any attempt to modify
- copies of the string will cause it to create a copy of the
- data, thus it remains forever unmodified.
-
- Note that \a unicode is \e not \e copied. The caller \e must be
- able to guarantee that \a unicode will not be deleted or
- modified. Since that is generally not the case with \c const strings
- (they are references), this constructor demands a non-const pointer
- even though it never modifies \a unicode.
-*/
-QConstString::QConstString( QChar* unicode, uint length ) :
- QString(new QStringData(unicode, length, length),TRUE)
-{
-}
-
-/*!
- Destroys the QConstString, creating a copy of the data if
- other strings are still using it.
-*/
-QConstString::~QConstString()
-{
- if ( d->count > 1 ) {
- QChar* cp = QT_ALLOC_QCHAR_VEC( d->len );
- memcpy( cp, d->unicode, d->len*sizeof(QChar) );
- d->unicode = cp;
- } else {
- d->unicode = 0;
- }
-
- // The original d->unicode is now unlinked.
-}
-
-/*!
- \fn const QString& QConstString::string() const
-
- Returns a constant string referencing the data passed during
- construction.
-*/
-
-/*!
- Returns whether the strings starts with \a s, or not.
- */
-bool QString::startsWith( const QString& s ) const
-{
- for ( int i =0; i < (int) s.length(); i++ ) {
- if ( i >= (int) length() || d->unicode[i] != s[i] )
- return FALSE;
- }
- return TRUE;
-}
-
-
-
-#if defined(_OS_WIN32_)
-
-#include <windows.h>
-
-/*!
- Returns a static Windows TCHAR* from a QString, possibly adding NUL.
-
- The lifetime of the return value is until the next call to this function.
-*/
-const void* qt_winTchar(const QString& str_in, bool addnul)
-{
- // So that the return value lives long enough.
- static QString str;
- str = str_in;
-
-#ifdef UNICODE
- static uint buflen = 256;
- static TCHAR *buf = new TCHAR[buflen];
-
- const QChar* uc = str.unicode();
-
-#define EXTEND if (str.length() > buflen) { delete buf; buf = new TCHAR[buflen=str.length()+1]; }
-
-#if defined(_WS_X11_) || defined(_OS_WIN32_BYTESWAP_)
- EXTEND
- for ( int i=str.length(); i--; )
- buf[i] = uc[i].row() << 8 | uc[i].cell();
- if ( addnul )
- buf[str.length()] = 0;
-#else
- // Same endianness of TCHAR
- if ( addnul ) {
- EXTEND
- memcpy(buf,uc,sizeof(TCHAR)*str.length());
- buf[str.length()] = 0;
- } else {
- return uc;
- }
-#endif
- return buf;
-#undef EXTEND
-
-#else
- return str.latin1();
-#endif
-}
-
-/*!
- Makes a new null terminated Windows TCHAR* from a QString.
-*/
-void* qt_winTchar_new(const QString& str)
-{
- TCHAR* result = new TCHAR[str.length()+1];
- memcpy(result, qt_winTchar(str,FALSE), sizeof(TCHAR)*str.length());
- result[str.length()] = 0;
- return result;
-}
-
-/*!
- Makes a QString from a Windows TCHAR*.
-*/
-QString qt_winQString(void* tc)
-{
-#ifdef UNICODE
-
- int len=0;
- while ( ((TCHAR*)tc)[len] )
- len++;
-#if defined(_WS_X11_) || defined(_OS_WIN32_BYTESWAP_)
- QString r;
- for ( int i=0; i<len; i++ )
- r += QChar(((TCHAR*)tc)[i]&0xff,((TCHAR*)tc)[i]>>8);
- return r;
-#else
- // Same endianness of TCHAR
- return QString((QChar*)tc,len);
-#endif
-#undef EXTEND
-#else
- return (TCHAR*)tc;
-#endif
-}
-
-QCString qt_winQString2MB( const QString& s, int uclen )
-{
- if ( uclen < 0 )
- uclen = s.length();
- if ( uclen == 0 )
- return QCString();
- BOOL used_def;
- int bufSize=4096;
- QCString mb(bufSize);
- int len;
- while ( !(len=WideCharToMultiByte(CP_ACP, 0, (const WCHAR*)s.unicode(), uclen,
- mb.data(), bufSize-1, 0, &used_def)) )
- {
- int r = GetLastError();
- if ( r == ERROR_INSUFFICIENT_BUFFER ) {
- bufSize=1+WideCharToMultiByte( CP_ACP, 0,
- (const WCHAR*)s.unicode(), uclen,
- 0, 0, 0, &used_def);
- mb.resize(bufSize);
- // and try again...
- } else {
- // Fail.
- qWarning("WideCharToMultiByte cannot convert multibyte text (error %d): %s (UTF8)",
- r, s.utf8().data());
- break;
- }
- }
- mb[len]='\0';
- return mb;
-}
-
-// WATCH OUT: mblen must include the NUL (or just use -1)
-QString qt_winMB2QString( const char* mb, int mblen )
-{
- if ( !mb || !mblen )
- return QString::null;
- const int wclen_auto = 4096;
- WCHAR wc_auto[wclen_auto];
- int wclen = wclen_auto;
- WCHAR *wc = wc_auto;
- int len;
- while ( !(len=MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED,
- mb, mblen, wc, wclen )) )
- {
- int r = GetLastError();
- if ( r == ERROR_INSUFFICIENT_BUFFER ) {
- if ( wc != wc_auto ) {
- qWarning("Size changed in MultiByteToWideChar");
- break;
- } else {
- wclen = MultiByteToWideChar( CP_ACP, MB_PRECOMPOSED,
- mb, mblen, 0, 0 );
- wc = new WCHAR[wclen];
- // and try again...
- }
- } else {
- // Fail.
- qWarning("MultiByteToWideChar cannot convert multibyte text");
- break;
- }
- }
- if ( len <= 0 )
- return QString::null;
- QString s( (QChar*)wc, len-1 ); // len-1: we don't want terminator
- if ( wc != wc_auto )
- delete [] wc;
- return s;
-}
-
-
-#endif // _OS_WIN32_
diff --git a/qtools/qstring.h b/qtools/qstring.h
deleted file mode 100644
index c64d756..0000000
--- a/qtools/qstring.h
+++ /dev/null
@@ -1,825 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of the QString class, and related Unicode
-** functions.
-**
-** Created : 920609
-**
-** 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 QSTRING_H
-#define QSTRING_H
-
-#ifndef QT_H
-#include "qcstring.h"
-#endif // QT_H
-
-
-/*****************************************************************************
- QString class
- *****************************************************************************/
-
-class QRegExp;
-class QString;
-class QCharRef;
-
-class Q_EXPORT Q_PACKED QChar {
-public:
- QChar();
- QChar( char c );
- QChar( uchar c );
- QChar( uchar c, uchar r );
- QChar( const QChar& c );
- QChar( ushort rc );
- QChar( short rc );
- QChar( uint rc );
- QChar( int rc );
-
- QT_STATIC_CONST QChar null; // 0000
- QT_STATIC_CONST QChar replacement; // FFFD
- QT_STATIC_CONST QChar byteOrderMark; // FEFF
- QT_STATIC_CONST QChar byteOrderSwapped; // FFFE
- QT_STATIC_CONST QChar nbsp; // 00A0
-
- // Unicode information
-
- enum Category
- {
- NoCategory,
-
- Mark_NonSpacing, // Mn
- Mark_SpacingCombining, // Mc
- Mark_Enclosing, // Me
-
- Number_DecimalDigit, // Nd
- Number_Letter, // Nl
- Number_Other, // No
-
- Separator_Space, // Zs
- Separator_Line, // Zl
- Separator_Paragraph, // Zp
-
- Other_Control, // Cc
- Other_Format, // Cf
- Other_Surrogate, // Cs
- Other_PrivateUse, // Co
- Other_NotAssigned, // Cn
-
- Letter_Uppercase, // Lu
- Letter_Lowercase, // Ll
- Letter_Titlecase, // Lt
- Letter_Modifier, // Lm
- Letter_Other, // Lo
-
- Punctuation_Connector, // Pc
- Punctuation_Dask, // Pd
- Punctuation_Open, // Ps
- Punctuation_Close, // Pe
- Punctuation_InitialQuote, // Pi
- Punctuation_FinalQuote, // Pf
- Punctuation_Other, // Po
-
- Symbol_Math, // Sm
- Symbol_Currency, // Sc
- Symbol_Modifier, // Sk
- Symbol_Other // So
- };
-
- enum Direction
- {
- DirL, DirR, DirEN, DirES, DirET, DirAN, DirCS, DirB, DirS, DirWS, DirON,
- DirLRE, DirLRO, DirAL, DirRLE, DirRLO, DirPDF, DirNSM, DirBN
- };
-
- enum Decomposition
- {
- Single, Canonical, Font, NoBreak, Initial, Medial,
- Final, Isolated, Circle, Super, Sub, Vertical,
- Wide, Narrow, Small, Square, Compat, Fraction
- };
-
- enum Joining
- {
- OtherJoining, Dual, Right, Center
- };
-
- // ****** WHEN ADDING FUNCTIONS, CONSIDER ADDING TO QCharRef TOO
-
- int digitValue() const;
- QChar lower() const;
- QChar upper() const;
-
- Category category() const;
- Direction direction() const;
- Joining joining() const;
- bool mirrored() const;
- QChar mirroredChar() const;
- QString decomposition() const;
- Decomposition decompositionTag() const;
-
- char latin1() const { return rw ? 0 : cl; }
- ushort unicode() const { return (rw << 8) | cl; }
-#ifndef QT_NO_CAST_ASCII
- // like all ifdef'd code this is undocumented
- operator char() const { return latin1(); }
-#endif
-
- bool isNull() const { return unicode()==0; }
- bool isPrint() const;
- bool isPunct() const;
- bool isSpace() const;
- bool isMark() const;
- bool isLetter() const;
- bool isNumber() const;
- bool isLetterOrNumber() const;
- bool isDigit() const;
-
- uchar& cell() { return cl; }
- uchar& row() { return rw; }
- uchar cell() const { return cl; }
- uchar row() const { return rw; }
-
- static bool networkOrdered() { return (int)net_ordered == 1; }
-
- friend inline int operator==( char ch, QChar c );
- friend inline int operator==( QChar c, char ch );
- friend inline int operator==( QChar c1, QChar c2 );
- friend inline int operator!=( QChar c1, QChar c2 );
- friend inline int operator!=( char ch, QChar c );
- friend inline int operator!=( QChar c, char ch );
- friend inline int operator<=( QChar c, char ch );
- friend inline int operator<=( char ch, QChar c );
- friend inline int operator<=( QChar c1, QChar c2 );
-
-private:
-#if defined(_WS_X11_) || defined(_OS_WIN32_BYTESWAP_) || defined( _WS_QWS_ )
- // XChar2b on X11, ushort on _OS_WIN32_BYTESWAP_
- //### QWS must be defined on a platform by platform basis
- uchar rw;
- uchar cl;
-#if defined(QT_QSTRING_UCS_4)
- ushort grp;
-#endif
- enum { net_ordered = 1 };
-#else
- // ushort on _OS_WIN32_
- uchar cl;
- uchar rw;
-#if defined(QT_QSTRING_UCS_4)
- ushort grp;
-#endif
- enum { net_ordered = 0 };
-#endif
-};
-
-inline QChar::QChar()
-{
- rw = 0; cl = 0;
-#ifdef QT_QSTRING_UCS_4
- grp = 0;
-#endif
-}
-inline QChar::QChar( char c )
-{
- rw = 0; cl = (uchar)c;
-#ifdef QT_QSTRING_UCS_4
- grp = 0;
-#endif
-}
-inline QChar::QChar( uchar c )
-{
- rw = 0; cl = c;
-#ifdef QT_QSTRING_UCS_4
- grp = 0;
-#endif
-}
-inline QChar::QChar( uchar c, uchar r )
-{
- rw = r; cl = c;
-#ifdef QT_QSTRING_UCS_4
- grp = 0;
-#endif
-}
-inline QChar::QChar( const QChar& c )
-{
- rw = c.rw; cl = c.cl;
-#ifdef QT_QSTRING_UCS_4
- grp = 0;
-#endif
-}
-inline QChar::QChar( ushort rc )
-{
- rw = (uchar)((rc>>8)&0xff); cl = (uchar)(rc&0xff);
-#ifdef QT_QSTRING_UCS_4
- grp = 0;
-#endif
-}
-inline QChar::QChar( short rc )
-{
- rw = (uchar)((rc>>8)&0xff); cl = (uchar)(rc&0xff);
-#ifdef QT_QSTRING_UCS_4
- grp = 0;
-#endif
-}
-inline QChar::QChar( uint rc )
-{
- rw = (uchar)((rc>>8)&0xff); cl = (uchar)(rc&0xff);
-#ifdef QT_QSTRING_UCS_4
- grp = 0;
-#endif
-}
-inline QChar::QChar( int rc )
-{
- rw = (uchar)((rc>>8)&0xff); cl = (uchar)(rc&0xff);
-#ifdef QT_QSTRING_UCS_4
- grp = 0;
-#endif
-}
-
-
-inline int operator==( char ch, QChar c )
-{
- return ch == c.cl && !c.rw;
-}
-
-inline int operator==( QChar c, char ch )
-{
- return ch == c.cl && !c.rw;
-}
-
-inline int operator==( QChar c1, QChar c2 )
-{
- return c1.cl == c2.cl
- && c1.rw == c2.rw;
-}
-
-inline int operator!=( QChar c1, QChar c2 )
-{
- return c1.cl != c2.cl
- || c1.rw != c2.rw;
-}
-
-inline int operator!=( char ch, QChar c )
-{
- return ch != c.cl || c.rw;
-}
-
-inline int operator!=( QChar c, char ch )
-{
- return ch != c.cl || c.rw;
-}
-
-inline int operator<=( QChar c, char ch )
-{
- return !(ch < c.cl || c.rw);
-}
-
-inline int operator<=( char ch, QChar c )
-{
- return ch <= c.cl || c.rw;
-}
-
-inline int operator<=( QChar c1, QChar c2 )
-{
- return c1.rw > c2.rw
- ? FALSE
- : c1.rw < c2.rw
- ? TRUE
- : c1.cl <= c2.cl;
-}
-
-inline int operator>=( QChar c, char ch ) { return ch <= c; }
-inline int operator>=( char ch, QChar c ) { return c <= ch; }
-inline int operator>=( QChar c1, QChar c2 ) { return c2 <= c1; }
-inline int operator<( QChar c, char ch ) { return !(ch<=c); }
-inline int operator<( char ch, QChar c ) { return !(c<=ch); }
-inline int operator<( QChar c1, QChar c2 ) { return !(c2<=c1); }
-inline int operator>( QChar c, char ch ) { return !(ch>=c); }
-inline int operator>( char ch, QChar c ) { return !(c>=ch); }
-inline int operator>( QChar c1, QChar c2 ) { return !(c2>=c1); }
-
-// internal
-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) { }
-
- ~QStringData() { if ( unicode ) delete[] ((char*)unicode);
- if ( ascii ) delete[] ascii; }
-
- void deleteSelf();
- QChar *unicode;
- char *ascii;
- uint len;
- uint maxl:30;
- uint dirtyascii:1;
-};
-
-
-class Q_EXPORT QString
-{
-public:
- QString(); // make null string
- QString( QChar ); // one-char string
- QString( const QString & ); // impl-shared copy
- QString( const QByteArray& ); // deep copy
- QString( const QCString& ); // deep copy
- QString( const QChar* unicode, uint length ); // deep copy
-#ifndef QT_NO_CAST_ASCII
- QString( const char *str ); // deep copy
-#endif
- ~QString();
-
- QString &operator=( const QString & ); // impl-shared copy
-#ifndef QT_NO_CAST_ASCII
- QString &operator=( const char * ); // deep copy
-#endif
- QString &operator=( const QCString& ); // deep copy
- QString &operator=( QChar c );
- QString &operator=( char c );
-
- QT_STATIC_CONST QString null;
-
- bool isNull() const;
- bool isEmpty() const;
- uint length() const;
- void truncate( uint pos );
-
-#if QT_VERSION >= 300
-#error "fill() Should return *this, or QChar constructor should take count=1"
-#endif
- void fill( QChar c, int len = -1 );
-
- QString copy() const;
-
- QString arg(long a, int fieldwidth=0, int base=10) const;
- QString arg(ulong a, int fieldwidth=0, int base=10) const;
- QString arg(int a, int fieldwidth=0, int base=10) const;
- QString arg(uint a, int fieldwidth=0, int base=10) const;
- QString arg(short a, int fieldwidth=0, int base=10) const;
- QString arg(ushort a, int fieldwidth=0, int base=10) const;
- QString arg(char a, int fieldwidth=0) const;
- QString arg(QChar a, int fieldwidth=0) const;
- QString arg(const QString& a, int fieldwidth=0) const;
- QString arg(double a, int fieldwidth=0, char fmt='g', int prec=-1) const;
-
- QString &sprintf( const char* format, ... )
-#if defined(_CC_GNU_) && !defined(__INSURE__)
- __attribute__ ((format (printf, 2, 3)))
-#endif
- ;
-
- int find( QChar c, int index=0, bool cs=TRUE ) const;
- int find( char c, int index=0, bool cs=TRUE ) const;
- int find( const QString &str, int index=0, bool cs=TRUE ) const;
- int find( const QRegExp &, int index=0 ) const;
-#ifndef QT_NO_CAST_ASCII
- int find( const char* str, int index=0 ) const;
-#endif
- int findRev( QChar c, int index=-1, bool cs=TRUE) const;
- int findRev( char c, int index=-1, bool cs=TRUE) const;
- int findRev( const QString &str, int index=-1, bool cs=TRUE) const;
- int findRev( const QRegExp &, int index=-1 ) const;
-#ifndef QT_NO_CAST_ASCII
- int findRev( const char* str, int index=-1 ) const;
-#endif
- int contains( QChar c, bool cs=TRUE ) const;
- int contains( char c, bool cs=TRUE ) const
- { return contains(QChar(c), cs); }
-#ifndef QT_NO_CAST_ASCII
- int contains( const char* str, bool cs=TRUE ) const;
-#endif
- int contains( const QString &str, bool cs=TRUE ) const;
- int contains( const QRegExp & ) const;
-
- QString left( uint len ) const;
- QString right( uint len ) const;
- QString mid( uint index, uint len=0xffffffff) const;
-
- QString leftJustify( uint width, QChar fill=' ', bool trunc=FALSE)const;
- QString rightJustify( uint width, QChar fill=' ',bool trunc=FALSE)const;
-
- QString lower() const;
- QString upper() const;
-
- QString stripWhiteSpace() const;
- QString simplifyWhiteSpace() const;
-
- QString &insert( uint index, const QString & );
- QString &insert( uint index, const QChar*, uint len );
- QString &insert( uint index, QChar );
- QString &insert( uint index, char c ) { return insert(index,QChar(c)); }
- QString &append( char );
- QString &append( QChar );
- QString &append( const QString & );
- QString &prepend( char );
- QString &prepend( QChar );
- QString &prepend( const QString & );
- QString &remove( uint index, uint len );
- QString &replace( uint index, uint len, const QString & );
- QString &replace( uint index, uint len, const QChar*, uint clen );
- QString &replace( const QRegExp &, const QString & );
-
- 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;
- float toFloat( bool *ok=0 ) const;
- double toDouble( bool *ok=0 ) const;
-
- QString &setNum( short, int base=10 );
- QString &setNum( ushort, int base=10 );
- QString &setNum( int, int base=10 );
- QString &setNum( uint, int base=10 );
- QString &setNum( long, int base=10 );
- QString &setNum( ulong, int base=10 );
- QString &setNum( float, char f='g', int prec=6 );
- QString &setNum( double, char f='g', int prec=6 );
-
- static QString number( long, int base=10 );
- static QString number( ulong, int base=10);
- static QString number( int, int base=10 );
- static QString number( uint, int base=10);
- static QString number( double, char f='g', int prec=6 );
-
- void setExpand( uint index, QChar c );
-
- QString &operator+=( const QString &str );
- QString &operator+=( QChar c );
- QString &operator+=( char c );
-
- // Your compiler is smart enough to use the const one if it can.
- QChar at( uint i ) const
- { return i<d->len ? d->unicode[i] : QChar::null; }
- QChar operator[]( int i ) const { return at((uint)i); }
- QCharRef at( uint i );
- QCharRef operator[]( int i );
-
- QChar constref(uint i) const
- { return at(i); }
- QChar& ref(uint i)
- { // Optimized for easy-inlining by simple compilers.
- if (d->count!=1 || i>=d->len)
- subat(i);
- d->dirtyascii=1;
- return d->unicode[i];
- }
-
- const QChar* unicode() const { return d->unicode; }
- const char* ascii() const;
- const char* latin1() const;
- static QString fromLatin1(const char*, int len=-1);
-#ifndef QT_NO_TEXTCODEC
- QCString utf8() const;
- static QString fromUtf8(const char*, int len=-1);
-#endif
- QCString local8Bit() const;
- static QString fromLocal8Bit(const char*, int len=-1);
- bool operator!() const;
-#ifndef QT_NO_ASCII_CAST
- operator const char *() const { return latin1(); }
-#endif
-
- QString &setUnicode( const QChar* unicode, uint len );
- QString &setUnicodeCodes( const ushort* unicode_as_ushorts, uint len );
- QString &setLatin1( const char*, int len=-1 );
-
- int compare( const QString& s ) const;
- static int compare( const QString& s1, const QString& s2 )
- { return s1.compare(s2); }
-
-#ifndef QT_NO_DATASTREAM
- friend Q_EXPORT QDataStream &operator>>( QDataStream &, QString & );
-#endif
- // new functions for BiDi
- void compose();
- QChar::Direction basicDirection();
- QString visual(int index = 0, int len = -1);
-
-#ifndef QT_NO_COMPAT
- const char* data() const { return latin1(); }
-#endif
-
- bool startsWith( const QString& ) const;
-
-private:
- QString( int size, bool dummy ); // allocate size incl. \0
-
- void deref();
- void real_detach();
- void setLength( uint pos );
- void subat( uint );
- bool findArg(int& pos, int& len) const;
-
- static QChar* asciiToUnicode( const char*, uint * len, uint maxlen=(uint)-1 );
- static QChar* asciiToUnicode( const QByteArray&, uint * len );
- static char* unicodeToAscii( const QChar*, uint len );
-
- QStringData *d;
- static QStringData* shared_null;
- static QStringData* makeSharedNull();
-
- friend class QConstString;
- QString(QStringData* dd, bool /*dummy*/) : d(dd) { }
-};
-
-class Q_EXPORT QCharRef {
- friend class QString;
- QString& s;
- uint p;
- QCharRef(QString* str, uint pos) : s(*str), p(pos) { }
-
-public:
- // Most QChar operations repeated here...
-
- // all this is not documented: We just say "like QChar" and let it be.
-#if 1
- ushort unicode() const { return s.constref(p).unicode(); }
- char latin1() const { return s.constref(p).latin1(); }
-
- // An operator= for each QChar cast constructor...
- QCharRef operator=(char c ) { s.ref(p)=c; return *this; }
- QCharRef operator=(uchar c ) { s.ref(p)=c; return *this; }
- QCharRef operator=(QChar c ) { s.ref(p)=c; return *this; }
- QCharRef operator=(const QCharRef& c ) { s.ref(p)=c.unicode(); return *this; }
- QCharRef operator=(ushort rc ) { s.ref(p)=rc; return *this; }
- QCharRef operator=(short rc ) { s.ref(p)=rc; return *this; }
- QCharRef operator=(uint rc ) { s.ref(p)=rc; return *this; }
- QCharRef operator=(int rc ) { s.ref(p)=rc; return *this; }
-
- operator QChar () const { return s.constref(p); }
-
- // each function...
- bool isNull() const { return unicode()==0; }
- bool isPrint() const { return s.constref(p).isPrint(); }
- bool isPunct() const { return s.constref(p).isPunct(); }
- bool isSpace() const { return s.constref(p).isSpace(); }
- bool isMark() const { return s.constref(p).isMark(); }
- bool isLetter() const { return s.constref(p).isLetter(); }
- bool isNumber() const { return s.constref(p).isNumber(); }
- bool isLetterOrNumber() { return s.constref(p).isLetterOrNumber(); }
- bool isDigit() const { return s.constref(p).isDigit(); }
-
- int digitValue() const { return s.constref(p).digitValue(); }
- QChar lower() { return s.constref(p).lower(); }
- QChar upper() { return s.constref(p).upper(); }
-
- QChar::Category category() const { return s.constref(p).category(); }
- QChar::Direction direction() const { return s.constref(p).direction(); }
- QChar::Joining joining() const { return s.constref(p).joining(); }
- bool mirrored() const { return s.constref(p).mirrored(); }
- QChar mirroredChar() const { return s.constref(p).mirroredChar(); }
- QString decomposition() const { return s.constref(p).decomposition(); }
- QChar::Decomposition decompositionTag() const { return s.constref(p).decompositionTag(); }
-
- // Not the non-const ones of these.
- uchar cell() const { return s.constref(p).cell(); }
- uchar row() const { return s.constref(p).row(); }
-#endif
-};
-
-inline QCharRef QString::at( uint i ) { return QCharRef(this,i); }
-inline QCharRef QString::operator[]( int i ) { return at((uint)i); }
-
-
-class Q_EXPORT QConstString : private QString {
-public:
- QConstString( QChar* unicode, uint length );
- ~QConstString();
- const QString& string() const { return *this; }
-};
-
-
-/*****************************************************************************
- QString stream functions
- *****************************************************************************/
-#ifndef QT_NO_DATASTREAM
-Q_EXPORT QDataStream &operator<<( QDataStream &, const QString & );
-Q_EXPORT QDataStream &operator>>( QDataStream &, QString & );
-#endif
-
-/*****************************************************************************
- QString inline functions
- *****************************************************************************/
-
-// These two move code into makeSharedNull() and deletesData()
-// to improve cache-coherence (and reduce code bloat), while
-// keeping the common cases fast.
-//
-// No safe way to pre-init shared_null on ALL compilers/linkers.
-inline QString::QString() :
- d(shared_null ? shared_null : makeSharedNull())
-{
- d->ref();
-}
-//
-inline QString::~QString()
-{
- if ( d->deref() ) {
- if ( d == shared_null )
- shared_null = 0;
- d->deleteSelf();
- }
-}
-
-inline QString &QString::operator=( QChar c )
-{ return *this = QString(c); }
-
-inline QString &QString::operator=( char c )
-{ return *this = QString(QChar(c)); }
-
-inline bool QString::isNull() const
-{ return unicode() == 0; }
-
-inline bool QString::operator!() const
-{ return isNull(); }
-
-inline uint QString::length() const
-{ return d->len; }
-
-inline bool QString::isEmpty() const
-{ return length() == 0; }
-
-inline QString QString::copy() const
-{ return QString( *this ); }
-
-inline QString &QString::prepend( const QString & s )
-{ return insert(0,s); }
-
-inline QString &QString::prepend( QChar c )
-{ return insert(0,c); }
-
-inline QString &QString::prepend( char c )
-{ return insert(0,c); }
-
-inline QString &QString::append( const QString & s )
-{ return operator+=(s); }
-
-inline QString &QString::append( QChar c )
-{ return operator+=(c); }
-
-inline QString &QString::append( char c )
-{ return operator+=(c); }
-
-inline QString &QString::setNum( short n, int base )
-{ return setNum((long)n, base); }
-
-inline QString &QString::setNum( ushort n, int base )
-{ return setNum((ulong)n, base); }
-
-inline QString &QString::setNum( int n, int base )
-{ return setNum((long)n, base); }
-
-inline QString &QString::setNum( uint n, int base )
-{ return setNum((ulong)n, base); }
-
-inline QString &QString::setNum( float n, char f, int prec )
-{ return setNum((double)n,f,prec); }
-
-inline QString QString::arg(int a, int fieldwidth, int base) const
-{ return arg((long)a, fieldwidth, base); }
-
-inline QString QString::arg(uint a, int fieldwidth, int base) const
-{ return arg((ulong)a, fieldwidth, base); }
-
-inline QString QString::arg(short a, int fieldwidth, int base) const
-{ return arg((long)a, fieldwidth, base); }
-
-inline QString QString::arg(ushort a, int fieldwidth, int base) const
-{ return arg((ulong)a, fieldwidth, base); }
-
-inline int QString::find( char c, int index, bool cs ) const
-{ return find(QChar(c), index, cs); }
-
-inline int QString::findRev( char c, int index, bool cs) const
-{ return findRev( QChar(c), index, cs ); }
-
-
-#ifndef QT_NO_CAST_ASCII
-inline int QString::find( const char* str, int index ) const
-{ return find(QString::fromLatin1(str), index); }
-
-inline int QString::findRev( const char* str, int index ) const
-{ return findRev(QString::fromLatin1(str), index); }
-#endif
-
-
-/*****************************************************************************
- QString non-member operators
- *****************************************************************************/
-
-Q_EXPORT bool operator!=( const QString &s1, const QString &s2 );
-Q_EXPORT bool operator<( const QString &s1, const QString &s2 );
-Q_EXPORT bool operator<=( const QString &s1, const QString &s2 );
-Q_EXPORT bool operator==( const QString &s1, const QString &s2 );
-Q_EXPORT bool operator>( const QString &s1, const QString &s2 );
-Q_EXPORT bool operator>=( const QString &s1, const QString &s2 );
-#ifndef QT_NO_CAST_ASCII
-Q_EXPORT bool operator!=( const QString &s1, const char *s2 );
-Q_EXPORT bool operator<( const QString &s1, const char *s2 );
-Q_EXPORT bool operator<=( const QString &s1, const char *s2 );
-Q_EXPORT bool operator==( const QString &s1, const char *s2 );
-Q_EXPORT bool operator>( const QString &s1, const char *s2 );
-Q_EXPORT bool operator>=( const QString &s1, const char *s2 );
-Q_EXPORT bool operator!=( const char *s1, const QString &s2 );
-Q_EXPORT bool operator<( const char *s1, const QString &s2 );
-Q_EXPORT bool operator<=( const char *s1, const QString &s2 );
-Q_EXPORT bool operator==( const char *s1, const QString &s2 );
-//Q_EXPORT bool operator>( const char *s1, const QString &s2 ); // MSVC++
-Q_EXPORT bool operator>=( const char *s1, const QString &s2 );
-#endif
-
-Q_EXPORT inline QString operator+( const QString &s1, const QString &s2 )
-{
- QString tmp( s1 );
- tmp += s2;
- return tmp;
-}
-
-#ifndef QT_NO_CAST_ASCII
-Q_EXPORT inline QString operator+( const QString &s1, const char *s2 )
-{
- QString tmp( s1 );
- tmp += QString::fromLatin1(s2);
- return tmp;
-}
-
-Q_EXPORT inline QString operator+( const char *s1, const QString &s2 )
-{
- QString tmp = QString::fromLatin1( s1 );
- tmp += s2;
- return tmp;
-}
-#endif
-
-Q_EXPORT inline QString operator+( const QString &s1, QChar c2 )
-{
- QString tmp( s1 );
- tmp += c2;
- return tmp;
-}
-
-Q_EXPORT inline QString operator+( const QString &s1, char c2 )
-{
- QString tmp( s1 );
- tmp += c2;
- return tmp;
-}
-
-Q_EXPORT inline QString operator+( QChar c1, const QString &s2 )
-{
- QString tmp;
- tmp += c1;
- tmp += s2;
- return tmp;
-}
-
-Q_EXPORT inline QString operator+( char c1, const QString &s2 )
-{
- QString tmp;
- tmp += c1;
- tmp += s2;
- return tmp;
-}
-
-#if defined(_OS_WIN32_)
-extern Q_EXPORT QString qt_winQString(void*);
-extern Q_EXPORT const void* qt_winTchar(const QString& str, bool addnul);
-extern Q_EXPORT void* qt_winTchar_new(const QString& str);
-extern Q_EXPORT QCString qt_winQString2MB( const QString& s, int len=-1 );
-extern Q_EXPORT QString qt_winMB2QString( const char* mb, int len=-1 );
-#endif
-
-#endif // QSTRING_H
diff --git a/qtools/qstringlist.cpp b/qtools/qstringlist.cpp
deleted file mode 100644
index ff4f33e..0000000
--- a/qtools/qstringlist.cpp
+++ /dev/null
@@ -1,302 +0,0 @@
-/****************************************************************************
-**
-**
-** Implementation of QStringList
-**
-** Created : 990406
-**
-** 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 "qstringlist.h"
-
-#ifndef QT_NO_STRINGLIST
-#include "qstrlist.h"
-#include "qdatastream.h"
-#include "qtl.h"
-
-// NOT REVISED
-/*!
- \class QStringList qstringlist.h
- \brief A list of strings.
-
- \ingroup qtl
- \ingroup tools
- \ingroup shared
-
- QStringList is basically a QValueList of QString objects. As opposed
- to QStrList, that stores pointers to characters, QStringList deals
- with real QString objects. It is the class of choice whenever you
- work with unicode strings.
-
- Like QString itself, QStringList objects are implicit shared.
- Passing them around as value-parameters is both fast and safe.
-
- Example:
- \code
- QStringList list;
-
- // three different ways of appending values:
- list.append( "Torben");
- list += "Warwick";
- list << "Matthias" << "Arnt" << "Paul";
-
- // sort the list, Arnt's now first
- list.sort();
-
- // print it out
- for ( QStringList::Iterator it = list.begin(); it != list.end(); ++it ) {
- printf( "%s \n", (*it).latin1() );
- }
- \endcode
-
- Convenience methods such as sort(), split(), join() and grep() make
- working with QStringList easy.
-*/
-
-/*!
- \fn QStringList::QStringList()
- Creates an empty list.
-*/
-
-/*! \fn QStringList::QStringList( const QStringList& l )
- Creates a copy of the list. This function is very fast since
- QStringList is implicit shared. However, for the programmer this
- is the same as a deep copy. If this list or the original one or some
- other list referencing the same shared data is modified, then the
- modifying list makes a copy first.
-*/
-
-/*!
- \fn QStringList::QStringList (const QString & i)
- Constructs a string list consisting of the single string \a i.
- To make longer lists easily, use:
- \code
- QString s1,s2,s3;
- ...
- QStringList mylist = QStringList() << s1 << s2 << s3;
- \endcode
-*/
-
-/*!
- \fn QStringList::QStringList (const char* i)
- Constructs a string list consisting of the single latin-1 string \a i.
-*/
-
-/*! \fn QStringList::QStringList( const QValueList<QString>& l )
-
- Constructs a new string list that is a copy of \a l.
-*/
-
-/*!
- Sorts the list of strings in ascending order.
-
- Sorting is very fast. It uses the Qt Template Library's
- efficient HeapSort implementation that operates in O(n*log n).
-*/
-void QStringList::sort()
-{
- qHeapSort(*this);
-}
-
-/*!
- Splits the string \a str using \a sep as separator. Returns the
- list of strings. If \a allowEmptyEntries is TRUE, also empty
- entries are inserted into the list, else not. So if you have
- a string 'abc..d.e.', a list which contains 'abc', 'd', and 'e'
- would be returned if \a allowEmptyEntries is FALSE, but
- a list containing 'abc', '', 'd', 'e' and '' would be returned if
- \a allowEmptyEntries is TRUE.
- If \a str doesn't contain \a sep, a stringlist
- with one item, which is the same as \a str, is returned.
-
- \sa join()
-*/
-
-QStringList QStringList::split( const QChar &sep, const QString &str, bool allowEmptyEntries )
-{
- return split( QString( sep ), str, allowEmptyEntries );
-}
-
-/*!
- Splits the string \a str using \a sep as separator. Returns the
- list of strings. If \a allowEmptyEntries is TRUE, also empty
- entries are inserted into the list, else not. So if you have
- a string 'abc..d.e.', a list which contains 'abc', 'd', and 'e'
- would be returned if \a allowEmptyEntries is FALSE, but
- a list containing 'abc', '', 'd', 'e' and '' would be returned if
- \a allowEmptyEntries is TRUE.
- If \a str doesn't contain \a sep, a stringlist
- with one item, which is the same as \a str, is returned.
-
- \sa join()
-*/
-
-QStringList QStringList::split( const QString &sep, const QString &str, bool allowEmptyEntries )
-{
- QStringList lst;
-
- int j = 0;
- int i = str.find( sep, j );
-
- while ( i != -1 ) {
- if ( str.mid( j, i - j ).length() > 0 )
- lst << str.mid( j, i - j );
- else if ( allowEmptyEntries )
- lst << QString::null;
- j = i + sep.length();
- i = str.find( sep, j );
- }
-
- int l = str.length() - 1;
- if ( str.mid( j, l - j + 1 ).length() > 0 )
- lst << str.mid( j, l - j + 1 );
- else if ( allowEmptyEntries )
- lst << QString::null;
-
- return lst;
-}
-
-/*!
- Splits the string \a str using the regular expression \a sep as separator. Returns the
- list of strings. If \a allowEmptyEntries is TRUE, also empty
- entries are inserted into the list, else not. So if you have
- a string 'abc..d.e.', a list which contains 'abc', 'd', and 'e'
- would be returned if \a allowEmptyEntries is FALSE, but
- a list containing 'abc', '', 'd', 'e' and '' would be returned if
- \a allowEmptyEntries is TRUE.
- If \a str doesn't contain \a sep, a stringlist
- with one item, which is the same as \a str, is returned.
-
- \sa join()
-*/
-
-QStringList QStringList::split( const QRegExp &sep, const QString &str, bool allowEmptyEntries )
-{
- QStringList lst;
-
- int j = 0;
- int len = 0;
- int i = sep.match( str, j, &len );
-
- while ( i != -1 ) {
- if ( str.mid( j, i - j ).length() > 0 )
- lst << str.mid( j, i - j );
- else if ( allowEmptyEntries )
- lst << QString::null;
- j = i + len;
- i = sep.match( str, j, &len );
- }
-
- int l = str.length() - 1;
- if ( str.mid( j, l - j + 1 ).length() > 0 )
- lst << str.mid( j, l - j + 1 );
- else if ( allowEmptyEntries )
- lst << QString::null;
-
- return lst;
-}
-
-/*!
- Returns a list of all strings containing the substring \a str.
-
- If \a cs is TRUE, the grep is done case sensitively, else not.
-*/
-
-QStringList QStringList::grep( const QString &str, bool cs ) const
-{
- QStringList res;
- for ( QStringList::ConstIterator it = begin(); it != end(); ++it )
- if ( (*it).contains( str, cs ) )
- res << *it;
-
- return res;
-}
-
-/*!
- Returns a list of all strings containing a substring that matches
- the regular expression \a expr.
-*/
-
-QStringList QStringList::grep( const QRegExp &expr ) const
-{
- QStringList res;
- for ( QStringList::ConstIterator it = begin(); it != end(); ++it )
- if ( (*it).contains( expr ) )
- res << *it;
-
- return res;
-}
-
-/*!
- Joins the stringlist into a single string with each element
- separated by \a sep.
-
- \sa split()
-*/
-QString QStringList::join( const QString &sep ) const
-{
- QString res;
- bool alredy = FALSE;
- for ( QStringList::ConstIterator it = begin(); it != end(); ++it ) {
- if ( alredy )
- res += sep;
- alredy = TRUE;
- res += *it;
- }
-
- return res;
-}
-
-#ifndef QT_NO_DATASTREAM
-Q_EXPORT QDataStream &operator>>( QDataStream & s, QStringList& l )
-{
- return s >> (QValueList<QString>&)l;
-}
-
-Q_EXPORT QDataStream &operator<<( QDataStream & s, const QStringList& l )
-{
- return s << (const QValueList<QString>&)l;
-}
-#endif
-
-/*!
- Converts from a QStrList (ASCII) to a QStringList (Unicode).
-*/
-QStringList QStringList::fromStrList(const QStrList& ascii)
-{
- QStringList res;
- const char * s;
- for ( QStrListIterator it(ascii); (s=it.current()); ++it )
- res << s;
- return res;
-}
-
-#endif //QT_NO_STRINGLIST
diff --git a/qtools/qstringlist.h b/qtools/qstringlist.h
deleted file mode 100644
index 03342c5..0000000
--- a/qtools/qstringlist.h
+++ /dev/null
@@ -1,81 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QStringList class
-**
-** Created : 990406
-**
-** 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 QSTRINGLIST_H
-#define QSTRINGLIST_H
-
-#ifndef QT_H
-#include "qvaluelist.h"
-#include "qstring.h"
-#include "qregexp.h"
-#endif // QT_H
-
-#ifndef QT_NO_STRINGLIST
-
-class QStrList;
-
-class Q_EXPORT QStringList : public QValueList<QString>
-{
-public:
- QStringList() { }
- QStringList( const QStringList& l ) : QValueList<QString>(l) { }
- QStringList( const QValueList<QString>& l ) : QValueList<QString>(l) { }
- QStringList( const QString& i ) { append(i); }
-#ifndef QT_NO_CAST_ASCII
- QStringList( const char* i ) { append(i); }
-#endif
-
- static QStringList fromStrList(const QStrList&);
-
- void sort();
-
- static QStringList split( const QString &sep, const QString &str, bool allowEmptyEntries = FALSE );
- static QStringList split( const QChar &sep, const QString &str, bool allowEmptyEntries = FALSE );
- static QStringList split( const QRegExp &sep, const QString &str, bool allowEmptyEntries = FALSE );
- QString join( const QString &sep ) const;
-
- QStringList grep( const QString &str, bool cs = TRUE ) const;
- QStringList grep( const QRegExp &expr ) const;
-};
-
-#ifndef QT_NO_DATASTREAM
-class QDataStream;
-extern Q_EXPORT QDataStream &operator>>( QDataStream &, QStringList& );
-extern Q_EXPORT QDataStream &operator<<( QDataStream &, const QStringList& );
-#endif
-#endif // QT_NO_STRINGLIST
-#endif // QSTRINGLIST_H
diff --git a/qtools/qstrlist.doc b/qtools/qstrlist.doc
deleted file mode 100644
index 751c6c2..0000000
--- a/qtools/qstrlist.doc
+++ /dev/null
@@ -1,5 +0,0 @@
-/****************************************************************************
-**
-*****************************************************************************/
-
-//typedef QListIterator<char> QStrListIterator;
diff --git a/qtools/qstrlist.h b/qtools/qstrlist.h
deleted file mode 100644
index c6a1864..0000000
--- a/qtools/qstrlist.h
+++ /dev/null
@@ -1,109 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QStrList, QStrIList and QStrListIterator classes
-**
-** Created : 920730
-**
-** 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 QSTRLIST_H
-#define QSTRLIST_H
-
-#ifndef QT_H
-#include "qstring.h"
-#include "qlist.h"
-#include "qdatastream.h"
-#endif // QT_H
-
-
-#if defined(Q_TEMPLATEDLL)
-template class Q_EXPORT QList<char>;
-template class Q_EXPORT QListIterator<char>;
-#endif
-
-typedef QList<char> QStrListBase;
-typedef QListIterator<char> QStrListIterator;
-
-
-class Q_EXPORT QStrList : public QStrListBase
-{
-public:
- QStrList( bool deepCopies=TRUE ) { dc = deepCopies; del_item = deepCopies; }
- QStrList( const QStrList & );
- ~QStrList() { clear(); }
- QStrList& operator=( const QStrList & );
-
-private:
- QCollection::Item newItem( QCollection::Item d ) { return dc ? qstrdup( (const char*)d ) : d; }
- void deleteItem( QCollection::Item d ) { if ( del_item ) delete[] (char*)d; }
- int compareItems( QCollection::Item s1, QCollection::Item s2 ) { return qstrcmp((const char*)s1,
- (const char*)s2); }
-#ifndef QT_NO_DATASTREAM
- QDataStream &read( QDataStream &s, QCollection::Item &d )
- { s >> (char *&)d; return s; }
- QDataStream &write( QDataStream &s, QCollection::Item d ) const
- { return s << (const char *)d; }
-#endif
- bool dc;
-};
-
-
-class Q_EXPORT QStrIList : public QStrList // case insensitive string list
-{
-public:
- QStrIList( bool deepCopies=TRUE ) : QStrList( deepCopies ) {}
- ~QStrIList() { clear(); }
-private:
- int compareItems( QCollection::Item s1, QCollection::Item s2 )
- { return qstricmp((const char*)s1,
- (const char*)s2); }
-};
-
-
-inline QStrList & QStrList::operator=( const QStrList &strList )
-{
- clear();
- dc = strList.dc;
- del_item = dc;
- QStrListBase::operator=(strList);
- return *this;
-}
-
-inline QStrList::QStrList( const QStrList &strList )
- : QStrListBase( strList )
-{
- dc = FALSE;
- operator=(strList);
-}
-
-
-#endif // QSTRLIST_H
diff --git a/qtools/qstrvec.h b/qtools/qstrvec.h
deleted file mode 100644
index 15d3abb..0000000
--- a/qtools/qstrvec.h
+++ /dev/null
@@ -1,90 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QStrVec and QStrIVec classes
-**
-** Created : 931203
-**
-** 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 QSTRVEC_H
-#define QSTRVEC_H
-
-#ifndef QT_H
-#include "qstring.h"
-#include "qvector.h"
-#include "qdatastream.h"
-#endif // QT_H
-
-
-#if defined(Q_TEMPLATEDLL)
-template class Q_EXPORT QVector<char>
-#endif
-
-typedef QVector<char> QStrVecBase;
-
-
-class Q_EXPORT QStrVec : public QStrVecBase
-{
-public:
- QStrVec() { dc = TRUE; }
- QStrVec( uint size, bool deepc = TRUE ) : QStrVecBase(size) {dc=deepc;}
- ~QStrVec() { clear(); }
-private:
- Item newItem( Item d ) { return dc ? qstrdup( (const char*)d ) : d; }
- void deleteItem( Item d ) { if ( dc ) delete[] (char*)d; }
- int compareItems( Item s1, Item s2 )
- { return qstrcmp((const char*)s1,
- (const char*)s2); }
-#ifndef QT_NO_DATASTREAM
- QDataStream &read( QDataStream &s, Item &d )
- { s >> (char *&)d; return s; }
- QDataStream &write( QDataStream &s, Item d ) const
- { return s << (const char*)d; }
-#endif
- bool dc;
-};
-
-
-class Q_EXPORT QStrIVec : public QStrVec // case insensitive string vec
-{
-public:
- QStrIVec() {}
- QStrIVec( uint size, bool dc = TRUE ) : QStrVec( size, dc ) {}
- ~QStrIVec() { clear(); }
-private:
- int compareItems( Item s1, Item s2 )
- { return qstricmp((const char*)s1,
- (const char*)s2); }
-};
-
-
-#endif // QSTRVEC_H
diff --git a/qtools/qtextcodec.cpp b/qtools/qtextcodec.cpp
deleted file mode 100644
index fbbc1f9..0000000
--- a/qtools/qtextcodec.cpp
+++ /dev/null
@@ -1,2071 +0,0 @@
-/****************************************************************************
-**
-**
-** Implementation of QTextCodec class
-**
-** Created : 981015
-**
-** Copyright (C)1998-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 "qtextcodec.h"
-#ifndef QT_NO_TEXTCODEC
-
-#include "qlist.h"
-#ifndef QT_NO_CODECS
-#include "qutfcodec.h"
-#include "qgbkcodec.h"
-#include "qeucjpcodec.h"
-#include "qjiscodec.h"
-#include "qsjiscodec.h"
-#include "qeuckrcodec.h"
-#include "qbig5codec.h"
-#include "qrtlcodec.h"
-#include "qtsciicodec.h"
-#endif
-
-#include "qfile.h"
-#include "qstrlist.h"
-#include "qstring.h"
-
-#include <stdlib.h>
-#include <ctype.h>
-#include <locale.h>
-
-
-static QList<QTextCodec> * all = 0;
-static bool destroying_is_ok; // starts out as 0
-
-/*! Deletes all the created codecs.
-
- \warning Do not call this function.
-
- QApplication calls this just before exiting, to delete any
- QTextCodec objects that may be lying around. Since various other
- classes hold pointers to QTextCodec objects, it is not safe to call
- this function earlier.
-
- If you are using the utility classes (like QString) but not using
- QApplication, calling this function at the very end of your
- application can be helpful to chasing down memory leaks, as
- QTextCodec objects will not show up.
-*/
-
-void QTextCodec::deleteAllCodecs()
-{
- if ( !all )
- return;
-
- destroying_is_ok = TRUE;
- QList<QTextCodec> * ball = all;
- all = 0;
- ball->clear();
- delete ball;
- destroying_is_ok = FALSE;
-}
-
-
-static void setupBuiltinCodecs();
-
-
-static void realSetup()
-{
-#if defined(CHECK_STATE)
- if ( destroying_is_ok )
- qWarning( "creating new codec during codec cleanup" );
-#endif
- all = new QList<QTextCodec>;
- all->setAutoDelete( TRUE );
- setupBuiltinCodecs();
-}
-
-
-static inline void setup()
-{
- if ( !all )
- realSetup();
-}
-
-
-class QTextStatelessEncoder: public QTextEncoder {
- const QTextCodec* codec;
-public:
- QTextStatelessEncoder(const QTextCodec*);
- QCString fromUnicode(const QString& uc, int& lenInOut);
-};
-
-
-class QTextStatelessDecoder : public QTextDecoder {
- const QTextCodec* codec;
-public:
- QTextStatelessDecoder(const QTextCodec*);
- QString toUnicode(const char* chars, int len);
-};
-
-QTextStatelessEncoder::QTextStatelessEncoder(const QTextCodec* c) :
- codec(c)
-{
-}
-
-
-QCString QTextStatelessEncoder::fromUnicode(const QString& uc, int& lenInOut)
-{
- return codec->fromUnicode(uc,lenInOut);
-}
-
-
-QTextStatelessDecoder::QTextStatelessDecoder(const QTextCodec* c) :
- codec(c)
-{
-}
-
-
-QString QTextStatelessDecoder::toUnicode(const char* chars, int len)
-{
- return codec->toUnicode(chars,len);
-}
-
-
-
-// NOT REVISED
-/*!
- \class QTextCodec qtextcodec.h
- \brief Provides conversion between text encodings.
-
- By making objects of subclasses of QTextCodec, support for
- new text encodings can be added to Qt.
-
- The abstract virtual functions describe the encoder to the
- system and the coder is used as required in the different
- text file formats supported QTextStream and, under X11 for the
- locale-specific character input and output (under Windows NT
- codecs are not needed for GUI I/O since the system works
- with Unicode already, and Windows 95/98 has built-in convertors
- for the 8-bit local encoding).
-
- More recently created QTextCodec objects take precedence
- over earlier ones.
-
- To add support for another 8-bit encoding to Qt, make a subclass
- or QTextCodec and implement at least the following methods:
- <dl>
- <dt>\c const char* name() const
- <dd>Return the official name for the encoding.
- <dt>\c int mibEnum() const
- <dd>Return the MIB enum for the encoding if it is listed in the
- <a href=ftp://ftp.isi.edu/in-notes/iana/assignments/character-sets>
- IANA character-sets encoding file</a>.
- </dl>
- If the encoding is multi-byte then it will have "state"; that is,
- the interpretation of some bytes will be dependent on some preceding
- bytes. For such an encoding, you will need to implement
- <dl>
- <dt> \c QTextDecoder* makeDecoder() const
- <dd>Return a QTextDecoder that remembers incomplete multibyte
- sequence prefixes or other required state.
- </dl>
- If the encoding does \e not require state, you should implement:
- <dl>
- <dt> \c QString toUnicode(const char* chars, int len) const
- <dd>Converts \e len characters from \e chars to Unicode.
- </dl>
- The base QTextCodec class has default implementations of the above
- two functions, <i>but they are mutually recursive</i>, so you must
- re-implement at least one of them, or both for improved efficiency.
-
- For conversion from Unicode to 8-bit encodings, it is rarely necessary
- to maintain state. However, two functions similar to the two above
- are used for encoding:
- <dl>
- <dt> \c QTextEncoder* makeEncoder() const
- <dd>Return a QTextDecoder.
- <dt> \c QCString fromUnicode(const QString& uc, int& lenInOut ) const;
- <dd>Converts \e lenInOut characters (of type QChar) from the start
- of the string \a uc, returning a QCString result, and also returning
- the \link QCString::length() length\endlink
- of the result in lenInOut.
- </dl>
- Again, these are mutually recursive so only one needs to be implemented,
- or both if better efficiency is possible.
-
- Finally, you must implement:
- <dl>
- <dt> \c int heuristicContentMatch(const char* chars, int len) const
- <dd>Gives a value indicating how likely it is that \e len characters
- from \e chars are in the encoding.
- </dl>
- A good model for this function is the
- QWindowsLocalCodec::heuristicContentMatch function found in the Qt sources.
-
- A QTextCodec subclass might have improved performance if you also
- re-implement:
- <dl>
- <dt> \c bool canEncode( QChar ) const
- <dd>Test if a Unicode character can be encoded.
- <dt> \c bool canEncode( const QString& ) const
- <dd>Test if a string of Unicode characters can be encoded.
- <dt> \c int heuristicNameMatch(const char* hint) const
- <dd>Test if a possibly non-standard name is referring to the codec.
- </dl>
-*/
-
-
-/*!
- Constructs a QTextCodec, making it of highest precedence.
- The QTextCodec should always be constructed on the heap
- (with new), and once constructed it becomes the responsibility
- of Qt to delete it (which is done at QApplication destruction).
-*/
-QTextCodec::QTextCodec()
-{
- setup();
- all->insert(0,this);
-}
-
-
-/*!
- Destructs the QTextCodec. Note that you should not delete
- codecs yourself - once created they become the responsibility
- of Qt to delete.
-*/
-QTextCodec::~QTextCodec()
-{
- if ( !destroying_is_ok )
- qWarning("QTextCodec::~QTextCodec() called by application");
- if ( all )
- all->remove( this );
-}
-
-
-/*!
- Returns a value indicating how likely this decoder is
- for decoding some format that has the given name.
-
- A good match returns a positive number around
- the length of the string. A bad match is negative.
-
- The default implementation calls simpleHeuristicNameMatch()
- with the name of the codec.
-*/
-int QTextCodec::heuristicNameMatch(const char* hint) const
-{
- return simpleHeuristicNameMatch(name(),hint);
-}
-
-
-// returns a string cotnaining the letters and numbers from input,
-// with a space separating run of a character class. e.g. "iso8859-1"
-// becomes "iso 8859 1"
-static QString lettersAndNumbers( const char * input )
-{
- QString result;
- QChar c;
-
- while( input && *input ) {
- c = *input;
- if ( c.isLetter() || c.isNumber() )
- result += c.lower();
- if ( input[1] ) {
- // add space at character class transition, except
- // transition from upper-case to lower-case letter
- QChar n( input[1] );
- if ( c.isLetter() && n.isLetter() ) {
- if ( c == c.lower() && n == n.upper() )
- result += ' ';
- } else if ( c.category() != n.category() ) {
- result += ' ';
- }
- }
- input++;
- }
- return result.simplifyWhiteSpace();
-}
-
-/*!
- A simple utility function for heuristicNameMatch() - it
- does some very minor character-skipping
- so that almost-exact matches score high.
-*/
-int QTextCodec::simpleHeuristicNameMatch(const char* name, const char* hint)
-{
- // if they're the same, return a perfect score.
- if ( name && hint && qstrcmp( name, hint ) == 0 )
- return qstrlen( hint );
-
- // if the letters and numbers are the same, we have an "almost"
- // perfect match.
- QString h( lettersAndNumbers( hint ) );
- QString n( lettersAndNumbers( name ) );
- if ( h == n )
- return qstrlen( hint )-1;
-
- if ( h.stripWhiteSpace() == n.stripWhiteSpace() )
- return qstrlen( hint )-2;
-
- // could do some more here, but I don't think it's worth it
-
- return 0;
-}
-
-
-/*!
- Returns the QTextCodec \a i places from the more recently
- inserted, or NULL if there is no such QTextCodec. Thus,
- codecForIndex(0) returns the most recently created QTextCodec.
-*/
-QTextCodec* QTextCodec::codecForIndex(int i)
-{
- setup();
- return (uint)i >= all->count() ? 0 : all->at(i);
-}
-
-
-/*!
- Returns the QTextCodec which matches the
- \link QTextCodec::mibEnum() MIBenum\endlink \a mib.
-*/
-QTextCodec* QTextCodec::codecForMib(int mib)
-{
- setup();
- QListIterator<QTextCodec> i(*all);
- QTextCodec* result;
- for ( ; (result=i); ++i ) {
- if ( result->mibEnum()==mib )
- break;
- }
- return result;
-}
-
-
-
-
-
-#ifdef _OS_WIN32_
-class QWindowsLocalCodec: public QTextCodec
-{
-public:
- QWindowsLocalCodec();
- ~QWindowsLocalCodec();
-
- QString toUnicode(const char* chars, int len) const;
- QCString fromUnicode(const QString& uc, int& lenInOut ) const;
-
- const char* name() const;
- int mibEnum() const;
-
- int heuristicContentMatch(const char* chars, int len) const;
-};
-
-QWindowsLocalCodec::QWindowsLocalCodec()
-{
-}
-
-QWindowsLocalCodec::~QWindowsLocalCodec()
-{
-}
-
-
-QString QWindowsLocalCodec::toUnicode(const char* chars, int len) const
-{
- if ( len == 1 && chars ) { // Optimization; avoids allocation
- char c[2];
- c[0] = *chars;
- c[1] = 0;
- return qt_winMB2QString( c, 2 );
- }
- if ( len < 0 )
- return qt_winMB2QString( chars );
- QCString s(chars,len+1);
- return qt_winMB2QString(s);
-}
-
-QCString QWindowsLocalCodec::fromUnicode(const QString& uc, int& lenInOut ) const
-{
- QCString r = qt_winQString2MB( uc, lenInOut );
- lenInOut = r.length();
- return r;
-}
-
-
-const char* QWindowsLocalCodec::name() const
-{
- return "System";
-}
-
-int QWindowsLocalCodec::mibEnum() const
-{
- return 0;
-}
-
-
-int QWindowsLocalCodec::heuristicContentMatch(const char* chars, int len) const
-{
- // ### Not a bad default implementation?
- QString t = toUnicode(chars,len);
- int l = t.length();
- QCString mb = fromUnicode(t,l);
- int i=0;
- while ( i < len )
- if ( chars[i] == mb[i] )
- i++;
- return i;
-}
-
-#else
-
-/* locale names mostly copied from XFree86 */
-static const char * const iso8859_2locales[] = {
- "croatian", "cs", "cs_CS", "cs_CZ","cz", "cz_CZ", "czech", "hr",
- "hr_HR", "hu", "hu_HU", "hungarian", "pl", "pl_PL", "polish", "ro",
- "ro_RO", "rumanian", "serbocroatian", "sh", "sh_SP", "sh_YU", "sk",
- "sk_SK", "sl", "sl_CS", "sl_SI", "slovak", "slovene", "sr_SP", 0 };
-
-static const char * const iso8859_3locales[] = {
- "eo", 0 };
-
-static const char * const iso8859_4locales[] = {
- "ee", "ee_EE", "lt", "lt_LT", "lv", "lv_LV", 0 };
-
-static const char * const iso8859_5locales[] = {
- "bg", "bg_BG", "bulgarian", "mk", "mk_MK",
- "sp", "sp_YU", 0 };
-
-static const char * const iso8859_6locales[] = {
- "ar_AA", "ar_SA", "arabic", 0 };
-
-static const char * const iso8859_7locales[] = {
- "el", "el_GR", "greek", 0 };
-
-static const char * const iso8859_8locales[] = {
- "hebrew", "he", "he_IL", "iw", "iw_IL", 0 };
-
-static const char * const iso8859_9locales[] = {
- "tr", "tr_TR", "turkish", 0 };
-
-static const char * const iso8859_15locales[] = {
- "fr", "fi", "french", "finnish", "et", "et_EE", 0 };
-
-static const char * const koi8_ulocales[] = {
- "uk", "uk_UA", "ru_UA", "ukrainian", 0 };
-
-static const char * const tis_620locales[] = {
- "th", "th_TH", "thai", 0 };
-
-
-static bool try_locale_list( const char * const locale[], const char * lang )
-{
- int i;
- for( i=0; locale[i] && qstrcmp(locale[i], lang); i++ )
- { }
- return locale[i] != 0;
-}
-
-// For the probably_koi8_locales we have to look. the standard says
-// these are 8859-5, but almsot all Russion users uses KOI8-R and
-// incorrectly set $LANG to ru_RU. We'll check tolower() to see what
-// tolower() thinks ru_RU means.
-
-// If you read the history, it seems that many Russians blame ISO and
-// Peristroika for the confusion.
-//
-// The real bug is that some programs break if the user specifies
-// ru_RU.KOI8-R.
-
-static const char * const probably_koi8_rlocales[] = {
- "ru", "ru_SU", "ru_RU", "russian", 0 };
-
-// this means ANY of these locale aliases. if they're aliases for
-// different locales, the code breaks.
-static QTextCodec * ru_RU_codec = 0;
-
-static QTextCodec * ru_RU_hack( const char * i ) {
- if ( ! ru_RU_codec ) {
- QCString origlocale = setlocale( LC_CTYPE, i );
- // unicode koi8r latin5 name
- // 0x044E 0xC0 0xEE CYRILLIC SMALL LETTER YU
- // 0x042E 0xE0 0xCE CYRILLIC CAPITAL LETTER YU
- int latin5 = tolower( 0xCE );
- int koi8r = tolower( 0xE0 );
- if ( koi8r == 0xC0 && latin5 != 0xEE ) {
- ru_RU_codec = QTextCodec::codecForName( "KOI8-R" );
- } else if ( koi8r != 0xC0 && latin5 == 0xEE ) {
- ru_RU_codec = QTextCodec::codecForName( "ISO 8859-5" );
- } else {
- // something else again... let's assume... *throws dice*
- ru_RU_codec = QTextCodec::codecForName( "KOI8-R" );
- qWarning( "QTextCodec: using KOI8-R, probe failed (%02x %02x %s)",
- koi8r, latin5, i );
- }
- setlocale( LC_CTYPE, origlocale.data() );
- }
- return ru_RU_codec;
-}
-
-#endif
-
-static QTextCodec * localeMapper = 0;
-
-void qt_set_locale_codec( QTextCodec *codec )
-{
- localeMapper = codec;
-}
-
-/*! Returns a pointer to the codec most suitable for this locale. */
-
-QTextCodec* QTextCodec::codecForLocale()
-{
- if ( localeMapper )
- return localeMapper;
-
- setup();
-
-#ifdef _OS_WIN32_
- localeMapper = new QWindowsLocalCodec;
-#else
- // Very poorly defined and followed standards causes lots of code
- // to try to get all the cases...
-
- char * lang = qstrdup( getenv("LANG") );
-
- char * p = lang ? strchr( lang, '.' ) : 0;
- if ( !p || *p != '.' ) {
- // Some versions of setlocale return encoding, others not.
- char *ctype = qstrdup( setlocale( LC_CTYPE, 0 ) );
- // Some Linux distributions have broken locales which will return
- // "C" for LC_CTYPE
- if ( qstrcmp( ctype, "C" ) == 0 ) {
- delete [] ctype;
- } else {
- if ( lang )
- delete [] lang;
- lang = ctype;
- p = lang ? strchr( lang, '.' ) : 0;
- }
- }
-
- if( p && *p == '.' ) {
- // if there is an encoding and we don't know it, we return 0
- // User knows what they are doing. Codecs will believe them.
- localeMapper = codecForName( lang );
- if ( !localeMapper ) {
- // Use or codec disagree.
- localeMapper = codecForName( p+1 );
- }
- }
- if ( !localeMapper || !(p && *p == '.') ) {
- // if there is none, we default to 8859-1
- // We could perhaps default to 8859-15.
- if ( try_locale_list( iso8859_2locales, lang ) )
- localeMapper = codecForName( "ISO 8859-2" );
- else if ( try_locale_list( iso8859_3locales, lang ) )
- localeMapper = codecForName( "ISO 8859-3" );
- else if ( try_locale_list( iso8859_4locales, lang ) )
- localeMapper = codecForName( "ISO 8859-4" );
- else if ( try_locale_list( iso8859_5locales, lang ) )
- localeMapper = codecForName( "ISO 8859-5" );
- else if ( try_locale_list( iso8859_6locales, lang ) )
- localeMapper = codecForName( "ISO 8859-6-I" );
- else if ( try_locale_list( iso8859_7locales, lang ) )
- localeMapper = codecForName( "ISO 8859-7" );
- else if ( try_locale_list( iso8859_8locales, lang ) )
- localeMapper = codecForName( "ISO 8859-8-I" );
- else if ( try_locale_list( iso8859_9locales, lang ) )
- localeMapper = codecForName( "ISO 8859-9" );
- else if ( try_locale_list( iso8859_15locales, lang ) )
- localeMapper = codecForName( "ISO 8859-15" );
- else if ( try_locale_list( tis_620locales, lang ) )
- localeMapper = codecForName( "ISO 8859-11" );
- else if ( try_locale_list( koi8_ulocales, lang ) )
- localeMapper = codecForName( "KOI8-U" );
- else if ( try_locale_list( probably_koi8_rlocales, lang ) )
- localeMapper = ru_RU_hack( lang );
- else if (!lang || !(localeMapper = codecForName(lang) ))
- localeMapper = codecForName( "ISO 8859-1" );
- }
- delete[] lang;
-#endif
-
- return localeMapper;
-}
-
-
-/*!
- Searches all installed QTextCodec objects, returning the one
- which best matches given name. Returns NULL if no codec has
- a match closeness above \a accuracy.
-
- \sa heuristicNameMatch()
-*/
-QTextCodec* QTextCodec::codecForName(const char* hint, int accuracy)
-{
- setup();
- QListIterator<QTextCodec> i(*all);
- QTextCodec* result = 0;
- int best=accuracy;
- for ( QTextCodec* cursor; (cursor=i); ++i ) {
- int s = cursor->heuristicNameMatch(hint);
- if ( s > best ) {
- best = s;
- result = cursor;
- }
- }
- return result;
-}
-
-
-/*!
- Searches all installed QTextCodec objects, returning the one
- which most recognizes the given content. May return 0.
-
- Note that this is often a poor choice, since character
- encodings often use most of the available character sequences,
- and so only by linguistic analysis could a true match be made.
-
- \sa heuristicContentMatch()
-*/
-QTextCodec* QTextCodec::codecForContent(const char* chars, int len)
-{
- setup();
- QListIterator<QTextCodec> i(*all);
- QTextCodec* result = 0;
- int best=0;
- for ( QTextCodec* cursor; (cursor=i); ++i ) {
- int s = cursor->heuristicContentMatch(chars,len);
- if ( s > best ) {
- best = s;
- result = cursor;
- }
- }
- return result;
-}
-
-
-/*!
- \fn const char* QTextCodec::name() const
- Subclasses of QTextCodec must reimplement this function. It returns
- the name of the encoding supported by the subclass. When choosing
- a name for an encoding, consider these points:
- <ul>
- <li>On X11, heuristicNameMatch( const char * hint )
- is used to test if a the QTextCodec
- can convert between Unicode and the encoding of a font
- with encoding \e hint, such as "iso8859-1" for Latin-1 fonts,
- "koi8-r" for Russian KOI8 fonts.
- The default algorithm of heuristicNameMatch() uses name().
- <li>Some applications may use this function to present
- encodings to the end user.
- </ul>
-*/
-
-/*!
- \fn int QTextCodec::mibEnum() const
-
- Subclasses of QTextCodec must reimplement this function. It returns the
- MIBenum (see
- <a href="ftp://ftp.isi.edu/in-notes/iana/assignments/character-sets">
- the IANA character-sets encoding file</a> for more information).
- It is important that each QTextCodec subclass return the correct unique
- value for this function.
-*/
-
-
-/*!
- \fn int QTextCodec::heuristicContentMatch(const char* chars, int len) const
-
- Subclasses of QTextCodec must reimplement this function. It examines
- the first \a len bytes of \a chars and returns a value indicating how
- likely it is that the string is a prefix of text encoded in the
- encoding of the subclass. Any negative return value indicates that the text
- is detectably not in the encoding (eg. it contains undefined characters).
- A return value of 0 indicates that the text should be decoded with this
- codec rather than as ASCII, but there
- is no particular evidence. The value should range up to \a len. Thus,
- most decoders will return -1, 0, or -\a len.
-
- The characters are not null terminated.
-
- \sa codecForContent().
-*/
-
-
-/*!
- Creates a QTextDecoder which stores enough state to decode chunks
- of char* data to create chunks of Unicode data. The default implementation
- creates a stateless decoder, which is sufficient for only the simplest
- encodings where each byte corresponds to exactly one Unicode character.
-
- The caller is responsible for deleting the returned object.
-*/
-QTextDecoder* QTextCodec::makeDecoder() const
-{
- return new QTextStatelessDecoder(this);
-}
-
-
-/*!
- Creates a QTextEncoder which stores enough state to encode chunks
- of Unicode data as char* data. The default implementation
- creates a stateless encoder, which is sufficient for only the simplest
- encodings where each Unicode character corresponds to exactly one char.
-
- The caller is responsible for deleting the returned object.
-*/
-QTextEncoder* QTextCodec::makeEncoder() const
-{
- return new QTextStatelessEncoder(this);
-}
-
-
-/*!
- Subclasses of QTextCodec must reimplement this function or
- makeDecoder(). It converts the first \a len characters of \a chars
- to Unicode.
-
- The default implementation makes a decoder with makeDecoder() and
- converts the input with that. Note that the default makeDecoder()
- implementation makes a decoder that simply calls
- this function, hence subclasses \e must reimplement one function or
- the other to avoid infinite recursion.
-*/
-QString QTextCodec::toUnicode(const char* chars, int len) const
-{
- QTextDecoder* i = makeDecoder();
- QString result = i->toUnicode(chars,len);
- delete i;
- return result;
-}
-
-
-/*!
- Subclasses of QTextCodec must reimplement either this function or
- makeEncoder(). It converts the first \a lenInOut characters of \a
- uc from Unicode to the encoding of the subclass. If \a lenInOut
- is negative or too large, the length of \a uc is used instead.
-
- The value returned is the property of the caller, which is
- responsible for deleting it with "delete []". The length of the
- resulting Unicode character sequence is returned in \a lenInOut.
-
- The default implementation makes an encoder with makeEncoder() and
- converts the input with that. Note that the default makeEncoder()
- implementation makes an encoder that simply calls
- this function, hence subclasses \e must reimplement one function or
- the other to avoid infinite recursion.
-*/
-
-QCString QTextCodec::fromUnicode(const QString& uc, int& lenInOut) const
-{
- QTextEncoder* i = makeEncoder();
- QCString result = i->fromUnicode(uc, lenInOut);
- delete i;
- return result;
-}
-
-/*!
- \overload QCString QTextCodec::fromUnicode(const QString& uc) const
-*/
-QCString QTextCodec::fromUnicode(const QString& uc) const
-{
- int l = uc.length();
- return fromUnicode(uc,l);
-}
-
-/*!
- \overload QString QTextCodec::toUnicode(const QByteArray& a, int len) const
-*/
-QString QTextCodec::toUnicode(const QByteArray& a, int len) const
-{
- int l = a.size();
- if( l > 0 && a.data()[l - 1] == '\0' ) l--;
- l = QMIN( l, len );
- return toUnicode( a.data(), l );
-}
-
-/*!
- \overload QString QTextCodec::toUnicode(const QByteArray& a) const
-*/
-QString QTextCodec::toUnicode(const QByteArray& a) const
-{
- int l = a.size();
- if( l > 0 && a.data()[l - 1] == '\0' ) l--;
- return toUnicode( a.data(), l );
-}
-
-/*!
- \overload QString QTextCodec::toUnicode(const char* chars) const
-*/
-QString QTextCodec::toUnicode(const char* chars) const
-{
- return toUnicode(chars,qstrlen(chars));
-}
-
-/*!
- Returns TRUE if the unicode character \a ch can be fully encoded
- with this codec. The default implementation tests if the result of
- toUnicode(fromUnicode(ch)) is the original \a ch. Subclasses may be
- able to improve the efficiency.
-*/
-bool QTextCodec::canEncode( QChar ch ) const
-{
- return toUnicode(fromUnicode(ch)) == ch;
-}
-
-/*!
- Returns TRUE if the unicode string \a s can be fully encoded
- with this codec. The default implementation tests if the result of
- toUnicode(fromUnicode(s)) is the original \a s. Subclasses may be
- able to improve the efficiency.
-*/
-bool QTextCodec::canEncode( const QString& s ) const
-{
- return toUnicode(fromUnicode(s)) == s;
-}
-
-
-
-/*!
- \class QTextEncoder qtextcodec.h
- \brief State-based encoder
-
- A QTextEncoder converts Unicode into another format, remembering
- any state that is required between calls.
-
- \sa QTextCodec::makeEncoder()
-*/
-
-/*!
- Destructs the encoder.
-*/
-QTextEncoder::~QTextEncoder()
-{
-}
-/*!
- \fn QCString QTextEncoder::fromUnicode(const QString& uc, int& lenInOut)
-
- Converts \a lenInOut characters (not bytes) from \a uc, producing
- a QCString. \a lenInOut will also be set to the
- \link QCString::length() length\endlink of the result (in bytes).
-
- The encoder is free to record state to use when subsequent calls are
- made to this function (for example, it might change modes with escape
- sequences if needed during the encoding of one string, then assume that
- mode applies when a subsequent call begins).
-*/
-
-/*!
- \class QTextDecoder qtextcodec.h
- \brief State-based decoder
-
- A QTextEncoder converts a text format into Unicode, remembering
- any state that is required between calls.
-
- \sa QTextCodec::makeEncoder()
-*/
-
-
-/*!
- Destructs the decoder.
-*/
-QTextDecoder::~QTextDecoder()
-{
-}
-
-/*!
- \fn QString QTextDecoder::toUnicode(const char* chars, int len)
-
- Converts the first \a len bytes at \a chars to Unicode, returning the
- result.
-
- If not all characters are used (eg. only part of a multi-byte
- encoding is at the end of the characters), the decoder remembers
- enough state to continue with the next call to this function.
-*/
-
-#define CHAINED 0xffff
-
-struct QMultiByteUnicodeTable {
- // If multibyte, ignore unicode and index into multibyte
- // with the next character.
- QMultiByteUnicodeTable() : unicode(0xfffd), multibyte(0) { }
-
- ~QMultiByteUnicodeTable()
- {
- if ( multibyte )
- delete [] multibyte;
- }
-
- ushort unicode;
- QMultiByteUnicodeTable* multibyte;
-};
-
-#ifndef QT_NO_CODECS
-static int getByte(char* &cursor)
-{
- int byte = 0;
- if ( *cursor ) {
- if ( cursor[1] == 'x' )
- byte = strtol(cursor+2,&cursor,16);
- else if ( cursor[1] == 'd' )
- byte = strtol(cursor+2,&cursor,10);
- else
- byte = strtol(cursor+2,&cursor,8);
- }
- return byte&0xff;
-}
-
-class QTextCodecFromIOD;
-
-class QTextCodecFromIODDecoder : public QTextDecoder {
- const QTextCodecFromIOD* codec;
- QMultiByteUnicodeTable* mb;
-public:
- QTextCodecFromIODDecoder(const QTextCodecFromIOD* c);
- QString toUnicode(const char* chars, int len);
-};
-
-class QTextCodecFromIOD : public QTextCodec {
- friend class QTextCodecFromIODDecoder;
-
- QCString n;
-
- // If from_unicode_page[row()][cell()] is 0 and from_unicode_page_multibyte,
- // use from_unicode_page_multibyte[row()][cell()] as string.
- char** from_unicode_page;
- char*** from_unicode_page_multibyte;
- char unkn;
-
- // Only one of these is used
- ushort* to_unicode;
- QMultiByteUnicodeTable* to_unicode_multibyte;
- int max_bytes_per_char;
- QStrList aliases;
-
- bool stateless() const { return !to_unicode_multibyte; }
-
-public:
- QTextCodecFromIOD(QIODevice* iod)
- {
- from_unicode_page = 0;
- to_unicode_multibyte = 0;
- to_unicode = 0;
- from_unicode_page_multibyte = 0;
- max_bytes_per_char = 1;
-
- const int maxlen=100;
- char line[maxlen];
- char esc='\\';
- char comm='%';
- bool incmap = FALSE;
- while (iod->readLine(line,maxlen) > 0) {
- if (0==qstrnicmp(line,"<code_set_name>",15))
- n = line+15;
- else if (0==qstrnicmp(line,"<escape_char> ",14))
- esc = line[14];
- else if (0==qstrnicmp(line,"<comment_char> ",15))
- comm = line[15];
- else if (line[0]==comm && 0==qstrnicmp(line+1," alias ",7)) {
- aliases.append(line+8);
- } else if (0==qstrnicmp(line,"CHARMAP",7)) {
- if (!from_unicode_page) {
- from_unicode_page = new char*[256];
- for (int i=0; i<256; i++)
- from_unicode_page[i]=0;
- }
- if (!to_unicode) {
- to_unicode = new ushort[256];
- }
- incmap = TRUE;
- } else if (0==qstrnicmp(line,"END CHARMAP",11))
- break;
- else if (incmap) {
- char* cursor = line;
- int byte,unicode=-1;
- ushort* mb_unicode=0;
- const int maxmb=8; // more -> we'll need to improve datastructures
- char mb[maxmb+1];
- int nmb=0;
-
- while (*cursor) {
- if (cursor[0]=='<' && cursor[1]=='U' &&
- cursor[2]>='0' && cursor[2]<='9' &&
- cursor[3]>='0' && cursor[3]<='9') {
-
- unicode = strtol(cursor+2,&cursor,16);
-
- } else if (*cursor==esc) {
-
- byte = getByte(cursor);
-
- if ( *cursor == esc ) {
- if ( !to_unicode_multibyte ) {
- to_unicode_multibyte =
- new QMultiByteUnicodeTable[256];
- for (int i=0; i<256; i++) {
- to_unicode_multibyte[i].unicode =
- to_unicode[i];
- to_unicode_multibyte[i].multibyte = 0;
- }
- delete [] to_unicode;
- to_unicode = 0;
- }
- QMultiByteUnicodeTable* mbut =
- to_unicode_multibyte+byte;
- mb[nmb++] = byte;
- while ( nmb < maxmb && *cursor == esc ) {
- // Always at least once
-
- mbut->unicode = CHAINED;
- byte = getByte(cursor);
- mb[nmb++] = byte;
- if (!mbut->multibyte) {
- mbut->multibyte =
- new QMultiByteUnicodeTable[256];
- }
- mbut = mbut->multibyte+byte;
- mb_unicode = & mbut->unicode;
- }
-
- if ( nmb > max_bytes_per_char )
- max_bytes_per_char = nmb;
- }
- } else {
- cursor++;
- }
- }
-
- if (unicode >= 0 && unicode <= 0xffff)
- {
- QChar ch((ushort)unicode);
- if (!from_unicode_page[ch.row()]) {
- from_unicode_page[ch.row()] = new char[256];
- for (int i=0; i<256; i++)
- from_unicode_page[ch.row()][i]=0;
- }
- if ( mb_unicode ) {
- from_unicode_page[ch.row()][ch.cell()] = 0;
- if (!from_unicode_page_multibyte) {
- from_unicode_page_multibyte = new char**[256];
- for (int i=0; i<256; i++)
- from_unicode_page_multibyte[i]=0;
- }
- if (!from_unicode_page_multibyte[ch.row()]) {
- from_unicode_page_multibyte[ch.row()] = new char*[256];
- for (int i=0; i<256; i++)
- from_unicode_page_multibyte[ch.row()][i] = 0;
- }
- mb[nmb++] = 0;
- from_unicode_page_multibyte[ch.row()][ch.cell()]
- = qstrdup(mb);
- *mb_unicode = unicode;
- } else {
- from_unicode_page[ch.row()][ch.cell()] = (char)byte;
- if ( to_unicode )
- to_unicode[byte] = unicode;
- else
- to_unicode_multibyte[byte].unicode = unicode;
- }
- } else {
- }
- }
- }
- n = n.stripWhiteSpace();
-
- unkn = '?'; // ##### Might be a bad choice.
- }
-
- ~QTextCodecFromIOD()
- {
- if ( from_unicode_page ) {
- for (int i=0; i<256; i++)
- if (from_unicode_page[i])
- delete [] from_unicode_page[i];
- }
- if ( from_unicode_page_multibyte ) {
- for (int i=0; i<256; i++)
- if (from_unicode_page_multibyte[i])
- for (int j=0; j<256; j++)
- if (from_unicode_page_multibyte[i][j])
- delete [] from_unicode_page_multibyte[i][j];
- }
- if ( to_unicode )
- delete [] to_unicode;
- if ( to_unicode_multibyte )
- delete [] to_unicode_multibyte;
- }
-
- bool ok() const
- {
- return !!from_unicode_page;
- }
-
- QTextDecoder* makeDecoder() const
- {
- if ( stateless() )
- return QTextCodec::makeDecoder();
- else
- return new QTextCodecFromIODDecoder(this);
- }
-
- const char* name() const
- {
- return n;
- }
-
- int mibEnum() const
- {
- return 0; // #### Unknown.
- }
-
- int heuristicContentMatch(const char*, int) const
- {
- return 0;
- }
-
- int heuristicNameMatch(const char* hint) const
- {
- int bestr = QTextCodec::heuristicNameMatch(hint);
- QStrListIterator it(aliases);
- char* a;
- while ((a=it.current())) {
- ++it;
- int r = simpleHeuristicNameMatch(a,hint);
- if (r > bestr)
- bestr = r;
- }
- return bestr;
- }
-
- QString toUnicode(const char* chars, int len) const
- {
- const uchar* uchars = (const uchar*)chars;
- QString result;
- QMultiByteUnicodeTable* multibyte=to_unicode_multibyte;
- if ( multibyte ) {
- while (len--) {
- QMultiByteUnicodeTable& mb = multibyte[*uchars];
- if ( mb.multibyte ) {
- // Chained multi-byte
- multibyte = mb.multibyte;
- } else {
- result += QChar(mb.unicode);
- multibyte=to_unicode_multibyte;
- }
- uchars++;
- }
- } else {
- while (len--)
- result += QChar(to_unicode[*uchars++]);
- }
- return result;
- }
-
- QCString fromUnicode(const QString& uc, int& lenInOut) const
- {
- if (lenInOut > (int)uc.length())
- lenInOut = uc.length();
- int rlen = lenInOut*max_bytes_per_char;
- QCString rstr(rlen);
- char* cursor = rstr.data();
- char* s=0;
- int l = lenInOut;
- int lout = 0;
- for (int i=0; i<l; i++) {
- QChar ch = uc[i];
- if ( ch == QChar::null ) {
- // special
- *cursor++ = 0;
- } else if ( from_unicode_page[ch.row()] &&
- from_unicode_page[ch.row()][ch.cell()] )
- {
- *cursor++ = from_unicode_page[ch.row()][ch.cell()];
- lout++;
- } else if ( from_unicode_page_multibyte &&
- from_unicode_page_multibyte[ch.row()] &&
- (s=from_unicode_page_multibyte[ch.row()][ch.cell()]) )
- {
- while (*s) {
- *cursor++ = *s++;
- lout++;
- }
- } else {
- *cursor++ = unkn;
- lout++;
- }
- }
- *cursor = 0;
- lenInOut = lout;
- return rstr;
- }
-};
-
-QTextCodecFromIODDecoder::QTextCodecFromIODDecoder(const QTextCodecFromIOD* c) :
- codec(c)
-{
- mb = codec->to_unicode_multibyte;
-}
-
-QString QTextCodecFromIODDecoder::toUnicode(const char* chars, int len)
-{
- const uchar* uchars = (const uchar*)chars;
- QString result;
- while (len--) {
- QMultiByteUnicodeTable& t = mb[*uchars];
- if ( t.multibyte ) {
- // Chained multi-byte
- mb = t.multibyte;
- } else {
- if ( t.unicode )
- result += QChar(t.unicode);
- mb=codec->to_unicode_multibyte;
- }
- uchars++;
- }
- return result;
-}
-
-/*!
- Reads a POSIX2 charmap definition from \a iod.
- The parser recognizes the following lines:
-<pre>
- &lt;code_set_name&gt; <i>name</i>
- &lt;escape_char&gt; <i>character</i>
- % alias <i>alias</i>
- CHARMAP
- &lt;<i>token</i>&gt; /x<i>hexbyte</i> &lt;U<i>unicode</i>&gt; ...
- &lt;<i>token</i>&gt; /d<i>decbyte</i> &lt;U<i>unicode</i>&gt; ...
- &lt;<i>token</i>&gt; /<i>octbyte</i> &lt;U<i>unicode</i>&gt; ...
- &lt;<i>token</i>&gt; /<i>any</i>/<i>any</i>... &lt;U<i>unicode</i>&gt; ...
- END CHARMAP
-</pre>
-
- The resulting QTextCodec is returned (and also added to the
- global list of codecs). The name() of the result is taken
- from the code_set_name.
-
- Note that a codec constructed in this way uses much more memory
- and is slower than a hand-written QTextCodec subclass, since
- tables in code are in memory shared by all applications simultaneously
- using Qt.
-
- \sa loadCharmapFile()
-*/
-QTextCodec* QTextCodec::loadCharmap(QIODevice* iod)
-{
- QTextCodecFromIOD* r = new QTextCodecFromIOD(iod);
- if ( !r->ok() ) {
- delete r;
- r = 0;
- }
- return r;
-}
-
-/*!
- A convenience function for loadCharmap().
-*/
-QTextCodec* QTextCodec::loadCharmapFile(QString filename)
-{
- QFile f(filename);
- if (f.open(IO_ReadOnly)) {
- QTextCodecFromIOD* r = new QTextCodecFromIOD(&f);
- if ( !r->ok() )
- delete r;
- else
- return r;
- }
- return 0;
-}
-#endif //QT_NO_CODECS
-
-
-/*!
- Returns a string representing the current language.
-*/
-
-const char* QTextCodec::locale()
-{
- static QCString lang;
- if ( lang.isEmpty() ) {
- lang = getenv( "LANG" ); //########Windows??
- if ( lang.isEmpty() )
- lang = "C";
- }
- return lang;
-}
-
-
-
-#ifndef QT_NO_CODECS
-
-class QSimpleTextCodec: public QTextCodec
-{
-public:
- QSimpleTextCodec( int );
- ~QSimpleTextCodec();
-
- QString toUnicode(const char* chars, int len) const;
- QCString fromUnicode(const QString& uc, int& lenInOut ) const;
-
- const char* name() const;
- int mibEnum() const;
-
- int heuristicContentMatch(const char* chars, int len) const;
-
- int heuristicNameMatch(const char* hint) const;
-
-private:
- int forwardIndex;
-};
-
-
-#define LAST_MIB 2259
-
-static struct {
- const char * cs;
- int mib;
- Q_UINT16 values[128];
-} unicodevalues[] = {
- // from RFC 1489, ftp://ftp.isi.edu/in-notes/rfc1489.txt
- { "KOI8-R", 2084,
- { 0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524,
- 0x252C, 0x2534, 0x253C, 0x2580, 0x2584, 0x2588, 0x258C, 0x2590,
- 0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2219/**/, 0x221A, 0x2248,
- 0x2264, 0x2265, 0x00A0, 0x2321, 0x00B0, 0x00B2, 0x00B7, 0x00F7,
- 0x2550, 0x2551, 0x2552, 0x0451, 0x2553, 0x2554, 0x2555, 0x2556,
- 0x2557, 0x2558, 0x2559, 0x255A, 0x255B, 0x255C, 0x255D, 0x255E,
- 0x255F, 0x2560, 0x2561, 0x0401, 0x2562, 0x2563, 0x2564, 0x2565,
- 0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x256B, 0x256C, 0x00A9,
- 0x044E, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433,
- 0x0445, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E,
- 0x043F, 0x044F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432,
- 0x044C, 0x044B, 0x0437, 0x0448, 0x044D, 0x0449, 0x0447, 0x044A,
- 0x042E, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413,
- 0x0425, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E,
- 0x041F, 0x042F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412,
- 0x042C, 0x042B, 0x0417, 0x0428, 0x042D, 0x0429, 0x0427, 0x042A } },
- // /**/ - The BULLET OPERATOR is confused. Some people think
- // it should be 0x2022 (BULLET).
-
- // from RFC 2319, ftp://ftp.isi.edu/in-notes/rfc2319.txt
- { "KOI8-U", 2088,
- { 0x2500, 0x2502, 0x250C, 0x2510, 0x2514, 0x2518, 0x251C, 0x2524,
- 0x252C, 0x2534, 0x253C, 0x2580, 0x2584, 0x2588, 0x258C, 0x2590,
- 0x2591, 0x2592, 0x2593, 0x2320, 0x25A0, 0x2219, 0x221A, 0x2248,
- 0x2264, 0x2265, 0x00A0, 0x2321, 0x00B0, 0x00B2, 0x00B7, 0x00F7,
- 0x2550, 0x2551, 0x2552, 0x0451, 0x0454, 0x2554, 0x0456, 0x0457,
- 0x2557, 0x2558, 0x2559, 0x255A, 0x255B, 0x0491, 0x255D, 0x255E,
- 0x255F, 0x2560, 0x2561, 0x0401, 0x0404, 0x2563, 0x0406, 0x0407,
- 0x2566, 0x2567, 0x2568, 0x2569, 0x256A, 0x0490, 0x256C, 0x00A9,
- 0x044E, 0x0430, 0x0431, 0x0446, 0x0434, 0x0435, 0x0444, 0x0433,
- 0x0445, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E,
- 0x043F, 0x044F, 0x0440, 0x0441, 0x0442, 0x0443, 0x0436, 0x0432,
- 0x044C, 0x044B, 0x0437, 0x0448, 0x044D, 0x0449, 0x0447, 0x044A,
- 0x042E, 0x0410, 0x0411, 0x0426, 0x0414, 0x0415, 0x0424, 0x0413,
- 0x0425, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E,
- 0x041F, 0x042F, 0x0420, 0x0421, 0x0422, 0x0423, 0x0416, 0x0412,
- 0x042C, 0x042B, 0x0417, 0x0428, 0x042D, 0x0429, 0x0427, 0x042A } },
-
- // next bits generated from tables on the Unicode 2.0 CD. we can
- // use these tables since this is part of the transition to using
- // unicode everywhere in qt.
-
- // $ for A in 8 9 A B C D E F ; do for B in 0 1 2 3 4 5 6 7 8 9 A B C D E F ; do echo 0x${A}${B} 0xFFFD ; done ; done > /tmp/digits ; for a in 8859-* ; do ( awk '/^0x[89ABCDEF]/{ print $1, $2 }' < $a ; cat /tmp/digits ) | sort | uniq -w4 | cut -c6- | paste '-d ' - - - - - - - - | sed -e 's/ /, /g' -e 's/$/,/' -e '$ s/,$/} },/' -e '1 s/^/{ /' > ~/tmp/$a ; done
-
- // then I inserted the files manually.
- { "ISO 8859-2", 5,
- { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
- 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
- 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
- 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
- 0x00A0, 0x0104, 0x02D8, 0x0141, 0x00A4, 0x013D, 0x015A, 0x00A7,
- 0x00A8, 0x0160, 0x015E, 0x0164, 0x0179, 0x00AD, 0x017D, 0x017B,
- 0x00B0, 0x0105, 0x02DB, 0x0142, 0x00B4, 0x013E, 0x015B, 0x02C7,
- 0x00B8, 0x0161, 0x015F, 0x0165, 0x017A, 0x02DD, 0x017E, 0x017C,
- 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7,
- 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E,
- 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7,
- 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF,
- 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7,
- 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F,
- 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7,
- 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9} },
- { "ISO 8859-3", 6,
- { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
- 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
- 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
- 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
- 0x00A0, 0x0126, 0x02D8, 0x00A3, 0x00A4, 0xFFFD, 0x0124, 0x00A7,
- 0x00A8, 0x0130, 0x015E, 0x011E, 0x0134, 0x00AD, 0xFFFD, 0x017B,
- 0x00B0, 0x0127, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x0125, 0x00B7,
- 0x00B8, 0x0131, 0x015F, 0x011F, 0x0135, 0x00BD, 0xFFFD, 0x017C,
- 0x00C0, 0x00C1, 0x00C2, 0xFFFD, 0x00C4, 0x010A, 0x0108, 0x00C7,
- 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
- 0xFFFD, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x0120, 0x00D6, 0x00D7,
- 0x011C, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x016C, 0x015C, 0x00DF,
- 0x00E0, 0x00E1, 0x00E2, 0xFFFD, 0x00E4, 0x010B, 0x0109, 0x00E7,
- 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
- 0xFFFD, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x0121, 0x00F6, 0x00F7,
- 0x011D, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x016D, 0x015D, 0x02D9} },
- { "ISO 8859-4", 7,
- { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
- 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
- 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
- 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
- 0x00A0, 0x0104, 0x0138, 0x0156, 0x00A4, 0x0128, 0x013B, 0x00A7,
- 0x00A8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00AD, 0x017D, 0x00AF,
- 0x00B0, 0x0105, 0x02DB, 0x0157, 0x00B4, 0x0129, 0x013C, 0x02C7,
- 0x00B8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014A, 0x017E, 0x014B,
- 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E,
- 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x012A,
- 0x0110, 0x0145, 0x014C, 0x0136, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
- 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x0168, 0x016A, 0x00DF,
- 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F,
- 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x012B,
- 0x0111, 0x0146, 0x014D, 0x0137, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
- 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x0169, 0x016B, 0x02D9} },
- { "ISO 8859-5", 8,
- { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
- 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
- 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
- 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
- 0x00A0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407,
- 0x0408, 0x0409, 0x040A, 0x040B, 0x040C, 0x00AD, 0x040E, 0x040F,
- 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
- 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
- 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
- 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
- 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
- 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
- 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
- 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F,
- 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457,
- 0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x00A7, 0x045E, 0x045F} },
- { "ISO 8859-6-I", 82,
- { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
- 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
- 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
- 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
- 0x00A0, 0xFFFD, 0xFFFD, 0xFFFD, 0x00A4, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x060C, 0x00AD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0x061B, 0xFFFD, 0xFFFD, 0xFFFD, 0x061F,
- 0xFFFD, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,
- 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F,
- 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637,
- 0x0638, 0x0639, 0x063A, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647,
- 0x0648, 0x0649, 0x064A, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F,
- 0x0650, 0x0651, 0x0652, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD} },
- { "ISO 8859-7", 10,
- { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
- 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
- 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
- 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
- 0x00A0, 0x2018, 0x2019, 0x00A3, 0xFFFD, 0xFFFD, 0x00A6, 0x00A7,
- 0x00A8, 0x00A9, 0xFFFD, 0x00AB, 0x00AC, 0x00AD, 0xFFFD, 0x2015,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x0385, 0x0386, 0x00B7,
- 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F,
- 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
- 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
- 0x03A0, 0x03A1, 0xFFFD, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7,
- 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF,
- 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7,
- 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
- 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7,
- 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0xFFFD} },
- { "ISO 8859-8-I", 85,
- { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
- 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
- 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
- 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
- 0x00A0, 0xFFFD, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
- 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x203E,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
- 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x2017,
- 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7,
- 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF,
- 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7,
- 0x05E8, 0x05E9, 0x05EA, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD} },
- { "ISO 8859-9", 12,
- { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
- 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
- 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
- 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
- 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
- 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
- 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
- 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
- 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
- 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
- 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF,
- 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
- 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
- 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
- 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF} },
- { "ISO 8859-10", 13,
- { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
- 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
- 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
- 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
- 0x00A0, 0x0104, 0x0112, 0x0122, 0x012A, 0x0128, 0x0136, 0x00A7,
- 0x013B, 0x0110, 0x0160, 0x0166, 0x017D, 0x00AD, 0x016A, 0x014A,
- 0x00B0, 0x0105, 0x0113, 0x0123, 0x012B, 0x0129, 0x0137, 0x00B7,
- 0x013C, 0x0111, 0x0161, 0x0167, 0x017E, 0x2015, 0x016B, 0x014B,
- 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E,
- 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x00CF,
- 0x00D0, 0x0145, 0x014C, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x0168,
- 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
- 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F,
- 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x00EF,
- 0x00F0, 0x0146, 0x014D, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x0169,
- 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x0138} },
- { "ISO 8859-13", 109,
- { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
- 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
- 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
- 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
- 0x00A0, 0x201D, 0x00A2, 0x00A3, 0x00A4, 0x201E, 0x00A6, 0x00A7,
- 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x201C, 0x00B5, 0x00B6, 0x00B7,
- 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6,
- 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112,
- 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B,
- 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7,
- 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF,
- 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113,
- 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C,
- 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7,
- 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x2019} },
- { "ISO 8859-14", 110,
- { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
- 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
- 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
- 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
- 0x00A0, 0x1E02, 0x1E03, 0x00A3, 0x010A, 0x010B, 0x1E0A, 0x00A7,
- 0x1E80, 0x00A9, 0x1E82, 0x1E0B, 0x1EF2, 0x00AD, 0x00AE, 0x0178,
- 0x1E1E, 0x1E1F, 0x0120, 0x0121, 0x1E40, 0x1E41, 0x00B6, 0x1E56,
- 0x1E81, 0x1E57, 0x1E83, 0x1E60, 0x1EF3, 0x1E84, 0x1E85, 0x1E61,
- 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
- 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
- 0x0174, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x1E6A,
- 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x0176, 0x00DF,
- 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
- 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
- 0x0175, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x1E6B,
- 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x0177, 0x00FF} },
- { "ISO 8859-15", 111,
- { 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087,
- 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F,
- 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097,
- 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F,
- 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AC, 0x00A5, 0x0160, 0x00A7,
- 0x0161, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x017D, 0x00B5, 0x00B6, 0x00B7,
- 0x017E, 0x00B9, 0x00BA, 0x00BB, 0x0152, 0x0153, 0x0178, 0x00BF,
- 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
- 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
- 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
- 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
- 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
- 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
- 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
- 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF} },
-
- // next bits generated again from tables on the Unicode 3.0 CD.
-
- // $ for a in CP* ; do ( awk '/^0x[89ABCDEF]/{ print $1, $2 }' < $a ) | sort | sed -e 's/#UNDEF.*$/0xFFFD/' | cut -c6- | paste '-d ' - - - - - - - - | sed -e 's/ /, /g' -e 's/$/,/' -e '$ s/,$/} },/' -e '1 s/^/{ /' > ~/tmp/$a ; done
-
- { "CP 874", 0, //### what is the mib?
- { 0x20AC, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x2026, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0x00A0, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07,
- 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F,
- 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17,
- 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F,
- 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27,
- 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F,
- 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37,
- 0x0E38, 0x0E39, 0x0E3A, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x0E3F,
- 0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47,
- 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F,
- 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57,
- 0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD} },
- { "CP 1250", 2250,
- { 0x20AC, 0xFFFD, 0x201A, 0xFFFD, 0x201E, 0x2026, 0x2020, 0x2021,
- 0xFFFD, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179,
- 0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
- 0xFFFD, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A,
- 0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7,
- 0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B,
- 0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
- 0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C,
- 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7,
- 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E,
- 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7,
- 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF,
- 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7,
- 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F,
- 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7,
- 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9} },
- { "CP 1251", 2251,
- { 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021,
- 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F,
- 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
- 0xFFFD, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F,
- 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7,
- 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407,
- 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7,
- 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457,
- 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417,
- 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F,
- 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427,
- 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F,
- 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437,
- 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F,
- 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447,
- 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F} },
- { "CP 1252", 2252,
- { 0x20AC, 0xFFFD, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
- 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0xFFFD, 0x017D, 0xFFFD,
- 0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
- 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0xFFFD, 0x017E, 0x0178,
- 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
- 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
- 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
- 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
- 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
- 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
- 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF,
- 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
- 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
- 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
- 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF} },
- { "CP 1253", 2253,
- { 0x20AC, 0xFFFD, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
- 0xFFFD, 0x2030, 0xFFFD, 0x2039, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
- 0xFFFD, 0x2122, 0xFFFD, 0x203A, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
- 0x00A8, 0x00A9, 0xFFFD, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7,
- 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F,
- 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397,
- 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F,
- 0x03A0, 0x03A1, 0xFFFD, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7,
- 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF,
- 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7,
- 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF,
- 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7,
- 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0xFFFD} },
- { "CP 1254", 2254,
- { 0x20AC, 0xFFFD, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
- 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
- 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0xFFFD, 0xFFFD, 0x0178,
- 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
- 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
- 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
- 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
- 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF,
- 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7,
- 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF,
- 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
- 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF,
- 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7,
- 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF} },
- { "CP 1255", 2255,
- { 0x20AC, 0xFFFD, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
- 0x02C6, 0x2030, 0xFFFD, 0x2039, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
- 0x02DC, 0x2122, 0xFFFD, 0x203A, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AA, 0x00A5, 0x00A6, 0x00A7,
- 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
- 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
- 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7,
- 0x05B8, 0x05B9, 0xFFFD, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF,
- 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3,
- 0x05F4, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7,
- 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF,
- 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7,
- 0x05E8, 0x05E9, 0x05EA, 0xFFFD, 0xFFFD, 0x200E, 0x200F, 0xFFFD} },
- { "CP 1256", 2256,
- { 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
- 0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688,
- 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
- 0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA,
- 0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
- 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
- 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F,
- 0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627,
- 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F,
- 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7,
- 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0641, 0x0642, 0x0643,
- 0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7,
- 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF,
- 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7,
- 0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2} },
- { "CP 1257", 2257,
- { 0x20AC, 0xFFFD, 0x201A, 0xFFFD, 0x201E, 0x2026, 0x2020, 0x2021,
- 0xFFFD, 0x2030, 0xFFFD, 0x2039, 0xFFFD, 0x00A8, 0x02C7, 0x00B8,
- 0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
- 0xFFFD, 0x2122, 0xFFFD, 0x203A, 0xFFFD, 0x00AF, 0x02DB, 0xFFFD,
- 0x00A0, 0xFFFD, 0x00A2, 0x00A3, 0x00A4, 0xFFFD, 0x00A6, 0x00A7,
- 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
- 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6,
- 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112,
- 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B,
- 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7,
- 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF,
- 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113,
- 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C,
- 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7,
- 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9} },
- { "CP 1258", 2258,
- { 0x20AC, 0xFFFD, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021,
- 0x02C6, 0x2030, 0xFFFD, 0x2039, 0x0152, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014,
- 0x02DC, 0x2122, 0xFFFD, 0x203A, 0x0153, 0xFFFD, 0xFFFD, 0x0178,
- 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7,
- 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF,
- 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7,
- 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF,
- 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x00C5, 0x00C6, 0x00C7,
- 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x0300, 0x00CD, 0x00CE, 0x00CF,
- 0x0110, 0x00D1, 0x0309, 0x00D3, 0x00D4, 0x01A0, 0x00D6, 0x00D7,
- 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x01AF, 0x0303, 0x00DF,
- 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x00E5, 0x00E6, 0x00E7,
- 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0301, 0x00ED, 0x00EE, 0x00EF,
- 0x0111, 0x00F1, 0x0323, 0x00F3, 0x00F4, 0x01A1, 0x00F6, 0x00F7,
- 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x01B0, 0x20AB, 0x00FF} },
-
- // this one is generated from the charmap file located in /usr/share/i18n/charmaps
- // on most Linux distributions. The thai character set tis620 is byte by byte equivalent
- // to iso8859-11, so we name it 8859-11 here, but recognise the name tis620 too.
-
- // $ for A in 8 9 A B C D E F ; do for B in 0 1 2 3 4 5 6 7 8 9 A B C D E F ; do echo x${A}${B} 0xFFFD ; done ; done > /tmp/digits ; ( cut -c25- < TIS-620 ; cat /tmp/digits ) | awk '/^x[89ABCDEF]/{ print $1, $2 }' | sed -e 's/<U/0x/' -e 's/>//' | sort | uniq -w4 | cut -c5- | paste '-d ' - - - - - - - - | sed -e 's/ /, /g' -e 's/$/,/' -e '$ s/,$/} },/' -e '1 s/^/{ /' > ~/tmp/tis-620
- { "ISO 8859-11", 2259, // Thai character set mib enum taken from tis620 (which is byte by byte equivalent)
- { 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD,
- 0xFFFD, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07,
- 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F,
- 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17,
- 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F,
- 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27,
- 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F,
- 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37,
- 0x0E38, 0x0E39, 0x0E3A, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD, 0x0E3F,
- 0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47,
- 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F,
- 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57,
- 0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0xFFFD, 0xFFFD, 0xFFFD, 0xFFFD} },
-
- // change LAST_MIB if you add more, and edit unicodevalues in
- // kernel/qpsprinter.cpp too.
-};
-
-
-static const QSimpleTextCodec * reverseOwner = 0;
-static QArray<char> * reverseMap = 0;
-
-
-QSimpleTextCodec::QSimpleTextCodec( int i )
- : QTextCodec(), forwardIndex( i )
-{
-}
-
-
-QSimpleTextCodec::~QSimpleTextCodec()
-{
- if ( reverseOwner == this ) {
- delete reverseMap;
- reverseMap = 0;
- reverseOwner = 0;
- }
-}
-
-// what happens if strlen(chars)<len? what happens if !chars? if len<1?
-QString QSimpleTextCodec::toUnicode(const char* chars, int len) const
-{
- if(len <= 0)
- return QString::null;
-
- int clen = qstrlen(chars);
- len = QMIN(len, clen); // Note: NUL ends string
-
- QString r;
- r.setUnicode(0, len);
- QChar* uc = (QChar*)r.unicode(); // const_cast
- const unsigned char * c = (const unsigned char *)chars;
- for( int i=0; i<len; i++ ) {
- if ( c[i] > 127 )
- uc[i] = unicodevalues[forwardIndex].values[c[i]-128];
- else
- uc[i] = c[i];
- }
- return r;
-}
-
-
-QCString QSimpleTextCodec::fromUnicode(const QString& uc, int& len ) const
-{
- if ( reverseOwner != this ) {
- int m = 0;
- int i = 0;
- while( i < 128 ) {
- if ( unicodevalues[forwardIndex].values[i] > m &&
- unicodevalues[forwardIndex].values[i] < 0xfffd )
- m = unicodevalues[forwardIndex].values[i];
- i++;
- }
- m++;
- if ( !reverseMap )
- reverseMap = new QArray<char>( m );
- if ( m > (int)(reverseMap->size()) )
- reverseMap->resize( m );
- for( i = 0; i < 128 && i < m; i++ )
- (*reverseMap)[i] = (char)i;
- for( ;i < m; i++ )
- (*reverseMap)[i] = '?';
- for( i=128; i<256; i++ ) {
- int u = unicodevalues[forwardIndex].values[i-128];
- if ( u < m )
- (*reverseMap)[u] = (char)(unsigned char)(i);
- }
- reverseOwner = this;
- }
- if ( len <0 || len > (int)uc.length() )
- len = uc.length();
- QCString r( len+1 );
- int i = len;
- int u;
- const QChar* ucp = uc.unicode();
- char* rp = r.data();
- char* rmp = reverseMap->data();
- int rmsize = (int) reverseMap->size();
- while( i-- )
- {
- u = ucp->unicode();
- *rp++ = u < 128 ? u : (( u < rmsize ) ? (*(rmp+u)) : '?' );
- ucp++;
- }
- r[len] = 0;
- return r;
-}
-
-
-const char* QSimpleTextCodec::name() const
-{
- return unicodevalues[forwardIndex].cs;
-}
-
-
-int QSimpleTextCodec::mibEnum() const
-{
- return unicodevalues[forwardIndex].mib;
-}
-
-int QSimpleTextCodec::heuristicNameMatch(const char* hint) const
-{
- if ( hint[0]=='k' ) {
- // Help people with messy fonts
- if ( QCString(hint) == "koi8-1" )
- return QTextCodec::heuristicNameMatch("koi8-r")-1;
- if ( QCString(hint) == "koi8-ru" )
- return QTextCodec::heuristicNameMatch("koi8-r")-1;
- } else if ( hint[0] == 't' && QCString(name()) == "ISO 8859-11" ) {
- // 8859-11 and tis620 are byte by bute equivalent
- int i = simpleHeuristicNameMatch("tis620-0", hint);
- if( !i )
- i = simpleHeuristicNameMatch("tis-620", hint);
- if( i ) return i;
- }
- return QTextCodec::heuristicNameMatch(hint);
-}
-
-int QSimpleTextCodec::heuristicContentMatch(const char* chars, int len) const
-{
- if ( len<1 || !chars )
- return -1;
- int i = 0;
- const uchar * c = (const unsigned char *)chars;
- int r = 0;
- while( i<len && c && *c ) {
- if ( *c >= 128 ) {
- if ( unicodevalues[forwardIndex].values[(*c)-128] == 0xfffd )
- return -1;
- }
- if ( (*c >= ' ' && *c < 127) ||
- *c == '\n' || *c == '\t' || *c == '\r' )
- r++;
- i++;
- c++;
- }
- if ( mibEnum()==4 )
- r+=1;
- return r;
-}
-
-
-#endif // QT_NO_CODECS
-
-class QLatin1Codec: public QTextCodec
-{
-public:
- QLatin1Codec();
- ~QLatin1Codec();
-
- QString toUnicode(const char* chars, int len) const;
- QCString fromUnicode(const QString& uc, int& lenInOut ) const;
-
- const char* name() const;
- int mibEnum() const;
-
- int heuristicContentMatch(const char* chars, int len) const;
-
- int heuristicNameMatch(const char* hint) const;
-
-private:
- int forwardIndex;
-};
-
-
-QLatin1Codec::QLatin1Codec()
- : QTextCodec()
-{
-}
-
-
-QLatin1Codec::~QLatin1Codec()
-{
-}
-
-// what happens if strlen(chars)<len? what happens if !chars? if len<1?
-QString QLatin1Codec::toUnicode(const char* chars, int len) const
-{
- if(len <= 0)
- return QString::null;
-
- return QString::fromLatin1(chars, len);
-}
-
-
-QCString QLatin1Codec::fromUnicode(const QString& uc, int& len ) const
-{
- if ( len <0 || len > (int)uc.length() )
- len = uc.length();
- QCString r( len+1 );
- int i = 0;
- const QChar *ch = uc.unicode();
- while ( i < len ) {
- r[i] = ch->row() ? '?' : ch->cell();
- i++;
- ch++;
- }
- r[len] = 0;
- return r;
-}
-
-
-const char* QLatin1Codec::name() const
-{
- return "ISO 8859-1";
-}
-
-
-int QLatin1Codec::mibEnum() const
-{
- return 4;
-}
-
-int QLatin1Codec::heuristicNameMatch(const char* hint) const
-{
- return QTextCodec::heuristicNameMatch(hint);
-}
-
-int QLatin1Codec::heuristicContentMatch(const char* chars, int len) const
-{
- if ( len<1 || !chars )
- return -1;
- int i = 0;
- const uchar * c = (const unsigned char *)chars;
- int r = 0;
- while( i<len && c && *c ) {
- if ( *c >= 0x80 && *c < 0xa0 )
- return -1;
- if ( (*c >= ' ' && *c < 127) ||
- *c == '\n' || *c == '\t' || *c == '\r' )
- r++;
- i++;
- c++;
- }
- return r;
-}
-
-
-static void setupBuiltinCodecs()
-{
- (void)new QLatin1Codec;
-
-#ifndef QT_NO_CODECS
- int i = 0;
- do {
- (void)new QSimpleTextCodec( i );
- } while( unicodevalues[i++].mib != LAST_MIB );
-
- (void)new QEucJpCodec;
- (void)new QSjisCodec;
- (void)new QJisCodec;
- (void)new QEucKrCodec;
- (void)new QGbkCodec;
- (void)new QBig5Codec;
- (void)new QUtf8Codec;
- (void)new QUtf16Codec;
- (void)new QHebrewCodec;
- (void)new QArabicCodec;
- (void)new QTsciiCodec;
-#endif // QT_NO_CODECS
-}
-
-#endif // QT_NO_TEXTCODEC
diff --git a/qtools/qtextcodec.h b/qtools/qtextcodec.h
deleted file mode 100644
index 18ece20..0000000
--- a/qtools/qtextcodec.h
+++ /dev/null
@@ -1,104 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QTextCodec class
-**
-** Created : 981015
-**
-** Copyright (C) 1998-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 QTEXTCODEC_H
-#define QTEXTCODEC_H
-
-#ifndef QT_H
-#include "qstring.h"
-#endif // QT_H
-
-#ifndef QT_NO_TEXTCODEC
-
-class QTextCodec;
-class QIODevice;
-
-class Q_EXPORT QTextEncoder {
-public:
- virtual ~QTextEncoder();
- virtual QCString fromUnicode(const QString& uc, int& lenInOut) = 0;
-};
-
-class Q_EXPORT QTextDecoder {
-public:
- virtual ~QTextDecoder();
- virtual QString toUnicode(const char* chars, int len) = 0;
-};
-
-class Q_EXPORT QTextCodec {
-public:
- virtual ~QTextCodec();
-
-#ifndef QT_NO_CODECS
- static QTextCodec* loadCharmap(QIODevice*);
- static QTextCodec* loadCharmapFile(QString filename);
-#endif
- static QTextCodec* codecForMib(int mib);
- static QTextCodec* codecForName(const char* hint, int accuracy=0);
- static QTextCodec* codecForContent(const char* chars, int len);
- static QTextCodec* codecForIndex(int i);
- static QTextCodec* codecForLocale();
-
- static void deleteAllCodecs();
-
- static const char* locale();
-
- virtual const char* name() const = 0;
- virtual int mibEnum() const = 0;
-
- virtual QTextDecoder* makeDecoder() const;
- virtual QTextEncoder* makeEncoder() const;
-
- virtual QString toUnicode(const char* chars, int len) const;
- virtual QCString fromUnicode(const QString& uc, int& lenInOut) const;
-
- QCString fromUnicode(const QString& uc) const;
- QString toUnicode(const QByteArray&, int len) const;
- QString toUnicode(const QByteArray&) const;
- QString toUnicode(const char* chars) const;
- virtual bool canEncode( QChar ) const;
- virtual bool canEncode( const QString& ) const;
-
- virtual int heuristicContentMatch(const char* chars, int len) const = 0;
- virtual int heuristicNameMatch(const char* hint) const;
-
-protected:
- QTextCodec();
- static int simpleHeuristicNameMatch(const char* name, const char* hint);
-};
-#endif // QT_NO_TEXTCODEC
-#endif // QTEXTCODEC_H
diff --git a/qtools/qtextstream.cpp b/qtools/qtextstream.cpp
deleted file mode 100644
index 6686f81..0000000
--- a/qtools/qtextstream.cpp
+++ /dev/null
@@ -1,2237 +0,0 @@
-/****************************************************************************
-**
-**
-** Implementation of QTextStream class
-**
-** Created : 940922
-**
-** 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 "qtextstream.h"
-
-#ifndef QT_NO_TEXTSTREAM
-#include "qtextcodec.h"
-#include "qregexp.h"
-#include "qbuffer.h"
-#include "qfile.h"
-#include <stdio.h>
-#include <ctype.h>
-#include <stdlib.h>
-
-#if defined(_OS_WIN32_)
-#include <windows.h>
-#endif
-
-// NOT REVISED
-/*!
- \class QTextStream qtextstream.h
-
- \brief The QTextStream class provides basic functions for reading and
- writing text using a QIODevice.
-
- \ingroup io
-
- \define endl
- \define bin
- \define oct
- \define dec
- \define hex
- \define flush
- \define ws
-
- The text stream class has a functional interface that is very
- similar to that of the standard C++ iostream class. The difference
- between iostream and QTextStream is that our stream operates on a
- QIODevice, which is easily subclassed, while iostream operates on
- FILE * pointers, which can not be subclassed.
-
- Qt provides several global functions similar to the ones in iostream:
- <ul>
- <li> \c bin sets the QTextStream to read/write binary numbers
- <li> \c oct sets the QTextStream to read/write octal numbers
- <li> \c dec sets the QTextStream to read/write decimal numbers
- <li> \c hex sets the QTextStream to read/write hexadecimal numbers
- <li> \c endl forces a line break
- <li> \c flush forces the QIODevice to flush any buffered data
- <li> \c ws eats any available white space (on input)
- <li> \c reset resets the QTextStream to its default mode (see reset()).
- </ul>
-
- \warning By default, QTextStream will automatically detect whether
- integers in the stream are in decimal, octal, hexadecimal or binary
- format when reading from the stream. In particular, a leading '0'
- signifies octal, ie. the sequence "0100" will be interpreted as
- 64.
-
- The QTextStream class reads and writes text and it is not
- appropriate for dealing with binary data (but QDataStream is).
-
- By default output of Unicode text (ie. QString) is done using the
- local 8-bit encoding. This can be changed using the setEncoding()
- method. For input, the QTextStream will auto-detect standard
- Unicode "byte order marked" text files, but otherwise the local
- 8-bit encoding is used.
-
- \sa QDataStream
-*/
-
-/*
- \class QTSManip qtextstream.h
-
- \brief The QTSManip class is an internal helper class for the
- QTextStream.
-
- It is generally a very bad idea to use this class directly in
- application programs.
-
- \internal
-
- This class makes it possible to give the QTextStream function objects
- with arguments, like this:
- \code
- QTextStream cout( stdout, IO_WriteOnly );
- cout << setprecision( 8 ); // QTSManip used here!
- cout << 3.14159265358979323846;
- \endcode
-
- The setprecision() function returns a QTSManip object.
- The QTSManip object contains a pointer to a member function in
- QTextStream and an integer argument.
- When serializing a QTSManip into a QTextStream, the function
- is executed with the argument.
-*/
-
-/*! \fn QTSManip::QTSManip (QTSMFI m, int a)
-
- Constructs a QTSManip object which will call \a m (a member function
- in QTextStream which accepts a single int) with argument \a a when
- QTSManip::exec() is called. Used internally in e.g. endl:
-
- \code
- s << "some text" << endl << "more text";
- \endcode
-*/
-
-/*! \fn void QTSManip::exec (QTextStream& s)
-
- Calls the member function specified in the constructor, for object
- \a s. Used internally in e.g. endl:
-
- \code
- s << "some text" << endl << "more text";
- \endcode
-*/
-
-
-/*****************************************************************************
- QTextStream member functions
- *****************************************************************************/
-
-#if defined(CHECK_STATE)
-#undef CHECK_STREAM_PRECOND
-#define CHECK_STREAM_PRECOND if ( !dev ) { \
- qWarning( "QTextStream: No device" ); \
- return *this; }
-#else
-#define CHECK_STREAM_PRECOND
-#endif
-
-
-#define I_SHORT 0x0010
-#define I_INT 0x0020
-#define I_LONG 0x0030
-#define I_TYPE_MASK 0x00f0
-
-#define I_BASE_2 QTS::bin
-#define I_BASE_8 QTS::oct
-#define I_BASE_10 QTS::dec
-#define I_BASE_16 QTS::hex
-#define I_BASE_MASK (QTS::bin | QTS::oct | QTS::dec | QTS::hex)
-
-#define I_SIGNED 0x0100
-#define I_UNSIGNED 0x0200
-#define I_SIGN_MASK 0x0f00
-
-
-static const QChar QEOF = QChar((ushort)0xffff); //guaranteed not to be a character.
-
-const int QTextStream::basefield = I_BASE_MASK;
-const int QTextStream::adjustfield = ( QTextStream::left |
- QTextStream::right |
- QTextStream::internal );
-const int QTextStream::floatfield = ( QTextStream::scientific |
- QTextStream::fixed );
-
-
-class QTextStreamPrivate {
-public:
-#ifndef QT_NO_TEXTCODEC
- QTextStreamPrivate() : decoder( 0 ), sourceType( NotSet ) {}
- ~QTextStreamPrivate() { delete decoder; }
- QTextDecoder *decoder; //???
-#else
- QTextStreamPrivate() : sourceType( NotSet ) {}
- ~QTextStreamPrivate() { }
-#endif
- QString ungetcBuf;
-
- enum SourceType { NotSet, IODevice, String, ByteArray, File };
- SourceType sourceType;
-};
-
-
-// skips whitespace and returns the first non-whitespace character
-QChar QTextStream::eat_ws()
-{
- QChar c;
- do { c = ts_getc(); } while ( c != QEOF && ts_isspace(c) );
- return c;
-}
-
-void QTextStream::init()
-{
- // ### ungetcBuf = QEOF;
- dev = 0; // no device set
- fstrm = owndev = FALSE;
- mapper = 0;
- d = new QTextStreamPrivate;
- doUnicodeHeader = TRUE; //default to autodetect
- latin1 = TRUE; // ### should use local?
- internalOrder = QChar::networkOrdered(); //default to network order
-}
-
-/*!
- Constructs a data stream that has no IO device.
-*/
-
-QTextStream::QTextStream()
-{
- init();
- setEncoding( Locale ); //###
- reset();
- d->sourceType = QTextStreamPrivate::NotSet;
-}
-
-/*!
- Constructs a text stream that uses the IO device \a iod.
-*/
-
-QTextStream::QTextStream( QIODevice *iod )
-{
- init();
- setEncoding( Locale ); //###
- dev = iod; // set device
- reset();
- d->sourceType = QTextStreamPrivate::IODevice;
-}
-
-// TODO: use special-case handling of this case in QTextStream, and
-// simplify this class to only deal with QChar or QString data.
-class QStringBuffer : public QIODevice {
-public:
- QStringBuffer( QString* str );
- ~QStringBuffer();
- bool open( int m );
- void close();
- void flush();
- uint size() const;
- int at() const;
- bool at( int pos );
- int readBlock( char *p, uint len );
- int writeBlock( const char *p, uint len );
- int getch();
- int putch( int ch );
- int ungetch( int ch );
-protected:
- QString* s;
-
-private: // Disabled copy constructor and operator=
- QStringBuffer( const QStringBuffer & );
- QStringBuffer &operator=( const QStringBuffer & );
-};
-
-
-QStringBuffer::QStringBuffer( QString* str )
-{
- s = str;
-}
-
-QStringBuffer::~QStringBuffer()
-{
-}
-
-
-bool QStringBuffer::open( int m )
-{
- if ( !s ) {
-#if defined(CHECK_STATE)
- qWarning( "QStringBuffer::open: No string" );
-#endif
- return FALSE;
- }
- if ( isOpen() ) { // buffer already open
-#if defined(CHECK_STATE)
- qWarning( "QStringBuffer::open: Buffer already open" );
-#endif
- return FALSE;
- }
- setMode( m );
- if ( m & IO_Truncate ) { // truncate buffer
- s->truncate( 0 );
- }
- if ( m & IO_Append ) { // append to end of buffer
- ioIndex = s->length()*sizeof(QChar);
- } else {
- ioIndex = 0;
- }
- setState( IO_Open );
- setStatus( 0 );
- return TRUE;
-}
-
-void QStringBuffer::close()
-{
- if ( isOpen() ) {
- setFlags( IO_Direct );
- ioIndex = 0;
- }
-}
-
-void QStringBuffer::flush()
-{
-}
-
-uint QStringBuffer::size() const
-{
- return s ? s->length()*sizeof(QChar) : 0;
-}
-
-int QStringBuffer::at() const
-{
- return ioIndex;
-}
-
-bool QStringBuffer::at( int pos )
-{
-#if defined(CHECK_STATE)
- if ( !isOpen() ) {
- qWarning( "QStringBuffer::at: Buffer is not open" );
- return FALSE;
- }
-#endif
- if ( (uint)pos >= s->length()*2 ) {
-#if defined(CHECK_RANGE)
- qWarning( "QStringBuffer::at: Index %d out of range", pos );
-#endif
- return FALSE;
- }
- ioIndex = pos;
- return TRUE;
-}
-
-
-int QStringBuffer::readBlock( char *p, uint len )
-{
-#if defined(CHECK_STATE)
- CHECK_PTR( p );
- if ( !isOpen() ) { // buffer not open
- qWarning( "QStringBuffer::readBlock: Buffer not open" );
- return -1;
- }
- if ( !isReadable() ) { // reading not permitted
- qWarning( "QStringBuffer::readBlock: Read operation not permitted" );
- return -1;
- }
-#endif
- if ( (uint)ioIndex + len > s->length()*sizeof(QChar) ) {
- // overflow
- if ( (uint)ioIndex >= s->length()*sizeof(QChar) ) {
- setStatus( IO_ReadError );
- return -1;
- } else {
- len = s->length()*2 - (uint)ioIndex;
- }
- }
- memcpy( p, ((const char*)(s->unicode()))+ioIndex, len );
- ioIndex += len;
- return len;
-}
-
-int QStringBuffer::writeBlock( const char *p, uint len )
-{
-#if defined(CHECK_NULL)
- if ( p == 0 && len != 0 )
- qWarning( "QStringBuffer::writeBlock: Null pointer error" );
-#endif
-#if defined(CHECK_STATE)
- if ( !isOpen() ) { // buffer not open
- qWarning( "QStringBuffer::writeBlock: Buffer not open" );
- return -1;
- }
- if ( !isWritable() ) { // writing not permitted
- qWarning( "QStringBuffer::writeBlock: Write operation not permitted" );
- return -1;
- }
- if ( ioIndex&1 ) {
- qWarning( "QStringBuffer::writeBlock: non-even index - non Unicode" );
- return -1;
- }
- if ( len&1 ) {
- qWarning( "QStringBuffer::writeBlock: non-even length - non Unicode" );
- return -1;
- }
-#endif
- s->replace(ioIndex/2, len/2, (QChar*)p, len/2);
- ioIndex += len;
- return len;
-}
-
-int QStringBuffer::getch()
-{
-#if defined(CHECK_STATE)
- if ( !isOpen() ) { // buffer not open
- qWarning( "QStringBuffer::getch: Buffer not open" );
- return -1;
- }
- if ( !isReadable() ) { // reading not permitted
- qWarning( "QStringBuffer::getch: Read operation not permitted" );
- return -1;
- }
-#endif
- if ( (uint)ioIndex >= s->length()*2 ) { // overflow
- setStatus( IO_ReadError );
- return -1;
- }
- return *((char*)s->unicode() + ioIndex++);
-}
-
-int QStringBuffer::putch( int ch )
-{
- char c = ch;
- if ( writeBlock(&c,1) < 0 )
- return -1;
- else
- return ch;
-}
-
-int QStringBuffer::ungetch( int ch )
-{
-#if defined(CHECK_STATE)
- if ( !isOpen() ) { // buffer not open
- qWarning( "QStringBuffer::ungetch: Buffer not open" );
- return -1;
- }
- if ( !isReadable() ) { // reading not permitted
- qWarning( "QStringBuffer::ungetch: Read operation not permitted" );
- return -1;
- }
-#endif
- if ( ch != -1 ) { // something to do with eof
- if ( ioIndex )
- ioIndex--;
- else
- ch = -1;
- }
- return ch;
-}
-
-
-/*!
- Constructs a text stream that operates on a Unicode QString through an
- internal device.
-
- If you set an encoding or codec with setEncoding() or setCodec(), this
- setting is ignored for text streams that operate on QString.
-
- Example:
- \code
- QString str;
- QTextStream ts( &str, IO_WriteOnly );
- ts << "pi = " << 3.14; // str == "pi = 3.14"
- \endcode
-
- Writing data to the text stream will modify the contents of the string.
- The string will be expanded when data is written beyond the end of the
- string. Note that the string will not be truncated:
- \code
- QString str = "pi = 3.14";
- QTextStream ts( &str, IO_WriteOnly );
- ts << "2+2 = " << 2+2; // str == "2+2 = 414"
- \endcode
-
- Note that since QString is Unicode, you should not use readRawBytes()
- or writeRawBytes() on such a stream.
-*/
-
-QTextStream::QTextStream( QString* str, int filemode )
-{
- // TODO: optimize for this case as it becomes more common
- // (see QStringBuffer above)
- init();
- dev = new QStringBuffer( str );
- ((QStringBuffer *)dev)->open( filemode );
- owndev = TRUE;
- setEncoding(RawUnicode);
- reset();
- d->sourceType = QTextStreamPrivate::String;
-}
-
-/*! \obsolete
-
- This constructor is equivalent to the constructor taking a QString*
- parameter.
-*/
-
-QTextStream::QTextStream( QString& str, int filemode )
-{
- init();
- dev = new QStringBuffer( &str );
- ((QStringBuffer *)dev)->open( filemode );
- owndev = TRUE;
- setEncoding(RawUnicode);
- reset();
- d->sourceType = QTextStreamPrivate::String;
-}
-
-/*!
- Constructs a text stream that operates on a byte array through an
- internal QBuffer device.
-
- Example:
- \code
- QByteArray array;
- QTextStream ts( array, IO_WriteOnly );
- ts << "pi = " << 3.14 << '\0'; // array == "pi = 3.14"
- \endcode
-
- Writing data to the text stream will modify the contents of the array.
- The array will be expanded when data is written beyond the end of the
- string.
-
- Same example, using a QBuffer:
- \code
- QByteArray array;
- QBuffer buf( array );
- buf.open( IO_WriteOnly );
- QTextStream ts( &buf );
- ts << "pi = " << 3.14 << '\0'; // array == "pi = 3.14"
- buf.close();
- \endcode
-*/
-
-QTextStream::QTextStream( QByteArray a, int mode )
-{
- init();
- dev = new QBuffer( a );
- ((QBuffer *)dev)->open( mode );
- owndev = TRUE;
- setEncoding( Latin1 ); //### Locale???
- reset();
- d->sourceType = QTextStreamPrivate::ByteArray;
-}
-
-/*!
- Constructs a text stream that operates on an existing file handle \e fh
- through an internal QFile device.
-
- Example:
- \code
- QTextStream cout( stdout, IO_WriteOnly );
- QTextStream cin ( stdin, IO_ReadOnly );
- QTextStream cerr( stderr, IO_WriteOnly );
- \endcode
-*/
-
-QTextStream::QTextStream( FILE *fh, int mode )
-{
- init();
- setEncoding( Locale ); //###
- dev = new QFile;
- ((QFile *)dev)->open( mode, fh );
- fstrm = owndev = TRUE;
- reset();
- d->sourceType = QTextStreamPrivate::File;
-}
-
-/*!
- Destructs the text stream.
-
- The destructor does not affect the current IO device.
-*/
-
-QTextStream::~QTextStream()
-{
- if ( owndev )
- delete dev;
- delete d;
-}
-
-/*!
- Positions the read pointer at the first non-whitespace character.
-*/
-void QTextStream::skipWhiteSpace()
-{
- ts_ungetc( eat_ws() );
-}
-
-
-/*!
- \fn Encoding QTextStream::encoding() const
-
- Returns the encoding mode of the stream.
-
- \sa setEncoding()
-*/
-
-/*!
- Tries to read len characters from the stream and stores them in \a buf.
- Returns the number of characters really read.
- Attention: There will no QEOF appended if the read reaches the end of
- the file. EOF is reached when the return value does not equal \a len.
-*/
-uint QTextStream::ts_getbuf( QChar* buf, uint len )
-{
- if( len<1 )
- return 0;
-
- uint rnum=0; // the number of QChars really read
-
- if ( d && d->ungetcBuf.length() ) {
- while( rnum < len && rnum < d->ungetcBuf.length() ) {
- buf[rnum] = d->ungetcBuf.constref(rnum);
- rnum++;
- }
- d->ungetcBuf = d->ungetcBuf.mid( rnum );
- if ( rnum >= len )
- return rnum;
- }
-
- // we use dev->ungetch() for one of the bytes of the unicode
- // byte-order mark, but a local unget hack for the other byte:
- int ungetHack = EOF;
-
- if ( doUnicodeHeader ) {
- doUnicodeHeader = FALSE; //only at the top
- int c1 = dev->getch();
- if ( c1 == EOF )
- return rnum;
- int c2 = dev->getch();
- if ( c1 == 0xfe && c2 == 0xff ) {
- mapper = 0;
- latin1 = FALSE;
- internalOrder = QChar::networkOrdered(); //network order
- } else if ( c1 == 0xff && c2 == 0xfe ) {
- mapper = 0;
- latin1 = FALSE;
- internalOrder = !QChar::networkOrdered(); //reverse network order
- } else {
- if ( c2 != EOF ) {
- dev->ungetch( c2 );
- ungetHack = c1;
- } else {
- dev->ungetch( c1 );
- // note that a small possible bug might hide here
- // here, if only the first byte of a file has made it
- // so far, and that first byte is half of the
- // byte-order mark, then the utfness will not be
- // detected. whether or not this is a bug depends on
- // taste. I can't really decide.
- }
- }
- }
-
-#ifndef QT_NO_TEXTCODEC
- if ( mapper ) {
- bool shortRead = FALSE;
- if ( !d->decoder )
- d->decoder = mapper->makeDecoder();
- while( rnum < len ) {
- QString s;
- bool readBlock = !( len == 1+rnum );
- while ( TRUE ) {
- // for efficiency: normally read a whole block
- if ( readBlock ) {
- // guess buffersize; this may be wrong (too small or too
- // big). But we can handle this (either iterate reading
- // or use ungetcBuf).
- // Note that this might cause problems for codecs where
- // one byte can result in >1 Unicode Characters if bytes
- // are written to the stream in the meantime (loss of
- // synchronicity).
- uint rlen = len - rnum;
- char *cbuf = new char[ rlen ];
- if ( ungetHack != EOF ) {
- rlen = 1+dev->readBlock( cbuf+1, rlen-1 );
- cbuf[0] = (char)ungetHack;
- ungetHack = EOF;
- } else {
- rlen = dev->readBlock( cbuf, rlen );
- }
- s += d->decoder->toUnicode( cbuf, rlen );
- delete[] cbuf;
- // use buffered reading only for the first time, because we
- // have to get the stream synchronous again (this is easier
- // with single character reading)
- readBlock = FALSE;
- }
- // get stream (and codec) in sync
- int c;
- if ( ungetHack == EOF ) {
- c = dev->getch();
- } else {
- c = ungetHack;
- ungetHack = EOF;
- }
- if ( c == EOF ) {
- shortRead = TRUE;
- break;
- }
- char b = c;
- uint lengthBefore = s.length();
- s += d->decoder->toUnicode( &b, 1 );
- if ( s.length() > lengthBefore )
- break; // it seems we are in sync now
- }
- uint i = 0;
- while( rnum < len && i < s.length() )
- buf[rnum++] = s.constref(i++);
- if ( s.length() > i )
- // could be = but append is clearer
- d->ungetcBuf.append( s.mid( i ) );
- if ( shortRead )
- return rnum;
- }
- } else
-#endif
- if ( latin1 ) {
- if ( len == 1+rnum ) {
- // use this method for one character because it is more efficient
- // (arnt doubts whether it makes a difference, but lets it stand)
- int c = (ungetHack == EOF) ? dev->getch() : ungetHack;
- if ( c != EOF )
- buf[rnum++] = (char)c;
- } else {
- if ( ungetHack != EOF ) {
- buf[rnum++] = (char)ungetHack;
- ungetHack = EOF;
- }
- char *cbuf = new char[len - rnum];
- while ( !dev->atEnd() && rnum < len ) {
- uint rlen = len - rnum;
- rlen = dev->readBlock( cbuf, rlen );
- uint i = 0;
- while( i < rlen )
- buf[rnum++] = cbuf[i++];
- }
- delete[] cbuf;
- }
- } else { // UCS-2 or UTF-16
- if ( len == 1+rnum ) {
- int c1 = (ungetHack == EOF) ? dev->getch() : ungetHack;
- if ( c1 == EOF )
- return rnum;
- int c2 = dev->getch();
- if ( c2 == EOF )
- return rnum;
- if ( isNetworkOrder() )
- buf[rnum++] = QChar( c2, c1 );
- else
- buf[rnum++] = QChar( c1, c2 );
- } else {
- char *cbuf = new char[ 2*( len - rnum ) ]; // for paranoids: overflow possible
- while ( !dev->atEnd() && rnum < len ) {
- uint rlen = 2 * ( len-rnum );
- if ( ungetHack != EOF ) {
- rlen = 1+dev->readBlock( cbuf+1, rlen-1 );
- cbuf[0] = (char)ungetHack;
- ungetHack = EOF;
- } else {
- rlen = dev->readBlock( cbuf, rlen );
- }
- // We can't use an odd number of bytes, so put it back. But
- // do it only if we are capable of reading more -- normally
- // there should not be an odd number, but the file might be
- // truncated or not in UTF-16...
- if ( (rlen & 1) == 1 )
- if ( !dev->atEnd() )
- dev->ungetch( cbuf[--rlen] );
- uint i = 0;
- if ( isNetworkOrder() ) {
- while( i < rlen ) {
- buf[rnum++] = QChar( cbuf[i+1], cbuf[i] );
- i+=2;
- }
- } else {
- while( i < rlen ) {
- buf[rnum++] = QChar( cbuf[i], cbuf[i+1] );
- i+=2;
- }
- }
- }
- delete[] cbuf;
- }
- }
- return rnum;
-}
-
-
-/*!
- Puts one character to the stream.
-*/
-void QTextStream::ts_putc( QChar c )
-{
-#ifndef QT_NO_TEXTCODEC
- if ( mapper ) {
- int len = 1;
- QString s = c;
- QCString block = mapper->fromUnicode( s, len );
- dev->writeBlock( block, len );
- } else
-#endif
- if ( latin1 ) {
- if( c.row() )
- dev->putch( '?' ); //######unknown character???
- else
- dev->putch( c.cell() );
- } else {
- if ( doUnicodeHeader ) {
- doUnicodeHeader = FALSE;
- ts_putc( QChar::byteOrderMark );
- }
- if ( internalOrder ) {
- dev->writeBlock( (char*)&c, sizeof(QChar) );
- } else if ( isNetworkOrder() ) {
- dev->putch(c.row());
- dev->putch(c.cell());
- } else {
- dev->putch(c.cell());
- dev->putch(c.row());
- }
- }
-}
-
-/*!
- Puts one character to the stream.
-*/
-void QTextStream::ts_putc(int ch)
-{
- ts_putc(QChar((ushort)ch));
-}
-
-bool QTextStream::ts_isdigit(QChar c)
-{
- return c.isDigit();
-}
-
-bool QTextStream::ts_isspace( QChar c )
-{
- return c.isSpace();
-}
-
-void QTextStream::ts_ungetc( QChar c )
-{
- if ( c.unicode() == 0xffff )
- return;
-
- d->ungetcBuf.prepend( c );
-}
-
-
-
-/*!
- Reads \e len bytes from the stream into \e e s and returns a reference to
- the stream.
-
- The buffer \e s must be preallocated.
-
- Note that no encoding is done by this function.
-
- \warning The behaviour of this function is undefined unless the
- stream's encoding is set to Unicode or Latin1.
-
- \sa QIODevice::readBlock()
-*/
-
-QTextStream &QTextStream::readRawBytes( char *s, uint len )
-{
- dev->readBlock( s, len );
- return *this;
-}
-
-/*!
- Writes the \e len bytes from \e s to the stream and returns a reference to
- the stream.
-
- Note that no encoding is done by this function.
-
- \sa QIODevice::writeBlock()
-*/
-
-QTextStream &QTextStream::writeRawBytes( const char* s, uint len )
-{
- dev->writeBlock( s, len );
- return *this;
-}
-
-
-QTextStream &QTextStream::writeBlock( const char* p, uint len )
-{
- if ( doUnicodeHeader ) {
- doUnicodeHeader = FALSE;
- if ( !mapper && !latin1 )
- ts_putc( QChar::byteOrderMark );
- }
- //All QCStrings and const char* are defined to be in Latin1
- if ( !mapper && latin1 ) {
- dev->writeBlock( p, len );
- } else if ( !mapper && internalOrder ) {
- QChar *u = new QChar[len];
- for (uint i=0; i<len; i++)
- u[i] = p[i];
- dev->writeBlock( (char*)u, len*sizeof(QChar) );
- delete [] u;
- } else {
- for (uint i=0; i<len; i++)
- ts_putc( (uchar)p[i] );
- }
- return *this;
-}
-
-QTextStream &QTextStream::writeBlock( const QChar* p, uint len )
-{
- if ( !mapper && !latin1 && internalOrder ) {
- if ( doUnicodeHeader ) {
- doUnicodeHeader = FALSE;
- ts_putc( QChar::byteOrderMark );
- }
- dev->writeBlock( (char*)p, sizeof(QChar)*len );
- } else {
- for (uint i=0; i<len; i++)
- ts_putc( p[i] );
- }
- return *this;
-}
-
-
-
-/*!
- Resets the text stream.
-
- <ul>
- <li> All flags are set to 0.
- <li> The field width is set to 0.
- <li> The fill character is set to ' ' (space).
- <li> The precision is set to 6.
- </ul>
-
- \sa setf(), width(), fill(), precision()
-*/
-
-void QTextStream::reset()
-{
- fflags = 0;
- fwidth = 0;
- fillchar = ' ';
- fprec = 6;
-}
-
-
-/*!
- \fn QIODevice *QTextStream::device() const
- Returns the IO device currently set.
- \sa setDevice(), unsetDevice()
-*/
-
-/*!
- Sets the IO device to \a iod.
- \sa device(), unsetDevice()
-*/
-
-void QTextStream::setDevice( QIODevice *iod )
-{
- if ( owndev ) {
- delete dev;
- owndev = FALSE;
- }
- dev = iod;
- d->sourceType = QTextStreamPrivate::IODevice;
-}
-
-/*!
- Unsets the IO device. Equivalent to setDevice( 0 ).
- \sa device(), setDevice()
-*/
-
-void QTextStream::unsetDevice()
-{
- setDevice( 0 );
- d->sourceType = QTextStreamPrivate::NotSet;
-}
-
-/*!
- \fn bool QTextStream::atEnd() const
- Returns TRUE if the IO device has reached the end position (end of
- stream or file) or if there is no IO device set.
-
- Returns FALSE if the current position of the read/write head of the IO
- device is somewhere before the end position.
-
- \sa QIODevice::atEnd()
-*/
-
-/*!\fn bool QTextStream::eof() const
-
- \obsolete
-
- This function has been renamed to atEnd().
-
- \sa QIODevice::atEnd()
-*/
-
-/*****************************************************************************
- QTextStream read functions
- *****************************************************************************/
-
-
-/*!
- Reads a \c char from the stream and returns a reference to the stream.
- Note that whitespace is skipped.
-*/
-
-QTextStream &QTextStream::operator>>( char &c )
-{
- CHECK_STREAM_PRECOND
- c = eat_ws();
- return *this;
-}
-
-/*!
- Reads a \c char from the stream and returns a reference to the stream.
- Note that whitespace is \e not skipped.
-*/
-
-QTextStream &QTextStream::operator>>( QChar &c )
-{
- CHECK_STREAM_PRECOND
- c = ts_getc();
- return *this;
-}
-
-
-ulong QTextStream::input_bin()
-{
- ulong val = 0;
- QChar ch = eat_ws();
- int dv = ch.digitValue();
- while ( dv == 0 || dv == 1 ) {
- val = ( val << 1 ) + dv;
- ch = ts_getc();
- dv = ch.digitValue();
- }
- if ( ch != QEOF )
- ts_ungetc( ch );
- return val;
-}
-
-ulong QTextStream::input_oct()
-{
- ulong val = 0;
- QChar ch = eat_ws();
- int dv = ch.digitValue();
- while ( dv >= 0 && dv <= 7 ) {
- val = ( val << 3 ) + dv;
- ch = ts_getc();
- dv = ch.digitValue();
- }
- if ( dv == 8 || dv == 9 ) {
- while ( ts_isdigit(ch) )
- ch = ts_getc();
- }
- if ( ch != QEOF )
- ts_ungetc( ch );
- return val;
-}
-
-ulong QTextStream::input_dec()
-{
- ulong val = 0;
- QChar ch = eat_ws();
- int dv = ch.digitValue();
- while ( ts_isdigit(ch) ) {
- val = val * 10 + dv;
- ch = ts_getc();
- dv = ch.digitValue();
- }
- if ( ch != QEOF )
- ts_ungetc( ch );
- return val;
-}
-
-ulong QTextStream::input_hex()
-{
- ulong val = 0;
- QChar ch = eat_ws();
- char c = ch;
- while ( isxdigit(c) ) {
- val <<= 4;
- if ( ts_isdigit(c) )
- val += c - '0';
- else
- val += 10 + tolower(c) - 'a';
- c = ch = ts_getc();
- }
- if ( ch != QEOF )
- ts_ungetc( ch );
- return val;
-}
-
-long QTextStream::input_int()
-{
- long val;
- QChar ch;
- char c;
- switch ( flags() & basefield ) {
- case bin:
- val = (long)input_bin();
- break;
- case oct:
- val = (long)input_oct();
- break;
- case dec:
- c = ch = eat_ws();
- if ( ch == QEOF ) {
- val = 0;
- } else {
- if ( !(c == '-' || c == '+') )
- ts_ungetc( ch );
- if ( c == '-' ) {
- ulong v = input_dec();
- if ( v ) { // ensure that LONG_MIN can be read
- v--;
- val = -((long)v) - 1;
- } else {
- val = 0;
- }
- } else {
- val = (long)input_dec();
- }
- }
- break;
- case hex:
- val = (long)input_hex();
- break;
- default:
- val = 0;
- c = ch = eat_ws();
- if ( c == '0' ) { // bin, oct or hex
- c = ch = ts_getc();
- if ( tolower(c) == 'x' )
- val = (long)input_hex();
- else if ( tolower(c) == 'b' )
- val = (long)input_bin();
- else { // octal
- ts_ungetc( ch );
- if ( c >= '0' && c <= '7' ) {
- val = (long)input_oct();
- } else {
- val = 0;
- }
- }
- } else if ( ts_isdigit(ch) ) {
- ts_ungetc( ch );
- val = (long)input_dec();
- } else if ( c == '-' || c == '+' ) {
- ulong v = input_dec();
- if ( c == '-' ) {
- if ( v ) { // ensure that LONG_MIN can be read
- v--;
- val = -((long)v) - 1;
- } else {
- val = 0;
- }
- } else {
- val = (long)v;
- }
- }
- }
- return val;
-}
-
-//
-// We use a table-driven FSM to parse floating point numbers
-// strtod() cannot be used directly since we're reading from a QIODevice
-//
-
-double QTextStream::input_double()
-{
- const int Init = 0; // states
- const int Sign = 1;
- const int Mantissa = 2;
- const int Dot = 3;
- const int Abscissa = 4;
- const int ExpMark = 5;
- const int ExpSign = 6;
- const int Exponent = 7;
- const int Done = 8;
-
- const int InputSign = 1; // input tokens
- const int InputDigit = 2;
- const int InputDot = 3;
- const int InputExp = 4;
-
- static uchar table[8][5] = {
- /* None InputSign InputDigit InputDot InputExp */
- { 0, Sign, Mantissa, Dot, 0, }, // Init
- { 0, 0, Mantissa, Dot, 0, }, // Sign
- { Done, Done, Mantissa, Dot, ExpMark,}, // Mantissa
- { 0, 0, Abscissa, 0, 0, }, // Dot
- { Done, Done, Abscissa, Done, ExpMark,}, // Abscissa
- { 0, ExpSign, Exponent, 0, 0, }, // ExpMark
- { 0, 0, Exponent, 0, 0, }, // ExpSign
- { Done, Done, Exponent, Done, Done } // Exponent
- };
-
- int state = Init; // parse state
- int input; // input token
-
- char buf[256];
- int i = 0;
- QChar c = eat_ws();
-
- while ( TRUE ) {
-
- switch ( c ) {
- case '+':
- case '-':
- input = InputSign;
- break;
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- input = InputDigit;
- break;
- case '.':
- input = InputDot;
- break;
- case 'e':
- case 'E':
- input = InputExp;
- break;
- default:
- input = 0;
- break;
- }
-
- state = table[state][input];
-
- if ( state == 0 || state == Done || i > 250 ) {
- if ( i > 250 ) { // ignore rest of digits
- do { c = ts_getc(); } while ( c != QEOF && ts_isdigit(c) );
- }
- if ( c != QEOF )
- ts_ungetc( c );
- buf[i] = '\0';
- char *end;
- return strtod( buf, &end );
- }
-
- buf[i++] = c;
- c = ts_getc();
- }
-
-#if !defined(_CC_EGG_)
- return 0.0;
-#endif
-}
-
-
-/*!
- Reads a signed \c short integer from the stream and returns a reference to
- the stream. See flags() for an explanation of expected input format.
-*/
-
-QTextStream &QTextStream::operator>>( signed short &i )
-{
- CHECK_STREAM_PRECOND
- i = (signed short)input_int();
- return *this;
-}
-
-
-/*!
- Reads an unsigned \c short integer from the stream and returns a reference to
- the stream. See flags() for an explanation of expected input format.
-*/
-
-QTextStream &QTextStream::operator>>( unsigned short &i )
-{
- CHECK_STREAM_PRECOND
- i = (unsigned short)input_int();
- return *this;
-}
-
-
-/*!
- Reads a signed \c int from the stream and returns a reference to the
- stream. See flags() for an explanation of expected input format.
-*/
-
-QTextStream &QTextStream::operator>>( signed int &i )
-{
- CHECK_STREAM_PRECOND
- i = (signed int)input_int();
- return *this;
-}
-
-
-/*!
- Reads an unsigned \c int from the stream and returns a reference to the
- stream. See flags() for an explanation of expected input format.
-*/
-
-QTextStream &QTextStream::operator>>( unsigned int &i )
-{
- CHECK_STREAM_PRECOND
- i = (unsigned int)input_int();
- return *this;
-}
-
-
-/*!
- Reads a signed \c long int from the stream and returns a reference to the
- stream. See flags() for an explanation of expected input format.
-*/
-
-QTextStream &QTextStream::operator>>( signed long &i )
-{
- CHECK_STREAM_PRECOND
- i = (signed long)input_int();
- return *this;
-}
-
-
-/*!
- Reads an unsigned \c long int from the stream and returns a reference to the
- stream. See flags() for an explanation of expected input format.
-*/
-
-QTextStream &QTextStream::operator>>( unsigned long &i )
-{
- CHECK_STREAM_PRECOND
- i = (unsigned long)input_int();
- return *this;
-}
-
-
-/*!
- Reads a \c float from the stream and returns a reference to the stream.
- See flags() for an explanation of expected input format.
-*/
-
-QTextStream &QTextStream::operator>>( float &f )
-{
- CHECK_STREAM_PRECOND
- f = (float)input_double();
- return *this;
-}
-
-
-/*!
- Reads a \c double from the stream and returns a reference to the stream.
- See flags() for an explanation of expected input format.
-*/
-
-QTextStream &QTextStream::operator>>( double &f )
-{
- CHECK_STREAM_PRECOND
- f = input_double();
- return *this;
-}
-
-
-/*!
- Reads a word from the stream and returns a reference to the stream.
-*/
-
-QTextStream &QTextStream::operator>>( char *s )
-{
- CHECK_STREAM_PRECOND
- int maxlen = width( 0 );
- QChar c = eat_ws();
- if ( !maxlen )
- maxlen = -1;
- while ( c != QEOF ) {
- if ( ts_isspace(c) || maxlen-- == 0 ) {
- ts_ungetc( c );
- break;
- }
- *s++ = c;
- c = ts_getc();
- }
-
- *s = '\0';
- return *this;
-}
-
-/*!
- Reads a word from the stream and returns a reference to the stream.
-*/
-
-QTextStream &QTextStream::operator>>( QString &str )
-{
- CHECK_STREAM_PRECOND
- str=QString::fromLatin1("");
- QChar c = eat_ws();
-
- while ( c != QEOF ) {
- if ( ts_isspace(c) ) {
- ts_ungetc( c );
- break;
- }
- str += c;
- c = ts_getc();
- }
- return *this;
-}
-
-/*!
- Reads a word from the stream and returns a reference to the stream.
-*/
-
-QTextStream &QTextStream::operator>>( QCString &str )
-{
- CHECK_STREAM_PRECOND
- QCString *dynbuf = 0;
- const int buflen = 256;
- char buffer[buflen];
- char *s = buffer;
- int i = 0;
- QChar c = eat_ws();
-
- while ( c != QEOF ) {
- if ( ts_isspace(c) ) {
- ts_ungetc( c );
- break;
- }
- if ( i >= buflen-1 ) {
- if ( !dynbuf ) { // create dynamic buffer
- dynbuf = new QCString(buflen*2);
- memcpy( dynbuf->data(), s, i ); // copy old data
- } else if ( i >= (int)dynbuf->size()-1 ) {
- dynbuf->resize( dynbuf->size()*2 );
- }
- s = dynbuf->data();
- }
- s[i++] = c;
- c = ts_getc();
- }
- str.resize( i+1 );
- memcpy( str.data(), s, i );
- delete dynbuf;
- return *this;
-}
-
-
-/*!
- Reads a line from the stream and returns a string containing the text.
-
- The returned string does not contain any trailing newline or carriage
- return. Note that this is different from QIODevice::readLine(), which
- does not strip the newline at the end of the line.
-
- On EOF you will get a QString that is null. On reading an empty line the
- returned QString is empty but not null.
-
- \sa QIODevice::readLine()
-*/
-
-QString QTextStream::readLine()
-{
-#if defined(CHECK_STATE)
- if ( !dev ) {
- qWarning( "QTextStream::readLine: No device" );
- return QString::null;
- }
-#endif
- QString result( "" );
- const int buf_size = 256;
- QChar c[buf_size];
- int pos = 0;
-
- c[pos] = ts_getc();
- if ( c[pos] == QEOF )
- return QString::null;
-
- while ( c[pos] != QEOF && c[pos] != '\n' ) {
- pos++;
- if ( pos >= buf_size ) {
- result += QString( c, pos );
- pos = 0;
- }
- c[pos] = ts_getc();
- }
- result += QString( c, pos );
-
- int len = (int)result.length();
- if ( len && result[len-1] == '\r' )
- result.truncate(len-1); // (if there are two \r, let one stay)
-
- return result;
-}
-
-
-/*!
- Reads the entire stream and returns a string containing the text.
-
- \sa QIODevice::readLine()
-*/
-
-QString QTextStream::read()
-{
-#if defined(CHECK_STATE)
- if ( !dev ) {
- qWarning( "QTextStream::read: No device" );
- return QString::null;
- }
-#endif
- QString result;
- const uint bufsize = 512;
- QChar buf[bufsize];
- uint i, num, start;
- bool skipped_cr = FALSE;
-
- while ( 1 ) {
- num = ts_getbuf(buf,bufsize);
- // do a s/\r\n/\n
- start = 0;
- for ( i=0; i<num; i++ ) {
- if ( buf[i] == '\r' ) {
- // Only skip single cr's preceding lf's
- if ( skipped_cr ) {
- result += buf[i];
- start++;
- } else {
- result += QString( &buf[start], i-start );
- start = i+1;
- skipped_cr = TRUE;
- }
- } else {
- if ( skipped_cr ) {
- if ( buf[i] != '\n' ) {
- // Should not have skipped it
- result += '\r';
- }
- skipped_cr = FALSE;
- }
- }
- }
- if ( start < num )
- result += QString( &buf[start], i-start );
- if ( num != bufsize ) // if ( EOF )
- break;
- }
- return result;
-}
-
-
-
-/*****************************************************************************
- QTextStream write functions
- *****************************************************************************/
-
-/*!
- Writes a \c char to the stream and returns a reference to the stream.
-
- The character \a c is assumed to be Latin1 encoded independent of the Encoding set
- for the QTextStream.
-*/
-QTextStream &QTextStream::operator<<( QChar c )
-{
- CHECK_STREAM_PRECOND
- ts_putc( c );
- return *this;
-}
-
-/*!
- Writes a \c char to the stream and returns a reference to the stream.
-*/
-QTextStream &QTextStream::operator<<( char c )
-{
- CHECK_STREAM_PRECOND
- unsigned char uc = (unsigned char) c;
- ts_putc( uc );
- return *this;
-}
-
-QTextStream &QTextStream::output_int( int format, ulong n, bool neg )
-{
- static char hexdigits_lower[] = "0123456789abcdef";
- static char hexdigits_upper[] = "0123456789ABCDEF";
- CHECK_STREAM_PRECOND
- char buf[76];
- register char *p;
- int len;
- char *hexdigits;
-
- switch ( flags() & I_BASE_MASK ) {
-
- case I_BASE_2: // output binary number
- switch ( format & I_TYPE_MASK ) {
- case I_SHORT: len=16; break;
- case I_INT: len=sizeof(int)*8; break;
- case I_LONG: len=32; break;
- default: len = 0;
- }
- p = &buf[74]; // go reverse order
- *p = '\0';
- while ( len-- ) {
- *--p = (char)(n&1) + '0';
- n >>= 1;
- if ( !n )
- break;
- }
- if ( flags() & showbase ) { // show base
- *--p = (flags() & uppercase) ? 'B' : 'b';
- *--p = '0';
- }
- break;
-
- case I_BASE_8: // output octal number
- p = &buf[74];
- *p = '\0';
- do {
- *--p = (char)(n&7) + '0';
- n >>= 3;
- } while ( n );
- if ( flags() & showbase )
- *--p = '0';
- break;
-
- case I_BASE_16: // output hexadecimal number
- p = &buf[74];
- *p = '\0';
- hexdigits = (flags() & uppercase) ?
- hexdigits_upper : hexdigits_lower;
- do {
- *--p = hexdigits[(int)n&0xf];
- n >>= 4;
- } while ( n );
- if ( flags() & showbase ) {
- *--p = (flags() & uppercase) ? 'X' : 'x';
- *--p = '0';
- }
- break;
-
- default: // decimal base is default
- p = &buf[74];
- *p = '\0';
- if ( neg )
- n = (ulong)(-(long)n);
- do {
- *--p = ((int)(n%10)) + '0';
- n /= 10;
- } while ( n );
- if ( neg )
- *--p = '-';
- else if ( flags() & showpos )
- *--p = '+';
- if ( (flags() & internal) && fwidth && !ts_isdigit(*p) ) {
- ts_putc( *p ); // special case for internal
- ++p; // padding
- fwidth--;
- return *this << (const char*)p;
- }
- }
- if ( fwidth ) { // adjustment required
- if ( !(flags() & left) ) { // but NOT left adjustment
- len = qstrlen(p);
- int padlen = fwidth - len;
- if ( padlen <= 0 ) { // no padding required
- writeBlock( p, len );
- } else if ( padlen < (int)(p-buf) ) { // speeds up padding
- memset( p-padlen, (char)fillchar, padlen );
- writeBlock( p-padlen, padlen+len );
- }
- else // standard padding
- *this << (const char*)p;
- }
- else
- *this << (const char*)p;
- fwidth = 0; // reset field width
- }
- else
- writeBlock( p, qstrlen(p) );
- return *this;
-}
-
-
-/*!
- Writes a \c short integer to the stream and returns a reference to
- the stream.
-*/
-
-QTextStream &QTextStream::operator<<( signed short i )
-{
- return output_int( I_SHORT | I_SIGNED, i, i < 0 );
-}
-
-
-/*!
- Writes an \c unsigned \c short integer to the stream and returns a reference
- to the stream.
-*/
-
-QTextStream &QTextStream::operator<<( unsigned short i )
-{
- return output_int( I_SHORT | I_UNSIGNED, i, FALSE );
-}
-
-
-/*!
- Writes an \c int to the stream and returns a reference to
- the stream.
-*/
-
-QTextStream &QTextStream::operator<<( signed int i )
-{
- return output_int( I_INT | I_SIGNED, i, i < 0 );
-}
-
-
-/*!
- Writes an \c unsigned \c int to the stream and returns a reference to
- the stream.
-*/
-
-QTextStream &QTextStream::operator<<( unsigned int i )
-{
- return output_int( I_INT | I_UNSIGNED, i, FALSE );
-}
-
-
-/*!
- Writes a \c long \c int to the stream and returns a reference to
- the stream.
-*/
-
-QTextStream &QTextStream::operator<<( signed long i )
-{
- return output_int( I_LONG | I_SIGNED, i, i < 0 );
-}
-
-
-/*!
- Writes an \c unsigned \c long \c int to the stream and returns a reference to
- the stream.
-*/
-
-QTextStream &QTextStream::operator<<( unsigned long i )
-{
- return output_int( I_LONG | I_UNSIGNED, i, FALSE );
-}
-
-
-/*!
- Writes a \c float to the stream and returns a reference to the stream.
-*/
-
-QTextStream &QTextStream::operator<<( float f )
-{
- return *this << (double)f;
-}
-
-
-/*!
- Writes a \c double to the stream and returns a reference to the stream.
-*/
-
-QTextStream &QTextStream::operator<<( double f )
-{
- CHECK_STREAM_PRECOND
- char buf[64];
- char f_char;
- char format[16];
- if ( (flags()&floatfield) == fixed )
- f_char = 'f';
- else if ( (flags()&floatfield) == scientific )
- f_char = (flags() & uppercase) ? 'E' : 'e';
- else
- f_char = (flags() & uppercase) ? 'G' : 'g';
- register char *fs = format; // generate format string
- *fs++ = '%'; // "%.<prec>l<f_char>"
- *fs++ = '.';
- int prec = precision();
- if ( prec > 99 )
- prec = 99;
- if ( prec >= 10 ) {
- *fs++ = prec / 10 + '0';
- *fs++ = prec % 10 + '0';
- } else {
- *fs++ = prec + '0';
- }
- *fs++ = 'l';
- *fs++ = f_char;
- *fs = '\0';
- sprintf( buf, format, f ); // convert to text
- if ( fwidth ) // padding
- *this << (const char*)buf;
- else // just write it
- writeBlock( buf, qstrlen(buf) );
- return *this;
-}
-
-
-/*!
- Writes a string to the stream and returns a reference to the stream.
-
- The string \a s is assumed to be Latin1 encoded independent of the Encoding set
- for the QTextStream.
-*/
-
-QTextStream &QTextStream::operator<<( const char* s )
-{
- CHECK_STREAM_PRECOND
- char padbuf[48];
- uint len = qstrlen( s ); // don't write null terminator
- if ( fwidth ) { // field width set
- int padlen = fwidth - len;
- fwidth = 0; // reset width
- if ( padlen > 0 ) {
- char *ppad;
- if ( padlen > 46 ) { // create extra big fill buffer
- ppad = new char[padlen];
- CHECK_PTR( ppad );
- } else {
- ppad = padbuf;
- }
- memset( ppad, (char)fillchar, padlen ); // fill with fillchar
- if ( !(flags() & left) ) {
- writeBlock( ppad, padlen );
- padlen = 0;
- }
- writeBlock( s, len );
- if ( padlen )
- writeBlock( ppad, padlen );
- if ( ppad != padbuf ) // delete extra big fill buf
- delete[] ppad;
- return *this;
- }
- }
- writeBlock( s, len );
- return *this;
-}
-
-/*!
- Writes \a s to the stream and returns a reference to the stream.
-
- The string \a s is assumed to be Latin1 encoded independent of the Encoding set
- for the QTextStream.
-*/
-
-QTextStream &QTextStream::operator<<( const QCString & s )
-{
- return operator<<(s.data());
-}
-
-/*!
- Writes \a s to the stream and returns a reference to the stream.
-*/
-
-QTextStream &QTextStream::operator<<( const QString& s )
-{
- CHECK_STREAM_PRECOND
- uint len = s.length();
- QString s1 = s;
- if ( fwidth ) { // field width set
- if ( !(flags() & left) ) {
- s1 = s.rightJustify(fwidth, (char)fillchar);
- } else {
- s1 = s.leftJustify(fwidth, (char)fillchar);
- }
- fwidth = 0; // reset width
- }
- writeBlock( s1.unicode(), len );
- return *this;
-}
-
-
-/*!
- Writes a pointer to the stream and returns a reference to the stream.
-
- The \e ptr is output as an unsigned long hexadecimal integer.
-*/
-
-QTextStream &QTextStream::operator<<( void *ptr )
-{
- int f = flags();
- setf( hex, basefield );
- setf( showbase );
- unsetf( uppercase );
- output_int( I_LONG | I_UNSIGNED, (ulong)ptr, FALSE );
- flags( f );
- return *this;
-}
-
-
-/*!
- \fn int QTextStream::flags() const
- Returns the current stream flags. The default value is 0.
-
- The meaning of the flags are:
- <ul>
- <li> \e skipws - Not currently used - whitespace always skipped
- <li> \e left - Numeric fields are left-aligned
- <li> \e right - Not currently used (by default numerics are right aligned)
- <li> \e internal - Put any padding spaces between +/- and value
- <li> \e bin - Output \e and input only in binary
- <li> \e oct - Output \e and input only in octal
- <li> \e dec - Output \e and input only in decimal
- <li> \e hex - Output \e and input only in hexadecimal
- <li> \e showbase - Annotate numeric outputs with 0b, 0, or 0x if in
- \e bin, \e oct, or \e hex format
- <li> \e showpoint - Not currently used
- <li> \e uppercase - Use 0B and 0X rather than 0b and 0x
- <li> \e showpos - Show + for positive numeric values
- <li> \e scientific - Use scientific notation for floating point values
- <li> \e fixed - Use fixed-point notation for floating point values
- </ul>
-
- Note that unless \e bin, \e oct, \e dec, or \e hex is set, the input base is
- octal if the value starts with 0, hexadecimal if it starts with 0x, binary
- if the value starts with 0b, and decimal otherwise.
-
- \sa setf(), unsetf()
-*/
-
-/*!
- \fn int QTextStream::flags( int f )
- Sets the stream flags to \e f.
- Returns the previous stream flags.
-
- \sa setf(), unsetf(), flags()
-*/
-
-/*!
- \fn int QTextStream::setf( int bits )
- Sets the stream flag bits \e bits.
- Returns the previous stream flags.
-
- Equivalent to <code>flags( flags() | bits )</code>.
-
- \sa setf(), unsetf()
-*/
-
-/*!
- \fn int QTextStream::setf( int bits, int mask )
- Sets the stream flag bits \e bits with a bit mask \e mask.
- Returns the previous stream flags.
-
- Equivalent to <code>flags( (flags() & ~mask) | (bits & mask) )</code>.
-
- \sa setf(), unsetf()
-*/
-
-/*!
- \fn int QTextStream::unsetf( int bits )
- Clears the stream flag bits \e bits.
- Returns the previous stream flags.
-
- Equivalent to <code>flags( flags() & ~mask )</code>.
-
- \sa setf()
-*/
-
-/*!
- \fn int QTextStream::width() const
- Returns the field width. The default value is 0.
-*/
-
-/*!
- \fn int QTextStream::width( int w )
- Sets the field width to \e w. Returns the previous field width.
-*/
-
-/*!
- \fn int QTextStream::fill() const
- Returns the fill character. The default value is ' ' (space).
-*/
-
-/*!
- \fn int QTextStream::fill( int f )
- Sets the fill character to \e f. Returns the previous fill character.
-*/
-
-/*!
- \fn int QTextStream::precision() const
- Returns the precision. The default value is 6.
-*/
-
-/*!
- \fn int QTextStream::precision( int p )
- Sets the precision to \e p. Returns the previous precision setting.
-*/
-
-
- /*****************************************************************************
- QTextStream manipulators
- *****************************************************************************/
-
-QTextStream &bin( QTextStream &s )
-{
- s.setf(QTS::bin,QTS::basefield);
- return s;
-}
-
-QTextStream &oct( QTextStream &s )
-{
- s.setf(QTS::oct,QTS::basefield);
- return s;
-}
-
-QTextStream &dec( QTextStream &s )
-{
- s.setf(QTS::dec,QTS::basefield);
- return s;
-}
-
-QTextStream &hex( QTextStream &s )
-{
- s.setf(QTS::hex,QTS::basefield);
- return s;
-}
-
-QTextStream &endl( QTextStream &s )
-{
- return s << '\n';
-}
-
-QTextStream &flush( QTextStream &s )
-{
- if ( s.device() )
- s.device()->flush();
- return s;
-}
-
-QTextStream &ws( QTextStream &s )
-{
- s.skipWhiteSpace();
- return s;
-}
-
-QTextStream &reset( QTextStream &s )
-{
- s.reset();
- return s;
-}
-
-
-/*!
- \class QTextIStream qtextstream.h
- \brief A convenience class for input streams.
-
- For simple tasks, code should be simple. Hence this
- class is a shorthand to avoid passing the \e mode argument
- to the normal QTextStream constructors.
-
- This makes it easy for example, to write things like this:
-\code
- QString data = "123 456";
- int a, b;
- QTextIStream(&data) >> a >> b;
-\endcode
-
- \sa QTextOStream
-*/
-
-/*!
- \fn QTextIStream::QTextIStream( QString *s )
-
- Constructs a stream to read from string \a s.
-*/
-/*!
- \fn QTextIStream::QTextIStream( QByteArray ba )
-
- Constructs a stream to read from the array \a ba.
-*/
-/*!
- \fn QTextIStream::QTextIStream( FILE *f )
-
- Constructs a stream to read from the file \a f.
-*/
-
-
-/*!
- \class QTextOStream qtextstream.h
- \brief A convenience class for output streams.
-
- For simple tasks, code should be simple. Hence this
- class is a shorthand to avoid passing the \e mode argument
- to the normal QTextStream constructors.
-
- This makes it easy for example, to write things like this:
-\code
- QString result;
- QTextOStream(&result) << "pi = " << 3.14;
-\endcode
-*/
-
-/*!
- \fn QTextOStream::QTextOStream( QString *s )
-
- Constructs a stream to write to string \a s.
-*/
-/*!
- \fn QTextOStream::QTextOStream( QByteArray ba )
-
- Constructs a stream to write to the array \a ba.
-*/
-/*!
- \fn QTextOStream::QTextOStream( FILE *f )
-
- Constructs a stream to write to the file \a f.
-*/
-
-
-
-/*!
- Sets the encoding of this stream to \a e, where \a e is one of:
- <ul>
- <li> \c Locale Using local file format (Latin1 if locale is not
- set), but autodetecting Unicode(utf16) on input.
- <li> \c Unicode Using Unicode(utf16) for input and output. Output
- will be written in the order most efficient for the current platform
- (i.e. the order used internally in QString).
- <li> \c UnicodeUTF8 Using Unicode(utf8) for input and output. If you use it
- for input it will autodetect utf16 and use it instead of utf8.
- <li> \c Latin1 ISO-8859-1. Will not autodetect utf16.
- <li> \c UnicodeNetworkOrder Using network order Unicode(utf16) for
- input and output. Useful when reading Unicode data that does not
- start with the byte order marker.
- <li> \c UnicodeReverse Using reverse network order Unicode(utf16)
- for input and output. Useful when reading Unicode data that does not
- start with the byte order marker, or writing data that should be
- read by buggy Windows applications.
- <li> \c RawUnicode Like Unicode, but does not write the byte order
- marker, nor does it autodetect the byte order. Only useful when
- writing to non-persistent storage used by a single process.
- </ul>
-
- \c Locale and all Unicode encodings, except \c RawUnicode, will look at
- the first two bytes in a input stream to determine the byte order. The
- initial byte order marker will be stripped off before data is read.
-
- Note that this function should be called before any data is read
- to/written from the stream.
- \sa setCodec()
-*/
-
-void QTextStream::setEncoding( Encoding e )
-{
- if ( d->sourceType == QTextStreamPrivate::String )
- return; // QString does not need any encoding
- switch ( e ) {
- case Unicode:
- mapper = 0;
- latin1 = FALSE;
- doUnicodeHeader = TRUE;
- internalOrder = TRUE;
- break;
- case UnicodeUTF8:
-#ifndef QT_NO_CODECS
- mapper = QTextCodec::codecForMib( 106 );
- latin1 = FALSE;
- doUnicodeHeader = TRUE;
- internalOrder = TRUE;
-#else
- mapper = 0;
- latin1 = TRUE;
- doUnicodeHeader = TRUE;
-#endif
- break;
- case UnicodeNetworkOrder:
- mapper = 0;
- latin1 = FALSE;
- doUnicodeHeader = TRUE;
- internalOrder = QChar::networkOrdered();
- break;
- case UnicodeReverse:
- mapper = 0;
- latin1 = FALSE;
- doUnicodeHeader = TRUE;
- internalOrder = !QChar::networkOrdered(); //reverse network ordered
- break;
- case RawUnicode:
- mapper = 0;
- latin1 = FALSE;
- doUnicodeHeader = FALSE;
- internalOrder = TRUE;
- break;
- case Locale:
- latin1 = TRUE; // fallback to Latin 1
-#ifndef QT_NO_TEXTCODEC
- mapper = QTextCodec::codecForLocale();
-#if defined(_OS_WIN32_)
- if ( GetACP() == 1252 )
- mapper = 0; // Optimized latin1 processing
-#endif
- if ( mapper && mapper->mibEnum() == 4 )
-#endif
- mapper = 0; // Optimized latin1 processing
- doUnicodeHeader = TRUE; // If it reads as Unicode, accept it
- break;
- case Latin1:
- mapper = 0;
- doUnicodeHeader = FALSE;
- latin1 = TRUE;
- break;
- }
-}
-
-
-#ifndef QT_NO_TEXTCODEC
-/*! Sets the codec for this stream to \a codec. Will not try to
- autodetect Unicode.
-
- Note that this function should be called before any data is read
- to/written from the stream.
-
- \sa setEncoding()
-*/
-
-void QTextStream::setCodec( QTextCodec *codec )
-{
- if ( d->sourceType == QTextStreamPrivate::String )
- return; // QString does not need any codec
- mapper = codec;
- doUnicodeHeader = FALSE;
-}
-#endif
-
-#endif // QT_NO_TEXTSTREAM
diff --git a/qtools/qtextstream.h b/qtools/qtextstream.h
deleted file mode 100644
index c5f5ba1..0000000
--- a/qtools/qtextstream.h
+++ /dev/null
@@ -1,351 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QTextStream class
-**
-** Created : 940922
-**
-** 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 QTEXTSTREAM_H
-#define QTEXTSTREAM_H
-
-#ifndef QT_H
-#include "qiodevice.h"
-#include "qstring.h"
-#include <stdio.h>
-#endif // QT_H
-
-#ifndef QT_NO_TEXTSTREAM
-class QTextCodec;
-class QTextDecoder;
-
-class QTextStreamPrivate;
-
-class Q_EXPORT QTextStream // text stream class
-{
-public:
- enum Encoding { Locale, Latin1, Unicode, UnicodeNetworkOrder,
- UnicodeReverse, RawUnicode, UnicodeUTF8 };
-
- void setEncoding( Encoding );
-#ifndef QT_NO_TEXTCODEC
- void setCodec( QTextCodec* );
-#endif
-
- // Encoding encoding() const { return cmode; }
-
- QTextStream();
- QTextStream( QIODevice * );
- QTextStream( QString*, int mode );
- QTextStream( QString&, int mode ); // obsolete
- QTextStream( QByteArray, int mode );
- QTextStream( FILE *, int mode );
- virtual ~QTextStream();
-
- QIODevice *device() const;
- void setDevice( QIODevice * );
- void unsetDevice();
-
- bool atEnd() const;
- bool eof() const;
-
- QTextStream &operator>>( QChar & );
- QTextStream &operator>>( char & );
- QTextStream &operator>>( signed short & );
- QTextStream &operator>>( unsigned short & );
- QTextStream &operator>>( signed int & );
- QTextStream &operator>>( unsigned int & );
- QTextStream &operator>>( signed long & );
- QTextStream &operator>>( unsigned long & );
- QTextStream &operator>>( float & );
- QTextStream &operator>>( double & );
- QTextStream &operator>>( char * );
- QTextStream &operator>>( QString & );
- QTextStream &operator>>( QCString & );
-
- QTextStream &operator<<( QChar );
- QTextStream &operator<<( char );
- QTextStream &operator<<( signed short );
- QTextStream &operator<<( unsigned short );
- QTextStream &operator<<( signed int );
- QTextStream &operator<<( unsigned int );
- QTextStream &operator<<( signed long );
- QTextStream &operator<<( unsigned long );
- QTextStream &operator<<( float );
- QTextStream &operator<<( double );
- QTextStream &operator<<( const char* );
- QTextStream &operator<<( const QString & );
- QTextStream &operator<<( const QCString & );
- QTextStream &operator<<( void * ); // any pointer
-
- QTextStream &readRawBytes( char *, uint len );
- QTextStream &writeRawBytes( const char* , uint len );
-
- QString readLine();
- QString read();
- void skipWhiteSpace();
-
- enum {
- skipws = 0x0001, // skip whitespace on input
- left = 0x0002, // left-adjust output
- right = 0x0004, // right-adjust output
- internal = 0x0008, // pad after sign
- bin = 0x0010, // binary format integer
- oct = 0x0020, // octal format integer
- dec = 0x0040, // decimal format integer
- hex = 0x0080, // hex format integer
- showbase = 0x0100, // show base indicator
- showpoint = 0x0200, // force decimal point (float)
- uppercase = 0x0400, // upper-case hex output
- showpos = 0x0800, // add '+' to positive integers
- scientific= 0x1000, // scientific float output
- fixed = 0x2000 // fixed float output
- };
-
- static const int basefield; // bin | oct | dec | hex
- static const int adjustfield; // left | right | internal
- static const int floatfield; // scientific | fixed
-
- int flags() const;
- int flags( int f );
- int setf( int bits );
- int setf( int bits, int mask );
- int unsetf( int bits );
-
- void reset();
-
- int width() const;
- int width( int );
- int fill() const;
- int fill( int );
- int precision() const;
- int precision( int );
-
-private:
- long input_int();
- void init();
- QTextStream &output_int( int, ulong, bool );
- QIODevice *dev;
- bool isNetworkOrder() { return internalOrder == QChar::networkOrdered(); }
-
- int fflags;
- int fwidth;
- int fillchar;
- int fprec;
- bool fstrm;
- bool owndev;
- QTextCodec *mapper;
- QTextStreamPrivate * d;
- QChar ungetcBuf;
- bool latin1;
- bool internalOrder;
- bool doUnicodeHeader;
- void *reserved_ptr;
-
- QChar eat_ws();
- void ts_ungetc( QChar );
- QChar ts_getc();
- uint ts_getbuf( QChar*, uint );
- void ts_putc(int);
- void ts_putc(QChar);
- bool ts_isspace(QChar);
- bool ts_isdigit(QChar);
- ulong input_bin();
- ulong input_oct();
- ulong input_dec();
- ulong input_hex();
- double input_double();
- QTextStream &writeBlock( const char* p, uint len );
- QTextStream &writeBlock( const QChar* p, uint len );
-
-private: // Disabled copy constructor and operator=
-#if defined(Q_DISABLE_COPY)
- QTextStream( const QTextStream & );
- QTextStream &operator=( const QTextStream & );
-#endif
-};
-
-typedef QTextStream QTS;
-
-class Q_EXPORT QTextIStream : public QTextStream {
-public:
- QTextIStream( QString* s ) :
- QTextStream(s,IO_ReadOnly) { }
- QTextIStream( QByteArray ba ) :
- QTextStream(ba,IO_ReadOnly) { }
- QTextIStream( FILE *f ) :
- QTextStream(f,IO_ReadOnly) { }
-};
-
-class Q_EXPORT QTextOStream : public QTextStream {
-public:
- QTextOStream( QString* s ) :
- QTextStream(s,IO_WriteOnly) { }
- QTextOStream( QByteArray ba ) :
- QTextStream(ba,IO_WriteOnly) { }
- QTextOStream( FILE *f ) :
- QTextStream(f,IO_WriteOnly) { }
-};
-
-/*****************************************************************************
- QTextStream inline functions
- *****************************************************************************/
-
-inline QIODevice *QTextStream::device() const
-{ return dev; }
-
-inline bool QTextStream::atEnd() const
-{ return dev ? dev->atEnd() : FALSE; }
-
-inline bool QTextStream::eof() const
-{ return atEnd(); }
-
-inline int QTextStream::flags() const
-{ return fflags; }
-
-inline int QTextStream::flags( int f )
-{ int oldf = fflags; fflags = f; return oldf; }
-
-inline int QTextStream::setf( int bits )
-{ int oldf = fflags; fflags |= bits; return oldf; }
-
-inline int QTextStream::setf( int bits, int mask )
-{ int oldf = fflags; fflags = (fflags & ~mask) | (bits & mask); return oldf; }
-
-inline int QTextStream::unsetf( int bits )
-{ int oldf = fflags; fflags &= ~bits; return oldf; }
-
-inline int QTextStream::width() const
-{ return fwidth; }
-
-inline int QTextStream::width( int w )
-{ int oldw = fwidth; fwidth = w; return oldw; }
-
-inline int QTextStream::fill() const
-{ return fillchar; }
-
-inline int QTextStream::fill( int f )
-{ int oldc = fillchar; fillchar = f; return oldc; }
-
-inline int QTextStream::precision() const
-{ return fprec; }
-
-inline int QTextStream::precision( int p )
-{ int oldp = fprec; fprec = p; return oldp; }
-
-/*!
- Returns one character from the stream, or EOF.
-*/
-inline QChar QTextStream::ts_getc()
-{ QChar r; return ( ts_getbuf( &r,1 ) == 1 ? r : QChar((ushort)0xffff) ); }
-
-/*****************************************************************************
- QTextStream manipulators
- *****************************************************************************/
-
-typedef QTextStream & (*QTSFUNC)(QTextStream &);// manipulator function
-typedef int (QTextStream::*QTSMFI)(int); // manipulator w/int argument
-
-class Q_EXPORT QTSManip { // text stream manipulator
-public:
- QTSManip( QTSMFI m, int a ) { mf=m; arg=a; }
- void exec( QTextStream &s ) { (s.*mf)(arg); }
-private:
- QTSMFI mf; // QTextStream member function
- int arg; // member function argument
-};
-
-Q_EXPORT inline QTextStream &operator>>( QTextStream &s, QTSFUNC f )
-{ return (*f)( s ); }
-
-Q_EXPORT inline QTextStream &operator<<( QTextStream &s, QTSFUNC f )
-{ return (*f)( s ); }
-
-Q_EXPORT inline QTextStream &operator<<( QTextStream &s, QTSManip m )
-{ m.exec(s); return s; }
-
-Q_EXPORT QTextStream &bin( QTextStream &s ); // set bin notation
-Q_EXPORT QTextStream &oct( QTextStream &s ); // set oct notation
-Q_EXPORT QTextStream &dec( QTextStream &s ); // set dec notation
-Q_EXPORT QTextStream &hex( QTextStream &s ); // set hex notation
-Q_EXPORT QTextStream &endl( QTextStream &s ); // insert EOL ('\n')
-Q_EXPORT QTextStream &flush( QTextStream &s ); // flush output
-Q_EXPORT QTextStream &ws( QTextStream &s ); // eat whitespace on input
-Q_EXPORT QTextStream &reset( QTextStream &s ); // set default flags
-
-Q_EXPORT inline QTSManip qSetW( int w )
-{
- QTSMFI func = &QTextStream::width;
- return QTSManip(func,w);
-}
-
-Q_EXPORT inline QTSManip qSetFill( int f )
-{
- QTSMFI func = &QTextStream::fill;
- return QTSManip(func,f);
-}
-
-Q_EXPORT inline QTSManip qSetPrecision( int p )
-{
- QTSMFI func = &QTextStream::precision;
- return QTSManip(func,p);
-}
-
-
-#ifndef QT_ALTERNATE_QTSMANIP
-
-// These will go away in Qt 3.0, as they conflict with std libs
-//
-// If you get conflicts now, #define QT_ALTERNATE_QTSMANIP before
-// including this file.
-
-Q_EXPORT inline QTSManip setw( int w )
-{
- QTSMFI func = &QTextStream::width;
- return QTSManip(func,w);
-}
-
-Q_EXPORT inline QTSManip setfill( int f )
-{
- QTSMFI func = &QTextStream::fill;
- return QTSManip(func,f);
-}
-
-Q_EXPORT inline QTSManip setprecision( int p )
-{
- QTSMFI func = &QTextStream::precision;
- return QTSManip(func,p);
-}
-#endif
-
-#endif // QT_NO_TEXTSTREAM
-#endif // QTEXTSTREAM_H
diff --git a/qtools/qtl.doc b/qtools/qtl.doc
deleted file mode 100644
index db5b994..0000000
--- a/qtools/qtl.doc
+++ /dev/null
@@ -1,249 +0,0 @@
-/****************************************************************************
-**
-**
-** Qt template library classes 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.
-**
-**********************************************************************/
-
-/*!
-\page qtl.html
-
-\title Qt Template library
-
-Thq Qt Template Library is a set of templates within Qt dealing with
-containers of objects. It provides a list of objects, a stack of
-objects, a map (or dictionary) from one type to another, and
-associated iterators and algorithms.
-
-Qt also contains similar classes that deal with pointers to objects;
-\l QValueList vs. \l QList, etc. Compared to the pointer-based
-templates, the QTL offers easy copying of the container, real support
-for classes that e.g. require constructors, expand to much more object
-code, can often be a bit faster, require that the objects stored can
-be copied, and finally, have a worse record of compiler problems.
-
-Compared to the STL, the QTL contains only the most important features
-of the STL, has more regular function naming, has no platform
-differences, is often a little slower and often expands to less object
-code.
-
-
-If you can not make copies of the objects you want to store you are
-better off with QCollection and friends. They were designed to handle
-exactly that kind of pointer semantics. This applies for example to
-all classes derived from \l QObject. A QObject does not have a copy
-constructor, so using it as value is impossible. You may choose be
-store pointers to QObjects in a QValueList, but using QList directly
-seems to be the better choice for this kind of application
-domain. QList, like all other QCollection based containers, provides
-far more sanity checking than a speed-optimized value
-based container.
-
-If you have objects that implement value semantics, use the Qt
-template library. Value semantics require at least
-<ul>
-<li>a copy constructor,
-<li>an assignment operator and
-<li> a default constructor, i.e. a constructor that does not take
-any arguments.
-</ul>
-Note that a fast copy constructor is absolutely crucial for a good
-overall performance of the container, since many copy operations are
-going to happen.
-
-Examples for value based classes are QRect, QPoint, QSize and all
-simple C++ types like int, bool or double.
-
-The Qt template library is designed for speed. Especially iterators
-are extremely fast. On the drawback side, less error checking is done
-than in the QCollection based containers. A template library container
-for example does not track associated iterators. This makes certain
-validity checks, like on removing items, impossible to perform
-automatically.
-
-<h2> Iterators </h2>
-
-The Qt template library deals with value objects, not with pointers.
-For that reason, there is no other way of iterating over containers
-than using iterators. This is no disadvantage as the size of an
-iterator matches the size of a normal pointer - 32 or 64 bits
-depending on your CPU architecture.
-
-To iterate over a container, use a loop like this:
-
-\code
- typedef QValueList<int> List;
- List l;
- for( List::Iterator it = l.begin(); it != l.end(); ++it )
- printf("Number is %i\n",*it);
-\endcode
-
-begin() returns the iterator pointing at the first element, while
-end() returns an iterator that points \e after the last
-element. end() marks an invalid position, it can never be
-dereferenced. It's the break condition in any iteration, may it be
-from begin() or fromLast(). For maximum speed, use increment or
-decrement iterators with the prefix operator (++it, --it) instead of the the
-postfix one (it++, it--), since the former is slightly faster.
-
-The same concept applies to the other container classes:
-
-\code
- typedef QMap<QString,QString> Map;
- Map map;
- for( Map::Iterator it = map.begin(); it != map.end(); ++it )
- printf("Key=%s Data=%s\n", it.key().ascii(), it.data().ascii() );
-
- typedef QArray<int> Array;
- Array array;
- for( Array::Iterator it = array.begin(); it != array.end(); ++it )
- printf("Data=%i\n", *it );
-\endcode
-
-There are two kind of iterators, the volatile iterator shown in the
-examples above and a version that returns a const reference to its
-current object, the ConstIterator. Const iterators are required
-whenever the container itself is const, such as a member variable
-inside a const function. Assigning a ConstIterator to a normal
-Iterator is not allowed as it would violate const semantics.
-
-<h2> Algorithms </h2>
-
-The template library defines a number of algorithms that operate on
-its containers: qHeapSort(), qBubbleSort(), qSwap() and
-qCopy(). These algorithms are implemented as template functions.
-
-qHeapSort() and qBubbleSort() provide the well known sorting
-algorithms. You can use them like this:
-
-\code
- typedef QValueList<int> List;
- List l;
- l << 42 << 100 << 1234 << 12 << 8;
- qHeapSort( l );
-
- List l2;
- l2 << 42 << 100 << 1234 << 12 << 8;
- List::Iterator b = l2.find( 100 );
- List::Iterator e = l2.find( 8 );
- qHeapSort( b, e );
-
- double arr[] = { 3.2, 5.6, 8.9 };
- qHeapSort( arr, arr + 3 );
-\endcode
-
-The first example sorts the entire list. The second one sorts all
-elements enclosed in the two iterators, namely 100, 1234 and 12. The
-third example shows that iterators act like pointers and can be
-treated as such.
-
-Naturally, the sorting templates won't work with const iterators.
-
-Another utility is qSwap(). It exchanges the values of two variables:
-
-\code
- QString second( "Einstein" );
- QString name( "Albert" );
- qSwap( second, name );
-\endcode
-
-Another template function is qCopy(). It copies a container or a slice
-of it to an OutputIterator, in this case a QTextOStreamIterator:
-
-\code
- typedef QValueList<int> List;
- List l;
- l << 100 << 200 << 300;
- QTextOStream str( stdout );
- qCopy( l, QTextOStreamIterator( str ) );
-\endcode
-
-In addition, you can use any Qt template library iterator as the
-OutputIterator. Just make sure that the right hand of the iterator has
-as many elements present as you want to insert. The following example
-illustrates this:
-
-\code
- QStringList l1, l2;
- l1 << "Weis" << "Ettrich" << "Arnt" << "Sue";
- l2 << "Torben" << "Matthias";
- qCopy( l2, l1.begin();
-\endcode
-
-At the end of this code fragment, the List l1 contains "Torben",
-"Matthias", "Arnt" and "Sue", with the prior contents being
-overwritten. Another flavor of qCopy() takes three arguments to make
-it possible to copy a slice of a container:
-
-\code
- typedef QValueList<int> List;
- List l;
- l << 42 << 100 << 1234 << 12 << 8;
- List::Iterator b = l.find( 100 );
- List::Iterator e = l.find( 8 );
- QTextOStream str( stdout );
- qCopy( b, e, QTextOStreamIterator( str ) );
-\endcode
-
-If you write new algorithms, consider writing them as template
-functions in order to make them usable with as many containers
-possible. In the above example, you could just as easily print out a
-standard C++ array with qCopy():
-
-\code
- int arr[] = { 100, 200, 300 };
- QTextOStream str( stdout );
- qCopy( arr, arr + 3, QTextOStreamIterator( str ) );
-\endcode
-
-
-<h2> Streaming </h2>
-
-All mentioned containers can be serialized with the respective
-streaming operators. Here is an example.
-
-\code
- QDataStream str(...);
- QValueList<QRect> l;
- // ... fill the list here
- str << l;
-\endcode
-
-The container can be read in again with:
-
-\code
- QValueList<QRect> l;
- str >> l;
-\endcode
-
-The same applies to QStringList, QValueStack and QMap.
-
-*/
diff --git a/qtools/qtl.h b/qtools/qtl.h
deleted file mode 100644
index bd72e7d..0000000
--- a/qtools/qtl.h
+++ /dev/null
@@ -1,223 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of Qt template library classes
-**
-** Created : 990128
-**
-** 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 QTL_H
-#define QTL_H
-
-#ifndef QT_H
-#include "qtextstream.h"
-#include "qstring.h"
-#endif // QT_H
-
-#ifndef QT_NO_TEXTSTREAM
-template <class T>
-class QTextOStreamIterator
-{
-protected:
- QTextOStream& stream;
- QString separator;
-
-public:
- QTextOStreamIterator( QTextOStream& s) : stream( s ) {}
- QTextOStreamIterator( QTextOStream& s, const QString& sep )
- : stream( s ), separator( sep ) {}
- QTextOStreamIterator<T>& operator= ( const T& x ) {
- stream << x;
- if ( !separator.isEmpty() )
- stream << separator;
- return *this;
- }
- QTextOStreamIterator<T>& operator*() { return *this; }
- QTextOStreamIterator<T>& operator++() { return *this; }
- QTextOStreamIterator<T>& operator++(int) { return *this; }
-};
-#endif //QT_NO_TEXTSTREAM
-
-template <class InputIterator, class OutputIterator>
-inline OutputIterator qCopy( InputIterator _begin, InputIterator _end,
- OutputIterator _dest )
-{
- while( _begin != _end )
- *_dest++ = *_begin++;
- return _dest;
-}
-
-
-template <class T>
-inline void qSwap( T& _value1, T& _value2 )
-{
- T tmp = _value1;
- _value1 = _value2;
- _value2 = tmp;
-}
-
-
-template <class InputIterator>
-inline void qBubbleSort( InputIterator b, InputIterator e )
-{
- // Goto last element;
- InputIterator last = e;
- --last;
- // only one element or no elements ?
- if ( last == b )
- return;
-
- // So we have at least two elements in here
- while( b != last ) {
- bool swapped = FALSE;
- InputIterator swap_pos = b;
- InputIterator x = e;
- InputIterator y = x;
- y--;
- do {
- --x;
- --y;
- if ( *x < *y ) {
- swapped = TRUE;
- qSwap( *x, *y );
- swap_pos = y;
- }
- } while( y != b );
- if ( !swapped )
- return;
- b = swap_pos;
- b++;
- }
-}
-
-
-template <class Container>
-inline void qBubbleSort( Container &c )
-{
- qBubbleSort( c.begin(), c.end() );
-}
-
-
-template <class Value>
-inline void qHeapSortPushDown( Value* heap, int first, int last )
-{
- int r = first;
- while( r <= last/2 ) {
- // Node r has only one child ?
- if ( last == 2*r ) {
- // Need for swapping ?
- if ( heap[r] > heap[ 2*r ] )
- qSwap( heap[r], heap[ 2*r ] );
- // That's it ...
- r = last;
- } else { // Node has two children
- if ( heap[r] > heap[ 2*r ] && heap[ 2*r ] <= heap[ 2*r+1 ] ) {
- // Swap with left child
- qSwap( heap[r], heap[ 2*r ] );
- r *= 2;
- } else if ( heap[r] > heap[ 2*r+1 ] &&
- heap[ 2*r+1 ] < heap[ 2*r ] ) {
- // Swap with right child
- qSwap( heap[r], heap[ 2*r+1 ] );
- r = 2*r+1;
- } else {
- // We are done
- r = last;
- }
- }
- }
-}
-
-
-template <class InputIterator, class Value>
-inline void qHeapSortHelper( InputIterator b, InputIterator e, Value, uint n )
-{
- // Create the heap
- InputIterator insert = b;
- Value* realheap = new Value[ n ];
- // Wow, what a fake. But I want the heap to be indexed as 1...n
- Value* heap = realheap - 1;
- int size = 0;
- for( ; insert != e; ++insert ) {
- heap[++size] = *insert;
- int i = size;
- while( i > 1 && heap[i] < heap[ i / 2 ] ) {
- qSwap( heap[i], heap[ i / 2 ] );
- i /= 2;
- }
- }
-
- // Now do the sorting
- for( uint i = n; i > 0; i-- ) {
- *b++ = heap[1];
- if ( i > 1 ) {
- heap[1] = heap[i];
- qHeapSortPushDown( heap, 1, (int)i - 1 );
- }
- }
-
- delete[] realheap;
-}
-
-
-template <class InputIterator>
-inline void qHeapSort( InputIterator b, InputIterator e )
-{
- // Empty ?
- if ( b == e )
- return;
-
- // How many entries have to be sorted ?
- InputIterator it = b;
- uint n = 0;
- while ( it != e ) {
- ++n;
- ++it;
- }
-
- // The second last parameter is a hack to retrieve the value type
- // Do the real sorting here
- qHeapSortHelper( b, e, *b, n );
-}
-
-
-template <class Container>
-inline void qHeapSort( Container &c )
-{
- if ( c.isEmpty() )
- return;
-
- // The second last parameter is a hack to retrieve the value type
- // Do the real sorting here
- qHeapSortHelper( c.begin(), c.end(), *(c.begin()), c.count() );
-}
-
-#endif
diff --git a/qtools/qtools.pro.in b/qtools/qtools.pro.in
deleted file mode 100644
index 718803e..0000000
--- a/qtools/qtools.pro.in
+++ /dev/null
@@ -1,83 +0,0 @@
-TEMPLATE = lib
-CONFIG = warn_on staticlib $extraopts
-HEADERS = qarray.h \
- qbuffer.h \
- qcache.h \
- qgcache.h \
- qcollection.h \
- qconfig.h \
- qcstring.h \
- scstring.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 \
- qgvector.h \
- qintdict.h \
- qiodevice.h \
- qlist.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
-SOURCES = qbuffer.cpp \
- qcollection.cpp \
- scstring.cpp \
- qdatastream.cpp \
- qdatetime.cpp \
- qdir.cpp \
- qfile.cpp \
- qfileinfo.cpp \
- qgarray.cpp \
- qgcache.cpp \
- qgdict.cpp \
- qglist.cpp \
- qglobal.cpp \
- qgvector.cpp \
- qiodevice.cpp \
- qregexp.cpp \
- qstring.cpp \
- qtextstream.cpp \
- qtextcodec.cpp \
- qstringlist.cpp \
- qxml.cpp \
- qmap.cpp
-
-unix:SOURCES += qfile_unix.cpp \
- qdir_unix.cpp \
- qfileinfo_unix.cpp
-
-win32:SOURCES += qfile_win32.cpp \
- qdir_win32.cpp \
- qfileinfo_win32.cpp
-
-INCLUDEPATH = .
-TMAKE_CXXFLAGS += -DQT_NO_CODECS -DQT_LITE_UNICODE
-win32:TMAKE_CXXFLAGS += -DQT_NODLL
-win32-g++:TMAKE_CXXFLAGS += -D__CYGWIN__ -DALL_STATIC
-OBJECTS_DIR = ../objects
-DESTDIR = ../lib
diff --git a/qtools/qvaluelist.doc b/qtools/qvaluelist.doc
deleted file mode 100644
index e4621d5..0000000
--- a/qtools/qvaluelist.doc
+++ /dev/null
@@ -1,772 +0,0 @@
-/****************************************************************************
-**
-**
-** QValueList and QValueListIterator 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.
-**
-**********************************************************************/
-
-
-/*****************************************************************************
- QValueList documentation
- *****************************************************************************/
-
-/*!
- \class QValueList qvaluelist.h
- \brief The QValueList class is a value based template class that provides doubly linked lists.
-
- \ingroup qtl
- \ingroup tools
- \ingroup shared
-
- Define a template instance QValueList\<X\> to create a list of values which all
- have the class X. Please notice that QValueList does not store pointers to the
- members of the list. It holds a copy of every member. That is the reason why this
- kind of classes are called "value based" while QList and QDict are "reference based".
-
- Some classes can not be used within a QValueList, for example everything
- derived from QObject and thus all classes that implement widgets.
- Only values can be used in a QValueList. To qualify as a value, the class
- must provide
- <ul>
- <li>a copy constructor,
- <li>an assignment operator and
- <li> a default constructor, i.e. a constructor that does not take any arguments.
- </ul>
-
- Note that C++ defaults to field-by-field assignment operators and
- copy constructors if no explicit version is supplied. In many cases,
- this is sufficient.
-
- Example:
- \code
- #include <qvaluelist.h>
- #include <qstring.h>
- #include <stdio.h>
-
- class Employee
- {
- public:
- Employee(): s(0) {}
- Employee( const QString& name, int salary )
- : n(name), s(salary)
- {}
-
- QString name() const { return n; }
- int salary() const { return s; }
- void setSalary( int salary ) { s = salary; }
- private:
- QString n;
- int s;
- };
-
- void main()
- {
- typedef QValueList<Employee> EmployeeList;
- EmployeeList list; // list of Employee
-
- list.append( Employee("Bill", 50000) );
- list.append( Employee("Steve",80000) );
- list.append( Employee("Ron", 60000) );
-
- Employee joe( "Joe", 50000 );
- list.append( joe );
- joe.setSalary( 4000 );
-
- EmployeeList::Iterator it;
- for( it = list.begin(); it != list.end(); ++it )
- printf( "%s earns %d\n", (*it).name().latin1(), (*it).salary().latin1() );
- }
- \endcode
-
- Program output:
- \code
- Bill earns 50000
- Steve earns 80000
- Ron earns 60000
- Joe earns 50000
- \endcode
-
- As you can see, the latest changes to Joes salary did not affect the value
- in the list because the list created a copy of Joes entry.
-
- There are three ways of finding items in the list. The first one is by using
- the at() function. It returns an iterator. The advantages of
- getting an iterator is that you can now move forward or backward from this
- position by incrementing/decrementing the iterator. To get the amount of
- items in the list call count(). Valid indices are 0..count().
-
- The second way of accessing a list is with operator[]. That means you can address
- it like an array. The return value is a reference to the value stored in the list.
- There exist two versions of this operator. The first one is const and returns a
- const reference to the value. The second on is non const and returns a non const
- reference to the value. It is up to your compiler to choose the correct one.
-
- The third method is to use the functions begin() and end().
- With a simple for loop as shown in the example you can iterate over the complete list.
- It is save to have multiple iterators at the same time. If some member of the list is
- removed then only iterators pointing to the removed member become invalid. Inserting in
- the list does not invalidate any iterator. For convenience the function last() returns
- an iterator for the last and first() for the first element in the list.
-
- In addition you can search items in the list with the find() function. It exists in a const
- and a non const version. It starts searching from the beginning of the list, but another
- flavor of the find() function allows you to specify where searching should start.
- If you just want to know wether a certain item is at least once in the list, then you
- can use the contains() function.
-
- Since QValueList is value based there is no need to care about deleting elements in the
- list. The list holds its own copies and will free them if the corresponding member or
- the list itself is deleted. You can force the list to free all of its item with clear().
-
- QValueList is implicitly shared. That means you can just make copies of the list
- in time O(1). If multiple QValueList instances share the same data and one
- is doing a modification of the lists data then this modifying instance makes a copy
- and modifies its private copy. So it does not affect the other instances.
- From a developers point of view you can think that a QValueList and a copy of this
- list have nothing to do with each other. Developers may only notice that copying is
- very fast. People known to a CPUs MMU architecture will know this pattern as "copy on write".
-
- There exist three functions to insert items in the list. append()
- inserts an item at the end, prepend() inserts at the beginning
- and insert() inserts in front of the position given by an iterator.
-
- Items can be removed from the list in two ways. The first is to pass an iterator to
- the remove(). The other possibility is to pass a value to remove() which will
- delete all members which match this value.
-
- Lists can be sorted with the algorithms provided by the <a
- href="qtl.html">Qt Template Library</a>, for example with
- qHeapSort():
-
- Example:
- \code
- QValueList l;
- l.append( 5 );
- l.append( 8 );
- l.append( 3 );
- l.append( 4 );
- qHeapSort( l );
- \endcode
-
- \sa QValueListIterator
-*/
-
-
-/*!
- \fn QValueList::QValueList()
- Constructs an empty list.
-*/
-
-/*!
- \fn QValueList::QValueList( const QValueList<T>& l )
- Constructs a copy of \e l.
-
- This operation costs O(1) time since QValueList is implicit shared.
- The first instance applying modifications to a shared list will create
- a copy which takes in turn O(n) time. However returning a QValueList from
- a function is very fast.
-*/
-
-/*!
- \fn QValueList::~QValueList()
- Destroys the list. References to the values in the list and all iterators
- of this list become invalidated. Since QValueList is highly tuned for performance
- you wont see warnings if you use invalid iterators,
- because it is impossible for
- an iterator to check wether it is valid or not.
-*/
-
-/*!
- \fn QValueList<T>& QValueList::operator= ( const QValueList<T>& l )
- Assigns \e l to this list and returns a reference to this list.
-
- All iterators of the current list become invalidated by this operation.
- The cost of such an assignment is O(1) since QValueList is implicitly shared.
-*/
-
-/*!
- \fn QValueList<T> QValueList::operator+ ( const QValueList<T>& l ) const
- Creates a new list and fills it with the elements of this list. Then the
- elements of \e l are appended.
-
- Returns the new list.
-*/
-
-/*!
- \fn QValueList<T>& QValueList::operator+= ( const QValueList<T>& l )
- Adds \e list to this list.
-
- Returns a reference to this list.
-*/
-
-/*!
- \fn bool QValueList::operator== ( const QValueList<T>& l ) const
- Compares both lists.
-
- Returns TRUE if both list are equal.
-*/
-
-/*!
- \fn bool QValueList::operator!= ( const QValueList<T>& l ) const
- Compares both lists.
-
- Returns TRUE if both list are unequal.
-*/
-
-/*!
- \fn QValueList<T>& QValueList::operator+= ( const T& x )
- Adds the value \e x to the end of the list.
-
- Returns a reference to the list.
-*/
-
-/*!
- \fn QValueList<T>& QValueList::operator<< ( const T& x )
- Adds the value \e x to the end of the list.
-
- Returns a reference to the list.
-*/
-
-/*!
- \fn const T& QValueList::operator[] ( uint i ) const
- Returns a const reference to the item with index \e i in the list.
- It is up to you to check wether this item really exists. You can do that easily
- with the count() function. However this operator does not check wether \e i
- is in range and will deliver undefined results if it does not exist.
-*/
-
-/*!
- \fn T& QValueList::operator[] ( uint i )
- Returns a reference to the item with index \e i in the list.
- It is up to you to check wether this item really exists. You can do that easily
- with the count() function. However this operator does not check wether \e i
- is in range and will deliver undefined results if it does not exist.
- In contrast to the const operator[] you may manipulate the value returned by this
- operator.
-*/
-
-/*!
- \fn uint QValueList::count() const
- Returns the number of items in the list.
- \sa isEmpty()
-*/
-
-/*!
- \fn bool QValueList::isEmpty() const
- Returns TRUE if the list is empty, i.e. count() == 0. Returns FALSE
- otherwise.
- \sa count()
-*/
-
-/*!
- \fn Iterator QValueList::insert( Iterator it, const T& x )
- Inserts the value \e x in front of the iterator \e it.
-
- Returns an iterator pointing at the inserted item.
-
- \sa append(), prepend()
-*/
-
-/*!
- \fn Iterator QValueList::append( const T& x )
- Inserts the value \e x at the end of the list.
-
- Returns an iterator pointing at the inserted item.
-
- \sa insert(), prepend()
-*/
-
-/*!
- \fn Iterator QValueList::prepend( const T& x )
- Inserts the value \e x at the beginning of the list.
-
- Returns an iterator pointing at the inserted item.
-
- \sa insert(), append()
-*/
-
-/*!
- \fn Iterator QValueList::remove( Iterator it )
- Removes the item at position \e it in the list.
-
- Returns an iterator pointing to the item following the
- removed on or end() if the last item was deleted.
-
- \sa clear()
-*/
-
-/*!
- \fn void QValueList::remove( const T& x )
- Removes all items which have the value \e x.
-
- \sa clear()
-*/
-
-/*!
- \fn void QValueList::clear()
- Removes all items from the list.
-
- \sa remove()
-*/
-
-/*!
- \fn Iterator QValueList::find( const T& x )
- Finds the first occurrence of \e x in the list.
-
- Returns end() if no item did match.
-*/
-
-/*!
- \fn ConstIterator QValueList::find( const T& x ) const
- Finds the first occurrence of \e x in the list.
-
- Returns end() if no item did match.
-*/
-
-/*!
- \fn Iterator QValueList::find( Iterator it, const T& x )
- Finds the first occurrence of \e x in the list starting at
- the position given by \e it.
-
- Returns end() if no item did match.
-*/
-
-/*!
- \fn ConstIterator QValueList::find( ConstIterator it, const T& x ) const
- Finds the first occurrence of \e x in the list starting at
- the position given by \e it.
-
- Returns end() if no item did match.
-*/
-
-/*!
- \fn uint QValueList::contains( const T& x ) const
- Counts and returns the number of occurrences of the value \e x in the list.
-*/
-
-/*!
- \fn int QValueList::findIndex( const T& x ) const
- Returns the first index of the value \e x in the list or -1 if no such value
- can be found in the list.
-*/
-
-/*!
- \fn Iterator QValueList::at( uint i )
- Returns an iterator pointing to the item at position \e i in the list, or
- end() if the index is out of range.
-*/
-
-/*!
- \fn ConstIterator QValueList::at( uint i ) const
- Returns an iterator pointing to the item at position \e i in the list, or
- end() if the index is out of range.
-*/
-
-/*!
- \fn T& QValueList::first()
- Returns a reference to the first item in the list or the item
- referenced by end()
- if no such items exists. Please note that you may not change
- the value the end() Iterator is pointing to.
-
- \sa begin(), last()
-*/
-
-/*!
- \fn const T& QValueList::first() const
- Returns a reference to the first item in the list or the item
- referenced by end() if
- no such items exists.
-
- \sa begin(), last()
-*/
-
-/*!
- \fn Iterator QValueList::fromLast()
- Returns an iterator pointing to the last element in the list or
- end() if no such item exists.
-
- \sa last()
-*/
-
-/*!
- \fn ConstIterator QValueList::fromLast() const
- Returns an iterator pointing to the last element in the list or
- end() if no such item exists.
-
- \sa last()
-*/
-
-/*!
- \fn T& QValueList::last()
- Returns a reference to the last item in the list or the item
- referenced by end() if no
- such item exists. Please note that you may not change
- the value the end() Iterator is pointing to.
-
- \sa end(), first(), fromLast()
-*/
-
-/*!
- \fn const T& QValueList::last() const
- Returns a reference to the last item in the list or the item
- referenced by end() if no such item exists.
-
- \sa end(), first(), fromLast()
-*/
-
-/*!
- \fn Iterator QValueList::begin()
- Returns an iterator pointing to the first element in the list. This
- iterator equals end() if the list is empty;
- \sa first(), end()
-*/
-
-/*!
- \fn ConstIterator QValueList::begin() const
- Returns an iterator pointing to the first element in the list. This
- iterator equals end() if the list is empty;
- \sa first(), end()
-*/
-
-/*!
- \fn Iterator QValueList::end()
- Returns an iterator pointing behind the last element in the list. This
- iterator equals begin() if the list is empty.
-
- \sa last(), begin()
-*/
-
-/*!
- \fn ConstIterator QValueList::end() const
- Returns an iterator pointing behind the last element in the list. This
- iterator equals begin() if the list is empty.
-
- \sa last(), begin()
-*/
-
-/*!
- \fn void QValueList::detach()
- If the list does not share its data with another QValueList instance, then nothing
- happens, otherwise the function creates a new copy of this data and detaches
- from the shared one. This function is called whenever the list is modified.
- The implicit sharing mechanism is implemented this way.
-*/
-
-/*!
- \fn QDataStream& operator>>( QDataStream& s, QValueList<T>& l )
- \relates QValueList
- Reads a list from the stream. The type \e T stored in the list must implement
- the streaming operator, too.
-*/
-
-/*!
- \fn QDataStream& operator<<( QDataStream& s, const QValueList<T>& l )
- \relates QValueList
- Writes a list to the stream. The type \e T stored in the list must implement
- the streaming operator, too.
-*/
-
-/*****************************************************************************
- QValueListIterator documentation
- *****************************************************************************/
-
-/*!
- \class QValueListIterator qvaluelist.h
- \brief The QValueListIterator class provides an iterator for QValueList.
-
- \ingroup qtl
- \ingroup tools
-
- You can not create an iterator by yourself. Instead you have to
- ask a list to give you one. An iterator has only the size of a pointer.
- On 32 bit machines that means 4 bytes otherwise 8 bytes. That makes them
- very fast. In fact they resemble the semantics of pointers as good as possible
- and they are almost as fast as usual pointers.
-
- Example:
- \code
- #include <qvaluelist.h>
- #include <qstring.h>
- #include <stdio.h>
-
- class Employee
- {
- public:
- Employee(): s(0) {}
- Employee( const QString& name, int salary )
- : n(name), s(salary)
- {}
-
- QString name() const { return n; }
- int salary() const { return s; }
- void setSalary( int salary ) { s = salary; }
- private:
- QString n;
- int s;
- };
-
- void main()
- {
- typedef QValueList<Employee> EmployeeList;
- EmployeeList list; // list of Employee
-
- list.append( Employee("Bill", 50000) );
- list.append( Employee("Steve",80000) );
- list.append( Employee("Ron", 60000) );
-
- Employee joe( "Joe", 50000 );
- list.append( joe );
- joe.setSalary( 4000 );
-
- EmployeeList::Iterator it;
- for( it = list.begin(); it != list.end(); ++it )
- printf( "%s earns %d\n", (*it).name().latin1(), (*it).salary() );
- }
- \endcode
-
- Program output:
- \code
- Bill earns 50000
- Steve earns 80000
- Ron earns 60000
- Joe earns 50000
- \endcode
-
- In contrast to QList there are no built in functions in QValueList to
- traverse the list. The only way to do this is to use iterators.
- QValueList is highly optimized for performance and memory usage.
- On the other hand that means that you have to be a bit more careful
- by what you are doing. QValueList does not know about all its iterators
- and the iterators dont even know to which list they belong. That makes
- things fast and slim but a bit dangerous because it is up to you to make
- sure that iterators you are using are still valid. QListIterator will be able
- to give warnings while QValueListIterator may end up in an undefined state.
-
- For every Iterator there is a ConstIterator. When accessing a QValueList
- in a const environment or if the reference or pointer to the list is itself
- const, then you have to use the ConstIterator. Its semantics are the same,
- but it returns only const references to the item it points to.
-
- \sa QValueList, QValueListConstIterator
-*/
-
-/*!
- \fn QValueListIterator::QValueListIterator()
- Creates un uninitialized iterator.
-*/
-
-/*!
- \fn QValueListIterator::QValueListIterator( NodePtr p )
- Internal function.
-*/
-
-/*!
- \fn QValueListIterator::QValueListIterator( const QValueListIterator<T>& it )
- Constructs a copy of the iterator \e it.
-*/
-
-/*!
- \fn QValueListIterator::~QValueListIterator()
- Destroys the iterator.
-*/
-
-/* Unfortunately not with MSVC
- \fn T *QValueListIterator::operator->()
- Pointer operator. Returns a pointer to the current iterator item.
- The great advantage of this operator is that you can treat the
- iterator like a pointer.
-
- Example:
- \code
- QValueList<int>::Iterator it = list.begin();
- for( ; it != end(); ++it )
- it->show();
- \endcode
-*/
-
-/*!
- \fn T& QValueListIterator::operator*()
- Asterix operator. Returns a reference to the current iterator item.
-*/
-
-/*!
- \fn const T& QValueListIterator::operator*() const
- Asterix operator. Returns a reference to the current iterator item.
-*/
-
-/*!
- \fn QValueListIterator<T>& QValueListIterator::operator++()
- Prefix ++ makes the succeeding item current and returns
- an iterator pointing to the new current item.
- The iterator can not check wether it reached the end of the list. Incrementing
- the iterator as returned by end() causes undefined results.
-*/
-
-/*!
- \fn QValueListIterator<T> QValueListIterator::operator++(int)
- Postfix ++ makes the succeeding item current and returns
- an iterator pointing to the new current item.
- The iterator can not check wether it reached the end of the list. Incrementing
- the iterator as returned by end() causes undefined results.
-*/
-
-/*!
- \fn QValueListIterator<T>& QValueListIterator::operator--()
- Prefix -- makes the previous item current and returns
- an iterator pointing to the new current item.
- The iterator can not check wether it reached the beginning of the list. Decrementing
- the iterator as returned by begin() causes undefined results.
-*/
-
-/*!
- \fn QValueListIterator<T> QValueListIterator::operator--(int)
- Postfix -- makes the previous item current and returns
- an iterator pointing to the new current item.
- The iterator can not check wether it reached the beginning of the list. Decrementing
- the iterator as returned by begin() causes undefined results.
-*/
-
-/*!
- \fn bool QValueListIterator::operator==( const QValueListIterator<T>& it ) const
- Compares both iterators and returns TRUE if they point to the same item.
-*/
-
-/*!
- \fn bool QValueListIterator::operator!=( const QValueListIterator<T>& it ) const
- Compares both iterators and returns TRUE if they point to different items.
-*/
-
-/*****************************************************************************
- QValueListConstIterator documentation
- *****************************************************************************/
-
-/*!
- \class QValueListConstIterator qvaluelist.h
- \brief The QValueListConstIterator class provides an iterator for QValueList.
-
- \ingroup qtl
- \ingroup tools
-
- In contrast to QValueListIterator this class is used to iterate over a const
- list. It does not allow to modify the values of the list since this would
- break the const semantics.
-
- For more informations on QValueList iterators see QValueListIterator.
-
- \sa QValueListIterator, QValueList
-*/
-
-/*!
- \fn QValueListConstIterator::QValueListConstIterator()
- Creates un uninitialized iterator.
-*/
-
-/*!
- \fn QValueListConstIterator::QValueListConstIterator( NodePtr p )
- Internal function.
-*/
-
-/*!
- \fn QValueListConstIterator::QValueListConstIterator( const QValueListConstIterator<T>& it )
- Constructs a copy of the iterator \e it.
-*/
-
-/*!
- \fn QValueListConstIterator::QValueListConstIterator( const QValueListIterator<T>& it )
- Constructs a copy of the iterator \e it.
-*/
-
-/*!
- \fn QValueListConstIterator::~QValueListConstIterator()
- Destroys the iterator.
-*/
-
-/* Unfortunately not with MSVC
- \fn const T *QValueListConstIterator::operator->()
- Pointer operator. Returns a pointer to the current iterator item.
- The great advantage of this operator is that you can treat the
- iterator like a pointer.
-
- Example:
- \code
- QValueList<int>::Iterator it = list.begin();
- for( ; it != end(); ++it )
- it->show();
- \endcode
-*/
-
-/*!
- \fn const T& QValueListConstIterator::operator*() const
- Asterix operator. Returns a reference to the current iterator item.
-*/
-
-/*!
- \fn QValueListConstIterator<T>& QValueListConstIterator::operator++()
- Prefix ++ makes the succeeding item current and returns
- an iterator pointing to the new current item.
- The iterator can not check wether it reached the end of the list. Incrementing
- the iterator as returned by end() causes undefined results.
-*/
-
-/*!
- \fn QValueListConstIterator<T> QValueListConstIterator::operator++(int)
- Postfix ++ makes the succeeding item current and returns
- an iterator pointing to the new current item.
- The iterator can not check wether it reached the end of the list. Incrementing
- the iterator as returned by end() causes undefined results.
-*/
-
-/*!
- \fn QValueListConstIterator<T>& QValueListConstIterator::operator--()
- Prefix -- makes the previous item current and returns
- an iterator pointing to the new current item.
- The iterator can not check wether it reached the beginning of the list. Decrementing
- the iterator as returned by begin() causes undefined results.
-*/
-
-/*!
- \fn QValueListConstIterator<T> QValueListConstIterator::operator--(int)
- Postfix -- makes the previous item current and returns
- an iterator pointing to the new current item.
- The iterator can not check wether it reached the beginning of the list. Decrementing
- the iterator as returned by begin() causes undefined results.
-*/
-
-/*!
- \fn bool QValueListConstIterator::operator==( const QValueListConstIterator<T>& it ) const
- Compares both iterators and returns TRUE if they point to the same item.
-*/
-
-/*!
- \fn bool QValueListConstIterator::operator!=( const QValueListConstIterator<T>& it ) const
- Compares both iterators and returns TRUE if they point to different items.
-*/
diff --git a/qtools/qvaluelist.h b/qtools/qvaluelist.h
deleted file mode 100644
index a1014ed..0000000
--- a/qtools/qvaluelist.h
+++ /dev/null
@@ -1,449 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QValueList class
-**
-** Created : 990406
-**
-** 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 QVALUELIST_H
-#define QVALUELIST_H
-
-#ifndef QT_H
-#include "qshared.h"
-#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
-{
-public:
- QValueListNode( const T& t ) : data( t ) { }
- QValueListNode() { }
-#if defined(Q_TEMPLATEDLL)
- // Workaround MS bug in memory de/allocation in DLL vs. EXE
- virtual ~QValueListNode() { }
-#endif
-
- QValueListNode<T>* next;
- QValueListNode<T>* prev;
- T data;
-};
-
-template<class T>
-class Q_EXPORT QValueListIterator
-{
- public:
- /**
- * Typedefs
- */
- typedef QValueListNode<T>* NodePtr;
-
- /**
- * Variables
- */
- NodePtr node;
-
- /**
- * Functions
- */
- QValueListIterator() : node( 0 ) {}
- QValueListIterator( NodePtr p ) : node( p ) {}
- QValueListIterator( const QValueListIterator<T>& it ) : node( it.node ) {}
-
- bool operator==( const QValueListIterator<T>& it ) const { return node == it.node; }
- bool operator!=( const QValueListIterator<T>& it ) const { return node != it.node; }
- const T& operator*() const { return node->data; }
- T& operator*() { return node->data; }
-
- // Compilers are too dumb to understand this for QValueList<int>
- //T* operator->() const { return &(node->data); }
-
- QValueListIterator<T>& operator++() {
- node = node->next;
- return *this;
- }
-
- QValueListIterator<T> operator++(int) {
- QValueListIterator<T> tmp = *this;
- node = node->next;
- return tmp;
- }
-
- QValueListIterator<T>& operator--() {
- node = node->prev;
- return *this;
- }
-
- QValueListIterator<T> operator--(int) {
- QValueListIterator<T> tmp = *this;
- node = node->prev;
- return tmp;
- }
-};
-
-template<class T>
-class Q_EXPORT QValueListConstIterator
-{
- public:
- /**
- * Typedefs
- */
- typedef QValueListNode<T>* NodePtr;
-
- /**
- * Variables
- */
- NodePtr node;
-
- /**
- * Functions
- */
- QValueListConstIterator() : node( 0 ) {}
- QValueListConstIterator( NodePtr p ) : node( p ) {}
- QValueListConstIterator( const QValueListConstIterator<T>& it ) : node( it.node ) {}
- QValueListConstIterator( const QValueListIterator<T>& it ) : node( it.node ) {}
-
- bool operator==( const QValueListConstIterator<T>& it ) const { return node == it.node; }
- bool operator!=( const QValueListConstIterator<T>& it ) const { return node != it.node; }
- const T& operator*() const { return node->data; }
-
- // Compilers are too dumb to understand this for QValueList<int>
- //const T* operator->() const { return &(node->data); }
-
- QValueListConstIterator<T>& operator++() {
- node = node->next;
- return *this;
- }
-
- QValueListConstIterator<T> operator++(int) {
- QValueListConstIterator<T> tmp = *this;
- node = node->next;
- return tmp;
- }
-
- QValueListConstIterator<T>& operator--() {
- node = node->prev;
- return *this;
- }
-
- QValueListConstIterator<T> operator--(int) {
- QValueListConstIterator<T> tmp = *this;
- node = node->prev;
- return tmp;
- }
-};
-
-template <class T>
-class Q_EXPORT QValueListPrivate : public QShared
-{
-public:
- /**
- * Typedefs
- */
- typedef QValueListIterator<T> Iterator;
- typedef QValueListConstIterator<T> ConstIterator;
- typedef QValueListNode<T> Node;
- typedef QValueListNode<T>* NodePtr;
-
- /**
- * Functions
- */
- QValueListPrivate() { node = new Node; node->next = node->prev = node; nodes = 0; }
- QValueListPrivate( const QValueListPrivate<T>& _p ) : QShared() {
- node = new Node; node->next = node->prev = node; nodes = 0;
- Iterator b( _p.node->next );
- Iterator e( _p.node );
- Iterator i( node );
- while( b != e )
- insert( i, *b++ );
- }
-
- void derefAndDelete() // ### hack to get around hp-cc brain damage
- {
- if ( deref() )
- delete this;
- }
-
-#if defined(Q_TEMPLATEDLL)
- // Workaround MS bug in memory de/allocation in DLL vs. EXE
- virtual
-#endif
- ~QValueListPrivate() {
- NodePtr p = node->next;
- while( p != node ) {
- NodePtr x = p->next;
- delete p;
- p = x;
- }
- delete node;
- }
-
- Iterator insert( Iterator it, const T& x ) {
- NodePtr p = new Node( x );
- p->next = it.node;
- p->prev = it.node->prev;
- it.node->prev->next = p;
- it.node->prev = p;
- nodes++;
- return p;
- }
-
- Iterator remove( Iterator it ) {
- ASSERT ( it.node != node );
- NodePtr next = it.node->next;
- NodePtr prev = it.node->prev;
- prev->next = next;
- next->prev = prev;
- delete it.node;
- nodes--;
- return Iterator( next );
- }
-
- NodePtr find( NodePtr start, const T& x ) const {
- ConstIterator first( start );
- ConstIterator last( node );
- while( first != last) {
- if ( *first == x )
- return first.node;
- ++first;
- }
- return last.node;
- }
-
- int findIndex( NodePtr start, const T& x ) const {
- ConstIterator first( start );
- ConstIterator last( node );
- int pos = 0;
- while( first != last) {
- if ( *first == x )
- return pos;
- ++first;
- ++pos;
- }
- return -1;
- }
-
- uint contains( const T& x ) const {
- uint result = 0;
- Iterator first = Iterator( node->next );
- Iterator last = Iterator( node );
- while( first != last) {
- if ( *first == x )
- ++result;
- ++first;
- }
- return result;
- }
-
- void remove( const T& x ) {
- Iterator first = Iterator( node->next );
- Iterator last = Iterator( node );
- while( first != last) {
- if ( *first == x )
- first = remove( first );
- else
- ++first;
- }
- }
-
- NodePtr at( uint i ) const {
- ASSERT( i <= nodes );
- NodePtr p = node->next;
- for( uint x = 0; x < i; ++x )
- p = p->next;
- return p;
- }
-
- void clear() {
- nodes = 0;
- NodePtr p = node->next;
- while( p != node ) {
- NodePtr next = p->next;
- delete p;
- p = next;
- }
- node->next = node->prev = node;
- }
-
- NodePtr node;
- uint nodes;
-};
-
-template <class T>
-class Q_EXPORT QValueList
-{
-public:
- /**
- * Typedefs
- */
- typedef QValueListIterator<T> Iterator;
- typedef QValueListConstIterator<T> ConstIterator;
- typedef T ValueType;
-
- /**
- * API
- */
- QValueList() { sh = new QValueListPrivate<T>; }
- QValueList( const QValueList<T>& l ) { sh = l.sh; sh->ref(); }
- ~QValueList() { sh->derefAndDelete(); }
-
- QValueList<T>& operator= ( const QValueList<T>& l )
- {
- l.sh->ref();
- sh->derefAndDelete();
- sh = l.sh;
- return *this;
- }
-
- QValueList<T> operator+ ( const QValueList<T>& l ) const
- {
- QValueList<T> l2( *this );
- for( ConstIterator it = l.begin(); it != l.end(); ++it )
- l2.append( *it );
- return l2;
- }
-
- QValueList<T>& operator+= ( const QValueList<T>& l )
- {
- for( ConstIterator it = l.begin(); it != l.end(); ++it )
- append( *it );
- return *this;
- }
-
- bool operator== ( const QValueList<T>& l ) const
- {
- if ( count() != l.count() )
- return FALSE;
- ConstIterator it2 = begin();
- ConstIterator it = l.begin();
- for( ; it != l.end(); ++it, ++it2 )
- if ( !( *it == *it2 ) )
- return FALSE;
- return TRUE;
- }
-
- bool operator!= ( const QValueList<T>& l ) const { return !( *this == l ); }
-
- Iterator begin() { detach(); return Iterator( sh->node->next ); }
- ConstIterator begin() const { return ConstIterator( sh->node->next ); }
- Iterator end() { detach(); return Iterator( sh->node ); }
- ConstIterator end() const { return ConstIterator( sh->node ); }
- Iterator fromLast() { detach(); return Iterator( sh->node->prev ); }
- ConstIterator fromLast() const { return ConstIterator( sh->node->prev ); }
-
- bool isEmpty() const { return ( sh->nodes == 0 ); }
-
- Iterator insert( Iterator it, const T& x ) { detach(); return sh->insert( it, x ); }
-
- Iterator append( const T& x ) { detach(); return sh->insert( end(), x ); }
- Iterator prepend( const T& x ) { detach(); return sh->insert( begin(), x ); }
-
- Iterator remove( Iterator it ) { detach(); return sh->remove( it ); }
- void remove( const T& x ) { detach(); sh->remove( x ); }
-
- T& first() { detach(); return sh->node->next->data; }
- const T& first() const { return sh->node->next->data; }
- T& last() { detach(); return sh->node->prev->data; }
- const T& last() const { return sh->node->prev->data; }
-
- T& operator[] ( uint i ) { detach(); return sh->at(i)->data; }
- const T& operator[] ( uint i ) const { return sh->at(i)->data; }
- Iterator at( uint i ) { detach(); return Iterator( sh->at(i) ); }
- ConstIterator at( uint i ) const { return ConstIterator( sh->at(i) ); }
- Iterator find ( const T& x ) { detach(); return Iterator( sh->find( sh->node->next, x) ); }
- ConstIterator find ( const T& x ) const { return ConstIterator( sh->find( sh->node->next, x) ); }
- Iterator find ( Iterator it, const T& x ) { detach(); return Iterator( sh->find( it.node, x ) ); }
- ConstIterator find ( ConstIterator it, const T& x ) const { return ConstIterator( sh->find( it.node, x ) ); }
- int findIndex( const T& x ) const { return sh->findIndex( sh->node->next, x) ; }
- uint contains( const T& x ) const { return sh->contains( x ); }
-
- uint count() const { return sh->nodes; }
-
- void clear() { if ( sh->count == 1 ) sh->clear(); else { sh->deref(); sh = new QValueListPrivate<T>; } }
-
-
- QValueList<T>& operator+= ( const T& x )
- {
- append( x );
- return *this;
- }
- QValueList<T>& operator<< ( const T& x )
- {
- append( x );
- return *this;
- }
-
-
-protected:
- /**
- * Helpers
- */
- void detach() { if ( sh->count > 1 ) { sh->deref(); sh = new QValueListPrivate<T>( *sh ); } }
-
- /**
- * Variables
- */
- QValueListPrivate<T>* sh;
-};
-
-#ifndef QT_NO_DATASTREAM
-template<class T>
-inline QDataStream& operator>>( QDataStream& s, QValueList<T>& l )
-{
- l.clear();
- Q_UINT32 c;
- s >> c;
- for( Q_UINT32 i = 0; i < c; ++i )
- {
- T t;
- s >> t;
- l.append( t );
- }
- return s;
-}
-
-template<class T>
-inline QDataStream& operator<<( QDataStream& s, const QValueList<T>& l )
-{
- s << (Q_UINT32)l.count();
- QValueListConstIterator<T> it = l.begin();
- for( ; it != l.end(); ++it )
- s << *it;
- return s;
-}
-#endif // QT_NO_DATASTREAM
-#endif // QVALUELIST_H
diff --git a/qtools/qvaluestack.h b/qtools/qvaluestack.h
deleted file mode 100644
index 9728d6c..0000000
--- a/qtools/qvaluestack.h
+++ /dev/null
@@ -1,64 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QValueStack class
-**
-** Created : 990925
-**
-** 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 QVALUESTACK_H
-#define QVALUESTACK_H
-
-#ifndef QT_H
-#include "qvaluelist.h"
-#endif // QT_H
-
-
-template<class T>
-class Q_EXPORT QValueStack : public QValueList<T>
-{
-public:
- QValueStack() {}
- ~QValueStack() {}
- void push( const T& d ) { append(d); }
- T pop()
- {
- T elem( this->last() );
- if ( !this->isEmpty() )
- remove( this->fromLast() );
- return elem;
- }
- T& top() { return this->last(); }
- const T& top() const { return this->last(); }
-};
-
-#endif
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/qxml.cpp b/qtools/qxml.cpp
deleted file mode 100644
index 11a9b01..0000000
--- a/qtools/qxml.cpp
+++ /dev/null
@@ -1,6046 +0,0 @@
-/****************************************************************************
-**
-**
-** Implementation of QXmlSimpleReader and related classes.
-**
-** Created : 000518
-**
-** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
-**
-** This file is part of the XML 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 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 QT_XML_CPP
-#include "qxml.h"
-#include "qtextcodec.h"
-#include "qbuffer.h"
-
-#ifndef QT_NO_XML
-// NOT REVISED
-
-// Error strings for the XML reader
-#define XMLERR_OK "no error occured"
-#define XMLERR_TAGMISMATCH "tag mismatch"
-#define XMLERR_UNEXPECTEDEOF "unexpected end of file"
-#define XMLERR_FINISHEDPARSINGWHILENOTEOF "parsing is finished but end of file is not reached"
-#define XMLERR_LETTEREXPECTED "letter is expected"
-#define XMLERR_ERRORPARSINGELEMENT "error while parsing element"
-#define XMLERR_ERRORPARSINGPROLOG "error while parsing prolog"
-#define XMLERR_ERRORPARSINGMAINELEMENT "error while parsing main element"
-#define XMLERR_ERRORPARSINGCONTENT "error while parsing content"
-#define XMLERR_ERRORPARSINGNAME "error while parsing name"
-#define XMLERR_ERRORPARSINGNMTOKEN "error while parsing Nmtoken"
-#define XMLERR_ERRORPARSINGATTRIBUTE "error while parsing attribute"
-#define XMLERR_ERRORPARSINGMISC "error while parsing misc"
-#define XMLERR_ERRORPARSINGCHOICE "error while parsing choice or seq"
-#define XMLERR_ERRORBYCONSUMER "error triggered by consumer"
-#define XMLERR_UNEXPECTEDCHARACTER "unexpected character"
-#define XMLERR_EQUALSIGNEXPECTED "expected '=' but not found"
-#define XMLERR_QUOTATIONEXPECTED "expected \" or ' but not found"
-#define XMLERR_ERRORPARSINGREFERENCE "error while parsing reference"
-#define XMLERR_ERRORPARSINGPI "error while parsing processing instruction"
-#define XMLERR_ERRORPARSINGATTLISTDECL "error while parsing attribute list declaration"
-#define XMLERR_ERRORPARSINGATTTYPE "error while parsing attribute type declaration"
-#define XMLERR_ERRORPARSINGATTVALUE "error while parsing attribute value declaration"
-#define XMLERR_ERRORPARSINGELEMENTDECL "error while parsing element declaration"
-#define XMLERR_ERRORPARSINGENTITYDECL "error while parsing entity declaration"
-#define XMLERR_ERRORPARSINGNOTATIONDECL "error while parsing notation declaration"
-#define XMLERR_ERRORPARSINGEXTERNALID "error while parsing external id"
-#define XMLERR_ERRORPARSINGCOMMENT "error while parsing comment"
-#define XMLERR_ERRORPARSINGENTITYVALUE "error while parsing entity value declaration"
-#define XMLERR_CDSECTHEADEREXPECTED "expected the header for a cdata section"
-#define XMLERR_MORETHANONEDOCTYPE "more than one document type definition"
-#define XMLERR_ERRORPARSINGDOCTYPE "error while parsing document type definition"
-#define XMLERR_INVALIDNAMEFORPI "invalid name for processing instruction"
-#define XMLERR_VERSIONEXPECTED "version expected while reading the XML declaration"
-#define XMLERR_EDECLORSDDECLEXPECTED "EDecl or SDDecl expected while reading the XML declaration"
-#define XMLERR_SDDECLEXPECTED "SDDecl expected while reading the XML declaration"
-#define XMLERR_WRONGVALUEFORSDECL "wrong value for standalone declaration"
-#define XMLERR_UNPARSEDENTITYREFERENCE "unparsed entity reference in wrong context"
-#define XMLERR_INTERNALGENERALENTITYINDTD "internal general entity reference not allowed in DTD"
-#define XMLERR_EXTERNALGENERALENTITYINDTD "external parsed general entity reference not allowed in DTD"
-#define XMLERR_EXTERNALGENERALENTITYINAV "external parsed general entity reference not allowed in attribute value"
-
-
-// the constants for the lookup table
-static const signed char cltWS = 0; // white space
-static const signed char cltPer = 1; // %
-static const signed char cltAmp = 2; // &
-static const signed char cltGt = 3; // >
-static const signed char cltLt = 4; // <
-static const signed char cltSlash = 5; // /
-static const signed char cltQm = 6; // ?
-static const signed char cltEm = 7; // !
-static const signed char cltDash = 8; // -
-static const signed char cltCB = 9; // ]
-static const signed char cltOB = 10; // [
-static const signed char cltEq = 11; // =
-static const signed char cltDq = 12; // "
-static const signed char cltSq = 13; // '
-static const signed char cltUnknown = 14;
-
-// character lookup table
-static const signed char charLookupTable[256]={
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x00 - 0x07
- cltUnknown, // 0x08
- cltWS, // 0x09 \t
- cltWS, // 0x0A \n
- cltUnknown, // 0x0B
- cltUnknown, // 0x0C
- cltWS, // 0x0D \r
- cltUnknown, // 0x0E
- cltUnknown, // 0x0F
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x17 - 0x16
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x18 - 0x1F
- cltWS, // 0x20 Space
- cltEm, // 0x21 !
- cltDq, // 0x22 "
- cltUnknown, // 0x23
- cltUnknown, // 0x24
- cltPer, // 0x25 %
- cltAmp, // 0x26 &
- cltSq, // 0x27 '
- cltUnknown, // 0x28
- cltUnknown, // 0x29
- cltUnknown, // 0x2A
- cltUnknown, // 0x2B
- cltUnknown, // 0x2C
- cltDash, // 0x2D -
- cltUnknown, // 0x2E
- cltSlash, // 0x2F /
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x30 - 0x37
- cltUnknown, // 0x38
- cltUnknown, // 0x39
- cltUnknown, // 0x3A
- cltUnknown, // 0x3B
- cltLt, // 0x3C <
- cltEq, // 0x3D =
- cltGt, // 0x3E >
- cltQm, // 0x3F ?
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x40 - 0x47
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x48 - 0x4F
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x50 - 0x57
- cltUnknown, // 0x58
- cltUnknown, // 0x59
- cltUnknown, // 0x5A
- cltOB, // 0x5B [
- cltUnknown, // 0x5C
- cltCB, // 0x5D ]
- cltUnknown, // 0x5E
- cltUnknown, // 0x5F
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x60 - 0x67
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x68 - 0x6F
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x70 - 0x77
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x78 - 0x7F
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x80 - 0x87
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x88 - 0x8F
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x90 - 0x97
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0x98 - 0x9F
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xA0 - 0xA7
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xA8 - 0xAF
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xB0 - 0xB7
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xB8 - 0xBF
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xC0 - 0xC7
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xC8 - 0xCF
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xD0 - 0xD7
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xD8 - 0xDF
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xE0 - 0xE7
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xE8 - 0xEF
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, // 0xF0 - 0xF7
- cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown, cltUnknown // 0xF8 - 0xFF
-};
-
-
-class QXmlNamespaceSupportPrivate
-{
-};
-class QXmlAttributesPrivate
-{
-};
-class QXmlInputSourcePrivate
-{
-};
-class QXmlParseExceptionPrivate
-{
-};
-class QXmlLocatorPrivate
-{
-};
-class QXmlDefaultHandlerPrivate
-{
-};
-
-#if defined(Q_FULL_TEMPLATE_INSTANTIATION)
-bool operator==( const QMap<QString, QString>, const QMap<QString, QString> )
-{
- return FALSE;
-}
-#endif
-
-/*!
- \class QXmlParseException qxml.h
- \brief The QXmlParseException class is used to report errors with the
- QXmlErrorHandler interface.
-
- \module XML
-
- \sa QXmlErrorHandler
-*/
-/*!
- \fn QXmlParseException::QXmlParseException( const QString& name, int c, int l, const QString& p, const QString& s )
-
- Constructs a parse exception with the error string \a name in the column
- \a c and line \a l for the public identifier \a p and the system identifier
- \a s.
-*/
-/*!
- Returns the error message.
-*/
-QString QXmlParseException::message() const
-{
- return msg;
-}
-/*!
- Returns the column number the error occured.
-*/
-int QXmlParseException::columnNumber() const
-{
- return column;
-}
-/*!
- Returns the line number the error occured.
-*/
-int QXmlParseException::lineNumber() const
-{
- return line;
-}
-/*!
- Returns the public identifier the error occured.
-*/
-QString QXmlParseException::publicId() const
-{
- return pub;
-}
-/*!
- Returns the system identifier the error occured.
-*/
-QString QXmlParseException::systemId() const
-{
- return sys;
-}
-
-
-/*!
- \class QXmlLocator qxml.h
- \brief The QXmlLocator class provides the XML handler classes with
- information about the actual parsing position.
-
- \module XML
-
- The reader reports a QXmlLocator to the content handler before he starts to
- parse the document. This is done with the
- QXmlContentHandler::setDocumentLocator() function. The handler classes can
- now use this locator to get the actual position the reader is at.
-*/
-/*!
- \fn QXmlLocator::QXmlLocator( QXmlSimpleReader* parent )
-
- Constructor.
-*/
-/*!
- \fn QXmlLocator::~QXmlLocator()
-
- Destructor.
-*/
-/*!
- Gets the column number (starting with 1) or -1 if there is no column number
- available.
-*/
-int QXmlLocator::columnNumber()
-{
- return ( reader->columnNr == -1 ? -1 : reader->columnNr + 1 );
-}
-/*!
- Gets the line number (starting with 1) or -1 if there is no line number
- available.
-*/
-int QXmlLocator::lineNumber()
-{
- return ( reader->lineNr == -1 ? -1 : reader->lineNr + 1 );
-}
-
-
-/*********************************************
- *
- * QXmlNamespaceSupport
- *
- *********************************************/
-
-/*!
- \class QXmlNamespaceSupport qxml.h
- \brief The QXmlNamespaceSupport class is a helper class for XML readers which
- want to include namespace support.
-
- \module XML
-
- It provides some functions that makes it easy to handle namespaces. Its main
- use is for subclasses of QXmlReader which want to provide namespace
- support.
-
- See also the <a href="xml-sax.html#namespaces">namespace description</a>.
-*/
-
-/*!
- Constructs a QXmlNamespaceSupport.
-*/
-QXmlNamespaceSupport::QXmlNamespaceSupport()
-{
- reset();
-}
-
-/*!
- Destructs a QXmlNamespaceSupport.
-*/
-QXmlNamespaceSupport::~QXmlNamespaceSupport()
-{
-}
-
-/*!
- This function declares a prefix in the current namespace context; the prefix
- will remain in force until this context is popped, unless it is shadowed in a
- descendant context.
-
- Note that there is an asymmetry in this library: while prefix() will not
- return the default "" prefix, even if you have declared one; to check for a
- default prefix, you have to look it up explicitly using uri(). This
- asymmetry exists to make it easier to look up prefixes for attribute names,
- where the default prefix is not allowed.
-*/
-void QXmlNamespaceSupport::setPrefix( const QString& pre, const QString& uri )
-{
- if( pre.isNull() ) {
- ns.insert( "", uri );
- } else {
- ns.insert( pre, uri );
- }
-}
-
-/*!
- Returns one of the prefixes mapped to a namespace URI.
-
- If more than one prefix is currently mapped to the same URI, this function
- will make an arbitrary selection; if you want all of the prefixes, use the
- prefixes() function instead.
-
- Note: this will never return the empty (default) prefix; to check for a
- default prefix, use the uri() function with an argument of "".
-*/
-QString QXmlNamespaceSupport::prefix( const QString& uri ) const
-{
- QMap<QString, QString>::ConstIterator itc, it = ns.begin();
- while ( (itc=it) != ns.end() ) {
- ++it;
- if ( itc.data() == uri && !itc.key().isEmpty() )
- return itc.key();
- }
- return "";
-}
-
-/*!
- Looks up a prefix in the current context and returns the currently-mapped
- namespace URI. Use the empty string ("") for the default namespace.
-*/
-QString QXmlNamespaceSupport::uri( const QString& prefix ) const
-{
- const QString& returi = ns[ prefix ];
- return returi;
-}
-
-/*!
- Splits the name at the ':' and returns the prefix and the local name.
-*/
-void QXmlNamespaceSupport::splitName( const QString& qname,
- QString& prefix, QString& localname ) const
-{
- uint pos;
- // search the ':'
- for( pos=0; pos<qname.length(); pos++ ) {
- if ( qname.at(pos) == ':' )
- break;
- }
- // and split
- prefix = qname.left( pos );
- localname = qname.mid( pos+1 );
-}
-
-/*!
- Processes a raw XML 1.0 name in the current context by removing the prefix
- and looking it up among the prefixes currently declared.
-
- First parameter is the raw XML 1.0 name to be processed. The second parameter
- is a flag wheter the name is the name of an attribute (TRUE) or not (FALSE).
-
- The return values will be stored in the last two parameters as follows:
- <ul>
- <li> The namespace URI, or an empty string if none is in use.
- <li> The local name (without prefix).
- </ul>
-
- If the raw name has a prefix that has not been declared, then the return
- value will be empty.
-
- Note that attribute names are processed differently than element names: an
- unprefixed element name will received the default namespace (if any), while
- an unprefixed element name will not
-*/
-void QXmlNamespaceSupport::processName( const QString& qname,
- bool isAttribute,
- QString& nsuri, QString& localname ) const
-{
- uint pos;
- // search the ':'
- for( pos=0; pos<qname.length(); pos++ ) {
- if ( qname.at(pos) == ':' )
- break;
- }
- if ( pos < qname.length() ) {
- // there was a ':'
- nsuri = uri( qname.left( pos ) );
- localname = qname.mid( pos+1 );
- } else {
- // there was no ':'
- if ( isAttribute ) {
- nsuri = ""; // attributes don't take default namespace
- } else {
- nsuri = uri( "" ); // get default namespace
- }
- localname = qname;
- }
-}
-
-/*!
- Returns an enumeration of all prefixes currently declared.
-
- Note: if there is a default prefix, it will not be returned in this
- enumeration; check for the default prefix using uri() with an argument
- of "".
-*/
-QStringList QXmlNamespaceSupport::prefixes() const
-{
- QStringList list;
-
- QMap<QString, QString>::ConstIterator itc, it = ns.begin();
- while ( (itc=it) != ns.end() ) {
- ++it;
- if ( !itc.key().isEmpty() )
- list.append( itc.key() );
- }
- return list;
-}
-
-/*!
- Returns a list of all prefixes currently declared for a URI.
-
- The xml: prefix will be included. If you want only one prefix that's
- mapped to the namespace URI, and you don't care which one you get, use the
- prefix() function instead.
-
- Note: the empty (default) prefix is never included in this enumeration; to
- check for the presence of a default namespace, use uri() with an
- argument of "".
-*/
-QStringList QXmlNamespaceSupport::prefixes( const QString& uri ) const
-{
- QStringList list;
-
- QMap<QString, QString>::ConstIterator itc, it = ns.begin();
- while ( (itc=it) != ns.end() ) {
- ++it;
- if ( itc.data() == uri && !itc.key().isEmpty() )
- list.append( itc.key() );
- }
- return list;
-}
-
-/*!
- Starts a new namespace context.
-
- Normally, you should push a new context at the beginning of each XML element:
- the new context will automatically inherit the declarations of its parent
- context, but it will also keep track of which declarations were made within
- this context.
-*/
-void QXmlNamespaceSupport::pushContext()
-{
- nsStack.push( ns );
-}
-
-/*!
- Reverts to the previous namespace context.
-
- Normally, you should pop the context at the end of each XML element. After
- popping the context, all namespace prefix mappings that were previously in
- force are restored.
-*/
-void QXmlNamespaceSupport::popContext()
-{
- if( !nsStack.isEmpty() )
- ns = nsStack.pop();
-}
-
-/*!
- Resets this namespace support object for reuse.
-*/
-void QXmlNamespaceSupport::reset()
-{
- nsStack.clear();
- ns.clear();
- ns.insert( "xml", "http://www.w3.org/XML/1998/namespace" ); // the XML namespace
-}
-
-
-
-/*********************************************
- *
- * QXmlAttributes
- *
- *********************************************/
-
-/*!
- \class QXmlAttributes qxml.h
- \brief The QXmlAttributes class provides XML attributes.
-
- \module XML
-
- If attributes are reported by QXmlContentHandler::startElement() this
- class is used to pass the attribute values. It provides you with different
- functions to access the attribute names and values.
-*/
-/*!
- \fn QXmlAttributes::QXmlAttributes()
-
- Constructs an empty attribute list.
-*/
-/*!
- \fn QXmlAttributes::~QXmlAttributes()
-
- Destructs attributes.
-*/
-
-/*!
- Look up the index of an attribute by an XML 1.0 qualified name.
-
- Returns the index of the attribute (starting with 0) or -1 if it wasn't
- found.
-
- See also the <a href="xml-sax.html#namespaces">namespace description</a>.
-*/
-int QXmlAttributes::index( const QString& qName ) const
-{
- return qnameList.findIndex( qName );
-}
-
-/*!
- Looks up the index of an attribute by a namespace name.
-
- \a uri specifies the namespace URI, or the empty string if the name has no
- namespace URI. \a localPart specifies the attribute's local name.
-
- Returns the index of the attribute (starting with 0) or -1 if it wasn't
- found.
-
- See also the <a href="xml-sax.html#namespaces">namespace description</a>.
-*/
-int QXmlAttributes::index( const QString& uri, const QString& localPart ) const
-{
- uint count = uriList.count();
- for ( uint i=0; i<count; i++ ) {
- if ( uriList[i] == uri && localnameList[i] == localPart )
- return i;
- }
- return -1;
-}
-
-/*!
- Returns the number of attributes in the list.
-*/
-int QXmlAttributes::length() const
-{
- return valueList.count();
-}
-
-/*!
- Looks up an attribute's local name by index (starting with 0).
-
- See also the <a href="xml-sax.html#namespaces">namespace description</a>.
-*/
-QString QXmlAttributes::localName( int index ) const
-{
- return localnameList[index];
-}
-
-/*!
- Looks up an attribute's XML 1.0 qualified name by index (starting with 0).
-
- See also the <a href="xml-sax.html#namespaces">namespace description</a>.
-*/
-QString QXmlAttributes::qName( int index ) const
-{
- return qnameList[index];
-}
-
-/*!
- Looks up an attribute's namespace URI by index (starting with 0).
-
- See also the <a href="xml-sax.html#namespaces">namespace description</a>.
-*/
-QString QXmlAttributes::uri( int index ) const
-{
- return uriList[index];
-}
-
-/*!
- Looks up an attribute's type by index (starting with 0).
-
- At the moment only 'CDATA' is returned.
-*/
-QString QXmlAttributes::type( int ) const
-{
- return "CDATA";
-}
-
-/*!
- Looks up an attribute's type by XML 1.0 qualified name.
-
- At the moment only 'CDATA' is returned.
-*/
-QString QXmlAttributes::type( const QString& ) const
-{
- return "CDATA";
-}
-
-/*!
- Looks up an attribute's type by namespace name.
-
- The first parameter specifies the namespace URI, or the empty string if
- the name has no namespace URI. The second parameter specifies the
- attribute's local name.
-
- At the moment only 'CDATA' is returned.
-*/
-QString QXmlAttributes::type( const QString&, const QString& ) const
-{
- return "CDATA";
-}
-
-/*!
- Looks up an attribute's value by index (starting with 0).
-*/
-QString QXmlAttributes::value( int index ) const
-{
- return valueList[index];
-}
-
-/*!
- Looks up an attribute's value by XML 1.0 qualified name.
-
- See also the <a href="xml-sax.html#namespaces">namespace description</a>.
-*/
-QString QXmlAttributes::value( const QString& qName ) const
-{
- int i = index( qName );
- if ( i == -1 )
- return QString::null;
- return valueList[ i ];
-}
-
-/*!
- Looks up an attribute's value by namespace name.
-
- \a uri specifies the namespace URI, or the empty string if the name has no
- namespace URI. \a localName specifies the attribute's local name.
-
- See also the <a href="xml-sax.html#namespaces">namespace description</a>.
-*/
-QString QXmlAttributes::value( const QString& uri, const QString& localName ) const
-{
- int i = index( uri, localName );
- if ( i == -1 )
- return QString::null;
- return valueList[ i ];
-}
-
-
-/*********************************************
- *
- * QXmlInputSource
- *
- *********************************************/
-
-/*!
- \class QXmlInputSource qxml.h
- \brief The QXmlInputSource class is the source where XML data is read from.
-
- \module XML
-
- All subclasses of QXmlReader read the input from this class.
-*/
-
-/*!
- Returns all the data this input source contains.
-*/
-const QString& QXmlInputSource::data() const
-{
- return input;
-}
-
-/*!
- Constructs a input source which contains no data.
-*/
-QXmlInputSource::QXmlInputSource( )
-{
- input = "";
-}
-
-/*!
- Constructs a input source and get the data from the text stream.
-*/
-QXmlInputSource::QXmlInputSource( QTextStream& stream )
-{
- QByteArray rawData;
- if ( stream.device()->isDirectAccess() ) {
- rawData = stream.device()->readAll();
- } else {
- int nread = 0;
- const int bufsize = 512;
- while ( !stream.device()->atEnd() ) {
- rawData.resize( nread + bufsize );
- nread += stream.device()->readBlock( rawData.data()+nread, bufsize );
- }
- rawData.resize( nread );
- }
- readInput( rawData );
-}
-
-/*!
- Constructs a input source and get the data from a file. If the file cannot be
- read the input source is empty.
-*/
-QXmlInputSource::QXmlInputSource( QFile& file )
-{
- if ( !file.open(IO_ReadOnly) ) {
- input = "";
- return;
- }
- QByteArray rawData = file.readAll();
- readInput( rawData );
- file.close();
-}
-
-/*!
- Destructor.
-*/
-QXmlInputSource::~QXmlInputSource()
-{
-}
-
-/*!
- Sets the data of the input source to \a dat.
-*/
-void QXmlInputSource::setData( const QString& dat )
-{
- input = dat;
-}
-
-/*!
- Read the XML file from the byte array; try to recoginize the encoding.
-*/
-// ### The input source should not do the encoding detection!
-void QXmlInputSource::readInput( QByteArray& rawData )
-{
- QBuffer buf( rawData );
- buf.open( IO_ReadOnly );
- QTextStream *stream = new QTextStream( &buf );
- QChar tmp;
- // assume UTF8 or UTF16 at first
- stream->setEncoding( QTextStream::UnicodeUTF8 );
- input = "";
- // read the first 5 characters
- for ( int i=0; i<5; i++ ) {
- *stream >> tmp;
- input += tmp;
- }
- // starts the document with an XML declaration?
- if ( input == "<?xml" ) {
- // read the whole XML declaration
- do {
- *stream >> tmp;
- input += tmp;
- } while( tmp != '>' );
- // and try to find out if there is an encoding
- int pos = input.find( "encoding" );
- if ( pos != -1 ) {
- QString encoding;
- do {
- pos++;
- if ( pos > (int)input.length() )
- goto finished;
- } while( input[pos] != '"' && input[pos] != '\'' );
- pos++;
- while( input[pos] != '"' && input[pos] != '\'' ) {
- encoding += input[pos];
- pos++;
- if ( pos > (int)input.length() )
- goto finished;
- }
- delete stream;
- stream = new QTextStream( &buf );
- stream->setCodec( QTextCodec::codecForName( encoding ) );
- buf.reset();
- input = "";
- }
- }
-finished:
- input += stream->read();
- delete stream;
- buf.close();
-}
-
-
-/*********************************************
- *
- * QXmlDefaultHandler
- *
- *********************************************/
-
-/*!
- \class QXmlContentHandler qxml.h
- \brief The QXmlContentHandler class provides an interface to report logical
- content of XML data.
-
- \module XML
-
- If the application needs to be informed of basic parsing events, it
- implements this interface and sets it with QXmlReader::setContentHandler().
- The reader reports basic document-related events like the start and end of
- elements and character data through this interface.
-
- The order of events in this interface is very important, and mirrors the
- order of information in the document itself. For example, all of an element's
- content (character data, processing instructions, and/or subelements) will
- appear, in order, between the startElement() event and the corresponding
- endElement() event.
-
- The class QXmlDefaultHandler gives a default implementation for this
- interface; subclassing from this class is very convenient if you want only be
- informed of some parsing events.
-
- See also the <a href="xml.html#introSAX2">Introduction to SAX2</a>.
-
- \sa QXmlDTDHandler QXmlDeclHandler QXmlEntityResolver QXmlErrorHandler
- QXmlLexicalHandler
-*/
-/*!
- \fn void QXmlContentHandler::setDocumentLocator( QXmlLocator* locator )
-
- The reader calls this function before he starts parsing the document. The
- argument \a locator is a pointer to a QXmlLocator which allows the
- application to get the actual position of the parsing in the document.
-
- Do not destroy the \a locator; it is destroyed when the reader is destroyed
- (do not use the \a locator after the reader got destroyed).
-*/
-/*!
- \fn bool QXmlContentHandler::startDocument()
-
- The reader calls this function when he starts parsing the document.
- The reader will call this function only once before any other functions in
- this class or in the QXmlDTDHandler class are called (except
- QXmlContentHandler::setDocumentLocator()).
-
- If this function returns FALSE the reader will stop parsing and will report
- an error. The reader will use the function errorString() to get the error
- message that will be used for reporting the error.
-
- \sa endDocument()
-*/
-/*!
- \fn bool QXmlContentHandler::endDocument()
-
- The reader calls this function after he has finished the parsing. It
- is only called once. It is the last function of all handler functions that is
- called. It is called after the reader has read all input or has abandoned
- parsing because of a fatal error.
-
- If this function returns FALSE the reader will stop parsing and will report
- an error. The reader will use the function errorString() to get the error
- message that will be used for reporting the error.
-
- \sa startDocument()
-*/
-/*!
- \fn bool QXmlContentHandler::startPrefixMapping( const QString& prefix, const QString& uri )
-
- The reader calls this function to signal the begin of a prefix-URI
- namespace mapping scope. This information is not necessary for normal
- namespace processing since the reader automatically replaces prefixes for
- element and attribute names.
-
- Note that startPrefixMapping and endPrefixMapping calls are not guaranteed to
- be properly nested relative to each-other: all startPrefixMapping events will
- occur before the corresponding startElement event, and all endPrefixMapping
- events will occur after the corresponding endElement event, but their order
- is not otherwise guaranteed.
-
- The argument \a prefix is the namespace prefix being declared and the
- argument \a uri is the namespace URI the prefix is mapped to.
-
- If this function returns FALSE the reader will stop parsing and will report
- an error. The reader will use the function errorString() to get the error
- message that will be used for reporting the error.
-
- See also the <a href="xml-sax.html#namespaces">namespace description</a>.
-
- \sa endPrefixMapping()
-*/
-/*!
- \fn bool QXmlContentHandler::endPrefixMapping( const QString& prefix )
-
- The reader calls this function to signal the end of a prefix mapping.
-
- If this function returns FALSE the reader will stop parsing and will report
- an error. The reader will use the function errorString() to get the error
- message that will be used for reporting the error.
-
- See also the <a href="xml-sax.html#namespaces">namespace description</a>.
-
- \sa startPrefixMapping()
-*/
-/*!
- \fn bool QXmlContentHandler::startElement( const QString& namespaceURI, const QString& localName, const QString& qName, const QXmlAttributes& atts )
-
- The reader calls this function when he has parsed a start element tag.
-
- There will be a corresponding endElement() call when the corresponding end
- element tag was read. The startElement() and endElement() calls are always
- nested correctly. Empty element tags (e.g. &lt;a/&gt;) are reported by
- startElement() directly followed by a call to endElement().
-
- The attribute list provided will contain only attributes with explicit
- values. The attribute list will contain attributes used for namespace
- declaration (i.e. attributes starting with xmlns) only if the
- namespace-prefix property of the reader is TRUE.
-
- The argument \a uri is the namespace URI, or the empty string if the element
- has no namespace URI or if namespace processing is not being performed, \a
- localName is the local name (without prefix), or the empty string if
- namespace processing is not being performed, \a qName is the qualified name
- (with prefix), or the empty string if qualified names are not available and
- \a atts are the attributes attached to the element. If there are no
- attributes, \a atts is an empty attributes object
-
- If this function returns FALSE the reader will stop parsing and will report
- an error. The reader will use the function errorString() to get the error
- message that will be used for reporting the error.
-
- See also the <a href="xml-sax.html#namespaces">namespace description</a>.
-
- \sa endElement()
-*/
-/*!
- \fn bool QXmlContentHandler::endElement( const QString& namespaceURI, const QString& localName, const QString& qName )
-
- The reader calls this function when he has parsed an end element tag.
-
- If this function returns FALSE the reader will stop parsing and will report
- an error. The reader will use the function errorString() to get the error
- message that will be used for reporting the error.
-
- See also the <a href="xml-sax.html#namespaces">namespace description</a>.
-
- \sa startElement()
-*/
-/*!
- \fn bool QXmlContentHandler::characters( const QString& ch )
-
- The reader calls this function when he has parsed a chunk of character
- data (either normal character data or character data inside a CDATA section;
- if you have to distinguish between those two types you have to use
- QXmlLexicalHandler::startCDATA() and QXmlLexicalHandler::endCDATA() in
- addition).
-
- Some readers will report whitespace in element content using the
- ignorableWhitespace() function rather than this one (QXmlSimpleReader will
- do it not though).
-
- A reader is allowed to report the character data of an element in more than
- one chunk; e.g. a reader might want to report "a &amp;lt; b" in three
- characters() events ("a ", "<" and " b").
-
- If this function returns FALSE the reader will stop parsing and will report
- an error. The reader will use the function errorString() to get the error
- message that will be used for reporting the error.
-*/
-/*!
- \fn bool QXmlContentHandler::ignorableWhitespace( const QString& ch )
-
- Some readers may use this function to report each chunk of whitespace in
- element content (QXmlSimpleReader does not though).
-
- If this function returns FALSE the reader will stop parsing and will report
- an error. The reader will use the function errorString() to get the error
- message that will be used for reporting the error.
-*/
-/*!
- \fn bool QXmlContentHandler::processingInstruction( const QString& target, const QString& data )
-
- The reader calls this function when he has parsed a processing
- instruction.
-
- \a target is the target name of the processing instruction and \a data is the
- data of the processing instruction.
-
- If this function returns FALSE the reader will stop parsing and will report
- an error. The reader will use the function errorString() to get the error
- message that will be used for reporting the error.
-*/
-/*!
- \fn bool QXmlContentHandler::skippedEntity( const QString& name )
-
- Some readers may skip entities if they have not seen the declarations (e.g.
- because they are in an external DTD). If they do so they will report it by
- calling this function.
-
- If this function returns FALSE the reader will stop parsing and will report
- an error. The reader will use the function errorString() to get the error
- message that will be used for reporting the error.
-*/
-/*!
- \fn QString QXmlContentHandler::errorString()
-
- The reader calls this function to get an error string if any of the handler
- functions returns FALSE to him.
-*/
-
-
-/*!
- \class QXmlErrorHandler qxml.h
- \brief The QXmlErrorHandler class provides an interface to report errors in
- XML data.
-
- \module XML
-
- If the application is interested in reporting errors to the user or any other
- customized error handling, you should subclass this class.
-
- You can set the error handler with QXmlReader::setErrorHandler().
-
- See also the <a href="xml.html#introSAX2">Introduction to SAX2</a>.
-
- \sa QXmlDTDHandler QXmlDeclHandler QXmlContentHandler QXmlEntityResolver
- QXmlLexicalHandler
-*/
-/*!
- \fn bool QXmlErrorHandler::warning( const QXmlParseException& exception )
-
- A reader might use this function to report a warning. Warnings are conditions
- that are not errors or fatal errors as defined by the XML 1.0 specification.
-
- If this function returns FALSE the reader will stop parsing and will report
- an error. The reader will use the function errorString() to get the error
- message that will be used for reporting the error.
-*/
-/*!
- \fn bool QXmlErrorHandler::error( const QXmlParseException& exception )
-
- A reader might use this function to report a recoverable error. A recoverable
- error corresponds to the definiton of "error" in section 1.2 of the XML 1.0
- specification.
-
- The reader must continue to provide normal parsing events after invoking this
- function.
-
- If this function returns FALSE the reader will stop parsing and will report
- an error. The reader will use the function errorString() to get the error
- message that will be used for reporting the error.
-*/
-/*!
- \fn bool QXmlErrorHandler::fatalError( const QXmlParseException& exception )
-
- A reader must use this function to report a non-recoverable error.
-
- If this function returns TRUE the reader might try to go on parsing and
- reporting further errors; but no regular parsing events are reported.
-*/
-/*!
- \fn QString QXmlErrorHandler::errorString()
-
- The reader calls this function to get an error string if any of the handler
- functions returns FALSE to him.
-*/
-
-
-/*!
- \class QXmlDTDHandler qxml.h
- \brief The QXmlDTDHandler class provides an interface to report DTD content
- of XML data.
-
- \module XML
-
- If an application needs information about notations and unparsed entities,
- then the application implements this interface and registers an instance with
- QXmlReader::setDTDHandler().
-
- Note that this interface includes only those DTD events that the XML
- recommendation requires processors to report: notation and unparsed entity
- declarations.
-
- See also the <a href="xml.html#introSAX2">Introduction to SAX2</a>.
-
- \sa QXmlDeclHandler QXmlContentHandler QXmlEntityResolver QXmlErrorHandler
- QXmlLexicalHandler
-*/
-/*!
- \fn bool QXmlDTDHandler::notationDecl( const QString& name, const QString& publicId, const QString& systemId )
-
- The reader calls this function when he has parsed a notation
- declaration.
-
- The argument \a name is the notation name, \a publicId is the notations's
- public identifier and \a systemId is the notations's system identifier.
-
- If this function returns FALSE the reader will stop parsing and will report
- an error. The reader will use the function errorString() to get the error
- message that will be used for reporting the error.
-*/
-/*!
- \fn bool QXmlDTDHandler::unparsedEntityDecl( const QString& name, const QString& publicId, const QString& systemId, const QString& notationName )
-
- The reader calls this function when he finds an unparsed entity declaration.
-
- The argument \a name is the unparsed entity's name, \a publicId is the
- entity's public identifier, \a systemId is the entity's system identifier and
- \a notation is the name of the associated notation.
-
- If this function returns FALSE the reader will stop parsing and will report
- an error. The reader will use the function errorString() to get the error
- message that will be used for reporting the error.
-*/
-/*!
- \fn QString QXmlDTDHandler::errorString()
-
- The reader calls this function to get an error string if any of the handler
- functions returns FALSE to him.
-*/
-
-
-/*!
- \class QXmlEntityResolver qxml.h
- \brief The QXmlEntityResolver class provides an interface to resolve extern
- entities contained in XML data.
-
- \module XML
-
- If an application needs to implement customized handling for external
- entities, it must implement this interface and register it with
- QXmlReader::setEntityResolver().
-
- See also the <a href="xml.html#introSAX2">Introduction to SAX2</a>.
-
- \sa QXmlDTDHandler QXmlDeclHandler QXmlContentHandler QXmlErrorHandler
- QXmlLexicalHandler
-*/
-/*!
- \fn bool QXmlEntityResolver::resolveEntity( const QString& publicId, const QString& systemId, QXmlInputSource* ret )
-
- The reader will call this function before he opens any external entity,
- except the top-level document entity. The application may request the reader
- to resolve the entity itself (\a ret is 0) or to use an entirely different
- input source (\a ret points to the input source).
-
- The reader will delete the input source \a ret when he no longer needs it. So
- you should allocate it on the heap with \c new.
-
- The argument \a publicId is the public identifier of the external entity, \a
- systemId is the system identifier of the external entity and \a ret is the
- return value of this function: if it is 0 the reader should resolve the
- entity itself, if it is non-zero it must point to an input source which the
- reader will use instead.
-
- If this function returns FALSE the reader will stop parsing and will report
- an error. The reader will use the function errorString() to get the error
- message that will be used for reporting the error.
-*/
-/*!
- \fn QString QXmlEntityResolver::errorString()
-
- The reader calls this function to get an error string if any of the handler
- functions returns FALSE to him.
-*/
-
-
-/*!
- \class QXmlLexicalHandler qxml.h
- \brief The QXmlLexicalHandler class provides an interface to report lexical
- content of XML data.
-
- \module XML
-
- The events in the lexical handler apply to the entire document, not just to
- the document element, and all lexical handler events appear between the
- content handler's startDocument and endDocument events.
-
- You can set the lexical handler with QXmlReader::setLexicalHandler().
-
- This interface is designed after the SAX2 extension LexicalHandler. The
- functions startEntity() and endEntity() are not included though.
-
- See also the <a href="xml.html#introSAX2">Introduction to SAX2</a>.
-
- \sa QXmlDTDHandler QXmlDeclHandler QXmlContentHandler QXmlEntityResolver
- QXmlErrorHandler
-*/
-/*!
- \fn bool QXmlLexicalHandler::startDTD( const QString& name, const QString& publicId, const QString& systemId )
-
- The reader calls this function to report the start of a DTD declaration, if
- any.
-
- All declarations reported through QXmlDTDHandler or QXmlDeclHandler appear
- between the startDTD() and endDTD() calls.
-
- If this function returns FALSE the reader will stop parsing and will report
- an error. The reader will use the function errorString() to get the error
- message that will be used for reporting the error.
-
- \sa endDTD()
-*/
-/*!
- \fn bool QXmlLexicalHandler::endDTD()
-
- The reader calls this function to report the end of a DTD declaration, if
- any.
-
- If this function returns FALSE the reader will stop parsing and will report
- an error. The reader will use the function errorString() to get the error
- message that will be used for reporting the error.
-
- \sa startDTD()
-*/
-/*!
- \fn bool QXmlLexicalHandler::startCDATA()
-
- The reader calls this function to report the start of a CDATA section. The
- content of the CDATA section will be reported through the regular
- QXmlContentHandler::characters(). This function is intended only to report
- the boundary.
-
- If this function returns FALSE the reader will stop parsing and will report
- an error. The reader will use the function errorString() to get the error
- message that will be used for reporting the error.
-
- \sa endCDATA()
-*/
-/*!
- \fn bool QXmlLexicalHandler::endCDATA()
-
- The reader calls this function to report the end of a CDATA section.
-
- If this function returns FALSE the reader will stop parsing and will report
- an error. The reader will use the function errorString() to get the error
- message that will be used for reporting the error.
-
- \sa startCDATA()
-*/
-/*!
- \fn bool QXmlLexicalHandler::comment( const QString& ch )
-
- The reader calls this function to report an XML comment anywhere in the
- document.
-
- If this function returns FALSE the reader will stop parsing and will report
- an error. The reader will use the function errorString() to get the error
- message that will be used for reporting the error.
-*/
-/*!
- \fn QString QXmlLexicalHandler::errorString()
-
- The reader calls this function to get an error string if any of the handler
- functions returns FALSE to him.
-*/
-
-
-/*!
- \class QXmlDeclHandler qxml.h
- \brief The QXmlDeclHandler class provides an interface to report declaration
- content of XML data.
-
- \module XML
-
- You can set the declaration handler with QXmlReader::setDeclHandler().
-
- This interface is designed after the SAX2 extension DeclHandler.
-
- See also the <a href="xml.html#introSAX2">Introduction to SAX2</a>.
-
- \sa QXmlDTDHandler QXmlContentHandler QXmlEntityResolver QXmlErrorHandler
- QXmlLexicalHandler
-*/
-/*!
- \fn bool QXmlDeclHandler::attributeDecl( const QString& eName, const QString& aName, const QString& type, const QString& valueDefault, const QString& value )
-
- The reader calls this function to report an attribute type declaration. Only
- the effective (first) declaration for an attribute will be reported.
-
- If this function returns FALSE the reader will stop parsing and will report
- an error. The reader will use the function errorString() to get the error
- message that will be used for reporting the error.
-*/
-/*!
- \fn bool QXmlDeclHandler::internalEntityDecl( const QString& name, const QString& value )
-
- The reader calls this function to report an internal entity declaration. Only
- the effective (first) declaration will be reported.
-
- If this function returns FALSE the reader will stop parsing and will report
- an error. The reader will use the function errorString() to get the error
- message that will be used for reporting the error.
-*/
-/*!
- \fn bool QXmlDeclHandler::externalEntityDecl( const QString& name, const QString& publicId, const QString& systemId )
-
- The reader calls this function to report a parsed external entity
- declaration. Only the effective (first) declaration for each entity will be
- reported.
-
- If this function returns FALSE the reader will stop parsing and will report
- an error. The reader will use the function errorString() to get the error
- message that will be used for reporting the error.
-*/
-/*!
- \fn QString QXmlDeclHandler::errorString()
-
- The reader calls this function to get an error string if any of the handler
- functions returns FALSE to him.
-*/
-
-
-/*!
- \class QXmlDefaultHandler qxml.h
- \brief The QXmlDefaultHandler class provides a default implementation of all
- XML handler classes.
-
- \module XML
-
- Very often you are only interested in parts of the things that that the
- reader reports to you. This class simply implements a default behaviour of
- the handler classes (most of the time: do nothing). Normally this is the
- class you subclass for implementing your customized handler.
-
- See also the <a href="xml.html#introSAX2">Introduction to SAX2</a>.
-
- \sa QXmlDTDHandler QXmlDeclHandler QXmlContentHandler QXmlEntityResolver
- QXmlErrorHandler QXmlLexicalHandler
-*/
-/*!
- \fn QXmlDefaultHandler::QXmlDefaultHandler()
-
- Constructor.
-*/
-/*!
- \fn QXmlDefaultHandler::~QXmlDefaultHandler()
-
- Destructor.
-*/
-
-/*!
- Does nothing.
-*/
-void QXmlDefaultHandler::setDocumentLocator( QXmlLocator* )
-{
-}
-
-/*!
- Does nothing.
-*/
-bool QXmlDefaultHandler::startDocument()
-{
- return TRUE;
-}
-
-/*!
- Does nothing.
-*/
-bool QXmlDefaultHandler::endDocument()
-{
- return TRUE;
-}
-
-/*!
- Does nothing.
-*/
-bool QXmlDefaultHandler::startPrefixMapping( const QString&, const QString& )
-{
- return TRUE;
-}
-
-/*!
- Does nothing.
-*/
-bool QXmlDefaultHandler::endPrefixMapping( const QString& )
-{
- return TRUE;
-}
-
-/*!
- Does nothing.
-*/
-bool QXmlDefaultHandler::startElement( const QString&, const QString&,
- const QString&, const QXmlAttributes& )
-{
- return TRUE;
-}
-
-/*!
- Does nothing.
-*/
-bool QXmlDefaultHandler::endElement( const QString&, const QString&,
- const QString& )
-{
- return TRUE;
-}
-
-/*!
- Does nothing.
-*/
-bool QXmlDefaultHandler::characters( const QString& )
-{
- return TRUE;
-}
-
-/*!
- Does nothing.
-*/
-bool QXmlDefaultHandler::ignorableWhitespace( const QString& )
-{
- return TRUE;
-}
-
-/*!
- Does nothing.
-*/
-bool QXmlDefaultHandler::processingInstruction( const QString&,
- const QString& )
-{
- return TRUE;
-}
-
-/*!
- Does nothing.
-*/
-bool QXmlDefaultHandler::skippedEntity( const QString& )
-{
- return TRUE;
-}
-
-/*!
- Does nothing.
-*/
-bool QXmlDefaultHandler::warning( const QXmlParseException& )
-{
- return TRUE;
-}
-
-/*!
- Does nothing.
-*/
-bool QXmlDefaultHandler::error( const QXmlParseException& )
-{
- return TRUE;
-}
-
-/*!
- Does nothing.
-*/
-bool QXmlDefaultHandler::fatalError( const QXmlParseException& )
-{
- return TRUE;
-}
-
-/*!
- Does nothing.
-*/
-bool QXmlDefaultHandler::notationDecl( const QString&, const QString&,
- const QString& )
-{
- return TRUE;
-}
-
-/*!
- Does nothing.
-*/
-bool QXmlDefaultHandler::unparsedEntityDecl( const QString&, const QString&,
- const QString&, const QString& )
-{
- return TRUE;
-}
-
-/*!
- Always sets \a ret to 0, so that the reader will use the system identifier
- provided in the XML document.
-*/
-bool QXmlDefaultHandler::resolveEntity( const QString&, const QString&,
- QXmlInputSource* ret )
-{
- ret = 0;
- return TRUE;
-}
-
-/*!
- Returns the default error string.
-*/
-QString QXmlDefaultHandler::errorString()
-{
- return QString( XMLERR_ERRORBYCONSUMER );
-}
-
-/*!
- Does nothing.
-*/
-bool QXmlDefaultHandler::startDTD( const QString&, const QString&, const QString& )
-{
- return TRUE;
-}
-
-/*!
- Does nothing.
-*/
-bool QXmlDefaultHandler::endDTD()
-{
- return TRUE;
-}
-
-#if 0
-/*!
- Does nothing.
-*/
-bool QXmlDefaultHandler::startEntity( const QString& )
-{
- return TRUE;
-}
-
-/*!
- Does nothing.
-*/
-bool QXmlDefaultHandler::endEntity( const QString& )
-{
- return TRUE;
-}
-#endif
-
-/*!
- Does nothing.
-*/
-bool QXmlDefaultHandler::startCDATA()
-{
- return TRUE;
-}
-
-/*!
- Does nothing.
-*/
-bool QXmlDefaultHandler::endCDATA()
-{
- return TRUE;
-}
-
-/*!
- Does nothing.
-*/
-bool QXmlDefaultHandler::comment( const QString& )
-{
- return TRUE;
-}
-
-/*!
- Does nothing.
-*/
-bool QXmlDefaultHandler::attributeDecl( const QString&, const QString&, const QString&, const QString&, const QString& )
-{
- return TRUE;
-}
-
-/*!
- Does nothing.
-*/
-bool QXmlDefaultHandler::internalEntityDecl( const QString&, const QString& )
-{
- return TRUE;
-}
-
-/*!
- Does nothing.
-*/
-bool QXmlDefaultHandler::externalEntityDecl( const QString&, const QString&, const QString& )
-{
- return TRUE;
-}
-
-
-/*********************************************
- *
- * QXmlSimpleReaderPrivate
- *
- *********************************************/
-
-class QXmlSimpleReaderPrivate
-{
-private:
- // constructor
- QXmlSimpleReaderPrivate()
- { }
-
-
- // used for entity declarations
- struct ExternParameterEntity
- {
- ExternParameterEntity( ) {}
- ExternParameterEntity( const QString &p, const QString &s )
- : publicId(p), systemId(s) {}
- QString publicId;
- QString systemId;
- };
- struct ExternEntity
- {
- ExternEntity( ) {}
- ExternEntity( const QString &p, const QString &s, const QString &n )
- : publicId(p), systemId(s), notation(n) {}
- QString publicId;
- QString systemId;
- QString notation;
- };
- QMap<QString,ExternParameterEntity> externParameterEntities;
- QMap<QString,QString> parameterEntities;
- QMap<QString,ExternEntity> externEntities;
- QMap<QString,QString> entities;
-
- // used for standalone declaration
- enum Standalone { Yes, No, Unknown };
-
- QString doctype; // only used for the doctype
- QString xmlVersion; // only used to store the version information
- QString encoding; // only used to store the encoding
- Standalone standalone; // used to store the value of the standalone declaration
-
- QString publicId; // used by parseExternalID() to store the public ID
- QString systemId; // used by parseExternalID() to store the system ID
- QString attDeclEName; // use by parseAttlistDecl()
- QString attDeclAName; // use by parseAttlistDecl()
-
- // flags for some features support
- bool useNamespaces;
- bool useNamespacePrefixes;
- bool reportWhitespaceCharData;
-
- // used to build the attribute list
- QXmlAttributes attList;
-
- // helper classes
- QXmlLocator *locator;
- QXmlNamespaceSupport namespaceSupport;
-
- // error string
- QString error;
-
- // friend declarations
- friend class QXmlSimpleReader;
-};
-
-
-/*********************************************
- *
- * QXmlSimpleReader
- *
- *********************************************/
-
-/*!
- \class QXmlReader qxml.h
- \brief The QXmlReader class provides an interface for XML readers (i.e.
- parsers).
-
- \module XML
-
- This abstract class describes an interface for all XML readers in Qt. At the
- moment there is only one implementation of a reader included in the XML
- module of Qt (QXmlSimpleReader). In future releases there might be more
- readers with different properties available (e.g. a validating parser).
-
- The design of the XML classes follow the
- <a href="http://www.megginson.com/SAX/">SAX2 java interface</a>.
- It was adopted to fit into the Qt naming conventions; so it should be very
- easy for anybody who has worked with SAX2 to get started with the Qt XML
- classes.
-
- All readers use the class QXmlInputSource to read the input document from.
- Since you are normally interested in certain contents of the XML document,
- the reader reports those contents through special handler classes
- (QXmlDTDHandler, QXmlDeclHandler, QXmlContentHandler, QXmlEntityResolver,
- QXmlErrorHandler and QXmlLexicalHandler).
-
- You have to subclass these classes. Since the handler classes describe only
- interfaces you must implement all functions; there is a class
- (QXmlDefaultHandler) to make this easier; it implements a default behaviour
- (do nothing) for all functions.
-
- For getting started see also the
- <a href="xml-sax.html#quickStart">Quick start</a>.
-
- \sa QXmlSimpleReader
-*/
-/*!
- \fn bool QXmlReader::feature( const QString& name, bool *ok ) const
-
- If the reader has the feature \a name, this function returns the value of the
- feature.
-
- If the reader has not the feature \a name, the return value may be anything.
-
- If \a ok is not 0, then \a ok is set to TRUE if the reader has the feature
- \a name, otherwise \a ok is set to FALSE.
-
- \sa setFeature() hasFeature()
-*/
-/*!
- \fn void QXmlReader::setFeature( const QString& name, bool value )
-
- Sets the feature \a name to \a value. If the reader has not the feature \a
- name, this value is ignored.
-
- \sa feature() hasFeature()
-*/
-/*!
- \fn bool QXmlReader::hasFeature( const QString& name ) const
-
- Returns \c TRUE if the reader has the feature \a name, otherwise FALSE.
-
- \sa feature() setFeature()
-*/
-/*!
- \fn void* QXmlReader::property( const QString& name, bool *ok ) const
-
- If the reader has the property \a name, this function returns the value of
- the property.
-
- If the reader has not the property \a name, the return value is 0.
-
- If \a ok is not 0, then \a ok is set to TRUE if the reader has the property
- \a name, otherwise \a ok is set to FALSE.
-
- \sa setProperty() hasProperty()
-*/
-/*!
- \fn void QXmlReader::setProperty( const QString& name, void* value )
-
- Sets the property \a name to \a value. If the reader has not the property \a
- name, this value is ignored.
-
- \sa property() hasProperty()
-*/
-/*!
- \fn bool QXmlReader::hasProperty( const QString& name ) const
-
- Returns TRUE if the reader has the property \a name, otherwise FALSE.
-
- \sa property() setProperty()
-*/
-/*!
- \fn void QXmlReader::setEntityResolver( QXmlEntityResolver* handler )
-
- Sets the entity resolver to \a handler.
-
- \sa entityResolver()
-*/
-/*!
- \fn QXmlEntityResolver* QXmlReader::entityResolver() const
-
- Returns the entity resolver or 0 if none was set.
-
- \sa setEntityResolver()
-*/
-/*!
- \fn void QXmlReader::setDTDHandler( QXmlDTDHandler* handler )
-
- Sets the DTD handler to \a handler.
-
- \sa DTDHandler()
-*/
-/*!
- \fn QXmlDTDHandler* QXmlReader::DTDHandler() const
-
- Returns the DTD handler or 0 if none was set.
-
- \sa setDTDHandler()
-*/
-/*!
- \fn void QXmlReader::setContentHandler( QXmlContentHandler* handler )
-
- Sets the content handler to \a handler.
-
- \sa contentHandler()
-*/
-/*!
- \fn QXmlContentHandler* QXmlReader::contentHandler() const
-
- Returns the content handler or 0 if none was set.
-
- \sa setContentHandler()
-*/
-/*!
- \fn void QXmlReader::setErrorHandler( QXmlErrorHandler* handler )
-
- Sets the error handler to \a handler.
-
- \sa errorHandler()
-*/
-/*!
- \fn QXmlErrorHandler* QXmlReader::errorHandler() const
-
- Returns the error handler or 0 if none was set
-
- \sa setErrorHandler()
-*/
-/*!
- \fn void QXmlReader::setLexicalHandler( QXmlLexicalHandler* handler )
-
- Sets the lexical handler to \a handler.
-
- \sa lexicalHandler()
-*/
-/*!
- \fn QXmlLexicalHandler* QXmlReader::lexicalHandler() const
-
- Returns the lexical handler or 0 if none was set.
-
- \sa setLexicalHandler()
-*/
-/*!
- \fn void QXmlReader::setDeclHandler( QXmlDeclHandler* handler )
-
- Sets the declaration handler to \a handler.
-
- \sa declHandler()
-*/
-/*!
- \fn QXmlDeclHandler* QXmlReader::declHandler() const
-
- Returns the declaration handler or 0 if none was set.
-
- \sa setDeclHandler()
-*/
-/*!
- \fn bool QXmlReader::parse( const QXmlInputSource& input )
-
- Parses the XML document \a input. Returns TRUE if the parsing was successful,
- otherwise FALSE.
-*/
-/*!
- \fn bool QXmlReader::parse( const QString& systemId )
-
- Parses the XML document at the location \a systemId. Returns TRUE if the
- parsing was successful, otherwise FALSE.
-*/
-
-
-/*!
- \class QXmlSimpleReader qxml.h
- \brief The QXmlSimpleReader class provides an implementation of a simple XML
- reader (i.e. parser).
-
- \module XML
-
- This XML reader is sufficient for simple parsing tasks. Here is a short list
- of the properties of this reader:
- <ul>
- <li> well-formed parser
- <li> does not parse any external entities
- <li> can do namespace processing
- </ul>
-
- For getting started see also the
- <a href="xml-sax.html#quickStart">Quick start</a>.
-*/
-
-//guaranteed not to be a characater
-const QChar QXmlSimpleReader::QEOF = QChar((ushort)0xffff);
-
-/*!
- Constructs a simple XML reader.
-*/
-QXmlSimpleReader::QXmlSimpleReader()
-{
- d = new QXmlSimpleReaderPrivate();
- d->locator = new QXmlLocator( this );
-
- entityRes = 0;
- dtdHnd = 0;
- contentHnd = 0;
- errorHnd = 0;
- lexicalHnd = 0;
- declHnd = 0;
-
- // default feature settings
- d->useNamespaces = TRUE;
- d->useNamespacePrefixes = FALSE;
- d->reportWhitespaceCharData = TRUE;
-}
-
-/*!
- Destroys a simple XML reader.
-*/
-QXmlSimpleReader::~QXmlSimpleReader()
-{
- delete d->locator;
- delete d;
-}
-
-/*!
- Gets the state of a feature.
-
- \sa setFeature() hasFeature()
-*/
-bool QXmlSimpleReader::feature( const QString& name, bool *ok ) const
-{
- if ( ok != 0 )
- *ok = TRUE;
- if ( name == "http://xml.org/sax/features/namespaces" ) {
- return d->useNamespaces;
- } else if ( name == "http://xml.org/sax/features/namespace-prefixes" ) {
- return d->useNamespacePrefixes;
- } else if ( name == "http://trolltech.com/xml/features/report-whitespace-only-CharData" ) {
- return d->reportWhitespaceCharData;
- } else {
- qWarning( "Unknown feature " + name );
- if ( ok != 0 )
- *ok = FALSE;
- }
- return FALSE;
-}
-
-/*!
- Sets the state of a feature.
-
- Supported features are:
- <ul>
- <li> http://xml.org/sax/features/namespaces:
- if this feature is TRUE, namespace processing is performed
- <li> http://xml.org/sax/features/namespace-prefixes:
- if this feature is TRUE, the the original prefixed names and attributes
- used for namespace declarations are reported
- <li> http://trolltech.com/xml/features/report-whitespace-only-CharData:
- if this feature is TRUE, CharData that consists only of whitespace (and
- no other characters) is not reported via
- QXmlContentHandler::characters()
- </ul>
-
- \sa feature() hasFeature()
-*/
-void QXmlSimpleReader::setFeature( const QString& name, bool value )
-{
- if ( name == "http://xml.org/sax/features/namespaces" ) {
- d->useNamespaces = value;
- } else if ( name == "http://xml.org/sax/features/namespace-prefixes" ) {
- d->useNamespacePrefixes = value;
- } else if ( name == "http://trolltech.com/xml/features/report-whitespace-only-CharData" ) {
- d->reportWhitespaceCharData = value;
- } else {
- qWarning( "Unknown feature " + name );
- }
-}
-
-/*!
- Returns TRUE if the class has a feature named \a feature, otherwise FALSE.
-
- \sa setFeature() feature()
-*/
-bool QXmlSimpleReader::hasFeature( const QString& name ) const
-{
- if ( name == "http://xml.org/sax/features/namespaces" ||
- name == "http://xml.org/sax/features/namespace-prefixes" ||
- name == "http://trolltech.com/xml/features/report-whitespace-only-CharData" ) {
- return TRUE;
- } else {
- return FALSE;
- }
-}
-
-/*!
- Returns 0 since this class does not support any properties.
-*/
-void* QXmlSimpleReader::property( const QString&, bool *ok ) const
-{
- if ( ok != 0 )
- *ok = FALSE;
- return 0;
-}
-
-/*!
- Does nothing since this class does not support any properties.
-*/
-void QXmlSimpleReader::setProperty( const QString&, void* )
-{
-}
-
-/*!
- Returns FALSE since this class does not support any properties.
-*/
-bool QXmlSimpleReader::hasProperty( const QString& ) const
-{
- return FALSE;
-}
-
-/*! \reimp */
-void QXmlSimpleReader::setEntityResolver( QXmlEntityResolver* handler )
-{ entityRes = handler; }
-
-/*! \reimp */
-QXmlEntityResolver* QXmlSimpleReader::entityResolver() const
-{ return entityRes; }
-
-/*! \reimp */
-void QXmlSimpleReader::setDTDHandler( QXmlDTDHandler* handler )
-{ dtdHnd = handler; }
-
-/*! \reimp */
-QXmlDTDHandler* QXmlSimpleReader::DTDHandler() const
-{ return dtdHnd; }
-
-/*! \reimp */
-void QXmlSimpleReader::setContentHandler( QXmlContentHandler* handler )
-{ contentHnd = handler; }
-
-/*! \reimp */
-QXmlContentHandler* QXmlSimpleReader::contentHandler() const
-{ return contentHnd; }
-
-/*! \reimp */
-void QXmlSimpleReader::setErrorHandler( QXmlErrorHandler* handler )
-{ errorHnd = handler; }
-
-/*! \reimp */
-QXmlErrorHandler* QXmlSimpleReader::errorHandler() const
-{ return errorHnd; }
-
-/*! \reimp */
-void QXmlSimpleReader::setLexicalHandler( QXmlLexicalHandler* handler )
-{ lexicalHnd = handler; }
-
-/*! \reimp */
-QXmlLexicalHandler* QXmlSimpleReader::lexicalHandler() const
-{ return lexicalHnd; }
-
-/*! \reimp */
-void QXmlSimpleReader::setDeclHandler( QXmlDeclHandler* handler )
-{ declHnd = handler; }
-
-/*! \reimp */
-QXmlDeclHandler* QXmlSimpleReader::declHandler() const
-{ return declHnd; }
-
-
-
-/*! \reimp */
-bool QXmlSimpleReader::parse( const QXmlInputSource& input )
-{
- init( input );
- // call the handler
- if ( contentHnd ) {
- contentHnd->setDocumentLocator( d->locator );
- if ( !contentHnd->startDocument() ) {
- d->error = contentHnd->errorString();
- goto parseError;
- }
- }
- // parse prolog
- if ( !parseProlog() ) {
- d->error = XMLERR_ERRORPARSINGPROLOG;
- goto parseError;
- }
- // parse element
- if ( !parseElement() ) {
- d->error = XMLERR_ERRORPARSINGMAINELEMENT;
- goto parseError;
- }
- // parse Misc*
- while ( !atEnd() ) {
- if ( !parseMisc() ) {
- d->error = XMLERR_ERRORPARSINGMISC;
- goto parseError;
- }
- }
- // is stack empty?
- if ( !tags.isEmpty() ) {
- d->error = XMLERR_UNEXPECTEDEOF;
- goto parseError;
- }
- // call the handler
- if ( contentHnd ) {
- if ( !contentHnd->endDocument() ) {
- d->error = contentHnd->errorString();
- goto parseError;
- }
- }
-
- return TRUE;
-
- // error handling
-
-parseError:
- reportParseError();
- tags.clear();
- return FALSE;
-}
-
-/*!
- Parses the prolog [22].
-*/
-bool QXmlSimpleReader::parseProlog()
-{
- bool xmldecl_possible = TRUE;
- bool doctype_read = FALSE;
-
- const signed char Init = 0;
- const signed char EatWS = 1; // eat white spaces
- const signed char Lt = 2; // '<' read
- const signed char Em = 3; // '!' read
- const signed char DocType = 4; // read doctype
- const signed char Comment = 5; // read comment
- const signed char PI = 6; // read PI
- const signed char Done = 7;
-
- const signed char InpWs = 0;
- const signed char InpLt = 1; // <
- const signed char InpQm = 2; // ?
- const signed char InpEm = 3; // !
- const signed char InpD = 4; // D
- const signed char InpDash = 5; // -
- const signed char InpUnknown = 6;
-
- // use some kind of state machine for parsing
- static signed char table[7][7] = {
- /* InpWs InpLt InpQm InpEm InpD InpDash InpUnknown */
- { EatWS, Lt, -1, -1, -1, -1, -1 }, // Init
- { -1, Lt, -1, -1, -1, -1, -1 }, // EatWS
- { -1, -1, PI, Em, Done, -1, Done }, // Lt
- { -1, -1, -1, -1, DocType, Comment, -1 }, // Em
- { EatWS, Lt, -1, -1, -1, -1, -1 }, // DocType
- { EatWS, Lt, -1, -1, -1, -1, -1 }, // Comment
- { EatWS, Lt, -1, -1, -1, -1, -1 } // PI
- };
- signed char state = Init;
- signed char input;
- bool parseOk = TRUE;
-
- while ( TRUE ) {
-
- // read input
- if ( atEnd() ) {
- d->error = XMLERR_UNEXPECTEDEOF;
- goto parseError;
- }
- if ( is_S(c) ) {
- input = InpWs;
- } else if ( c == '<' ) {
- input = InpLt;
- } else if ( c == '?' ) {
- input = InpQm;
- } else if ( c == '!' ) {
- input = InpEm;
- } else if ( c == 'D' ) {
- input = InpD;
- } else if ( c == '-' ) {
- input = InpDash;
- } else {
- input = InpUnknown;
- }
- // get new state
- state = table[state][input];
-
- // in some cases do special actions depending on state
- switch ( state ) {
- case EatWS:
- // XML declaration only on first position possible
- xmldecl_possible = FALSE;
- // eat white spaces
- eat_ws();
- break;
- case Lt:
- // next character
- next();
- break;
- case Em:
- // XML declaration only on first position possible
- xmldecl_possible = FALSE;
- // next character
- next();
- break;
- case DocType:
- parseOk = parseDoctype();
- break;
- case Comment:
- parseOk = parseComment();
- break;
- case PI:
- parseOk = parsePI( xmldecl_possible );
- break;
- }
- // no input is read after this
- switch ( state ) {
- case DocType:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGPROLOG;
- goto parseError;
- }
- if ( doctype_read ) {
- d->error = XMLERR_MORETHANONEDOCTYPE;
- goto parseError;
- } else {
- doctype_read = FALSE;
- }
- break;
- case Comment:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGPROLOG;
- goto parseError;
- }
- if ( lexicalHnd ) {
- if ( !lexicalHnd->comment( string() ) ) {
- d->error = lexicalHnd->errorString();
- goto parseError;
- }
- }
- break;
- case PI:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGPROLOG;
- goto parseError;
- }
- // call the handler
- if ( contentHnd ) {
- if ( xmldecl_possible && !d->xmlVersion.isEmpty() ) {
- QString value( "version = '" );
- value += d->xmlVersion;
- value += "'";
- if ( !d->encoding.isEmpty() ) {
- value += " encoding = '";
- value += d->encoding;
- value += "'";
- }
- if ( d->standalone == QXmlSimpleReaderPrivate::Yes ) {
- value += " standalone = 'yes'";
- } else if ( d->standalone == QXmlSimpleReaderPrivate::No ) {
- value += " standalone = 'no'";
- }
- if ( !contentHnd->processingInstruction( "xml", value ) ) {
- d->error = contentHnd->errorString();
- goto parseError;
- }
- } else {
- if ( !contentHnd->processingInstruction( name(), string() ) ) {
- d->error = contentHnd->errorString();
- goto parseError;
- }
- }
- }
- // XML declaration only on first position possible
- xmldecl_possible = FALSE;
- break;
- case Done:
- return TRUE;
- case -1:
- d->error = XMLERR_ERRORPARSINGELEMENT;
- goto parseError;
- }
-
- }
-
- return TRUE;
-
-parseError:
- reportParseError();
- return FALSE;
-}
-
-/*!
- Parse an element [39].
-
- Precondition: the opening '<' is already read.
-*/
-bool QXmlSimpleReader::parseElement()
-{
- static QString uri, lname, prefix;
- static bool t;
-
- const signed char Init = 0;
- const signed char ReadName = 1;
- const signed char Ws1 = 2;
- const signed char STagEnd = 3;
- const signed char STagEnd2 = 4;
- const signed char ETagBegin = 5;
- const signed char ETagBegin2 = 6;
- const signed char Ws2 = 7;
- const signed char EmptyTag = 8;
- const signed char Attribute = 9;
- const signed char Ws3 = 10;
- const signed char Done = 11;
-
- const signed char InpWs = 0; // whitespace
- const signed char InpNameBe = 1; // is_NameBeginning()
- const signed char InpGt = 2; // >
- const signed char InpSlash = 3; // /
- const signed char InpUnknown = 4;
-
- // use some kind of state machine for parsing
- static signed char table[11][5] = {
- /* InpWs InpNameBe InpGt InpSlash InpUnknown */
- { -1, ReadName, -1, -1, -1 }, // Init
- { Ws1, Attribute, STagEnd, EmptyTag, -1 }, // ReadName
- { -1, Attribute, STagEnd, EmptyTag, -1 }, // Ws1
- { STagEnd2, STagEnd2, STagEnd2, STagEnd2, STagEnd2 }, // STagEnd
- { -1, -1, -1, ETagBegin, -1 }, // STagEnd2
- { -1, ETagBegin2, -1, -1, -1 }, // ETagBegin
- { Ws2, -1, Done, -1, -1 }, // ETagBegin2
- { -1, -1, Done, -1, -1 }, // Ws2
- { -1, -1, Done, -1, -1 }, // EmptyTag
- { Ws3, Attribute, STagEnd, EmptyTag, -1 }, // Attribute
- { -1, Attribute, STagEnd, EmptyTag, -1 } // Ws3
- };
- signed char state = Init;
- signed char input;
- bool parseOk = TRUE;
-
- while ( TRUE ) {
-
- // read input
- if ( atEnd() ) {
- d->error = XMLERR_UNEXPECTEDEOF;
- goto parseError;
- }
- if ( is_S(c) ) {
- input = InpWs;
- } else if ( is_NameBeginning(c) ) {
- input = InpNameBe;
- } else if ( c == '>' ) {
- input = InpGt;
- } else if ( c == '/' ) {
- input = InpSlash;
- } else {
- input = InpUnknown;
- }
- // get new state
-//qDebug( "%d -%d(%c)-> %d", state, input, c.latin1(), table[state][input] );
- state = table[state][input];
-
- // in some cases do special actions depending on state
- switch ( state ) {
- case ReadName:
- parseOk = parseName();
- break;
- case Ws1:
- case Ws2:
- case Ws3:
- eat_ws();
- break;
- case STagEnd:
- // call the handler
- if ( contentHnd ) {
- if ( d->useNamespaces ) {
- d->namespaceSupport.processName( tags.top(), FALSE, uri, lname );
- t = contentHnd->startElement( uri, lname, tags.top(), d->attList );
- } else {
- t = contentHnd->startElement( "", "", tags.top(), d->attList );
- }
- if ( !t ) {
- d->error = contentHnd->errorString();
- goto parseError;
- }
- }
- next();
- break;
- case STagEnd2:
- parseOk = parseContent();
- break;
- case ETagBegin:
- next();
- break;
- case ETagBegin2:
- // get the name of the tag
- parseOk = parseName();
- break;
- case EmptyTag:
- if ( tags.isEmpty() ) {
- d->error = XMLERR_TAGMISMATCH;
- goto parseError;
- }
- if ( !parseElementEmptyTag( t, uri, lname ) )
- goto parseError;
- // next character
- next();
- break;
- case Attribute:
- // get name and value of attribute
- parseOk = parseAttribute();
- break;
- case Done:
- next();
- break;
- }
- // no input is read after this
- switch ( state ) {
- case ReadName:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGNAME;
- goto parseError;
- }
- // store it on the stack
- tags.push( name() );
- // empty the attributes
- d->attList.qnameList.clear();
- d->attList.uriList.clear();
- d->attList.localnameList.clear();
- d->attList.valueList.clear();
- // namespace support?
- if ( d->useNamespaces ) {
- d->namespaceSupport.pushContext();
- }
- break;
- case STagEnd2:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGCONTENT;
- goto parseError;
- }
- break;
- case ETagBegin2:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGNAME;
- goto parseError;
- }
- if ( !parseElementETagBegin2() )
- goto parseError;
- break;
- case Attribute:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGATTRIBUTE;
- goto parseError;
- }
- if ( !parseElementAttribute( prefix, uri, lname ) )
- goto parseError;
- break;
- case Done:
- return TRUE;
- case -1:
- d->error = XMLERR_ERRORPARSINGELEMENT;
- goto parseError;
- }
-
- }
-
- return TRUE;
-
-parseError:
- reportParseError();
- return FALSE;
-}
-/*!
- Helper to break down the size of the code in the case statement.
- Return FALSE on error, otherwise TRUE.
-*/
-bool QXmlSimpleReader::parseElementEmptyTag( bool &t, QString &uri, QString &lname )
-{
- // pop the stack and call the handler
- if ( contentHnd ) {
- // report startElement first...
- if ( d->useNamespaces ) {
- d->namespaceSupport.processName( tags.top(), FALSE, uri, lname );
- t = contentHnd->startElement( uri, lname, tags.top(), d->attList );
- } else {
- t = contentHnd->startElement( "", "", tags.top(), d->attList );
- }
- if ( !t ) {
- d->error = contentHnd->errorString();
- return FALSE;
- }
- // ... followed by endElement
- // ### missing namespace support!
- if ( !contentHnd->endElement( "","",tags.pop() ) ) {
- d->error = contentHnd->errorString();
- return FALSE;
- }
- // namespace support?
- if ( d->useNamespaces ) {
- QStringList prefixesBefore, prefixesAfter;
- if ( contentHnd ) {
- prefixesBefore = d->namespaceSupport.prefixes();
- }
- d->namespaceSupport.popContext();
- // call the handler for prefix mapping
- if ( contentHnd ) {
- prefixesAfter = d->namespaceSupport.prefixes();
- for ( QStringList::Iterator it = prefixesBefore.begin(); it != prefixesBefore.end(); ++it ) {
- if ( prefixesAfter.contains(*it) == 0 ) {
- if ( !contentHnd->endPrefixMapping( *it ) ) {
- d->error = contentHnd->errorString();
- return FALSE;
- }
- }
- }
- }
- }
- } else {
- tags.pop();
- }
- return TRUE;
-}
-/*!
- Helper to break down the size of the code in the case statement.
- Return FALSE on error, otherwise TRUE.
-*/
-bool QXmlSimpleReader::parseElementETagBegin2()
-{
-
- // pop the stack and compare it with the name
- if ( tags.pop() != name() ) {
- d->error = XMLERR_TAGMISMATCH;
- return FALSE;
- }
- // call the handler
- // ### missing namespace support!
- if ( contentHnd ) {
- if ( !contentHnd->endElement("","",name()) ) {
- d->error = contentHnd->errorString();
- return FALSE;
- }
- }
- // namespace support?
- if ( d->useNamespaces ) {
- QStringList prefixesBefore, prefixesAfter;
- if ( contentHnd ) {
- prefixesBefore = d->namespaceSupport.prefixes();
- }
- d->namespaceSupport.popContext();
- // call the handler for prefix mapping
- if ( contentHnd ) {
- prefixesAfter = d->namespaceSupport.prefixes();
- for ( QStringList::Iterator it = prefixesBefore.begin(); it != prefixesBefore.end(); ++it ) {
- if ( prefixesAfter.contains(*it) == 0 ) {
- if ( !contentHnd->endPrefixMapping( *it ) ) {
- d->error = contentHnd->errorString();
- return FALSE;
- }
- }
- }
- }
- }
- return TRUE;
-}
-/*!
- Helper to break down the size of the code in the case statement.
- Return FALSE on error, otherwise TRUE.
-*/
-bool QXmlSimpleReader::parseElementAttribute( QString &prefix, QString &uri, QString &lname )
-{
- // add the attribute to the list
- if ( d->useNamespaces ) {
- // is it a namespace declaration?
- d->namespaceSupport.splitName( name(), prefix, lname );
- if ( prefix == "xmlns" ) {
- // namespace declaration
- d->namespaceSupport.setPrefix( lname, string() );
- if ( d->useNamespacePrefixes ) {
- d->attList.qnameList.append( name() );
- d->attList.uriList.append( "" );
- d->attList.localnameList.append( "" );
- d->attList.valueList.append( string() );
- }
- // call the handler for prefix mapping
- if ( contentHnd ) {
- if ( !contentHnd->startPrefixMapping( lname, string() ) ) {
- d->error = contentHnd->errorString();
- return FALSE;
- }
- }
- } else {
- // no namespace delcaration
- d->namespaceSupport.processName( name(), TRUE, uri, lname );
- d->attList.qnameList.append( name() );
- d->attList.uriList.append( uri );
- d->attList.localnameList.append( lname );
- d->attList.valueList.append( string() );
- }
- } else {
- // no namespace support
- d->attList.qnameList.append( name() );
- d->attList.uriList.append( "" );
- d->attList.localnameList.append( "" );
- d->attList.valueList.append( string() );
- }
- return TRUE;
-}
-
-/*!
- Parse a content [43].
-
- A content is only used between tags. If a end tag is found the < is already
- read and the head stand on the '/' of the end tag '</name>'.
-*/
-bool QXmlSimpleReader::parseContent()
-{
- bool charDataRead = FALSE;
-
- const signed char Init = 0;
- const signed char ChD = 1; // CharData
- const signed char ChD1 = 2; // CharData help state
- const signed char ChD2 = 3; // CharData help state
- const signed char Ref = 4; // Reference
- const signed char Lt = 5; // '<' read
- const signed char PI = 6; // PI
- const signed char Elem = 7; // Element
- const signed char Em = 8; // '!' read
- const signed char Com = 9; // Comment
- const signed char CDS = 10; // CDSect
- const signed char CDS1 = 11; // read a CDSect
- const signed char CDS2 = 12; // read a CDSect (help state)
- const signed char CDS3 = 13; // read a CDSect (help state)
- const signed char Done = 14; // finished reading content
-
- const signed char InpLt = 0; // <
- const signed char InpGt = 1; // >
- const signed char InpSlash = 2; // /
- const signed char InpQMark = 3; // ?
- const signed char InpEMark = 4; // !
- const signed char InpAmp = 5; // &
- const signed char InpDash = 6; // -
- const signed char InpOpenB = 7; // [
- const signed char InpCloseB = 8; // ]
- const signed char InpUnknown = 9;
-
- static signed char mapCLT2FSMChar[] = {
- InpUnknown, // white space
- InpUnknown, // %
- InpAmp, // &
- InpGt, // >
- InpLt, // <
- InpSlash, // /
- InpQMark, // ?
- InpEMark, // !
- InpDash, // -
- InpCloseB, // ]
- InpOpenB, // [
- InpUnknown, // =
- InpUnknown, // "
- InpUnknown, // '
- InpUnknown // unknown
- };
-
- // use some kind of state machine for parsing
- static signed char const table[14][10] = {
- /* InpLt InpGt InpSlash InpQMark InpEMark InpAmp InpDash InpOpenB InpCloseB InpUnknown */
- { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD1, ChD }, // Init
- { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD1, ChD }, // ChD
- { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD2, ChD }, // ChD1
- { Lt, -1, ChD, ChD, ChD, Ref, ChD, ChD, ChD2, ChD }, // ChD2
- { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD, ChD }, // Ref (same as Init)
- { -1, -1, Done, PI, Em, -1, -1, -1, -1, Elem }, // Lt
- { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD, ChD }, // PI (same as Init)
- { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD, ChD }, // Elem (same as Init)
- { -1, -1, -1, -1, -1, -1, Com, CDS, -1, -1 }, // Em
- { Lt, ChD, ChD, ChD, ChD, Ref, ChD, ChD, ChD, ChD }, // Com (same as Init)
- { CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS2, CDS1 }, // CDS
- { CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS2, CDS1 }, // CDS1
- { CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS3, CDS1 }, // CDS2
- { CDS1, Init, CDS1, CDS1, CDS1, CDS1, CDS1, CDS1, CDS3, CDS1 } // CDS3
- };
- signed char state = Init;
- signed char input;
- bool parseOk = TRUE;
-
- while ( TRUE ) {
-
- // get input (use lookup-table instead of nested ifs for performance
- // reasons)
- if ( atEnd() ) {
- d->error = XMLERR_UNEXPECTEDEOF;
- goto parseError;
- }
- if ( c.row() ) {
- input = InpUnknown;
- } else {
- input = mapCLT2FSMChar[ charLookupTable[ c.cell() ] ];
- }
-
- // set state according to input
- state = table[state][input];
-
- // do some actions according to state
- switch ( state ) {
- case Init:
- // next character
- next();
- break;
- case ChD:
- // on first call: clear string
- if ( !charDataRead ) {
- charDataRead = TRUE;
- stringClear();
- }
- stringAddC();
- next();
- break;
- case ChD1:
- // on first call: clear string
- if ( !charDataRead ) {
- charDataRead = TRUE;
- stringClear();
- }
- stringAddC();
- next();
- break;
- case ChD2:
- stringAddC();
- next();
- break;
- case Ref:
- if ( !charDataRead) {
- // reference may be CharData; so clear string to be safe
- stringClear();
- parseOk = parseReference( charDataRead, InContent );
- } else {
- bool tmp;
- parseOk = parseReference( tmp, InContent );
- }
- break;
- case Lt:
- // call the handler for CharData
- if ( contentHnd ) {
- if ( charDataRead ) {
- if ( d->reportWhitespaceCharData || !string().simplifyWhiteSpace().isEmpty() ) {
- if ( !contentHnd->characters( string() ) ) {
- d->error = contentHnd->errorString();
- goto parseError;
- }
- }
- }
- }
- charDataRead = FALSE;
- // next character
- next();
- break;
- case PI:
- parseOk = parsePI();
- break;
- case Elem:
- parseOk = parseElement();
- break;
- case Em:
- // next character
- next();
- break;
- case Com:
- parseOk = parseComment();
- break;
- case CDS:
- parseOk = parseString( "[CDATA[" );
- break;
- case CDS1:
- // read one character and add it
- stringAddC();
- next();
- break;
- case CDS2:
- // skip ']'
- next();
- break;
- case CDS3:
- // skip ']'...
- next();
- break;
- }
- // no input is read after this
- switch ( state ) {
- case Ref:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGREFERENCE;
- goto parseError;
- }
- break;
- case PI:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGPI;
- goto parseError;
- }
- // call the handler
- if ( contentHnd ) {
- if ( !contentHnd->processingInstruction(name(),string()) ) {
- d->error = contentHnd->errorString();
- goto parseError;
- }
- }
- break;
- case Elem:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGELEMENT;
- goto parseError;
- }
- break;
- case Com:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGCOMMENT;
- goto parseError;
- }
- if ( lexicalHnd ) {
- if ( !lexicalHnd->comment( string() ) ) {
- d->error = lexicalHnd->errorString();
- goto parseError;
- }
- }
- break;
- case CDS:
- if( !parseOk ) {
- d->error = XMLERR_CDSECTHEADEREXPECTED;
- goto parseError;
- }
- // empty string
- stringClear();
- break;
- case CDS2:
- if (c != ']') {
- stringAddC( ']' );
- }
- break;
- case CDS3:
- // test if this skipping was legal
- if ( c == '>' ) {
- // the end of the CDSect
- if ( lexicalHnd ) {
- if ( !lexicalHnd->startCDATA() ) {
- d->error = lexicalHnd->errorString();
- goto parseError;
- }
- }
- if ( contentHnd ) {
- if ( !contentHnd->characters( string() ) ) {
- d->error = contentHnd->errorString();
- goto parseError;
- }
- }
- if ( lexicalHnd ) {
- if ( !lexicalHnd->endCDATA() ) {
- d->error = lexicalHnd->errorString();
- goto parseError;
- }
- }
- } else if (c == ']') {
- // three or more ']'
- stringAddC( ']' );
- } else {
- // after ']]' comes another character
- stringAddC( ']' );
- stringAddC( ']' );
- }
- break;
- case Done:
- // call the handler for CharData
- if ( contentHnd ) {
- if ( charDataRead ) {
- if ( d->reportWhitespaceCharData || !string().simplifyWhiteSpace().isEmpty() ) {
- if ( !contentHnd->characters( string() ) ) {
- d->error = contentHnd->errorString();
- goto parseError;
- }
- }
- }
- }
- // Done
- return TRUE;
- case -1:
- // Error
- d->error = XMLERR_ERRORPARSINGCONTENT;
- goto parseError;
- }
-
- }
-
- return TRUE;
-
-parseError:
- reportParseError();
- return FALSE;
-}
-
-/*!
- Parse Misc [27].
-*/
-bool QXmlSimpleReader::parseMisc()
-{
- const signed char Init = 0;
- const signed char Lt = 1; // '<' was read
- const signed char Comment = 2; // read comment
- const signed char eatWS = 3; // eat whitespaces
- const signed char PI = 4; // read PI
- const signed char Comment2 = 5; // read comment
-
- const signed char InpWs = 0; // S
- const signed char InpLt = 1; // <
- const signed char InpQm = 2; // ?
- const signed char InpEm = 3; // !
- const signed char InpUnknown = 4;
-
- // use some kind of state machine for parsing
- static signed char table[3][5] = {
- /* InpWs InpLt InpQm InpEm InpUnknown */
- { eatWS, Lt, -1, -1, -1 }, // Init
- { -1, -1, PI, Comment, -1 }, // Lt
- { -1, -1, -1, -1, Comment2 } // Comment
- };
- signed char state = Init;
- signed char input;
- bool parseOk = TRUE;
-
- while ( TRUE ) {
-
- // get input
- if ( atEnd() ) {
- d->error = XMLERR_UNEXPECTEDEOF;
- goto parseError;
- }
- if ( is_S(c) ) {
- input = InpWs;
- } else if ( c == '<' ) {
- input = InpLt;
- } else if ( c == '?' ) {
- input = InpQm;
- } else if ( c == '!' ) {
- input = InpEm;
- } else {
- input = InpUnknown;
- }
-
- // set state according to input
- state = table[state][input];
-
- // do some actions according to state
- switch ( state ) {
- case eatWS:
- eat_ws();
- break;
- case Lt:
- next();
- break;
- case PI:
- parseOk = parsePI();
- break;
- case Comment:
- next();
- break;
- case Comment2:
- parseOk = parseComment();
- break;
- }
- // no input is read after this
- switch ( state ) {
- case eatWS:
- return TRUE;
- case PI:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGPI;
- goto parseError;
- }
- if ( contentHnd ) {
- if ( !contentHnd->processingInstruction(name(),string()) ) {
- d->error = contentHnd->errorString();
- goto parseError;
- }
- }
- return TRUE;
- case Comment2:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGCOMMENT;
- goto parseError;
- }
- if ( lexicalHnd ) {
- if ( !lexicalHnd->comment( string() ) ) {
- d->error = lexicalHnd->errorString();
- goto parseError;
- }
- }
- return TRUE;
- case -1:
- // Error
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
-
- }
-
- return TRUE;
-
-parseError:
- reportParseError();
- return FALSE;
-}
-
-/*!
- Parse a processing instruction [16].
-
- If xmldec is TRUE, it tries to parse a PI or a XML declaration [23].
-
- Precondition: the beginning '<' of the PI is already read and the head stand
- on the '?' of '<?'.
-
- If this funktion was successful, the head-position is on the first
- character after the PI.
-*/
-bool QXmlSimpleReader::parsePI( bool xmldecl )
-{
- const signed char Init = 0;
- const signed char QmI = 1; // ? was read
- const signed char Name = 2; // read Name
- const signed char XMLDecl = 3; // read XMLDecl
- const signed char Ws1 = 4; // eat ws after "xml" of XMLDecl
- const signed char PI = 5; // read PI
- const signed char Ws2 = 6; // eat ws after Name of PI
- const signed char Version = 7; // read versionInfo
- const signed char Ws3 = 8; // eat ws after versionInfo
- const signed char EorSD = 9; // read EDecl or SDDecl
- const signed char Ws4 = 10; // eat ws after EDecl or SDDecl
- const signed char SD = 11; // read SDDecl
- const signed char Ws5 = 12; // eat ws after SDDecl
- const signed char ADone = 13; // almost done
- const signed char Char = 14; // Char was read
- const signed char Qm = 15; // Qm was read
- const signed char Done = 16; // finished reading content
-
- const signed char InpWs = 0; // whitespace
- const signed char InpNameBe = 1; // is_nameBeginning()
- const signed char InpGt = 2; // >
- const signed char InpQm = 3; // ?
- const signed char InpUnknown = 4;
-
- // use some kind of state machine for parsing
- static signed char table[16][5] = {
- /* InpWs, InpNameBe InpGt InpQm InpUnknown */
- { -1, -1, -1, QmI, -1 }, // Init
- { -1, Name, -1, -1, -1 }, // QmI
- { -1, -1, -1, -1, -1 }, // Name (this state is left not through input)
- { Ws1, -1, -1, -1, -1 }, // XMLDecl
- { -1, Version, -1, -1, -1 }, // Ws1
- { Ws2, -1, -1, Qm, -1 }, // PI
- { Char, Char, Char, Qm, Char }, // Ws2
- { Ws3, -1, -1, ADone, -1 }, // Version
- { -1, EorSD, -1, ADone, -1 }, // Ws3
- { Ws4, -1, -1, ADone, -1 }, // EorSD
- { -1, SD, -1, ADone, -1 }, // Ws4
- { Ws5, -1, -1, ADone, -1 }, // SD
- { -1, -1, -1, ADone, -1 }, // Ws5
- { -1, -1, Done, -1, -1 }, // ADone
- { Char, Char, Char, Qm, Char }, // Char
- { Char, Char, Done, Qm, Char }, // Qm
- };
- signed char state = Init;
- signed char input;
- bool parseOk = TRUE;
-
- while ( TRUE ) {
-
- // get input
- if ( atEnd() ) {
- d->error = XMLERR_UNEXPECTEDEOF;
- goto parseError;
- }
- if ( is_S(c) ) {
- input = InpWs;
- } else if ( is_NameBeginning(c) ) {
- input = InpNameBe;
- } else if ( c == '>' ) {
- input = InpGt;
- } else if ( c == '?' ) {
- input = InpQm;
- } else {
- input = InpUnknown;
- }
-
- // set state according to input
- state = table[state][input];
-
- // do some actions according to state
- switch ( state ) {
- case QmI:
- next();
- break;
- case Name:
- parseOk = parseName();
- break;
- case Ws1:
- case Ws2:
- case Ws3:
- case Ws4:
- case Ws5:
- eat_ws();
- break;
- case Version:
- parseOk = parseAttribute();
- break;
- case EorSD:
- parseOk = parseAttribute();
- break;
- case SD:
- // get the SDDecl (syntax like an attribute)
- if ( d->standalone != QXmlSimpleReaderPrivate::Unknown ) {
- // already parsed the standalone declaration
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
- parseOk = parseAttribute();
- break;
- case ADone:
- next();
- break;
- case Char:
- stringAddC();
- next();
- break;
- case Qm:
- // skip the '?'
- next();
- break;
- case Done:
- next();
- break;
- }
- // no input is read after this
- switch ( state ) {
- case Name:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGNAME;
- goto parseError;
- }
- // test what name was read and determine the next state
- // (not very beautiful, I admit)
- if ( name().lower() == "xml" ) {
- if ( xmldecl && name()=="xml" ) {
- state = XMLDecl;
- } else {
- d->error = XMLERR_INVALIDNAMEFORPI;
- goto parseError;
- }
- } else {
- state = PI;
- stringClear();
- }
- break;
- case Version:
- // get version (syntax like an attribute)
- if ( !parseOk ) {
- d->error = XMLERR_VERSIONEXPECTED;
- goto parseError;
- }
- if ( name() != "version" ) {
- d->error = XMLERR_VERSIONEXPECTED;
- goto parseError;
- }
- d->xmlVersion = string();
- break;
- case EorSD:
- // get the EDecl or SDDecl (syntax like an attribute)
- if ( !parseOk ) {
- d->error = XMLERR_EDECLORSDDECLEXPECTED;
- goto parseError;
- }
- if ( name() == "standalone" ) {
- if ( string()=="yes" ) {
- d->standalone = QXmlSimpleReaderPrivate::Yes;
- } else if ( string()=="no" ) {
- d->standalone = QXmlSimpleReaderPrivate::No;
- } else {
- d->error = XMLERR_WRONGVALUEFORSDECL;
- goto parseError;
- }
- } else if ( name() == "encoding" ) {
- d->encoding = string();
- } else {
- d->error = XMLERR_EDECLORSDDECLEXPECTED;
- goto parseError;
- }
- break;
- case SD:
- if ( !parseOk ) {
- d->error = XMLERR_SDDECLEXPECTED;
- goto parseError;
- }
- if ( name() != "standalone" ) {
- d->error = XMLERR_SDDECLEXPECTED;
- goto parseError;
- }
- if ( string()=="yes" ) {
- d->standalone = QXmlSimpleReaderPrivate::Yes;
- } else if ( string()=="no" ) {
- d->standalone = QXmlSimpleReaderPrivate::No;
- } else {
- d->error = XMLERR_WRONGVALUEFORSDECL;
- goto parseError;
- }
- break;
- case Qm:
- // test if the skipping was legal
- if ( c != '>' ) {
- stringAddC( '?' );
- }
- break;
- case Done:
- return TRUE;
- case -1:
- // Error
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
-
- }
-
- return TRUE;
-
-parseError:
- reportParseError();
- return FALSE;
-}
-
-/*!
- Parse a document type definition (doctypedecl [28]).
-
- Precondition: the beginning '<!' of the doctype is already read the head
- stands on the 'D' of '<!DOCTYPE'.
-
- If this funktion was successful, the head-position is on the first
- character after the document type definition.
-*/
-bool QXmlSimpleReader::parseDoctype()
-{
- // some init-stuff
- d->systemId = QString::null;
- d->publicId = QString::null;
-
- const signed char Init = 0;
- const signed char Doctype = 1; // read the doctype
- const signed char Ws1 = 2; // eat_ws
- const signed char Doctype2 = 3; // read the doctype, part 2
- const signed char Ws2 = 4; // eat_ws
- const signed char Sys = 5; // read SYSTEM
- const signed char Ws3 = 6; // eat_ws
- const signed char MP = 7; // markupdecl or PEReference
- const signed char PER = 8; // PERReference
- const signed char Mup = 9; // markupdecl
- const signed char Ws4 = 10; // eat_ws
- const signed char MPE = 11; // end of markupdecl or PEReference
- const signed char Done = 12;
-
- const signed char InpWs = 0;
- const signed char InpD = 1; // 'D'
- const signed char InpS = 2; // 'S' or 'P'
- const signed char InpOB = 3; // [
- const signed char InpCB = 4; // ]
- const signed char InpPer = 5; // %
- const signed char InpGt = 6; // >
- const signed char InpUnknown = 7;
-
- // use some kind of state machine for parsing
- static signed char table[12][8] = {
- /* InpWs, InpD InpS InpOB InpCB InpPer InpGt InpUnknown */
- { -1, Doctype, -1, -1, -1, -1, -1, -1 }, // Init
- { Ws1, Doctype2, Doctype2, -1, -1, -1, -1, Doctype2 }, // Doctype
- { -1, Doctype2, Doctype2, -1, -1, -1, -1, Doctype2 }, // Ws1
- { Ws2, -1, Sys, MP, -1, -1, Done, -1 }, // Doctype2
- { -1, -1, Sys, MP, -1, -1, Done, -1 }, // Ws2
- { Ws3, -1, -1, MP, -1, -1, Done, -1 }, // Sys
- { -1, -1, -1, MP, -1, -1, Done, -1 }, // Ws3
- { -1, -1, -1, -1, MPE, PER, -1, Mup }, // MP
- { Ws4, -1, -1, -1, MPE, PER, -1, Mup }, // PER
- { Ws4, -1, -1, -1, MPE, PER, -1, Mup }, // Mup
- { -1, -1, -1, -1, MPE, PER, -1, Mup }, // Ws4
- { -1, -1, -1, -1, -1, -1, Done, -1 } // MPE
- };
- signed char state = Init;
- signed char input;
- bool parseOk = TRUE;
-
- while ( TRUE ) {
-
- // get input
- if ( atEnd() ) {
- d->error = XMLERR_UNEXPECTEDEOF;
- goto parseError;
- }
- if ( is_S(c) ) {
- input = InpWs;
- } else if ( c == 'D' ) {
- input = InpD;
- } else if ( c == 'S' ) {
- input = InpS;
- } else if ( c == 'P' ) {
- input = InpS;
- } else if ( c == '[' ) {
- input = InpOB;
- } else if ( c == ']' ) {
- input = InpCB;
- } else if ( c == '%' ) {
- input = InpPer;
- } else if ( c == '>' ) {
- input = InpGt;
- } else {
- input = InpUnknown;
- }
-
- // set state according to input
- state = table[state][input];
-
- // do some actions according to state
- switch ( state ) {
- case Doctype:
- parseOk = parseString( "DOCTYPE" );
- break;
- case Ws1:
- case Ws2:
- case Ws3:
- case Ws4:
- eat_ws();
- break;
- case Doctype2:
- parseName();
- break;
- case Sys:
- parseOk = parseExternalID();
- break;
- case MP:
- next_eat_ws();
- break;
- case PER:
- parseOk = parsePEReference( InDTD );
- break;
- case Mup:
- parseOk = parseMarkupdecl();
- break;
- case MPE:
- next_eat_ws();
- break;
- case Done:
- if ( lexicalHnd ) {
- if ( !lexicalHnd->endDTD() ) {
- d->error = lexicalHnd->errorString();
- goto parseError;
- }
- }
- next();
- break;
- }
- // no input is read after this
- switch ( state ) {
- case Doctype:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGDOCTYPE;
- goto parseError;
- }
- if ( !is_S(c) ) {
- d->error = XMLERR_ERRORPARSINGDOCTYPE;
- goto parseError;
- }
- break;
- case Doctype2:
- d->doctype = name();
- if ( lexicalHnd ) {
- if ( !lexicalHnd->startDTD( d->doctype, d->publicId, d->systemId ) ) {
- d->error = lexicalHnd->errorString();
- goto parseError;
- }
- }
- break;
- case Sys:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGDOCTYPE;
- goto parseError;
- }
- break;
- case PER:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGDOCTYPE;
- goto parseError;
- }
- break;
- case Mup:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGDOCTYPE;
- goto parseError;
- }
- break;
- case Done:
- return TRUE;
- case -1:
- // Error
- d->error = XMLERR_ERRORPARSINGDOCTYPE;
- goto parseError;
- }
-
- }
-
- return TRUE;
-
-parseError:
- reportParseError();
- return FALSE;
-}
-
-/*!
- Parse a ExternalID [75].
-
- If allowPublicID is TRUE parse ExternalID [75] or PublicID [83].
-*/
-bool QXmlSimpleReader::parseExternalID( bool allowPublicID )
-{
- // some init-stuff
- d->systemId = QString::null;
- d->publicId = QString::null;
-
- const signed char Init = 0;
- const signed char Sys = 1; // parse 'SYSTEM'
- const signed char SysWS = 2; // parse the whitespace after 'SYSTEM'
- const signed char SysSQ = 3; // parse SystemLiteral with '
- const signed char SysSQ2 = 4; // parse SystemLiteral with '
- const signed char SysDQ = 5; // parse SystemLiteral with "
- const signed char SysDQ2 = 6; // parse SystemLiteral with "
- const signed char Pub = 7; // parse 'PUBLIC'
- const signed char PubWS = 8; // parse the whitespace after 'PUBLIC'
- const signed char PubSQ = 9; // parse PubidLiteral with '
- const signed char PubSQ2 = 10; // parse PubidLiteral with '
- const signed char PubDQ = 11; // parse PubidLiteral with "
- const signed char PubDQ2 = 12; // parse PubidLiteral with "
- const signed char PubE = 13; // finished parsing the PubidLiteral
- const signed char PubWS2 = 14; // parse the whitespace after the PubidLiteral
- const signed char PDone = 15; // done if allowPublicID is TRUE
- const signed char Done = 16;
-
- const signed char InpSQ = 0; // '
- const signed char InpDQ = 1; // "
- const signed char InpS = 2; // S
- const signed char InpP = 3; // P
- const signed char InpWs = 4; // white space
- const signed char InpUnknown = 5;
-
- // use some kind of state machine for parsing
- static signed char table[15][6] = {
- /* InpSQ InpDQ InpS InpP InpWs InpUnknown */
- { -1, -1, Sys, Pub, -1, -1 }, // Init
- { -1, -1, -1, -1, SysWS, -1 }, // Sys
- { SysSQ, SysDQ, -1, -1, -1, -1 }, // SysWS
- { Done, SysSQ2, SysSQ2, SysSQ2, SysSQ2, SysSQ2 }, // SysSQ
- { Done, SysSQ2, SysSQ2, SysSQ2, SysSQ2, SysSQ2 }, // SysSQ2
- { SysDQ2, Done, SysDQ2, SysDQ2, SysDQ2, SysDQ2 }, // SysDQ
- { SysDQ2, Done, SysDQ2, SysDQ2, SysDQ2, SysDQ2 }, // SysDQ2
- { -1, -1, -1, -1, PubWS, -1 }, // Pub
- { PubSQ, PubDQ, -1, -1, -1, -1 }, // PubWS
- { PubE, -1, PubSQ2, PubSQ2, PubSQ2, PubSQ2 }, // PubSQ
- { PubE, -1, PubSQ2, PubSQ2, PubSQ2, PubSQ2 }, // PubSQ2
- { -1, PubE, PubDQ2, PubDQ2, PubDQ2, PubDQ2 }, // PubDQ
- { -1, PubE, PubDQ2, PubDQ2, PubDQ2, PubDQ2 }, // PubDQ2
- { PDone, PDone, PDone, PDone, PubWS2, PDone }, // PubE
- { SysSQ, SysDQ, PDone, PDone, PDone, PDone } // PubWS2
- };
- signed char state = Init;
- signed char input;
- bool parseOk = TRUE;
-
- while ( TRUE ) {
-
- // get input
- if ( atEnd() ) {
- d->error = XMLERR_UNEXPECTEDEOF;
- goto parseError;
- }
- if ( is_S(c) ) {
- input = InpWs;
- } else if ( c == '\'' ) {
- input = InpSQ;
- } else if ( c == '"' ) {
- input = InpDQ;
- } else if ( c == 'S' ) {
- input = InpS;
- } else if ( c == 'P' ) {
- input = InpP;
- } else {
- input = InpUnknown;
- }
-
- // set state according to input
- state = table[state][input];
-
- // do some actions according to state
- switch ( state ) {
- case Sys:
- parseOk = parseString( "SYSTEM" );
- break;
- case SysWS:
- eat_ws();
- break;
- case SysSQ:
- case SysDQ:
- stringClear();
- next();
- break;
- case SysSQ2:
- case SysDQ2:
- stringAddC();
- next();
- break;
- case Pub:
- parseOk = parseString( "PUBLIC" );
- break;
- case PubWS:
- eat_ws();
- break;
- case PubSQ:
- case PubDQ:
- stringClear();
- next();
- break;
- case PubSQ2:
- case PubDQ2:
- stringAddC();
- next();
- break;
- case PubE:
- next();
- break;
- case PubWS2:
- d->publicId = string();
- eat_ws();
- break;
- case Done:
- d->systemId = string();
- next();
- break;
- }
- // no input is read after this
- switch ( state ) {
- case Sys:
- if( !parseOk ) {
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
- break;
- case Pub:
- if( !parseOk ) {
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
- break;
- case PDone:
- if ( allowPublicID ) {
- d->publicId = string();
- return TRUE;
- } else {
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
- break;
- case Done:
- return TRUE;
- case -1:
- // Error
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
-
- }
-
- return TRUE;
-
-parseError:
- reportParseError();
- return FALSE;
-}
-
-/*!
- Parse a markupdecl [29].
-*/
-bool QXmlSimpleReader::parseMarkupdecl()
-{
- const signed char Init = 0;
- const signed char Lt = 1; // < was read
- const signed char Em = 2; // ! was read
- const signed char CE = 3; // E was read
- const signed char Qm = 4; // ? was read
- const signed char Dash = 5; // - was read
- const signed char CA = 6; // A was read
- const signed char CEL = 7; // EL was read
- const signed char CEN = 8; // EN was read
- const signed char CN = 9; // N was read
- const signed char Done = 10;
-
- const signed char InpLt = 0; // <
- const signed char InpQm = 1; // ?
- const signed char InpEm = 2; // !
- const signed char InpDash = 3; // -
- const signed char InpA = 4; // A
- const signed char InpE = 5; // E
- const signed char InpL = 6; // L
- const signed char InpN = 7; // N
- const signed char InpUnknown = 8;
-
- // use some kind of state machine for parsing
- static signed char table[4][9] = {
- /* InpLt InpQm InpEm InpDash InpA InpE InpL InpN InpUnknown */
- { Lt, -1, -1, -1, -1, -1, -1, -1, -1 }, // Init
- { -1, Qm, Em, -1, -1, -1, -1, -1, -1 }, // Lt
- { -1, -1, -1, Dash, CA, CE, -1, CN, -1 }, // Em
- { -1, -1, -1, -1, -1, -1, CEL, CEN, -1 } // CE
- };
- signed char state = Init;
- signed char input;
- bool parseOk = TRUE;
-
- while ( TRUE ) {
-
- // get input
- if ( atEnd() ) {
- d->error = XMLERR_UNEXPECTEDEOF;
- goto parseError;
- }
- if ( c == '<' ) {
- input = InpLt;
- } else if ( c == '?' ) {
- input = InpQm;
- } else if ( c == '!' ) {
- input = InpEm;
- } else if ( c == '-' ) {
- input = InpDash;
- } else if ( c == 'A' ) {
- input = InpA;
- } else if ( c == 'E' ) {
- input = InpE;
- } else if ( c == 'L' ) {
- input = InpL;
- } else if ( c == 'N' ) {
- input = InpN;
- } else {
- input = InpUnknown;
- }
-
- // set state according to input
- state = table[state][input];
-
- // do some actions according to state
- switch ( state ) {
- case Lt:
- next();
- break;
- case Em:
- next();
- break;
- case CE:
- next();
- break;
- case Qm:
- parseOk = parsePI();
- break;
- case Dash:
- parseOk = parseComment();
- break;
- case CA:
- parseOk = parseAttlistDecl();
- break;
- case CEL:
- parseOk = parseElementDecl();
- break;
- case CEN:
- parseOk = parseEntityDecl();
- break;
- case CN:
- parseOk = parseNotationDecl();
- break;
- }
- // no input is read after this
- switch ( state ) {
- case Qm:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGPI;
- goto parseError;
- }
- if ( contentHnd ) {
- if ( !contentHnd->processingInstruction(name(),string()) ) {
- d->error = contentHnd->errorString();
- goto parseError;
- }
- }
- return TRUE;
- case Dash:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGCOMMENT;
- goto parseError;
- }
- if ( lexicalHnd ) {
- if ( !lexicalHnd->comment( string() ) ) {
- d->error = lexicalHnd->errorString();
- goto parseError;
- }
- }
- return TRUE;
- case CA:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGATTLISTDECL;
- goto parseError;
- }
- return TRUE;
- case CEL:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGELEMENTDECL;
- goto parseError;
- }
- return TRUE;
- case CEN:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGENTITYDECL;
- goto parseError;
- }
- return TRUE;
- case CN:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGNOTATIONDECL;
- goto parseError;
- }
- return TRUE;
- case Done:
- return TRUE;
- case -1:
- // Error
- d->error = XMLERR_LETTEREXPECTED;
- goto parseError;
- }
-
- }
-
- return TRUE;
-
-parseError:
- reportParseError();
- return FALSE;
-}
-
-/*!
- Parse a PEReference [69]
-*/
-bool QXmlSimpleReader::parsePEReference( EntityRecognitionContext context )
-{
- const signed char Init = 0;
- const signed char Next = 1;
- const signed char Name = 2;
- const signed char Done = 3;
-
- const signed char InpSemi = 0; // ;
- const signed char InpPer = 1; // %
- const signed char InpUnknown = 2;
-
- // use some kind of state machine for parsing
- static signed char table[3][3] = {
- /* InpSemi InpPer InpUnknown */
- { -1, Next, -1 }, // Init
- { -1, -1, Name }, // Next
- { Done, -1, -1 } // Name
- };
- signed char state = Init;
- signed char input;
- bool parseOk = TRUE;
-
- while ( TRUE ) {
-
- // get input
- if ( atEnd() ) {
- d->error = XMLERR_UNEXPECTEDEOF;
- goto parseError;
- }
- if ( c == ';' ) {
- input = InpSemi;
- } else if ( c == '%' ) {
- input = InpPer;
- } else {
- input = InpUnknown;
- }
-
- // set state according to input
- state = table[state][input];
-
- // do some actions according to state
- switch ( state ) {
- case Next:
- next();
- break;
- case Name:
- parseOk = parseName( TRUE );
- break;
- case Done:
- next();
- break;
- }
- // no input is read after this
- switch ( state ) {
- case Name:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGNAME;
- goto parseError;
- }
- if ( d->parameterEntities.find( ref() ) == d->parameterEntities.end() ) {
- // ### skip it???
- if ( contentHnd ) {
- if ( !contentHnd->skippedEntity( QString("%") + ref() ) ) {
- d->error = contentHnd->errorString();
- goto parseError;
- }
- }
- } else {
- if ( context == InEntityValue ) {
- // Included in literal
- xmlRef = d->parameterEntities.find( ref() )
- .data().replace( QRegExp("\""), "&quot;" ).replace( QRegExp("'"), "&apos;" )
- + xmlRef;
- } else if ( context == InDTD ) {
- // Included as PE
- xmlRef = QString(" ") +
- d->parameterEntities.find( ref() ).data() +
- QString(" ") + xmlRef;
- }
- }
- break;
- case Done:
- return TRUE;
- case -1:
- // Error
- d->error = XMLERR_LETTEREXPECTED;
- goto parseError;
- }
-
- }
-
- return TRUE;
-
-parseError:
- reportParseError();
- return FALSE;
-}
-
-/*!
- Parse a AttlistDecl [52].
-
- Precondition: the beginning '<!' is already read and the head
- stands on the 'A' of '<!ATTLIST'
-*/
-bool QXmlSimpleReader::parseAttlistDecl()
-{
- const signed char Init = 0;
- const signed char Attlist = 1; // parse the string "ATTLIST"
- const signed char Ws = 2; // whitespace read
- const signed char Name = 3; // parse name
- const signed char Ws1 = 4; // whitespace read
- const signed char Attdef = 5; // parse the AttDef
- const signed char Ws2 = 6; // whitespace read
- const signed char Atttype = 7; // parse the AttType
- const signed char Ws3 = 8; // whitespace read
- const signed char DDecH = 9; // DefaultDecl with #
- const signed char DefReq = 10; // parse the string "REQUIRED"
- const signed char DefImp = 11; // parse the string "IMPLIED"
- const signed char DefFix = 12; // parse the string "FIXED"
- const signed char Attval = 13; // parse the AttValue
- const signed char Ws4 = 14; // whitespace read
- const signed char Done = 15;
-
- const signed char InpWs = 0; // white space
- const signed char InpGt = 1; // >
- const signed char InpHash = 2; // #
- const signed char InpA = 3; // A
- const signed char InpI = 4; // I
- const signed char InpF = 5; // F
- const signed char InpR = 6; // R
- const signed char InpUnknown = 7;
-
- // use some kind of state machine for parsing
- static signed char table[15][8] = {
- /* InpWs InpGt InpHash InpA InpI InpF InpR InpUnknown */
- { -1, -1, -1, Attlist, -1, -1, -1, -1 }, // Init
- { Ws, -1, -1, -1, -1, -1, -1, -1 }, // Attlist
- { -1, -1, -1, Name, Name, Name, Name, Name }, // Ws
- { Ws1, Done, Attdef, Attdef, Attdef, Attdef, Attdef, Attdef }, // Name
- { -1, Done, Attdef, Attdef, Attdef, Attdef, Attdef, Attdef }, // Ws1
- { Ws2, -1, -1, -1, -1, -1, -1, -1 }, // Attdef
- { -1, Atttype, Atttype, Atttype, Atttype, Atttype, Atttype, Atttype }, // Ws2
- { Ws3, -1, -1, -1, -1, -1, -1, -1 }, // Attype
- { -1, Attval, DDecH, Attval, Attval, Attval, Attval, Attval }, // Ws3
- { -1, -1, -1, -1, DefImp, DefFix, DefReq, -1 }, // DDecH
- { Ws4, Ws4, -1, -1, -1, -1, -1, -1 }, // DefReq
- { Ws4, Ws4, -1, -1, -1, -1, -1, -1 }, // DefImp
- { Ws3, -1, -1, -1, -1, -1, -1, -1 }, // DefFix
- { Ws4, Ws4, -1, -1, -1, -1, -1, -1 }, // Attval
- { -1, Done, Attdef, Attdef, Attdef, Attdef, Attdef, Attdef } // Ws4
- };
- signed char state = Init;
- signed char input;
- bool parseOk = TRUE;
-
- while ( TRUE ) {
-
- // get input
- if ( atEnd() ) {
- d->error = XMLERR_UNEXPECTEDEOF;
- goto parseError;
- }
- if ( is_S(c) ) {
- input = InpWs;
- } else if ( c == '>' ) {
- input = InpGt;
- } else if ( c == '#' ) {
- input = InpHash;
- } else if ( c == 'A' ) {
- input = InpA;
- } else if ( c == 'I' ) {
- input = InpI;
- } else if ( c == 'F' ) {
- input = InpF;
- } else if ( c == 'R' ) {
- input = InpR;
- } else {
- input = InpUnknown;
- }
-
- // set state according to input
- state = table[state][input];
-
- // do some actions according to state
- switch ( state ) {
- case Attlist:
- parseOk = parseString( "ATTLIST" );
- break;
- case Ws:
- case Ws1:
- case Ws2:
- case Ws3:
- eat_ws();
- break;
- case Name:
- parseOk = parseName();
- break;
- case Attdef:
- parseOk = parseName();
- break;
- case Atttype:
- parseOk = parseAttType();
- break;
- case DDecH:
- next();
- break;
- case DefReq:
- parseOk = parseString( "REQUIRED" );
- break;
- case DefImp:
- parseOk = parseString( "IMPLIED" );
- break;
- case DefFix:
- parseOk = parseString( "FIXED" );
- break;
- case Attval:
- parseOk = parseAttValue();
- break;
- case Ws4:
- if ( declHnd ) {
- // TODO: not all values are computed yet...
- if ( !declHnd->attributeDecl( d->attDeclEName, d->attDeclAName, "", "", "" ) ) {
- d->error = declHnd->errorString();
- goto parseError;
- }
- }
- eat_ws();
- break;
- case Done:
- next();
- break;
- }
- // no input is read after this
- switch ( state ) {
- case Attlist:
- if( !parseOk ) {
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
- break;
- case Name:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGNAME;
- goto parseError;
- }
- d->attDeclEName = name();
- break;
- case Attdef:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGNAME;
- goto parseError;
- }
- d->attDeclAName = name();
- break;
- case Atttype:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGATTTYPE;
- goto parseError;
- }
- break;
- case DefReq:
- if( !parseOk ) {
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
- break;
- case DefImp:
- if( !parseOk ) {
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
- break;
- case DefFix:
- if( !parseOk ) {
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
- break;
- case Attval:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGATTVALUE;
- goto parseError;
- }
- break;
- case Done:
- return TRUE;
- case -1:
- // Error
- d->error = XMLERR_LETTEREXPECTED;
- goto parseError;
- }
-
- }
-
- return TRUE;
-
-parseError:
- reportParseError();
- return FALSE;
-}
-
-/*!
- Parse a AttType [54]
-*/
-bool QXmlSimpleReader::parseAttType()
-{
- const signed char Init = 0;
- const signed char ST = 1; // StringType
- const signed char TTI = 2; // TokenizedType starting with 'I'
- const signed char TTI2 = 3; // TokenizedType helpstate
- const signed char TTI3 = 4; // TokenizedType helpstate
- const signed char TTE = 5; // TokenizedType starting with 'E'
- const signed char TTEY = 6; // TokenizedType starting with 'ENTITY'
- const signed char TTEI = 7; // TokenizedType starting with 'ENTITI'
- const signed char N = 8; // N read (TokenizedType or Notation)
- const signed char TTNM = 9; // TokenizedType starting with 'NM'
- const signed char TTNM2 = 10; // TokenizedType helpstate
- const signed char NO = 11; // Notation
- const signed char NO2 = 12; // Notation helpstate
- const signed char NO3 = 13; // Notation helpstate
- const signed char NOName = 14; // Notation, read name
- const signed char NO4 = 15; // Notation helpstate
- const signed char EN = 16; // Enumeration
- const signed char ENNmt = 17; // Enumeration, read Nmtoken
- const signed char EN2 = 18; // Enumeration helpstate
- const signed char ADone = 19; // almost done (make next and accept)
- const signed char Done = 20;
-
- const signed char InpWs = 0; // whitespace
- const signed char InpOp = 1; // (
- const signed char InpCp = 2; // )
- const signed char InpPipe = 3; // |
- const signed char InpC = 4; // C
- const signed char InpE = 5; // E
- const signed char InpI = 6; // I
- const signed char InpM = 7; // M
- const signed char InpN = 8; // N
- const signed char InpO = 9; // O
- const signed char InpR = 10; // R
- const signed char InpS = 11; // S
- const signed char InpY = 12; // Y
- const signed char InpUnknown = 13;
-
- // use some kind of state machine for parsing
- static signed char table[19][14] = {
- /* InpWs InpOp InpCp InpPipe InpC InpE InpI InpM InpN InpO InpR InpS InpY InpUnknown */
- { -1, EN, -1, -1, ST, TTE, TTI, -1, N, -1, -1, -1, -1, -1 }, // Init
- { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done }, // ST
- { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, TTI2, Done, Done, Done }, // TTI
- { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, TTI3, Done, Done }, // TTI2
- { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done }, // TTI3
- { -1, -1, -1, -1, -1, -1, TTEI, -1, -1, -1, -1, -1, TTEY, -1 }, // TTE
- { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done }, // TTEY
- { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done }, // TTEI
- { -1, -1, -1, -1, -1, -1, -1, TTNM, -1, NO, -1, -1, -1, -1 }, // N
- { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, TTNM2, Done, Done }, // TTNM
- { Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done, Done }, // TTNM2
- { NO2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // NO
- { -1, NO3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // NO2
- { NOName, NOName, NOName, NOName, NOName, NOName, NOName, NOName, NOName, NOName, NOName, NOName, NOName, NOName }, // NO3
- { NO4, -1, ADone, NO3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // NOName
- { -1, -1, ADone, NO3, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // NO4
- { -1, -1, ENNmt, -1, ENNmt, ENNmt, ENNmt, ENNmt, ENNmt, ENNmt, ENNmt, ENNmt, ENNmt, ENNmt }, // EN
- { EN2, -1, ADone, EN, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // ENNmt
- { -1, -1, ADone, EN, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } // EN2
- };
- signed char state = Init;
- signed char input;
- bool parseOk = TRUE;
-
- while ( TRUE ) {
-
- // get input
- if ( atEnd() ) {
- d->error = XMLERR_UNEXPECTEDEOF;
- goto parseError;
- }
- if ( is_S(c) ) {
- input = InpWs;
- } else if ( c == '(' ) {
- input = InpOp;
- } else if ( c == ')' ) {
- input = InpCp;
- } else if ( c == '|' ) {
- input = InpPipe;
- } else if ( c == 'C' ) {
- input = InpC;
- } else if ( c == 'E' ) {
- input = InpE;
- } else if ( c == 'I' ) {
- input = InpI;
- } else if ( c == 'M' ) {
- input = InpM;
- } else if ( c == 'N' ) {
- input = InpN;
- } else if ( c == 'O' ) {
- input = InpO;
- } else if ( c == 'R' ) {
- input = InpR;
- } else if ( c == 'S' ) {
- input = InpS;
- } else if ( c == 'Y' ) {
- input = InpY;
- } else {
- input = InpUnknown;
- }
-
- // set state according to input
- state = table[state][input];
-
- // do some actions according to state
- switch ( state ) {
- case ST:
- parseOk = parseString( "CDATA" );
- break;
- case TTI:
- parseOk = parseString( "ID" );
- break;
- case TTI2:
- parseOk = parseString( "REF" );
- break;
- case TTI3:
- next(); // S
- break;
- case TTE:
- parseOk = parseString( "ENTIT" );
- break;
- case TTEY:
- next(); // Y
- break;
- case TTEI:
- parseOk = parseString( "IES" );
- break;
- case N:
- next(); // N
- break;
- case TTNM:
- parseOk = parseString( "MTOKEN" );
- break;
- case TTNM2:
- next(); // S
- break;
- case NO:
- parseOk = parseString( "OTATION" );
- break;
- case NO2:
- eat_ws();
- break;
- case NO3:
- next_eat_ws();
- break;
- case NOName:
- parseOk = parseName();
- break;
- case NO4:
- eat_ws();
- break;
- case EN:
- next_eat_ws();
- break;
- case ENNmt:
- parseOk = parseNmtoken();
- break;
- case EN2:
- eat_ws();
- break;
- case ADone:
- next();
- break;
- }
- // no input is read after this
- switch ( state ) {
- case ST:
- if( !parseOk ) {
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
- break;
- case TTI:
- if( !parseOk ) {
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
- break;
- case TTI2:
- if( !parseOk ) {
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
- break;
- case TTE:
- if( !parseOk ) {
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
- break;
- case TTEI:
- if( !parseOk ) {
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
- break;
- case TTNM:
- if( !parseOk ) {
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
- break;
- case NO:
- if( !parseOk ) {
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
- break;
- case NOName:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGNAME;
- goto parseError;
- }
- break;
- case ENNmt:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGNMTOKEN;
- goto parseError;
- }
- break;
- case ADone:
- return TRUE;
- case Done:
- return TRUE;
- case -1:
- // Error
- d->error = XMLERR_LETTEREXPECTED;
- goto parseError;
- }
-
- }
-
- return TRUE;
-
-parseError:
- reportParseError();
- return FALSE;
-}
-
-/*!
- Parse a AttValue [10]
-
- Precondition: the head stands on the beginning " or '
-
- If this function was successful, the head stands on the first
- character after the closing " or ' and the value of the attribute
- is in string().
-*/
-bool QXmlSimpleReader::parseAttValue()
-{
- bool tmp;
-
- const signed char Init = 0;
- const signed char Dq = 1; // double quotes were read
- const signed char DqRef = 2; // read references in double quotes
- const signed char DqC = 3; // signed character read in double quotes
- const signed char Sq = 4; // single quotes were read
- const signed char SqRef = 5; // read references in single quotes
- const signed char SqC = 6; // signed character read in single quotes
- const signed char Done = 7;
-
- const signed char InpDq = 0; // "
- const signed char InpSq = 1; // '
- const signed char InpAmp = 2; // &
- const signed char InpLt = 3; // <
- const signed char InpUnknown = 4;
-
- // use some kind of state machine for parsing
- static signed char table[7][5] = {
- /* InpDq InpSq InpAmp InpLt InpUnknown */
- { Dq, Sq, -1, -1, -1 }, // Init
- { Done, DqC, DqRef, -1, DqC }, // Dq
- { Done, DqC, DqRef, -1, DqC }, // DqRef
- { Done, DqC, DqRef, -1, DqC }, // DqC
- { SqC, Done, SqRef, -1, SqC }, // Sq
- { SqC, Done, SqRef, -1, SqC }, // SqRef
- { SqC, Done, SqRef, -1, SqC } // SqRef
- };
- signed char state = Init;
- signed char input;
- bool parseOk = TRUE;
-
- while ( TRUE ) {
-
- // get input
- if ( atEnd() ) {
- d->error = XMLERR_UNEXPECTEDEOF;
- goto parseError;
- }
- if ( c == '"' ) {
- input = InpDq;
- } else if ( c == '\'' ) {
- input = InpSq;
- } else if ( c == '&' ) {
- input = InpAmp;
- } else if ( c == '<' ) {
- input = InpLt;
- } else {
- input = InpUnknown;
- }
-
- // set state according to input
- state = table[state][input];
-
- // do some actions according to state
- switch ( state ) {
- case Dq:
- case Sq:
- stringClear();
- next();
- break;
- case DqRef:
- case SqRef:
- parseOk = parseReference( tmp, InAttributeValue );
- break;
- case DqC:
- case SqC:
- stringAddC();
- next();
- break;
- case Done:
- next();
- break;
- }
- // no input is read after this
- switch ( state ) {
- case DqRef:
- case SqRef:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGREFERENCE;
- goto parseError;
- }
- break;
- case Done:
- return TRUE;
- case -1:
- // Error
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
-
- }
-
- return TRUE;
-
-parseError:
- reportParseError();
- return FALSE;
-}
-
-/*!
- Parse a elementdecl [45].
-
- Precondition: the beginning '<!E' is already read and the head
- stands on the 'L' of '<!ELEMENT'
-*/
-bool QXmlSimpleReader::parseElementDecl()
-{
- const signed char Init = 0;
- const signed char Elem = 1; // parse the beginning string
- const signed char Ws1 = 2; // whitespace required
- const signed char Nam = 3; // parse Name
- const signed char Ws2 = 4; // whitespace required
- const signed char Empty = 5; // read EMPTY
- const signed char Any = 6; // read ANY
- const signed char Cont = 7; // read contentspec (except ANY or EMPTY)
- const signed char Mix = 8; // read Mixed
- const signed char Mix2 = 9; //
- const signed char Mix3 = 10; //
- const signed char MixN1 = 11; //
- const signed char MixN2 = 12; //
- const signed char MixN3 = 13; //
- const signed char MixN4 = 14; //
- const signed char Cp = 15; // parse cp
- const signed char Cp2 = 16; //
- const signed char WsD = 17; // eat whitespace before Done
- const signed char Done = 18;
-
- const signed char InpWs = 0;
- const signed char InpGt = 1; // >
- const signed char InpPipe = 2; // |
- const signed char InpOp = 3; // (
- const signed char InpCp = 4; // )
- const signed char InpHash = 5; // #
- const signed char InpQm = 6; // ?
- const signed char InpAst = 7; // *
- const signed char InpPlus = 8; // +
- const signed char InpA = 9; // A
- const signed char InpE = 10; // E
- const signed char InpL = 11; // L
- const signed char InpUnknown = 12;
-
- // use some kind of state machine for parsing
- static signed char table[18][13] = {
- /* InpWs InpGt InpPipe InpOp InpCp InpHash InpQm InpAst InpPlus InpA InpE InpL InpUnknown */
- { -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, Elem, -1 }, // Init
- { Ws1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // Elem
- { -1, -1, -1, -1, -1, -1, -1, -1, -1, Nam, Nam, Nam, Nam }, // Ws1
- { Ws2, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // Nam
- { -1, -1, -1, Cont, -1, -1, -1, -1, -1, Any, Empty, -1, -1 }, // Ws2
- { WsD, Done, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // Empty
- { WsD, Done, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // Any
- { -1, -1, -1, Cp, Cp, Mix, -1, -1, -1, Cp, Cp, Cp, Cp }, // Cont
- { Mix2, -1, MixN1, -1, Mix3, -1, -1, -1, -1, -1, -1, -1, -1 }, // Mix
- { -1, -1, MixN1, -1, Mix3, -1, -1, -1, -1, -1, -1, -1, -1 }, // Mix2
- { WsD, Done, -1, -1, -1, -1, -1, WsD, -1, -1, -1, -1, -1 }, // Mix3
- { -1, -1, -1, -1, -1, -1, -1, -1, -1, MixN2, MixN2, MixN2, MixN2 }, // MixN1
- { MixN3, -1, MixN1, -1, MixN4, -1, -1, -1, -1, -1, -1, -1, -1 }, // MixN2
- { -1, -1, MixN1, -1, MixN4, -1, -1, -1, -1, -1, -1, -1, -1 }, // MixN3
- { -1, -1, -1, -1, -1, -1, -1, WsD, -1, -1, -1, -1, -1 }, // MixN4
- { WsD, Done, -1, -1, -1, -1, Cp2, Cp2, Cp2, -1, -1, -1, -1 }, // Cp
- { WsD, Done, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 }, // Cp2
- { -1, Done, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1 } // WsD
- };
- signed char state = Init;
- signed char input;
- bool parseOk = TRUE;
-
- while ( TRUE ) {
-
- // read input
- if ( atEnd() ) {
- d->error = XMLERR_UNEXPECTEDEOF;
- goto parseError;
- }
- if ( is_S(c) ) {
- input = InpWs;
- } else if ( c == '>' ) {
- input = InpGt;
- } else if ( c == '|' ) {
- input = InpPipe;
- } else if ( c == '(' ) {
- input = InpOp;
- } else if ( c == ')' ) {
- input = InpCp;
- } else if ( c == '#' ) {
- input = InpHash;
- } else if ( c == '?' ) {
- input = InpQm;
- } else if ( c == '*' ) {
- input = InpAst;
- } else if ( c == '+' ) {
- input = InpPlus;
- } else if ( c == 'A' ) {
- input = InpA;
- } else if ( c == 'E' ) {
- input = InpE;
- } else if ( c == 'L' ) {
- input = InpL;
- } else {
- input = InpUnknown;
- }
- // get new state
-//qDebug( "%d -%d(%c)-> %d", state, input, c.latin1(), table[state][input] );
- state = table[state][input];
-
- // in some cases do special actions depending on state
- switch ( state ) {
- case Elem:
- parseOk = parseString( "LEMENT" );
- break;
- case Ws1:
- eat_ws();
- break;
- case Nam:
- parseOk = parseName();
- break;
- case Ws2:
- eat_ws();
- break;
- case Empty:
- parseOk = parseString( "EMPTY" );
- break;
- case Any:
- parseOk = parseString( "ANY" );
- break;
- case Cont:
- next_eat_ws();
- break;
- case Mix:
- parseOk = parseString( "#PCDATA" );
- break;
- case Mix2:
- eat_ws();
- break;
- case Mix3:
- next();
- break;
- case MixN1:
- next_eat_ws();
- break;
- case MixN2:
- parseOk = parseName();
- break;
- case MixN3:
- eat_ws();
- break;
- case MixN4:
- next();
- break;
- case Cp:
- parseOk = parseChoiceSeq();
- break;
- case Cp2:
- next();
- break;
- case WsD:
- next_eat_ws();
- break;
- case Done:
- next();
- break;
- }
- // no input is read after this
- switch ( state ) {
- case Elem:
- if( !parseOk ) {
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
- break;
- case Nam:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGNAME;
- goto parseError;
- }
- break;
- case Empty:
- if( !parseOk ) {
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
- break;
- case Any:
- if( !parseOk ) {
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
- break;
- case Mix:
- if( !parseOk ) {
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
- break;
- case MixN2:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGNAME;
- goto parseError;
- }
- break;
- case Cp:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGCHOICE;
- goto parseError;
- }
- break;
- case Done:
- return TRUE;
- case -1:
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
-
- }
-
- return TRUE;
-
-parseError:
- reportParseError();
- return FALSE;
-}
-
-/*!
- Parse a NotationDecl [82].
-
- Precondition: the beginning '<!' is already read and the head
- stands on the 'N' of '<!NOTATION'
-*/
-bool QXmlSimpleReader::parseNotationDecl()
-{
- const signed char Init = 0;
- const signed char Not = 1; // read NOTATION
- const signed char Ws1 = 2; // eat whitespaces
- const signed char Nam = 3; // read Name
- const signed char Ws2 = 4; // eat whitespaces
- const signed char ExtID = 5; // parse ExternalID
- const signed char Ws3 = 6; // eat whitespaces
- const signed char Done = 7;
-
- const signed char InpWs = 0;
- const signed char InpGt = 1; // >
- const signed char InpN = 2; // N
- const signed char InpUnknown = 3;
-
- // use some kind of state machine for parsing
- static signed char table[7][4] = {
- /* InpWs InpGt InpN InpUnknown */
- { -1, -1, Not, -1 }, // Init
- { Ws1, -1, -1, -1 }, // Not
- { -1, -1, Nam, Nam }, // Ws1
- { Ws2, Done, -1, -1 }, // Nam
- { -1, Done, ExtID, ExtID }, // Ws2
- { Ws3, Done, -1, -1 }, // ExtID
- { -1, Done, -1, -1 } // Ws3
- };
- signed char state = Init;
- signed char input;
- bool parseOk = TRUE;
-
- while ( TRUE ) {
-
- // get input
- if ( atEnd() ) {
- d->error = XMLERR_UNEXPECTEDEOF;
- goto parseError;
- }
- if ( is_S(c) ) {
- input = InpWs;
- } else if ( c == '>' ) {
- input = InpGt;
- } else if ( c == 'N' ) {
- input = InpN;
- } else {
- input = InpUnknown;
- }
-
- // set state according to input
- state = table[state][input];
-
- // do some actions according to state
- switch ( state ) {
- case Not:
- parseOk = parseString( "NOTATION" );
- break;
- case Ws1:
- eat_ws();
- break;
- case Nam:
- parseOk = parseName();
- break;
- case Ws2:
- eat_ws();
- break;
- case ExtID:
- parseOk = parseExternalID( TRUE );
- break;
- case Ws3:
- eat_ws();
- break;
- case Done:
- next();
- break;
- }
- // no input is read after this
- switch ( state ) {
- case Not:
- if ( !parseOk ) {
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
- break;
- case Nam:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGNAME;
- goto parseError;
- }
- break;
- case ExtID:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGEXTERNALID;
- goto parseError;
- }
- // call the handler
- if ( dtdHnd ) {
- if ( !dtdHnd->notationDecl( name(), d->publicId, d->systemId ) ) {
- d->error = dtdHnd->errorString();
- goto parseError;
- }
- }
- break;
- case Done:
- return TRUE;
- case -1:
- // Error
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
-
- }
-
- return TRUE;
-
-parseError:
- reportParseError();
- return FALSE;
-}
-
-/*!
- Parse choice [49] or seq [50].
-
- Precondition: the beginning '('S? is already read and the head
- stands on the first non-whitespace character after it.
-*/
-bool QXmlSimpleReader::parseChoiceSeq()
-{
- const signed char Init = 0;
- const signed char Ws1 = 1; // eat whitespace
- const signed char CS = 2; // choice or set
- const signed char Ws2 = 3; // eat whitespace
- const signed char More = 4; // more cp to read
- const signed char Name = 5; // read name
- const signed char Done = 6; //
-
- const signed char InpWs = 0; // S
- const signed char InpOp = 1; // (
- const signed char InpCp = 2; // )
- const signed char InpQm = 3; // ?
- const signed char InpAst = 4; // *
- const signed char InpPlus = 5; // +
- const signed char InpPipe = 6; // |
- const signed char InpComm = 7; // ,
- const signed char InpUnknown = 8;
-
- // use some kind of state machine for parsing
- static signed char table[6][9] = {
- /* InpWs InpOp InpCp InpQm InpAst InpPlus InpPipe InpComm InpUnknown */
- { -1, Ws1, -1, -1, -1, -1, -1, -1, Name }, // Init
- { -1, CS, -1, -1, -1, -1, -1, -1, CS }, // Ws1
- { Ws2, -1, Done, Ws2, Ws2, Ws2, More, More, -1 }, // CS
- { -1, -1, Done, -1, -1, -1, More, More, -1 }, // Ws2
- { -1, Ws1, -1, -1, -1, -1, -1, -1, Name }, // More (same as Init)
- { Ws2, -1, Done, Ws2, Ws2, Ws2, More, More, -1 } // Name (same as CS)
- };
- signed char state = Init;
- signed char input;
- bool parseOk = TRUE;
-
- while ( TRUE ) {
-
- // get input
- if ( atEnd() ) {
- d->error = XMLERR_UNEXPECTEDEOF;
- goto parseError;
- }
- if ( is_S(c) ) {
- input = InpWs;
- } else if ( c == '(' ) {
- input = InpOp;
- } else if ( c == ')' ) {
- input = InpCp;
- } else if ( c == '?' ) {
- input = InpQm;
- } else if ( c == '*' ) {
- input = InpAst;
- } else if ( c == '+' ) {
- input = InpPlus;
- } else if ( c == '|' ) {
- input = InpPipe;
- } else if ( c == ',' ) {
- input = InpComm;
- } else {
- input = InpUnknown;
- }
-
- // set state according to input
- state = table[state][input];
-
- // do some actions according to state
- switch ( state ) {
- case Ws1:
- next_eat_ws();
- break;
- case CS:
- parseOk = parseChoiceSeq();
- break;
- case Ws2:
- next_eat_ws();
- break;
- case More:
- next_eat_ws();
- break;
- case Name:
- parseOk = parseName();
- break;
- case Done:
- next();
- break;
- }
- // no input is read after this
- switch ( state ) {
- case CS:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGCHOICE;
- goto parseError;
- }
- break;
- case Name:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGNAME;
- goto parseError;
- }
- break;
- case Done:
- return TRUE;
- case -1:
- // Error
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
-
- }
-
- return TRUE;
-
-parseError:
- reportParseError();
- return FALSE;
-}
-
-/*!
- Parse a EntityDecl [70].
-
- Precondition: the beginning '<!E' is already read and the head
- stand on the 'N' of '<!ENTITY'
-*/
-bool QXmlSimpleReader::parseEntityDecl()
-{
- const signed char Init = 0;
- const signed char Ent = 1; // parse "ENTITY"
- const signed char Ws1 = 2; // white space read
- const signed char Name = 3; // parse name
- const signed char Ws2 = 4; // white space read
- const signed char EValue = 5; // parse entity value
- const signed char ExtID = 6; // parse ExternalID
- const signed char Ws3 = 7; // white space read
- const signed char Ndata = 8; // parse "NDATA"
- const signed char Ws4 = 9; // white space read
- const signed char NNam = 10; // parse name
- const signed char PEDec = 11; // parse PEDecl
- const signed char Ws6 = 12; // white space read
- const signed char PENam = 13; // parse name
- const signed char Ws7 = 14; // white space read
- const signed char PEVal = 15; // parse entity value
- const signed char PEEID = 16; // parse ExternalID
- const signed char WsE = 17; // white space read
- const signed char EDDone = 19; // done, but also report an external, unparsed entity decl
- const signed char Done = 18;
-
- const signed char InpWs = 0; // white space
- const signed char InpPer = 1; // %
- const signed char InpQuot = 2; // " or '
- const signed char InpGt = 3; // >
- const signed char InpN = 4; // N
- const signed char InpUnknown = 5;
-
- // use some kind of state machine for parsing
- static signed char table[18][6] = {
- /* InpWs InpPer InpQuot InpGt InpN InpUnknown */
- { -1, -1, -1, -1, Ent, -1 }, // Init
- { Ws1, -1, -1, -1, -1, -1 }, // Ent
- { -1, PEDec, -1, -1, Name, Name }, // Ws1
- { Ws2, -1, -1, -1, -1, -1 }, // Name
- { -1, -1, EValue, -1, -1, ExtID }, // Ws2
- { WsE, -1, -1, Done, -1, -1 }, // EValue
- { Ws3, -1, -1, EDDone,-1, -1 }, // ExtID
- { -1, -1, -1, EDDone,Ndata, -1 }, // Ws3
- { Ws4, -1, -1, -1, -1, -1 }, // Ndata
- { -1, -1, -1, -1, NNam, NNam }, // Ws4
- { WsE, -1, -1, Done, -1, -1 }, // NNam
- { Ws6, -1, -1, -1, -1, -1 }, // PEDec
- { -1, -1, -1, -1, PENam, PENam }, // Ws6
- { Ws7, -1, -1, -1, -1, -1 }, // PENam
- { -1, -1, PEVal, -1, -1, PEEID }, // Ws7
- { WsE, -1, -1, Done, -1, -1 }, // PEVal
- { WsE, -1, -1, Done, -1, -1 }, // PEEID
- { -1, -1, -1, Done, -1, -1 } // WsE
- };
- signed char state = Init;
- signed char input;
- bool parseOk = TRUE;
-
- while ( TRUE ) {
-
- // get input
- if ( atEnd() ) {
- d->error = XMLERR_UNEXPECTEDEOF;
- goto parseError;
- }
- if ( is_S(c) ) {
- input = InpWs;
- } else if ( c == '%' ) {
- input = InpPer;
- } else if ( c == '"' || c == '\'' ) {
- input = InpQuot;
- } else if ( c == '>' ) {
- input = InpGt;
- } else if ( c == 'N' ) {
- input = InpN;
- } else {
- input = InpUnknown;
- }
-
- // set state according to input
- state = table[state][input];
-
- // do some actions according to state
- switch ( state ) {
- case Ent:
- parseOk = parseString( "NTITY" );
- break;
- case Ws1:
- eat_ws();
- break;
- case Name:
- parseOk = parseName();
- break;
- case Ws2:
- eat_ws();
- break;
- case EValue:
- parseOk = parseEntityValue();
- break;
- case ExtID:
- parseOk = parseExternalID();
- break;
- case Ws3:
- eat_ws();
- break;
- case Ndata:
- parseOk = parseString( "NDATA" );
- break;
- case Ws4:
- eat_ws();
- break;
- case NNam:
- parseOk = parseName( TRUE );
- break;
- case PEDec:
- next();
- break;
- case Ws6:
- eat_ws();
- break;
- case PENam:
- parseOk = parseName();
- break;
- case Ws7:
- eat_ws();
- break;
- case PEVal:
- parseOk = parseEntityValue();
- break;
- case PEEID:
- parseOk = parseExternalID();
- break;
- case WsE:
- eat_ws();
- break;
- case EDDone:
- next();
- break;
- case Done:
- next();
- break;
- }
- // no input is read after this
- switch ( state ) {
- case Ent:
- if ( !parseOk ) {
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
- break;
- case Name:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGNAME;
- goto parseError;
- }
- break;
- case EValue:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGENTITYVALUE;
- goto parseError;
- }
- if ( !entityExist( name() ) ) {
- d->entities.insert( name(), string() );
- if ( declHnd ) {
- if ( !declHnd->internalEntityDecl( name(), string() ) ) {
- d->error = declHnd->errorString();
- goto parseError;
- }
- }
- }
- break;
- case ExtID:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGEXTERNALID;
- goto parseError;
- }
- break;
- case Ndata:
- if ( !parseOk ) {
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
- break;
- case NNam:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGNAME;
- goto parseError;
- }
- if ( !entityExist( name() ) ) {
- d->externEntities.insert( name(), QXmlSimpleReaderPrivate::ExternEntity( d->publicId, d->systemId, ref() ) );
- if ( dtdHnd ) {
- if ( !dtdHnd->unparsedEntityDecl( name(), d->publicId, d->systemId, ref() ) ) {
- d->error = declHnd->errorString();
- goto parseError;
- }
- }
- }
- break;
- case PENam:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGNAME;
- goto parseError;
- }
- break;
- case PEVal:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGENTITYVALUE;
- goto parseError;
- }
- if ( !entityExist( name() ) ) {
- d->parameterEntities.insert( name(), string() );
- if ( declHnd ) {
- if ( !declHnd->internalEntityDecl( QString("%")+name(), string() ) ) {
- d->error = declHnd->errorString();
- goto parseError;
- }
- }
- }
- break;
- case PEEID:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGEXTERNALID;
- goto parseError;
- }
- if ( !entityExist( name() ) ) {
- d->externParameterEntities.insert( name(), QXmlSimpleReaderPrivate::ExternParameterEntity( d->publicId, d->systemId ) );
- if ( declHnd ) {
- if ( !declHnd->externalEntityDecl( QString("%")+name(), d->publicId, d->systemId ) ) {
- d->error = declHnd->errorString();
- goto parseError;
- }
- }
- }
- break;
- case EDDone:
- if ( !entityExist( name() ) ) {
- d->externEntities.insert( name(), QXmlSimpleReaderPrivate::ExternEntity( d->publicId, d->systemId, QString::null ) );
- if ( declHnd ) {
- if ( !declHnd->externalEntityDecl( name(), d->publicId, d->systemId ) ) {
- d->error = declHnd->errorString();
- goto parseError;
- }
- }
- }
- return TRUE;
- case Done:
- return TRUE;
- case -1:
- // Error
- d->error = XMLERR_LETTEREXPECTED;
- goto parseError;
- }
-
- }
-
- return TRUE;
-
-parseError:
- reportParseError();
- return FALSE;
-}
-
-/*!
- Parse a EntityValue [9]
-*/
-bool QXmlSimpleReader::parseEntityValue()
-{
- bool tmp;
-
- const signed char Init = 0;
- const signed char Dq = 1; // EntityValue is double quoted
- const signed char DqC = 2; // signed character
- const signed char DqPER = 3; // PERefence
- const signed char DqRef = 4; // Reference
- const signed char Sq = 5; // EntityValue is double quoted
- const signed char SqC = 6; // signed character
- const signed char SqPER = 7; // PERefence
- const signed char SqRef = 8; // Reference
- const signed char Done = 9;
-
- const signed char InpDq = 0; // "
- const signed char InpSq = 1; // '
- const signed char InpAmp = 2; // &
- const signed char InpPer = 3; // %
- const signed char InpUnknown = 4;
-
- // use some kind of state machine for parsing
- static signed char table[9][5] = {
- /* InpDq InpSq InpAmp InpPer InpUnknown */
- { Dq, Sq, -1, -1, -1 }, // Init
- { Done, DqC, DqRef, DqPER, DqC }, // Dq
- { Done, DqC, DqRef, DqPER, DqC }, // DqC
- { Done, DqC, DqRef, DqPER, DqC }, // DqPER
- { Done, DqC, DqRef, DqPER, DqC }, // DqRef
- { SqC, Done, SqRef, SqPER, SqC }, // Sq
- { SqC, Done, SqRef, SqPER, SqC }, // SqC
- { SqC, Done, SqRef, SqPER, SqC }, // SqPER
- { SqC, Done, SqRef, SqPER, SqC } // SqRef
- };
- signed char state = Init;
- signed char input;
- bool parseOk = TRUE;
-
- while ( TRUE ) {
-
- // get input
- if ( atEnd() ) {
- d->error = XMLERR_UNEXPECTEDEOF;
- goto parseError;
- }
- if ( c == '"' ) {
- input = InpDq;
- } else if ( c == '\'' ) {
- input = InpSq;
- } else if ( c == '&' ) {
- input = InpAmp;
- } else if ( c == '%' ) {
- input = InpPer;
- } else {
- input = InpUnknown;
- }
-
- // set state according to input
- state = table[state][input];
-
- // do some actions according to state
- switch ( state ) {
- case Dq:
- case Sq:
- stringClear();
- next();
- break;
- case DqC:
- case SqC:
- stringAddC();
- next();
- break;
- case DqPER:
- case SqPER:
- parseOk = parsePEReference( InEntityValue );
- break;
- case DqRef:
- case SqRef:
- parseOk = parseReference( tmp, InEntityValue );
- break;
- case Done:
- next();
- break;
- }
- // no input is read after this
- switch ( state ) {
- case DqPER:
- case SqPER:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGDOCTYPE;
- goto parseError;
- }
- break;
- case DqRef:
- case SqRef:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGREFERENCE;
- goto parseError;
- }
- break;
- case Done:
- return TRUE;
- case -1:
- // Error
- d->error = XMLERR_LETTEREXPECTED;
- goto parseError;
- }
-
- }
-
- return TRUE;
-
-parseError:
- reportParseError();
- return FALSE;
-}
-
-/*!
- Parse a comment [15].
-
- Precondition: the beginning '<!' of the comment is already read and the head
- stands on the first '-' of '<!--'.
-
- If this funktion was successful, the head-position is on the first
- character after the comment.
-*/
-bool QXmlSimpleReader::parseComment()
-{
- const signed char Init = 0;
- const signed char Dash1 = 1; // the first dash was read
- const signed char Dash2 = 2; // the second dash was read
- const signed char Com = 3; // read comment
- const signed char Com2 = 4; // read comment (help state)
- const signed char ComE = 5; // finished reading comment
- const signed char Done = 6;
-
- const signed char InpDash = 0; // -
- const signed char InpGt = 1; // >
- const signed char InpUnknown = 2;
-
- // use some kind of state machine for parsing
- static signed char table[6][3] = {
- /* InpDash InpGt InpUnknown */
- { Dash1, -1, -1 }, // Init
- { Dash2, -1, -1 }, // Dash1
- { Com2, Com, Com }, // Dash2
- { Com2, Com, Com }, // Com
- { ComE, Com, Com }, // Com2
- { -1, Done, -1 } // ComE
- };
- signed char state = Init;
- signed char input;
-
- while ( TRUE ) {
-
- // get input
- if ( atEnd() ) {
- d->error = XMLERR_UNEXPECTEDEOF;
- goto parseError;
- }
- if ( c == '-' ) {
- input = InpDash;
- } else if ( c == '>' ) {
- input = InpGt;
- } else {
- input = InpUnknown;
- }
-
- // set state according to input
- state = table[state][input];
-
- // do some actions according to state
- switch ( state ) {
- case Dash1:
- next();
- break;
- case Dash2:
- next();
- break;
- case Com:
- stringAddC();
- next();
- break;
- case Com2:
- next();
- break;
- case ComE:
- next();
- break;
- case Done:
- next();
- break;
- }
- // no input is read after this
- switch ( state ) {
- case Dash2:
- stringClear();
- break;
- case Com2:
- // if next character is not a dash than don't skip it
- if ( c != '-' ) {
- stringAddC( '-' );
- }
- break;
- case Done:
- return TRUE;
- case -1:
- // Error
- d->error = XMLERR_ERRORPARSINGCOMMENT;
- goto parseError;
- }
-
- }
-
- return TRUE;
-
-parseError:
- reportParseError();
- return FALSE;
-}
-
-/*!
- Parse a Attribute [41].
-
- Precondition: the head stands on the first character of the name of the
- attribute (i.e. all whitespaces are already parsed).
-
- The head stand on the next character after the end quotes. The variable name
- contains the name of the attribute and the variable string contains the value
- of the attribute.
-*/
-bool QXmlSimpleReader::parseAttribute()
-{
- const signed char Init = 0;
- const signed char PName = 1; // parse name
- const signed char Ws = 2; // eat ws
- const signed char Eq = 3; // the '=' was read
- const signed char Quotes = 4; // " or ' were read
-
- const signed char InpNameBe = 0;
- const signed char InpEq = 1; // =
- const signed char InpDq = 2; // "
- const signed char InpSq = 3; // '
- const signed char InpUnknown = 4;
-
- // use some kind of state machine for parsing
- static signed char table[4][5] = {
- /* InpNameBe InpEq InpDq InpSq InpUnknown */
- { PName, -1, -1, -1, -1 }, // Init
- { -1, Eq, -1, -1, Ws }, // PName
- { -1, Eq, -1, -1, -1 }, // Ws
- { -1, -1, Quotes, Quotes, -1 } // Eq
- };
- signed char state = Init;
- signed char input;
- bool parseOk = TRUE;
-
- while ( TRUE ) {
-
- // get input
- if ( atEnd() ) {
- d->error = XMLERR_UNEXPECTEDEOF;
- goto parseError;
- }
- if ( is_NameBeginning(c) ) {
- input = InpNameBe;
- } else if ( c == '=' ) {
- input = InpEq;
- } else if ( c == '"' ) {
- input = InpDq;
- } else if ( c == '\'' ) {
- input = InpSq;
- } else {
- input = InpUnknown;
- }
-
- // set state according to input
- state = table[state][input];
-
- // do some actions according to state
- switch ( state ) {
- case PName:
- parseOk = parseName();
- break;
- case Ws:
- eat_ws();
- break;
- case Eq:
- next_eat_ws();
- break;
- case Quotes:
- parseOk = parseAttValue();
- break;
- }
- // no input is read after this
- switch ( state ) {
- case PName:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGNAME;
- goto parseError;
- }
- break;
- case Quotes:
- if ( !parseOk ) {
- d->error = XMLERR_ERRORPARSINGATTVALUE;
- goto parseError;
- }
- // Done
- return TRUE;
- case -1:
- // Error
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
-
- }
-
- return TRUE;
-
-parseError:
- reportParseError();
- return FALSE;
-}
-
-/*!
- Parse a Name [5] and store the name in name or ref (if useRef is TRUE).
-*/
-bool QXmlSimpleReader::parseName( bool useRef )
-{
- const signed char Init = 0;
- const signed char Name1 = 1; // parse first signed character of the name
- const signed char Name = 2; // parse name
- const signed char Done = 3;
-
- const signed char InpNameBe = 0; // name beginning signed characters
- const signed char InpNameCh = 1; // NameChar without InpNameBe
- const signed char InpUnknown = 2;
-
- // use some kind of state machine for parsing
- static signed char table[3][3] = {
- /* InpNameBe InpNameCh InpUnknown */
- { Name1, -1, -1 }, // Init
- { Name, Name, Done }, // Name1
- { Name, Name, Done } // Name
- };
- signed char state = Init;
- signed char input;
-
- while ( TRUE ) {
-
- // get input
- if ( atEnd() ) {
- d->error = XMLERR_UNEXPECTEDEOF;
- goto parseError;
- }
- if ( is_NameBeginning(c) ) {
- input = InpNameBe;
- } else if ( is_NameChar(c) ) {
- input = InpNameCh;
- } else {
- input = InpUnknown;
- }
-
- // set state according to input
- state = table[state][input];
-
- // do some actions according to state
- switch ( state ) {
- case Name1:
- if ( useRef ) {
- refClear();
- refAddC();
- } else {
- nameClear();
- nameAddC();
- }
- next();
- break;
- case Name:
- if ( useRef ) {
- refAddC();
- } else {
- nameAddC();
- }
- next();
- break;
- }
- // no input is read after this
- switch ( state ) {
- case Done:
- return TRUE;
- case -1:
- // Error
- d->error = XMLERR_LETTEREXPECTED;
- goto parseError;
- }
-
- }
-
- return TRUE;
-
-parseError:
- reportParseError();
- return FALSE;
-}
-
-/*!
- Parse a Nmtoken [7] and store the name in name.
-*/
-bool QXmlSimpleReader::parseNmtoken()
-{
- const signed char Init = 0;
- const signed char NameF = 1;
- const signed char Name = 2;
- const signed char Done = 3;
-
- const signed char InpNameCh = 0; // NameChar without InpNameBe
- const signed char InpUnknown = 1;
-
- // use some kind of state machine for parsing
- static signed char table[3][2] = {
- /* InpNameCh InpUnknown */
- { NameF, -1 }, // Init
- { Name, Done }, // NameF
- { Name, Done } // Name
- };
- signed char state = Init;
- signed char input;
-
- while ( TRUE ) {
-
- // get input
- if ( atEnd() ) {
- d->error = XMLERR_UNEXPECTEDEOF;
- goto parseError;
- }
- if ( is_NameChar(c) ) {
- input = InpNameCh;
- } else {
- input = InpUnknown;
- }
-
- // set state according to input
- state = table[state][input];
-
- // do some actions according to state
- switch ( state ) {
- case NameF:
- nameClear();
- nameAddC();
- next();
- break;
- case Name:
- nameAddC();
- next();
- break;
- }
- // no input is read after this
- switch ( state ) {
- case Done:
- return TRUE;
- case -1:
- // Error
- d->error = XMLERR_LETTEREXPECTED;
- goto parseError;
- }
-
- }
-
- return TRUE;
-
-parseError:
- reportParseError();
- return FALSE;
-}
-
-/*!
- Parse a Reference [67].
-
- charDataRead is set to TRUE if the reference must not be parsed. The
- character(s) which the reference mapped to are appended to string. The
- head stands on the first character after the reference.
-
- charDataRead is set to FALSE if the reference must be parsed. The
- charachter(s) which the reference mapped to are inserted at the reference
- position. The head stands on the first character of the replacement).
-*/
-bool QXmlSimpleReader::parseReference( bool &charDataRead, EntityRecognitionContext context )
-{
- // temporary variables
- uint tmp;
- bool ok;
-
- const signed char Init = 0;
- const signed char SRef = 1; // start of a reference
- const signed char ChRef = 2; // parse CharRef
- const signed char ChDec = 3; // parse CharRef decimal
- const signed char ChHexS = 4; // start CharRef hexadecimal
- const signed char ChHex = 5; // parse CharRef hexadecimal
- const signed char Name = 6; // parse name
- const signed char DoneD = 7; // done CharRef decimal
- const signed char DoneH = 8; // done CharRef hexadecimal
- const signed char DoneN = 9; // done EntityRef
-
- const signed char InpAmp = 0; // &
- const signed char InpSemi = 1; // ;
- const signed char InpHash = 2; // #
- const signed char InpX = 3; // x
- const signed char InpNum = 4; // 0-9
- const signed char InpHex = 5; // a-f A-F
- const signed char InpUnknown = 6;
-
- // use some kind of state machine for parsing
- static signed char table[8][7] = {
- /* InpAmp InpSemi InpHash InpX InpNum InpHex InpUnknown */
- { SRef, -1, -1, -1, -1, -1, -1 }, // Init
- { -1, -1, ChRef, Name, Name, Name, Name }, // SRef
- { -1, -1, -1, ChHexS, ChDec, -1, -1 }, // ChRef
- { -1, DoneD, -1, -1, ChDec, -1, -1 }, // ChDec
- { -1, -1, -1, -1, ChHex, ChHex, -1 }, // ChHexS
- { -1, DoneH, -1, -1, ChHex, ChHex, -1 }, // ChHex
- { -1, DoneN, -1, -1, -1, -1, -1 } // Name
- };
- signed char state = Init;
- signed char input;
-
- while ( TRUE ) {
-
- // get input
- if ( atEnd() ) {
- d->error = XMLERR_UNEXPECTEDEOF;
- goto parseError;
- }
- if ( c.row() ) {
- input = InpUnknown;
- } else if ( c.cell() == '&' ) {
- input = InpAmp;
- } else if ( c.cell() == ';' ) {
- input = InpSemi;
- } else if ( c.cell() == '#' ) {
- input = InpHash;
- } else if ( c.cell() == 'x' ) {
- input = InpX;
- } else if ( '0' <= c.cell() && c.cell() <= '9' ) {
- input = InpNum;
- } else if ( 'a' <= c.cell() && c.cell() <= 'f' ) {
- input = InpHex;
- } else if ( 'A' <= c.cell() && c.cell() <= 'F' ) {
- input = InpHex;
- } else {
- input = InpUnknown;
- }
-
- // set state according to input
- state = table[state][input];
-
- // do some actions according to state
- switch ( state ) {
- case SRef:
- refClear();
- next();
- break;
- case ChRef:
- next();
- break;
- case ChDec:
- refAddC();
- next();
- break;
- case ChHexS:
- next();
- break;
- case ChHex:
- refAddC();
- next();
- break;
- case Name:
- // read the name into the ref
- parseName( TRUE );
- break;
- case DoneD:
- tmp = ref().toUInt( &ok, 10 );
- if ( ok ) {
- stringAddC( QChar(tmp) );
- } else {
- d->error = XMLERR_ERRORPARSINGREFERENCE;
- goto parseError;
- }
- charDataRead = TRUE;
- next();
- break;
- case DoneH:
- tmp = ref().toUInt( &ok, 16 );
- if ( ok ) {
- stringAddC( QChar(tmp) );
- } else {
- d->error = XMLERR_ERRORPARSINGREFERENCE;
- goto parseError;
- }
- charDataRead = TRUE;
- next();
- break;
- case DoneN:
- if ( !processReference( charDataRead, context ) )
- goto parseError;
- next();
- break;
- }
- // no input is read after this
- switch ( state ) {
- case DoneD:
- return TRUE;
- case DoneH:
- return TRUE;
- case DoneN:
- return TRUE;
- case -1:
- // Error
- d->error = XMLERR_ERRORPARSINGREFERENCE;
- goto parseError;
- }
-
- }
-
- return TRUE;
-
-parseError:
- reportParseError();
- return FALSE;
-}
-
-/*!
- Helper function for parseReference()
-*/
-bool QXmlSimpleReader::processReference( bool &charDataRead, EntityRecognitionContext context )
-{
- QString reference = ref();
- if ( reference == "amp" ) {
- if ( context == InEntityValue ) {
- // Bypassed
- stringAddC( '&' ); stringAddC( 'a' ); stringAddC( 'm' ); stringAddC( 'p' ); stringAddC( ';' );
- } else {
- // Included or Included in literal
- stringAddC( '&' );
- }
- charDataRead = TRUE;
- } else if ( reference == "lt" ) {
- if ( context == InEntityValue ) {
- // Bypassed
- stringAddC( '&' ); stringAddC( 'l' ); stringAddC( 't' ); stringAddC( ';' );
- } else {
- // Included or Included in literal
- stringAddC( '<' );
- }
- charDataRead = TRUE;
- } else if ( reference == "gt" ) {
- if ( context == InEntityValue ) {
- // Bypassed
- stringAddC( '&' ); stringAddC( 'g' ); stringAddC( 't' ); stringAddC( ';' );
- } else {
- // Included or Included in literal
- stringAddC( '>' );
- }
- charDataRead = TRUE;
- } else if ( reference == "apos" ) {
- if ( context == InEntityValue ) {
- // Bypassed
- stringAddC( '&' ); stringAddC( 'a' ); stringAddC( 'p' ); stringAddC( 'o' ); stringAddC( 's' ); stringAddC( ';' );
- } else {
- // Included or Included in literal
- stringAddC( '\'' );
- }
- charDataRead = TRUE;
- } else if ( reference == "quot" ) {
- if ( context == InEntityValue ) {
- // Bypassed
- stringAddC( '&' ); stringAddC( 'q' ); stringAddC( 'u' ); stringAddC( 'o' ); stringAddC( 't' ); stringAddC( ';' );
- } else {
- // Included or Included in literal
- stringAddC( '"' );
- }
- charDataRead = TRUE;
- } else {
- QMap<QString,QString>::Iterator it;
- it = d->entities.find( reference );
- if ( it != d->entities.end() ) {
- // "Internal General"
- switch ( context ) {
- case InContent:
- // Included
- xmlRef = it.data() + xmlRef;
- charDataRead = FALSE;
- break;
- case InAttributeValue:
- // Included in literal
- xmlRef = it.data().replace( QRegExp("\""), "&quot;" ).replace( QRegExp("'"), "&apos;" )
- + xmlRef;
- charDataRead = FALSE;
- break;
- case InEntityValue:
- {
- // Bypassed
- stringAddC( '&' );
- for ( int i=0; i<(int)reference.length(); i++ ) {
- stringAddC( reference[i] );
- }
- stringAddC( ';');
- charDataRead = TRUE;
- }
- break;
- case InDTD:
- // Forbidden
- d->error = XMLERR_INTERNALGENERALENTITYINDTD;
- charDataRead = FALSE;
- break;
- }
- } else {
- QMap<QString,QXmlSimpleReaderPrivate::ExternEntity>::Iterator itExtern;
- itExtern = d->externEntities.find( reference );
- if ( itExtern == d->externEntities.end() ) {
- // entity not declared
- // ### check this case for conformance
- if ( context == InEntityValue ) {
- // Bypassed
- stringAddC( '&' );
- for ( int i=0; i<(int)reference.length(); i++ ) {
- stringAddC( reference[i] );
- }
- stringAddC( ';');
- charDataRead = TRUE;
- } else {
- if ( contentHnd ) {
- if ( !contentHnd->skippedEntity( reference ) ) {
- d->error = contentHnd->errorString();
- return FALSE; // error
- }
- }
- }
- } else if ( (*itExtern).notation.isNull() ) {
- // "External Parsed General"
- switch ( context ) {
- case InContent:
- // Included if validating
- if ( contentHnd ) {
- if ( !contentHnd->skippedEntity( reference ) ) {
- d->error = contentHnd->errorString();
- return FALSE; // error
- }
- }
- charDataRead = FALSE;
- break;
- case InAttributeValue:
- // Forbidden
- d->error = XMLERR_EXTERNALGENERALENTITYINAV;
- charDataRead = FALSE;
- break;
- case InEntityValue:
- {
- // Bypassed
- stringAddC( '&' );
- for ( int i=0; i<(int)reference.length(); i++ ) {
- stringAddC( reference[i] );
- }
- stringAddC( ';');
- charDataRead = TRUE;
- }
- break;
- case InDTD:
- // Forbidden
- d->error = XMLERR_EXTERNALGENERALENTITYINDTD;
- charDataRead = FALSE;
- break;
- }
- } else {
- // "Unparsed"
- // ### notify for "Occurs as Attribute Value" missing (but this is no refence, anyway)
- // Forbidden
- d->error = XMLERR_UNPARSEDENTITYREFERENCE;
- charDataRead = FALSE;
- return FALSE; // error
- }
- }
- }
- return TRUE; // no error
-}
-
-
-/*!
- Parse over a simple string.
-
- After the string was successfully parsed, the head is on the first
- character after the string.
-*/
-bool QXmlSimpleReader::parseString( const QString& s )
-{
- signed char Done = s.length();
-
- const signed char InpCharExpected = 0; // the character that was expected
- const signed char InpUnknown = 1;
-
- signed char state = 0; // state in this function is the position in the string s
- signed char input;
-
- while ( TRUE ) {
-
- // get input
- if ( atEnd() ) {
- d->error = XMLERR_UNEXPECTEDEOF;
- goto parseError;
- }
- if ( c == s[(int)state] ) {
- input = InpCharExpected;
- } else {
- input = InpUnknown;
- }
-
- // set state according to input
- if ( input == InpCharExpected ) {
- state++;
- } else {
- // Error
- d->error = XMLERR_UNEXPECTEDCHARACTER;
- goto parseError;
- }
-
- // do some actions according to state
- next();
- // no input is read after this
- if ( state == Done ) {
- return TRUE;
- }
-
- }
-
- return TRUE;
-
-parseError:
- reportParseError();
- return FALSE;
-}
-
-
-/*!
- Inits the data values.
-*/
-void QXmlSimpleReader::init( const QXmlInputSource& i )
-{
- xml = i.data();
- xmlLength = xml.length();
- xmlRef = "";
-
- d->externParameterEntities.clear();
- d->parameterEntities.clear();
- d->externEntities.clear();
- d->entities.clear();
-
- tags.clear();
-
- d->doctype = "";
- d->xmlVersion = "";
- d->encoding = "";
- d->standalone = QXmlSimpleReaderPrivate::Unknown;
-
- lineNr = 0;
- columnNr = -1;
- pos = 0;
- next();
- d->error = XMLERR_OK;
-}
-
-/*!
- Returns TRUE if a entity with the name \a e exists,
- otherwise returns FALSE.
-*/
-bool QXmlSimpleReader::entityExist( const QString& e ) const
-{
- if ( d->parameterEntities.find(e) == d->parameterEntities.end() &&
- d->externParameterEntities.find(e) == d->externParameterEntities.end() ) {
- return FALSE;
- } else {
- return TRUE;
- }
-}
-
-void QXmlSimpleReader::reportParseError()
-{
- if ( errorHnd )
- errorHnd->fatalError( QXmlParseException( d->error, columnNr+1, lineNr+1 ) );
-}
-
-#endif //QT_NO_XML
diff --git a/qtools/qxml.h b/qtools/qxml.h
deleted file mode 100644
index ce40e5f..0000000
--- a/qtools/qxml.h
+++ /dev/null
@@ -1,664 +0,0 @@
-/****************************************************************************
-**
-**
-** Definition of QXmlSimpleReader and related classes.
-**
-** Created : 000518
-**
-** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
-**
-** This file is part of the XML 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 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 QXML_H
-#define QXML_H
-
-#include <qmodules.h>
-
-#if !defined(QT_MODULE_XML)
-#define QM_EXPORT
-#else
-#define QM_EXPORT Q_EXPORT
-#endif
-
-#ifndef QT_H
-#include <qtextstream.h>
-#include <qfile.h>
-#include <qstring.h>
-#include <qstringlist.h>
-#include <qvaluestack.h>
-#include <qmap.h>
-#endif // QT_H
-
-#ifndef QT_NO_XML
-
-class QXmlNamespaceSupport;
-class QXmlAttributes;
-class QXmlContentHandler;
-class QXmlDefaultHandler;
-class QXmlDTDHandler;
-class QXmlEntityResolver;
-class QXmlErrorHandler;
-class QXmlLexicalHandler;
-class QXmlDeclHandler;
-class QXmlInputSource;
-class QXmlLocator;
-class QXmlNamespaceSupport;
-class QXmlParseException;
-
-class QXmlReader;
-class QXmlSimpleReader;
-
-class QXmlSimpleReaderPrivate;
-class QXmlNamespaceSupportPrivate;
-class QXmlAttributesPrivate;
-class QXmlInputSourcePrivate;
-class QXmlParseExceptionPrivate;
-class QXmlLocatorPrivate;
-class QXmlDefaultHandlerPrivate;
-
-
-//
-// SAX Namespace Support
-//
-
-#if defined(Q_TEMPLATEDLL)
-// MOC_SKIP_BEGIN
-template class QM_EXPORT QMap<QString, QString>;
-template class QM_EXPORT QValueStack<QMap<QString, QString> >;
-template class QM_EXPORT QValueStack<QString>;
-// MOC_SKIP_END
-#endif
-
-class QM_EXPORT QXmlNamespaceSupport
-{
-public:
- QXmlNamespaceSupport();
- ~QXmlNamespaceSupport();
-
- void setPrefix( const QString&, const QString& );
-
- QString prefix( const QString& ) const;
- QString uri( const QString& ) const;
- void splitName( const QString&, QString&, QString& ) const;
- void processName( const QString&, bool, QString&, QString& ) const;
- QStringList prefixes() const;
- QStringList prefixes( const QString& ) const;
-
- void pushContext();
- void popContext();
- void reset();
-private:
- QValueStack<QMap<QString, QString> > nsStack;
- QMap<QString, QString> ns;
-
- QXmlNamespaceSupportPrivate *d;
-};
-
-
-//
-// SAX Attributes
-//
-
-class QM_EXPORT QXmlAttributes
-{
-public:
- QXmlAttributes() {}
- virtual ~QXmlAttributes() {}
-
- int index( const QString& qName ) const;
- int index( const QString& uri, const QString& localPart ) const;
- int length() const;
- QString localName( int index ) const;
- QString qName( int index ) const;
- QString uri( int index ) const;
- QString type( int index ) const;
- QString type( const QString& qName ) const;
- QString type( const QString& uri, const QString& localName ) const;
- QString value( int index ) const;
- QString value( const QString& qName ) const;
- QString value( const QString& uri, const QString& localName ) const;
-
-private:
- QStringList qnameList;
- QStringList uriList;
- QStringList localnameList;
- QStringList valueList;
-
- QXmlAttributesPrivate *d;
-
- friend class QXmlSimpleReader;
-};
-
-//
-// SAX Input Source
-//
-
-class QM_EXPORT QXmlInputSource
-{
-public:
- QXmlInputSource();
- QXmlInputSource( QTextStream& stream );
- QXmlInputSource( QFile& file );
- virtual ~QXmlInputSource();
-
- virtual const QString& data() const;
- virtual void setData( const QString& d );
-
-private:
- void readInput( QByteArray& rawData );
-
- QString input;
-
- QXmlInputSourcePrivate *d;
-};
-
-//
-// SAX Exception Classes
-//
-
-class QM_EXPORT QXmlParseException
-{
-public:
- QXmlParseException( const QString& name="", int c=-1, int l=-1, const QString& p="", const QString& s="" )
- : msg( name ), column( c ), line( l ), pub( p ), sys( s )
- { }
-
- int columnNumber() const;
- int lineNumber() const;
- QString publicId() const;
- QString systemId() const;
- QString message() const;
-
-private:
- QString msg;
- int column;
- int line;
- QString pub;
- QString sys;
-
- QXmlParseExceptionPrivate *d;
-};
-
-
-//
-// XML Reader
-//
-
-class QM_EXPORT QXmlReader
-{
-public:
- virtual bool feature( const QString& name, bool *ok = 0 ) const = 0;
- virtual void setFeature( const QString& name, bool value ) = 0;
- virtual bool hasFeature( const QString& name ) const = 0;
- virtual void* property( const QString& name, bool *ok = 0 ) const = 0;
- virtual void setProperty( const QString& name, void* value ) = 0;
- virtual bool hasProperty( const QString& name ) const = 0;
- virtual void setEntityResolver( QXmlEntityResolver* handler ) = 0;
- virtual QXmlEntityResolver* entityResolver() const = 0;
- virtual void setDTDHandler( QXmlDTDHandler* handler ) = 0;
- virtual QXmlDTDHandler* DTDHandler() const = 0;
- virtual void setContentHandler( QXmlContentHandler* handler ) = 0;
- virtual QXmlContentHandler* contentHandler() const = 0;
- virtual void setErrorHandler( QXmlErrorHandler* handler ) = 0;
- virtual QXmlErrorHandler* errorHandler() const = 0;
- virtual void setLexicalHandler( QXmlLexicalHandler* handler ) = 0;
- virtual QXmlLexicalHandler* lexicalHandler() const = 0;
- virtual void setDeclHandler( QXmlDeclHandler* handler ) = 0;
- virtual QXmlDeclHandler* declHandler() const = 0;
- virtual bool parse( const QXmlInputSource& input ) = 0;
-};
-
-class QM_EXPORT QXmlSimpleReader : public QXmlReader
-{
-public:
- QXmlSimpleReader();
- virtual ~QXmlSimpleReader();
-
- bool feature( const QString& name, bool *ok = 0 ) const;
- void setFeature( const QString& name, bool value );
- bool hasFeature( const QString& name ) const;
-
- void* property( const QString& name, bool *ok = 0 ) const;
- void setProperty( const QString& name, void* value );
- bool hasProperty( const QString& name ) const;
-
- void setEntityResolver( QXmlEntityResolver* handler );
- QXmlEntityResolver* entityResolver() const;
- void setDTDHandler( QXmlDTDHandler* handler );
- QXmlDTDHandler* DTDHandler() const;
- void setContentHandler( QXmlContentHandler* handler );
- QXmlContentHandler* contentHandler() const;
- void setErrorHandler( QXmlErrorHandler* handler );
- QXmlErrorHandler* errorHandler() const;
- void setLexicalHandler( QXmlLexicalHandler* handler );
- QXmlLexicalHandler* lexicalHandler() const;
- void setDeclHandler( QXmlDeclHandler* handler );
- QXmlDeclHandler* declHandler() const;
-
- bool parse( const QXmlInputSource& input );
-
-private:
- // variables
- QXmlContentHandler* contentHnd;
- QXmlErrorHandler* errorHnd;
- QXmlDTDHandler* dtdHnd;
- QXmlEntityResolver* entityRes;
- QXmlLexicalHandler* lexicalHnd;
- QXmlDeclHandler* declHnd;
-
- QChar c; // the character at reading position
- int lineNr; // number of line
- int columnNr; // position in line
- int pos; // position in string
-
- int namePos;
- QChar nameArray[256]; // only used for names
- QString nameValue; // only used for names
- int refPos;
- QChar refArray[256]; // only used for references
- QString refValue; // only used for references
- int stringPos;
- QChar stringArray[256]; // used for any other strings that are parsed
- QString stringValue; // used for any other strings that are parsed
-
- QString xml;
- int xmlLength;
- QString xmlRef; // used for parsing of entity references
-
- QValueStack<QString> tags;
-
- QXmlSimpleReaderPrivate* d;
-
- static const QChar QEOF;
-
- // inlines
- virtual bool is_S( const QChar& );
- virtual bool is_Letter( const QChar& );
- virtual bool is_NameBeginning( const QChar& );
- virtual bool is_Digit( const QChar& );
- virtual bool is_CombiningChar( const QChar& );
- virtual bool is_Extender( const QChar& );
- virtual bool is_NameChar( const QChar& );
-
- QString& string();
- void stringClear();
- void stringAddC();
- void stringAddC(const QChar&);
- QString& name();
- void nameClear();
- void nameAddC();
- void nameAddC(const QChar&);
- QString& ref();
- void refClear();
- void refAddC();
- void refAddC(const QChar&);
-
- // used by parseReference() and parsePEReference()
- enum EntityRecognitionContext { InContent, InAttributeValue, InEntityValue, InDTD };
-
- // private functions
- void eat_ws();
- void next_eat_ws();
-
- void next();
- bool atEnd();
-
- void init( const QXmlInputSource& i );
-
- bool entityExist( const QString& ) const;
-
- bool parseProlog();
- bool parseElement();
- bool parseElementEmptyTag( bool &t, QString &uri, QString &lname );
- bool parseElementETagBegin2();
- bool parseElementAttribute( QString &prefix, QString &uri, QString &lname );
- bool parseMisc();
- bool parseContent();
-
- bool parsePI(bool xmldecl=FALSE);
- bool parseDoctype();
- bool parseComment();
-
- bool parseName( bool useRef=FALSE );
- bool parseNmtoken();
- bool parseAttribute();
- bool parseReference( bool &charDataRead, EntityRecognitionContext context );
- bool processReference( bool &charDataRead, EntityRecognitionContext context );
-
- bool parseExternalID( bool allowPublicID = FALSE );
- bool parsePEReference( EntityRecognitionContext context );
- bool parseMarkupdecl();
- bool parseAttlistDecl();
- bool parseAttType();
- bool parseAttValue();
- bool parseElementDecl();
- bool parseNotationDecl();
- bool parseChoiceSeq();
- bool parseEntityDecl();
- bool parseEntityValue();
-
- bool parseString( const QString& s );
-
- void reportParseError();
-
- friend class QXmlSimpleReaderPrivate;
- friend class QXmlLocator;
-};
-
-//
-// SAX Locator
-//
-
-class QM_EXPORT QXmlLocator
-{
-public:
- QXmlLocator( QXmlSimpleReader* parent )
- { reader = parent; }
- ~QXmlLocator()
- { }
-
- int columnNumber();
- int lineNumber();
-// QString getPublicId()
-// QString getSystemId()
-
-private:
- QXmlSimpleReader* reader;
-
- QXmlLocatorPrivate *d;
-};
-
-//
-// SAX handler classes
-//
-
-class QM_EXPORT QXmlContentHandler
-{
-public:
- virtual void setDocumentLocator( QXmlLocator* locator ) = 0;
- virtual bool startDocument() = 0;
- virtual bool endDocument() = 0;
- virtual bool startPrefixMapping( const QString& prefix, const QString& uri ) = 0;
- virtual bool endPrefixMapping( const QString& prefix ) = 0;
- virtual bool startElement( const QString& namespaceURI, const QString& localName, const QString& qName, const QXmlAttributes& atts ) = 0;
- virtual bool endElement( const QString& namespaceURI, const QString& localName, const QString& qName ) = 0;
- virtual bool characters( const QString& ch ) = 0;
- virtual bool ignorableWhitespace( const QString& ch ) = 0;
- virtual bool processingInstruction( const QString& target, const QString& data ) = 0;
- virtual bool skippedEntity( const QString& name ) = 0;
- virtual QString errorString() = 0;
-};
-
-class QM_EXPORT QXmlErrorHandler
-{
-public:
- virtual bool warning( const QXmlParseException& exception ) = 0;
- virtual bool error( const QXmlParseException& exception ) = 0;
- virtual bool fatalError( const QXmlParseException& exception ) = 0;
- virtual QString errorString() = 0;
-};
-
-class QM_EXPORT QXmlDTDHandler
-{
-public:
- virtual bool notationDecl( const QString& name, const QString& publicId, const QString& systemId ) = 0;
- virtual bool unparsedEntityDecl( const QString& name, const QString& publicId, const QString& systemId, const QString& notationName ) = 0;
- virtual QString errorString() = 0;
-};
-
-class QM_EXPORT QXmlEntityResolver
-{
-public:
- virtual bool resolveEntity( const QString& publicId, const QString& systemId, QXmlInputSource* ret ) = 0;
- virtual QString errorString() = 0;
-};
-
-class QM_EXPORT QXmlLexicalHandler
-{
-public:
- virtual bool startDTD( const QString& name, const QString& publicId, const QString& systemId ) = 0;
- virtual bool endDTD() = 0;
-// virtual bool startEntity( const QString& name ) = 0;
-// virtual bool endEntity( const QString& name ) = 0;
- virtual bool startCDATA() = 0;
- virtual bool endCDATA() = 0;
- virtual bool comment( const QString& ch ) = 0;
- virtual QString errorString() = 0;
-};
-
-class QM_EXPORT QXmlDeclHandler
-{
-public:
- virtual bool attributeDecl( const QString& eName, const QString& aName, const QString& type, const QString& valueDefault, const QString& value ) = 0;
- virtual bool internalEntityDecl( const QString& name, const QString& value ) = 0;
- virtual bool externalEntityDecl( const QString& name, const QString& publicId, const QString& systemId ) = 0;
- virtual QString errorString() = 0;
-};
-
-
-class QM_EXPORT QXmlDefaultHandler : public QXmlContentHandler, public QXmlErrorHandler, public QXmlDTDHandler, public QXmlEntityResolver, public QXmlLexicalHandler, public QXmlDeclHandler
-{
-public:
- QXmlDefaultHandler() { }
- virtual ~QXmlDefaultHandler() { }
-
- void setDocumentLocator( QXmlLocator* locator );
- bool startDocument();
- bool endDocument();
- bool startPrefixMapping( const QString& prefix, const QString& uri );
- bool endPrefixMapping( const QString& prefix );
- bool startElement( const QString& namespaceURI, const QString& localName, const QString& qName, const QXmlAttributes& atts );
- bool endElement( const QString& namespaceURI, const QString& localName, const QString& qName );
- bool characters( const QString& ch );
- bool ignorableWhitespace( const QString& ch );
- bool processingInstruction( const QString& target, const QString& data );
- bool skippedEntity( const QString& name );
-
- bool warning( const QXmlParseException& exception );
- bool error( const QXmlParseException& exception );
- bool fatalError( const QXmlParseException& exception );
-
- bool notationDecl( const QString& name, const QString& publicId, const QString& systemId );
- bool unparsedEntityDecl( const QString& name, const QString& publicId, const QString& systemId, const QString& notationName );
-
- bool resolveEntity( const QString& publicId, const QString& systemId, QXmlInputSource* ret );
-
- bool startDTD( const QString& name, const QString& publicId, const QString& systemId );
- bool endDTD();
-// bool startEntity( const QString& name );
-// bool endEntity( const QString& name );
- bool startCDATA();
- bool endCDATA();
- bool comment( const QString& ch );
-
- bool attributeDecl( const QString& eName, const QString& aName, const QString& type, const QString& valueDefault, const QString& value );
- bool internalEntityDecl( const QString& name, const QString& value );
- bool externalEntityDecl( const QString& name, const QString& publicId, const QString& systemId );
-
- QString errorString();
-
-private:
- QXmlDefaultHandlerPrivate *d;
-};
-
-#ifdef _WS_QWS_
-#ifdef QT_XML_CPP
-#define inline
-#else
-#define QT_NO_XML_INLINE
-#endif
-#endif
-
-#ifndef QT_NO_XML_INLINE
-//
-// inlines
-//
-
-inline bool QXmlSimpleReader::is_S(const QChar& ch)
-{ return ch==' ' || ch=='\t' || ch=='\n' || ch=='\r'; }
-
-inline bool QXmlSimpleReader::is_Letter( const QChar& ch )
-{ return ch.isLetter(); }
-
-inline bool QXmlSimpleReader::is_NameBeginning( const QChar& ch )
-{ return ch=='_' || ch==':' || ch.isLetter(); }
-
-inline bool QXmlSimpleReader::is_Digit( const QChar& ch )
-{ return ch.isDigit(); }
-
-inline bool QXmlSimpleReader::is_CombiningChar( const QChar& )
-{ return FALSE; }
-
-inline bool QXmlSimpleReader::is_Extender( const QChar& )
-{ return FALSE; }
-
-inline bool QXmlSimpleReader::is_NameChar( const QChar& ch )
-{
- return ch=='.' || ch=='-' || ch=='_' || ch==':' ||
- is_Letter(ch) || is_Digit(ch) ||
- is_CombiningChar(ch) || is_Extender(ch);
-}
-
-inline void QXmlSimpleReader::next()
-{
- if ( !xmlRef.isEmpty() ) {
- c = xmlRef[0];
- xmlRef.remove( 0, 1 );
- } else {
- if ( c=='\n' || c=='\r' ) {
- lineNr++;
- columnNr = -1;
- }
- if ( pos >= xmlLength ) {
- c = QEOF;
- } else {
- c = xml[pos];
- columnNr++;
- pos++;
- }
- }
-}
-
-inline bool QXmlSimpleReader::atEnd()
-{ return c == QEOF; }
-
-inline void QXmlSimpleReader::eat_ws()
-{ while ( !atEnd() && is_S(c) ) next(); }
-
-inline void QXmlSimpleReader::next_eat_ws()
-{ next(); eat_ws(); }
-
-
-// use buffers instead of QString::operator+= when single characters are read
-inline QString& QXmlSimpleReader::string()
-{
- stringValue += QString( stringArray, stringPos );
- stringPos = 0;
- return stringValue;
-}
-inline QString& QXmlSimpleReader::name()
-{
- nameValue += QString( nameArray, namePos );
- namePos = 0;
- return nameValue;
-}
-inline QString& QXmlSimpleReader::ref()
-{
- refValue += QString( refArray, refPos );
- refPos = 0;
- return refValue;
-}
-
-inline void QXmlSimpleReader::stringClear()
-{ stringValue = ""; stringPos = 0; }
-inline void QXmlSimpleReader::nameClear()
-{ nameValue = ""; namePos = 0; }
-inline void QXmlSimpleReader::refClear()
-{ refValue = ""; refPos = 0; }
-
-inline void QXmlSimpleReader::stringAddC()
-{
- if ( stringPos >= 256 ) {
- stringValue += QString( stringArray, stringPos );
- stringPos = 0;
- }
- stringArray[stringPos++] = c;
-}
-inline void QXmlSimpleReader::nameAddC()
-{
- if ( namePos >= 256 ) {
- nameValue += QString( nameArray, namePos );
- namePos = 0;
- }
- nameArray[namePos++] = c;
-}
-inline void QXmlSimpleReader::refAddC()
-{
- if ( refPos >= 256 ) {
- refValue += QString( refArray, refPos );
- refPos = 0;
- }
- refArray[refPos++] = c;
-}
-
-inline void QXmlSimpleReader::stringAddC(const QChar& ch)
-{
- if ( stringPos >= 256 ) {
- stringValue += QString( stringArray, stringPos );
- stringPos = 0;
- }
- stringArray[stringPos++] = ch;
-}
-inline void QXmlSimpleReader::nameAddC(const QChar& ch)
-{
- if ( namePos >= 256 ) {
- nameValue += QString( nameArray, namePos );
- namePos = 0;
- }
- nameArray[namePos++] = ch;
-}
-inline void QXmlSimpleReader::refAddC(const QChar& ch)
-{
- if ( refPos >= 256 ) {
- refValue += QString( refArray, refPos );
- refPos = 0;
- }
- refArray[refPos++] = ch;
-}
-#endif
-
-#ifdef _WS_QWS_
-#ifdef QT_XML_CPP
-#undef inline
-#endif
-#endif
-
-#endif //QT_NO_XML
-
-#endif
diff --git a/qtools/scstring.cpp b/qtools/scstring.cpp
deleted file mode 100644
index 18a5492..0000000
--- a/qtools/scstring.cpp
+++ /dev/null
@@ -1,785 +0,0 @@
-/******************************************************************************
- *
- * Copyright (C) 1997-2004 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 "qcstring.h"
-#ifndef SMALLSTRING
-#include "qcstring.cpp"
-#else
-
-#include <qstring.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <stdarg.h>
-#include <ctype.h>
-#include <qregexp.h>
-#include <qdatastream.h>
-
-
-SCString::SCString(int size)
-{
- if (size>0)
- {
- m_data = (char *)malloc(size);
- if (m_data)
- {
- if (size>1) memset(m_data,' ',size-1);
- m_data[size-1]='\0';
- }
- }
- else
- {
- m_data=0;
- }
-}
-
-SCString::SCString( const SCString &s )
-{
- duplicate(s);
-}
-
-SCString::SCString( const char *str )
-{
- duplicate(str);
-}
-
-SCString::SCString( const char *str, uint maxlen )
-{
- uint l;
- if (str && ( l = QMIN(qstrlen(str),maxlen) ))
- {
- m_data=(char *)malloc(l+1);
- strncpy(m_data,str,maxlen);
- m_data[l]='\0';
- }
- else
- {
- m_data=0;
- }
-}
-
-SCString::~SCString()
-{
- if (m_data) free(m_data);
- m_data=0;
-}
-
-SCString &SCString::assign( const char *str )
-{
- if (m_data) free(m_data);
- duplicate(str);
- return *this;
-}
-
-bool SCString::resize( uint newlen )
-{
- if (newlen==0)
- {
- if (m_data) { free(m_data); m_data=0; }
- return TRUE;
- }
- if (m_data==0) // newlen>0
- {
- m_data = (char *)malloc(newlen);
- }
- else
- {
- m_data = (char *)realloc(m_data,newlen);
- }
- if (m_data==0) return FALSE;
- m_data[newlen-1]='\0';
- return TRUE;
-}
-
-bool SCString::fill( char c, int len )
-{
- uint l=length();
- if (len<0) len=l;
- if ((uint)len!=l)
- {
- if (m_data) free(m_data);
- if (len>0)
- {
- m_data=(char *)malloc(len+1);
- if (m_data==0) return FALSE;
- m_data[len]='\0';
- }
- else
- {
- m_data=0;
- }
- }
- if (len>0)
- {
- uint i;
- for (i=0;i<(uint)len;i++) m_data[i]=c;
- }
- return TRUE;
-}
-
-SCString &SCString::sprintf( const char *format, ... )
-{
- va_list ap;
- va_start( ap, format );
- uint l = length();
- const uint minlen=256;
- if (l<minlen)
- {
- if (m_data)
- m_data = (char *)realloc(m_data,minlen);
- else
- m_data = (char *)malloc(minlen);
- }
- vsprintf( m_data, format, ap );
- resize( qstrlen(m_data) + 1 ); // truncate
- va_end( ap );
- return *this;
-}
-
-
-int SCString::find( char c, int index, bool cs ) const
-{
- uint len = length();
- if ( m_data==0 || (uint)index>len ) // index outside string
- return -1;
- register const char *d;
- if ( cs ) // case sensitive
- {
- d = strchr( m_data+index, c );
- }
- else
- {
- d = m_data+index;
- c = tolower( (uchar) c );
- while ( *d && tolower((uchar) *d) != c )
- d++;
- if ( !*d && c ) // not found
- d = 0;
- }
- return d ? (int)(d - m_data) : -1;
-}
-
-int SCString::find( const char *str, int index, bool cs ) const
-{
- uint l = length();
- if ( m_data==0 || (uint)index > l ) // index outside string
- return -1;
- if ( !str ) // no search string
- return -1;
- if ( !*str ) // zero-length search string
- return index;
- register const char *d;
- if ( cs ) // case sensitive
- {
- d = strstr( m_data+index, str );
- }
- else // case insensitive
- {
- d = m_data+index;
- int len = qstrlen( str );
- while ( *d )
- {
- if ( qstrnicmp(d, str, len) == 0 )
- break;
- d++;
- }
- if ( !*d ) // not found
- d = 0;
- }
- return d ? (int)(d - m_data) : -1;
-}
-
-int SCString::find( const QRegExp &rx, int index ) const
-{
- QString d = QString::fromLatin1( m_data );
- return d.find( rx, index );
-}
-
-int SCString::findRev( char c, int index, bool cs) const
-{
- const char *b = m_data;
- const char *d;
- uint len = length();
- if ( b == 0 ) return -1; // empty string
- if ( index < 0 ) // neg index ==> start from end
- {
- if ( len == 0 ) return -1;
- if ( cs )
- {
- d = strrchr( b, c );
- return d ? (int)(d - b) : -1;
- }
- index = len;
- }
- else if ( (uint)index > len ) // bad index
- {
- return -1;
- }
- d = b+index;
- if ( cs ) // case sensitive
- {
- while ( d >= b && *d != c )
- d--;
- }
- else // case insensitive
- {
- c = tolower( (uchar) c );
- while ( d >= b && tolower((uchar) *d) != c )
- d--;
- }
- return d >= b ? (int)(d - b) : -1;
-}
-
-int SCString::findRev( const char *str, int index, bool cs) const
-{
- int slen = qstrlen(str);
- uint len = length();
- if ( index < 0 ) // neg index ==> start from end
- index = len-slen;
- else if ( (uint)index > len ) // bad index
- return -1;
- else if ( (uint)(index + slen) > len ) // str would be too long
- index = len - slen;
- if ( index < 0 )
- return -1;
-
- register char *d = m_data + index;
- if ( cs ) // case sensitive
- {
- for ( int i=index; i>=0; i-- )
- if ( qstrncmp(d--,str,slen)==0 )
- return i;
- }
- else // case insensitive
- {
- for ( int i=index; i>=0; i-- )
- if ( qstrnicmp(d--,str,slen)==0 )
- return i;
- }
- return -1;
-
-}
-
-int SCString::findRev( const QRegExp &rx, int index ) const
-{
- QString d = QString::fromLatin1( m_data );
- return d.findRev( rx, index );
-}
-
-int SCString::contains( char c, bool cs ) const
-{
- int count = 0;
- char *d = m_data;
- if ( !d )
- return 0;
- if ( cs ) // case sensitive
- {
- while ( *d )
- if ( *d++ == c )
- count++;
- }
- else // case insensitive
- {
- c = tolower( (uchar) c );
- while ( *d ) {
- if ( tolower((uchar) *d) == c )
- count++;
- d++;
- }
- }
- return count;
-}
-
-int SCString::contains( const char *str, bool cs ) const
-{
- int count = 0;
- char *d = data();
- if ( !d )
- return 0;
- int len = qstrlen( str );
- while ( *d ) // counts overlapping strings
- {
- if ( cs )
- {
- if ( qstrncmp( d, str, len ) == 0 )
- count++;
- }
- else
- {
- if ( qstrnicmp(d, str, len) == 0 )
- count++;
- }
- d++;
- }
- return count;
-}
-
-int SCString::contains( const QRegExp &rx ) const
-{
- QString d = QString::fromLatin1( m_data );
- return d.contains( rx );
-}
-
-SCString SCString::left( uint len ) const
-{
- if ( isEmpty() )
- {
- return SCString();
- }
- else if ( len >= length() )
- {
- return *this;
- }
- else
- {
- SCString s( len+1 );
- strncpy( s.data(), m_data, len );
- *(s.data()+len) = '\0';
- return s;
- }
-}
-
-SCString SCString::right( uint len ) const
-{
- if ( isEmpty() )
- {
- return SCString();
- }
- else
- {
- uint l = length();
- if ( len > l ) len = l;
- char *p = m_data + (l - len);
- return SCString( p );
- }
-}
-
-SCString SCString::mid( uint index, uint len) const
-{
- uint slen = length();
- if ( len == 0xffffffff ) len = slen-index;
- if ( isEmpty() || index >= slen )
- {
- return SCString();
- }
- else
- {
- register char *p = data()+index;
- SCString s( len+1 );
- strncpy( s.data(), p, len );
- *(s.data()+len) = '\0';
- return s;
- }
-}
-
-SCString SCString::lower() const
-{
- SCString s( m_data );
- register char *p = s.data();
- if ( p )
- {
- while ( *p )
- {
- *p = tolower((uchar) *p);
- p++;
- }
- }
- return s;
-}
-
-SCString SCString::upper() const
-{
- SCString s( m_data );
- register char *p = s.data();
- if ( p ) {
- while ( *p ) {
- *p = toupper((uchar)*p);
- p++;
- }
- }
- return s;
-}
-
-SCString SCString::stripWhiteSpace() const
-{
- if ( isEmpty() ) // nothing to do
- return *this;
-
- register char *s = m_data;
- int reslen = length();
- if ( !isspace((uchar) s[0]) && !isspace((uchar) s[reslen-1]) )
- return *this; // returns a copy
-
- SCString result(s);
- s = result.data();
- 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 SCString();
- }
- while ( end && isspace((uchar) s[end]) ) // skip white space from end
- end--;
- end -= start - 1;
- memmove( result.data(), &s[start], end );
- result.resize( end + 1 );
- return result;
-}
-
-SCString SCString::simplifyWhiteSpace() const
-{
- if ( isEmpty() ) // nothing to do
- return *this;
-
- SCString result( length()+1 );
- char *from = data();
- char *to = result.data();
- char *first = to;
- while ( TRUE )
- {
- while ( *from && isspace((uchar) *from) )
- from++;
- while ( *from && !isspace((uchar)*from) )
- *to++ = *from++;
- if ( *from )
- *to++ = 0x20; // ' '
- else
- break;
- }
- if ( to > first && *(to-1) == 0x20 )
- to--;
- *to = '\0';
- result.resize( (int)((long)to - (long)result.data()) + 1 );
- return result;
-}
-
-SCString &SCString::insert( uint index, const char *s )
-{
- int len = qstrlen(s);
- if ( len == 0 )
- return *this;
- uint olen = length();
- int nlen = olen + len;
- if ( index >= olen ) // insert after end of string
- {
- m_data = (char *)realloc(m_data,nlen+index-olen+1);
- if ( m_data )
- {
- memset( m_data+olen, ' ', index-olen );
- memcpy( m_data+index, s, len+1 );
- }
- }
- else if ( (m_data = (char *)realloc(m_data,nlen+1)) ) // normal insert
- {
- memmove( m_data+index+len, m_data+index, olen-index+1 );
- memcpy( m_data+index, s, len );
- }
- return *this;
-}
-
-SCString &SCString::insert( uint index, char c ) // insert char
-{
- char buf[2];
- buf[0] = c;
- buf[1] = '\0';
- return insert( index, buf );
-}
-
-SCString& SCString::operator+=( const char *str )
-{
- if ( !str ) return *this; // nothing to append
- uint len1 = length();
- uint len2 = qstrlen(str);
- char *newData = (char *)realloc( m_data, len1 + len2 + 1 );
- if (newData)
- {
- m_data = newData;
- memcpy( m_data + len1, str, len2 + 1 );
- }
- return *this;
-}
-
-SCString &SCString::operator+=( char c )
-{
- uint len = length();
- char *newData = (char *)realloc( m_data, length()+2 );
- if (newData)
- {
- m_data = newData;
- m_data[len] = c;
- m_data[len+1] = '\0';
- }
- return *this;
-}
-
-SCString &SCString::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 )
- {
- memmove( m_data+index, m_data+index+len, olen-index-len+1 );
- resize( olen-len+1 );
- }
- return *this;
-}
-
-SCString &SCString::replace( uint index, uint len, const char *s )
-{
- remove( index, len );
- insert( index, s );
- return *this;
-}
-
-SCString &SCString::replace( const QRegExp &rx, const char *str )
-{
- QString d = QString::fromLatin1( m_data );
- QString r = QString::fromLatin1( str );
- d.replace( rx, r );
- operator=( d.ascii() );
- return *this;
-}
-
-long SCString::toLong( bool *ok ) const
-{
- QString s(m_data);
- return s.toLong(ok);
-}
-
-ulong SCString::toULong( bool *ok ) const
-{
- QString s(m_data);
- return s.toULong(ok);
-}
-
-short SCString::toShort( bool *ok ) const
-{
- QString s(m_data);
- return s.toShort(ok);
-}
-
-ushort SCString::toUShort( bool *ok ) const
-{
- QString s(m_data);
- return s.toUShort(ok);
-}
-
-int SCString::toInt( bool *ok ) const
-{
- QString s(m_data);
- return s.toInt(ok);
-}
-
-uint SCString::toUInt( bool *ok ) const
-{
- QString s(m_data);
- return s.toUInt(ok);
-}
-
-SCString &SCString::setNum( long n )
-{
- char buf[20];
- register 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;
-}
-
-SCString &SCString::setNum( ulong n )
-{
- char buf[20];
- register char *p = &buf[19];
- *p = '\0';
- do
- {
- *--p = ((int)(n%10)) + '0';
- n /= 10;
- } while ( n );
- operator=( p );
- return *this;
-}
-
-void SCString::msg_index( uint index )
-{
-#if defined(CHECK_RANGE)
- qWarning( "SCString::at: Absolute index %d out of range", index );
-#else
- Q_UNUSED( index )
-#endif
-}
-
-bool SCString::stripPrefix(const char *prefix)
-{
- if (prefix==0) return FALSE;
- uint plen = qstrlen(prefix);
- if (m_data && qstrncmp(prefix,m_data,plen)==0) // prefix matches
- {
- uint len = qstrlen(m_data);
- uint newlen = len-plen+1;
- qmemmove(m_data,m_data+plen,newlen);
- resize(newlen);
- return TRUE;
- }
- return FALSE;
-}
-
-//---------------------------------------------------------------------------
-
-void *qmemmove( void *dst, const void *src, uint len )
-{
- register char *d;
- register char *s;
- if ( dst > src ) {
- d = (char *)dst + len - 1;
- s = (char *)src + len - 1;
- while ( len-- )
- *d-- = *s--;
- } else if ( dst < src ) {
- d = (char *)dst;
- s = (char *)src;
- while ( len-- )
- *d++ = *s++;
- }
- return dst;
-}
-
-char *qstrdup( const char *str )
-{
- if ( !str )
- return 0;
- char *dst = new char[strlen(str)+1];
- CHECK_PTR( dst );
- return strcpy( dst, str );
-}
-
-char *qstrncpy( char *dst, const char *src, uint len )
-{
- if ( !src )
- return 0;
- strncpy( dst, src, len );
- if ( len > 0 )
- dst[len-1] = '\0';
- return dst;
-}
-
-int qstricmp( const char *str1, const char *str2 )
-{
- register const uchar *s1 = (const uchar *)str1;
- register const uchar *s2 = (const uchar *)str2;
- int res;
- uchar c;
- if ( !s1 || !s2 )
- return s1 == s2 ? 0 : (int)((long)s2 - (long)s1);
- for ( ; !(res = (c=tolower(*s1)) - tolower(*s2)); s1++, s2++ )
- if ( !c ) // strings are equal
- break;
- return res;
-}
-
-int qstrnicmp( const char *str1, const char *str2, uint len )
-{
- register const uchar *s1 = (const uchar *)str1;
- register const uchar *s2 = (const uchar *)str2;
- int res;
- uchar c;
- if ( !s1 || !s2 )
- return (int)((long)s2 - (long)s1);
- for ( ; len--; s1++, s2++ ) {
- if ( (res = (c=tolower(*s1)) - tolower(*s2)) )
- return res;
- if ( !c ) // strings are equal
- break;
- }
- return 0;
-}
-
-#ifndef QT_NO_DATASTREAM
-
-QDataStream &operator<<( QDataStream &s, const QByteArray &a )
-{
- return s.writeBytes( a.data(), a.size() );
-}
-
-QDataStream &operator>>( QDataStream &s, QByteArray &a )
-{
- Q_UINT32 len;
- s >> len; // read size of array
- if ( len == 0 || s.eof() ) { // end of file reached
- a.resize( 0 );
- return s;
- }
- if ( !a.resize( (uint)len ) ) { // resize array
-#if defined(CHECK_NULL)
- qWarning( "QDataStream: Not enough memory to read QByteArray" );
-#endif
- len = 0;
- }
- if ( len > 0 ) // not null array
- s.readRawBytes( a.data(), (uint)len );
- return s;
-}
-
-QDataStream &operator<<( QDataStream &s, const SCString &str )
-{
- return s.writeBytes( str.data(), str.size() );
-}
-
-QDataStream &operator>>( QDataStream &s, SCString &str )
-{
- Q_UINT32 len;
- s >> len; // read size of string
- if ( len == 0 || s.eof() ) { // end of file reached
- str.resize( 0 );
- return s;
- }
- if ( !str.resize( (uint)len )) {// resize string
-#if defined(CHECK_NULL)
- qWarning( "QDataStream: Not enough memory to read QCString" );
-#endif
- len = 0;
- }
- if ( len > 0 ) // not null array
- s.readRawBytes( str.data(), (uint)len );
- return s;
-}
-
-#endif //QT_NO_DATASTREAM
-
-
-
-#endif
diff --git a/qtools/scstring.h b/qtools/scstring.h
deleted file mode 100644
index 08de44b..0000000
--- a/qtools/scstring.h
+++ /dev/null
@@ -1,154 +0,0 @@
-/******************************************************************************
- *
- * Copyright (C) 1997-2004 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 SCSTRING_H
-#define SCSTRING_H
-
-#include <stdlib.h>
-
-class QRegExp;
-
-/** This is an alternative implementation of QCString. It provides basically
- * the same functions but uses less memory for administration. This class
- * is just a wrapper around a plain C string requiring only 4 bytes "overhead".
- * QCString features sharing of data and stores the string length, but
- * requires 4 + 12 bytes for this (even for the empty string). As doxygen
- * uses a LOT of string during a run it saves a lot of memory to use a
- * more memory efficient implementation at the cost of relatively low
- * runtime overhead.
- */
-class SCString
-{
-public:
- SCString() : m_data(0) {} // make null string
- SCString( const SCString &s );
- SCString( int size );
- SCString( const char *str );
- SCString( const char *str, uint maxlen );
- ~SCString();
-
- SCString &operator=( const SCString &s );// deep copy
- SCString &operator=( const char *str ); // deep copy
-
- bool isNull() const;
- bool isEmpty() const;
- uint length() const;
- uint size() const { return m_data ? length()+1 : 0; }
- char * data() const { return m_data; }
- bool resize( uint newlen );
- bool truncate( uint pos );
- bool fill( char c, int len = -1 );
-
- SCString copy() const;
-
- SCString &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 QRegExp &, 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 &, 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 & ) const;
- bool stripPrefix(const char *prefix);
-
- SCString left( uint len ) const;
- SCString right( uint len ) const;
- SCString mid( uint index, uint len=0xffffffff) const;
-
- SCString lower() const;
- SCString upper() const;
-
- SCString stripWhiteSpace() const;
- SCString simplifyWhiteSpace() const;
-
- SCString &assign( const char *str );
- SCString &insert( uint index, const char * );
- SCString &insert( uint index, char );
- SCString &append( const char *s );
- SCString &prepend( const char *s );
- SCString &remove( uint index, uint len );
- SCString &replace( uint index, uint len, const char * );
- SCString &replace( const QRegExp &, const char * );
-
- short toShort( bool *ok=0 ) const;
- ushort toUShort( bool *ok=0 ) const;
- int toInt( bool *ok=0 ) const;
- uint toUInt( bool *ok=0 ) const;
- long toLong( bool *ok=0 ) const;
- ulong toULong( bool *ok=0 ) const;
-
- SCString &setNum( short );
- SCString &setNum( ushort );
- SCString &setNum( int );
- SCString &setNum( uint );
- SCString &setNum( long );
- SCString &setNum( ulong );
- QCString &setNum( float, char f='g', int prec=6 );
- QCString &setNum( double, char f='g', int prec=6 );
-
- operator const char *() const;
- SCString &operator+=( const char *str );
- SCString &operator+=( char c );
- char &at( uint index ) const;
- char &operator[]( int i ) const { return at(i); }
-
- private:
- static void msg_index( uint );
- void duplicate( const SCString &s );
- void duplicate( const char *str);
- SCString &duplicate( const char *str, int);
-
- char * m_data;
-};
-
-inline char &SCString::at( uint index ) const
-{
- return m_data[index];
-}
-
-inline void SCString::duplicate( const SCString &s )
-{
- if (!s.isEmpty())
- {
- uint l = strlen(s.data());
- m_data = (char *)malloc(l+1);
- if (m_data) memcpy(m_data,s.data(),l+1);
- }
- else
- m_data=0;
-}
-inline void SCString::duplicate( const char *str)
-{
- if (str && str[0]!='\0')
- {
- uint l = strlen(str);
- m_data = (char *)malloc(l+1);
- if (m_data) memcpy(m_data,str,l+1);
- }
- else
- m_data=0;
-}
-inline SCString &SCString::duplicate( const char *str, int)
-{
- if (m_data) free(m_data);
- duplicate(str);
- return *this;
-}
-
-#endif
-
diff --git a/src/.cvsignore b/src/.cvsignore
deleted file mode 100644
index 66f3839..0000000
--- a/src/.cvsignore
+++ /dev/null
@@ -1,25 +0,0 @@
-Makefile
-doxygen.pro
-doxytag.pro
-libdoxycfg.pro
-libdoxygen.pro
-Makefile.doxygen
-Makefile.doxytag
-Makefile.libdoxycfg
-Makefile.libdoxygen
-ce_lex.cpp
-ce_parse.cpp
-ce_parse.h
-code.cpp
-commentcnv.cpp
-config.cpp
-declinfo.cpp
-defargs.cpp
-doctokenizer.cpp
-doxytag.cpp
-pre.cpp
-scanner.cpp
-version.cpp
-commentscan.cpp
-pycode.cpp
-pyscanner.cpp
diff --git a/src/Makefile.in b/src/Makefile.in
deleted file mode 100644
index 7bc71bb..0000000
--- a/src/Makefile.in
+++ /dev/null
@@ -1,53 +0,0 @@
-
-#
-#
-#
-# Copyright (C) 1997-2005 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.
-#
-
-all: Makefile.libdoxygen Makefile.libdoxycfg Makefile.doxygen Makefile.doxytag Makefile
- $(MAKE) -f Makefile.libdoxycfg PERL=$(PERL) $@
- $(MAKE) -f Makefile.libdoxygen PERL=$(PERL) $@
- $(MAKE) -f Makefile.doxygen PERL=$(PERL) $@
- $(MAKE) -f Makefile.doxytag PERL=$(PERL) $@
-
-Makefile.libdoxygen: libdoxygen.pro libdoxygen.t
- $(ENV) $(PERL) $(TMAKE) libdoxygen.pro >Makefile.libdoxygen
-
-Makefile.libdoxycfg: libdoxycfg.pro libdoxycfg.t
- $(ENV) $(PERL) $(TMAKE) libdoxycfg.pro >Makefile.libdoxycfg
-
-Makefile.doxygen: doxygen.pro
- $(ENV) $(PERL) $(TMAKE) doxygen.pro >Makefile.doxygen
-
-Makefile.doxytag: doxytag.pro doxytag.t
- $(ENV) $(PERL) $(TMAKE) doxytag.pro >Makefile.doxytag
-
-tmake:
- $(ENV) $(PERL) $(TMAKE) libdoxygen.pro >Makefile.libdoxygen
- $(ENV) $(PERL) $(TMAKE) libdoxycfg.pro >Makefile.libdoxycfg
- $(ENV) $(PERL) $(TMAKE) doxygen.pro >Makefile.doxygen
- $(ENV) $(PERL) $(TMAKE) doxytag.pro >Makefile.doxytag
-
-clean: Makefile.libdoxygen Makefile.libdoxycfg Makefile.doxygen Makefile.doxytag
- $(MAKE) -f Makefile.libdoxygen clean
- $(MAKE) -f Makefile.libdoxycfg clean
- $(MAKE) -f Makefile.doxygen clean
- $(MAKE) -f Makefile.doxytag clean
-
-distclean: clean
- -$(RM) scanner.cpp code.cpp config.cpp pre.cpp ce_lex.cpp \
- ce_parse.cpp ce_parse.h doxytag.cpp tag.cpp commentscan.cpp \
- declinfo.cpp defargs.cpp commentcnv.cpp doctokenizer.cpp \
- pycode.cpp pyscanner.cpp
-
-FORCE:
diff --git a/src/bufstr.h b/src/bufstr.h
deleted file mode 100644
index c1cb307..0000000
--- a/src/bufstr.h
+++ /dev/null
@@ -1,107 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 _BUFSTR_H
-#define _BUFSTR_H
-
-#include "qtbc.h"
-#include <stdio.h>
-#include <stdlib.h>
-
-/*! @brief Buffer used to store strings
- *
- * This buffer is used append characters and strings. It will automatically
- * resize itself, yet provide efficient random access to the content.
- */
-class BufStr
-{
- public:
- BufStr(int size)
- : m_size(size), m_writeOffset(0), m_spareRoom(10240), m_buf(0)
- {
- m_buf = (char *)malloc(size);
- }
- ~BufStr()
- {
- free(m_buf);
- }
- void addChar(char c)
- {
- makeRoomFor(1);
- m_buf[m_writeOffset++]=c;
- }
- void addArray(const char *a,int len)
- {
- makeRoomFor(len);
- memcpy(m_buf+m_writeOffset,a,len);
- m_writeOffset+=len;
- }
- void skip(uint s)
- {
- makeRoomFor(s);
- m_writeOffset+=s;
- }
- void shrink( uint newlen )
- {
- m_writeOffset=newlen;
- resize(newlen);
- }
- void resize( uint newlen )
- {
- m_size=newlen;
- if (m_writeOffset>=m_size) // offset out of range -> enlarge
- {
- m_size=m_writeOffset+m_spareRoom;
- }
- m_buf = (char *)realloc(m_buf,m_size);
- }
- char *data() const
- {
- return m_buf;
- }
- char &at(uint i) const
- {
- return m_buf[i];
- }
- bool isEmpty() const
- {
- return m_writeOffset==0;
- }
- operator const char *() const
- {
- return m_buf;
- }
- uint curPos() const
- {
- return m_writeOffset;
- }
- private:
- void makeRoomFor(uint size)
- {
- if (m_writeOffset+size>=m_size)
- {
- resize(m_size+size+m_spareRoom);
- }
- }
- uint m_size;
- uint m_writeOffset;
- const int m_spareRoom; // 10Kb extra room to avoid frequent resizing
- char *m_buf;
-};
-
-
-#endif
diff --git a/src/classdef.cpp b/src/classdef.cpp
deleted file mode 100644
index 8bc3f38..0000000
--- a/src/classdef.cpp
+++ /dev/null
@@ -1,3022 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 <qfile.h>
-#include <qregexp.h>
-#include "classdef.h"
-#include "classlist.h"
-#include "entry.h"
-#include "doxygen.h"
-#include "membername.h"
-#include "message.h"
-#include "config.h"
-#include "util.h"
-#include "diagram.h"
-#include "language.h"
-#include "htmlhelp.h"
-#include "example.h"
-#include "outputlist.h"
-#include "dot.h"
-#include "defargs.h"
-#include "debug.h"
-#include "docparser.h"
-#include "searchindex.h"
-
-
-// constructs a new class definition
-ClassDef::ClassDef(
- const char *defFileName,int defLine,
- const char *nm,CompoundType ct,
- const char *lref,const char *fName,
- bool isSymbol)
- : Definition(defFileName,defLine,removeRedundantWhiteSpace(nm),0,0,isSymbol)
-{
- m_compType=ct;
- QCString compoundName=compoundTypeString();
- if (fName)
- {
- m_fileName=stripExtension(fName);
- }
- else
- {
- m_fileName=compoundName+m_name;
- }
- if (lref)
- {
- m_exampleSDict = 0;
- }
- else
- {
- m_exampleSDict = new ExampleSDict(17);
- }
- m_memListFileName=convertNameToFile(compoundName+m_name+"-members");
- m_inherits = new BaseClassList;
- m_inherits->setAutoDelete(TRUE);
- m_inheritedBy = new BaseClassList;
- m_inheritedBy->setAutoDelete(TRUE);
- m_allMemberNameInfoSDict = new MemberNameInfoSDict(257);
- m_allMemberNameInfoSDict->setAutoDelete(TRUE);
- visited=FALSE;
- setReference(lref);
- m_incInfo=0;
- m_tempArgs=0;
- m_prot=Public;
- m_nspace=0;
- m_fileDef=0;
- m_usesImplClassDict=0;
- m_usedByImplClassDict=0;
- m_usesIntfClassDict=0;
- memberGroupSDict = new MemberGroupSDict;
- memberGroupSDict->setAutoDelete(TRUE);
- m_innerClasses = new ClassSDict(17);
- m_subGrouping=Config_getBool("SUBGROUPING");
- m_templateInstances = 0;
- m_variableInstances = 0;
- m_templateMaster =0;
- m_templBaseClassNames = 0;
- m_artificial = FALSE;
- m_isAbstract = FALSE;
- m_isStatic = FALSE;
- m_isObjC = FALSE;
- m_membersMerged = FALSE;
- m_categoryOf = 0;
- QCString ns;
- extractNamespaceName(m_name,m_className,ns);
- //printf("m_name=%s m_className=%s ns=%s\n",m_name.data(),m_className.data(),ns.data());
-
- if (((QCString)defFileName).right(5)!=".java" &&
- guessSection(defFileName)==Entry::SOURCE_SEC)
- {
- m_isLocal=TRUE;
- }
- else
- {
- m_isLocal=FALSE;
- }
-}
-
-// destroy the class definition
-ClassDef::~ClassDef()
-{
- delete m_inherits;
- delete m_inheritedBy;
- delete m_allMemberNameInfoSDict;
- delete m_exampleSDict;
- delete m_usesImplClassDict;
- delete m_usedByImplClassDict;
- delete m_usesIntfClassDict;
- delete m_incInfo;
- delete memberGroupSDict;
- delete m_innerClasses;
- delete m_templateInstances;
- delete m_variableInstances;
- delete m_templBaseClassNames;
- delete m_tempArgs;
-}
-
-QCString ClassDef::displayName() const
-{
- static bool hideScopeNames = Config_getBool("HIDE_SCOPE_NAMES");
- static bool optimizeOutputForJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
- QCString n;
- if (hideScopeNames)
- {
- n=m_className;
- }
- else
- {
- n=qualifiedNameWithTemplateParameters();
- }
- if (optimizeOutputForJava)
- {
- n=substitute(n,"::",".");
- }
- if (m_compType==ClassDef::Protocol && n.right(2)=="-p")
- {
- n="< "+n.left(n.length()-2)+" >";
- }
- return n;
-}
-
-// inserts a base class in the inheritance list
-void ClassDef::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));
- m_inherits->append(new BaseClassDef(cd,n,p,s,t));
-}
-
-// inserts a sub class in the inherited list
-void ClassDef::insertSubClass(ClassDef *cd,Protection p,
- Specifier s,const char *t)
-{
- //printf("*** insert sub class %s into %s\n",cd->name().data(),name().data());
- m_inheritedBy->inSort(new BaseClassDef(cd,0,p,s,t));
-}
-
-void ClassDef::addMembersToMemberGroup()
-{
- ::addMembersToMemberGroup(&pubTypes,memberGroupSDict,this);
- ::addMembersToMemberGroup(&pubMethods,memberGroupSDict,this);
- ::addMembersToMemberGroup(&pubAttribs,memberGroupSDict,this);
- ::addMembersToMemberGroup(&pubSlots,memberGroupSDict,this);
- ::addMembersToMemberGroup(&signals,memberGroupSDict,this);
- ::addMembersToMemberGroup(&dcopMethods,memberGroupSDict,this);
- ::addMembersToMemberGroup(&pubStaticMethods,memberGroupSDict,this);
- ::addMembersToMemberGroup(&pubStaticAttribs,memberGroupSDict,this);
- ::addMembersToMemberGroup(&pacTypes,memberGroupSDict,this);
- ::addMembersToMemberGroup(&pacMethods,memberGroupSDict,this);
- ::addMembersToMemberGroup(&pacAttribs,memberGroupSDict,this);
- ::addMembersToMemberGroup(&pacStaticMethods,memberGroupSDict,this);
- ::addMembersToMemberGroup(&pacStaticAttribs,memberGroupSDict,this);
- ::addMembersToMemberGroup(&proTypes,memberGroupSDict,this);
- ::addMembersToMemberGroup(&proMethods,memberGroupSDict,this);
- ::addMembersToMemberGroup(&proAttribs,memberGroupSDict,this);
- ::addMembersToMemberGroup(&proSlots,memberGroupSDict,this);
- ::addMembersToMemberGroup(&proStaticMethods,memberGroupSDict,this);
- ::addMembersToMemberGroup(&proStaticAttribs,memberGroupSDict,this);
- ::addMembersToMemberGroup(&priTypes,memberGroupSDict,this);
- ::addMembersToMemberGroup(&priMethods,memberGroupSDict,this);
- ::addMembersToMemberGroup(&priAttribs,memberGroupSDict,this);
- ::addMembersToMemberGroup(&priSlots,memberGroupSDict,this);
- ::addMembersToMemberGroup(&priStaticMethods,memberGroupSDict,this);
- ::addMembersToMemberGroup(&priStaticAttribs,memberGroupSDict,this);
- ::addMembersToMemberGroup(&friends,memberGroupSDict,this);
- ::addMembersToMemberGroup(&related,memberGroupSDict,this);
- ::addMembersToMemberGroup(&properties,memberGroupSDict,this);
- ::addMembersToMemberGroup(&events,memberGroupSDict,this);
-
- // add members inside sections to their groups
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- if (mg->allMembersInSameSection() && m_subGrouping)
- {
- //printf("addToDeclarationSection(%s)\n",mg->header().data());
- mg->addToDeclarationSection();
- }
- }
-}
-
-// adds new member definition to the class
-void ClassDef::internalInsertMember(MemberDef *md,
- Protection prot,
- bool addToAllList
- )
-{
- //printf("adding %s::%s\n",name().data(),md->name().data());
- if (!isReference())
- {
- /********************************************/
- /* insert member in the declaration section */
- /********************************************/
- if (md->isRelated() &&
- (Config_getBool("EXTRACT_PRIVATE") || prot!=Private))
- {
- if (Config_getBool("SORT_BRIEF_DOCS"))
- related.inSort(md);
- else
- related.append(md);
- md->setSectionList(this,&related);
- }
- else if (md->isFriend())
- {
- if (Config_getBool("SORT_BRIEF_DOCS"))
- friends.inSort(md);
- else
- friends.append(md);
- md->setSectionList(this,&friends);
- }
- else
- {
- switch (md->memberType())
- {
- case MemberDef::Signal: // Qt specific
- if (Config_getBool("SORT_BRIEF_DOCS"))
- signals.inSort(md);
- else
- signals.append(md);
- md->setSectionList(this,&signals);
- break;
- case MemberDef::DCOP: // KDE2 specific
- if (Config_getBool("SORT_BRIEF_DOCS"))
- dcopMethods.inSort(md);
- else
- dcopMethods.append(md);
- md->setSectionList(this,&dcopMethods);
- break;
- case MemberDef::Property:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- properties.inSort(md);
- else
- properties.append(md);
- md->setSectionList(this,&properties);
- break;
- case MemberDef::Event:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- events.inSort(md);
- else
- events.append(md);
- md->setSectionList(this,&events);
- break;
- case MemberDef::Slot: // Qt specific
- switch (prot)
- {
- case Protected:
- case Package: // slots in packages are not possible!
- if (Config_getBool("SORT_BRIEF_DOCS"))
- proSlots.inSort(md);
- else
- proSlots.append(md);
- md->setSectionList(this,&proSlots);
- break;
- break;
- case Public:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- pubSlots.inSort(md);
- else
- pubSlots.append(md);
- md->setSectionList(this,&pubSlots);
- break;
- case Private:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- priSlots.inSort(md);
- else
- priSlots.append(md);
- md->setSectionList(this,&priSlots);
- break;
- }
- break;
- default: // any of the other members
- if (md->isStatic())
- {
- if (md->isVariable())
- {
- switch (prot)
- {
- case Protected:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- proStaticAttribs.inSort(md);
- else
- proStaticAttribs.append(md);
- md->setSectionList(this,&proStaticAttribs);
- break;
- case Package:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- pacStaticAttribs.inSort(md);
- else
- pacStaticAttribs.append(md);
- md->setSectionList(this,&pacStaticAttribs);
- break;
- case Public:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- pubStaticAttribs.inSort(md);
- else
- pubStaticAttribs.append(md);
- md->setSectionList(this,&pubStaticAttribs);
- break;
- case Private:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- priStaticAttribs.inSort(md);
- else
- priStaticAttribs.append(md);
- md->setSectionList(this,&priStaticAttribs);
- break;
- }
- }
- else // function
- {
- switch (prot)
- {
- case Protected:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- proStaticMethods.inSort(md);
- else
- proStaticMethods.append(md);
- md->setSectionList(this,&proStaticMethods);
- break;
- case Package:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- pacStaticMethods.inSort(md);
- else
- pacStaticMethods.append(md);
- md->setSectionList(this,&pacStaticMethods);
- break;
- case Public:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- pubStaticMethods.inSort(md);
- else
- pubStaticMethods.append(md);
- md->setSectionList(this,&pubStaticMethods);
- break;
- case Private:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- priStaticMethods.inSort(md);
- else
- priStaticMethods.append(md);
- md->setSectionList(this,&priStaticMethods);
- break;
- }
- }
- }
- else // not static
- {
- if (md->isVariable())
- {
- switch (prot)
- {
- case Protected:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- proAttribs.inSort(md);
- else
- proAttribs.append(md);
- md->setSectionList(this,&proAttribs);
- break;
- case Package:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- pacAttribs.inSort(md);
- else
- pacAttribs.append(md);
- md->setSectionList(this,&pacAttribs);
- break;
- case Public:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- pubAttribs.inSort(md);
- else
- pubAttribs.append(md);
- md->setSectionList(this,&pubAttribs);
- break;
- case Private:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- priAttribs.inSort(md);
- else
- priAttribs.append(md);
- md->setSectionList(this,&priAttribs);
- break;
- }
- }
- else if (md->isTypedef() || md->isEnumerate() || md->isEnumValue())
- {
- switch (prot)
- {
- case Protected:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- proTypes.inSort(md);
- else
- proTypes.append(md);
- md->setSectionList(this,&proTypes);
- break;
- case Package:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- pacTypes.inSort(md);
- else
- pacTypes.append(md);
- md->setSectionList(this,&pacTypes);
- break;
- case Public:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- pubTypes.inSort(md);
- else
- pubTypes.append(md);
- md->setSectionList(this,&pubTypes);
- break;
- case Private:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- priTypes.inSort(md);
- else
- priTypes.append(md);
- md->setSectionList(this,&priTypes);
- break;
- }
- }
- else // member function
- {
- switch (prot)
- {
- case Protected:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- proMethods.inSort(md);
- else
- proMethods.append(md);
- md->setSectionList(this,&proMethods);
- break;
- case Package:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- pacMethods.inSort(md);
- else
- pacMethods.append(md);
- md->setSectionList(this,&pacMethods);
- break;
- case Public:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- pubMethods.inSort(md);
- else
- pubMethods.append(md);
- md->setSectionList(this,&pubMethods);
- break;
- case Private:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- priMethods.inSort(md);
- else
- priMethods.append(md);
- md->setSectionList(this,&priMethods);
- break;
- }
- }
- }
- break;
- }
- }
-
- /*******************************************************/
- /* insert member in the detailed documentation section */
- /*******************************************************/
- if ((md->isRelated() &&
- (Config_getBool("EXTRACT_PRIVATE") || prot!=Private)
- ) || md->isFriend()
- )
- {
- if (Config_getBool("SORT_MEMBER_DOCS"))
- relatedMembers.inSort(md);
- else
- relatedMembers.append(md);
- }
- else
- {
- switch (md->memberType())
- {
- case MemberDef::Property:
- if (Config_getBool("SORT_MEMBER_DOCS"))
- propertyMembers.inSort(md);
- else
- propertyMembers.append(md);
- break;
- case MemberDef::Event:
- if (Config_getBool("SORT_MEMBER_DOCS"))
- eventMembers.inSort(md);
- else
- eventMembers.append(md);
- break;
- case MemberDef::Signal: // fall through
- case MemberDef::DCOP:
- if (Config_getBool("SORT_MEMBER_DOCS"))
- functionMembers.inSort(md);
- else
- functionMembers.append(md);
- break;
- case MemberDef::Slot:
- switch (prot)
- {
- case Protected:
- case Package:
- case Public:
- if (Config_getBool("SORT_MEMBER_DOCS"))
- functionMembers.inSort(md);
- else
- functionMembers.append(md);
- break;
- case Private:
- if (Config_getBool("EXTRACT_PRIVATE"))
- {
- if (Config_getBool("SORT_MEMBER_DOCS"))
- functionMembers.inSort(md);
- else
- functionMembers.append(md);
- }
- break;
- }
- break;
- default: // any of the other members
- if (prot!=Private || Config_getBool("EXTRACT_PRIVATE"))
- {
- switch (md->memberType())
- {
- case MemberDef::Typedef:
- if (Config_getBool("SORT_MEMBER_DOCS"))
- typedefMembers.inSort(md);
- else
- typedefMembers.append(md);
- break;
- case MemberDef::Enumeration:
- if (Config_getBool("SORT_MEMBER_DOCS"))
- enumMembers.inSort(md);
- else
- enumMembers.append(md);
- break;
- case MemberDef::EnumValue:
- if (Config_getBool("SORT_MEMBER_DOCS"))
- enumValMembers.inSort(md);
- else
- enumValMembers.append(md);
- break;
- case MemberDef::Function:
- if (md->isConstructor() || md->isDestructor())
- {
- constructors.append(md);
- }
- else
- {
- if (Config_getBool("SORT_MEMBER_DOCS"))
- functionMembers.inSort(md);
- else
- functionMembers.append(md);
- }
- break;
- case MemberDef::Variable:
- if (Config_getBool("SORT_MEMBER_DOCS"))
- variableMembers.inSort(md);
- else
- variableMembers.append(md);
- break;
- default:
- err("Unexpected member type %d found!\n",md->memberType());
- }
- }
- break;
- }
- }
-
- /*************************************************/
- /* insert member in the appropriate member group */
- /*************************************************/
- // Note: this must be done AFTER inserting the member in the
- // regular groups
- //addMemberToGroup(md,groupId);
-
- }
-
- if (md->virtualness()==Pure)
- {
- m_isAbstract=TRUE;
- }
-
- if (addToAllList &&
- !(Config_getBool("HIDE_FRIEND_COMPOUNDS") &&
- md->isFriend() &&
- (QCString(md->typeString())=="friend class" ||
- QCString(md->typeString())=="friend struct" ||
- 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 ((mni=m_allMemberNameInfoSDict->find(md->name())))
- {
- mni->append(mi);
- }
- else
- {
- mni = new MemberNameInfo(md->name());
- mni->append(mi);
- m_allMemberNameInfoSDict->append(mni->memberName(),mni);
- }
- }
-}
-
-void ClassDef::insertMember(MemberDef *md)
-{
- internalInsertMember(md,md->protection(),TRUE);
-}
-
-// compute the anchors for all members
-void ClassDef::computeAnchors()
-{
- ClassDef *context = Config_getBool("INLINE_INHERITED_MEMB") ? this : 0;
- setAnchors(context,'a',&pubMethods);
- setAnchors(context,'b',&proMethods);
- setAnchors(context,'c',&pacMethods);
- setAnchors(context,'d',&priMethods);
- setAnchors(context,'e',&pubStaticMethods);
- setAnchors(context,'f',&proStaticMethods);
- setAnchors(context,'g',&pacStaticMethods);
- setAnchors(context,'h',&priStaticMethods);
- setAnchors(context,'i',&pubSlots);
- setAnchors(context,'j',&proSlots);
- setAnchors(context,'k',&priSlots);
- setAnchors(context,'l',&signals);
- setAnchors(context,'m',&related);
- setAnchors(context,'n',&friends);
- setAnchors(context,'o',&pubAttribs);
- setAnchors(context,'p',&proAttribs);
- setAnchors(context,'q',&pacAttribs);
- setAnchors(context,'r',&priAttribs);
- setAnchors(context,'s',&pubStaticAttribs);
- setAnchors(context,'t',&proStaticAttribs);
- setAnchors(context,'u',&pacStaticAttribs);
- setAnchors(context,'v',&priStaticAttribs);
- setAnchors(context,'w',&pubTypes);
- setAnchors(context,'x',&proTypes);
- setAnchors(context,'y',&priTypes);
- setAnchors(context,'z',&dcopMethods);
- setAnchors(context,'0',&properties);
- setAnchors(context,'1',&events);
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->setAnchors(context);
- }
-}
-
-void ClassDef::distributeMemberGroupDocumentation()
-{
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->distributeMemberGroupDocumentation();
- }
-}
-
-void ClassDef::findSectionsInDocumentation()
-{
- docFindSections(documentation(),this,0,docFile());
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->findSectionsInDocumentation();
- }
- pubTypes.findSectionsInDocumentation();
- pubMethods.findSectionsInDocumentation();
- pubAttribs.findSectionsInDocumentation();
- pubSlots.findSectionsInDocumentation();
- signals.findSectionsInDocumentation();
- dcopMethods.findSectionsInDocumentation();
- pubStaticMethods.findSectionsInDocumentation();
- pubStaticAttribs.findSectionsInDocumentation();
- pacTypes.findSectionsInDocumentation();
- pacMethods.findSectionsInDocumentation();
- pacAttribs.findSectionsInDocumentation();
- pacStaticMethods.findSectionsInDocumentation();
- pacStaticAttribs.findSectionsInDocumentation();
- proTypes.findSectionsInDocumentation();
- proMethods.findSectionsInDocumentation();
- proAttribs.findSectionsInDocumentation();
- proSlots.findSectionsInDocumentation();
- proStaticMethods.findSectionsInDocumentation();
- proStaticAttribs.findSectionsInDocumentation();
- priTypes.findSectionsInDocumentation();
- priMethods.findSectionsInDocumentation();
- priAttribs.findSectionsInDocumentation();
- priSlots.findSectionsInDocumentation();
- priStaticMethods.findSectionsInDocumentation();
- priStaticAttribs.findSectionsInDocumentation();
- friends.findSectionsInDocumentation();
- related.findSectionsInDocumentation();
- properties.findSectionsInDocumentation();
- events.findSectionsInDocumentation();
-}
-
-
-// add a file name to the used files set
-void ClassDef::insertUsedFile(const char *f)
-{
- if (m_files.find(f)==-1) m_files.append(f);
- if (m_templateInstances)
- {
- QDictIterator<ClassDef> qdi(*m_templateInstances);
- ClassDef *cd;
- for (qdi.toFirst();(cd=qdi.current());++qdi)
- {
- cd->insertUsedFile(f);
- }
- }
-}
-
-static void writeInheritanceSpecifier(OutputList &ol,BaseClassDef *bcd)
-{
- 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)
- {
- ol.docify(s);
- s=sl.next();
- if (s) ol.docify(", ");
- }
- ol.docify("]");
- ol.endTypewriter();
- }
-}
-
-void ClassDef::setIncludeFile(FileDef *fd,
- const char *includeName,bool local, bool force)
-{
- //printf("ClassDef::setIncludeFile(%p,%s,%d,%d)\n",fd,includeName,local,force);
- if (!m_incInfo) m_incInfo=new IncludeInfo;
- if ((includeName && m_incInfo->includeName.isEmpty()) ||
- (fd!=0 && m_incInfo->fileDef==0)
- )
- {
- //printf("Setting file info\n");
- m_incInfo->fileDef = fd;
- m_incInfo->includeName = includeName;
- m_incInfo->local = local;
- }
- if (force && includeName) m_incInfo->includeName = includeName;
-}
-
-// TODO: fix this: a nested template class can have multiple outer templates
-//ArgumentList *ClassDef::outerTemplateArguments() const
-//{
-// int ti;
-// ClassDef *pcd=0;
-// int pi=0;
-// if (m_tempArgs) return m_tempArgs;
-// // find the outer most class scope
-// while ((ti=name().find("::",pi))!=-1 &&
-// (pcd=getClass(name().left(ti)))==0
-// ) pi=ti+2;
-// if (pcd)
-// {
-// return pcd->templateArguments();
-// }
-// return 0;
-//}
-
-static void searchTemplateSpecs(/*in*/ Definition *d,
- /*out*/ QList<ArgumentList> &result,
- /*out*/ QCString &name)
-{
- if (d->definitionType()==Definition::TypeClass)
- {
- if (d->getOuterScope())
- {
- searchTemplateSpecs(d->getOuterScope(),result,name);
- }
- ClassDef *cd=(ClassDef *)d;
- if (!name.isEmpty()) name+="::";
- name+=d->localName();
- bool isSpecialization = d->localName().find('<')!=-1;
- if (cd->templateArguments())
- {
- result.append(cd->templateArguments());
- if (!isSpecialization)
- {
- name+=tempArgListToString(cd->templateArguments());
- }
- }
- }
- else
- {
- name+=d->qualifiedName();
- }
-}
-
-static void writeTemplateSpec(OutputList &ol,Definition *d,
- const QCString &type)
-{
- QList<ArgumentList> specs;
- QCString name;
- searchTemplateSpecs(d,specs,name);
- if (specs.count()>0) // class has template scope specifiers
- {
- ol.startSubsubsection();
- QListIterator<ArgumentList> spi(specs);
- ArgumentList *al;
- for (spi.toFirst();(al=spi.current());++spi)
- {
- ol.docify("template<");
- Argument *a=al->first();
- while (a)
- {
- ol.docify(a->type);
- if (!a->name.isEmpty())
- {
- ol.docify(" ");
- ol.docify(a->name);
- }
- if (a->defval.length()!=0)
- {
- ol.docify(" = ");
- ol.docify(a->defval);
- }
- a=al->next();
- if (a) ol.docify(", ");
- }
- ol.docify(">");
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
- ol.lineBreak();
- ol.popGeneratorState();
- }
- ol.docify(type.lower()+" "+name);
- ol.endSubsubsection();
- ol.writeString("\n");
- }
-}
-
-// write the detailed description for this class
-void ClassDef::writeDetailedDescription(OutputList &ol, const QCString &pageType, bool exampleFlag)
-{
- if ((!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) ||
- !documentation().isEmpty() ||
- (Config_getBool("SOURCE_BROWSER") && getStartBodyLine()!=-1 && getBodyDef()) ||
- exampleFlag)
- {
- ol.writeRuler();
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Latex);
- ol.disable(OutputGenerator::RTF);
- ol.writeAnchor(0,"_details");
- ol.popGeneratorState();
- ol.startGroupHeader();
- ol.parseText(theTranslator->trDetailedDescription());
- ol.endGroupHeader();
- ol.startTextBlock();
-
- writeTemplateSpec(ol,this,pageType);
-
- // repeat brief description
- if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
- {
- ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
- }
- if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") &&
- !documentation().isEmpty())
- {
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
- ol.newParagraph();
- ol.enableAll();
- ol.disableAllBut(OutputGenerator::Man);
- ol.writeString("\n\n");
- ol.popGeneratorState();
- }
- // write documentation
- if (!documentation().isEmpty())
- {
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::RTF);
- ol.newParagraph();
- ol.popGeneratorState();
- ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
- }
- // write examples
- if (exampleFlag)
- {
- ol.startSimpleSect(BaseOutputDocInterface::Examples,0,0,theTranslator->trExamples()+": ");
- ol.writeDescItem();
- ol.newParagraph();
- writeExample(ol,m_exampleSDict);
- ol.endSimpleSect();
- }
- ol.newParagraph();
- writeSourceDef(ol,name());
- ol.endTextBlock();
- }
- else
- {
- writeTemplateSpec(ol,this,pageType);
- }
-}
-
-void ClassDef::showUsedFiles(OutputList &ol)
-{
- if (Config_getBool("SHOW_USED_FILES"))
- {
- ol.writeRuler();
- ol.parseText(theTranslator->trGeneratedFromFiles(
- m_isObjC && m_compType==Interface ? Class : m_compType,
- m_files.count()==1));
-
- bool first=TRUE;
- const char *file = m_files.first();
- while (file)
- {
- bool ambig;
- FileDef *fd=findFileDef(Doxygen::inputNameDict,file,ambig);
- if (fd)
- {
- if (first)
- {
- first=FALSE;
- ol.startItemList();
- }
-
- ol.writeListItem();
- QCString path=fd->getPath().copy();
- if (Config_getBool("FULL_PATH_NAMES"))
- {
- ol.docify(stripFromPath(path));
- }
-
- QCString fname = fd->name();
- if (!fd->getVersion().isEmpty()) // append version if available
- {
- fname += " (" + fd->getVersion() + ")";
- }
-
- // for HTML
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
- if (fd->generateSourceFile())
- {
- ol.writeObjectLink(0,fd->getSourceFileBase(),0,fname);
- }
- else if (fd->isLinkable())
- {
- ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,
- fname);
- }
- else
- {
- ol.docify(fname);
- }
- ol.popGeneratorState();
-
- // for other output formats
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Html);
- if (fd->isLinkable())
- {
- ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,
- fname);
- }
- else
- {
- ol.docify(fname);
- }
-
- ol.popGeneratorState();
-
-
- }
- file=m_files.next();
- }
- if (!first) ol.endItemList();
- }
-}
-
-
-// write all documentation for this class
-void ClassDef::writeDocumentation(OutputList &ol)
-{
- QCString pageType = " ";
- pageType += compoundTypeString();
- toupper(pageType.at(1));
- QCString pageTitle = theTranslator->trCompoundReference(displayName(),
- m_compType == Interface && m_isObjC ? Class : m_compType,
- m_tempArgs != 0);
-
- startFile(ol,getOutputFileBase(),name(),pageTitle);
- if (getOuterScope()!=Doxygen::globalScope)
- {
- writeNavigationPath(ol);
- }
- startTitle(ol,getOutputFileBase());
- ol.parseText(pageTitle);
- addGroupListToTitle(ol,this);
- endTitle(ol,getOutputFileBase(),name());
-
- {
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
- ol.writeString("<!-- doxytag: class=\"");
- ol.docify(name());
- ol.writeString("\" -->");
- if (m_inherits->count()>0)
- {
- BaseClassListIterator bli(*m_inherits);
- ol.writeString("<!-- doxytag: inherits=\"");
- BaseClassDef *bcd=0;
- bool first=TRUE;
- for (bli.toFirst();(bcd=bli.current());++bli)
- {
- if (!first) ol.writeString(",");
- ol.docify(bcd->classDef->name());
- first=FALSE;
- }
- ol.writeString("\" -->");
- }
- ol.popGeneratorState();
- }
-
-
- if (Config_getBool("SEARCHENGINE"))
- {
- Doxygen::searchIndex->setCurrentDoc(pageTitle,getOutputFileBase());
- Doxygen::searchIndex->addWord(localName(),TRUE);
- }
-
- ol.startTextBlock();
-
- //printf("Class %s brief=`%s' doc=`%s'\n",name().data(),briefDescription().data(),documentation().data());
-
- bool exampleFlag=hasExamples();
- // write brief description
- if (!briefDescription().isEmpty())
- {
- if (!Config_getBool("DETAILS_AT_TOP"))
- {
- ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE);
- ol.writeString(" \n");
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
- ol.startTextLink(0,"_details");
-
- if (Config_getBool("REPEAT_BRIEF") ||
- !documentation().isEmpty() ||
- exampleFlag
- )
- {
- ol.parseText(theTranslator->trMore());
- }
- ol.endTextLink();
- ol.popGeneratorState();
-
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::RTF);
- ol.newParagraph();
- ol.popGeneratorState();
- }
- }
- ol.writeSynopsis();
-
- if (m_incInfo && Config_getBool("SHOW_INCLUDE_FILES"))
- {
- QCString nm=m_incInfo->includeName.isEmpty() ?
- (m_incInfo->fileDef ?
- m_incInfo->fileDef->docName().data() : ""
- ) :
- m_incInfo->includeName.data();
- if (!nm.isEmpty())
- {
- ol.startTypewriter();
- bool isIDLorJava = nm.right(4)==".idl" ||
- nm.right(5)==".pidl" ||
- nm.right(5)==".java";
- if (isIDLorJava)
- {
- ol.docify("import ");
- }
- else if (isObjectiveC())
- {
- ol.docify("#import ");
- }
- else
- {
- ol.docify("#include ");
- }
- if (m_incInfo->local || isIDLorJava)
- ol.docify("\"");
- else
- ol.docify("<");
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Html);
- ol.docify(nm);
- ol.disableAllBut(OutputGenerator::Html);
- ol.enable(OutputGenerator::Html);
- if (m_incInfo->fileDef)
- {
- ol.writeObjectLink(0,m_incInfo->fileDef->includeName(),0,nm);
- }
- else
- {
- ol.docify(nm);
- }
- ol.popGeneratorState();
- if (m_incInfo->local || isIDLorJava)
- ol.docify("\"");
- else
- ol.docify(">");
- if (isIDLorJava)
- ol.docify(";");
- ol.endTypewriter();
- ol.newParagraph();
- }
- }
-
-
- if (!Config_getString("GENERATE_TAGFILE").isEmpty())
- {
- Doxygen::tagFile << " <compound kind=\"" << compoundTypeString();
- Doxygen::tagFile << "\"";
- if (isObjectiveC()) { Doxygen::tagFile << " objc=\"yes\""; }
- Doxygen::tagFile << ">" << endl;
- Doxygen::tagFile << " <name>" << convertToXML(name()) << "</name>" << endl;
- Doxygen::tagFile << " <filename>" << convertToXML(getOutputFileBase()) << Doxygen::htmlFileExtension << "</filename>" << endl;
- if (m_tempArgs)
- {
- ArgumentListIterator ali(*m_tempArgs);
- Argument *a;
- for (;(a=ali.current());++ali)
- {
- Doxygen::tagFile << " <templarg>" << convertToXML(a->name) << "</templarg>" << endl;
- }
- }
- }
-
-
- if (Config_getBool("CLASS_DIAGRAMS")) ol.disableAllBut(OutputGenerator::Man);
-
-
- // write super classes
- int count;
- if ((count=m_inherits->count())>0)
- {
- //parseText(ol,theTranslator->trInherits()+" ");
-
- QCString inheritLine = theTranslator->trInheritsList(m_inherits->count());
- QRegExp marker("@[0-9]+");
- int index=0,newIndex,matchLen;
- // now replace all markers in inheritLine with links to the classes
- while ((newIndex=marker.match(inheritLine,index,&matchLen))!=-1)
- {
- ol.parseText(inheritLine.mid(index,newIndex-index));
- bool ok;
- uint entryIndex = inheritLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
- BaseClassDef *bcd=m_inherits->at(entryIndex);
- if (ok && bcd)
- {
- ClassDef *cd=bcd->classDef;
- if (cd->isLinkable())
- {
- if (!Config_getString("GENERATE_TAGFILE").isEmpty())
- {
- Doxygen::tagFile << " <base";
- if (bcd->prot==Protected)
- {
- Doxygen::tagFile << " protection=\"protected\"";
- }
- else if (bcd->prot==Private)
- {
- Doxygen::tagFile << " protection=\"private\"";
- }
- if (bcd->virt==Virtual)
- {
- Doxygen::tagFile << " virtualness=\"virtual\"";
- }
- Doxygen::tagFile << ">" << convertToXML(cd->name()) << "</base>" << endl;
- }
- ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),0,cd->displayName()+bcd->templSpecifiers);
- }
- else
- {
- ol.docify(cd->displayName());
- }
- }
- else
- {
- err("Error: invalid marker %d in inherits list!\n",entryIndex);
- }
- index=newIndex+matchLen;
- }
- ol.parseText(inheritLine.right(inheritLine.length()-index));
- ol.newParagraph();
- }
-
- // write subclasses
- if ((count=m_inheritedBy->count())>0)
- {
- QCString inheritLine = theTranslator->trInheritedByList(m_inheritedBy->count());
- QRegExp marker("@[0-9]+");
- int index=0,newIndex,matchLen;
- // now replace all markers in inheritLine with links to the classes
- while ((newIndex=marker.match(inheritLine,index,&matchLen))!=-1)
- {
- ol.parseText(inheritLine.mid(index,newIndex-index));
- bool ok;
- uint entryIndex = inheritLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
- BaseClassDef *bcd=m_inheritedBy->at(entryIndex);
- if (ok && bcd)
- {
- ClassDef *cd=bcd->classDef;
- if (cd->isLinkable())
- {
- ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),0,cd->displayName());
- }
- else
- {
- ol.docify(cd->displayName());
- }
- writeInheritanceSpecifier(ol,bcd);
- }
- index=newIndex+matchLen;
- }
- ol.parseText(inheritLine.right(inheritLine.length()-index));
- ol.newParagraph();
- }
-
- if (Config_getBool("CLASS_DIAGRAMS")) ol.enableAll();
-
-
- count=0;
- BaseClassDef *ibcd;
- ibcd=m_inheritedBy->first();
- while (ibcd)
- {
- ClassDef *icd=ibcd->classDef;
- if ( icd->isVisibleInHierarchy()) count++;
- ibcd=m_inheritedBy->next();
- }
- ibcd=m_inherits->first();
- while (ibcd)
- {
- ClassDef *icd=ibcd->classDef;
- if ( icd->isVisibleInHierarchy()) count++;
- ibcd=m_inherits->next();
- }
-
-
- if (Config_getBool("HAVE_DOT") && Config_getBool("CLASS_GRAPH"))
- // write class diagram using dot
- {
- DotClassGraph inheritanceGraph(this,DotNode::Inheritance,Config_getInt("MAX_DOT_GRAPH_DEPTH"));
- if (!inheritanceGraph.isTrivial())
- {
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
- ol.startDotGraph();
- ol.parseText(theTranslator->trClassDiagram(displayName()));
- ol.endDotGraph(inheritanceGraph);
- if (Config_getBool("GENERATE_LEGEND"))
- {
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
- ol.writeString("<center><font size=\"2\">[");
- ol.startHtmlLink(relativePathToRoot(0)+"graph_legend"+Doxygen::htmlFileExtension);
- ol.docify(theTranslator->trLegend());
- ol.endHtmlLink();
- ol.writeString("]</font></center>");
- ol.popGeneratorState();
- }
- ol.popGeneratorState();
- }
- }
- else if (Config_getBool("CLASS_DIAGRAMS") && count>0)
- // write class diagram using build-in generator
- {
- ClassDiagram diagram(this); // create a diagram of this class.
- ol.startClassDiagram();
- ol.disable(OutputGenerator::Man);
- ol.parseText(theTranslator->trClassDiagram(displayName()));
- ol.enable(OutputGenerator::Man);
- ol.endClassDiagram(diagram,getOutputFileBase(),displayName());
- }
-
- if (Config_getBool("HAVE_DOT") && Config_getBool("COLLABORATION_GRAPH"))
- {
- DotClassGraph usageImplGraph(this,DotNode::Collaboration,Config_getInt("MAX_DOT_GRAPH_DEPTH"));
- if (!usageImplGraph.isTrivial())
- {
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
- ol.startDotGraph();
- ol.parseText(theTranslator->trCollaborationDiagram(displayName()));
- ol.endDotGraph(usageImplGraph);
- if (Config_getBool("GENERATE_LEGEND"))
- {
- ol.disableAllBut(OutputGenerator::Html);
- ol.writeString("<center><font size=\"2\">[");
- ol.startHtmlLink(relativePathToRoot(0)+"graph_legend"+Doxygen::htmlFileExtension);
- ol.docify(theTranslator->trLegend());
- ol.endHtmlLink();
- ol.writeString("]</font></center>");
- }
- ol.popGeneratorState();
- }
- }
-
- // write link to list of all members (HTML only)
- if (m_allMemberNameInfoSDict->count()>0 &&
- !Config_getBool("OPTIMIZE_OUTPUT_FOR_C")
- )
- {
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
- ol.startTextLink(m_memListFileName,0);
- ol.parseText(theTranslator->trListOfAllMembers());
- ol.endTextLink();
- ol.enableAll();
- ol.popGeneratorState();
- }
-
- ol.endTextBlock();
-
- // write detailed description if the user wants it near the top
- if (Config_getBool("DETAILS_AT_TOP")) {
- writeDetailedDescription(ol,pageType,exampleFlag);
- }
-
-
- ///////////////////////////////////////////////////////////////////////////
- //// Member declarations + brief descriptions
- ///////////////////////////////////////////////////////////////////////////
-
- // write member groups
- ol.startMemberSections();
-
- // write user defined member groups
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- if (!mg->allMembersInSameSection() || !m_subGrouping) // group is in its own section
- {
- mg->writeDeclarations(ol,this,0,0,0);
- }
- else // add this group to the corresponding member section
- {
- //printf("addToDeclarationSection(%s)\n",mg->header().data());
- //mg->addToDeclarationSection();
- }
- }
-
- // public types
- pubTypes.writeDeclarations(ol,this,0,0,0,theTranslator->trPublicTypes(),0);
-
- // public methods
- pubSlots.writeDeclarations(ol,this,0,0,0,theTranslator->trPublicSlots(),0);
- signals.writeDeclarations(ol,this,0,0,0,theTranslator->trSignals(),0);
- dcopMethods.writeDeclarations(ol,this,0,0,0,theTranslator->trDCOPMethods(),0);
- pubMethods.writeDeclarations(ol,this,0,0,0,theTranslator->trPublicMembers(),0);
- pubStaticMethods.writeDeclarations(ol,this,0,0,0,theTranslator->trStaticPublicMembers(),0);
-
- // public attribs
- pubAttribs.writeDeclarations(ol,this,0,0,0,theTranslator->trPublicAttribs(),0);
- pubStaticAttribs.writeDeclarations(ol,this,0,0,0,theTranslator->trStaticPublicAttribs(),0);
-
- // protected types
- proTypes.writeDeclarations(ol,this,0,0,0,theTranslator->trProtectedTypes(),0);
-
- // protected methods
- proSlots.writeDeclarations(ol,this,0,0,0,theTranslator->trProtectedSlots(),0);
- proMethods.writeDeclarations(ol,this,0,0,0,theTranslator->trProtectedMembers(),0);
- proStaticMethods.writeDeclarations(ol,this,0,0,0,theTranslator->trStaticProtectedMembers(),0);
-
- // protected attribs
- proAttribs.writeDeclarations(ol,this,0,0,0,theTranslator->trProtectedAttribs(),0);
- proStaticAttribs.writeDeclarations(ol,this,0,0,0,theTranslator->trStaticProtectedAttribs(),0);
-
- // package types
- pacTypes.writeDeclarations(ol,this,0,0,0,theTranslator->trPackageTypes(),0);
-
- // package methods
- pacMethods.writeDeclarations(ol,this,0,0,0,theTranslator->trPackageMembers(),0);
- pacStaticMethods.writeDeclarations(ol,this,0,0,0,theTranslator->trStaticPackageMembers(),0);
-
- // package attribs
- pacAttribs.writeDeclarations(ol,this,0,0,0,theTranslator->trPackageAttribs(),0);
- pacStaticAttribs.writeDeclarations(ol,this,0,0,0,theTranslator->trStaticPackageAttribs(),0);
-
- // package
- properties.writeDeclarations(ol,this,0,0,0,theTranslator->trProperties(),0);
-
- // events
- events.writeDeclarations(ol,this,0,0,0,theTranslator->trEvents(),0);
-
- if (Config_getBool("EXTRACT_PRIVATE"))
- {
- // private types
- priTypes.writeDeclarations(ol,this,0,0,0,theTranslator->trPrivateTypes(),0);
-
- // private members
- priSlots.writeDeclarations(ol,this,0,0,0,theTranslator->trPrivateSlots(),0);
- priMethods.writeDeclarations(ol,this,0,0,0,theTranslator->trPrivateMembers(),0);
- priStaticMethods.writeDeclarations(ol,this,0,0,0,theTranslator->trStaticPrivateMembers(),0);
-
- // private attribs
- priAttribs.writeDeclarations(ol,this,0,0,0,theTranslator->trPrivateAttribs(),0);
- priStaticAttribs.writeDeclarations(ol,this,0,0,0,theTranslator->trStaticPrivateAttribs(),0);
- }
-
- // friends
- friends.writeDeclarations(ol,this,0,0,0,theTranslator->trFriends(),0);
-
- // related functions
- related.writeDeclarations(ol,this,0,0,0,
- theTranslator->trRelatedFunctions(),
- theTranslator->trRelatedSubscript()
- );
-
- // nested classes
- m_innerClasses->writeDeclaration(ol,0,0,TRUE);
-
- ol.endMemberSections();
-
- // write detailed description
- if (!Config_getBool("DETAILS_AT_TOP")) {
- writeDetailedDescription(ol,pageType,exampleFlag);
- }
-
- writeMemberDocumentation(ol);
-
- /////////////////////////////////////////////////////////////////////
- ol.startTextBlock();
-
- // write the list of used files (not for man pages)
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
-
- showUsedFiles(ol);
-
- // write Author section (Man only)
- ol.enable(OutputGenerator::Man);
- ol.disableAllBut(OutputGenerator::Man);
- ol.writeString("\n");
- ol.startGroupHeader();
- ol.parseText(theTranslator->trAuthor(TRUE,TRUE));
- ol.endGroupHeader();
- ol.parseText(theTranslator->trGeneratedAutomatically(Config_getString("PROJECT_NAME")));
- ol.popGeneratorState();
-
- ol.endTextBlock();
- /////////////////////////////////////////////////////////////////////
-
- if (!Config_getString("GENERATE_TAGFILE").isEmpty())
- {
- writeDocAnchorsToTagFile();
- Doxygen::tagFile << " </compound>" << endl;
- }
-
- endFile(ol);
-
- if (Config_getBool("SEPARATE_MEMBER_PAGES"))
- {
- writeMemberPages(ol);
- }
-}
-
-void ClassDef::writeMemberDocumentation(OutputList &ol)
-{
- ///////////////////////////////////////////////////////////////////////////
- //// Member definitions + detailed documentation
- ///////////////////////////////////////////////////////////////////////////
-
- if (Config_getBool("SEPARATE_MEMBER_PAGES"))
- {
- ol.disable(OutputGenerator::Html);
- }
-
- typedefMembers.writeDocumentation(ol,name(),this,
- theTranslator->trMemberTypedefDocumentation());
-
- enumMembers.writeDocumentation(ol,name(),this,
- theTranslator->trMemberEnumerationDocumentation());
-
- constructors.writeDocumentation(ol,name(),this,
- theTranslator->trConstructorDocumentation());
-
- functionMembers.writeDocumentation(ol,name(),this,
- theTranslator->trMemberFunctionDocumentation());
-
- relatedMembers.writeDocumentation(ol,name(),this,
- theTranslator->trRelatedFunctionDocumentation());
-
- variableMembers.writeDocumentation(ol,name(),this,
- theTranslator->trMemberDataDocumentation());
-
- propertyMembers.writeDocumentation(ol,name(),this,
- theTranslator->trPropertyDocumentation());
-
- eventMembers.writeDocumentation(ol,name(),this,
- theTranslator->trEventDocumentation());
-
- if (Config_getBool("SEPARATE_MEMBER_PAGES"))
- {
- ol.enable(OutputGenerator::Html);
- }
-}
-
-void ClassDef::writeMemberPages(OutputList &ol)
-{
- ///////////////////////////////////////////////////////////////////////////
- //// Member definitions on separate pages
- ///////////////////////////////////////////////////////////////////////////
-
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
-
- typedefMembers.writeDocumentationPage(ol,name(),this);
- enumMembers.writeDocumentationPage(ol,name(),this);
- constructors.writeDocumentationPage(ol,name(),this);
- functionMembers.writeDocumentationPage(ol,name(),this);
- relatedMembers.writeDocumentationPage(ol,name(),this);
- variableMembers.writeDocumentationPage(ol,name(),this);
- propertyMembers.writeDocumentationPage(ol,name(),this);
- eventMembers.writeDocumentationPage(ol,name(),this);
-
- ol.popGeneratorState();
-}
-
-void ClassDef::writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const
-{
- static bool createSubDirs=Config_getBool("CREATE_SUBDIRS");
-
- ol.writeString(" <div class=\"navtab\">\n");
- ol.writeString(" <table>\n");
-
- MemberNameInfoSDict::Iterator mnili(*m_allMemberNameInfoSDict);
- MemberNameInfo *mni;
- for (;(mni=mnili.current());++mnili)
- {
- MemberNameInfoIterator mnii(*mni);
- MemberInfo *mi;
- for (mnii.toFirst();(mi=mnii.current());++mnii)
- {
- MemberDef *md=mi->memberDef;
- if (md->getClassDef()==this && md->isLinkable())
- {
- ol.writeString(" <tr><td class=\"navtab\">");
- if (md->isLinkableInProject())
- {
- 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(md->name());
- ol.writeString("</a>");
- }
- ol.writeString("</td></tr>\n");
- }
- }
- }
-
- ol.writeString(" </table>\n");
- ol.writeString(" </div>\n");
-}
-
-
-
-void ClassDef::writeDocumentationForInnerClasses(OutputList &ol)
-{
- // write inner classes after the parent, so the tag files contain
- // the definition in proper order!
- if (m_innerClasses)
- {
- ClassSDict::Iterator cli(*m_innerClasses);
- ClassDef *innerCd;
- for (cli.toFirst();(innerCd=cli.current());++cli)
- {
- if (innerCd->isLinkableInProject() && innerCd->templateMaster()==0 &&
- (innerCd->protection()!=Private || Config_getBool("EXTRACT_PRIVATE"))
- )
- {
- msg("Generating docs for nested compound %s...\n",innerCd->name().data());
- innerCd->writeDocumentation(ol);
- innerCd->writeMemberList(ol);
- }
- innerCd->writeDocumentationForInnerClasses(ol);
- }
- }
-}
-
-// write the list of all (inherited) members for this class
-void ClassDef::writeMemberList(OutputList &ol)
-{
- if (m_allMemberNameInfoSDict->count()==0 ||
- Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) return;
- // only for HTML
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
-
- startFile(ol,m_memListFileName,m_memListFileName,
- theTranslator->trMemberList());
- startTitle(ol,0);
- ol.parseText(displayName()+" "+theTranslator->trMemberList());
- endTitle(ol,0,0);
- ol.parseText(theTranslator->trThisIsTheListOfAllMembers());
- ol.writeObjectLink(getReference(),getOutputFileBase(),0,displayName());
- ol.parseText(theTranslator->trIncludingInheritedMembers());
-
- //ol.startItemList();
- ol.writeString("<p><table>\n");
-
- //MemberNameInfo *mni=m_allMemberNameInfoList->first();
- MemberNameInfoSDict::Iterator mnii(*m_allMemberNameInfoSDict);
- MemberNameInfo *mni;
- for (mnii.toFirst();(mni=mnii.current());++mnii)
- {
- MemberInfo *mi=mni->first();
- while (mi)
- {
- MemberDef *md=mi->memberDef;
- ClassDef *cd=md->getClassDef();
- 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",
- // name().data(),md->name().data(),cd->name().data(),md->protection(),mi->prot,prot,mi->inherited);
-
-
- if (cd && !md->name().isEmpty() && md->name()[0]!='@')
- {
- bool memberWritten=FALSE;
- if (cd->isLinkable() && md->isLinkable())
- // create a link to the documentation
- {
- QCString name=mi->ambiguityResolutionScope+md->name();
- //ol.writeListItem();
- ol.writeString(" <tr class=\"memlist\"><td>");
- if (cd->isObjectiveC())
- {
- if (md->isObjCMethod())
- {
- if (md->isStatic())
- ol.writeString("+&nbsp;</td><td>");
- else
- ol.writeString("-&nbsp;</td><td>");
- }
- else
- ol.writeString("</td><td>");
- }
- if (md->isObjCMethod())
- {
- ol.writeObjectLink(md->getReference(),
- md->getOutputFileBase(),
- md->anchor(),md->name());
- }
- else
- {
- //Definition *bd = md->getGroupDef();
- //if (bd==0) bd=cd;
- ol.writeObjectLink(md->getReference(),
- md->getOutputFileBase(),
- md->anchor(),name);
-
- if ( md->isFunction() || md->isSignal() || md->isSlot() ||
- (md->isFriend() && md->argsString()))
- ol.docify(md->argsString());
- else if (md->isEnumerate())
- ol.parseText(" "+theTranslator->trEnumName());
- else if (md->isEnumValue())
- ol.parseText(" "+theTranslator->trEnumValue());
- else if (md->isTypedef())
- ol.docify(" typedef");
- else if (md->isFriend() && !strcmp(md->typeString(),"friend class"))
- ol.docify(" class");
- //ol.writeString("\n");
- }
- ol.writeString("</td>");
- memberWritten=TRUE;
- }
- else if (!Config_getBool("HIDE_UNDOC_MEMBERS") &&
- (md->protection()!=Private || Config_getBool("EXTRACT_PRIVATE") || md->isFriend())
- ) // no documentation,
- // generate link to the class instead.
- {
- //ol.writeListItem();
- ol.writeString(" <tr bgcolor=\"#f0f0f0\"><td>");
- if (cd->isObjectiveC())
- {
- if (md->isObjCMethod())
- {
- if (md->isStatic())
- ol.writeString("+&nbsp;</td><td>");
- else
- ol.writeString("-&nbsp;</td><td>");
- }
- else
- ol.writeString("</td><td>");
- }
- ol.startBold();
- ol.docify(md->name());
- ol.endBold();
- if (!md->isObjCMethod())
- {
- if ( md->isFunction() || md->isSignal() || md->isSlot() )
- ol.docify(md->argsString());
- else if (md->isEnumerate())
- ol.parseText(" "+theTranslator->trEnumName());
- else if (md->isEnumValue())
- ol.parseText(" "+theTranslator->trEnumValue());
- else if (md->isTypedef())
- ol.docify(" typedef");
- }
- ol.writeString(" (");
- ol.parseText(theTranslator->trDefinedIn()+" ");
- if (cd->isLinkable())
- {
- ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),0,cd->displayName());
- }
- else
- {
- ol.startBold();
- ol.docify(cd->displayName());
- ol.endBold();
- }
- ol.writeString(")");
- ol.writeString("</td>");
- memberWritten=TRUE;
- }
- if (memberWritten)
- {
- ol.writeString("<td>");
- ol.writeObjectLink(cd->getReference(),cd->getOutputFileBase(),
- 0,cd->displayName());
- ol.writeString("</td>");
- ol.writeString("<td>");
- }
- if (
- (prot!=Public || (virt!=Normal && !m_isObjC) ||
- md->isFriend() || md->isRelated() || md->isExplicit() ||
- md->isMutable() || (md->isInline() && Config_getBool("INLINE_INFO")) ||
- md->isSignal() || md->isSlot() ||
- md->isStatic()
- )
- && memberWritten)
- {
- ol.startTypewriter();
- ol.docify(" [");
- QStrList sl;
- if (md->isFriend()) sl.append("friend");
- else if (md->isRelated()) sl.append("related");
- else
- {
- if (Config_getBool("INLINE_INFO") && md->isInline())
- sl.append("inline");
- if (md->isExplicit()) sl.append("explicit");
- if (md->isMutable()) sl.append("mutable");
- if (prot==Protected) sl.append("protected");
- else if (prot==Private) sl.append("private");
- else if (prot==Package) sl.append("package");
- if (virt==Virtual &&
- !m_isObjC) sl.append("virtual");
- else if (virt==Pure) sl.append("pure virtual");
- if (md->isStatic()) sl.append("static");
- if (md->isSignal()) sl.append("signal");
- if (md->isSlot()) sl.append("slot");
- }
- const char *s=sl.first();
- while (s)
- {
- ol.docify(s);
- s=sl.next();
- if (s) ol.docify(", ");
- }
- ol.docify("]");
- ol.endTypewriter();
- }
- if (memberWritten)
- {
- ol.writeString("</td>");
- ol.writeString("</tr>\n");
- }
- }
- mi=mni->next();
- }
- }
- //ol.endItemList();
-
- ol.writeString("</table>");
-
- endFile(ol);
- ol.popGeneratorState();
-}
-
-
-// add a reference to an example
-bool ClassDef::addExample(const char *anchor,const char *nameStr,
- const char *file)
-{
- if (m_exampleSDict && !m_exampleSDict->find(nameStr))
- {
- Example *e=new Example;
- e->anchor=anchor;
- e->name=nameStr;
- e->file=file;
- m_exampleSDict->inSort(nameStr,e);
- return TRUE;
- }
- return FALSE;
-}
-
-// returns TRUE if this class is used in an example
-bool ClassDef::hasExamples()
-{
- if (m_exampleSDict==0)
- return FALSE;
- else
- return m_exampleSDict->count()>0;
-}
-
-
-void ClassDef::setTemplateArguments(ArgumentList *al)
-{
- if (al==0) return;
- if (!m_tempArgs) delete m_tempArgs; // delete old list if needed
- m_tempArgs=new ArgumentList;
- ArgumentListIterator ali(*al);
- Argument *a;
- for (;(a=ali.current());++ali)
- {
- m_tempArgs->append(new Argument(*a));
- }
-}
-
-/*! Returns \c TRUE iff this class or a class inheriting from this class
- * is \e not defined in an external tag file.
- */
-bool ClassDef::hasNonReferenceSuperClass()
-{
- bool found=!isReference() && isLinkableInProject() && !isHidden();
- if (found)
- {
- return TRUE; // we're done if this class is not a reference
- }
- BaseClassListIterator bcli(*m_inheritedBy);
- for ( ; bcli.current() && !found ; ++bcli ) // for each super class
- {
- 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)
- {
- QDictIterator<ClassDef> tidi(*cil);
- for ( ; tidi.current() && !found ; ++tidi) // for each template instance
- {
- // recurse into the template instance branch
- found = found || tidi.current()->hasNonReferenceSuperClass();
- }
- }
- }
- }
- return found;
-}
-
-/*! called from MemberDef::writeDeclaration() to (recusively) write the
- * definition of an annonymous struct, union or class.
- */
-void ClassDef::writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup)
-{
- //ol.insertMemberAlign();
- //printf("ClassName=`%s' inGroup=%d\n",name().data(),inGroup);
-
- //if (inGroup && md && md->getClassDef()==this) return;
-
- ol.docify(compoundTypeString());
- int ri=name().findRev("::");
- if (ri==-1) ri=name().length();
- QCString cn=name().right(name().length()-ri-2);
- if (!cn.isEmpty() && cn.at(0)!='@' && md)
- {
- ol.docify(" ");
- if (isLinkable())
- {
- ol.writeObjectLink(0,0,md->anchor(),cn);
- }
- else
- {
- ol.startBold();
- ol.docify(cn);
- ol.endBold();
- }
- }
- ol.docify(" {");
- ol.endMemberItem();
-
- // write user defined member groups
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->setInGroup(inGroup);
- mg->writePlainDeclarations(ol,this,0,0,0);
- }
-
- pubTypes.setInGroup(inGroup);
- pubTypes.writePlainDeclarations(ol,this,0,0,0);
- pubMethods.setInGroup(inGroup);
- pubMethods.writePlainDeclarations(ol,this,0,0,0);
- pubAttribs.setInGroup(inGroup);
- pubAttribs.writePlainDeclarations(ol,this,0,0,0);
- pubSlots.setInGroup(inGroup);
- pubSlots.writePlainDeclarations(ol,this,0,0,0);
- signals.setInGroup(inGroup);
- signals.writePlainDeclarations(ol,this,0,0,0);
- dcopMethods.setInGroup(inGroup);
- dcopMethods.writePlainDeclarations(ol,this,0,0,0);
- properties.setInGroup(inGroup);
- properties.writePlainDeclarations(ol,this,0,0,0);
- events.setInGroup(inGroup);
- events.writePlainDeclarations(ol,this,0,0,0);
- pubStaticMethods.setInGroup(inGroup);
- pubStaticMethods.writePlainDeclarations(ol,this,0,0,0);
- pubStaticAttribs.setInGroup(inGroup);
- pubStaticAttribs.writePlainDeclarations(ol,this,0,0,0);
- proTypes.setInGroup(inGroup);
- proTypes.writePlainDeclarations(ol,this,0,0,0);
- proMethods.setInGroup(inGroup);
- proMethods.writePlainDeclarations(ol,this,0,0,0);
- proAttribs.setInGroup(inGroup);
- proAttribs.writePlainDeclarations(ol,this,0,0,0);
- proSlots.setInGroup(inGroup);
- proSlots.writePlainDeclarations(ol,this,0,0,0);
- proStaticMethods.setInGroup(inGroup);
- proStaticMethods.writePlainDeclarations(ol,this,0,0,0);
- proStaticAttribs.setInGroup(inGroup);
- proStaticAttribs.writePlainDeclarations(ol,this,0,0,0);
- pacTypes.setInGroup(inGroup);
- pacTypes.writePlainDeclarations(ol,this,0,0,0);
- pacMethods.setInGroup(inGroup);
- pacMethods.writePlainDeclarations(ol,this,0,0,0);
- pacAttribs.setInGroup(inGroup);
- pacAttribs.writePlainDeclarations(ol,this,0,0,0);
- pacStaticMethods.setInGroup(inGroup);
- pacStaticMethods.writePlainDeclarations(ol,this,0,0,0);
- pacStaticAttribs.setInGroup(inGroup);
- pacStaticAttribs.writePlainDeclarations(ol,this,0,0,0);
- if (Config_getBool("EXTRACT_PRIVATE"))
- {
- priTypes.setInGroup(inGroup);
- priTypes.writePlainDeclarations(ol,this,0,0,0);
- priMethods.setInGroup(inGroup);
- priMethods.writePlainDeclarations(ol,this,0,0,0);
- priAttribs.setInGroup(inGroup);
- priAttribs.writePlainDeclarations(ol,this,0,0,0);
- priSlots.setInGroup(inGroup);
- priSlots.writePlainDeclarations(ol,this,0,0,0);
- priStaticMethods.setInGroup(inGroup);
- priStaticMethods.writePlainDeclarations(ol,this,0,0,0);
- priStaticAttribs.setInGroup(inGroup);
- priStaticAttribs.writePlainDeclarations(ol,this,0,0,0);
- }
- friends.setInGroup(inGroup);
- friends.writePlainDeclarations(ol,this,0,0,0);
- related.setInGroup(inGroup);
- related.writePlainDeclarations(ol,this,0,0,0);
-}
-
-/*! a link to this class is possible within this project */
-bool ClassDef::isLinkableInProject() const
-{
- if (m_templateMaster)
- {
- return m_templateMaster->isLinkableInProject();
- }
- else
- {
- return !name().isEmpty() && /* no name */
- !m_artificial &&
- name().find('@')==-1 && /* anonymous compound */
- (m_prot!=Private || Config_getBool("EXTRACT_PRIVATE")) && /* private */
- (!m_isLocal || Config_getBool("EXTRACT_LOCAL_CLASSES")) && /* local */
- hasDocumentation() && /* documented */
- !isReference() && /* not an external reference */
- (!m_isStatic || Config_getBool("EXTRACT_STATIC"));
- }
-}
-
-bool ClassDef::isLinkable() const
-{
- if (m_templateMaster)
- {
- return m_templateMaster->isLinkable();
- }
- else
- {
- return isLinkableInProject() || isReference();
- }
-}
-
-
-/*! the class is visible in a class diagram, or class hierarchy */
-bool ClassDef::isVisibleInHierarchy()
-{
- return // show all classes or a subclass is visible
- (Config_getBool("ALLEXTERNALS") || hasNonReferenceSuperClass()) &&
- // and not an annonymous compound
- name().find('@')==-1 &&
- // not an artifically introduced class
- !m_artificial &&
- // and not privately inherited
- (m_prot!=Private || Config_getBool("EXTRACT_PRIVATE")) &&
- // documented or shown anyway or documentation is external
- (hasDocumentation() ||
- !Config_getBool("HIDE_UNDOC_CLASSES") ||
- (m_templateMaster && m_templateMaster->hasDocumentation()) ||
- isReference()
- ) &&
- // is not part of an unnamed namespace or shown anyway
- (!m_isStatic || Config_getBool("EXTRACT_STATIC"));
-}
-
-bool ClassDef::hasDocumentation() const
-{
- return Definition::hasDocumentation();
-}
-
-//----------------------------------------------------------------------
-// recursive function:
-// returns TRUE iff class definition `bcd' represents an (in)direct base
-// class of class definition `cd'.
-
-bool ClassDef::isBaseClass(ClassDef *bcd, bool followInstances,int level)
-{
- bool found=FALSE;
- //printf("isBaseClass(cd=%s) looking for %s\n",cd->name().data(),bcd->name().data());
- if (level>256)
- {
- err("Possible recursive class relation while inside %s and looking for %s\n",name().data(),bcd->name().data());
- return FALSE;
- }
- BaseClassListIterator bcli(*baseClasses());
- for ( ; bcli.current() && !found ; ++bcli)
- {
- 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);
- }
- return found;
-}
-
-//----------------------------------------------------------------------------
-
-static bool isStandardFunc(MemberDef *md)
-{
- return md->name()=="operator=" || // assignment operator
- md->isConstructor() || // constructor
- md->isDestructor(); // destructor
-}
-
-/*!
- * recusively merges the `all members' lists of a class base
- * with that of this class. Must only be called for classes without
- * subclasses!
- */
-
-void ClassDef::mergeMembers()
-{
- if (m_membersMerged) return;
- m_membersMerged=TRUE;
- //printf(" mergeMembers for %s\n",name().data());
- bool inlineInheritedMembers = Config_getBool("INLINE_INHERITED_MEMB" );
- BaseClassListIterator bcli(*baseClasses());
- BaseClassDef *bcd;
- for ( ; (bcd=bcli.current()) ; ++bcli )
- {
- ClassDef *bClass=bcd->classDef;
-
- // merge the members in the base class of this inheritance branch first
- bClass->mergeMembers();
-
- MemberNameInfoSDict *srcMnd = bClass->m_allMemberNameInfoSDict;
- MemberNameInfoSDict *dstMnd = m_allMemberNameInfoSDict;
-
- 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.
- {
- MemberNameInfoIterator srcMnii(*srcMni);
- MemberInfo *srcMi;
- for ( ; (srcMi=srcMnii.current()) ; ++srcMnii )
- {
- MemberDef *srcMd = srcMi->memberDef;
- bool found=FALSE;
- bool ambigue=FALSE;
- bool hidden=FALSE;
- MemberNameInfoIterator dstMnii(*dstMni);
- MemberInfo *dstMi;
- ClassDef *srcCd = srcMd->getClassDef();
- for ( ; (dstMi=dstMnii.current()) && !found; ++dstMnii )
- {
- MemberDef *dstMd = dstMi->memberDef;
- if (srcMd!=dstMd) // different members
- {
- 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
- {
- found=matchArguments2(
- srcMd->getOuterScope(),srcMd->getFileDef(),srcMd->argumentList(),
- dstMd->getOuterScope(),dstMd->getFileDef(),dstMd->argumentList(),
- 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("::")+2);
- if (scope!=dstMi->ambiguityResolutionScope.left(scope.length()))
- dstMi->ambiguityResolutionScope.prepend(scope);
- ambigue=TRUE;
- }
- }
- else // same members
- {
- // 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()+"::"+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(dstMi->scopePath.find("::")+2);
- if (scope!=dstMi->ambiguityResolutionScope.left(scope.length()))
- {
- dstMi->ambiguityResolutionScope.prepend(scope);
- }
- ambigue=TRUE;
- }
- }
- }
- //printf("member %s::%s hidden %d ambigue %d srcMi->ambigClass=%p\n",
- // srcCd->name().data(),srcMd->name().data(),hidden,ambigue,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)
- {
- Protection prot=srcMd->protection();
- if (bcd->prot==Protected && prot==Public) prot=bcd->prot;
- else if (bcd->prot==Private) prot=bcd->prot;
-
- if (inlineInheritedMembers)
- {
- if (!isStandardFunc(srcMd))
- {
- //printf(" insertMember `%s'\n",srcMd->name().data());
- internalInsertMember(srcMd,prot,FALSE);
- }
- }
-
- 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()+"::"+srcMi->scopePath;
- if (ambigue)
- {
- //printf("$$ New member %s %s add scope %s::\n",
- // srcMi->ambiguityResolutionScope.data(),
- // srcMd->name().data(),
- // bClass->name().data());
-
- QCString scope=bClass->name()+"::";
- if (scope!=srcMi->ambiguityResolutionScope.left(scope.length()))
- {
- newMi->ambiguityResolutionScope=
- scope+srcMi->ambiguityResolutionScope.copy();
- }
- }
- if (hidden)
- {
- if (srcMi->ambigClass==0)
- {
- newMi->ambigClass=bClass;
- newMi->ambiguityResolutionScope=bClass->name()+"::";
- }
- else
- {
- newMi->ambigClass=srcMi->ambigClass;
- newMi->ambiguityResolutionScope=srcMi->ambigClass->name()+"::";
- }
- }
- dstMni->append(newMi);
- }
- }
- }
- 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 = 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)
- {
- 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 (mi->prot!=Private)
- {
- Specifier virt=mi->virt;
- if (mi->virt==Normal && bcd->virt!=Normal) virt=bcd->virt;
-
- if (inlineInheritedMembers)
- {
- if (!isStandardFunc(mi->memberDef))
- {
- //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()+"::"+mi->scopePath;
- newMi->ambigClass=mi->ambigClass;
- newMi->ambiguityResolutionScope=mi->ambiguityResolutionScope.copy();
- newMni->append(newMi);
- }
- }
-
- // add it to the dictionary
- dstMnd->append(newMni->memberName(),newMni);
- }
- }
- }
- //printf(" end mergeMembers\n");
-}
-
-//----------------------------------------------------------------------------
-
-/*! Merges the members of a Objective-C category into this class.
- */
-void ClassDef::mergeCategory(ClassDef *category)
-{
- category->m_categoryOf = this;
-
- MemberNameInfoSDict *srcMnd = category->m_allMemberNameInfoSDict;
- MemberNameInfoSDict *dstMnd = m_allMemberNameInfoSDict;
-
- MemberNameInfoSDict::Iterator srcMnili(*srcMnd);
- MemberNameInfo *srcMni;
- for ( ; (srcMni=srcMnili.current()) ; ++srcMnili)
- {
- MemberNameInfo *dstMni=dstMnd->find(srcMni->memberName());
- if (dstMni) // method is already defined in the class
- {
- // TODO: we should remove the other member and insert this one.
- }
- else // new method name
- {
- // 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 category to this class
- MemberNameInfoIterator mnii(*srcMni);
- MemberInfo *mi;
- for (;(mi=mnii.current());++mnii)
- {
- //printf("Adding!\n");
- MemberInfo *newMi=new MemberInfo(mi->memberDef,mi->prot,mi->virt,mi->inherited);
- newMi->scopePath=mi->scopePath;
- newMi->ambigClass=mi->ambigClass;
- newMi->ambiguityResolutionScope=mi->ambiguityResolutionScope.copy();
- newMni->append(newMi);
- }
-
- // add it to the dictionary
- dstMnd->append(newMni->memberName(),newMni);
- }
- }
-}
-
-//----------------------------------------------------------------------------
-
-void ClassDef::addUsedClass(ClassDef *cd,const char *accessName)
-{
- //printf("%s::addUsedClass(%s,%s)\n",name().data(),cd->name().data(),accessName);
- if (m_usesImplClassDict==0)
- {
- m_usesImplClassDict = new UsesClassDict(17);
- m_usesImplClassDict->setAutoDelete(TRUE);
- }
- UsesClassDef *ucd=m_usesImplClassDict->find(cd->name());
- if (ucd==0)
- {
- ucd = new UsesClassDef(cd);
- m_usesImplClassDict->insert(cd->name(),ucd);
- //printf("Adding used class %s to class %s\n",
- // cd->name().data(),name().data());
- }
- ucd->addAccessor(accessName);
-}
-
-void ClassDef::addUsedByClass(ClassDef *cd,const char *accessName)
-{
- if (m_usedByImplClassDict==0)
- {
- m_usedByImplClassDict = new UsesClassDict(17);
- m_usedByImplClassDict->setAutoDelete(TRUE);
- }
- UsesClassDef *ucd=m_usedByImplClassDict->find(cd->name());
- if (ucd==0)
- {
- ucd = new UsesClassDef(cd);
- m_usedByImplClassDict->insert(cd->name(),ucd);
- //printf("Adding used by class %s to class %s\n",
- // cd->name().data(),name().data());
- }
- ucd->addAccessor(accessName);
-}
-
-
-#if 0
-/*! Builds up a dictionary of all classes that are used by the state of this
- * class (the "implementation").
- * Must be called before mergeMembers() is called!
- */
-
-void ClassDef::determineImplUsageRelation()
-{
- MemberNameInfoSDict::Iterator mnili(*m_allMemberNameInfoSDict);
- MemberNameInfo *mni;
- for (;(mni=mnili.current());++mnili)
- {
- MemberNameInfoIterator mnii(*mni);
- MemberInfo *mi;
- for (mnii.toFirst();(mi=mnii.current());++mnii)
- {
- MemberDef *md=mi->memberDef;
- if (md->isVariable()) // for each member variable in this class
- {
- QCString type=removeRedundantWhiteSpace(md->typeString());
- //printf("in class %s found var type=`%s' name=`%s'\n",
- // name().data(),type.data(),md->name().data());
- int pos=0;
- QCString usedClassName;
- QCString templSpec;
- bool found=FALSE;
- while (extractClassNameFromType(type,pos,usedClassName,templSpec)!=-1 && !found)
- {
- //printf("usedClassName=`%s' templSpec=%s\n",usedClassName.data(),templSpec.data());
- // check if usedClassName is a template argument of its class
- ClassDef *cd=md->getClassDef();
- if (cd && cd->templateArguments())
- {
- ArgumentListIterator ali(*cd->templateArguments());
- Argument *arg;
- int count=0;
- for (ali.toFirst();(arg=ali.current());++ali,++count)
- {
- if (arg->name==usedClassName) // type is a template argument
- {
- found=TRUE;
- if (m_usesImplClassDict==0) m_usesImplClassDict = new UsesClassDict(257);
- cd = new ClassDef(cd->getDefFileName(),cd->getDefLine(),
- usedClassName,ClassDef::Class);
- cd->setIsTemplateBaseClass(count);
- UsesClassDef *ucd = new UsesClassDef(cd);
- m_usesImplClassDict->insert(cd->name(),ucd);
- ucd->templSpecifiers = templSpec;
- ucd->addAccessor(md->name());
- Doxygen::hiddenClasses.append(cd);
- //printf("Adding used template argument %s to class %s\n",
- // cd->name().data(),name().data());
- //printf("Adding accessor %s to class %s\n",
- // md->name().data(),ucd->classDef->name().data());
- }
- }
- }
-
- if (!found)
- {
- cd=0;
- if (getNamespaceDef()!=0)
- {
- cd=getResolvedClass(getNamespaceDef()->name()+"::"+usedClassName,0,&templSpec);
- }
- if (cd==0) cd=getResolvedClass(name()+"::"+usedClassName,0,&templSpec);
- if (cd==0) cd=getResolvedClass(usedClassName,0,&templSpec); // TODO: also try inbetween scopes!
- //printf("Search for class %s result=%p\n",usedClassName.data(),cd);
- if (cd) // class exists
- {
- found=TRUE;
- if (m_usesImplClassDict==0)
- {
- m_usesImplClassDict = new UsesClassDict(257);
- m_usesImplClassDict->setAutoDelete(TRUE);
- }
- UsesClassDef *ucd=m_usesImplClassDict->find(cd->name());
- if (ucd==0 || ucd->templSpecifiers!=templSpec)
- {
- ucd = new UsesClassDef(cd);
- m_usesImplClassDict->insert(cd->name(),ucd);
- ucd->templSpecifiers = templSpec;
- //printf("Adding used class %s to class %s\n",
- // cd->name().data(),name().data());
- }
- ucd->addAccessor(md->name());
- //printf("Adding accessor %s to class %s\n",
- // md->name().data(),ucd->classDef->name().data());
- }
- }
- }
- }
- }
- }
-#ifdef DUMP
- if (m_usesClassDict)
- {
- msg("Class %s uses the following classes:\n",name().data());
- UsesClassDictIterator ucdi(*m_usesClassDict);
- UsesClassDef *ucd;
- for (;(ucd=ucdi.current());++ucdi)
- {
- msg(" %s via ",ucd->classDef->name().data());
- QDictIterator<void> dvi(*ucd->accessors);
- const char *s;
- for (;(s=dvi.currentKey());++dvi)
- {
- msg("%s ",s);
- }
- msg("\n");
- }
- }
-#endif
-}
-
-//----------------------------------------------------------------------------
-
-// I have disabled this code because the graphs it renders quickly become
-// too large to be of practical use.
-
-void ClassDef::addUsedInterfaceClasses(MemberDef *md,const char *typeStr)
-{
- QCString type = typeStr;
- static const QRegExp re("[a-z_A-Z][a-z_A-Z0-9:]*");
- int p=0,i,l;
- while ((i=re.match(type,p,&l))!=-1) // for each class name in the type
- {
- ClassDef *cd=getClass(name()+"::"+type.mid(i,l));
- if (cd==0) cd=getClass(type.mid(i,l)); // TODO: also try inbetween scopes!
- if (cd && cd!=this && !isBaseClass(cd))
- {
- if (m_usesIntfClassDict==0)
- {
- m_usesIntfClassDict = new UsesClassDict(257);
- }
- UsesClassDef *ucd=m_usesIntfClassDict->find(cd->name());
- if (ucd==0)
- {
- ucd = new UsesClassDef(cd);
- m_usesIntfClassDict->insert(cd->name(),ucd);
- //printf("in class `%s' adding used intf class `%s'\n",
- // name().data(),cd->name().data());
- }
- ucd->addAccessor(md->name());
- //printf("in class `%s' adding accessor `%s' to class `%s'\n",
- // name().data(),md->name().data(),ucd->classDef->name().data());
- }
- p=i+l;
- }
-}
-
-void ClassDef::determineIntfUsageRelation()
-{
- MemberNameInfoSDict::Iterator mnili(*m_allMemberNameInfoList);
- MemberNameInfo *mni;
- for (;(mni=mnili.current());++mnili)
- {
- MemberNameInfoIterator mnii(*mni);
- MemberInfo *mi;
- for (mnii.toFirst();(mi=mnii.current());++mnii)
- {
- MemberDef *md=mi->memberDef;
-
- // compute the protection level for this member
- Protection protect=md->protection();
- if (mi->prot==Protected) // inherited protection
- {
- if (protect==Public) protect=Protected;
- else if (protect==Protected) protect=Private;
- }
-
- if (!md->name().isEmpty() && md->name()[0]!='@' &&
- (mi->prot!=Private && protect!=Private)
- )
- {
- // add classes found in the return type
- addUsedInterfaceClasses(md,md->typeString());
- ArgumentList *al = md->argumentList();
- if (al) // member has arguments
- {
- // add classes found in the types of the argument list
- ArgumentListIterator ali(*al);
- Argument *a;
- for (;(a=ali.current());++ali)
- {
- if (!a->type.isEmpty() && a->type.at(0)!='@')
- {
- addUsedInterfaceClasses(md,a->type);
- }
- }
- }
- }
- }
- }
-}
-#endif
-
-QCString ClassDef::compoundTypeString() const
-{
- if (m_compType==Interface && m_isObjC) return "class";
- switch (m_compType)
- {
- case Class: return "class";
- case Struct: return "struct";
- case Union: return "union";
- case Interface: return "interface";
- case Protocol: return "protocol";
- case Category: return "category";
- case Exception: return "exception";
- default: return "unknown";
- }
-}
-
-QCString ClassDef::getOutputFileBase() const
-{
- if (m_templateMaster)
- {
- return m_templateMaster->getOutputFileBase();
- }
- else if (isReference())
- {
- return m_fileName;
- }
- else
- {
- return convertNameToFile(m_fileName);
- }
-}
-
-QCString ClassDef::getInstanceOutputFileBase() const
-{
- if (isReference())
- {
- return m_fileName;
- }
- else
- {
- return convertNameToFile(m_fileName);
- }
-}
-
-QCString ClassDef::getFileBase() const
-{
- if (m_templateMaster)
- {
- return m_templateMaster->getFileBase();
- }
- else
- {
- return m_fileName;
- }
-}
-
-QCString ClassDef::getSourceFileBase() const
-{
- if (m_templateMaster)
- {
- return m_templateMaster->getSourceFileBase();
- }
- else
- {
- return convertNameToFile(m_fileName+"-source");
- }
-}
-
-void ClassDef::setGroupDefForAllMembers(GroupDef *gd,Grouping::GroupPri_t pri,const QCString &fileName,int startLine,bool hasDocs)
-{
- gd->addClass(this);
- //printf("ClassDef::setGroupDefForAllMembers(%s)\n",gd->name().data());
- MemberNameInfoSDict::Iterator mnili(*m_allMemberNameInfoSDict);
- MemberNameInfo *mni;
- for (;(mni=mnili.current());++mnili)
- {
- MemberNameInfoIterator mnii(*mni);
- MemberInfo *mi;
- for (mnii.toFirst();(mi=mnii.current());++mnii)
- {
- 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);
- }
- }
-}
-
-void ClassDef::addInnerCompound(Definition *d)
-{
- m_innerClasses->inSort(d->localName(),(ClassDef *)d);
-}
-
-Definition *ClassDef::findInnerCompound(const char *name)
-{
- if (name==0) return 0;
- return m_innerClasses->find(name);
-}
-
-//void ClassDef::initTemplateMapping()
-//{
-// m_templateMapping->clear();
-// ArgumentList *al = templateArguments();
-// if (al)
-// {
-// ArgumentListIterator ali(*al);
-// Argument *arg;
-// for (ali.toFirst();(arg=ali.current());++ali)
-// {
-// setTemplateArgumentMapping(arg->name,arg->defval);
-// }
-// }
-//}
-//void ClassDef::setTemplateArgumentMapping(const char *formal,const char *actual)
-//{
-// //printf("ClassDef::setTemplateArgumentMapping(%s,%s)\n",formal,actual);
-// if (m_templateMapping && formal)
-// {
-// if (m_templateMapping->find(formal))
-// {
-// m_templateMapping->remove(formal);
-// }
-// m_templateMapping->insert(formal,new QCString(actual));
-// }
-//}
-//
-//QCString ClassDef::getTemplateArgumentMapping(const char *formal) const
-//{
-// if (m_templateMapping && formal)
-// {
-// QCString *s = m_templateMapping->find(formal);
-// if (s)
-// {
-// return *s;
-// }
-// }
-// return "";
-//}
-
-ClassDef *ClassDef::insertTemplateInstance(const QCString &fileName,
- int startLine, const QCString &templSpec,bool &freshInstance)
-{
- freshInstance = FALSE;
- if (m_templateInstances==0)
- {
- m_templateInstances = new QDict<ClassDef>(17);
- }
- ClassDef *templateClass=m_templateInstances->find(templSpec);
- if (templateClass==0)
- {
- Debug::print(Debug::Classes,0," New template instance class `%s'`%s'\n",name().data(),templSpec.data());
- templateClass = new ClassDef(
- fileName,startLine,name()+templSpec,ClassDef::Class);
- templateClass->setTemplateMaster(this);
- templateClass->setOuterScope(getOuterScope());
- templateClass->setHidden(isHidden());
- m_templateInstances->insert(templSpec,templateClass);
- freshInstance=TRUE;
- }
- return templateClass;
-}
-
-ClassDef *ClassDef::getVariableInstance(const char *templSpec)
-{
- if (m_variableInstances==0)
- {
- m_variableInstances = new QDict<ClassDef>(17);
- m_variableInstances->setAutoDelete(TRUE);
- }
- ClassDef *templateClass=m_variableInstances->find(templSpec);
- if (templateClass==0)
- {
- Debug::print(Debug::Classes,0," New template variable instance class `%s'`%s'\n",name().data(),templSpec);
- templateClass = new ClassDef("<code>",1,name()+templSpec,
- ClassDef::Class,0,0,FALSE);
- templateClass->addMembersToTemplateInstance( this, templSpec );
- templateClass->setTemplateMaster(this);
- m_variableInstances->insert(templSpec,templateClass);
- }
- return templateClass;
-}
-
-void ClassDef::setTemplateBaseClassNames(QDict<int> *templateNames)
-{
- if (templateNames==0) return;
- if (m_templBaseClassNames==0)
- {
- m_templBaseClassNames = new QDict<int>(17);
- m_templBaseClassNames->setAutoDelete(TRUE);
- }
- // make a deep copy of the dictionary.
- QDictIterator<int> qdi(*templateNames);
- for (;qdi.current();++qdi)
- {
- if (m_templBaseClassNames->find(qdi.currentKey())==0)
- {
- m_templBaseClassNames->insert(qdi.currentKey(),new int(*qdi.current()));
- }
- }
-}
-
-QDict<int> *ClassDef::getTemplateBaseClassNames() const
-{
- return m_templBaseClassNames;
-}
-
-void ClassDef::addMembersToTemplateInstance(ClassDef *cd,const char *templSpec)
-{
- //printf("%s::addMembersToTemplateInstance(%s,%s)\n",name().data(),cd->name().data(),templSpec);
- MemberNameInfoSDict::Iterator mnili(*cd->m_allMemberNameInfoSDict);
- MemberNameInfo *mni;
- for (;(mni=mnili.current());++mnili)
- {
- MemberNameInfoIterator mnii(*mni);
- MemberInfo *mi;
- for (mnii.toFirst();(mi=mnii.current());++mnii)
- {
- ArgumentList *actualArguments = new ArgumentList;
- stringToArgumentList(templSpec,actualArguments);
- MemberDef *md = mi->memberDef;
- MemberDef *imd = md->createTemplateInstanceMember(
- cd->templateArguments(),actualArguments);
- delete actualArguments;
- //printf("%s->setMemberClass(%p)\n",imd->name().data(),this);
- imd->setMemberClass(this);
- imd->setTemplateMaster(md);
- 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());
- insertMember(imd);
- //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[imd->name()];
- if (mn==0)
- {
- mn = new MemberName(imd->name());
- Doxygen::memberNameSDict.append(imd->name(),mn);
- }
- mn->append(imd);
- }
- }
-}
-
-QCString ClassDef::getReference() const
-{
- if (m_templateMaster)
- {
- return m_templateMaster->getReference();
- }
- else
- {
- return Definition::getReference();
- }
-}
-
-bool ClassDef::isReference() const
-{
- if (m_templateMaster)
- {
- return m_templateMaster->isReference();
- }
- else
- {
- return Definition::isReference();
- }
-}
-
-void ClassDef::getTemplateParameterLists(QList<ArgumentList> &lists) const
-{
- Definition *d=getOuterScope();
- if (d)
- {
- if (d->definitionType()==Definition::TypeClass)
- {
- ClassDef *cd=(ClassDef *)d;
- cd->getTemplateParameterLists(lists);
- }
- }
- if (templateArguments())
- {
- lists.append(templateArguments());
- }
-}
-
-QCString ClassDef::qualifiedNameWithTemplateParameters(
- QList<ArgumentList> *actualParams) const
-{
- static bool optimizeOutputJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
- //printf("qualifiedNameWithTemplateParameters() localName=%s\n",localName().data());
- QCString scName;
- Definition *d=getOuterScope();
- if (d)
- {
- if (d->definitionType()==Definition::TypeClass)
- {
- ClassDef *cd=(ClassDef *)d;
- scName = cd->qualifiedNameWithTemplateParameters(actualParams);
- }
- else
- {
- scName = d->qualifiedName();
- }
- }
-
- QCString scopeSeparator;
- if (optimizeOutputJava)
- scopeSeparator=".";
- else
- scopeSeparator="::";
-
- if (!scName.isEmpty()) scName+=scopeSeparator;
- scName+=localName();
- ArgumentList *al=0;
- bool isSpecialization = localName().find('<')!=-1;
- if (templateArguments())
- {
- if (actualParams && (al=actualParams->current()))
- {
- if (!isSpecialization)
- {
- scName+=tempArgListToString(al);
- }
- actualParams->next();
- }
- else
- {
- if (!isSpecialization)
- {
- scName+=tempArgListToString(templateArguments());
- }
- }
- }
- //printf("qualifiedNameWithTemplateParameters: scope=%s qualifiedName=%s\n",name().data(),scName.data());
- return scName;
-}
-
-QCString ClassDef::className() const
-{
- return m_className;
-};
-
-void ClassDef::addListReferences()
-{
- if (!isLinkableInProject()) return;
- //printf("ClassDef(%s)::addListReferences()\n",name().data());
- addRefItem(xrefListItems(),
- theTranslator->trClass(TRUE,TRUE),
- getOutputFileBase(),displayName()
- );
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->addListReferences(this);
- }
- constructors.addListReferences(this);
- typedefMembers.addListReferences(this);
- enumMembers.addListReferences(this);
- enumValMembers.addListReferences(this);
- functionMembers.addListReferences(this);
- relatedMembers.addListReferences(this);
- variableMembers.addListReferences(this);
- propertyMembers.addListReferences(this);
- eventMembers.addListReferences(this);
-}
-
-MemberDef *ClassDef::getMemberByName(const QCString &name)
-{
- MemberDef *xmd = 0;
- MemberNameInfo *mni = m_allMemberNameInfoSDict->find(name);
- if (mni)
- {
- const int maxInheritanceDepth = 100000;
- int mdist=maxInheritanceDepth;
- MemberNameInfoIterator mnii(*mni);
- MemberInfo *mi;
- for (mnii.toFirst();(mi=mnii.current());++mnii)
- {
- 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;
- }
- }
- }
- //printf("getMemberByName(%s)=%p\n",name.data(),xmd);
- return xmd;
-}
-
diff --git a/src/classdef.h b/src/classdef.h
deleted file mode 100644
index ce572ee..0000000
--- a/src/classdef.h
+++ /dev/null
@@ -1,581 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 CLASSDEF_H
-#define CLASSDEF_H
-
-#include "qtbc.h"
-#include <qlist.h>
-#include <qdict.h>
-#include <qstrlist.h>
-
-#include "entry.h"
-#include "memberlist.h"
-#include "definition.h"
-#include "sortdict.h"
-
-class MemberDict;
-class ClassList;
-class ClassSDict;
-class OutputList;
-class FileDef;
-class BaseClassList;
-class NamespaceDef;
-class MemberDef;
-class ExampleSDict;
-class MemberNameInfoSDict;
-class UsesClassDict;
-class MemberGroupSDict;
-class QTextStream;
-class PackageDef;
-class GroupDef;
-class StringDict;
-struct IncludeInfo;
-
-/*! \brief This class contains all information about a compound.
- *
- * A compound can be a class, struct, union, interface, or exception.
- * \note This class should be renamed to CompoundDef
- */
-class ClassDef : public Definition
-{
- public:
- /*! \name Public API
- * \{
- */
-
- /*! The various compound types */
- enum CompoundType { Class=Entry::CLASS_SEC,
- Struct=Entry::STRUCT_SEC,
- Union=Entry::UNION_SEC,
- Interface=Entry::INTERFACE_SEC,
- Protocol=Entry::PROTOCOL_SEC,
- Category=Entry::CATEGORY_SEC,
- Exception=Entry::EXCEPTION_SEC
- };
- DefType definitionType() const { return TypeClass; }
- QCString getOutputFileBase() const;
- QCString getInstanceOutputFileBase() const;
- QCString getFileBase() const;
- QCString getSourceFileBase() const;
- QCString getReference() const;
- bool isReference() const;
- bool isLocal() const { return m_isLocal; }
- bool isArtificial() const { return m_artificial; }
-
- bool hasDocumentation() const;
-
- /*! Returns the name as it is appears in the documentation */
- QCString displayName() const;
-
- /*! Returns the type of compound this is */
- CompoundType compoundType() const { return m_compType; }
-
- /*! Returns the type of compound as a string */
- QCString compoundTypeString() const;
-
- /*! Returns the list of base classes from which this class directly
- * inherits.
- */
- BaseClassList *baseClasses() { return m_inherits; }
-
- /*! Returns the list of sub classes that directly inherit from this class
- */
- BaseClassList *subClasses() { return m_inheritedBy; }
-
- /*! Returns a dictionary of all members. This includes any inherited
- * members. Members are sorted alphabetically.
- */
- MemberNameInfoSDict *memberNameInfoSDict() { return m_allMemberNameInfoSDict; }
-
- void writeDocumentation(OutputList &ol);
- void writeDocumentationForInnerClasses(OutputList &ol);
- void writeMemberDocumentation(OutputList &ol);
- void writeMemberPages(OutputList &ol);
- void writeMemberList(OutputList &ol);
- void writeDeclaration(OutputList &ol,MemberDef *md,bool inGroup);
- void writeDetailedDescription(OutputList &ol,const QCString &pageType,bool exampleFlag);
- void writeQuickMemberLinks(OutputList &ol,MemberDef *md) const;
-
- /*! Return the protection level (Public,Protected,Private) in which
- * this compound was found.
- */
- Protection protection() const { return m_prot; }
-
- /*! returns TRUE iff a link is possible to an item within this project.
- */
- bool isLinkableInProject() const;
-
- /*! return TRUE iff a link to this class is possible (either within
- * this project, or as a cross-reference to another project).
- */
- bool isLinkable() const;
-
- /*! the class is visible in a class diagram, or class hierarchy */
- bool isVisibleInHierarchy();
-
- /*! Returns the template arguments of this class
- * Will return 0 if not applicable.
- */
- ArgumentList *templateArguments() const { return m_tempArgs; }
-
- /*! Returns the namespace this compound is in, or 0 if it has a global
- * scope.
- */
- NamespaceDef *getNamespaceDef() { return m_nspace; }
-
- /*! Returns the file in which this compound's definition can be found.
- * Should not return 0 (but it might be a good idea to check anyway).
- */
- FileDef *getFileDef() const { return m_fileDef; }
-
- /*! Returns the Java package this class is in or 0 if not applicable.
- */
- //PackageDef *packageDef() const;
-
- MemberDef *getMemberByName(const QCString &);
-
- /*! Returns TRUE iff \a bcd is a direct or indirect base class of this
- * class. This function will recusively traverse all branches of the
- * inheritance tree.
- */
- bool isBaseClass(ClassDef *bcd,bool followInstances,int level=0);
-
- /*! Returns a sorted dictionary with all template instances found for
- * this template class. Returns 0 if not a template or no instances.
- */
- QDict<ClassDef> *getTemplateInstances() const { return m_templateInstances; }
- /*! Returns the template master of which this class is an instance.
- * Returns 0 if not applicable.
- */
- ClassDef *templateMaster() const { return m_templateMaster; }
-
- bool isTemplate() const { return m_tempArgs!=0; }
-
- IncludeInfo *includeInfo() const { return m_incInfo; }
-
- UsesClassDict *usedImplementationClasses() const
- {
- return m_usesImplClassDict;
- }
-
- UsesClassDict *usedByImplementationClasses() const
- {
- return m_usedByImplClassDict;
- }
-
- UsesClassDict *usedInterfaceClasses() const
- {
- return m_usesIntfClassDict;
- }
-
- /*! Returns the definition of a nested compound if
- * available, or 0 otherwise.
- * @param name The name of the nested compound
- */
- virtual Definition *findInnerCompound(const char *name);
-
- /*! Returns the template parameter lists that form the template
- * declaration of this class.
- *
- * Example: <code>template<class T> class TC {};</code>
- * will return a list with one ArgumentList containing one argument
- * with type="class" and name="T".
- */
- void getTemplateParameterLists(QList<ArgumentList> &lists) const;
- QCString qualifiedNameWithTemplateParameters(
- QList<ArgumentList> *actualParams=0) const;
-
- /*! Returns TRUE if there is at least one pure virtual member in this
- * class.
- */
- bool isAbstract() const { return m_isAbstract; }
-
- /*! Returns TRUE if this class is implemented in Objective-C */
- bool isObjectiveC() const { return m_isObjC; }
-
- ClassDef *categoryOf() const { return m_categoryOf; }
-
- /*! returns the name of the class including outer classes, but not
- * including namespaces.
- */
- QCString className() const;
-
- /* member lists by protection */
- MemberList pubMethods;
- MemberList proMethods;
- MemberList pacMethods;
- MemberList priMethods;
- MemberList pubStaticMethods;
- MemberList proStaticMethods;
- MemberList pacStaticMethods;
- MemberList priStaticMethods;
- MemberList pubSlots;
- MemberList proSlots;
- MemberList priSlots;
- MemberList pubAttribs;
- MemberList proAttribs;
- MemberList pacAttribs;
- MemberList priAttribs;
- MemberList pubStaticAttribs;
- MemberList proStaticAttribs;
- MemberList pacStaticAttribs;
- MemberList priStaticAttribs;
- MemberList pubTypes;
- MemberList proTypes;
- MemberList pacTypes;
- MemberList priTypes;
- MemberList related;
- MemberList signals;
- MemberList friends;
- MemberList dcopMethods;
- MemberList properties;
- MemberList events;
-
- /* member list by types */
- MemberList constructors;
- MemberList typedefMembers;
- MemberList enumMembers;
- MemberList enumValMembers;
- MemberList functionMembers;
- MemberList relatedMembers;
- MemberList variableMembers;
- MemberList propertyMembers;
- MemberList eventMembers;
-
- /* user defined member groups */
- MemberGroupSDict *memberGroupSDict;
-
- /*! \} Public API */
-
- /*! \name Doxygen internal API
- * \{
- */
- void insertBaseClass(ClassDef *,const char *name,Protection p,Specifier s,const char *t=0);
- void insertSubClass(ClassDef *,Protection p,Specifier s,const char *t=0);
- void setIncludeFile(FileDef *fd,const char *incName,bool local,bool force);
- void insertMember(MemberDef *);
- void insertUsedFile(const char *);
- void computeAnchors();
- //void computeMemberGroups();
- //void setAnchor(MemberDef *);
- //void dumpMembers();
- bool addExample(const char *anchor,const char *name, const char *file);
- void addMembersToMemberGroup();
- void distributeMemberGroupDocumentation();
- void findSectionsInDocumentation();
- void setNamespace(NamespaceDef *nd) { m_nspace = nd; }
- void setTemplateArguments(ArgumentList *al);
- void mergeMembers();
- void mergeCategory(ClassDef *category);
- void setFileDef(FileDef *fd) { m_fileDef=fd; }
- //void determineImplUsageRelation();
- //void determineIntfUsageRelation();
- void setSubGrouping(bool enabled) { m_subGrouping = enabled; }
- void setProtection(Protection p) { m_prot=p; }
- void setGroupDefForAllMembers(GroupDef *g,Grouping::GroupPri_t pri,const QCString &fileName,int startLine,bool hasDocs);
- void addInnerCompound(Definition *d);
- void addUsedClass(ClassDef *cd,const char *accessName);
- void addUsedByClass(ClassDef *cd,const char *accessName);
- //void initTemplateMapping();
- //void setTemplateArgumentMapping(const char *formal,const char *actual);
- //QCString getTemplateArgumentMapping(const char *formal) const;
- ClassDef *insertTemplateInstance(const QCString &fileName,int startLine,
- const QCString &templSpec,bool &freshInstance);
- ClassDef *getVariableInstance(const char *templSpec);
- void setTemplateBaseClassNames(QDict<int> *templateNames);
- QDict<int> *getTemplateBaseClassNames() const;
- void setTemplateMaster(ClassDef *tm) { m_templateMaster=tm; }
- void addMembersToTemplateInstance(ClassDef *cd,const char *templSpec);
- void setClassIsArtificial() { m_artificial = TRUE; }
- void setIsStatic(bool b) { m_isStatic=b; }
- void setIsObjectiveC(bool b) { m_isObjC=b; }
- void addListReferences();
- void setCompoundType(CompoundType t) { m_compType = t; }
-
- /*! Creates a new compound definition.
- * \param fileName full path and file name in which this compound was
- * found.
- * \param startLine line number where the definition of this compound
- * starts.
- * \param name the name of this compound (including scope)
- * \param ct the kind of Compound
- * \param ref the tag file from which this compound is extracted
- * or 0 if the compound doesn't come from a tag file
- * \param fName the file name as found in the tag file.
- * This overwrites the file that doxygen normally
- * generates based on the compound type & name.
- * \param isSymbol If TRUE this class name is added as a publicly
- * visible (and referencable) symbol.
- */
- ClassDef(const char *fileName,int startLine,
- const char *name,CompoundType ct,
- const char *ref=0,const char *fName=0,
- bool isSymbol=TRUE);
- /*! Destroys a compound definition. */
- ~ClassDef();
-
- ClassSDict *getInnerClasses() { return m_innerClasses; }
-
- bool visited;
-
- protected:
- void addUsedInterfaceClasses(MemberDef *md,const char *typeStr);
- bool hasExamples();
- bool hasNonReferenceSuperClass();
- void showUsedFiles(OutputList &ol);
-
- /*! \} Interal API */
-
- private:
- void internalInsertMember(MemberDef *md,Protection prot,bool addToAllList);
-
- /*! file name that forms the base for the output file containing the
- * class documentation. For compatibility with Qt (e.g. links via tag
- * files) this name cannot be derived from the class name directly.
- */
- QCString m_fileName;
-
- /*! Include information about the header file should be included
- * in the documentation. 0 by default, set by setIncludeFile().
- */
- IncludeInfo *m_incInfo;
-
- /*! file name that forms the base for the "list of members" for this
- * class.
- */
- QCString m_memListFileName;
-
- /*! Bare name of the class without any scoping prefixes
- * (like for nested classes and classes inside namespaces)
- */
- //QCString m_scopelessName;
-
- /*! List of base class (or super-classes) from which this class derives
- * directly.
- */
- BaseClassList *m_inherits;
-
- /*! List of sub-classes that directly derive from this class
- */
- BaseClassList *m_inheritedBy;
-
- /*! Namespace this class is part of
- * (this is the inner most namespace in case of nested namespaces)
- */
- NamespaceDef *m_nspace;
-
- /*! File this class is defined in */
- FileDef *m_fileDef;
-
- /*! List of all members (including inherited members) */
- MemberNameInfoSDict *m_allMemberNameInfoSDict;
-
- /*! Template arguments of this class */
- ArgumentList *m_tempArgs;
-
- /*! Files that were used for generating the class documentation. */
- QStrList m_files;
-
- /*! Examples that use this class */
- ExampleSDict *m_exampleSDict;
-
- /*! Holds the kind of "class" this is. */
- CompoundType m_compType;
-
- /*! The protection level in which this class was found.
- * Typically Public, but for nested classes this can also be Protected
- * or Private.
- */
- Protection m_prot;
-
- /*! Does this class group its user-grouped members
- * as a sub-section of the normal (public/protected/..)
- * groups?
- */
- bool m_subGrouping;
-
- /*! The inner classes contained in this class. Will be 0 if there are
- * no inner classes.
- */
- ClassSDict *m_innerClasses;
-
-
- /* classes for the collaboration diagram */
- UsesClassDict *m_usesImplClassDict;
- UsesClassDict *m_usedByImplClassDict;
- UsesClassDict *m_usesIntfClassDict;
-
- /*! Template instances that exists of this class, the key in the
- * dictionary is the template argument list.
- */
- QDict<ClassDef> *m_templateInstances;
-
- /*! Template instances that exists of this class, as defined by variables.
- * We do NOT want to document these individually. The key in the
- * dictionary is the template argument list.
- */
- QDict<ClassDef> *m_variableInstances;
-
- QDict<int> *m_templBaseClassNames;
-
- /*! The class this class is an instance of. */
- ClassDef *m_templateMaster;
-
- /*! Indicated whether this class exists because it is used by
- * some other class only (TRUE) or if some class inherits from
- * it (FALSE). This is need to remove used-only classes from
- * the inheritance tree.
- */
- bool m_artificial;
-
- /*! Is this an abstact class? */
- bool m_isAbstract;
-
- /*! Is the class part of an unnamed namespace? */
- bool m_isStatic;
-
- /*! Is the class part implemented in Objective C? */
- bool m_isObjC;
-
- /*! TRUE if classes members are merged with those of the base classes. */
- bool m_membersMerged;
-
- /*! TRUE if the class is defined in a source file rather than a header file. */
- bool m_isLocal;
-
- /*! class name with outer class scope, but without namespace scope. */
- QCString m_className;
-
- /*! If this class is a Objective-C category, then this points to the
- * class which is extended.
- */
- ClassDef *m_categoryOf;
-};
-
-/*! \brief Class that contains information about a usage relation.
- */
-struct UsesClassDef
-{
- UsesClassDef(ClassDef *cd) : classDef(cd)
- {
- accessors = new QDict<void>(17);
- containment = TRUE;
- }
- ~UsesClassDef()
- {
- delete accessors;
- }
- void addAccessor(const char *s)
- {
- if (accessors->find(s)==0)
- {
- accessors->insert(s,(void *)666);
- }
- }
- /*! Class definition that this relation uses. */
- ClassDef *classDef;
-
- /*! Dictionary of member variable names that form the edge labels of the
- * usage relation.
- */
- QDict<void> *accessors;
-
- /*! Template arguments used for the base class */
- QCString templSpecifiers;
-
- bool containment;
-};
-
-/*! \brief Dictionary of usage relations.
- */
-class UsesClassDict : public QDict<UsesClassDef>
-{
- public:
- UsesClassDict(int size) : QDict<UsesClassDef>(size) {}
- ~UsesClassDict() {}
-};
-
-/*! \brief Iterator class to iterate over a dictionary of usage relations.
- */
-class UsesClassDictIterator : public QDictIterator<UsesClassDef>
-{
- public:
- UsesClassDictIterator(const QDict<UsesClassDef> &d)
- : QDictIterator<UsesClassDef>(d) {}
- ~UsesClassDictIterator() {}
-};
-
-/*! \brief 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;
-};
-
-/*! \brief list of base classes
- *
- * The classes are alphabetically sorted on name if inSort() is used.
- */
-class BaseClassList : public QList<BaseClassDef>
-{
- public:
- ~BaseClassList() {}
- int compareItems(GCI item1,GCI item2)
- {
- ClassDef *c1=((BaseClassDef *)item1)->classDef;
- ClassDef *c2=((BaseClassDef *)item2)->classDef;
- if (c1==0 || c2==0)
- return FALSE;
- else
- return stricmp(c1->name(),c2->name());
- }
-};
-
-/*! \brief Iterator for a list of base classes
- */
-class BaseClassListIterator : public QListIterator<BaseClassDef>
-{
- public:
- BaseClassListIterator(const BaseClassList &bcl) :
- QListIterator<BaseClassDef>(bcl) {}
-};
-
-#endif
diff --git a/src/classlist.cpp b/src/classlist.cpp
deleted file mode 100644
index b0a1b7f..0000000
--- a/src/classlist.cpp
+++ /dev/null
@@ -1,163 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 "classlist.h"
-#include "config.h"
-#include "util.h"
-#include "outputlist.h"
-#include "language.h"
-#include "doxygen.h"
-
-ClassList::ClassList() : QList<ClassDef>()
-{
-}
-
-ClassList::~ClassList()
-{
-}
-
-static int compItems(void *item1,void *item2)
-{
- ClassDef *c1=(ClassDef *)item1;
- ClassDef *c2=(ClassDef *)item2;
- static bool b = Config_getBool("SORT_BY_SCOPE_NAME");
- if (b)
- {
- return stricmp(c1->qualifiedName(),
- c2->qualifiedName());
- }
- else
- {
- return stricmp(c1->className(),
- c2->className());
- }
-}
-
-int ClassList::compareItems(GCI item1, GCI item2)
-{
- return compItems(item1,item2);
-}
-
-int ClassSDict::compareItems(GCI item1, GCI item2)
-{
- return compItems(item1,item2);
-}
-
-ClassListIterator::ClassListIterator(const ClassList &cllist) :
- QListIterator<ClassDef>(cllist)
-{
-}
-
-void ClassSDict::writeDeclaration(OutputList &ol,const ClassDef::CompoundType *filter,
- const char *header,bool localNames)
-{
- if (count()>0)
- {
- ClassSDict::Iterator sdi(*this);
- ClassDef *cd=0;
- bool found=FALSE;
- for (sdi.toFirst();(cd=sdi.current());++sdi)
- {
- if (cd->name().find('@')==-1 &&
- (filter==0 || *filter==cd->compoundType())
- )
- {
- bool isLink = cd->isLinkable();
- if (isLink ||
- (!Config_getBool("HIDE_UNDOC_CLASSES") &&
- (!cd->isLocal() || Config_getBool("EXTRACT_LOCAL_CLASSES"))
- )
- )
- {
- if (!found)
- {
- ol.startMemberHeader();
- if (header)
- {
- ol.parseText(header);
- }
- else
- {
- ol.parseText(theTranslator->trCompounds());
- }
- ol.endMemberHeader();
- ol.startMemberList();
- found=TRUE;
- }
- if (!Config_getString("GENERATE_TAGFILE").isEmpty())
- {
- Doxygen::tagFile << " <class kind=\"" << cd->compoundTypeString()
- << "\">" << convertToXML(cd->name()) << "</class>" << endl;
- }
- ol.startMemberItem(FALSE);
- QCString tmp = cd->compoundTypeString();
- QCString cname;
- if (localNames)
- {
- cname = cd->localName();
- }
- else
- {
- cname = cd->displayName();
- }
- ol.writeString(tmp);
- ol.writeString(" ");
- ol.insertMemberAlign();
- if (isLink)
- {
- ol.writeObjectLink(cd->getReference(),
- cd->getOutputFileBase(),
- 0,
- cname
- );
- }
- else
- {
- ol.startBold();
- ol.docify(cname);
- ol.endBold();
- }
- ol.endMemberItem();
- if (!cd->briefDescription().isEmpty())
- {
- ol.startMemberDescription();
- ol.parseDoc(cd->briefFile(),cd->briefLine(),cd,0,
- cd->briefDescription(),FALSE,FALSE);
- if (//(!cd->briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) ||
- //!cd->documentation().isEmpty())
- cd->isLinkableInProject()
- )
- {
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
- //ol.endEmphasis();
- ol.docify(" ");
- ol.startTextLink(cd->getOutputFileBase(),"_details");
- ol.parseText(theTranslator->trMore());
- ol.endTextLink();
- //ol.startEmphasis();
- ol.popGeneratorState();
- }
- ol.endMemberDescription();
- }
- }
- }
- }
- if (found) ol.endMemberList();
- }
-}
-
diff --git a/src/classlist.h b/src/classlist.h
deleted file mode 100644
index 5a6c4a0..0000000
--- a/src/classlist.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 CLASSLIST_H
-#define CLASSLIST_H
-
-#include <qlist.h>
-#include <qdict.h>
-
-#include "classdef.h"
-#include "sortdict.h"
-
-class ClassList : public QList<ClassDef>
-{
- public:
- ClassList();
- ~ClassList();
-
- int compareItems(GCI item1,GCI item2);
-};
-
-class ClassListIterator : public QListIterator<ClassDef>
-{
- public:
- ClassListIterator(const ClassList &list);
-};
-
-class ClassDict : public QDict<ClassDef>
-{
- public:
- ClassDict(int size) : QDict<ClassDef>(size) {}
- ~ClassDict() {}
-};
-
-class ClassSDict : public SDict<ClassDef>
-{
- public:
- ClassSDict(int size=17) : SDict<ClassDef>(size) {}
- ~ClassSDict() {}
- int compareItems(GCI item1,GCI item2);
- void writeDeclaration(OutputList &ol,const ClassDef::CompoundType *filter=0,
- const char *header=0,bool localNames=FALSE);
-};
-
-#endif
diff --git a/src/cmdmapper.cpp b/src/cmdmapper.cpp
deleted file mode 100644
index b0b57d5..0000000
--- a/src/cmdmapper.cpp
+++ /dev/null
@@ -1,188 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 "cmdmapper.h"
-
-CommandMap cmdMap[] =
-{
- { "a", CMD_EMPHASIS },
- { "addindex", CMD_ADDINDEX },
- { "anchor", CMD_ANCHOR },
- { "arg", CMD_LI },
- { "attention", CMD_ATTENTION },
- { "author", CMD_AUTHOR },
- { "b", CMD_BOLD },
- { "c", CMD_CODE },
- { "code", CMD_STARTCODE },
- { "copydoc", CMD_COPYDOC },
- { "date", CMD_DATE },
- { "dontinclude", CMD_DONTINCLUDE },
- { "dotfile", CMD_DOTFILE },
- { "e", CMD_EMPHASIS },
- { "em", CMD_EMPHASIS },
- { "endcode", CMD_ENDCODE },
- { "endhtmlonly", CMD_ENDHTMLONLY },
- { "endlatexonly", CMD_ENDLATEXONLY },
- { "endlink", CMD_ENDLINK },
- { "endsecreflist", CMD_ENDSECREFLIST },
- { "endverbatim", CMD_ENDVERBATIM },
- { "endxmlonly", CMD_ENDXMLONLY },
- { "exception", CMD_EXCEPTION },
- { "form", CMD_FORMULA },
- { "htmlinclude", CMD_HTMLINCLUDE },
- { "htmlonly", CMD_HTMLONLY },
- { "image", CMD_IMAGE },
- { "include", CMD_INCLUDE },
- { "internal", CMD_INTERNAL },
- { "invariant", CMD_INVARIANT },
- { "javalink", CMD_JAVALINK },
- { "latexonly", CMD_LATEXONLY },
- { "li", CMD_LI },
- { "line", CMD_LINE },
- { "link", CMD_LINK },
- { "n", CMD_LINEBREAK },
- { "note", CMD_NOTE },
- { "p", CMD_CODE },
- { "par", CMD_PAR },
- { "param", CMD_PARAM },
- { "post", CMD_POST },
- { "pre", CMD_PRE },
- { "ref", CMD_REF },
- { "refitem", CMD_SECREFITEM },
- { "remark", CMD_REMARK },
- { "remarks", CMD_REMARK },
- { "result", CMD_RETURN },
- { "return", CMD_RETURN },
- { "returns", CMD_RETURN },
- { "retval", CMD_RETVAL },
- { "sa", CMD_SA },
- { "secreflist", CMD_SECREFLIST },
- { "section", CMD_SECTION },
- { "subpage", CMD_SUBPAGE },
- { "subsection", CMD_SUBSECTION },
- { "subsubsection", CMD_SUBSUBSECTION },
- { "paragraph", CMD_PARAGRAPH },
- { "see", CMD_SA },
- { "since", CMD_SINCE },
- { "skip", CMD_SKIP },
- { "skipline", CMD_SKIPLINE },
- { "xmlonly", CMD_XMLONLY },
- { "xrefitem", CMD_XREFITEM },
- { "throw", CMD_EXCEPTION },
- { "until", CMD_UNTIL },
- { "verbatim", CMD_VERBATIM },
- { "verbinclude", CMD_VERBINCLUDE },
- { "version", CMD_VERSION },
- { "warning", CMD_WARNING },
- { "author", CMD_AUTHOR },
- { "authors", CMD_AUTHORS },
- { "throws", CMD_EXCEPTION },
- { "\\", CMD_BSLASH },
- { "@", CMD_AT },
- { "<", CMD_LESS },
- { ">", CMD_GREATER },
- { "&", CMD_AMP },
- { "$", CMD_DOLLAR },
- { "#", CMD_HASH },
- { "%", CMD_PERCENT },
- { "_internalref", CMD_INTERNALREF },
- { "dot", CMD_DOT },
- { "enddot", CMD_ENDDOT },
- { "manonly", CMD_MANONLY },
- { "endmanonly", CMD_ENDMANONLY },
- { "includelineno", CMD_INCWITHLINES },
- { "inheritdoc", CMD_INHERITDOC },
- { 0, 0 }
-};
-
-//----------------------------------------------------------------------------
-
-CommandMap htmlTagMap[] =
-{
- { "strong", HTML_BOLD },
- { "center", HTML_CENTER },
- { "table", HTML_TABLE },
- { "caption", HTML_CAPTION },
- { "small", HTML_SMALL },
- { "code", HTML_CODE },
- { "dfn", HTML_CODE },
- { "var", HTML_EMPHASIS },
- { "img", HTML_IMG },
- { "pre", HTML_PRE },
- { "sub", HTML_SUB },
- { "sup", HTML_SUP },
- { "tr", HTML_TR },
- { "td", HTML_TD },
- { "th", HTML_TH },
- { "ol", HTML_OL },
- { "ul", HTML_UL },
- { "li", HTML_LI },
- { "tt", HTML_CODE },
- { "kbd", HTML_CODE },
- { "em", HTML_EMPHASIS },
- { "hr", HTML_HR },
- { "dl", HTML_DL },
- { "dt", HTML_DT },
- { "dd", HTML_DD },
- { "br", HTML_BR },
- { "i", HTML_EMPHASIS },
- { "a", HTML_A },
- { "b", HTML_BOLD },
- { "p", HTML_P },
- { "h1", HTML_H1 },
- { "h2", HTML_H2 },
- { "h3", HTML_H3 },
- { "h4", HTML_H4 },
- { "h5", HTML_H5 },
- { "h6", HTML_H6 },
- { "span", HTML_SPAN },
- { "div", HTML_DIV },
-
- { "c", XML_C },
- // { "code", XML_CODE }, <= ambigious <code> is also a HTML tag
- { "description",XML_DESCRIPTION },
- { "example", XML_EXAMPLE },
- { "exception", XML_EXCEPTION },
- { "include", XML_INCLUDE },
- { "item", XML_ITEM },
- { "list", XML_LIST },
- { "para", XML_PARA },
- { "param", XML_PARAM },
- { "paramref", XML_PARAMREF },
- { "permission", XML_PERMISSION },
- { "remarks", XML_REMARKS },
- { "returns", XML_RETURNS },
- { "see", XML_SEE },
- { "seealso", XML_SEEALSO },
- { "summary", XML_SUMMARY },
- { "value", XML_VALUE },
- { 0, 0 }
-};
-
-//----------------------------------------------------------------------------
-
-Mapper *Mappers::cmdMapper = new Mapper(cmdMap);
-Mapper *Mappers::htmlTagMapper = new Mapper(htmlTagMap);
-
-void Mappers::freeMappers()
-{
- delete cmdMapper; cmdMapper = 0;
- delete htmlTagMapper; htmlTagMapper = 0;
-}
-
-
diff --git a/src/cmdmapper.h b/src/cmdmapper.h
deleted file mode 100644
index f7758fd..0000000
--- a/src/cmdmapper.h
+++ /dev/null
@@ -1,204 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 _CMDMAPPER_H
-#define _CMDMAPPER_H
-
-#include <qdict.h>
-
-struct CommandMap
-{
- const char *cmdName;
- int cmdId;
-};
-
-const int SIMPLESECT_BIT = 0x1000;
-
-enum CommandType
-{
- CMD_UNKNOWN = 0,
- CMD_ADDINDEX = 1,
- CMD_AMP = 2,
- CMD_ANCHOR = 3,
- CMD_AT = 4,
- CMD_ATTENTION = 5 | SIMPLESECT_BIT,
- CMD_AUTHOR = 6 | SIMPLESECT_BIT,
- CMD_AUTHORS = 7 | SIMPLESECT_BIT,
- CMD_BOLD = 8,
- CMD_BSLASH = 9,
- CMD_CODE = 10,
- CMD_COPYDOC = 11,
- CMD_DATE = 12 | SIMPLESECT_BIT,
- CMD_DOLLAR = 13,
- CMD_DONTINCLUDE = 14,
- CMD_DOTFILE = 15,
- CMD_EMPHASIS = 16,
- CMD_ENDCODE = 17,
- CMD_ENDHTMLONLY = 18,
- CMD_ENDLATEXONLY = 19,
- CMD_ENDLINK = 20,
- CMD_ENDSECREFLIST= 21,
- CMD_ENDVERBATIM = 22,
- CMD_ENDXMLONLY = 23,
- CMD_EXCEPTION = 24 | SIMPLESECT_BIT,
- CMD_FORMULA = 25,
- CMD_GREATER = 26,
- CMD_HASH = 27,
- CMD_HTMLINCLUDE = 28,
- CMD_HTMLONLY = 29,
- CMD_IMAGE = 30,
- CMD_INCLUDE = 31,
- CMD_INTERNAL = 32,
- CMD_INTERNALREF = 33,
- CMD_INVARIANT = 34 | SIMPLESECT_BIT ,
- CMD_LATEXONLY = 35,
- CMD_LESS = 36,
- CMD_LI = 37,
- CMD_LINE = 38,
- CMD_LINEBREAK = 39,
- CMD_LINK = 40,
- CMD_NOTE = 41 | SIMPLESECT_BIT,
- CMD_PAR = 42 | SIMPLESECT_BIT,
- CMD_PARAM = 43 | SIMPLESECT_BIT,
- CMD_PERCENT = 44,
- CMD_POST = 45 | SIMPLESECT_BIT,
- CMD_PRE = 46 | SIMPLESECT_BIT ,
- CMD_REF = 47,
- CMD_SECREFITEM = 48,
- CMD_REMARK = 49 | SIMPLESECT_BIT ,
- CMD_RETURN = 50 | SIMPLESECT_BIT ,
- CMD_RETVAL = 51 | SIMPLESECT_BIT,
- CMD_SA = 52 | SIMPLESECT_BIT ,
- CMD_SECREFLIST = 53,
- CMD_SECTION = 54,
- CMD_SUBPAGE = 55,
- CMD_SUBSECTION = 56,
- CMD_SUBSUBSECTION= 57,
- CMD_PARAGRAPH = 58,
- CMD_SINCE = 59 | SIMPLESECT_BIT,
- CMD_SKIP = 60,
- CMD_SKIPLINE = 61,
- CMD_STARTCODE = 62,
- CMD_JAVALINK = 63,
- CMD_UNTIL = 64,
- CMD_VERBATIM = 65,
- CMD_VERBINCLUDE = 66,
- CMD_VERSION = 67 | SIMPLESECT_BIT,
- CMD_WARNING = 68 | SIMPLESECT_BIT,
- CMD_XREFITEM = 69 | SIMPLESECT_BIT,
- CMD_XMLONLY = 70,
- CMD_DOT = 71,
- CMD_ENDDOT = 72,
- CMD_MANONLY = 73,
- CMD_ENDMANONLY = 74,
- CMD_INCWITHLINES = 75,
- CMD_INHERITDOC = 76
-};
-
-enum HtmlTagType
-{
- HTML_UNKNOWN = 0,
- HTML_CENTER = 1,
- HTML_TABLE = 2,
- HTML_CAPTION = 3,
- HTML_SMALL = 4,
- HTML_CODE = 5,
- HTML_IMG = 6,
- HTML_PRE = 7,
- HTML_SUB = 8,
- HTML_SUP = 9,
- HTML_TR = 10,
- HTML_TD = 11,
- HTML_TH = 12,
- HTML_OL = 13,
- HTML_UL = 14,
- HTML_LI = 15,
- HTML_EMPHASIS = 16,
- HTML_HR = 17,
- HTML_DL = 18,
- HTML_DT = 19,
- HTML_DD = 20,
- HTML_BR = 21,
- HTML_A = 22,
- HTML_BOLD = 23,
- HTML_P = 24,
- HTML_H1 = 25,
- HTML_H2 = 26,
- HTML_H3 = 27,
- HTML_H4 = 28,
- HTML_H5 = 29,
- HTML_H6 = 30,
- HTML_SPAN = 31,
- HTML_DIV = 32,
-
- XML_CmdMask = 0x100,
-
- XML_C = XML_CmdMask + 0,
- XML_CODE = XML_CmdMask + 1,
- XML_DESCRIPTION= XML_CmdMask + 2,
- XML_EXAMPLE = XML_CmdMask + 3,
- XML_EXCEPTION = XML_CmdMask + 4,
- XML_INCLUDE = XML_CmdMask + 5,
- XML_ITEM = XML_CmdMask + 6,
- XML_LIST = XML_CmdMask + 7,
- XML_PARA = XML_CmdMask + 8,
- XML_PARAM = XML_CmdMask + 9,
- XML_PARAMREF = XML_CmdMask + 10,
- XML_PERMISSION = XML_CmdMask + 11,
- XML_REMARKS = XML_CmdMask + 12,
- XML_RETURNS = XML_CmdMask + 13,
- XML_SEE = XML_CmdMask + 14,
- XML_SEEALSO = XML_CmdMask + 15,
- XML_SUMMARY = XML_CmdMask + 16,
- XML_VALUE = XML_CmdMask + 17
-
-};
-
-class Mapper
-{
- public:
- int map(const char *n)
- {
- QCString name=n;
- int *result;
- return !name.isEmpty() && (result=m_map.find(name.lower())) ? *result: 0;
- }
-
- Mapper(const CommandMap *cm) : m_map(89)
- {
- m_map.setAutoDelete(TRUE);
- const CommandMap *p = cm;
- while (p->cmdName)
- {
- m_map.insert(p->cmdName,new int(p->cmdId));
- p++;
- }
- }
- private:
- QDict<int> m_map;
-};
-
-struct Mappers
-{
- static void freeMappers();
- static Mapper *cmdMapper;
- static Mapper *htmlTagMapper;
-};
-
-
-#endif
diff --git a/src/code.h b/src/code.h
deleted file mode 100644
index cf91b91..0000000
--- a/src/code.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 CODE_H
-#define CODE_H
-
-#include "qtbc.h"
-#include <stdio.h>
-
-class CodeOutputInterface;
-class FileDef;
-class MemberDef;
-
-extern void parseCCode(CodeOutputInterface &,const char *,const QCString &,
- bool ,const char *,FileDef *fd=0,
- int startLine=-1,int endLine=-1,bool inlineFragment=FALSE,
- MemberDef *memberDef=0);
-extern void resetCCodeParserState();
-
-#endif
diff --git a/src/code.l b/src/code.l
deleted file mode 100644
index e42df77..0000000
--- a/src/code.l
+++ /dev/null
@@ -1,3070 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-
-%{
-
-/*
- * includes
- */
-#include <stdio.h>
-#include <assert.h>
-#include <ctype.h>
-#include <qregexp.h>
-#include <qdir.h>
-
-#include "qtbc.h"
-#include "entry.h"
-#include "doxygen.h"
-#include "message.h"
-#include "outputlist.h"
-#include "util.h"
-#include "membername.h"
-#include "searchindex.h"
-
-#define YY_NEVER_INTERACTIVE 1
-
-// Toggle for some debugging info
-//#define DBG_CTX(x) fprintf x
-#define DBG_CTX(x) do { } while(0)
-
-#define CLASSBLOCK (int *)4
-#define SCOPEBLOCK (int *)8
-#define INNERBLOCK (int *)12
-
-/* -----------------------------------------------------------------
- * statics
- */
-
-static CodeOutputInterface * g_code;
-
-static ClassSDict g_codeClassSDict(17);
-static QCString g_curClassName;
-static QStrList g_curClassBases;
-
-// TODO: is this still needed? if so, make it work
-static bool g_inClass;
-
-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 bool g_exampleBlock;
-static QCString g_exampleName;
-static QCString g_exampleFile;
-
-static bool g_insideTemplate = FALSE;
-static QCString g_type;
-static QCString g_name;
-static QCString g_args;
-static QCString g_classScope;
-static QCString g_realScope;
-static QStack<int> g_scopeStack; //!< 1 if bracket starts a scope,
- // 2 for internal blocks
-static int g_anchorCount;
-static FileDef * g_sourceFileDef;
-static Definition * g_currentDefinition;
-static MemberDef * g_currentMemberDef;
-static bool g_includeCodeFragment;
-static const char * g_currentFontClass;
-static bool g_searchingForBody;
-static bool g_insideBody;
-static int g_bodyCurlyCount;
-static QCString g_saveName;
-static QCString g_saveType;
-
-static int g_bracketCount = 0;
-static int g_curlyCount = 0;
-static int g_sharpCount = 0;
-
-static int g_lastSpecialCContext;
-static int g_lastStringContext;
-static int g_lastVerbStringContext;
-static int g_memCallContext;
-static int g_lastCContext;
-
-static bool g_insideObjC;
-static bool g_insideProtocolList;
-
-// context for an Objective-C method call
-struct ObjCCallCtx
-{
- int id;
- QCString methodName;
- QCString objectTypeOrName;
- ClassDef *objectType;
- MemberDef *objectVar;
- MemberDef *method;
- QCString format;
- int lexState;
- int braceCount;
-};
-
-// globals for objective-C method calls
-static ObjCCallCtx *g_currentCtx=0;
-static int g_currentCtxId=0;
-static int g_currentNameId=0;
-static int g_currentObjId=0;
-static QStack<ObjCCallCtx> g_contextStack;
-static QIntDict<ObjCCallCtx> g_contextDict;
-static QIntDict<QCString> g_nameDict;
-static QIntDict<QCString> g_objectDict;
-static int g_braceCount=0;
-
-static void saveObjCContext();
-static void restoreObjCContext();
-
-
-
-//-------------------------------------------------------------------
-
-/*! 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(const QCString &type,const QCString &name);
- ClassDef *findVariable(const QCString &name);
-
- private:
- Scope m_globalScope;
- QList<Scope> m_scopes;
-};
-
-void VariableContext::addVariable(const QCString &type,const QCString &name)
-{
- //printf("VariableContext::addVariable(%s,%s)\n",type.data(),name.data());
- QCString ltype = type.simplifyWhiteSpace();
- QCString lname = name.simplifyWhiteSpace();
- if (ltype.left(7)=="struct ")
- {
- ltype = ltype.right(ltype.length()-7);
- }
- else if (ltype.left(6)=="union ")
- {
- 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();
- ClassDef *varType;
- int i=0;
- 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
- )
- {
- 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 (
- ( // look for class definitions inside the code block
- (varType=g_codeClassSDict[typeName]) ||
- // otherwise look for global class definitions
- (varType=getResolvedClass(g_currentDefinition,g_sourceFileDef,typeName))
- ) && // and it must be a template
- varType->templateArguments())
- {
- 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(typeName,name);
- }
- }
- 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!
- {
- DBG_CTX((stderr,"** addVariable: dummy context\n"));
- scope->append(lname,dummyContext);
- }
- }
-}
-
-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)
- {
- DBG_CTX((stderr,"** findVariable(%s)=%p\n",name.data(),result));
- return result;
- }
- }
- // nothing found -> also try the global scope
- result=m_globalScope.find(name);
- DBG_CTX((stderr,"** findVariable(%s)=%p\n",name.data(),result));
- return result;
-}
-
-static VariableContext g_theVarContext;
-const ClassDef *VariableContext::dummyContext = (ClassDef*)0x8;
-
-//-------------------------------------------------------------------
-
-class CallContext
-{
- public:
- struct Ctx
- {
- Ctx() : name(g_name), type(g_type), cd(0) {}
- QCString name;
- QCString type;
- ClassDef *cd;
- };
-
- CallContext()
- {
- m_classList.append(new Ctx);
- m_classList.setAutoDelete(TRUE);
- }
- virtual ~CallContext() {}
- void setClass(ClassDef *cd)
- {
- Ctx *ctx = m_classList.getLast();
- if (ctx)
- {
- DBG_CTX((stderr,"** Set call context %s (%p)\n",cd==0 ? "<null>" : cd->name().data(),cd));
- ctx->cd=cd;
- }
- }
- void pushScope()
- {
- m_classList.append(new Ctx);
- DBG_CTX((stderr,"** Push call context %d\n",m_classList.count()));
- }
- void popScope()
- {
- if (m_classList.count()>1)
- {
- DBG_CTX((stderr,"** Pop call context %d\n",m_classList.count()));
- Ctx *ctx = m_classList.getLast();
- if (ctx)
- {
- g_name = ctx->name;
- g_type = ctx->type;
- }
- m_classList.removeLast();
- }
- else
- {
- DBG_CTX((stderr,"** ILLEGAL: Pop call context\n"));
- }
- }
- void clear()
- {
- DBG_CTX((stderr,"** Clear call context\n"));
- m_classList.clear();
- m_classList.append(new Ctx);
- }
- ClassDef *getClass() const
- {
- Ctx *ctx = m_classList.getLast();
- if (ctx) return ctx->cd; else return 0;
- }
-
- private:
- QList<Ctx> m_classList;
-};
-
-static CallContext g_theCallContext;
-
-//-------------------------------------------------------------------
-
-/*! add class/namespace name s to the scope */
-static void pushScope(const char *s)
-{
- if (g_classScope.isEmpty())
- {
- g_classScope = s;
- }
- else
- {
- g_classScope += "::";
- g_classScope += s;
- }
- //printf("pushScope() result: `%s'\n",g_classScope.data());
-}
-
-/*! remove the top class/namespace name from the scope */
-static void popScope()
-{
- if (!g_classScope.isEmpty())
- {
- int i=g_classScope.findRev("::");
- if (i==-1) // last name, strip all
- {
- g_classScope.resize(0);
- }
- else // strip name
- {
- g_classScope = g_classScope.left(i);
- }
- }
- else
- {
- //err("Error: Too many end of scopes found!\n");
- }
- //printf("popScope() result: `%s'\n",g_classScope.data());
-}
-
-static void setCurrentDoc(const QCString &name,const QCString &base,const QCString &anchor="")
-{
- static bool searchEngineEnabled=Config_getBool("SEARCHENGINE");
- if (searchEngineEnabled)
- {
- Doxygen::searchIndex->setCurrentDoc(name,base,anchor);
- }
-}
-
-static void addToSearchIndex(const char *text)
-{
- static bool searchEngineEnabled=Config_getBool("SEARCHENGINE");
- if (searchEngineEnabled)
- {
- Doxygen::searchIndex->addWord(text,FALSE);
- }
-}
-
-static void setClassScope(const QCString &name)
-{
- //printf("setClassScope(%s)\n",name.data());
- QCString n=name;
- n=n.simplifyWhiteSpace();
- int ts=n.find('<'); // start of template
- int te=n.findRev('>'); // end of template
- //printf("ts=%d te=%d\n",ts,te);
- if (ts!=-1 && te!=-1 && te>ts)
- {
- // remove template from scope
- n=n.left(ts)+n.right(n.length()-te-1);
- }
- g_classScope = n;
- //printf("--->New class scope `%s'\n",g_classScope.data());
-}
-
-/*! 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
- * number is linked to the documentation of that definition.
- */
-static void startCodeLine()
-{
- //if (g_currentFontClass) { g_code->endFontClass(); }
- if (g_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>");
- //g_code->startLineNumber();
- if (!g_includeCodeFragment && d)
- {
- g_currentDefinition = d;
- g_currentMemberDef = g_sourceFileDef->getSourceMember(g_yyLineNr);
- g_insideBody = FALSE;
- g_searchingForBody = TRUE;
- g_realScope = d->name().copy();
- g_type.resize(0);
- g_name.resize(0);
- g_args.resize(0);
- g_parmType.resize(0);
- g_parmName.resize(0);
- //printf("Real scope: `%s'\n",g_realScope.data());
- g_bodyCurlyCount = 0;
- QCString lineAnchor;
- lineAnchor.sprintf("l%05d",g_yyLineNr);
- if (g_currentMemberDef)
- {
- g_code->writeLineNumber(g_currentMemberDef->getReference(),
- g_currentMemberDef->getOutputFileBase(),
- g_currentMemberDef->anchor(),g_yyLineNr);
- setCurrentDoc(
- g_currentMemberDef->qualifiedName(),
- g_sourceFileDef->getSourceFileBase(),
- lineAnchor);
- }
- else if (d->isLinkableInProject())
- {
- g_code->writeLineNumber(d->getReference(),
- d->getOutputFileBase(),
- 0,g_yyLineNr);
- setCurrentDoc(
- d->qualifiedName(),
- g_sourceFileDef->getSourceFileBase(),
- lineAnchor);
- }
- }
- else
- {
- //g_code->codify(lineNumber);
- g_code->writeLineNumber(0,0,0,g_yyLineNr);
- }
- //g_code->endLineNumber();
- }
- g_code->startCodeLine();
- if (g_currentFontClass)
- {
- g_code->startFontClass(g_currentFontClass);
- }
-}
-
-
-static void endFontClass();
-static void endCodeLine()
-{
- if (g_currentFontClass) { g_code->endFontClass(); }
- g_code->endCodeLine();
-}
-
-/*! write a code fragment `text' that may span multiple lines, inserting
- * line numbers for each line.
- */
-static void codifyLines(char *text)
-{
- //printf("codifyLines(%d,\"%s\")\n",g_yyLineNr,text);
- char *p=text,*sp=p;
- char c;
- bool done=FALSE;
- 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();
- }
- }
- else
- {
- g_code->codify(sp);
- 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
- * split into multiple links with the same destination, one for each line.
- */
-static void writeMultiLineCodeLink(CodeOutputInterface &ol,
- const char *ref,const char *file,
- const char *anchor,const char *text)
-{
- bool done=FALSE;
- char *p=(char *)text;
- while (!done)
- {
- char *sp=p;
- char c;
- while ((c=*p++) && c!='\n');
- if (c=='\n')
- {
- g_yyLineNr++;
- *(p-1)='\0';
- //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
- ol.writeCodeLink(ref,file,anchor,sp);
- endCodeLine();
- if (g_yyLineNr<g_inputLines)
- {
- startCodeLine();
- }
- }
- else
- {
- //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
- ol.writeCodeLink(ref,file,anchor,sp);
- done=TRUE;
- }
- }
-}
-
-static void addType()
-{
- if (g_name=="const") { g_name.resize(0); return; }
- if (!g_type.isEmpty()) g_type += ' ' ;
- g_type += g_name ;
- g_name.resize(0) ;
- if (!g_type.isEmpty()) g_type += ' ' ;
- g_type += g_args ;
- g_args.resize(0) ;
-}
-
-static void addParmType()
-{
- if (g_parmName=="const") { g_parmName.resize(0); return; }
- if (!g_parmType.isEmpty()) g_parmType += ' ' ;
- g_parmType += g_parmName ;
- g_parmName.resize(0) ;
-}
-
-static void setParameterList(MemberDef *md)
-{
- g_classScope = md->getClassDef() ? md->getClassDef()->name().data() : "";
- ArgumentList *al = md->argumentList();
- if (al==0) return;
- Argument *a = al->first();
- while (a)
- {
- 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);
- a = al->next();
- }
-}
-
-static ClassDef *stripClassName(const char *s)
-{
- int pos=0;
- QCString type = s;
- QCString className;
- QCString templSpec;
- while (extractClassNameFromType(type,pos,className,templSpec)!=-1)
- {
- QCString clName=className+templSpec;
- ClassDef *cd=0;
- if (!g_classScope.isEmpty())
- {
- cd=getResolvedClass(g_currentDefinition,g_sourceFileDef,g_classScope+"::"+clName);
- }
- if (cd==0)
- {
- cd=getResolvedClass(g_currentDefinition,g_sourceFileDef,clName);
- }
- //printf("stripClass trying `%s' = %p\n",clName.data(),cd);
- if (cd)
- {
- return cd;
- }
- }
-
- return 0;
-}
-
-static MemberDef *setCallContextForVar(const QCString &name)
-{
- if (name.isEmpty()) return 0;
- //fprintf(stderr,"setCallContextForVar(%s) g_classScope=%s\n",name.data(),g_classScope.data());
-
- int scopeEnd = name.findRev("::");
- if (scopeEnd!=-1) // name with explicit scope
- {
- 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); // TODO: check namespace as well
- if (mcd && !locName.isEmpty())
- {
- MemberDef *md=mcd->getMemberByName(locName);
- if (md)
- {
- //printf("name=%s scope=%s\n",locName.data(),scope.data());
- g_theCallContext.setClass(stripClassName(md->typeString()));
- return md;
- }
- }
- }
-
- MemberName *mn;
- ClassDef *mcd = g_theVarContext.findVariable(name);
- if (mcd) // local variable
- {
- //fprintf(stderr,"local variable\n");
- if (mcd!=VariableContext::dummyContext)
- {
- //fprintf(stderr,"local var `%s' mcd=%s\n",name.data(),mcd->name().data());
- g_theCallContext.setClass(mcd);
- }
- }
- else
- {
- // look for a class member
- mcd = getClass(g_classScope);
- if (mcd)
- {
- //fprintf(stderr,"Inside class %s\n",mcd->name().data());
- MemberDef *md=mcd->getMemberByName(name);
- if (md)
- {
- //fprintf(stderr,"Found member %s\n",md->name().data());
- if (g_scopeStack.top()!=CLASSBLOCK)
- {
- //fprintf(stderr,"class member `%s' mcd=%s\n",name.data(),mcd->name().data());
- g_theCallContext.setClass(stripClassName(md->typeString()));
- }
- return md;
- }
- }
- }
-
- // look for a global member
- if ((mn=Doxygen::functionNameSDict[name]))
- {
- //printf("global var `%s'\n",name.data());
- if (mn->count()==1) // global defined only once
- {
- MemberDef *md=mn->getFirst();
- if (!md->isStatic() || md->getBodyDef()==g_sourceFileDef)
- {
- g_theCallContext.setClass(stripClassName(md->typeString()));
- return md;
- }
- return 0;
- }
- else if (mn->count()>1) // global defined more than once
- {
- MemberDef *md=mn->first();
- while (md)
- {
- //printf("mn=%p md=%p md->getBodyDef()=%p g_sourceFileDef=%p\n",
- // mn,md,
- // md->getBodyDef(),g_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()==g_sourceFileDef)
- {
- g_theCallContext.setClass(stripClassName(md->typeString()));
- //printf("returning member %s in source file %s\n",md->name().data(),g_sourceFileDef->name().data());
- return md;
- }
- md=mn->next();
- }
- return 0;
- }
- }
- return 0;
-}
-
-static void addDocCrossReference(MemberDef *src,MemberDef *dst)
-{
- if (dst->isTypedef() || dst->isEnumerate()) return; // don't add types
- //printf("addDocCrossReference src=%s,dst=%s\n",src->name().data(),dst->name().data());
- if (Config_getBool("REFERENCED_BY_RELATION") &&
- (src->isFunction() || src->isSlot())
- )
- {
- dst->addSourceReferencedBy(src);
- }
- if ((Config_getBool("REFERENCES_RELATION") || Config_getBool("CALL_GRAPH")) &&
- (src->isFunction() || src->isSlot())
- )
- {
- src->addSourceReferences(dst);
- }
-
-}
-
-static bool getLinkInScope(const QCString &c, // scope
- const QCString &m, // member
- const char *memberText, // exact text
- CodeOutputInterface &ol,
- const char *text
- )
-{
- MemberDef *md;
- ClassDef *cd;
- FileDef *fd;
- NamespaceDef *nd;
- GroupDef *gd;
- //printf("Trying `%s'::`%s'\n",c.data(),m.data());
- if (getDefs(c,m,"()",md,cd,fd,nd,gd,FALSE,g_sourceFileDef) &&
- md->isLinkable())
- {
- //printf("Found!\n");
- if (g_exampleBlock)
- {
- QCString anchor;
- anchor.sprintf("a%d",g_anchorCount);
- //printf("addExampleFile(%s,%s,%s)\n",anchor.data(),g_exampleName.data(),
- // g_exampleFile.data());
- if (md->addExample(anchor,g_exampleName,g_exampleFile))
- {
- ol.writeCodeAnchor(anchor);
- g_anchorCount++;
- }
- }
- //Definition *d=0;
- //if (cd) d=cd; else if (nd) d=nd; else if (fd) d=fd; else d=gd;
-
- Definition *d = md->getOuterScope()==Doxygen::globalScope ?
- md->getBodyDef() : md->getOuterScope();
- if (md->getGroupDef()) d = md->getGroupDef();
- if (d && d->isLinkable())
- {
- g_theCallContext.setClass(stripClassName(md->typeString()));
- //printf("g_currentDefinition=%p g_currentMemberDef=%p g_insideBody=%d\n",
- // g_currentDefinition,g_currentMemberDef,g_insideBody);
-
- if (g_currentDefinition && g_currentMemberDef &&
- md!=g_currentMemberDef && g_insideBody)
- {
- addDocCrossReference(g_currentMemberDef,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->getReference(),
- md->getOutputFileBase(),
- md->anchor(),
- text ? text : memberText);
- addToSearchIndex(text ? text : memberText);
- return TRUE;
- }
- }
- return FALSE;
-}
-
-static bool getLink(const char *className,
- const char *memberName,
- CodeOutputInterface &ol,
- const char *text=0)
-{
- QCString m=removeRedundantWhiteSpace(memberName);
- QCString c=className;
- if (!getLinkInScope(c,m,memberName,ol,text))
- {
- if (!g_curClassName.isEmpty())
- {
- if (!c.isEmpty()) c.prepend("::");
- c.prepend(g_curClassName);
- return getLinkInScope(c,m,memberName,ol,text);
- }
- return FALSE;
- }
- return TRUE;
-}
-
-static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName,
- bool typeOnly=FALSE)
-{
- int i=0;
- if (*clName=='~') // correct for matching negated values i.s.o. destructors.
- {
- g_code->codify("~");
- clName++;
- }
- QCString className=clName;
- if (className.isEmpty()) return;
- if (g_insideProtocolList)
- {
- className+="-p";
- }
- ClassDef *cd=0,*lcd=0;
- MemberDef *md=0;
- bool isLocal=FALSE;
-
- //fprintf(stderr,"generateClassOrGlobalLink(className=%s)\n",className.data());
- if ((lcd=g_theVarContext.findVariable(className))==0) // not a local variable
- {
- Definition *d = g_currentDefinition;
- //printf("d=%p g_sourceFileDef=%p\n",d,g_currentDefinition);
- cd = getResolvedClass(d,g_sourceFileDef,className,&md);
- if (cd==0 && md==0 && (i=className.find('<'))!=-1)
- {
- cd=getResolvedClass(d,g_sourceFileDef,className.left(i),&md);
- }
- //printf("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
- {
- if (getLink(g_classScope,clName,ol,clName))
- {
- return;
- }
- }
- }
- else
- {
- if (lcd!=VariableContext::dummyContext)
- {
- g_theCallContext.setClass(lcd);
- }
- isLocal=TRUE;
- //fprintf(stderr,"is a local variable cd=%p!\n",cd);
- }
- if (cd && cd->isLinkable()) // is it a linkable class
- {
- //fprintf(stderr,"is linkable class %s\n",clName);
- if (g_exampleBlock)
- {
- QCString anchor;
- anchor.sprintf("_a%d",g_anchorCount);
- //printf("addExampleClass(%s,%s,%s)\n",anchor.data(),g_exampleName.data(),
- // g_exampleFile.data());
- if (cd->addExample(anchor,g_exampleName,g_exampleFile))
- {
- ol.writeCodeAnchor(anchor);
- g_anchorCount++;
- }
- }
- writeMultiLineCodeLink(ol,cd->getReference(),cd->getOutputFileBase(),0,clName);
- addToSearchIndex(className);
- if (md)
- {
- Definition *d = md->getOuterScope()==Doxygen::globalScope ?
- md->getBodyDef() : md->getOuterScope();
- if (md->getGroupDef()) d = md->getGroupDef();
- if (d && d->isLinkable() && md->isLinkable() && g_currentMemberDef)
- {
- addDocCrossReference(g_currentMemberDef,md);
- }
- }
- }
- else // not a class, maybe a global member
- {
- //printf("class %s not linkable! cd=%p md=%p typeOnly=%d\n",clName,cd,md,typeOnly);
- if (!isLocal && (md!=0 || (cd==0 && !typeOnly))) // not a class, see if it is a global enum/variable/typedef.
- {
- if (md==0) // not found as a typedef
- {
- md = setCallContextForVar(clName);
- //printf("setCallContextForVar(%s) md=%p g_currentDefinition=%p\n",clName,md,g_currentDefinition);
- if (md && g_currentDefinition)
- {
- //fprintf(stderr,"%s accessible from %s? %d md->getOuterScope=%s\n",
- // md->name().data(),g_currentDefinition->name().data(),
- // isAccessibleFrom(g_currentDefinition,g_sourceFileDef,md),
- // md->getOuterScope()->name().data());
- }
-
- if (md && g_currentDefinition &&
- isAccessibleFrom(g_currentDefinition,g_sourceFileDef,md)==-1)
- {
- md=0; // variable not accessible
- }
- }
- if (md)
- {
- //printf("is a global md=%p g_currentDefinition=%s\n",md,g_currentDefinition?g_currentDefinition->name().data():"<none>");
- if (md->isLinkable())
- {
- writeMultiLineCodeLink(ol,md->getReference(),md->getOutputFileBase(),md->anchor(),clName);
- addToSearchIndex(clName);
- if (g_currentMemberDef)
- {
- addDocCrossReference(g_currentMemberDef,md);
- }
- return;
- }
- }
- }
-
- // nothing found, just write out the word
- codifyLines(clName);
- addToSearchIndex(clName);
- }
-}
-
-static bool generateClassMemberLink(CodeOutputInterface &ol,ClassDef *mcd,const char *memName)
-{
- if (mcd)
- {
- MemberDef *xmd = mcd->getMemberByName(memName);
- //fprintf(stderr,"generateClassMemberLink(class=%s,member=%s)=%p\n",mcd->name().data(),memName,xmd);
- if (xmd)
- {
- // extract class definition of the return type in order to resolve
- // a->b()->c() like call chains
-
- //printf("type=`%s' args=`%s' class=%s\n",
- // xmd->typeString(),xmd->argsString(),
- // xmd->getClassDef()->name().data());
-
- if (g_exampleBlock)
- {
- QCString anchor;
- anchor.sprintf("a%d",g_anchorCount);
- //printf("addExampleFile(%s,%s,%s)\n",anchor.data(),g_exampleName.data(),
- // g_exampleFile.data());
- if (xmd->addExample(anchor,g_exampleName,g_exampleFile))
- {
- ol.writeCodeAnchor(anchor);
- g_anchorCount++;
- }
- }
-
- ClassDef *typeClass = stripClassName(xmd->typeString());
- //fprintf(stderr,"%s -> typeName=%p\n",xmd->typeString(),typeClass);
- g_theCallContext.setClass(typeClass);
-
- Definition *xd = xmd->getOuterScope()==Doxygen::globalScope ?
- xmd->getBodyDef() : xmd->getOuterScope();
- if (xmd->getGroupDef()) xd = xmd->getGroupDef();
- if (xd)
- {
-
- //printf("g_currentDefiniton=%p g_currentMemberDef=%p xmd=%p g_insideBody=%d\n",g_currentDefinition,g_currentMemberDef,xmd,g_insideBody);
-
- if (xmd->templateMaster()) xmd = xmd->templateMaster();
-
- // add usage reference
- if (g_currentDefinition && g_currentMemberDef &&
- /*xmd!=g_currentMemberDef &&*/ g_insideBody)
- {
- addDocCrossReference(g_currentMemberDef,xmd);
- }
-
- // write the actual link
- writeMultiLineCodeLink(ol,xmd->getReference(),
- xmd->getOutputFileBase(),xmd->anchor(),memName);
- addToSearchIndex(memName);
- return TRUE;
- }
-
- }
- }
-
- return FALSE;
-}
-
-static void generateMemberLink(CodeOutputInterface &ol,const QCString &varName,
- char *memName)
-{
- //printf("generateMemberLink(object=%s,mem=%s) classScope=%s\n",
- // varName.data(),memName,g_classScope.data());
-
- if (varName.isEmpty()) return;
-
- // look for the variable in the current context
- ClassDef *vcd = g_theVarContext.findVariable(varName);
- if (vcd)
- {
- if (vcd!=VariableContext::dummyContext)
- {
- //printf("Class found!\n");
- if (getLink(vcd->name(),memName,ol))
- {
- //printf("Found result!\n");
- return;
- }
- BaseClassListIterator bcli(*vcd->baseClasses());
- for ( ; bcli.current() ; ++bcli)
- {
- if (getLink(bcli.current()->classDef->name(),memName,ol))
- {
- //printf("Found result!\n");
- return;
- }
- }
- }
- }
- else // variable not in current context, maybe it is in a parent context
- {
- vcd = getResolvedClass(g_currentDefinition,g_sourceFileDef,g_classScope);
- if (vcd && vcd->isLinkable())
- {
- //printf("Found class %s for variable `%s'\n",g_classScope.data(),varName.data());
- MemberName *vmn=Doxygen::memberNameSDict[varName];
- if (vmn==0)
- {
- int vi;
- QCString vn=varName;
- QCString scope;
- if ((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[vn];
- //printf("Trying name `%s' scope=%s\n",vn.data(),scope.data());
- if (vmn)
- {
- MemberNameIterator vmni(*vmn);
- MemberDef *vmd;
- for (;(vmd=vmni.current());++vmni)
- {
- if (/*(vmd->isVariable() || vmd->isFunction()) && */
- vmd->getClassDef()==jcd)
- {
- //printf("Found variable type=%s\n",vmd->typeString());
- ClassDef *mcd=stripClassName(vmd->typeString());
- if (mcd && mcd->isLinkable())
- {
- if (generateClassMemberLink(ol,mcd,memName)) return;
- }
- }
- }
- }
- }
- }
- if (vmn)
- {
- //printf("There is a variable with name `%s'\n",varName);
- MemberNameIterator vmni(*vmn);
- MemberDef *vmd;
- for (;(vmd=vmni.current());++vmni)
- {
- if (/*(vmd->isVariable() || vmd->isFunction()) && */
- vmd->getClassDef()==vcd)
- {
- //printf("Found variable type=%s\n",vmd->typeString());
- ClassDef *mcd=stripClassName(vmd->typeString());
- if (mcd && mcd->isLinkable())
- {
- if (generateClassMemberLink(ol,mcd,memName)) return;
- }
- }
- }
- }
- }
- }
- codifyLines(memName);
- addToSearchIndex(memName);
- return;
-}
-
-static void generateFunctionLink(CodeOutputInterface &ol,char *funcName)
-{
- //CodeClassDef *ccd=0;
- ClassDef *ccd=0;
- QCString locScope=g_classScope.copy();
- QCString locFunc=removeRedundantWhiteSpace(funcName);
- //fprintf(stdout,"*** locScope=%s locFunc=%s\n",locScope.data(),locFunc.data());
- int i=locFunc.findRev("::");
- if (i>0)
- {
- locScope=locFunc.left(i);
- locFunc=locFunc.right(locFunc.length()-i-2).stripWhiteSpace();
- int ts=locScope.find('<'); // start of template
- int te=locScope.findRev('>'); // end of template
- //printf("ts=%d te=%d\n",ts,te);
- if (ts!=-1 && te!=-1 && te>ts)
- {
- // remove template from scope
- locScope=locScope.left(ts)+locScope.right(locScope.length()-te-1);
- }
- }
- //printf("generateFunctionLink(%s) classScope=`%s'\n",locFunc.data(),locScope.data());
- if (!locScope.isEmpty() && (ccd=g_codeClassSDict[locScope]))
- {
- //printf("using classScope %s\n",g_classScope.data());
- BaseClassListIterator bcli(*ccd->baseClasses());
- for ( ; bcli.current() ; ++bcli)
- {
- if (getLink(bcli.current()->classDef->name(),locFunc,ol,funcName))
- {
- return;
- }
- }
- }
- if (!getLink(locScope,locFunc,ol,funcName))
- {
- generateClassOrGlobalLink(ol,funcName);
- }
- return;
-}
-
-/*! counts the number of lines in the input */
-static int countLines()
-{
- const char *p=g_inputString;
- char c;
- int count=1;
- while ((c=*p))
- {
- p++ ;
- if (c=='\n') count++;
- }
- if (p>g_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;
- }
- return count;
-}
-
-static void endFontClass()
-{
- if (g_currentFontClass)
- {
- g_code->endFontClass();
- g_currentFontClass=0;
- }
-}
-
-static void startFontClass(const char *s)
-{
- endFontClass();
- g_code->startFontClass(s);
- g_currentFontClass=s;
-}
-
-//----------------------------------------------------------------------------
-
-// recursively writes a linkified Objective-C method call
-static void writeObjCMethodCall(ObjCCallCtx *ctx)
-{
- if (ctx==0) return;
- const char *p = ctx->format.data();
- //printf("writeObjCMethodCall(%s) obj=%s method=%s\n",
- // ctx->format.data(),ctx->objectTypeOrName.data(),ctx->methodName.data());
- char c;
- if (!ctx->objectTypeOrName.isEmpty() && ctx->objectTypeOrName.at(0)!='$')
- {
- //printf("Looking for object=%s method=%s\n",ctx->objectTypeOrName.data(),
- // ctx->methodName.data());
- ClassDef *cd = g_theVarContext.findVariable(ctx->objectTypeOrName);
- if (cd==0) // not a local variable
- {
- if (ctx->objectTypeOrName=="self")
- {
- if (g_currentDefinition &&
- g_currentDefinition->definitionType()==Definition::TypeClass)
- {
- ctx->objectType = (ClassDef *)g_currentDefinition;
- }
- }
- else
- {
- ctx->objectType = getResolvedClass(
- g_currentDefinition,
- g_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("g_currentDefinition=%p\n",g_currentDefinition);
- if (g_currentDefinition &&
- g_currentDefinition->definitionType()==Definition::TypeClass)
- {
- ctx->objectVar = ((ClassDef *)g_currentDefinition)->getMemberByName(ctx->objectTypeOrName);
- //printf(" ctx->objectVar=%p\n",ctx->objectVar);
- if (ctx->objectVar)
- {
- ctx->objectType = stripClassName(ctx->objectVar->typeString());
- //printf(" ctx->objectType=%p\n",ctx->objectType);
- if (ctx->objectType)
- {
- 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->method = cd->getMemberByName(ctx->methodName);
- //printf(" class=%p method=%p\n",cd,ctx->method);
- }
- }
- }
-
- //printf("[");
- while ((c=*p++)) // for each character in ctx->format
- {
- if (c=='$')
- {
- char nc=*p++;
- if (nc=='$') // escaped $
- {
- g_code->codify("$");
- }
- else // name fragment or reference to a nested call
- {
- 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 = g_nameDict.find(refId);
- if (pName)
- {
- if (ctx->method && ctx->method->isLinkable())
- {
- writeMultiLineCodeLink(*g_code,
- ctx->method->getReference(),
- ctx->method->getOutputFileBase(),
- ctx->method->anchor(),
- pName->data());
- if (g_currentMemberDef)
- {
- addDocCrossReference(g_currentMemberDef,ctx->method);
- }
- }
- else
- {
- codifyLines(pName->data());
- }
- }
- 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 = g_objectDict.find(refId);
- if (pObject)
- {
- if (*pObject=="self")
- {
- if (g_currentDefinition &&
- g_currentDefinition->definitionType()==Definition::TypeClass)
- {
- ctx->objectType = (ClassDef *)g_currentDefinition;
- if (ctx->objectType->categoryOf())
- {
- ctx->objectType = ctx->objectType->categoryOf();
- }
- if (ctx->objectType)
- {
- ctx->method = ctx->objectType->getMemberByName(ctx->methodName);
- }
- }
- startFontClass("keyword");
- codifyLines(pObject->data());
- endFontClass();
- }
- else if (*pObject=="super")
- {
- if (g_currentDefinition &&
- g_currentDefinition->definitionType()==Definition::TypeClass)
- {
- ClassDef *cd = (ClassDef *)g_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->method = ctx->objectType->getMemberByName(ctx->methodName);
- }
- }
- }
- }
- }
- startFontClass("keyword");
- codifyLines(pObject->data());
- endFontClass();
- }
- else if (ctx->objectVar && ctx->objectVar->isLinkable()) // object is class variable
- {
- writeMultiLineCodeLink(*g_code,
- ctx->objectVar->getReference(),
- ctx->objectVar->getOutputFileBase(),
- ctx->objectVar->anchor(),
- pObject->data());
- if (g_currentMemberDef)
- {
- addDocCrossReference(g_currentMemberDef,ctx->objectVar);
- }
- }
- else if (ctx->objectType &&
- ctx->objectType!=VariableContext::dummyContext &&
- ctx->objectType->isLinkable()
- ) // object is class name
- {
- ClassDef *cd = ctx->objectType;
- writeMultiLineCodeLink(*g_code,
- cd->getReference(),
- cd->getOutputFileBase(),
- 0,
- pObject->data());
- }
- else // object still needs to be resolved
- {
- ClassDef *cd = getResolvedClass(g_currentDefinition,
- g_sourceFileDef, *pObject);
- if (cd && cd->isLinkable())
- {
- if (ctx->objectType==0) ctx->objectType=cd;
- writeMultiLineCodeLink(*g_code,
- cd->getReference(),
- cd->getOutputFileBase(),
- 0,
- pObject->data());
- }
- else
- {
- codifyLines(pObject->data());
- }
- }
- }
- 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 = g_contextDict.find(refId);
- if (ictx) // recurse into nested call
- {
- writeObjCMethodCall(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(ictx->method->typeString());
- if (ctx->objectType)
- {
- 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 // illegal marker
- {
- ASSERT(!"invalid escape sequence");
- }
- }
- }
- else // normal non-marker character
- {
- char s[2];
- s[0]=c;s[1]=0;
- codifyLines(s);
- }
- }
- //printf("%s %s]\n",ctx->objectTypeOrName.data(),ctx->methodName.data());
- //printf("}=(type='%s',name='%s')",
- // ctx->objectTypeOrName.data(),
- // ctx->methodName.data());
-}
-
-// 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 g_nameDict
-static QCString escapeName(const char *s)
-{
- QCString result;
- result.sprintf("$n%d",g_currentNameId);
- g_nameDict.insert(g_currentNameId,new QCString(s));
- g_currentNameId++;
- return result;
-}
-
-static QCString escapeObject(const char *s)
-{
- QCString result;
- result.sprintf("$o%d",g_currentObjId);
- g_objectDict.insert(g_currentObjId,new QCString(s));
- g_currentObjId++;
- return result;
-}
-
-/* -----------------------------------------------------------------
- */
-#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;
-}
-
-%}
-
-B [ \t]
-BN [ \t\n\r]
-ID "$"?[a-z_A-Z][a-z_A-Z0-9]*
-SCOPENAME "$"?(({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
-TEMPLIST "<"[^\"\}\{\(\)\/\n\>]*">"
-SCOPETNAME ((({ID}{TEMPLIST}?){BN}*"::"{BN}*)*)((~{BN}*)?{ID})
-SCOPEPREFIX ({ID}{TEMPLIST}?{BN}*"::"{BN}*)+
-KEYWORD_OBJC ("@public"|"@private"|"@protected"|"@class"|"@implementation"|"@interface"|"@end"|"@selector"|"@protocol")
-KEYWORD ("asm"|"auto"|"class"|"const"|"const_cast"|"delete"|"dynamic_cast"|"enum"|"explicit"|"extern"|"false"|"friend"|"inline"|"mutable"|"namespace"|"new"|"operator"|"private"|"protected"|"public"|"register"|"reinterpret_cast"|"sizeof"|"static"|"static_cast"|"struct"|"template"|"this"|"self"|"true"|"typedef"|"typeid"|"typename"|"union"|"using"|"virtual"|"volatile"|"abstract"|"final"|"import"|"synchronized"|"transient"|KEYWORD_OBJC)
-FLOWKW ("break"|"case"|"catch"|"continue"|"default"|"do"|"else"|"for"|"goto"|"if"|"return"|"switch"|"throw"|"throws"|"try"|"while")
-TYPEKW ("bool"|"char"|"double"|"float"|"int"|"long"|"short"|"signed"|"unsigned"|"void"|"wchar_t"|"boolean"|"id"|"SEL")
-CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'"))
-ARITHOP "+"|"-"|"/"|"*"|"%"|"--"|"++"
-ASSIGNOP "="|"*="|"/="|"%="|"+="|"-="|"<<="|">>="|"&="|"^="|"|="
-LOGICOP "=="|"!="|">"|"<"|">="|"<="|"&&"|"||"|"!"
-BITOP "&"|"|"|"^"|"<<"|">>"|"~"
-OPERATOR {ARITHOP}|{ASSIGNOP}|{LOGICOP}|{BITOP}
-%option noyywrap
-
-%x SkipString
-%x SkipVerbString
-%x SkipCPP
-%x SkipComment
-%x SkipCxxComment
-%x RemoveSpecialCComment
-%x StripSpecialCComment
-%x Body
-%x FuncCall
-%x MemberCall
-%x MemberCall2
-%x SkipInits
-%x ClassName
-%x PackageName
-%x ClassVar
-%x Bases
-%x SkipSharp
-%x ReadInclude
-%x TemplDecl
-%x CallEnd
-%x ObjCMethod
-%x ObjCParams
-%x ObjCParamType
-%x ObjCCall
-%x ObjCMName
-%x ObjCSkipStr
-%x OldStyleArgs
-
-%%
-
-<*>\x0d
-<Body>^([ \t]*"#"[ \t]*("include"|"import")[ \t]*)("<"|"\"") {
- startFontClass("preprocessor");
- g_code->codify(yytext);
- BEGIN( ReadInclude );
- }
-<Body>("@interface"|"@implementation"|"@protocol")[ \t\n]+ {
- g_insideObjC=TRUE;
- startFontClass("keyword");
- codifyLines(yytext);
- endFontClass();
- if (!g_insideTemplate)
- BEGIN( ClassName );
- }
-<Body>("class"|"struct"|"union"|"namespace")[ \t\n]+ {
- startFontClass("keyword");
- codifyLines(yytext);
- endFontClass();
- if (!g_insideTemplate)
- BEGIN( ClassName );
- }
-<Body>("package")[ \t\n]+ {
- startFontClass("keyword");
- codifyLines(yytext);
- endFontClass();
- BEGIN( PackageName );
- }
-<ClassVar>\n {
- if (!g_insideObjC) REJECT;
- codifyLines(yytext);
- BEGIN(Body);
- }
-<Body,ClassVar,Bases>"-"|"+" {
- if (!g_insideObjC || g_insideBody)
- {
- g_code->codify(yytext);
- }
- else // Start of Objective-C method
- {
- //printf("Method!\n");
- g_code->codify(yytext);
- BEGIN(ObjCMethod);
- }
- }
-<ObjCMethod>":" {
- g_code->codify(yytext);
- BEGIN(ObjCParams);
- }
-<ObjCParams>"(" {
- g_code->codify(yytext);
- BEGIN(ObjCParamType);
- }
-<ObjCParams,ObjCMethod>";"|"{" {
- g_code->codify(yytext);
- if (*yytext=='{')
- {
- g_curlyCount++;
- g_inClass=TRUE;
- if (g_searchingForBody)
- {
- g_searchingForBody=FALSE;
- g_insideBody=TRUE;
- }
- if (g_insideBody) g_bodyCurlyCount++;
- if (!g_curClassName.isEmpty()) // valid class name
- {
- pushScope(g_curClassName);
- g_scopeStack.push(SCOPEBLOCK);
- }
- }
- g_type.resize(0);
- g_name.resize(0);
- BEGIN(Body);
- }
-<ObjCParams>{ID}{B}*":" {
- g_code->codify(yytext);
- }
-<ObjCParamType>{TYPEKW} {
- startFontClass("keywordtype");
- g_code->codify(yytext);
- endFontClass();
- g_parmType=yytext;
- }
-<ObjCParamType>{ID} {
- g_code->codify(yytext);
- g_parmType=yytext;
- }
-<ObjCParamType>")" {
- g_code->codify(yytext);
- BEGIN(ObjCParams);
- }
-<ObjCParams>{ID} {
- g_code->codify(yytext);
- g_parmName=yytext;
- g_theVarContext.addVariable(g_parmType,g_parmName);
- g_parmType.resize(0);g_parmName.resize(0);
- }
-<ObjCMethod,ObjCParams,ObjCParamType>. {
- g_code->codify(yytext);
- }
-<ObjCMethod,ObjCParams,ObjCParamType>\n {
- codifyLines(yytext);
- }
-<ReadInclude>[^\n\"\>]+/(">"|"\"") {
- //FileInfo *f;
- bool ambig;
- bool found=FALSE;
- FileDef *fd=0;
- //printf("looking for include %s\n",yytext);
- if ((fd=findFileDef(Doxygen::inputNameDict,yytext,ambig)) &&
- fd->isLinkable())
- {
- if (ambig) // multiple input files match the name
- {
- //printf("===== yes %s is ambigious\n",yytext);
- QCString name = convertToQCString(QDir::cleanDirPath(yytext));
- if (!name.isEmpty() && g_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 = g_sourceFileDef->isIncluded(fd->absFilePath());
- //printf(" include file %s found=%d\n",fd->absFilePath().data(),found);
- }
- }
- }
- }
- else // not ambiguous
- {
- found = TRUE;
- }
- }
- if (found)
- {
- //printf(" include file %s found=%d\n",fd->absFilePath().data(),found);
- g_code->writeCodeLink(fd->getReference(),fd->getOutputFileBase(),0,yytext);
- }
- else
- {
- g_code->codify(yytext);
- }
- char c=yyinput();
- QCString text;
- text+=c;
- g_code->codify(text);
- endFontClass();
- BEGIN( Body );
- }
-<Body>^[ \t]*"#" {
- startFontClass("preprocessor");
- g_code->codify(yytext);
- BEGIN( SkipCPP ) ;
- }
-<SkipCPP>. {
- g_code->codify(yytext);
- }
-<SkipCPP>\\[\r]?\n {
- codifyLines(yytext);
- }
-<SkipCPP>\n/.*\n {
- codifyLines(yytext);
- endFontClass();
- BEGIN( Body ) ;
- }
-<SkipCPP>"//" {
- g_code->codify(yytext);
- }
-<Body>"{" {
- g_theVarContext.pushScope();
-
- g_scopeStack.push(INNERBLOCK);
-
- if (g_searchingForBody)
- {
- g_searchingForBody=FALSE;
- g_insideBody=TRUE;
- }
- g_code->codify(yytext);
- g_curlyCount++;
- if (g_insideBody)
- {
- g_bodyCurlyCount++;
- }
- g_type.resize(0);
- g_name.resize(0);
- }
-<Body,MemberCall,MemberCall2>"}" {
- g_theVarContext.popScope();
-
- int *scope = g_scopeStack.pop();
- if (scope==SCOPEBLOCK || scope==CLASSBLOCK)
- {
- popScope();
- }
-
- g_code->codify(yytext);
-
- g_inClass=FALSE;
-
- if (--g_bodyCurlyCount<=0)
- {
- g_insideBody=FALSE;
- g_currentMemberDef=0;
- if (g_currentDefinition)
- g_currentDefinition=g_currentDefinition->getOuterScope();
- }
- BEGIN(Body);
- }
-<Body,ClassVar>"@end" {
- //printf("End of objc scope fd=%s\n",g_sourceFileDef->name().data());
- if (g_sourceFileDef)
- {
- FileDef *fd=g_sourceFileDef;
- g_insideObjC = fd->name().lower().right(2)==".m" ||
- fd->name().lower().right(3)==".mm";
- //printf("insideObjC=%d\n",g_insideObjC);
- }
- else
- {
- g_insideObjC = FALSE;
- }
- if (g_insideBody)
- {
- g_theVarContext.popScope();
-
- int *scope = g_scopeStack.pop();
- if (scope==SCOPEBLOCK || scope==CLASSBLOCK)
- {
- popScope();
- }
- g_insideBody=FALSE;
- }
-
- startFontClass("keyword");
- g_code->codify(yytext);
- endFontClass();
-
- g_inClass=FALSE;
-
- g_currentMemberDef=0;
- if (g_currentDefinition)
- g_currentDefinition=g_currentDefinition->getOuterScope();
- BEGIN(Body);
- }
-<ClassName,ClassVar>";" {
- g_code->codify(yytext);
- g_searchingForBody=FALSE;
- BEGIN( Body );
- }
-<ClassName,ClassVar>[*&]+ {
- g_type=g_curClassName.copy();
- g_name.resize(0);
- g_code->codify(yytext);
- BEGIN( Body ); // variable of type struct *
- }
-<ClassName>{ID}("::"{ID})* {
- g_curClassName=yytext;
- addType();
- generateClassOrGlobalLink(*g_code,yytext);
- BEGIN( ClassVar );
- }
-<PackageName>{ID}("."{ID})* {
- g_curClassName=yytext;
- g_curClassName=substitute(g_curClassName,".","::");
- //printf("found package: %s\n",g_curClassName.data());
- addType();
- codifyLines(yytext);
- }
-<ClassVar>"=" {
- unput(*yytext);
- BEGIN( Body );
- }
-<ClassVar>("extends"|"implements") { // Java
- startFontClass("keyword");
- codifyLines(yytext);
- endFontClass();
- g_curClassBases.clear();
- BEGIN( Bases );
- }
-<ClassVar>{ID} {
- g_type = g_curClassName.copy();
- g_name = yytext;
- g_theVarContext.addVariable(g_type,g_name);
- generateClassOrGlobalLink(*g_code,yytext);
- }
-<ClassName,ClassVar>[ \t\n]*":"[ \t\n]* {
- codifyLines(yytext);
- g_curClassBases.clear();
- BEGIN( Bases );
- }
-<PackageName>[ \t]*";" |
-<Bases,ClassName,ClassVar>[ \t]*"{"[ \t]* {
- g_theVarContext.pushScope();
- g_code->codify(yytext);
- g_curlyCount++;
- g_inClass=TRUE;
- if (YY_START==ClassVar && g_curClassName.isEmpty())
- {
- g_curClassName = g_name.copy();
- }
- if (g_searchingForBody)
- {
- g_searchingForBody=FALSE;
- g_insideBody=TRUE;
- }
- if (g_insideBody) g_bodyCurlyCount++;
- if (!g_curClassName.isEmpty()) // valid class name
- {
- g_scopeStack.push(CLASSBLOCK);
- pushScope(g_curClassName);
- //fprintf(stderr,"***** g_curClassName=%s\n",g_curClassName.data());
- if (getResolvedClass(g_currentDefinition,g_sourceFileDef,g_curClassName)==0)
- {
- //printf("Adding new class %s\n",g_curClassName.data());
- ClassDef *ncd=new ClassDef("<code>",1,
- g_curClassName,ClassDef::Class,0,0,FALSE);
- g_codeClassSDict.append(g_curClassName,ncd);
- // insert base classes.
- char *s=g_curClassBases.first();
- while (s)
- {
- ClassDef *bcd;
- bcd=g_codeClassSDict[s];
- if (bcd==0) bcd=getResolvedClass(g_currentDefinition,g_sourceFileDef,s);
- if (bcd && bcd!=ncd)
- {
- ncd->insertBaseClass(bcd,s,Public,Normal);
- }
- s=g_curClassBases.next();
- }
- }
- //printf("g_codeClassList.count()=%d\n",g_codeClassList.count());
- }
- else // not a class name -> assume inner block
- {
- g_scopeStack.push(INNERBLOCK);
- }
- g_curClassName.resize(0);
- g_curClassBases.clear();
- BEGIN( Body );
- }
-<Bases>"virtual"|"public"|"protected"|"private"|"@public"|"@private"|"@protected" {
- startFontClass("keyword");
- g_code->codify(yytext);
- endFontClass();
- }
-<Bases>{ID} {
- //printf("%s:addBase(%s)\n",g_ccd.name.data(),yytext);
- g_curClassBases.inSort(yytext);
- generateClassOrGlobalLink(*g_code,yytext);
- }
-<Bases>"<" {
- g_code->codify(yytext);
- if (!g_insideObjC)
- {
- g_sharpCount=1;
- BEGIN ( SkipSharp );
- }
- else
- {
- g_insideProtocolList=TRUE;
- }
- }
-<Bases>">" {
- g_code->codify(yytext);
- g_insideProtocolList=FALSE;
- }
-<SkipSharp>"<" {
- g_code->codify(yytext);
- ++g_sharpCount;
- }
-<SkipSharp>">" {
- g_code->codify(yytext);
- if (--g_sharpCount<=0)
- BEGIN ( Bases );
- }
-<Bases>"(" {
- g_code->codify(yytext);
- g_sharpCount=1;
- BEGIN ( SkipSharp );
- }
-<SkipSharp>"(" {
- g_code->codify(yytext);
- ++g_sharpCount;
- }
-<SkipSharp>")" {
- g_code->codify(yytext);
- if (--g_sharpCount<=0)
- BEGIN ( Bases );
- }
-
-
-<Bases>"," {
- g_code->codify(yytext);
- }
-
-
-<Body>{SCOPEPREFIX}?"operator"{B}*"()"{B}*/"(" {
- addType();
- generateFunctionLink(*g_code,yytext);
- g_bracketCount=0;
- g_args.resize(0);
- g_name+=yytext;
- BEGIN( FuncCall );
- }
-<Body>{SCOPEPREFIX}?"operator"{B}*[^\(\n]+/"(" {
- addType();
- generateFunctionLink(*g_code,yytext);
- g_bracketCount=0;
- g_args.resize(0);
- g_name+=yytext;
- BEGIN( FuncCall );
- }
-<Body,TemplDecl>"template"/([^a-zA-Z0-9]) {
- startFontClass("keyword");
- codifyLines(yytext);
- endFontClass();
- g_insideTemplate=TRUE;
- g_sharpCount=0;
- }
-<Body>{KEYWORD}/([^a-z_A-Z0-9]) {
- startFontClass("keyword");
- codifyLines(yytext);
- if (QCString(yytext)=="typedef")
- {
- addType();
- g_name+=yytext;
- }
- endFontClass();
- }
-<Body>{KEYWORD}/{B}* {
- startFontClass("keyword");
- codifyLines(yytext);
- endFontClass();
- }
-<Body>{KEYWORD}/{B}*"(" {
- startFontClass("keyword");
- codifyLines(yytext);
- endFontClass();
- g_name.resize(0);g_type.resize(0);
- }
-<Body>{FLOWKW}/([^a-z_A-Z0-9]) {
- startFontClass("keywordflow");
- codifyLines(yytext);
- endFontClass();
- }
-<Body>{FLOWKW}/{B}* {
- startFontClass("keywordflow");
- codifyLines(yytext);
- endFontClass();
- }
-<Body>{FLOWKW}/{B}*"(" {
- startFontClass("keywordflow");
- codifyLines(yytext);
- endFontClass();
- g_name.resize(0);g_type.resize(0);
- BEGIN(FuncCall);
- }
-<Body>[\\|\)\+\-\/\%\~\!] {
- g_code->codify(yytext);
- g_name.resize(0);g_type.resize(0);
- if (*yytext==')')
- {
- g_theCallContext.popScope();
- }
- }
-<Body,TemplDecl,ObjCMethod>{TYPEKW}/{B}* {
- startFontClass("keywordtype");
- g_code->codify(yytext);
- endFontClass();
- addType();
- g_name+=yytext;
- }
-<Body>"template"/{B}*"<"[^\n\/\-\.\{\"\>]*">"{B}* { // template<...>
- startFontClass("keyword");
- g_code->codify(yytext);
- endFontClass();
- g_sharpCount=0;
- BEGIN(TemplDecl);
- }
-<TemplDecl>"class"|"typename" {
- startFontClass("keyword");
- codifyLines(yytext);
- endFontClass();
- }
-<TemplDecl>"<" {
- g_code->codify(yytext);
- g_sharpCount++;
- }
-<TemplDecl>">" {
- g_code->codify(yytext);
- g_sharpCount--;
- if (g_sharpCount<=0)
- {
- BEGIN(Body);
- }
- }
-<Body>{SCOPENAME}{B}*"<"[^\n\/\-\.\{\"\>]*">"/{B}* { // A<T> *pt;
- generateClassOrGlobalLink(*g_code,yytext);
- addType();
- g_name+=yytext;
- }
-<Body>{SCOPENAME}/{B}*[;,)\]] { // "int var;" or "var, var2" or "debug(f) macro"
- generateClassOrGlobalLink(*g_code,yytext/*,TRUE*/);
- addType();
- g_name+=yytext;
- }
-<Body>{SCOPENAME}/{B}* { // p->func()
- generateClassOrGlobalLink(*g_code,yytext);
- addType();
- g_name+=yytext;
- }
-<Body>"("{B}*("*"{B}*)+{SCOPENAME}*{B}*")"/{B}* { // (*p)->func() but not "if (p) ..."
- g_code->codify(yytext);
- int s=0;while (s<yyleng && !isId(yytext[s])) s++;
- int e=yyleng-1;while (e>=0 && !isId(yytext[e])) e--;
- QCString varname = ((QCString)yytext).mid(s,e-s+1);
- addType();
- g_name=varname;
- }
-<Body>{SCOPETNAME}/{B}*"(" { // a() or c::a() or t<A,B>::a()
- addType();
- generateFunctionLink(*g_code,yytext);
- //g_theVarContext.addVariable(g_type,yytext);
- g_bracketCount=0;
- g_args.resize(0);
- g_name+=yytext;
- BEGIN( FuncCall );
- }
-<FuncCall,Body,MemberCall,MemberCall2,SkipInits>\" {
- startFontClass("stringliteral");
- g_code->codify(yytext);
- g_lastStringContext=YY_START;
- BEGIN( SkipString );
- }
-<SkipString>[^\"\\\r\n]* {
- g_code->codify(yytext);
- }
-<SkipString>"//"|"/*" {
- g_code->codify(yytext);
- }
-<SkipString>@?\" {
- g_code->codify(yytext);
- endFontClass();
- BEGIN( g_lastStringContext );
- }
-<SkipString>\\. {
- g_code->codify(yytext);
- }
-<SkipVerbString>[^"\n]+ {
- g_code->codify(yytext);
- }
-<SkipVerbString>\"\" { // escaped quote
- g_code->codify(yytext);
- }
-<SkipVerbString>\" { // end of string
- g_code->codify(yytext);
- endFontClass();
- BEGIN( g_lastVerbStringContext );
- }
-<SkipVerbString>. {
- g_code->codify(yytext);
- }
-<SkipVerbString>\n {
- g_code->codify(yytext);
- }
-<Body>":" {
- g_code->codify(yytext);
- g_name.resize(0);g_type.resize(0);
- }
-<Body>"<" {
- if (g_insideTemplate)
- {
- g_sharpCount++;
- }
- g_code->codify(yytext);
- }
-<Body>">" {
- if (g_insideTemplate)
- {
- if (--g_sharpCount<=0)
- {
- g_insideTemplate=FALSE;
- }
- }
- g_code->codify(yytext);
- }
-<Body,MemberCall,MemberCall2,FuncCall>"'"((\\0[Xx0-9]+)|(\\.)|(.))"'" {
- startFontClass("charliteral");
- g_code->codify(yytext);
- endFontClass();
- }
-<Body>"$"?"this->" { g_code->codify(yytext); }
-<Body>"."|"->" {
- g_code->codify(yytext);
- g_memCallContext = YY_START;
- BEGIN( MemberCall );
- }
-<MemberCall>{SCOPETNAME}/{B}*"(" {
- if (g_theCallContext.getClass())
- {
- if (!generateClassMemberLink(*g_code,g_theCallContext.getClass(),yytext))
- {
- g_code->codify(yytext);
- addToSearchIndex(yytext);
- }
- g_name.resize(0);
- }
- else
- {
- g_code->codify(yytext);
- addToSearchIndex(yytext);
- g_name.resize(0);
- }
- g_type.resize(0);
- g_bracketCount=0;
- if (g_memCallContext==Body)
- {
- BEGIN(FuncCall);
- }
- else
- {
- BEGIN(g_memCallContext);
- }
- }
-<MemberCall>{SCOPENAME}/{B}* {
- if (g_theCallContext.getClass())
- {
- //fprintf(stderr,"g_theCallContext.getClass()=%p\n",g_theCallContext.getClass());
- if (!generateClassMemberLink(*g_code,g_theCallContext.getClass(),yytext))
- {
- g_code->codify(yytext);
- addToSearchIndex(yytext);
- }
- g_name.resize(0);
- }
- else
- {
- //fprintf(stderr,"no class context!\n");
- g_code->codify(yytext);
- addToSearchIndex(yytext);
- g_name.resize(0);
- }
- g_type.resize(0);
- BEGIN(g_memCallContext);
- }
-<Body>[,=;\[] {
- if (g_insideObjC && *yytext=='[')
- {
- //printf("Found start of ObjC call!\n");
- // start of a method call
- g_contextDict.setAutoDelete(TRUE);
- g_nameDict.setAutoDelete(TRUE);
- g_objectDict.setAutoDelete(TRUE);
- g_contextDict.clear();
- g_nameDict.clear();
- g_objectDict.clear();
- g_currentCtxId = 0;
- g_currentNameId = 0;
- g_currentObjId = 0;
- g_currentCtx = 0;
- g_braceCount = 0;
- unput('[');
- BEGIN(ObjCCall);
- }
- else
- {
- g_code->codify(yytext);
- g_saveName = g_name.copy();
- g_saveType = g_type.copy();
- if (*yytext!='[' && !g_type.isEmpty())
- {
- if (g_scopeStack.top()!=CLASSBLOCK)
- {
- g_theVarContext.addVariable(g_type,g_name);
- }
- g_name.resize(0);
- }
- if (*yytext==';' || *yytext=='=')
- {
- g_type.resize(0);
- g_name.resize(0);
- }
- else if (*yytext=='[')
- {
- g_theCallContext.pushScope();
- }
- g_args.resize(0);
- g_parmType.resize(0);
- g_parmName.resize(0);
- }
- }
- /*
-<ObjCMemberCall>{ID} {
- if (strcmp(yytext,"self")==0 || strcmp(yytext,"super")==0)
- {
- // TODO: get proper base class for "super"
- g_theCallContext.setClass(getClass(g_curClassName));
- startFontClass("keyword");
- g_code->codify(yytext);
- endFontClass();
- }
- else
- {
- generateClassOrGlobalLink(*g_code,yytext);
- }
- g_name.resize(0);
- BEGIN(ObjCMemberCall2);
- }
-<ObjCMemberCall>"[" {
- g_code->codify(yytext);
- g_theCallContext.pushScope();
- }
-<ObjCMemberCall2>{ID}":"? {
- g_name+=yytext;
- if (g_theCallContext.getClass())
- {
- //printf("Calling method %s\n",g_name.data());
- if (!generateClassMemberLink(*g_code,g_theCallContext.getClass(),g_name))
- {
- g_code->codify(yytext);
- addToSearchIndex(g_name);
- }
- }
- else
- {
- g_code->codify(yytext);
- addToSearchIndex(g_name);
- }
- g_name.resize(0);
- BEGIN(ObjCMemberCall3);
- }
-<ObjCMemberCall2,ObjCMemberCall3>"]" {
- g_theCallContext.popScope();
- g_code->codify(yytext);
- BEGIN(Body);
- }
- */
-<ObjCCall,ObjCMName>"[" {
- saveObjCContext();
- g_currentCtx->format+=*yytext;
- BEGIN(ObjCCall);
- //printf("open\n");
- }
-<ObjCCall,ObjCMName>"]" {
- g_currentCtx->format+=*yytext;
- restoreObjCContext();
- BEGIN(ObjCMName);
- if (g_currentCtx==0)
- {
- // end of call
- writeObjCMethodCall(g_contextDict.find(0));
- BEGIN(Body);
- }
- //printf("close\n");
- }
-<ObjCCall>{ID} {
- g_currentCtx->format+=escapeObject(yytext);
- if (g_braceCount==0)
- {
- g_currentCtx->objectTypeOrName=yytext;
- //printf("new type=%s\n",g_currentCtx->objectTypeOrName.data());
- BEGIN(ObjCMName);
- }
- }
-<ObjCMName>{ID}/{BN}*"]" {
- if (g_braceCount==0 &&
- g_currentCtx->methodName.isEmpty())
- {
- g_currentCtx->methodName=yytext;
- g_currentCtx->format+=escapeName(yytext);
- }
- else
- {
- g_currentCtx->format+=yytext;
- }
- }
-<ObjCMName>{ID}/{BN}*":" {
- if (g_braceCount==0)
- {
- g_currentCtx->methodName+=yytext;
- g_currentCtx->methodName+=":";
- }
- g_currentCtx->format+=escapeName(yytext);
- }
-<ObjCSkipStr>[^\n\"$\\]* { g_currentCtx->format+=yytext; }
-<ObjCSkipStr>\\. { g_currentCtx->format+=yytext; }
-<ObjCSkipStr>"\"" { g_currentCtx->format+=yytext;
- BEGIN(g_lastStringContext);
- }
-<ObjCCall,ObjCMName>{CHARLIT} { g_currentCtx->format+=yytext; }
-<ObjCCall,ObjCMName>"@"?"\"" { g_currentCtx->format+=yytext;
- g_lastStringContext=YY_START;
- BEGIN(ObjCSkipStr);
- }
-<ObjCCall,ObjCMName,ObjCSkipStr>"$" { g_currentCtx->format+="$$"; }
-<ObjCCall,ObjCMName>"(" { g_currentCtx->format+=*yytext; g_braceCount++; }
-<ObjCCall,ObjCMName>")" { g_currentCtx->format+=*yytext; g_braceCount--; }
-<ObjCCall,ObjCMName,ObjCSkipStr>. { g_currentCtx->format+=*yytext; }
-<ObjCCall,ObjCMName,ObjCSkipStr>\n { g_currentCtx->format+=*yytext; }
-
-<Body>"]" {
- g_theCallContext.popScope();
- g_code->codify(yytext);
- // TODO: nested arrays like: a[b[0]->func()]->func()
- g_name = g_saveName.copy();
- g_type = g_saveType.copy();
- }
-<Body>[0-9]+ {
- g_code->codify(yytext);
- }
-<Body>[0-9]+[xX][0-9A-Fa-f]+ {
- g_code->codify(yytext);
- }
-<MemberCall2,FuncCall>{KEYWORD}/([^a-z_A-Z0-9]) {
- addParmType();
- g_parmName=yytext;
- startFontClass("keyword");
- g_code->codify(yytext);
- endFontClass();
- }
-<MemberCall2,FuncCall,OldStyleArgs>{TYPEKW}/([^a-z_A-Z0-9]) {
- addParmType();
- g_parmName=yytext;
- startFontClass("keywordtype");
- g_code->codify(yytext);
- endFontClass();
- }
-<MemberCall2,FuncCall>{FLOWKW}/([^a-z_A-Z0-9]) {
- addParmType();
- g_parmName=yytext;
- startFontClass("keywordflow");
- g_code->codify(yytext);
- endFontClass();
- }
-<MemberCall2,FuncCall>[a-z_A-Z][:a-z_A-Z0-9]*({B}*"<"[^\n\[\](){}<>]*">")? {
- addParmType();
- g_parmName=yytext;
- generateClassOrGlobalLink(*g_code,yytext,!g_insideBody);
- }
-<MemberCall2,FuncCall>, {
- g_code->codify(yytext);
- g_theVarContext.addVariable(g_parmType,g_parmName);
- g_parmType.resize(0);g_parmName.resize(0);
- }
-<MemberCall2,FuncCall>"(" {
- g_code->codify(yytext);
- g_bracketCount++;
- g_theCallContext.pushScope();
- if (YY_START==FuncCall && !g_insideBody)
- {
- g_theVarContext.pushScope();
- }
- }
-<MemberCall2,FuncCall>{OPERATOR} { // operator
- if (strcmp(yytext,"*") && strcmp(yytext,"&")) // typically a pointer or reference
- {
- // not a * or &
- g_parmType.resize(0);g_parmName.resize(0);
- }
- g_code->codify(yytext);
- }
-<MemberCall,MemberCall2,FuncCall>")" {
- g_theVarContext.addVariable(g_parmType,g_parmName);
- g_theCallContext.popScope();
- //g_theCallContext.setClass(0); // commented out, otherwise a()->b() does not work for b().
- g_code->codify(yytext);
- if (--g_bracketCount<=0)
- {
- if (g_name.isEmpty())
- {
- BEGIN( Body );
- }
- else
- {
- BEGIN( CallEnd );
- }
- }
- }
-<CallEnd>[ \t\n]* { codifyLines(yytext); }
- /*
-<MemberCall2,FuncCall>")"[ \t\n]*[;:] {
- */
-<CallEnd>[;:] {
- codifyLines(yytext);
- g_bracketCount=0;
- if (*yytext==';') g_searchingForBody=FALSE;
- if (!g_inClass && !g_type.isEmpty())
- {
- //fprintf(stderr,"add variable g_type=%s g_name=%s)\n",g_type.data(),g_name.data());
- g_theVarContext.addVariable(g_type,g_name);
- }
- g_parmType.resize(0);g_parmName.resize(0);
- g_theCallContext.setClass(0);
- if (*yytext==';' || g_insideBody)
- {
- if (!g_insideBody)
- {
- g_theVarContext.popScope();
- }
- g_name.resize(0);g_type.resize(0);
- BEGIN( Body );
- }
- else
- {
- g_bracketCount=0;
- BEGIN( SkipInits );
- }
- }
-<CallEnd>("const"|"volatile")({BN}+("const"|"volatile"))*{BN}*/[;=] {
- startFontClass("keyword");
- codifyLines(yytext);
- endFontClass();
- }
-<CallEnd,OldStyleArgs>("const"|"volatile")*({BN}+("const"|"volatile"))*{BN}*"{" {
- if (g_insideBody)
- {
- g_theVarContext.pushScope();
- }
- g_theVarContext.addVariable(g_parmType,g_parmName);
- //g_theCallContext.popScope();
- g_parmType.resize(0);g_parmName.resize(0);
- int index = g_name.findRev("::");
- if (index!=-1)
- {
- ClassDef *cd=getResolvedClass(Doxygen::globalScope,g_sourceFileDef,g_name.left(index));
- if (cd)
- {
- setClassScope(cd->name());
- }
- else
- {
- setClassScope(g_realScope);
- }
- g_scopeStack.push(SCOPEBLOCK);
- }
- else
- {
- g_scopeStack.push(INNERBLOCK);
- }
- yytext[yyleng-1]='\0';
- QCString cv(yytext);
- if (!cv.stripWhiteSpace().isEmpty())
- {
- startFontClass("keyword");
- codifyLines(yytext);
- endFontClass();
- }
- else // just whitespace
- {
- codifyLines(yytext);
- }
- g_code->codify("{");
- if (g_searchingForBody)
- {
- g_searchingForBody=FALSE;
- g_insideBody=TRUE;
- }
- if (g_insideBody) g_bodyCurlyCount++;
- g_curlyCount++;
- g_type.resize(0); g_name.resize(0);
- BEGIN( Body );
- }
-<CallEnd>{ID} {
- if (g_insideBody || !g_parmType.isEmpty())
- {
- REJECT;
- }
- // could be K&R style definition
- addParmType();
- g_parmName=yytext;
- generateClassOrGlobalLink(*g_code,yytext,!g_insideBody);
- BEGIN(OldStyleArgs);
- }
-<OldStyleArgs>{ID} {
- addParmType();
- g_parmName=yytext;
- generateClassOrGlobalLink(*g_code,yytext,!g_insideBody);
- }
-<OldStyleArgs>[,;] {
- g_code->codify(yytext);
- g_theVarContext.addVariable(g_parmType,g_parmName);
- if (*yytext==';') g_parmType.resize(0);
- g_parmName.resize(0);
- }
-<CallEnd>. {
- unput(*yytext);
- if (!g_insideBody)
- {
- g_theVarContext.popScope();
- }
- g_name.resize(0);g_args.resize(0);
- g_parmType.resize(0);g_parmName.resize(0);
- BEGIN( Body );
- }
-<SkipInits>";" {
- g_code->codify(yytext);
- g_type.resize(0); g_name.resize(0);
- BEGIN( Body );
- }
-<SkipInits>"{" {
- g_code->codify(yytext);
- g_curlyCount++;
- if (g_searchingForBody)
- {
- g_searchingForBody=FALSE;
- g_insideBody=TRUE;
- }
- if (g_insideBody) g_bodyCurlyCount++;
- if (g_name.find("::")!=-1)
- {
- g_scopeStack.push(SCOPEBLOCK);
- setClassScope(g_realScope);
- }
- else
- {
- g_scopeStack.push(INNERBLOCK);
- }
- g_type.resize(0); g_name.resize(0);
- BEGIN( Body );
- }
-<SkipInits>{ID} {
- generateClassOrGlobalLink(*g_code,yytext);
- }
-<FuncCall>([a-z_A-Z][a-z_A-Z0-9]*)/"(" {
- generateFunctionLink(*g_code,yytext);
- }
-<FuncCall>([a-z_A-Z][a-z_A-Z0-9]*)/("."|"->") {
- g_name=yytext;
- generateClassOrGlobalLink(*g_code,yytext);
- BEGIN( MemberCall2 );
- }
-<FuncCall,MemberCall2>("("{B}*("*"{B}*)+[a-z_A-Z][a-z_A-Z0-9]*{B}*")"{B}*)/("."|"->") {
- g_code->codify(yytext);
- int s=0;while (!isId(yytext[s])) s++;
- int e=yyleng-1;while (!isId(yytext[e])) e--;
- g_name=((QCString)yytext).mid(s,e-s+1);
- BEGIN( MemberCall2 );
- }
-<MemberCall2>([a-z_A-Z][a-z_A-Z0-9]*)/([ \t\n]*"(") {
- if (!g_args.isEmpty())
- generateMemberLink(*g_code,g_args,yytext);
- else
- generateClassOrGlobalLink(*g_code,yytext);
- g_args.resize(0);
- BEGIN( FuncCall );
- }
-<MemberCall2>([a-z_A-Z][a-z_A-Z0-9]*)/([ \t\n]*("."|"->")) {
- //g_code->codify(yytext);
- g_name=yytext;
- generateClassOrGlobalLink(*g_code,yytext);
- BEGIN( MemberCall2 );
- }
-<MemberCall2>"->"|"." {
- g_code->codify(yytext);
- g_memCallContext = YY_START;
- BEGIN( MemberCall );
- }
-<SkipComment>"/*"("!"?)"*/" {
- g_code->codify(yytext);
- endFontClass();
- BEGIN( g_lastCContext ) ;
- }
-<SkipComment>"//"|"/*" {
- g_code->codify(yytext);
- }
-<SkipComment>[^*/\n]+ {
- g_code->codify(yytext);
- }
-<SkipComment>[ \t]*"*/" {
- g_code->codify(yytext);
- endFontClass();
- BEGIN( g_lastCContext ) ;
- }
-<SkipCxxComment>[^\r\n]+ {
- g_code->codify(yytext);
- }
-<SkipCxxComment>\r
-<SkipCxxComment>\n {
- unput('\n');
- endFontClass();
- BEGIN( g_lastCContext ) ;
- }
-<SkipCxxComment>. {
- g_code->codify(yytext);
- }
-<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*({B}*(("//@"[{}])|("/*@"[{}]"*/")){B}*\n)?{B}*"/*"[*!]/[^/*] {
- g_yyLineNr+=QCString(yytext).contains('\n');
- }
-<RemoveSpecialCComment>"*/"{B}*\n({B}*\n)*({B}*(("//@"[{}])|("/*@"[{}]"*/")){B}*\n)? {
- g_yyLineNr+=QCString(yytext).contains('\n');
- endCodeLine();
- if (g_yyLineNr<g_inputLines)
- {
- startCodeLine();
- }
- if (g_lastSpecialCContext==SkipCxxComment)
- { // force end of C++ comment here
- endFontClass();
- BEGIN( g_lastCContext ) ;
- }
- else
- {
- BEGIN(g_lastSpecialCContext);
- }
- }
-<RemoveSpecialCComment>"*/" {
- BEGIN(g_lastSpecialCContext);
- }
-<RemoveSpecialCComment>[^*\n]+
-<RemoveSpecialCComment>"//"|"/*"
-<RemoveSpecialCComment>\n { g_yyLineNr++; }
-<RemoveSpecialCComment>.
-<MemberCall>[^a-z_A-Z0-9(\n] {
- g_code->codify(yytext);
- g_type.resize(0);
- g_name.resize(0);
- BEGIN(g_memCallContext);
- }
-<*>\n({B}*"//"[!/][^\n]*\n)+ { // remove special one-line comment
- if (Config_getBool("STRIP_CODE_COMMENTS"))
- {
- g_yyLineNr+=((QCString)yytext).contains('\n');
- endCodeLine();
- if (g_yyLineNr<g_inputLines)
- {
- startCodeLine();
- }
- }
- else
- {
- startFontClass("comment");
- codifyLines(yytext);
- endFontClass();
- }
- if (YY_START==SkipCxxComment)
- {
- endFontClass();
- BEGIN( g_lastCContext ) ;
- }
- }
-<*>\n{B}*"//@"[{}].*\n { // remove one-line group marker
- if (Config_getBool("STRIP_CODE_COMMENTS"))
- {
- g_yyLineNr+=2;
- endCodeLine();
- if (g_yyLineNr<g_inputLines)
- {
- startCodeLine();
- }
- }
- else
- {
- startFontClass("comment");
- codifyLines(yytext);
- endFontClass();
- }
- if (YY_START==SkipCxxComment)
- {
- endFontClass();
- BEGIN( g_lastCContext ) ;
- }
- }
-<*>\n{B}*"/*@"[{}] { // remove one-line group marker
- if (Config_getBool("STRIP_CODE_COMMENTS"))
- {
- g_lastSpecialCContext = YY_START;
- g_yyLineNr++;
- BEGIN(RemoveSpecialCComment);
- }
- else
- {
- // check is to prevent getting stuck in skipping C++ comments
- if (YY_START != SkipCxxComment)
- {
- g_lastCContext = YY_START ;
- }
- startFontClass("comment");
- codifyLines(yytext);
- BEGIN(SkipComment);
- }
- }
-<*>^{B}*"//@"[{}].*\n { // remove one-line group marker
- if (Config_getBool("STRIP_CODE_COMMENTS"))
- {
- g_yyLineNr++;
- endCodeLine();
- if (g_yyLineNr<g_inputLines)
- {
- startCodeLine();
- }
- }
- else
- {
- startFontClass("comment");
- codifyLines(yytext);
- endFontClass();
- }
- }
-<*>^{B}*"/*@"[{}] { // remove multi-line group marker
- if (Config_getBool("STRIP_CODE_COMMENTS"))
- {
- g_lastSpecialCContext = YY_START;
- BEGIN(RemoveSpecialCComment);
- }
- else
- {
- // check is to prevent getting stuck in skipping C++ comments
- if (YY_START != SkipCxxComment)
- {
- g_lastCContext = YY_START ;
- }
- startFontClass("comment");
- g_code->codify(yytext);
- BEGIN(SkipComment);
- }
- }
-<*>^{B}*"//"[!/][^\n]*\n { // remove special one-line comment
- if (Config_getBool("STRIP_CODE_COMMENTS"))
- {
- g_yyLineNr++;
- endCodeLine();
- if (g_yyLineNr<g_inputLines)
- {
- startCodeLine();
- }
- }
- else
- {
- startFontClass("comment");
- codifyLines(yytext);
- endFontClass();
- }
- }
-<*>"//"[!/][^\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(c);
- }
- else
- {
- startFontClass("comment");
- codifyLines(yytext);
- endFontClass();
- }
- }
-<*>\n{B}*"/*"[!*]/[^/*] {
- if (Config_getBool("STRIP_CODE_COMMENTS"))
- {
- g_lastSpecialCContext = YY_START;
- g_yyLineNr++;
- BEGIN(RemoveSpecialCComment);
- }
- else
- {
- // check is to prevent getting stuck in skipping C++ comments
- if (YY_START != SkipCxxComment)
- {
- g_lastCContext = YY_START ;
- }
- startFontClass("comment");
- codifyLines(yytext);
- BEGIN(SkipComment);
- }
- }
-<*>^{B}*"/*"[!*]/[^/*] { // special C comment block at a new line
- if (Config_getBool("STRIP_CODE_COMMENTS"))
- {
- g_lastSpecialCContext = YY_START;
- BEGIN(RemoveSpecialCComment);
- }
- else
- {
- // check is to prevent getting stuck in skipping C++ comments
- if (YY_START != SkipCxxComment)
- {
- g_lastCContext = YY_START ;
- }
- startFontClass("comment");
- g_code->codify(yytext);
- BEGIN(SkipComment);
- }
- }
-<*>"/*"[!*]/[^/*] { // special C comment block half way a line
- if (YY_START==SkipString) REJECT;
- if (Config_getBool("STRIP_CODE_COMMENTS"))
- {
- g_lastSpecialCContext = YY_START;
- BEGIN(RemoveSpecialCComment);
- }
- else
- {
- // check is to prevent getting stuck in skipping C++ comments
- if (YY_START != SkipCxxComment)
- {
- g_lastCContext = YY_START ;
- }
- startFontClass("comment");
- g_code->codify(yytext);
- BEGIN(SkipComment);
- }
- }
-<*>"/*"("!"?)"*/" {
- if (YY_START==SkipString) REJECT;
- if (!Config_getBool("STRIP_CODE_COMMENTS"))
- {
- startFontClass("comment");
- g_code->codify(yytext);
- endFontClass();
- }
- }
-<*>"/*" {
- startFontClass("comment");
- g_code->codify(yytext);
- // check is to prevent getting stuck in skipping C++ comments
- if (YY_START != SkipCxxComment)
- {
- g_lastCContext = YY_START ;
- }
- BEGIN( SkipComment ) ;
- }
-<*>@\" { // C# verbatim string
- startFontClass("stringliteral");
- g_code->codify(yytext);
- g_lastVerbStringContext=YY_START;
- BEGIN(SkipVerbString);
- }
-<*>"//" {
- startFontClass("comment");
- g_code->codify(yytext);
- g_lastCContext = YY_START ;
- BEGIN( SkipCxxComment ) ;
- }
-<*>"(" {
- g_code->codify(yytext);
- g_theCallContext.pushScope();
- }
-<*>")" {
- g_code->codify(yytext);
- g_theCallContext.popScope();
- }
-<*>\n {
- codifyLines(yytext);
- }
-<*>. {
- g_code->codify(yytext);
- }
- /*
-<*>([ \t\n]*"\n"){2,} { // combine multiple blank lines
- //QCString sepLine=yytext;
- //g_code->codify("\n\n");
- //g_yyLineNr+=sepLine.contains('\n');
- //char sepLine[3]="\n\n";
- codifyLines(yytext);
- }
- */
-
-%%
-
-/*@ ----------------------------------------------------------------------------
- */
-
-static void saveObjCContext()
-{
- if (g_currentCtx)
- {
- g_currentCtx->format+=QCString().sprintf("$c%d",g_currentCtxId);
- if (g_braceCount==0 && YY_START==ObjCCall)
- {
- g_currentCtx->objectTypeOrName=g_currentCtx->format.mid(1);
- //printf("new type=%s\n",g_currentCtx->objectTypeOrName.data());
- }
- g_contextStack.push(g_currentCtx);
- }
- else
- {
- //printf("Trying to save NULL context!\n");
- }
- ObjCCallCtx *newCtx = new ObjCCallCtx;
- newCtx->id = g_currentCtxId;
- newCtx->lexState = YY_START;
- newCtx->braceCount = g_braceCount;
- newCtx->objectType = 0;
- newCtx->objectVar = 0;
- newCtx->method = 0;
- //printf("save state=%d\n",YY_START);
- g_contextDict.insert(g_currentCtxId,newCtx);
- g_currentCtx = newCtx;
- g_braceCount = 0;
- g_currentCtxId++;
-}
-
-static void restoreObjCContext()
-{
- //printf("restore state=%d->%d\n",YY_START,g_currentCtx->lexState);
- BEGIN(g_currentCtx->lexState);
- g_braceCount = g_currentCtx->braceCount;
- if (!g_contextStack.isEmpty())
- {
- g_currentCtx = g_contextStack.pop();
- }
- else
- {
- g_currentCtx = 0;
- //printf("Trying to pop context while g_contextStack is empty!\n");
- }
-}
-
-void resetCCodeParserState()
-{
- //printf("***initParseCodeContext()\n");
- g_theVarContext.clear();
- g_codeClassSDict.setAutoDelete(TRUE);
- g_codeClassSDict.clear();
- g_curClassBases.clear();
- g_anchorCount = 0;
-}
-
-void parseCCode(CodeOutputInterface &od,const char *className,const QCString &s,
- bool exBlock, const char *exName,FileDef *fd,
- int startLine,int endLine,bool inlineFragment,
- MemberDef *memberDef)
-{
- //printf("***parseCode()\n");
- if (s.isEmpty()) return;
- g_code = &od;
- g_inputString = s;
- g_inputPosition = 0;
- g_currentFontClass = 0;
- g_needsTermination = FALSE;
- if (endLine!=-1)
- g_inputLines = endLine+1;
- else
- g_inputLines = countLines();
-
- if (startLine!=-1)
- g_yyLineNr = startLine;
- else
- g_yyLineNr = 1;
-
- g_curlyCount = 0;
- g_bodyCurlyCount = 0;
- g_bracketCount = 0;
- g_sharpCount = 0;
- g_insideTemplate = FALSE;
- g_theCallContext.clear();
- g_scopeStack.clear();
- g_classScope = className;
- g_exampleBlock = exBlock;
- g_exampleName = exName;
- g_sourceFileDef = fd;
- if (fd)
- {
- setCurrentDoc(fd->name(),fd->getSourceFileBase());
- g_insideObjC = fd->name().lower().right(2)==".m" ||
- fd->name().lower().right(3)==".mm";
- }
- g_currentDefinition = 0;
- g_currentMemberDef = 0;
- g_searchingForBody = FALSE;
- g_insideBody = FALSE;
- g_bracketCount = 0;
- if (!g_exampleName.isEmpty())
- {
- g_exampleFile = convertNameToFile(g_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 (memberDef) setParameterList(memberDef);
- codeYYrestart( codeYYin );
- BEGIN( Body );
- codeYYlex();
- if (g_needsTermination)
- {
- endFontClass();
- g_code->endCodeLine();
- }
- return;
-}
-
-#if !defined(YY_FLEX_SUBMINOR_VERSION)
-extern "C" { // some bogus code to keep the compiler happy
- void codeYYdummy() { yy_flex_realloc(0,0); }
-}
-#else
-#error "You seem to be using a version of flex newer than 2.5.4. These are currently incompatible with 2.5.4, and do NOT work with doxygen! Please use version 2.5.4 or expect things to be parsed wrongly! A bug report has been submitted (#732132)."
-#endif
-
diff --git a/src/commentcnv.h b/src/commentcnv.h
deleted file mode 100644
index 86d1f52..0000000
--- a/src/commentcnv.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/*****************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 _COMMENTCNV_H
-#define _COMMNETCNV_H
-
-class BufStr;
-
-extern void convertCppComments(BufStr *inBuf,BufStr *outBuf,
- const char *fileName);
-
-#endif
-
diff --git a/src/commentcnv.l b/src/commentcnv.l
deleted file mode 100644
index a3d62a4..0000000
--- a/src/commentcnv.l
+++ /dev/null
@@ -1,567 +0,0 @@
-/*****************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-
-%{
-
-#define YY_NEVER_INTERACTIVE 1
-
-#include <stdio.h>
-#include <stdlib.h>
-
-#include <qstack.h>
-#include <qregexp.h>
-#include <qtextstream.h>
-
-#include "bufstr.h"
-#include "debug.h"
-#include "message.h"
-#include "config.h"
-#include "doxygen.h"
-
-
-#define ADDCHAR(c) g_outBuf->addChar(c)
-#define ADDARRAY(a,s) g_outBuf->addArray(a,s)
-
-struct CondCtx
-{
- CondCtx(int line,QCString id,bool b)
- : lineNr(line),sectionId(id), skip(b) {}
- int lineNr;
- QCString sectionId;
- bool skip;
-};
-
-static BufStr * g_inBuf;
-static BufStr * g_outBuf;
-static int g_inBufPos;
-static int g_col;
-static int g_blockHeadCol;
-static bool g_mlBrief;
-static int g_readLineCtx;
-static bool g_skip;
-static QCString g_fileName;
-static int g_lineNr;
-static int g_condCtx;
-static QStack<CondCtx> g_condStack;
-static QCString g_blockName;
-static int g_lastCommentContext;
-
-static void replaceCommentMarker(const char *s,int len)
-{
- const char *p=s;
- char c;
- // copy blanks
- while ((c=*p) && (c==' ' || c=='\t' || c=='\n'))
- {
- ADDCHAR(c);
- g_lineNr += c=='\n';
- p++;
- }
- // replace start of comment marker by spaces
- while ((c=*p) && (c=='/' || c=='!' || c=='#'))
- {
- ADDCHAR(' ');
- p++;
- if (*p=='<') // comment-after-item marker
- {
- ADDCHAR(' ');
- p++;
- }
- if (c=='!') // end after first !
- {
- break;
- }
- }
- // copy comment line to output
- ADDARRAY(p,len-(p-s));
-}
-
-static inline int computeIndent(const char *s)
-{
- int col=0;
- static int tabSize=Config_getInt("TAB_SIZE");
- const char *p=s;
- char c;
- while ((c=*p++))
- {
- if (c==' ') col++;
- else if (c=='\t') col+=tabSize-(col%tabSize);
- else break;
- }
- return col;
-}
-
-static inline void copyToOutput(const char *s,int len)
-{
- int i;
- if (g_skip) // only add newlines.
- {
- for (i=0;i<len;i++)
- {
- if (s[i]=='\n')
- {
- ADDCHAR('\n');
- g_lineNr++;
- }
- }
- }
- else
- {
- ADDARRAY(s,len);
- static int tabSize=Config_getInt("TAB_SIZE");
- for (i=0;i<len;i++)
- {
- switch (s[i])
- {
- case '\n': g_col=0; g_lineNr++; break;
- case '\t': g_col+=tabSize-(g_col%tabSize); break;
- default: g_col++; break;
- }
- }
- }
-}
-
-static void startCondSection(const char *sectId)
-{
- g_condStack.push(new CondCtx(g_lineNr,sectId,g_skip));
- if (Config_getList("ENABLED_SECTIONS").find(sectId)!=-1)
- {
- //printf("*** Section is enabled!\n");
- }
- else
- {
- //printf("*** Section is disabled!\n");
- g_skip=TRUE;
- }
-}
-
-static void endCondSection()
-{
- if (g_condStack.isEmpty())
- {
- warn(g_fileName,g_lineNr,"Found \\endcond command without matching \\cond");
- g_skip=FALSE;
- }
- else
- {
- CondCtx *ctx = g_condStack.pop();
- g_skip=ctx->skip;
- }
-}
-
-/** remove and executes \\cond and \\endcond commands in \a s */
-static QCString handleCondCmdInAliases(const QCString &s)
-{
- QCString result;
- //printf("handleCondCmdInAliases(%s)\n",s.data());
- static QRegExp cmdPat("[\\\\@][a-z_A-Z][a-z_A-Z0-9]*");
- int p=0,i,l;
- while ((i=cmdPat.match(s,p,&l))!=-1)
- {
- result+=s.mid(p,i-p);
- QCString cmd = s.mid(i+1,l-1);
- //printf("Found command %s\n",cmd.data());
- if (cmd=="cond")
- {
- int sp=i+l,ep;
- const char *arg=s.data()+sp;
- char c;
- // skip spaces
- while ((c=*arg) && (c==' ' || c=='\t')) arg++,sp++;
- // read argument
- if (*arg=='\n') // no arg
- {
- startCondSection(" ");
- ep=sp;
- }
- else // get argument
- {
- ep=sp;
- while ((c=*arg) && isId(c)) arg++,ep++;
- if (ep>sp)
- {
- QCString id = s.mid(sp,ep-sp);
- //printf("Found conditional section id %s\n",id.data());
- startCondSection(id);
- }
- else // invalid identifier
- {
- }
- }
- p=ep;
- }
- else if (cmd=="endcond")
- {
- endCondSection();
- p=i+l;
- }
- else
- {
- result+=s.mid(i,l);
- p=i+l;
- }
- }
- result+=s.right(s.length()-p);
- return result;
-}
-
-/** copies string \a s with length \a len to the output, while
- * replacing any alias commands found in the string.
- */
-static void replaceAliases(const char *s,int len)
-{
- static QRegExp cmd("[@\\\\][a-z_A-Z][a-z_A-Z0-9]*");
- QCString in=s;
- int p=0,i,l;
- while ((i=cmd.match(in,p,&l))!=-1)
- {
- copyToOutput(s+p,i-p);
- QCString *pValue=Doxygen::aliasDict[in.mid(i+1,l-1)];
- if (pValue)
- {
- QCString val = handleCondCmdInAliases(*pValue);
- copyToOutput(val.data(),val.length());
- }
- else
- {
- copyToOutput(s+i,l);
- }
- p=i+l;
- }
- copyToOutput(s+p,len-p);
-}
-
-
-#undef YY_INPUT
-#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
-
-static int yyread(char *buf,int max_size)
-{
- int bytesInBuf = g_inBuf->curPos()-g_inBufPos;
- int bytesToCopy = QMIN(max_size,bytesInBuf);
- memcpy(buf,g_inBuf->data()+g_inBufPos,bytesToCopy);
- g_inBufPos+=bytesToCopy;
- return bytesToCopy;
-}
-
-void replaceComment(int offset);
-
-%}
-
-CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'"))
-
-%option noyywrap
-
-%x Scan
-%x SkipString
-%x SComment
-%x CComment
-%x Verbatim
-%x ReadLine
-%x CondLine
-
-%%
-
-<Scan>[^"'\/\n\\]* { /* eat anything that is not " / or \n */
- copyToOutput(yytext,yyleng);
- }
-<Scan>"\"" { /* start of a string */
- copyToOutput(yytext,yyleng);
- BEGIN(SkipString);
- }
-<Scan>{CHARLIT} {
- copyToOutput(yytext,yyleng);
- }
-<Scan>\n { /* new line */
- copyToOutput(yytext,yyleng);
- }
-<Scan>("//!"|"///").*/\n[ \t]*"//"[\/!][^\/] { /* start C++ style special comment block */
- if (g_mlBrief) REJECT; // bail out if we do not need to convert
- int i=3;
- if (yytext[2]=='/')
- {
- while (i<yyleng && yytext[i]=='/') i++;
- }
- g_blockHeadCol=g_col;
- copyToOutput("/**",3);
- //copyToOutput(yytext+i,yyleng-i);
- replaceAliases(yytext+i,yyleng-i);
- BEGIN(SComment);
- }
-<Scan>"//##Documentation".*/\n { /* Start of Rational Rose ANSI C++ comment block */
- if (g_mlBrief) REJECT;
- int i=17; //=strlen("//##Documentation");
- g_blockHeadCol=g_col;
- copyToOutput("/**",3);
- //copyToOutput(yytext+i,yyleng-i);
- replaceAliases(yytext+i,yyleng-i);
- BEGIN(SComment);
- }
-<Scan>"//"/.*\n { /* one line C++ comment */
- copyToOutput(yytext,yyleng);
- g_readLineCtx=YY_START;
- BEGIN(ReadLine);
- }
-<Scan>"/*" { /* start of a C comment */
- copyToOutput(yytext,yyleng);
- BEGIN(CComment);
- }
-<CComment>[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"rtfonly"|"manonly"|"dot"|"code"|"f$"|"f["|"f{")/[^a-z_A-Z0-9] { /* start of a verbatim block */
- copyToOutput(yytext,yyleng);
- if (yytext[2]=='[')
- {
- g_blockName="f]";
- }
- else if (yytext[2]=='{')
- {
- g_blockName="f}";
- }
- else
- {
- g_blockName=&yytext[1];
- }
- g_lastCommentContext = YY_START;
- BEGIN(Verbatim);
- }
-<Scan>. { /* any other character */
- copyToOutput(yytext,yyleng);
- }
-<Verbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode"|"f$"|"f]"|"f}") { /* end of verbatim block */
- copyToOutput(yytext,yyleng);
- if (yytext[1]=='f') // end of formula
- {
- BEGIN(g_lastCommentContext);
- }
- else if (&yytext[4]==g_blockName)
- {
- BEGIN(g_lastCommentContext);
- }
- }
-<Verbatim>[^@\\\n]* { /* any character not a backslash or new line */
- copyToOutput(yytext,yyleng);
- }
-<Verbatim>\n { /* new line in verbatim block */
- copyToOutput(yytext,yyleng);
- }
-<Verbatim>. { /* any other character */
- copyToOutput(yytext,yyleng);
- }
-<SkipString>\\. { /* escaped character in string */
- copyToOutput(yytext,yyleng);
- }
-<SkipString>"\"" { /* end of string */
- copyToOutput(yytext,yyleng);
- BEGIN(Scan);
- }
-<SkipString>. { /* any other string character */
- copyToOutput(yytext,yyleng);
- }
-<SkipString>\n { /* new line inside string (illegal for some compilers) */
- copyToOutput(yytext,yyleng);
- }
-<CComment>[^\\@*\n]* { /* anything that is not a '*' or command */
- copyToOutput(yytext,yyleng);
- }
-<CComment>"*"+[^*/\\@\n]* { /* stars without slashes */
- copyToOutput(yytext,yyleng);
- }
-<CComment>\n { /* new line in comment */
- copyToOutput(yytext,yyleng);
- }
-<CComment>"*"+"/" { /* end of C comment */
- copyToOutput(yytext,yyleng);
- BEGIN(Scan);
- }
-<CComment>. {
- copyToOutput(yytext,yyleng);
- }
-<SComment>^[ \t]*"///"[\/]*/\n {
- replaceComment(0);
- }
-<SComment>\n[ \t]*"///"[\/]*/\n {
- replaceComment(1);
- }
-<SComment>^[ \t]*"///"[^\/\n]/.*\n {
- replaceComment(0);
- g_readLineCtx=YY_START;
- BEGIN(ReadLine);
- }
-<SComment>\n[ \t]*"///"[^\/\n]/.*\n {
- replaceComment(1);
- g_readLineCtx=YY_START;
- BEGIN(ReadLine);
- }
-<SComment>^[ \t]*"//!" | // just //!
-<SComment>^[ \t]*"//!<"/.*\n | // or //!< something
-<SComment>^[ \t]*"//!"[^<]/.*\n { // or //!something
- replaceComment(0);
- g_readLineCtx=YY_START;
- BEGIN(ReadLine);
- }
-<SComment>\n[ \t]*"//!" |
-<SComment>\n[ \t]*"//!<"/.*\n |
-<SComment>\n[ \t]*"//!"[^<\n]/.*\n {
- replaceComment(1);
- g_readLineCtx=YY_START;
- BEGIN(ReadLine);
- }
-<SComment>^[ \t]*"//##"/.*\n {
- replaceComment(0);
- g_readLineCtx=YY_START;
- BEGIN(ReadLine);
- }
-<SComment>\n[ \t]*"//##"/.*\n {
- replaceComment(1);
- g_readLineCtx=YY_START;
- BEGIN(ReadLine);
- }
-<SComment>\n { /* end of special comment */
- copyToOutput(" */",3);
- copyToOutput(yytext,yyleng);
- BEGIN(Scan);
- }
-<ReadLine>[^\\@\n]*/\n {
- copyToOutput(yytext,yyleng);
- BEGIN(g_readLineCtx);
- }
-<CComment,ReadLine>[\\@][\\@][~a-z_A-Z][a-z_A-Z0-9]*[ \t]* { // escaped command
- copyToOutput(yytext,yyleng);
- }
-<CComment,ReadLine>[\\@]"cond"[ \t]+ { // conditional section
- g_condCtx = YY_START;
- BEGIN(CondLine);
- }
-<CComment,ReadLine>[\\@]"endcond"/[^a-z_A-Z0-9] { // end of conditional section
- bool oldSkip=g_skip;
- endCondSection();
- if (YY_START==CComment && oldSkip && !g_skip)
- {
- //printf("** Adding start of comment!\n");
- ADDCHAR('/');
- ADDCHAR('*');
- }
- }
-<CondLine>[a-z_A-Z][a-z_A-Z0-9.\-]* {
- bool oldSkip=g_skip;
- startCondSection(yytext);
- if (g_condCtx==CComment && !oldSkip && g_skip)
- {
- //printf("** Adding terminator for comment!\n");
- ADDCHAR('*');
- ADDCHAR('/');
- }
- BEGIN(g_condCtx);
- }
-<CondLine>[ \t]*
-<CComment,ReadLine>[\\@]"cond"[ \t]*\n |
-<CondLine>. { // forgot section id?
- bool oldSkip=g_skip;
- startCondSection(" "); // fake section id causing the section to be hidden unconditionally
- if (g_condCtx==CComment && !oldSkip && g_skip)
- {
- //printf("** Adding terminator for comment!\n");
- ADDCHAR('*');
- ADDCHAR('/');
- }
- if (*yytext=='\n') g_lineNr++;
- BEGIN(g_condCtx);
- }
-<CComment,ReadLine>[\\@][a-z_A-Z][a-z_A-Z0-9]* { // expand alias
- QCString *pValue=Doxygen::aliasDict[yytext+1];
- if (pValue)
- {
- QCString val = handleCondCmdInAliases(*pValue);
- copyToOutput(val.data(),val.length());
- }
- else
- {
- copyToOutput(yytext,yyleng);
- }
- }
-<ReadLine>. {
- copyToOutput(yytext,yyleng);
- }
-
-%%
-
-void replaceComment(int offset)
-{
- if (g_mlBrief)
- {
- copyToOutput(yytext,yyleng);
- }
- else
- {
- //printf("replaceComment(%s)\n",yytext);
- int i=computeIndent(&yytext[offset]);
- if (i==g_blockHeadCol)
- {
- replaceCommentMarker(yytext,yyleng);
- }
- else
- {
- copyToOutput(" */",3);
- int i;for (i=yyleng-1;i>=0;i--) unput(yytext[i]);
- BEGIN(Scan);
- }
- }
-}
-
-/*! 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).
- * -# It replaces aliases with their definition (see ALIASES)
- * -# It handles conditional sections (\cond...\endcond blocks)
- */
-void convertCppComments(BufStr *inBuf,BufStr *outBuf,const char *fileName)
-{
- //printf("convertCppComments(%s)\n",fileName);
- g_inBuf = inBuf;
- g_outBuf = outBuf;
- g_inBufPos = 0;
- g_col = 0;
- g_mlBrief = Config_getBool("MULTILINE_CPP_IS_BRIEF");
- g_skip = FALSE;
- g_fileName = fileName;
- g_lineNr = 0;
- g_condStack.clear();
- g_condStack.setAutoDelete(TRUE);
- BEGIN(Scan);
- yylex();
- while (!g_condStack.isEmpty())
- {
- CondCtx *ctx = g_condStack.pop();
- QCString sectionInfo = " ";
- if (ctx->sectionId!=" ") sectionInfo.sprintf(" with label %s ",ctx->sectionId.data());
- warn(g_fileName,ctx->lineNr,"Conditional section%sdoes not have "
- "a corresponding \\endcond command within this file.",sectionInfo.data());
- }
- if (Debug::isFlagSet(Debug::CommentCnv))
- {
- g_outBuf->at(g_outBuf->curPos())='\0';
- msg("-------------\n%s\n-------------\n",g_outBuf->data());
- }
-}
-
-
-//----------------------------------------------------------------------------
-#if !defined(YY_FLEX_SUBMINOR_VERSION)
-extern "C" { // some bogus code to keep the compiler happy
- void commentcnvYYdummy() { yy_flex_realloc(0,0); }
-}
-#endif
-
diff --git a/src/commentscan.h b/src/commentscan.h
deleted file mode 100644
index 74efa63..0000000
--- a/src/commentscan.h
+++ /dev/null
@@ -1,80 +0,0 @@
-/******************************************************************************
- *
- * Copyright (C) 1997-2005 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 COMMENTSCAN_H
-#define COMMENTSCAN_H
-
-#include "qtbc.h"
-#include "entry.h"
-
-class ParserInterface;
-
-/** @file
- * @brief Interface for the comment block parser */
-
-/** Invokes the comment block parser with the request to parse a
- * single comment block.
- * @param[in] parser The language parse that invoked this function.
- * The comment block parse may invoke
- * ParserInterface::parsePrototype() in order to parse
- * the argument of a @@fn command.
- * @param[in] curEntry The Entry to which the comment block belongs.
- * Any information (like documentation) that is found in
- * the comment block will be stored in this entry.
- * @param[in] comment A string representing the actual comment block.
- * Note that leading *'s are already 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.
- * @param[in] isBrief TRUE iff this comment block represents a brief description.
- * @param[in] isJavaDocStyle TRUE iff this comment block is in "JavaDoc" style.
- * This means that it starts as a brief description until the end of
- * the sentences is found and then proceeds as a detailed description.
- * @param[in,out] prot The protection level in which this comment block was
- * found. Commands in the comment block may override this.
- * @param[in,out] position The character position within \a comment where the
- * comment block starts. Typically used in case the comment block
- * contains multiple structural commands.
- * @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.
- * @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
- * where to proceed parsing. FALSE indicates no further processing is
- * needed.
- */
-bool parseCommentBlock(ParserInterface *parser,
- Entry *curEntry,
- const QCString &comment,
- const QCString &fileName,
- int lineNr,
- bool isBrief,
- bool isJavaDocStyle,
- Protection &prot,
- int &position,
- bool &newEntryNeeded
- );
-
-void groupEnterFile(const char *file,int line);
-void groupLeaveFile(const char *file,int line);
-void groupLeaveCompound(const char *file,int line,const char *name);
-void groupEnterCompound(const char *file,int line,const char *name);
-void openGroup(Entry *e,const char *file,int line);
-void closeGroup(Entry *,const char *file,int line);
-void initGroupInfo(Entry *e);
-
-
-#endif
diff --git a/src/commentscan.l b/src/commentscan.l
deleted file mode 100644
index 13489f5..0000000
--- a/src/commentscan.l
+++ /dev/null
@@ -1,2412 +0,0 @@
-/*****************************************************************************
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-
-%{
-
-/*
- * includes
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <assert.h>
-#include <ctype.h>
-
-#include "qtbc.h"
-#include <qarray.h>
-#include <qstack.h>
-#include <qregexp.h>
-#include <unistd.h>
-#include <qfile.h>
-
-#include "scanner.h"
-#include "entry.h"
-#include "doxygen.h"
-#include "message.h"
-#include "config.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"
-
-// forward declarations
-static bool handleBrief(const QCString &);
-static bool handleFn(const QCString &);
-static bool handleDef(const QCString &);
-static bool handleOverload(const QCString &);
-static bool handleEnum(const QCString &);
-static bool handleDefGroup(const QCString &);
-static bool handleAddToGroup(const QCString &);
-static bool handleWeakGroup(const QCString &);
-static bool handleNamespace(const QCString &);
-static bool handlePackage(const QCString &);
-static bool handleClass(const QCString &);
-static bool handleProtocol(const QCString &);
-static bool handleCategory(const QCString &);
-static bool handleUnion(const QCString &);
-static bool handleStruct(const QCString &);
-static bool handleInterface(const QCString &);
-static bool handleIdlException(const QCString &);
-static bool handlePage(const QCString &);
-static bool handleMainpage(const QCString &);
-static bool handleFile(const QCString &);
-static bool handleDir(const QCString &);
-static bool handleExample(const QCString &);
-static bool handleDetails(const QCString &);
-static bool handleName(const QCString &);
-static bool handleTodo(const QCString &);
-static bool handleTest(const QCString &);
-static bool handleBug(const QCString &);
-static bool handleSubpage(const QCString &s);
-static bool handleDeprecated(const QCString &);
-static bool handleXRefItem(const QCString &);
-static bool handleRelated(const QCString &);
-static bool handleRelatedAlso(const QCString &);
-static bool handleRefItem(const QCString &);
-static bool handleSection(const QCString &);
-static bool handleAnchor(const QCString &);
-static bool handleFormatBlock(const QCString &);
-static bool handleAddIndex(const QCString &);
-static bool handleIf(const QCString &);
-static bool handleIfNot(const QCString &);
-static bool handleElseIf(const QCString &);
-static bool handleElse(const QCString &);
-static bool handleEndIf(const QCString &);
-static bool handleIngroup(const QCString &);
-static bool handleNoSubGrouping(const QCString &);
-static bool handleShowInitializer(const QCString &);
-static bool handleHideInitializer(const QCString &);
-static bool handleCallgraph(const QCString &);
-static bool handleInternal(const QCString &);
-static bool handleLineBr(const QCString &);
-static bool handleStatic(const QCString &);
-static bool handlePure(const QCString &);
-static bool handlePrivate(const QCString &);
-static bool handlePrivateSection(const QCString &);
-static bool handleProtected(const QCString &);
-static bool handleProtectedSection(const QCString &);
-static bool handlePublic(const QCString &s);
-static bool handlePublicSection(const QCString &s);
-static bool handleInherit(const QCString &);
-
-typedef bool (*DocCmdFunc)(const QCString &name);
-
-struct DocCmdMap
-{
- const char *cmdName;
- DocCmdFunc handler;
-};
-
-// map of command to handler function
-static DocCmdMap docCmdMap[] =
-{
- { "brief", &handleBrief },
- { "short", &handleBrief },
- { "fn", &handleFn },
- { "var", &handleFn },
- { "typedef", &handleFn },
- { "property", &handleFn },
- { "def", &handleDef },
- { "overload", &handleOverload },
- { "enum", &handleEnum },
- { "defgroup", &handleDefGroup },
- { "addtogroup", &handleAddToGroup },
- { "weakgroup", &handleWeakGroup },
- { "namespace", &handleNamespace },
- { "package", &handlePackage },
- { "class", &handleClass },
- { "protocol", &handleProtocol },
- { "category", &handleCategory },
- { "union", &handleUnion },
- { "struct", &handleStruct },
- { "interface", &handleInterface },
- { "idlexcept", &handleIdlException },
- { "page", &handlePage },
- { "mainpage", &handleMainpage },
- { "file", &handleFile },
- { "dir", &handleDir },
- { "example", &handleExample },
- { "details", &handleDetails },
- { "name", &handleName },
- { "todo", &handleTodo },
- { "test", &handleTest },
- { "bug", &handleBug },
- { "deprecated", &handleDeprecated },
- { "xrefitem", &handleXRefItem },
- { "related", &handleRelated },
- { "relates", &handleRelated },
- { "relatedalso", &handleRelatedAlso },
- { "relatesalso", &handleRelatedAlso },
- { "refitem", &handleRefItem },
- { "subpage", &handleSubpage },
- { "section", &handleSection },
- { "subsection", &handleSection },
- { "subsubsection", &handleSection },
- { "paragraph", &handleSection },
- { "anchor", &handleAnchor },
- { "verbatim", &handleFormatBlock },
- { "latexonly", &handleFormatBlock },
- { "htmlonly", &handleFormatBlock },
- { "xmlonly", &handleFormatBlock },
- { "rtfonly", &handleFormatBlock },
- { "manonly", &handleFormatBlock },
- { "dot", &handleFormatBlock },
- { "code", &handleFormatBlock },
- { "addindex", &handleAddIndex },
- { "if", &handleIf },
- { "ifnot", &handleIfNot },
- { "elseif", &handleElseIf },
- { "else", &handleElse },
- { "endif", &handleEndIf },
- { "ingroup", &handleIngroup },
- { "nosubgrouping", &handleNoSubGrouping },
- { "showinitializer", &handleShowInitializer },
- { "hideinitializer", &handleHideInitializer },
- { "callgraph", &handleCallgraph },
- { "internal", &handleInternal },
- { "_linebr", &handleLineBr },
- { "static", &handleStatic },
- { "pure", &handlePure },
- { "private", &handlePrivate},
- { "privatesection", &handlePrivateSection },
- { "protected", &handleProtected },
- { "protectedsection",&handleProtectedSection },
- { "public", &handlePublic },
- { "publicsection", &handlePublicSection },
- { "inherit", &handleInherit },
- { 0, 0 }
-};
-
-
-
-/** @brief Command mapper.
- *
- * Maps a command name (as found in a comment block) onto a
- * specific handler function.
- */
-class DocCmdMapper
-{
- public:
- /** maps a command name to a handler function */
- static DocCmdFunc *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(89)
- {
- DocCmdMap *p = docCmdMap;
- while (p->cmdName)
- {
- m_map.insert(p->cmdName,&p->handler);
- p++;
- }
- }
-
- DocCmdFunc *find(const char *name)
- {
- return m_map.find(name);
- }
- QDict<DocCmdFunc> m_map;
- static DocCmdMapper *s_instance;
-};
-
-DocCmdMapper *DocCmdMapper::s_instance=0;
-
-
-#define YY_NEVER_INTERACTIVE 1
-
-enum XRefKind
-{
- XRef_Item,
- XRef_Todo,
- XRef_Test,
- XRef_Bug,
- XRef_Deprecated,
- XRef_None
-};
-
-enum OutputContext
-{
- OutputDoc,
- OutputBrief,
- OutputXRef
-};
-
-enum GuardType
-{
- Guard_If,
- Guard_IfNot,
- Guard_Skip
-};
-
-class GuardedSection
-{
- public:
- 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;
-};
-
-void openGroup(Entry *e,const char *file,int line);
-void closeGroup(Entry *e,const char *file,int line);
-static void groupAddDocs(Entry *e,const char *fileName);
-
-/* -----------------------------------------------------------------
- *
- * statics
- */
-
-static ParserInterface *langParser; // the language parser that is calling us
-static const char * inputString; // input string
-static int inputPosition; // read pointer
-static QCString yyFileName; // file name that is read from
-static int yyLineNr; // line number in the input
-//static bool inBody; // was the comment found inside the body of a function?
-static OutputContext inContext; // are we inside the brief, details or xref part
-static bool briefEndsAtDot; // does the brief description stop at a dot?
-static QCString formulaText; // Running text of a formula
-static QCString formulaEnv; // environment name
-static QCString *pOutputString; // pointer to string to which the output is appended.
-static QCString outputXRef; // temp argument of todo/test/../xrefitem commands
-static QCString blockName; // preformatted block name (e.g. verbatim, latexonly,...)
-static XRefKind xrefKind; // kind of cross-reference command
-static XRefKind newXRefKind; //
-static GuardType guardType; // kind of guard for conditional section
-static bool enabledSectionFound;
-static QCString functionProto; // function prototype
-static QStack<GuardedSection> guards; // tracks nested conditional sections (if,ifnot,..)
-static Entry* current = 0 ; // working entry
-//static Entry* current_root = 0 ; // parent of working entry
-
-
-//static Entry* previous = 0 ; // TODO: remove need for this
-static bool needNewEntry;
-
-static QCString sectionLabel;
-static QCString sectionTitle;
-static QCString xrefItemKey;
-static QCString newXRefItemKey;
-static QCString xrefItemTitle;
-static QCString xrefListTitle;
-static Protection protection;
-
-static bool xrefAppendFlag;
-static bool inGroupParamFound;
-static int braceCount;
-static bool insidePre;
-static bool parseMore;
-
-static int g_commentCount;
-
-//-----------------------------------------------------------------------------
-
-static QStack<Grouping> g_autoGroupStack;
-static int g_memberGroupId = DOX_NOGROUP;
-static QCString g_memberGroupHeader;
-static QCString g_memberGroupDocs;
-static QCString g_memberGroupRelates;
-
-//-----------------------------------------------------------------------------
-
-static void initParser()
-{
- sectionLabel.resize(0);
- sectionTitle.resize(0);
- g_memberGroupHeader.resize(0);
-}
-
-//-----------------------------------------------------------------------------
-
-static QCString getDocSectionName(int s)
-{
- switch(s)
- {
- case Entry::CLASSDOC_SEC: return "\\class";
- case Entry::STRUCTDOC_SEC: return "\\struct";
- case Entry::UNIONDOC_SEC: return "\\union";
- case Entry::EXCEPTIONDOC_SEC: return "\\exception";
- case Entry::NAMESPACEDOC_SEC: return "\\namespace";
- case Entry::PROTOCOLDOC_SEC: return "\\protocol";
- case Entry::CATEGORYDOC_SEC: return "\\category";
- case Entry::ENUMDOC_SEC: return "\\enum";
- case Entry::PAGEDOC_SEC: return "\\page";
- case Entry::MEMBERDOC_SEC: return "\\fn";
- case Entry::OVERLOADDOC_SEC: return "\\overload";
- case Entry::FILEDOC_SEC: return "\\file";
- case Entry::DEFINEDOC_SEC: return "\\def";
- case Entry::GROUPDOC_SEC: return "\\defgroup";
- case Entry::MAINPAGEDOC_SEC: return "\\mainpage";
- case Entry::PACKAGEDOC_SEC: return "\\package";
- case Entry::DIRDOC_SEC: return "\\dir";
- case Entry::EXAMPLE_SEC: return "\\example";
- case Entry::MEMBERGRP_SEC: return "\\name";
- default: return "";
- }
-}
-
-//-----------------------------------------------------------------------------
-
-static bool makeStructuralIndicator(Entry::Sections s)
-{
- if (!getDocSectionName(current->section).isEmpty())
- {
- //warn(yyFileName,yyLineNr,
- // "Warning: found a structural command %s for a section already "
- // "marked with structural command %s. Ignoring the latter command.",
- // getDocSectionName(s).data(),
- // getDocSectionName(current->section).data()
- // );
- return TRUE;
- }
- else
- {
- needNewEntry = TRUE;
- current->section = s;
- current->fileName = yyFileName;
- current->startLine = yyLineNr;
- return FALSE;
- }
-}
-
-static void lineCount()
-{
- for( const char* c = yytext ; *c ; ++c )
- yyLineNr += (*c == '\n') ;
-}
-
-
-static QCString stripQuotes(const char *s)
-{
- QCString name;
- if (s==0 || *s==0) return name;
- name=s;
- if (name.at(0)=='"' && name.at(name.length()-1)=='"')
- {
- name=name.mid(1,name.length()-2);
- }
- return name;
-}
-
-//-----------------------------------------------------------------
-
-static void addXRefItem(const char *listName,const char *itemTitle,
- const char *listTitle,bool append)
-{
- Entry *docEntry = current; // inBody && previous ? previous : current;
- if (listName==0) return;
- //printf("addXRefItem(%s,%s,%s,%d)\n",listName,itemTitle,listTitle,append);
-
- ListItemInfo *lii=0;
- RefList *refList = Doxygen::xrefLists->find(listName);
- if (refList==0) // new list
- {
- refList = new RefList(listName,listTitle,itemTitle);
- Doxygen::xrefLists->insert(listName,refList);
- //printf("new list!\n");
- }
- if (docEntry->sli)
- {
- QListIterator<ListItemInfo> slii(*docEntry->sli);
- for (slii.toFirst();(lii=slii.current());++slii)
- {
- if (strcmp(lii->type,listName)==0)
- {
- //printf("found %s lii->type=%s\n",listName,lii->type);
- break;
- }
- }
- }
- if (lii && 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 += outputXRef;
- //printf("%s: text +=%s\n",listName,item->text.data());
- }
- else // new item
- {
- int itemId = refList->addRefItem();
- //printf("listName=%s item id = %d new current=%p\n",listName,itemId,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);
- RefItem *item = refList->getRefItem(itemId);
- ASSERT(item!=0);
- item->text = outputXRef;
- item->listAnchor = anchorLabel;
- docEntry->addSpecialListItem(listName,itemId);
- QCString cmdString;
- cmdString.sprintf("\\xrefitem %s %d\n",listName,itemId);
- docEntry->doc += cmdString;
- SectionInfo *si=new SectionInfo(listName,anchorLabel,
- sectionTitle,SectionInfo::Anchor);
- Doxygen::sectionDict.insert(anchorLabel,si);
- docEntry->anchors->append(si);
- }
- outputXRef.resize(0);
-}
-
-//-----------------------------------------------------------------------------
-
-// Adds a formula text to the list/dictionary of formulas if it was
-// not already added. Returns the label of the formula.
-static QCString addFormula()
-{
- QCString formLabel;
- QCString fText=formulaText.simplifyWhiteSpace();
- Formula *f=0;
- if ((f=Doxygen::formulaDict[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());
- }
- return formLabel;
-}
-
-//-----------------------------------------------------------------------------
-
-static void checkFormula();
-//-----------------------------------------------------------------------------
-
-static void prependScope()
-{
-#if 0
- Entry *current_root = current->parent;
- if (current_root && current_root->section & Entry::SCOPE_MASK)
- {
- current->name.prepend(current_root->name+"::");
- if (current_root->tArgLists)
- {
- if (current->tArgLists==0)
- {
- current->tArgLists = new QList<ArgumentList>;
- current->tArgLists->setAutoDelete(TRUE);
- }
- QListIterator<ArgumentList> talsi(*current_root->tArgLists);
- ArgumentList *srcAl=0;
- for (talsi.toLast();(srcAl=talsi.current());--talsi)
- {
- ArgumentList *dstAl = new ArgumentList;
- dstAl->setAutoDelete(TRUE);
- QListIterator<Argument> tali(*srcAl);
- Argument *a;
- for (;(a=tali.current());++tali)
- {
- dstAl->append(new Argument(*a));
- }
- current->tArgLists->insert(0,dstAl);
- }
- }
- }
-#endif
-}
-
-static void addSection()
-{
- sectionTitle+=yytext;
- sectionTitle=sectionTitle.stripWhiteSpace();
- //printf("Adding new section file=%s label=%s title=%s\n",yyFileName,sectionLabel.data(),sectionTitle.data());
- SectionInfo *si = new SectionInfo(yyFileName,sectionLabel,sectionTitle,SectionInfo::Anchor);
- current->anchors->append(si);
- Doxygen::sectionDict.insert(yytext,si);
-}
-
-//-----------------------------------------------------------------------------
-
-// strip trailing whitespace (excluding newlines) from string s
-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)
- {
- s.resize(i+2); // string upto and including char at pos i and \0 terminator
- }
-}
-
-// selects the output to write to
-static inline void setOutput(OutputContext ctx)
-{
- bool xrefAppendToPrev = xrefAppendFlag;
- // determine append flag for the next item (i.e. the end of this item)
- xrefAppendFlag = inContext==OutputXRef && ctx==OutputXRef && // two consecutive xref items
- newXRefKind==xrefKind && // of the same kind
- (xrefKind!=XRef_Item ||
- newXRefItemKey==xrefItemKey); // with the same key if \xrefitem
- //printf("refKind=%d newXRefKind=%d xrefAppendToPrev=%d xrefAppendFlag=%d\n",
- // xrefKind,newXRefKind,xrefAppendToPrev,xrefAppendFlag);
- xrefItemKey = newXRefItemKey;
-
- //printf("setOutput(inContext=%d ctx=%d)\n",inContext,ctx);
- if (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
- // type and need to remember this until the end of that item.
- switch(xrefKind)
- {
- case XRef_Todo:
- addXRefItem("todo",
- theTranslator->trTodo(),
- theTranslator->trTodoList(),
- xrefAppendToPrev
- );
- break;
- case XRef_Test:
- addXRefItem("test",
- theTranslator->trTest(),
- theTranslator->trTestList(),
- xrefAppendToPrev
- );
- break;
- case XRef_Bug:
- addXRefItem("bug",
- theTranslator->trBug(),
- theTranslator->trBugList(),
- xrefAppendToPrev
- );
- break;
- case XRef_Deprecated:
- addXRefItem("deprecated",
- theTranslator->trDeprecated(),
- theTranslator->trDeprecatedList(),
- xrefAppendToPrev
- );
- break;
- case XRef_Item: // user defined list
- addXRefItem(xrefItemKey,
- xrefItemTitle,
- xrefListTitle,
- xrefAppendToPrev
- );
- break;
- case XRef_None:
- ASSERT(0);
- break;
- }
- }
-
- inContext = ctx;
- switch(inContext)
- {
- case OutputDoc:
- stripTrailingWhiteSpace(current->doc);
- if (current->docFile.isEmpty())
- {
- current->docFile = yyFileName;
- current->docLine = yyLineNr;
- }
- pOutputString = &current->doc;
- break;
- case OutputBrief:
- if (current->briefFile.isEmpty())
- {
- current->briefFile = yyFileName;
- current->briefLine = yyLineNr;
- }
- pOutputString = &current->brief;
- break;
- case OutputXRef:
- pOutputString = &outputXRef;
- // first item found, so can't append to previous
- //xrefAppendFlag = FALSE;
- break;
- }
-}
-
-// add a string to the output
-static inline void addOutput(const char *s)
-{
- *pOutputString+=s;
-}
-
-// add a character to the output
-static inline void addOutput(char c)
-{
- *pOutputString+=c;
-}
-
-/* ----------------------------------------------------------------- */
-#undef YY_INPUT
-#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
-
-static int prevPosition=0;
-
-static int yyread(char *buf,int max_size)
-{
- prevPosition=inputPosition;
- int c=0;
- while( c < max_size && inputString[inputPosition] )
- {
- *buf = inputString[inputPosition++] ;
- //printf("%d (%c)\n",*buf,*buf);
- c++; buf++;
- }
- return c;
-}
-
-%}
-
- /* start command character */
-CMD ("\\"|"@")
-DCMD1 ("arg"|"attention"|"author"|"bug"|"code")
-DCMD2 ("date"|"deprecated"|"dot"|"dotfile"|"example")
-DCMD3 ("htmlinclude"|"htmlonly"|"image"|"include")
-DCMD4 ("includelineno"|"internal"|"invariant")
-DCMD5 ("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 ("test"|"throw"|"todo"|"until"|"verbatim")
-DCMD11 ("verbinclude"|"version"|"warning"|"xrefitem")
-DETAILEDCMD {CMD}({DCMD1}|{DCMD2}|{DCMD3}|{DCMD4}|{DCMD5}|{DCMD6}|{DCMD7}|{DCMD8}|{DCMD9}|{DCMD10}|{DCMD11})
-PRE [pP][rR][eE]
-TABLE [tT][aA][bB][lL][eE]
-P [pP]
-UL [uU][lL]
-OL [oO][lL]
-DL [dD][lL]
-IMG [iI][mM][gG]
-HR [hH][rR]
-DETAILEDHTML {PRE}|{UL}|{TABLE}|{OL}|{DL}|{P}|[Hh][1-6]|{IMG}|{HR}
-BN [ \t\n\r]
-BL [ \t\r]*"\n"
-B [ \t]
-BS ^(({B}*"//")?)(({B}*"*"+)?){B}*
-ATTR ({B}+[^>\n]*)?
-DOCNL "\n"|"\\_linebr"
-LC "\\"{B}*"\n"
-NW [^a-z_A-Z0-9]
-FILESCHAR [a-z_A-Z0-9\\:\\\/\-\+]
-FILEECHAR [a-z_A-Z0-9\-\+]
-FILE ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|("\""[^\n\"]+"\"")
-ID "$"?[a-z_A-Z][a-z_A-Z0-9]*
-LABELID [a-z_A-Z][a-z_A-Z0-9\-]*
-SCOPEID {ID}({ID}*{BN}*"::"{BN}*)*({ID}?)
-SCOPENAME "$"?(({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
-MAILADR [a-z_A-Z0-9.+\-]+"@"[a-z_A-Z0-9\-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-]+
-
-%option noyywrap
-
- /* comment parsing states. */
-%x Comment
-%x PageDocArg1
-%x PageDocArg2
-%x RelatesParam1
-%x ClassDocArg1
-%x ClassDocArg2
-%x ClassDocArg3
-%x CategoryDocArg1
-%x XRefItemParam1
-%x XRefItemParam2
-%x XRefItemParam3
-%x FileDocArg1
-%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 SkipGuardedSection
-%x SkipInternal
-%x NameParam
-%x InGroupParam
-%x FnParam
-%x OverloadParam
-%x InheritParam
-%x ReadFormulaShort
-%x ReadFormulaLong
-%x AnchorLabel
-%x HtmlComment
-%x SkipLang
-
-%%
-
- /* What can happen in while parsing a comment block:
- * commands (e.g. @page, or \page)
- * escaped commands (e.g. @@page or \\page).
- * formulas (e.g. \f$ \f[ \f{..)
- * directories (e.g. \doxygen\src\)
- * autolist end. (e.g. a dot on an otherwise empty line)
- * newlines.
- * end of brief description due to blank line.
- * end of brief description due to some command (@command, or <command>).
- * words and whitespace and other characters (#,?!, etc).
- * grouping commands (e.g. @{ and @})
- * language switch (e.g. \~english or \~).
- * mail adress (e.g. dimitri@stack.nl).
- * quoted text, such as "foo@bar"
- * XML commands, <summary></summary><remarks></remarks>
- */
-
-<Comment>{CMD}{CMD}[a-z_A-Z]+{B}* { // escaped command
- addOutput(yytext);
- }
-<Comment>{CMD}{CMD}"~"[a-z_A-Z]* { // escaped command
- addOutput(yytext);
- }
-<Comment>{MAILADR} { // mail adress
- addOutput(yytext);
- }
-<Comment>"\""[^"\n]*"\"" { // quoted text
- addOutput(yytext);
- }
-<Comment>("\\"[a-z_A-Z]+)+"\\" { // directory (or chain of commands!)
- addOutput(yytext);
- }
-<Comment>{DETAILEDCMD}/[^a-z_A-Z]* { // command that can end a brief description
- if (inContext!=OutputXRef)
- {
- briefEndsAtDot=FALSE;
- setOutput(OutputDoc);
- }
- // continue with the same input
- REJECT;
- }
-<Comment>"<"{DETAILEDHTML}{ATTR}">" { // HTML command that ends a brief description
- setOutput(OutputDoc);
- // continue with the same input
- REJECT;
- }
-<Comment>"<summary>" { // start of a .NET XML style brief description
- setOutput(OutputBrief);
- }
-<Comment>"<remarks>"|"</summary>" { // start of a .NET XML style detailed description
- setOutput(OutputDoc);
- }
-<Comment>"</remarks>" { // end of a brief or detailed description
- }
-<Comment>"<!--" {
- BEGIN(HtmlComment);
- }
-<Comment>{CMD}[a-z_A-Z]+{B}* { // potentially interesting command
- QCString cmdName = QCString(&yytext[1]).stripWhiteSpace();
- DocCmdFunc *funcPtr = DocCmdMapper::map(cmdName);
- if (funcPtr) // special action is required
- {
- if ((*funcPtr)(cmdName))
- {
- // implicit split of the comment block into two
- // entries. Restart the next block at the start
- // of this command.
- 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.
- inputPosition=prevPosition + yy_bp - yy_current_buffer->yy_ch_buf;
- yyterminate();
- }
- }
- else // command not relevant
- {
- addOutput(yytext);
- }
- }
-<Comment>("\\\\"|"@@")"f"[$\[{] { // escaped formula command
- addOutput(yytext);
- }
-<Comment>{CMD}"~"[a-z_A-Z]* { // language switch command
- QCString langId = &yytext[2];
- if (!langId.isEmpty() &&
- stricmp(Config_getEnum("OUTPUT_LANGUAGE"),langId)!=0)
- { // enable language specific section
- BEGIN(SkipLang);
- }
- }
-<Comment>{CMD}"f{"[^}\n]+"}" { // start of a formula with custom environment
- formulaText="\\begin";
- formulaEnv=&yytext[2];
- formulaText+=formulaEnv;
- BEGIN(ReadFormulaLong);
- }
-<Comment>{CMD}"f$" { // start of a inline formula
- formulaText="$";
- BEGIN(ReadFormulaShort);
- }
-<Comment>{CMD}"f[" { // start of a block formula
- formulaText="\\[";
- BEGIN(ReadFormulaLong);
- }
-<Comment>{CMD}"{" { // begin of a group
- //langParser->handleGroupStartCommand(g_memberGroupHeader);
- openGroup(current,yyFileName,yyLineNr);
- }
-<Comment>{CMD}"}" { // end of a group
- //langParser->handleGroupEndCommand();
- closeGroup(current,yyFileName,yyLineNr);
- g_memberGroupHeader.resize(0);
- }
-<Comment>{CMD}[$@\\&~<>#%] { // escaped character
- addOutput(yytext);
- }
-<Comment>[a-z_A-Z]+ { // normal word
- addOutput(yytext);
- }
-<Comment>^{B}*"."{B}*/\n { // explicit end autolist: e.g " ."
- addOutput(yytext);
- }
-<Comment>"."[a-z_A-Z0-9] { // . at start or in the middle of a word
- addOutput(yytext);
- }
-<Comment>".\\"[ \t] { // . with escaped space.
- addOutput(yytext[0]);
- addOutput(yytext[2]);
- }
-<Comment>(\n|\\_linebr)({B}*(\n|\\_linebr))+ { // at least one blank line (or blank line command)
- if (inContext!=OutputBrief)
- {
- addOutput(yytext);
- setOutput(OutputDoc);
- }
- else if (!current->brief.stripWhiteSpace().isEmpty())
- { // only go to the detailed description if we have
- // found some brief description and not just whitespace
- setOutput(OutputDoc);
- addOutput(yytext);
- }
- lineCount();
- }
-<Comment>"." { // potential end of a JavaDoc style comment
- addOutput(*yytext);
- if (briefEndsAtDot)
- {
- setOutput(OutputDoc);
- briefEndsAtDot=FALSE;
- }
- }
-<Comment>\n { // newline
- addOutput(*yytext);
- yyLineNr++;
- }
-<Comment>. { // catch-all for anything else
- addOutput(*yytext);
- }
-
-
- /* -------------- Rules for handling HTML comments ----------- */
-
-<HtmlComment>"--"[!]?">"{B}* { BEGIN( Comment ); }
-<HtmlComment>{DOCNL} {
- if (*yytext=='\n') yyLineNr++;
- }
-<HtmlComment>[^\\\n\-]+ { // ignore unimportant characters
- }
-<HtmlComment>. { // ignore every else
- }
-
- /* -------------- Rules for handling formulas ---------------- */
-
-<ReadFormulaShort>{CMD}"f$" { // end of inline formula
- formulaText+="$";
- addOutput(addFormula());
- addOutput(' ');
- BEGIN(Comment);
- }
-<ReadFormulaLong>{CMD}"f]" { // end of block formula
- formulaText+="\\]";
- addOutput(addFormula());
- addOutput(' ');
- BEGIN(Comment);
- }
-<ReadFormulaLong>{CMD}"f}" { // end of custom env formula
- formulaText+="\\end";
- formulaText+=formulaEnv;
- addOutput(addFormula());
- addOutput(' ');
- BEGIN(Comment);
- }
-<ReadFormulaLong,ReadFormulaShort>[^\\@\n]+ { // any non-special character
- formulaText+=yytext;
- }
-<ReadFormulaLong,ReadFormulaShort>\n { // new line
- formulaText+=*yytext;
- yyLineNr++;
- }
-<ReadFormulaLong,ReadFormulaShort>. { // any othe character
- formulaText+=*yytext;
- }
-
- /* ------------ handle argument of enum command --------------- */
-
-<EnumDocArg1>{SCOPEID} { // handle argument
- current->name = yytext;
- prependScope();
- BEGIN( Comment );
- }
-<EnumDocArg1>{LC} { // line continuation
- yyLineNr++;
- addOutput('\n');
- }
-<EnumDocArg1>{DOCNL} { // missing argument
- warn(yyFileName,yyLineNr,
- "Warning: missing argument after \\enum."
- );
- addOutput('\n');
- if (*yytext=='\n') yyLineNr++;
- BEGIN( Comment );
- }
-<EnumDocArg1>. { // ignore other stuff
- }
-
- /* ------------ handle argument of namespace command --------------- */
-
-<NameSpaceDocArg1>{SCOPENAME} { // handle argument
- current->name = yytext;
- BEGIN( Comment );
- }
-<NameSpaceDocArg1>{LC} { // line continuation
- yyLineNr++;
- addOutput('\n');
- }
-<NameSpaceDocArg1>{DOCNL} { // missing argument
- warn(yyFileName,yyLineNr,
- "Warning: missing argument after "
- "\\namespace."
- );
- addOutput('\n');
- if (*yytext=='\n') yyLineNr++;
- BEGIN( Comment );
- }
-<NameSpaceDocArg1>. { // ignore other stuff
- }
-
- /* ------------ handle argument of package command --------------- */
-
-<PackageDocArg1>{ID}("."{ID})* { // handle argument
- current->name = yytext;
- BEGIN( Comment );
- }
-<PackageDocArg1>{LC} { // line continuation
- yyLineNr++;
- addOutput('\n');
- }
-<PackageDocArg1>{DOCNL} { // missing argument
- warn(yyFileName,yyLineNr,
- "Warning: missing argument after "
- "\\package."
- );
- addOutput('\n');
- if (*yytext=='\n') yyLineNr++;
- BEGIN( Comment );
- }
-<PackageDocArg1>. { // ignore other stuff
- }
-
- /* ------ handle argument of class/struct/union command --------------- */
-
-<ClassDocArg1>{SCOPENAME} { // first argument
- current->name = yytext;
- if (current->section==Entry::PROTOCOLDOC_SEC)
- {
- current->name+="-p";
- }
- // prepend outer scope name
- prependScope();
- BEGIN( ClassDocArg2 );
- }
-<CategoryDocArg1>{SCOPENAME}{B}*"("[^\)]+")" {
- current->name = yytext;
- prependScope();
- BEGIN( ClassDocArg2 );
- }
-<ClassDocArg1,CategoryDocArg1>{LC} { // line continuation
- yyLineNr++;
- addOutput('\n');
- }
-<ClassDocArg1,CategoryDocArg1>{DOCNL} {
- warn(yyFileName,yyLineNr,
- "Warning: missing argument after "
- "\\%s.",YY_START==ClassDocArg1?"class":"category"
- );
- addOutput('\n');
- if (*yytext=='\n') yyLineNr++;
- BEGIN( Comment );
- }
-<ClassDocArg1,CategoryDocArg1>. { // ignore other stuff
- }
-
-<ClassDocArg2>{FILE} { // second argument; include file
- current->includeFile = stripQuotes(yytext);
- BEGIN( ClassDocArg3 );
- }
-<ClassDocArg2>{LC} { // line continuation
- yyLineNr++;
- addOutput('\n');
- }
-<ClassDocArg2>{DOCNL} {
- addOutput('\n');
- if (*yytext=='\n') yyLineNr++;
- BEGIN( Comment );
- }
-<ClassDocArg2>. { // ignore other stuff
- }
-
-<ClassDocArg3>[<]?{FILE}[>]? { // third argument; include file name
- current->includeName = yytext;
- BEGIN( Comment );
- }
-<ClassDocArg3>{LC} { // line continuation
- yyLineNr++;
- addOutput('\n');
- }
-<ClassDocArg3>{DOCNL} {
- if (*yytext=='\n') yyLineNr++;
- BEGIN( Comment );
- }
-<ClassDocArg3>. { // ignore other stuff
- }
-
- /* --------- handle arguments of {def,add,weak}group commands --------- */
-
-<GroupDocArg1>{ID}(".html"?) { // group name
- current->name = yytext;
- //lastDefGroup.groupname = yytext;
- //lastDefGroup.pri = current->groupingPri();
- // the .html stuff is for Qt compatibility
- if (current->name.right(5)==".html")
- {
- current->name=current->name.left(current->name.length()-5);
- }
- BEGIN(GroupDocArg2);
- }
-<GroupDocArg1>"\\"{B}*"\n" { // line continuation
- yyLineNr++;
- addOutput('\n');
- }
-<GroupDocArg1>{DOCNL} { // missing argument!
- warn(yyFileName,yyLineNr,
- "Warning: missing group name after %s",
- current->groupDocCmd()
- );
- addOutput('\n');
- if (*yytext=='\n') yyLineNr++;
- BEGIN( Comment );
- }
-<GroupDocArg2>"\\"{B}*"\n" { // line continuation
- yyLineNr++;
- addOutput('\n');
- }
-<GroupDocArg2>[^\n\\\*]+ { // title (stored in type)
- current->type += yytext;
- current->type = current->type.stripWhiteSpace();
- }
-<GroupDocArg2>{DOCNL} {
- if ( current->groupDocType==Entry::GROUPDOC_NORMAL &&
- current->type.isEmpty()
- ) // defgroup requires second argument
- {
- warn(yyFileName,yyLineNr,
- "Warning: missing title after "
- "\\defgroup %s", current->name.data()
- );
- }
- if (*yytext=='\n') yyLineNr++;
- addOutput('\n');
- BEGIN( Comment );
- }
-
- /* --------- handle arguments of page/mainpage command ------------------- */
-
-<PageDocArg1>{FILE} { // first argument; page name
- current->name = stripQuotes(yytext);
- BEGIN( PageDocArg2 );
- }
-<PageDocArg1>{LC} { yyLineNr++;
- addOutput('\n');
- }
-<PageDocArg1>{DOCNL} {
- warn(yyFileName,yyLineNr,
- "Warning: missing argument after "
- "\\page."
- );
- if (*yytext=='\n') yyLineNr++;
- addOutput('\n');
- BEGIN( Comment );
- }
-<PageDocArg1>. { // ignore other stuff
- }
-<PageDocArg2>.*"\n" { // second argument; page title
- yyLineNr++;
- current->args = yytext;
- addOutput('\n');
- BEGIN( Comment );
- }
-
- /* --------- handle arguments of the file/dir/example command ------------ */
-
-<FileDocArg1>{DOCNL} { // no file name specfied
- if (*yytext=='\n') yyLineNr++;
- addOutput('\n');
- BEGIN( Comment );
- }
-<FileDocArg1>{FILE} { // first argument; name
- current->name = stripQuotes(yytext);
- BEGIN( Comment );
- }
-<FileDocArg1>{LC} { yyLineNr++;
- addOutput('\n');
- }
-<FileDocArg1>. { // ignore other stuff
- }
-
- /* --------- handle arguments of the xrefitem command ------------ */
-
-<XRefItemParam1>{ID} { // first argument
- newXRefItemKey=yytext;
- setOutput(OutputXRef);
- BEGIN(XRefItemParam2);
- }
-<XRefItemParam1>{LC} { // line continuation
- yyLineNr++;
- addOutput('\n');
- }
-<XRefItemParam1>{DOCNL} { // missing arguments
- warn(yyFileName,yyLineNr,
- "Warning: Missing first argument of \\xrefitem"
- );
- if (*yytext=='\n') yyLineNr++;
- addOutput('\n');
- inContext = OutputDoc;
- BEGIN( Comment );
- }
-<XRefItemParam1>. { // ignore other stuff
- }
-
-<XRefItemParam2>"\""[^\n\"]*"\"" { // second argument
- xrefItemTitle = stripQuotes(yytext);
- BEGIN(XRefItemParam3);
- }
-<XRefItemParam2>{LC} { // line continuation
- yyLineNr++;
- addOutput('\n');
- }
-<XRefItemParam2>{DOCNL} { // missing argument
- warn(yyFileName,yyLineNr,
- "Warning: Missing second argument of \\xrefitem"
- );
- if (*yytext=='\n') yyLineNr++;
- addOutput('\n');
- inContext = OutputDoc;
- BEGIN( Comment );
- }
-<XRefItemParam2>. { // ignore other stuff
- }
-
-<XRefItemParam3>"\""[^\n\"]*"\"" { // third argument
- xrefListTitle = stripQuotes(yytext);
- xrefKind = XRef_Item;
- BEGIN( Comment );
- }
-<XRefItemParam2>{LC} { // line continuation
- yyLineNr++;
- addOutput('\n');
- }
-<XRefItemParam3>{DOCNL} { // missing argument
- warn(yyFileName,yyLineNr,
- "Warning: Missing third argument of \\xrefitem"
- );
- if (*yytext=='\n') yyLineNr++;
- addOutput('\n');
- inContext = OutputDoc;
- BEGIN( Comment );
- }
-<XRefItemParam3>. { // ignore other stuff
- }
-
-
- /* --------- handle arguments of the relates(also) command ------------ */
-
-<RelatesParam1>({ID}("::"|"."))*{ID} { // argument
- current->relates = yytext;
- //if (current->mGrpId!=DOX_NOGROUP)
- //{
- // memberGroupRelates = yytext;
- //}
- BEGIN( Comment );
- }
-<RelatesParam1>{LC} { // line continuation
- yyLineNr++;
- addOutput('\n');
- }
-<RelatesParam1>{DOCNL} { // missing argument
- warn(yyFileName,yyLineNr,
- "Warning: Missing argument of \\relates command"
- );
- if (*yytext=='\n') yyLineNr++;
- addOutput('\n');
- BEGIN( Comment );
- }
-<RelatesParam1>. { // ignore other stuff
- }
-
-
- /* ----- handle arguments of the relates(also)/addindex commands ----- */
-
-<LineParam>{DOCNL} { // end of argument
- if (*yytext=='\n') yyLineNr++;
- addOutput('\n');
- BEGIN( Comment );
- }
-<LineParam>{LC} { // line continuation
- yyLineNr++;
- addOutput('\n');
- }
-<LineParam>. { // ignore other stuff
- addOutput(*yytext);
- }
-
- /* ----- handle arguments of the section/subsection/.. commands ------- */
-
-<SectionLabel>{LABELID} { // first argyment
- sectionLabel=yytext;
- addOutput(yytext);
- sectionTitle.resize(0);
- BEGIN(SectionTitle);
- }
-<SectionLabel>{DOCNL} { // missing argument
- warn(yyFileName,yyLineNr,
- "Warning: \\section command has no label"
- );
- if (*yytext=='\n') yyLineNr++;
- addOutput('\n');
- BEGIN( Comment );
- }
-<SectionLabel>. { // invalid character for section label
- warn(yyFileName,yyLineNr,
- "Warning: Invalid or missing section label"
- );
- BEGIN(Comment);
- }
-
-<SectionTitle>[^\n@\\*]*/"\n" { // end of section title
- addSection();
- addOutput(yytext);
- BEGIN( Comment );
- }
-<SectionTitle>[^\n@\\]*/"\\_linebr" { // end of section title
- addSection();
- addOutput(yytext);
- BEGIN( Comment );
- }
-<SectionTitle>{LC} { // line continuation
- yyLineNr++;
- addOutput('\n');
- }
-<SectionTitle>[^\n@\\]* { // any character without special meaning
- sectionTitle+=yytext;
- addOutput(yytext);
- }
-<SectionTitle>("\\\\"|"@@"){ID} { // unescape escaped command
- sectionTitle+=&yytext[1];
- addOutput(yytext);
- }
-<SectionTitle>{CMD}[$@\\&~<>#%] { // unescape escaped character
- sectionTitle+=yytext[1];
- addOutput(yytext);
- }
-<SectionTitle>. { // anything else
- sectionTitle+=yytext;
- addOutput(*yytext);
- }
-
- /* ----- handle arguments of the subpage command ------- */
-
-<SubpageLabel>{LABELID} { // first argument
- addOutput(yytext);
- // we add subpage labels as a kind of "inheritance" relation to prevent
- // needing to add another list to the Entry class.
- current->extends->append(new BaseInfo(yytext,Public,Normal));
- BEGIN(SubpageTitle);
- }
-<SubpageLabel>{DOCNL} { // missing argument
- warn(yyFileName,yyLineNr,
- "Warning: \\subpage command has no label"
- );
- if (*yytext=='\n') yyLineNr++;
- addOutput('\n');
- BEGIN( Comment );
- }
-<SubpageTitle>{DOCNL} { // no title, end command
- addOutput(yytext);
- BEGIN( Comment );
- }
-<SubpageTitle>[ \t]*"\""[^\"\n]*"\"" { // add title, end of command
- addOutput(yytext);
- BEGIN( Comment );
- }
-<SubpageTitle>. { // no title, end of command
- unput(*yytext);
- BEGIN( Comment );
- }
-
- /* ----- handle arguments of the anchor command ------- */
-
-<AnchorLabel>{LABELID} { // found argument
- SectionInfo *si = new SectionInfo(yyFileName,yytext,0,SectionInfo::Anchor);
- Doxygen::sectionDict.insert(yytext,si);
- current->anchors->append(si);
- addOutput(yytext);
- BEGIN( Comment );
- }
-<AnchorLabel>{DOCNL} { // missing argument
- warn(yyFileName,yyLineNr,
- "Warning: \\anchor command has no label"
- );
- if (*yytext=='\n') yyLineNr++;
- addOutput('\n');
- BEGIN( Comment );
- }
-<AnchorLabel>. { // invalid character for anchor label
- warn(yyFileName,yyLineNr,
- "Warning: Invalid or missing anchor label"
- );
- BEGIN(Comment);
- }
-
-
- /* ----- handle arguments of the preformatted block commands ------- */
-
-<FormatBlock>{CMD}("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode")/{NW} { // possible ends
- addOutput(yytext);
- if (&yytext[4]==blockName) // found end of the block
- {
- BEGIN(Comment);
- }
- }
-<FormatBlock>[^ \@\*\/\\\n]* { // some word
- addOutput(yytext);
- }
-<FormatBlock>{DOCNL} { // new line
- if (*yytext=='\n') yyLineNr++;
- addOutput('\n');
- }
-<FormatBlock>"/*" { // start of a C-comment
- g_commentCount++;
- addOutput(yytext);
- }
-<FormatBlock>"*/" { // end of a C-comment
- addOutput(yytext);
- g_commentCount--;
- if (g_commentCount<0 && blockName!="verbatim")
- {
- warn(yyFileName,yyLineNr,
- "Warning: found */ without matching /* while inside a \\%s block! Perhaps a missing \\end%s?\n",blockName.data(),blockName.data());
- }
- }
-<FormatBlock>. {
- addOutput(*yytext);
- }
-<FormatBlock><<EOF>> {
- warn(yyFileName,yyLineNr,
- "Warning: reached end of comment while inside a @%s block; check for missing @end%s tag!",
- blockName.data(),blockName.data()
- );
- yyterminate();
- }
-
- /* ----- handle arguments of if/ifnot commands ------- */
-
-<GuardParam>{LABELID} { // parameter of if/ifnot guard
- bool sectionEnabled = Config_getList("ENABLED_SECTIONS").find(yytext)!=-1;
- bool parentEnabled = TRUE;
- if (!guards.isEmpty()) parentEnabled = guards.top()->isEnabled();
- if (parentEnabled)
- {
- if (
- (sectionEnabled && guardType==Guard_If) ||
- (!sectionEnabled && guardType==Guard_IfNot)
- ) // section is visible
- {
- guards.push(new GuardedSection(TRUE,TRUE));
- enabledSectionFound=TRUE;
- BEGIN( Comment );
- }
- else // section is invisible
- {
- if (guardType!=Guard_Skip)
- {
- guards.push(new GuardedSection(FALSE,TRUE));
- }
- BEGIN( SkipGuardedSection );
- }
- }
- else // invisible because of parent
- {
- guards.push(new GuardedSection(FALSE,FALSE));
- BEGIN( SkipGuardedSection );
- }
- }
-<GuardParam>{DOCNL} { // end of argument
- if (*yytext=='\n') yyLineNr++;
- addOutput('\n');
- BEGIN( Comment );
- }
-<GuardParam>{LC} { // line continuation
- yyLineNr++;
- addOutput('\n');
- }
-<GuardParam>. { // ignore other stuff
- addOutput(*yytext);
- }
-
- /* ----- handle skipping of conditional sections ------- */
-
-<SkipGuardedSection>{CMD}"ifnot"/{NW} {
- guardType = Guard_IfNot;
- BEGIN( GuardParam );
- }
-<SkipGuardedSection>{CMD}"if"/{NW} {
- guardType = Guard_If;
- BEGIN( GuardParam );
- }
-<SkipGuardedSection>{CMD}"endif"/{NW} {
- if (guards.isEmpty())
- {
- warn(yyFileName,yyLineNr,
- "Warning: found @endif without matching start command");
- }
- else
- {
- delete guards.pop();
- BEGIN( Comment );
- }
- }
-<SkipGuardedSection>{CMD}"else"/{NW} {
- if (guards.isEmpty())
- {
- warn(yyFileName,yyLineNr,
- "Warning: found @else without matching start command");
- }
- else
- {
- if (!enabledSectionFound && guards.top()->parentVisible())
- {
- delete guards.pop();
- guards.push(new GuardedSection(TRUE,TRUE));
- enabledSectionFound=TRUE;
- BEGIN( Comment );
- }
- }
- }
-<SkipGuardedSection>{CMD}"elseif"/{NW} {
- if (guards.isEmpty())
- {
- warn(yyFileName,yyLineNr,
- "Warning: found @elseif without matching start command");
- }
- else
- {
- if (!enabledSectionFound && guards.top()->parentVisible())
- {
- delete guards.pop();
- BEGIN( GuardParam );
- }
- }
- }
-<SkipGuardedSection>{DOCNL} { // skip line
- if (*yytext=='\n') yyLineNr++;
- addOutput('\n');
- }
-<SkipGuardedSection>[^ \\@\n]+ { // skip non-special characters
- }
-<SkipGuardedSection>. { // any other character
- }
-
-
- /* ----- handle skipping of internal section ------- */
-
-<SkipInternal>{DOCNL} { // skip line
- if (*yytext=='\n') yyLineNr++;
- addOutput('\n');
- }
-<SkipInternal>[^ \\@\n]+ { // skip non-special characters
- }
-<SkipInternal>. { // any other character
- }
-
-
- /* ----- handle argument of name command ------- */
-
-<NameParam>{DOCNL} { // end of argument
- if (*yytext=='\n') yyLineNr++;
- addOutput('\n');
- BEGIN( Comment );
- }
-<NameParam>{LC} { // line continuation
- yyLineNr++;
- addOutput('\n');
- g_memberGroupHeader+=' ';
- }
-<NameParam>. { // ignore other stuff
- g_memberGroupHeader+=*yytext;
- current->name+=*yytext;
- }
-
- /* ----- handle argument of ingroup command ------- */
-
-<InGroupParam>{ID} { // group id
- current->groups->append(
- new Grouping(yytext, Grouping::GROUPING_INGROUP)
- );
- inGroupParamFound=TRUE;
- }
-<InGroupParam>{DOCNL} { // missing argument
- if (!inGroupParamFound)
- {
- warn(yyFileName,yyLineNr,
- "Warning: Missing group name for \\ingroup command"
- );
- }
- if (*yytext=='\n') yyLineNr++;
- addOutput('\n');
- BEGIN( Comment );
- }
-<InGroupParam>{LC} { // line continuation
- yyLineNr++;
- addOutput('\n');
- }
-<InGroupParam>. { // ignore other stuff
- addOutput(*yytext);
- }
-
- /* ----- handle argument of fn command ------- */
-
-<FnParam>{DOCNL} { // end of argument
- if (braceCount==0)
- {
- if (*yytext=='\n') yyLineNr++;
- addOutput('\n');
- //printf("functionProto=%s\n",functionProto.data());
- langParser->parsePrototype(functionProto);
- BEGIN( Comment );
- }
- }
-<FnParam>{LC} { // line continuation
- yyLineNr++;
- functionProto+=' ';
- }
-<FnParam>[^@\\\n()]+ { // non-special characters
- functionProto+=yytext;
- }
-<FnParam>"(" {
- functionProto+=yytext;
- braceCount++;
- }
-<FnParam>")" {
- functionProto+=yytext;
- braceCount--;
- }
-<FnParam>. { // add other stuff
- functionProto+=*yytext;
- }
-
-
- /* ----- handle argument of overload command ------- */
-
-
-<OverloadParam>{DOCNL} { // end of argument
- if (*yytext=='\n') yyLineNr++;
- addOutput('\n');
- if (functionProto.stripWhiteSpace().isEmpty())
- { // plain overload command
- addOutput(getOverloadDocs());
- }
- else // overload declaration
- {
- makeStructuralIndicator(Entry::OVERLOADDOC_SEC);
- langParser->parsePrototype(functionProto);
- }
- BEGIN( Comment );
- }
-<OverloadParam>{LC} { // line continuation
- yyLineNr++;
- functionProto+=' ';
- }
-<OverloadParam>. { // add other stuff
- functionProto+=*yytext;
- }
-
- /* ----- handle argument of inherit command ------- */
-
-<InheritParam>({ID}("::"|"."))*{ID} { // found argument
- current->extends->append(
- new BaseInfo(removeRedundantWhiteSpace(yytext),Public,Normal)
- );
- BEGIN( Comment );
- }
-<InheritParam>{DOCNL} { // missing argument
- warn(yyFileName,yyLineNr,
- "Warning: \\inherit command has no argument"
- );
- if (*yytext=='\n') yyLineNr++;
- addOutput('\n');
- BEGIN( Comment );
- }
-<InheritParam>. { // invalid character for anchor label
- warn(yyFileName,yyLineNr,
- "Warning: Invalid or missing name for \\inherit command"
- );
- BEGIN(Comment);
- }
-
- /* ----- handle language specific sections ------- */
-
-<SkipLang>[\\@]"~"[a-zA-Z]* { /* language switch */
- QCString langId = &yytext[2];
- if (langId.isEmpty() ||
- stricmp(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') yyLineNr++;
- }
-<SkipLang>. { /* any other character */
- }
-
-
-%%
-
-//----------------------------------------------------------------------------
-
-static bool handleBrief(const QCString &)
-{
- //printf("handleBrief\n");
- setOutput(OutputBrief);
- return FALSE;
-}
-
-static bool handleFn(const QCString &)
-{
- bool stop=makeStructuralIndicator(Entry::MEMBERDOC_SEC);
- functionProto.resize(0);
- braceCount=0;
- BEGIN(FnParam);
- return stop;
-}
-
-static bool handleDef(const QCString &)
-{
- bool stop=makeStructuralIndicator(Entry::DEFINEDOC_SEC);
- functionProto.resize(0);
- BEGIN(FnParam);
- return stop;
-}
-
-static bool handleOverload(const QCString &)
-{
- functionProto.resize(0);
- BEGIN(OverloadParam);
- return FALSE;
-}
-
-static bool handleEnum(const QCString &)
-{
- bool stop=makeStructuralIndicator(Entry::ENUMDOC_SEC);
- BEGIN(EnumDocArg1);
- return stop;
-}
-
-static bool handleDefGroup(const QCString &)
-{
- bool stop=makeStructuralIndicator(Entry::GROUPDOC_SEC);
- current->groupDocType = Entry::GROUPDOC_NORMAL;
- BEGIN( GroupDocArg1 );
- return stop;
-}
-
-static bool handleAddToGroup(const QCString &)
-{
- bool stop=makeStructuralIndicator(Entry::GROUPDOC_SEC);
- current->groupDocType = Entry::GROUPDOC_ADD;
- BEGIN( GroupDocArg1 );
- return stop;
-}
-
-static bool handleWeakGroup(const QCString &)
-{
- bool stop=makeStructuralIndicator(Entry::GROUPDOC_SEC);
- current->groupDocType = Entry::GROUPDOC_WEAK;
- BEGIN( GroupDocArg1 );
- return stop;
-}
-
-static bool handleNamespace(const QCString &)
-{
- bool stop=makeStructuralIndicator(Entry::NAMESPACEDOC_SEC);
- BEGIN( NameSpaceDocArg1 );
- return stop;
-}
-
-static bool handlePackage(const QCString &)
-{
- bool stop=makeStructuralIndicator(Entry::PACKAGEDOC_SEC);
- BEGIN( PackageDocArg1 );
- return stop;
-}
-
-static bool handleClass(const QCString &)
-{
- bool stop=makeStructuralIndicator(Entry::CLASSDOC_SEC);
- BEGIN( ClassDocArg1 );
- return stop;
-}
-
-static bool handleProtocol(const QCString &)
-{ // Obj-C protocol
- bool stop=makeStructuralIndicator(Entry::PROTOCOLDOC_SEC);
- BEGIN( ClassDocArg1 );
- return stop;
-}
-
-static bool handleCategory(const QCString &)
-{ // Obj-C category
- bool stop=makeStructuralIndicator(Entry::CATEGORYDOC_SEC);
- BEGIN( CategoryDocArg1 );
- return stop;
-}
-
-static bool handleUnion(const QCString &)
-{
- bool stop=makeStructuralIndicator(Entry::UNIONDOC_SEC);
- BEGIN( ClassDocArg1 );
- return stop;
-}
-
-static bool handleStruct(const QCString &)
-{
- bool stop=makeStructuralIndicator(Entry::STRUCTDOC_SEC);
- BEGIN( ClassDocArg1 );
- return stop;
-}
-
-static bool handleInterface(const QCString &)
-{
- bool stop=makeStructuralIndicator(Entry::INTERFACEDOC_SEC);
- BEGIN( ClassDocArg1 );
- return stop;
-}
-
-static bool handleIdlException(const QCString &)
-{
- bool stop=makeStructuralIndicator(Entry::EXCEPTIONDOC_SEC);
- BEGIN( ClassDocArg1 );
- return stop;
-}
-
-static bool handlePage(const QCString &)
-{
- bool stop=makeStructuralIndicator(Entry::PAGEDOC_SEC);
- BEGIN( PageDocArg1 );
- return stop;
-}
-
-static bool handleMainpage(const QCString &)
-{
- bool stop=makeStructuralIndicator(Entry::MAINPAGEDOC_SEC);
- current->name = "mainpage";
- BEGIN( PageDocArg2 );
- return stop;
-}
-
-static bool handleFile(const QCString &)
-{
- bool stop=makeStructuralIndicator(Entry::FILEDOC_SEC);
- current->name = yyFileName;
- BEGIN( FileDocArg1 );
- return stop;
-}
-
-static bool handleDir(const QCString &)
-{
- bool stop=makeStructuralIndicator(Entry::DIRDOC_SEC);
- current->name = yyFileName;
- BEGIN( FileDocArg1 );
- return stop;
-}
-
-static bool handleExample(const QCString &)
-{
- bool stop=makeStructuralIndicator(Entry::EXAMPLE_SEC);
- current->name = yyFileName;
- BEGIN( FileDocArg1 );
- return stop;
-}
-
-static bool handleDetails(const QCString &)
-{
- setOutput(OutputDoc);
- return FALSE;
-}
-
-static bool handleName(const QCString &)
-{
- bool stop=makeStructuralIndicator(Entry::MEMBERGRP_SEC);
- g_memberGroupHeader.resize(0);
- BEGIN( NameParam );
- closeGroup(current,yyFileName,yyLineNr);
- return stop;
-}
-
-static bool handleTodo(const QCString &)
-{
- newXRefKind = XRef_Todo;
- setOutput(OutputXRef);
- xrefKind = XRef_Todo;
- return FALSE;
-}
-
-static bool handleTest(const QCString &)
-{
- newXRefKind = XRef_Test;
- setOutput(OutputXRef);
- xrefKind = XRef_Test;
- return FALSE;
-}
-
-static bool handleBug(const QCString &)
-{
- newXRefKind = XRef_Bug;
- setOutput(OutputXRef);
- xrefKind = XRef_Bug;
- return FALSE;
-}
-
-static bool handleDeprecated(const QCString &)
-{
- newXRefKind = XRef_Deprecated;
- setOutput(OutputXRef);
- xrefKind = XRef_Deprecated;
- return FALSE;
-}
-
-static bool handleXRefItem(const QCString &)
-{
- BEGIN(XRefItemParam1);
- return FALSE;
-}
-
-static bool handleRelated(const QCString &)
-{
- BEGIN(RelatesParam1);
- return FALSE;
-}
-
-static bool handleRelatedAlso(const QCString &)
-{
- current->relatesDup = TRUE;
- BEGIN(RelatesParam1);
- return FALSE;
-}
-
-static bool handleRefItem(const QCString &)
-{
- addOutput("@refitem ");
- BEGIN(LineParam);
- return FALSE;
-}
-
-static bool handleSection(const QCString &s)
-{
- setOutput(OutputDoc);
- addOutput("@"+s+" ");
- BEGIN(SectionLabel);
- return FALSE;
-}
-
-static bool handleSubpage(const QCString &s)
-{
- if (current->section!=Entry::EMPTY_SEC &&
- current->section!=Entry::PAGEDOC_SEC &&
- current->section!=Entry::MAINPAGEDOC_SEC
- )
- {
- warn(yyFileName,yyLineNr,
- "Warning: found \\subpage command in a comment block that is not marked as a page!");
- }
- addOutput("@"+s+" ");
- BEGIN(SubpageLabel);
- return FALSE;
-}
-
-static bool handleAnchor(const QCString &s)
-{
- addOutput("@"+s+" ");
- BEGIN(AnchorLabel);
- return FALSE;
-}
-
-static bool handleFormatBlock(const QCString &s)
-{
- addOutput("@"+s+" ");
- //printf("handleFormatBlock(%s)\n",s.data());
- blockName=s;
- g_commentCount=0;
- BEGIN(FormatBlock);
- return FALSE;
-}
-
-static bool handleAddIndex(const QCString &)
-{
- addOutput("@addindex ");
- BEGIN(LineParam);
- return FALSE;
-}
-
-static bool handleIf(const QCString &)
-{
- enabledSectionFound=FALSE;
- guardType = Guard_If;
- BEGIN(GuardParam);
- return FALSE;
-}
-
-static bool handleIfNot(const QCString &)
-{
- enabledSectionFound=FALSE;
- guardType = Guard_IfNot;
- BEGIN(GuardParam);
- return FALSE;
-}
-
-static bool handleElseIf(const QCString &)
-{
- if (guards.isEmpty())
- {
- warn(yyFileName,yyLineNr,
- "Warning: found \\else without matching start command");
- }
- else
- {
- guardType = enabledSectionFound ? Guard_Skip : Guard_If;
- BEGIN(GuardParam);
- }
- return FALSE;
-}
-
-static bool handleElse(const QCString &)
-{
- if (guards.isEmpty())
- {
- warn(yyFileName,yyLineNr,
- "Warning: found \\else without matching start command");
- }
- else
- {
- BEGIN( SkipGuardedSection );
- }
- return FALSE;
-}
-
-static bool handleEndIf(const QCString &)
-{
- if (guards.isEmpty())
- {
- warn(yyFileName,yyLineNr,
- "Warning: found \\endif without matching start command");
- }
- else
- {
- delete guards.pop();
- }
- enabledSectionFound=FALSE;
- return FALSE;
-}
-
-static bool handleIngroup(const QCString &)
-{
- inGroupParamFound=FALSE;
- BEGIN( InGroupParam );
- return FALSE;
-}
-
-static bool handleNoSubGrouping(const QCString &)
-{
- current->subGrouping = FALSE;
- return FALSE;
-}
-
-static bool handleShowInitializer(const QCString &)
-{
- current->initLines = 100000; // ON
- return FALSE;
-}
-
-static bool handleHideInitializer(const QCString &)
-{
- current->initLines = 0; // OFF
- return FALSE;
-}
-
-static bool handleCallgraph(const QCString &)
-{
- current->callGraph = TRUE; // ON
- return FALSE;
-}
-
-static bool handleInternal(const QCString &)
-{
- if (!Config_getBool("INTERNAL_DOCS"))
- {
- BEGIN( SkipInternal );
- }
- else
- {
- addOutput("\\internal ");
- }
- return FALSE;
-}
-
-static bool handleLineBr(const QCString &)
-{
- addOutput('\n');
- return FALSE;
-}
-
-static bool handleStatic(const QCString &)
-{
- current->stat = TRUE;
- return FALSE;
-}
-
-static bool handlePure(const QCString &)
-{
- current->virt = Pure;
- return FALSE;
-}
-
-static bool handlePrivate(const QCString &)
-{
- current->protection = Private;
- return FALSE;
-}
-
-static bool handlePrivateSection(const QCString &)
-{
- current->protection = protection = Private;
- return FALSE;
-}
-
-static bool handleProtected(const QCString &)
-{
- current->protection = Protected;
- return FALSE;
-}
-
-static bool handleProtectedSection(const QCString &)
-{
- current->protection = protection = Protected ;
- return FALSE;
-}
-
-static bool handlePublic(const QCString &)
-{
- current->protection = Public;
- return FALSE;
-}
-
-static bool handlePublicSection(const QCString &)
-{
- current->protection = protection = Public;
- return FALSE;
-}
-
-static bool handleInherit(const QCString &)
-{
- BEGIN(InheritParam);
- return FALSE;
-}
-
-//----------------------------------------------------------------------------
-
-static void checkFormula()
-{
- if (YY_START==ReadFormulaShort || YY_START==ReadFormulaLong)
- {
- warn(yyFileName,yyLineNr,"Warning: End of comment block while inside formula.");
- }
-}
-
-//----------------------------------------------------------------------------
-
-bool parseCommentBlock(/* in */ ParserInterface *parser,
- /* in */ Entry *curEntry,
- /* in */ const QCString &comment,
- /* in */ const QCString &fileName,
- /* in */ int lineNr,
- /* in */ bool isBrief,
- /* in */ bool isJavaDocStyle,
- /* in,out */ Protection &prot,
- /* in,out */ int &position,
- /* out */ bool &newEntryNeeded
- )
-{
- //fprintf(stderr,"parseCommentBlock() isBrief=%d isJavaDocStyle=%d lineNr=%d\n",
- // isBrief,isJavaDocStyle,lineNr);
-
- initParser();
- guards.setAutoDelete(TRUE);
- guards.clear();
- langParser = parser;
- current = curEntry;
- inputString = comment;
- if (inputString==0) return FALSE; // avoid empty strings
- inputPosition = position;
- yyLineNr = lineNr;
- yyFileName = fileName;
- protection = prot;
- needNewEntry = FALSE;
- xrefKind = XRef_None;
- xrefAppendFlag = FALSE;
- insidePre = FALSE;
- parseMore = FALSE;
- outputXRef.resize(0);
- setOutput( isBrief || isJavaDocStyle ? OutputBrief : OutputDoc );
- briefEndsAtDot = isJavaDocStyle;
- commentScanYYrestart( commentScanYYin );
- BEGIN( Comment );
- commentScanYYlex();
- setOutput( OutputDoc );
-
- if (!guards.isEmpty())
- {
- warn(yyFileName,yyLineNr,"Documentation block ended in the middle of a conditional section!");
- }
-
- current->doc=stripLeadingAndTrailingEmptyLines(current->doc);
-
- if (current->section==Entry::FILEDOC_SEC && current->doc.isEmpty())
- {
- // to allow a comment block with just a @file command.
- current->doc="\n\n";
- }
-
- if (current->section==Entry::MEMBERGRP_SEC &&
- g_memberGroupId==DOX_NOGROUP) // @name section but no group started yet
- {
- openGroup(current,yyFileName,yyLineNr);
- }
-
- Debug::print(Debug::CommentScan,0,"CommentScanner\n%s:%d\n"
- "input=[%s]\nbrief=[%s]\ndocs=[%s]\n------------\n",
- fileName.data(),lineNr,comment.data(),
- current->brief.data(),current->doc.data()
- );
-
- checkFormula();
- prot = protection;
-
- groupAddDocs(curEntry,fileName);
-
- newEntryNeeded = needNewEntry;
-
- if (parseMore) position=inputPosition; else position=0;
-
- return parseMore;
-}
-
-//---------------------------------------------------------------------------
-
-void groupEnterFile(const char *,int)
-{
- g_autoGroupStack.setAutoDelete(TRUE);
- g_autoGroupStack.clear();
- g_memberGroupId = DOX_NOGROUP;
- g_memberGroupDocs.resize(0);
- g_memberGroupRelates.resize(0);
-}
-
-void groupLeaveFile(const char *fileName,int line)
-{
- //if (g_memberGroupId!=DOX_NOGROUP)
- //{
- // warn(fileName,line,"Warning: end of file while inside a member group\n");
- //}
- g_memberGroupId=DOX_NOGROUP;
- g_memberGroupRelates.resize(0);
- g_memberGroupDocs.resize(0);
- if (!g_autoGroupStack.isEmpty())
- {
- warn(fileName,line,"Warning: end of file while inside a group\n");
- }
-}
-
-void groupEnterCompound(const char *fileName,int line,const char *name)
-{
- if (g_memberGroupId!=DOX_NOGROUP)
- {
- warn(fileName,line,"Warning: try to put compound %s inside a member group\n",name);
- }
- g_memberGroupId=DOX_NOGROUP;
- g_memberGroupRelates.resize(0);
- g_memberGroupDocs.resize(0);
-}
-
-void groupLeaveCompound(const char *,int,const char *)
-{
- //if (g_memberGroupId!=DOX_NOGROUP)
- //{
- // warn(fileName,line,"Warning: end of compound %s while inside a member group\n",name);
- //}
- g_memberGroupId=DOX_NOGROUP;
- g_memberGroupRelates.resize(0);
- g_memberGroupDocs.resize(0);
-}
-
-
-void closeGroup(Entry *e,const char *fileName,int)
-{
- //printf("==> closeGroup(name=%s,sec=%x) g_autoGroupStack=%d\n",
- // e->name.data(),e->section,g_autoGroupStack.count());
- if (g_memberGroupId!=DOX_NOGROUP) // end of member group
- {
- MemberGroupInfo *info=Doxygen::memGrpInfoDict.find(g_memberGroupId);
- if (info) // know group
- {
- info->doc = g_memberGroupDocs;
- info->docFile = fileName;
- }
- g_memberGroupId=DOX_NOGROUP;
- g_memberGroupRelates.resize(0);
- g_memberGroupDocs.resize(0);
- e->mGrpId=DOX_NOGROUP;
- //printf("new group id=%d\n",g_memberGroupId);
- }
- else if (!g_autoGroupStack.isEmpty()) // end of auto group
- {
- Grouping *grp = g_autoGroupStack.pop();
- e->groups->removeLast();
- delete grp;
- }
-}
-
-void openGroup(Entry *e,const char *,int)
-{
- //printf("==> openGroup(name=%s,sec=%x)\n",e->name.data(),e->section);
- if (e->section==Entry::GROUPDOC_SEC) // auto group
- {
- g_autoGroupStack.push(new Grouping(e->name,e->groupingPri()));
- }
- else // start of a member group
- {
- if (g_memberGroupId==DOX_NOGROUP) // no group started yet
- {
- static int curGroupId=0;
- g_memberGroupId = curGroupId++;
- //printf("new group id=%d header=%s\n",g_memberGroupId,g_memberGroupHeader.data());
-
- MemberGroupInfo *info = new MemberGroupInfo;
- info->header = g_memberGroupHeader.stripWhiteSpace();
- Doxygen::memGrpInfoDict.insert(g_memberGroupId,info);
-
- g_memberGroupRelates = e->relates;
- e->mGrpId = g_memberGroupId;
- }
- //else
- //{
- // warn(fileName,line,"Warning: member groups cannot be nested. Ending current group!\n");
- // closeGroup(e,fileName,line);
- //}
- }
-}
-
-void initGroupInfo(Entry *e)
-{
- e->mGrpId = g_memberGroupId;
- e->relates = g_memberGroupRelates;
- if (!g_autoGroupStack.isEmpty())
- {
- //printf("Appending group %s to %s\n",g_autoGroupStack.top()->groupname.data(),e->name.data());
- e->groups->append(new Grouping(*g_autoGroupStack.top()));
- }
-}
-
-static void groupAddDocs(Entry *e,const char *fileName)
-{
- if (e->section==Entry::MEMBERGRP_SEC)
- {
- g_memberGroupDocs=e->brief.stripWhiteSpace();
- e->doc = stripLeadingAndTrailingEmptyLines(e->doc);
- if (!g_memberGroupDocs.isEmpty() && !e->doc.isEmpty())
- {
- g_memberGroupDocs+="\n\n";
- }
- g_memberGroupDocs+=e->doc;
- MemberGroupInfo *info=Doxygen::memGrpInfoDict.find(g_memberGroupId);
- if (info)
- {
- info->doc = g_memberGroupDocs;
- info->docFile = fileName;
- }
- e->doc.resize(0);
- e->brief.resize(0);
- }
-}
-
-
-#if !defined(YY_FLEX_SUBMINOR_VERSION)
-//----------------------------------------------------------------------------
-extern "C" { // some bogus code to keep the compiler happy
- void commentScanYYdummy() { yy_flex_realloc(0,0); }
-}
-#endif
-
diff --git a/src/compound.xsd b/src/compound.xsd
deleted file mode 100644
index 2e3ec01..0000000
--- a/src/compound.xsd
+++ /dev/null
@@ -1,774 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- <xsd:element name="doxygen" type="DoxygenType"/>
-
- <!-- Complex types -->
-
- <xsd:complexType name="DoxygenType">
- <xsd:sequence maxOccurs="unbounded">
- <xsd:element name="compounddef" type="compounddefType" minOccurs="0" />
- </xsd:sequence>
- <xsd:attribute name="version" type="DoxVersionNumber" use="required" />
- </xsd:complexType>
-
- <xsd:complexType name="compounddefType">
- <xsd:sequence>
- <xsd:element name="compoundname" type="xsd:string"/>
- <xsd:element name="title" type="xsd:string" minOccurs="0" />
- <xsd:element name="basecompoundref" type="compoundRefType" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="derivedcompoundref" type="compoundRefType" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="includes" type="incType" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="includedby" type="incType" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="incdepgraph" type="graphType" minOccurs="0" />
- <xsd:element name="invincdepgraph" type="graphType" minOccurs="0" />
- <xsd:element name="innerdir" type="refType" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="innerfile" type="refType" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="innerclass" type="refType" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="innernamespace" type="refType" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="innerpage" type="refType" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="innergroup" type="refType" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="templateparamlist" type="templateparamlistType" minOccurs="0" />
- <xsd:element name="sectiondef" type="sectiondefType" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="briefdescription" type="descriptionType" minOccurs="0" />
- <xsd:element name="detaileddescription" type="descriptionType" minOccurs="0" />
- <xsd:element name="inheritancegraph" type="graphType" minOccurs="0" />
- <xsd:element name="collaborationgraph" type="graphType" minOccurs="0" />
- <xsd:element name="programlisting" type="listingType" minOccurs="0" />
- <xsd:element name="location" type="locationType" minOccurs="0" />
- <xsd:element name="listofallmembers" type="listofallmembersType" minOccurs="0" />
- </xsd:sequence>
- <xsd:attribute name="id" type="xsd:string" />
- <xsd:attribute name="kind" type="DoxCompoundKind" />
- <xsd:attribute name="prot" type="DoxProtectionKind" />
- </xsd:complexType>
-
- <xsd:complexType name="listofallmembersType">
- <xsd:sequence>
- <xsd:element name="member" type="memberRefType" minOccurs="0" maxOccurs="unbounded" />
- </xsd:sequence>
- </xsd:complexType>
-
- <xsd:complexType name="memberRefType">
- <xsd:sequence>
- <xsd:element name="scope" />
- <xsd:element name="name" />
- </xsd:sequence>
- <xsd:attribute name="refid" type="xsd:string" />
- <xsd:attribute name="prot" type="DoxProtectionKind" />
- <xsd:attribute name="virt" type="DoxVirtualKind" />
- <xsd:attribute name="ambiguityscope" type="xsd:string" />
- </xsd:complexType>
-
- <xsd:complexType name="compoundRefType" mixed="true">
- <xsd:simpleContent>
- <xsd:extension base="xsd:string">
- <xsd:attribute name="refid" type="xsd:string" use="optional" />
- <xsd:attribute name="prot" type="DoxProtectionKind" />
- <xsd:attribute name="virt" type="DoxVirtualKind" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
- <xsd:complexType name="reimplementType" mixed="true">
- <xsd:simpleContent>
- <xsd:extension base="xsd:string">
- <xsd:attribute name="refid" type="xsd:string" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
- <xsd:complexType name="incType" mixed="true">
- <xsd:simpleContent>
- <xsd:extension base="xsd:string">
- <xsd:attribute name="refid" type="xsd:string" />
- <xsd:attribute name="local" type="DoxBool" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
- <xsd:complexType name="refType" mixed="true">
- <xsd:simpleContent>
- <xsd:extension base="xsd:string">
- <xsd:attribute name="refid" type="xsd:string" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
- <xsd:complexType name="refTextType" mixed="true">
- <xsd:simpleContent>
- <xsd:extension base="xsd:string">
- <xsd:attribute name="refid" type="xsd:string" />
- <xsd:attribute name="kindref" type="DoxRefKind" />
- <xsd:attribute name="external" type="xsd:string" />
- </xsd:extension>
- </xsd:simpleContent>
- </xsd:complexType>
-
- <xsd:complexType name="sectiondefType">
- <xsd:sequence>
- <xsd:element name="header" type="xsd:string" minOccurs="0" />
- <xsd:element name="description" type="descriptionType" minOccurs="0" />
- <xsd:element name="memberdef" type="memberdefType" maxOccurs="unbounded" />
- </xsd:sequence>
- <xsd:attribute name="kind" type="DoxSectionKind" />
- </xsd:complexType>
-
- <xsd:complexType name="memberdefType">
- <xsd:sequence>
- <xsd:element name="templateparamlist" type="templateparamlistType" minOccurs="0" />
- <xsd:element name="type" type="linkedTextType" minOccurs="0" />
- <xsd:element name="definition" minOccurs="0" />
- <xsd:element name="argsstring" minOccurs="0" />
- <xsd:element name="name" />
- <xsd:element name="read" minOccurs="0" />
- <xsd:element name="write" minOccurs="0" />
- <xsd:element name="reimplements" type="reimplementType" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="reimplementedby" type="reimplementType" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="param" type="paramType" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="enumvalue" type="enumvalueType" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="initializer" type="linkedTextType" minOccurs="0" />
- <xsd:element name="exceptions" type="linkedTextType" minOccurs="0" />
- <xsd:element name="briefdescription" type="descriptionType" minOccurs="0" />
- <xsd:element name="detaileddescription" type="descriptionType" minOccurs="0" />
- <xsd:element name="inbodydescription" type="descriptionType" minOccurs="0" />
- <xsd:element name="location" type="locationType" />
- <xsd:element name="references" type="referenceType" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="referencedby" type="referenceType" minOccurs="0" maxOccurs="unbounded" />
- </xsd:sequence>
- <xsd:attribute name="kind" type="DoxMemberKind" />
- <xsd:attribute name="id" type="xsd:string" />
- <xsd:attribute name="prot" type="DoxProtectionKind" />
- <xsd:attribute name="static" type="DoxBool" />
- <xsd:attribute name="const" type="DoxBool" />
- <xsd:attribute name="explicit" type="DoxBool" />
- <xsd:attribute name="inline" type="DoxBool" />
- <xsd:attribute name="virt" type="DoxVirtualKind" />
- <xsd:attribute name="volatile" type="DoxBool" />
- <xsd:attribute name="mutable" type="DoxBool" />
- <xsd:attribute name="readable" type="DoxBool" use="optional"/>
- <xsd:attribute name="writable" type="DoxBool" use="optional"/>
- </xsd:complexType>
-
- <xsd:complexType name="descriptionType" mixed="true">
- <xsd:sequence>
- <xsd:element name="title" type="xsd:string" minOccurs="0"/>
- <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="sect1" type="docSect1Type" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="internal" type="docInternalType" minOccurs="0" />
- </xsd:sequence>
- </xsd:complexType>
-
- <xsd:complexType name="enumvalueType" mixed="true">
- <xsd:sequence>
- <xsd:element name="name" />
- <xsd:element name="initializer" type="linkedTextType" minOccurs="0" />
- <xsd:element name="briefdescription" type="descriptionType" minOccurs="0" />
- <xsd:element name="detaileddescription" type="descriptionType" minOccurs="0" />
- </xsd:sequence>
- <xsd:attribute name="id" type="xsd:string" />
- <xsd:attribute name="prot" type="DoxProtectionKind" />
- </xsd:complexType>
-
- <xsd:complexType name="templateparamlistType">
- <xsd:sequence>
- <xsd:element name="param" type="paramType" minOccurs="0" maxOccurs="unbounded" />
- </xsd:sequence>
- </xsd:complexType>
-
- <xsd:complexType name="paramType">
- <xsd:sequence>
- <xsd:element name="type" type="linkedTextType" minOccurs="0" />
- <xsd:element name="declname" minOccurs="0" />
- <xsd:element name="defname" minOccurs="0" />
- <xsd:element name="array" minOccurs="0" />
- <xsd:element name="defval" type="linkedTextType" minOccurs="0" />
- <xsd:element name="briefdescription" type="descriptionType" minOccurs="0" />
- </xsd:sequence>
- </xsd:complexType>
-
- <xsd:complexType name="linkedTextType" mixed="true">
- <xsd:sequence>
- <xsd:element name="ref" type="refTextType" minOccurs="0" maxOccurs="unbounded" />
- </xsd:sequence>
- </xsd:complexType>
-
- <xsd:complexType name="graphType">
- <xsd:sequence>
- <xsd:element name="node" type="nodeType" maxOccurs="unbounded" />
- </xsd:sequence>
- </xsd:complexType>
-
- <xsd:complexType name="nodeType">
- <xsd:sequence>
- <xsd:element name="label" />
- <xsd:element name="link" type="linkType" minOccurs="0" />
- <xsd:element name="childnode" type="childnodeType" minOccurs="0" maxOccurs="unbounded" />
- </xsd:sequence>
- <xsd:attribute name="id" type="xsd:string" />
- </xsd:complexType>
-
- <xsd:complexType name="childnodeType">
- <xsd:sequence>
- <xsd:element name="edgelabel" minOccurs="0" maxOccurs="unbounded"/>
- </xsd:sequence>
- <xsd:attribute name="refid" type="xsd:string" />
- <xsd:attribute name="relation" type="DoxGraphRelation" />
- </xsd:complexType>
-
- <xsd:complexType name="linkType">
- <xsd:attribute name="refid" type="xsd:string" />
- <xsd:attribute name="external" type="xsd:string" use="optional"/>
- </xsd:complexType>
-
- <xsd:complexType name="listingType">
- <xsd:sequence>
- <xsd:element name="codeline" type="codelineType" minOccurs="0" maxOccurs="unbounded" />
- </xsd:sequence>
- </xsd:complexType>
-
- <xsd:complexType name="codelineType">
- <xsd:sequence>
- <xsd:element name="highlight" type="highlightType" minOccurs="0" maxOccurs="unbounded" />
- </xsd:sequence>
- <xsd:attribute name="lineno" type="xsd:integer" />
- <xsd:attribute name="refid" type="xsd:string" />
- <xsd:attribute name="refkind" type="DoxRefKind" />
- <xsd:attribute name="external" type="DoxBool" />
- </xsd:complexType>
-
- <xsd:complexType name="highlightType" mixed="true">
- <xsd:choice minOccurs="0" maxOccurs="unbounded">
- <xsd:element name="sp" />
- <xsd:element name="ref" type="refTextType" />
- </xsd:choice>
- <xsd:attribute name="class" type="DoxHighlightClass" />
- </xsd:complexType>
-
- <xsd:complexType name="referenceType" mixed="true">
- <xsd:attribute name="refid" type="xsd:string" />
- <xsd:attribute name="compoundref" type="xsd:string" use="optional" />
- <xsd:attribute name="startline" type="xsd:integer" />
- <xsd:attribute name="endline" type="xsd:integer" />
- </xsd:complexType>
-
- <xsd:complexType name="locationType">
- <xsd:attribute name="file" type="xsd:string" />
- <xsd:attribute name="line" type="xsd:integer" />
- <xsd:attribute name="bodyfile" type="xsd:string" />
- <xsd:attribute name="bodystart" type="xsd:integer" />
- <xsd:attribute name="bodyend" type="xsd:integer" />
- </xsd:complexType>
-
- <xsd:complexType name="docSect1Type" mixed="true">
- <xsd:sequence>
- <xsd:element name="title" type="xsd:string" />
- <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="sect2" type="docSect2Type" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="internal" type="docInternalS1Type" minOccurs="0" />
- </xsd:sequence>
- <xsd:attribute name="id" type="xsd:string" />
- </xsd:complexType>
-
- <xsd:complexType name="docSect2Type" mixed="true">
- <xsd:sequence>
- <xsd:element name="title" type="xsd:string" />
- <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="sect3" type="docSect3Type" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="internal" type="docInternalS2Type" minOccurs="0" />
- </xsd:sequence>
- <xsd:attribute name="id" type="xsd:string" />
- </xsd:complexType>
-
- <xsd:complexType name="docSect3Type" mixed="true">
- <xsd:sequence>
- <xsd:element name="title" type="xsd:string" />
- <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="sect4" type="docSect4Type" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="internal" type="docInternalS3Type" minOccurs="0" />
- </xsd:sequence>
- <xsd:attribute name="id" type="xsd:string" />
- </xsd:complexType>
-
- <xsd:complexType name="docSect4Type" mixed="true">
- <xsd:sequence>
- <xsd:element name="title" type="xsd:string" />
- <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="internal" type="docInternalS4Type" minOccurs="0" />
- </xsd:sequence>
- <xsd:attribute name="id" type="xsd:string" />
- </xsd:complexType>
-
- <xsd:complexType name="docInternalType" mixed="true">
- <xsd:sequence>
- <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="sect1" type="docSect1Type" minOccurs="0" maxOccurs="unbounded" />
- </xsd:sequence>
- </xsd:complexType>
-
- <xsd:complexType name="docInternalS1Type" mixed="true">
- <xsd:sequence>
- <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="sect2" type="docSect2Type" minOccurs="0" maxOccurs="unbounded" />
- </xsd:sequence>
- </xsd:complexType>
-
- <xsd:complexType name="docInternalS2Type" mixed="true">
- <xsd:sequence>
- <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="sect3" type="docSect3Type" minOccurs="0" maxOccurs="unbounded" />
- </xsd:sequence>
- </xsd:complexType>
-
- <xsd:complexType name="docInternalS3Type" mixed="true">
- <xsd:sequence>
- <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="sect3" type="docSect4Type" minOccurs="0" maxOccurs="unbounded" />
- </xsd:sequence>
- </xsd:complexType>
-
- <xsd:complexType name="docInternalS4Type" mixed="true">
- <xsd:sequence>
- <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
- </xsd:sequence>
- </xsd:complexType>
-
- <xsd:group name="docTitleCmdGroup">
- <xsd:choice>
- <xsd:element name="ulink" type="docURLLink" />
- <xsd:element name="bold" type="docMarkupType" />
- <xsd:element name="emphasis" type="docMarkupType" />
- <xsd:element name="computeroutput" type="docMarkupType" />
- <xsd:element name="subscript" type="docMarkupType" />
- <xsd:element name="superscript" type="docMarkupType" />
- <xsd:element name="center" type="docMarkupType" />
- <xsd:element name="small" type="docMarkupType" />
- <xsd:element name="htmlonly" type="xsd:string" />
- <xsd:element name="latexonly" type="xsd:string" />
- <xsd:element name="dot" type="xsd:string" />
- <xsd:element name="anchor" type="docAnchorType" />
- <xsd:element name="formula" type="docFormulaType" />
- <xsd:element name="ref" type="docRefTextType" />
- <xsd:element name="copy" type="docEmptyType" />
- <xsd:element name="trademark" type="docEmptyType" />
- <xsd:element name="registered" type="docEmptyType" />
- <xsd:element name="umlaut" type="docCharType" />
- <xsd:element name="acute" type="docCharType" />
- <xsd:element name="grave" type="docCharType" />
- <xsd:element name="circ" type="docCharType" />
- <xsd:element name="slash" type="docCharType" />
- <xsd:element name="tilde" type="docCharType" />
- <xsd:element name="cedil" type="docCharType" />
- <xsd:element name="ring" type="docCharType" />
- <xsd:element name="szlig" type="docEmptyType" />
- <xsd:element name="nonbreakablespace" type="docEmptyType" />
- </xsd:choice>
- </xsd:group>
-
- <xsd:complexType name="docTitleType" mixed="true">
- <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
- </xsd:complexType>
-
- <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" />
- <xsd:element name="verbatim" type="xsd:string" />
- <xsd:element name="indexentry" type="docIndexEntryType" />
- <xsd:element name="orderedlist" type="docListType" />
- <xsd:element name="itemizedlist" type="docListType" />
- <xsd:element name="simplesect" type="docSimpleSectType" />
- <xsd:element name="title" type="docTitleType" />
- <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="docDotFileType" />
- <xsd:element name="toclist" type="docTocListType" />
- <xsd:element name="language" type="docLanguageType" />
- <xsd:element name="parameterlist" type="docParamListType" />
- <xsd:element name="xrefsect" type="docXRefSectType" />
- <xsd:element name="copydoc" type="docCopyType" />
- </xsd:choice>
- </xsd:group>
-
- <xsd:complexType name="docParaType" mixed="true">
- <xsd:group ref="docCmdGroup" minOccurs="0" maxOccurs="unbounded" />
- </xsd:complexType>
-
- <xsd:complexType name="docMarkupType" mixed="true">
- <xsd:group ref="docCmdGroup" minOccurs="0" maxOccurs="unbounded" />
- </xsd:complexType>
-
- <xsd:complexType name="docURLLink" mixed="true">
- <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
- <xsd:attribute name="url" type="xsd:string" />
- </xsd:complexType>
-
- <xsd:complexType name="docAnchorType" mixed="true">
- <xsd:attribute name="id" type="xsd:string" />
- </xsd:complexType>
-
- <xsd:complexType name="docFormulaType" mixed="true">
- <xsd:attribute name="id" type="xsd:string" />
- </xsd:complexType>
-
- <xsd:complexType name="docIndexEntryType">
- <xsd:sequence>
- <xsd:element name="primaryie" type="xsd:string" />
- <xsd:element name="secondaryie" type="xsd:string" />
- </xsd:sequence>
- </xsd:complexType>
-
- <xsd:complexType name="docListType">
- <xsd:sequence>
- <xsd:element name="listitem" type="docListItemType" maxOccurs="unbounded" />
- </xsd:sequence>
- </xsd:complexType>
-
- <xsd:complexType name="docListItemType">
- <xsd:sequence>
- <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
- </xsd:sequence>
- </xsd:complexType>
-
- <xsd:complexType name="docSimpleSectType">
- <xsd:sequence>
- <xsd:element name="title" type="docTitleType" minOccurs="0" />
- <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
- </xsd:sequence>
- <xsd:attribute name="kind" type="DoxSimpleSectKind" />
- </xsd:complexType>
-
- <xsd:complexType name="docVarListEntryType">
- <xsd:sequence>
- <xsd:element name="term" type="docTitleType" />
- </xsd:sequence>
- </xsd:complexType>
-
- <xsd:group name="docVariableListGroup">
- <xsd:sequence>
- <xsd:element name="varlistentry" type="docVarListEntryType" />
- <xsd:element name="listitem" type="docListItemType" />
- </xsd:sequence>
- </xsd:group>
-
- <xsd:complexType name="docVariableListType">
- <xsd:sequence>
- <xsd:group ref="docVariableListGroup" maxOccurs="unbounded" />
- </xsd:sequence>
- </xsd:complexType>
-
- <xsd:complexType name="docRefTextType" mixed="true">
- <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
- <xsd:attribute name="refid" type="xsd:string" />
- <xsd:attribute name="kindref" type="DoxRefKind" />
- <xsd:attribute name="external" type="xsd:string" />
- </xsd:complexType>
-
- <xsd:complexType name="docTableType">
- <xsd:sequence>
- <xsd:element name="row" type="docRowType" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="caption" type="docCaptionType" minOccurs="0" />
- </xsd:sequence>
- <xsd:attribute name="rows" type="xsd:integer" />
- <xsd:attribute name="cols" type="xsd:integer" />
- </xsd:complexType>
-
- <xsd:complexType name="docRowType">
- <xsd:sequence>
- <xsd:element name="entry" type="docEntryType" minOccurs="0" maxOccurs="unbounded" />
- </xsd:sequence>
- </xsd:complexType>
-
- <xsd:complexType name="docEntryType">
- <xsd:sequence>
- <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
- </xsd:sequence>
- <xsd:attribute name="thead" type="DoxBool" />
- </xsd:complexType>
-
- <xsd:complexType name="docCaptionType" mixed="true">
- <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
- </xsd:complexType>
-
- <xsd:complexType name="docHeadingType" mixed="true">
- <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
- <xsd:attribute name="level" type="xsd:integer" /> <!-- todo: range 1-6 -->
- </xsd:complexType>
-
- <xsd:complexType name="docImageType" mixed="true">
- <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
- <xsd:attribute name="type" type="DoxImageKind" />
- <xsd:attribute name="name" type="xsd:string" />
- <xsd:attribute name="width" type="xsd:string" />
- <xsd:attribute name="height" type="xsd:string" />
- </xsd:complexType>
-
- <xsd:complexType name="docDotFileType" mixed="true">
- <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
- <xsd:attribute name="name" type="xsd:string" />
- </xsd:complexType>
-
- <xsd:complexType name="docTocItemType" mixed="true">
- <xsd:group ref="docTitleCmdGroup" minOccurs="0" maxOccurs="unbounded" />
- <xsd:attribute name="id" type="xsd:string" />
- </xsd:complexType>
-
- <xsd:complexType name="docTocListType">
- <xsd:sequence>
- <xsd:element name="tocitem" type="docTocItemType" minOccurs="0" maxOccurs="unbounded" />
- </xsd:sequence>
- </xsd:complexType>
-
- <xsd:complexType name="docLanguageType">
- <xsd:sequence>
- <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
- </xsd:sequence>
- <xsd:attribute name="langid" type="xsd:string" />
- </xsd:complexType>
-
- <xsd:complexType name="docParamListType">
- <xsd:sequence>
- <xsd:element name="parameteritem" type="docParamListItem" minOccurs="0" maxOccurs="unbounded" />
- </xsd:sequence>
- <xsd:attribute name="kind" type="DoxParamListKind" />
- </xsd:complexType>
-
- <xsd:complexType name="docParamListItem">
- <xsd:sequence>
- <xsd:element name="parameternamelist" type="docParamNameList" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="parameterdescription" type="descriptionType" />
- </xsd:sequence>
- </xsd:complexType>
-
- <xsd:complexType name="docParamNameList">
- <xsd:sequence>
- <xsd:element name="parametername" type="docParamName" minOccurs="0" maxOccurs="unbounded" />
- </xsd:sequence>
- </xsd:complexType>
-
- <xsd:complexType name="docParamName" mixed="true">
- <xsd:sequence>
- <xsd:element name="ref" type="refTextType" minOccurs="0" maxOccurs="1" />
- </xsd:sequence>
- <xsd:attribute name="direction" type="DoxParamDir" use="optional" />
- </xsd:complexType>
-
- <xsd:complexType name="docXRefSectType">
- <xsd:sequence>
- <xsd:element name="xreftitle" type="xsd:string" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="xrefdescription" type="descriptionType" />
- </xsd:sequence>
- <xsd:attribute name="id" type="xsd:string" />
- </xsd:complexType>
-
- <xsd:complexType name="docCopyType">
- <xsd:sequence>
- <xsd:element name="para" type="docParaType" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="sect1" type="docSect1Type" minOccurs="0" maxOccurs="unbounded" />
- <xsd:element name="internal" type="docInternalType" minOccurs="0" />
- </xsd:sequence>
- <xsd:attribute name="link" type="xsd:string" />
- </xsd:complexType>
-
- <xsd:complexType name="docCharType">
- <xsd:attribute name="char" type="DoxCharRange"/>
- </xsd:complexType>
-
- <xsd:complexType name="docEmptyType"/>
-
- <!-- Simple types -->
-
- <xsd:simpleType name="DoxBool">
- <xsd:restriction base="xsd:string">
- <xsd:enumeration value="yes" />
- <xsd:enumeration value="no" />
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:simpleType name="DoxGraphRelation">
- <xsd:restriction base="xsd:string">
- <xsd:enumeration value="include" />
- <xsd:enumeration value="usage" />
- <xsd:enumeration value="template-instance" />
- <xsd:enumeration value="public-inheritance" />
- <xsd:enumeration value="protected-inheritance" />
- <xsd:enumeration value="private-inheritance" />
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:simpleType name="DoxRefKind">
- <xsd:restriction base="xsd:string">
- <xsd:enumeration value="compound" />
- <xsd:enumeration value="member" />
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:simpleType name="DoxMemberKind">
- <xsd:restriction base="xsd:string">
- <xsd:enumeration value="define" />
- <xsd:enumeration value="property" />
- <xsd:enumeration value="event" />
- <xsd:enumeration value="variable" />
- <xsd:enumeration value="typedef" />
- <xsd:enumeration value="enum" />
- <xsd:enumeration value="function" />
- <xsd:enumeration value="signal" />
- <xsd:enumeration value="prototype" />
- <xsd:enumeration value="friend" />
- <xsd:enumeration value="dcop" />
- <xsd:enumeration value="slot" />
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:simpleType name="DoxProtectionKind">
- <xsd:restriction base="xsd:string">
- <xsd:enumeration value="public" />
- <xsd:enumeration value="protected" />
- <xsd:enumeration value="private" />
- <xsd:enumeration value="package" />
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:simpleType name="DoxVirtualKind">
- <xsd:restriction base="xsd:string">
- <xsd:enumeration value="non-virtual" />
- <xsd:enumeration value="virtual" />
- <xsd:enumeration value="pure-virtual" />
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:simpleType name="DoxCompoundKind">
- <xsd:restriction base="xsd:string">
- <xsd:enumeration value="class" />
- <xsd:enumeration value="struct" />
- <xsd:enumeration value="union" />
- <xsd:enumeration value="interface" />
- <xsd:enumeration value="protocol" />
- <xsd:enumeration value="category" />
- <xsd:enumeration value="exception" />
- <xsd:enumeration value="file" />
- <xsd:enumeration value="namespace" />
- <xsd:enumeration value="group" />
- <xsd:enumeration value="page" />
- <xsd:enumeration value="example" />
- <xsd:enumeration value="dir" />
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:simpleType name="DoxSectionKind">
- <xsd:restriction base="xsd:string">
- <xsd:enumeration value="user-defined" />
- <xsd:enumeration value="public-type" />
- <xsd:enumeration value="public-func" />
- <xsd:enumeration value="public-attrib" />
- <xsd:enumeration value="public-slot" />
- <xsd:enumeration value="signal" />
- <xsd:enumeration value="dcop-func" />
- <xsd:enumeration value="property" />
- <xsd:enumeration value="event" />
- <xsd:enumeration value="public-static-func" />
- <xsd:enumeration value="public-static-attrib" />
- <xsd:enumeration value="protected-type" />
- <xsd:enumeration value="protected-func" />
- <xsd:enumeration value="protected-attrib" />
- <xsd:enumeration value="protected-slot" />
- <xsd:enumeration value="protected-static-func" />
- <xsd:enumeration value="protected-static-attrib" />
- <xsd:enumeration value="package-type" />
- <xsd:enumeration value="package-func" />
- <xsd:enumeration value="package-attrib" />
- <xsd:enumeration value="package-static-func" />
- <xsd:enumeration value="package-static-attrib" />
- <xsd:enumeration value="private-type" />
- <xsd:enumeration value="private-func" />
- <xsd:enumeration value="private-attrib" />
- <xsd:enumeration value="private-slot" />
- <xsd:enumeration value="private-static-func" />
- <xsd:enumeration value="private-static-attrib" />
- <xsd:enumeration value="friend" />
- <xsd:enumeration value="related" />
- <xsd:enumeration value="define" />
- <xsd:enumeration value="prototype" />
- <xsd:enumeration value="typedef" />
- <xsd:enumeration value="enum" />
- <xsd:enumeration value="func" />
- <xsd:enumeration value="var" />
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:simpleType name="DoxHighlightClass">
- <xsd:restriction base="xsd:string">
- <xsd:enumeration value="comment" />
- <xsd:enumeration value="normal" />
- <xsd:enumeration value="preprocessor" />
- <xsd:enumeration value="keyword" />
- <xsd:enumeration value="keywordtype" />
- <xsd:enumeration value="keywordflow" />
- <xsd:enumeration value="stringliteral" />
- <xsd:enumeration value="charliteral" />
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:simpleType name="DoxSimpleSectKind">
- <xsd:restriction base="xsd:string">
- <xsd:enumeration value="see" />
- <xsd:enumeration value="return" />
- <xsd:enumeration value="author" />
- <xsd:enumeration value="authors" />
- <xsd:enumeration value="version" />
- <xsd:enumeration value="since" />
- <xsd:enumeration value="date" />
- <xsd:enumeration value="note" />
- <xsd:enumeration value="warning" />
- <xsd:enumeration value="pre" />
- <xsd:enumeration value="post" />
- <xsd:enumeration value="invariant" />
- <xsd:enumeration value="remark" />
- <xsd:enumeration value="attention" />
- <xsd:enumeration value="par" />
- <xsd:enumeration value="rcs" />
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:simpleType name="DoxVersionNumber">
- <xsd:restriction base="xsd:string">
- <xsd:pattern value="\d+\.\d+.*" />
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:simpleType name="DoxImageKind">
- <xsd:restriction base="xsd:string">
- <xsd:enumeration value="html" />
- <xsd:enumeration value="latex" />
- <xsd:enumeration value="rtf" />
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:simpleType name="DoxParamListKind">
- <xsd:restriction base="xsd:string">
- <xsd:enumeration value="param" />
- <xsd:enumeration value="retval" />
- <xsd:enumeration value="exception" />
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:simpleType name="DoxCharRange">
- <xsd:restriction base="xsd:string">
- <xsd:pattern value="[aeiouncAEIOUNC]" />
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:simpleType name="DoxParamDir">
- <xsd:restriction base="xsd:string">
- <xsd:enumeration value="in"/>
- <xsd:enumeration value="out"/>
- <xsd:enumeration value="inout"/>
- </xsd:restriction>
- </xsd:simpleType>
-
-</xsd:schema>
-
diff --git a/src/compound_xsd.h b/src/compound_xsd.h
deleted file mode 100644
index d2ba0bf..0000000
--- a/src/compound_xsd.h
+++ /dev/null
@@ -1,774 +0,0 @@
-"<?xml version='1.0' encoding='utf-8' ?>\n"
-"<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\n"
-" <xsd:element name=\"doxygen\" type=\"DoxygenType\"/>\n"
-"\n"
-" <!-- Complex types -->\n"
-"\n"
-" <xsd:complexType name=\"DoxygenType\">\n"
-" <xsd:sequence maxOccurs=\"unbounded\">\n"
-" <xsd:element name=\"compounddef\" type=\"compounddefType\" minOccurs=\"0\" />\n"
-" </xsd:sequence>\n"
-" <xsd:attribute name=\"version\" type=\"DoxVersionNumber\" use=\"required\" />\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"compounddefType\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"compoundname\" type=\"xsd:string\"/>\n"
-" <xsd:element name=\"title\" type=\"xsd:string\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"basecompoundref\" type=\"compoundRefType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"derivedcompoundref\" type=\"compoundRefType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"includes\" type=\"incType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"includedby\" type=\"incType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"incdepgraph\" type=\"graphType\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"invincdepgraph\" type=\"graphType\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"innerdir\" type=\"refType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"innerfile\" type=\"refType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"innerclass\" type=\"refType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"innernamespace\" type=\"refType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"innerpage\" type=\"refType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"innergroup\" type=\"refType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"templateparamlist\" type=\"templateparamlistType\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"sectiondef\" type=\"sectiondefType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"briefdescription\" type=\"descriptionType\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"detaileddescription\" type=\"descriptionType\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"inheritancegraph\" type=\"graphType\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"collaborationgraph\" type=\"graphType\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"programlisting\" type=\"listingType\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"location\" type=\"locationType\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"listofallmembers\" type=\"listofallmembersType\" minOccurs=\"0\" />\n"
-" </xsd:sequence>\n"
-" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n"
-" <xsd:attribute name=\"kind\" type=\"DoxCompoundKind\" />\n"
-" <xsd:attribute name=\"prot\" type=\"DoxProtectionKind\" />\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"listofallmembersType\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"member\" type=\"memberRefType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" </xsd:sequence>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"memberRefType\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"scope\" />\n"
-" <xsd:element name=\"name\" />\n"
-" </xsd:sequence>\n"
-" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n"
-" <xsd:attribute name=\"prot\" type=\"DoxProtectionKind\" />\n"
-" <xsd:attribute name=\"virt\" type=\"DoxVirtualKind\" />\n"
-" <xsd:attribute name=\"ambiguityscope\" type=\"xsd:string\" />\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"compoundRefType\" mixed=\"true\">\n"
-" <xsd:simpleContent>\n"
-" <xsd:extension base=\"xsd:string\">\n"
-" <xsd:attribute name=\"refid\" type=\"xsd:string\" use=\"optional\" />\n"
-" <xsd:attribute name=\"prot\" type=\"DoxProtectionKind\" />\n"
-" <xsd:attribute name=\"virt\" type=\"DoxVirtualKind\" />\n"
-" </xsd:extension>\n"
-" </xsd:simpleContent>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"reimplementType\" mixed=\"true\">\n"
-" <xsd:simpleContent>\n"
-" <xsd:extension base=\"xsd:string\">\n"
-" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n"
-" </xsd:extension>\n"
-" </xsd:simpleContent>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"incType\" mixed=\"true\">\n"
-" <xsd:simpleContent>\n"
-" <xsd:extension base=\"xsd:string\">\n"
-" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n"
-" <xsd:attribute name=\"local\" type=\"DoxBool\" />\n"
-" </xsd:extension>\n"
-" </xsd:simpleContent>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"refType\" mixed=\"true\">\n"
-" <xsd:simpleContent>\n"
-" <xsd:extension base=\"xsd:string\">\n"
-" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n"
-" </xsd:extension>\n"
-" </xsd:simpleContent>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"refTextType\" mixed=\"true\">\n"
-" <xsd:simpleContent>\n"
-" <xsd:extension base=\"xsd:string\">\n"
-" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n"
-" <xsd:attribute name=\"kindref\" type=\"DoxRefKind\" />\n"
-" <xsd:attribute name=\"external\" type=\"xsd:string\" />\n"
-" </xsd:extension>\n"
-" </xsd:simpleContent>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"sectiondefType\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"header\" type=\"xsd:string\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"description\" type=\"descriptionType\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"memberdef\" type=\"memberdefType\" maxOccurs=\"unbounded\" />\n"
-" </xsd:sequence>\n"
-" <xsd:attribute name=\"kind\" type=\"DoxSectionKind\" />\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"memberdefType\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"templateparamlist\" type=\"templateparamlistType\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"type\" type=\"linkedTextType\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"definition\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"argsstring\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"name\" />\n"
-" <xsd:element name=\"read\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"write\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"reimplements\" type=\"reimplementType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"reimplementedby\" type=\"reimplementType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"param\" type=\"paramType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"enumvalue\" type=\"enumvalueType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"initializer\" type=\"linkedTextType\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"exceptions\" type=\"linkedTextType\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"briefdescription\" type=\"descriptionType\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"detaileddescription\" type=\"descriptionType\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"inbodydescription\" type=\"descriptionType\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"location\" type=\"locationType\" />\n"
-" <xsd:element name=\"references\" type=\"referenceType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"referencedby\" type=\"referenceType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" </xsd:sequence>\n"
-" <xsd:attribute name=\"kind\" type=\"DoxMemberKind\" />\n"
-" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n"
-" <xsd:attribute name=\"prot\" type=\"DoxProtectionKind\" />\n"
-" <xsd:attribute name=\"static\" type=\"DoxBool\" />\n"
-" <xsd:attribute name=\"const\" type=\"DoxBool\" />\n"
-" <xsd:attribute name=\"explicit\" type=\"DoxBool\" />\n"
-" <xsd:attribute name=\"inline\" type=\"DoxBool\" />\n"
-" <xsd:attribute name=\"virt\" type=\"DoxVirtualKind\" />\n"
-" <xsd:attribute name=\"volatile\" type=\"DoxBool\" />\n"
-" <xsd:attribute name=\"mutable\" type=\"DoxBool\" />\n"
-" <xsd:attribute name=\"readable\" type=\"DoxBool\" use=\"optional\"/>\n"
-" <xsd:attribute name=\"writable\" type=\"DoxBool\" use=\"optional\"/>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"descriptionType\" mixed=\"true\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"title\" type=\"xsd:string\" minOccurs=\"0\"/> \n"
-" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"sect1\" type=\"docSect1Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"internal\" type=\"docInternalType\" minOccurs=\"0\" />\n"
-" </xsd:sequence>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"enumvalueType\" mixed=\"true\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"name\" />\n"
-" <xsd:element name=\"initializer\" type=\"linkedTextType\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"briefdescription\" type=\"descriptionType\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"detaileddescription\" type=\"descriptionType\" minOccurs=\"0\" />\n"
-" </xsd:sequence>\n"
-" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n"
-" <xsd:attribute name=\"prot\" type=\"DoxProtectionKind\" />\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"templateparamlistType\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"param\" type=\"paramType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" </xsd:sequence>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"paramType\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"type\" type=\"linkedTextType\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"declname\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"defname\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"array\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"defval\" type=\"linkedTextType\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"briefdescription\" type=\"descriptionType\" minOccurs=\"0\" />\n"
-" </xsd:sequence>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"linkedTextType\" mixed=\"true\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"ref\" type=\"refTextType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" </xsd:sequence>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"graphType\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"node\" type=\"nodeType\" maxOccurs=\"unbounded\" />\n"
-" </xsd:sequence>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"nodeType\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"label\" />\n"
-" <xsd:element name=\"link\" type=\"linkType\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"childnode\" type=\"childnodeType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" </xsd:sequence>\n"
-" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"childnodeType\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"edgelabel\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n"
-" </xsd:sequence>\n"
-" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n"
-" <xsd:attribute name=\"relation\" type=\"DoxGraphRelation\" />\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"linkType\">\n"
-" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n"
-" <xsd:attribute name=\"external\" type=\"xsd:string\" use=\"optional\"/>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"listingType\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"codeline\" type=\"codelineType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" </xsd:sequence>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"codelineType\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"highlight\" type=\"highlightType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" </xsd:sequence>\n"
-" <xsd:attribute name=\"lineno\" type=\"xsd:integer\" />\n"
-" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n"
-" <xsd:attribute name=\"refkind\" type=\"DoxRefKind\" />\n"
-" <xsd:attribute name=\"external\" type=\"DoxBool\" />\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"highlightType\" mixed=\"true\">\n"
-" <xsd:choice minOccurs=\"0\" maxOccurs=\"unbounded\">\n"
-" <xsd:element name=\"sp\" />\n"
-" <xsd:element name=\"ref\" type=\"refTextType\" />\n"
-" </xsd:choice>\n"
-" <xsd:attribute name=\"class\" type=\"DoxHighlightClass\" />\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"referenceType\" mixed=\"true\">\n"
-" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n"
-" <xsd:attribute name=\"compoundref\" type=\"xsd:string\" use=\"optional\" />\n"
-" <xsd:attribute name=\"startline\" type=\"xsd:integer\" />\n"
-" <xsd:attribute name=\"endline\" type=\"xsd:integer\" />\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"locationType\">\n"
-" <xsd:attribute name=\"file\" type=\"xsd:string\" />\n"
-" <xsd:attribute name=\"line\" type=\"xsd:integer\" />\n"
-" <xsd:attribute name=\"bodyfile\" type=\"xsd:string\" />\n"
-" <xsd:attribute name=\"bodystart\" type=\"xsd:integer\" />\n"
-" <xsd:attribute name=\"bodyend\" type=\"xsd:integer\" />\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docSect1Type\" mixed=\"true\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"title\" type=\"xsd:string\" /> \n"
-" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"sect2\" type=\"docSect2Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"internal\" type=\"docInternalS1Type\" minOccurs=\"0\" />\n"
-" </xsd:sequence>\n"
-" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docSect2Type\" mixed=\"true\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"title\" type=\"xsd:string\" /> \n"
-" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"sect3\" type=\"docSect3Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"internal\" type=\"docInternalS2Type\" minOccurs=\"0\" />\n"
-" </xsd:sequence>\n"
-" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docSect3Type\" mixed=\"true\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"title\" type=\"xsd:string\" /> \n"
-" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"sect4\" type=\"docSect4Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"internal\" type=\"docInternalS3Type\" minOccurs=\"0\" />\n"
-" </xsd:sequence>\n"
-" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docSect4Type\" mixed=\"true\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"title\" type=\"xsd:string\" /> \n"
-" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"internal\" type=\"docInternalS4Type\" minOccurs=\"0\" />\n"
-" </xsd:sequence>\n"
-" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docInternalType\" mixed=\"true\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"sect1\" type=\"docSect1Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" </xsd:sequence>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docInternalS1Type\" mixed=\"true\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"sect2\" type=\"docSect2Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" </xsd:sequence>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docInternalS2Type\" mixed=\"true\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"sect3\" type=\"docSect3Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" </xsd:sequence>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docInternalS3Type\" mixed=\"true\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"sect3\" type=\"docSect4Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" </xsd:sequence>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docInternalS4Type\" mixed=\"true\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" </xsd:sequence>\n"
-" </xsd:complexType>\n"
-" \n"
-" <xsd:group name=\"docTitleCmdGroup\">\n"
-" <xsd:choice>\n"
-" <xsd:element name=\"ulink\" type=\"docURLLink\" />\n"
-" <xsd:element name=\"bold\" type=\"docMarkupType\" />\n"
-" <xsd:element name=\"emphasis\" type=\"docMarkupType\" />\n"
-" <xsd:element name=\"computeroutput\" type=\"docMarkupType\" />\n"
-" <xsd:element name=\"subscript\" type=\"docMarkupType\" />\n"
-" <xsd:element name=\"superscript\" type=\"docMarkupType\" />\n"
-" <xsd:element name=\"center\" type=\"docMarkupType\" />\n"
-" <xsd:element name=\"small\" type=\"docMarkupType\" />\n"
-" <xsd:element name=\"htmlonly\" type=\"xsd:string\" />\n"
-" <xsd:element name=\"latexonly\" type=\"xsd:string\" />\n"
-" <xsd:element name=\"dot\" type=\"xsd:string\" />\n"
-" <xsd:element name=\"anchor\" type=\"docAnchorType\" />\n"
-" <xsd:element name=\"formula\" type=\"docFormulaType\" />\n"
-" <xsd:element name=\"ref\" type=\"docRefTextType\" />\n"
-" <xsd:element name=\"copy\" type=\"docEmptyType\" />\n"
-" <xsd:element name=\"trademark\" type=\"docEmptyType\" />\n"
-" <xsd:element name=\"registered\" type=\"docEmptyType\" />\n"
-" <xsd:element name=\"umlaut\" type=\"docCharType\" />\n"
-" <xsd:element name=\"acute\" type=\"docCharType\" />\n"
-" <xsd:element name=\"grave\" type=\"docCharType\" />\n"
-" <xsd:element name=\"circ\" type=\"docCharType\" />\n"
-" <xsd:element name=\"slash\" type=\"docCharType\" />\n"
-" <xsd:element name=\"tilde\" type=\"docCharType\" />\n"
-" <xsd:element name=\"cedil\" type=\"docCharType\" />\n"
-" <xsd:element name=\"ring\" type=\"docCharType\" />\n"
-" <xsd:element name=\"szlig\" type=\"docEmptyType\" />\n"
-" <xsd:element name=\"nonbreakablespace\" type=\"docEmptyType\" />\n"
-" </xsd:choice>\n"
-" </xsd:group>\n"
-"\n"
-" <xsd:complexType name=\"docTitleType\" mixed=\"true\">\n"
-" <xsd:group ref=\"docTitleCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:group name=\"docCmdGroup\">\n"
-" <xsd:choice>\n"
-" <xsd:group ref=\"docTitleCmdGroup\"/>\n"
-" <xsd:element name=\"linebreak\" type=\"docEmptyType\" />\n"
-" <xsd:element name=\"hruler\" type=\"docEmptyType\" />\n"
-" <xsd:element name=\"preformatted\" type=\"docMarkupType\" />\n"
-" <xsd:element name=\"programlisting\" type=\"listingType\" />\n"
-" <xsd:element name=\"verbatim\" type=\"xsd:string\" />\n"
-" <xsd:element name=\"indexentry\" type=\"docIndexEntryType\" />\n"
-" <xsd:element name=\"orderedlist\" type=\"docListType\" />\n"
-" <xsd:element name=\"itemizedlist\" type=\"docListType\" />\n"
-" <xsd:element name=\"simplesect\" type=\"docSimpleSectType\" />\n"
-" <xsd:element name=\"title\" type=\"docTitleType\" />\n"
-" <xsd:element name=\"variablelist\" type=\"docVariableListType\" />\n"
-" <xsd:element name=\"table\" type=\"docTableType\" />\n"
-" <xsd:element name=\"heading\" type=\"docHeadingType\" />\n"
-" <xsd:element name=\"image\" type=\"docImageType\" />\n"
-" <xsd:element name=\"dotfile\" type=\"docDotFileType\" />\n"
-" <xsd:element name=\"toclist\" type=\"docTocListType\" />\n"
-" <xsd:element name=\"language\" type=\"docLanguageType\" />\n"
-" <xsd:element name=\"parameterlist\" type=\"docParamListType\" />\n"
-" <xsd:element name=\"xrefsect\" type=\"docXRefSectType\" />\n"
-" <xsd:element name=\"copydoc\" type=\"docCopyType\" />\n"
-" </xsd:choice>\n"
-" </xsd:group>\n"
-"\n"
-" <xsd:complexType name=\"docParaType\" mixed=\"true\">\n"
-" <xsd:group ref=\"docCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docMarkupType\" mixed=\"true\">\n"
-" <xsd:group ref=\"docCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docURLLink\" mixed=\"true\">\n"
-" <xsd:group ref=\"docTitleCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:attribute name=\"url\" type=\"xsd:string\" />\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docAnchorType\" mixed=\"true\">\n"
-" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docFormulaType\" mixed=\"true\">\n"
-" <xsd:attribute name=\"id\" type=\"xsd:string\" />\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docIndexEntryType\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"primaryie\" type=\"xsd:string\" />\n"
-" <xsd:element name=\"secondaryie\" type=\"xsd:string\" />\n"
-" </xsd:sequence>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docListType\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"listitem\" type=\"docListItemType\" maxOccurs=\"unbounded\" />\n"
-" </xsd:sequence>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docListItemType\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" </xsd:sequence>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docSimpleSectType\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"title\" type=\"docTitleType\" minOccurs=\"0\" />\n"
-" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" </xsd:sequence>\n"
-" <xsd:attribute name=\"kind\" type=\"DoxSimpleSectKind\" />\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docVarListEntryType\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"term\" type=\"docTitleType\" />\n"
-" </xsd:sequence>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:group name=\"docVariableListGroup\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"varlistentry\" type=\"docVarListEntryType\" />\n"
-" <xsd:element name=\"listitem\" type=\"docListItemType\" />\n"
-" </xsd:sequence>\n"
-" </xsd:group>\n"
-"\n"
-" <xsd:complexType name=\"docVariableListType\">\n"
-" <xsd:sequence>\n"
-" <xsd:group ref=\"docVariableListGroup\" maxOccurs=\"unbounded\" />\n"
-" </xsd:sequence>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docRefTextType\" mixed=\"true\">\n"
-" <xsd:group ref=\"docTitleCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:attribute name=\"refid\" type=\"xsd:string\" />\n"
-" <xsd:attribute name=\"kindref\" type=\"DoxRefKind\" />\n"
-" <xsd:attribute name=\"external\" type=\"xsd:string\" />\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docTableType\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"row\" type=\"docRowType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"caption\" type=\"docCaptionType\" minOccurs=\"0\" />\n"
-" </xsd:sequence>\n"
-" <xsd:attribute name=\"rows\" type=\"xsd:integer\" />\n"
-" <xsd:attribute name=\"cols\" type=\"xsd:integer\" />\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docRowType\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"entry\" type=\"docEntryType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" </xsd:sequence>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docEntryType\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" </xsd:sequence>\n"
-" <xsd:attribute name=\"thead\" type=\"DoxBool\" />\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docCaptionType\" mixed=\"true\">\n"
-" <xsd:group ref=\"docTitleCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docHeadingType\" mixed=\"true\">\n"
-" <xsd:group ref=\"docTitleCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:attribute name=\"level\" type=\"xsd:integer\" /> <!-- todo: range 1-6 -->\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docImageType\" mixed=\"true\">\n"
-" <xsd:group ref=\"docTitleCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:attribute name=\"type\" type=\"DoxImageKind\" /> \n"
-" <xsd:attribute name=\"name\" type=\"xsd:string\" /> \n"
-" <xsd:attribute name=\"width\" type=\"xsd:string\" /> \n"
-" <xsd:attribute name=\"height\" type=\"xsd:string\" /> \n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docDotFileType\" mixed=\"true\">\n"
-" <xsd:group ref=\"docTitleCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:attribute name=\"name\" type=\"xsd:string\" /> \n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docTocItemType\" mixed=\"true\">\n"
-" <xsd:group ref=\"docTitleCmdGroup\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:attribute name=\"id\" type=\"xsd:string\" /> \n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docTocListType\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"tocitem\" type=\"docTocItemType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" </xsd:sequence>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docLanguageType\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" </xsd:sequence>\n"
-" <xsd:attribute name=\"langid\" type=\"xsd:string\" /> \n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docParamListType\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"parameteritem\" type=\"docParamListItem\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" </xsd:sequence>\n"
-" <xsd:attribute name=\"kind\" type=\"DoxParamListKind\" /> \n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docParamListItem\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"parameternamelist\" type=\"docParamNameList\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"parameterdescription\" type=\"descriptionType\" />\n"
-" </xsd:sequence>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docParamNameList\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"parametername\" type=\"docParamName\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" </xsd:sequence>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docParamName\" mixed=\"true\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"ref\" type=\"refTextType\" minOccurs=\"0\" maxOccurs=\"1\" />\n"
-" </xsd:sequence>\n"
-" <xsd:attribute name=\"direction\" type=\"DoxParamDir\" use=\"optional\" />\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docXRefSectType\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"xreftitle\" type=\"xsd:string\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"xrefdescription\" type=\"descriptionType\" />\n"
-" </xsd:sequence>\n"
-" <xsd:attribute name=\"id\" type=\"xsd:string\" /> \n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docCopyType\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"para\" type=\"docParaType\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"sect1\" type=\"docSect1Type\" minOccurs=\"0\" maxOccurs=\"unbounded\" />\n"
-" <xsd:element name=\"internal\" type=\"docInternalType\" minOccurs=\"0\" />\n"
-" </xsd:sequence>\n"
-" <xsd:attribute name=\"link\" type=\"xsd:string\" /> \n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docCharType\">\n"
-" <xsd:attribute name=\"char\" type=\"DoxCharRange\"/> \n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"docEmptyType\"/>\n"
-"\n"
-" <!-- Simple types -->\n"
-"\n"
-" <xsd:simpleType name=\"DoxBool\">\n"
-" <xsd:restriction base=\"xsd:string\">\n"
-" <xsd:enumeration value=\"yes\" />\n"
-" <xsd:enumeration value=\"no\" />\n"
-" </xsd:restriction>\n"
-" </xsd:simpleType>\n"
-"\n"
-" <xsd:simpleType name=\"DoxGraphRelation\">\n"
-" <xsd:restriction base=\"xsd:string\">\n"
-" <xsd:enumeration value=\"include\" />\n"
-" <xsd:enumeration value=\"usage\" />\n"
-" <xsd:enumeration value=\"template-instance\" />\n"
-" <xsd:enumeration value=\"public-inheritance\" />\n"
-" <xsd:enumeration value=\"protected-inheritance\" />\n"
-" <xsd:enumeration value=\"private-inheritance\" />\n"
-" </xsd:restriction>\n"
-" </xsd:simpleType>\n"
-"\n"
-" <xsd:simpleType name=\"DoxRefKind\">\n"
-" <xsd:restriction base=\"xsd:string\">\n"
-" <xsd:enumeration value=\"compound\" />\n"
-" <xsd:enumeration value=\"member\" />\n"
-" </xsd:restriction>\n"
-" </xsd:simpleType>\n"
-"\n"
-" <xsd:simpleType name=\"DoxMemberKind\">\n"
-" <xsd:restriction base=\"xsd:string\">\n"
-" <xsd:enumeration value=\"define\" />\n"
-" <xsd:enumeration value=\"property\" />\n"
-" <xsd:enumeration value=\"event\" />\n"
-" <xsd:enumeration value=\"variable\" />\n"
-" <xsd:enumeration value=\"typedef\" />\n"
-" <xsd:enumeration value=\"enum\" />\n"
-" <xsd:enumeration value=\"function\" />\n"
-" <xsd:enumeration value=\"signal\" />\n"
-" <xsd:enumeration value=\"prototype\" />\n"
-" <xsd:enumeration value=\"friend\" />\n"
-" <xsd:enumeration value=\"dcop\" />\n"
-" <xsd:enumeration value=\"slot\" />\n"
-" </xsd:restriction>\n"
-" </xsd:simpleType>\n"
-"\n"
-" <xsd:simpleType name=\"DoxProtectionKind\">\n"
-" <xsd:restriction base=\"xsd:string\">\n"
-" <xsd:enumeration value=\"public\" />\n"
-" <xsd:enumeration value=\"protected\" />\n"
-" <xsd:enumeration value=\"private\" />\n"
-" <xsd:enumeration value=\"package\" />\n"
-" </xsd:restriction>\n"
-" </xsd:simpleType>\n"
-"\n"
-" <xsd:simpleType name=\"DoxVirtualKind\">\n"
-" <xsd:restriction base=\"xsd:string\">\n"
-" <xsd:enumeration value=\"non-virtual\" />\n"
-" <xsd:enumeration value=\"virtual\" />\n"
-" <xsd:enumeration value=\"pure-virtual\" />\n"
-" </xsd:restriction>\n"
-" </xsd:simpleType>\n"
-"\n"
-" <xsd:simpleType name=\"DoxCompoundKind\">\n"
-" <xsd:restriction base=\"xsd:string\">\n"
-" <xsd:enumeration value=\"class\" />\n"
-" <xsd:enumeration value=\"struct\" />\n"
-" <xsd:enumeration value=\"union\" />\n"
-" <xsd:enumeration value=\"interface\" />\n"
-" <xsd:enumeration value=\"protocol\" />\n"
-" <xsd:enumeration value=\"category\" />\n"
-" <xsd:enumeration value=\"exception\" />\n"
-" <xsd:enumeration value=\"file\" />\n"
-" <xsd:enumeration value=\"namespace\" />\n"
-" <xsd:enumeration value=\"group\" />\n"
-" <xsd:enumeration value=\"page\" />\n"
-" <xsd:enumeration value=\"example\" />\n"
-" <xsd:enumeration value=\"dir\" />\n"
-" </xsd:restriction>\n"
-" </xsd:simpleType>\n"
-"\n"
-" <xsd:simpleType name=\"DoxSectionKind\">\n"
-" <xsd:restriction base=\"xsd:string\">\n"
-" <xsd:enumeration value=\"user-defined\" />\n"
-" <xsd:enumeration value=\"public-type\" />\n"
-" <xsd:enumeration value=\"public-func\" />\n"
-" <xsd:enumeration value=\"public-attrib\" />\n"
-" <xsd:enumeration value=\"public-slot\" />\n"
-" <xsd:enumeration value=\"signal\" />\n"
-" <xsd:enumeration value=\"dcop-func\" />\n"
-" <xsd:enumeration value=\"property\" />\n"
-" <xsd:enumeration value=\"event\" />\n"
-" <xsd:enumeration value=\"public-static-func\" />\n"
-" <xsd:enumeration value=\"public-static-attrib\" />\n"
-" <xsd:enumeration value=\"protected-type\" />\n"
-" <xsd:enumeration value=\"protected-func\" />\n"
-" <xsd:enumeration value=\"protected-attrib\" />\n"
-" <xsd:enumeration value=\"protected-slot\" />\n"
-" <xsd:enumeration value=\"protected-static-func\" />\n"
-" <xsd:enumeration value=\"protected-static-attrib\" />\n"
-" <xsd:enumeration value=\"package-type\" />\n"
-" <xsd:enumeration value=\"package-func\" />\n"
-" <xsd:enumeration value=\"package-attrib\" />\n"
-" <xsd:enumeration value=\"package-static-func\" />\n"
-" <xsd:enumeration value=\"package-static-attrib\" />\n"
-" <xsd:enumeration value=\"private-type\" />\n"
-" <xsd:enumeration value=\"private-func\" />\n"
-" <xsd:enumeration value=\"private-attrib\" />\n"
-" <xsd:enumeration value=\"private-slot\" />\n"
-" <xsd:enumeration value=\"private-static-func\" />\n"
-" <xsd:enumeration value=\"private-static-attrib\" />\n"
-" <xsd:enumeration value=\"friend\" />\n"
-" <xsd:enumeration value=\"related\" />\n"
-" <xsd:enumeration value=\"define\" />\n"
-" <xsd:enumeration value=\"prototype\" />\n"
-" <xsd:enumeration value=\"typedef\" />\n"
-" <xsd:enumeration value=\"enum\" />\n"
-" <xsd:enumeration value=\"func\" />\n"
-" <xsd:enumeration value=\"var\" />\n"
-" </xsd:restriction>\n"
-" </xsd:simpleType>\n"
-"\n"
-" <xsd:simpleType name=\"DoxHighlightClass\">\n"
-" <xsd:restriction base=\"xsd:string\">\n"
-" <xsd:enumeration value=\"comment\" />\n"
-" <xsd:enumeration value=\"normal\" />\n"
-" <xsd:enumeration value=\"preprocessor\" />\n"
-" <xsd:enumeration value=\"keyword\" />\n"
-" <xsd:enumeration value=\"keywordtype\" />\n"
-" <xsd:enumeration value=\"keywordflow\" />\n"
-" <xsd:enumeration value=\"stringliteral\" />\n"
-" <xsd:enumeration value=\"charliteral\" />\n"
-" </xsd:restriction>\n"
-" </xsd:simpleType>\n"
-"\n"
-" <xsd:simpleType name=\"DoxSimpleSectKind\">\n"
-" <xsd:restriction base=\"xsd:string\">\n"
-" <xsd:enumeration value=\"see\" />\n"
-" <xsd:enumeration value=\"return\" />\n"
-" <xsd:enumeration value=\"author\" />\n"
-" <xsd:enumeration value=\"authors\" />\n"
-" <xsd:enumeration value=\"version\" />\n"
-" <xsd:enumeration value=\"since\" />\n"
-" <xsd:enumeration value=\"date\" />\n"
-" <xsd:enumeration value=\"note\" />\n"
-" <xsd:enumeration value=\"warning\" />\n"
-" <xsd:enumeration value=\"pre\" />\n"
-" <xsd:enumeration value=\"post\" />\n"
-" <xsd:enumeration value=\"invariant\" />\n"
-" <xsd:enumeration value=\"remark\" />\n"
-" <xsd:enumeration value=\"attention\" />\n"
-" <xsd:enumeration value=\"par\" />\n"
-" <xsd:enumeration value=\"rcs\" />\n"
-" </xsd:restriction>\n"
-" </xsd:simpleType>\n"
-"\n"
-" <xsd:simpleType name=\"DoxVersionNumber\">\n"
-" <xsd:restriction base=\"xsd:string\">\n"
-" <xsd:pattern value=\"\\d+\\.\\d+.*\" />\n"
-" </xsd:restriction>\n"
-" </xsd:simpleType>\n"
-"\n"
-" <xsd:simpleType name=\"DoxImageKind\">\n"
-" <xsd:restriction base=\"xsd:string\">\n"
-" <xsd:enumeration value=\"html\" />\n"
-" <xsd:enumeration value=\"latex\" />\n"
-" <xsd:enumeration value=\"rtf\" />\n"
-" </xsd:restriction>\n"
-" </xsd:simpleType>\n"
-"\n"
-" <xsd:simpleType name=\"DoxParamListKind\">\n"
-" <xsd:restriction base=\"xsd:string\">\n"
-" <xsd:enumeration value=\"param\" />\n"
-" <xsd:enumeration value=\"retval\" />\n"
-" <xsd:enumeration value=\"exception\" />\n"
-" </xsd:restriction>\n"
-" </xsd:simpleType>\n"
-"\n"
-" <xsd:simpleType name=\"DoxCharRange\">\n"
-" <xsd:restriction base=\"xsd:string\">\n"
-" <xsd:pattern value=\"[aeiouncAEIOUNC]\" />\n"
-" </xsd:restriction>\n"
-" </xsd:simpleType>\n"
-"\n"
-" <xsd:simpleType name=\"DoxParamDir\">\n"
-" <xsd:restriction base=\"xsd:string\">\n"
-" <xsd:enumeration value=\"in\"/>\n"
-" <xsd:enumeration value=\"out\"/>\n"
-" <xsd:enumeration value=\"inout\"/>\n"
-" </xsd:restriction>\n"
-" </xsd:simpleType>\n"
-"\n"
-"</xsd:schema>\n"
-"\n"
diff --git a/src/config.h b/src/config.h
deleted file mode 100644
index 311bfb8..0000000
--- a/src/config.h
+++ /dev/null
@@ -1,577 +0,0 @@
-#ifndef CONFIG_H
-#define CONFIG_H
-
-#include "qtbc.h"
-#include <qstrlist.h>
-#include <qfile.h>
-#include <qdict.h>
-#include <qlist.h>
-#include <qtextstream.h>
-
-/*! \brief Abstract base class for any configuration option.
- *
- */
-class ConfigOption
-{
- friend class Config;
-
- public:
-
- /*! The type of option */
- enum OptionType
- {
- O_Info, //<! A section header
- O_List, //<! A list of items
- O_Enum, //<! A fixed set of items
- O_String, //<! A single item
- O_Int, //<! An integer value
- O_Bool, //<! A boolean value
- O_Obsolete //<! An obsolete option
- };
- enum
- {
- /*! Maximum length of an option in the config file. Used for
- * alignment purposes.
- */
- MAX_OPTION_LENGTH = 23
- };
- ConfigOption(OptionType t) : m_kind(t)
- {
- m_spaces.fill(' ',40);
- }
- virtual ~ConfigOption()
- {
- }
-
- /*! returns the kind of option this is. */
- OptionType kind() const { return m_kind; }
- QCString name() const { return m_name; }
- QCString docs() const { return m_doc; }
-
- QCString dependsOn() const { return m_dependency; }
- void addDependency(const char *dep) { m_dependency = dep; }
-
- protected:
- virtual void writeTemplate(QTextStream &t,bool sl,bool upd) = 0;
- virtual void convertStrToVal() {}
- virtual void substEnvVars() = 0;
- virtual void init() {}
-
- QCString convertToComment(const QCString &s);
- void writeBoolValue(QTextStream &t,bool v);
- void writeIntValue(QTextStream &t,int i);
- void writeStringValue(QTextStream &t,QCString &s);
- void writeStringList(QTextStream &t,QStrList &l);
-
- QCString m_spaces;
- QCString m_name;
- QCString m_doc;
- QCString m_dependency;
- OptionType m_kind;
-};
-
-/*! \brief Section marker for grouping the configuration options
- *
- */
-class ConfigInfo : public ConfigOption
-{
- public:
- ConfigInfo(const char *name,const char *doc)
- : ConfigOption(O_Info)
- {
- m_name = name;
- m_doc = doc;
- }
- void writeTemplate(QTextStream &t, bool sl,bool)
- {
- if (!sl)
- {
- t << "\n";
- }
- t << "#---------------------------------------------------------------------------\n";
- t << "# " << m_doc << endl;
- t << "#---------------------------------------------------------------------------\n";
- }
- void substEnvVars() {}
-};
-
-/*! \brief Option of the list type.
- *
- */
-class ConfigList : public ConfigOption
-{
- public:
- enum WidgetType { String, File, Dir, FileAndDir };
- 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_value.append(v); }
- void setWidgetType(WidgetType w) { m_widgetType = w; }
- WidgetType widgetType() const { return m_widgetType; }
- QStrList *valueRef() { return &m_value; }
- void writeTemplate(QTextStream &t,bool sl,bool)
- {
- if (!sl)
- {
- t << endl;
- t << convertToComment(m_doc);
- t << endl;
- }
- t << m_name << m_spaces.left(MAX_OPTION_LENGTH-m_name.length()) << "= ";
- writeStringList(t,m_value);
- t << "\n";
- }
- void substEnvVars();
- void init() { m_value.clear(); }
- private:
- QStrList m_value;
- WidgetType m_widgetType;
-};
-
-/*! \brief Option of the enum type.
- *
- */
-class ConfigEnum : public ConfigOption
-{
- public:
- ConfigEnum(const char *name,const char *doc,const char *defVal)
- : ConfigOption(O_Enum)
- {
- m_name = name;
- m_doc = doc;
- m_value = defVal;
- m_defValue = defVal;
- }
- void addValue(const char *v) { m_valueRange.append(v); }
- QStrListIterator iterator()
- {
- return QStrListIterator(m_valueRange);
- }
- QCString *valueRef() { return &m_value; }
- void substEnvVars();
- void writeTemplate(QTextStream &t,bool sl,bool)
- {
- if (!sl)
- {
- t << endl;
- t << convertToComment(m_doc);
- t << endl;
- }
- t << m_name << m_spaces.left(MAX_OPTION_LENGTH-m_name.length()) << "= ";
- writeStringValue(t,m_value);
- t << "\n";
- }
- void init() { m_value = m_defValue.copy(); }
-
- private:
- QStrList m_valueRange;
- QCString m_value;
- QCString m_defValue;
-};
-
-/*! \brief Option of the string type.
- *
- */
-class ConfigString : public ConfigOption
-{
- public:
- enum WidgetType { String, File, Dir };
- ConfigString(const char *name,const char *doc)
- : ConfigOption(O_String)
- {
- m_name = name;
- m_doc = doc;
- m_widgetType = String;
- }
- ~ConfigString()
- {
- }
- void setWidgetType(WidgetType w) { m_widgetType = w; }
- WidgetType widgetType() const { return m_widgetType; }
- void setDefaultValue(const char *v) { m_defValue = v; }
- QCString *valueRef() { return &m_value; }
- void writeTemplate(QTextStream &t,bool sl,bool)
- {
- if (!sl)
- {
- t << endl;
- t << convertToComment(m_doc);
- t << endl;
- }
- t << m_name << m_spaces.left(MAX_OPTION_LENGTH-m_name.length()) << "= ";
- writeStringValue(t,m_value);
- t << "\n";
- }
- void substEnvVars();
- void init() { m_value = m_defValue.copy(); }
-
- private:
- QCString m_value;
- QCString m_defValue;
- WidgetType m_widgetType;
-};
-
-/*! \brief Option of the integer type.
- *
- */
-class ConfigInt : public ConfigOption
-{
- public:
- ConfigInt(const char *name,const char *doc,int minVal,int maxVal,int defVal)
- : ConfigOption(O_Int)
- {
- m_name = name;
- m_doc = doc;
- m_value = defVal;
- m_defValue = defVal;
- m_minVal = minVal;
- m_maxVal = maxVal;
- }
- QCString *valueStringRef() { return &m_valueString; }
- int *valueRef() { return &m_value; }
- int minVal() const { return m_minVal; }
- int maxVal() const { return m_maxVal; }
- void convertStrToVal();
- void substEnvVars();
- void writeTemplate(QTextStream &t,bool sl,bool upd)
- {
- if (!sl)
- {
- t << endl;
- t << convertToComment(m_doc);
- t << endl;
- }
- t << m_name << m_spaces.left(MAX_OPTION_LENGTH-m_name.length()) << "= ";
- if (upd && !m_valueString.isEmpty())
- {
- writeStringValue(t,m_valueString);
- }
- else
- {
- writeIntValue(t,m_value);
- }
- t << "\n";
- }
- void init() { m_value = m_defValue; }
- private:
- int m_value;
- int m_defValue;
- int m_minVal;
- int m_maxVal;
- QCString m_valueString;
-};
-
-/*! \brief Option of the boolean type.
- *
- */
-class ConfigBool : public ConfigOption
-{
- public:
- ConfigBool(const char *name,const char *doc,bool defVal)
- : ConfigOption(O_Bool)
- {
- m_name = name;
- m_doc = doc;
- m_value = defVal;
- m_defValue = defVal;
- }
- QCString *valueStringRef() { return &m_valueString; }
- bool *valueRef() { return &m_value; }
- void convertStrToVal();
- void substEnvVars();
- void setValueString(const QCString &v) { m_valueString = v; }
- void writeTemplate(QTextStream &t,bool sl,bool upd)
- {
- if (!sl)
- {
- t << endl;
- t << convertToComment(m_doc);
- t << endl;
- }
- t << m_name << m_spaces.left(MAX_OPTION_LENGTH-m_name.length()) << "= ";
- if (upd && !m_valueString.isEmpty())
- {
- writeStringValue(t,m_valueString);
- }
- else
- {
- writeBoolValue(t,m_value);
- }
- t << "\n";
- }
- void init() { m_value = m_defValue; }
- private:
- bool m_value;
- bool m_defValue;
- QCString m_valueString;
-};
-
-/*! \brief Section marker for obsolete options
- *
- */
-class ConfigObsolete : public ConfigOption
-{
- public:
- ConfigObsolete(OptionType t) : ConfigOption(t) {}
- void writeTemplate(QTextStream &,bool,bool) {}
- void substEnvVars() {}
-};
-
-
-// some convenience macros
-#define Config_getString(val) Config::instance()->getString(__FILE__,__LINE__,val)
-#define Config_getInt(val) Config::instance()->getInt(__FILE__,__LINE__,val)
-#define Config_getList(val) Config::instance()->getList(__FILE__,__LINE__,val)
-#define Config_getEnum(val) Config::instance()->getEnum(__FILE__,__LINE__,val)
-#define Config_getBool(val) Config::instance()->getBool(__FILE__,__LINE__,val)
-
-/*! \brief Singleton for configuration variables.
- *
- * This object holds the global static variables
- * read from a user-supplied configuration file.
- * The static member instance() can be used to get
- * a pointer to the one and only instance.
- *
- * Set all variables to their default values by
- * calling Config::instance()->init()
- *
- */
-class Config
-{
- public:
- /////////////////////////////
- // public API
- /////////////////////////////
-
- /*! Returns the one and only instance of this class */
- static Config *instance()
- {
- if (m_instance==0) m_instance = new Config;
- return m_instance;
- }
- /*! Delete the instance */
- static void deleteInstance()
- {
- delete m_instance;
- }
-
- /*! Returns an iterator that can by used to iterate over the
- * configuration options.
- */
- QListIterator<ConfigOption> iterator()
- {
- return QListIterator<ConfigOption>(*m_options);
- }
-
- /*!
- * @name Getting configuration values.
- * @{
- */
-
- /*! 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.
- * 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;
-
- /*! 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.
- * 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.
- * The arguments \a num and \a name are for debugging purposes only.
- * There is a convenience function Config_getBool() for this.
- */
- bool &getBool(const char *fileName,int num,const char *name) const;
-
- /*! Returns the ConfigOption corresponding with \a name or 0 if
- * the option is not supported.
- */
- ConfigOption *get(const char *name) const
- {
- return m_dict->find(name);
- }
- /* @} */
-
- /*!
- * @name Adding configuration options.
- * @{
- */
-
- /*! Starts a new configuration section with \a name and description \a doc.
- * \returns An object representing the option.
- */
- ConfigInfo *addInfo(const char *name,const char *doc)
- {
- ConfigInfo *result = new ConfigInfo(name,doc);
- m_options->append(result);
- return result;
- }
-
- /*! Adds a new string option with \a name and documentation \a doc.
- * \returns An object representing the option.
- */
- ConfigString *addString(const char *name,
- const char *doc)
- {
- ConfigString *result = new ConfigString(name,doc);
- m_options->append(result);
- m_dict->insert(name,result);
- return result;
- }
-
- /*! Adds a new enumeration option with \a name and documentation \a doc
- * and initial value \a defVal.
- * \returns An object representing the option.
- */
- ConfigEnum *addEnum(const char *name,
- const char *doc,
- const char *defVal)
- {
- ConfigEnum *result = new ConfigEnum(name,doc,defVal);
- m_options->append(result);
- m_dict->insert(name,result);
- return result;
- }
-
- /*! Adds a new string option with \a name and documentation \a doc.
- * \returns An object representing the option.
- */
- ConfigList *addList(const char *name,
- const char *doc)
- {
- ConfigList *result = new ConfigList(name,doc);
- m_options->append(result);
- m_dict->insert(name,result);
- return result;
- }
-
- /*! Adds a new integer option with \a name and documentation \a doc.
- * The integer has a range between \a minVal and \a maxVal and a
- * default value of \a defVal.
- * \returns An object representing the option.
- */
- ConfigInt *addInt(const char *name,
- const char *doc,
- int minVal,int maxVal,int defVal)
- {
- ConfigInt *result = new ConfigInt(name,doc,minVal,maxVal,defVal);
- m_options->append(result);
- m_dict->insert(name,result);
- return result;
- }
-
- /*! Adds a new boolean option with \a name and documentation \a doc.
- * The boolean has a default value of \a defVal.
- * \returns An object representing the option.
- */
- ConfigBool *addBool(const char *name,
- const char *doc,
- bool defVal)
- {
- ConfigBool *result = new ConfigBool(name,doc,defVal);
- m_options->append(result);
- m_dict->insert(name,result);
- return result;
- }
- /*! Adds an option that has become obsolete. */
- ConfigOption *addObsolete(const char *name)
- {
- ConfigObsolete *option = new ConfigObsolete(ConfigOption::O_Obsolete);
- m_dict->insert(name,option);
- m_obsolete->append(option);
- return option;
- }
- /*! @} */
-
- /*! Writes a template configuration to stream \a t. If \a shortIndex
- * is \c TRUE the description of each configuration option will
- * be omitted.
- */
- void writeTemplate(QTextStream &t,bool shortIndex,bool updateOnly);
-
- /////////////////////////////
- // internal API
- /////////////////////////////
-
- /*! Converts the string values read from the configuration file
- * to real values for non-string type options (like int, and bools)
- */
- void convertStrToVal();
-
- /*! Replaces references to environment variable by the actual value
- * of the environment variable.
- */
- void substituteEnvironmentVars();
-
- /*! Checks if the values of the variable are correct, adjusts them
- * if needed, and report any errors.
- */
- void check();
-
- /*! Initialize config variables to their default value */
- void init();
-
- /*! 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);
-
- /*! Parse a configuration file with name \a fn.
- * \returns TRUE if successful, FALSE if the file could not be
- * opened or read.
- */
- bool parse(const char *fn);
-
- /*! Called from the constructor, will add doxygen's default options
- * to the configuration object
- */
- void create();
-
- protected:
-
- Config()
- {
- m_options = new QList<ConfigOption>;
- m_obsolete = new QList<ConfigOption>;
- m_dict = new QDict<ConfigOption>(257);
- m_options->setAutoDelete(TRUE);
- m_obsolete->setAutoDelete(TRUE);
- m_initialized = FALSE;
- create();
- }
- ~Config()
- {
- delete m_options;
- delete m_obsolete;
- delete m_dict;
- }
-
- private:
- QList<ConfigOption> *m_options;
- QList<ConfigOption> *m_obsolete;
- QDict<ConfigOption> *m_dict;
- static Config *m_instance;
- bool m_initialized;
-};
-
-#endif
diff --git a/src/config.l b/src/config.l
deleted file mode 100644
index bc09280..0000000
--- a/src/config.l
+++ /dev/null
@@ -1,2863 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-
-%{
-
-/*
- * includes
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <assert.h>
-#include <ctype.h>
-#include <stdarg.h>
-
-#include <qfileinfo.h>
-#include <qdir.h>
-#include <qtextstream.h>
-#include <qregexp.h>
-#include <qstack.h>
-
-#include "config.h"
-#include "version.h"
-
-#include "lang_cfg.h"
-
-#undef Config_getString
-#undef Config_getInt
-#undef Config_getList
-#undef Config_getEnum
-#undef Config_getBool
-
-// use in-class definitions
-#define Config_getString(val) getString(__FILE__,__LINE__,val)
-#define Config_getInt(val) getInt(__FILE__,__LINE__,val)
-#define Config_getList(val) getList(__FILE__,__LINE__,val)
-#define Config_getEnum(val) getEnum(__FILE__,__LINE__,val)
-#define Config_getBool(val) getBool(__FILE__,__LINE__,val)
-
-void config_err(const char *fmt, ...)
-{
- va_list args;
- va_start(args, fmt);
- vfprintf(stderr, fmt, args);
- va_end(args);
-}
-void config_warn(const char *fmt, ...)
-{
- va_list args;
- va_start(args, fmt);
- vfprintf(stderr, fmt, args);
- va_end(args);
-}
-
-#define MAX_INCLUDE_DEPTH 10
-#define YY_NEVER_INTERACTIVE 1
-
-/* -----------------------------------------------------------------
- */
-
-QCString ConfigOption::convertToComment(const QCString &s)
-{
- QCString result;
- if (s.isEmpty()) return result;
- else
- {
- result+="# ";
- QCString tmp=s.stripWhiteSpace();
- char *p=tmp.data();
- char c;
- while ((c=*p++))
- {
- if (c=='\n') result+="\n# ";
- else result+=c;
- }
- result+='\n';
- }
- return result;
-}
-
-void ConfigOption::writeBoolValue(QTextStream &t,bool v)
-{
- if (v) t << "YES"; else t << "NO";
-}
-
-void ConfigOption::writeIntValue(QTextStream &t,int i)
-{
- t << i;
-}
-
-void ConfigOption::writeStringValue(QTextStream &t,QCString &s)
-{
- const char *p=s.data();
- char c;
- bool needsEscaping=FALSE;
- if (p)
- {
- while ((c=*p++)!=0 && !needsEscaping)
- needsEscaping = (c==' ' || c=='\n' || c=='\t' || c=='"');
- if (needsEscaping)
- {
- t << "\"";
- p=s.data();
- while (*p)
- {
- if (*p=='"') t << "\\"; // escape quotes
- t << *p++;
- }
- t << "\"";
- }
- else
- {
- t << s;
- }
- }
-}
-
-void ConfigOption::writeStringList(QTextStream &t,QStrList &l)
-{
- const char *p = l.first();
- bool first=TRUE;
- while (p)
- {
- QCString s=p;
- if (!first) t << " ";
- first=FALSE;
- writeStringValue(t,s);
- p = l.next();
- if (p) t << " \\" << endl;
- }
-}
-
-/* -----------------------------------------------------------------
- */
-
-Config *Config::m_instance = 0;
-
-void ConfigInt::convertStrToVal()
-{
- if (!m_valueString.isEmpty())
- {
- bool ok;
- int val = m_valueString.toInt(&ok);
- if (!ok || val<m_minVal || val>m_maxVal)
- {
- config_warn("Warning: argument `%s' for option %s is not a valid number in the range [%d..%d]!\n"
- "Using the default: %d!\n",m_valueString.data(),m_name.data(),m_minVal,m_maxVal,m_value);
- }
- m_value=val;
- }
-}
-
-void ConfigBool::convertStrToVal()
-{
- QCString val = m_valueString.stripWhiteSpace().lower();
- if (!val.isEmpty())
- {
- if (val=="yes" || val=="true" || val=="1")
- {
- m_value=TRUE;
- }
- else if (val=="no" || val=="false" || val=="0")
- {
- m_value=FALSE;
- }
- else
- {
- config_warn("Warning: argument `%s' for option %s is not a valid boolean value\n"
- "Using the default: %s!\n",m_valueString.data(),m_name.data(),m_value?"YES":"NO");
- }
- }
-}
-
-QCString &Config::getString(const char *fileName,int num,const char *name) const
-{
- ConfigOption *opt = m_dict->find(name);
- if (opt==0)
- {
- config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
- exit(1);
- }
- else if (opt->kind()!=ConfigOption::O_String)
- {
- config_err("%s<%d>: Internal error: Requested option %s not of string type!\n",fileName,num,name);
- exit(1);
- }
- return *((ConfigString *)opt)->valueRef();
-}
-
-QStrList &Config::getList(const char *fileName,int num,const char *name) const
-{
- ConfigOption *opt = m_dict->find(name);
- if (opt==0)
- {
- config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
- exit(1);
- }
- else if (opt->kind()!=ConfigOption::O_List)
- {
- config_err("%d<%d>: Internal error: Requested option %s not of list type!\n",fileName,num,name);
- exit(1);
- }
- return *((ConfigList *)opt)->valueRef();
-}
-
-QCString &Config::getEnum(const char *fileName,int num,const char *name) const
-{
- ConfigOption *opt = m_dict->find(name);
- if (opt==0)
- {
- config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
- exit(1);
- }
- else if (opt->kind()!=ConfigOption::O_Enum)
- {
- config_err("%s<%d>: Internal error: Requested option %s not of enum type!\n",fileName,num,name);
- exit(1);
- }
- return *((ConfigEnum *)opt)->valueRef();
-}
-
-int &Config::getInt(const char *fileName,int num,const char *name) const
-{
- ConfigOption *opt = m_dict->find(name);
- if (opt==0)
- {
- config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
- exit(1);
- }
- else if (opt->kind()!=ConfigOption::O_Int)
- {
- config_err("%s<%d>: Internal error: Requested option %s not of integer type!\n",fileName,num,name);
- exit(1);
- }
- return *((ConfigInt *)opt)->valueRef();
-}
-
-bool &Config::getBool(const char *fileName,int num,const char *name) const
-{
- ConfigOption *opt = m_dict->find(name);
- if (opt==0)
- {
- config_err("%s<%d>: Internal error: Requested unknown option %s!\n",fileName,num,name);
- exit(1);
- }
- else if (opt->kind()!=ConfigOption::O_Bool)
- {
- config_err("%s<%d>: Internal error: Requested option %s not of integer type!\n",fileName,num,name);
- exit(1);
- }
- return *((ConfigBool *)opt)->valueRef();
-}
-
-/* -----------------------------------------------------------------
- *
- * static variables
- */
-
-struct ConfigFileState
-{
- int lineNr;
- FILE *filePtr;
- 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 QCString includeName;
-static QStrList includePathList;
-static QStack<ConfigFileState> includeStack;
-static int includeDepth;
-
-static QCString tabSizeString;
-static QCString maxInitLinesString;
-static QCString colsInAlphaIndexString;
-static QCString enumValuesPerLineString;
-static QCString treeViewWidthString;
-static QCString maxDotGraphWidthString;
-static QCString maxDotGraphHeightString;
-
-static Config *config;
-
-/* -----------------------------------------------------------------
- */
-#undef YY_INPUT
-#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
-
-static int yyread(char *buf,int max_size)
-{
- // no file included
- if (includeStack.isEmpty())
- {
- int c=0;
- while( c < max_size && inputString[inputPosition] )
- {
- *buf = inputString[inputPosition++] ;
- c++; buf++;
- }
- return c;
- }
- else
- {
- //assert(includeStack.current()->newState==YY_CURRENT_BUFFER);
- return fread(buf,1,max_size,includeStack.current()->filePtr);
- }
-}
-
-
-static FILE *tryPath(const char *path,const char *fileName)
-{
- QCString absName=(QCString)path+"/"+fileName;
- QFileInfo fi(absName);
- if (fi.exists() && fi.isFile())
- {
- FILE *f=fopen(absName,"r");
- if (!f) config_err("Error: could not open file %s for reading\n",absName.data());
- return f;
- }
- return 0;
-}
-
-static void substEnvVarsInStrList(QStrList &sl);
-static void substEnvVarsInString(QCString &s);
-
-static FILE *findFile(const char *fileName)
-{
- substEnvVarsInStrList(includePathList);
- char *s=includePathList.first();
- while (s) // try each of the include paths
- {
- FILE *f = tryPath(s,fileName);
- if (f) return f;
- s=includePathList.next();
- }
- // try cwd if includePathList fails
- return tryPath(".",fileName);
-}
-
-static void readIncludeFile(const char *incName)
-{
- if (includeDepth==MAX_INCLUDE_DEPTH) {
- config_err("Error: maximum include depth (%d) reached, %s is not included. Aborting...\n",
- MAX_INCLUDE_DEPTH,incName);
- exit(1);
- }
-
- QCString inc = incName;
- substEnvVarsInString(inc);
- inc = inc.stripWhiteSpace();
- uint incLen = inc.length();
- if (inc.at(0)=='"' && inc.at(incLen-1)=='"') // strip quotes
- {
- inc=inc.mid(1,incLen-2);
- }
-
- FILE *f;
-
- //printf("Searching for `%s'\n",incFileName.data());
- if ((f=findFile(inc))) // see if the include file can be found
- {
- // For debugging
-#if SHOW_INCLUDES
- for (i=0;i<includeStack.count();i++) msg(" ");
- msg("@INCLUDE = %s: parsing...\n",inc.data());
-#endif
-
- // store the state of the old file
- ConfigFileState *fs=new ConfigFileState;
- fs->oldState=YY_CURRENT_BUFFER;
- fs->lineNr=yyLineNr;
- fs->fileName=yyFileName;
- fs->filePtr=f;
- // push the state on the stack
- 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++;
- }
- else
- {
- config_err("Error: @INCLUDE = %s: not found!\n",inc.data());
- exit(1);
- }
-}
-
-
-%}
-
-%option nounput
-%option noyywrap
-
-%x Start
-%x SkipComment
-%x SkipInvalid
-%x GetString
-%x GetBool
-%x GetStrList
-%x GetQuotedString
-%x GetEnvVar
-%x Include
-
-%%
-
-<*>\0x0d
-<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_err("Warning: ignoring unsupported tag `%s' at line %d, file %s\n",
- yytext,yyLineNr,yyFileName.data());
- BEGIN(SkipInvalid);
- }
- else // known tag
- {
- 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:
- config_err("Warning: 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;
- }
- }
- }
-<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_err("Warning: ignoring unsupported tag `%s' at line %d, file %s\n",
- yytext,yyLineNr,yyFileName.data());
- BEGIN(SkipInvalid);
- }
- else // known tag
- {
- 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_err("Warning: 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_err("Warning: 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;
- }
- }
- }
-<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(yytext);
- 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_err("Warning: ignoring unknown tag `%s' at line %d, file %s\n",yytext,yyLineNr,yyFileName.data()); }
-<GetString,GetBool,SkipInvalid>\n { yyLineNr++; BEGIN(Start); }
-<GetStrList>\n {
- yyLineNr++;
- 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)+=yytext; }
-<GetString,GetStrList,SkipInvalid>"\"" { lastState=YY_START;
- BEGIN(GetQuotedString);
- tmpString.resize(0);
- }
-<GetQuotedString>"\""|"\n" {
- //printf("Quoted String = `%s'\n",tmpString.data());
- if (lastState==GetString)
- (*s)+=tmpString;
- else
- elemStr+=tmpString;
- if (*yytext=='\n')
- {
- config_err("Warning: 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("Warning: 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+=yytext;
- }
-<SkipComment>\n { yyLineNr++; BEGIN(Start); }
-<SkipComment>\\[ \r\t]*\n { yyLineNr++; BEGIN(Start); }
-<*>\\[ \r\t]*\n { yyLineNr++; }
-<*>.
-<*>\n { yyLineNr++ ; }
-
-%%
-
-/*@ ----------------------------------------------------------------------------
- */
-
-#if 0
-static void writeBoolValue(QTextStream &t,bool v)
-{
- if (v) t << "YES"; else t << "NO";
-}
-
-static void writeIntValue(QTextStream &t,int i)
-{
- t << i;
-}
-
-static void writeStringValue(QTextStream &t,QCString &s)
-{
- const char *p=s.data();
- char c;
- bool hasBlanks=FALSE;
- if (p)
- {
- while ((c=*p++)!=0 && !hasBlanks) hasBlanks = (c==' ' || c=='\n' || c=='\t');
- if (hasBlanks)
- t << "\"" << s << "\"";
- else
- t << s;
- }
-}
-
-static void writeStringList(QTextStream &t,QStrList &l)
-{
- const char *p = l.first();
- bool first=TRUE;
- while (p)
- {
- char c;
- const char *s=p;
- bool hasBlanks=FALSE;
- while ((c=*p++)!=0 && !hasBlanks) hasBlanks = (c==' ' || c=='\n' || c=='\t');
- if (!first) t << " ";
- first=FALSE;
- if (hasBlanks) t << "\"" << s << "\""; else t << s;
- p = l.next();
- if (p) t << " \\" << endl;
- }
-}
-#endif
-
-void Config::writeTemplate(QTextStream &t,bool sl,bool upd)
-{
- t << "# Doxyfile " << versionString << endl << endl;
- if (!sl)
- {
- t << "# This file describes the settings to be used by the documentation system\n";
- t << "# doxygen (www.doxygen.org) for a project\n";
- t << "#\n";
- t << "# All text after a hash (#) is considered a comment and will be ignored\n";
- t << "# The format is:\n";
- t << "# TAG = value [value, ...]\n";
- t << "# For lists items can also be appended using:\n";
- t << "# TAG += value [value, ...]\n";
- t << "# Values that contain spaces should be placed between quotes (\" \")\n";
- }
- ConfigOption *option = m_options->first();
- while (option)
- {
- option->writeTemplate(t,sl,upd);
- option = m_options->next();
- }
-}
-
-void Config::convertStrToVal()
-{
- ConfigOption *option = m_options->first();
- while (option)
- {
- option->convertStrToVal();
- option = m_options->next();
- }
-}
-
-static void substEnvVarsInString(QCString &s)
-{
- static QRegExp re("\\$\\([a-z_A-Z0-9]+\\)");
- if (s.isEmpty()) return;
- int p=0;
- int i,l;
- //printf("substEnvVarInString(%s) start\n",s.data());
- while ((i=re.match(s,p,&l))!=-1)
- {
- //printf("Found environment var s.mid(%d,%d)=`%s'\n",i+2,l-3,s.mid(i+2,l-3).data());
- QCString env=getenv(s.mid(i+2,l-3));
- substEnvVarsInString(env); // recursively expand variables if needed.
- s = s.left(i)+env+s.right(s.length()-i-l);
- p=i+env.length(); // next time start at the end of the expanded string
- }
- //printf("substEnvVarInString(%s) end\n",s.data());
-}
-
-static void substEnvVarsInStrList(QStrList &sl)
-{
- char *s = sl.first();
- while (s)
- {
- QCString result(s);
- bool wasQuoted = (result.find(' ')!=-1) || (result.find('\t')!=-1);
- substEnvVarsInString(result);
-
- //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 orginal string already
- contained multiple elements no further
- splitting is done to allow quoted items with spaces! */
- {
- int l=result.length();
- int i,p=0;
- // skip spaces
- // 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;
- }
- }
- }
- 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
- }
- }
- else // just goto the next element in the list
- {
- sl.insert(sl.at(),result);
- sl.next();
- }
- // 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;
- }
-}
-
-void ConfigString::substEnvVars()
-{
- substEnvVarsInString(m_value);
-}
-
-void ConfigList::substEnvVars()
-{
- substEnvVarsInStrList(m_value);
-}
-
-void ConfigBool::substEnvVars()
-{
- substEnvVarsInString(m_valueString);
-}
-
-void ConfigInt::substEnvVars()
-{
- substEnvVarsInString(m_valueString);
-}
-
-void ConfigEnum::substEnvVars()
-{
- substEnvVarsInString(m_value);
-}
-
-void Config::substituteEnvironmentVars()
-{
- ConfigOption *option = m_options->first();
- while (option)
- {
- option->substEnvVars();
- option = m_options->next();
- }
-}
-
-static void cleanUpPaths(QStrList &str)
-{
- char *sfp = str.first();
- while (sfp)
- {
- register 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)!='/'
- )
- {
- QFileInfo fi(path);
- if (fi.exists() && fi.isDir())
- {
- int i = str.at();
- str.remove();
- if (str.at()==i) // did not remove last item
- str.insert(i,fi.absFilePath()+"/");
- else
- str.append(fi.absFilePath()+"/");
- }
- }
- sfp = str.next();
- }
-}
-
-void Config::check()
-{
- //if (!projectName.isEmpty())
- //{
- // projectName[0]=toupper(projectName[0]);
- //}
-
- QCString &warnFormat = Config_getString("WARN_FORMAT");
- if (warnFormat.isEmpty())
- {
- warnFormat="$file:$line $text";
- }
- else
- {
- if (warnFormat.find("$file")==-1)
- {
- config_err("Error: warning format does not contain a $file tag!\n");
- exit(1);
- }
- if (warnFormat.find("$line")==-1)
- {
- config_err("Error: warning format does not contain a $line tag!\n");
- exit(1);
- }
- if (warnFormat.find("$text")==-1)
- {
- config_err("Error: wanring format foes not contain a $text tag!\n");
- exit(1);
- }
- }
-
- QCString &manExtension = Config_getString("MAN_EXTENSION");
-
- // set default man page extension if non is given by the user
- if (manExtension.isEmpty())
- {
- manExtension=".3";
- }
-
- QCString &paperType = Config_getEnum("PAPER_TYPE");
- paperType=paperType.lower().stripWhiteSpace();
- if (paperType.isEmpty())
- {
- paperType = "a4wide";
- }
- if (paperType!="a4" && paperType!="a4wide" && paperType!="letter" &&
- paperType!="legal" && paperType!="executive")
- {
- config_err("Error: Unknown page type specified");
- }
-
- QCString &outputLanguage=Config_getEnum("OUTPUT_LANGUAGE");
- outputLanguage=outputLanguage.stripWhiteSpace();
- if (outputLanguage.isEmpty())
- {
- outputLanguage = "English";
- }
-
- QCString &htmlFileExtension=Config_getString("HTML_FILE_EXTENSION");
- htmlFileExtension=htmlFileExtension.stripWhiteSpace();
- if (htmlFileExtension.isEmpty())
- {
- htmlFileExtension = ".html";
- }
-
- // 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
- {
- stripFromPath.append(QDir::currentDirPath()+"/");
- }
- else
- {
- cleanUpPaths(stripFromPath);
- }
-
- // expand the relative stripFromPath values
- QStrList &stripFromIncPath = Config_getList("STRIP_FROM_INC_PATH");
- cleanUpPaths(stripFromIncPath);
-
- // Test to see if HTML header is valid
- QCString &headerFile = Config_getString("HTML_HEADER");
- if (!headerFile.isEmpty())
- {
- QFileInfo fi(headerFile);
- if (!fi.exists())
- {
- config_err("Error: tag HTML_HEADER: header file `%s' "
- "does not exist\n",headerFile.data());
- exit(1);
- }
- }
- // Test to see if HTML footer is valid
- QCString &footerFile = Config_getString("HTML_FOOTER");
- if (!footerFile.isEmpty())
- {
- QFileInfo fi(footerFile);
- if (!fi.exists())
- {
- config_err("Error: tag HTML_FOOTER: footer file `%s' "
- "does not exist\n",footerFile.data());
- exit(1);
- }
- }
- // Test to see if LaTeX header is valid
- QCString &latexHeaderFile = Config_getString("LATEX_HEADER");
- if (!latexHeaderFile.isEmpty())
- {
- QFileInfo fi(latexHeaderFile);
- if (!fi.exists())
- {
- config_err("Error: tag LATEX_HEADER: header file `%s' "
- "does not exist\n",latexHeaderFile.data());
- exit(1);
- }
- }
- // check include path
- QStrList &includePath = Config_getList("INCLUDE_PATH");
- char *s=includePath.first();
- while (s)
- {
- QFileInfo fi(s);
- if (!fi.exists()) config_err("Warning: tag INCLUDE_PATH: include path `%s' "
- "does not exist\n",s);
- s=includePath.next();
- }
-
- // check aliases
- QStrList &aliasList = Config_getList("ALIASES");
- s=aliasList.first();
- while (s)
- {
- QRegExp re("[a-z_A-Z][a-z_A-Z0-9]*[ \t]*=");
- QCString alias=s;
- alias=alias.stripWhiteSpace();
- if (alias.find(re)!=0)
- {
- config_err("Illegal alias format `%s'. Use \"name=value\"\n",
- alias.data());
- }
- s=aliasList.next();
- }
-
- // check 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")
- {
- config_err("Invalid value for DOT_IMAGE_FORMAT: `%s'. Using the default.\n",dotImageFormat.data());
- dotImageFormat = "png";
- }
-
-
- // check dot path
- QCString &dotPath = Config_getString("DOT_PATH");
- if (!dotPath.isEmpty())
- {
- if (dotPath.find('\\')!=-1)
- {
- if (dotPath.at(dotPath.length()-1)!='\\')
- {
- dotPath+='\\';
- }
- }
- else if (dotPath.find('/')!=-1)
- {
- if (dotPath.at(dotPath.length()-1)!='/')
- {
- dotPath+='/';
- }
- }
-#if defined(_WIN32)
- QFileInfo dp(dotPath+"dot.exe");
-#else
- QFileInfo dp(dotPath+"dot");
-#endif
- if (!dp.exists() || !dp.isFile())
- {
- config_err("Warning: the dot tool could not be found at %s\n",dotPath.data());
- dotPath="";
- }
- else
- {
- dotPath=dp.dirPath(TRUE)+"/";
-#if defined(_WIN32) // convert slashes
- uint i=0,l=dotPath.length();
- for (i=0;i<l;i++) if (dotPath.at(i)=='/') dotPath.at(i)='\\';
-#endif
- }
- }
- else // make sure the string is empty but not null!
- {
- dotPath="";
- }
-
- // check input
- QStrList &inputSources=Config_getList("INPUT");
- if (inputSources.count()==0)
- {
- // use current dir as the default
- inputSources.append(QDir::currentDirPath());
- }
- else
- {
- s=inputSources.first();
- while (s)
- {
- QFileInfo fi(s);
- if (!fi.exists())
- {
- config_err("Error: tag INPUT: input source `%s' does not exist\n",s);
- exit(1);
- }
- s=inputSources.next();
- }
- }
-
- // add default pattern if needed
- QStrList &filePatternList = Config_getList("FILE_PATTERNS");
- if (filePatternList.isEmpty())
- {
- filePatternList.append("*.c");
- filePatternList.append("*.cc");
- filePatternList.append("*.cxx");
- filePatternList.append("*.cpp");
- filePatternList.append("*.c++");
- filePatternList.append("*.d");
- filePatternList.append("*.java");
- filePatternList.append("*.ii");
- filePatternList.append("*.ixx");
- filePatternList.append("*.ipp");
- filePatternList.append("*.i++");
- filePatternList.append("*.inl");
- filePatternList.append("*.h");
- filePatternList.append("*.hh");
- filePatternList.append("*.hxx");
- filePatternList.append("*.hpp");
- filePatternList.append("*.h++");
- filePatternList.append("*.idl");
- filePatternList.append("*.odl");
- filePatternList.append("*.cs");
- filePatternList.append("*.php");
- filePatternList.append("*.php3");
- filePatternList.append("*.inc");
- filePatternList.append("*.m");
- filePatternList.append("*.mm");
- filePatternList.append("*.dox");
-#if !defined(_WIN32)
- // unix => case sensitive match => also include useful uppercase versions
- filePatternList.append("*.C");
- filePatternList.append("*.CC");
- filePatternList.append("*.C++");
- filePatternList.append("*.II");
- filePatternList.append("*.I++");
- filePatternList.append("*.H");
- filePatternList.append("*.HH");
- filePatternList.append("*.H++");
- filePatternList.append("*.CS");
- filePatternList.append("*.PHP");
- filePatternList.append("*.PHP3");
- filePatternList.append("*.M");
- filePatternList.append("*.MM");
-#endif
- }
-
- // add default pattern if needed
- QStrList &examplePatternList = Config_getList("EXAMPLE_PATTERNS");
- if (examplePatternList.isEmpty())
- {
- examplePatternList.append("*");
- }
-
-#undef PUTENV
-#undef SEP
-#if defined(_WIN32) && !defined(__GNUC__) && (__BORLANDC__ < 0x0550)
-#define PUTENV _putenv
-#define SEP ";"
-#else
-#define PUTENV putenv
-#define SEP ":"
-#endif
- if (Config_getBool("HAVE_DOT"))
- {
- char *curFontPath = getenv("DOTFONTPATH");
- int l=curFontPath ? strlen(curFontPath)+1 : 0;
- static char *buf = 0;
- buf = (char *)realloc(buf,strlen("DOTFONTPATH=.")+l+1);
- strcpy(buf,"DOTFONTPATH=.");
- if (l>0)
- {
- strcat(buf,SEP);
- strcat(buf,curFontPath);
- }
- PUTENV(buf);
- }
-
- int &depth = Config_getInt("MAX_DOT_GRAPH_DEPTH");
- if (depth==0)
- {
- depth=1000;
- }
-
- 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;
- }
-
- // 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");
- }
-}
-
-void Config::init()
-{
- ConfigOption *option = m_options->first();
- while (option)
- {
- option->init();
- option = m_options->next();
- }
-}
-
-void Config::create()
-{
- if (m_initialized) return;
- m_initialized = TRUE;
-
- ConfigString *cs;
- ConfigEnum *ce;
- ConfigList *cl;
- ConfigInt *ci;
- ConfigBool *cb;
-
- // option definitions
- //-----------------------------------------------------------------------------------------------
- addInfo("Project","Project related configuration options");
- //-----------------------------------------------------------------------------------------------
-
-
- cs = addString(
- "PROJECT_NAME",
- "The PROJECT_NAME tag is a single word (or a sequence of words surrounded \n"
- "by quotes) that should identify the project. "
- );
- cs = addString(
- "PROJECT_NUMBER",
- "The PROJECT_NUMBER tag can be used to enter a project or revision number. \n"
- "This could be handy for archiving the generated documentation or \n"
- "if some version control system is used.\n"
- );
- cs = addString(
- "OUTPUT_DIRECTORY",
- "The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) \n"
- "base path where the generated documentation will be put. \n"
- "If a relative path is entered, it will be relative to the location \n"
- "where doxygen was started. If left blank the current directory will be used.\n"
- );
- cs->setWidgetType(ConfigString::Dir);
- cb = addBool(
- "CREATE_SUBDIRS",
- "If the CREATE_SUBDIRS tag is set to YES, then doxygen will create \n"
- "4096 sub-directories (in 2 levels) under the output directory of each output \n"
- "format and will distribute the generated files over these directories. \n"
- "Enabling this option can be useful when feeding doxygen a huge amount of \n"
- "source files, where putting all generated files in the same directory would \n"
- "otherwise cause performance problems for the file system. \n",
- FALSE
- );
- ce = addEnum(
- "OUTPUT_LANGUAGE",
- "The OUTPUT_LANGUAGE tag is used to specify the language in which all \n"
- "documentation generated by doxygen is written. Doxygen will use this \n"
- "information to generate all constant output in the proper language. \n"
- "The default language is English, other supported languages are: \n"
- "Brazilian, Catalan, Chinese, Chinese-Traditional, Croatian, Czech, Danish, \n"
- "Dutch, Finnish, French, German, Greek, Hungarian, Italian, Japanese, \n"
- "Japanese-en (Japanese with English messages), Korean, Korean-en, Norwegian, \n"
- "Polish, Portuguese, Romanian, Russian, Serbian, Slovak, Slovene, Spanish, \n"
- "Swedish, and Ukrainian.\n",
- "English"
- );
-#ifdef LANG_BR
- ce->addValue("Brazilian");
-#endif
-#ifdef LANG_CA
- ce->addValue("Catalan");
-#endif
-#ifdef LANG_CN
- ce->addValue("Chinese");
-#endif
-#ifdef LANG_TW
- ce->addValue("Chinese-Traditional");
-#endif
-#ifdef LANG_HR
- ce->addValue("Croatian");
-#endif
-#ifdef LANG_CZ
- ce->addValue("Czech");
-#endif
-#ifdef LANG_DK
- ce->addValue("Danish");
-#endif
-#ifdef LANG_NL
- ce->addValue("Dutch");
-#endif
- ce->addValue("English");
-#ifdef LANG_FI
- ce->addValue("Finnish");
-#endif
-#ifdef LANG_FR
- ce->addValue("French");
-#endif
-#ifdef LANG_DE
- ce->addValue("German");
-#endif
-#ifdef LANG_GR
- ce->addValue("Greek");
-#endif
-#ifdef LANG_HU
- ce->addValue("Hungarian");
-#endif
-#ifdef LANG_IT
- ce->addValue("Italian");
-#endif
-#ifdef LANG_JP
- ce->addValue("Japanese");
- ce->addValue("Japanese-en");
-#endif
-#ifdef LANG_KR
- ce->addValue("Korean");
- ce->addValue("Korean-en");
-#endif
-#ifdef LANG_NO
- ce->addValue("Norwegian");
-#endif
-#ifdef LANG_PL
- ce->addValue("Polish");
-#endif
-#ifdef LANG_PT
- ce->addValue("Portuguese");
-#endif
-#ifdef LANG_RO
- ce->addValue("Romanian");
-#endif
-#ifdef LANG_RU
- ce->addValue("Russian");
-#endif
-#ifdef LANG_SR
- ce->addValue("Serbian");
-#endif
-#ifdef LANG_SK
- ce->addValue("Slovak");
-#endif
-#ifdef LANG_SI
- ce->addValue("Slovene");
-#endif
-#ifdef LANG_ES
- ce->addValue("Spanish");
-#endif
-#ifdef LANG_SE
- ce->addValue("Swedish");
-#endif
-#ifdef LANG_UA
- ce->addValue("Ukrainian");
-#endif
- cb = addBool(
- "USE_WINDOWS_ENCODING",
- "This tag can be used to specify the encoding used in the generated output. \n"
- "The encoding is not always determined by the language that is chosen, \n"
- "but also whether or not the output is meant for Windows or non-Windows users. \n"
- "In case there is a difference, setting the USE_WINDOWS_ENCODING tag to YES \n"
- "forces the Windows encoding (this is the default for the Windows binary), \n"
- "whereas setting the tag to NO uses a Unix-style encoding (the default for \n"
- "all platforms other than Windows).\n",
-#if defined(_WIN32) || defined(__CYGWIN__)
- TRUE
-#else
- FALSE
-#endif
- );
- cb = addBool(
- "BRIEF_MEMBER_DESC",
- "If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will \n"
- "include brief member descriptions after the members that are listed in \n"
- "the file and class documentation (similar to JavaDoc). \n"
- "Set to NO to disable this. \n",
- TRUE
- );
- cb = addBool(
- "REPEAT_BRIEF",
- "If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend \n"
- "the brief description of a member or function before the detailed description. \n"
- "Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the \n"
- "brief descriptions will be completely suppressed. \n",
- TRUE
- );
- cl = addList(
- "ABBREVIATE_BRIEF",
- "This tag implements a quasi-intelligent brief description abbreviator \n"
- "that is used to form the text in various listings. Each string \n"
- "in this list, if found as the leading text of the brief description, will be \n"
- "stripped from the text and the result after processing the whole list, is \n"
- "used as the annotated text. Otherwise, the brief description is used as-is. \n"
- "If left blank, the following values are used (\"$name\" is automatically \n"
- "replaced with the name of the entity): \"The $name class\" \"The $name widget\" \n"
- "\"The $name file\" \"is\" \"provides\" \"specifies\" \"contains\" \n"
- "\"represents\" \"a\" \"an\" \"the\"\n"
- );
- cb = addBool(
- "ALWAYS_DETAILED_SEC",
- "If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then \n"
- "Doxygen will generate a detailed section even if there is only a brief \n"
- "description. \n",
- FALSE
- );
- cb = addBool(
- "INLINE_INHERITED_MEMB",
- "If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all \n"
- "inherited members of a class in the documentation of that class as if those \n"
- "members were ordinary class members. Constructors, destructors and assignment \n"
- "operators of the base classes will not be shown. \n",
- FALSE
- );
- cb = addBool(
- "FULL_PATH_NAMES",
- "If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full \n"
- "path before files name in the file list and in the header files. If set \n"
- "to NO the shortest path that makes the file name unique will be used. \n",
- TRUE
- );
- cl = addList(
- "STRIP_FROM_PATH",
- "If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag \n"
- "can be used to strip a user-defined part of the path. Stripping is \n"
- "only done if one of the specified strings matches the left-hand part of \n"
- "the path. The tag can be used to show relative paths in the file list. \n"
- "If left blank the directory from which doxygen is run is used as the \n"
- "path to strip. \n"
- );
- cl->addDependency("FULL_PATH_NAMES");
- cl = addList(
- "STRIP_FROM_INC_PATH",
- "The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of \n"
- "the path mentioned in the documentation of a class, which tells \n"
- "the reader which header file to include in order to use a class. \n"
- "If left blank only the name of the header file containing the class \n"
- "definition is used. Otherwise one should specify the include paths that \n"
- "are normally passed to the compiler using the -I flag.\n"
- );
- cb = addBool(
- "SHORT_NAMES",
- "If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter \n"
- "(but less readable) file names. This can be useful is your file systems \n"
- "doesn't support long names like on DOS, Mac, or CD-ROM. \n",
- FALSE
- );
- cb = addBool(
- "JAVADOC_AUTOBRIEF",
- "If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen \n"
- "will interpret the first line (until the first dot) of a JavaDoc-style \n"
- "comment as the brief description. If set to NO, the JavaDoc \n"
- "comments will behave just like the Qt-style comments (thus requiring an \n"
- "explicit @brief command for a brief description. \n",
- FALSE
- );
- cb = addBool(
- "MULTILINE_CPP_IS_BRIEF",
- "The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen \n"
- "treat a multi-line C++ special comment block (i.e. a block of //! or /// \n"
- "comments) as a brief description. This used to be the default behaviour. \n"
- "The new default is to treat a multi-line C++ comment block as a detailed \n"
- "description. Set this tag to YES if you prefer the old behaviour instead. \n",
- FALSE
- );
- cb = addBool(
- "DETAILS_AT_TOP",
- "If the DETAILS_AT_TOP tag is set to YES then Doxygen \n"
- "will output the detailed description near the top, like JavaDoc.\n"
- "If set to NO, the detailed description appears after the member \n"
- "documentation. \n",
- FALSE
- );
- cb = addBool(
- "INHERIT_DOCS",
- "If the INHERIT_DOCS tag is set to YES (the default) then an undocumented \n"
- "member inherits the documentation from any documented member that it \n"
- "re-implements. \n",
- TRUE
- );
- cb = addBool(
- "SEPARATE_MEMBER_PAGES",
- "If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce \n"
- "a new page for each member. If set to NO, the documentation of a member will \n"
- "be part of the file/class/namespace that contains it.\n",
- FALSE
- );
- ci = addInt(
- "TAB_SIZE",
- "The TAB_SIZE tag can be used to set the number of spaces in a tab. \n"
- "Doxygen uses this value to replace tabs by spaces in code fragments. \n",
- 1,16,8
- );
- cl = addList(
- "ALIASES",
- "This tag can be used to specify a number of aliases that acts \n"
- "as commands in the documentation. An alias has the form \"name=value\". \n"
- "For example adding \"sideeffect=\\par Side Effects:\\n\" will allow you to \n"
- "put the command \\sideeffect (or @sideeffect) in the documentation, which \n"
- "will result in a user-defined paragraph with heading \"Side Effects:\". \n"
- "You can put \\n's in the value part of an alias to insert newlines. \n"
- );
- cb = addBool(
- "OPTIMIZE_OUTPUT_FOR_C",
- "Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C \n"
- "sources only. Doxygen will then generate output that is more tailored for C. \n"
- "For instance, some of the names that are used will be different. The list \n"
- "of all members will be omitted, etc. \n",
- FALSE
- );
- cb = addBool(
- "OPTIMIZE_OUTPUT_JAVA",
- "Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java \n"
- "sources only. Doxygen will then generate output that is more tailored for Java. \n"
- "For instance, namespaces will be presented as packages, qualified scopes \n"
- "will look different, etc. \n",
- FALSE
- );
- cb = addBool(
- "BUILTIN_STL_SUPPORT",
- "If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to \n"
- "include (a tag file for) the STL sources as input, then you should \n"
- "set this tag to YES in order to let doxygen match functions declarations and \n"
- "definitions whose arguments contain STL classes (e.g. func(std::string); v.s. \n"
- "func(std::string) {}). This also make the inheritance and collaboration \n"
- "diagrams that involve STL classes more complete and accurate. \n",
- FALSE
- );
- cb = addBool(
- "DISTRIBUTE_GROUP_DOC",
- "If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC \n"
- "tag is set to YES, then doxygen will reuse the documentation of the first \n"
- "member in the group (if any) for the other members of the group. By default \n"
- "all members of a group must be documented explicitly.\n",
- FALSE
- );
- cb = addBool(
- "SUBGROUPING",
- "Set the SUBGROUPING tag to YES (the default) to allow class member groups of \n"
- "the same type (for instance a group of public functions) to be put as a \n"
- "subgroup of that type (e.g. under the Public Functions section). Set it to \n"
- "NO to prevent subgrouping. Alternatively, this can be done per class using \n"
- "the \\nosubgrouping command. \n",
- TRUE
- );
- //-----------------------------------------------------------------------------------------------
- addInfo("Build","Build related configuration options");
- //-----------------------------------------------------------------------------------------------
- cb = addBool(
- "EXTRACT_ALL",
- "If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in \n"
- "documentation are documented, even if no documentation was available. \n"
- "Private class members and static file members will be hidden unless \n"
- "the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES \n",
- FALSE
- );
- cb = addBool(
- "EXTRACT_PRIVATE",
- "If the EXTRACT_PRIVATE tag is set to YES all private members of a class \n"
- "will be included in the documentation. \n",
- FALSE
- );
- cb = addBool(
- "EXTRACT_STATIC",
- "If the EXTRACT_STATIC tag is set to YES all static members of a file \n"
- "will be included in the documentation. \n",
- FALSE
- );
- cb = addBool(
- "EXTRACT_LOCAL_CLASSES",
- "If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) \n"
- "defined locally in source files will be included in the documentation. \n"
- "If set to NO only classes defined in header files are included. \n",
- TRUE
- );
- cb = addBool(
- "EXTRACT_LOCAL_METHODS",
- "This flag is only useful for Objective-C code. When set to YES local \n"
- "methods, which are defined in the implementation section but not in \n"
- "the interface are included in the documentation. \n"
- "If set to NO (the default) only methods in the interface are included. \n",
- FALSE
- );
- cb = addBool(
- "HIDE_UNDOC_MEMBERS",
- "If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all \n"
- "undocumented members of documented classes, files or namespaces. \n"
- "If set to NO (the default) these members will be included in the \n"
- "various overviews, but no documentation section is generated. \n"
- "This option has no effect if EXTRACT_ALL is enabled. \n",
- FALSE
- );
- cb = addBool(
- "HIDE_UNDOC_CLASSES",
- "If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all \n"
- "undocumented classes that are normally visible in the class hierarchy. \n"
- "If set to NO (the default) these classes will be included in the various \n"
- "overviews. This option has no effect if EXTRACT_ALL is enabled. \n",
- FALSE
- );
- cb = addBool(
- "HIDE_FRIEND_COMPOUNDS",
- "If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all \n"
- "friend (class|struct|union) declarations. \n"
- "If set to NO (the default) these declarations will be included in the \n"
- "documentation. \n",
- FALSE
- );
- cb = addBool(
- "HIDE_IN_BODY_DOCS",
- "If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any \n"
- "documentation blocks found inside the body of a function. \n"
- "If set to NO (the default) these blocks will be appended to the \n"
- "function's detailed documentation block. \n",
- FALSE
- );
- cb = addBool(
- "INTERNAL_DOCS",
- "The INTERNAL_DOCS tag determines if documentation \n"
- "that is typed after a \\internal command is included. If the tag is set \n"
- "to NO (the default) then the documentation will be excluded. \n"
- "Set it to YES to include the internal documentation. \n",
- FALSE
- );
- cb = addBool(
- "CASE_SENSE_NAMES",
- "If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate \n"
- "file names in lower-case letters. If set to YES upper-case letters are also \n"
- "allowed. This is useful if you have classes or files whose names only differ \n"
- "in case and if your file system supports case sensitive file names. Windows \n"
- "and Mac users are advised to set this option to NO.\n",
-#if defined(_WIN32) || defined(macintosh) || defined(__MACOSX__) || defined(__APPLE__)
- FALSE // case insensitive file system expected
-#else
- TRUE // case sensitive file system expected
-#endif
- );
- cb = addBool(
- "HIDE_SCOPE_NAMES",
- "If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen \n"
- "will show members with their full class and namespace scopes in the \n"
- "documentation. If set to YES the scope will be hidden. \n",
- FALSE
- );
- cb = addBool(
- "SHOW_INCLUDE_FILES",
- "If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen \n"
- "will put a list of the files that are included by a file in the documentation \n"
- "of that file. \n",
- TRUE
- );
- cb = addBool(
- "INLINE_INFO",
- "If the INLINE_INFO tag is set to YES (the default) then a tag [inline] \n"
- "is inserted in the documentation for inline members. \n",
- TRUE
- );
- cb = addBool(
- "SORT_MEMBER_DOCS",
- "If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen \n"
- "will sort the (detailed) documentation of file and class members \n"
- "alphabetically by member name. If set to NO the members will appear in \n"
- "declaration order. \n",
- TRUE
- );
- cb = addBool(
- "SORT_BRIEF_DOCS",
- "If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the \n"
- "brief documentation of file, namespace and class members alphabetically \n"
- "by member name. If set to NO (the default) the members will appear in \n"
- "declaration order. \n",
- FALSE
- );
- cb = addBool(
- "SORT_BY_SCOPE_NAME",
- "If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be \n"
- "sorted by fully-qualified names, including namespaces. If set to \n"
- "NO (the default), the class list will be sorted only by class name, \n"
- "not including the namespace part. \n"
- "Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.\n"
- "Note: This option applies only to the class list, not to the \n"
- "alphabetical list.\n",
- FALSE
- );
-
- cb = addBool(
- "GENERATE_TODOLIST",
- "The GENERATE_TODOLIST tag can be used to enable (YES) or \n"
- "disable (NO) the todo list. This list is created by putting \\todo \n"
- "commands in the documentation.\n",
- TRUE
- );
- cb = addBool(
- "GENERATE_TESTLIST",
- "The GENERATE_TESTLIST tag can be used to enable (YES) or \n"
- "disable (NO) the test list. This list is created by putting \\test \n"
- "commands in the documentation.\n",
- TRUE
- );
- cb = addBool(
- "GENERATE_BUGLIST",
- "The GENERATE_BUGLIST tag can be used to enable (YES) or \n"
- "disable (NO) the bug list. This list is created by putting \\bug \n"
- "commands in the documentation.\n",
- TRUE
- );
- cb = addBool(
- "GENERATE_DEPRECATEDLIST",
- "The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or \n"
- "disable (NO) the deprecated list. This list is created by putting \n"
- "\\deprecated commands in the documentation.\n",
- TRUE
- );
- cl = addList(
- "ENABLED_SECTIONS",
- "The ENABLED_SECTIONS tag can be used to enable conditional \n"
- "documentation sections, marked by \\if sectionname ... \\endif. \n"
- );
- ci = addInt(
- "MAX_INITIALIZER_LINES",
- "The MAX_INITIALIZER_LINES tag determines the maximum number of lines \n"
- "the initial value of a variable or define consists of for it to appear in \n"
- "the documentation. If the initializer consists of more lines than specified \n"
- "here it will be hidden. Use a value of 0 to hide initializers completely. \n"
- "The appearance of the initializer of individual variables and defines in the \n"
- "documentation can be controlled using \\showinitializer or \\hideinitializer \n"
- "command in the documentation regardless of this setting. \n",
- 0,10000,30
- );
- cb = addBool(
- "SHOW_USED_FILES",
- "Set the SHOW_USED_FILES tag to NO to disable the list of files generated \n"
- "at the bottom of the documentation of classes and structs. If set to YES the \n"
- "list will mention the files that were used to generate the documentation. \n",
- TRUE
- );
- cb = addBool(
- "SHOW_DIRECTORIES",
- "If the sources in your project are distributed over multiple directories \n"
- "then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy \n"
- "in the documentation. The default is YES.\n",
- TRUE
- );
- cs = addString( "FILE_VERSION_FILTER",
- "The FILE_VERSION_FILTER tag can be used to specify a program or script that \n"
- "doxygen should invoke to get the current version for each file (typically from the \n"
- "version control system). Doxygen will invoke the program by executing (via \n"
- "popen()) the command <command> <input-file>, where <command> is the value of \n"
- "the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file \n"
- "provided by doxygen. Whatever the program writes to standard output \n"
- "is used as the file version. See the manual for examples. \n"
- );
- cs->setWidgetType(ConfigString::File);
-
- //-----------------------------------------------------------------------------------------------
- addInfo( "Messages","configuration options related to warning and progress messages");
- //-----------------------------------------------------------------------------------------------
-
- cb = addBool(
- "QUIET",
- "The QUIET tag can be used to turn on/off the messages that are generated \n"
- "by doxygen. Possible values are YES and NO. If left blank NO is used. \n",
- FALSE
- );
- cb = addBool(
- "WARNINGS",
- "The WARNINGS tag can be used to turn on/off the warning messages that are \n"
- "generated by doxygen. Possible values are YES and NO. If left blank \n"
- "NO is used. \n",
- TRUE
- );
- cb = addBool(
- "WARN_IF_UNDOCUMENTED",
- "If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings \n"
- "for undocumented members. If EXTRACT_ALL is set to YES then this flag will \n"
- "automatically be disabled. \n",
- TRUE
- );
- cb = addBool(
- "WARN_IF_DOC_ERROR",
- "If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for \n"
- "potential errors in the documentation, such as not documenting some \n"
- "parameters in a documented function, or documenting parameters that \n"
- "don't exist or using markup commands wrongly. \n",
- TRUE
- );
- cb = addBool( "WARN_NO_PARAMDOC",
- "This WARN_NO_PARAMDOC option can be abled to get warnings for \n"
- "functions that are documented, but have no documentation for their parameters \n"
- "or return value. If set to NO (the default) doxygen will only warn about \n"
- "wrong or incomplete parameter documentation, but not about the absence of \n"
- "documentation.\n",
- FALSE
- );
- cs = addString(
- "WARN_FORMAT",
- "The WARN_FORMAT tag determines the format of the warning messages that \n"
- "doxygen can produce. The string should contain the $file, $line, and $text \n"
- "tags, which will be replaced by the file and line number from which the \n"
- "warning originated and the warning text. Optionally the format may contain \n"
- "$version, which will be replaced by the version of the file (if it could \n"
- "be obtained via FILE_VERSION_FILTER)\n"
- );
- cs->setDefaultValue("$file:$line: $text");
- cs = addString(
- "WARN_LOGFILE",
- "The WARN_LOGFILE tag can be used to specify a file to which warning \n"
- "and error messages should be written. If left blank the output is written \n"
- "to stderr. \n"
- );
- cs->setWidgetType(ConfigString::File);
- //-----------------------------------------------------------------------------------------------
- addInfo( "Input","configuration options related to the input files");
- //-----------------------------------------------------------------------------------------------
- cl = addList(
- "INPUT",
- "The INPUT tag can be used to specify the files and/or directories that contain \n"
- "documented source files. You may enter file names like \"myfile.cpp\" or \n"
- "directories like \"/usr/src/myproject\". Separate the files or directories \n"
- "with spaces. \n"
- );
- cl->setWidgetType(ConfigList::FileAndDir);
- cl = addList(
- "FILE_PATTERNS",
- "If the value of the INPUT tag contains directories, you can use the \n"
- "FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp \n"
- "and *.h) to filter out the source-files in the directories. If left \n"
- "blank the following patterns are tested: \n"
- "*.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx \n"
- "*.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm\n"
- );
- cb = addBool(
- "RECURSIVE",
- "The RECURSIVE tag can be used to turn specify whether or not subdirectories \n"
- "should be searched for input files as well. Possible values are YES and NO. \n"
- "If left blank NO is used. \n",
- FALSE
- );
- cl = addList(
- "EXCLUDE",
- "The EXCLUDE tag can be used to specify files and/or directories that should \n"
- "excluded from the INPUT source files. This way you can easily exclude a \n"
- "subdirectory from a directory tree whose root is specified with the INPUT tag. \n"
- );
- cb = addBool(
- "EXCLUDE_SYMLINKS",
- "The EXCLUDE_SYMLINKS tag can be used select whether or not files or \n"
- "directories that are symbolic links (a Unix filesystem feature) are excluded \n"
- "from the input. \n",
- FALSE
- );
- cl->setWidgetType(ConfigList::FileAndDir);
- cl = addList(
- "EXCLUDE_PATTERNS",
- "If the value of the INPUT tag contains directories, you can use the \n"
- "EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude \n"
- "certain files from those directories. Note that the wildcards are matched \n"
- "against the file with absolute path, so to exclude all test directories \n"
- "for example use the pattern */test/* \n"
- );
- cl = addList(
- "EXAMPLE_PATH",
- "The EXAMPLE_PATH tag can be used to specify one or more files or \n"
- "directories that contain example code fragments that are included (see \n"
- "the \\include command). \n"
- );
- cl->setWidgetType(ConfigList::Dir);
- cl = addList(
- "EXAMPLE_PATTERNS",
- "If the value of the EXAMPLE_PATH tag contains directories, you can use the \n"
- "EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp \n"
- "and *.h) to filter out the source-files in the directories. If left \n"
- "blank all files are included. \n"
- );
- cb = addBool(
- "EXAMPLE_RECURSIVE",
- "If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be \n"
- "searched for input files to be used with the \\include or \\dontinclude \n"
- "commands irrespective of the value of the RECURSIVE tag. \n"
- "Possible values are YES and NO. If left blank NO is used. \n",
- FALSE
- );
- cl = addList(
- "IMAGE_PATH",
- "The IMAGE_PATH tag can be used to specify one or more files or \n"
- "directories that contain image that are included in the documentation (see \n"
- "the \\image command). \n"
- );
- cl->setWidgetType(ConfigList::Dir);
- cs = addString(
- "INPUT_FILTER",
- "The INPUT_FILTER tag can be used to specify a program that doxygen should \n"
- "invoke to filter for each input file. Doxygen will invoke the filter program \n"
- "by executing (via popen()) the command <filter> <input-file>, where <filter> \n"
- "is the value of the INPUT_FILTER tag, and <input-file> is the name of an \n"
- "input file. Doxygen will then use the output that the filter program writes \n"
- "to standard output. If FILTER_PATTERNS is specified, this tag will be \n"
- "ignored. \n"
- );
- cs->setWidgetType(ConfigString::File);
- cl = addList(
- "FILTER_PATTERNS",
- "The FILTER_PATTERNS tag can be used to specify filters on a per file pattern \n"
- "basis. Doxygen will compare the file name with each pattern and apply the \n"
- "filter if there is a match. The filters are a list of the form: \n"
- "pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further \n"
- "info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER \n"
- "is applied to all files. \n"
- );
- cl->setWidgetType(ConfigList::File);
- cb = addBool(
- "FILTER_SOURCE_FILES",
- "If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using \n"
- "INPUT_FILTER) will be used to filter the input files when producing source \n"
- "files to browse (i.e. when SOURCE_BROWSER is set to YES). \n",
- FALSE
- );
- //-----------------------------------------------------------------------------------------------
- addInfo( "Source Browser","configuration options related to source browsing");
- //-----------------------------------------------------------------------------------------------
- cb = addBool(
- "SOURCE_BROWSER",
- "If the SOURCE_BROWSER tag is set to YES then a list of source files will \n"
- "be generated. Documented entities will be cross-referenced with these sources. \n"
- "Note: To get rid of all source code in the generated output, make sure also \n"
- "VERBATIM_HEADERS is set to NO. \n",
- FALSE
- );
- cb = addBool(
- "INLINE_SOURCES",
- "Setting the INLINE_SOURCES tag to YES will include the body \n"
- "of functions and classes directly in the documentation. \n",
- FALSE
- );
- cb = addBool(
- "STRIP_CODE_COMMENTS",
- "Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct \n"
- "doxygen to hide any special comment blocks from generated source code \n"
- "fragments. Normal C and C++ comments will always remain visible. \n",
- TRUE
- );
- cb = addBool( "REFERENCED_BY_RELATION",
- "If the REFERENCED_BY_RELATION tag is set to YES (the default) \n"
- "then for each documented function all documented \n"
- "functions referencing it will be listed. \n",
- TRUE
- );
- cb->addDependency("SOURCE_BROWSER");
- cb = addBool( "REFERENCES_RELATION",
- "If the REFERENCES_RELATION tag is set to YES (the default) \n"
- "then for each documented function all documented entities \n"
- "called/used by that function will be listed. \n",
- TRUE
- );
- cb->addDependency("SOURCE_BROWSER");
- cb = addBool(
- "USE_HTAGS",
- "If the USE_HTAGS tag is set to YES then the references to source code \n"
- "will point to the HTML generated by the htags(1) tool instead of doxygen \n"
- "built-in source browser. The htags tool is part of GNU's global source \n"
- "tagging system (see http://www.gnu.org/software/global/global.html). You \n"
- "will need version 4.8.6 or higher. \n",
- FALSE
- );
- cb->addDependency("SOURCE_BROWSER");
- cb = addBool(
- "VERBATIM_HEADERS",
- "If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen \n"
- "will generate a verbatim copy of the header file for each class for \n"
- "which an include is specified. Set to NO to disable this. \n",
- TRUE
- );
-
- //-----------------------------------------------------------------------------------------------
- addInfo( "Index","configuration options related to the alphabetical class index");
- //-----------------------------------------------------------------------------------------------
-
- cb = addBool(
- "ALPHABETICAL_INDEX",
- "If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index \n"
- "of all compounds will be generated. Enable this if the project \n"
- "contains a lot of classes, structs, unions or interfaces. \n",
- FALSE
- );
- ci = addInt(
- "COLS_IN_ALPHA_INDEX",
- "If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then \n"
- "the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns \n"
- "in which this list will be split (can be a number in the range [1..20]) \n",
- 1,20,5
- );
- cl = addList(
- "IGNORE_PREFIX",
- "In case all classes in a project start with a common prefix, all \n"
- "classes will be put under the same header in the alphabetical index. \n"
- "The IGNORE_PREFIX tag can be used to specify one or more prefixes that \n"
- "should be ignored while generating the index headers. \n"
- );
- //-----------------------------------------------------------------------------------------------
- addInfo( "HTML","configuration options related to the HTML output");
- //-----------------------------------------------------------------------------------------------
- cb = addBool(
- "GENERATE_HTML",
- "If the GENERATE_HTML tag is set to YES (the default) Doxygen will \n"
- "generate HTML output. \n",
- TRUE
- );
- cs = addString(
- "HTML_OUTPUT",
- "The HTML_OUTPUT tag is used to specify where the HTML docs will be put. \n"
- "If a relative path is entered the value of OUTPUT_DIRECTORY will be \n"
- "put in front of it. If left blank `html' will be used as the default path. \n"
- );
- cs->setDefaultValue("html");
- cs->setWidgetType(ConfigString::Dir);
- cs->addDependency("GENERATE_HTML");
- cs = addString(
- "HTML_FILE_EXTENSION",
- "The HTML_FILE_EXTENSION tag can be used to specify the file extension for \n"
- "each generated HTML page (for example: .htm,.php,.asp). If it is left blank \n"
- "doxygen will generate files with .html extension.\n"
- );
- cs->setDefaultValue(".html");
- cs->addDependency("GENERATE_HTML");
- cs = addString(
- "HTML_HEADER",
- "The HTML_HEADER tag can be used to specify a personal HTML header for \n"
- "each generated HTML page. If it is left blank doxygen will generate a \n"
- "standard header.\n"
- );
- cs->setWidgetType(ConfigString::File);
- cs->addDependency("GENERATE_HTML");
- cs = addString(
- "HTML_FOOTER",
- "The HTML_FOOTER tag can be used to specify a personal HTML footer for \n"
- "each generated HTML page. If it is left blank doxygen will generate a \n"
- "standard footer.\n"
- );
- cs->setWidgetType(ConfigString::File);
- cs->addDependency("GENERATE_HTML");
- cs = addString(
- "HTML_STYLESHEET",
- "The HTML_STYLESHEET tag can be used to specify a user-defined cascading \n"
- "style sheet that is used by each HTML page. It can be used to \n"
- "fine-tune the look of the HTML output. If the tag is left blank doxygen \n"
- "will generate a default style sheet. Note that doxygen will try to copy \n"
- "the style sheet file to the HTML output directory, so don't put your own \n"
- "stylesheet in the HTML output directory as well, or it will be erased! \n"
- );
- cs->setWidgetType(ConfigString::File);
- cs->addDependency("GENERATE_HTML");
- cb = addBool(
- "HTML_ALIGN_MEMBERS",
- "If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, \n"
- "files or namespaces will be aligned in HTML using tables. If set to \n"
- "NO a bullet list will be used. \n",
- TRUE
- );
- cb->addDependency("GENERATE_HTML");
- cb = addBool(
- "GENERATE_HTMLHELP",
- "If the GENERATE_HTMLHELP tag is set to YES, additional index files \n"
- "will be generated that can be used as input for tools like the \n"
- "Microsoft HTML help workshop to generate a compressed HTML help file (.chm) \n"
- "of the generated HTML documentation. \n",
- FALSE
- );
- cb->addDependency("GENERATE_HTML");
- cs = addString(
- "CHM_FILE",
- "If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can \n"
- "be used to specify the file name of the resulting .chm file. You \n"
- "can add a path in front of the file if the result should not be \n"
- "written to the html output directory. \n"
- );
- cs->setWidgetType(ConfigString::File);
- cs->addDependency("GENERATE_HTML");
- cs = addString(
- "HHC_LOCATION",
- "If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can \n"
- "be used to specify the location (absolute path including file name) of \n"
- "the HTML help compiler (hhc.exe). If non-empty doxygen will try to run \n"
- "the HTML help compiler on the generated index.hhp.\n"
- );
- cs->setWidgetType(ConfigString::File);
- cs->addDependency("GENERATE_HTML");
- cb = addBool(
- "GENERATE_CHI",
- "If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag \n"
- "controls if a separate .chi index file is generated (YES) or that \n"
- "it should be included in the master .chm file (NO).\n",
- FALSE
- );
- cb->addDependency("GENERATE_HTML");
- cb = addBool(
- "BINARY_TOC",
- "If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag \n"
- "controls whether a binary table of contents is generated (YES) or a \n"
- "normal table of contents (NO) in the .chm file.\n",
- FALSE
- );
- cb->addDependency("GENERATE_HTML");
- cb = addBool(
- "TOC_EXPAND",
- "The TOC_EXPAND flag can be set to YES to add extra items for group members \n"
- "to the contents of the HTML help documentation and to the tree view. \n",
- FALSE
- );
- cb->addDependency("GENERATE_HTML");
- cb = addBool(
- "DISABLE_INDEX",
- "The DISABLE_INDEX tag can be used to turn on/off the condensed index at \n"
- "top of each HTML page. The value NO (the default) enables the index and \n"
- "the value YES disables it. \n",
- FALSE
- );
- cb->addDependency("GENERATE_HTML");
- ci = addInt(
- "ENUM_VALUES_PER_LINE",
- "This tag can be used to set the number of enum values (range [1..20]) \n"
- "that doxygen will group on one line in the generated HTML documentation. \n",
- 1,20,4
- );
- ci->addDependency("GENERATE_HTML");
- cb = addBool(
- "GENERATE_TREEVIEW",
- "If the GENERATE_TREEVIEW tag is set to YES, a side panel will be\n"
- "generated containing a tree-like index structure (just like the one that \n"
- "is generated for HTML Help). For this to work a browser that supports \n"
- "JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, \n"
- "Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are \n"
- "probably better off using the HTML help feature. \n",
- FALSE
- );
- cb->addDependency("GENERATE_HTML");
- ci = addInt(
- "TREEVIEW_WIDTH",
- "If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be \n"
- "used to set the initial width (in pixels) of the frame in which the tree \n"
- "is shown. \n",
- 0,1500,250
- );
- ci->addDependency("GENERATE_HTML");
-
- //-----------------------------------------------------------------------------------------------
- addInfo( "LaTeX","configuration options related to the LaTeX output");
- //-----------------------------------------------------------------------------------------------
- cb = addBool(
- "GENERATE_LATEX",
- "If the GENERATE_LATEX tag is set to YES (the default) Doxygen will \n"
- "generate Latex output. \n",
- TRUE
- );
- cs = addString(
- "LATEX_OUTPUT",
- "The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. \n"
- "If a relative path is entered the value of OUTPUT_DIRECTORY will be \n"
- "put in front of it. If left blank `latex' will be used as the default path. \n"
- );
- cs->setDefaultValue("latex");
- cs->setWidgetType(ConfigString::Dir);
- cs->addDependency("GENERATE_LATEX");
- cs = addString(
- "LATEX_CMD_NAME",
- "The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be \n"
- "invoked. If left blank `latex' will be used as the default command name. \n"
- );
- cs->setDefaultValue("latex");
- cs->setWidgetType(ConfigString::File);
- cs->addDependency("GENERATE_LATEX");
- cs = addString(
- "MAKEINDEX_CMD_NAME",
- "The MAKEINDEX_CMD_NAME tag can be used to specify the command name to \n"
- "generate index for LaTeX. If left blank `makeindex' will be used as the \n"
- "default command name. \n"
- );
- cs->setDefaultValue("makeindex");
- cs->setWidgetType(ConfigString::File);
- cs->addDependency("GENERATE_LATEX");
- cb = addBool(
- "COMPACT_LATEX",
- "If the COMPACT_LATEX tag is set to YES Doxygen generates more compact \n"
- "LaTeX documents. This may be useful for small projects and may help to \n"
- "save some trees in general. \n",
- FALSE
- );
- cb->addDependency("GENERATE_LATEX");
- ce = addEnum(
- "PAPER_TYPE",
- "The PAPER_TYPE tag can be used to set the paper type that is used \n"
- "by the printer. Possible values are: a4, a4wide, letter, legal and \n"
- "executive. If left blank a4wide will be used. \n",
- "a4wide"
- );
- ce->addValue("a4");
- ce->addValue("a4wide");
- ce->addValue("letter");
- ce->addValue("legal");
- ce->addValue("executive");
- ce->addDependency("GENERATE_LATEX");
- cl = addList(
- "EXTRA_PACKAGES",
- "The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX \n"
- "packages that should be included in the LaTeX output. \n"
- );
- cl->addDependency("GENERATE_LATEX");
- cs = addString(
- "LATEX_HEADER",
- "The LATEX_HEADER tag can be used to specify a personal LaTeX header for \n"
- "the generated latex document. The header should contain everything until \n"
- "the first chapter. If it is left blank doxygen will generate a \n"
- "standard header. Notice: only use this tag if you know what you are doing! \n"
- );
- cs->setWidgetType(ConfigString::File);
- cs->addDependency("GENERATE_LATEX");
- cb = addBool(
- "PDF_HYPERLINKS",
- "If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated \n"
- "is prepared for conversion to pdf (using ps2pdf). The pdf file will \n"
- "contain links (just like the HTML output) instead of page references \n"
- "This makes the output suitable for online browsing using a pdf viewer. \n",
- FALSE
- );
- cb->addDependency("GENERATE_LATEX");
- cb = addBool(
- "USE_PDFLATEX",
- "If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of \n"
- "plain latex in the generated Makefile. Set this option to YES to get a \n"
- "higher quality PDF documentation. \n",
- FALSE
- );
- cb->addDependency("GENERATE_LATEX");
- cb = addBool(
- "LATEX_BATCHMODE",
- "If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\\\batchmode. \n"
- "command to the generated LaTeX files. This will instruct LaTeX to keep \n"
- "running if errors occur, instead of asking the user for help. \n"
- "This option is also used when generating formulas in HTML. \n",
- FALSE
- );
- cb->addDependency("GENERATE_LATEX");
- cb = addBool(
- "LATEX_HIDE_INDICES",
- "If LATEX_HIDE_INDICES is set to YES then doxygen will not \n"
- "include the index chapters (such as File Index, Compound Index, etc.) \n"
- "in the output. \n",
- FALSE
- );
- cb->addDependency("GENERATE_LATEX");
- //-----------------------------------------------------------------------------------------------
- addInfo( "RTF","configuration options related to the RTF output");
- //-----------------------------------------------------------------------------------------------
- cb = addBool(
- "GENERATE_RTF",
- "If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output \n"
- "The RTF output is optimized for Word 97 and may not look very pretty with \n"
- "other RTF readers or editors.\n",
- FALSE
- );
- cs = addString(
- "RTF_OUTPUT",
- "The RTF_OUTPUT tag is used to specify where the RTF docs will be put. \n"
- "If a relative path is entered the value of OUTPUT_DIRECTORY will be \n"
- "put in front of it. If left blank `rtf' will be used as the default path. \n"
- );
- cs->setDefaultValue("rtf");
- cs->setWidgetType(ConfigString::Dir);
- cs->addDependency("GENERATE_RTF");
- cb = addBool(
- "COMPACT_RTF",
- "If the COMPACT_RTF tag is set to YES Doxygen generates more compact \n"
- "RTF documents. This may be useful for small projects and may help to \n"
- "save some trees in general. \n",
- FALSE
- );
- cb->addDependency("GENERATE_RTF");
- cb = addBool(
- "RTF_HYPERLINKS",
- "If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated \n"
- "will contain hyperlink fields. The RTF file will \n"
- "contain links (just like the HTML output) instead of page references. \n"
- "This makes the output suitable for online browsing using WORD or other \n"
- "programs which support those fields. \n"
- "Note: wordpad (write) and others do not support links. \n",
- FALSE
- );
- cb->addDependency("GENERATE_RTF");
- cs = addString(
- "RTF_STYLESHEET_FILE",
- "Load stylesheet definitions from file. Syntax is similar to doxygen's \n"
- "config file, i.e. a series of assignments. You only have to provide \n"
- "replacements, missing definitions are set to their default value. \n"
- );
- cs->setWidgetType(ConfigString::File);
- cs->addDependency("GENERATE_RTF");
- cs = addString(
- "RTF_EXTENSIONS_FILE",
- "Set optional variables used in the generation of an rtf document. \n"
- "Syntax is similar to doxygen's config file.\n"
- );
- cs->setWidgetType(ConfigString::File);
- cs->addDependency("GENERATE_RTF");
-
- //-----------------------------------------------------------------------------------------------
- addInfo( "Man","configuration options related to the man page output");
- //-----------------------------------------------------------------------------------------------
- cb = addBool(
- "GENERATE_MAN",
- "If the GENERATE_MAN tag is set to YES (the default) Doxygen will \n"
- "generate man pages \n",
- FALSE
- );
- cs = addString(
- "MAN_OUTPUT",
- "The MAN_OUTPUT tag is used to specify where the man pages will be put. \n"
- "If a relative path is entered the value of OUTPUT_DIRECTORY will be \n"
- "put in front of it. If left blank `man' will be used as the default path. \n"
- );
- cs->setDefaultValue("man");
- cs->setWidgetType(ConfigString::Dir);
- cs->addDependency("GENERATE_MAN");
- cs = addString(
- "MAN_EXTENSION",
- "The MAN_EXTENSION tag determines the extension that is added to \n"
- "the generated man pages (default is the subroutine's section .3) \n"
- );
- cs->setDefaultValue(".3");
- cs->addDependency("GENERATE_MAN");
- cb = addBool(
- "MAN_LINKS",
- "If the MAN_LINKS tag is set to YES and Doxygen generates man output, \n"
- "then it will generate one additional man file for each entity \n"
- "documented in the real man page(s). These additional files \n"
- "only source the real man page, but without them the man command \n"
- "would be unable to find the correct page. The default is NO. \n",
- FALSE
- );
- cb->addDependency("GENERATE_MAN");
- //-----------------------------------------------------------------------------------------------
- addInfo( "XML","configuration options related to the XML output");
- //-----------------------------------------------------------------------------------------------
- cb = addBool(
- "GENERATE_XML",
- "If the GENERATE_XML tag is set to YES Doxygen will \n"
- "generate an XML file that captures the structure of \n"
- "the code including all documentation. \n",
- FALSE
- );
- cs = addString(
- "XML_OUTPUT",
- "The XML_OUTPUT tag is used to specify where the XML pages will be put. \n"
- "If a relative path is entered the value of OUTPUT_DIRECTORY will be \n"
- "put in front of it. If left blank `xml' will be used as the default path. \n"
- );
- cs->setDefaultValue("xml");
- cs->setWidgetType(ConfigString::Dir);
- cs->addDependency("GENERATE_XML");
- cs = addString(
- "XML_SCHEMA",
- "The XML_SCHEMA tag can be used to specify an XML schema, \n"
- "which can be used by a validating XML parser to check the \n"
- "syntax of the XML files. \n"
- );
- cs->addDependency("GENERATE_XML");
- cs = addString(
- "XML_DTD",
- "The XML_DTD tag can be used to specify an XML DTD, \n"
- "which can be used by a validating XML parser to check the \n"
- "syntax of the XML files. \n"
- );
- cs->addDependency("GENERATE_XML");
- cb = addBool(
- "XML_PROGRAMLISTING",
- "If the XML_PROGRAMLISTING tag is set to YES Doxygen will \n"
- "dump the program listings (including syntax highlighting \n"
- "and cross-referencing information) to the XML output. Note that \n"
- "enabling this will significantly increase the size of the XML output. \n",
- TRUE
- );
- cb->addDependency("GENERATE_XML");
-
- //--------------------------------------------------------------------------
- addInfo( "DEF","configuration options for the AutoGen Definitions output");
- //--------------------------------------------------------------------------
- cb = addBool("GENERATE_AUTOGEN_DEF",
-
- "If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will \n"
- "generate an AutoGen Definitions (see autogen.sf.net) file \n"
- "that captures the structure of the code including all \n"
- "documentation. Note that this feature is still experimental \n"
- "and incomplete at the moment. \n",
-
- FALSE );
- //-----------------------------------------------------------------------------------------------
- addInfo( "PerlMod","configuration options related to the Perl module output");
- //-----------------------------------------------------------------------------------------------
- cb = addBool(
- "GENERATE_PERLMOD",
- "If the GENERATE_PERLMOD tag is set to YES Doxygen will \n"
- "generate a Perl module file that captures the structure of \n"
- "the code including all documentation. Note that this \n"
- "feature is still experimental and incomplete at the \n"
- "moment. \n",
- FALSE
- );
- cb = addBool(
- "PERLMOD_LATEX",
- "If the PERLMOD_LATEX tag is set to YES Doxygen will generate \n"
- "the necessary Makefile rules, Perl scripts and LaTeX code to be able \n"
- "to generate PDF and DVI output from the Perl module output. \n",
- FALSE
- );
- cb->addDependency("GENERATE_PERLMOD");
- cb = addBool(
- "PERLMOD_PRETTY",
- "If the PERLMOD_PRETTY tag is set to YES the Perl module output will be \n"
- "nicely formatted so it can be parsed by a human reader. This is useful \n"
- "if you want to understand what is going on. On the other hand, if this \n"
- "tag is set to NO the size of the Perl module output will be much smaller \n"
- "and Perl will parse it just the same. \n",
- TRUE
- );
- cb->addDependency("GENERATE_PERLMOD");
- cs = addString(
- "PERLMOD_MAKEVAR_PREFIX",
- "The names of the make variables in the generated doxyrules.make file \n"
- "are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. \n"
- "This is useful so different doxyrules.make files included by the same \n"
- "Makefile don't overwrite each other's variables."
- );
- cs->addDependency("GENERATE_PERLMOD");
-
- //-----------------------------------------------------------------------------------------------
- addInfo( "Preprocessor","Configuration options related to the preprocessor ");
- //-----------------------------------------------------------------------------------------------
- cb = addBool(
- "ENABLE_PREPROCESSING",
- "If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will \n"
- "evaluate all C-preprocessor directives found in the sources and include \n"
- "files. \n",
- TRUE
- );
- cb = addBool(
- "MACRO_EXPANSION",
- "If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro \n"
- "names in the source code. If set to NO (the default) only conditional \n"
- "compilation will be performed. Macro expansion can be done in a controlled \n"
- "way by setting EXPAND_ONLY_PREDEF to YES. \n",
- FALSE
- );
- cb->addDependency("ENABLE_PREPROCESSING");
- cb = addBool(
- "EXPAND_ONLY_PREDEF",
- "If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES \n"
- "then the macro expansion is limited to the macros specified with the \n"
- "PREDEFINED and EXPAND_AS_PREDEFINED tags. \n",
- FALSE
- );
- cb->addDependency("ENABLE_PREPROCESSING");
- cb = addBool(
- "SEARCH_INCLUDES",
- "If the SEARCH_INCLUDES tag is set to YES (the default) the includes files \n"
- "in the INCLUDE_PATH (see below) will be search if a #include is found. \n",
- TRUE
- );
- cb->addDependency("ENABLE_PREPROCESSING");
- cl = addList(
- "INCLUDE_PATH",
- "The INCLUDE_PATH tag can be used to specify one or more directories that \n"
- "contain include files that are not input files but should be processed by \n"
- "the preprocessor.\n"
- );
- cl->setWidgetType(ConfigList::Dir);
- cl->addDependency("ENABLE_PREPROCESSING");
- cl = addList(
- "INCLUDE_FILE_PATTERNS",
- "You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard \n"
- "patterns (like *.h and *.hpp) to filter out the header-files in the \n"
- "directories. If left blank, the patterns specified with FILE_PATTERNS will \n"
- "be used. \n"
- );
- cl->addDependency("ENABLE_PREPROCESSING");
- cl = addList(
- "PREDEFINED",
- "The PREDEFINED tag can be used to specify one or more macro names that \n"
- "are defined before the preprocessor is started (similar to the -D option of \n"
- "gcc). The argument of the tag is a list of macros of the form: name \n"
- "or name=definition (no spaces). If the definition and the = are \n"
- "omitted =1 is assumed. To prevent a macro definition from being \n"
- "undefined via #undef or recursively expanded use the := operator \n"
- "instead of the = operator.\n"
- );
- cl->addDependency("ENABLE_PREPROCESSING");
- cl = addList(
- "EXPAND_AS_DEFINED",
- "If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then \n"
- "this tag can be used to specify a list of macro names that should be expanded. \n"
- "The macro definition that is found in the sources will be used. \n"
- "Use the PREDEFINED tag if you want to use a different macro definition. \n"
- );
- cl->addDependency("ENABLE_PREPROCESSING");
- cb = addBool(
- "SKIP_FUNCTION_MACROS",
- "If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then \n"
- "doxygen's preprocessor will remove all function-like macros that are alone \n"
- "on a line, have an all uppercase name, and do not end with a semicolon. Such \n"
- "function macros are typically used for boiler-plate code, and will confuse \n"
- "the parser if not removed. \n",
- TRUE
- );
- cb->addDependency("ENABLE_PREPROCESSING");
- //-----------------------------------------------------------------------------------------------
- addInfo( "External","Configuration::additions related to external references ");
- //-----------------------------------------------------------------------------------------------
- cl = addList(
- "TAGFILES",
- "The TAGFILES option can be used to specify one or more tagfiles. \n"
- "Optionally an initial location of the external documentation \n"
- "can be added for each tagfile. The format of a tag file without \n"
- "this location is as follows: \n"
- " TAGFILES = file1 file2 ... \n"
- "Adding location for the tag files is done as follows: \n"
- " TAGFILES = file1=loc1 \"file2 = loc2\" ... \n"
- "where \"loc1\" and \"loc2\" can be relative or absolute paths or \n"
- "URLs. If a location is present for each tag, the installdox tool \n"
- "does not have to be run to correct the links.\n"
- "Note that each tag file must have a unique name\n"
- "(where the name does NOT include the path)\n"
- "If a tag file is not located in the directory in which doxygen \n"
- "is run, you must also specify the path to the tagfile here. \n"
- );
- cl->setWidgetType(ConfigList::File);
- cs = addString(
- "GENERATE_TAGFILE",
- "When a file name is specified after GENERATE_TAGFILE, doxygen will create \n"
- "a tag file that is based on the input files it reads. \n"
- );
- cs->setWidgetType(ConfigString::File);
- cb = addBool(
- "ALLEXTERNALS",
- "If the ALLEXTERNALS tag is set to YES all external classes will be listed \n"
- "in the class index. If set to NO only the inherited external classes \n"
- "will be listed. \n",
- FALSE
- );
- cb = addBool(
- "EXTERNAL_GROUPS",
- "If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed \n"
- "in the modules index. If set to NO, only the current project's groups will \n"
- "be listed. \n",
- TRUE
- );
- cs = addString(
- "PERL_PATH",
- "The PERL_PATH should be the absolute path and name of the perl script \n"
- "interpreter (i.e. the result of `which perl'). \n"
- );
- cs->setDefaultValue("/usr/bin/perl");
- cs->setWidgetType(ConfigString::Dir);
-
- //-----------------------------------------------------------------------------------------------
- addInfo( "Dot","Configuration options related to the dot tool ");
- //-----------------------------------------------------------------------------------------------
- cb = addBool(
- "CLASS_DIAGRAMS",
- "If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will \n"
- "generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base \n"
- "or super classes. Setting the tag to NO turns the diagrams off. Note that \n"
- "this option is superseded by the HAVE_DOT option below. This is only a \n"
- "fallback. It is recommended to install and use dot, since it yields more \n"
- "powerful graphs. \n",
- TRUE
- );
- cb = addBool(
- "HIDE_UNDOC_RELATIONS",
- "If set to YES, the inheritance and collaboration graphs will hide \n"
- "inheritance and usage relations if the target is undocumented \n"
- "or is not a class. \n",
- TRUE
- );
- cb = addBool(
- "HAVE_DOT",
- "If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is \n"
- "available from the path. This tool is part of Graphviz, a graph visualization \n"
- "toolkit from AT&T and Lucent Bell Labs. The other options in this section \n"
- "have no effect if this option is set to NO (the default) \n",
- FALSE
- );
- cb = addBool(
- "CLASS_GRAPH",
- "If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen \n"
- "will generate a graph for each documented class showing the direct and \n"
- "indirect inheritance relations. Setting this tag to YES will force the \n"
- "the CLASS_DIAGRAMS tag to NO.\n",
- TRUE
- );
- cb->addDependency("HAVE_DOT");
- cb = addBool(
- "COLLABORATION_GRAPH",
- "If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen \n"
- "will generate a graph for each documented class showing the direct and \n"
- "indirect implementation dependencies (inheritance, containment, and \n"
- "class references variables) of the class with other documented classes. \n",
- TRUE
- );
- cb->addDependency("HAVE_DOT");
- cb = addBool(
- "GROUP_GRAPHS",
- "If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen \n"
- "will generate a graph for groups, showing the direct groups dependencies\n",
- TRUE
- );
- cb->addDependency("HAVE_DOT");
- cb = addBool(
- "UML_LOOK",
- "If the UML_LOOK tag is set to YES doxygen will generate inheritance and \n"
- "collaboration diagrams in a style similar to the OMG's Unified Modeling \n"
- "Language. \n",
- FALSE
- );
- cb->addDependency("HAVE_DOT");
- cb = addBool(
- "TEMPLATE_RELATIONS",
- "If set to YES, the inheritance and collaboration graphs will show the \n"
- "relations between templates and their instances. \n",
- FALSE
- );
- cb->addDependency("HAVE_DOT");
- cb = addBool(
- "INCLUDE_GRAPH",
- "If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT \n"
- "tags are set to YES then doxygen will generate a graph for each documented \n"
- "file showing the direct and indirect include dependencies of the file with \n"
- "other documented files. \n",
- TRUE
- );
- cb->addDependency("HAVE_DOT");
- cb = addBool(
- "INCLUDED_BY_GRAPH",
- "If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and \n"
- "HAVE_DOT tags are set to YES then doxygen will generate a graph for each \n"
- "documented header file showing the documented files that directly or \n"
- "indirectly include this file. \n",
- TRUE
- );
- cb->addDependency("HAVE_DOT");
- cb = addBool(
- "CALL_GRAPH",
- "If the CALL_GRAPH and HAVE_DOT tags are set to YES then doxygen will \n"
- "generate a call dependency graph for every global function or class method. \n"
- "Note that enabling this option will significantly increase the time of a run. \n"
- "So in most cases it will be better to enable call graphs for selected \n"
- "functions only using the \\callgraph command.\n",
- FALSE
- );
- cb->addDependency("HAVE_DOT");
- cb = addBool(
- "GRAPHICAL_HIERARCHY",
- "If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen \n"
- "will graphical hierarchy of all classes instead of a textual one. \n",
- TRUE
- );
- cb->addDependency("HAVE_DOT");
- cb = addBool(
- "DIRECTORY_GRAPH",
- "If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES \n"
- "then doxygen will show the dependencies a directory has on other directories \n"
- "in a graphical way. The dependency relations are determined by the #include\n"
- "relations between the files in the directories.\n",
- TRUE
- );
- cb->addDependency("HAVE_DOT");
- ce = addEnum(
- "DOT_IMAGE_FORMAT",
- "The DOT_IMAGE_FORMAT tag can be used to set the image format of the images \n"
- "generated by dot. Possible values are png, jpg, or gif\n"
- "If left blank png will be used. \n",
- "png"
- );
- ce->addValue("png");
- ce->addValue("jpg");
- ce->addValue("gif");
- ce->addDependency("HAVE_DOT");
- cs = addString(
- "DOT_PATH",
- "The tag DOT_PATH can be used to specify the path where the dot tool can be \n"
- "found. If left blank, it is assumed the dot tool can be found in the path. \n"
- );
- cs->setWidgetType(ConfigString::Dir);
- cs->addDependency("HAVE_DOT");
- cl = addList(
- "DOTFILE_DIRS",
- "The DOTFILE_DIRS tag can be used to specify one or more directories that \n"
- "contain dot files that are included in the documentation (see the \n"
- "\\dotfile command). \n"
- );
- cl->setWidgetType(ConfigList::Dir);
- cl->addDependency("HAVE_DOT");
- ci = addInt(
- "MAX_DOT_GRAPH_WIDTH",
- "The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width \n"
- "(in pixels) of the graphs generated by dot. If a graph becomes larger than \n"
- "this value, doxygen will try to truncate the graph, so that it fits within \n"
- "the specified constraint. Beware that most browsers cannot cope with very \n"
- "large images. \n",
- 100,30000, 1024
- );
- ci->addDependency("HAVE_DOT");
- ci = addInt(
- "MAX_DOT_GRAPH_HEIGHT",
- "The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height \n"
- "(in pixels) of the graphs generated by dot. If a graph becomes larger than \n"
- "this value, doxygen will try to truncate the graph, so that it fits within \n"
- "the specified constraint. Beware that most browsers cannot cope with very \n"
- "large images. \n",
- 100,30000,1024
- );
- ci = addInt(
- "MAX_DOT_GRAPH_DEPTH",
- "The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the \n"
- "graphs generated by dot. A depth value of 3 means that only nodes reachable \n"
- "from the root by following a path via at most 3 edges will be shown. Nodes \n"
- "that lay further from the root node will be omitted. Note that setting this \n"
- "option to 1 or 2 may greatly reduce the computation time needed for large \n"
- "code bases. Also note that a graph may be further truncated if the graph's \n"
- "image dimensions are not sufficient to fit the graph (see MAX_DOT_GRAPH_WIDTH \n"
- "and MAX_DOT_GRAPH_HEIGHT). If 0 is used for the depth value (the default), \n"
- "the graph is not depth-constrained. \n",
- 0,1000,0
- );
- ci->addDependency("HAVE_DOT");
- cb = addBool(
- "DOT_TRANSPARENT",
- "Set the DOT_TRANSPARENT tag to YES to generate images with a transparent \n"
- "background. This is disabled by default, which results in a white background. \n"
- "Warning: Depending on the platform used, enabling this option may lead to \n"
- "badly anti-aliased labels on the edges of a graph (i.e. they become hard to \n"
- "read). \n",
- FALSE
- );
- cb->addDependency("HAVE_DOT");
- cb = addBool(
- "DOT_MULTI_TARGETS",
- "Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output \n"
- "files in one run (i.e. multiple -o and -T options on the command line). This \n"
- "makes dot run faster, but since only newer versions of dot (>1.8.10) \n"
- "support this, this feature is disabled by default. \n",
- FALSE
- );
- cb->addDependency("HAVE_DOT");
- cb = addBool(
- "GENERATE_LEGEND",
- "If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will \n"
- "generate a legend page explaining the meaning of the various boxes and \n"
- "arrows in the dot generated graphs. \n",
- TRUE
- );
- cb->addDependency("HAVE_DOT");
- cb = addBool(
- "DOT_CLEANUP",
- "If the DOT_CLEANUP tag is set to YES (the default) Doxygen will \n"
- "remove the intermediate dot files that are used to generate \n"
- "the various graphs. \n",
- TRUE
- );
- cb->addDependency("HAVE_DOT");
-
- //-----------------------------------------------------------------------------------------------
- addInfo( "Search","Configuration::additions related to the search engine ");
- //-----------------------------------------------------------------------------------------------
- cb = addBool(
- "SEARCHENGINE",
- "The SEARCHENGINE tag specifies whether or not a search engine should be \n"
- "used. If set to NO the values of all tags below this one will be ignored. \n",
- FALSE
- );
- addObsolete("CGI_NAME");
- addObsolete("CGI_URL");
- addObsolete("DOC_URL");
- addObsolete("DOC_ABSPATH");
- addObsolete("BIN_ABSPATH");
- addObsolete("EXT_DOC_PATHS");
-
- // The IMAGE_PATTERNS tag is now officially obsolete.
-}
-
-static QCString configFileToString(const char *name)
-{
- if (name==0 || name[0]==0) return 0;
- QFile f;
-
- bool fileOpened=FALSE;
- if (name[0]=='-' && name[1]==0) // read from stdin
- {
- fileOpened=f.open(IO_ReadOnly,stdin);
- if (fileOpened)
- {
- const int bSize=4096;
- QCString contents(bSize);
- int totalSize=0;
- int size;
- while ((size=f.readBlock(contents.data()+totalSize,bSize))==bSize)
- {
- totalSize+=bSize;
- contents.resize(totalSize+bSize);
- }
- totalSize+=size+2;
- contents.resize(totalSize);
- contents.at(totalSize-2)='\n'; // to help the scanner
- contents.at(totalSize-1)='\0';
- return contents;
- }
- }
- else // read from file
- {
- QFileInfo fi(name);
- if (!fi.exists() || !fi.isFile())
- {
- config_err("Error: file `%s' not found\n",name);
- return "";
- }
- f.setName(name);
- fileOpened=f.open(IO_ReadOnly);
- if (fileOpened)
- {
- int fsize=f.size();
- QCString contents(fsize+2);
- f.readBlock(contents.data(),fsize);
- f.close();
- if (fsize==0 || contents[fsize-1]=='\n')
- contents[fsize]='\0';
- else
- contents[fsize]='\n'; // to help the scanner
- contents[fsize+1]='\0';
- return contents;
- }
- }
- if (!fileOpened)
- {
- config_err("Error: cannot open file `%s' for reading\n",name);
- }
- return "";
-}
-
-bool Config::parseString(const char *fn,const char *str)
-{
- config = Config::instance();
- inputString = str;
- inputPosition = 0;
- yyFileName = fn;
- yyLineNr = 1;
- includeStack.setAutoDelete(TRUE);
- includeStack.clear();
- includeDepth = 0;
- configYYrestart( configYYin );
- BEGIN( Start );
- configYYlex();
- inputString = 0;
- return TRUE;
-}
-
-bool Config::parse(const char *fn)
-{
- return parseString(fn,configFileToString(fn));
-}
-
-extern "C" { // some bogus code to keep the compiler happy
- //int configYYwrap() { return 1 ; }
-}
diff --git a/src/constexp.h b/src/constexp.h
deleted file mode 100644
index 5631907..0000000
--- a/src/constexp.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 _CONSTEXP_H
-#define _CONSTEXP_H
-
-#include "qtbc.h"
-#include "cppvalue.h"
-
-extern bool parseCppExpression(const char *fileName,int line,const QCString &s);
-extern int cppExpYYparse();
-extern int cppExpYYdebug;
-extern QCString g_strToken;
-extern CPPValue g_resultValue;
-extern QCString g_constExpFileName;
-extern int g_constExpLineNr;
-
-#endif
diff --git a/src/constexp.l b/src/constexp.l
deleted file mode 100644
index 1b97648..0000000
--- a/src/constexp.l
+++ /dev/null
@@ -1,120 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 "constexp.h"
-#include "cppvalue.h"
-#include "ce_parse.h" // generated header file
-
-#define YY_NEVER_INTERACTIVE 1
-
-QCString g_strToken;
-CPPValue g_resultValue;
-int g_constExpLineNr;
-QCString g_constExpFileName;
-
-static const char *g_inputString;
-static int g_inputPosition;
-
-#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;
-}
-
-%}
-
-CONSTSUFFIX ([uU][lL]?[lL]?)|(lL][lL]?[uU]?)
-
-%option nounput
-
-%%
-
-"?" { return TOK_QUESTIONMARK; }
-":" { return TOK_COLON; }
-"||" { return TOK_OR; }
-"&&" { return TOK_AND; }
-"|" { return TOK_BITWISEOR; }
-"^" { return TOK_BITWISEXOR; }
-"&" { return TOK_AMPERSAND; }
-"!=" { return TOK_NOTEQUAL; }
-"==" { return TOK_EQUAL; }
-"<" { return TOK_LESSTHAN; }
-">" { return TOK_GREATERTHAN; }
-"<=" { return TOK_LESSTHANOREQUALTO; }
-">=" { return TOK_GREATERTHANOREQUALTO; }
-"<<" { return TOK_SHIFTLEFT; }
-">>" { return TOK_SHIFTRIGHT; }
-"+" { return TOK_PLUS; }
-"-" { return TOK_MINUS; }
-"*" { return TOK_STAR; }
-"/" { return TOK_DIVIDE; }
-"%" { return TOK_MOD; }
-"~" { return TOK_TILDE; }
-"!" { return TOK_NOT; }
-"(" { return TOK_LPAREN; }
-")" { return TOK_RPAREN; }
-"'"(([^\'\n\r\\]+)|(\\(([ntvbrfa\\?'\"])|([0-9]+)|([xX][0-9a-fA-F]+))))"'" {
- g_strToken=yytext;
- return TOK_CHARACTER;
- }
-0[0-7]*{CONSTSUFFIX}? { g_strToken=yytext;
- return TOK_OCTALINT;
- }
-[1-9][0-9]*{CONSTSUFFIX}? { g_strToken=yytext;
- return TOK_DECIMALINT;
- }
-(0x|0X)[0-9a-fA-F]+{CONSTSUFFIX}? { g_strToken=yytext+2;
- return TOK_HEXADECIMALINT;
- }
-(([0-9]+\.[0-9]*)|([0-9]*\.[0-9]+))([eE]([\-\+])?[0-9]+)?([fFlL])? {
- g_strToken=yytext; return TOK_FLOAT;
- }
-([0-9]+[eE])([\-\+])?[0-9]+([fFlL])? {
- g_strToken=yytext; return TOK_FLOAT;
- }
-.
-\n
-
-%%
-
-bool parseCppExpression(const char *fileName,int lineNr,const QCString &s)
-{
- //printf("Expression: `%s'\n",s.data());
- g_constExpFileName = fileName;
- g_constExpLineNr = lineNr;
- g_inputString = s;
- g_inputPosition = 0;
- cppExpYYrestart( cppExpYYin );
- cppExpYYparse();
- //printf("Result: %ld\n",(long)g_resultValue);
- return (long)g_resultValue!=0;
-}
-
-extern "C" {
- int cppExpYYwrap() { return 1; }
-}
diff --git a/src/constexp.y b/src/constexp.y
deleted file mode 100644
index a473345..0000000
--- a/src/constexp.y
+++ /dev/null
@@ -1,278 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 "cppvalue.h"
-#include "constexp.h"
-#include "message.h"
-
-#if defined(_MSC_VER)
-#define MSDOS
-#endif
-
-#define YYSTYPE CPPValue
-
-#include <stdio.h>
-#include <stdlib.h>
-
-int cppExpYYerror(const char *s)
-{
- warn(g_constExpFileName,g_constExpLineNr,
- "Problem during constant expression evaluation: %s",s);
- return 0;
-}
-
-int cppExpYYlex();
-
-%}
-
-%token TOK_QUESTIONMARK
-%token TOK_COLON
-%token TOK_OR
-%token TOK_AND
-%token TOK_BITWISEOR
-%token TOK_BITWISEXOR
-%token TOK_AMPERSAND
-%token TOK_NOTEQUAL
-%token TOK_EQUAL
-%token TOK_LESSTHAN
-%token TOK_GREATERTHAN
-%token TOK_LESSTHANOREQUALTO
-%token TOK_GREATERTHANOREQUALTO
-%token TOK_SHIFTLEFT
-%token TOK_SHIFTRIGHT
-%token TOK_PLUS
-%token TOK_MINUS
-%token TOK_STAR
-%token TOK_DIVIDE
-%token TOK_MOD
-%token TOK_TILDE
-%token TOK_NOT
-%token TOK_LPAREN
-%token TOK_RPAREN
-%token TOK_OCTALINT
-%token TOK_DECIMALINT
-%token TOK_HEXADECIMALINT
-%token TOK_CHARACTER
-%token TOK_FLOAT
-
-%%
-
-start: constant_expression
- { g_resultValue = $1; return 0; }
-;
-
-constant_expression: logical_or_expression
- { $$ = $1; }
- | logical_or_expression
- TOK_QUESTIONMARK logical_or_expression
- TOK_COLON logical_or_expression
- {
- bool c = ($1.isInt() ? ((long)$1 != 0) : ((double)$1 != 0.0));
- $$ = c ? $3 : $5;
- }
-;
-
-logical_or_expression: logical_and_expression
- { $$ = $1; }
- | logical_or_expression TOK_OR logical_and_expression
- {
- $$ = CPPValue( (long)((long)$1 || (long)$3) );
- }
-;
-
-logical_and_expression: inclusive_or_expression
- { $$ = $1; }
- | logical_and_expression TOK_AND inclusive_or_expression
- {
- $$ = CPPValue( (long)((long)$1 && (long)$3) );
- }
-;
-
-inclusive_or_expression: exclusive_or_expression
- { $$ = $1; }
- | inclusive_or_expression TOK_BITWISEOR
- exclusive_or_expression
- {
- $$ = CPPValue( (long)$1 | (long)$3 );
- }
-;
-
-exclusive_or_expression: and_expression
- { $$ = $1; }
- | exclusive_or_expression TOK_BITWISEXOR and_expression
- {
- $$ = CPPValue( (long)$1 ^ (long)$3 );
- }
-;
-
-and_expression: equality_expression
- { $$ = $1; }
- | and_expression TOK_AMPERSAND equality_expression
- {
- $$ = CPPValue( (long)$1 & (long)$3 );
- }
-;
-
-equality_expression: relational_expression
- { $$ = $1; }
- | equality_expression TOK_EQUAL relational_expression
- {
- $$ = CPPValue( (long)((double)$1 == (double)$3) );
- }
- | equality_expression TOK_NOTEQUAL relational_expression
- {
- $$ = CPPValue( (long)((double)$1 != (double)$3) );
- }
-;
-
-relational_expression: shift_expression
- { $$ = $1; }
- | relational_expression TOK_LESSTHAN shift_expression
- {
- $$ = CPPValue( (long)((double)$1 < (double)$3) );
- }
- | relational_expression TOK_GREATERTHAN shift_expression
- {
- $$ = CPPValue( (long)((double)$1 > (double)$3) );
- }
- | relational_expression TOK_LESSTHANOREQUALTO
- shift_expression
- {
- $$ = CPPValue( (long)((double)$1 <= (double)$3) );
- }
- | relational_expression TOK_GREATERTHANOREQUALTO
- shift_expression
- {
- $$ = CPPValue( (long)((double)$1 >= (double)$3) );
- }
-;
-
-shift_expression: additive_expression
- { $$ = $1; }
- | shift_expression TOK_SHIFTLEFT additive_expression
- {
- $$ = CPPValue( (long)$1 << (long)$3 );
- }
- | shift_expression TOK_SHIFTRIGHT additive_expression
- {
- $$ = CPPValue( (long)$1 >> (long)$3 );
- }
-;
-
-additive_expression: multiplicative_expression
- { $$ = $1; }
- | additive_expression TOK_PLUS multiplicative_expression
- {
- if (!$1.isInt() || !$3.isInt())
- {
- $$ = CPPValue( (double)$1 + (double)$3 );
- }
- else
- {
- $$ = CPPValue( (long)$1 + (long)$3 );
- }
- }
- | additive_expression TOK_MINUS multiplicative_expression
- {
- if (!$1.isInt() || !$3.isInt())
- {
- $$ = CPPValue( (double)$1 - (double)$3 );
- }
- else
- {
- $$ = CPPValue( (long)$1 - (long)$3 );
- }
- }
-;
-
-multiplicative_expression: unary_expression
- { $$ = $1; }
- | multiplicative_expression TOK_STAR unary_expression
- {
- if (!$1.isInt() || !$3.isInt())
- {
- $$ = CPPValue( (double)$1 * (double)$3 );
- }
- else
- {
- $$ = CPPValue( (long)$1 * (long)$3 );
- }
- }
- | multiplicative_expression TOK_DIVIDE unary_expression
- {
- if (!$1.isInt() || !$3.isInt())
- {
- $$ = CPPValue( (double)$1 / (double)$3 );
- }
- else
- {
- long value = $3;
- if (value==0) value=1;
- $$ = CPPValue( (long)$1 / value );
- }
- }
- | multiplicative_expression TOK_MOD unary_expression
- {
- long value = $3;
- if (value==0) value=1;
- $$ = CPPValue( (long)$1 % value );
- }
-;
-
-unary_expression: primary_expression
- { $$ = $1; }
- | TOK_PLUS unary_expression
- { $$ = $1; }
- | TOK_MINUS unary_expression
- {
- if ($2.isInt())
- $$ = CPPValue(-(long)$2);
- else
- $$ = CPPValue(-(double)$2);
- }
- | TOK_TILDE unary_expression
- {
- $$ = CPPValue(~(long)$2);
- }
- | TOK_NOT unary_expression
- {
- $$ = CPPValue((long)!(long)$2);
- }
-;
-
-primary_expression: constant
- { $$ = $1; }
- | TOK_LPAREN constant_expression TOK_RPAREN
- { $$ = $2; }
-;
-
-constant: TOK_OCTALINT
- { $$ = parseOctal(); }
- | TOK_DECIMALINT
- { $$ = parseDecimal(); }
- | TOK_HEXADECIMALINT
- { $$ = parseHexadecimal(); }
- | TOK_CHARACTER
- { $$ = parseCharacter(); }
- | TOK_FLOAT
- { $$ = parseFloat(); }
-;
-
-%%
diff --git a/src/cppvalue.cpp b/src/cppvalue.cpp
deleted file mode 100644
index fbc61f9..0000000
--- a/src/cppvalue.cpp
+++ /dev/null
@@ -1,87 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-
-#include <stdlib.h>
-
-#include "cppvalue.h"
-#include "constexp.h"
-
-CPPValue parseOctal()
-{
- long val = 0;
- for (const char *p = g_strToken.data(); *p != 0; p++)
- {
- if (*p >= '0' && *p <= '7') val = val * 8 + *p - '0';
- }
- return CPPValue(val);
-}
-
-CPPValue parseDecimal()
-{
- long val = 0;
- for (const char *p = g_strToken.data(); *p != 0; p++)
- {
- if (*p >= '0' && *p <= '9') val = val * 10 + *p - '0';
- }
- return CPPValue(val);
-}
-
-CPPValue parseHexadecimal()
-{
- long val = 0;
- for (const char *p = g_strToken.data(); *p != 0; p++)
- {
- if (*p >= '0' && *p <= '9') val = val * 16 + *p - '0';
- else if (*p >= 'a' && *p <= 'f') val = val * 16 + *p - 'a' + 10;
- else if (*p >= 'A' && *p <= 'F') val = val * 16 + *p - 'A' + 10;
- }
- //printf("parseHexadecimal %s->%x\n",g_strToken.data(),val);
- return CPPValue(val);
-}
-
-CPPValue parseCharacter() // does not work for '\n' and the alike
-{
- if (g_strToken[1]=='\\')
- {
- switch(g_strToken[2])
- {
- case 'n': return CPPValue((long)'\n');
- case 't': return CPPValue((long)'\t');
- case 'v': return CPPValue((long)'\v');
- case 'b': return CPPValue((long)'\b');
- case 'r': return CPPValue((long)'\r');
- case 'f': return CPPValue((long)'\f');
- case 'a': return CPPValue((long)'\a');
- case '\\': return CPPValue((long)'\\');
- case '?': return CPPValue((long)'\?');
- case '\'': return CPPValue((long)'\'');
- case '"': return CPPValue((long)'"');
- case '0': return parseOctal();
- case 'x':
- case 'X': return parseHexadecimal();
- default: printf("Invalid escape sequence %s found!\n",g_strToken.data());
- return CPPValue(0L);
- }
- }
- return CPPValue((long)g_strToken[1]);
-}
-
-CPPValue parseFloat()
-{
- return CPPValue(atof(g_strToken));
-}
diff --git a/src/cppvalue.h b/src/cppvalue.h
deleted file mode 100644
index 2e09aff..0000000
--- a/src/cppvalue.h
+++ /dev/null
@@ -1,62 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 _CPPVALUE_H
-#define _CPPVALUE_H
-
-#include <stdio.h>
-#include <qglobal.h>
-
-class CPPValue
-{
- public:
-
-
- enum Type { Int, Float };
-
- CPPValue(long val=0) : type(Int) { v.l = val; }
- CPPValue(double val) : type(Float) { v.d = val; }
-
- operator double () const { return type==Int ? (double)v.l : v.d; }
- operator long () const { return type==Int ? v.l : (long)v.d; }
-
- bool isInt() const { return type == Int; }
-
- void print() const
- {
- if (type==Int)
- printf("(%ld)\n",v.l);
- else
- printf("(%f)\n",v.d);
- }
-
- private:
- Type type;
- union {
- double d;
- long l;
- } v;
-};
-
-extern CPPValue parseOctal();
-extern CPPValue parseDecimal();
-extern CPPValue parseHexadecimal();
-extern CPPValue parseCharacter();
-extern CPPValue parseFloat();
-
-#endif
diff --git a/src/debug.cpp b/src/debug.cpp
deleted file mode 100644
index d9438f7..0000000
--- a/src/debug.cpp
+++ /dev/null
@@ -1,116 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 <stdarg.h>
-#include <stdio.h>
-
-#include <qdict.h>
-
-#include "qtbc.h"
-#include "debug.h"
-
-//------------------------------------------------------------------------
-
-struct LabelMap
-{
- const char *name;
- Debug::DebugMask event;
-};
-
-static LabelMap 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 },
- { 0, (Debug::DebugMask)0 }
-};
-
-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;
-};
-
-static LabelMapper g_labelMapper;
-
-//------------------------------------------------------------------------
-
-Debug::DebugMask Debug::curMask = Debug::Quiet;
-int Debug::curPrio = 0;
-
-void Debug::print(DebugMask mask,int prio,const char *fmt,...)
-{
- if ((curMask&mask) && prio<=curPrio)
- {
- va_list args;
- va_start(args,fmt);
- vfprintf(stdout, fmt, args);
- va_end(args);
- }
-}
-
-static int labelToEnumValue(const char *l)
-{
- QCString label=l;
- Debug::DebugMask *event = g_labelMapper.find(label.lower());
- if (event) return *event; else return 0;
-}
-
-void Debug::setFlag(const char *lab)
-{
- curMask = (DebugMask)(curMask | labelToEnumValue(lab));
-}
-
-void Debug::clearFlag(const char *lab)
-{
- curMask = (DebugMask)(curMask & ~labelToEnumValue(lab));
-}
-
-void Debug::setPriority(int p)
-{
- curPrio = p;
-}
-
-bool Debug::isFlagSet(DebugMask mask)
-{
- return (curMask & mask)!=0;
-}
-
diff --git a/src/debug.h b/src/debug.h
deleted file mode 100644
index f446396..0000000
--- a/src/debug.h
+++ /dev/null
@@ -1,49 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 _DEBUG_H
-#define _DEBUG_H
-
-class Debug
-{
- public:
- enum DebugMask { Quiet = 0x00000000,
- FindMembers = 0x00000001,
- Functions = 0x00000002,
- Variables = 0x00000004,
- Preprocessor = 0x00000008,
- Classes = 0x00000010,
- CommentCnv = 0x00000020,
- CommentScan = 0x00000040,
- Validate = 0x00000080,
- PrintTree = 0x00000100,
- Time = 0x00000200,
- ExtCmd = 0x00000400
- };
- static void print(DebugMask mask,int prio,const char *fmt,...);
- static void setFlag(const char *label);
- static void clearFlag(const char *label);
- static bool isFlagSet(DebugMask mask);
- static void setPriority(int p);
-
- private:
- static DebugMask curMask;
- static int curPrio;
-};
-
-#endif
diff --git a/src/declinfo.h b/src/declinfo.h
deleted file mode 100644
index 267dba4..0000000
--- a/src/declinfo.h
+++ /dev/null
@@ -1,33 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 DECLINFO_H
-#define DECLINFO_H
-
-#include "qtbc.h"
-#include <stdio.h>
-
-extern void parseFuncDecl(const QCString &decl,
- bool objC,
- QCString &clName,
- QCString &type,
- QCString &name,
- QCString &args,
- QCString &funcTempList,
- QCString &exceptions
- );
-#endif
diff --git a/src/declinfo.l b/src/declinfo.l
deleted file mode 100644
index 2160021..0000000
--- a/src/declinfo.l
+++ /dev/null
@@ -1,355 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-
-%{
-
-/*
- * includes
- */
-#include <stdio.h>
-//#include <iostream.h>
-#include <assert.h>
-#include <ctype.h>
-
-#include "declinfo.h"
-#include "util.h"
-#include "message.h"
-
-/* -----------------------------------------------------------------
- *
- * statics
- */
-
-static const char * inputString;
-static int inputPosition;
-static QCString scope;
-static QCString className;
-static QCString classTempList;
-static QCString funcTempList;
-static QCString type;
-static QCString name;
-static QCString args;
-static QCString tmpType;
-static int sharpCount;
-static bool classTempListFound;
-static bool funcTempListFound;
-static QCString exceptionString;
-static bool insideObjC;
-
-static void addType()
-{
- //printf("addType() type=`%s' scope=`%s' name=`%s'\n",
- // type.data(),scope.data(),name.data());
- if (name.isEmpty() && scope.isEmpty()) return;
- if (!type.isEmpty()) type+=" ";
- if (!scope.isEmpty()) type+=scope+"::";
- type+=name;
- scope.resize(0);
- name.resize(0);
-}
-
-static void addTypeName()
-{
- //printf("addTypeName() type=`%s' scope=`%s' name=`%s'\n",
- // type.data(),scope.data(),name.data());
- if (name.isEmpty() ||
- name.at(name.length()-1)==':') // end of Objective-C keyword => append to name not type
- {
- return;
- }
- if (!type.isEmpty()) type+=' ';
- type+=name;
- name.resize(0);
-}
-
-#define YY_NEVER_INTERACTIVE 1
-
-/* -----------------------------------------------------------------
- */
-#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 && inputString[inputPosition] )
- {
- *buf = inputString[inputPosition++] ;
- c++; buf++;
- }
- return c;
-}
-
-%}
-
-B [ \t]
-ID ([a-z_A-Z][a-z_A-Z0-9]*)|(@[0-9]+)
-
-%option nounput
-%option noyywrap
-
-%x Start
-%x Template
-%x ReadArgs
-%x Operator
-%x FuncPtr
-%x EndTemplate
-%x StripTempArgs
-%x SkipSharp
-%x ReadExceptions
-
-%%
-
-<Start>"operator"/({B}*"["{B}*"]")* { // operator rule must be before {ID} rule
- name += yytext;
- BEGIN(Operator);
- }
-<Start>{ID}{B}*"("{B}*{ID}{B}*")" { // Objective-C class categories
- if (!insideObjC)
- {
- REJECT;
- }
- else
- {
- name += yytext;
- }
- }
-<Start>(~{B}*)?{ID}/({B}*"["{B}*"]")* { // the []'s are for Java,
- // the / was add to deal with multi-
- // dimensional C++ arrays like A[][15]
- addTypeName();
- name += yytext;
- }
-<Start>{B}*"::"{B}* { // found a scope specifier
- if (!scope.isEmpty())
- {
- scope+="::"+name; // add name to scope
- }
- else
- {
- scope = name.copy(); // scope becomes name
- }
- name.resize(0);
- }
-<Start>{B}*":" { // Objective-C argument separator
- name+=yytext;
- }
-<Start>[*&]+ {
- addType();
- type+=yytext;
- }
-<Start>{B}+ {
- addType();
- }
-<Start>{B}*"("({ID}"::")*{B}*"*"({B}*("const"|"volatile"){B}+)? {
- addType();
- QCString text=yytext;
- type+=text.stripWhiteSpace();
- }
-<Start>{B}*")" {
- type+=")";
- }
-<Start>{B}*"(" { // TODO: function pointers
- args+="(";
- BEGIN(ReadArgs);
- }
-<Start>{B}*"[" {
- args+="[";
- BEGIN(ReadArgs);
- }
-<Start>{B}*"<" {
- name+="<";
- sharpCount=0;
- BEGIN(Template);
- }
-<Template>"<<" { name+="<<"; }
-<Template>">>" { name+=">>"; }
-<Template>"<" {
- name+="<";
- sharpCount++;
- }
-<Template>">" {
- name+=">";
- if (sharpCount)
- --sharpCount;
- else
- {
- BEGIN(Start);
- }
- }
-<Template>. {
- name+=*yytext;
- }
-<Operator>{B}*"("{B}*")"{B}*"<>"{B}*/"(" {
- name+="() <>";
- BEGIN(ReadArgs);
- }
-<Operator>{B}*"("{B}*")"{B}*/"(" {
- name+="()";
- BEGIN(ReadArgs);
- }
-<Operator>[^(]*{B}*("<>"{B}*)?/"(" {
- name+=yytext;
- BEGIN(ReadArgs);
- }
-<ReadArgs>"throw"{B}*"(" {
- exceptionString="throw(";
- BEGIN(ReadExceptions);
- }
-<ReadArgs>. {
- args+=*yytext;
- }
-<ReadExceptions>. {
- exceptionString+=*yytext;
- }
-<*>.
-<*>\n
-
-%%
-
-/*@ ----------------------------------------------------------------------------
- */
-
-void parseFuncDecl(const QCString &decl,bool objC,QCString &cl,QCString &t,
- QCString &n,QCString &a,QCString &ftl,QCString &exc)
-{
- inputString = decl;
- //printf("Input=`%s'\n",inputString);
- if (inputString==0) return;
- inputPosition = 0;
- classTempListFound = FALSE;
- funcTempListFound = FALSE;
- insideObjC = objC;
- scope.resize(0);
- className.resize(0);
- classTempList.resize(0);
- funcTempList.resize(0);
- name.resize(0);
- type.resize(0);
- args.resize(0);
- exceptionString.resize(0);
- // first we try to find the type, scope, name and arguments
- declinfoYYrestart( declinfoYYin );
- BEGIN( Start );
- declinfoYYlex();
-
- //printf("type=`%s' class=`%s' name=`%s' args=`%s'\n",
- // type.data(),scope.data(),name.data(),args.data());
-
- int nb = name.findRev('[');
- if (nb!=-1 && args.isEmpty()) // correct for [] in name ambigity (due to Java return type allowing [])
- {
- args.prepend(name.right(name.length()-nb));
- name=name.left(nb);
- }
-
-#if 0
- {
- int l=scope.length();
- int i=0;
- int skipCount=0;
- cl.resize(0);
- ctl.resize(0);
- for (i=0;i<l;i++)
- {
- char c=scope.at(i);
- if (c=='<')
- skipCount++;
- else if (c=='>')
- skipCount--;
- else if (skipCount==0)
- cl+=c;
- }
- }
- cl=stripTemplateSpecifiersFromScope(removeRedundantWhiteSpace(scope),FALSE);
- ctl.resize(0);
-#endif
-
- cl=scope;
- n=removeRedundantWhiteSpace(name);
- int il,ir;
- if ((il=n.find('<'))!=-1 && (ir=n.findRev('>'))!=-1)
- // TODO: handle cases like where n="operator<< <T>"
- {
- ftl=removeRedundantWhiteSpace(n.right(n.length()-il));
- n=n.left(il);
- }
-
- //ctl=classTempList.copy();
- //ftl=funcTempList.copy();
- t=removeRedundantWhiteSpace(type);
- a=removeRedundantWhiteSpace(args);
- exc=removeRedundantWhiteSpace(exceptionString);
-
- if (!t.isEmpty() && t.at(t.length()-1)==')') // for function pointers
- {
- a.prepend(")");
- t=t.left(t.length()-1);
- }
- //printf("type=`%s' class=`%s' name=`%s' args=`%s'\n",
- // t.data(),cl.data(),n.data(),a.data());
-
- return;
-
-
-}
-
-//extern "C" { // some bogus code to keep the compiler happy
-// int declinfoYYwrap() { return 1 ; }
-// void declinfoYYdummy() { yy_flex_realloc(0,0); }
-//}
-
-#if 0
-void dumpDecl(const char *s)
-{
- QCString className;
- QCString classTNames;
- QCString type;
- QCString name;
- QCString args;
- QCString funcTNames;
- msg("-----------------------------------------\n");
- parseFuncDecl(s,className,classTNames,type,name,args,funcTNames);
- msg("type=`%s' class=`%s' classTempl=`%s' name=`%s' "
- "funcTemplateNames=`%s' args=`%s'\n",
- type.data(),className.data(),classTNames.data(),
- name.data(),funcTNames.data(),args.data()
- );
-}
-
-// some test code
-int main()
-{
- dumpDecl("A < T > :: Value * A < T > :: getValue < S > ( const A < T > & a )");
- dumpDecl("const A<T>::Value* A<T>::getValue<S>(const A<T>&a)");
- dumpDecl("func()");
- dumpDecl("friend void bla<>()");
- dumpDecl("name< T > :: operator () (int bla)");
- dumpDecl("name< T > :: operator << (int bla)");
- dumpDecl("name< T > :: operator << <> (int bla)");
- dumpDecl("className::func()");
- dumpDecl("void ( * Name < T > :: bla ) ( int, char * )");
-}
-#endif
-
-#if !defined(YY_FLEX_SUBMINOR_VERSION)
-//----------------------------------------------------------------------------
-extern "C" { // some bogus code to keep the compiler happy
- void declinfoYYdummy() { yy_flex_realloc(0,0); }
-}
-#endif
-
diff --git a/src/defargs.h b/src/defargs.h
deleted file mode 100644
index 3dc6893..0000000
--- a/src/defargs.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 DEFARGS_H
-#define DEFARGS_H
-
-#include "qtbc.h"
-#include <stdio.h>
-
-class ArgumentList;
-
-extern void stringToArgumentList(const char *argsString,ArgumentList* &argList);
-
-#endif
diff --git a/src/defargs.l b/src/defargs.l
deleted file mode 100644
index 462efda..0000000
--- a/src/defargs.l
+++ /dev/null
@@ -1,436 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-
-/*! \file
- * This scanner is used to convert a string into a list of function or
- * template arguments. Each parsed argument results in a Argument struct,
- * that is put into an ArgumentList in declaration order.
- * Comment blocks for arguments can also be included in the string.
- * The argument string does not contain new-lines (except inside any
- * comment blocks).
- * An Argument consists of the string fields:
- * type,name,default value, and documentation
- * The Argument list as a whole can be pure, constant or volatile.
- *
- * Examples of input strings are:
- * \code
- * "(int a,int b) const"
- * "(const char *s="hello world",int=5) = 0"
- * "<class T,class N>"
- * "(char c,const char)"
- * \endcode
- *
- * Note: It is not always possible to distinguish between the name and
- * type of an argument. In case of doubt the name is added to the
- * type, and the matchArgumentList in util.cpp is be used to
- * further determine the correct separation.
- */
-
-%{
-
-/*
- * includes
- */
-#include "qtbc.h"
-#include <stdio.h>
-//#include <iostream.h>
-#include <assert.h>
-#include <ctype.h>
-#include <qregexp.h>
-
-#include "defargs.h"
-#include "entry.h"
-#include "util.h"
-
-#define YY_NEVER_INTERACTIVE 1
-
-/* -----------------------------------------------------------------
- * state variables
- */
-static const char *g_inputString;
-static int g_inputPosition;
-static ArgumentList *g_argList;
-static QCString *g_copyArgValue;
-static QCString g_curArgTypeName;
-static QCString g_curArgDefValue;
-static QCString g_curArgName;
-static QCString g_curArgDocs;
-static QCString g_curArgAttrib;
-static QCString g_curArgArray;
-static int g_argRoundCount;
-static int g_argSharpCount;
-static int g_argCurlyCount;
-static int g_readArgContext;
-static int g_lastDocContext;
-static int g_lastDocChar;
-
-/* -----------------------------------------------------------------
- */
-#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;
-}
-
-%}
-
-B [ \t]
-ID [a-z_A-Z][a-z_A-Z0-9]*
-
-%option noyywrap
-
-%x Start
-%x CopyArgString
-%x CopyArgRound
-%x CopyArgRound2
-%x CopyArgSharp
-%x CopyArgCurly
-%x ReadFuncArgType
-%x ReadFuncArgDef
-%x ReadFuncArgPtr
-%x FuncQual
-%x ReadDocBlock
-%x ReadDocLine
-
-
-%%
-
-<Start>[<(] { BEGIN(ReadFuncArgType); }
-
-<ReadFuncArgType>{B}* {
- g_curArgTypeName+=" ";
- }
-<ReadFuncArgType>"["[^\]]*"]" {
- if (g_curArgTypeName.stripWhiteSpace().isEmpty())
- {
- g_curArgAttrib=yytext; // for M$-IDL
- }
- else // array type
- {
- g_curArgArray+=yytext;
- }
- }
-<ReadFuncArgDef>"'"\\[0-7]{1,3}"'" { g_curArgDefValue+=yytext; }
-<ReadFuncArgDef>"'"\\."'" { g_curArgDefValue+=yytext; }
-<ReadFuncArgDef>"'"."'" { g_curArgDefValue+=yytext; }
-<ReadFuncArgDef>\" {
- g_curArgDefValue+=*yytext;
- BEGIN( CopyArgString );
- }
-<ReadFuncArgType>"("([^:)]+{B}*"::")*{B}*[&*]+{B}*/{ID} {
- // function pointer as argument
- g_curArgTypeName+=yytext;
- //g_curArgTypeName=g_curArgTypeName.simplifyWhiteSpace();
- BEGIN( ReadFuncArgPtr );
- }
-<ReadFuncArgPtr>{ID} {
- g_curArgName=yytext;
- }
-<ReadFuncArgPtr>")"{B}*"(" {
- g_curArgTypeName+=yytext;
- //g_curArgTypeName=g_curArgTypeName.simplifyWhiteSpace();
- g_readArgContext = ReadFuncArgType;
- g_copyArgValue=&g_curArgTypeName;
- g_argRoundCount=0;
- BEGIN( CopyArgRound2 );
- }
-<ReadFuncArgPtr>")" { // redundant braces detected / remove them
- int i=g_curArgTypeName.findRev('('),l=g_curArgTypeName.length();
- if (i!=-1)
- g_curArgTypeName=g_curArgTypeName.left(i)+
- g_curArgTypeName.right(l-i-1);
- g_curArgTypeName+=g_curArgName;
- BEGIN( ReadFuncArgType );
- }
-<ReadFuncArgType>"<="|">="|"->"|">>"|"<<" { // handle operators in defargs
- g_curArgTypeName+=yytext;
- }
-<ReadFuncArgType,ReadFuncArgDef>[({<] {
- if (YY_START==ReadFuncArgType)
- {
- g_curArgTypeName+=*yytext;
- g_copyArgValue=&g_curArgTypeName;
- }
- else // YY_START==ReadFuncArgDef
- {
- g_curArgDefValue+=*yytext;
- g_copyArgValue=&g_curArgDefValue;
- }
- g_readArgContext = YY_START;
- if (*yytext=='(')
- {
- g_argRoundCount=0;
- BEGIN( CopyArgRound );
- }
- else if (*yytext=='{')
- {
- g_argCurlyCount=0;
- BEGIN( CopyArgCurly );
- }
- else // yytext=='<'
- {
- g_argSharpCount=0;
- BEGIN( CopyArgSharp );
- }
- }
-<CopyArgRound,CopyArgRound2>"(" {
- g_argRoundCount++;
- *g_copyArgValue += *yytext;
- }
-<CopyArgRound,CopyArgRound2>")"({B}*{ID})* {
- *g_copyArgValue += yytext;
- if (g_argRoundCount>0)
- {
- g_argRoundCount--;
- }
- else
- {
- if (YY_START==CopyArgRound2)
- {
- *g_copyArgValue+=" "+g_curArgName;
- }
- BEGIN( g_readArgContext );
- }
- }
-<CopyArgSharp>"<" {
- g_argSharpCount++;
- *g_copyArgValue += *yytext;
- }
-<CopyArgSharp>">" {
- *g_copyArgValue += *yytext;
- if (g_argSharpCount>0) g_argSharpCount--;
- else BEGIN( g_readArgContext );
- }
-<CopyArgCurly>"{" {
- g_argCurlyCount++;
- *g_copyArgValue += *yytext;
- }
-<CopyArgSharp>"}" {
- *g_copyArgValue += *yytext;
- if (g_argCurlyCount>0) g_argCurlyCount--;
- else BEGIN( g_readArgContext );
- }
-<CopyArgString>\\. {
- g_curArgDefValue+=yytext;
- }
-<CopyArgString>\" {
- g_curArgDefValue+=*yytext;
- BEGIN( ReadFuncArgDef );
- }
-<ReadFuncArgType>"=" {
- BEGIN( ReadFuncArgDef );
- }
-<ReadFuncArgType,ReadFuncArgDef>[,)>]{B}*("/*"[*!]|"//"[/!])"<" {
- g_lastDocContext=YY_START;
- g_lastDocChar=*yytext;
- QCString text=yytext;
- if (text.find("//")!=-1)
- BEGIN( ReadDocLine );
- else
- BEGIN( ReadDocBlock );
- }
-<ReadFuncArgType,ReadFuncArgDef>[,)>] {
- if (*yytext==')' && g_curArgTypeName.stripWhiteSpace().isEmpty())
- {
- g_curArgTypeName+=*yytext;
- BEGIN(FuncQual);
- }
- else
- {
- g_curArgTypeName=removeRedundantWhiteSpace(g_curArgTypeName);
- g_curArgDefValue=g_curArgDefValue.stripWhiteSpace();
- //printf("curArgType=`%s' curArgDefVal=`%s'\n",g_curArgTypeName.data(),g_curArgDefValue.data());
- int l=g_curArgTypeName.length();
- if (l>0)
- {
- int i=l-1;
- while (i>=0 && (isspace((uchar)g_curArgTypeName.at(i)) || g_curArgTypeName.at(i)=='.')) i--;
- while (i>=0 && isId(g_curArgTypeName.at(i))) i--;
- //printf("g_curArgTypeName=`%s' i=%d\n",g_curArgTypeName.data(),i);
- Argument *a = new Argument;
- a->attrib = g_curArgAttrib.copy();
- //printf("a->type=%s a->name=%s i=%d l=%d\n",
- // a->type.data(),a->name.data(),i,l);
- a->array.resize(0);
- if (i==l-1 && g_curArgTypeName.at(i)==')') // function argument
- {
- int bi=g_curArgTypeName.find('(');
- int fi=bi-1;
- //printf("func arg fi=%d\n",fi);
- while (fi>=0 && isId(g_curArgTypeName.at(fi))) fi--;
- if (fi>=0)
- {
- a->type = g_curArgTypeName.left(fi+1);
- a->name = g_curArgTypeName.mid(fi+1,bi-fi-1).stripWhiteSpace();
- a->array = g_curArgTypeName.right(l-bi);
- }
- else
- {
- a->type = g_curArgTypeName;
- }
- }
- else if (i>=0 && g_curArgTypeName.at(i)!=':')
- { // type contains a name
- a->type = removeRedundantWhiteSpace(g_curArgTypeName.left(i+1));
- a->name = g_curArgTypeName.right(l-i-1).stripWhiteSpace();
- }
- else // assume only the type was specified, try to determine name later
- {
- a->type = removeRedundantWhiteSpace(g_curArgTypeName);
- }
- a->array += removeRedundantWhiteSpace(g_curArgArray);
- a->defval = g_curArgDefValue.copy();
- //printf("a->type=%s a->name=%s a->defval=\"%s\"\n",a->type.data(),a->name.data(),a->defval.data());
- a->docs = g_curArgDocs.stripWhiteSpace();
- //printf("Argument `%s' `%s' adding docs=`%s'\n",a->type.data(),a->name.data(),a->docs.data());
- g_argList->append(a);
- }
- g_curArgAttrib.resize(0);
- g_curArgTypeName.resize(0);
- g_curArgDefValue.resize(0);
- g_curArgArray.resize(0);
- g_curArgDocs.resize(0);
- if (*yytext==')')
- {
- BEGIN(FuncQual);
- //printf(">>> end of argument list\n");
- }
- else
- {
- BEGIN( ReadFuncArgType );
- }
- }
- }
-<ReadFuncArgType,ReadFuncArgPtr>{ID} {
- QCString name=yytext; //resolveDefines(yytext);
- if (YY_START==ReadFuncArgType && g_curArgArray=="[]") // Java style array
- {
- g_curArgTypeName+=" []";
- g_curArgArray.resize(0);
- }
- //printf("resolveName `%s'->`%s'\n",yytext,name.data());
- g_curArgTypeName+=name;
- }
-<ReadFuncArgType,ReadFuncArgPtr>. {
- g_curArgTypeName+=*yytext;
- }
-
-<ReadFuncArgDef,CopyArgString>"->"|">="|">>" {
- g_curArgDefValue+=yytext;
- }
-<ReadFuncArgDef,CopyArgString>. {
- g_curArgDefValue+=*yytext;
- }
-<CopyArgRound,CopyArgRound2,CopyArgSharp,CopyArgCurly>{ID} {
- QCString name=yytext; //resolveDefines(yytext);
- *g_copyArgValue+=name;
- }
-<CopyArgRound,CopyArgRound2,CopyArgSharp,CopyArgCurly>. {
- *g_copyArgValue += *yytext;
- }
-<FuncQual>"const" {
- g_argList->constSpecifier=TRUE;
- }
-<FuncQual>"volatile" {
- g_argList->volatileSpecifier=TRUE;
- }
-<FuncQual>"="{B}*"0" {
- g_argList->pureSpecifier=TRUE;
- }
-<ReadDocBlock>[^\*\n]+ {
- g_curArgDocs+=yytext;
- }
-<ReadDocLine>[^\n]+ {
- g_curArgDocs+=yytext;
- }
-<ReadDocBlock>"*/" {
- if (g_lastDocChar!=0)
- unput(g_lastDocChar);
- BEGIN(g_lastDocContext);
- }
-<ReadDocLine>\n {
- if (g_lastDocChar!=0)
- unput(g_lastDocChar);
- BEGIN(g_lastDocContext);
- }
-<ReadDocBlock>\n {
- g_curArgDocs+=*yytext;
- }
-<ReadDocBlock>. {
- g_curArgDocs+=*yytext;
- }
-<*>("/*"[*!]|"//"[/!])("<"?) {
- g_lastDocContext=YY_START;
- g_lastDocChar=0;
- if (yytext[1]=='/')
- BEGIN( ReadDocLine );
- else
- BEGIN( ReadDocBlock );
- }
-<*>\n
-<*>.
-
-%%
-
-/* ----------------------------------------------------------------------------
- */
-
-/*! Converts an argument string into an ArgumentList.
- * \param argsString the list of Arguments.
- * \param al a reference to resulting argument list pointer.
- */
-
-void stringToArgumentList(const char *argsString,ArgumentList* &al)
-{
- if (al==0) return;
- if (argsString==0) return;
-
- g_copyArgValue=0;
- g_curArgDocs.resize(0);
- g_curArgAttrib.resize(0);
- g_curArgArray.resize(0);
- g_argRoundCount = 0;
- g_argSharpCount = 0;
- g_argCurlyCount = 0;
- g_lastDocChar = 0;
-
- g_inputString = argsString;
- g_inputPosition = 0;
- g_curArgTypeName.resize(0);
- g_curArgDefValue.resize(0);
- g_curArgName.resize(0);
- g_argList = al;
- defargsYYrestart( defargsYYin );
- BEGIN( Start );
- defargsYYlex();
- //printf("stringToArgumentList(%s) result=%s\n",argsString,argListToString(al).data());
-}
-
-#if !defined(YY_FLEX_SUBMINOR_VERSION)
-extern "C" { // some bogus code to keep the compiler happy
- void defargsYYdummy() { yy_flex_realloc(0,0); }
-}
-#endif
-
diff --git a/src/defgen.cpp b/src/defgen.cpp
deleted file mode 100644
index bd65ec7..0000000
--- a/src/defgen.cpp
+++ /dev/null
@@ -1,628 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-
-#include <stdlib.h>
-
-#include "qtbc.h"
-#include "defgen.h"
-#include "doxygen.h"
-#include "message.h"
-#include "config.h"
-#include "classlist.h"
-#include "util.h"
-#include "defargs.h"
-#include "outputgen.h"
-#include "dot.h"
-
-#include <qdir.h>
-#include <qfile.h>
-#include <qtextstream.h>
-
-#define DEF_DB(x)
-
-inline void writeDEFString(QTextStream &t,const char *s)
-{
- const char* p=s;
- char c;
-
- t << '\'';
- while ((c = *(p++)))
- {
- if (c == '\'')
- t << '\\';
- t << c;
- }
- t << '\'';
-}
-
-void generateDEFForMember(MemberDef *md,
- QTextStream &t,
- Definition *def,
- const char* Prefix)
-{
- QCString memPrefix;
-
- // + declaration
- // - reimplements
- // - reimplementedBy
- // - exceptions
- // - const/volatile specifiers
- // - examples
- // + source definition
- // - source references
- // - source referenced by
- // - include code
-
- if (md->memberType()==MemberDef::EnumValue) return;
-
- QCString scopeName;
- if (md->getClassDef())
- scopeName=md->getClassDef()->name();
- else if (md->getNamespaceDef())
- scopeName=md->getNamespaceDef()->name();
-
- t << " " << Prefix << "-member = {" << endl;
- memPrefix = " ";
- memPrefix.append( Prefix );
- memPrefix.append( "-mem-" );
-
- QCString memType;
- bool isFunc=FALSE;
- switch (md->memberType())
- {
- case MemberDef::Define: memType="define"; break;
- case MemberDef::EnumValue: ASSERT(0); break;
- case MemberDef::Property: memType="property"; break;
- case MemberDef::Event: memType="event"; break;
- case MemberDef::Variable: memType="variable"; break;
- case MemberDef::Typedef: memType="typedef"; break;
- case MemberDef::Enumeration: memType="enum"; break;
- case MemberDef::Function: memType="function"; isFunc=TRUE; break;
- case MemberDef::Signal: memType="signal"; isFunc=TRUE; break;
- case MemberDef::Prototype: memType="prototype"; isFunc=TRUE; break;
- case MemberDef::Friend: memType="friend"; isFunc=TRUE; break;
- case MemberDef::DCOP: memType="dcop"; isFunc=TRUE; break;
- case MemberDef::Slot: memType="slot"; isFunc=TRUE; break;
- }
-
- t << memPrefix << "kind = '" << memType << "';" << endl;
- t << memPrefix << "id = '"
- << md->getOutputFileBase() << "_1" << md->anchor()
- << "';" << endl;
-
- t << memPrefix << "virt = ";
- switch (md->virtualness())
- {
- case Normal: t << "normal;" << endl; break;
- case Virtual: t << "virtual;" << endl; break;
- case Pure: t << "pure-virtual;" << endl; break;
- default: ASSERT(0);
- }
-
- t << memPrefix << "prot = ";
- switch(md->protection())
- {
- case Public: t << "public;" << endl; break;
- case Protected: t << "protected;" << endl; break;
- case Private: t << "private;" << endl; break;
- case Package: t << "package;" << endl; break;
- }
-
- if (md->memberType()!=MemberDef::Define &&
- md->memberType()!=MemberDef::Enumeration
- )
- {
- QCString typeStr = replaceAnonymousScopes(md->typeString());
- t << memPrefix << "type = <<_EnD_oF_dEf_TeXt_" << endl << typeStr << endl
- << "_EnD_oF_dEf_TeXt_;" << endl;
- }
-
- t << memPrefix << "name = '" << md->name() << "';" << endl;
-
- if (isFunc) //function
- {
- ArgumentList *declAl = new ArgumentList;
- ArgumentList *defAl = md->argumentList();
- stringToArgumentList(md->argsString(),declAl);
- QCString fcnPrefix = " " + memPrefix + "param-";
-
- if (declAl->count()>0)
- {
- ArgumentListIterator declAli(*declAl);
- ArgumentListIterator defAli(*defAl);
- Argument *a;
- for (declAli.toFirst();(a=declAli.current());++declAli)
- {
- Argument *defArg = defAli.current();
- t << memPrefix << "param = {" << endl;
- if (!a->attrib.isEmpty())
- {
- t << fcnPrefix << "attributes = ";
- writeDEFString(t,a->attrib);
- t << ';' << endl;
- }
- if (!a->type.isEmpty())
- {
- t << fcnPrefix << "type = <<_EnD_oF_dEf_TeXt_" << endl
- << a->type << endl << "_EnD_oF_dEf_TeXt_;" << endl;
- }
- if (!a->name.isEmpty())
- {
- t << fcnPrefix << "declname = ";
- writeDEFString(t,a->name);
- t << ';' << endl;
- }
- if (defArg && !defArg->name.isEmpty() && defArg->name!=a->name)
- {
- t << fcnPrefix << "defname = ";
- writeDEFString(t,defArg->name);
- t << ';' << endl;
- }
- if (!a->array.isEmpty())
- {
- t << fcnPrefix << "array = ";
- writeDEFString(t,a->array);
- t << ';' << endl;
- }
- if (!a->defval.isEmpty())
- {
- t << fcnPrefix << "defval = <<_EnD_oF_dEf_TeXt_" << endl
- << a->defval << endl << "_EnD_oF_dEf_TeXt_;" << endl;
- }
- if (defArg) ++defAli;
- t << " }; /*" << fcnPrefix << "-param */" << endl;
- }
- }
- delete declAl;
- }
- else if ( md->memberType()==MemberDef::Define
- && md->argsString()!=0)
- {
- ArgumentListIterator ali(*md->argumentList());
- Argument *a;
- QCString defPrefix = " " + memPrefix + "def-";
-
- for (ali.toFirst();(a=ali.current());++ali)
- {
- t << memPrefix << "param = {" << endl;
- t << defPrefix << "name = '" << a->type << "';" << endl;
- t << " }; /*" << defPrefix << "-param */" << endl;
- }
- }
-
- if (!md->initializer().isEmpty())
- {
- t << memPrefix << "initializer = <<_EnD_oF_dEf_TeXt_" << endl
- << md->initializer() << endl << "_EnD_oF_dEf_TeXt_;" << endl;
- }
- // TODO: exceptions, const volatile
- if (md->memberType()==MemberDef::Enumeration) // enum
- {
- if (md->enumFieldList())
- {
- MemberListIterator emli(*md->enumFieldList());
- MemberDef *emd;
- for (emli.toFirst();(emd=emli.current());++emli)
- {
- t << memPrefix << "enum = { enum-name = " << emd->name() << ';';
- if (!emd->initializer().isEmpty())
- {
- t << " enum-value = ";
- writeDEFString(t,emd->initializer());
- t << ';';
- }
- t << " };" << endl;
- }
- }
- }
-
- t << memPrefix << "desc-file = '" << md->getDefFileName() << "';" << endl;
- t << memPrefix << "desc-line = '" << md->getDefLine() << "';" << endl;
- t << memPrefix << "briefdesc = <<_EnD_oF_dEf_TeXt_" << endl
- << md->briefDescription() << endl << "_EnD_oF_dEf_TeXt_;" << endl;
- t << memPrefix << "documentation = <<_EnD_oF_dEf_TeXt_" << endl
- << md->documentation() << endl << "_EnD_oF_dEf_TeXt_;" << endl;
-
- //printf("md->getReferencesMembers()=%p\n",md->getReferencesMembers());
- if (md->getReferencesMembers())
- {
- MemberSDict::Iterator mdi(*md->getReferencesMembers());
- MemberDef *rmd;
- QCString refPrefix = " " + memPrefix + "ref-";
-
- for (mdi.toFirst();(rmd=mdi.current());++mdi)
- {
- 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())
- {
- name.prepend(scope+"::");
- }
-
- t << refPrefix << "name = ";
- writeDEFString(t,name);
- t << ';' << endl << " };" << endl;
- }
- } /* for (mdi.toFirst...) */
- }
- if (md->getReferencedByMembers())
- {
- MemberSDict::Iterator mdi(*md->getReferencedByMembers());
- MemberDef *rmd;
- QCString refPrefix = " " + memPrefix + "ref-";
-
- for (mdi.toFirst();(rmd=mdi.current());++mdi)
- {
- if (rmd->getStartBodyLine()!=-1 && rmd->getBodyDef())
- {
- t << memPrefix << "referenceby = {" << 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;
- }
- } /* for (mdi.toFirst...) */
- }
-
- t << " }; /* " << Prefix << "-member */" << endl;
-}
-
-
-void generateDEFClassSection(ClassDef *cd,
- QTextStream &t,
- MemberList *ml,
- const char *kind)
-{
- if (ml->count()>0)
- {
- t << " cp-section = {" << endl;
- t << " sec-kind = '" << kind << "';" << endl;
-
- MemberListIterator mli(*ml);
- MemberDef *md;
- for (mli.toFirst();(md=mli.current());++mli)
- {
- generateDEFForMember(md,t,cd,"sec");
- }
- t << " }; /* cp-section */" << endl;
- }
-}
-
-void generateDEFForClass(ClassDef *cd,QTextStream &t)
-{
- // + brief description
- // + detailed description
- // - template arguments
- // - include files
- // + inheritance diagram
- // + list of direct super classes
- // + list of direct sub classes
- // + collaboration diagram
- // - list of all members
- // + user defined member sections
- // + standard member sections
- // + detailed member documentation
- // - examples
-
- if (cd->isReference()) return; // skip external references.
- if (cd->name().find('@')!=-1) return; // skip anonymous compounds.
- if (cd->templateMaster()!=0) return; // skip generated template instances.
-
- t << cd->compoundTypeString() << " = {" << endl;
- t << " cp-id = '" << cd->getOutputFileBase() << "';" << endl;
- t << " cp-name = '" << cd->name() << "';" << endl;
-
- if (cd->baseClasses()->count()>0)
- {
- 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)
- {
- 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()->count()>0)
- {
- 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)
- {
- 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 =
- cd->pubTypes.count()+cd->pubMethods.count()+cd->pubAttribs.count()+
- cd->pubSlots.count()+cd->signals.count()+cd->dcopMethods.count()+
- cd->pubStaticMethods.count()+
- cd->pubStaticAttribs.count()+cd->proTypes.count()+cd->proMethods.count()+
- cd->proAttribs.count()+cd->proSlots.count()+cd->proStaticMethods.count()+
- cd->proStaticAttribs.count()+cd->priTypes.count()+cd->priMethods.count()+
- cd->priAttribs.count()+cd->priSlots.count()+cd->priStaticMethods.count()+
- cd->priStaticAttribs.count()+cd->friends.count()+cd->related.count();
- if (numMembers>0)
- {
- generateDEFClassSection(cd,t,&cd->pubTypes,"public-type");
- generateDEFClassSection(cd,t,&cd->pubMethods,"public-func");
- generateDEFClassSection(cd,t,&cd->pubAttribs,"public-attrib");
- generateDEFClassSection(cd,t,&cd->pubSlots,"public-slot");
- generateDEFClassSection(cd,t,&cd->signals,"signal");
- generateDEFClassSection(cd,t,&cd->dcopMethods,"dcop-func");
- generateDEFClassSection(cd,t,&cd->properties,"property");
- generateDEFClassSection(cd,t,&cd->pubStaticMethods,"public-static-func");
- generateDEFClassSection(cd,t,&cd->pubStaticAttribs,"public-static-attrib");
- generateDEFClassSection(cd,t,&cd->proTypes,"protected-type");
- generateDEFClassSection(cd,t,&cd->proMethods,"protected-func");
- generateDEFClassSection(cd,t,&cd->proAttribs,"protected-attrib");
- generateDEFClassSection(cd,t,&cd->proSlots,"protected-slot");
- generateDEFClassSection(cd,t,&cd->proStaticMethods,"protected-static-func");
- generateDEFClassSection(cd,t,&cd->proStaticAttribs,"protected-static-attrib");
- generateDEFClassSection(cd,t,&cd->priTypes,"private-type");
- generateDEFClassSection(cd,t,&cd->priMethods,"private-func");
- generateDEFClassSection(cd,t,&cd->priAttribs,"private-attrib");
- generateDEFClassSection(cd,t,&cd->priSlots,"private-slot");
- generateDEFClassSection(cd,t,&cd->priStaticMethods,"private-static-func");
- generateDEFClassSection(cd,t,&cd->priStaticAttribs,"private-static-attrib");
- generateDEFClassSection(cd,t,&cd->friends,"signal");
- generateDEFClassSection(cd,t,&cd->related,"related");
- }
-
- t << " cp-filename = '" << cd->getDefFileName() << "';" << endl;
- t << " cp-fileline = '" << cd->getDefLine() << "';" << endl;
- t << " cp-briefdesc = <<_EnD_oF_dEf_TeXt_" << endl
- << cd->briefDescription() << endl << "_EnD_oF_dEf_TeXt_;" << endl;
-
- t << " cp-documentation = <<_EnD_oF_dEf_TeXt_" << endl
- << cd->documentation() << endl << "_EnD_oF_dEf_TeXt_;" << endl;
-
- DotClassGraph inheritanceGraph(cd,DotNode::Inheritance,
- Config_getInt("MAX_DOT_GRAPH_DEPTH"));
- if (!inheritanceGraph.isTrivial())
- {
- t << " cp-inheritancegraph = <<_EnD_oF_dEf_TeXt_" << endl;
- inheritanceGraph.writeDEF(t);
- t << endl << "_EnD_oF_dEf_TeXt_;" << endl;
- }
- DotClassGraph collaborationGraph(cd,DotNode::Collaboration,
- Config_getInt("MAX_DOT_GRAPH_DEPTH"));
- if (!collaborationGraph.isTrivial())
- {
- t << " cp-collaborationgraph = <<_EnD_oF_dEf_TeXt_" << endl;
- collaborationGraph.writeDEF(t);
- t << endl << "_EnD_oF_dEf_TeXt_;" << endl;
- }
- t << "}; /* " << cd->compoundTypeString() << " */" << endl;
-}
-
-void generateDEFSection(Definition *d,
- QTextStream &t,
- MemberList *ml,
- const char *kind)
-{
- if (ml->count()>0)
- {
- t << " " << kind << " = {" << endl;
- MemberListIterator mli(*ml);
- MemberDef *md;
- for (mli.toFirst();(md=mli.current());++mli)
- {
- generateDEFForMember(md,t,d,kind);
- }
- t << " };" << endl;
- }
-}
-
-void generateDEFForNamespace(NamespaceDef *nd,QTextStream &t)
-{
- if (nd->isReference()) return; // skip external references
- t << " namespace = {" << endl;
- t << " ns-id = '" << nd->getOutputFileBase() << "';" << endl;
- t << " ns-name = ";
- writeDEFString(t,nd->name());
- t << ';' << endl;
-
- generateDEFSection(nd,t,&nd->decDefineMembers,"define");
- generateDEFSection(nd,t,&nd->decProtoMembers,"prototype");
- generateDEFSection(nd,t,&nd->decTypedefMembers,"typedef");
- generateDEFSection(nd,t,&nd->decEnumMembers,"enum");
- generateDEFSection(nd,t,&nd->decFuncMembers,"func");
- generateDEFSection(nd,t,&nd->decVarMembers,"var");
-
- t << " ns-filename = '" << nd->getDefFileName() << "';" << endl;
- t << " ns-fileline = '" << nd->getDefLine() << "';" << endl;
- t << " ns-briefdesc = <<_EnD_oF_dEf_TeXt_" << endl
- << nd->briefDescription() << endl << "_EnD_oF_dEf_TeXt_;" << endl;
-
- t << " ns-documentation = <<_EnD_oF_dEf_TeXt_" << endl
- << nd->documentation() << endl << "_EnD_oF_dEf_TeXt_;" << endl;
- t << " };" << endl;
-}
-
-void generateDEFForFile(FileDef *fd,QTextStream &t)
-{
- if (fd->isReference()) return; // skip external references
-
- t << "file = {" << endl;
- t << " file-id = '" << fd->getOutputFileBase() << "';" << endl;
- t << " file-name = ";
- writeDEFString(t,fd->name());
- t << ';' << endl;
-
- generateDEFSection(fd,t,&fd->decDefineMembers,"define");
- generateDEFSection(fd,t,&fd->decProtoMembers,"prototype");
- generateDEFSection(fd,t,&fd->decTypedefMembers,"typedef");
- generateDEFSection(fd,t,&fd->decEnumMembers,"enum");
- generateDEFSection(fd,t,&fd->decFuncMembers,"func");
- generateDEFSection(fd,t,&fd->decVarMembers,"var");
-
- t << " file-full-name = '" << fd->getDefFileName() << "';" << endl;
- t << " file-first-line = '" << fd->getDefLine() << "';" << endl;
-
- t << " file-briefdesc = <<_EnD_oF_dEf_TeXt_" << endl
- << fd->briefDescription() << endl << "_EnD_oF_dEf_TeXt_;" << endl;
-
- t << " file-documentation = <<_EnD_oF_dEf_TeXt_" << endl
- << fd->documentation() << endl << "_EnD_oF_dEf_TeXt_;" << endl;
-
- t << "}; /* file */" << endl;
-}
-
-
-void generateDEF()
-{
- QCString outputDirectory = Config_getString("OUTPUT_DIRECTORY");
- if (outputDirectory.isEmpty())
- {
- outputDirectory=QDir::currentDirPath();
- }
- else
- {
- QDir dir(outputDirectory);
- if (!dir.exists())
- {
- dir.setPath(QDir::currentDirPath());
- if (!dir.mkdir(outputDirectory))
- {
- err("Error: tag OUTPUT_DIRECTORY: Output directory `%s' does not "
- "exist and cannot be created\n",outputDirectory.data());
- exit(1);
- }
- else if (!Config_getBool("QUIET"))
- {
- err("Notice: Output directory `%s' does not exist. "
- "I have created it for you.\n", outputDirectory.data());
- }
- dir.cd(outputDirectory);
- }
- outputDirectory=dir.absPath();
- }
-
- QDir dir(outputDirectory);
- if (!dir.exists())
- {
- dir.setPath(QDir::currentDirPath());
- if (!dir.mkdir(outputDirectory))
- {
- err("Cannot create directory %s\n",outputDirectory.data());
- return;
- }
- }
- QDir defDir(outputDirectory+"/def");
- if (!defDir.exists() && !defDir.mkdir(outputDirectory+"/def"))
- {
- err("Could not create def directory in %s\n",outputDirectory.data());
- return;
- }
-
- QCString fileName=outputDirectory+"/def/doxygen.def";
- QFile f(fileName);
- if (!f.open(IO_WriteOnly))
- {
- err("Cannot open file %s for writing!\n",fileName.data());
- return;
- }
- QTextStream t(&f);
- t << "AutoGen Definitions dummy;" << endl;
-
- if (Doxygen::classSDict.count()+Doxygen::inputNameList.count()>0)
- {
- ClassSDict::Iterator cli(Doxygen::classSDict);
- ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
- {
- generateDEFForClass(cd,t);
- }
- FileNameListIterator fnli(Doxygen::inputNameList);
- FileName *fn;
- for (;(fn=fnli.current());++fnli)
- {
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
- {
- generateDEFForFile(fd,t);
- }
- }
- }
- else
- {
- t << "dummy_value = true;" << endl;
- }
-}
diff --git a/src/defgen.h b/src/defgen.h
deleted file mode 100644
index a66bdcf..0000000
--- a/src/defgen.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#ifndef DEFGEN_H
-#define DEFGEN_H
-
-void generateDEF();
-
-#endif
diff --git a/src/define.cpp b/src/define.cpp
deleted file mode 100644
index ea9fee3..0000000
--- a/src/define.cpp
+++ /dev/null
@@ -1,46 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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()
-{
- undef=FALSE;
- fileDef=0;
- 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;
- nargs=d.nargs;
- undef=d.undef;
- fileDef=0;
-}
-
-Define::~Define()
-{
-}
-
-bool Define::hasDocumentation()
-{
- return definition && (doc || Config_getBool("EXTRACT_ALL"));
-}
diff --git a/src/define.h b/src/define.h
deleted file mode 100644
index d456ac0..0000000
--- a/src/define.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 DEFINE_H
-#define DEFINE_H
-
-#include "qtbc.h"
-#include <qdict.h>
-#include <qlist.h>
-
-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 nargs;
- bool undef;
- bool varArgs;
- bool isPredefined;
- bool nonRecursive;
-};
-
-class DefineList : public QList<Define>
-{
- public:
- DefineList() : QList<Define>() {}
- ~DefineList() {}
- int compareItems(GCI i1,GCI i2)
- {
- return stricmp(((Define *)i1)->name,((Define *)i2)->name);
- }
-};
-
-class DefineName : public QList<Define>
-{
- public:
- DefineName(const char *n) : QList<Define>() { name=n; }
- ~DefineName() {}
- const char *nameString() const { return name; }
- int compareItems(GCI i1,GCI i2)
- {
- return stricmp(((Define *)i1)->name,((Define *)i2)->name);
- }
-
- private:
- QCString name;
-};
-
-class DefineNameList : public QList<DefineName>
-{
- public:
- DefineNameList() : QList<DefineName>() {}
- ~DefineNameList() {}
- int compareItems(GCI i1,GCI i2)
- {
- return stricmp(((DefineName *)i1)->nameString(),
- ((DefineName *)i2)->nameString());
- }
-};
-
-typedef QDict<Define> DefineDict;
-typedef QDict<DefineName> DefineNameDict;
-
-#endif
diff --git a/src/definition.cpp b/src/definition.cpp
deleted file mode 100644
index 9114e9d..0000000
--- a/src/definition.cpp
+++ /dev/null
@@ -1,853 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 "qtbc.h"
-#include <ctype.h>
-#include <qregexp.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include "config.h"
-#include "definition.h"
-#include "doxygen.h"
-#include "language.h"
-#include "message.h"
-#include "outputlist.h"
-#include "code.h"
-#include "util.h"
-#include "groupdef.h"
-#include "pagedef.h"
-#include "section.h"
-#include "htags.h"
-#include "parserintf.h"
-
-#if defined(_MSC_VER) || defined(__BORLANDC__)
-#define popen _popen
-#define pclose _pclose
-#endif
-
-static void addToMap(const char *name,Definition *d)
-{
- QCString symbolName = name;
- int index=computeQualifiedIndex(symbolName);
- if (index!=-1) symbolName=symbolName.mid(index+2);
- if (!symbolName.isEmpty())
- {
- DefinitionList *dl=Doxygen::symbolMap->find(symbolName);
- if (dl==0)
- {
- dl = new DefinitionList;
- Doxygen::symbolMap->append(symbolName,dl);
- }
- //printf("******* adding symbol `%s' (%p)\n",symbolName.data(),d);
- dl->append(d);
- d->setSymbolName(symbolName);
- }
-}
-
-static void removeFromMap(Definition *d)
-{
- QCString symbolName = d->symbolName();
- int index=computeQualifiedIndex(symbolName);
- if (index!=-1) symbolName=symbolName.mid(index+2);
- if (!symbolName.isEmpty())
- {
- //printf("******* removing symbol `%s' (%p)\n",symbolName.data(),d);
- DefinitionList *dl=Doxygen::symbolMap->find(symbolName);
- if (dl)
- {
- ASSERT(dl!=0);
- bool b = dl->removeRef(d);
- ASSERT(b==TRUE);
- }
- }
-}
-
-Definition::Definition(const char *df,int dl,
- const char *name,const char *b,
- const char *d,bool isSymbol)
-{
- //QCString ns;
- //printf("Definition(%s) %p\n",name,this);
- m_defFileName = df;
- int lastDot = m_defFileName.findRev('.');
- if (lastDot!=-1)
- {
- m_defFileExt = m_defFileName.mid(lastDot);
- }
- m_defLine = dl;
- m_name=name;
- if (m_name!="<globalScope>")
- {
- //extractNamespaceName(m_name,m_localName,ns);
- m_localName=stripScope(name);
- }
- else
- {
- m_localName=name;
- }
- //printf("m_localName=%s\n",m_localName.data());
- m_brief=b;
- m_doc=d;
- m_sectionDict=0,
- m_startBodyLine=m_endBodyLine=-1,
- m_bodyDef=0;
- m_sourceRefByDict=0;
- m_sourceRefsDict=0;
- m_todoId=0;
- m_testId=0;
- m_bugId=0;
- m_deprecatedId=0;
- m_outerScope=Doxygen::globalScope;
- m_partOfGroups=0;
- m_xrefListItems=0;
- m_briefLine=1;
- m_briefFile=(QCString)"<"+name+">";
- m_docLine=1;
- m_docFile=(QCString)"<"+name+">";
- m_isSymbol = isSymbol;
- m_hidden = FALSE;
- if (m_isSymbol) addToMap(name,this);
-}
-
-Definition::~Definition()
-{
- if (m_isSymbol) removeFromMap(this);
- delete m_sectionDict;
- delete m_sourceRefByDict;
- delete m_sourceRefsDict;
- delete m_partOfGroups;
- delete m_xrefListItems;
-}
-
-void Definition::addSectionsToDefinition(QList<SectionInfo> *anchorList)
-{
- if (!anchorList) return;
- //printf("%s: addSectionsToDefinition(%d)\n",name().data(),anchorList->count());
- SectionInfo *si=anchorList->first();
- while (si)
- {
- //printf("Add section `%s' to definition `%s'\n",
- // si->label.data(),name().data());
- SectionInfo *gsi=Doxygen::sectionDict.find(si->label);
- if (gsi==0)
- {
- gsi = new SectionInfo(*si);
- Doxygen::sectionDict.insert(si->label,gsi);
- }
- if (m_sectionDict==0)
- {
- m_sectionDict = new SectionDict(17);
- }
- if (m_sectionDict->find(gsi->label)==0)
- {
- m_sectionDict->insert(gsi->label,gsi);
- gsi->definition = this;
- }
- si=anchorList->next();
- }
-}
-
-void Definition::writeDocAnchorsToTagFile()
-{
- if (!Config_getString("GENERATE_TAGFILE").isEmpty() && m_sectionDict)
- {
- //printf("%s: writeDocAnchorsToTagFile(%d)\n",name().data(),m_sectionDict->count());
- QDictIterator<SectionInfo> sdi(*m_sectionDict);
- SectionInfo *si;
- for (;(si=sdi.current());++sdi)
- {
- if (!si->generated)
- {
- //printf("write an entry!\n");
- if (definitionType()==TypeMember) Doxygen::tagFile << " ";
- Doxygen::tagFile << " <docanchor file=\""
- << si->fileName << "\">" << si->label
- << "</docanchor>" << endl;
- }
- }
- }
-}
-
-void Definition::setDocumentation(const char *d,const char *docFile,int docLine,bool stripWhiteSpace)
-{
- if (d==0) return;
- //printf("Definition::setDocumentation(%s,%s,%d,%d)\n",d,docFile,docLine,stripWhiteSpace);
- QCString doc = d;
- if (stripWhiteSpace)
- {
-#if 0
- // strip leading empty lines in front of the text, but not the
- // leading spaces in front of the first line, so list items are
- // parsed with the correct indent
- const char *p=d;
- char c;
- int s=0,so=0;
- while ((c=*p) && (c==' ' || c=='\r' || c=='\n'))
- {
- if (c=='\n') so=s;
- p++;
- s++;
- }
- if (c=='\0') return;
- doc=d+so;
- // zero any trailing whitespace
- int e=doc.length()-1;
- while (e>=0 && (c=doc.at(e)) && (c==' ' || c=='\r' || c=='\n'))
- {
- doc.at(e)='\0';
- e--;
- }
-#endif
- doc = stripLeadingAndTrailingEmptyLines(doc);
- }
- else // don't strip whitespace
- {
- doc=d;
- }
- //printf("setting docs for %s: `%s'\n",name().data(),m_doc.data());
- m_doc=doc;
- m_docFile = docFile;
- m_docLine = docLine;
-}
-
-#define uni_isupper(c) (QChar(c).category()==QChar::Letter_Uppercase)
-
-void Definition::setBriefDescription(const char *b,const char *briefFile,int briefLine)
-{
- if (b==0) return;
- static QCString outputLanguage = Config_getEnum("OUTPUT_LANGUAGE");
- static bool needsDot = outputLanguage!="Japanese" &&
- outputLanguage!="Chinese" &&
- outputLanguage!="Korean";
-
- //fprintf(stderr,"Definition::setBriefDescription(%s,%s,%d)\n",b,briefFile,briefLine);
- m_brief=QCString(b).stripWhiteSpace();
- int bl=m_brief.length();
- if (bl>0 && needsDot) // add punctuation if needed
- {
- switch(m_brief.at(bl-1))
- {
- case '.': case '!': case '?': break;
- default:
- if (uni_isupper(m_brief.at(0))) m_brief+='.';
- break;
- }
- }
- m_briefFile = briefFile;
- m_briefLine = briefLine;
-}
-
-/*! 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.
- *
- * The file is scanned for a opening bracket ('{') from \a startLine onward.
- * The line actually containing the bracket is returned via startLine.
- * The file is scanned for a closing bracket ('}') from \a endLine backward.
- * The line actually containing the bracket is returned via endLine.
- */
-static bool readCodeFragment(const char *fileName,
- int &startLine,int &endLine,QCString &result)
-{
- //printf("readCodeFragment(%s,%d,%d)\n",fileName,startLine,endLine);
- if (fileName==0 || fileName[0]==0) return FALSE; // not a valid file name
- QCString cmd=getFileFilter(fileName)+" \""+fileName+"\"";
- FILE *f = Config_getBool("FILTER_SOURCE_FILES") ? popen(cmd,"r") : fopen(fileName,"r");
- bool found=FALSE;
- if (f)
- {
- int c=0;
- int col=0;
- int lineNr=1;
- // skip until the startLine has reached
- while (lineNr<startLine && !feof(f))
- {
- while ((c=fgetc(f))!='\n' && c!=EOF) /* skip */;
- lineNr++;
- }
- if (!feof(f))
- {
- // skip until the opening bracket or lonely : is found
- char cn=0;
- while (lineNr<=endLine && !feof(f) && !found)
- {
- while ((c=fgetc(f))!='{' && c!=':' && c!=EOF)
- {
- //printf("parsing char `%c'\n",c);
- if (c=='\n')
- {
- lineNr++,col=0;
- }
- else if (c=='\t')
- {
- col+=Config_getInt("TAB_SIZE") - (col%Config_getInt("TAB_SIZE"));
- }
- else
- {
- col++;
- }
- }
- if (c==':')
- {
- cn=fgetc(f);
- if (cn!=':') found=TRUE;
- }
- else if (c=='{')
- {
- found=TRUE;
- }
- }
- //printf(" -> readCodeFragment(%s,%d,%d) lineNr=%d\n",fileName,startLine,endLine,lineNr);
- if (found)
- {
- // For code with more than one line,
- // fill the line with spaces until we are at the right column
- // so that the opening brace lines up with the closing brace
- if (endLine!=startLine)
- {
- QCString spaces;
- spaces.fill(' ',col);
- result+=spaces;
- }
- // copy until end of line
- result+=c;
- if (c==':') result+=cn;
- startLine=lineNr;
- const int maxLineLength=4096;
- char lineStr[maxLineLength];
- do
- {
- //printf("reading line %d in range %d-%d\n",lineNr,startLine,endLine);
- int size_read;
- do
- {
- // read up to maxLineLength-1 bytes, the last byte being zero
- char *p = fgets(lineStr, maxLineLength,f);
- //printf(" read %s",p);
- if (p)
- {
- size_read=qstrlen(p);
- }
- else
- {
- size_read=-1;
- }
- result+=lineStr;
- } while (size_read == (maxLineLength-1));
-
- lineNr++;
- } while (lineNr<=endLine && !feof(f));
-
- // strip stuff after closing bracket
- int newLineIndex = result.findRev('\n');
- int braceIndex = result.findRev('}');
- if (braceIndex > newLineIndex)
- {
- result.truncate(braceIndex+1);
- }
- endLine=lineNr-1;
- }
- }
- if (Config_getBool("FILTER_SOURCE_FILES")) pclose(f); else fclose(f);
- }
- return found;
-}
-
-/*! Write a reference to the source code defining this definition */
-void Definition::writeSourceDef(OutputList &ol,const char *)
-{
- ol.pushGeneratorState();
- //printf("Definition::writeSourceRef %d %p\n",bodyLine,bodyDef);
- if (Config_getBool("SOURCE_BROWSER") && m_startBodyLine!=-1 && m_bodyDef)
- {
- QCString refText = theTranslator->trDefinedAtLineInSourceFile();
- int lineMarkerPos = refText.find("@0");
- int fileMarkerPos = refText.find("@1");
- if (lineMarkerPos!=-1 && fileMarkerPos!=-1) // should always pass this.
- {
- QCString lineStr,anchorStr;
- lineStr.sprintf("%d",m_startBodyLine);
- anchorStr.sprintf(Htags::useHtags ? "L%d" : "l%05d",m_startBodyLine);
- ol.newParagraph();
- if (lineMarkerPos<fileMarkerPos) // line marker before file marker
- {
- // write text left from linePos marker
- ol.parseText(refText.left(lineMarkerPos));
- ol.disableAllBut(OutputGenerator::Html);
- // write line link (HTML only)
- ol.writeObjectLink(0,m_bodyDef->getSourceFileBase(),
- anchorStr,lineStr);
- ol.enableAll();
- ol.disable(OutputGenerator::Html);
- // write normal text (Latex/Man only)
- ol.docify(lineStr);
- ol.enableAll();
-
- // write text between markers
- ol.parseText(refText.mid(lineMarkerPos+2,
- fileMarkerPos-lineMarkerPos-2));
-
- ol.disableAllBut(OutputGenerator::Html);
- // write file link (HTML only)
- ol.writeObjectLink(0,m_bodyDef->getSourceFileBase(),
- 0,m_bodyDef->name());
- ol.enableAll();
- ol.disable(OutputGenerator::Html);
- // write normal text (Latex/Man only)
- ol.docify(m_bodyDef->name());
- ol.enableAll();
-
- // write text right from file marker
- ol.parseText(refText.right(
- refText.length()-fileMarkerPos-2));
- }
- else // file marker before line marker
- {
- // write text left from file marker
- ol.parseText(refText.left(fileMarkerPos));
- ol.disableAllBut(OutputGenerator::Html);
- // write file link (HTML only)
- ol.writeObjectLink(0,m_bodyDef->getSourceFileBase(),
- 0,m_bodyDef->name());
- ol.enableAll();
- ol.disable(OutputGenerator::Html);
- // write normal text (Latex/Man only)
- ol.docify(m_bodyDef->name());
- ol.enableAll();
-
- // write text between markers
- ol.parseText(refText.mid(fileMarkerPos+2,
- lineMarkerPos-fileMarkerPos-2));
-
- ol.disableAllBut(OutputGenerator::Html);
- // write line link (HTML only)
- ol.writeObjectLink(0,m_bodyDef->getSourceFileBase(),
- anchorStr,lineStr);
- ol.enableAll();
- ol.disable(OutputGenerator::Html);
- // write normal text (Latex/Man only)
- ol.docify(lineStr);
- ol.enableAll();
-
- // write text right from linePos marker
- ol.parseText(refText.right(
- refText.length()-lineMarkerPos-2));
- }
- }
- else
- {
- err("Error: translation error: invalid markers in trDefinedInSourceFile()\n");
- }
- }
- ol.popGeneratorState();
-}
-
-/*! Write code of this definition into the documentation */
-void Definition::writeInlineCode(OutputList &ol,const char *scopeName)
-{
- ol.pushGeneratorState();
- //printf("Source Fragment %s: %d-%d bodyDef=%p\n",name().data(),
- // m_startBodyLine,m_endBodyLine,m_bodyDef);
- if (Config_getBool("INLINE_SOURCES") && m_startBodyLine!=-1 &&
- m_endBodyLine>=m_startBodyLine && m_bodyDef)
- {
- QCString codeFragment;
- int actualStart=m_startBodyLine,actualEnd=m_endBodyLine;
- if (readCodeFragment(m_bodyDef->absFilePath(),
- actualStart,actualEnd,codeFragment)
- )
- {
- ParserInterface *pIntf = Doxygen::parserManager->getParser(m_defFileExt);
- pIntf->resetCodeParserState();
- //printf("Read:\n`%s'\n\n",codeFragment.data());
- MemberDef *thisMd = 0;
- if (definitionType()==TypeMember) thisMd = (MemberDef *)this;
- ol.startCodeFragment();
- pIntf->parseCode(ol, // codeOutIntf
- scopeName, // scope
- codeFragment, // input
- FALSE, // isExample
- 0, // exampleName
- m_bodyDef, // fileDef
- actualStart, // startLine
- actualEnd, // endLine
- TRUE, // inlineFragment
- thisMd // memberDef
- );
- ol.endCodeFragment();
- ol.newParagraph();
- }
- }
- ol.popGeneratorState();
-}
-
-/*! Write a reference to the source code fragments in which this
- * definition is used.
- */
-void Definition::writeSourceRefList(OutputList &ol,const char *scopeName,
- const QCString &text,MemberSDict *members,bool /*funcOnly*/)
-{
- ol.pushGeneratorState();
- if (Config_getBool("SOURCE_BROWSER") && members)
- {
- ol.newParagraph();
- ol.parseText(text);
- ol.docify(" ");
-
- QCString ldefLine=theTranslator->trWriteList(members->count());
-
- QRegExp marker("@[0-9]+");
- int index=0,newIndex,matchLen;
- // 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));
- uint entryIndex = ldefLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
- MemberDef *md=members->at(entryIndex);
- if (ok && md)
- {
- QCString scope=md->getScopeString();
- QCString name=md->name();
- //printf("class=%p scope=%s scopeName=%s\n",md->getClassDef(),scope.data(),scopeName);
- if (!scope.isEmpty() && scope!=scopeName)
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
- {
- name.prepend(scope+".");
- }
- else
- {
- name.prepend(scope+"::");
- }
- }
- if (!md->isObjCMethod() &&
- (md->isFunction() || md->isSlot() ||
- md->isPrototype() || md->isSignal()
- )
- ) name+="()";
- //Definition *d = md->getOutputFileBase();
- //if (d==Doxygen::globalScope) d=md->getBodyDef();
- if (md->getStartBodyLine()!=-1 && md->getBodyDef())
- {
- //printf("md->getBodyDef()=%p global=%p\n",md->getBodyDef(),Doxygen::globalScope);
- // for HTML write a real link
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
- QCString lineStr,anchorStr;
- anchorStr.sprintf("l%05d",md->getStartBodyLine());
- //printf("Write object link to %s\n",md->getBodyDef()->getSourceFileBase().data());
- ol.writeObjectLink(0,md->getBodyDef()->getSourceFileBase(),anchorStr,name);
- ol.popGeneratorState();
-
- // for the other output formats just mention the name
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Html);
- ol.docify(name);
- ol.popGeneratorState();
- }
- else if (md->isLinkable() /*&& d && d->isLinkable()*/)
- {
- // for HTML write a real link
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
- ol.writeObjectLink(md->getReference(),
- md->getOutputFileBase(),
- md->anchor(),name);
- ol.popGeneratorState();
-
- // for the other output formats just mention the name
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Html);
- ol.docify(name);
- ol.popGeneratorState();
- }
- else
- {
- ol.docify(name);
- }
- }
- index=newIndex+matchLen;
- }
- ol.parseText(ldefLine.right(ldefLine.length()-index));
- ol.writeString(".");
- }
- ol.popGeneratorState();
-}
-
-void Definition::writeSourceReffedBy(OutputList &ol,const char *scopeName)
-{
- if (Config_getBool("REFERENCED_BY_RELATION"))
- {
- writeSourceRefList(ol,scopeName,theTranslator->trReferencedBy(),m_sourceRefByDict,FALSE);
- }
-}
-
-void Definition::writeSourceRefs(OutputList &ol,const char *scopeName)
-{
- if (Config_getBool("REFERENCES_RELATION"))
- {
- writeSourceRefList(ol,scopeName,theTranslator->trReferences(),m_sourceRefsDict,TRUE);
- }
-}
-
-bool Definition::hasDocumentation() const
-{
- static bool extractAll = Config_getBool("EXTRACT_ALL");
- static bool sourceBrowser = Config_getBool("SOURCE_BROWSER");
- bool hasDocs =
- !m_doc.isEmpty() || // has detailed docs
- !m_brief.isEmpty() || // has brief description
- extractAll || // extract everything
- (sourceBrowser && m_startBodyLine!=-1 && m_bodyDef); // link to definition
- return hasDocs;
-}
-
-void Definition::addSourceReferencedBy(MemberDef *md)
-{
- if (md)
- {
- QCString name = md->name();
- QCString scope = md->getScopeString();
-
- if (!scope.isEmpty())
- {
- name.prepend(scope+"::");
- }
-
- if (m_sourceRefByDict==0)
- {
- m_sourceRefByDict = new MemberSDict;
- }
- if (m_sourceRefByDict->find(name)==0)
- {
- m_sourceRefByDict->inSort(name,md);
- }
- }
-}
-
-void Definition::addSourceReferences(MemberDef *md)
-{
- if (md)
- {
- QCString name = md->name();
- QCString scope = md->getScopeString();
-
- if (!scope.isEmpty())
- {
- name.prepend(scope+"::");
- }
-
- if (m_sourceRefsDict==0)
- {
- m_sourceRefsDict = new MemberSDict;
- }
- if (m_sourceRefsDict->find(name)==0)
- {
- //printf("Adding reference %s->%s\n",md->name().data(),name.data());
- m_sourceRefsDict->inSort(name,md);
- }
- }
-}
-
-Definition *Definition::findInnerCompound(const char *)
-{
- return 0;
-}
-
-void Definition::addInnerCompound(Definition *)
-{
- err("Error: Definition::addInnerCompound() called\n");
-}
-
-QCString Definition::qualifiedName()
-{
- if (!m_qualifiedName.isEmpty()) return m_qualifiedName;
-
- //printf("start Definition::qualifiedName() localName=%s\n",m_localName.data());
- if (m_outerScope==0)
- {
- if (m_localName=="<globalScope>") return "";
- else return m_localName;
- }
-
- if (m_outerScope->name()=="<globalScope>")
- {
- m_qualifiedName = m_localName.copy();
- }
- else
- {
- m_qualifiedName = m_outerScope->qualifiedName()+"::"+m_localName;
- }
- //printf("end Definition::qualifiedName()=%s\n",qualifiedName.data());
- return m_qualifiedName;
-};
-
-QCString Definition::localName() const
-{
- return m_localName;
-}
-
-void Definition::setBodySegment(int bls,int ble)
-{
- //printf("setBodySegment(%d,%d) for %s\n",bls,ble,name().data());
- m_startBodyLine=bls;
- m_endBodyLine=ble;
-}
-
-void Definition::makePartOfGroup(GroupDef *gd)
-{
- if (m_partOfGroups==0) m_partOfGroups = new GroupList;
- m_partOfGroups->append(gd);
-}
-
-void Definition::setRefItems(const QList<ListItemInfo> *sli)
-{
- if (sli)
- {
- // deep copy the list
- if (m_xrefListItems==0)
- {
- m_xrefListItems=new QList<ListItemInfo>;
- m_xrefListItems->setAutoDelete(TRUE);
- }
- QListIterator<ListItemInfo> slii(*sli);
- ListItemInfo *lii;
- for (slii.toFirst();(lii=slii.current());++slii)
- {
- m_xrefListItems->append(new ListItemInfo(*lii));
- }
- }
-}
-
-void Definition::mergeRefItems(Definition *d)
-{
- if (d->xrefListItems())
- {
- // deep copy the list
- if (m_xrefListItems==0)
- {
- m_xrefListItems=new QList<ListItemInfo>;
- m_xrefListItems->setAutoDelete(TRUE);
- }
- QListIterator<ListItemInfo> slii(*d->xrefListItems());
- ListItemInfo *lii;
- for (slii.toFirst();(lii=slii.current());++slii)
- {
- if (getXRefListId(lii->type)==-1)
- {
- m_xrefListItems->append(new ListItemInfo(*lii));
- }
- }
- }
-}
-
-int Definition::getXRefListId(const char *listName) const
-{
- if (m_xrefListItems)
- {
- QListIterator<ListItemInfo> slii(*m_xrefListItems);
- ListItemInfo *lii;
- for (slii.toFirst();(lii=slii.current());++slii)
- {
- if (strcmp(lii->type,listName)==0)
- {
- return lii->itemId;
- }
- }
- }
- return -1;
-}
-
-const QList<ListItemInfo> *Definition::xrefListItems() const
-{
- return m_xrefListItems;
-}
-
-
-QCString Definition::convertNameToFile(const char *name,bool allowDots) const
-{
- if (!m_ref.isEmpty())
- {
- return name;
- }
- else
- {
- return ::convertNameToFile(name,allowDots);
- }
-}
-
-void Definition::writePathFragment(OutputList &ol) const
-{
- if (m_outerScope && m_outerScope!=Doxygen::globalScope)
- {
- m_outerScope->writePathFragment(ol);
- if (m_outerScope->definitionType()==Definition::TypeClass ||
- m_outerScope->definitionType()==Definition::TypeNamespace)
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
- {
- ol.writeString(".");
- }
- else
- {
- ol.writeString("::");
- }
- }
- else
- {
- ol.writeString("&nbsp;");
- ol.writeString("&raquo");
- ol.writeString("&nbsp;");
- }
- }
- if (isLinkable())
- {
- if (definitionType()==Definition::TypeGroup && ((const GroupDef*)this)->groupTitle())
- {
- ol.writeObjectLink(getReference(),getOutputFileBase(),0,((const GroupDef*)this)->groupTitle());
- }
- else if (definitionType()==Definition::TypePage && !((const PageDef*)this)->title().isEmpty())
- {
- ol.writeObjectLink(getReference(),getOutputFileBase(),0,((const PageDef*)this)->title());
- }
- else
- {
- ol.writeObjectLink(getReference(),getOutputFileBase(),0,m_localName);
- }
- }
- else
- {
- ol.startBold();
- ol.docify(m_localName);
- ol.endBold();
- }
-}
-
-void Definition::writeNavigationPath(OutputList &ol) const
-{
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
-
- ol.writeString("<div class=\"nav\">\n");
- writePathFragment(ol);
- ol.writeString("</div>\n");
-
- ol.popGeneratorState();
-}
-
diff --git a/src/definition.h b/src/definition.h
deleted file mode 100644
index 394bc79..0000000
--- a/src/definition.h
+++ /dev/null
@@ -1,277 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 DEFINITION_H
-#define DEFINITION_H
-
-#include "qtbc.h"
-#include <qlist.h>
-#include <qdict.h>
-
-class FileDef;
-class OutputList;
-class SectionDict;
-class MemberSDict;
-class MemberDef;
-class GroupDef;
-class GroupList;
-struct ListItemInfo;
-struct SectionInfo;
-class Definition;
-
-struct ReachableDefinition
-{
- ReachableDefinition(Definition *d,int dist) : def(d), distance(dist) {}
- Definition *def;
- int distance;
-};
-
-/*! The common base class of all entity definitions found in the sources. */
-class Definition
-{
- public:
- /*! Types of derived classes */
- enum DefType
- {
- TypeClass, TypeMember, TypeFile, TypeGroup,
- TypeNamespace, TypePackage, TypePage, TypeDir
- };
- /*! Use this for dynamic inspection of the type of the derived class */
- virtual DefType definitionType() const = 0;
-
- /*! Create a new definition */
- Definition(
- const char *defFileName,int defLine,
- const char *name,const char *b=0,const char *d=0,
- bool isSymbol=TRUE);
-
- /*! Destroys the definition */
- virtual ~Definition();
-
- /*! Returns the name of the definition */
- const QCString& name() const { return m_name; }
-
- /*! Returns the base name of the output file that contains this
- * definition.
- */
- virtual QCString qualifiedName();
-
- /*! Returns the local name without any scope qualifiers. */
- QCString localName() const;
-
- /*! Returns the base file name (without extension) of this definition.
- * as it is referenced to/written to disk.
- */
- virtual QCString getOutputFileBase() const = 0;
-
- /*! Returns the name of the source listing of this file. */
- virtual QCString getSourceFileBase() const { ASSERT(0); return "NULL"; }
-
- /*! Returns the detailed description of this definition */
- const QCString& documentation() const { return m_doc; }
-
- /*! Returns the brief description of this definition */
- const QCString& briefDescription() const { return m_brief; }
-
- /*! Sets a new \a name for the definition */
- void setName(const char *name) { m_name=name; }
-
- /*! Sets the documentation of this definition to \a d. */
- void setDocumentation(const char *d,const char *docFile,int docLine,bool stripWhiteSpace=TRUE);
-
- /*! Returns the line number at which the detailed documentation was found. */
- int docLine() const { return m_docLine; }
-
- /*! Returns the file in which the detailed documentation block was found.
- * This can differ from getDefFileName().
- */
- QCString docFile() const { return m_docFile; }
-
- /*! Sets the brief description of this definition to \a b.
- * A dot is added to the sentence if not available.
- */
- void setBriefDescription(const char *b,const char *briefFile,int briefLine);
-
- /*! Returns the line number at which the brief description was found. */
- int briefLine() const { return m_briefLine; }
-
- /*! Returns the file in which the brief description was found.
- * This can differ from getDefFileName().
- */
- QCString briefFile() const { return m_briefFile; }
-
- /*! returns the file in which this definition was found */
- QCString getDefFileName() const { return m_defFileName; }
-
- /*! returns the file in which this definition was found */
- QCString getDefFileExtension() const { return m_defFileExt; }
-
- /*! returns the line number at which the definition was found */
- int getDefLine() const { return m_defLine; }
-
- /*! Returns TRUE iff the definition is documented */
- virtual bool hasDocumentation() const;
-
- /*! Returns TRUE iff it is possible to link to this item within this
- * 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.
- */
- virtual bool isLinkable() 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
- * Doxygen::tagDestinationDict
- */
- virtual QCString getReference() const { return m_ref; }
-
- /*! Returns TRUE if this definition is imported via a tag file. */
- virtual bool isReference() const { return !m_ref.isEmpty(); }
-
- /*! Sets the tag file id via which this definition was imported. */
- void setReference(const char *r) { m_ref=r; }
-
- /*! Returns the name of this definition as it appears in the symbol map.
- */
- QCString symbolName() const { return m_symbolName; }
-
- /*! Sets the name of this definition as it should appear in the symbol map.
- */
- void setSymbolName(const QCString &name) { m_symbolName=name; }
-
- /*! Add the list of anchors that mark the sections that are found in the
- * documentation.
- */
- void addSectionsToDefinition(QList<SectionInfo> *anchorList);
-
- /*! Writes the documentation anchors of the definition to
- * the Doxygen::tagFile stream.
- */
- void writeDocAnchorsToTagFile();
-
- bool isHidden() const { return m_hidden; }
-
- // source references
- void setBodySegment(int bls,int ble);
- void setBodyDef(FileDef *fd) { m_bodyDef=fd; }
- int getStartBodyLine() const { return m_startBodyLine; }
- int getEndBodyLine() const { return m_endBodyLine; }
- FileDef *getBodyDef() { return m_bodyDef; }
- void writeSourceDef(OutputList &ol,const char *scopeName);
- void writeInlineCode(OutputList &ol,const char *scopeName);
- void writeSourceRefs(OutputList &ol,const char *scopeName);
- void writeSourceReffedBy(OutputList &ol,const char *scopeName);
- void addSourceReferencedBy(MemberDef *d);
- void addSourceReferences(MemberDef *d);
-
- void setRefItems(const QList<ListItemInfo> *sli);
- void mergeRefItems(Definition *d);
- const QList<ListItemInfo> *xrefListItems() const;
-
- virtual Definition *findInnerCompound(const char *name);
- virtual Definition *getOuterScope() const { return m_outerScope; }
- virtual void addInnerCompound(Definition *d);
- virtual void setOuterScope(Definition *d) { m_outerScope = d; }
-
- MemberSDict *getReferencesMembers() const { return m_sourceRefsDict; }
- MemberSDict *getReferencedByMembers() const { return m_sourceRefByDict; }
-
- void makePartOfGroup(GroupDef *gd);
- GroupList *partOfGroups() const { return m_partOfGroups; }
- QCString convertNameToFile(const char *name,bool allowDots=FALSE) const;
-
- void writePathFragment(OutputList &ol) const;
- void writeNavigationPath(OutputList &ol) const;
- virtual void writeQuickMemberLinks(OutputList &,MemberDef *) const {}
-
- void setHidden(bool b) { m_hidden = b; }
-
- protected:
- void setLocalName(const QCString name) { m_localName=name; }
-
- int m_startBodyLine; // line number of the start of the definition
- int m_endBodyLine; // line number of the end of the definition
- FileDef *m_bodyDef; // file definition containing the function body
-
- // where the item was found
- QCString m_defFileName;
- int m_defLine;
- QCString m_defFileExt;
-
- /*! The class, namespace in which this class is located
- */
- Definition *m_outerScope;
- QCString m_name; // name of the definition
- QCString m_localName; // local (unqualified) name of the definition
- // in the future m_name should become m_localName
- /*! List of groups this definition is part of */
- GroupList *m_partOfGroups;
-
- private:
- int getXRefListId(const char *listName) const;
- void writeSourceRefList(OutputList &ol,const char *scopeName,
- const QCString &text,MemberSDict *members,bool);
- //QCString m_qualifiedName; // name of the definition
- QCString m_brief; // brief description
- QCString m_doc; // detailed description
- QCString m_ref; // reference to external documentation
- SectionDict *m_sectionDict; // dictionary of all sections
- MemberSDict *m_sourceRefByDict;
- MemberSDict *m_sourceRefsDict;
- int m_testId; // id for test list item
- int m_todoId; // id for todo list item
- int m_bugId; // id for bug list item
- int m_deprecatedId; // id for deprecated list item
- int m_docLine;
- QCString m_docFile;
- int m_briefLine;
- QCString m_briefFile;
- QList<ListItemInfo> *m_xrefListItems;
- QCString m_symbolName;
- bool m_isSymbol;
- bool m_hidden;
-
-
- QCString m_qualifiedName;
-};
-
-class DefinitionList : public QList<Definition>
-{
- public:
- ~DefinitionList() {}
- int compareItems(GCI item1,GCI item2)
- {
- return stricmp(((Definition *)item1)->name(),
- ((Definition *)item2)->name()
- );
- }
-
-};
-
-class DefinitionListIterator : public QListIterator<Definition>
-{
- public:
- DefinitionListIterator(const DefinitionList &l) :
- QListIterator<Definition>(l) {}
- ~DefinitionListIterator() {}
-};
-
-#endif
diff --git a/src/diagram.cpp b/src/diagram.cpp
deleted file mode 100644
index 6e5b233..0000000
--- a/src/diagram.cpp
+++ /dev/null
@@ -1,1291 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 "qtbc.h"
-#include <stdio.h>
-#include <stdlib.h>
-#include <qlist.h>
-#include <qarray.h>
-#include <qtextstream.h>
-#include <qfile.h>
-
-#include "diagram.h"
-#include "image.h"
-#include "classdef.h"
-#include "config.h"
-#include "message.h"
-#include "util.h"
-//#include "latexgen.h"
-//#include "htmlgen.h"
-#include "doxygen.h"
-
-//-----------------------------------------------------------------------------
-
-const uint maxTreeWidth = 8;
-const int gridWidth = 100;
-const int 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)
- {
- case Public: return 0xffffffff;
- case Package: // package is not possible!
- case Protected: return 0xcccccccc;
- case Private: return 0xaaaaaaaa;
- }
- return 0;
-}
-
-static uint protToColor(Protection p)
-{
- switch(p)
- {
- case Public: return 6;
- case Package: // package is not possible!
- case Protected: return 5;
- case Private: return 4;
- }
- return 0;
-}
-
-static QCString protToString(Protection p)
-{
- switch(p)
- {
- case Public: return "solid";
- case Package: // package is not possible!
- case Protected: return "dashed";
- case Private: return "dotted";
- }
- return 0;
-}
-
-static uint virtToMask(Specifier p)
-{
- switch(p)
- {
- case Normal: return 0xffffffff;
- case Virtual: return 0xf0f0f0f0;
- default: return 0;
- }
- return 0;
-}
-
-// pre: dil is not empty
-static Protection getMinProtectionLevel(DiagramItemList *dil)
-{
- DiagramItem *di=dil->first();
- Protection result=di->protection();
- di=dil->next();
- while (di)
- {
- Protection p=di->protection();
- if (p!=result)
- {
- if (result==Protected && p==Public) result=p;
- else if (result==Private) result=p;
- }
- di=dil->next();
- }
- return result;
-}
-
-static void writeBitmapBox(DiagramItem *di,Image *image,
- int x,int y,int w,int 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());
- 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;
- for (i=0;i<5;i++)
- image->drawHorzLine(y+h+i-6,x+w-2-i,x+w-2,firstRow?1:3,0xffffffff);
- }
-}
-
-static void writeVectorBox(QTextStream &t,DiagramItem *di,
- float x,float y,bool children=FALSE)
-{
- if (di->virtualness()==Virtual) t << "dashed\n";
- t << " (" << di->label() << ") " << x << " " << y << " box\n";
- if (children) t << x << " " << y << " mark\n";
- if (di->virtualness()==Virtual) t << "solid\n";
-}
-
-static void writeMapArea(QTextStream &t,ClassDef *cd,QCString relPath,
- int x,int y,int w,int h)
-{
- if (cd->isLinkable())
- {
- QCString *dest;
- QCString ref=cd->getReference();
- t << "<area ";
- if (!ref.isEmpty())
- {
- t << "doxygen=\"" << ref << ":";
- if ((dest=Doxygen::tagDestinationDict[ref])) t << *dest << "/";
- t << "\" ";
- }
- t << "href=\"";
- if (!ref.isEmpty())
- {
- if ((dest=Doxygen::tagDestinationDict[ref])) t << *dest << "/";
- }
- else
- {
- t << relPath;
- }
- t << cd->getOutputFileBase() << Doxygen::htmlFileExtension << "\" ";
- t << "alt=\"" << cd->displayName();
- t << "\" shape=\"rect\" coords=\"" << x << "," << y << ",";
- t << (x+w) << "," << (y+h) << "\">" << endl;
- }
-}
-//-----------------------------------------------------------------------------
-
-DiagramItem::DiagramItem(DiagramItem *p,int number,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;
-}
-
-QCString DiagramItem::label() const
-{
- QCString result;
- if (!templSpec.isEmpty())
- {
- result=insertTemplateSpecifierInScope(classDef->displayName(),templSpec);
- }
- else
- {
- result=classDef->displayName();
- }
- if (Config_getBool("HIDE_SCOPE_NAMES")) result=stripScope(result);
- return result;
-}
-
-QCString DiagramItem::fileName() const
-{
- return classDef->getOutputFileBase();
-}
-
-int DiagramItem::avgChildPos() const
-{
- DiagramItem *di;
- int c=children->count();
- if (c==0) // no children -> don't move
- return xPos();
- if ((di=children->getFirst())->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();
- else // even number of children -> get middle of most middle children
- return (children->at(c/2-1)->xPos()+children->at(c/2)->xPos())/2;
-}
-
-int DiagramItem::numChildren() const
-{
- return children->count();
-}
-
-void DiagramItem::addChild(DiagramItem *di)
-{
- children->append(di);
-}
-
-void DiagramRow::insertClass(DiagramItem *parent,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();
- /* there are base/sub classes */
- int count=0;
- BaseClassDef *bcd=bcl->first();
- while (bcd)
- {
- ClassDef *ccd=bcd->classDef;
- if (ccd && ccd->isVisibleInHierarchy() /*&& !ccd->visited*/) count++;
- bcd=bcl->next();
- }
- if (count>0 && (prot!=Private || !doBases))
- {
- DiagramRow *row=0;
- if (diagram->count()<=level+1) /* add new row */
- {
- row = new DiagramRow(diagram,level+1);
- diagram->append(row);
- }
- else /* get next row */
- {
- row=diagram->at(level+1);
- }
- /* insert base classes in the next row */
- BaseClassDef *bcd=bcl->first();
- while (bcd)
- {
- ClassDef *ccd=bcd->classDef;
- if (ccd && ccd->isVisibleInHierarchy() /*&& !ccd->visited*/)
- {
- row->insertClass(di,ccd,doBases,bcd->prot,
- doBases?bcd->virt:Normal,
- doBases?bcd->templSpecifiers.data():"");
- }
- bcd=bcl->next();
- }
- }
-}
-
-TreeDiagram::TreeDiagram(ClassDef *root,bool doBases)
-{
- setAutoDelete(TRUE);
- DiagramRow *row=new DiagramRow(this,0);
- append(row);
- row->insertClass(0,root,doBases,Public,Normal,0);
-}
-
-TreeDiagram::~TreeDiagram()
-{
-}
-
-
-void TreeDiagram::moveChildren(DiagramItem *root,int dx)
-{
- DiagramItemList *dil=root->getChildren();
- DiagramItem *di=dil->first();
- while (di)
- {
- di->move(dx,0);
- moveChildren(di,dx);
- di=dil->next();
- }
-}
-
-bool TreeDiagram::layoutTree(DiagramItem *root,int r)
-{
- bool moved=FALSE;
- //printf("layoutTree(%s,%d)\n",root->label().data(),r);
-
- DiagramItemList *dil=root->getChildren();
- if (dil->count()>0)
- {
- uint k;
- int pPos=root->xPos();
- int cPos=root->avgChildPos();
- if (pPos>cPos) // move children
- {
- DiagramRow *row=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);
- moved=TRUE;
- }
- else if (pPos<cPos) // move parent
- {
- DiagramRow *row=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);
- moved=TRUE;
- }
-
- // recurse to children
- DiagramItem *di=dil->first();
- while (di && !moved && !di->isInList())
- {
- moved = moved || layoutTree(di,r+1);
- di=dil->next();
- }
- }
- return moved;
-}
-
-void TreeDiagram::computeLayout()
-{
- DiagramRow *row=first();
- while (row && row->count()<maxTreeWidth) row=next();
- if (row)
- {
- //printf("computeLayout() list row at %d\n",row->number());
- DiagramItem *di=row->first();
- DiagramItem *opi=0;
- int delta=0;
- bool first=TRUE;
- while (di)
- {
- DiagramItem *pi=di->parentItem();
- if (pi==opi && !first) { delta-=gridWidth; }
- first = pi!=opi;
- opi=pi;
- di->move(delta,0); // collapse all items in the same
- // list (except the first)
- di->putInList();
- di=row->next();
- }
- }
-
- // re-organize the diagram items
- DiagramItem *root=getFirst()->getFirst();
- while (layoutTree(root,0));
-
- // move first items of the lists
- if (row)
- {
- DiagramItem *di=row->first();
- while (di)
- {
- DiagramItem *pi=di->parentItem();
- if (pi->getChildren()->count()>1)
- {
- di->move(gridWidth,0);
- while (di && di->parentItem()==pi) di=row->next();
- }
- else
- {
- di=row->next();
- }
- }
- }
-}
-
-uint TreeDiagram::computeRows()
-{
- //printf("TreeDiagram::computeRows()=%d\n",count());
- int count=0;
- DiagramRow *row=first();
- while (row && !row->getFirst()->isInList())
- {
- count++;
- row=next();
- }
- //printf("count=%d row=%p\n",count,row);
- if (row)
- {
- int maxListLen=0;
- int curListLen=0;
- DiagramItem *di=row->first(),*opi=0;
- while (di)
- {
- if (di->parentItem()!=opi) curListLen=1; else curListLen++;
- if (curListLen>maxListLen) maxListLen=curListLen;
- opi=di->parentItem();
- di=row->next();
- }
- //printf("maxListLen=%d\n",maxListLen);
- count+=maxListLen;
- }
- return count;
-}
-
-#if 0
-uint TreeDiagram::computeCols()
-{
- uint count=0;
- DiagramRow *row=first();
- while (row && !row->getFirst()->isInList())
- {
- if (row->count()>count) count=row->count();
- row=next();
- }
- if (row)
- {
- row=prev();
- uint cols=row->count();
- if (row->getLast()->getChildren()->count()>1) cols++;
- if (cols>count) count=cols;
- }
- return count;
-};
-#endif
-
-void TreeDiagram::computeExtremes(uint *maxLabelLen,uint *maxXPos)
-{
- uint ml=0,mx=0;
- DiagramRow *dr=first();
- bool done=FALSE;
- while (dr && !done)
- {
- DiagramItem *di=dr->first();
- while (di)
- {
- if (di->isInList()) done=TRUE;
- if (maxXPos) mx=QMAX(mx,(uint)di->xPos());
- if (maxLabelLen) ml=QMAX(ml,Image::stringLength(di->label()));
- di=dr->next();
- }
- dr=next();
- }
- if (maxLabelLen) *maxLabelLen=ml;
- if (maxXPos) *maxXPos=mx;
-}
-
-void TreeDiagram::drawBoxes(QTextStream &t,Image *image,
- bool doBase,bool bitmap,
- uint baseRows,uint superRows,
- uint cellWidth,uint cellHeight,
- QCString relPath,
- bool generateMap)
-{
- DiagramRow *dr=first();
- if (!doBase) dr=next();
- bool done=FALSE;
- bool firstRow = doBase;
- while (dr && !done)
- {
- int x=0,y=0;
- float xf=0.0,yf=0.0;
- DiagramItem *di=dr->first();
- if (di->isInList()) // put boxes in a list
- {
- DiagramItem *opi=0;
- if (doBase) di=dr->last();
- while (di)
- {
- if (di->parentItem()==opi)
- {
- if (bitmap)
- {
- if (doBase) y -= cellHeight+labelVertSpacing;
- else y += cellHeight+labelVertSpacing;
- }
- else
- {
- if (doBase) yf += 1.0;
- else yf -= 1.0;
- }
- }
- else
- {
- if (bitmap)
- {
- x = di->xPos()*(cellWidth+labelHorSpacing)/gridWidth;
- if (doBase)
- {
- y = image->getHeight()-
- superRows*cellHeight-
- (superRows-1)*labelVertSpacing-
- di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
- }
- else
- {
- y = (baseRows-1)*(cellHeight+labelVertSpacing)+
- di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
- }
- }
- else
- {
- xf = di->xPos()/(float)gridWidth;
- if (doBase)
- {
- yf = di->yPos()/(float)gridHeight+superRows-1;
- }
- else
- {
- yf = superRows-1-di->yPos()/(float)gridHeight;
- }
- }
- }
- 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)
- writeMapArea(t,di->getClassDef(),relPath,x,y,cellWidth,cellHeight);
- }
- else
- {
- writeVectorBox(t,di,xf,yf,di->getChildren()->count()>0);
- }
-
- if (doBase) di=dr->prev(); else di=dr->next();
- }
- done=TRUE;
- }
- else // draw a tree of boxes
- {
- while (di)
- {
- if (bitmap)
- {
- x = di->xPos()*(cellWidth+labelHorSpacing)/gridWidth;
- if (doBase)
- {
- y = image->getHeight()-
- superRows*cellHeight-
- (superRows-1)*labelVertSpacing-
- di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
- }
- else
- {
- y = (baseRows-1)*(cellHeight+labelVertSpacing)+
- di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
- }
- bool hasDocs=di->getClassDef()->isLinkable();
- writeBitmapBox(di,image,x,y,cellWidth,cellHeight,firstRow,hasDocs);
- if (!firstRow && generateMap)
- writeMapArea(t,di->getClassDef(),relPath,x,y,cellWidth,cellHeight);
- }
- else
- {
- xf=di->xPos()/(float)gridWidth;
- if (doBase)
- {
- yf = di->yPos()/(float)gridHeight+superRows-1;
- }
- else
- {
- yf = superRows-1-di->yPos()/(float)gridHeight;
- }
- writeVectorBox(t,di,xf,yf);
- }
-
- di=dr->next();
- }
- }
- dr=next();
- firstRow=FALSE;
- }
-}
-
-void TreeDiagram::drawConnectors(QTextStream &t,Image *image,
- bool doBase,bool bitmap,
- uint baseRows,uint superRows,
- uint cellWidth,uint cellHeight)
-{
- DiagramRow *dr=first();
- bool done=FALSE;
- while (dr && !done) // for each row
- {
- DiagramItem *di=dr->first();
- if (di->isInList()) // row consists of list connectors
- {
- int x=0,y=0,ys=0;
- float xf=0.0,yf=0.0,ysf=0.0;
- while (di)
- {
- DiagramItem *pi=di->parentItem();
- DiagramItemList *dil=pi->getChildren();
- DiagramItem *last=dil->getLast();
- if (di==last) // single child
- {
- if (bitmap) // draw pixels
- {
- x = di->xPos()*(cellWidth+labelHorSpacing)/gridWidth + cellWidth/2;
- if (doBase) // base classes
- {
- y = image->getHeight()-
- (superRows-1)*(cellHeight+labelVertSpacing)-
- di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
- image->drawVertArrow(x,y,y+labelVertSpacing/2,
- protToColor(di->protection()),
- protToMask(di->protection()));
- }
- else // super classes
- {
- y = (baseRows-1)*(cellHeight+labelVertSpacing)-
- labelVertSpacing/2+
- di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
- image->drawVertLine(x,y,y+labelVertSpacing/2,
- protToColor(di->protection()),
- protToMask(di->protection()));
- }
- }
- else // draw vectors
- {
- t << protToString(di->protection()) << endl;
- if (doBase)
- {
- 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)
- << " in\n";
- }
- }
- }
- else // multiple children, put them in a vertical list
- {
- if (bitmap)
- {
- x = di->parentItem()->xPos()*
- (cellWidth+labelHorSpacing)/gridWidth+cellWidth/2;
- if (doBase) // base classes
- {
- ys = image->getHeight()-
- (superRows-1)*(cellHeight+labelVertSpacing)-
- di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
- y = ys - cellHeight/2;
- }
- else // super classes
- {
- ys = (baseRows-1)*(cellHeight+labelVertSpacing)+
- di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
- y = ys + cellHeight/2;
- }
- }
- else
- {
- xf = di->parentItem()->xPos()/(float)gridWidth;
- if (doBase)
- {
- ysf = di->yPos()/(float)gridHeight+superRows-1;
- yf = ysf + 0.5;
- }
- else
- {
- ysf = (float)superRows-0.25-di->yPos()/(float)gridHeight;
- yf = ysf - 0.25;
- }
- }
- while (di!=last) // more children to add
- {
- if (bitmap)
- {
- if (doBase) // base classes
- {
- image->drawHorzArrow(y,x,x+cellWidth/2+labelHorSpacing,
- protToColor(di->protection()),
- protToMask(di->protection()));
- y -= cellHeight+labelVertSpacing;
- }
- else // super classes
- {
- image->drawHorzLine(y,x,x+cellWidth/2+labelHorSpacing,
- protToColor(di->protection()),
- protToMask(di->protection()));
- y += cellHeight+labelVertSpacing;
- }
- }
- else
- {
- t << protToString(di->protection()) << endl;
- if (doBase)
- {
- t << "1 " << xf << " " << yf << " hedge\n";
- yf += 1.0;
- }
- else
- {
- t << "0 " << xf << " " << yf << " hedge\n";
- yf -= 1.0;
- }
- }
- di=dr->next();
- }
- // add last horizonal line and a vertical connection line
- if (bitmap)
- {
- if (doBase) // base classes
- {
- image->drawHorzArrow(y,x,x+cellWidth/2+labelHorSpacing,
- protToColor(di->protection()),
- protToMask(di->protection()));
- image->drawVertLine(x,y,ys+labelVertSpacing/2,
- protToColor(getMinProtectionLevel(dil)),
- protToMask(getMinProtectionLevel(dil)));
- }
- else // super classes
- {
- image->drawHorzLine(y,x,x+cellWidth/2+labelHorSpacing,
- protToColor(di->protection()),
- protToMask(di->protection()));
- image->drawVertLine(x,ys-labelVertSpacing/2,y,
- protToColor(getMinProtectionLevel(dil)),
- protToMask(getMinProtectionLevel(dil)));
- }
- }
- else
- {
- t << protToString(di->protection()) << endl;
- if (doBase)
- {
- t << "1 " << xf << " " << yf << " hedge\n";
- }
- else
- {
- t << "0 " << xf << " " << yf << " hedge\n";
- }
- t << protToString(getMinProtectionLevel(dil)) << endl;
- if (doBase)
- {
- t << xf << " " << ysf << " " << yf << " vedge\n";
- }
- else
- {
- t << xf << " " << (ysf + 0.25) << " " << yf << " vedge\n";
- }
- }
- }
- di=dr->next();
- }
- done=TRUE; // the tree is drawn now
- }
- else // normal tree connector
- {
- while (di)
- {
- int x=0,y=0;
- DiagramItemList *dil = di->getChildren();
- DiagramItem *parent = di->parentItem();
- if (parent) // item has a parent -> connect to it
- {
- if (bitmap) // draw pixels
- {
- x = di->xPos()*(cellWidth+labelHorSpacing)/gridWidth + cellWidth/2;
- if (doBase) // base classes
- {
- y = image->getHeight()-
- (superRows-1)*(cellHeight+labelVertSpacing)-
- di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
- /* write input line */
- image->drawVertArrow(x,y,y+labelVertSpacing/2,
- protToColor(di->protection()),
- protToMask(di->protection()));
- }
- else // super classes
- {
- y = (baseRows-1)*(cellHeight+labelVertSpacing)-
- labelVertSpacing/2+
- di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
- /* write output line */
- image->drawVertLine(x,y,y+labelVertSpacing/2,
- protToColor(di->protection()),
- protToMask(di->protection()));
- }
- }
- else // draw pixels
- {
- t << protToString(di->protection()) << endl;
- if (doBase)
- {
- 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)
- << " in\n";
- }
- }
- }
- if (dil->count()>0)
- {
- Protection p=getMinProtectionLevel(dil);
- uint mask=protToMask(p);
- uint col=protToColor(p);
- if (bitmap)
- {
- x = di->xPos()*(cellWidth+labelHorSpacing)/gridWidth + cellWidth/2;
- if (doBase) // base classes
- {
- y = image->getHeight()-
- (superRows-1)*(cellHeight+labelVertSpacing)-
- cellHeight-labelVertSpacing/2-
- di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
- image->drawVertLine(x,y,y+labelVertSpacing/2-1,col,mask);
- }
- else // super classes
- {
- y = (baseRows-1)*(cellHeight+labelVertSpacing)+
- cellHeight+
- di->yPos()*(cellHeight+labelVertSpacing)/gridHeight;
- image->drawVertArrow(x,y,y+labelVertSpacing/2-1,col,mask);
- }
- }
- else
- {
- t << protToString(p) << endl;
- if (doBase)
- {
- 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)
- << " out\n";
- }
- }
- /* write input line */
- DiagramItem *first = dil->first();
- DiagramItem *last = dil->last();
- if (first!=last && !first->isInList()) /* connect with all base classes */
- {
- if (bitmap)
- {
- int xs = first->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);
- }
- else // super classes
- {
- image->drawHorzLine(y+labelVertSpacing/2,xs,xe,col,mask);
- }
- }
- else
- {
- t << protToString(p) << endl;
- if (doBase)
- {
- t << first->xPos()/(float)gridWidth << " "
- << last->xPos()/(float)gridWidth << " "
- << (first->yPos()/(float)gridHeight+superRows-1)
- << " conn\n";
- }
- else
- {
- t << first->xPos()/(float)gridWidth << " "
- << last->xPos()/(float)gridWidth << " "
- << ((float)superRows-first->yPos()/(float)gridHeight)
- << " conn\n";
- }
- }
- }
- }
- di=dr->next();
- }
- dr=next();
- }
- }
-}
-
-
-void clearVisitFlags()
-{
- ClassSDict::Iterator cli(Doxygen::classSDict);
- ClassDef *cd;
- for (;(cd=cli.current());++cli)
- {
- cd->visited=FALSE;
- }
-}
-
-ClassDiagram::ClassDiagram(ClassDef *root)
-{
- clearVisitFlags();
- base = new TreeDiagram(root,TRUE);
- base->computeLayout();
- clearVisitFlags();
- super = new TreeDiagram(root,FALSE);
- super->computeLayout();
- DiagramItem *baseItem = base->first()->first();
- DiagramItem *superItem = super->first()->first();
- int xbase = baseItem->xPos();
- int xsuper = superItem->xPos();
- if (xbase>xsuper)
- {
- superItem->move(xbase-xsuper,0);
- super->moveChildren(superItem,xbase-xsuper);
- }
- else if (xbase<xsuper)
- {
- baseItem->move(xsuper-xbase,0);
- base->moveChildren(baseItem,xsuper-xbase);
- }
-}
-
-ClassDiagram::~ClassDiagram()
-{
- delete base;
- delete super;
-}
-
-void ClassDiagram::writeFigure(QTextStream &output,const char *path,
- const char *fileName)
-{
- uint baseRows=base->computeRows();
- uint superRows=super->computeRows();
- uint baseMaxX, baseMaxLabelWidth, superMaxX, superMaxLabelWidth;
- base->computeExtremes(&baseMaxLabelWidth,&baseMaxX);
- super->computeExtremes(&superMaxLabelWidth,&superMaxX);
-
- uint rows=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.0; // estimated page width in cm.
- // Somewhat lower to deal with estimation
- // 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;
- realWidth=pageWidth;
- }
-
- //output << "}\n";
- output << ":\\begin{figure}[H]\n"
- "\\begin{center}\n"
- "\\leavevmode\n";
- 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;
- QCString epsName=epsBaseName+".eps";
- QFile f1;
- f1.setName(epsName.data());
- if (!f1.open(IO_WriteOnly))
- {
- err("Could not open file %s for writing\n",convertToQCString(f1.name()).data());
- exit(1);
- }
- QTextStream 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";
- t << "%%CreationDate: Time\n";
- t << "%%For: \n";
- t << "%Magnification: 1.00\n";
- t << "%%Orientation: Portrait\n";
- t << "%%BoundingBox: 0 0 500 " << estHeight*500.0/(float)estWidth << "\n";
- t << "%%Pages: 0\n";
- t << "%%BeginSetup\n";
- t << "%%EndSetup\n";
- t << "%%EndComments\n";
- t << "\n";
- t << "% ----- variables -----\n";
- t << "\n";
- t << "/boxwidth 0 def\n";
- t << "/boxheight 40 def\n";
- t << "/fontheight 24 def\n";
- t << "/marginwidth 10 def\n";
- t << "/distx 20 def\n";
- t << "/disty 40 def\n";
- t << "/boundaspect " << estWidth/(float)estHeight << " def % aspect ratio of the BoundingBox (width/height)\n";
- t << "/boundx 500 def\n";
- t << "/boundy boundx boundaspect div def\n";
- t << "/xspacing 0 def\n";
- t << "/yspacing 0 def\n";
- t << "/rows " << rows << " def\n";
- t << "/cols " << cols << " def\n";
- t << "/scalefactor 0 def\n";
- t << "/boxfont /Times-Roman findfont fontheight scalefont def\n";
- t << "\n";
- t << "% ----- procedures -----\n";
- t << "\n";
- t << "/dotted { [1 4] 0 setdash } def\n";
- t << "/dashed { [5] 0 setdash } def\n";
- t << "/solid { [] 0 setdash } def\n";
- t << "\n";
- t << "/max % result = MAX(arg1,arg2)\n";
- t << "{\n";
- t << " /a exch def\n";
- t << " /b exch def\n";
- t << " a b gt {a} {b} ifelse\n";
- t << "} def\n";
- t << "\n";
- t << "/xoffset % result = MAX(0,(scalefactor-(boxwidth*cols+distx*(cols-1)))/2)\n";
- t << "{\n";
- t << " 0 scalefactor boxwidth cols mul distx cols 1 sub mul add sub 2 div max\n";
- t << "} def\n";
- t << "\n";
- t << "/cw % boxwidth = MAX(boxwidth, stringwidth(arg1))\n";
- t << "{\n";
- t << " /str exch def\n";
- t << " /boxwidth boxwidth str stringwidth pop max def\n";
- t << "} def\n";
- t << "\n";
- t << "/box % draws a box with text `arg1' at grid pos (arg2,arg3)\n";
- t << "{ gsave\n";
- t << " 2 setlinewidth\n";
- t << " newpath\n";
- t << " exch xspacing mul xoffset add\n";
- t << " exch yspacing mul\n";
- t << " moveto\n";
- t << " boxwidth 0 rlineto \n";
- t << " 0 boxheight rlineto \n";
- t << " boxwidth neg 0 rlineto \n";
- t << " 0 boxheight neg rlineto \n";
- t << " closepath\n";
- t << " dup stringwidth pop neg boxwidth add 2 div\n";
- t << " boxheight fontheight 2 div sub 2 div\n";
- t << " rmoveto show stroke\n";
- t << " grestore\n";
- t << "} def \n";
- t << "\n";
- t << "/mark\n";
- t << "{ newpath\n";
- t << " exch xspacing mul xoffset add boxwidth add\n";
- t << " exch yspacing mul\n";
- t << " moveto\n";
- t << " 0 boxheight 4 div rlineto\n";
- t << " boxheight neg 4 div boxheight neg 4 div rlineto\n";
- t << " closepath\n";
- t << " eofill\n";
- t << " stroke\n";
- t << "} def\n";
- t << "\n";
- t << "/arrow\n";
- t << "{ newpath\n";
- t << " moveto\n";
- t << " 3 -8 rlineto\n";
- t << " -6 0 rlineto\n";
- t << " 3 8 rlineto\n";
- t << " closepath\n";
- t << " eofill\n";
- t << " stroke\n";
- t << "} def\n";
- t << "\n";
- t << "/out % draws an output connector for the block at (arg1,arg2)\n";
- t << "{\n";
- t << " newpath\n";
- t << " exch xspacing mul xoffset add boxwidth 2 div add\n";
- t << " exch yspacing mul boxheight add\n";
- t << " /y exch def\n";
- t << " /x exch def\n";
- t << " x y moveto\n";
- t << " 0 disty 2 div rlineto \n";
- t << " stroke\n";
- t << " 1 eq { x y disty 2 div add arrow } if\n";
- t << "} def\n";
- t << "\n";
- t << "/in % draws an input connector for the block at (arg1,arg2)\n";
- t << "{\n";
- t << " newpath\n";
- t << " exch xspacing mul xoffset add boxwidth 2 div add\n";
- t << " exch yspacing mul disty 2 div sub\n";
- t << " /y exch def\n";
- t << " /x exch def\n";
- t << " x y moveto\n";
- t << " 0 disty 2 div rlineto\n";
- t << " stroke\n";
- t << " 1 eq { x y disty 2 div add arrow } if\n";
- t << "} def\n";
- t << "\n";
- t << "/hedge\n";
- t << "{\n";
- t << " exch xspacing mul xoffset add boxwidth 2 div add\n";
- t << " exch yspacing mul boxheight 2 div sub\n";
- t << " /y exch def\n";
- t << " /x exch def\n";
- t << " newpath\n";
- t << " x y moveto\n";
- t << " boxwidth 2 div distx add 0 rlineto\n";
- t << " stroke\n";
- t << " 1 eq\n";
- t << " { newpath x boxwidth 2 div distx add add y moveto\n";
- t << " -8 3 rlineto\n";
- t << " 0 -6 rlineto\n";
- t << " 8 3 rlineto\n";
- t << " closepath\n";
- t << " eofill\n";
- t << " stroke\n";
- t << " } if\n";
- t << "} def\n";
- t << "\n";
- t << "/vedge\n";
- t << "{\n";
- t << " /ye exch def\n";
- t << " /ys exch def\n";
- t << " /xs exch def\n";
- t << " newpath\n";
- t << " xs xspacing mul xoffset add boxwidth 2 div add dup\n";
- t << " ys yspacing mul boxheight 2 div sub\n";
- t << " moveto\n";
- t << " ye yspacing mul boxheight 2 div sub\n";
- t << " lineto\n";
- t << " stroke\n";
- t << "} def\n";
- t << "\n";
- t << "/conn % connections the blocks from col `arg1' to `arg2' of row `arg3'\n";
- t << "{\n";
- t << " /ys exch def\n";
- t << " /xe exch def\n";
- t << " /xs exch def\n";
- t << " newpath\n";
- t << " xs xspacing mul xoffset add boxwidth 2 div add\n";
- t << " ys yspacing mul disty 2 div sub\n";
- t << " moveto\n";
- t << " xspacing xe xs sub mul 0\n";
- t << " rlineto\n";
- t << " stroke\n";
- t << "} def\n";
- t << "\n";
- t << "% ----- main ------\n";
- t << "\n";
- t << "boxfont setfont\n";
- t << "1 boundaspect scale\n";
-
-
- bool done=FALSE;
- DiagramRow *dr=base->first();
- while (dr && !done)
- {
- DiagramItem *di=dr->first();
- while (di)
- {
- done=di->isInList();
- t << "(" << di->label() << ") cw\n";
- di=dr->next();
- }
- dr=base->next();
- }
- dr=super->first();
- dr=super->next();
- done=FALSE;
- while (dr && !done)
- {
- DiagramItem *di=dr->first();
- while (di)
- {
- done=di->isInList();
- t << "(" << di->label() << ") cw\n";
- di=dr->next();
- }
- dr=super->next();
- }
-
- t << "/boxwidth boxwidth marginwidth 2 mul add def\n"
- << "/xspacing boxwidth distx add def\n"
- << "/yspacing boxheight disty add def\n"
- << "/scalefactor \n"
- << " boxwidth cols mul distx cols 1 sub mul add\n"
- << " 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);
-
- 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);
-
- f1.close();
- if (Config_getBool("USE_PDFLATEX"))
- {
- QCString epstopdfArgs(4096);
- epstopdfArgs.sprintf("\"%s.eps\" --outfile=\"%s.pdf\"",
- epsBaseName.data(),epsBaseName.data());
- //printf("Converting eps using `%s'\n",epstopdfCmd.data());
- if (iSystem("epstopdf",epstopdfArgs,TRUE)!=0)
- {
- err("Error: Problems running epstopdf. Check your TeX installation!\n");
- return;
- }
- }
-}
-
-
-void ClassDiagram::writeImage(QTextStream &t,const char *path,
- const char *relPath,const char *fileName,
- bool generateMap)
-{
- uint baseRows=base->computeRows();
- uint superRows=super->computeRows();
- uint rows=baseRows+superRows-1;
-
- uint lb,ls,xb,xs;
- base->computeExtremes(&lb,&xb);
- 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
- uint cellHeight = labelVertMargin*2+fontHeight;
- uint imageWidth = (maxXPos+gridWidth)*cellWidth/gridWidth+
- (maxXPos*labelHorSpacing)/gridWidth;
- uint imageHeight = rows*cellHeight+(rows-1)*labelVertSpacing;
-
- 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);
-
- image.save((QCString)path+"/"+fileName+".png");
-
- if (generateMap) t << "</map>" << endl;
-}
-
diff --git a/src/diagram.h b/src/diagram.h
deleted file mode 100644
index 35766a6..0000000
--- a/src/diagram.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 "qtbc.h"
-#include "entry.h"
-
-class ClassDef;
-class DiagramRow;
-class TreeDiagram;
-class ClassDiagram;
-class DiagramItemList;
-class Image;
-
-class DiagramItem
-{
- public:
- DiagramItem(DiagramItem *p,int number,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;
- 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; }
- ClassDef *getClassDef() const { return classDef; }
- private:
- DiagramItemList *children;
- DiagramItem *parent;
- int x,y;
- int num;
- Protection prot;
- Specifier virt;
- QCString templSpec;
- bool inList;
- ClassDef *classDef;
-};
-
-class DiagramItemList : public QList<DiagramItem>
-{
- public:
- DiagramItemList() : QList<DiagramItem>() {}
- ~DiagramItemList() {}
-};
-
-class DiagramRow : public QList<DiagramItem>
-{
- public:
- DiagramRow(TreeDiagram *d,int l) : QList<DiagramItem>()
- {
- diagram=d;
- level=l;
- setAutoDelete(TRUE);
- }
- void insertClass(DiagramItem *parent,ClassDef *cd,bool doBases,
- Protection prot,Specifier virt,const char *ts);
- uint number() { return level; }
- private:
- TreeDiagram *diagram;
- uint level;
-};
-
-class DiagramRowIterator : public QListIterator<DiagramRow>
-{
- public:
- DiagramRowIterator(const QList<DiagramRow> &d)
- : QListIterator<DiagramRow>(d) {}
-};
-
-class TreeDiagram : public QList<DiagramRow>
-{
- public:
- TreeDiagram(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(QTextStream &t,Image *image,
- bool doBase,bool bitmap,
- uint baseRows,uint superRows,
- uint cellWidth,uint cellHeight,
- QCString relPath="",
- bool generateMap=TRUE);
- void drawConnectors(QTextStream &t,Image *image,
- bool doBase,bool bitmap,
- uint baseRows,uint superRows,
- uint cellWidth,uint cellheight);
- private:
- bool layoutTree(DiagramItem *root,int row);
- TreeDiagram &operator=(const TreeDiagram &);
- TreeDiagram(const TreeDiagram &);
-};
-
-class ClassDiagram
-{
- public:
- ClassDiagram(ClassDef *root);
- ~ClassDiagram();
- void writeFigure(QTextStream &t,const char *path,
- const char *file);
- void writeImage(QTextStream &t,const char *path,const char *relPath,
- const char *file,bool generateMap=TRUE);
- private:
- TreeDiagram *base;
- TreeDiagram *super;
-};
diff --git a/src/dirdef.cpp b/src/dirdef.cpp
deleted file mode 100644
index 2ca264f..0000000
--- a/src/dirdef.cpp
+++ /dev/null
@@ -1,880 +0,0 @@
-#include "dirdef.h"
-#include "filename.h"
-#include "doxygen.h"
-#include "util.h"
-#include "outputlist.h"
-#include "language.h"
-#include "message.h"
-#include "dot.h"
-
-//----------------------------------------------------------------------
-// method implementation
-
-static int g_dirCount=0;
-
-DirDef::DirDef(const char *path) : Definition(path,1,path)
-{
- // get display name (stipping the paths mentioned in STRIP_FROM_PATH)
- m_dispName = stripFromPath(path);
- // get short name (last part of path)
- m_shortName = path;
- if (m_shortName.at(m_shortName.length()-1)=='/')
- { // strip trailing /
- m_shortName = m_shortName.left(m_shortName.length()-1);
- }
- int pi=m_shortName.findRev('/');
- if (pi!=-1)
- { // remove everything till the last /
- m_shortName = m_shortName.mid(pi+1);
- }
- setLocalName(m_shortName);
-
- m_fileList = new FileList;
- m_usedDirs = new QDict<UsedDir>(257);
- m_usedDirs->setAutoDelete(TRUE);
- m_dirCount = g_dirCount++;
- m_level=-1;
- m_parent=0;
-}
-
-DirDef::~DirDef()
-{
- delete m_fileList;
- delete m_usedDirs;
-}
-
-bool DirDef::isLinkableInProject() const
-{
- return !isReference() && Config_getBool("SHOW_DIRECTORIES");
-}
-
-bool DirDef::isLinkable() const
-{
- return isReference() || isLinkableInProject();
-}
-
-void DirDef::addSubDir(DirDef *subdir)
-{
- m_subdirs.inSort(subdir);
- subdir->setOuterScope(this);
- subdir->m_parent=this;
-}
-
-void DirDef::addFile(FileDef *fd)
-{
- m_fileList->inSort(fd);
- fd->setDirDef(this);
-}
-
-QCString DirDef::getOutputFileBase() const
-{
- //return "dir_"+convertNameToFile(name());
- return QCString().sprintf("dir_%06d",m_dirCount);
-}
-
-void DirDef::writeDetailedDocumentation(OutputList &ol)
-{
- if (!briefDescription().isEmpty() || !documentation().isEmpty())
- {
- ol.writeRuler();
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Latex);
- ol.disable(OutputGenerator::RTF);
- ol.writeAnchor(0,"_details");
- ol.popGeneratorState();
- ol.startGroupHeader();
- ol.parseText(theTranslator->trDetailedDescription());
- ol.endGroupHeader();
-
- // repeat brief description
- if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
- {
- ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
- ol.newParagraph();
- }
-
- // write documentation
- if (!documentation().isEmpty())
- {
- ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
- }
- }
-}
-
-void DirDef::writeDocumentation(OutputList &ol)
-{
- ol.pushGeneratorState();
-
- QCString shortTitle=theTranslator->trDirReference(m_shortName);
- QCString title=theTranslator->trDirReference(m_dispName);
- startFile(ol,getOutputFileBase(),name(),title);
-
- // write navigation path
- writeNavigationPath(ol);
-
- startTitle(ol,getOutputFileBase());
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
- ol.parseText(shortTitle);
- ol.enableAll();
- ol.disable(OutputGenerator::Html);
- ol.parseText(title);
- ol.popGeneratorState();
- endTitle(ol,getOutputFileBase(),title);
-
- // write brief or details (if DETAILS_AT_TOP)
- if (Config_getBool("DETAILS_AT_TOP"))
- {
- writeDetailedDocumentation(ol);
- ol.newParagraph();
- }
- else if (!briefDescription().isEmpty())
- {
- ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE);
- ol.writeString(" \n");
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Latex);
- ol.disable(OutputGenerator::RTF);
- ol.disable(OutputGenerator::Man);
- ol.startTextLink(0,"_details");
- ol.parseText(theTranslator->trMore());
- ol.endTextLink();
- ol.enableAll();
- ol.disableAllBut(OutputGenerator::Man);
- ol.newParagraph();
- ol.popGeneratorState();
- }
-
- if (!Config_getString("GENERATE_TAGFILE").isEmpty())
- {
- Doxygen::tagFile << " <compound kind=\"dir\">" << endl;
- Doxygen::tagFile << " <name>" << convertToXML(displayName()) << "</name>" << endl;
- Doxygen::tagFile << " <path>" << convertToXML(name()) << "</path>" << endl;
- Doxygen::tagFile << " <filename>" << convertToXML(getOutputFileBase()) << Doxygen::htmlFileExtension << "</filename>" << endl;
- }
-
- // write graph dependency graph
- if (Config_getBool("DIRECTORY_GRAPH") && Config_getBool("HAVE_DOT"))
- {
- DotDirDeps dirDep(this);
- if (!dirDep.isTrivial())
- {
- msg("Generating dependency graph for directory %s\n",displayName().data());
- ol.disable(OutputGenerator::Man);
- ol.newParagraph();
- ol.startDirDepGraph();
- //TODO: ol.parseText(theTranslator->trDirDepGraph());
- ol.endDirDepGraph(dirDep);
- ol.enableAll();
- }
- }
-
- ol.startMemberSections();
- // write subdir list
- if (m_subdirs.count()>0)
- {
- ol.startMemberHeader();
- ol.parseText(theTranslator->trDir(TRUE,FALSE));
- ol.endMemberHeader();
- ol.startMemberList();
- DirDef *dd=m_subdirs.first();
- while (dd)
- {
- ol.startMemberItem(0);
- ol.parseText(theTranslator->trDir(FALSE,TRUE)+" ");
- ol.insertMemberAlign();
- ol.writeObjectLink(dd->getReference(),dd->getOutputFileBase(),0,dd->shortName());
- ol.endMemberItem();
- if (!Config_getString("GENERATE_TAGFILE").isEmpty())
- {
- Doxygen::tagFile << " <dir>" << convertToXML(dd->displayName()) << "</dir>" << endl;
- }
- if (!dd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
- {
- ol.startMemberDescription();
- ol.parseDoc(briefFile(),briefLine(),dd,0,dd->briefDescription(),FALSE,FALSE);
- ol.endMemberDescription();
- ol.newParagraph();
- }
- dd=m_subdirs.next();
- }
-
- ol.endMemberList();
- }
-
- // write file list
- if (m_fileList->count()>0)
- {
- ol.startMemberHeader();
- ol.parseText(theTranslator->trFile(TRUE,FALSE));
- ol.endMemberHeader();
- ol.startMemberList();
- FileDef *fd=m_fileList->first();
- while (fd)
- {
- ol.startMemberItem(0);
- ol.docify(theTranslator->trFile(FALSE,TRUE)+" ");
- ol.insertMemberAlign();
- if (fd->isLinkable())
- {
- ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,fd->name());
- }
- else
- {
- ol.startBold();
- ol.docify(fd->name());
- ol.endBold();
- }
- if (fd->generateSourceFile())
- {
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
- ol.docify(" ");
- ol.startTextLink(fd->includeName(),0);
- ol.docify("[");
- ol.parseText(theTranslator->trCode());
- ol.docify("]");
- ol.endTextLink();
- ol.popGeneratorState();
- }
- if (!Config_getString("GENERATE_TAGFILE").isEmpty())
- {
- Doxygen::tagFile << " <file>" << convertToXML(fd->name()) << "</file>" << endl;
- }
- ol.endMemberItem();
- if (!fd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
- {
- ol.startMemberDescription();
- ol.parseDoc(briefFile(),briefLine(),fd,0,fd->briefDescription(),FALSE,FALSE);
- ol.endMemberDescription();
- ol.newParagraph();
- }
- fd=m_fileList->next();
- }
- ol.endMemberList();
- }
- ol.endMemberSections();
-
- if (!Config_getString("GENERATE_TAGFILE").isEmpty())
- {
- writeDocAnchorsToTagFile();
- Doxygen::tagFile << " </compound>" << endl;
- }
-
-
- if (!Config_getBool("DETAILS_AT_TOP"))
- {
- writeDetailedDocumentation(ol);
- }
-
- endFile(ol);
- ol.popGeneratorState();
-}
-
-#if 0
-void DirDef::writePathFragment(OutputList &ol) const
-{
- if (m_parent)
- {
- m_parent->writePathFragment(ol);
- ol.writeString("&nbsp;/&nbsp;");
- }
- ol.writeObjectLink(getReference(),getOutputFileBase(),0,shortName());
-}
-
-void DirDef::writeNavigationPath(OutputList &ol)
-{
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
-
- ol.writeString("<div class=\"nav\">\n");
- writePathFragment(ol);
- ol.writeString("</div>\n");
-
- ol.popGeneratorState();
-}
-#endif
-
-void DirDef::setLevel()
-{
- if (m_level==-1) // level not set before
- {
- DirDef *p = parent();
- if (p)
- {
- p->setLevel();
- m_level = p->level()+1;
- }
- else
- {
- m_level = 0;
- }
- }
-}
-
-/** Add as "uses" dependency between \a this dir and \a dir,
- * that was caused by a dependency on file \a fd.
- */
-void DirDef::addUsesDependency(DirDef *dir,FileDef *srcFd,
- FileDef *dstFd,bool inherited)
-{
- if (this==dir) return; // do not add self-dependencies
- //printf(" > add dependency %s->%s due to %s\n",shortName().data(),
- // dir->shortName().data(),fd->name().data());
-
- // levels match => add direct dependency
- bool added=FALSE;
- UsedDir *usedDir = m_usedDirs->find(dir->getOutputFileBase());
- if (usedDir) // dir dependency already present
- {
- FilePair *usedPair = usedDir->findFilePair(
- srcFd->getOutputFileBase()+dstFd->getOutputFileBase());
- if (usedPair==0) // new file dependency
- {
- //printf(" => new file\n");
- usedDir->addFileDep(srcFd,dstFd);
- added=TRUE;
- }
- else
- {
- // dir & file dependency already added
- }
- }
- else // new directory dependency
- {
- //printf(" => new file\n");
- usedDir = new UsedDir(dir,inherited);
- usedDir->addFileDep(srcFd,dstFd);
- m_usedDirs->insert(dir->getOutputFileBase(),usedDir);
- added=TRUE;
- }
- if (added && dir->parent())
- {
- // add relation to parent of used dir
- addUsesDependency(dir->parent(),srcFd,dstFd,inherited);
- }
- if (parent())
- {
- // add relation for the parent of this dir as well
- parent()->addUsesDependency(dir,srcFd,dstFd,TRUE);
- }
-}
-
-/** Computes the dependencies between directories
- */
-void DirDef::computeDependencies()
-{
- FileList *fl = m_fileList;
- if (fl)
- {
- QListIterator<FileDef> fli(*fl);
- FileDef *fd;
- for (fli.toFirst();(fd=fli.current());++fli) // foreach file in dir dd
- {
- //printf("** dir=%s file=%s\n",shortName().data(),fd->name().data());
- QList<IncludeInfo> *ifl = fd->includeFileList();
- if (ifl)
- {
- QListIterator<IncludeInfo> ifli(*ifl);
- IncludeInfo *ii;
- for (ifli.toFirst();(ii=ifli.current());++ifli) // foreach include file
- {
- //printf(" > %s\n",ii->includeName.data());
- if (ii->fileDef && ii->fileDef->isLinkable()) // linkable file
- {
- DirDef *usedDir = ii->fileDef->getDirDef();
- if (usedDir)
- {
- // add dependency: thisDir->usedDir
- addUsesDependency(usedDir,fd,ii->fileDef,FALSE);
- }
- }
- }
- }
- }
- }
-}
-
-bool DirDef::isParentOf(DirDef *dir) const
-{
- 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());
- else
- return FALSE;
-}
-
-bool DirDef::depGraphIsTrivial() const
-{
- return FALSE;
-}
-
-//----------------------------------------------------------------------
-
-int FilePairDict::compareItems(GCI item1,GCI item2)
-{
- FilePair *left = (FilePair*)item1;
- FilePair *right = (FilePair*)item2;
- int orderHi = stricmp(left->source()->name(),right->source()->name());
- int orderLo = stricmp(left->destination()->name(),right->destination()->name());
- return orderHi==0 ? orderLo : orderHi;
-}
-
-//----------------------------------------------------------------------
-
-UsedDir::UsedDir(DirDef *dir,bool inherited) :
- m_dir(dir), m_filePairs(7), m_inherited(inherited)
-{
- m_filePairs.setAutoDelete(TRUE);
-}
-
-UsedDir::~UsedDir()
-{
-}
-
-
-void UsedDir::addFileDep(FileDef *srcFd,FileDef *dstFd)
-{
- m_filePairs.inSort(srcFd->getOutputFileBase()+dstFd->getOutputFileBase(),
- new FilePair(srcFd,dstFd));
-}
-
-FilePair *UsedDir::findFilePair(const char *name)
-{
- QCString n=name;
- return n.isEmpty() ? 0 : m_filePairs.find(n);
-}
-
-DirDef *DirDef::createNewDir(const char *path)
-{
- ASSERT(path!=0);
- DirDef *dir = Doxygen::directories.find(path);
- if (dir==0) // new dir
- {
- //printf("Adding new dir %s\n",path);
- dir = new DirDef(path);
- //printf("createNewDir %s short=%s\n",path,dir->shortName().data());
- Doxygen::directories.inSort(path,dir);
- }
- return dir;
-}
-
-bool DirDef::matchPath(const QCString &path,QStrList &l)
-{
- const char *s=l.first();
- while (s)
- {
- QCString prefix = s;
- if (stricmp(prefix.left(path.length()),path)==0) // case insensitive compare
- {
- return TRUE;
- }
- s = l.next();
- }
- return FALSE;
-}
-
-/*! strip part of \a path if it matches
- * one of the paths in the Config_getList("STRIP_FROM_PATH") list
- */
-DirDef *DirDef::mergeDirectoryInTree(const QCString &path)
-{
- //printf("DirDef::mergeDirectoryInTree(%s)\n",path.data());
- int p=0,i=0;
- DirDef *dir=0;
- while ((i=path.find('/',p))!=-1)
- {
- QCString part=path.left(i+1);
- if (!matchPath(part,Config_getList("STRIP_FROM_PATH")) && part!="/")
- {
- dir=createNewDir(part);
- }
- p=i+1;
- }
- return dir;
-}
-
-void DirDef::writeDepGraph(QTextStream &t)
-{
- t << "digraph G {\n";
- if (Config_getBool("DOT_TRANSPARENT"))
- {
- t << " bgcolor=transparent;\n";
- }
- t << " compound=true\n";
- t << " node [ fontsize=10, fontname=\"Helvetica\"];\n";
- t << " edge [ labelfontsize=9, labelfontname=\"Helvetica\"];\n";
-
- QDict<DirDef> dirsInGraph(257);
-
- dirsInGraph.insert(getOutputFileBase(),this);
- if (parent())
- {
- t << " subgraph cluster" << parent()->getOutputFileBase() << " {\n";
- t << " graph [ bgcolor=\"#ddddee\", pencolor=\"black\", label=\""
- << parent()->shortName()
- << "\" fontname=\"Helvetica\", fontsize=10, URL=\"";
- t << parent()->getOutputFileBase() << Doxygen::htmlFileExtension;
- t << "\"]\n";
- }
- if (isCluster())
- {
- t << " subgraph cluster" << getOutputFileBase() << " {\n";
- t << " graph [ bgcolor=\"#eeeeff\", pencolor=\"black\", label=\"\""
- << " URL=\"" << getOutputFileBase() << Doxygen::htmlFileExtension
- << "\"];\n";
- t << " " << getOutputFileBase() << " [shape=plaintext label=\""
- << shortName() << "\"];\n";
-
- // add nodes for sub directories
- QListIterator<DirDef> sdi(m_subdirs);
- DirDef *sdir;
- for (sdi.toFirst();(sdir=sdi.current());++sdi)
- {
- 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);
- }
- t << " }\n";
- }
- else
- {
- t << " " << getOutputFileBase() << " [shape=box, label=\""
- << shortName() << "\", style=\"filled\", fillcolor=\"#eeeeff\","
- << " pencolor=\"black\", URL=\"" << getOutputFileBase()
- << Doxygen::htmlFileExtension << "\"];\n";
- }
- if (parent())
- {
- t << " }\n";
- }
-
- // add nodes for other used directories
- QDictIterator<UsedDir> udi(*m_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();
- DirDef *dir=this;
- while (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(this))
- // include if both have the same parent (or no parent)
- {
- t << " " << usedDir->getOutputFileBase() << " [shape=box label=\""
- << usedDir->shortName() << "\"";
- if (usedDir->isCluster())
- {
- if (!Config_getBool("DOT_TRANSPARENT"))
- {
- t << " fillcolor=\"white\" style=\"filled\"";
- }
- t << " color=\"red\"";
- }
- t << " URL=\"" << usedDir->getOutputFileBase()
- << Doxygen::htmlFileExtension << "\"];\n";
- dirsInGraph.insert(usedDir->getOutputFileBase(),usedDir);
- break;
- }
- dir=dir->parent();
- }
- }
-
- // add relations between all selected directories
- DirDef *dir;
- QDictIterator<DirDef> di(dirsInGraph);
- for (di.toFirst();(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
- {
- const DirDef *usedDir=udir->dir();
- if ((dir!=this || !udir->inherited()) && // only show direct dependendies for this dir
- (usedDir!=this || !udir->inherited()) && // only show direct dependendies for this dir
- !usedDir->isParentOf(dir) && // don't point to own parent
- dirsInGraph.find(usedDir->getOutputFileBase())) // only point to nodes that are in the graph
- {
- QCString relationName;
- relationName.sprintf("dir_%06d_%06d",dir->m_dirCount,usedDir->m_dirCount);
- if (Doxygen::dirRelations.find(relationName)==0)
- {
- // new relation
- Doxygen::dirRelations.append(relationName,
- new DirRelation(relationName,dir,udir));
- }
- int nrefs = udir->filePairs().count();
- t << " " << dir->getOutputFileBase() << "->"
- << usedDir->getOutputFileBase();
- t << " [headlabel=\"" << nrefs << "\", labeldistance=1.5";
- t << " headhref=\"" << relationName << Doxygen::htmlFileExtension
- << "\"];\n";
- }
- }
- }
-
- t << "}\n";
-}
-
-//----------------------------------------------------------------------
-
-static void writePartialDirPath(OutputList &ol,const DirDef *root,const DirDef *target)
-{
- if (target->parent()!=root)
- {
- writePartialDirPath(ol,root,target->parent());
- ol.writeString("&nbsp;/&nbsp;");
- }
- ol.writeObjectLink(target->getReference(),target->getOutputFileBase(),0,target->shortName());
-}
-
-static void writePartialFilePath(OutputList &ol,const DirDef *root,const FileDef *fd)
-{
- if (fd->getDirDef() && fd->getDirDef()!=root)
- {
- writePartialDirPath(ol,root,fd->getDirDef());
- ol.writeString("&nbsp;/&nbsp;");
- }
- if (fd->isLinkable())
- {
- ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,fd->name());
- }
- else
- {
- ol.startBold();
- ol.docify(fd->name());
- ol.endBold();
- }
-}
-
-void DirRelation::writeDocumentation(OutputList &ol)
-{
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
-
- QCString shortTitle=m_src->shortName()+" &rarr; "+
- m_dst->dir()->shortName()+" Relation";//theTranslator->trDirRelation(m_shortName);
- QCString title=m_src->displayName()+" -> "+
- m_dst->dir()->shortName()+" Relation";//theTranslator->trDirRelation(m_dispName);
- startFile(ol,getOutputFileBase(),getOutputFileBase(),title);
-
- // write navigation path
- m_src->writeNavigationPath(ol);
-
- //startTitle(ol,getOutputFileBase());
- // ol.parseText(shortTitle);
- //endTitle(ol,getOutputFileBase(),title);
- ol.writeString("<h3>"+shortTitle+"</h3>");
-
- ol.writeString("<table class=\"dirtab\">");
- ol.writeString("<tr class=\"dirtab\">");
- ol.writeString("<th class=\"dirtab\">File in ");
- m_src->writePathFragment(ol);
- ol.writeString("</th>");
- ol.writeString("<th class=\"dirtab\">Includes file in ");
- m_dst->dir()->writePathFragment(ol);
- ol.writeString("</th>");
- ol.writeString("</tr>");
-
- SDict<FilePair>::Iterator fpi(m_dst->filePairs());
- FilePair *fp;
- for (fpi.toFirst();(fp=fpi.current());++fpi)
- {
- ol.writeString("<tr class=\"dirtab\">");
- ol.writeString("<td class=\"dirtab\">");
- writePartialFilePath(ol,m_src,fp->source());
- ol.writeString("</td>");
- ol.writeString("<td class=\"dirtab\">");
- writePartialFilePath(ol,m_dst->dir(),fp->destination());
- ol.writeString("</td>");
- ol.writeString("</tr>");
- }
- ol.writeString("</table>");
-
- endFile(ol);
- ol.popGeneratorState();
-}
-
-//----------------------------------------------------------------------
-// external functions
-
-void buildDirectories()
-{
- // for each input file
- FileNameListIterator fnli(Doxygen::inputNameList);
- FileName *fn;
- for (fnli.toFirst();(fn=fnli.current());++fnli)
- {
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
- {
- //printf("buildDirectories %s\n",fd->name().data());
- if (fd->getReference().isEmpty() && !fd->isDocumentationFile())
- {
- DirDef *dir;
- if ((dir=Doxygen::directories.find(fd->getPath()))==0) // new directory
- {
- dir = DirDef::mergeDirectoryInTree(fd->getPath());
- }
- if (dir) dir->addFile(fd);
- }
- else
- {
- // do something for file imported via tag files.
- }
- }
- }
-
- //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)
- {
- //printf("New dir %s\n",dir->displayName().data());
- QCString name = dir->name();
- int i=name.findRev('/',name.length()-2);
- if (i>0)
- {
- DirDef *parent = Doxygen::directories.find(name.left(i+1));
- //if (parent==0) parent=root;
- if (parent)
- {
- parent->addSubDir(dir);
- //printf("DirDef::addSubdir(): Adding subdir\n%s to\n%s\n",
- // dir->displayName().data(), parent->displayName().data());
- }
- }
- }
-}
-
-void computeDirDependencies()
-{
- DirDef *dir;
- DirSDict::Iterator sdi(Doxygen::directories);
- // compute nesting level for each directory
- for (sdi.toFirst();(dir=sdi.current());++sdi)
- {
- dir->setLevel();
- }
- // compute uses dependencies between directories
- for (sdi.toFirst();(dir=sdi.current());++sdi)
- {
- dir->computeDependencies();
- }
-
-#if 0
- printf("-------------------------------------------------------------\n");
- // print dependencies (for debugging)
- for (sdi.toFirst();(dir=sdi.current());++sdi)
- {
- if (dir->usedDirs())
- {
- QDictIterator<UsedDir> udi(*dir->usedDirs());
- UsedDir *usedDir;
- for (udi.toFirst();(usedDir=udi.current());++udi)
- {
- printf("%s depends on %s due to ",
- dir->shortName().data(),usedDir->dir()->shortName().data());
- QDictIterator<FileDef> fdi(usedDir->files());
- FileDef *fd;
- for (fdi.toFirst();(fd=fdi.current());++fdi)
- {
- printf("%s ",fd->name().data());
- }
- printf("\n");
- }
- }
- }
- printf("^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^-^\n");
-#endif
-}
-
-
-void writeDirDependencyGraph(const char *dirName)
-{
- QString path;
- DirDef *dir;
- DirSDict::Iterator sdi(Doxygen::directories);
- QFile htmlPage(QCString(dirName)+"/dirdeps.html");
- if (htmlPage.open(IO_WriteOnly))
- {
- QTextStream out(&htmlPage);
- out << "<html><body>";
- for (sdi.toFirst();(dir=sdi.current());++sdi)
- {
- path=dirName;
- path+="/";
- path+=dir->getOutputFileBase();
- path+="_dep.dot";
- out << "<h4>" << dir->displayName() << "</h4>" << endl;
- out << "<img src=\"" << dir->getOutputFileBase() << "_dep.gif\">" << endl;
- QFile f(path);
- if (f.open(IO_WriteOnly))
- {
- QTextStream t(&f);
- dir->writeDepGraph(t);
- }
- f.close();
-
- QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
- QCString outFile = QCString(dirName)+"/"+
- dir->getOutputFileBase()+"_dep."+imgExt;
- DotRunner dotRun(path);
- dotRun.addJob(imgExt,outFile);
- dotRun.run();
-
- //QCString dotArgs(4096);
- //dotArgs.sprintf("%s -Tgif -o %s",path.data(),outFile.data());
- //if (iSystem(Config_getString("DOT_PATH")+"dot",dotArgs)!=0)
- //{
- // err("Problems running dot. Check your installation!\n");
- //}
- }
- out << "</body></html>";
- }
- htmlPage.close();
-}
-
-void generateDirDocs(OutputList &ol)
-{
- DirDef *dir;
- DirSDict::Iterator sdi(Doxygen::directories);
- for (sdi.toFirst();(dir=sdi.current());++sdi)
- {
- dir->writeDocumentation(ol);
- }
- if (Config_getBool("DIRECTORY_GRAPH"))
- {
- SDict<DirRelation>::Iterator rdi(Doxygen::dirRelations);
- DirRelation *dr;
- for (rdi.toFirst();(dr=rdi.current());++rdi)
- {
- dr->writeDocumentation(ol);
- }
- }
-}
-
diff --git a/src/dirdef.h b/src/dirdef.h
deleted file mode 100644
index 57730d1..0000000
--- a/src/dirdef.h
+++ /dev/null
@@ -1,172 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 DIRDEF_H
-#define DIRDEF_H
-
-#include "qtbc.h"
-#include "sortdict.h"
-#include "definition.h"
-
-#include <qlist.h>
-
-class FileList;
-class ClassSDict;
-class QStrList;
-class FileDef;
-class OutputList;
-class UsedDir;
-class QTextStream;
-
-class DirDef;
-
-/** A list of directories */
-class DirList : public QList<DirDef>
-{
- public:
- int compareItems(GCI item1,GCI item2);
-};
-
-/** A directory */
-class DirDef : public Definition
-{
- public:
- DirDef(const char *path);
- virtual ~DirDef();
-
- // accessors
- virtual DefType definitionType() const { return TypeDir; }
- virtual QCString getOutputFileBase() const;
- virtual bool isLinkableInProject() const;
- virtual bool isLinkable() const;
- QCString displayName() const { return m_dispName; }
- QCString shortName() const { return m_shortName; }
- void addSubDir(DirDef *subdir);
- FileList * getFiles() const { return m_fileList; }
- void addFile(FileDef *fd);
- const DirList &subDirs() const { return m_subdirs; }
- bool isCluster() const { return m_subdirs.count()>0; }
- int level() const { return m_level; }
- DirDef *parent() const { return m_parent; }
- const QDict<UsedDir> *usedDirs() const { return m_usedDirs; }
- bool isParentOf(DirDef *dir) const;
- bool depGraphIsTrivial() const;
-
- // generate output
- void writeDetailedDocumentation(OutputList &ol);
- void writeDocumentation(OutputList &ol);
- void writeDepGraph(QTextStream &t);
- //void writePathFragment(OutputList &ol) const;
- //void writeNavigationPath(OutputList &ol);
-
- static DirDef *mergeDirectoryInTree(const QCString &path);
- bool visited;
-
- private:
- friend void computeDirDependencies();
- void setLevel();
- static DirDef *createNewDir(const char *path);
- static bool matchPath(const QCString &path,QStrList &l);
- void addUsesDependency(DirDef *usedDir,FileDef *srcFd,
- FileDef *dstFd,bool inherited);
- void computeDependencies();
-
- DirList m_subdirs;
- QCString m_dispName;
- QCString m_shortName;
- FileList *m_fileList; // list of files in the group
- int m_dirCount;
- int m_level;
- DirDef *m_parent;
- QDict<UsedDir> *m_usedDirs;
-};
-
-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;
-};
-
-class FilePairDict : public SDict<FilePair>
-{
- public:
- FilePairDict(int size) : SDict<FilePair>(size) {}
- int compareItems(GCI item1,GCI item2);
-};
-
-/** 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; }
-
- private:
- DirDef *m_dir;
- FilePairDict m_filePairs;
- bool m_inherited;
-};
-
-/** A usage relation between two direction. */
-class DirRelation
-{
- public:
- DirRelation(const QCString &name,DirDef *src,UsedDir *dst)
- : m_name(name), m_src(src), m_dst(dst) {}
- DirDef *source() const { return m_src; }
- UsedDir *destination() const { return m_dst; }
- void writeDocumentation(OutputList &ol);
- QCString getOutputFileBase() const { return m_name; }
-
- private:
- QCString m_name;
- DirDef *m_src;
- UsedDir *m_dst;
-};
-
-inline int DirList::compareItems(GCI item1,GCI item2)
-{
- return stricmp(((DirDef *)item1)->shortName(),((DirDef *)item2)->shortName());
-}
-
-class DirSDict : public SDict<DirDef>
-{
- public:
- DirSDict(int size) : SDict<DirDef>(size) {}
- int compareItems(GCI item1,GCI item2)
- {
- return stricmp(((DirDef *)item1)->shortName(),((DirDef *)item2)->shortName());
- }
-};
-
-
-void buildDirectories();
-void generateDirDocs(OutputList &ol);
-void computeDirDependencies();
-void writeDirDependencyGraph(const char *file);
-
-#endif
diff --git a/src/docparser.cpp b/src/docparser.cpp
deleted file mode 100644
index a88ca05..0000000
--- a/src/docparser.cpp
+++ /dev/null
@@ -1,5738 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 <stdlib.h>
-
-#include <qfile.h>
-#include <qfileinfo.h>
-#include <qcstring.h>
-#include <qstack.h>
-#include <qdict.h>
-#include <qregexp.h>
-#include <ctype.h>
-
-#include "doxygen.h"
-#include "debug.h"
-#include "util.h"
-#include "pagedef.h"
-
-#include "docparser.h"
-#include "doctokenizer.h"
-#include "cmdmapper.h"
-#include "printdocvisitor.h"
-#include "message.h"
-#include "section.h"
-#include "searchindex.h"
-#include "language.h"
-
-// debug off
-#define DBG(x) do {} while(0)
-
-// debug to stdout
-//#define DBG(x) printf x
-
-// debug to stderr
-//#define myprintf(x...) fprintf(stderr,x)
-//#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__));
-
-//---------------------------------------------------------------------------
-
-static const char *sectionLevelToName[] =
-{
- "page",
- "section",
- "subsection",
- "subsubsection",
- "paragraph"
-};
-
-//---------------------------------------------------------------------------
-
-// global variables during a call to validatingParseDoc
-static bool g_hasParamCommand;
-static bool g_hasReturnCommand;
-static MemberDef * g_memberDef;
-static QDict<void> g_paramsFound;
-static bool g_isExample;
-static QCString g_exampleName;
-static SectionDict *g_sectionDict;
-
-static QCString g_searchUrl;
-
-// include file state
-static QString g_includeFileText;
-static uint g_includeFileOffset;
-static uint g_includeFileLength;
-
-// parser state
-static QString g_context;
-static bool g_inSeeBlock;
-static bool g_insideHtmlLink;
-static QStack<DocNode> g_nodeStack;
-static QStack<DocStyleChange> g_styleStack;
-static QStack<DocStyleChange> g_initialStyleStack;
-static QList<Definition> g_copyStack;
-static QString g_fileName;
-static QString g_relPath;
-
-struct DocParserContext
-{
- QString context;
- bool inSeeBlock;
- bool insideHtmlLink;
- QStack<DocNode> nodeStack;
- QStack<DocStyleChange> styleStack;
- QStack<DocStyleChange> initialStyleStack;
- QList<Definition> copyStack;
- MemberDef *memberDef;
- QString fileName;
- QString relPath;
-};
-
-static QStack<DocParserContext> g_parserStack;
-
-//---------------------------------------------------------------------------
-
-static void docParserPushContext()
-{
- doctokenizerYYpushContext();
- DocParserContext *ctx = new DocParserContext;
- ctx->context = g_context;
- ctx->inSeeBlock = g_inSeeBlock;
- ctx->insideHtmlLink = g_insideHtmlLink;
- ctx->nodeStack = g_nodeStack;
- ctx->styleStack = g_styleStack;
- ctx->initialStyleStack = g_initialStyleStack;
- ctx->copyStack = g_copyStack;
- ctx->fileName = g_fileName;
- ctx->relPath = g_relPath;
- g_parserStack.push(ctx);
-}
-
-static void docParserPopContext()
-{
- DocParserContext *ctx = g_parserStack.pop();
- g_context = ctx->context;
- g_inSeeBlock = ctx->inSeeBlock;
- g_insideHtmlLink = ctx->insideHtmlLink;
- g_nodeStack = ctx->nodeStack;
- g_styleStack = ctx->styleStack;
- g_initialStyleStack = ctx->initialStyleStack;
- g_copyStack = ctx->copyStack;
- g_fileName = ctx->fileName;
- g_relPath = ctx->relPath;
- delete ctx;
- doctokenizerYYpopContext();
-}
-
-//---------------------------------------------------------------------------
-
-/*! search for an image in the imageNameDict and if found
- * copies the image to the output directory (which depends on the \a type
- * parameter).
- */
-static QCString findAndCopyImage(const char *fileName,DocImage::Type type)
-{
- QCString result;
- bool ambig;
- FileDef *fd;
- //printf("Search for %s\n",fileName);
- if ((fd=findFileDef(Doxygen::imageNameDict,fileName,ambig)))
- {
- QFile inImage(QString(fd->absFilePath().data()));
- if (inImage.open(IO_ReadOnly))
- {
- result = fileName;
- int i;
- if ((i=result.findRev('/'))!=-1 || (i=result.findRev('\\'))!=-1)
- {
- result.right(result.length()-i-1);
- }
- QCString outputDir;
- switch(type)
- {
- case DocImage::Html:
- if (!Config_getBool("GENERATE_HTML")) return result;
- outputDir = Config_getString("HTML_OUTPUT");
- break;
- case DocImage::Latex:
- if (!Config_getBool("GENERATE_LATEX")) return result;
- outputDir = Config_getString("LATEX_OUTPUT");
- break;
- case DocImage::Rtf:
- if (!Config_getBool("GENERATE_RTF")) return result;
- outputDir = Config_getString("RTF_OUTPUT");
- break;
- }
- QCString outputFile = outputDir+"/"+result;
- QFile outImage(QString(outputFile.data()));
- if (outImage.open(IO_WriteOnly)) // copy the image
- {
- char *buffer = new char[inImage.size()];
- inImage.readBlock(buffer,inImage.size());
- outImage.writeBlock(buffer,inImage.size());
- outImage.flush();
- delete buffer;
- }
- else
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,
- "Warning: could not write output image %s",outputFile.data());
- }
- }
- else
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,
- "Warning: could not open image %s",fileName);
- }
-
- 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.
- QCString outputDir = Config_getString("LATEX_OUTPUT");
- QCString baseName = fd->name().left(fd->name().length()-4);
- QCString epstopdfArgs(4096);
- epstopdfArgs.sprintf("\"%s/%s.eps\" --outfile=\"%s/%s.pdf\"",
- outputDir.data(), baseName.data(),
- outputDir.data(), baseName.data());
- if (iSystem("epstopdf",epstopdfArgs,TRUE)!=0)
- {
- err("Error: Problems running epstopdf. Check your TeX installation!\n");
- }
- return baseName;
- }
- }
- else if (ambig)
- {
- QCString text;
- text.sprintf("Warning: image file name %s is ambigious.\n",fileName);
- text+="Possible candidates:\n";
- text+=showFileDefMatches(Doxygen::imageNameDict,fileName);
- warn_doc_error(g_fileName,doctokenizerYYlineno,text);
- }
- else
- {
- result=fileName;
- if (result.left(5)!="http:" && result.left(6)!="https:")
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,
- "Warning: image file %s is not found in IMAGE_PATH: "
- "assuming external image.",fileName
- );
- }
- }
- return result;
-}
-
-/*! Collects the parameters found with \@param or \@retval commands
- * in a global list g_paramsFound. If \a isParam is set to TRUE
- * and the parameter is not an actual parameter of the current
- * member g_memberDef, then a warning is raised (unless warnings
- * are disabled altogether).
- */
-static void checkArgumentName(const QString &name,bool isParam)
-{
- if (!Config_getBool("WARN_IF_DOC_ERROR")) return;
- if (g_memberDef==0) return; // not a member
- ArgumentList *al=g_memberDef->isDocsForDefinition() ?
- g_memberDef->argumentList() :
- g_memberDef->declArgumentList();
- if (al==0) return; // no argument list
-
- static QRegExp re("[a-zA-Z0-9_]+\\.*");
- int p=0,i=0,l;
- while ((i=re.match(name,p,&l))!=-1)
- {
- QString aName=name.mid(i,l);
- //printf("aName=`%s'\n",aName.data());
- ArgumentListIterator ali(*al);
- Argument *a;
- bool found=FALSE;
- for (ali.toFirst();(a=ali.current());++ali)
- {
- QString argName = g_memberDef->isDefine() ? a->type : a->name;
- //printf("argName=`%s'\n",argName.data());
- if (argName.right(3)=="...") argName=argName.left(argName.length()-3);
- if (aName==argName)
- {
- //printf("adding `%s'\n",aName.data());
- g_paramsFound.insert(aName,(void *)(0x8));
- found=TRUE;
- break;
- }
- }
- if (!found && isParam)
- {
- //printf("member type=%d\n",memberDef->memberType());
- QString scope=g_memberDef->getScopeString();
- if (!scope.isEmpty()) scope+="::"; else scope="";
- QString inheritedFrom = "";
- QString docFile = g_memberDef->docFile();
- int docLine = g_memberDef->docLine();
- MemberDef *inheritedMd = g_memberDef->inheritsDocsFrom();
- if (inheritedMd) // documentation was inherited
- {
- inheritedFrom.sprintf(" inherited from member %s at line "
- "%d in file %s",inheritedMd->name().data(),
- inheritedMd->docLine(),inheritedMd->docFile().data());
- docFile = g_memberDef->getDefFileName();
- docLine = g_memberDef->getDefLine();
-
- }
- warn_doc_error(docFile,docLine,
- "Warning: argument `%s' of command @param "
- "is not found in the argument list of %s%s%s%s",
- aName.data(),scope.data(),g_memberDef->name().data(),
- argListToString(al).data(),inheritedFrom.data());
- }
- p=i+l;
- }
-}
-
-/*! Checks if the parameters that have been specified using \@param are
- * indeed all paramters.
- * Must be called after checkArgumentName() has been called for each
- * argument.
- */
-static void checkUndocumentedParams()
-{
- if (g_memberDef && g_hasParamCommand && Config_getBool("WARN_IF_DOC_ERROR"))
- {
- ArgumentList *al=g_memberDef->isDocsForDefinition() ?
- g_memberDef->argumentList() :
- g_memberDef->declArgumentList();
- if (al)
- {
- ArgumentListIterator ali(*al);
- Argument *a;
- bool found=FALSE;
- for (ali.toFirst();(a=ali.current());++ali)
- {
- QString argName = g_memberDef->isDefine() ? a->type : a->name;
- if (argName.right(3)=="...") argName=argName.left(argName.length()-3);
- if (!argName.isEmpty() && g_paramsFound.find(argName)==0 && a->docs.isEmpty())
- {
- found = TRUE;
- break;
- }
- }
- if (found)
- {
- QString errMsg=
- "Warning: The following parameters of "+
- QString(g_memberDef->qualifiedName()) +
- QString(argListToString(al)) +
- " are not documented:\n";
- for (ali.toFirst();(a=ali.current());++ali)
- {
- QString argName = g_memberDef->isDefine() ? a->type : a->name;
- if (!argName.isEmpty() && g_paramsFound.find(argName)==0)
- {
- errMsg+=" parameter "+argName+"\n";
- }
- }
- if (g_memberDef->inheritsDocsFrom())
- {
- warn_doc_error(g_memberDef->getDefFileName(),g_memberDef->getDefLine(),errMsg);
- }
- else
- {
- warn_doc_error(g_memberDef->docFile(),g_memberDef->docLine(),errMsg);
- }
- }
- }
- }
-}
-
-/*! Check if a member has documentation for its parameter and or return
- * type, if applicable. If found this will be stored in the member, this
- * is needed as a member can have brief and detailed documentation, while
- * only one of these needs to document the parameters.
- */
-static void detectNoDocumentedParams()
-{
- if (g_memberDef && Config_getBool("WARN_NO_PARAMDOC"))
- {
- ArgumentList *al = g_memberDef->argumentList();
- ArgumentList *declAl = g_memberDef->declArgumentList();
- QString returnType = g_memberDef->typeString();
- if (!g_memberDef->hasDocumentedParams() &&
- g_hasParamCommand)
- {
- //printf("%s->setHasDocumentedParams(TRUE);\n",g_memberDef->name().data());
- g_memberDef->setHasDocumentedParams(TRUE);
- }
- else if (!g_memberDef->hasDocumentedParams())
- {
- bool allDoc=TRUE; // no paramater => all parameters are documented
- if ( // member has parameters
- al && // but the member has a parameter list
- al->count()>0 // with at least one parameter (that is not void)
- )
- {
- ArgumentListIterator ali(*al);
- Argument *a;
-
- // see if all parameters have documentation
- for (ali.toFirst();(a=ali.current()) && allDoc;++ali)
- {
- if (!a->name.isEmpty() && a->type!="void")
- {
- allDoc = !a->docs.isEmpty();
- }
- //printf("a->type=%s a->name=%s doc=%s\n",
- // a->type.data(),a->name.data(),a->docs.data());
- }
- if (!allDoc && declAl) // try declaration arguments as well
- {
- allDoc=TRUE;
- ArgumentListIterator ali(*declAl);
- Argument *a;
- for (ali.toFirst();(a=ali.current()) && allDoc;++ali)
- {
- if (!a->name.isEmpty() && a->type!="void")
- {
- allDoc = !a->docs.isEmpty();
- }
- //printf("a->name=%s doc=%s\n",a->name.data(),a->docs.data());
- }
- }
- }
- if (allDoc)
- {
- //printf("%s->setHasDocumentedParams(TRUE);\n",g_memberDef->name().data());
- g_memberDef->setHasDocumentedParams(TRUE);
- }
- }
- //printf("Member %s hasReturnCommand=%d\n",g_memberDef->name().data(),g_hasReturnCommand);
- if (!g_memberDef->hasDocumentedReturnType() && // docs not yet found
- g_hasReturnCommand)
- {
- g_memberDef->setHasDocumentedReturnType(TRUE);
- }
- else if ( // see if return needs to documented
- g_memberDef->hasDocumentedReturnType() ||
- returnType.isEmpty() || // empty return type
- returnType.find("void")!=-1 || // void return type
- !g_memberDef->isConstructor() || // a constructor
- !g_memberDef->isDestructor() // or destructor
- )
- {
- g_memberDef->setHasDocumentedReturnType(TRUE);
- }
-
- }
-}
-
-
-//---------------------------------------------------------------------------
-
-/*! Strips known html and tex extensions from \a text. */
-static QString stripKnownExtensions(const char *text)
-{
- QString result=text;
- if (result.right(4)==".tex")
- {
- result=result.left(result.length()-4);
- }
- else if (result.right(Doxygen::htmlFileExtension.length())==
- QString(Doxygen::htmlFileExtension))
- {
- result=result.left(result.length()-Doxygen::htmlFileExtension.length());
- }
- return result;
-}
-
-
-//---------------------------------------------------------------------------
-
-/*! Returns TRUE iff node n is a child of a preformatted node */
-static bool insidePRE(DocNode *n)
-{
- while (n)
- {
- if (n->isPreformatted()) return TRUE;
- n=n->parent();
- }
- return FALSE;
-}
-
-//---------------------------------------------------------------------------
-
-/*! Returns TRUE iff node n is a child of a html list item node */
-static bool insideLI(DocNode *n)
-{
- while (n)
- {
- if (n->kind()==DocNode::Kind_HtmlListItem) return TRUE;
- n=n->parent();
- }
- return FALSE;
-}
-
-//---------------------------------------------------------------------------
-
-/*! Returns TRUE iff node n is a child of a unordered html list node */
-static bool insideUL(DocNode *n)
-{
- while (n)
- {
- if (n->kind()==DocNode::Kind_HtmlList &&
- ((DocHtmlList *)n)->type()==DocHtmlList::Unordered) return TRUE;
- n=n->parent();
- }
- return FALSE;
-}
-
-//---------------------------------------------------------------------------
-
-/*! Returns TRUE iff node n is a child of a ordered html list node */
-static bool insideOL(DocNode *n)
-{
- while (n)
- {
- if (n->kind()==DocNode::Kind_HtmlList &&
- ((DocHtmlList *)n)->type()==DocHtmlList::Ordered) return TRUE;
- n=n->parent();
- }
- return FALSE;
-}
-
-//---------------------------------------------------------------------------
-
-///*! Returns TRUE iff node n is a child of a language node */
-//static bool insideLang(DocNode *n)
-//{
-// while (n)
-// {
-// if (n->kind()==DocNode::Kind_Language) return TRUE;
-// n=n->parent();
-// }
-// return FALSE;
-//}
-
-
-//---------------------------------------------------------------------------
-
-/*! 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
- * put in pDef.
- * @retval TRUE if name was found.
- * @retval FALSE if name was not found.
- */
-static bool findDocsForMemberOrCompound(const char *commandName,
- QString *pDoc,
- QString *pBrief,
- Definition **pDef)
-{
- //printf("findDocsForMemberOrCompound(%s)\n",commandName);
- *pDoc="";
- *pBrief="";
- *pDef=0;
- QString cmdArg=substitute(commandName,"#","::");
- int l=cmdArg.length();
- if (l==0) return FALSE;
-
- int funcStart=cmdArg.find('(');
- if (funcStart==-1) funcStart=l;
-
- QString name=removeRedundantWhiteSpace(cmdArg.left(funcStart).latin1());
- QString args=cmdArg.right(l-funcStart);
-
- // try if the link is to a member
- MemberDef *md=0;
- ClassDef *cd=0;
- FileDef *fd=0;
- NamespaceDef *nd=0;
- GroupDef *gd=0;
- PageDef *pd=0;
- bool found = getDefs(
- g_context.find('.')==-1?g_context.latin1():"", // `find('.') is a hack to detect files
- name.latin1(),
- args.isEmpty()?0:args.latin1(),
- md,cd,fd,nd,gd,FALSE,0,TRUE);
- //printf("found=%d context=%s name=%s\n",found,g_context.data(),name.data());
- if (found && md)
- {
- *pDoc=md->documentation();
- *pBrief=md->briefDescription();
- *pDef=md;
- return TRUE;
- }
-
-
- int scopeOffset=g_context.length();
- do // for each scope
- {
- QString fullName=cmdArg;
- if (scopeOffset>0)
- {
- fullName.prepend(g_context.left(scopeOffset)+"::");
- }
- //printf("Trying fullName=`%s'\n",fullName.data());
-
- // try class, namespace, group, page, file reference
- cd = Doxygen::classSDict[fullName];
- if (cd) // class
- {
- *pDoc=cd->documentation();
- *pBrief=cd->briefDescription();
- *pDef=cd;
- return TRUE;
- }
- nd = Doxygen::namespaceSDict[fullName];
- if (nd) // namespace
- {
- *pDoc=nd->documentation();
- *pBrief=nd->briefDescription();
- *pDef=nd;
- return TRUE;
- }
- gd = Doxygen::groupSDict[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;
- }
- else
- {
- scopeOffset = g_context.findRev("::",scopeOffset-1);
- if (scopeOffset==-1) scopeOffset=0;
- }
- } while (scopeOffset>=0);
-
-
- return FALSE;
-}
-//---------------------------------------------------------------------------
-
-// forward declaration
-static bool defaultHandleToken(DocNode *parent,int tok,
- QList<DocNode> &children,bool
- handleWord=TRUE);
-
-
-static int handleStyleArgument(DocNode *parent,QList<DocNode> &children,
- const QString &cmdName)
-{
- DBG(("handleStyleArgument(%s)\n",cmdName.data()));
- QString tokenName = g_token->name;
- int tok=doctokenizerYYlex();
- if (tok!=TK_WHITESPACE)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: expected whitespace after %s command",
- cmdName.data());
- return tok;
- }
- while ((tok=doctokenizerYYlex()) &&
- tok!=TK_WHITESPACE &&
- tok!=TK_NEWPARA &&
- tok!=TK_LISTITEM &&
- tok!=TK_ENDLIST
- )
- {
- static QRegExp specialChar("[.,|()\\[\\]:;\\?]");
- if (tok==TK_WORD && g_token->name.length()==1 &&
- g_token->name.find(specialChar)!=-1)
- {
- // special character that ends the markup command
- return tok;
- }
- if (!defaultHandleToken(parent,tok,children))
- {
- switch (tok)
- {
- case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Illegal command \\%s as the argument of a \\%s command",
- g_token->name.data(),cmdName.data());
- break;
- case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unsupported symbol %s found while handling command %s",
- g_token->name.data(),cmdName.data());
- break;
- 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;
- }
- return tok;
- break;
- default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected token %s while handling command %s",
- tokToString(tok),cmdName.data());
- break;
- }
- break;
- }
- }
- DBG(("handleStyleArgument(%s) end tok=%x\n",cmdName.data(),tok));
- return (tok==TK_NEWPARA || tok==TK_LISTITEM || tok==TK_ENDLIST
- ) ? tok : RetVal_OK;
-}
-
-/*! Called when a style change starts. For instance a \<b\> command is
- * encountered.
- */
-static void handleStyleEnter(DocNode *parent,QList<DocNode> &children,
- DocStyleChange::Style s,const HtmlAttribList *attribs)
-{
- DBG(("HandleStyleEnter\n"));
- DocStyleChange *sc= new DocStyleChange(parent,g_nodeStack.count(),s,TRUE,attribs);
- children.append(sc);
- g_styleStack.push(sc);
-}
-
-/*! Called when a style change ends. For instance a \</b\> command is
- * encountered.
- */
-static void handleStyleLeave(DocNode *parent,QList<DocNode> &children,
- DocStyleChange::Style s,const char *tagName)
-{
- DBG(("HandleStyleLeave\n"));
- if (g_styleStack.isEmpty() || // no style change
- g_styleStack.top()->style()!=s || // wrong style change
- g_styleStack.top()->position()!=g_nodeStack.count() // wrong position
- )
- {
- if (g_styleStack.isEmpty())
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: found </%s> tag without matching <%s>",
- tagName,tagName);
- }
- else
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: found </%s> tag while expecting </%s>",
- tagName,g_styleStack.top()->styleString());
- }
- }
- else // end the section
- {
- DocStyleChange *sc= new DocStyleChange(parent,g_nodeStack.count(),s,FALSE);
- children.append(sc);
- g_styleStack.pop();
- }
-}
-
-/*! Called at the end of a paragraph to close all open style changes
- * (e.g. a <b> without a </b>). The closed styles are pushed onto a stack
- * and entered again at the start of a new paragraph.
- */
-static void handlePendingStyleCommands(DocNode *parent,QList<DocNode> &children)
-{
- if (!g_styleStack.isEmpty())
- {
- DocStyleChange *sc = g_styleStack.top();
- 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(),FALSE));
- g_initialStyleStack.push(sc);
- g_styleStack.pop();
- sc = g_styleStack.top();
- }
- }
-}
-
-static void handleInitialStyleCommands(DocPara *parent,QList<DocNode> &children)
-{
- DocStyleChange *sc;
- while ((sc=g_initialStyleStack.pop()))
- {
- handleStyleEnter(parent,children,sc->style(),&sc->attribs());
- }
-}
-
-static int handleAHref(DocNode *parent,QList<DocNode> &children,const HtmlAttribList &tagHtmlAttribs)
-{
- HtmlAttribListIterator li(tagHtmlAttribs);
- HtmlAttrib *opt;
- int index=0;
- int retval = RetVal_OK;
- for (li.toFirst();(opt=li.current());++li,++index)
- {
- if (opt->name=="name") // <a name=label> tag
- {
- if (!opt->value.isEmpty())
- {
- DocAnchor *anc = new DocAnchor(parent,opt->value,TRUE);
- children.append(anc);
- break; // stop looking for other tag attribs
- }
- else
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: found <a> tag with name option but without value!");
- }
- }
- else if (opt->name=="href") // <a href=url>..</a> tag
- {
- // copy attributes
- HtmlAttribList attrList = tagHtmlAttribs;
- // and remove the href attribute
- bool result = attrList.remove(index);
- ASSERT(result);
- DocHRef *href = new DocHRef(parent,attrList,opt->value);
- children.append(href);
- g_insideHtmlLink=TRUE;
- retval = href->parse();
- g_insideHtmlLink=FALSE;
- break;
- }
- else // unsupported option for tag a
- {
- }
- }
- return retval;
-}
-
-const char *DocStyleChange::styleString() const
-{
- switch (m_style)
- {
- case DocStyleChange::Bold: return "b";
- case DocStyleChange::Italic: return "em";
- case DocStyleChange::Code: return "code";
- case DocStyleChange::Center: return "center";
- case DocStyleChange::Small: return "small";
- case DocStyleChange::Subscript: return "subscript";
- case DocStyleChange::Superscript: return "superscript";
- case DocStyleChange::Preformatted: return "pre";
- case DocStyleChange::Div: return "div";
- case DocStyleChange::Span: return "span";
- }
- return "<invalid>";
-}
-
-static void handleUnclosedStyleCommands()
-{
- if (!g_initialStyleStack.isEmpty())
- {
- DocStyleChange *sc = g_initialStyleStack.top();
- g_initialStyleStack.pop();
- handleUnclosedStyleCommands();
- warn_doc_error(g_fileName,doctokenizerYYlineno,
- "Warning: end of comment block while expecting "
- "command </%s>",sc->styleString());
- }
-}
-
-
-static void handleLinkedWord(DocNode *parent,QList<DocNode> &children)
-{
- Definition *compound=0;
- MemberDef *member=0;
- QString name = linkToText(g_token->name,TRUE);
- int len = g_token->name.length();
- ClassDef *cd=0;
- //printf("handleLinkedWord(%s)\n",name.data());
- if (!g_insideHtmlLink &&
- resolveRef(g_context,g_token->name,g_inSeeBlock,&compound,&member))
- {
- //printf("resolveRef %s = %p (linkable?=%d)\n",g_token->name.data(),member,member ? member->isLinkable() : FALSE);
- if (member && member->isLinkable()) // member link
- {
- if (member->isObjCMethod())
- {
- bool localLink = g_memberDef ? member->getClassDef()==g_memberDef->getClassDef() : FALSE;
- name = member->objCMethodName(localLink,g_inSeeBlock);
- }
- children.append(new
- DocLinkedWord(parent,name,
- member->getReference(),
- member->getOutputFileBase(),
- member->anchor()
- )
- );
- }
- else if (compound->isLinkable()) // compound link
- {
- if (compound->definitionType()==Definition::TypeFile)
- {
- name=g_token->name;
- }
- else if (compound->definitionType()==Definition::TypeGroup)
- {
- name=((GroupDef*)compound)->groupTitle();
- }
- children.append(new
- DocLinkedWord(parent,name,
- compound->getReference(),
- compound->getOutputFileBase(),
- ""
- )
- );
- }
- else if (compound->definitionType()==Definition::TypeFile &&
- ((FileDef*)compound)->generateSourceFile()
- ) // undocumented file that has source code we can link to
- {
- children.append(new
- DocLinkedWord(parent,g_token->name,
- compound->getReference(),
- compound->getSourceFileBase(),
- ""
- )
- );
- }
- else // not linkable
- {
- children.append(new DocWord(parent,name));
- }
- }
- else if (!g_insideHtmlLink && len>1 && g_token->name.at(len-1)==':')
- {
- // 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);
- children.append(new DocWord(parent,":"));
- }
- else if (!g_insideHtmlLink && (cd=getClass(g_token->name+"-p")))
- {
- // special case 2, where the token name is not a class, but could
- // be a Obj-C protocol
- children.append(new
- DocLinkedWord(parent,name,
- cd->getReference(),
- cd->getOutputFileBase(),
- ""));
- }
- else // normal non-linkable word
- {
- if (g_token->name.at(0)=='#')
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: explicit link request to '%s' could not be resolved",name.data());
- }
- children.append(new DocWord(parent,name));
- }
-}
-
-/* Helper function that deals with the most common tokens allowed in
- * title like sections.
- * @param parent Parent node, owner of the children list passed as
- * the third argument.
- * @param tok The token to process.
- * @param children The list of child nodes to which the node representing
- * the token can be added.
- * @param handleWord Indicates if word token should be processed
- * @retval TRUE The token was handled.
- * @retval FALSE The token was not handled.
- */
-static bool defaultHandleToken(DocNode *parent,int tok, QList<DocNode> &children,bool
- handleWord)
-{
- DBG(("token %s at %d",tokToString(tok),doctokenizerYYlineno));
- if (tok==TK_WORD || tok==TK_LNKWORD || tok==TK_SYMBOL || tok==TK_URL ||
- tok==TK_COMMAND || tok==TK_HTMLTAG
- )
- {
- DBG((" name=%s",g_token->name.data()));
- }
- DBG(("\n"));
-reparsetoken:
- QString tokenName = g_token->name;
- switch (tok)
- {
- case TK_COMMAND:
- switch (Mappers::cmdMapper->map(tokenName))
- {
- case CMD_BSLASH:
- children.append(new DocSymbol(parent,DocSymbol::BSlash));
- break;
- case CMD_AT:
- children.append(new DocSymbol(parent,DocSymbol::At));
- break;
- case CMD_LESS:
- children.append(new DocSymbol(parent,DocSymbol::Less));
- break;
- case CMD_GREATER:
- children.append(new DocSymbol(parent,DocSymbol::Greater));
- break;
- case CMD_AMP:
- children.append(new DocSymbol(parent,DocSymbol::Amp));
- break;
- case CMD_DOLLAR:
- children.append(new DocSymbol(parent,DocSymbol::Dollar));
- break;
- case CMD_HASH:
- children.append(new DocSymbol(parent,DocSymbol::Hash));
- break;
- case CMD_PERCENT:
- children.append(new DocSymbol(parent,DocSymbol::Percent));
- break;
- case CMD_EMPHASIS:
- {
- children.append(new DocStyleChange(parent,g_nodeStack.count(),DocStyleChange::Italic,TRUE));
- tok=handleStyleArgument(parent,children,tokenName);
- children.append(new DocStyleChange(parent,g_nodeStack.count(),DocStyleChange::Italic,FALSE));
- if (tok!=TK_WORD) children.append(new DocWhiteSpace(parent," "));
- if (tok==TK_NEWPARA) goto handlepara;
- else if (tok==TK_WORD || tok==TK_HTMLTAG) goto reparsetoken;
- }
- break;
- case CMD_BOLD:
- {
- children.append(new DocStyleChange(parent,g_nodeStack.count(),DocStyleChange::Bold,TRUE));
- tok=handleStyleArgument(parent,children,tokenName);
- children.append(new DocStyleChange(parent,g_nodeStack.count(),DocStyleChange::Bold,FALSE));
- if (tok!=TK_WORD) children.append(new DocWhiteSpace(parent," "));
- if (tok==TK_NEWPARA) goto handlepara;
- else if (tok==TK_WORD || tok==TK_HTMLTAG) goto reparsetoken;
- }
- break;
- case CMD_CODE:
- {
- children.append(new DocStyleChange(parent,g_nodeStack.count(),DocStyleChange::Code,TRUE));
- tok=handleStyleArgument(parent,children,tokenName);
- children.append(new DocStyleChange(parent,g_nodeStack.count(),DocStyleChange::Code,FALSE));
- if (tok!=TK_WORD) children.append(new DocWhiteSpace(parent," "));
- if (tok==TK_NEWPARA) goto handlepara;
- else if (tok==TK_WORD || tok==TK_HTMLTAG) goto reparsetoken;
- }
- break;
- case CMD_HTMLONLY:
- {
- doctokenizerYYsetStateHtmlOnly();
- tok = doctokenizerYYlex();
- children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::HtmlOnly,g_isExample,g_exampleName));
- if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: htmlonly section ended without end marker");
- doctokenizerYYsetStatePara();
- }
- break;
- case CMD_MANONLY:
- {
- 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,"Warning: manonly section ended without end marker");
- doctokenizerYYsetStatePara();
- }
- break;
- case CMD_LATEXONLY:
- {
- 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,"Warning: latexonly section ended without end marker",doctokenizerYYlineno);
- doctokenizerYYsetStatePara();
- }
- break;
- case CMD_XMLONLY:
- {
- doctokenizerYYsetStateXmlOnly();
- tok = doctokenizerYYlex();
- children.append(new DocVerbatim(parent,g_context,g_token->verb,DocVerbatim::XmlOnly,g_isExample,g_exampleName));
- if (tok==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: xmlonly section ended without end marker",doctokenizerYYlineno);
- doctokenizerYYsetStatePara();
- }
- break;
- case CMD_FORMULA:
- {
- DocFormula *form=new DocFormula(parent,g_token->id);
- children.append(form);
- }
- break;
- case CMD_ANCHOR:
- {
- tok=doctokenizerYYlex();
- if (tok!=TK_WHITESPACE)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: expected whitespace after %s command",
- tokenName.data());
- break;
- }
- tok=doctokenizerYYlex();
- if (tok==0)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected end of comment block while parsing the "
- "argument of command %s",tokenName.data());
- break;
- }
- else if (tok!=TK_WORD && tok!=TK_LNKWORD)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected token %s as the argument of %s",
- tokToString(tok),tokenName.data());
- break;
- }
- DocAnchor *anchor = new DocAnchor(parent,g_token->name,FALSE);
- children.append(anchor);
- }
- break;
- case CMD_INTERNALREF:
- {
- tok=doctokenizerYYlex();
- if (tok!=TK_WHITESPACE)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: expected whitespace after %s command",
- tokenName.data());
- break;
- }
- doctokenizerYYsetStateInternalRef();
- tok=doctokenizerYYlex(); // get the reference id
- DocInternalRef *ref=0;
- if (tok!=TK_WORD && tok!=TK_LNKWORD)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected token %s as the argument of %s",
- tokToString(tok),tokenName.data());
- doctokenizerYYsetStatePara();
- break;
- }
- ref = new DocInternalRef(parent,g_token->name);
- children.append(ref);
- ref->parse();
- doctokenizerYYsetStatePara();
- }
- break;
- default:
- return FALSE;
- }
- break;
- case TK_HTMLTAG:
- {
- switch (Mappers::htmlTagMapper->map(tokenName))
- {
- case HTML_DIV:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: found <div> tag in heading\n");
- break;
- case HTML_PRE:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: found <pre> tag in heading\n");
- break;
- case HTML_BOLD:
- if (!g_token->endTag)
- {
- handleStyleEnter(parent,children,DocStyleChange::Bold,&g_token->attribs);
- }
- else
- {
- handleStyleLeave(parent,children,DocStyleChange::Bold,tokenName);
- }
- break;
- case HTML_CODE:
- if (!g_token->endTag)
- {
- handleStyleEnter(parent,children,DocStyleChange::Code,&g_token->attribs);
- }
- else
- {
- handleStyleLeave(parent,children,DocStyleChange::Code,tokenName);
- }
- break;
- case HTML_EMPHASIS:
- if (!g_token->endTag)
- {
- handleStyleEnter(parent,children,DocStyleChange::Italic,&g_token->attribs);
- }
- else
- {
- handleStyleLeave(parent,children,DocStyleChange::Italic,tokenName);
- }
- break;
- case HTML_SUB:
- if (!g_token->endTag)
- {
- handleStyleEnter(parent,children,DocStyleChange::Subscript,&g_token->attribs);
- }
- else
- {
- handleStyleLeave(parent,children,DocStyleChange::Subscript,tokenName);
- }
- break;
- case HTML_SUP:
- if (!g_token->endTag)
- {
- handleStyleEnter(parent,children,DocStyleChange::Superscript,&g_token->attribs);
- }
- else
- {
- handleStyleLeave(parent,children,DocStyleChange::Superscript,tokenName);
- }
- break;
- case HTML_CENTER:
- if (!g_token->endTag)
- {
- handleStyleEnter(parent,children,DocStyleChange::Center,&g_token->attribs);
- }
- else
- {
- handleStyleLeave(parent,children,DocStyleChange::Center,tokenName);
- }
- break;
- case HTML_SMALL:
- if (!g_token->endTag)
- {
- handleStyleEnter(parent,children,DocStyleChange::Small,&g_token->attribs);
- }
- else
- {
- handleStyleLeave(parent,children,DocStyleChange::Small,tokenName);
- }
- break;
- default:
- return FALSE;
- break;
- }
- }
- break;
- case TK_SYMBOL:
- {
- char letter='\0';
- DocSymbol::SymType s = DocSymbol::decodeSymbol(tokenName,&letter);
- if (s!=DocSymbol::Unknown)
- {
- children.append(new DocSymbol(parent,s,letter));
- }
- else
- {
- return FALSE;
- }
- }
- break;
- case TK_WHITESPACE:
- case TK_NEWPARA:
-handlepara:
- if (insidePRE(parent) || !children.isEmpty())
- {
- children.append(new DocWhiteSpace(parent,g_token->chars));
- }
- break;
- case TK_LNKWORD:
- if (handleWord)
- {
- handleLinkedWord(parent,children);
- }
- else
- return FALSE;
- break;
- case TK_WORD:
- if (handleWord)
- {
- children.append(new DocWord(parent,g_token->name));
- }
- else
- return FALSE;
- break;
- case TK_URL:
- if (g_insideHtmlLink)
- {
- children.append(new DocWord(parent,g_token->name));
- }
- else
- {
- children.append(new DocURL(parent,g_token->name,g_token->isEMailAddr));
- }
- break;
- default:
- return FALSE;
- }
- return TRUE;
-}
-
-
-//---------------------------------------------------------------------------
-
-DocSymbol::SymType DocSymbol::decodeSymbol(const QString &symName,char *letter)
-{
- int l=symName.length();
- DBG(("decodeSymbol(%s) l=%d\n",symName.data(),l));
- if (symName=="&copy;") return DocSymbol::Copy;
- else if (symName=="&tm;") return DocSymbol::Tm;
- else if (symName=="&reg;") return DocSymbol::Reg;
- else if (symName=="&lt;") return DocSymbol::Less;
- else if (symName=="&gt;") return DocSymbol::Greater;
- else if (symName=="&amp;") return DocSymbol::Amp;
- else if (symName=="&apos;") return DocSymbol::Apos;
- else if (symName=="&quot;") return DocSymbol::Quot;
- else if (symName=="&szlig;") return DocSymbol::Szlig;
- else if (symName=="&nbsp;") return DocSymbol::Nbsp;
- else if (l==6 && symName.right(4)=="uml;")
- {
- *letter=symName.at(1);
- return DocSymbol::Uml;
- }
- else if (l==8 && symName.right(6)=="acute;")
- {
- *letter=symName.at(1);
- return DocSymbol::Acute;
- }
- else if (l==8 && symName.right(6)=="grave;")
- {
- *letter=symName.at(1);
- return DocSymbol::Grave;
- }
- else if (l==7 && symName.right(5)=="circ;")
- {
- *letter=symName.at(1);
- return DocSymbol::Circ;
- }
- else if (l==8 && symName.right(6)=="tilde;")
- {
- *letter=symName.at(1);
- return DocSymbol::Tilde;
- }
- else if (l==8 && symName.right(6)=="cedil;")
- {
- *letter=symName.at(1);
- return DocSymbol::Cedil;
- }
- else if (l==7 && symName.right(5)=="ring;")
- {
- *letter=symName.at(1);
- return DocSymbol::Ring;
- }
- else if (l==8 && symName.right(6)=="slash;")
- {
- *letter=symName.at(1);
- return DocSymbol::Slash;
- }
- return DocSymbol::Unknown;
-}
-
-//---------------------------------------------------------------------------
-
-static int internalValidatingParseDoc(DocNode *parent,QList<DocNode> &children,
- const QString &doc)
-{
- int retval = RetVal_OK;
-
- if (doc.isEmpty()) return retval;
-
- doctokenizerYYinit(doc,g_fileName);
-
- // first parse any number of paragraphs
- bool isFirst=TRUE;
- DocPara *lastPar=0;
- if (!children.isEmpty() && children.last()->kind()==DocNode::Kind_Para)
- { // last child item was a paragraph
- lastPar = (DocPara*)children.last();
- isFirst=FALSE;
- }
- do
- {
- DocPara *par = new DocPara(parent);
- if (isFirst) { par->markFirst(); isFirst=FALSE; }
- retval=par->parse();
- if (!par->isEmpty())
- {
- children.append(par);
- if (lastPar) lastPar->markLast(FALSE);
- lastPar=par;
- }
- else
- {
- delete par;
- }
- } while (retval==TK_NEWPARA);
- if (lastPar) lastPar->markLast();
-
- return retval;
-}
-
-//---------------------------------------------------------------------------
-
-static void readTextFileByName(const QString &file,QString &text)
-{
- bool ambig;
- FileDef *fd;
- if ((fd=findFileDef(Doxygen::exampleNameDict,file,ambig)))
- {
- text = fileToString(fd->absFilePath(),FALSE);
- }
- else if (ambig)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: included file name %s is ambigious"
- "Possible candidates:\n%s",file.data(),
- showFileDefMatches(Doxygen::exampleNameDict,file).data()
- );
- }
- else
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: included file %s is not found. "
- "Check your EXAMPLE_PATH",file.data());
- }
-}
-
-//---------------------------------------------------------------------------
-
-DocWord::DocWord(DocNode *parent,const QString &word) :
- m_parent(parent), m_word(word)
-{
- //printf("new word %s url=%s\n",word.data(),g_searchUrl.data());
- if (!g_searchUrl.isEmpty())
- {
- Doxygen::searchIndex->addWord(word,FALSE);
- }
-}
-
-//---------------------------------------------------------------------------
-
-DocLinkedWord::DocLinkedWord(DocNode *parent,const QString &word,
- const QString &ref,const QString &file,
- const QString &anchor) :
- m_parent(parent), m_word(word), m_ref(ref),
- m_file(file), m_relPath(g_relPath), m_anchor(anchor)
-{
- //printf("new word %s url=%s\n",word.data(),g_searchUrl.data());
- if (!g_searchUrl.isEmpty())
- {
- Doxygen::searchIndex->addWord(word,FALSE);
- }
-}
-
-//---------------------------------------------------------------------------
-
-DocAnchor::DocAnchor(DocNode *parent,const QString &id,bool newAnchor)
- : m_parent(parent)
-{
- if (id.isEmpty())
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Empty anchor label");
- }
- if (newAnchor) // found <a name="label">
- {
- m_anchor = id;
- }
- else // found \anchor label
- {
- SectionInfo *sec = Doxygen::sectionDict[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->insert(id,sec);
- }
- }
- else
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Invalid anchor id `%s'",id.data());
- m_anchor = "invalid";
- m_file = "invalid";
- }
- }
-}
-
-//---------------------------------------------------------------------------
-
-DocVerbatim::DocVerbatim(DocNode *parent,const QString &context,
- const QString &text, Type t,bool isExample,
- const QString &exampleFile)
- : m_parent(parent), m_context(context), m_text(text), m_type(t),
- m_isExample(isExample), m_exampleFile(exampleFile), m_relPath(g_relPath)
-{
-}
-
-
-//---------------------------------------------------------------------------
-
-void DocInclude::parse()
-{
- DBG(("DocInclude::parse(file=%s,text=%s)\n",m_file.data(),m_text.data()));
- switch(m_type)
- {
- case IncWithLines:
- // fall through
- case Include:
- // fall through
- case DontInclude:
- readTextFileByName(m_file,m_text);
- g_includeFileText = m_text;
- g_includeFileOffset = 0;
- g_includeFileLength = m_text.length();
- //printf("g_includeFile=<<%s>>\n",g_includeFileText.data());
- break;
- case VerbInclude:
- // fall through
- case HtmlInclude:
- readTextFileByName(m_file,m_text);
- break;
- }
-}
-
-//---------------------------------------------------------------------------
-
-void DocIncOperator::parse()
-{
- const char *p = g_includeFileText;
- uint l = g_includeFileLength;
- uint o = g_includeFileOffset;
- DBG(("DocIncOperator::parse() text=%s off=%d len=%d\n",p,o,l));
- uint so = o,bo;
- bool nonEmpty = FALSE;
- switch(type())
- {
- case Line:
- while (o<l)
- {
- char c = p[o];
- if (c=='\n')
- {
- if (nonEmpty) break; // we have a pattern to match
- so=o+1; // no pattern, skip empty line
- }
- else if (!isspace((uchar)c)) // no white space char
- {
- nonEmpty=TRUE;
- }
- o++;
- }
- if (g_includeFileText.mid(so,o-so).find(m_pattern)!=-1)
- {
- m_text = g_includeFileText.mid(so,o-so);
- DBG(("DocIncOperator::parse() Line: %s\n",m_text.data()));
- }
- g_includeFileOffset = QMIN(l,o+1); // set pointer to start of new line
- break;
- case SkipLine:
- while (o<l)
- {
- so=o;
- while (o<l)
- {
- char c = p[o];
- if (c=='\n')
- {
- if (nonEmpty) break; // we have a pattern to match
- so=o+1; // no pattern, skip empty line
- }
- else if (!isspace((uchar)c)) // no white space char
- {
- nonEmpty=TRUE;
- }
- o++;
- }
- if (g_includeFileText.mid(so,o-so).find(m_pattern)!=-1)
- {
- m_text = g_includeFileText.mid(so,o-so);
- DBG(("DocIncOperator::parse() SkipLine: %s\n",m_text.data()));
- break;
- }
- o++; // skip new line
- }
- g_includeFileOffset = QMIN(l,o+1); // set pointer to start of new line
- break;
- case Skip:
- while (o<l)
- {
- so=o;
- while (o<l)
- {
- char c = p[o];
- if (c=='\n')
- {
- if (nonEmpty) break; // we have a pattern to match
- so=o+1; // no pattern, skip empty line
- }
- else if (!isspace((uchar)c)) // no white space char
- {
- nonEmpty=TRUE;
- }
- o++;
- }
- if (g_includeFileText.mid(so,o-so).find(m_pattern)!=-1)
- {
- break;
- }
- o++; // skip new line
- }
- g_includeFileOffset = so; // set pointer to start of new line
- break;
- case Until:
- bo=o;
- while (o<l)
- {
- so=o;
- while (o<l)
- {
- char c = p[o];
- if (c=='\n')
- {
- if (nonEmpty) break; // we have a pattern to match
- so=o+1; // no pattern, skip empty line
- }
- else if (!isspace((uchar)c)) // no white space char
- {
- nonEmpty=TRUE;
- }
- o++;
- }
- if (g_includeFileText.mid(so,o-so).find(m_pattern)!=-1)
- {
- m_text = g_includeFileText.mid(bo,o-bo);
- DBG(("DocIncOperator::parse() Until: %s\n",m_text.data()));
- break;
- }
- o++; // skip new line
- }
- g_includeFileOffset = QMIN(l,o+1); // set pointer to start of new line
- break;
- }
-}
-
-//---------------------------------------------------------------------------
-
-void DocCopy::parse()
-{
- QString doc,brief;
- Definition *def;
- if (findDocsForMemberOrCompound(m_link,&doc,&brief,&def))
- {
- if (g_copyStack.findRef(def)==-1) // definition not parsed earlier
- {
- docParserPushContext();
- if (def->definitionType()==Definition::TypeMember && def->getOuterScope())
- {
- g_context=def->getOuterScope()->name();
- }
- else
- {
- g_context=def->name();
- }
- g_styleStack.clear();
- g_nodeStack.clear();
- g_copyStack.append(def);
- internalValidatingParseDoc(this,m_children,brief);
- internalValidatingParseDoc(this,m_children,doc);
- g_copyStack.remove(def);
- ASSERT(g_styleStack.isEmpty());
- ASSERT(g_nodeStack.isEmpty());
- docParserPopContext();
- }
- else // oops, recursion
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: recursive call chain of \\copydoc commands detected at %d\n",
- doctokenizerYYlineno);
- }
- }
- else
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: target %s of \\copydoc command not found",
- m_link.data());
- }
-}
-
-//---------------------------------------------------------------------------
-
-DocXRefItem::DocXRefItem(DocNode *parent,int id,const char *key) :
- m_parent(parent), m_id(id), m_key(key), m_relPath(g_relPath)
-{
-}
-
-bool DocXRefItem::parse()
-{
- QString listName;
- 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"))
- )
- )
- {
- RefItem *item = refList->getRefItem(m_id);
- ASSERT(item!=0);
- if (item)
- {
- if (g_memberDef && g_memberDef->name().at(0)=='@')
- {
- m_file = "@"; // can't cross reference anonymous enum
- m_anchor = "@";
- }
- else
- {
- m_file = refList->listName();
- m_anchor = item->listAnchor;
- }
- 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())
- {
- docParserPushContext();
- internalValidatingParseDoc(this,m_children,item->text);
- docParserPopContext();
- }
- }
- return TRUE;
- }
- return FALSE;
-}
-
-//---------------------------------------------------------------------------
-
-DocFormula::DocFormula(DocNode *parent,int id) :
- m_parent(parent), m_relPath(g_relPath)
-{
- QString formCmd;
- formCmd.sprintf("\\form#%d",id);
- Formula *formula=Doxygen::formulaNameDict[formCmd];
- if (formula)
- {
- m_id = formula->getId();
- m_name.sprintf("form_%d",m_id);
- m_text = formula->getFormulaText();
- }
-}
-
-//---------------------------------------------------------------------------
-
-//int DocLanguage::parse()
-//{
-// int retval;
-// DBG(("DocLanguage::parse() start\n"));
-// g_nodeStack.push(this);
-//
-// // parse one or more paragraphs
-// bool isFirst=TRUE;
-// DocPara *par=0;
-// do
-// {
-// par = new DocPara(this);
-// if (isFirst) { par->markFirst(); isFirst=FALSE; }
-// m_children.append(par);
-// retval=par->parse();
-// }
-// while (retval==TK_NEWPARA);
-// if (par) par->markLast();
-//
-// DBG(("DocLanguage::parse() end\n"));
-// DocNode *n = g_nodeStack.pop();
-// ASSERT(n==this);
-// return retval;
-//}
-
-//---------------------------------------------------------------------------
-
-void DocSecRefItem::parse()
-{
- DBG(("DocSecRefItem::parse() start\n"));
- g_nodeStack.push(this);
-
- doctokenizerYYsetStateTitle();
- int tok;
- while ((tok=doctokenizerYYlex()))
- {
- if (!defaultHandleToken(this,tok,m_children))
- {
- switch (tok)
- {
- case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Illegal command %s as part of a \\refitem",
- g_token->name.data());
- break;
- case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unsupported symbol %s found",
- g_token->name.data());
- break;
- default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected token %s",
- tokToString(tok));
- break;
- }
- }
- }
- doctokenizerYYsetStatePara();
- handlePendingStyleCommands(this,m_children);
-
- SectionInfo *sec=0;
- if (!m_target.isEmpty())
- {
- sec=Doxygen::sectionDict[m_target];
- if (sec)
- {
- m_file = sec->fileName;
- m_anchor = sec->label;
- if (g_sectionDict && g_sectionDict->find(m_target)==0)
- {
- g_sectionDict->insert(m_target,sec);
- }
- }
- else
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning reference to unknown section %s",
- m_target.data());
- }
- }
- else
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning reference to empty target");
- }
-
- DBG(("DocSecRefItem::parse() end\n"));
- DocNode *n = g_nodeStack.pop();
- ASSERT(n==this);
-}
-
-//---------------------------------------------------------------------------
-
-void DocSecRefList::parse()
-{
- DBG(("DocSecRefList::parse() start\n"));
- g_nodeStack.push(this);
-
- int tok=doctokenizerYYlex();
- // skip white space
- while (tok==TK_WHITESPACE || tok==TK_NEWPARA) tok=doctokenizerYYlex();
- // handle items
- while (tok)
- {
- if (tok==TK_COMMAND)
- {
- switch (Mappers::cmdMapper->map(g_token->name))
- {
- case CMD_SECREFITEM:
- {
- int tok=doctokenizerYYlex();
- if (tok!=TK_WHITESPACE)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: expected whitespace after \\refitem command");
- break;
- }
- tok=doctokenizerYYlex();
- if (tok!=TK_WORD && tok!=TK_LNKWORD)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected token %s as the argument of \\refitem",
- tokToString(tok));
- break;
- }
-
- DocSecRefItem *item = new DocSecRefItem(this,g_token->name);
- m_children.append(item);
- item->parse();
- }
- break;
- case CMD_ENDSECREFLIST:
- goto endsecreflist;
- default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Illegal command %s as part of a \\secreflist",
- g_token->name.data());
- goto endsecreflist;
- }
- }
- else if (tok==TK_WHITESPACE)
- {
- // ignore whitespace
- }
- else
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected token %s inside section reference list",
- tokToString(tok));
- goto endsecreflist;
- }
- tok=doctokenizerYYlex();
- }
-
-endsecreflist:
- DBG(("DocSecRefList::parse() end\n"));
- DocNode *n = g_nodeStack.pop();
- ASSERT(n==this);
-}
-
-//---------------------------------------------------------------------------
-
-DocInternalRef::DocInternalRef(DocNode *parent,const QString &ref)
- : m_parent(parent), m_relPath(g_relPath)
-{
- int i=ref.find('#');
- if (i!=-1)
- {
- m_anchor = ref.right(ref.length()-i-1);
- m_file = ref.left(i);
- }
- else
- {
- m_file = ref;
- }
-}
-
-void DocInternalRef::parse()
-{
- g_nodeStack.push(this);
- DBG(("DocInternalRef::parse() start\n"));
-
- int tok;
- while ((tok=doctokenizerYYlex()))
- {
- if (!defaultHandleToken(this,tok,m_children))
- {
- switch (tok)
- {
- case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Illegal command %s as part of a \\ref",
- g_token->name.data());
- break;
- case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unsupported symbol %s found",
- g_token->name.data());
- break;
- default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected token %s",
- tokToString(tok));
- break;
- }
- }
- }
-
- handlePendingStyleCommands(this,m_children);
- DBG(("DocInternalRef::parse() end\n"));
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
-}
-
-//---------------------------------------------------------------------------
-
-DocRef::DocRef(DocNode *parent,const QString &target) :
- m_parent(parent), m_refToSection(FALSE), m_refToAnchor(FALSE)
-{
- Definition *compound = 0;
- QCString anchor;
- ASSERT(!target.isEmpty());
- m_relPath = g_relPath;
- SectionInfo *sec = Doxygen::sectionDict[target];
- if (sec) // ref to section or anchor
- {
- 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::Page) m_anchor = sec->label;
- m_refToAnchor = sec->type==SectionInfo::Anchor;
- m_refToSection = sec->type!=SectionInfo::Anchor;
- //printf("m_text=%s,m_ref=%s,m_file=%s,m_refToAnchor=%d\n",
- // m_text.data(),m_ref.data(),m_file.data(),m_refToAnchor);
- return;
- }
- else if (resolveLink(g_context,target,TRUE,&compound,anchor))
- {
- bool isFile = compound ?
- (compound->definitionType()==Definition::TypeFile ? TRUE : FALSE) :
- FALSE;
- m_text = linkToText(target,isFile);
- m_anchor = anchor;
- if (compound && compound->isLinkable()) // ref to compound
- {
- if (anchor.isEmpty() && /* compound link */
- compound->definitionType()==Definition::TypeGroup && /* is group */
- ((GroupDef *)compound)->groupTitle() /* with title */
- )
- {
- m_text=((GroupDef *)compound)->groupTitle(); // use group's title as link
- }
- else if (compound->definitionType()==Definition::TypeMember &&
- ((MemberDef*)compound)->isObjCMethod())
- {
- // Objective C Method
- MemberDef *member = (MemberDef*)compound;
- bool localLink = g_memberDef ? member->getClassDef()==g_memberDef->getClassDef() : FALSE;
- m_text = member->objCMethodName(localLink,g_inSeeBlock);
- }
-
- m_file = compound->getOutputFileBase();
- m_ref = compound->getReference();
- return;
- }
- else if (compound->definitionType()==Definition::TypeFile &&
- ((FileDef*)compound)->generateSourceFile()
- ) // undocumented file that has source code we can link to
- {
- m_file = compound->getSourceFileBase();
- m_ref = compound->getReference();
- return;
- }
- }
- m_text = linkToText(target,FALSE);
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unable to resolve reference to `%s' for \\ref command",
- target.data());
-}
-
-void DocRef::parse()
-{
- g_nodeStack.push(this);
- DBG(("DocRef::parse() start\n"));
-
- int tok;
- while ((tok=doctokenizerYYlex()))
- {
- if (!defaultHandleToken(this,tok,m_children))
- {
- switch (tok)
- {
- case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Illegal command %s as part of a \\ref",
- g_token->name.data());
- break;
- case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unsupported symbol %s found",
- g_token->name.data());
- break;
- default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected token %s",
- tokToString(tok));
- break;
- }
- }
- }
-
- handlePendingStyleCommands(this,m_children);
- DBG(("DocRef::parse() end\n"));
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
-}
-
-//---------------------------------------------------------------------------
-
-DocLink::DocLink(DocNode *parent,const QString &target) :
- m_parent(parent)
-{
- Definition *compound;
- //PageInfo *page;
- QCString anchor;
- m_refText = target;
- m_relPath = g_relPath;
- if (!m_refText.isEmpty() && m_refText.at(0)=='#')
- {
- m_refText = m_refText.right(m_refText.length()-1);
- }
- if (resolveLink(g_context,stripKnownExtensions(target),g_inSeeBlock,
- &compound,anchor))
- {
- m_anchor = anchor;
- if (compound && compound->isLinkable())
- {
- m_file = compound->getOutputFileBase();
- m_ref = compound->getReference();
- }
- else if (compound->definitionType()==Definition::TypeFile &&
- ((FileDef*)compound)->generateSourceFile()
- ) // undocumented file that has source code we can link to
- {
- m_file = compound->getSourceFileBase();
- m_ref = compound->getReference();
- }
- return;
- }
-
- // bogus link target
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unable to resolve link to `%s' for \\link command",
- target.data());
-}
-
-
-QString DocLink::parse(bool isJavaLink)
-{
- QString result;
- g_nodeStack.push(this);
- DBG(("DocLink::parse() start\n"));
-
- int tok;
- while ((tok=doctokenizerYYlex()))
- {
- if (!defaultHandleToken(this,tok,m_children,FALSE))
- {
- switch (tok)
- {
- case TK_COMMAND:
- switch (Mappers::cmdMapper->map(g_token->name))
- {
- case CMD_ENDLINK:
- if (isJavaLink)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: {@link.. ended with @endlink command");
- }
- goto endlink;
- default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Illegal command %s as part of a \\link",
- g_token->name.data());
- break;
- }
- break;
- case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unsupported symbol %s found",
- g_token->name.data());
- break;
- case TK_LNKWORD:
- case TK_WORD:
- if (isJavaLink) // special case to detect closing }
- {
- QString w = g_token->name;
- int p;
- if (w=="}")
- {
- goto endlink;
- }
- else if ((p=w.find('}'))!=-1)
- {
- uint l=w.length();
- 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);
- }
- goto endlink;
- }
- }
- m_children.append(new DocWord(this,g_token->name));
- break;
- default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected token %s",
- tokToString(tok));
- break;
- }
- }
- }
- if (tok==0)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected end of comment while inside"
- " link command\n");
- }
-endlink:
-
- if (isJavaLink)
- {
- if (m_children.isEmpty()) // no link text
- {
- m_children.append(new DocWord(this,m_refText));
- }
- }
-
- handlePendingStyleCommands(this,m_children);
- DBG(("DocLink::parse() end\n"));
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
- return result;
-}
-
-
-//---------------------------------------------------------------------------
-
-DocDotFile::DocDotFile(DocNode *parent,const QString &name) :
- m_parent(parent), m_name(name), m_relPath(g_relPath)
-{
-}
-
-void DocDotFile::parse()
-{
- g_nodeStack.push(this);
- DBG(("DocDotFile::parse() start\n"));
-
- doctokenizerYYsetStateTitle();
- int tok;
- while ((tok=doctokenizerYYlex()))
- {
- if (!defaultHandleToken(this,tok,m_children))
- {
- switch (tok)
- {
- case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Illegal command %s as part of a \\dotfile",
- g_token->name.data());
- break;
- case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unsupported symbol %s found",
- g_token->name.data());
- break;
- default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected token %s",
- tokToString(tok));
- break;
- }
- }
- }
- tok=doctokenizerYYlex();
- while (tok==TK_WORD) // there are values following the title
- {
- if (g_token->name=="width")
- {
- m_width=g_token->chars;
- }
- else if (g_token->name=="height")
- {
- m_height=g_token->chars;
- }
- else
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unknown option %s after image title",
- g_token->name.data());
- }
- tok=doctokenizerYYlex();
- }
- ASSERT(tok==0);
- doctokenizerYYsetStatePara();
- handlePendingStyleCommands(this,m_children);
-
- bool ambig;
- FileDef *fd = findFileDef(Doxygen::dotFileNameDict,m_name,ambig);
- if (fd)
- {
- m_file = fd->absFilePath();
- }
- else if (ambig)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: included dot file name %s is ambigious.\n"
- "Possible candidates:\n%s",m_name.data(),
- showFileDefMatches(Doxygen::exampleNameDict,m_name).data()
- );
- }
- else
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: included dot file %s is not found "
- "in any of the paths specified via DOTFILE_DIRS!",m_name.data());
- }
-
- DBG(("DocDotFile::parse() end\n"));
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
-}
-
-
-//---------------------------------------------------------------------------
-
-DocImage::DocImage(DocNode *parent,const HtmlAttribList &attribs,const QString &name,Type t) :
- m_parent(parent), m_attribs(attribs), m_name(name),
- m_type(t), m_relPath(g_relPath)
-{
-}
-
-void DocImage::parse()
-{
- g_nodeStack.push(this);
- DBG(("DocImage::parse() start\n"));
-
- // parse title
- doctokenizerYYsetStateTitle();
- int tok;
- while ((tok=doctokenizerYYlex()))
- {
- if (tok==TK_WORD && (g_token->name=="width=" || g_token->name=="height="))
- {
- // special case: no title, but we do have a size indicator
- doctokenizerYYsetStateTitleAttrValue();
- // strip =
- g_token->name=g_token->name.left(g_token->name.length()-1);
- break;
- }
- if (!defaultHandleToken(this,tok,m_children))
- {
- switch (tok)
- {
- case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Illegal command %s as part of a \\image",
- g_token->name.data());
- break;
- case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unsupported symbol %s found",
- g_token->name.data());
- break;
- default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected token %s",
- tokToString(tok));
- break;
- }
- }
- }
- // parse size attributes
- tok=doctokenizerYYlex();
- while (tok==TK_WORD) // there are values following the title
- {
- if (g_token->name=="width")
- {
- m_width=g_token->chars;
- }
- else if (g_token->name=="height")
- {
- m_height=g_token->chars;
- }
- else
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unknown option %s after image title",
- g_token->name.data());
- }
- tok=doctokenizerYYlex();
- }
- doctokenizerYYsetStatePara();
-
- handlePendingStyleCommands(this,m_children);
- DBG(("DocImage::parse() end\n"));
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
-}
-
-
-//---------------------------------------------------------------------------
-
-int DocHtmlHeader::parse()
-{
- int retval=RetVal_OK;
- g_nodeStack.push(this);
- DBG(("DocHtmlHeader::parse() start\n"));
-
- int tok;
- while ((tok=doctokenizerYYlex()))
- {
- if (!defaultHandleToken(this,tok,m_children))
- {
- switch (tok)
- {
- case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Illegal command %s as part of a <h%d> tag",
- g_token->name.data(),m_level);
- break;
- case TK_HTMLTAG:
- {
- int tagId=Mappers::htmlTagMapper->map(g_token->name);
- if (tagId==HTML_H1 && g_token->endTag) // found </h1> tag
- {
- if (m_level!=1)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: <h%d> ended with </h1>",
- m_level);
- }
- goto endheader;
- }
- else if (tagId==HTML_H2 && g_token->endTag) // found </h2> tag
- {
- if (m_level!=2)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: <h%d> ended with </h2>",
- m_level);
- }
- goto endheader;
- }
- else if (tagId==HTML_H3 && g_token->endTag) // found </h3> tag
- {
- if (m_level!=3)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: <h%d> ended with </h3>",
- m_level);
- }
- goto endheader;
- }
- else if (tagId==HTML_H4 && g_token->endTag) // found </h4> tag
- {
- if (m_level!=4)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: <h%d> ended with </h4>",
- m_level);
- }
- goto endheader;
- }
- else if (tagId==HTML_H5 && g_token->endTag) // found </h5> tag
- {
- if (m_level!=5)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: <h%d> ended with </h5>",
- m_level);
- }
- goto endheader;
- }
- else if (tagId==HTML_H6 && g_token->endTag) // found </h6> tag
- {
- if (m_level!=6)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: <h%d> ended with </h6>",
- m_level);
- }
- goto endheader;
- }
- else if (tagId==HTML_A)
- {
- if (!g_token->endTag)
- {
- handleAHref(this,m_children,g_token->attribs);
- }
- }
- else if (tagId==HTML_BR)
- {
- DocLineBreak *lb = new DocLineBreak(this);
- m_children.append(lb);
- }
- else
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected html tag <%s%s> found within <h%d> context",
- g_token->endTag?"/":"",g_token->name.data(),m_level);
- }
-
- }
- break;
- case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unsupported symbol %s found",
- g_token->name.data());
- break;
- default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected token %s",
- tokToString(tok));
- break;
- }
- }
- }
- if (tok==0)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected end of comment while inside"
- " <h%d> tag\n",m_level);
- }
-endheader:
- handlePendingStyleCommands(this,m_children);
- DBG(("DocHtmlHeader::parse() end\n"));
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
- return retval;
-}
-
-//---------------------------------------------------------------------------
-
-int DocHRef::parse()
-{
- int retval=RetVal_OK;
- g_nodeStack.push(this);
- DBG(("DocHRef::parse() start\n"));
-
- int tok;
- while ((tok=doctokenizerYYlex()))
- {
- if (!defaultHandleToken(this,tok,m_children))
- {
- switch (tok)
- {
- case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Illegal command %s as part of a <a>..</a> block",
- g_token->name.data());
- break;
- case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unsupported symbol %s found",
- g_token->name.data());
- break;
- case TK_HTMLTAG:
- {
- int tagId=Mappers::htmlTagMapper->map(g_token->name);
- if (tagId==HTML_A && g_token->endTag) // found </a> tag
- {
- goto endhref;
- }
- else
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected html tag <%s%s> found within <a href=...> context",
- g_token->endTag?"/":"",g_token->name.data(),doctokenizerYYlineno);
- }
- }
- break;
- default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected token %s",
- tokToString(tok),doctokenizerYYlineno);
- break;
- }
- }
- }
- if (tok==0)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected end of comment while inside"
- " <a href=...> tag",doctokenizerYYlineno);
- }
-endhref:
- handlePendingStyleCommands(this,m_children);
- DBG(("DocHRef::parse() end\n"));
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
- return retval;
-}
-
-//---------------------------------------------------------------------------
-
-int DocInternal::parse(int level)
-{
- int retval=RetVal_OK;
- g_nodeStack.push(this);
- DBG(("DocInternal::parse() start\n"));
-
- // first parse any number of paragraphs
- bool isFirst=TRUE;
- DocPara *lastPar=0;
- do
- {
- DocPara *par = new DocPara(this);
- if (isFirst) { par->markFirst(); isFirst=FALSE; }
- retval=par->parse();
- if (!par->isEmpty())
- {
- m_children.append(par);
- lastPar=par;
- }
- else
- {
- delete par;
- }
- if (retval==TK_LISTITEM)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Invalid list item found",doctokenizerYYlineno);
- }
- } while (retval!=0 &&
- retval!=RetVal_Section &&
- retval!=RetVal_Subsection &&
- retval!=RetVal_Subsubsection &&
- retval!=RetVal_Paragraph
- );
- if (lastPar) lastPar->markLast();
-
- // then parse any number of level-n sections
- while ((level==1 && retval==RetVal_Section) ||
- (level==2 && retval==RetVal_Subsection) ||
- (level==3 && retval==RetVal_Subsubsection) ||
- (level==4 && retval==RetVal_Paragraph)
- )
- {
- DocSection *s=new DocSection(this,level,g_token->sectionId);
- m_children.append(s);
- retval = s->parse();
- }
-
- if (retval==RetVal_Internal)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: \\internal command found inside internal section");
- }
-
- DBG(("DocInternal::parse() end\n"));
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
- return retval;
-}
-
-//---------------------------------------------------------------------------
-
-int DocIndexEntry::parse()
-{
- int retval=RetVal_OK;
- g_nodeStack.push(this);
- DBG(("DocIndexEntry::parse() start\n"));
- int tok=doctokenizerYYlex();
- if (tok!=TK_WHITESPACE)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: expected whitespace after \\addindex command");
- goto endindexentry;
- }
- doctokenizerYYsetStateTitle();
- m_entry="";
- while ((tok=doctokenizerYYlex()))
- {
- switch (tok)
- {
- case TK_WHITESPACE:
- m_entry+=" ";
- break;
- case TK_WORD:
- case TK_LNKWORD:
- m_entry+=g_token->name;
- break;
- case TK_SYMBOL:
- {
- char letter='\0';
- DocSymbol::SymType s = DocSymbol::decodeSymbol(g_token->name,&letter);
- switch (s)
- {
- case DocSymbol::BSlash: m_entry+='\\'; break;
- case DocSymbol::At: m_entry+='@'; break;
- case DocSymbol::Less: m_entry+='<'; break;
- case DocSymbol::Greater: m_entry+='>'; break;
- case DocSymbol::Amp: m_entry+='&'; break;
- case DocSymbol::Dollar: m_entry+='$'; break;
- case DocSymbol::Hash: m_entry+='#'; break;
- case DocSymbol::Percent: m_entry+='%'; break;
- case DocSymbol::Apos: m_entry+='\''; break;
- case DocSymbol::Quot: m_entry+='"'; break;
- default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected symbol found as argument of \\addindex");
- break;
- }
- }
- break;
- case TK_COMMAND:
- switch (Mappers::cmdMapper->map(g_token->name))
- {
- case CMD_BSLASH: m_entry+='\\'; break;
- case CMD_AT: m_entry+='@'; break;
- case CMD_LESS: m_entry+='<'; break;
- case CMD_GREATER: m_entry+='>'; break;
- case CMD_AMP: m_entry+='&'; break;
- case CMD_DOLLAR: m_entry+='$'; break;
- case CMD_HASH: m_entry+='#'; break;
- case CMD_PERCENT: m_entry+='%'; break;
- default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected command %s found as argument of \\addindex",
- g_token->name.data());
- break;
- }
- break;
- default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected token %s",
- tokToString(tok));
- break;
- }
- }
- if (tok!=0) retval=tok;
- doctokenizerYYsetStatePara();
-endindexentry:
- DBG(("DocIndexEntry::parse() end retval=%x\n",retval));
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
- return retval;
-}
-
-//---------------------------------------------------------------------------
-
-int DocHtmlCaption::parse()
-{
- int retval=0;
- g_nodeStack.push(this);
- DBG(("DocHtmlCaption::parse() start\n"));
- int tok;
- while ((tok=doctokenizerYYlex()))
- {
- if (!defaultHandleToken(this,tok,m_children))
- {
- switch (tok)
- {
- case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Illegal command %s as part of a <caption> tag",
- g_token->name.data());
- break;
- case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unsupported symbol %s found",
- g_token->name.data());
- break;
- case TK_HTMLTAG:
- {
- int tagId=Mappers::htmlTagMapper->map(g_token->name);
- if (tagId==HTML_CAPTION && g_token->endTag) // found </caption> tag
- {
- retval = RetVal_OK;
- goto endcaption;
- }
- else
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected html tag <%s%s> found within <caption> context",
- g_token->endTag?"/":"",g_token->name.data());
- }
- }
- break;
- default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected token %s",
- tokToString(tok));
- break;
- }
- }
- }
- if (tok==0)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected end of comment while inside"
- " <caption> tag",doctokenizerYYlineno);
- }
-endcaption:
- handlePendingStyleCommands(this,m_children);
- DBG(("DocHtmlCaption::parse() end\n"));
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
- return retval;
-}
-
-//---------------------------------------------------------------------------
-
-int DocHtmlCell::parse()
-{
- int retval=RetVal_OK;
- g_nodeStack.push(this);
- DBG(("DocHtmlCell::parse() start\n"));
-
- // parse one or more paragraphs
- bool isFirst=TRUE;
- DocPara *par=0;
- do
- {
- par = new DocPara(this);
- if (isFirst) { par->markFirst(); isFirst=FALSE; }
- m_children.append(par);
- retval=par->parse();
- if (retval==TK_HTMLTAG)
- {
- int tagId=Mappers::htmlTagMapper->map(g_token->name);
- if (tagId==HTML_TD && g_token->endTag) // found </dt> tag
- {
- retval=TK_NEWPARA; // ignore the tag
- }
- else if (tagId==HTML_TH && g_token->endTag) // found </th> tag
- {
- retval=TK_NEWPARA; // ignore the tag
- }
- }
- }
- while (retval==TK_NEWPARA);
- if (par) par->markLast();
-
- DBG(("DocHtmlCell::parse() end\n"));
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
- return retval;
-}
-
-//---------------------------------------------------------------------------
-
-int DocHtmlRow::parse()
-{
- int retval=RetVal_OK;
- g_nodeStack.push(this);
- DBG(("DocHtmlRow::parse() start\n"));
-
- bool isHeading=FALSE;
- bool isFirst=TRUE;
- DocHtmlCell *cell=0;
-
- // get next token
- int tok=doctokenizerYYlex();
- // skip whitespace
- while (tok==TK_WHITESPACE || tok==TK_NEWPARA) tok=doctokenizerYYlex();
- // should find a html tag now
- if (tok==TK_HTMLTAG)
- {
- int tagId=Mappers::htmlTagMapper->map(g_token->name);
- if (tagId==HTML_TD && !g_token->endTag) // found <td> tag
- {
- }
- else if (tagId==HTML_TH && !g_token->endTag) // found <th> tag
- {
- isHeading=TRUE;
- }
- else // found some other tag
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: expected <td> or <th> tag but "
- "found <%s> instead!",g_token->name.data());
- goto endrow;
- }
- }
- else if (tok==0) // premature end of comment
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: 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,"Warning: expected <td> or <th> tag but found %s token instead!",
- tokToString(tok));
- goto endrow;
- }
-
- // parse one or more cells
- do
- {
- cell=new DocHtmlCell(this,g_token->attribs,isHeading);
- cell->markFirst(isFirst);
- isFirst=FALSE;
- m_children.append(cell);
- retval=cell->parse();
- isHeading = retval==RetVal_TableHCell;
- }
- while (retval==RetVal_TableCell || retval==RetVal_TableHCell);
- if (cell) cell->markLast(TRUE);
-
-endrow:
- DBG(("DocHtmlRow::parse() end\n"));
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
- return retval;
-}
-
-//---------------------------------------------------------------------------
-
-int DocHtmlTable::parse()
-{
- int retval=RetVal_OK;
- g_nodeStack.push(this);
- DBG(("DocHtmlTable::parse() start\n"));
-
-getrow:
- // get next token
- int tok=doctokenizerYYlex();
- // skip whitespace
- while (tok==TK_WHITESPACE || tok==TK_NEWPARA) tok=doctokenizerYYlex();
- // should find a html tag now
- if (tok==TK_HTMLTAG)
- {
- int tagId=Mappers::htmlTagMapper->map(g_token->name);
- if (tagId==HTML_TR && !g_token->endTag) // found <tr> tag
- {
- // no caption, just rows
- retval=RetVal_TableRow;
- }
- else if (tagId==HTML_CAPTION && !g_token->endTag) // found <caption> tag
- {
- if (m_caption)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: table already has a caption, found another one");
- }
- else
- {
- m_caption = new DocHtmlCaption(this,g_token->attribs);
- retval=m_caption->parse();
-
- if (retval==RetVal_OK) // caption was parsed ok
- {
- goto getrow;
- }
- }
- }
- else // found wrong token
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: expected <tr> or <caption> tag but "
- "found <%s%s> instead!", g_token->endTag ? "/" : "", g_token->name.data());
- }
- }
- else if (tok==0) // premature end of comment
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected end of comment while looking"
- " for a <tr> or <caption> tag");
- }
- else // token other than html token
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: 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();
- }
-
- DBG(("DocHtmlTable::parse() end\n"));
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
- return retval==RetVal_EndTable ? RetVal_OK : retval;
-}
-
-uint DocHtmlTable::numCols() const
-{
- uint cols=0;
- QListIterator<DocNode> cli(m_children);
- DocNode *n;
- for (cli.toFirst();(n=cli.current());++cli)
- {
- ASSERT(n->kind()==DocNode::Kind_HtmlRow);
- cols=QMAX(cols,((DocHtmlRow *)n)->numCells());
- }
- return cols;
-}
-
-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);
- QListIterator<DocNode> cli(m_children);
- DocNode *n;
- 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);
-}
-
-//---------------------------------------------------------------------------
-
-int DocHtmlDescTitle::parse()
-{
- int retval=0;
- g_nodeStack.push(this);
- DBG(("DocHtmlDescTitle::parse() start\n"));
-
- int tok;
- while ((tok=doctokenizerYYlex()))
- {
- if (!defaultHandleToken(this,tok,m_children))
- {
- switch (tok)
- {
- case TK_COMMAND:
- {
- QString cmdName=g_token->name;
- bool isJavaLink=FALSE;
- switch (Mappers::cmdMapper->map(cmdName))
- {
- case CMD_REF:
- {
- int tok=doctokenizerYYlex();
- if (tok!=TK_WHITESPACE)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: expected whitespace after %s command",
- g_token->name.data());
- }
- else
- {
- doctokenizerYYsetStateRef();
- tok=doctokenizerYYlex(); // get the reference id
- if (tok!=TK_WORD)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected token %s as the argument of %s",
- tokToString(tok),cmdName.data());
- }
- else
- {
- DocRef *ref = new DocRef(this,g_token->name);
- m_children.append(ref);
- ref->parse();
- }
- doctokenizerYYsetStatePara();
- }
- }
- break;
- case CMD_JAVALINK:
- isJavaLink=TRUE;
- // fall through
- case CMD_LINK:
- {
- int tok=doctokenizerYYlex();
- if (tok!=TK_WHITESPACE)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: expected whitespace after %s command",
- cmdName.data());
- }
- else
- {
- doctokenizerYYsetStateLink();
- tok=doctokenizerYYlex();
- if (tok!=TK_WORD)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected token %s as the argument of %s",
- tokToString(tok),cmdName.data());
- }
- else
- {
- doctokenizerYYsetStatePara();
- DocLink *lnk = new DocLink(this,g_token->name);
- m_children.append(lnk);
- QString leftOver = lnk->parse(isJavaLink);
- if (!leftOver.isEmpty())
- {
- m_children.append(new DocWord(this,leftOver));
- }
- }
- }
- }
-
- break;
- default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Illegal command %s as part of a <dt> tag",
- g_token->name.data());
- }
- }
- break;
- case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unsupported symbol %s found",
- g_token->name.data());
- break;
- case TK_HTMLTAG:
- {
- int tagId=Mappers::htmlTagMapper->map(g_token->name);
- if (tagId==HTML_DD && !g_token->endTag) // found <dd> tag
- {
- retval = RetVal_DescData;
- goto endtitle;
- }
- else if (tagId==HTML_DT && g_token->endTag)
- {
- // ignore </dt> tag.
- }
- else if (tagId==HTML_DT)
- {
- // missing <dt> tag.
- retval = RetVal_DescTitle;
- goto endtitle;
- }
- else if (tagId==HTML_DL && g_token->endTag)
- {
- retval=RetVal_EndDesc;
- goto endtitle;
- }
- else
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected html tag <%s%s> found within <dt> context",
- g_token->endTag?"/":"",g_token->name.data());
- }
- }
- break;
- default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected token %s",
- tokToString(tok));
- break;
- }
- }
- }
- if (tok==0)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected end of comment while inside"
- " <dt> tag");
- }
-endtitle:
- handlePendingStyleCommands(this,m_children);
- DBG(("DocHtmlDescTitle::parse() end\n"));
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
- return retval;
-}
-
-//---------------------------------------------------------------------------
-
-int DocHtmlDescData::parse()
-{
- m_attribs = g_token->attribs;
- int retval=0;
- g_nodeStack.push(this);
- DBG(("DocHtmlDescData::parse() start\n"));
-
- bool isFirst=TRUE;
- DocPara *par=0;
- do
- {
- par = new DocPara(this);
- if (isFirst) { par->markFirst(); isFirst=FALSE; }
- m_children.append(par);
- retval=par->parse();
- }
- while (retval==TK_NEWPARA);
- if (par) par->markLast();
-
- DBG(("DocHtmlDescData::parse() end\n"));
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
- return retval;
-}
-
-//---------------------------------------------------------------------------
-
-int DocHtmlDescList::parse()
-{
- int retval=RetVal_OK;
- g_nodeStack.push(this);
- DBG(("DocHtmlDescList::parse() start\n"));
-
- // get next token
- int tok=doctokenizerYYlex();
- // skip whitespace
- while (tok==TK_WHITESPACE || tok==TK_NEWPARA) tok=doctokenizerYYlex();
- // should find a html tag now
- if (tok==TK_HTMLTAG)
- {
- int tagId=Mappers::htmlTagMapper->map(g_token->name);
- if (tagId==HTML_DT && !g_token->endTag) // found <dt> tag
- {
- // continue
- }
- else // found some other tag
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: expected <dt> tag but "
- "found <%s> instead!",g_token->name.data());
- goto enddesclist;
- }
- }
- else if (tok==0) // premature end of comment
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: 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,"Warning: expected <dt> tag but found %s token instead!",
- tokToString(tok));
- goto enddesclist;
- }
-
- do
- {
- DocHtmlDescTitle *dt=new DocHtmlDescTitle(this,g_token->attribs);
- m_children.append(dt);
- DocHtmlDescData *dd=new DocHtmlDescData(this);
- m_children.append(dd);
- retval=dt->parse();
- if (retval==RetVal_DescData)
- {
- retval=dd->parse();
- }
- else if (retval!=RetVal_DescTitle)
- {
- // error
- break;
- }
- } while (retval==RetVal_DescTitle);
-
- if (retval==0)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected end of comment while inside <dl> block");
- }
-
-enddesclist:
-
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
- DBG(("DocHtmlDescList::parse() end\n"));
- return retval==RetVal_EndDesc ? RetVal_OK : retval;
-}
-
-//---------------------------------------------------------------------------
-
-int DocHtmlListItem::parse()
-{
- DBG(("DocHtmlListItem::parse() start\n"));
- int retval=0;
- g_nodeStack.push(this);
-
- // parse one or more paragraphs
- bool isFirst=TRUE;
- DocPara *par=0;
- do
- {
- par = new DocPara(this);
- if (isFirst) { par->markFirst(); isFirst=FALSE; }
- m_children.append(par);
- retval=par->parse();
- }
- while (retval==TK_NEWPARA);
- if (par) par->markLast();
-
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
- DBG(("DocHtmlListItem::parse() end retval=%x\n",retval));
- return retval;
-}
-
-int DocHtmlListItem::parseXml()
-{
- DBG(("DocHtmlListItem::parseXml() start\n"));
- int retval=0;
- g_nodeStack.push(this);
-
- // parse one or more paragraphs
- bool isFirst=TRUE;
- DocPara *par=0;
- do
- {
- par = new DocPara(this);
- if (isFirst) { par->markFirst(); isFirst=FALSE; }
- m_children.append(par);
- retval=par->parse();
- if (retval==0) break;
-
- //printf("new item: retval=%x g_token->name=%s g_token->endTag=%d\n",
- // retval,g_token->name.data(),g_token->endTag);
- if (retval==RetVal_ListItem)
- {
- break;
- }
- }
- while (retval!=RetVal_CloseXml);
-
- if (par) par->markLast();
-
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
- DBG(("DocHtmlListItem::parseXml() end retval=%x\n",retval));
- return retval;
-}
-
-//---------------------------------------------------------------------------
-
-int DocHtmlList::parse()
-{
- DBG(("DocHtmlList::parse() start\n"));
- int retval=RetVal_OK;
- int num=1;
- g_nodeStack.push(this);
-
- // get next token
- int tok=doctokenizerYYlex();
- // skip whitespace and paragraph breaks
- while (tok==TK_WHITESPACE || tok==TK_NEWPARA) tok=doctokenizerYYlex();
- // should find a html tag now
- if (tok==TK_HTMLTAG)
- {
- int tagId=Mappers::htmlTagMapper->map(g_token->name);
- if (tagId==HTML_LI && !g_token->endTag) // found <li> tag
- {
- // ok, we can go on.
- }
- else // found some other tag
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: expected <li> tag but "
- "found <%s> instead!",g_token->name.data());
- goto endlist;
- }
- }
- else if (tok==0) // premature end of comment
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: 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,"Warning: expected <li> tag but found %s token instead!",
- tokToString(tok));
- goto endlist;
- }
-
- do
- {
- DocHtmlListItem *li=new DocHtmlListItem(this,g_token->attribs,num++);
- m_children.append(li);
- retval=li->parse();
- } while (retval==RetVal_ListItem);
-
- if (retval==0)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected end of comment while inside <%cl> block",
- m_type==Unordered ? 'u' : 'o');
- }
-
-endlist:
- DBG(("DocHtmlList::parse() end retval=%x\n",retval));
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
- return retval==RetVal_EndList ? RetVal_OK : retval;
-}
-
-int DocHtmlList::parseXml()
-{
- DBG(("DocHtmlList::parseXml() start\n"));
- int retval=RetVal_OK;
- int num=1;
- g_nodeStack.push(this);
-
- // get next token
- int tok=doctokenizerYYlex();
- // skip whitespace and paragraph breaks
- while (tok==TK_WHITESPACE || tok==TK_NEWPARA) tok=doctokenizerYYlex();
- // should find a html tag now
- if (tok==TK_HTMLTAG)
- {
- int tagId=Mappers::htmlTagMapper->map(g_token->name);
- //printf("g_token->name=%s g_token->endTag=%d\n",g_token->name.data(),g_token->endTag);
- if (tagId==XML_ITEM && !g_token->endTag) // found <item> tag
- {
- // ok, we can go on.
- }
- else // found some other tag
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: expected <item> tag but "
- "found <%s> instead!",g_token->name.data());
- goto endlist;
- }
- }
- else if (tok==0) // premature end of comment
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: 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,"Warning: expected <item> tag but found %s token instead!",
- tokToString(tok));
- goto endlist;
- }
-
- do
- {
- DocHtmlListItem *li=new DocHtmlListItem(this,g_token->attribs,num++);
- m_children.append(li);
- retval=li->parseXml();
- if (retval==0) break;
- //printf("retval=%x g_token->name=%s\n",retval,g_token->name.data());
- } while (retval==RetVal_ListItem);
-
- if (retval==0)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected end of comment while inside <list type=\"%s\"> block",
- m_type==Unordered ? "bullet" : "number");
- }
-
-endlist:
- DBG(("DocHtmlList::parseXml() end retval=%x\n",retval));
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
- return retval==RetVal_EndList ? RetVal_OK : retval;
-}
-
-//---------------------------------------------------------------------------
-
-int DocSimpleListItem::parse()
-{
- g_nodeStack.push(this);
- int rv=m_paragraph->parse();
- m_paragraph->markFirst();
- m_paragraph->markLast();
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
- return rv;
-}
-
-//--------------------------------------------------------------------------
-
-int DocSimpleList::parse()
-{
- g_nodeStack.push(this);
- int rv;
- do
- {
- DocSimpleListItem *li=new DocSimpleListItem(this);
- m_children.append(li);
- rv=li->parse();
- } while (rv==RetVal_ListItem);
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
- return (rv!=TK_NEWPARA) ? rv : RetVal_OK;
-}
-
-//--------------------------------------------------------------------------
-
-int DocAutoListItem::parse()
-{
- int retval = RetVal_OK;
- g_nodeStack.push(this);
- retval=m_paragraph->parse();
- m_paragraph->markFirst();
- m_paragraph->markLast();
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
- return retval;
-}
-
-//--------------------------------------------------------------------------
-
-int DocAutoList::parse()
-{
- int retval = RetVal_OK;
- int num=1;
- g_nodeStack.push(this);
- // first item or sub list => create new list
- do
- {
- DocAutoListItem *li = new DocAutoListItem(this,num++);
- m_children.append(li);
- retval=li->parse();
- }
- 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
- );
-
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
- return retval;
-}
-
-//--------------------------------------------------------------------------
-
-void DocTitle::parse()
-{
- DBG(("DocTitle::parse() start\n"));
- g_nodeStack.push(this);
- doctokenizerYYsetStateTitle();
- int tok;
- while ((tok=doctokenizerYYlex()))
- {
- if (!defaultHandleToken(this,tok,m_children))
- {
- switch (tok)
- {
- case TK_COMMAND:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Illegal command %s as part of a title section",
- g_token->name.data());
- break;
- case TK_SYMBOL:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unsupported symbol %s found",
- g_token->name.data());
- break;
- default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected token %s",
- tokToString(tok));
- break;
- }
- }
- }
- doctokenizerYYsetStatePara();
- handlePendingStyleCommands(this,m_children);
- DBG(("DocTitle::parse() end\n"));
- DocNode *n = g_nodeStack.pop();
- ASSERT(n==this);
-}
-
-void DocTitle::parseFromString(const QString &text)
-{
- m_children.append(new DocWord(this,text));
-}
-
-//--------------------------------------------------------------------------
-
-DocSimpleSect::DocSimpleSect(DocNode *parent,Type t) :
- m_parent(parent), m_type(t)
-{
- m_title=0;
-}
-
-DocSimpleSect::~DocSimpleSect()
-{
- delete m_title;
-}
-
-void DocSimpleSect::accept(DocVisitor *v)
-{
- v->visitPre(this);
- if (m_title) m_title->accept(v);
- QListIterator<DocNode> cli(m_children);
- DocNode *n;
- for (cli.toFirst();(n=cli.current());++cli) n->accept(v);
- v->visitPost(this);
-}
-
-int DocSimpleSect::parse(bool userTitle)
-{
- DBG(("DocSimpleSect::parse() start\n"));
- g_nodeStack.push(this);
-
- // handle case for user defined title
- if (userTitle)
- {
- m_title = new DocTitle(this);
- m_title->parse();
- }
-
- // add new paragraph as child
- DocPara *par = new DocPara(this);
- if (m_children.isEmpty())
- {
- par->markFirst();
- }
- else
- {
- ASSERT(m_children.last()->kind()==DocNode::Kind_Para);
- ((DocPara *)m_children.last())->markLast(FALSE);
- }
- par->markLast();
- m_children.append(par);
-
- // parse the contents of the paragraph
- int retval = par->parse();
-
- DBG(("DocSimpleSect::parse() end retval=%d\n",retval));
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
- return retval; // 0==EOF, TK_NEWPARA, TK_LISTITEM, TK_ENDLIST, RetVal_SimpleSec
-}
-
-int DocSimpleSect::parseRcs()
-{
- DBG(("DocSimpleSect::parseRcs() start\n"));
- g_nodeStack.push(this);
-
- m_title = new DocTitle(this);
- m_title->parseFromString(g_token->name);
-
- docParserPushContext();
- internalValidatingParseDoc(this,m_children,g_token->text);
- docParserPopContext();
-
- DBG(("DocSimpleSect::parseRcs()\n"));
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
- return RetVal_OK;
-}
-
-int DocSimpleSect::parseXml()
-{
- DBG(("DocSimpleSect::parse() start\n"));
- g_nodeStack.push(this);
-
- int retval = RetVal_OK;
- for (;;)
- {
- // add new paragraph as child
- DocPara *par = new DocPara(this);
- if (m_children.isEmpty())
- {
- par->markFirst();
- }
- else
- {
- ASSERT(m_children.last()->kind()==DocNode::Kind_Para);
- ((DocPara *)m_children.last())->markLast(FALSE);
- }
- par->markLast();
- m_children.append(par);
-
- // parse the contents of the paragraph
- retval = par->parse();
- if (retval == 0) break;
- 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;
-}
-
-void DocSimpleSect::appendLinkWord(const QString &word)
-{
- DocPara *p;
- if (m_children.isEmpty() || m_children.last()->kind()!=DocNode::Kind_Para)
- {
- p = new DocPara(this);
- m_children.append(p);
- }
- else
- {
- p = (DocPara *)m_children.last();
-
- // Comma-seperate <seealso> links.
- p->injectToken(TK_WORD,",");
- p->injectToken(TK_WHITESPACE," ");
- }
-
- g_inSeeBlock=TRUE;
- p->injectToken(TK_LNKWORD,word);
- g_inSeeBlock=FALSE;
-}
-
-//--------------------------------------------------------------------------
-
-int DocParamList::parse(const QString &cmdName)
-{
- int retval=RetVal_OK;
- DBG(("DocParamList::parse() start\n"));
- g_nodeStack.push(this);
- DocPara *par=0;
-
- int tok=doctokenizerYYlex();
- if (tok!=TK_WHITESPACE)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: expected whitespace after %s command",
- cmdName.data());
- }
- doctokenizerYYsetStateParam();
- tok=doctokenizerYYlex();
- while (tok==TK_WORD) /* there is a parameter name */
- {
- if (m_type==DocParamSect::Param)
- {
- g_hasParamCommand=TRUE;
- checkArgumentName(g_token->name,TRUE);
- }
- else if (m_type==DocParamSect::RetVal)
- {
- g_hasReturnCommand=TRUE;
- checkArgumentName(g_token->name,FALSE);
- }
- //m_params.append(g_token->name);
- handleLinkedWord(this,m_params);
- tok=doctokenizerYYlex();
- }
- doctokenizerYYsetStatePara();
- if (tok==0) /* premature end of comment block */
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected end of comment block while parsing the "
- "argument of command %s",cmdName.data());
- retval=0;
- goto endparamlist;
- }
- ASSERT(tok==TK_WHITESPACE);
-
- par = new DocPara(this);
- m_paragraphs.append(par);
- retval = par->parse();
- par->markFirst();
- par->markLast();
-
-endparamlist:
- DBG(("DocParamList::parse() end retval=%d\n",retval));
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
- return retval;
-}
-
-int DocParamList::parseXml(const QString &paramName)
-{
- int retval=RetVal_OK;
- DBG(("DocParamList::parseXml() start\n"));
- g_nodeStack.push(this);
-
- g_token->name = paramName;
- if (m_type==DocParamSect::Param)
- {
- g_hasParamCommand=TRUE;
- checkArgumentName(g_token->name,TRUE);
- }
- else if (m_type==DocParamSect::RetVal)
- {
- g_hasReturnCommand=TRUE;
- checkArgumentName(g_token->name,FALSE);
- }
-
- handleLinkedWord(this,m_params);
-
- do
- {
- DocPara *par = new DocPara(this);
- retval = par->parse();
- if (par->isEmpty()) // avoid adding an empty paragraph for the whitespace
- // after </para> and before </param>
- {
- delete par;
- break;
- }
- else // append the paragraph to the list
- {
- if (m_paragraphs.isEmpty())
- {
- par->markFirst();
- }
- else
- {
- m_paragraphs.last()->markLast(FALSE);
- }
- par->markLast();
- m_paragraphs.append(par);
- }
-
- if (retval == 0) break;
-
- } while (retval==RetVal_CloseXml &&
- Mappers::htmlTagMapper->map(g_token->name)!=XML_PARAM &&
- Mappers::htmlTagMapper->map(g_token->name)!=XML_EXCEPTION);
-
-
- if (retval==0) /* premature end of comment block */
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unterminated param or exception tag");
- }
- else
- {
- retval=RetVal_OK;
- }
-
-
- DBG(("DocParamList::parse() end retval=%d\n",retval));
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
- return retval;
-}
-
-//--------------------------------------------------------------------------
-
-int DocParamSect::parse(const QString &cmdName,bool xmlContext, Direction d)
-{
- int retval=RetVal_OK;
- DBG(("DocParamSect::parse() start\n"));
- g_nodeStack.push(this);
-
- DocParamList *pl = new DocParamList(this,m_type,d);
- if (m_children.isEmpty())
- {
- pl->markFirst();
- pl->markLast();
- }
- else
- {
- ASSERT(m_children.last()->kind()==DocNode::Kind_ParamList);
- ((DocParamList *)m_children.last())->markLast(FALSE);
- pl->markLast();
- }
- m_children.append(pl);
- if (xmlContext)
- {
- retval = pl->parseXml(cmdName);
- }
- else
- {
- retval = pl->parse(cmdName);
- }
-
- DBG(("DocParamSect::parse() end retval=%d\n",retval));
- DocNode *n=g_nodeStack.pop();
- ASSERT(n==this);
- return retval;
-}
-
-//--------------------------------------------------------------------------
-
-int DocPara::handleSimpleSection(DocSimpleSect::Type t, bool xmlContext)
-{
- DocSimpleSect *ss=0;
- if (!m_children.isEmpty() && // previous element
- m_children.last()->kind()==Kind_SimpleSect && // was a simple sect
- ((DocSimpleSect *)m_children.last())->type()==t && // of same type
- t!=DocSimpleSect::User) // but not user defined
- {
- // append to previous section
- ss=(DocSimpleSect *)m_children.last();
- }
- else // start new section
- {
- ss=new DocSimpleSect(this,t);
- m_children.append(ss);
- }
- int rv = RetVal_OK;
- if (xmlContext)
- {
- return ss->parseXml();
- }
- else
- {
- rv = ss->parse(t==DocSimpleSect::User);
- }
- return (rv!=TK_NEWPARA) ? rv : RetVal_OK;
-}
-
-int DocPara::handleParamSection(const QString &cmdName,
- DocParamSect::Type t,
- bool xmlContext=FALSE,
- int direction=DocParamSect::Unspecified)
-{
- DocParamSect *ps=0;
- if (!m_children.isEmpty() && // previous element
- m_children.last()->kind()==Kind_ParamSect && // was a param sect
- ((DocParamSect *)m_children.last())->type()==t) // of same type
- {
- // append to previous section
- ps=(DocParamSect *)m_children.last();
- }
- else // start new section
- {
- ps=new DocParamSect(this,t);
- m_children.append(ps);
- }
- int rv=ps->parse(cmdName,xmlContext,(DocParamSect::Direction)direction);
- return (rv!=TK_NEWPARA) ? rv : RetVal_OK;
-}
-
-int DocPara::handleXRefItem()
-{
- int retval=doctokenizerYYlex();
- ASSERT(retval==TK_WHITESPACE);
- doctokenizerYYsetStateXRefItem();
- retval=doctokenizerYYlex();
- if (retval==RetVal_OK)
- {
- DocXRefItem *ref = new DocXRefItem(this,g_token->id,g_token->name);
- if (ref->parse())
- {
- m_children.append(ref);
- }
- else
- {
- delete ref;
- }
- }
- doctokenizerYYsetStatePara();
- return retval;
-}
-
-void DocPara::handleIncludeOperator(const QString &cmdName,DocIncOperator::Type t)
-{
- DBG(("handleIncludeOperator(%s)\n",cmdName.data()));
- int tok=doctokenizerYYlex();
- if (tok!=TK_WHITESPACE)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: expected whitespace after %s command",
- cmdName.data());
- return;
- }
- doctokenizerYYsetStatePattern();
- tok=doctokenizerYYlex();
- doctokenizerYYsetStatePara();
- if (tok==0)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected end of comment block while parsing the "
- "argument of command %s", cmdName.data());
- return;
- }
- else if (tok!=TK_WORD)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected token %s as the argument of %s",
- tokToString(tok),cmdName.data());
- return;
- }
- DocIncOperator *op = new DocIncOperator(this,t,g_token->name,g_context,g_isExample,g_exampleName);
- DocNode *n1 = m_children.last();
- DocNode *n2 = n1!=0 ? m_children.prev() : 0;
- bool isFirst = n1==0 || // no last node
- (n1->kind()!=DocNode::Kind_IncOperator &&
- n1->kind()!=DocNode::Kind_WhiteSpace
- ) || // last node is not operator or whitespace
- (n1->kind()==DocNode::Kind_WhiteSpace &&
- n2!=0 && n2->kind()!=DocNode::Kind_IncOperator
- ); // previous not is not operator
- op->markFirst(isFirst);
- op->markLast(TRUE);
- if (n1!=0 && n1->kind()==DocNode::Kind_IncOperator)
- {
- ((DocIncOperator *)n1)->markLast(FALSE);
- }
- else if (n1!=0 && n1->kind()==DocNode::Kind_WhiteSpace &&
- n2!=0 && n2->kind()==DocNode::Kind_IncOperator
- )
- {
- ((DocIncOperator *)n2)->markLast(FALSE);
- }
- m_children.append(op);
- op->parse();
-}
-
-void DocPara::handleImage(const QString &cmdName)
-{
- int tok=doctokenizerYYlex();
- if (tok!=TK_WHITESPACE)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: expected whitespace after %s command",
- cmdName.data());
- return;
- }
- tok=doctokenizerYYlex();
- if (tok!=TK_WORD && tok!=TK_LNKWORD)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected token %s as the argument of %s",
- tokToString(tok),cmdName.data());
- return;
- }
- tok=doctokenizerYYlex();
- if (tok!=TK_WHITESPACE)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: expected whitespace after %s command",
- cmdName.data());
- return;
- }
- DocImage::Type t;
- QString imgType = g_token->name.lower();
- if (imgType=="html") t=DocImage::Html;
- else if (imgType=="latex") t=DocImage::Latex;
- else if (imgType=="rtf") t=DocImage::Rtf;
- else
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: image type %s specified as the first argument of "
- "%s is not valid",
- imgType.data(),cmdName.data());
- return;
- }
- doctokenizerYYsetStateFile();
- tok=doctokenizerYYlex();
- doctokenizerYYsetStatePara();
- if (tok!=TK_WORD)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected token %s as the argument of %s",
- tokToString(tok),cmdName.data());
- return;
- }
- HtmlAttribList attrList;
- DocImage *img = new DocImage(this,attrList,findAndCopyImage(g_token->name,t),t);
- m_children.append(img);
- img->parse();
-}
-
-void DocPara::handleDotFile(const QString &cmdName)
-{
- int tok=doctokenizerYYlex();
- if (tok!=TK_WHITESPACE)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: expected whitespace after %s command",
- cmdName.data());
- return;
- }
- doctokenizerYYsetStateFile();
- tok=doctokenizerYYlex();
- doctokenizerYYsetStatePara();
- if (tok!=TK_WORD)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected token %s as the argument of %s",
- tokToString(tok),cmdName.data());
- return;
- }
- QString name = g_token->name;
- DocDotFile *df = new DocDotFile(this,name);
- m_children.append(df);
- df->parse();
-}
-
-void DocPara::handleLink(const QString &cmdName,bool isJavaLink)
-{
- int tok=doctokenizerYYlex();
- if (tok!=TK_WHITESPACE)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: expected whitespace after %s command",
- cmdName.data());
- return;
- }
- doctokenizerYYsetStateLink();
- tok=doctokenizerYYlex();
- if (tok!=TK_WORD)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected token %s as the argument of %s",
- tokToString(tok),cmdName.data());
- return;
- }
- doctokenizerYYsetStatePara();
- DocLink *lnk = new DocLink(this,g_token->name);
- m_children.append(lnk);
- QString leftOver = lnk->parse(isJavaLink);
- if (!leftOver.isEmpty())
- {
- m_children.append(new DocWord(this,leftOver));
- }
-}
-
-void DocPara::handleRef(const QString &cmdName)
-{
- DBG(("handleRef(%s)\n",cmdName.data()));
- int tok=doctokenizerYYlex();
- if (tok!=TK_WHITESPACE)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: expected whitespace after %s command",
- cmdName.data());
- return;
- }
- doctokenizerYYsetStateRef();
- tok=doctokenizerYYlex(); // get the reference id
- DocRef *ref=0;
- if (tok!=TK_WORD)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected token %s as the argument of %s",
- tokToString(tok),cmdName.data());
- goto endref;
- }
- ref = new DocRef(this,g_token->name);
- m_children.append(ref);
- ref->parse();
-endref:
- doctokenizerYYsetStatePara();
-}
-
-
-void DocPara::handleInclude(const QString &cmdName,DocInclude::Type t)
-{
- DBG(("handleInclude(%s)\n",cmdName.data()));
- int tok=doctokenizerYYlex();
- if (tok!=TK_WHITESPACE)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: expected whitespace after %s command",
- cmdName.data());
- return;
- }
- doctokenizerYYsetStateFile();
- tok=doctokenizerYYlex();
- doctokenizerYYsetStatePara();
- if (tok==0)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected end of comment block while parsing the "
- "argument of command %s",cmdName.data());
- return;
- }
- else if (tok!=TK_WORD)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected token %s as the argument of %s",
- tokToString(tok),cmdName.data());
- return;
- }
- DocInclude *inc = new DocInclude(this,g_token->name,g_context,t,g_isExample,g_exampleName);
- m_children.append(inc);
- inc->parse();
-}
-
-void DocPara::handleSection(const QString &cmdName)
-{
- // get the argument of the section command.
- int tok=doctokenizerYYlex();
- if (tok!=TK_WHITESPACE)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: expected whitespace after %s command",
- cmdName.data());
- return;
- }
- tok=doctokenizerYYlex();
- if (tok==0)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected end of comment block while parsing the "
- "argument of command %s\n", cmdName.data());
- return;
- }
- else if (tok!=TK_WORD && tok!=TK_LNKWORD)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected token %s as the argument of %s",
- tokToString(tok),cmdName.data());
- return;
- }
- g_token->sectionId = g_token->name;
- doctokenizerYYsetStateSkipTitle();
- doctokenizerYYlex();
- doctokenizerYYsetStatePara();
-}
-
-int DocPara::handleHtmlHeader(const HtmlAttribList &tagHtmlAttribs,int level)
-{
- DocHtmlHeader *header = new DocHtmlHeader(this,tagHtmlAttribs,level);
- m_children.append(header);
- int retval = header->parse();
- return (retval==RetVal_OK) ? TK_NEWPARA : retval;
-}
-
-// 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 QString &tokText)
-{
- g_token->name = tokText;
- return defaultHandleToken(this,tok,m_children);
-}
-
-int DocPara::handleStartCode()
-{
- int retval = doctokenizerYYlex();
- // search for the first non-whitespace line, index is stored in li
- int i=0,li=0,l=g_token->verb.length();
- while (i<l && g_token->verb.at(i)==' ' || g_token->verb.at(i)=='\n')
- {
- if (g_token->verb.at(i)=='\n') li=i+1;
- i++;
- }
- m_children.append(new DocVerbatim(this,g_context,g_token->verb.mid(li),DocVerbatim::Code,g_isExample,g_exampleName));
- if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: code section ended without end marker");
- doctokenizerYYsetStatePara();
- return retval;
-}
-
-void DocPara::handleInheritDoc()
-{
- if (g_memberDef) // inheriting docs from a member
- {
- MemberDef *reMd = g_memberDef->reimplements();
- if (reMd) // member from which was inherited.
- {
- MemberDef *thisMd = g_memberDef;
- //printf("{InheritDocs:%s=>%s}\n",g_memberDef->qualifiedName().data(),reMd->qualifiedName().data());
- docParserPushContext();
- g_context=reMd->getOuterScope()->name();
- g_memberDef=reMd;
- g_styleStack.clear();
- g_nodeStack.clear();
- g_copyStack.append(reMd);
- internalValidatingParseDoc(this,m_children,reMd->briefDescription());
- internalValidatingParseDoc(this,m_children,reMd->documentation());
- g_copyStack.remove(reMd);
- docParserPopContext();
- g_memberDef = thisMd;
- }
- }
-}
-
-
-int DocPara::handleCommand(const QString &cmdName)
-{
- DBG(("handleCommand(%s)\n",cmdName.data()));
- int retval = RetVal_OK;
- switch (Mappers::cmdMapper->map(cmdName))
- {
- case CMD_UNKNOWN:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Found unknown command `\\%s'",cmdName.data());
- break;
- case CMD_EMPHASIS:
- m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Italic,TRUE));
- retval=handleStyleArgument(this,m_children,cmdName);
- m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Italic,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,TRUE));
- retval=handleStyleArgument(this,m_children,cmdName);
- m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Bold,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,TRUE));
- retval=handleStyleArgument(this,m_children,cmdName);
- m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Code,FALSE));
- if (retval!=TK_WORD) m_children.append(new DocWhiteSpace(this," "));
- break;
- case CMD_BSLASH:
- m_children.append(new DocSymbol(this,DocSymbol::BSlash));
- break;
- case CMD_AT:
- m_children.append(new DocSymbol(this,DocSymbol::At));
- break;
- case CMD_LESS:
- m_children.append(new DocSymbol(this,DocSymbol::Less));
- break;
- case CMD_GREATER:
- m_children.append(new DocSymbol(this,DocSymbol::Greater));
- break;
- case CMD_AMP:
- m_children.append(new DocSymbol(this,DocSymbol::Amp));
- break;
- case CMD_DOLLAR:
- m_children.append(new DocSymbol(this,DocSymbol::Dollar));
- break;
- case CMD_HASH:
- m_children.append(new DocSymbol(this,DocSymbol::Hash));
- break;
- case CMD_PERCENT:
- m_children.append(new DocSymbol(this,DocSymbol::Percent));
- break;
- case CMD_SA:
- g_inSeeBlock=TRUE;
- retval = handleSimpleSection(DocSimpleSect::See);
- g_inSeeBlock=FALSE;
- break;
- case CMD_RETURN:
- retval = handleSimpleSection(DocSimpleSect::Return);
- g_hasReturnCommand=TRUE;
- break;
- case CMD_AUTHOR:
- retval = handleSimpleSection(DocSimpleSect::Author);
- break;
- case CMD_AUTHORS:
- retval = handleSimpleSection(DocSimpleSect::Authors);
- break;
- case CMD_VERSION:
- retval = handleSimpleSection(DocSimpleSect::Version);
- break;
- case CMD_SINCE:
- retval = handleSimpleSection(DocSimpleSect::Since);
- break;
- case CMD_DATE:
- retval = handleSimpleSection(DocSimpleSect::Date);
- break;
- case CMD_NOTE:
- retval = handleSimpleSection(DocSimpleSect::Note);
- break;
- case CMD_WARNING:
- retval = handleSimpleSection(DocSimpleSect::Warning);
- break;
- case CMD_PRE:
- retval = handleSimpleSection(DocSimpleSect::Pre);
- break;
- case CMD_POST:
- retval = handleSimpleSection(DocSimpleSect::Post);
- break;
- case CMD_INVARIANT:
- retval = handleSimpleSection(DocSimpleSect::Invar);
- break;
- case CMD_REMARK:
- retval = handleSimpleSection(DocSimpleSect::Remark);
- break;
- case CMD_ATTENTION:
- retval = handleSimpleSection(DocSimpleSect::Attention);
- break;
- case CMD_PAR:
- retval = handleSimpleSection(DocSimpleSect::User);
- break;
- case CMD_LI:
- {
- DocSimpleList *sl=new DocSimpleList(this);
- m_children.append(sl);
- retval = sl->parse();
- }
- break;
- case CMD_SECTION:
- {
- handleSection(cmdName);
- retval = RetVal_Section;
- }
- break;
- case CMD_SUBSECTION:
- {
- handleSection(cmdName);
- retval = RetVal_Subsection;
- }
- break;
- case CMD_SUBSUBSECTION:
- {
- handleSection(cmdName);
- retval = RetVal_Subsubsection;
- }
- break;
- case CMD_PARAGRAPH:
- {
- handleSection(cmdName);
- retval = RetVal_Paragraph;
- }
- break;
- case CMD_STARTCODE:
- {
- doctokenizerYYsetStateCode();
- retval = handleStartCode();
- }
- break;
- case CMD_HTMLONLY:
- {
- doctokenizerYYsetStateHtmlOnly();
- retval = doctokenizerYYlex();
- m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::HtmlOnly,g_isExample,g_exampleName));
- if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: htmlonly section ended without end marker");
- doctokenizerYYsetStatePara();
- }
- break;
- case CMD_MANONLY:
- {
- 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,"Warning: manonly section ended without end marker");
- doctokenizerYYsetStatePara();
- }
- break;
- case CMD_LATEXONLY:
- {
- 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,"Warning: latexonly section ended without end marker");
- doctokenizerYYsetStatePara();
- }
- break;
- case CMD_XMLONLY:
- {
- doctokenizerYYsetStateXmlOnly();
- retval = doctokenizerYYlex();
- m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::XmlOnly,g_isExample,g_exampleName));
- if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: xmlonly section ended without end marker");
- doctokenizerYYsetStatePara();
- }
- break;
- case CMD_VERBATIM:
- {
- doctokenizerYYsetStateVerbatim();
- 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,"Warning: verbatim section ended without end marker");
- doctokenizerYYsetStatePara();
- }
- break;
- case CMD_DOT:
- {
- doctokenizerYYsetStateDot();
- retval = doctokenizerYYlex();
- m_children.append(new DocVerbatim(this,g_context,g_token->verb,DocVerbatim::Dot,g_isExample,g_exampleName));
- if (retval==0) warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: dot section ended without end marker");
- doctokenizerYYsetStatePara();
- }
- break;
- case CMD_ENDCODE:
- case CMD_ENDHTMLONLY:
- case CMD_ENDMANONLY:
- case CMD_ENDLATEXONLY:
- case CMD_ENDXMLONLY:
- case CMD_ENDLINK:
- case CMD_ENDVERBATIM:
- case CMD_ENDDOT:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected command %s",g_token->name.data());
- break;
- case CMD_PARAM:
- retval = handleParamSection(cmdName,DocParamSect::Param,FALSE,g_token->paramDir);
- break;
- case CMD_RETVAL:
- retval = handleParamSection(cmdName,DocParamSect::RetVal);
- break;
- case CMD_EXCEPTION:
- retval = handleParamSection(cmdName,DocParamSect::Exception);
- break;
- case CMD_XREFITEM:
- retval = handleXRefItem();
- break;
- case CMD_LINEBREAK:
- {
- DocLineBreak *lb = new DocLineBreak(this);
- m_children.append(lb);
- }
- break;
- case CMD_ANCHOR:
- {
- int tok=doctokenizerYYlex();
- if (tok!=TK_WHITESPACE)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: expected whitespace after %s command",
- cmdName.data());
- break;
- }
- tok=doctokenizerYYlex();
- if (tok==0)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected end of comment block while parsing the "
- "argument of command %s",cmdName.data());
- break;
- }
- else if (tok!=TK_WORD && tok!=TK_LNKWORD)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected token %s as the argument of %s",
- tokToString(tok),cmdName.data());
- break;
- }
- DocAnchor *anchor = new DocAnchor(this,g_token->name,FALSE);
- m_children.append(anchor);
- }
- break;
- case CMD_ADDINDEX:
- {
- DocIndexEntry *ie = new DocIndexEntry(this);
- m_children.append(ie);
- retval = ie->parse();
- }
- break;
- case CMD_INTERNAL:
- retval = RetVal_Internal;
- break;
- case CMD_COPYDOC:
- {
- int tok=doctokenizerYYlex();
- if (tok!=TK_WHITESPACE)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: expected whitespace after %s command",
- cmdName.data());
- break;
- }
- tok=doctokenizerYYlex();
- if (tok==0)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected end of comment block while parsing the "
- "argument of command %s\n", cmdName.data());
- break;
- }
- else if (tok!=TK_WORD && tok!=TK_LNKWORD)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected token %s as the argument of %s",
- tokToString(tok),cmdName.data());
- break;
- }
- DocCopy *cpy = new DocCopy(this,g_token->name);
- m_children.append(cpy);
- cpy->parse();
- }
- break;
- case CMD_INCLUDE:
- handleInclude(cmdName,DocInclude::Include);
- break;
- case CMD_INCWITHLINES:
- handleInclude(cmdName,DocInclude::IncWithLines);
- break;
- case CMD_DONTINCLUDE:
- handleInclude(cmdName,DocInclude::DontInclude);
- break;
- case CMD_HTMLINCLUDE:
- handleInclude(cmdName,DocInclude::HtmlInclude);
- break;
- case CMD_VERBINCLUDE:
- handleInclude(cmdName,DocInclude::VerbInclude);
- break;
- case CMD_SKIP:
- handleIncludeOperator(cmdName,DocIncOperator::Skip);
- break;
- case CMD_UNTIL:
- handleIncludeOperator(cmdName,DocIncOperator::Until);
- break;
- case CMD_SKIPLINE:
- handleIncludeOperator(cmdName,DocIncOperator::SkipLine);
- break;
- case CMD_LINE:
- handleIncludeOperator(cmdName,DocIncOperator::Line);
- break;
- case CMD_IMAGE:
- handleImage(cmdName);
- break;
- case CMD_DOTFILE:
- handleDotFile(cmdName);
- break;
- case CMD_LINK:
- handleLink(cmdName,FALSE);
- break;
- case CMD_JAVALINK:
- handleLink(cmdName,TRUE);
- break;
- case CMD_REF: // fall through
- case CMD_SUBPAGE:
- handleRef(cmdName);
- break;
- case CMD_SECREFLIST:
- {
- DocSecRefList *list = new DocSecRefList(this);
- m_children.append(list);
- list->parse();
- }
- break;
- case CMD_SECREFITEM:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected command %s",g_token->name.data());
- break;
- case CMD_ENDSECREFLIST:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected command %s",g_token->name.data());
- break;
- case CMD_FORMULA:
- {
- DocFormula *form=new DocFormula(this,g_token->id);
- m_children.append(form);
- }
- break;
- //case CMD_LANGSWITCH:
- // retval = handleLanguageSwitch();
- // break;
- case CMD_INTERNALREF:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: unexpected command %s",g_token->name.data());
- break;
- case CMD_INHERITDOC:
- handleInheritDoc();
- break;
- default:
- // we should not get here!
- ASSERT(0);
- break;
- }
- 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
- );
- DBG(("handleCommand(%s) end retval=%x\n",cmdName.data(),retval));
- return retval;
-}
-
-static bool findAttribute(const HtmlAttribList &tagHtmlAttribs,
- const char *attrName,
- QString *result)
-{
-
- HtmlAttribListIterator li(tagHtmlAttribs);
- HtmlAttrib *opt;
- for (li.toFirst();(opt=li.current());++li)
- {
- if (opt->name==attrName)
- {
- *result = opt->value;
- return TRUE;
- }
- }
- return FALSE;
-}
-
-int DocPara::handleHtmlStartTag(const QString &tagName,const HtmlAttribList &tagHtmlAttribs)
-{
- DBG(("handleHtmlStartTag(%s,%d)\n",tagName.data(),tagHtmlAttribs.count()));
- int retval=RetVal_OK;
- int tagId = Mappers::htmlTagMapper->map(tagName);
- if (g_token->emptyTag && !(tagId&XML_CmdMask) && tagId!=HTML_UNKNOWN)
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: HTML tags may not use the 'empty tag' XHTML syntax.");
- switch (tagId)
- {
- case HTML_UL:
- {
- DocHtmlList *list = new DocHtmlList(this,tagHtmlAttribs,DocHtmlList::Unordered);
- m_children.append(list);
- retval=list->parse();
- }
- break;
- case HTML_OL:
- {
- DocHtmlList *list = new DocHtmlList(this,tagHtmlAttribs,DocHtmlList::Ordered);
- m_children.append(list);
- retval=list->parse();
- }
- break;
- case HTML_LI:
- if (!insideUL(this) && !insideOL(this))
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: lonely <li> tag found");
- }
- else
- {
- retval=RetVal_ListItem;
- }
- break;
- case HTML_BOLD:
- handleStyleEnter(this,m_children,DocStyleChange::Bold,&g_token->attribs);
- break;
- case HTML_CODE:
- if (g_fileName.right(3)==".cs")
- // for C# code we treat <code> as an XML tag
- {
- doctokenizerYYsetStateXmlCode();
- retval = handleStartCode();
- }
- else // normal HTML markup
- {
- handleStyleEnter(this,m_children,DocStyleChange::Code,&g_token->attribs);
- }
- break;
- case HTML_EMPHASIS:
- handleStyleEnter(this,m_children,DocStyleChange::Italic,&g_token->attribs);
- break;
- case HTML_DIV:
- handleStyleEnter(this,m_children,DocStyleChange::Div,&g_token->attribs);
- break;
- case HTML_SPAN:
- handleStyleEnter(this,m_children,DocStyleChange::Span,&g_token->attribs);
- break;
- case HTML_SUB:
- handleStyleEnter(this,m_children,DocStyleChange::Subscript,&g_token->attribs);
- break;
- case HTML_SUP:
- handleStyleEnter(this,m_children,DocStyleChange::Superscript,&g_token->attribs);
- break;
- case HTML_CENTER:
- handleStyleEnter(this,m_children,DocStyleChange::Center,&g_token->attribs);
- break;
- case HTML_SMALL:
- handleStyleEnter(this,m_children,DocStyleChange::Small,&g_token->attribs);
- break;
- case HTML_PRE:
- handleStyleEnter(this,m_children,DocStyleChange::Preformatted,&g_token->attribs);
- setInsidePreformatted(TRUE);
- //doctokenizerYYsetInsidePre(TRUE);
- break;
- case HTML_P:
- retval=TK_NEWPARA;
- break;
- case HTML_DL:
- {
- DocHtmlDescList *list = new DocHtmlDescList(this,tagHtmlAttribs);
- m_children.append(list);
- retval=list->parse();
- }
- break;
- case HTML_DT:
- retval = RetVal_DescTitle;
- break;
- case HTML_DD:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected tag <dd> found");
- break;
- case HTML_TABLE:
- {
- DocHtmlTable *table = new DocHtmlTable(this,tagHtmlAttribs);
- m_children.append(table);
- retval=table->parse();
- }
- break;
- case HTML_TR:
- retval = RetVal_TableRow;
- break;
- case HTML_TD:
- retval = RetVal_TableCell;
- break;
- case HTML_TH:
- retval = RetVal_TableHCell;
- break;
- case HTML_CAPTION:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected tag <caption> found");
- break;
- case HTML_BR:
- {
- DocLineBreak *lb = new DocLineBreak(this);
- m_children.append(lb);
- }
- break;
- case HTML_HR:
- {
- DocHorRuler *hr = new DocHorRuler(this);
- m_children.append(hr);
- }
- break;
- case HTML_A:
- retval=handleAHref(this,m_children,tagHtmlAttribs);
- break;
- case HTML_H1:
- retval=handleHtmlHeader(tagHtmlAttribs,1);
- break;
- case HTML_H2:
- retval=handleHtmlHeader(tagHtmlAttribs,2);
- break;
- case HTML_H3:
- retval=handleHtmlHeader(tagHtmlAttribs,3);
- break;
- case HTML_H4:
- retval=handleHtmlHeader(tagHtmlAttribs,4);
- break;
- case HTML_H5:
- retval=handleHtmlHeader(tagHtmlAttribs,5);
- break;
- case HTML_H6:
- retval=handleHtmlHeader(tagHtmlAttribs,6);
- break;
- case HTML_IMG:
- {
- HtmlAttribListIterator li(tagHtmlAttribs);
- HtmlAttrib *opt;
- bool found=FALSE;
- int index=0;
- for (li.toFirst();(opt=li.current());++li,++index)
- {
- //printf("option name=%s value=%s\n",opt->name.data(),opt->value.data());
- if (opt->name=="src" && !opt->value.isEmpty())
- {
- // copy attributes
- HtmlAttribList attrList = tagHtmlAttribs;
- // and remove the href attribute
- bool result = attrList.remove(index);
- ASSERT(result);
- DocImage *img = new DocImage(this,attrList,opt->value,DocImage::Html);
- m_children.append(img);
- found = TRUE;
- }
- }
- if (!found)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: IMG tag does not have a SRC attribute!\n");
- }
- }
- break;
-
- case XML_SUMMARY:
- case XML_REMARKS:
- case XML_VALUE:
- case XML_PARA:
- if (!m_children.isEmpty())
- {
- retval = TK_NEWPARA;
- }
- break;
- case XML_EXAMPLE:
- case XML_DESCRIPTION:
- break;
- case XML_C:
- handleStyleEnter(this,m_children,DocStyleChange::Code,&g_token->attribs);
- break;
- case XML_PARAM:
- {
- QString paramName;
- if (findAttribute(tagHtmlAttribs,"name",&paramName))
- {
- retval = handleParamSection(paramName,DocParamSect::Param,TRUE);
- }
- else
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Missing 'name' attribute from <param> tag.");
- }
- }
- break;
- case XML_PARAMREF:
- {
- QString paramName;
- if (findAttribute(tagHtmlAttribs,"name",&paramName))
- {
- m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Italic,TRUE));
- retval=handleStyleArgument(this,m_children,paramName);
- m_children.append(new DocStyleChange(this,g_nodeStack.count(),DocStyleChange::Italic,FALSE));
- if (retval!=TK_WORD) m_children.append(new DocWhiteSpace(this," "));
- }
- else
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Missing 'name' attribute from <paramref> tag.");
- }
- }
- break;
- case XML_EXCEPTION:
- {
- QString exceptName;
- if (findAttribute(tagHtmlAttribs,"cref",&exceptName))
- {
- retval = handleParamSection(exceptName,DocParamSect::Exception,TRUE);
- }
- else
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Missing 'name' attribute from <exception> tag.");
- }
- }
- break;
- case XML_ITEM:
- if (!insideUL(this) && !insideOL(this))
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: lonely <item> tag found");
- }
- else
- {
- retval=RetVal_ListItem;
- }
- break;
- case XML_RETURNS:
- retval = handleSimpleSection(DocSimpleSect::Return,TRUE);
- g_hasReturnCommand=TRUE;
- break;
- 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
- // can we expect from Microsoft...)
- {
- QString cref;
- if (findAttribute(tagHtmlAttribs,"cref",&cref))
- {
- DocRef *ref = new DocRef(this,cref);
- m_children.append(ref);
- }
- else
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Missing 'cref' attribute from <see> tag.");
- }
- }
- break;
- case XML_SEEALSO:
- {
- QString cref;
- if (findAttribute(tagHtmlAttribs,"cref",&cref))
- {
- // Look for an existing "see" section
- DocSimpleSect *ss=0;
- QListIterator<DocNode> cli(m_children);
- DocNode *n;
- for (cli.toFirst();(n=cli.current());++cli)
- {
- if (n->kind()==Kind_SimpleSect && ((DocSimpleSect *)n)->type()==DocSimpleSect::See)
- {
- ss = (DocSimpleSect *)n;
- }
- }
-
- if (!ss) // start new section
- {
- ss=new DocSimpleSect(this,DocSimpleSect::See);
- m_children.append(ss);
- }
-
- ss->appendLinkWord(cref);
- retval = RetVal_OK;
- }
- else
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Missing 'cref' attribute from <seealso> tag.");
- }
- }
- break;
- case XML_LIST:
- {
- QString type;
- DocHtmlList::Type listType = DocHtmlList::Unordered;
- if (findAttribute(tagHtmlAttribs,"type",&type) && type=="number")
- {
- listType=DocHtmlList::Ordered;
- }
- DocHtmlList *list = new DocHtmlList(this,tagHtmlAttribs,listType);
- m_children.append(list);
- retval=list->parseXml();
- }
- break;
- case XML_INCLUDE:
- case XML_PERMISSION:
- // These tags are defined in .Net but are currently unsupported
- break;
- case HTML_UNKNOWN:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unsupported xml/html tag <%s> found", tagName.data());
- m_children.append(new DocWord(this, "<"+tagName+tagHtmlAttribs.toString()+">"));
- break;
- default:
- // we should not get here!
- ASSERT(0);
- break;
- }
- return retval;
-}
-
-int DocPara::handleHtmlEndTag(const QString &tagName)
-{
- DBG(("handleHtmlEndTag(%s)\n",tagName.data()));
- int tagId = Mappers::htmlTagMapper->map(tagName);
- int retval=RetVal_OK;
- switch (tagId)
- {
- case HTML_UL:
- if (!insideUL(this))
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: found </ul> tag without matching <ul>");
- }
- else
- {
- retval=RetVal_EndList;
- }
- break;
- case HTML_OL:
- if (!insideOL(this))
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: found </ol> tag without matching <ol>");
- }
- else
- {
- retval=RetVal_EndList;
- }
- break;
- case HTML_LI:
- if (!insideLI(this))
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: found </li> tag without matching <li>");
- }
- else
- {
- // ignore </li> tags
- }
- break;
- //case HTML_PRE:
- // if (!insidePRE(this))
- // {
- // warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: found </pre> tag without matching <pre>");
- // }
- // else
- // {
- // retval=RetVal_EndPre;
- // }
- // break;
- case HTML_BOLD:
- handleStyleLeave(this,m_children,DocStyleChange::Bold,"b");
- break;
- case HTML_CODE:
- handleStyleLeave(this,m_children,DocStyleChange::Code,"code");
- break;
- case HTML_EMPHASIS:
- handleStyleLeave(this,m_children,DocStyleChange::Italic,"em");
- break;
- case HTML_DIV:
- handleStyleLeave(this,m_children,DocStyleChange::Div,"div");
- break;
- case HTML_SPAN:
- handleStyleLeave(this,m_children,DocStyleChange::Span,"span");
- break;
- case HTML_SUB:
- handleStyleLeave(this,m_children,DocStyleChange::Subscript,"sub");
- break;
- case HTML_SUP:
- handleStyleLeave(this,m_children,DocStyleChange::Superscript,"sup");
- break;
- case HTML_CENTER:
- handleStyleLeave(this,m_children,DocStyleChange::Center,"center");
- break;
- case HTML_SMALL:
- handleStyleLeave(this,m_children,DocStyleChange::Small,"small");
- break;
- case HTML_PRE:
- handleStyleLeave(this,m_children,DocStyleChange::Preformatted,"pre");
- setInsidePreformatted(FALSE);
- //doctokenizerYYsetInsidePre(FALSE);
- break;
- case HTML_P:
- // ignore </p> tag
- break;
- case HTML_DL:
- retval=RetVal_EndDesc;
- break;
- case HTML_DT:
- // ignore </dt> tag
- break;
- case HTML_DD:
- // ignore </dd> tag
- break;
- case HTML_TABLE:
- retval=RetVal_EndTable;
- break;
- case HTML_TR:
- // ignore </tr> tag
- break;
- case HTML_TD:
- // ignore </td> tag
- break;
- case HTML_TH:
- // ignore </th> tag
- break;
- case HTML_CAPTION:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected tag </caption> found");
- break;
- case HTML_BR:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Illegal </br> tag found\n");
- break;
- case HTML_H1:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected tag </h1> found");
- break;
- case HTML_H2:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected tag </h2> found");
- break;
- case HTML_H3:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected tag </h3> found");
- break;
- case HTML_IMG:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected tag </img> found");
- break;
- case HTML_HR:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected tag </hr> found");
- break;
- case HTML_A:
- //warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected tag </a> found");
- // ignore </a> tag (can be part of <a name=...></a>
- break;
-
- case XML_SUMMARY:
- case XML_REMARKS:
- case XML_PARA:
- case XML_VALUE:
- case XML_LIST:
- case XML_EXAMPLE:
- case XML_PARAM:
- case XML_RETURNS:
- case XML_SEEALSO:
- case XML_EXCEPTION:
- retval = RetVal_CloseXml;
- break;
- case XML_C:
- handleStyleLeave(this,m_children,DocStyleChange::Code,"c");
- break;
- case XML_ITEM:
- case XML_INCLUDE:
- case XML_PERMISSION:
- case XML_DESCRIPTION:
- case XML_PARAMREF:
- // These tags are defined in .Net but are currently unsupported
- break;
- case HTML_UNKNOWN:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unsupported xml/html tag </%s> found", tagName.data());
- 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",tagName.data());
- ASSERT(0);
- break;
- }
- return retval;
-}
-
-int DocPara::parse()
-{
- DBG(("DocPara::parse() start\n"));
- g_nodeStack.push(this);
- // handle style commands "inherited" from the previous paragraph
- handleInitialStyleCommands(this,m_children);
- int tok;
- int retval=0;
- while ((tok=doctokenizerYYlex())) // get the next token
- {
-reparsetoken:
- DBG(("token %s at %d",tokToString(tok),doctokenizerYYlineno));
- if (tok==TK_WORD || tok==TK_LNKWORD || tok==TK_SYMBOL || tok==TK_URL ||
- tok==TK_COMMAND || tok==TK_HTMLTAG
- )
- {
- DBG((" name=%s",g_token->name.data()));
- }
- DBG(("\n"));
- switch(tok)
- {
- case TK_WORD:
- m_children.append(new DocWord(this,g_token->name));
- break;
- case TK_LNKWORD:
- handleLinkedWord(this,m_children);
- break;
- case TK_URL:
- m_children.append(new DocURL(this,g_token->name,g_token->isEMailAddr));
- break;
- case TK_WHITESPACE:
- {
- // prevent leading whitespace and collapse multiple whitespace areas
- DocNode::Kind k;
- if (insidePRE(this) || // all whitespace is relevant
- (
- // remove leading whitespace
- !m_children.isEmpty() &&
- // and whitespace after certain constructs
- (k=m_children.last()->kind())!=DocNode::Kind_HtmlDescList &&
- k!=DocNode::Kind_HtmlTable &&
- k!=DocNode::Kind_HtmlList &&
- k!=DocNode::Kind_SimpleSect &&
- k!=DocNode::Kind_AutoList &&
- k!=DocNode::Kind_SimpleList &&
- /*k!=DocNode::Kind_Verbatim &&*/
- k!=DocNode::Kind_HtmlHeader &&
- k!=DocNode::Kind_ParamSect &&
- k!=DocNode::Kind_XRefItem
- )
- )
- {
- m_children.append(new DocWhiteSpace(this,g_token->chars));
- }
- }
- break;
- case TK_LISTITEM:
- {
- DBG(("found list item at %d parent=%d\n",g_token->indent,parent()->kind()));
- DocNode *n=parent();
- while (n && n->kind()!=DocNode::Kind_AutoList) n=n->parent();
- if (n) // we found an auto list up in the hierarchy
- {
- DocAutoList *al = (DocAutoList *)n;
- DBG(("previous list item at %d\n",al->indent()));
- if (al->indent()>=g_token->indent)
- // new item at the same or lower indent level
- {
- retval=TK_LISTITEM;
- goto endparagraph;
- }
- }
-
- // determine list depth
- int depth = 0;
- n=parent();
- while(n) {
- if(n->kind() == DocNode::Kind_AutoList) ++depth;
- n=n->parent();
- }
-
- // first item or sub list => create new list
- DocAutoList *al=0;
- do
- {
- al = new DocAutoList(this,g_token->indent,g_token->isEnumList,
- depth);
- m_children.append(al);
- retval = al->parse();
- } while (retval==TK_LISTITEM && // new list
- al->indent()==g_token->indent // at same indent level
- );
-
- // check the return value
- if (retval==RetVal_SimpleSec) // auto list ended due to simple section command
- {
- // Reparse the token that ended the section at this level,
- // so a new simple section will be started at this level.
- // This is the same as unputting the last read token and continuing.
- g_token->name = g_token->simpleSectName;
- tok = TK_COMMAND;
- DBG(("reparsing command %s\n",g_token->name.data()));
- goto reparsetoken;
- }
- else if (retval==TK_ENDLIST)
- {
- if (al->indent()>g_token->indent) // end list
- {
- goto endparagraph;
- }
- else // continue with current paragraph
- {
- }
- }
- else // paragraph ended due to TK_NEWPARA, TK_LISTITEM, or EOF
- {
- goto endparagraph;
- }
- }
- break;
- case TK_ENDLIST:
- DBG(("Found end of list inside of paragraph at line %d\n",doctokenizerYYlineno));
- if (parent()->kind()==DocNode::Kind_AutoListItem)
- {
- ASSERT(parent()->parent()->kind()==DocNode::Kind_AutoList);
- DocAutoList *al = (DocAutoList *)parent()->parent();
- if (al->indent()>=g_token->indent)
- {
- // end of list marker ends this paragraph
- retval=TK_ENDLIST;
- goto endparagraph;
- }
- else
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: End of list marker found "
- "has invalid indent level");
- }
- }
- else
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: End of list marker found without any preceding "
- "list items");
- }
- break;
- case TK_COMMAND:
- {
- // 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 &&
- n->kind()!=DocNode::Kind_ParamSect
- )
- {
- n=n->parent();
- }
- if (cmd&SIMPLESECT_BIT)
- {
- if (n) // already in a simple section
- {
- // simple section cannot start in this paragraph, need
- // to unwind the stack and remember the command.
- g_token->simpleSectName = g_token->name.copy();
- retval=RetVal_SimpleSec;
- goto endparagraph;
- }
- }
- // see if we are in a simple list
- n=parent();
- while (n && n->kind()!=DocNode::Kind_SimpleListItem) n=n->parent();
- if (n)
- {
- if (cmd==CMD_LI)
- {
- retval=RetVal_ListItem;
- goto endparagraph;
- }
- }
-
- // handle the command
- retval=handleCommand(g_token->name.copy());
- DBG(("handleCommand returns %x\n",retval));
-
- // check the return value
- if (retval==RetVal_SimpleSec)
- {
- // Reparse the token that ended the section at this level,
- // so a new simple section will be started at this level.
- // This is the same as unputting the last read token and continuing.
- g_token->name = g_token->simpleSectName;
- tok = TK_COMMAND;
- DBG(("reparsing command %s\n",g_token->name.data()));
- goto reparsetoken;
- }
- else if (retval==RetVal_OK)
- {
- // the command ended normally, keep scanning for new tokens.
- retval = 0;
- }
- else if (retval==TK_LISTITEM || retval==TK_ENDLIST || retval==TK_WORD)
- {
- tok = retval;
- goto reparsetoken;
- }
- else // end of file, end of paragraph, start or end of section
- // or some auto list marker
- {
- goto endparagraph;
- }
- }
- break;
- case TK_HTMLTAG:
- {
- if (!g_token->endTag) // found a start tag
- {
- retval = handleHtmlStartTag(g_token->name,g_token->attribs);
- }
- else // found an end tag
- {
- retval = handleHtmlEndTag(g_token->name);
- }
- if (retval==RetVal_OK)
- {
- // the command ended normally, keep scanner for new tokens.
- retval = 0;
- }
- else
- {
- goto endparagraph;
- }
- }
- break;
- case TK_SYMBOL:
- {
- char letter='\0';
- DocSymbol::SymType s = DocSymbol::decodeSymbol(g_token->name,&letter);
- if (s!=DocSymbol::Unknown)
- {
- m_children.append(new DocSymbol(this,s,letter));
- }
- else
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unsupported symbol %s found",
- g_token->name.data());
- }
- break;
- }
- case TK_NEWPARA:
- retval=TK_NEWPARA;
- goto endparagraph;
- case TK_RCSTAG:
- {
- DocSimpleSect *ss=new DocSimpleSect(this,DocSimpleSect::Rcs);
- m_children.append(ss);
- ss->parseRcs();
- }
- break;
- default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,
- "Warning: Found unexpected token (id=%x)\n",tok);
- break;
- }
- }
- retval=0;
-endparagraph:
- handlePendingStyleCommands(this,m_children);
- DocNode *n = g_nodeStack.pop();
- ASSERT(n==this);
- DBG(("DocPara::parse() end retval=%x\n",retval));
- INTERNAL_ASSERT(retval==0 || retval==TK_NEWPARA || retval==TK_LISTITEM ||
- retval==TK_ENDLIST || retval>RetVal_OK
- );
-
- return retval;
-}
-
-//--------------------------------------------------------------------------
-
-int DocSection::parse()
-{
- DBG(("DocSection::parse() start %s level=%d\n",g_token->sectionId.data(),m_level));
- int retval=RetVal_OK;
- g_nodeStack.push(this);
-
- SectionInfo *sec;
- if (!m_id.isEmpty())
- {
- sec=Doxygen::sectionDict[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->insert(m_id,sec);
- }
- }
- }
-
- // first parse any number of paragraphs
- bool isFirst=TRUE;
- DocPara *lastPar=0;
- do
- {
- DocPara *par = new DocPara(this);
- if (isFirst) { par->markFirst(); isFirst=FALSE; }
- retval=par->parse();
- if (!par->isEmpty())
- {
- m_children.append(par);
- lastPar=par;
- }
- else
- {
- delete par;
- }
- if (retval==TK_LISTITEM)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Invalid list item found");
- }
- } while (retval!=0 &&
- retval!=RetVal_Internal &&
- retval!=RetVal_Section &&
- retval!=RetVal_Subsection &&
- retval!=RetVal_Subsubsection &&
- retval!=RetVal_Paragraph
- );
-
- if (lastPar) lastPar->markLast();
-
- if (retval==RetVal_Subsection && m_level==1)
- {
- // 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,2,g_token->sectionId);
- m_children.append(s);
- retval = s->parse();
- }
- }
- else if (retval==RetVal_Subsubsection && m_level==2)
- {
- // 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,3,g_token->sectionId);
- m_children.append(s);
- retval = s->parse();
- }
- }
- else if (retval==RetVal_Paragraph && m_level==3)
- {
- // 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,4,g_token->sectionId);
- m_children.append(s);
- retval = s->parse();
- }
- }
- else if ((m_level<=1 && retval==RetVal_Subsubsection) ||
- (m_level<=2 && retval==RetVal_Paragraph)
- )
- {
- int level;
- if (retval==RetVal_Subsection) level=2;
- else if (retval==RetVal_Subsubsection) level=3;
- else level=4;
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected %s "
- "command found inside %s!",
- sectionLevelToName[level],sectionLevelToName[m_level]);
- retval=0; // stop parsing
-
- }
- else if (retval==RetVal_Internal)
- {
- DocInternal *in = new DocInternal(this);
- m_children.append(in);
- retval = in->parse(m_level+1);
- }
- else
- {
- }
-
- INTERNAL_ASSERT(retval==0 ||
- retval==RetVal_Section ||
- retval==RetVal_Subsection ||
- retval==RetVal_Subsubsection ||
- retval==RetVal_Paragraph ||
- retval==RetVal_Internal
- );
-
- DBG(("DocSection::parse() end\n"));
- DocNode *n = g_nodeStack.pop();
- ASSERT(n==this);
- return retval;
-}
-
-//--------------------------------------------------------------------------
-
-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:
- m_children.append(new DocWord(this,g_token->name));
- break;
- case TK_WHITESPACE:
- m_children.append(new DocWhiteSpace(this,g_token->chars));
- break;
- case TK_SYMBOL:
- {
- char letter='\0';
- DocSymbol::SymType s = DocSymbol::decodeSymbol(g_token->name,&letter);
- if (s!=DocSymbol::Unknown)
- {
- m_children.append(new DocSymbol(this,s,letter));
- }
- else
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unsupported symbol %s found",
- g_token->name.data());
- }
- }
- break;
- case TK_COMMAND:
- switch (Mappers::cmdMapper->map(g_token->name))
- {
- case CMD_BSLASH:
- m_children.append(new DocSymbol(this,DocSymbol::BSlash));
- break;
- case CMD_AT:
- m_children.append(new DocSymbol(this,DocSymbol::At));
- break;
- case CMD_LESS:
- m_children.append(new DocSymbol(this,DocSymbol::Less));
- break;
- case CMD_GREATER:
- m_children.append(new DocSymbol(this,DocSymbol::Greater));
- break;
- case CMD_AMP:
- m_children.append(new DocSymbol(this,DocSymbol::Amp));
- break;
- case CMD_DOLLAR:
- m_children.append(new DocSymbol(this,DocSymbol::Dollar));
- break;
- case CMD_HASH:
- m_children.append(new DocSymbol(this,DocSymbol::Hash));
- break;
- case CMD_PERCENT:
- m_children.append(new DocSymbol(this,DocSymbol::Percent));
- break;
- default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected command `%s' found",
- g_token->name.data());
- break;
- }
- break;
- default:
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Unexpected token %s",
- tokToString(tok));
- break;
- }
- }
-
- handleUnclosedStyleCommands();
-
- DocNode *n = g_nodeStack.pop();
- ASSERT(n==this);
- DBG(("DocText::parse() end\n"));
-}
-
-
-//--------------------------------------------------------------------------
-
-void DocRoot::parse()
-{
- DBG(("DocRoot::parse() start\n"));
- g_nodeStack.push(this);
- doctokenizerYYsetStatePara();
- int retval=0;
-
- // first parse any number of paragraphs
- bool isFirst=TRUE;
- DocPara *lastPar=0;
- do
- {
- DocPara *par = new DocPara(this);
- if (isFirst) { par->markFirst(); isFirst=FALSE; }
- retval=par->parse();
- if (!par->isEmpty())
- {
- m_children.append(par);
- lastPar=par;
- }
- else
- {
- delete par;
- }
- if (retval==TK_LISTITEM)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Invalid list item found");
- }
- else if (retval==RetVal_Subsection)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: found subsection command outside of section context!");
- }
- else if (retval==RetVal_Subsubsection)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: found subsubsection command outside of subsection context!");
- }
- else if (retval==RetVal_Paragraph)
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: found paragraph command outside of subsubsection context!");
- }
- } while (retval!=0 && retval!=RetVal_Section && retval!=RetVal_Internal);
- if (lastPar) lastPar->markLast();
-
- // then parse any number of level1 sections
- while (retval==RetVal_Section)
- {
- SectionInfo *sec=Doxygen::sectionDict[g_token->sectionId];
- if (sec)
- {
- DocSection *s=new DocSection(this,1,g_token->sectionId);
- m_children.append(s);
- retval = s->parse();
- }
- else
- {
- warn_doc_error(g_fileName,doctokenizerYYlineno,"Warning: Invalid section id `%s'; ignoring section",g_token->sectionId.data());
- retval = 0;
- }
- }
-
- if (retval==RetVal_Internal)
- {
- DocInternal *in = new DocInternal(this);
- m_children.append(in);
- retval = in->parse(1);
- }
-
-
- handleUnclosedStyleCommands();
-
- DocNode *n = g_nodeStack.pop();
- ASSERT(n==this);
- DBG(("DocRoot::parse() end\n"));
-}
-
-//--------------------------------------------------------------------------
-
-DocNode *validatingParseDoc(const char *fileName,int startLine,
- Definition *ctx,MemberDef *md,
- const char *input,bool indexWords,
- bool isExample, const char *exampleName,
- bool singleLine, bool linkFromIndex)
-{
-
- //printf("validatingParseDoc(%s,%s)\n",ctx?ctx->name().data():"<none>",
- // md?md->name().data():"<none>");
- //printf("========== validating %s at line %d\n",fileName,startLine);
- //printf("---------------- input --------------------\n%s\n----------- end input -------------------\n",input);
- g_token = new TokenInfo;
-
- if (ctx &&
- (ctx->definitionType()==Definition::TypeClass ||
- ctx->definitionType()==Definition::TypeNamespace
- )
- )
- {
- g_context = ctx->name();
- }
- else if (ctx && ctx->definitionType()==Definition::TypePage)
- {
- g_context = ctx->getOuterScope()->name();
- }
- else
- {
- g_context = "";
- }
-
- if (indexWords && md && Config_getBool("SEARCHENGINE"))
- {
- g_searchUrl=md->getOutputFileBase();
- Doxygen::searchIndex->setCurrentDoc(
- theTranslator->trMember(TRUE,TRUE)+" "+md->qualifiedName(),
- g_searchUrl,
- md->anchor());
- }
- else if (indexWords && ctx && Config_getBool("SEARCHENGINE"))
- {
- g_searchUrl=ctx->getOutputFileBase();
- QCString name = ctx->qualifiedName();
- if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
- {
- name = substitute(name,"::",".");
- }
- switch (ctx->definitionType())
- {
- case Definition::TypePage:
- {
- PageDef *pd = (PageDef *)ctx;
- if (!pd->title().isEmpty())
- {
- name = theTranslator->trPage(TRUE,TRUE)+" "+pd->title();
- }
- else
- {
- name = theTranslator->trPage(TRUE,TRUE)+" "+pd->name();
- }
- }
- break;
- case Definition::TypeClass:
- {
- ClassDef *cd = (ClassDef *)ctx;
- name.prepend(cd->compoundTypeString()+" ");
- }
- break;
- case Definition::TypeNamespace:
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
- {
- name = theTranslator->trPackage(name);
- }
- else
- {
- name.prepend(theTranslator->trNamespace(TRUE,TRUE)+" ");
- }
- }
- break;
- case Definition::TypeGroup:
- {
- GroupDef *gd = (GroupDef *)ctx;
- if (gd->groupTitle())
- {
- name = theTranslator->trGroup(TRUE,TRUE)+" "+gd->groupTitle();
- }
- else
- {
- name.prepend(theTranslator->trGroup(TRUE,TRUE)+" ");
- }
- }
- break;
- default:
- break;
- }
- Doxygen::searchIndex->setCurrentDoc(name,g_searchUrl);
- }
- else
- {
- g_searchUrl="";
- }
-
- g_fileName = fileName;
- g_relPath = (!linkFromIndex && ctx) ?
- QString(relativePathToRoot(ctx->getOutputFileBase())) :
- QString("");
- //printf("ctx->name=%s relPath=%s\n",ctx->name().data(),g_relPath.data());
- g_memberDef = md;
- g_nodeStack.clear();
- g_styleStack.clear();
- g_initialStyleStack.clear();
- g_inSeeBlock = FALSE;
- g_insideHtmlLink = FALSE;
- g_includeFileText = "";
- g_includeFileOffset = 0;
- g_includeFileLength = 0;
- g_isExample = isExample;
- g_exampleName = exampleName;
- g_hasParamCommand = FALSE;
- g_hasReturnCommand = FALSE;
- g_paramsFound.setAutoDelete(FALSE);
- g_paramsFound.clear();
- g_sectionDict = 0; //sections;
-
- //printf("Starting comment block at %s:%d\n",g_fileName.data(),startLine);
- doctokenizerYYlineno=startLine;
- doctokenizerYYinit(input,g_fileName);
-
- // build abstract syntax tree
- DocRoot *root = new DocRoot(md!=0,singleLine);
- root->parse();
-
- if (Debug::isFlagSet(Debug::PrintTree))
- {
- // pretty print the result
- PrintDocVisitor *v = new PrintDocVisitor;
- root->accept(v);
- delete v;
- }
-
- checkUndocumentedParams();
- detectNoDocumentedParams();
-
- delete g_token;
-
- // TODO: These should be called at the end of the program.
- //doctokenizerYYcleanup();
- //Mappers::cmdMapper->freeInstance();
- //Mappers::htmlTagMapper->freeInstance();
-
- return root;
-}
-
-DocNode *validatingParseText(const char *input)
-{
- //printf("------------ input ---------\n%s\n"
- // "------------ end input -----\n",input);
- g_token = new TokenInfo;
- g_context = "";
- g_fileName = "<parseText>";
- g_relPath = "";
- g_memberDef = 0;
- g_nodeStack.clear();
- g_styleStack.clear();
- g_initialStyleStack.clear();
- g_inSeeBlock = FALSE;
- g_insideHtmlLink = FALSE;
- g_includeFileText = "";
- g_includeFileOffset = 0;
- g_includeFileLength = 0;
- g_isExample = FALSE;
- g_exampleName = "";
- g_hasParamCommand = FALSE;
- g_hasReturnCommand = FALSE;
- g_paramsFound.setAutoDelete(FALSE);
- g_paramsFound.clear();
- g_searchUrl="";
-
- DocText *txt = new DocText;
-
- if (input)
- {
- doctokenizerYYlineno=1;
- doctokenizerYYinit(input,g_fileName);
-
- // build abstract syntax tree
- txt->parse();
-
- if (Debug::isFlagSet(Debug::PrintTree))
- {
- // pretty print the result
- PrintDocVisitor *v = new PrintDocVisitor;
- txt->accept(v);
- delete v;
- }
- }
-
- delete g_token;
-
- return txt;
-}
-
-void docFindSections(const char *input,
- Definition *d,
- MemberGroup *mg,
- const char *fileName)
-{
- doctokenizerYYFindSections(input,d,mg,fileName);
-}
-
-void initDocParser()
-{
- if (Config_getBool("SEARCHENGINE"))
- {
- Doxygen::searchIndex = new SearchIndex;
- }
- else
- {
- Doxygen::searchIndex = 0;
- }
-}
diff --git a/src/docparser.h b/src/docparser.h
deleted file mode 100644
index 8befd6a..0000000
--- a/src/docparser.h
+++ /dev/null
@@ -1,1233 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 _DOCPARSER_H
-#define _DOCPARSER_H
-
-#include <stdio.h>
-
-#include <qlist.h>
-#include <qstrlist.h>
-#include <qstring.h>
-
-#include "docvisitor.h"
-#include "htmlattrib.h"
-
-class DocNode;
-class MemberDef;
-class Definition;
-class MemberGroup;
-class SectionDict;
-
-//---------------------------------------------------------------------------
-
-/*! Initialize the documentation parser */
-void initDocParser();
-
-/*! Main entry point for the documentation parser.
- * @param fileName File in which the documentation block is found (or the
- * name of the example file in case isExample is TRUE).
- * @param startLine Line at which the documentation block is found.
- * @param context Class or namespace to which this block belongs.
- * @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
- * 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).
- * @param singleLine Output should be presented on a single line, so without
- * starting a new paragraph at the end.
- * @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.
- * @returns Root node of the abstract syntax tree. Ownership of the
- * pointer is handed over to the caller.
- */
-DocNode *validatingParseDoc(const char *fileName,int startLine,
- Definition *context, MemberDef *md,
- const char *input,bool indexWords,
- bool isExample,const char *exampleName=0,
- bool singleLine=FALSE,bool linkFromIndex=FALSE);
-
-/*! Main entry point for parsing simple text fragments. These
- * fragments are limited to words, whitespace and symbols.
- */
-DocNode *validatingParseText(const char *input);
-
-/*! Searches for section and anchor commands in the input */
-void docFindSections(const char *input,
- Definition *d,
- MemberGroup *m,
- const char *fileName);
-
-//---------------------------------------------------------------------------
-
-/*! @brief Abstract node interface with type information. */
-class DocNode
-{
- public:
- /*! Available node types. */
- 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,
- Kind_StyleChange = 8,
- Kind_SimpleSect = 9,
- Kind_Title = 10,
- Kind_SimpleList = 11,
- Kind_SimpleListItem = 12,
- Kind_Section = 13,
- Kind_Verbatim = 14,
- Kind_XRefItem = 15,
- Kind_HtmlList = 16,
- Kind_HtmlListItem = 17,
- Kind_HtmlDescList = 18,
- Kind_HtmlDescData = 19,
- Kind_HtmlDescTitle = 20,
- Kind_HtmlTable = 21,
- Kind_HtmlRow = 22,
- Kind_HtmlCell = 23,
- Kind_HtmlCaption = 24,
- Kind_LineBreak = 25,
- Kind_HorRuler = 26,
- Kind_Anchor = 27,
- Kind_IndexEntry = 28,
- Kind_Internal = 29,
- Kind_HRef = 30,
- Kind_Include = 31,
- Kind_IncOperator = 32,
- Kind_HtmlHeader = 33,
- Kind_Image = 34,
- Kind_DotFile = 35,
- Kind_Link = 36,
- Kind_Ref = 37,
- Kind_Formula = 38,
- Kind_SecRefItem = 39,
- Kind_SecRefList = 40,
- //Kind_Language = 41,
- Kind_LinkedWord = 42,
- Kind_ParamSect = 43,
- Kind_ParamList = 44,
- Kind_InternalRef = 45,
- Kind_Copy = 46,
- Kind_Text = 47
- };
- /*! Creates a new node */
- DocNode() : m_insidePre(FALSE) {}
-
- /*! Destroys a node. */
- virtual ~DocNode() {}
-
- /*! Returns the kind of node. Provides runtime type information */
- virtual Kind kind() const = 0;
-
- /*! Returns the parent of this node or 0 for the root node. */
- virtual DocNode *parent() const = 0;
-
- /*! Acceptor function for node visitors. Part of the visitor pattern.
- * @param v Abstract visitor.
- */
- virtual void accept(DocVisitor *v) = 0;
-
- /*! Returns TRUE iff this node is inside a preformatted section */
- bool isPreformatted() const { return m_insidePre; }
-
- protected:
- /*! Sets whether or not this item is inside a preformatted section */
- void setInsidePreformatted(bool p) { m_insidePre = p; }
- private:
-
- bool m_insidePre;
-};
-
-/*! @brief Default accept implementation for compound nodes in the abstract
- * syntax tree.
- */
-template<class T> class CompAccept
-{
- public:
- CompAccept() { m_children.setAutoDelete(TRUE); }
- void accept(T *obj, DocVisitor *v)
- {
- v->visitPre(obj);
- QListIterator<DocNode> cli(m_children);
- DocNode *n;
- for (cli.toFirst();(n=cli.current());++cli) n->accept(v);
- v->visitPost(obj);
- }
-
- protected:
- QList<DocNode> m_children;
-};
-
-
-/*! @brief Node representing a word
- */
-class DocWord : public DocNode
-{
- public:
- DocWord(DocNode *parent,const QString &word);
- QString word() const { return m_word; }
- Kind kind() const { return Kind_Word; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { v->visit(this); }
-
- private:
- DocNode *m_parent;
- QString m_word;
-};
-
-/*! @brief Node representing a word that can be linked to something
- */
-class DocLinkedWord : public DocNode
-{
- public:
- DocLinkedWord(DocNode *parent,const QString &word,
- const QString &ref,const QString &file,
- const QString &anchor);
- QString word() const { return m_word; }
- Kind kind() const { return Kind_LinkedWord; }
- DocNode *parent() const { return m_parent; }
- QString file() const { return m_file; }
- QString relPath() const { return m_relPath; }
- QString ref() const { return m_ref; }
- QString anchor() const { return m_anchor; }
- void accept(DocVisitor *v) { v->visit(this); }
-
- private:
- DocNode *m_parent;
- QString m_word;
- QString m_ref;
- QString m_file;
- QString m_relPath;
- QString m_anchor;
-};
-
-/*! @brief Node representing an URL (or email address) */
-class DocURL : public DocNode
-{
- public:
- DocURL(DocNode *parent,const QString &url,bool isEmail) :
- m_parent(parent), m_url(url), m_isEmail(isEmail) {}
- QString url() const { return m_url; }
- Kind kind() const { return Kind_URL; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { v->visit(this); }
- bool isEmail() const { return m_isEmail; }
-
- private:
- DocNode *m_parent;
- QString m_url;
- bool m_isEmail;
-};
-
-/*! @brief Node representing a line break */
-class DocLineBreak : public DocNode
-{
- public:
- DocLineBreak(DocNode *parent) :
- m_parent(parent) {}
- Kind kind() const { return Kind_LineBreak; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { v->visit(this); }
-
- private:
- DocNode *m_parent;
-};
-
-/*! @brief Node representing a horizonal ruler */
-class DocHorRuler : public DocNode
-{
- public:
- DocHorRuler(DocNode *parent) :
- m_parent(parent) {}
- Kind kind() const { return Kind_HorRuler; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { v->visit(this); }
-
- private:
- DocNode *m_parent;
-};
-
-/*! @brief Node representing an anchor */
-class DocAnchor : public DocNode
-{
- public:
- DocAnchor(DocNode *parent,const QString &id,bool newAnchor);
- Kind kind() const { return Kind_Anchor; }
- DocNode *parent() const { return m_parent; }
- QString anchor() const { return m_anchor; }
- QString file() const { return m_file; }
- void accept(DocVisitor *v) { v->visit(this); }
-
- private:
- DocNode *m_parent;
- QString m_anchor;
- QString m_file;
-};
-
-/*! @brief Node representing a style change */
-class DocStyleChange : public DocNode
-{
- public:
- enum Style { Bold, Italic, Code, Center, Small,
- Subscript, Superscript, Preformatted,
- Span, Div
- };
- DocStyleChange(DocNode *parent,uint position,Style s,bool enable,
- const HtmlAttribList *attribs=0) :
- m_parent(parent), m_position(position), m_style(s), m_enable(enable)
- { if (attribs) m_attribs=*attribs; }
- Kind kind() const { return Kind_StyleChange; }
- Style style() const { return m_style; }
- const char *styleString() const;
- bool enable() const { return m_enable; }
- uint position() const { return m_position; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { v->visit(this); }
- const HtmlAttribList &attribs() const { return m_attribs; }
-
- private:
- DocNode *m_parent;
- uint m_position;
- Style m_style;
- bool m_enable;
- HtmlAttribList m_attribs;
-};
-
-/*! @brief Node representing a special symbol */
-class DocSymbol : public DocNode
-{
- public:
- enum SymType { Unknown=0, BSlash,At,Less,Greater,Amp,Dollar,Hash,Percent,
- Copy, Tm, Reg, Apos, Quot, Uml, Acute, Grave, Circ, Tilde, Szlig,
- Cedil, Ring, Nbsp, Slash
- };
- DocSymbol(DocNode *parent,SymType s,char letter='\0') :
- m_parent(parent), m_symbol(s), m_letter(letter) {}
- SymType symbol() const { return m_symbol; }
- char letter() const { return m_letter; }
- Kind kind() const { return Kind_Symbol; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { v->visit(this); }
- static SymType decodeSymbol(const QString &symName,char *letter);
-
- private:
- DocNode *m_parent;
- SymType m_symbol;
- char m_letter;
-};
-
-/*! @brief Node representing some amount of white space */
-class DocWhiteSpace : public DocNode
-{
- public:
- DocWhiteSpace(DocNode *parent,const QString &chars) :
- m_parent(parent), m_chars(chars) {}
- Kind kind() const { return Kind_WhiteSpace; }
- QString chars() const { return m_chars; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { v->visit(this); }
- private:
- DocNode *m_parent;
- QString m_chars;
-};
-
-/*! @brief Node representing a verbatim, unparsed text fragment */
-class DocVerbatim : public DocNode
-{
- public:
- enum Type { Code, HtmlOnly, ManOnly, LatexOnly, XmlOnly, Verbatim, Dot };
- DocVerbatim(DocNode *parent,const QString &context,
- const QString &text, Type t,bool isExample,
- const QString &exampleFile);
- Kind kind() const { return Kind_Verbatim; }
- Type type() const { return m_type; }
- QString text() const { return m_text; }
- QString context() const { return m_context; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { v->visit(this); }
- bool isExample() const { return m_isExample; }
- QString exampleFile() const { return m_exampleFile; }
- QString relPath() const { return m_relPath; }
-
- private:
- DocNode *m_parent;
- QString m_context;
- QString m_text;
- Type m_type;
- bool m_isExample;
- QString m_exampleFile;
- QString m_relPath;
-};
-
-
-/*! @brief Node representing an included text block from file */
-class DocInclude : public DocNode
-{
- public:
- enum Type { Include, DontInclude, VerbInclude, HtmlInclude, IncWithLines };
- DocInclude(DocNode *parent,const QString &file,
- const QString context, Type t,
- bool isExample,const QString exampleFile) :
- m_parent(parent), m_file(file), m_context(context), m_type(t),
- m_isExample(isExample), m_exampleFile(exampleFile) {}
- Kind kind() const { return Kind_Include; }
- QString file() const { return m_file; }
- QString extension() const { int i=m_file.findRev('.');
- if (i!=-1)
- return m_file.right(m_file.length()-i);
- else
- return "";
- }
- Type type() const { return m_type; }
- QString text() const { return m_text; }
- QString context() const { return m_context; }
- DocNode *parent() const { return m_parent; }
- bool isExample() const { return m_isExample; }
- QString exampleFile() const { return m_exampleFile; }
- void accept(DocVisitor *v) { v->visit(this); }
- void parse();
-
- private:
- DocNode *m_parent;
- QString m_file;
- QString m_context;
- QString m_text;
- Type m_type;
- bool m_isExample;
- QString m_exampleFile;
-};
-
-/*! @brief Node representing a include/dontinclude operator block */
-class DocIncOperator : public DocNode
-{
- public:
- enum Type { Line, SkipLine, Skip, Until };
- DocIncOperator(DocNode *parent,Type t,const QString &pat,
- const QString &context,bool isExample,const QString &exampleFile) :
- m_parent(parent), m_type(t), m_pattern(pat), m_context(context),
- m_isFirst(FALSE), m_isLast(FALSE),
- m_isExample(isExample), m_exampleFile(exampleFile) {}
- Kind kind() const { return Kind_IncOperator; }
- Type type() const { return m_type; }
- QString text() const { return m_text; }
- QString pattern() const { return m_pattern; }
- QString context() const { return m_context; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { v->visit(this); }
- bool isFirst() const { return m_isFirst; }
- bool isLast() const { return m_isLast; }
- void markFirst(bool v=TRUE) { m_isFirst = v; }
- void markLast(bool v=TRUE) { m_isLast = v; }
- bool isExample() const { return m_isExample; }
- QString exampleFile() const { return m_exampleFile; }
- void parse();
-
- private:
- DocNode *m_parent;
- Type m_type;
- QString m_text;
- QString m_pattern;
- QString m_context;
- bool m_isFirst;
- bool m_isLast;
- bool m_isExample;
- QString m_exampleFile;
-};
-
-/*! @brief Node representing an item of a cross-referenced list */
-class DocFormula : public DocNode
-{
- public:
- DocFormula(DocNode *parent,int id);
- Kind kind() const { return Kind_Formula; }
- QString name() const { return m_name; }
- QString text() const { return m_text; }
- QString relPath() const { return m_relPath; }
- int id() const { return m_id; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { v->visit(this); }
-
- private:
- DocNode *m_parent;
- QString m_name;
- QString m_text;
- QString m_relPath;
- int m_id;
-};
-
-/*! @brief Node representing an entry in the index. */
-class DocIndexEntry : public DocNode
-{
- public:
- DocIndexEntry(DocNode *parent) : m_parent(parent) { }
- Kind kind() const { return Kind_IndexEntry; }
- int parse();
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { v->visit(this); }
- QString entry() { return m_entry; }
-
- private:
- DocNode *m_parent;
- QString m_entry;
-};
-
-//-----------------------------------------------------------------------
-
-/*! @brief Node representing a entry in the index. */
-class DocCopy : public CompAccept<DocCopy>, public DocNode
-{
- public:
- DocCopy(DocNode *parent,const QString &link)
- : m_parent(parent), m_link(link) { }
- Kind kind() const { return Kind_IndexEntry; }
- QString link() const { return m_link; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { CompAccept<DocCopy>::accept(this,v); }
- void parse();
-
- private:
- DocNode *m_parent;
- QString m_link;
-};
-
-/*! @brief Node representing an auto List */
-class DocAutoList : public CompAccept<DocAutoList>, public DocNode
-{
- public:
- DocAutoList(DocNode *parent,int indent,bool isEnumList,
- int depth) :
- m_parent(parent), m_indent(indent), m_isEnumList(isEnumList),
- m_depth(depth) {}
- Kind kind() const { return Kind_AutoList; }
- bool isEnumList() const { return m_isEnumList; }
- int indent() const { return m_indent; }
- DocNode *parent() const { return m_parent; }
- int depth() const { return m_depth; }
- void accept(DocVisitor *v) { CompAccept<DocAutoList>::accept(this,v); }
- int parse();
-
- private:
- DocNode *m_parent;
- int m_indent;
- bool m_isEnumList;
- int m_depth;
-};
-
-
-/*! @brief Node representing a simple section title */
-class DocTitle : public CompAccept<DocTitle>, public DocNode
-{
- public:
- DocTitle(DocNode *parent) : m_parent(parent) {}
- void parse();
- void parseFromString(const QString &title);
- Kind kind() const { return Kind_Title; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { CompAccept<DocTitle>::accept(this,v); }
-
- private:
- DocNode *m_parent;
-};
-
-/*! @brief Node representing an item of a cross-referenced list */
-class DocXRefItem : public CompAccept<DocXRefItem>, public DocNode
-{
- public:
- //enum Type { Bug, Test, Todo, Deprecated };
- DocXRefItem(DocNode *parent,int id,const char *key);
- Kind kind() const { return Kind_XRefItem; }
- QString file() const { return m_file; }
- QString anchor() const { return m_anchor; }
- QString title() const { return m_title; }
- DocNode *parent() const { return m_parent; }
- QString relPath() const { return m_relPath; }
- QString key() const { return m_key; }
- void accept(DocVisitor *v) { CompAccept<DocXRefItem>::accept(this,v); }
- bool parse();
-
- private:
- DocNode *m_parent;
- int m_id;
- QString m_key;
- QString m_file;
- QString m_anchor;
- QString m_title;
- QString m_relPath;
-};
-
-/*! @brief Node representing an image */
-class DocImage : public CompAccept<DocImage>, public DocNode
-{
- public:
- enum Type { Html, Latex, Rtf };
- DocImage(DocNode *parent,const HtmlAttribList &attribs,const QString &name,Type t);
- Kind kind() const { return Kind_Image; }
- Type type() const { return m_type; }
- QString name() const { return m_name; }
- DocNode *parent() const { return m_parent; }
- bool hasCaption() const { return !m_children.isEmpty(); }
- QString width() const { return m_width; }
- QString height() const { return m_height; }
- QString relPath() const { return m_relPath; }
- const HtmlAttribList &attribs() const { return m_attribs; }
- void accept(DocVisitor *v) { CompAccept<DocImage>::accept(this,v); }
- void parse();
-
- private:
- DocNode *m_parent;
- HtmlAttribList m_attribs;
- QString m_name;
- Type m_type;
- QString m_width;
- QString m_height;
- QString m_relPath;
-};
-
-/*! @brief Node representing a dot file */
-class DocDotFile : public CompAccept<DocDotFile>, public DocNode
-{
- public:
- DocDotFile(DocNode *parent,const QString &name);
- void parse();
- Kind kind() const { return Kind_DotFile; }
- QString name() const { return m_name; }
- QString file() const { return m_file; }
- QString relPath() const { return m_relPath; }
- bool hasCaption() const { return !m_children.isEmpty(); }
- QString width() const { return m_width; }
- QString height() const { return m_height; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { CompAccept<DocDotFile>::accept(this,v); }
- private:
- DocNode *m_parent;
- QString m_name;
- QString m_file;
- QString m_relPath;
- QString m_width;
- QString m_height;
-};
-
-/*! @brief Node representing a link to some item */
-class DocLink : public CompAccept<DocLink>, public DocNode
-{
- public:
- DocLink(DocNode *parent,const QString &target);
- QString parse(bool);
- Kind kind() const { return Kind_Link; }
- QString file() const { return m_file; }
- QString relPath() const { return m_relPath; }
- QString ref() const { return m_ref; }
- QString anchor() const { return m_anchor; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { CompAccept<DocLink>::accept(this,v); }
-
- private:
- DocNode *m_parent;
- QString m_file;
- QString m_relPath;
- QString m_ref;
- QString m_anchor;
- QString m_refText;
-};
-
-/*! @brief Node representing a reference to some item */
-class DocRef : public CompAccept<DocRef>, public DocNode
-{
- public:
- DocRef(DocNode *parent,const QString &target);
- void parse();
- Kind kind() const { return Kind_Ref; }
- QString file() const { return m_file; }
- QString relPath() const { return m_relPath; }
- QString ref() const { return m_ref; }
- QString anchor() const { return m_anchor; }
- QString targetTitle() const { return m_text; }
- DocNode *parent() const { return m_parent; }
- bool hasLinkText() const { return !m_children.isEmpty(); }
- bool refToAnchor() const { return m_refToAnchor; }
- bool refToSection() const { return m_refToSection; }
- void accept(DocVisitor *v) { CompAccept<DocRef>::accept(this,v); }
-
- private:
- DocNode * m_parent;
- bool m_refToSection;
- bool m_refToAnchor;
- QString m_file;
- QString m_relPath;
- QString m_ref;
- QString m_anchor;
- QString m_text;
-};
-
-/*! @brief Node representing an internal reference to some item */
-class DocInternalRef : public CompAccept<DocInternalRef>, public DocNode
-{
- public:
- DocInternalRef(DocNode *parent,const QString &target);
- void parse();
- Kind kind() const { return Kind_Ref; }
- QString file() const { return m_file; }
- QString relPath() const { return m_relPath; }
- QString anchor() const { return m_anchor; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { CompAccept<DocInternalRef>::accept(this,v); }
-
- private:
- DocNode * m_parent;
- QString m_file;
- QString m_relPath;
- QString m_anchor;
-};
-
-/*! @brief Node representing a Language specific section */
-//class DocLanguage : public CompAccept<DocLanguage>, public DocNode
-//{
-// public:
-// DocLanguage(DocNode *parent,const QString &id) :
-// m_parent(parent), m_id(id) {}
-// QString id() const { return m_id; }
-// Kind kind() const { return Kind_Language; }
-// DocNode *parent() const { return m_parent; }
-// void accept(DocVisitor *v) { CompAccept<DocLanguage>::accept(this,v); }
-// int parse();
-//
-// private:
-// DocNode * m_parent;
-// QString m_id;
-//};
-
-/*! @brief Node representing a Hypertext reference */
-class DocHRef : public CompAccept<DocHRef>, public DocNode
-{
- public:
- DocHRef(DocNode *parent,const HtmlAttribList &attribs,const QString &url) :
- m_parent(parent), m_attribs(attribs), m_url(url) {}
- int parse();
- QString url() const { return m_url; }
- Kind kind() const { return Kind_HRef; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { CompAccept<DocHRef>::accept(this,v); }
- const HtmlAttribList &attribs() const { return m_attribs; }
-
- private:
- DocNode * m_parent;
- HtmlAttribList m_attribs;
- QString m_url;
-};
-
-/*! @brief Node Html heading */
-class DocHtmlHeader : public CompAccept<DocHtmlHeader>, public DocNode
-{
- public:
- DocHtmlHeader(DocNode *parent,const HtmlAttribList &attribs,int level) :
- m_parent(parent), m_level(level), m_attribs(attribs) {}
- int level() const { return m_level; }
- Kind kind() const { return Kind_HtmlHeader; }
- const HtmlAttribList &attribs() const { return m_attribs; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { CompAccept<DocHtmlHeader>::accept(this,v); }
- int parse();
-
- private:
- DocNode * m_parent;
- int m_level;
- HtmlAttribList m_attribs;
-};
-
-/*! @brief Node representing a Html description item */
-class DocHtmlDescTitle : public CompAccept<DocHtmlDescTitle>, public DocNode
-{
- public:
- DocHtmlDescTitle(DocNode *parent,const HtmlAttribList &attribs) :
- m_parent(parent), m_attribs(attribs) {}
- Kind kind() const { return Kind_HtmlDescTitle; }
- DocNode *parent() const { return m_parent; }
- const HtmlAttribList &attribs() const { return m_attribs; }
- void accept(DocVisitor *v) { CompAccept<DocHtmlDescTitle>::accept(this,v); }
- int parse();
-
- private:
- DocNode * m_parent;
- HtmlAttribList m_attribs;
-};
-
-/*! @brief Node representing a Html description list */
-class DocHtmlDescList : public CompAccept<DocHtmlDescList>, public DocNode
-{
- public:
- DocHtmlDescList(DocNode *parent,const HtmlAttribList &attribs)
- : m_parent(parent), m_attribs(attribs) {}
- Kind kind() const { return Kind_HtmlDescList; }
- DocNode *parent() const { return m_parent; }
- const HtmlAttribList &attribs() const { return m_attribs; }
- void accept(DocVisitor *v) { CompAccept<DocHtmlDescList>::accept(this,v); }
- int parse();
-
- private:
- DocNode * m_parent;
- HtmlAttribList m_attribs;
-};
-
-/*! @brief Node representing a normal section */
-class DocSection : public CompAccept<DocSection>, public DocNode
-{
- public:
- DocSection(DocNode *parent,int level,const QString &id) :
- m_parent(parent), m_level(level), m_id(id) {}
- Kind kind() const { return Kind_Section; }
- int level() const { return m_level; }
- QString title() const { return m_title; }
- QString anchor() const { return m_anchor; }
- QString id() const { return m_id; }
- QString file() const { return m_file; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { CompAccept<DocSection>::accept(this,v); }
- int parse();
-
- private:
- DocNode *m_parent;
- int m_level;
- QString m_id;
- QString m_title;
- QString m_anchor;
- QString m_file;
-};
-
-/*! @brief Node representing a reference to a section */
-class DocSecRefItem : public CompAccept<DocSecRefItem>, public DocNode
-{
- public:
- DocSecRefItem(DocNode *parent,const QString &target) :
- m_parent(parent), m_target(target) {}
- Kind kind() const { return Kind_SecRefItem; }
- QString target() const { return m_target; }
- QString file() const { return m_file; }
- QString anchor() const { return m_anchor; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { CompAccept<DocSecRefItem>::accept(this,v); }
- void parse();
-
- private:
- DocNode *m_parent;
- QString m_target;
- QString m_file;
- QString m_anchor;
-};
-
-/*! @brief Node representing a list of section references */
-class DocSecRefList : public CompAccept<DocSecRefList>, public DocNode
-{
- public:
- DocSecRefList(DocNode *parent) : m_parent(parent) {}
- void parse();
- Kind kind() const { return Kind_SecRefList; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { CompAccept<DocSecRefList>::accept(this,v); }
-
- private:
- DocNode *m_parent;
-};
-
-/*! @brief Node representing an internal section of documentation */
-class DocInternal : public CompAccept<DocInternal>, public DocNode
-{
- public:
- DocInternal(DocNode *parent) : m_parent(parent) {}
- int parse(int);
- Kind kind() const { return Kind_Internal; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { CompAccept<DocInternal>::accept(this,v); }
-
- private:
- DocNode *m_parent;
-};
-
-/*! @brief Node representing a simple list */
-class DocSimpleList : public CompAccept<DocSimpleList>, public DocNode
-{
- public:
- DocSimpleList(DocNode *parent) : m_parent(parent) {}
- Kind kind() const { return Kind_SimpleList; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { CompAccept<DocSimpleList>::accept(this,v); }
- int parse();
-
- private:
- DocNode *m_parent;
-};
-
-/*! @brief Node representing a Html list */
-class DocHtmlList : public CompAccept<DocHtmlList>, public DocNode
-{
- public:
- enum Type { Unordered, Ordered };
- DocHtmlList(DocNode *parent,const HtmlAttribList &attribs,Type t) :
- m_parent(parent), m_type(t), m_attribs(attribs) {}
- Kind kind() const { return Kind_HtmlList; }
- Type type() const { return m_type; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { CompAccept<DocHtmlList>::accept(this,v); }
- const HtmlAttribList &attribs() const { return m_attribs; }
- int parse();
- int parseXml();
-
- private:
- DocNode * m_parent;
- Type m_type;
- HtmlAttribList m_attribs;
-};
-
-/*! Node representing a simple section */
-class DocSimpleSect : public CompAccept<DocSimpleSect>, public DocNode
-{
- public:
- enum Type
- {
- Unknown, See, Return, Author, Authors, Version, Since, Date,
- Note, Warning, Pre, Post, Invar, Remark, Attention, User, Rcs
- };
- DocSimpleSect(DocNode *parent,Type t);
- virtual ~DocSimpleSect();
- Kind kind() const { return Kind_SimpleSect; }
- Type type() const { return m_type; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v);
- int parse(bool userTitle);
- int parseRcs();
- int parseXml();
- void appendLinkWord(const QString &word);
-
- private:
- DocNode * m_parent;
- Type m_type;
- DocTitle * m_title;
-};
-
-/*! Node representing a parameter section */
-class DocParamSect : public CompAccept<DocParamSect>, public DocNode
-{
- public:
- enum Type
- {
- Unknown, Param, RetVal, Exception
- };
- enum Direction
- {
- In=1, Out=2, InOut=3, Unspecified=0
- };
- DocParamSect(DocNode *parent,Type t)
- : m_parent(parent), m_type(t) {}
- int parse(const QString &cmdName,bool xmlContext,Direction d);
- Kind kind() const { return Kind_ParamSect; }
- Type type() const { return m_type; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { CompAccept<DocParamSect>::accept(this,v); }
-
- private:
- DocNode * m_parent;
- Type m_type;
- Direction m_dir;
-};
-
-/*! Node representing a paragraph in the documentation tree */
-class DocPara : public CompAccept<DocPara>, public DocNode
-{
- public:
- DocPara(DocNode *parent) : m_parent(parent),
- m_isFirst(FALSE), m_isLast(FALSE) {}
- int parse();
- Kind kind() const { return Kind_Para; }
- DocNode *parent() const { return m_parent; }
- bool isEmpty() const { return m_children.isEmpty(); }
- void accept(DocVisitor *v) { CompAccept<DocPara>::accept(this,v); }
- void markFirst(bool v=TRUE) { m_isFirst=v; }
- void markLast(bool v=TRUE) { m_isLast=v; }
- bool isFirst() const { return m_isFirst; }
- bool isLast() const { return m_isLast; }
- const QList<DocNode> &children() const { return m_children; }
-
- int handleCommand(const QString &cmdName);
- int handleHtmlStartTag(const QString &tagName,const HtmlAttribList &tagHtmlAttribs);
- int handleHtmlEndTag(const QString &tagName);
- int handleSimpleSection(DocSimpleSect::Type t,bool xmlContext=FALSE);
- int handleXRefItem();
- int handleParamSection(const QString &cmdName,DocParamSect::Type t,
- bool xmlContext,
- int direction);
- void handleIncludeOperator(const QString &cmdName,DocIncOperator::Type t);
- void handleImage(const QString &cmdName);
- void handleDotFile(const QString &cmdName);
- void handleInclude(const QString &cmdName,DocInclude::Type t);
- void handleLink(const QString &cmdName,bool isJavaLink);
- void handleRef(const QString &cmdName);
- void handleSection(const QString &cmdName);
- void handleInheritDoc();
- int handleStartCode();
- int handleHtmlHeader(const HtmlAttribList &tagHtmlAttribs,int level);
- bool injectToken(int tok,const QString &tokText);
-
- private:
- DocNode *m_parent;
- QString m_sectionId;
- bool m_isFirst;
- bool m_isLast;
-};
-
-/*! @brief Node representing a parameter list. */
-class DocParamList : public DocNode
-{
- public:
- DocParamList(DocNode *parent,DocParamSect::Type t,DocParamSect::Direction d)
- : m_parent(parent) , m_type(t), m_dir(d), m_isFirst(TRUE), m_isLast(TRUE)
- { m_paragraphs.setAutoDelete(TRUE); }
- virtual ~DocParamList() { }
- Kind kind() const { return Kind_ParamList; }
- DocNode *parent() const { return m_parent; }
- const QList<DocNode> &parameters() { return m_params; }
- DocParamSect::Type type() const { return m_type; }
- DocParamSect::Direction direction() const { return m_dir; }
- void markFirst(bool b=TRUE) { m_isFirst=b; }
- void markLast(bool b=TRUE) { m_isLast=b; }
- bool isFirst() const { return m_isFirst; }
- bool isLast() const { return m_isLast; }
- void accept(DocVisitor *v)
- {
- v->visitPre(this);
- QListIterator<DocPara> cli(m_paragraphs);
- DocNode *n;
- for (cli.toFirst();(n=cli.current());++cli) n->accept(v);
- v->visitPost(this);
- }
- int parse(const QString &cmdName);
- int parseXml(const QString &paramName);
-
- private:
- DocNode * m_parent;
- QList<DocPara> m_paragraphs;
- QList<DocNode> m_params;
- DocParamSect::Type m_type;
- DocParamSect::Direction m_dir;
- bool m_isFirst;
- bool m_isLast;
-};
-
-/*! @brief Node representing an item of a auto list */
-class DocAutoListItem : public DocNode
-{
- public:
- DocAutoListItem(DocNode *parent,int num) : m_parent(parent), m_itemNum(num)
- { m_paragraph=new DocPara(this); }
- virtual ~DocAutoListItem() { delete m_paragraph; }
- Kind kind() const { return Kind_AutoListItem; }
- DocNode *parent() const { return m_parent; }
- int itemNumber() const { return m_itemNum; }
- void accept(DocVisitor *v)
- {
- v->visitPre(this);
- m_paragraph->accept(v);
- v->visitPost(this);
- }
- int parse();
-
- private:
- DocNode *m_parent;
- DocPara *m_paragraph;
- int m_itemNum;
-};
-
-/*! @brief Node representing a simple list item */
-class DocSimpleListItem : public DocNode
-{
- public:
- DocSimpleListItem(DocNode *parent) : m_parent(parent)
- { m_paragraph=new DocPara(this); }
- int parse();
- virtual ~DocSimpleListItem() { delete m_paragraph; }
- Kind kind() const { return Kind_SimpleListItem; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v)
- {
- v->visitPre(this);
- m_paragraph->accept(v);
- v->visitPost(this);
- }
-
- private:
- DocNode *m_parent;
- DocPara *m_paragraph;
-};
-
-/*! @brief Node representing a HTML list item */
-class DocHtmlListItem : public CompAccept<DocHtmlListItem>, public DocNode
-{
- public:
- DocHtmlListItem(DocNode *parent,const HtmlAttribList &attribs,int num) :
- m_parent(parent), m_attribs(attribs), m_itemNum(num) {}
- Kind kind() const { return Kind_HtmlListItem; }
- int itemNumber() const { return m_itemNum; }
- const HtmlAttribList &attribs() const { return m_attribs; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { CompAccept<DocHtmlListItem>::accept(this,v); }
- int parse();
- int parseXml();
-
- private:
- DocNode * m_parent;
- HtmlAttribList m_attribs;
- int m_itemNum;
-};
-
-/*! @brief Node representing a HTML description data */
-class DocHtmlDescData : public CompAccept<DocHtmlDescData>, public DocNode
-{
- public:
- DocHtmlDescData(DocNode *parent) :
- m_parent(parent) {}
- Kind kind() const { return Kind_HtmlDescData; }
- const HtmlAttribList &attribs() const { return m_attribs; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { CompAccept<DocHtmlDescData>::accept(this,v); }
- int parse();
-
- private:
- DocNode * m_parent;
- HtmlAttribList m_attribs;
-};
-
-/*! @brief Node representing a HTML table cell */
-class DocHtmlCell : public CompAccept<DocHtmlCell>, public DocNode
-{
- public:
- DocHtmlCell(DocNode *parent,const HtmlAttribList &attribs,bool isHeading) :
- m_parent(parent), m_isHeading(isHeading),
- m_isFirst(FALSE), m_isLast(FALSE), m_attribs(attribs) {}
- bool isHeading() const { return m_isHeading; }
- bool isFirst() const { return m_isFirst; }
- bool isLast() const { return m_isLast; }
- Kind kind() const { return Kind_HtmlCell; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { CompAccept<DocHtmlCell>::accept(this,v); }
- void markFirst(bool v=TRUE) { m_isFirst=v; }
- void markLast(bool v=TRUE) { m_isLast=v; }
- const HtmlAttribList &attribs() const { return m_attribs; }
- int parse();
-
- private:
- DocNode * m_parent;
- bool m_isHeading;
- bool m_isFirst;
- bool m_isLast;
- HtmlAttribList m_attribs;
-};
-
-/*! @brief Node representing a HTML table caption */
-class DocHtmlCaption : public CompAccept<DocHtmlCaption>, public DocNode
-{
- public:
- DocHtmlCaption(DocNode *parent,const HtmlAttribList &attribs) :
- m_parent(parent), m_attribs(attribs) {}
- Kind kind() const { return Kind_HtmlCaption; }
- DocNode *parent() const { return m_parent; }
- void accept(DocVisitor *v) { CompAccept<DocHtmlCaption>::accept(this,v); }
- const HtmlAttribList &attribs() const { return m_attribs; }
- int parse();
-
- private:
- DocNode * m_parent;
- HtmlAttribList m_attribs;
- bool m_atTop;
-};
-
-/*! @brief Node representing a HTML table row */
-class DocHtmlRow : public CompAccept<DocHtmlRow>, public DocNode
-{
- public:
- DocHtmlRow(DocNode *parent,const HtmlAttribList &attribs)
- : m_parent(parent), m_attribs(attribs) {}
- Kind kind() const { return Kind_HtmlRow; }
- DocNode *parent() const { return m_parent; }
- uint numCells() const { return m_children.count(); }
- void accept(DocVisitor *v) { CompAccept<DocHtmlRow>::accept(this,v); }
- const HtmlAttribList &attribs() const { return m_attribs; }
- int parse();
-
- private:
- DocNode * m_parent;
- HtmlAttribList m_attribs;
-};
-
-/*! @brief Node representing a HTML table */
-class DocHtmlTable : public CompAccept<DocHtmlTable>, public DocNode
-{
- public:
- DocHtmlTable(DocNode *parent,const HtmlAttribList &attribs)
- : m_parent(parent), m_attribs(attribs)
- { m_caption=0; }
- ~DocHtmlTable() { delete m_caption; }
- Kind kind() const { return Kind_HtmlTable; }
- DocNode *parent() const { return m_parent; }
- uint numRows() const { return m_children.count(); }
- bool hasCaption() { return m_caption!=0; }
- const HtmlAttribList &attribs() const { return m_attribs; }
- int parse();
- uint numCols() const;
- void accept(DocVisitor *v);
-
- private:
- DocNode * m_parent;
- DocHtmlCaption *m_caption;
- HtmlAttribList m_attribs;
-};
-
-/*! @brief Root node of a text fragment */
-class DocText : public CompAccept<DocText>, public DocNode
-{
- public:
- DocText() {}
- Kind kind() const { return Kind_Text; }
- DocNode *parent() const { return 0; }
- void accept(DocVisitor *v) { CompAccept<DocText>::accept(this,v); }
- void parse();
-};
-
-/*! @brief Root node of documentation tree */
-class DocRoot : public CompAccept<DocRoot>, public DocNode
-{
- public:
- DocRoot(bool indent,bool sl) : m_indent(indent), m_singleLine(sl) {}
- Kind kind() const { return Kind_Root; }
- DocNode *parent() const { return 0; }
- void accept(DocVisitor *v) { CompAccept<DocRoot>::accept(this,v); }
- void parse();
- bool indent() const { return m_indent; }
- bool singleLine() const { return m_singleLine; }
-
- private:
- bool m_indent;
- bool m_singleLine;
-};
-
-
-#endif
diff --git a/src/doctokenizer.h b/src/doctokenizer.h
deleted file mode 100644
index 0959b49..0000000
--- a/src/doctokenizer.h
+++ /dev/null
@@ -1,147 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 _DOCTOKENIZER_H
-#define _DOCTOKENIZER_H
-
-#include <qstring.h>
-#include <qlist.h>
-#include "htmlattrib.h"
-
-class Definition;
-class MemberGroup;
-
-enum Tokens
-{
- TK_WORD = 1,
- TK_LNKWORD = 2,
- TK_WHITESPACE = 3,
- TK_LISTITEM = 4,
- TK_ENDLIST = 5,
- TK_COMMAND = 6,
- TK_HTMLTAG = 7,
- TK_SYMBOL = 8,
- TK_NEWPARA = 9,
- TK_RCSTAG = 10,
- TK_URL = 11,
-
- RetVal_OK = 0x10000,
- RetVal_SimpleSec = 0x10001,
- RetVal_ListItem = 0x10002,
- RetVal_Section = 0x10003,
- RetVal_Subsection = 0x10004,
- RetVal_Subsubsection = 0x10005,
- RetVal_Paragraph = 0x10006,
- RetVal_EndList = 0x10007,
- RetVal_EndPre = 0x10008,
- RetVal_DescData = 0x10009,
- RetVal_DescTitle = 0x1000A,
- RetVal_EndDesc = 0x1000B,
- RetVal_TableRow = 0x1000C,
- RetVal_TableCell = 0x1000D,
- RetVal_TableHCell = 0x1000E,
- RetVal_EndTable = 0x1000F,
- RetVal_Internal = 0x10010,
- RetVal_SwitchLang = 0x10011,
- RetVal_CloseXml = 0x10012
-};
-
-struct TokenInfo
-{
- // unknown token
- char unknownChar;
-
- // command token
- QString name;
-
- // command text (RCS tag)
- QString text;
-
- // comment blocks
-
- // list token info
- bool isEnumList;
- int indent;
-
- // sections
- QString sectionId;
-
- // simple section
- QString simpleSectName;
-
- // verbatim fragment
- QString verb;
-
- // xrefitem
- int id;
-
- // html tag
- HtmlAttribList attribs;
- bool endTag;
- bool emptyTag;
-
- // whitespace
- QString chars;
-
- // url
- bool isEMailAddr;
-
- // param attributes
- enum ParamDir { In=1, Out=2, InOut=3, Unspecified=0 };
- ParamDir paramDir;
-};
-
-// globals
-extern TokenInfo *g_token;
-extern int doctokenizerYYlineno;
-extern FILE *doctokenizerYYin;
-
-// helper functions
-const char *tokToString(int token);
-
-// operations on the scanner
-void doctokenizerYYFindSections(const char *input,Definition *d,
- MemberGroup *mg,const char *fileName);
-void doctokenizerYYinit(const char *input,const char *fileName);
-void doctokenizerYYcleanup();
-void doctokenizerYYpushContext();
-bool doctokenizerYYpopContext();
-int doctokenizerYYlex();
-void doctokenizerYYsetStatePara();
-void doctokenizerYYsetStateTitle();
-void doctokenizerYYsetStateTitleAttrValue();
-void doctokenizerYYsetStateCode();
-void doctokenizerYYsetStateXmlCode();
-void doctokenizerYYsetStateHtmlOnly();
-void doctokenizerYYsetStateManOnly();
-void doctokenizerYYsetStateLatexOnly();
-void doctokenizerYYsetStateXmlOnly();
-void doctokenizerYYsetStateVerbatim();
-void doctokenizerYYsetStateDot();
-void doctokenizerYYsetStateParam();
-void doctokenizerYYsetStateXRefItem();
-void doctokenizerYYsetStateFile();
-void doctokenizerYYsetStatePattern();
-void doctokenizerYYsetStateLink();
-void doctokenizerYYsetStateRef();
-void doctokenizerYYsetStateInternalRef();
-void doctokenizerYYsetStateText();
-void doctokenizerYYsetStateSkipTitle();
-void doctokenizerYYsetInsidePre(bool b);
-
-#endif
diff --git a/src/doctokenizer.l b/src/doctokenizer.l
deleted file mode 100644
index 34f82a2..0000000
--- a/src/doctokenizer.l
+++ /dev/null
@@ -1,1063 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-
-%{
-
-#include <qfile.h>
-#include <qstring.h>
-#include <qstack.h>
-#include <qdict.h>
-
-#include "doctokenizer.h"
-#include "cmdmapper.h"
-#include "config.h"
-#include "message.h"
-#include "section.h"
-#include "membergroup.h"
-#include "definition.h"
-#include "doxygen.h"
-
-#define YY_NEVER_INTERACTIVE 1
-
-//--------------------------------------------------------------------------
-
-// context for tokenizer phase
-static int g_commentState;
-TokenInfo *g_token = 0;
-static int g_inputPos = 0;
-static const char *g_inputString;
-static QString g_fileName;
-static bool g_insidePre;
-
-// context for section finding phase
-static Definition *g_definition;
-static MemberGroup *g_memberGroup;
-static QCString g_secLabel;
-static QCString g_secTitle;
-static SectionInfo::SectionType g_secType;
-static QCString g_endMarker;
-
-struct DocLexerContext
-{
- TokenInfo *token;
- int rule;
- int inputPos;
- const char *inputString;
- YY_BUFFER_STATE state;
-};
-
-static QStack<DocLexerContext> g_lexerStack;
-
-//--------------------------------------------------------------------------
-
-void doctokenizerYYpushContext()
-{
- DocLexerContext *ctx = new DocLexerContext;
- ctx->rule = YY_START;
- ctx->token = g_token;
- ctx->inputPos = g_inputPos;
- ctx->inputString = g_inputString;
- ctx->state = YY_CURRENT_BUFFER;
- g_lexerStack.push(ctx);
- yy_switch_to_buffer(yy_create_buffer(doctokenizerYYin, YY_BUF_SIZE));
-}
-
-bool doctokenizerYYpopContext()
-{
- if (g_lexerStack.isEmpty()) return FALSE;
- DocLexerContext *ctx = g_lexerStack.pop();
- g_inputPos = ctx->inputPos;
- g_inputString = ctx->inputString;
- yy_delete_buffer(YY_CURRENT_BUFFER);
- yy_switch_to_buffer(ctx->state);
- BEGIN(ctx->rule);
- delete ctx;
- return TRUE;
-}
-
-
-//--------------------------------------------------------------------------
-
-const char *tokToString(int token)
-{
- switch (token)
- {
- case 0: return "TK_EOF";
- case TK_WORD: return "TK_WORD";
- case TK_LNKWORD: return "TK_LNKWORD";
- case TK_WHITESPACE: return "TK_WHITESPACE";
- case TK_LISTITEM: return "TK_LISTITEM";
- case TK_ENDLIST: return "TK_ENDLIST";
- case TK_COMMAND: return "TK_COMMAND";
- case TK_HTMLTAG: return "TK_HTMLTAG";
- case TK_SYMBOL: return "TK_SYMBOL";
- case TK_NEWPARA: return "TK_NEWPARA";
- case TK_RCSTAG: return "TK_RCSTAG";
- case TK_URL: return "TK_URL";
- }
- return "ERROR";
-}
-
-static int computeIndent(const char *str,int length)
-{
- int i;
- int indent=0;
- int tabSize=Config_getInt("TAB_SIZE");
- for (i=0;i<length;i++)
- {
- if (str[i]=='\t')
- {
- indent+=tabSize - (indent%tabSize);
- }
- else if (str[i]=='\n')
- {
- indent=0;
- }
- else
- {
- indent++;
- }
- }
- return indent;
-}
-
-//--------------------------------------------------------------------------
-
-static void processSection()
-{
- //printf("%s: found section/anchor with name `%s'\n",g_fileName.data(),g_secLabel.data());
- QCString file;
- if (g_memberGroup)
- {
- file = g_memberGroup->parent()->getOutputFileBase();
- }
- else if (g_definition)
- {
- file = g_definition->getOutputFileBase();
- }
- else
- {
- warn(g_fileName,yylineno,"Found section/anchor %s without context\n",g_secLabel.data());
- }
- SectionInfo *si=0;
- if ((si=Doxygen::sectionDict.find(g_secLabel)))
- {
- si->fileName = file;
- //si = new SectionInfo(file,g_secLabel,g_secTitle,g_secType);
- //Doxygen::sectionDict.insert(g_secLabel,si);
- }
-}
-
-static void handleHtmlTag()
-{
- QCString tagText=yytext;
- g_token->attribs.clear();
- g_token->endTag = FALSE;
- g_token->emptyTag = FALSE;
-
- // Check for end tag
- int startNamePos=1;
- if (tagText.at(1)=='/')
- {
- g_token->endTag = TRUE;
- startNamePos++;
- }
-
- // Parse the name portion
- int i = startNamePos;
- for (i=startNamePos; i < yyleng; i++)
- {
- // Check for valid HTML/XML name chars (including namespaces)
- char c = tagText.at(i);
- if (!(isalnum(c) || c=='-' || c=='_' || c==':')) break;
- }
- g_token->name = tagText.mid(startNamePos,i-startNamePos);
-
- // Parse the attributes. Each attribute is a name, value pair
- // The result is stored in g_token->attribs.
- int startName,endName,startAttrib,endAttrib;
- while (i<yyleng)
- {
- char c=tagText.at(i);
- // skip spaces
- while (i<yyleng && c==' ') { c=tagText.at(++i); }
- // check for end of the tag
- if (c == '>') break;
- // Check for XML style "empty" tag.
- if (c == '/')
- {
- g_token->emptyTag = TRUE;
- break;
- }
- startName=i;
- // search for end of name
- while (i<yyleng && c!=' ' && c!='=') { c=tagText.at(++i); }
- endName=i;
- HtmlAttrib opt;
- opt.name = tagText.mid(startName,endName-startName).lower();
- // skip spaces
- while (i<yyleng && c==' ') { c=tagText.at(++i); }
- if (tagText.at(i)=='=') // option has value
- {
- c=tagText.at(++i);
- // skip spaces
- while (i<yyleng && c==' ') { c=tagText.at(++i); }
- if (tagText.at(i)=='\'') // option '...'
- {
- c=tagText.at(++i);
- startAttrib=i;
-
- // search for matching quote
- while (i<yyleng && c!='\'') { c=tagText.at(++i); }
- endAttrib=i;
- if (i<yyleng) c=tagText.at(++i);
- }
- else if (tagText.at(i)=='"') // option "..."
- {
- c=tagText.at(++i);
- startAttrib=i;
- // search for matching quote
- while (i<yyleng && c!='"') { c=tagText.at(++i); }
- endAttrib=i;
- if (i<yyleng) c=tagText.at(++i);
- }
- else // value without any quotes
- {
- startAttrib=i;
- // search for separator
- while (i<yyleng && c!=' ') { c=tagText.at(++i); }
- endAttrib=i;
- if (i<yyleng) c=tagText.at(++i);
- }
- opt.value = tagText.mid(startAttrib,endAttrib-startAttrib);
- }
- else // start next option
- {
- }
- //printf("=====> Adding option name=<%s> value=<%s>\n",
- // opt.name.data(),opt.value.data());
- g_token->attribs.append(&opt);
- }
-}
-
-static QString stripEmptyLines(const char *s)
-{
- int result=0,p=0;
- for (;;)
- {
- int c;
- while ((c=s[p]) && (c==' ' || c=='\t' || c=='\r')) p++;
- if (s[p]=='\n') result=++p; else break;
- }
- return &s[result];
-}
-
-//--------------------------------------------------------------------------
-
-#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;
- const char *src=g_inputString+g_inputPos;
- while ( c < max_size && *src ) *buf++ = *src++, c++;
- g_inputPos+=c;
- return c;
-}
-
-//--------------------------------------------------------------------------
-
-%}
-
-CMD ("\\"|"@")
-WS [ \t\r\n]
-NONWS [^ \t\r\n]
-BLANK [ \t\r]
-ID [a-z_A-Z][a-z_A-Z0-9]*
-MAILADR [a-z_A-Z0-9.+-]+"@"[a-z_A-Z0-9-]+("."[a-z_A-Z0-9\-]+)+[a-z_A-Z0-9\-]+
-OPTSTARS ("//"{BLANK}*)?"*"*{BLANK}*
-LISTITEM {BLANK}*{OPTSTARS}"-"("#")?{WS}
-ENDLIST {BLANK}*{OPTSTARS}"."{BLANK}*\n
-ATTRIB {ID}{WS}*("="{WS}*(("\""[^\"]*"\"")|("'"[^\']*"'")|[^ \t\r\n'"><]+))?
-URLCHAR [a-z_A-Z0-9\!\~\,\:\;\'\$\?\@\&\%\#\.\-\+\/\=]
-URLMASK (([a-z_A-Z][^\>\"\n]*{URLCHAR})|({URLCHAR}+))([({]{URLCHAR}*[)}])?
-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}+)?
-VERBATIM "verbatim"{BLANK}*
-SPCMD1 {CMD}([a-z_A-Z0-9]+|{VERBATIM})
-SPCMD2 {CMD}[\\@<>&$#%~]
-SPCMD3 {CMD}form#[0-9]+
-INOUT "in"|"out"|("in"{BLANK}*","{BLANK}*"out")|("out"{BLANK}*","{BLANK}*"in")
-PARAMIO {CMD}param{BLANK}*"["{BLANK}*{INOUT}{BLANK}*"]"
-TEMPCHAR [a-z_A-Z0-9,: \t\*\&]
-FUNCCHAR [a-z_A-Z0-9,:\<\> \t\*\&]
-SCOPESEP "::"|"#"|"."
-SCOPEPRE {ID}("<"{TEMPCHAR}*">")?{SCOPESEP}
-SCOPEKEYS ":"({ID}":")*
-SCOPECPP {SCOPEPRE}*(~)?{ID}("<"{TEMPCHAR}*">")?
-SCOPEOBJC {SCOPEPRE}?{ID}{SCOPEKEYS}?
-SCOPEMASK {SCOPECPP}|{SCOPEOBJC}
-FUNCARG "("{FUNCCHAR}*")"({BLANK}*("volatile"|"const"))?
-OPNEW {BLANK}+"new"({BLANK}*"[]")?
-OPDEL {BLANK}+"delete"({BLANK}*"[]")?
-OPNORM {OPNEW}|{OPDEL}|"+"|"-"|"*"|"/"|"%"|"^"|"&"|"|"|"~"|"!"|"="|"<"|">"|"+="|"-="|"*="|"/="|"%="|"^="|"&="|"|="|"<<"|">>"|"<<="|">>="|"=="|"!="|"<="|">="|"&&"|"||"|"++"|"--"|","|"->*"|"->"|"[]"|"()"
-OPCAST {BLANK}+[^(\r\n.,]+
-OPMASK ({BLANK}*{OPNORM}{FUNCARG}?)|({OPCAST}{FUNCARG})
-LNKWORD1 ("::"|"#")?{SCOPEMASK}
-CVSPEC {BLANK}*("const"|"volatile")
-LNKWORD2 {SCOPEPRE}*"operator"{OPMASK}
-LNKWORD3 [0-9a-z_A-Z]+("."[0-9a-z_A-Z]+)+
-CHARWORD [^ \t\n\r\\@<>()\[\]:;\?{}&%$#,.]
-CHARWORDQ [^ \t\n\r\\@<>()\[\]:;\?{}&%$#,."]
-WORD1 "%"?{CHARWORD}+|"{"|"}"|("\""[^"\n]*"\"")
-WORD2 "."|","|"("|")"|"["|"]"|":"|";"|"\?"
-WORD1NQ "%"?{CHARWORDQ}+
-WORD2NQ "."|","|"("|")"|"["|"]"|":"|";"|"\?"
-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"
-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"
-HTMLKEYW {HTMLKEYL}|{HTMLKEYU}
-LABELID [a-z_A-Z][a-z_A-Z0-9\-]*
-REFWORD ("#"|"::")?({ID}("."|"#"|"::"|"-"))*({ID}(":")?){FUNCARG}?
-
-%option noyywrap
-%option yylineno
-
-%x St_Para
-%x St_Comment
-%x St_Title
-%x St_TitleN
-%x St_TitleQ
-%x St_TitleA
-%x St_TitleV
-%x St_Code
-%x St_XmlCode
-%x St_HtmlOnly
-%x St_ManOnly
-%x St_LatexOnly
-%x St_XmlOnly
-%x St_Verbatim
-%x St_Dot
-%x St_Param
-%x St_XRefItem
-%x St_XRefItem2
-%x St_File
-%x St_Pattern
-%x St_Link
-%x St_Ref
-%x St_Ref2
-%x St_IntRef
-%x St_Text
-%x St_SkipTitle
-
-%x St_Sections
-%s St_SecLabel1
-%s St_SecLabel2
-%s St_SecTitle
-%x St_SecSkip
-
-%%
-<St_Para>\r /* skip carriage return */
-<St_Para>^{LISTITEM} { /* list item */
- QString text=yytext;
- int dashPos = text.findRev('-');
- g_token->isEnumList = text.at(dashPos+1)=='#';
- g_token->indent = computeIndent(yytext,dashPos);
- return TK_LISTITEM;
- }
-<St_Para>{BLANK}*\n{LISTITEM} { /* list item on next line */
- QString text=yytext;
- text=text.right(text.length()-text.find('\n')-1);
- int dashPos = text.findRev('-');
- g_token->isEnumList = text.at(dashPos+1)=='#';
- g_token->indent = computeIndent(text,dashPos);
- return TK_LISTITEM;
- }
-<St_Para>^{ENDLIST} { /* end list */
- int dotPos = QString(yytext).findRev('.');
- g_token->indent = computeIndent(yytext,dotPos);
- return TK_ENDLIST;
- }
-<St_Para>{BLANK}*\n{ENDLIST} { /* end list on next line */
- QString text=yytext;
- text=text.right(text.length()-text.find('\n')-1);
- int dotPos = text.findRev('.');
- g_token->indent = computeIndent(text,dotPos);
- return TK_ENDLIST;
- }
-<St_Para>"{"{BLANK}*"@link" {
- g_token->name = "javalink";
- return TK_COMMAND;
- }
-<St_Para>"{"{BLANK}*"@inheritDoc"{BLANK}*"}" {
- g_token->name = "inheritdoc";
- return TK_COMMAND;
- }
-<St_Para>{SPCMD3} {
- g_token->name = "form";
- bool ok;
- g_token->id = QString(yytext).right(yyleng-6).toInt(&ok);
- ASSERT(ok);
- return TK_COMMAND;
- }
-<St_Para>{SPCMD1} |
-<St_Para>{SPCMD2} { /* special command */
- g_token->name = yytext+1;
- g_token->name = g_token->name.stripWhiteSpace();
- g_token->paramDir=TokenInfo::Unspecified;
- return TK_COMMAND;
- }
-<St_Para>{PARAMIO} { /* param [in,out] command */
- g_token->name = "param";
- QString 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;
- }
-<St_Para>("http:"|"https:"|"ftp:"|"file:"|"news:"){URLMASK} { // URL
- g_token->name=yytext;
- g_token->isEMailAddr=FALSE;
- return TK_URL;
- }
-<St_Para>{MAILADR} { // Mail address
- g_token->name=yytext;
- g_token->isEMailAddr=TRUE;
- return TK_URL;
- }
-<St_Para>"$"{ID}":"[^\n$]+"$" { /* RCS tag */
- QString tagName(yytext+1);
- int index=tagName.find(':');
- g_token->name = tagName.left(index);
- g_token->text = tagName.mid(index+1,tagName.length()-index-2);
- return TK_RCSTAG;
- }
-<St_Para,St_HtmlOnly>"$("{ID}")" { /* environment variable */
- QCString name = &yytext[2];
- name = name.left(name.length()-1);
- QCString value = getenv(name);
- for (int i=value.length()-1;i>=0;i--) unput(value.at(i));
- }
-<St_Para>{HTMLTAG} { /* html tag */
- handleHtmlTag();
- return TK_HTMLTAG;
- }
-<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
- */
- 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} |
-<St_Para>{LNKWORD2} |
-<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[yyleng-1]);
- return TK_LNKWORD;
- }
- /********* patterns for normal words ******************/
-
-<St_Para,St_Text>{WORD1} |
-<St_Para,St_Text>{WORD2} { /* function call */
- if (yytext[0]=='%') // strip % if present
- 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;
- }
-
- /*******************************************************/
-
-<St_Para,St_Text>{BLANK}+ |
-<St_Para,St_Text>{BLANK}*\n{BLANK}* { /* white space */
- g_token->chars=yytext;
- return TK_WHITESPACE;
- }
-<St_Text>[\\@<>&$#%~] {
- g_token->name = yytext;
- return TK_COMMAND;
- }
-<St_Para>({BLANK}*\n)+{BLANK}*\n {
- if (g_insidePre)
- {
- /* Inside a <pre>..</pre> blank lines are treated
- * as whitespace.
- */
- g_token->chars=yytext;
- return TK_WHITESPACE;
- }
- else
- {
- /* start of a new paragraph */
- return TK_NEWPARA;
- }
- }
-<St_Code>{WS}*{CMD}"endcode" {
- return RetVal_OK;
- }
-<St_XmlCode>{WS}*"</code>" {
- return RetVal_OK;
- }
-<St_Code,St_XmlCode>[^\\@\n]+ |
-<St_Code,St_XmlCode>\n |
-<St_Code,St_XmlCode>. {
- g_token->verb+=yytext;
- }
-<St_HtmlOnly>{CMD}"endhtmlonly" {
- return RetVal_OK;
- }
-<St_HtmlOnly>[^\\@\n$]+ |
-<St_HtmlOnly>\n |
-<St_HtmlOnly>. {
- g_token->verb+=yytext;
- }
-<St_ManOnly>{CMD}"endmanonly" {
- return RetVal_OK;
- }
-<St_ManOnly>[^\\@\n$]+ |
-<St_ManOnly>\n |
-<St_ManOnly>. {
- g_token->verb+=yytext;
- }
-<St_LatexOnly>{CMD}"endlatexonly" {
- return RetVal_OK;
- }
-<St_LatexOnly>[^\\@\n]+ |
-<St_LatexOnly>\n |
-<St_LatexOnly>. {
- g_token->verb+=yytext;
- }
-<St_XmlOnly>{CMD}"endxmlonly" {
- return RetVal_OK;
- }
-<St_XmlOnly>[^\\@\n]+ |
-<St_XmlOnly>\n |
-<St_XmlOnly>. {
- g_token->verb+=yytext;
- }
-<St_Verbatim>{CMD}"endverbatim" {
- g_token->verb=stripEmptyLines(g_token->verb);
- return RetVal_OK;
- }
-<St_Verbatim>[^\\@\n]+ |
-<St_Verbatim>\n |
-<St_Verbatim>. { /* Verbatim text */
- 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;
- }
-<St_Title>"\"" { // quoted title
- BEGIN(St_TitleQ);
- }
-<St_Title>[ \t]+ {
- g_token->chars=yytext;
- return TK_WHITESPACE;
- }
-<St_Title>. { // non-quoted title
- unput(*yytext);
- BEGIN(St_TitleN);
- }
-<St_Title>\n {
- unput(*yytext);
- return 0;
- }
-<St_TitleN>"&"{ID}";" { /* symbol */
- g_token->name = yytext;
- return TK_SYMBOL;
- }
-<St_TitleN>{HTMLTAG} {
- }
-<St_TitleN>{SPCMD1} |
-<St_TitleN>{SPCMD2} { /* special command */
- g_token->name = yytext+1;
- g_token->paramDir=TokenInfo::Unspecified;
- return TK_COMMAND;
- }
-<St_TitleN>{WORD1} |
-<St_TitleN>{WORD2} { /* word */
- if (yytext[0]=='%') // strip % if present
- g_token->name = &yytext[1];
- else
- g_token->name = yytext;
- 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;
- }
-<St_TitleQ>"&"{ID}";" { /* symbol */
- g_token->name = yytext;
- return TK_SYMBOL;
- }
-<St_TitleQ>{SPCMD1} |
-<St_TitleQ>{SPCMD2} { /* special command */
- g_token->name = yytext+1;
- g_token->paramDir=TokenInfo::Unspecified;
- return TK_COMMAND;
- }
-<St_TitleQ>{WORD1NQ} |
-<St_TitleQ>{WORD2NQ} { /* word */
- g_token->name = yytext;
- 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;
- }
-<St_TitleQ>\n { /* new line => end of title */
- unput(*yytext);
- 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);
- }
-<St_TitleV>[^ \t\r\n]+ { // attribute value
- g_token->chars = yytext;
- BEGIN(St_TitleN);
- return TK_WORD;
- }
-<St_TitleV,St_TitleA>. {
- unput(*yytext);
- return 0;
- }
-<St_TitleV,St_TitleA>\n {
- return 0;
- }
-
-<St_Ref>{REFWORD} { // label to refer to
- g_token->name=yytext;
- return TK_WORD;
- }
-<St_Ref>{BLANK} { // white space
- unput(' ');
- return 0;
- }
-<St_Ref>{WS}+"\"" { // white space following by quoted string
- BEGIN(St_Ref2);
- }
-<St_Ref>\n { // new line
- unput(*yytext);
- return 0;
- }
-<St_Ref>. { // any other character
- unput(*yytext);
- return 0;
- }
-<St_IntRef>[A-Z_a-z0-9.:/#\-\+\(\)]+ {
- g_token->name = yytext;
- return TK_WORD;
- }
-<St_IntRef>{BLANK}+"\"" {
- BEGIN(St_Ref2);
- }
-<St_Ref2>"&"{ID}";" { /* symbol */
- g_token->name = yytext;
- return TK_SYMBOL;
- }
-<St_Ref2>{SPCMD1} |
-<St_Ref2>{SPCMD2} { /* special command */
- g_token->name = yytext+1;
- g_token->paramDir=TokenInfo::Unspecified;
- return TK_COMMAND;
- }
-<St_Ref2>{WORD1NQ} |
-<St_Ref2>{WORD2NQ} {
- /* word */
- g_token->name = yytext;
- return TK_WORD;
- }
-<St_Ref2>[ \t]+ {
- g_token->chars=yytext;
- return TK_WHITESPACE;
- }
-<St_Ref2>"\""|\n { /* " or \n => end of title */
- return 0;
- }
-<St_XRefItem>{ID} {
- g_token->name=yytext;
- }
-<St_XRefItem>" " {
- BEGIN(St_XRefItem2);
- }
-<St_XRefItem2>[0-9]+\n {
- QString numStr=yytext;
- numStr=numStr.left(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);
- }
-<St_Param>"\""[^\n\"]+"\"" {
- g_token->name = yytext+1;
- g_token->name = g_token->name.left(yyleng-2);
- return TK_WORD;
- }
-<St_Param>[^ \t\n,]+ {
- g_token->name = yytext;
- return TK_WORD;
- }
-<St_Param>{WS}*","{WS}* /* param separator */
-<St_Param>{WS} {
- g_token->chars=yytext;
- return TK_WHITESPACE;
- }
-<St_File>{FILEMASK} {
- g_token->name = yytext;
- return TK_WORD;
- }
-<St_File>"\""[^\n\"]+"\"" {
- QString text=yytext;
- g_token->name = text.mid(1,text.length()-2);
- return TK_WORD;
- }
-<St_Pattern>[^\r\n]+ {
- g_token->name = yytext;
- g_token->name = g_token->name.stripWhiteSpace();
- return TK_WORD;
- }
-<St_Link>{LINKMASK} {
- g_token->name = yytext;
- return TK_WORD;
- }
-<St_Comment>"-->" { /* end of html comment */
- BEGIN(g_commentState);
- }
-<St_Comment>[^-\n]+ /* inside html comment */
-<St_Comment>. /* inside html comment */
-
- /* State for skipping title (all chars until the end of the line) */
-
-<St_SkipTitle>.
-<St_SkipTitle>\n { return 0; }
-
- /* State for the pass used to find the anchors and sections */
-
-<St_Sections>[^\n@\\]+
-<St_Sections>"@@"|"\\\\"
-<St_Sections>{CMD}"anchor"{BLANK}+ {
- g_secType = SectionInfo::Anchor;
- BEGIN(St_SecLabel1);
- }
-<St_Sections>{CMD}"section"{BLANK}+ {
- g_secType = SectionInfo::Section;
- BEGIN(St_SecLabel2);
- }
-<St_Sections>{CMD}"subsection"{BLANK}+ {
- g_secType = SectionInfo::Subsection;
- BEGIN(St_SecLabel2);
- }
-<St_Sections>{CMD}"subsubsection"{BLANK}+ {
- g_secType = SectionInfo::Subsubsection;
- BEGIN(St_SecLabel2);
- }
-<St_Sections>{CMD}"paragraph"{BLANK}+ {
- g_secType = SectionInfo::Paragraph;
- BEGIN(St_SecLabel2);
- }
-<St_Sections>{CMD}"verbatim"/[^a-z_A-Z0-9] {
- g_endMarker="endverbatim";
- BEGIN(St_SecSkip);
- }
-<St_Sections>{CMD}"dot"/[^a-z_A-Z0-9] {
- g_endMarker="enddot";
- BEGIN(St_SecSkip);
- }
-<St_Sections>{CMD}"htmlonly"/[^a-z_A-Z0-9] {
- g_endMarker="endhtmlonly";
- BEGIN(St_SecSkip);
- }
-<St_Sections>{CMD}"latexonly"/[^a-z_A-Z0-9] {
- g_endMarker="endlatexonly";
- BEGIN(St_SecSkip);
- }
-<St_Sections>{CMD}"xmlonly"/[^a-z_A-Z0-9] {
- g_endMarker="endxmlonly";
- BEGIN(St_SecSkip);
- }
-<St_Sections>{CMD}"code"/[^a-z_A-Z0-9] {
- g_endMarker="endcode";
- BEGIN(St_SecSkip);
- }
-<St_Sections>"<!--" {
- g_endMarker="-->";
- BEGIN(St_SecSkip);
- }
-<St_SecSkip>{CMD}{ID} {
- if (strcmp(yytext+1,g_endMarker)==0)
- {
- BEGIN(St_Sections);
- }
- }
-<St_SecSkip>"-->" {
- if (strcmp(yytext,g_endMarker)==0)
- {
- BEGIN(St_Sections);
- }
- }
-<St_SecSkip>[^a-z_A-Z0-9\-\\\@]+
-<St_SecSkip>.
-<St_SecSkip>\n
-<St_Sections>.
-<St_Sections>\n
-<St_SecLabel1>{LABELID} {
- g_secLabel = yytext;
- processSection();
- BEGIN(St_Sections);
- }
-<St_SecLabel2>{LABELID}{BLANK}+ |
-<St_SecLabel2>{LABELID} {
- g_secLabel = yytext;
- g_secLabel = g_secLabel.stripWhiteSpace();
- BEGIN(St_SecTitle);
- }
-<St_SecTitle>[^\n]+ |
-<St_SecTitle>[^\n]*\n {
- g_secTitle = yytext;
- g_secTitle = g_secTitle.stripWhiteSpace();
- processSection();
- BEGIN(St_Sections);
- }
-<St_SecTitle,St_SecLabel1,St_SecLabel2>. {
- warn(g_fileName,yylineno,"Error: Unexpected character `%s' while looking for section label or title",yytext);
- }
-
- /* Generic rules that work for all states */
-<*>\n {
- warn(g_fileName,yylineno,"Error: Unexpected new line character");
- }
-<*>[\\@<>&$#%~] { /* unescaped special character */
- //warn(g_fileName,yylineno,"Warning: Unexpected character `%s', assuming command \\%s was meant.",yytext,yytext);
- g_token->name = yytext;
- return TK_COMMAND;
- }
-<*>. {
- warn(g_fileName,yylineno,"Error: Unexpected character `%s'",yytext);
- }
-%%
-
-//--------------------------------------------------------------------------
-
-void doctokenizerYYFindSections(const char *input,Definition *d,
- MemberGroup *mg,const char *fileName)
-{
- if (input==0) return;
- g_inputString = input;
- //printf("parsing --->`%s'<---\n",input);
- g_inputPos = 0;
- g_definition = d;
- g_memberGroup = mg;
- g_fileName = fileName;
- BEGIN(St_Sections);
- doctokenizerYYlineno = 1;
- doctokenizerYYlex();
-}
-
-void doctokenizerYYinit(const char *input,const char *fileName)
-{
- g_inputString = input;
- g_inputPos = 0;
- g_fileName = fileName;
- g_insidePre = FALSE;
- BEGIN(St_Para);
-}
-
-void doctokenizerYYsetStatePara()
-{
- BEGIN(St_Para);
-}
-
-void doctokenizerYYsetStateTitle()
-{
- BEGIN(St_Title);
-}
-
-void doctokenizerYYsetStateTitleAttrValue()
-{
- BEGIN(St_TitleV);
-}
-
-void doctokenizerYYsetStateCode()
-{
- g_token->verb="";
- BEGIN(St_Code);
-}
-
-void doctokenizerYYsetStateXmlCode()
-{
- g_token->verb="";
- BEGIN(St_XmlCode);
-}
-
-void doctokenizerYYsetStateHtmlOnly()
-{
- g_token->verb="";
- BEGIN(St_HtmlOnly);
-}
-
-void doctokenizerYYsetStateManOnly()
-{
- g_token->verb="";
- BEGIN(St_ManOnly);
-}
-
-void doctokenizerYYsetStateXmlOnly()
-{
- g_token->verb="";
- BEGIN(St_XmlOnly);
-}
-
-void doctokenizerYYsetStateLatexOnly()
-{
- g_token->verb="";
- BEGIN(St_LatexOnly);
-}
-
-void doctokenizerYYsetStateVerbatim()
-{
- g_token->verb="";
- BEGIN(St_Verbatim);
-}
-
-void doctokenizerYYsetStateDot()
-{
- g_token->verb="";
- BEGIN(St_Dot);
-}
-
-void doctokenizerYYsetStateParam()
-{
- BEGIN(St_Param);
-}
-
-void doctokenizerYYsetStateXRefItem()
-{
- BEGIN(St_XRefItem);
-}
-
-void doctokenizerYYsetStateFile()
-{
- BEGIN(St_File);
-}
-
-void doctokenizerYYsetStatePattern()
-{
- BEGIN(St_Pattern);
-}
-
-void doctokenizerYYsetStateLink()
-{
- BEGIN(St_Link);
-}
-
-void doctokenizerYYsetStateRef()
-{
- BEGIN(St_Ref);
-}
-
-void doctokenizerYYsetStateInternalRef()
-{
- BEGIN(St_IntRef);
-}
-
-void doctokenizerYYsetStateText()
-{
- BEGIN(St_Text);
-}
-
-void doctokenizerYYsetStateSkipTitle()
-{
- BEGIN(St_SkipTitle);
-}
-
-void doctokenizerYYcleanup()
-{
- yy_delete_buffer( YY_CURRENT_BUFFER );
-}
-
-void doctokenizerYYsetInsidePre(bool b)
-{
- g_insidePre = b;
-}
-
-#if !defined(YY_FLEX_SUBMINOR_VERSION)
-extern "C" { // some bogus code to keep the compiler happy
- void doctokenizerYYdummy() { yy_flex_realloc(0,0); }
-}
-#endif
-
diff --git a/src/docvisitor.h b/src/docvisitor.h
deleted file mode 100644
index b3a1551..0000000
--- a/src/docvisitor.h
+++ /dev/null
@@ -1,183 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 _DOCVISITOR_H
-#define _DOCVISITOR_H
-
-// ids
-const int DocVisitor_Html = 0;
-const int DocVisitor_Latex = 1;
-const int DocVisitor_XML = 2;
-const int DocVisitor_RTF = 3;
-const int DocVisitor_Man = 4;
-const int DocVisitor_Other = 5;
-
-// forward declarations
-class DocWord;
-class DocWhiteSpace;
-class DocAutoList;
-class DocAutoListItem;
-class DocPara;
-class DocRoot;
-class DocSymbol;
-class DocURL;
-class DocStyleChange;
-class DocSimpleSect;
-class DocTitle;
-class DocSimpleList;
-class DocSimpleListItem;
-class DocSection;
-class DocVerbatim;
-class DocXRefItem;
-class DocHtmlList;
-class DocHtmlListItem;
-class DocHtmlDescList;
-class DocHtmlDescTitle;
-class DocHtmlDescData;
-class DocHtmlTable;
-class DocHtmlRow;
-class DocHtmlCell;
-class DocHtmlCaption;
-class DocLineBreak;
-class DocHorRuler;
-class DocAnchor;
-class DocIndexEntry;
-class DocInternal;
-class DocHRef;
-class DocInclude;
-class DocIncOperator;
-class DocHtmlHeader;
-class DocImage;
-class DocDotFile;
-class DocLink;
-class DocRef;
-class DocFormula;
-class DocSecRefItem;
-class DocSecRefList;
-//class DocLanguage;
-class DocLinkedWord;
-class DocParamSect;
-class DocParamList;
-class DocInternalRef;
-class DocCopy;
-class DocText;
-
-/*! @brief Abstract visitor that participates in the visitor pattern.
- */
-class DocVisitor
-{
- int m_id;
- public:
- DocVisitor(int id) : m_id(id) {}
- virtual ~DocVisitor() {}
- int id() const { return m_id; }
-
- /*! @name Visitor functions for leaf nodes
- * @{
- */
- virtual void visit(DocWord *) = 0;
- virtual void visit(DocWhiteSpace *) = 0;
- virtual void visit(DocSymbol *) = 0;
- virtual void visit(DocURL *) = 0;
- virtual void visit(DocStyleChange *) = 0;
- virtual void visit(DocVerbatim *) = 0;
- virtual void visit(DocLineBreak *) = 0;
- virtual void visit(DocHorRuler *) = 0;
- virtual void visit(DocAnchor *) = 0;
- virtual void visit(DocInclude *) = 0;
- virtual void visit(DocIncOperator *) = 0;
- virtual void visit(DocFormula *) = 0;
- virtual void visit(DocLinkedWord *) = 0;
- virtual void visit(DocIndexEntry *) = 0;
- /*! @} */
-
- /*! @name Visitor functions for internal nodes
- * @{
- */
- virtual void visitPre(DocAutoList *) = 0;
- virtual void visitPost(DocAutoList *) = 0;
- virtual void visitPre(DocAutoListItem *) = 0;
- virtual void visitPost(DocAutoListItem *) = 0;
- virtual void visitPre(DocPara *) = 0;
- virtual void visitPost(DocPara *) = 0;
- virtual void visitPre(DocRoot *) = 0;
- virtual void visitPost(DocRoot *) = 0;
- virtual void visitPre(DocSimpleSect *) = 0;
- virtual void visitPost(DocSimpleSect *) = 0;
- virtual void visitPre(DocTitle *) = 0;
- virtual void visitPost(DocTitle *) = 0;
- virtual void visitPre(DocSimpleList *) = 0;
- virtual void visitPost(DocSimpleList *) = 0;
- virtual void visitPre(DocSimpleListItem *) = 0;
- virtual void visitPost(DocSimpleListItem *) = 0;
- virtual void visitPre(DocSection *) = 0;
- virtual void visitPost(DocSection *) = 0;
- virtual void visitPre(DocHtmlList *) = 0;
- virtual void visitPost(DocHtmlListItem *) = 0;
- virtual void visitPre(DocHtmlListItem *) = 0;
- virtual void visitPost(DocHtmlList *) = 0;
- virtual void visitPre(DocHtmlDescList *) = 0;
- virtual void visitPost(DocHtmlDescList *) = 0;
- virtual void visitPre(DocHtmlDescTitle *) = 0;
- virtual void visitPost(DocHtmlDescTitle *) = 0;
- virtual void visitPre(DocHtmlDescData *) = 0;
- virtual void visitPost(DocHtmlDescData *) = 0;
- virtual void visitPre(DocHtmlTable *) = 0;
- virtual void visitPost(DocHtmlRow *) = 0;
- virtual void visitPre(DocHtmlCell *) = 0;
- virtual void visitPost(DocHtmlCell *) = 0;
- virtual void visitPre(DocHtmlRow *) = 0;
- virtual void visitPost(DocHtmlTable *) = 0;
- virtual void visitPre(DocHtmlCaption *) = 0;
- virtual void visitPost(DocHtmlCaption *) = 0;
- virtual void visitPre(DocInternal *) = 0;
- virtual void visitPost(DocInternal *) = 0;
- virtual void visitPre(DocHRef *) = 0;
- virtual void visitPost(DocHRef *) = 0;
- virtual void visitPre(DocHtmlHeader *) = 0;
- virtual void visitPost(DocHtmlHeader *) = 0;
- virtual void visitPre(DocImage *) = 0;
- virtual void visitPost(DocImage *) = 0;
- virtual void visitPre(DocDotFile *) = 0;
- virtual void visitPost(DocDotFile *) = 0;
- virtual void visitPre(DocLink *) = 0;
- virtual void visitPost(DocLink *) = 0;
- virtual void visitPre(DocRef *) = 0;
- virtual void visitPost(DocRef *) = 0;
- virtual void visitPre(DocSecRefItem *) = 0;
- virtual void visitPost(DocSecRefItem *) = 0;
- virtual void visitPre(DocSecRefList *) = 0;
- virtual void visitPost(DocSecRefList *) = 0;
- //virtual void visitPre(DocLanguage *) = 0;
- //virtual void visitPost(DocLanguage *) = 0;
- virtual void visitPre(DocParamSect *) = 0;
- virtual void visitPost(DocParamSect *) = 0;
- virtual void visitPre(DocParamList *) = 0;
- virtual void visitPost(DocParamList *) = 0;
- virtual void visitPre(DocXRefItem *) = 0;
- virtual void visitPost(DocXRefItem *) = 0;
- virtual void visitPre(DocInternalRef *) = 0;
- virtual void visitPost(DocInternalRef *) = 0;
- virtual void visitPre(DocCopy *) = 0;
- virtual void visitPost(DocCopy *) = 0;
- virtual void visitPre(DocText *) = 0;
- virtual void visitPost(DocText *) = 0;
- /*! @} */
-};
-
-#endif
diff --git a/src/dot.cpp b/src/dot.cpp
deleted file mode 100644
index c501a39..0000000
--- a/src/dot.cpp
+++ /dev/null
@@ -1,3097 +0,0 @@
-/*****************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-
-#include <stdlib.h>
-
-#include "dot.h"
-#include "doxygen.h"
-#include "message.h"
-#include "util.h"
-#include "config.h"
-#include "language.h"
-#include "defargs.h"
-#include "docparser.h"
-#include "debug.h"
-#include "pagedef.h"
-
-#include <qdir.h>
-#include <qfile.h>
-#include <qtextstream.h>
-#include <md5.h>
-
-
-//--------------------------------------------------------------------
-
-static const int maxCmdLine = 40960;
-
-/*! mapping from protection levels to color names */
-static const char *edgeColorMap[] =
-{
- "midnightblue", // Public
- "darkgreen", // Protected
- "firebrick4", // Private
- "darkorchid3", // "use" relation
- "grey75", // Undocumented
- "orange" // template relation
-};
-
-static const char *arrowStyle[] =
-{
- "empty", // Public
- "empty", // Protected
- "empty", // Private
- "open", // "use" relation
- 0, // Undocumented
- 0 // template relation
-};
-
-static const char *edgeStyleMap[] =
-{
- "solid", // inheritance
- "dashed" // usage
-};
-
-static void writeGraphHeader(QTextStream &t)
-{
- t << "digraph G" << endl;
- t << "{" << endl;
- if (Config_getBool("DOT_TRANSPARENT"))
- {
- t << " bgcolor=\"transparent\";" << endl;
- }
- t << " edge [fontname=\"Helvetica\",fontsize=10,"
- "labelfontname=\"Helvetica\",labelfontsize=10];\n";
- t << " node [fontname=\"Helvetica\",fontsize=10,shape=record];\n";
-}
-
-static void writeGraphFooter(QTextStream &t)
-{
- t << "}" << endl;
-}
-
-/*! converts the rectangles in a server site image map into a client
- * site image map.
- * \param t the stream to which the result is written.
- * \param mapName the name of the map file.
- * \param relPath the relative path to the root of the output directory
- * (used in case CREATE_SUBDIRS is enabled).
- * \param urlOnly if FALSE the url field in the map contains an external
- * references followed by a $ and then the URL.
- * \returns TRUE if succesful.
- */
-static bool convertMapFile(QTextStream &t,const char *mapName,
- const QCString relPath, bool urlOnly=FALSE)
-{
- QFile f(mapName);
- if (!f.open(IO_ReadOnly))
- {
- err("Error opening map file %s for inclusion in the docs!\n",mapName);
- return FALSE;
- }
- const int maxLineLen=1024;
- char buf[maxLineLen];
- char url[maxLineLen];
- char ref[maxLineLen];
- int x1,y1,x2,y2;
- while (!f.atEnd())
- {
- bool isRef = FALSE;
- int numBytes = f.readLine(buf,maxLineLen);
- buf[numBytes-1]='\0';
- //printf("ReadLine `%s'\n",buf);
- if (strncmp(buf,"rect",4)==0)
- {
- // obtain the url and the coordinates in the order used by graphviz-1.5
- sscanf(buf,"rect %s %d,%d %d,%d",url,&x1,&y1,&x2,&y2);
-
- if ( strcmp(url,"\\ref") == 0 )
- {
- isRef = TRUE;
- sscanf(buf,"rect %s %s %d,%d %d,%d",ref,url,&x1,&y1,&x2,&y2);
- }
-
- // later versions of graphviz corrected the y coordinate order
- // the rule is that y2>=y1, so test and switch if needed
- if (y2<y1)
- {
- int temp=y2;
- y2=y1;
- y1=temp;
- }
- // there shouldn't be any need for this for known versions of graphviz
- // but it can't do any harm to check that x follows the rules as well
- if (x2<x1)
- {
- int temp=x2;
- x2=x1;
- x1=temp;
- }
- if (urlOnly)
- {
- t << "<area href=\"";
-
- if ( isRef )
- {
- // handle doxygen \ref tag URL reference
- QCString *dest;
- DocRef *df = new DocRef( (DocNode*) 0, url );
- if (!df->ref().isEmpty())
- {
- if ((dest=Doxygen::tagDestinationDict[df->ref()])) t << *dest << "/";
- }
- if (!df->file().isEmpty()) t << relPath << df->file() << Doxygen::htmlFileExtension;
- if (!df->anchor().isEmpty()) t << "#" << df->anchor();
- }
- else
- {
- t << url;
- }
- t << "\" shape=\"rect\" coords=\""
- << x1 << "," << y1 << "," << x2 << "," << y2 << "\""
- << " alt=\"\">" << endl;
- }
- else // name and external reference are separated by a $
- {
- char *refPtr = url;
- char *urlPtr = strchr(url,'$');
- //printf("url=`%s'\n",url);
- if (urlPtr)
- {
- QCString *dest;
- *urlPtr++='\0';
- //printf("refPtr=`%s' urlPtr=`%s'\n",refPtr,urlPtr);
- //printf("Found url=%s coords=%d,%d,%d,%d\n",url,x1,y1,x2,y2);
- t << "<area ";
- if (*refPtr!='\0')
- {
- t << "doxygen=\"" << refPtr << ":";
- if ((dest=Doxygen::tagDestinationDict[refPtr])) t << *dest << "/";
- t << "\" ";
- }
- t << "href=\"" << relPath;
- if (*refPtr!='\0')
- {
- if ((dest=Doxygen::tagDestinationDict[refPtr])) t << *dest << "/";
- }
- t << urlPtr << "\" shape=\"rect\" coords=\""
- << x1 << "," << y1 << "," << x2 << "," << y2 << "\""
- << " alt=\"\">" << endl;
- }
- }
- }
- }
-
- return TRUE;
-}
-
-static QArray<int> * s_newNumber = new QArray<int>();
-static int s_max_newNumber=0;
-
-inline int reNumberNode(int number, bool doReNumbering)
-{
- if (!doReNumbering)
- {
- return number;
- }
- else
- {
- int s = s_newNumber->size();
- if (number>=s)
- {
- int ns=0;
- ns = s * 3 / 2 + 5; // new size
- if (number>=ns) // number still doesn't fit
- {
- ns = number * 3 / 2 + 5;
- }
- s_newNumber->resize(ns);
- for (int i=s;i<ns;i++) // clear new part of the array
- {
- s_newNumber->at(i)=0;
- }
- }
- int i = s_newNumber->at(number);
- if (i == 0) // not yet mapped
- {
- i = ++s_max_newNumber; // start from 1
- s_newNumber->at(number) = i;
- }
- return i;
- }
-}
-
-static void resetReNumbering()
-{
- s_max_newNumber=0;
- s_newNumber->resize(s_max_newNumber);
-}
-
-static bool readBoundingBoxDot(const char *fileName,int *width,int *height)
-{
- QFile f(fileName);
- if (!f.open(IO_ReadOnly)) return FALSE;
- const int maxLineLen=1024;
- char buf[maxLineLen];
- while (!f.atEnd())
- {
- int numBytes = f.readLine(buf,maxLineLen);
- buf[numBytes-1]='\0';
- if (strncmp(buf,"\tgraph [bb",10)==0)
- {
- int x,y;
- if (sscanf(buf,"\tgraph [bb= \"%d,%d,%d,%d\"];",&x,&y,width,height)!=4)
- {
- return FALSE;
- }
- return TRUE;
- }
- }
- return FALSE;
-}
-
-static bool readBoundingBoxEPS(const char *fileName,int *width,int *height)
-{
- QFile f(fileName);
- if (!f.open(IO_ReadOnly)) return FALSE;
- const int maxLineLen=1024;
- char buf[maxLineLen];
- while (!f.atEnd())
- {
- int numBytes = f.readLine(buf,maxLineLen);
- buf[numBytes-1]='\0';
- if (strncmp(buf,"%%BoundingBox: ",15)==0)
- {
- int x,y;
- if (sscanf(buf,"%%%%BoundingBox: %d %d %d %d",&x,&y,width,height)!=4)
- {
- return FALSE;
- }
- return TRUE;
- }
- }
- return FALSE;
-}
-
-#if 0
-/*! returns TRUE if class cd is a leaf (i.e. has no visible children)
- */
-static bool isLeaf(ClassDef *cd)
-{
- BaseClassList *bcl = cd->subClasses();
- if (bcl->count()>0) // class has children, check their visibility
- {
- BaseClassListIterator bcli(*bcl);
- BaseClassDef *bcd;
- for ( ; (bcd=bcli.current()); ++bcli )
- {
- ClassDef *bClass = bcd->classDef;
- //if (bClass->isLinkable() || !isLeaf(bClass)) return FALSE;
-
- // if class is not a leaf
- if (!isLeaf(bClass)) return FALSE;
- // or class is not documented in this project
- if (!Config_getBool("ALLEXTERNALS") && !bClass->isLinkableInProject()) return FALSE;
- // or class is not documented and all ALLEXTERNALS = YES
- if (Config_getBool("ALLEXTERNALS") && !bClass->isLinkable()) return FALSE;
- }
- }
- return TRUE;
-}
-#endif
-
-// since dot silently reproduces the input file when it does not
-// support the PNG format, we need to check the result.
-static void checkDotResult(const QCString &imgName)
-{
- if (Config_getEnum("DOT_IMAGE_FORMAT")=="png")
- {
- QFile f(imgName);
- if (f.open(IO_ReadOnly))
- {
- char data[4];
- if (f.readBlock(data,4)==4)
- {
- if (!(data[1]=='P' && data[2]=='N' && data[3]=='G'))
- {
- err("Error! Image `%s' produced by dot is not a valid PNG!\n"
- "You should either select a different format "
- "(DOT_IMAGE_FORMAT in the config file) or install a more "
- "recent version of graphviz (1.7+)\n",imgName.data()
- );
- }
- }
- else
- {
- err("Error: Could not read image `%s' generated by dot!\n",imgName.data());
- }
- }
- else
- {
- err("Error: Could not open image `%s' generated by dot!\n",imgName.data());
- }
- }
-}
-
-/*! Checks if a file "baseName".md5 exists. If so the contents
- * are compared with \a md5. If equal FALSE is returned. If the .md5
- * file does not exist or its contents are not equal to \a md5,
- * a new .md5 is generated with the \a md5 string as contents.
- */
-static bool checkAndUpdateMd5Signature(const QCString &baseName,const QCString &md5)
-{
- QFile f(baseName+".md5");
- if (f.open(IO_ReadOnly))
- {
- // read checksum
- QCString md5stored(33);
- int bytesRead=f.readBlock(md5stored.data(),32);
- // compare checksum
- if (bytesRead==32 && md5==md5stored)
- {
- // bail out if equal
- return FALSE;
- }
- }
- f.close();
- // create checksum file
- if (f.open(IO_WriteOnly))
- {
- f.writeBlock(md5.data(),32);
- f.close();
- }
- return TRUE;
-}
-
-//--------------------------------------------------------------------
-
-class DotNodeList : public QList<DotNode>
-{
- public:
- DotNodeList() : QList<DotNode>() {}
- ~DotNodeList() {}
- int compareItems(GCI item1,GCI item2)
- {
- return stricmp(((DotNode *)item1)->m_label,((DotNode *)item2)->m_label);
- }
-};
-
-//--------------------------------------------------------------------
-
-DotRunner::DotRunner(const char *file) : m_file(file)
-{
- m_jobs.setAutoDelete(TRUE);
-}
-
-void DotRunner::addJob(const char *format,const char *output)
-{
- QCString args = QCString("-T")+format+" -o \""+output+"\"";
- m_jobs.append(new QCString(args));
-}
-
-bool DotRunner::run()
-{
- QListIterator<QCString> li(m_jobs);
- QCString *s;
- if (Config_getBool("DOT_MULTI_TARGETS"))
- {
- QCString dotArgs="\""+m_file+"\"";
- for (li.toFirst();(s=li.current());++li)
- {
- dotArgs+=' ';
- dotArgs+=*s;
- }
- if (iSystem(Config_getString("DOT_PATH")+"dot",dotArgs)!=0)
- {
- goto error;
- }
- }
- else
- {
- for (li.toFirst();(s=li.current());++li)
- {
- QCString dotArgs="\""+m_file+"\" "+*s;
- if (iSystem(Config_getString("DOT_PATH")+"dot",dotArgs)!=0)
- {
- goto error;
- }
- }
- }
- return TRUE;
-error:
- err("Problems running dot. Check your installation!\n");
- return FALSE;
-}
-
-//--------------------------------------------------------------------
-
-
-/*! helper function that deletes all nodes in a connected graph, given
- * one of the graph's nodes
- */
-static void deleteNodes(DotNode *node,SDict<DotNode> *skipNodes=0)
-{
- //printf("deleteNodes skipNodes=%p\n",skipNodes);
- static DotNodeList deletedNodes;
- deletedNodes.setAutoDelete(TRUE);
- node->deleteNode(deletedNodes,skipNodes); // collect nodes to be deleted.
- deletedNodes.clear(); // actually remove the nodes.
-}
-
-DotNode::DotNode(int n,const char *lab,const char *url,int distance,
- bool isRoot,ClassDef *cd)
- : m_number(n), m_label(lab), m_url(url), m_isRoot(isRoot), m_classDef(cd)
-{
- m_children = 0;
- m_edgeInfo = 0;
- m_parents = 0;
- m_subgraphId =-1;
- m_deleted = FALSE;
- m_written = FALSE;
- m_hasDoc = FALSE;
- m_distance = distance;
-}
-
-DotNode::~DotNode()
-{
- delete m_children;
- delete m_parents;
- delete m_edgeInfo;
-}
-
-void DotNode::setDistance(int distance)
-{
- if (distance<m_distance) m_distance=distance;
-}
-
-void DotNode::addChild(DotNode *n,
- int edgeColor,
- int edgeStyle,
- const char *edgeLab,
- const char *edgeURL,
- int edgeLabCol
- )
-{
- if (m_children==0)
- {
- m_children = new QList<DotNode>;
- m_edgeInfo = new QList<EdgeInfo>;
- m_edgeInfo->setAutoDelete(TRUE);
- }
- m_children->append(n);
- EdgeInfo *ei = new EdgeInfo;
- ei->m_color = edgeColor;
- ei->m_style = edgeStyle;
- ei->m_label = edgeLab;
- ei->m_url = edgeURL;
- if (edgeLabCol==-1)
- ei->m_labColor=edgeColor;
- else
- ei->m_labColor=edgeLabCol;
- m_edgeInfo->append(ei);
-}
-
-void DotNode::addParent(DotNode *n)
-{
- if (m_parents==0)
- {
- m_parents = new QList<DotNode>;
- }
- m_parents->append(n);
-}
-
-void DotNode::removeChild(DotNode *n)
-{
- if (m_children) m_children->remove(n);
-}
-
-void DotNode::removeParent(DotNode *n)
-{
- if (m_parents) m_parents->remove(n);
-}
-
-void DotNode::deleteNode(DotNodeList &deletedList,SDict<DotNode> *skipNodes)
-{
- if (m_deleted) return; // avoid recursive loops in case the graph has cycles
- m_deleted=TRUE;
- if (m_parents!=0) // delete all parent nodes of this node
- {
- QListIterator<DotNode> dnlip(*m_parents);
- DotNode *pn;
- for (dnlip.toFirst();(pn=dnlip.current());++dnlip)
- {
- //pn->removeChild(this);
- pn->deleteNode(deletedList,skipNodes);
- }
- }
- if (m_children!=0) // delete all child nodes of this node
- {
- QListIterator<DotNode> dnlic(*m_children);
- DotNode *cn;
- for (dnlic.toFirst();(cn=dnlic.current());++dnlic)
- {
- //cn->removeParent(this);
- cn->deleteNode(deletedList,skipNodes);
- }
- }
- // add this node to the list of deleted nodes.
- //printf("skipNodes=%p find(%p)=%p\n",skipNodes,this,skipNodes ? skipNodes->find((int)this) : 0);
- if (skipNodes==0 || skipNodes->find((char*)this)==0)
- {
- //printf("deleting\n");
- deletedList.append(this);
- }
-}
-
-static QCString convertLabel(const QCString &l)
-{
- QCString result;
- const char *p=l.data();
- char c;
- while ((c=*p++))
- {
- switch(c)
- {
- case '\\': result+="\\\\"; break;
- case '\n': result+="\\n"; break;
- case '<': result+="\\<"; break;
- case '>': result+="\\>"; break;
- case '|': result+="\\|"; break;
- case '"': result+="\\\""; break;
- default: result+=c; break;
- }
- }
- return result;
-}
-
-static void writeBoxMemberList(QTextStream &t,char prot,MemberList &ml,ClassDef *scope)
-{
- MemberListIterator mlia(ml);
- MemberDef *mma;
- for (mlia.toFirst();(mma = mlia.current());++mlia)
- {
- if (mma->getClassDef() == scope)
- {
- t << prot << " " << convertLabel(mma->name());
- if (!mma->isObjCMethod() && mma->isFunction()) t << "()";
- t << "\\l";
- }
- }
- // write member groups within the memberlist
- MemberGroupList *mgl = ml.getMemberGroupList();
- if (mgl)
- {
- MemberGroupListIterator mgli(*mgl);
- MemberGroup *mg;
- for (mgli.toFirst();(mg=mgli.current());++mgli)
- {
- if (mg->members())
- {
- writeBoxMemberList(t,prot,*mg->members(),scope);
- }
- }
- }
-}
-
-void DotNode::writeBox(QTextStream &t,
- GraphType gt,
- GraphOutputFormat /*format*/,
- bool hasNonReachableChildren,
- bool reNumber)
-{
- const char *labCol =
- m_url.isEmpty() ? "grey75" : // non link
- (
- (hasNonReachableChildren) ? "red" : "black"
- );
- t << " Node" << reNumberNode(m_number,reNumber) << " [label=\"";
-
- if (m_classDef && Config_getBool("UML_LOOK") &&
- (gt==Inheritance || gt==Collaboration))
- {
- t << "{" << convertLabel(m_label);
- t << "\\n|";
- writeBoxMemberList(t,'+',m_classDef->pubAttribs,m_classDef);
- writeBoxMemberList(t,'+',m_classDef->pubStaticAttribs,m_classDef);
- writeBoxMemberList(t,'~',m_classDef->pacAttribs,m_classDef);
- writeBoxMemberList(t,'~',m_classDef->pacStaticAttribs,m_classDef);
- writeBoxMemberList(t,'#',m_classDef->proAttribs,m_classDef);
- writeBoxMemberList(t,'#',m_classDef->proStaticAttribs,m_classDef);
- writeBoxMemberList(t,'-',m_classDef->priAttribs,m_classDef);
- writeBoxMemberList(t,'-',m_classDef->priStaticAttribs,m_classDef);
- t << "|";
- writeBoxMemberList(t,'+',m_classDef->pubMethods,m_classDef);
- writeBoxMemberList(t,'+',m_classDef->pubStaticMethods,m_classDef);
- writeBoxMemberList(t,'+',m_classDef->pubSlots,m_classDef);
- writeBoxMemberList(t,'~',m_classDef->pacMethods,m_classDef);
- writeBoxMemberList(t,'~',m_classDef->pacStaticMethods,m_classDef);
- writeBoxMemberList(t,'#',m_classDef->proMethods,m_classDef);
- writeBoxMemberList(t,'#',m_classDef->proStaticMethods,m_classDef);
- writeBoxMemberList(t,'#',m_classDef->proSlots,m_classDef);
- writeBoxMemberList(t,'-',m_classDef->priMethods,m_classDef);
- writeBoxMemberList(t,'-',m_classDef->priStaticMethods,m_classDef);
- writeBoxMemberList(t,'-',m_classDef->priSlots,m_classDef);
- if (m_classDef->memberGroupSDict)
- {
- MemberGroupSDict::Iterator mgdi(*m_classDef->memberGroupSDict);
- MemberGroup *mg;
- for (mgdi.toFirst();(mg=mgdi.current());++mgdi)
- {
- if (mg->members())
- {
- writeBoxMemberList(t,'*',*mg->members(),m_classDef);
- }
- }
- }
- t << "}";
- }
- else // old look
- {
- t << convertLabel(m_label);
- }
- t << "\",height=0.2,width=0.4";
- if (m_isRoot)
- {
- t << ",color=\"white\", fillcolor=\"black\", style=\"filled\" fontcolor=\"white\"";
- }
- else
- {
- if (!Config_getBool("DOT_TRANSPARENT"))
- {
- t << ",color=\"" << labCol << "\", fillcolor=\"white\", style=\"filled\"";
- }
- else
- {
- t << ",color=\"" << labCol << "\"";
- }
- if (!m_url.isEmpty())
- {
- int anchorPos = m_url.findRev('#');
- if (anchorPos==-1)
- {
- t << ",URL=\"" << m_url << Doxygen::htmlFileExtension << "\"";
- }
- else
- {
- t << ",URL=\"" << m_url.left(anchorPos) << Doxygen::htmlFileExtension
- << m_url.right(m_url.length()-anchorPos) << "\"";
- }
- }
- }
- t << "];" << endl;
-}
-
-void DotNode::writeArrow(QTextStream &t,
- GraphType gt,
- GraphOutputFormat format,
- DotNode *cn,
- EdgeInfo *ei,
- bool topDown,
- bool pointBack,
- bool reNumber
- )
-{
- t << " Node";
- if (topDown) t << reNumberNode(cn->number(),reNumber); else t << reNumberNode(m_number,reNumber);
- t << " -> Node";
- if (topDown) t << reNumberNode(m_number,reNumber); else t << reNumberNode(cn->number(),reNumber);
- t << " [";
- if (pointBack) t << "dir=back,";
- t << "color=\"" << edgeColorMap[ei->m_color]
- << "\",fontsize=10,style=\"" << edgeStyleMap[ei->m_style] << "\"";
- if (!ei->m_label.isEmpty())
- {
- t << ",label=\"" << convertLabel(ei->m_label) << "\"";
- }
- if (Config_getBool("UML_LOOK") &&
- arrowStyle[ei->m_color] &&
- (gt==Inheritance || gt==Collaboration)
- )
- {
- if (pointBack)
- t << ",arrowtail=\"" <<arrowStyle[ei->m_color] << "\"";
- else
- t << ",arrowhead=\"" << arrowStyle[ei->m_color] << "\"";
- }
-
- if (format==BITMAP) t << ",fontname=\"Helvetica\"";
- t << "];" << endl;
-}
-
-void DotNode::write(QTextStream &t,
- GraphType gt,
- GraphOutputFormat format,
- bool topDown,
- bool toChildren,
- int distance,
- bool backArrows,
- bool reNumber
- )
-{
- //printf("DotNode::write(%d) name=%s this=%p written=%d\n",distance,m_label.data(),this,m_written);
- if (m_written) return; // node already written to the output
- if (m_distance>distance) return;
- QList<DotNode> *nl = toChildren ? m_children : m_parents;
- bool hasNonReachableChildren=FALSE;
- if (m_distance==distance && nl)
- {
- QListIterator<DotNode> dnli(*nl);
- DotNode *cn;
- for (dnli.toFirst();(cn=dnli.current());++dnli)
- {
- if (cn->m_distance>distance) hasNonReachableChildren=TRUE;
- }
- }
- writeBox(t,gt,format,hasNonReachableChildren,reNumber);
- m_written=TRUE;
- if (nl)
- {
- if (toChildren)
- {
- QListIterator<DotNode> dnli1(*nl);
- QListIterator<EdgeInfo> dnli2(*m_edgeInfo);
- DotNode *cn;
- for (dnli1.toFirst();(cn=dnli1.current());++dnli1,++dnli2)
- {
- if (cn->m_distance<=distance)
- {
- //printf("write arrow %s%s%s\n",label().data(),backArrows?"<-":"->",cn->label().data());
- writeArrow(t,gt,format,cn,dnli2.current(),topDown,backArrows,reNumber);
- }
- cn->write(t,gt,format,topDown,toChildren,distance,backArrows,reNumber);
- }
- }
- else // render parents
- {
- QListIterator<DotNode> dnli(*nl);
- DotNode *pn;
- for (dnli.toFirst();(pn=dnli.current());++dnli)
- {
- if (pn->m_distance<=distance)
- {
- //printf("write arrow %s%s%s\n",label().data(),backArrows?"<-":"->",pn->label().data());
- writeArrow(t,
- gt,
- format,
- pn,
- pn->m_edgeInfo->at(pn->m_children->findRef(this)),
- FALSE,
- backArrows,
- reNumber
- );
- }
- pn->write(t,gt,format,TRUE,FALSE,distance,backArrows,reNumber);
- }
- }
- }
- //printf("end DotNode::write(%d) name=%s\n",distance,m_label.data());
-}
-
-void DotNode::writeXML(QTextStream &t,bool isClassGraph)
-{
- t << " <node id=\"" << m_number << "\">" << endl;
- t << " <label>" << convertToXML(m_label) << "</label>" << endl;
- if (!m_url.isEmpty())
- {
- QCString url(m_url);
- char *refPtr = url.data();
- char *urlPtr = strchr(url.data(),'$');
- if (urlPtr)
- {
- *urlPtr++='\0';
- t << " <link refid=\"" << convertToXML(urlPtr) << "\"";
- if (*refPtr!='\0')
- {
- t << " external=\"" << convertToXML(refPtr) << "\"";
- }
- t << "/>" << endl;
- }
- }
- if (m_children)
- {
- QListIterator<DotNode> nli(*m_children);
- QListIterator<EdgeInfo> eli(*m_edgeInfo);
- DotNode *childNode;
- EdgeInfo *edgeInfo;
- for (;(childNode=nli.current());++nli,++eli)
- {
- edgeInfo=eli.current();
- t << " <childnode refid=\"" << childNode->m_number << "\" relation=\"";
- if (isClassGraph)
- {
- switch(edgeInfo->m_color)
- {
- case EdgeInfo::Blue: t << "public-inheritance"; break;
- case EdgeInfo::Green: t << "protected-inheritance"; break;
- case EdgeInfo::Red: t << "private-inheritance"; break;
- case EdgeInfo::Purple: t << "usage"; break;
- case EdgeInfo::Orange: t << "template-instance"; break;
- case EdgeInfo::Grey: ASSERT(0); break;
- }
- }
- else // include graph
- {
- t << "include";
- }
- t << "\">" << endl;
- if (!edgeInfo->m_label.isEmpty())
- {
- int p=0;
- int ni;
- while ((ni=edgeInfo->m_label.find("\\n",p))!=-1)
- {
- t << " <edgelabel>"
- << convertToXML(edgeInfo->m_label.mid(p,ni-p))
- << "</edgelabel>" << endl;
- p=ni+2;
- }
- t << " <edgelabel>"
- << convertToXML(edgeInfo->m_label.right(edgeInfo->m_label.length()-p))
- << "</edgelabel>" << endl;
- }
- t << " </childnode>" << endl;
- }
- }
- t << " </node>" << endl;
-}
-
-
-void DotNode::writeDEF(QTextStream &t)
-{
- char* nodePrefix = " node-";
-
- t << " node = {" << endl;
- t << nodePrefix << "id = " << m_number << ';' << endl;
- t << nodePrefix << "label = '" << m_label << "';" << endl;
-
- if (!m_url.isEmpty())
- {
- QCString url(m_url);
- char *refPtr = url.data();
- char *urlPtr = strchr(url.data(),'$');
- if (urlPtr)
- {
- *urlPtr++='\0';
- t << nodePrefix << "link = {" << endl << " "
- << nodePrefix << "link-id = '" << urlPtr << "';" << endl;
-
- if (*refPtr!='\0')
- {
- t << " " << nodePrefix << "link-external = '"
- << refPtr << "';" << endl;
- }
- t << " };" << endl;
- }
- }
- if (m_children)
- {
- QListIterator<DotNode> nli(*m_children);
- QListIterator<EdgeInfo> eli(*m_edgeInfo);
- DotNode *childNode;
- EdgeInfo *edgeInfo;
- for (;(childNode=nli.current());++nli,++eli)
- {
- edgeInfo=eli.current();
- t << " node-child = {" << endl;
- t << " child-id = '" << childNode->m_number << "';" << endl;
- t << " relation = ";
-
- switch(edgeInfo->m_color)
- {
- case EdgeInfo::Blue: t << "public-inheritance"; break;
- case EdgeInfo::Green: t << "protected-inheritance"; break;
- case EdgeInfo::Red: t << "private-inheritance"; break;
- case EdgeInfo::Purple: t << "usage"; break;
- case EdgeInfo::Orange: t << "template-instance"; break;
- case EdgeInfo::Grey: ASSERT(0); break;
- }
- t << ';' << endl;
-
- if (!edgeInfo->m_label.isEmpty())
- {
- t << " edgelabel = <<_EnD_oF_dEf_TeXt_" << endl
- << edgeInfo->m_label << endl
- << "_EnD_oF_dEf_TeXt_;" << endl;
- }
- t << " }; /* node-child */" << endl;
- } /* for (;childNode...) */
- }
- t << " }; /* node */" << endl;
-}
-
-
-void DotNode::clearWriteFlag()
-{
- m_written=FALSE;
- if (m_parents!=0)
- {
- QListIterator<DotNode> dnlip(*m_parents);
- DotNode *pn;
- for (dnlip.toFirst();(pn=dnlip.current());++dnlip)
- {
- if (pn->m_written)
- {
- pn->clearWriteFlag();
- }
- }
- }
- if (m_children!=0)
- {
- QListIterator<DotNode> dnlic(*m_children);
- DotNode *cn;
- for (dnlic.toFirst();(cn=dnlic.current());++dnlic)
- {
- if (cn->m_written)
- {
- cn->clearWriteFlag();
- }
- }
- }
-}
-
-void DotNode::colorConnectedNodes(int curColor)
-{
- if (m_children)
- {
- QListIterator<DotNode> dnlic(*m_children);
- DotNode *cn;
- for (dnlic.toFirst();(cn=dnlic.current());++dnlic)
- {
- if (cn->m_subgraphId==-1) // uncolored child node
- {
- cn->m_subgraphId=curColor;
- cn->colorConnectedNodes(curColor);
- //printf("coloring node %s (%p): %d\n",cn->m_label.data(),cn,cn->m_subgraphId);
- }
- }
- }
-
- if (m_parents)
- {
- QListIterator<DotNode> dnlip(*m_parents);
- DotNode *pn;
- for (dnlip.toFirst();(pn=dnlip.current());++dnlip)
- {
- if (pn->m_subgraphId==-1) // uncolored parent node
- {
- pn->m_subgraphId=curColor;
- pn->colorConnectedNodes(curColor);
- //printf("coloring node %s (%p): %d\n",pn->m_label.data(),pn,pn->m_subgraphId);
- }
- }
- }
-}
-
-const DotNode *DotNode::findDocNode() const
-{
- if (!m_url.isEmpty()) return this;
- //printf("findDocNode(): `%s'\n",m_label.data());
- if (m_parents)
- {
- QListIterator<DotNode> dnli(*m_parents);
- DotNode *pn;
- for (dnli.toFirst();(pn=dnli.current());++dnli)
- {
- if (!pn->m_hasDoc)
- {
- pn->m_hasDoc=TRUE;
- const DotNode *dn = pn->findDocNode();
- if (dn) return dn;
- }
- }
- }
- if (m_children)
- {
- QListIterator<DotNode> dnli(*m_children);
- DotNode *cn;
- for (dnli.toFirst();(cn=dnli.current());++dnli)
- {
- if (!cn->m_hasDoc)
- {
- cn->m_hasDoc=TRUE;
- const DotNode *dn = cn->findDocNode();
- if (dn) return dn;
- }
- }
- }
- return 0;
-}
-
-//--------------------------------------------------------------------
-
-int DotGfxHierarchyTable::m_curNodeNumber;
-
-void DotGfxHierarchyTable::writeGraph(QTextStream &out,const char *path)
-{
- //printf("DotGfxHierarchyTable::writeGraph(%s)\n",name);
- //printf("m_rootNodes=%p count=%d\n",m_rootNodes,m_rootNodes->count());
- if (m_rootSubgraphs->count()==0) return;
-
- QDir d(path);
- // store the original directory
- if (!d.exists())
- {
- err("Error: Output dir %s does not exist!\n",path); exit(1);
- }
- QCString oldDir = convertToQCString(QDir::currentDirPath());
- // go to the html output directory (i.e. path)
- QDir::setCurrent(d.absPath());
- QDir thisDir;
-
- // 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)
- {
- QCString baseName;
- QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
- baseName.sprintf("inherit_graph_%d",count++);
- baseName = convertNameToFile(baseName);
- QCString imgName=baseName+"."+ imgExt;
- QCString mapName=baseName+".map";
- QListIterator<DotNode> dnli2(*m_rootNodes);
- DotNode *node;
-
- // compute md5 checksum of the graph were are about to generate
- QString buf;
- QTextStream md5stream(&buf,IO_WriteOnly);
- for (dnli2.toFirst();(node=dnli2.current());++dnli2)
- {
- if (node->m_subgraphId==n->m_subgraphId)
- {
- node->clearWriteFlag();
- }
- }
- for (dnli2.toFirst();(node=dnli2.current());++dnli2)
- {
- if (node->m_subgraphId==n->m_subgraphId)
- {
- node->write(md5stream,DotNode::Hierarchy,BITMAP,FALSE,TRUE,1000,TRUE,TRUE);
- }
- }
- resetReNumbering();
- uchar md5_sig[16];
- QCString sigStr(33);
- MD5Buffer((const unsigned char *)buf.ascii(),buf.length(),md5_sig);
- MD5SigToString(md5_sig,sigStr.data(),33);
- if (checkAndUpdateMd5Signature(baseName,sigStr) ||
- !QFileInfo(mapName).exists())
- {
- // image was new or has changed
- QCString dotName=baseName+".dot";
- QFile f(dotName);
- if (!f.open(IO_WriteOnly)) return;
- QTextStream t(&f);
- writeGraphHeader(t);
- t << " rankdir=LR;" << endl;
- for (dnli2.toFirst();(node=dnli2.current());++dnli2)
- {
- if (node->m_subgraphId==n->m_subgraphId)
- {
- node->clearWriteFlag();
- }
- }
- for (dnli2.toFirst();(node=dnli2.current());++dnli2)
- {
- if (node->m_subgraphId==n->m_subgraphId)
- {
- node->write(t,DotNode::Hierarchy,BITMAP,FALSE,TRUE,1000,TRUE,TRUE);
- }
- }
- writeGraphFooter(t);
- f.close();
- resetReNumbering();
-
- DotRunner dotRun(dotName);
- dotRun.addJob(imgExt,imgName);
- dotRun.addJob("imap",mapName);
- if (!dotRun.run())
- {
- out << "</table>" << endl;
- return;
- }
-
- checkDotResult(imgName);
- if (Config_getBool("DOT_CLEANUP")) thisDir.remove(dotName);
- }
- // write image and map in a table row
- QCString mapLabel = convertNameToFile(n->m_label);
- out << "<tr><td><img src=\"" << imgName << "\" border=\"0\" alt=\"\" usemap=\"#"
- << mapLabel << "_map\">" << endl;
- out << "<map name=\"" << mapLabel << "_map\">" << endl;
- convertMapFile(out,mapName,"");
- out << "</map></td></tr>" << endl;
- //thisDir.remove(mapName);
- }
- out << "</table>" << endl;
-
- QDir::setCurrent(oldDir);
-}
-
-void DotGfxHierarchyTable::addHierarchy(DotNode *n,ClassDef *cd,bool hideSuper)
-{
- //printf("addHierarchy `%s' baseClasses=%d\n",cd->name().data(),cd->baseClasses()->count());
- 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->isVisibleInHierarchy() && hasVisibleRoot(bClass->baseClasses()))
- {
- DotNode *bn;
- //printf(" Node `%s' Found visible class=`%s'\n",n->m_label.data(),
- // bClass->name().data());
- if ((bn=m_usedNodes->find(bClass->name()))) // node already present
- {
- if (n->m_children==0 || n->m_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->m_label.data(),
- // bn->m_label.data(),
- // bn->m_children ? bn->m_children->count() : 0,
- // bn->m_parents ? bn->m_parents->count() : 0
- // );
- }
- //else
- //{
- // printf(" Class already has an arrow!\n");
- //}
- }
- else
- {
- QCString tmp_url="";
- if (bClass->isLinkable() && !bClass->isHidden())
- {
- tmp_url=bClass->getReference()+"$"+bClass->getOutputFileBase();
- }
- bn = new DotNode(m_curNodeNumber++,
- bClass->displayName(),
- 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->m_label.data(),
- // bn->m_label.data(),
- // bn->m_children ? bn->m_children->count() : 0,
- // bn->m_parents ? bn->m_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->visited && !hideSuper && bClass->subClasses()->count()>0)
- {
- bool wasVisited=bClass->visited;
- bClass->visited=TRUE;
- addHierarchy(bn,bClass,wasVisited);
- }
- }
- }
- //printf("end addHierarchy\n");
-}
-
-void DotGfxHierarchyTable::addClassList(ClassSDict *cl)
-{
- ClassSDict::Iterator cli(*cl);
- ClassDef *cd;
- for (cli.toLast();(cd=cli.current());--cli)
- {
- //printf("Trying %s subClasses=%d\n",cd->name().data(),cd->subClasses()->count());
- if (!hasVisibleRoot(cd->baseClasses()) &&
- cd->isVisibleInHierarchy()
- ) // root node in the forest
- {
- QCString tmp_url="";
- if (cd->isLinkable() && !cd->isHidden())
- {
- tmp_url=cd->getReference()+"$"+cd->getOutputFileBase();
- }
- //printf("Inserting root class %s\n",cd->name().data());
- DotNode *n = new DotNode(m_curNodeNumber++,
- cd->displayName(),
- tmp_url.data());
-
- //m_usedNodes->clear();
- m_usedNodes->insert(cd->name(),n);
- m_rootNodes->insert(0,n);
- if (!cd->visited && cd->subClasses()->count()>0)
- {
- addHierarchy(n,cd,cd->visited);
- cd->visited=TRUE;
- }
- }
- }
-}
-
-DotGfxHierarchyTable::DotGfxHierarchyTable()
-{
- m_curNodeNumber=0;
- 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);
- // m_usedNodes now contains all nodes in the graph
-
- // color the graph into a set of independent subgraphs
- 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)
- {
- if (n->m_subgraphId==-1) // not yet colored
- {
- //printf("Starting at node %s (%p): %d\n",n->m_label.data(),n,curColor);
- done=FALSE; // still uncolored nodes
- n->m_subgraphId=curColor;
- n->colorConnectedNodes(curColor);
- curColor++;
- const DotNode *dn=n->findDocNode();
- if (dn!=0)
- m_rootSubgraphs->inSort(dn);
- else
- m_rootSubgraphs->inSort(n);
- }
- }
- }
-
- //printf("Number of independent subgraphs: %d\n",curColor);
- //QListIterator<DotNode> dnli2(*m_rootSubgraphs);
- //DotNode *n;
- //for (dnli2.toFirst();(n=dnli2.current());++dnli2)
- //{
- // printf("Node %s color=%d (c=%d,p=%d)\n",
- // n->m_label.data(),n->m_subgraphId,
- // n->m_children?n->m_children->count():0,
- // n->m_parents?n->m_parents->count():0);
- //}
-}
-
-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;
-}
-
-//--------------------------------------------------------------------
-
-int DotClassGraph::m_curNodeNumber = 0;
-
-void DotClassGraph::addClass(ClassDef *cd,DotNode *n,int prot,
- const char *label,int distance,const char *usedName,const char *templSpec,bool base)
-{
- if (Config_getBool("HIDE_UNDOC_CLASSES") && !cd->isLinkable()) return;
-
- int edgeStyle = (label || prot==EdgeInfo::Orange) ? EdgeInfo::Dashed : EdgeInfo::Solid;
- QCString className;
- if (usedName) // name is a typedef
- {
- className=usedName;
- }
- else if (templSpec) // name has a template part
- {
- className=insertTemplateSpecifierInScope(cd->name(),templSpec);
- }
- else // just a normal name
- {
- className=cd->displayName();
- }
- //printf("DotClassGraph::addClass(class=`%s',parent=%s,prot=%d,label=%s,dist=%d,usedName=%s,templSpec=%s,base=%d)\n",
- // className.data(),n->m_label.data(),prot,label,distance,usedName,templSpec,base);
- DotNode *bn = m_usedNodes->find(className);
- if (bn) // class already inserted
- {
- if (base)
- {
- n->addChild(bn,prot,edgeStyle,label);
- bn->addParent(n);
- }
- else
- {
- bn->addChild(n,prot,edgeStyle,label);
- n->addParent(bn);
- }
- bn->setDistance(distance);
- //printf(" add exiting node %s of %s\n",bn->m_label.data(),n->m_label.data());
- }
- else // new class
- {
- QCString displayName=className;
- if (Config_getBool("HIDE_SCOPE_NAMES")) displayName=stripScope(displayName);
- QCString tmp_url;
- if (cd->isLinkable() && !cd->isHidden())
- {
- tmp_url=cd->getReference()+"$"+cd->getOutputFileBase();
- }
- bn = new DotNode(m_curNodeNumber++,
- displayName,
- tmp_url.data(),
- distance,
- FALSE, // rootNode
- cd
- );
- if (distance>m_maxDistance) m_maxDistance=distance;
- if (base)
- {
- n->addChild(bn,prot,edgeStyle,label);
- bn->addParent(n);
- }
- else
- {
- bn->addChild(n,prot,edgeStyle,label);
- n->addParent(bn);
- }
- m_usedNodes->insert(className,bn);
- //printf(" add new child node `%s' to %s hidden=%d url=%s\n",
- // className.data(),n->m_label.data(),cd->isHidden(),tmp_url.data());
-
- // we use <=, i.s.o < to cause one more level than intended which is used to
- // detect truncated nodes
- if (distance<=m_recDepth) buildGraph(cd,bn,distance+1,base);
- }
-}
-
-void DotClassGraph::buildGraph(ClassDef *cd,DotNode *n,int distance,bool base)
-{
- //printf("DocClassGraph::buildGraph(%s,distance=%d,base=%d)\n",
- // cd->name().data(),distance,base);
- // ---- Add inheritance relations
-
- if (m_graphType == DotNode::Inheritance || m_graphType==DotNode::Collaboration)
- {
- BaseClassListIterator bcli(base ? *cd->baseClasses() : *cd->subClasses());
- 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,distance,bcd->usedName,
- bcd->templSpecifiers,base);
- }
- }
- if (m_graphType == DotNode::Collaboration)
- {
- // ---- Add usage relations
-
- UsesClassDict *dict =
- base ? cd->usedImplementationClasses() :
- cd->usedByImplementationClasses()
- ;
- if (dict)
- {
- UsesClassDictIterator ucdi(*dict);
- UsesClassDef *ucd;
- for (;(ucd=ucdi.current());++ucdi)
- {
- //if (base)
- //{
- // printf("%s uses %s\n",cd->name().data(),ucd->classDef->name().data());
- //}
- //else
- //{
- // printf("%s is used by %s\n",cd->name().data(),ucd->classDef->name().data());
- //}
- //printf("drawing\n");
- QCString label;
- QDictIterator<void> dvi(*ucd->accessors);
- const char *s;
- bool first=TRUE;
- for (;(s=dvi.currentKey());++dvi)
- {
- if (first)
- {
- label=s;
- first=FALSE;
- }
- else
- {
- label+=QCString("\n")+s;
- }
- }
- addClass(ucd->classDef,n,EdgeInfo::Purple,label,distance,0,
- ucd->templSpecifiers,base);
- }
- }
- }
-
- // ---- Add template instantiation relations
-
- if (Config_getBool("TEMPLATE_RELATIONS"))
- {
- if (base) // template relations for base classes
- {
- ClassDef *templMaster=cd->templateMaster();
- if (templMaster)
- {
- QDictIterator<ClassDef> cli(*templMaster->getTemplateInstances());
- ClassDef *templInstance;
- for (;(templInstance=cli.current());++cli)
- {
- if (templInstance==cd)
- {
- addClass(templMaster,n,EdgeInfo::Orange,cli.currentKey(),distance,0,
- 0,TRUE);
- }
- }
- }
- }
- else // template relations for super classes
- {
- QDict<ClassDef> *templInstances = cd->getTemplateInstances();
- if (templInstances)
- {
- QDictIterator<ClassDef> cli(*templInstances);
- ClassDef *templInstance;
- for (;(templInstance=cli.current());++cli)
- {
- addClass(templInstance,n,EdgeInfo::Orange,cli.currentKey(),distance,0,
- 0,FALSE);
- }
- }
- }
- }
-}
-
-DotClassGraph::DotClassGraph(ClassDef *cd,DotNode::GraphType t,int maxRecursionDepth)
-{
- //printf("--------------- DotClassGraph::DotClassGraph `%s'\n",cd->displayName().data());
- m_graphType = t;
- m_maxDistance = 0;
- m_recDepth = maxRecursionDepth;
- QCString tmp_url="";
- if (cd->isLinkable() && !cd->isHidden())
- {
- tmp_url=cd->getReference()+"$"+cd->getOutputFileBase();
- }
- QCString className = cd->displayName();
- //if (cd->templateArguments())
- //{
- // className+=tempArgListToString(cd->templateArguments());
- //}
- m_startNode = new DotNode(m_curNodeNumber++,
- className,
- tmp_url.data(),
- 0, // distance
- TRUE, // is a root node
- cd
- );
- m_usedNodes = new QDict<DotNode>(1009);
- m_usedNodes->insert(className,m_startNode);
-
- //ClassSDict::Iterator cli(Doxygen::classSDict);
- //ClassDef *icd;
- //for (cli.toFirst();(icd=cli.current());++cli) icd->initTemplateMapping();
-
- //printf("Root node %s\n",cd->name().data());
- if (m_recDepth>0)
- {
- buildGraph(cd,m_startNode,1,TRUE);
- if (t==DotNode::Inheritance) buildGraph(cd,m_startNode,1,FALSE);
- }
- m_diskName = cd->getFileBase().copy();
-}
-
-bool DotClassGraph::isTrivial() const
-{
- if (m_graphType==DotNode::Inheritance)
- return m_startNode->m_children==0 && m_startNode->m_parents==0;
- else
- return m_startNode->m_children==0;
-}
-
-DotClassGraph::~DotClassGraph()
-{
- deleteNodes(m_startNode);
- delete m_usedNodes;
-}
-
-void writeDotGraph(DotNode *root,
- DotNode::GraphType gt,
- GraphOutputFormat format,
- const QCString &baseName,
- bool lrRank,
- bool renderParents,
- int distance,
- bool backArrows,
- bool reNumber
- )
-{
- // generate the graph description for dot
- //printf("writeDotGraph(%s,%d,lrRank=%d)\n",baseName.data(),backArrows,lrRank);
- QFile f;
- f.setName(baseName+".dot");
- if (f.open(IO_WriteOnly))
- {
- QTextStream t(&f);
- writeGraphHeader(t);
- if (lrRank)
- {
- t << " rankdir=LR;" << endl;
- }
- root->clearWriteFlag();
- root->write(t,gt,format,gt!=DotNode::CallGraph,TRUE,distance,backArrows,reNumber);
- if (renderParents && root->m_parents)
- {
- //printf("rendering parents!\n");
- QListIterator<DotNode> dnli(*root->m_parents);
- DotNode *pn;
- for (dnli.toFirst();(pn=dnli.current());++dnli)
- {
- if (pn->m_distance<=distance)
- {
- root->writeArrow(t,
- gt,
- format,
- pn,
- pn->m_edgeInfo->at(pn->m_children->findRef(root)),
- FALSE,
- backArrows,
- reNumber
- );
- }
- pn->write(t,gt,format,TRUE,FALSE,distance,backArrows,reNumber);
- }
- }
- writeGraphFooter(t);
- f.close();
- }
-}
-
-/*! Computes a 16 byte md5 checksum for a given dot graph.
- * The md5 checksum is returned as a 32 character ASCII string.
- */
-QCString computeMd5Signature(DotNode *root,
- DotNode::GraphType gt,
- GraphOutputFormat format,
- bool lrRank,
- bool renderParents,
- int distance,
- bool backArrows
- )
-{
- bool reNumber=TRUE;
-
- //printf("computeMd5Signature\n");
- QString buf;
- QTextStream md5stream(&buf,IO_WriteOnly);
- if (lrRank)
- {
- md5stream << "rankdir=LR;" << endl;
- }
- root->clearWriteFlag();
- root->write(md5stream,gt,format,gt!=DotNode::CallGraph,TRUE,distance,backArrows,reNumber);
- if (renderParents && root->m_parents)
- {
- QListIterator<DotNode> dnli(*root->m_parents);
- DotNode *pn;
- for (dnli.toFirst();(pn=dnli.current());++dnli)
- {
- if (pn->m_distance<=distance)
- {
- root->writeArrow(md5stream,
- gt,
- format,
- pn,
- pn->m_edgeInfo->at(pn->m_children->findRef(root)),
- FALSE,
- backArrows,
- reNumber
- );
- }
- pn->write(md5stream,gt,format,TRUE,FALSE,distance,backArrows,reNumber);
- }
- }
- uchar md5_sig[16];
- QCString sigStr(33);
- MD5Buffer((const unsigned char *)buf.ascii(),buf.length(),md5_sig);
- MD5SigToString(md5_sig,sigStr.data(),33);
- if (reNumber)
- {
- resetReNumbering();
- }
- //printf("md5: %s | file: %s\n",sigStr,baseName.data());
- return sigStr;
-}
-
-static bool findMaximalDotGraph(DotNode *root,
- int maxDist,
- const QCString &baseName,
- QDir &thisDir,
- DotNode::GraphType gt,
- GraphOutputFormat format,
- bool lrRank /*=FALSE*/,
- bool renderParents /*=FALSE*/,
- bool backArrows /*=TRUE*/
- )
-{
- bool reNumber=TRUE;
- int minDistance=1; // min distance that shows only direct children.
- int curDistance; //=QMIN(2,maxDist); // current distance to try
- int maxDistance=maxDist; // max distance that show whole graph
- int width=0;
- int height=0;
- int maxDotGraphWidth = Config_getInt("MAX_DOT_GRAPH_WIDTH");
- int maxDotGraphHeight = Config_getInt("MAX_DOT_GRAPH_HEIGHT");
- int lastFit=minDistance;
-
- // binary search for the maximal inheritance depth that fits in a reasonable
- // sized image (dimensions: Config_getInt("MAX_DOT_GRAPH_WIDTH"), Config_getInt("MAX_DOT_GRAPH_HEIGHT"))
- while (minDistance<=maxDistance)
- {
- curDistance = (minDistance+maxDistance)/2;
-
- writeDotGraph(root,gt,format,baseName,lrRank,renderParents,
- curDistance,backArrows,reNumber);
-
- // create annotated dot file
- DotRunner dotRun(baseName+".dot");
- dotRun.addJob("dot",baseName+"_tmp.dot");
- if (!dotRun.run())
- {
- return FALSE;
- }
-
- // extract bounding box from the result
- readBoundingBoxDot(baseName+"_tmp.dot",&width,&height);
- width = width *96/72; // 96 pixels/inch, 72 points/inch
- height = height*96/72; // 96 pixels/inch, 72 points/inch
- //printf("Found bounding box (%d,%d) max (%d,%d)\n",width,height,
- // Config_getInt("MAX_DOT_GRAPH_WIDTH"),Config_getInt("MAX_DOT_GRAPH_HEIGHT"));
-
- // remove temporary dot file
- thisDir.remove(baseName+"_tmp.dot");
-
- bool graphFits=(width<maxDotGraphWidth && height<maxDotGraphHeight);
- if (graphFits) // graph is small enough
- {
- lastFit=curDistance;
- minDistance=curDistance+1;
- //printf("Image fits [%d-%d]\n",minDistance,maxDistance);
- }
- else // graph does not fit anymore with curDistance
- {
- //printf("Image does not fit [%d-%d]\n",minDistance,maxDistance);
- maxDistance=curDistance-1;
- }
- }
- //printf("lastFit=%d\n",lastFit);
-
- bool hasLRRank = (lrRank ||
- (minDistance==1 &&
- width>Config_getInt("MAX_DOT_GRAPH_WIDTH") &&
- !Config_getBool("UML_LOOK")
- )
- );
-
- writeDotGraph(root,
- gt,
- format,
- baseName,
- hasLRRank,
- renderParents,
- lastFit,
- backArrows,
- reNumber
- );
- if (reNumber)
- {
- resetReNumbering();
- }
- return TRUE;
-}
-
-QCString DotClassGraph::diskName() const
-{
- QCString result=m_diskName.copy();
- switch (m_graphType)
- {
- case DotNode::Collaboration:
- result+="_coll_graph";
- break;
- //case Interface:
- // result+="_intf_graph";
- // break;
- case DotNode::Inheritance:
- result+="_inherit_graph";
- break;
- default:
- ASSERT(0);
- break;
- }
- return result;
-}
-
-QCString DotClassGraph::writeGraph(QTextStream &out,
- GraphOutputFormat format,
- const char *path,
- const char *relPath,
- bool isTBRank,
- bool generateImageMap)
-{
- QDir d(path);
- // store the original directory
- if (!d.exists())
- {
- err("Error: Output dir %s does not exist!\n",path); exit(1);
- }
- QCString oldDir = convertToQCString(QDir::currentDirPath());
- // go to the html output directory (i.e. path)
- QDir::setCurrent(d.absPath());
- QDir thisDir;
-
- QCString baseName;
- QCString mapName;
- switch (m_graphType)
- {
- case DotNode::Collaboration:
- mapName="coll_map";
- break;
- //case Interface:
- // mapName="intf_map";
- // break;
- case DotNode::Inheritance:
- mapName="inherit_map";
- break;
- default:
- ASSERT(0);
- break;
- }
- baseName = convertNameToFile(diskName());
-
- QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
- QCString md5 = computeMd5Signature(m_startNode, // root
- m_graphType, // gt
- format, // format
- !isTBRank, // lrRank
- m_graphType==DotNode::Inheritance, // renderParent
- QMIN(m_recDepth,m_maxDistance), // maxDist
- TRUE // backArrows
- );
- if (checkAndUpdateMd5Signature(baseName,md5) ||
- !QFileInfo(baseName+".map").exists()
- )
- {
- findMaximalDotGraph(m_startNode, // root
- QMIN(m_recDepth,m_maxDistance), // maxDist
- baseName, // baseName
- thisDir, // thisDir
- m_graphType, // gt
- format, // format
- !isTBRank, // lrRank
- m_graphType==DotNode::Inheritance, // renderParents
- TRUE // backArrows
- );
- if (format==BITMAP) // run dot to create a bitmap image
- {
- QCString dotArgs(maxCmdLine);
- QCString imgName = baseName+"."+imgExt;
-
- DotRunner dotRun(baseName+".dot");
- dotRun.addJob(imgExt,imgName);
- if (generateImageMap) dotRun.addJob("imap",baseName+".map");
- if (!dotRun.run())
- {
- QDir::setCurrent(oldDir);
- return baseName;
- }
-
- checkDotResult(imgName);
- }
- else if (format==EPS) // run dot to create a .eps image
- {
- DotRunner dotRun(baseName+".dot");
- dotRun.addJob("ps",baseName+".eps");
- if (!dotRun.run())
- {
- QDir::setCurrent(oldDir);
- return baseName;
- }
-
- if (Config_getBool("USE_PDFLATEX"))
- {
- QCString epstopdfArgs(maxCmdLine);
- epstopdfArgs.sprintf("\"%s.eps\" --outfile=\"%s.pdf\"",
- baseName.data(),baseName.data());
- if (iSystem("epstopdf",epstopdfArgs,TRUE)!=0)
- {
- err("Error: Problems running epstopdf. Check your TeX installation!\n");
- QDir::setCurrent(oldDir);
- return baseName;
- }
- }
-
- }
- if (Config_getBool("DOT_CLEANUP")) thisDir.remove(baseName+".dot");
- }
-
- if (format==BITMAP && generateImageMap) // run dot to create a image map
- {
- QCString mapLabel = convertNameToFile(m_startNode->m_label+"_"+mapName);
- out << "<p><center><img src=\"" << relPath << baseName << "."
- << imgExt << "\" border=\"0\" usemap=\"#"
- << mapLabel << "\" alt=\"";
- switch (m_graphType)
- {
- case DotNode::Collaboration:
- out << "Collaboration graph";
- break;
- case DotNode::Inheritance:
- out << "Inheritance graph";
- break;
- default:
- ASSERT(0);
- break;
- }
- out << "\"></center>" << endl;
- QString tmpstr;
- QTextOStream tmpout(&tmpstr);
- convertMapFile(tmpout,baseName+".map",relPath);
- if (!tmpstr.isEmpty())
- {
- out << "<map name=\"" << mapLabel << "\">" << endl;
- out << tmpstr;
- out << "</map>" << endl;
- }
- //thisDir.remove(baseName+".map");
- }
- else if (format==EPS) // run dot to create a .eps image
- {
- int width,height;
- if (!readBoundingBoxEPS(baseName+".eps",&width,&height))
- {
- err("Error: Could not extract bounding box from .eps!\n");
- QDir::setCurrent(oldDir);
- return baseName;
- }
- int maxWidth = 420; /* approx. page width in points */
- out << "\\begin{figure}[H]\n"
- "\\begin{center}\n"
- "\\leavevmode\n"
- "\\includegraphics[width=" << QMIN(width/2,maxWidth)
- << "pt]{" << baseName << "}\n"
- "\\end{center}\n"
- "\\end{figure}\n";
- }
-
- QDir::setCurrent(oldDir);
- return baseName;
-}
-
-//--------------------------------------------------------------------
-
-void DotClassGraph::writeXML(QTextStream &t)
-{
- QDictIterator<DotNode> dni(*m_usedNodes);
- DotNode *node;
- for (;(node=dni.current());++dni)
- {
- node->writeXML(t,TRUE);
- }
-}
-
-void DotClassGraph::writeDEF(QTextStream &t)
-{
- QDictIterator<DotNode> dni(*m_usedNodes);
- DotNode *node;
- for (;(node=dni.current());++dni)
- {
- node->writeDEF(t);
- }
-}
-
-//--------------------------------------------------------------------
-
-int DotInclDepGraph::m_curNodeNumber = 0;
-
-void DotInclDepGraph::buildGraph(DotNode *n,FileDef *fd,int distance)
-{
- QList<IncludeInfo> *includeFiles =
- m_inverse ? fd->includedByFileList() : fd->includeFileList();
- QListIterator<IncludeInfo> ili(*includeFiles);
- IncludeInfo *ii;
- for (;(ii=ili.current());++ili)
- {
- FileDef *bfd = ii->fileDef;
- QCString in = ii->includeName;
- //printf(">>>> in=`%s' bfd=%p\n",ii->includeName.data(),bfd);
- bool doc=TRUE,src=FALSE;
- if (bfd)
- {
- in = bfd->absFilePath();
- doc = bfd->isLinkable() && bfd->isHidden();
- src = bfd->generateSourceFile();
- }
- if (doc || src || !Config_getBool("HIDE_UNDOC_RELATIONS"))
- {
- QCString url="";
- if (bfd) url=bfd->getOutputFileBase().copy();
- if (!doc && src)
- {
- url+="-source";
- }
- DotNode *bn = m_usedNodes->find(in);
- if (bn) // file is already a node in the graph
- {
- n->addChild(bn,0,0,0);
- bn->addParent(n);
- bn->setDistance(distance);
- }
- else
- {
- QCString tmp_url;
- if (bfd) tmp_url=doc || src ? bfd->getReference()+"$"+url : QCString();
- bn = new DotNode(
- m_curNodeNumber++,
- ii->includeName,
- tmp_url,
- distance
- );
- if (distance>m_maxDistance) m_maxDistance=distance;
- n->addChild(bn,0,0,0);
- bn->addParent(n);
- m_usedNodes->insert(in,bn);
-
- // we use <=, i.s.o < to cause one more level than intended which is used to
- // detect truncated nodes
- if (bfd && distance<=m_recDepth) buildGraph(bn,bfd,distance+1);
- }
- }
- }
-}
-
-DotInclDepGraph::DotInclDepGraph(FileDef *fd,int maxRecursionDepth,bool inverse)
-{
- m_maxDistance = 0;
- m_recDepth = maxRecursionDepth;
- m_inverse = inverse;
- ASSERT(fd!=0);
- m_diskName = fd->getFileBase().copy();
- QCString tmp_url=fd->getReference()+"$"+fd->getFileBase();
- m_startNode = new DotNode(m_curNodeNumber++,
- fd->docName(),
- tmp_url.data(),
- 0, // distance
- TRUE // root node
- );
- m_usedNodes = new QDict<DotNode>(1009);
- m_usedNodes->insert(fd->absFilePath(),m_startNode);
- buildGraph(m_startNode,fd,1);
-}
-
-DotInclDepGraph::~DotInclDepGraph()
-{
- deleteNodes(m_startNode);
- delete m_usedNodes;
-}
-
-QCString DotInclDepGraph::diskName() const
-{
- QCString result=m_diskName.copy();
- if (m_inverse) result+="_dep";
- result+="_incl";
- return convertNameToFile(result);
-}
-
-QCString DotInclDepGraph::writeGraph(QTextStream &out,
- GraphOutputFormat format,
- const char *path,
- const char *relPath,
- bool generateImageMap
- )
-{
- QDir d(path);
- // store the original directory
- if (!d.exists())
- {
- err("Error: Output dir %s does not exist!\n",path); exit(1);
- }
- QCString oldDir = convertToQCString(QDir::currentDirPath());
- // go to the html output directory (i.e. path)
- QDir::setCurrent(d.absPath());
- QDir thisDir;
-
- QCString baseName=m_diskName;
- if (m_inverse) baseName+="_dep";
- baseName+="_incl";
- baseName=convertNameToFile(baseName);
- QCString mapName=m_startNode->m_label.copy();
- if (m_inverse) mapName+="dep";
- QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
-
- QCString md5 = computeMd5Signature(m_startNode, // root
- DotNode::CallGraph, // gt
- format, // format
- TRUE, // lrRank
- FALSE, // renderParents
- QMIN(m_recDepth,m_maxDistance), // maxDist
- FALSE // backArrows
- );
- if (checkAndUpdateMd5Signature(baseName,md5) ||
- !QFileInfo(baseName+".map").exists()
- )
- {
- findMaximalDotGraph(m_startNode, // root
- QMIN(m_recDepth,m_maxDistance), // maxDist
- baseName, // baseName
- thisDir, // thisDir
- DotNode::CallGraph, // gt
- format, // format
- TRUE, // lrRank
- FALSE, // renderParents
- m_inverse // backArrows
- );
- if (format==BITMAP)
- {
- // run dot to create a bitmap image
- QCString dotArgs(maxCmdLine);
- QCString imgName=baseName+"."+imgExt;
- DotRunner dotRun(baseName+".dot");
- dotRun.addJob(imgExt,imgName);
- if (generateImageMap) dotRun.addJob("imap",baseName+".map");
- if (!dotRun.run())
- {
- QDir::setCurrent(oldDir);
- return baseName;
- }
- checkDotResult(imgName);
- }
- else if (format==EPS)
- {
- // run dot to create a .eps image
- DotRunner dotRun(baseName+".dot");
- dotRun.addJob("ps",baseName+".eps");
- if (!dotRun.run())
- {
- QDir::setCurrent(oldDir);
- return baseName;
- }
- if (Config_getBool("USE_PDFLATEX"))
- {
- QCString epstopdfArgs(maxCmdLine);
- epstopdfArgs.sprintf("\"%s.eps\" --outfile=\"%s.pdf\"",
- baseName.data(),baseName.data());
- if (iSystem("epstopdf",epstopdfArgs,TRUE)!=0)
- {
- err("Error: Problems running epstopdf. Check your TeX installation!\n");
- QDir::setCurrent(oldDir);
- return baseName;
- }
- }
- }
- }
-
- if (format==BITMAP && generateImageMap)
- {
- out << "<p><center><img src=\"" << relPath << baseName << "."
- << imgExt << "\" border=\"0\" usemap=\"#"
- << mapName << "_map\" alt=\"";
- out << "\">";
- out << "</center>" << endl;
- QString tmpstr;
- QTextOStream tmpout(&tmpstr);
- convertMapFile(tmpout,baseName+".map",relPath);
- if (!tmpstr.isEmpty())
- {
- out << "<map name=\"" << mapName << "_map\">" << endl;
- out << tmpstr;
- out << "</map>" << endl;
- }
- //thisDir.remove(baseName+".map");
- }
- else if (format==EPS)
- {
- int width,height;
- if (!readBoundingBoxEPS(baseName+".eps",&width,&height))
- {
- err("Error: Could not extract bounding box from .eps!\n");
- QDir::setCurrent(oldDir);
- return baseName;
- }
- int maxWidth = 420; /* approx. page width in points */
-
- out << "\\begin{figure}[H]\n"
- "\\begin{center}\n"
- "\\leavevmode\n"
- "\\includegraphics[width=" << QMIN(width/2,maxWidth)
- << "pt]{" << baseName << "}\n"
- "\\end{center}\n"
- "\\end{figure}\n";
- }
-
- if (Config_getBool("DOT_CLEANUP")) thisDir.remove(baseName+".dot");
-
- QDir::setCurrent(oldDir);
- return baseName;
-}
-
-bool DotInclDepGraph::isTrivial() const
-{
- return m_startNode->m_children==0;
-}
-
-void DotInclDepGraph::writeXML(QTextStream &t)
-{
- QDictIterator<DotNode> dni(*m_usedNodes);
- DotNode *node;
- for (;(node=dni.current());++dni)
- {
- node->writeXML(t,FALSE);
- }
-}
-
-//-------------------------------------------------------------
-
-int DotCallGraph::m_curNodeNumber = 0;
-
-DotCallGraph::DotCallGraph(MemberDef *md,int maxRecursionDepth)
-{
- m_maxDistance = 0;
- m_recDepth = maxRecursionDepth;
- m_diskName = md->getOutputFileBase()+"_"+md->anchor();
- m_scope = md->getOuterScope();
- QCString uniqueId;
- uniqueId = md->getReference()+"$"+
- md->getOutputFileBase()+"#"+md->anchor();
- QCString name;
- if (Config_getBool("HIDE_SCOPE_NAMES"))
- {
- name = md->name();
- }
- else
- {
- name = md->qualifiedName();
- }
- m_startNode = new DotNode(m_curNodeNumber++,
- linkToText(name,FALSE),
- uniqueId.data(),
- 0, // distance
- TRUE // root node
- );
- m_usedNodes = new QDict<DotNode>(1009);
- m_usedNodes->insert(uniqueId,m_startNode);
- buildGraph(m_startNode,md,1);
-}
-
-DotCallGraph::~DotCallGraph()
-{
- deleteNodes(m_startNode);
- delete m_usedNodes;
-}
-
-QCString DotCallGraph::writeGraph(QTextStream &out, GraphOutputFormat format,
- const char *path,const char *relPath,bool generateImageMap)
-{
- QDir d(path);
- // store the original directory
- if (!d.exists())
- {
- err("Error: Output dir %s does not exist!\n",path); exit(1);
- }
- QCString oldDir = convertToQCString(QDir::currentDirPath());
- // go to the html output directory (i.e. path)
- QDir::setCurrent(d.absPath());
- QDir thisDir;
-
- QCString baseName=m_diskName+"_cgraph";
- QCString mapName=baseName;
- QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
-
- QCString md5 = computeMd5Signature(m_startNode, // root
- DotNode::CallGraph, // gt
- format, // format
- TRUE, // lrRank
- FALSE, // renderParents
- QMIN(m_recDepth,m_maxDistance), // maxDist
- FALSE // backArrows
- );
- if (checkAndUpdateMd5Signature(baseName,md5) ||
- !QFileInfo(baseName+".map").exists()
- )
- {
- findMaximalDotGraph(m_startNode, // root
- QMIN(m_recDepth,m_maxDistance), // maxDist
- baseName, // baseName
- thisDir, // thisDir
- DotNode::CallGraph, // gt
- format, // format
- TRUE, // lrRank
- FALSE, // renderParents
- FALSE // backArrows
- );
- if (format==BITMAP)
- {
- // run dot to create a bitmap image
- QCString dotArgs(maxCmdLine);
- QCString imgName=baseName+"."+imgExt;
- DotRunner dotRun(baseName+".dot");
- dotRun.addJob(imgExt,imgName);
- if (generateImageMap) dotRun.addJob("imap",baseName+".map");
- if (!dotRun.run())
- {
- QDir::setCurrent(oldDir);
- return baseName;
- }
- checkDotResult(imgName);
- }
- else if (format==EPS)
- {
- // run dot to create a .eps image
- DotRunner dotRun(baseName+".dot");
- dotRun.addJob("ps",baseName+".eps");
- if (!dotRun.run())
- {
- QDir::setCurrent(oldDir);
- return baseName;
- }
- if (Config_getBool("USE_PDFLATEX"))
- {
- QCString epstopdfArgs(maxCmdLine);
- epstopdfArgs.sprintf("\"%s.eps\" --outfile=\"%s.pdf\"",
- baseName.data(),baseName.data());
- if (iSystem("epstopdf",epstopdfArgs,TRUE)!=0)
- {
- err("Error: Problems running epstopdf. Check your TeX installation!\n");
- QDir::setCurrent(oldDir);
- return baseName;
- }
- }
- }
- }
-
- if (format==BITMAP && generateImageMap)
- {
- out << "<p><center><img src=\"" << relPath << baseName << "."
- << imgExt << "\" border=\"0\" usemap=\"#"
- << mapName << "_map\" alt=\"";
- out << "\">";
- out << "</center>" << endl;
- QString tmpstr;
- QTextOStream tmpout(&tmpstr);
- convertMapFile(tmpout,baseName+".map",relPath);
- if (!tmpstr.isEmpty())
- {
- out << "<map name=\"" << mapName << "_map\">" << endl;
- out << tmpstr;
- out << "</map>" << endl;
- }
- //thisDir.remove(baseName+".map");
- }
- else if (format==EPS)
- {
- int width,height;
- if (!readBoundingBoxEPS(baseName+".eps",&width,&height))
- {
- err("Error: Could not extract bounding box from .eps!\n");
- QDir::setCurrent(oldDir);
- return baseName;
- }
- int maxWidth = 420; /* approx. page width in points */
-
- out << "\\begin{figure}[H]\n"
- "\\begin{center}\n"
- "\\leavevmode\n"
- "\\includegraphics[width=" << QMIN(width/2,maxWidth)
- << "pt]{" << baseName << "}\n"
- "\\end{center}\n"
- "\\end{figure}\n";
- }
-
- if (Config_getBool("DOT_CLEANUP")) thisDir.remove(baseName+".dot");
-
- QDir::setCurrent(oldDir);
- return baseName;
-}
-
-void DotCallGraph::buildGraph(DotNode *n,MemberDef *md,int distance)
-{
- MemberSDict *refs = md->getReferencesMembers();
- if (refs)
- {
- MemberSDict::Iterator mri(*refs);
- MemberDef *rmd;
- for (;(rmd=mri.current());++mri)
- {
- if (rmd->isFunction())
- {
- QCString uniqueId;
- uniqueId=rmd->getReference()+"$"+
- rmd->getOutputFileBase()+"#"+rmd->anchor();
- DotNode *bn = m_usedNodes->find(uniqueId);
- if (bn) // file is already a node in the graph
- {
- n->addChild(bn,0,0,0);
- bn->addParent(n);
- bn->setDistance(distance);
- }
- else
- {
- QCString name;
- if (Config_getBool("HIDE_SCOPE_NAMES"))
- {
- name = rmd->getOuterScope()==m_scope ?
- rmd->name() : rmd->qualifiedName();
- }
- else
- {
- name = rmd->qualifiedName();
- }
- bn = new DotNode(
- m_curNodeNumber++,
- linkToText(name,FALSE),
- uniqueId,
- distance
- );
- if (distance>m_maxDistance) m_maxDistance=distance;
- n->addChild(bn,0,0,0);
- bn->addParent(n);
- m_usedNodes->insert(uniqueId,bn);
-
- // we use <=, i.s.o < to cause one more level than intended which is used to
- // detect truncated nodes
- if (distance<=m_recDepth) buildGraph(bn,rmd,distance+1);
- }
- }
- }
- }
-}
-
-bool DotCallGraph::isTrivial() const
-{
- return m_startNode->m_children==0;
-}
-
-//-------------------------------------------------------------
-
-DotDirDeps::DotDirDeps(DirDef *dir) : m_dir(dir)
-{
-}
-
-DotDirDeps::~DotDirDeps()
-{
-}
-
-QCString DotDirDeps::writeGraph(QTextStream &out,
- GraphOutputFormat format,
- const char *path,
- const char *relPath,
- bool generateImageMap)
-{
- QDir d(path);
- // store the original directory
- if (!d.exists())
- {
- err("Error: Output dir %s does not exist!\n",path); exit(1);
- }
- QCString oldDir = convertToQCString(QDir::currentDirPath());
- // go to the html output directory (i.e. path)
- QDir::setCurrent(d.absPath());
- QDir thisDir;
-
- QCString baseName=m_dir->getOutputFileBase()+"_dep";
- QCString mapName=baseName;
- QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
-
- // todo: create check, update md5 checksum
- {
- QFile f(baseName+".dot");
- if (!f.open(IO_WriteOnly))
- {
- err("Cannot create file %s.dot for writing!\n",baseName.data());
- }
- QTextStream t(&f);
- m_dir->writeDepGraph(t);
- f.close();
-
- if (format==BITMAP)
- {
- // run dot to create a bitmap image
- QCString dotArgs(maxCmdLine);
- QCString imgName=baseName+"."+imgExt;
- DotRunner dotRun(baseName+".dot");
- dotRun.addJob(imgExt,imgName);
- if (generateImageMap) dotRun.addJob("imap",baseName+".map");
- if (!dotRun.run())
- {
- QDir::setCurrent(oldDir);
- return baseName;
- }
- checkDotResult(imgName);
- }
- else if (format==EPS)
- {
- // run dot to create a .eps image
- DotRunner dotRun(baseName+".dot");
- dotRun.addJob("ps",baseName+".eps");
- if (!dotRun.run())
- {
- QDir::setCurrent(oldDir);
- return baseName;
- }
- if (Config_getBool("USE_PDFLATEX"))
- {
- QCString epstopdfArgs(maxCmdLine);
- epstopdfArgs.sprintf("\"%s.eps\" --outfile=\"%s.pdf\"",
- baseName.data(),baseName.data());
- if (iSystem("epstopdf",epstopdfArgs,TRUE)!=0)
- {
- err("Error: Problems running epstopdf. Check your TeX installation!\n");
- QDir::setCurrent(oldDir);
- return baseName;
- }
- }
- }
- }
-
- if (format==BITMAP && generateImageMap)
- {
- out << "<p><center><img src=\"" << relPath << baseName << "."
- << imgExt << "\" border=\"0\" usemap=\"#"
- << mapName << "_map\" alt=\"";
- out << m_dir->displayName();
- out << "\">";
- out << "</center>" << endl;
- QString tmpstr;
- QTextOStream tmpout(&tmpstr);
- convertMapFile(tmpout,baseName+".map",relPath,TRUE);
- if (!tmpstr.isEmpty())
- {
- out << "<map name=\"" << mapName << "_map\">" << endl;
- out << tmpstr;
- out << "</map>" << endl;
- }
- else
- {
- //printf("Map is empty!\n");
- }
- //thisDir.remove(baseName+".map");
- }
- else if (format==EPS)
- {
- int width,height;
- if (!readBoundingBoxEPS(baseName+".eps",&width,&height))
- {
- err("Error: Could not extract bounding box from .eps!\n");
- QDir::setCurrent(oldDir);
- return baseName;
- }
- int maxWidth = 420; /* approx. page width in points */
-
- out << "\\begin{figure}[H]\n"
- "\\begin{center}\n"
- "\\leavevmode\n"
- "\\includegraphics[width=" << QMIN(width/2,maxWidth)
- << "pt]{" << baseName << "}\n"
- "\\end{center}\n"
- "\\end{figure}\n";
- }
-
- if (Config_getBool("DOT_CLEANUP")) thisDir.remove(baseName+".dot");
-
- QDir::setCurrent(oldDir);
- return baseName;
-
-
-}
-
-bool DotDirDeps::isTrivial() const
-{
- return m_dir->depGraphIsTrivial();
-}
-
-//-------------------------------------------------------------
-
-void generateGraphLegend(const char *path)
-{
- QFile dotFile((QCString)path+"/graph_legend.dot");
- if (!dotFile.open(IO_WriteOnly))
- {
- err("Could not open file %s for writing\n",
- convertToQCString(dotFile.name()).data());
- return;
- }
- QTextStream dotText(&dotFile);
- writeGraphHeader(dotText);
- dotText << " Node9 [shape=\"box\",label=\"Inherited\",fontsize=10,height=0.2,width=0.4,fontname=\"Helvetica\",color=\"black\",style=\"filled\" fontcolor=\"white\"];\n";
- dotText << " Node10 -> Node9 [dir=back,color=\"midnightblue\",fontsize=10,style=\"solid\",fontname=\"Helvetica\"];\n";
- dotText << " Node10 [shape=\"box\",label=\"PublicBase\",fontsize=10,height=0.2,width=0.4,fontname=\"Helvetica\",color=\"black\",URL=\"$classPublicBase" << Doxygen::htmlFileExtension << "\"];\n";
- dotText << " Node11 -> Node10 [dir=back,color=\"midnightblue\",fontsize=10,style=\"solid\",fontname=\"Helvetica\"];\n";
- dotText << " Node11 [shape=\"box\",label=\"Truncated\",fontsize=10,height=0.2,width=0.4,fontname=\"Helvetica\",color=\"red\",URL=\"$classTruncated" << Doxygen::htmlFileExtension << "\"];\n";
- dotText << " Node13 -> Node9 [dir=back,color=\"darkgreen\",fontsize=10,style=\"solid\",fontname=\"Helvetica\"];\n";
- dotText << " Node13 [shape=\"box\",label=\"ProtectedBase\",fontsize=10,height=0.2,width=0.4,fontname=\"Helvetica\",color=\"black\",URL=\"$classProtectedBase" << Doxygen::htmlFileExtension << "\"];\n";
- dotText << " Node14 -> Node9 [dir=back,color=\"firebrick4\",fontsize=10,style=\"solid\",fontname=\"Helvetica\"];\n";
- dotText << " Node14 [shape=\"box\",label=\"PrivateBase\",fontsize=10,height=0.2,width=0.4,fontname=\"Helvetica\",color=\"black\",URL=\"$classPrivateBase" << Doxygen::htmlFileExtension << "\"];\n";
- dotText << " Node15 -> Node9 [dir=back,color=\"midnightblue\",fontsize=10,style=\"solid\",fontname=\"Helvetica\"];\n";
- dotText << " Node15 [shape=\"box\",label=\"Undocumented\",fontsize=10,height=0.2,width=0.4,fontname=\"Helvetica\",color=\"grey75\"];\n";
- dotText << " Node16 -> Node9 [dir=back,color=\"midnightblue\",fontsize=10,style=\"solid\",fontname=\"Helvetica\"];\n";
- dotText << " Node16 [shape=\"box\",label=\"Templ< int >\",fontsize=10,height=0.2,width=0.4,fontname=\"Helvetica\",color=\"black\",URL=\"$classTempl" << Doxygen::htmlFileExtension << "\"];\n";
- dotText << " Node17 -> Node16 [dir=back,color=\"orange\",fontsize=10,style=\"dashed\",label=\"< int >\",fontname=\"Helvetica\"];\n";
- dotText << " Node17 [shape=\"box\",label=\"Templ< T >\",fontsize=10,height=0.2,width=0.4,fontname=\"Helvetica\",color=\"black\",URL=\"$classTempl" << Doxygen::htmlFileExtension << "\"];\n";
- dotText << " Node18 -> Node9 [dir=back,color=\"darkorchid3\",fontsize=10,style=\"dashed\",label=\"m_usedClass\",fontname=\"Helvetica\"];\n";
- dotText << " Node18 [shape=\"box\",label=\"Used\",fontsize=10,height=0.2,width=0.4,fontname=\"Helvetica\",color=\"black\",URL=\"$classUsed" << Doxygen::htmlFileExtension << "\"];\n";
- writeGraphFooter(dotText);
- dotFile.close();
-
- QDir d(path);
- // store the original directory
- if (!d.exists())
- {
- err("Error: Output dir %s does not exist!\n",path); exit(1);
- }
- QCString oldDir = convertToQCString(QDir::currentDirPath());
- // go to the html output directory (i.e. path)
- QDir::setCurrent(d.absPath());
-
- // run dot to generate the a bitmap image from the graph
- QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
- QCString imgName = "graph_legend."+imgExt;
-
- DotRunner dotRun("graph_legend.dot");
- dotRun.addJob(imgExt,imgName);
- if (!dotRun.run())
- {
- QDir::setCurrent(oldDir);
- return;
- }
- checkDotResult(imgName);
- QDir::setCurrent(oldDir);
-}
-
-
-void writeDotGraphFromFile(const char *inFile,const char *outDir,
- const char *outFile,GraphOutputFormat format)
-{
- QCString absOutFile = outDir;
-#ifdef _WIN32
- absOutFile+='\\';
-#else
- absOutFile+='/';
-#endif
- absOutFile+=outFile;
-
- // chdir to the output dir, so dot can find the font file.
- QCString oldDir = convertToQCString(QDir::currentDirPath());
- // go to the html output directory (i.e. path)
- QDir::setCurrent(outDir);
- //printf("Going to dir %s\n",QDir::currentDirPath().data());
-
- //{ // copy input file to output dir.
- // QFile inf(inFile,IO_ReadOnly);
- // QFileInfo infinfo(inf);
- // uint s = infinfo.size();
- // QByteArray a(s);
- // inf.readBlock(a.data(),s);
- // QFile outf(outDir,IO_WriteOnly);
- // outf.writeBlock(a.data(),s);
- //}
-
- QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
- QCString imgName = (QCString)outFile+"."+imgExt;
-
- DotRunner dotRun(inFile);
- if (format==BITMAP)
- dotRun.addJob(imgExt,imgName);
- else // format==EPS
- dotRun.addJob("ps",QCString(outFile)+".eps");
- if (!dotRun.run())
- {
- QDir::setCurrent(oldDir);
- return;
- }
- // Added by Nils Strom
- if ( (format==EPS) && (Config_getBool("USE_PDFLATEX")) )
- {
- QCString epstopdfArgs(maxCmdLine);
- epstopdfArgs.sprintf("\"%s.eps\" --outfile=\"%s.pdf\"",
- outFile,outFile);
- if (iSystem("epstopdf",epstopdfArgs,TRUE)!=0)
- {
- err("Error: Problems running epstopdf. Check your TeX installation!\n");
- }
- }
-
- if (format==BITMAP) checkDotResult(imgName);
-
- QDir::setCurrent(oldDir);
-}
-
-
-/*! Marco Dalla Gasperina [marcodg@attbi.com] added this to allow
- * dotfiles to generate image maps.
- * \param inFile just the basename part of the filename
- * \param outDir output directory
- * \param relPath relative path the to root of the output dir
- * \returns a string which is the HTML image map (without the \<map\>\</map\>)
- */
-QString getDotImageMapFromFile(const QString& inFile, const QString& outDir,
- const QCString &relPath)
-{
- QString outFile = inFile + ".map";
-
- // chdir to the output dir, so dot can find the font file.
- QCString oldDir = convertToQCString(QDir::currentDirPath());
- // go to the html output directory (i.e. path)
- QDir::setCurrent(outDir);
- //printf("Going to dir %s\n",QDir::currentDirPath().data());
-
- DotRunner dotRun(inFile);
- dotRun.addJob("imap",outFile);
- if (!dotRun.run())
- {
- QDir::setCurrent(oldDir);
- return "";
- }
-
- QString result;
- QTextOStream tmpout(&result);
- convertMapFile(tmpout, outFile, relPath ,TRUE);
- QDir().remove(outFile);
-// printf("result=%s\n",result.data());
-
- QDir::setCurrent(oldDir);
- return result;
-}
-// end MDG mods
-
-//-------------------------------------------------------------
-
-DotGroupCollaboration::DotGroupCollaboration(GroupDef* gd)
-{
- m_curNodeId = 0;
- QCString tmp_url = gd->getReference()+"$"+gd->getOutputFileBase();
- m_usedNodes = new QDict<DotNode>(1009);
- m_rootNode = new DotNode(m_curNodeId++, gd->groupTitle(), tmp_url, 0, TRUE );
- m_usedNodes->insert(gd->name(), m_rootNode );
- m_edges.setAutoDelete(TRUE);
-
- m_diskName = gd->getOutputFileBase();
-
- buildGraph( gd, 0 );
-}
-
-DotGroupCollaboration::~DotGroupCollaboration()
-{
- delete m_usedNodes;
-}
-
-void DotGroupCollaboration::buildGraph(GroupDef* gd,int)
-{
- QCString tmp_url;
- //===========================
- // hierarchy.
-
- // Write parents
- if ( gd->partOfGroups() )
- {
- GroupListIterator gli(*gd->partOfGroups());
- 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();
- nnode = new DotNode(m_curNodeId++, d->groupTitle(), tmp_url );
- 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() )
- {
- QListIterator<GroupDef> defli(*gd->getSubGroups());
- GroupDef *def;
- for (;(def=defli.current());++defli)
- {
- DotNode* nnode = m_usedNodes->find(def->name());
- if ( !nnode )
- { // add node
- tmp_url = def->getReference()+"$"+def->getOutputFileBase();
- nnode = new DotNode(m_curNodeId++, def->groupTitle(), tmp_url );
- m_usedNodes->insert(def->name(), nnode );
- }
- tmp_url = "";
- addEdge( m_rootNode, nnode, DotGroupCollaboration::thierarchy, tmp_url, tmp_url );
- }
- }
-
- //=======================
- // Write collaboration
-
- // Add members
- addMemberList( gd->getMembers() );
-
- // Add classes
- if ( gd->getClasses() && gd->getClasses()->count() )
- {
- ClassSDict::Iterator defli(*gd->getClasses());
- ClassDef *def;
- for (;(def=defli.current());++defli)
- {
- tmp_url = def->getReference()+"$"+def->getOutputFileBase()+Doxygen::htmlFileExtension;
- addCollaborationMember( def, tmp_url, DotGroupCollaboration::tclass );
- }
- }
-
- // Add namespaces
- if ( gd->getNamespaces() && gd->getNamespaces()->count() )
- {
- 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 );
- }
- }
-
- // Add files
- if ( gd->getFiles() && gd->getFiles()->count() )
- {
- QListIterator<FileDef> defli(*gd->getFiles());
- FileDef *def;
- for (;(def=defli.current());++defli)
- {
- tmp_url = def->getReference()+"$"+def->getOutputFileBase()+Doxygen::htmlFileExtension;
- addCollaborationMember( def, tmp_url, DotGroupCollaboration::tfile );
- }
- }
-
- // Add pages
- if ( gd->getPages() && gd->getPages()->count() )
- {
- 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 );
- }
- }
-
- // Add directories
- if ( gd->getDirs() && gd->getDirs()->count() )
- {
- QListIterator<DirDef> defli(*gd->getDirs());
- DirDef *def;
- for (;(def=defli.current());++defli)
- {
- tmp_url = def->getReference()+"$"+def->getOutputFileBase()+Doxygen::htmlFileExtension;
- addCollaborationMember( def, tmp_url, DotGroupCollaboration::tdir );
- }
- }
-}
-
-void DotGroupCollaboration::addMemberList( MemberList* ml )
-{
- if ( !( ml && ml->count()) ) return;
- MemberListIterator defli(*ml);
- MemberDef *def;
- for (;(def=defli.current());++defli)
- {
- QCString tmp_url = def->getReference()+"$"+def->getOutputFileBase()+Doxygen::htmlFileExtension
- +"#"+def->anchor();
- addCollaborationMember( def, tmp_url, DotGroupCollaboration::tmember );
- }
-}
-
-DotGroupCollaboration::Edge* DotGroupCollaboration::addEdge(
- DotNode* _pNStart, DotNode* _pNEnd, EdgeType _eType,
- const QCString& _label, const QCString& _url )
-{
- // search a existing link.
- QListIterator<Edge> lli(m_edges);
- Edge* newEdge = 0;
- for ( lli.toFirst(); (newEdge=lli.current()); ++lli)
- {
- if ( newEdge->pNStart==_pNStart &&
- newEdge->pNEnd==_pNEnd &&
- newEdge->eType==_eType
- )
- { // edge already found
- break;
- }
- }
- if ( newEdge==0 ) // new link
- {
- newEdge = new Edge(_pNStart,_pNEnd,_eType);
- m_edges.append( newEdge );
- }
-
- if (!_label.isEmpty())
- {
- newEdge->links.append(new Link(_label,_url));
- }
-
- return newEdge;
-}
-
-void DotGroupCollaboration::addCollaborationMember(
- 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)
- {
- DotNode* nnode = m_usedNodes->find(d->name());
- if ( nnode != m_rootNode )
- {
- if ( nnode==0 )
- { // add node
- tmp_str = d->getReference()+"$"+d->getOutputFileBase();
- nnode = new DotNode(m_curNodeId++, d->groupTitle(), tmp_str );
- m_usedNodes->insert(d->name(), nnode );
- }
- tmp_str = def->qualifiedName();
- addEdge( m_rootNode, nnode, eType, tmp_str, url );
- }
- }
-}
-
-
-QCString DotGroupCollaboration::writeGraph( QTextStream &t, GraphOutputFormat format,
- const char *path, const char *relPath,
- bool writeImageMap)
-{
- QDir d(path);
- // store the original directory
- if (!d.exists())
- {
- err("Error: Output dir %s does not exist!\n",path);
- exit(1);
- }
- QCString oldDir = convertToQCString(QDir::currentDirPath());
- // go to the output directory (i.e. path)
- QDir::setCurrent(d.absPath());
- QDir thisDir;
- QCString baseName = m_diskName;
-
- QFile dotfile(baseName+".dot");
- if (dotfile.open(IO_WriteOnly))
- {
- QTextStream tdot(&dotfile);
- writeGraphHeader(tdot);
-
- // clean write flags
- QDictIterator<DotNode> dni(*m_usedNodes);
- DotNode *pn;
- for (dni.toFirst();(pn=dni.current());++dni)
- pn->clearWriteFlag();
-
- // write other nodes.
- for (dni.toFirst();(pn=dni.current());++dni)
- {
- pn->write(tdot,DotNode::Inheritance,format,TRUE,FALSE,1,FALSE,FALSE);
- }
-
- // write edges
- QListIterator<Edge> eli(m_edges);
- Edge* edge;
- for (eli.toFirst();(edge=eli.current());++eli)
- {
- edge->write( tdot, m_curNodeId );
- }
-
- writeGraphFooter(tdot);
- dotfile.close();
- }
-
- QCString imgExt = Config_getEnum("DOT_IMAGE_FORMAT");
- if (format==BITMAP) // run dot to create a bitmap image
- {
- QCString dotArgs(maxCmdLine);
- QCString imgName = baseName+"."+imgExt;
- QCString mapName=baseName+".map";
-
- DotRunner dotRun(baseName+".dot");
- dotRun.addJob(imgExt,imgName);
- if (writeImageMap) dotRun.addJob("imap",mapName);
- if (!dotRun.run())
- {
- QDir::setCurrent(oldDir);
- return baseName;
- }
-
- if (writeImageMap)
- {
- QCString mapLabel = convertNameToFile(baseName);
- t << "<center><table><tr><td><img src=\"" << relPath << imgName
- << "\" border=\"0\" alt=\"\" usemap=\"#"
- << mapLabel << "_map\">" << endl;
- t << "<map name=\"" << mapLabel << "_map\">" << endl;
- convertMapFile(t,mapName,relPath);
- t << "</map></td></tr></table></center>" << endl;
- thisDir.remove(mapName);
- }
- }
- else if (format==EPS)
- {
- DotRunner dotRun(baseName+".dot");
- dotRun.addJob("ps",baseName+".eps");
- if (!dotRun.run())
- {
- QDir::setCurrent(oldDir);
- return baseName;
- }
-
- if (Config_getBool("USE_PDFLATEX"))
- {
- QCString epstopdfArgs(maxCmdLine);
- epstopdfArgs.sprintf("\"%s.eps\" --outfile=\"%s.pdf\"",
- baseName.data(),baseName.data());
- if (iSystem("epstopdf",epstopdfArgs,TRUE)!=0)
- {
- err("Error: Problems running epstopdf. Check your TeX installation!\n");
- QDir::setCurrent(oldDir);
- return baseName;
- }
- }
- int width,height;
- if (!readBoundingBoxEPS(baseName+".eps",&width,&height))
- {
- err("Error: Could not extract bounding box from .eps!\n");
- QDir::setCurrent(oldDir);
- return baseName;
- }
- int maxWidth = 420; /* approx. page width in points */
- t << "\\begin{figure}[H]\n"
- "\\begin{center}\n"
- "\\leavevmode\n"
- "\\includegraphics[width=" << QMIN(width/2,maxWidth)
- << "pt]{" << baseName << "}\n"
- "\\end{center}\n"
- "\\end{figure}\n";
- }
- if (Config_getBool("DOT_CLEANUP"))
- {
- thisDir.remove(baseName+".dot");
- }
-
- QDir::setCurrent(oldDir);
-
- return baseName;
-}
-
-void DotGroupCollaboration::Edge::write( QTextStream &t, int& )
-{
- const char* linkTypeColor[] = {
- "darkorchid3"
- ,"orange"
- ,"blueviolet"
- ,"darkgreen"
- ,"firebrick4"
- ,"grey75"
- ,"midnightblue"
- };
- QCString arrowStyle = "dir=\"none\", style=\"dashed\"";
- t << " Node" << pNStart->number();
- t << "->";
- t << "Node" << pNEnd->number();
-
- t << " [shape=plaintext";
- if (links.count()>0) // there are links
- {
- t << ", ";
- // HTML-like edge labels crash on my Mac with Graphviz 2.0! and
- // are not supported by older version of dot.
- //
- //t << label=<<TABLE BORDER=\"0\" CELLBORDER=\"0\">";
- //QListIterator<Link> lli(links);
- //Link *link;
- //for( lli.toFirst(); (link=lli.current()); ++lli)
- //{
- // t << "<TR><TD";
- // if ( !link->url.isEmpty() )
- // t << " HREF=\"" << link->url << "\"";
- // t << ">" << link->label << "</TD></TR>";
- //}
- //t << "</TABLE>>";
-
- t << "label=\"";
- QListIterator<Link> lli(links);
- Link *link;
- bool first=TRUE;
- for( lli.toFirst(); (link=lli.current()); ++lli)
- {
- if (first) first=FALSE; else t << "\\n";
- t << convertLabel(link->label);
- }
- t << "\"";
-
- }
- switch( eType )
- {
- case thierarchy :
- arrowStyle = "dir=\"back\", style=\"solid\"";
- default :
- t << ", color=\"" << linkTypeColor[(int)eType] << "\"";
- break;
- }
- t << ", " << arrowStyle;
- t << "];" << endl;
-}
-
-bool DotGroupCollaboration::isTrivial() const
-{
- return m_usedNodes->count() <= 1;
-}
-
-void DotGroupCollaboration::writeGraphHeader(QTextStream &t)
-{
- t << "digraph structs" << endl;
- t << "{" << endl;
- if (Config_getBool("DOT_TRANSPARENT"))
- {
- t << " bgcolor=\"transparent\";" << endl;
- }
- t << " edge [fontname=\"Helvetica\",fontsize=8,"
- "labelfontname=\"Helvetica\",labelfontsize=8];\n";
- t << " node [fontname=\"Helvetica\",fontsize=10,shape=record];\n";
- t << "rankdir=LR;\n";
-}
diff --git a/src/dot.h b/src/dot.h
deleted file mode 100644
index ad5e380..0000000
--- a/src/dot.h
+++ /dev/null
@@ -1,318 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 _DOT_H
-#define _DOT_H
-
-#include "qtbc.h"
-#include <qlist.h>
-#include <qdict.h>
-#include "sortdict.h"
-
-class ClassDef;
-class FileDef;
-class QTextStream;
-class DotNodeList;
-class ClassSDict;
-class MemberDef;
-class Definition;
-class DirDef;
-class GroupDef;
-class DotGroupCollaboration;
-
-enum GraphOutputFormat { BITMAP , EPS };
-
-struct EdgeInfo
-{
- enum Colors { Blue=0, Green=1, Red=2, Purple=3, Grey=4, Orange=5 };
- enum Styles { Solid=0, Dashed=1 };
- EdgeInfo() : m_color(0), m_style(0), m_labColor(0) {}
- ~EdgeInfo() {}
- int m_color;
- int m_style;
- QCString m_label;
- QCString m_url;
- int m_labColor;
-};
-
-class DotNode
-{
- public:
- enum GraphType { Dependency, Inheritance, Collaboration, Hierarchy, CallGraph };
- DotNode(int n,const char *lab,const char *url,int distance = 0,bool rootNode=FALSE,ClassDef *cd=0);
- ~DotNode();
- void addChild(DotNode *n,
- int edgeColor=EdgeInfo::Purple,
- int edgeStyle=EdgeInfo::Solid,
- const char *edgeLab=0,
- const char *edgeURL=0,
- int edgeLabCol=-1
- );
- void setDistance(int distance);
- void addParent(DotNode *n);
- void deleteNode(DotNodeList &deletedList,SDict<DotNode> *skipNodes=0);
- void removeChild(DotNode *n);
- void removeParent(DotNode *n);
- int findParent( DotNode *n );
- void write(QTextStream &t,GraphType gt,GraphOutputFormat f,
- bool topDown,bool toChildren,int maxDistance,bool backArrows,bool reNumber);
- int m_subgraphId;
- void clearWriteFlag();
- void writeXML(QTextStream &t,bool isClassGraph);
- void writeDEF(QTextStream &t);
- QCString label() const { return m_label; }
- int number() const { return m_number; }
-
- private:
- void colorConnectedNodes(int curColor);
- void writeBox(QTextStream &t,GraphType gt,GraphOutputFormat f,
- bool hasNonReachableChildren, bool reNumber=FALSE);
- void writeArrow(QTextStream &t,GraphType gt,GraphOutputFormat f,DotNode *cn,
- EdgeInfo *ei,bool topDown, bool pointBack=TRUE, bool reNumber=FALSE);
- const DotNode *findDocNode() const; // only works for acyclic graphs!
- int m_number;
- QCString m_label; //!< label text
- 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
- bool m_written; //!< used to mark a node as written
- bool m_hasDoc; //!< used to mark a node as documented
- int m_distance; //!< distance to the root node
- bool m_isRoot; //!< indicates if this is a root node
- ClassDef * m_classDef; //!< class representing this node (can be 0)
-
- friend class DotGfxHierarchyTable;
- friend class DotClassGraph;
- friend class DotInclDepGraph;
- friend class DotNodeList;
- friend class DotCallGraph;
- friend class DotGroupCollaboration;
-
- friend void writeDotGraph(
- DotNode *root, GraphType gt,
- GraphOutputFormat f, const QCString &baseName,
- bool lrRank, bool renderParents,
- int distance, bool backArrows, bool reNumber
- );
- friend QCString computeMd5Signature(
- DotNode *root, GraphType gt,
- GraphOutputFormat f,
- bool lrRank, bool renderParents,
- int distance, bool backArrows
- );
-};
-inline
-int DotNode::findParent( DotNode *n )
-{
- if( !m_parents )
- return -1;
- return m_parents->find(n);
-}
-
-class DotGfxHierarchyTable
-{
- public:
- DotGfxHierarchyTable();
- ~DotGfxHierarchyTable();
- void writeGraph(QTextStream &t,const char *path);
-
- private:
- void addHierarchy(DotNode *n,ClassDef *cd,bool hide);
- void addClassList(ClassSDict *cl);
-
- QList<DotNode> *m_rootNodes;
- QDict<DotNode> *m_usedNodes;
- static int m_curNodeNumber;
- DotNodeList *m_rootSubgraphs;
-};
-
-class DotClassGraph
-{
- public:
- //enum GraphType { Interface, Implementation, Inheritance };
- DotClassGraph(ClassDef *cd,DotNode::GraphType t,int maxRecusionDepth);
- ~DotClassGraph();
- bool isTrivial() const;
- QCString writeGraph(QTextStream &t,GraphOutputFormat f,const char *path,
- const char *relPath, bool TBRank=TRUE,bool imageMap=TRUE);
-
- void writeXML(QTextStream &t);
- void writeDEF(QTextStream &t);
- QCString diskName() const;
-
- private:
- void buildGraph(ClassDef *cd,DotNode *n,int level,bool base);
- void addClass(ClassDef *cd,DotNode *n,int prot,const char *label,
- int level,const char *usedName,const char *templSpec,
- bool base);
- DotNode * m_startNode;
- QDict<DotNode> * m_usedNodes;
- static int m_curNodeNumber;
- DotNode::GraphType m_graphType;
- int m_recDepth;
- QCString m_diskName;
- int m_maxDistance;
-};
-
-class DotInclDepGraph
-{
- public:
- DotInclDepGraph(FileDef *fd,int maxRecusionDepth,bool inverse);
- ~DotInclDepGraph();
- QCString writeGraph(QTextStream &t, GraphOutputFormat f,const char *path,
- const char *relPath,
- bool writeImageMap=TRUE);
- bool isTrivial() const;
- QCString diskName() const;
- void writeXML(QTextStream &t);
-
- private:
- void buildGraph(DotNode *n,FileDef *fd,int distance);
- DotNode *m_startNode;
- QDict<DotNode> *m_usedNodes;
- static int m_curNodeNumber;
- QCString m_diskName;
- int m_maxDistance;
- bool m_inverse;
- int m_recDepth;
-};
-
-class DotCallGraph
-{
- public:
- DotCallGraph(MemberDef *md,int maxRecursionDepth);
- ~DotCallGraph();
- QCString writeGraph(QTextStream &t, GraphOutputFormat f,
- const char *path,const char *relPath,bool writeImageMap=TRUE);
- void buildGraph(DotNode *n,MemberDef *md,int distance);
- bool isTrivial() const;
-
- private:
- DotNode *m_startNode;
- static int m_curNodeNumber;
- QDict<DotNode> *m_usedNodes;
- int m_maxDistance;
- int m_recDepth;
- QCString m_diskName;
- Definition * m_scope;
-};
-
-class DotDirDeps
-{
- public:
- DotDirDeps(DirDef *dir);
- ~DotDirDeps();
- bool isTrivial() const;
- QCString writeGraph(QTextStream &out,
- GraphOutputFormat format,
- const char *path,
- const char *relPath,
- bool writeImageMap=TRUE);
- private:
- DirDef *m_dir;
-};
-
-class DotGroupCollaboration
-{
- public :
- enum EdgeType
- { tmember = 0,
- tclass,
- tnamespace,
- tfile,
- tpages,
- tdir,
- thierarchy
- };
-
- class Link
- {
- public:
- Link(const QCString lab,const QCString &u) : label(lab), url(u) {}
- QCString label;
- QCString url;
- };
-
- class Edge
- {
- public :
- Edge(DotNode *start,DotNode *end,EdgeType type)
- : pNStart(start), pNEnd(end), eType(type)
- { links.setAutoDelete(TRUE); }
-
- DotNode* pNStart;
- DotNode* pNEnd;
- EdgeType eType;
-
- QList<Link> links;
- void write( QTextStream &t, int& curNodeId );
- };
-
- DotGroupCollaboration(GroupDef* gd);
- ~DotGroupCollaboration();
- QCString writeGraph(QTextStream &t, GraphOutputFormat format,
- const char *path,const char *relPath,
- bool writeImageMap=TRUE);
- void buildGraph(GroupDef* gd,int distance);
- bool isTrivial() const;
- private :
- void addCollaborationMember( Definition* def, QCString& url, EdgeType eType );
- void addMemberList( class MemberList* ml );
- void writeGraphHeader(QTextStream &t);
- Edge* addEdge( DotNode* _pNStart, DotNode* _pNEnd, EdgeType _eType,
- const QCString& _label, const QCString& _url );
-
- DotNode *m_rootNode;
- int m_curNodeId;
- QDict<DotNode> *m_usedNodes;
- QCString m_diskName;
- QList<Edge> m_edges;
-};
-
-/** @brief Helper class to run dot from doxygen.
- */
-class DotRunner
-{
- public:
- /** Creates a runner for a dot \a file. */
- DotRunner(const char *file);
-
- /** Adds an additional job to the run.
- * Performing multiple jobs one file can be faster.
- */
- void addJob(const char *format,const char *output);
-
- /** Runs dot for all jobs added. */
- bool run();
- private:
- QList<QCString> m_jobs;
- QCString m_file;
-};
-
-
-
-void generateGraphLegend(const char *path);
-void writeDotGraphFromFile(const char *inFile,const char *outDir,
- const char *outFile,GraphOutputFormat format);
-QString getDotImageMapFromFile(const QString& inFile, const QString& outDir,
- const QCString& relPath);
-
-
-#endif
diff --git a/src/doxygen.cpp b/src/doxygen.cpp
deleted file mode 100644
index 2c9b6ca..0000000
--- a/src/doxygen.cpp
+++ /dev/null
@@ -1,8997 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 "qtbc.h"
-#include <qfileinfo.h>
-#include <qfile.h>
-#include <qdir.h>
-#include <qdict.h>
-#include <qregexp.h>
-#include <qstrlist.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/stat.h>
-#include <qtextcodec.h>
-
-#include "version.h"
-#include "doxygen.h"
-#include "scanner.h"
-#include "entry.h"
-#include "index.h"
-#include "logos.h"
-#include "instdox.h"
-#include "message.h"
-#include "config.h"
-#include "util.h"
-#include "pre.h"
-#include "tagreader.h"
-#include "dot.h"
-#include "docparser.h"
-#include "dirdef.h"
-
-#include "outputlist.h"
-#include "declinfo.h"
-#include "htmlgen.h"
-#include "latexgen.h"
-#include "mangen.h"
-#include "language.h"
-#include "debug.h"
-#include "htmlhelp.h"
-#include "ftvhelp.h"
-#include "defargs.h"
-#include "rtfgen.h"
-#include "xmlgen.h"
-#include "defgen.h"
-#include "perlmodgen.h"
-#include "reflist.h"
-#include "pagedef.h"
-#include "bufstr.h"
-#include "commentcnv.h"
-#include "cmdmapper.h"
-#include "searchindex.h"
-#include "parserintf.h"
-#include "htags.h"
-#include "pyscanner.h"
-
-#if defined(_MSC_VER) || defined(__BORLANDC__)
-#define popen _popen
-#define pclose _pclose
-#endif
-
-static QDict<Entry> classEntries(1009);
-
-ClassSDict Doxygen::classSDict(1009);
-ClassSDict Doxygen::hiddenClasses(257);
-
-NamespaceSDict Doxygen::namespaceSDict(20);
-
-MemberNameSDict Doxygen::memberNameSDict(10000);
-
-MemberNameSDict Doxygen::functionNameSDict(10000);
-
-FileNameList Doxygen::inputNameList; // all input files
-FileNameDict *Doxygen::inputNameDict;
-
-GroupSDict Doxygen::groupSDict(17);
-
-FormulaList Doxygen::formulaList; // all formulas
-FormulaDict Doxygen::formulaDict(1009); // all formulas
-FormulaDict Doxygen::formulaNameDict(1009); // the label name of all formulas
-
-PageSDict *Doxygen::pageSDict = new PageSDict(1009); // all doc pages
-PageSDict *Doxygen::exampleSDict = new PageSDict(1009); // all examples
-SectionDict Doxygen::sectionDict(257); // all page sections
-StringDict Doxygen::aliasDict(257); // aliases
-FileNameDict *Doxygen::includeNameDict; // include names
-FileNameDict *Doxygen::exampleNameDict; // examples
-FileNameDict *Doxygen::imageNameDict; // images
-FileNameDict *Doxygen::dotFileNameDict; // dot files
-StringDict Doxygen::namespaceAliasDict(257); // all namespace aliases
-StringDict Doxygen::tagDestinationDict(257); // all tag locations
- // a member group
-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?
-QTextStream Doxygen::tagFile;
-NamespaceDef *Doxygen::globalScope;
-
-QDict<RefList> *Doxygen::xrefLists = new QDict<RefList>; // dictionary of cross-referenced item lists
-
-bool Doxygen::parseSourcesNeeded = FALSE;
-double Doxygen::sysElapsedTime = 0.0;
-QTime Doxygen::runningTime;
-SearchIndex * Doxygen::searchIndex=0;
-SDict<DefinitionList> *Doxygen::symbolMap;
-bool Doxygen::outputToWizard=FALSE;
-QDict<int> * Doxygen::htmlDirMap = 0;
-QCache<LookupInfo> Doxygen::lookupCache(20000,20000);
-DirSDict Doxygen::directories(17);
-SDict<DirRelation> Doxygen::dirRelations(257);
-ParserManager *Doxygen::parserManager = 0;
-
-static StringList inputFiles;
-static StringDict excludeNameDict(1009); // sections
-static QDict<void> compoundKeywordDict(7); // keywords recognised as compounds
-static OutputList *outputList = 0; // list of output generating objects
-
-
-void clearAll()
-{
- inputFiles.clear();
- excludeNameDict.clear();
- delete outputList; outputList=0;
-
- Doxygen::classSDict.clear();
- Doxygen::namespaceSDict.clear();
- Doxygen::pageSDict->clear();
- Doxygen::exampleSDict->clear();
- Doxygen::inputNameList.clear();
- Doxygen::formulaList.clear();
- Doxygen::classSDict.clear();
- Doxygen::sectionDict.clear();
- Doxygen::inputNameDict->clear();
- Doxygen::includeNameDict->clear();
- Doxygen::exampleNameDict->clear();
- Doxygen::imageNameDict->clear();
- Doxygen::dotFileNameDict->clear();
- Doxygen::formulaDict.clear();
- Doxygen::formulaNameDict.clear();
- Doxygen::tagDestinationDict.clear();
- delete Doxygen::mainPage; Doxygen::mainPage=0;
-}
-
-void statistics()
-{
- fprintf(stderr,"--- inputNameDict stats ----\n");
- Doxygen::inputNameDict->statistics();
- fprintf(stderr,"--- includeNameDict stats ----\n");
- Doxygen::includeNameDict->statistics();
- fprintf(stderr,"--- exampleNameDict stats ----\n");
- Doxygen::exampleNameDict->statistics();
- fprintf(stderr,"--- imageNameDict stats ----\n");
- Doxygen::imageNameDict->statistics();
- fprintf(stderr,"--- dotFileNameDict stats ----\n");
- Doxygen::dotFileNameDict->statistics();
- fprintf(stderr,"--- excludeNameDict stats ----\n");
- 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,"--- compoundKeywordDict stats ----\n");
- compoundKeywordDict.statistics();
- fprintf(stderr,"--- expandAsDefinedDict stats ----\n");
- Doxygen::expandAsDefinedDict.statistics();
- fprintf(stderr,"--- memGrpInfoDict stats ----\n");
- Doxygen::memGrpInfoDict.statistics();
-}
-
-
-
-static void addMemberDocs(Entry *root,MemberDef *md, const char *funcDecl,
- ArgumentList *al,bool over_load,NamespaceSDict *nl=0);
-static void findMember(Entry *root,
- QCString funcDecl,
- bool overloaded,
- bool isFunc
- );
-
-const char idMask[] = "[A-Za-z_][A-Za-z_0-9]*";
-QCString spaces;
-QCString Doxygen::htmlFileExtension;
-
-struct STLInfo
-{
- const char *className;
- const char *baseClass1;
- const char *baseClass2;
- const char *templType1;
- const char *templName1;
- const char *templType2;
- const char *templName2;
- bool virtualInheritance;
- bool iterators;
-};
-
-static STLInfo g_stlinfo[] =
-{
- // className baseClass1 baseClass2 templType1 templName1 templType2 templName2 virtInheritance // iterators
- { "allocator", 0, 0, "T", "elements", 0, 0, FALSE, FALSE },
- { "auto_ptr", 0, 0, "T", "ptr", 0, 0, FALSE, FALSE },
- { "ios_base", 0, 0, 0, 0, 0, 0, FALSE, FALSE },
- { "basic_ios", "ios_base", 0, "Char", 0, 0, 0, FALSE, FALSE },
- { "basic_istream", "basic_ios<Char>", 0, "Char", 0, 0, 0, TRUE, FALSE },
- { "basic_ostream", "basic_ios<Char>", 0, "Char", 0, 0, 0, TRUE, FALSE },
- { "basic_iostream", "basic_istream<Char>", "basic_ostream<Char>", "Char", 0, 0, 0, FALSE, FALSE },
- { "basic_ifstream", "basic_istream<Char>", 0, "Char", 0, 0, 0, FALSE, FALSE },
- { "basic_ofstream", "basic_ostream<Char>", 0, "Char", 0, 0, 0, FALSE, FALSE },
- { "basic_fstream", "basic_iostream<Char>", 0, "Char", 0, 0, 0, FALSE, FALSE },
- { "basic_istringstream", "basic_istream<Char>", 0, "Char", 0, 0, 0, FALSE, FALSE },
- { "basic_ostringstream", "basic_ostream<Char>", 0, "Char", 0, 0, 0, FALSE, FALSE },
- { "basic_stringstream", "basic_iostream<Char>", 0, "Char", 0, 0, 0, FALSE, FALSE },
- { "ios", "basic_ios<char>", 0, 0, 0, 0, 0, FALSE, FALSE },
- { "wios", "basic_ios<wchar_t>", 0, 0, 0, 0, 0, FALSE, FALSE },
- { "istream", "basic_istream<char>", 0, 0, 0, 0, 0, FALSE, FALSE },
- { "wistream", "basic_istream<wchar_t>", 0, 0, 0, 0, 0, FALSE, FALSE },
- { "ostream", "basic_ostream<char>", 0, 0, 0, 0, 0, FALSE, FALSE },
- { "wostream", "basic_ostream<wchar_t>", 0, 0, 0, 0, 0, FALSE, FALSE },
- { "ifstream", "basic_ifstream<char>", 0, 0, 0, 0, 0, FALSE, FALSE },
- { "wifstream", "basic_ifstream<wchar_t>", 0, 0, 0, 0, 0, FALSE, FALSE },
- { "ofstream", "basic_ofstream<char>", 0, 0, 0, 0, 0, FALSE, FALSE },
- { "wofstream", "basic_ofstream<wchar_t>", 0, 0, 0, 0, 0, FALSE, FALSE },
- { "fstream", "basic_fstream<char>", 0, 0, 0, 0, 0, FALSE, FALSE },
- { "wfstream", "basic_wfstream<wchar_t>", 0, 0, 0, 0, 0, FALSE, FALSE },
- { "istringstream", "basic_istringstream<char>", 0, 0, 0, 0, 0, FALSE, FALSE },
- { "wistringstream", "basic_istringstream<wchar_t>", 0, 0, 0, 0, 0, FALSE, FALSE },
- { "ostringstream", "basic_ostringstream<char>", 0, 0, 0, 0, 0, FALSE, FALSE },
- { "wostringstream", "basic_ostringstream<wchar_t>", 0, 0, 0, 0, 0, FALSE, FALSE },
- { "stringstream", "basic_stringstream<char>", 0, 0, 0, 0, 0, FALSE, FALSE },
- { "wstringstream", "basic_stringstream<wchar_t>", 0, 0, 0, 0, 0, FALSE, FALSE },
- { "basic_string", 0, 0, "Char", 0, 0, 0, FALSE, TRUE },
- { "string", "basic_string<char>", 0, 0, 0, 0, 0, FALSE, TRUE },
- { "wstring", "basic_string<wchar_t>", 0, 0, 0, 0, 0, FALSE, TRUE },
- { "complex", 0, 0, 0, 0, 0, 0, FALSE, FALSE },
- { "bitset", 0, 0, "Bits", 0, 0, 0, FALSE, FALSE },
- { "deque", 0, 0, "T", "elements", 0, 0, FALSE, TRUE },
- { "list", 0, 0, "T", "elements", 0, 0, FALSE, TRUE },
- { "map", 0, 0, "K", "keys", "T", "elements", FALSE, TRUE },
- { "multimap", 0, 0, "K", "keys", "T", "elements", FALSE, TRUE },
- { "set", 0, 0, "K", "keys", 0, 0, FALSE, TRUE },
- { "multiset", 0, 0, "K", "keys", 0, 0, FALSE, TRUE },
- { "vector", 0, 0, "T", "elements", 0, 0, FALSE, TRUE },
- { "queue", 0, 0, "T", "elements", 0, 0, FALSE, FALSE },
- { "priority_queue", 0, 0, "T", "elements", 0, 0, FALSE, FALSE },
- { "stack", 0, 0, "T", "elements", 0, 0, FALSE, FALSE },
- { "valarray", 0, 0, "T", "elements", 0, 0, FALSE, FALSE },
- { 0, 0, 0, 0, 0, 0, 0, FALSE, FALSE }
-};
-
-static void addSTLMember(Entry *root,const char *type,const char *name)
-{
- Entry *memEntry = new Entry;
- memEntry->name = name;
- memEntry->type = type;
- memEntry->protection = Private;
- memEntry->section = Entry::VARIABLE_SEC;
- memEntry->brief = "STL member";
- memEntry->hidden = TRUE;
- root->addSubEntry(memEntry);
-}
-
-static void addSTLClasses(Entry *root)
-{
- Entry *namespaceEntry = new Entry;
- namespaceEntry->fileName = "[STL]";
- namespaceEntry->startLine = 1;
- namespaceEntry->parent = root;
- namespaceEntry->name = "std";
- namespaceEntry->section = Entry::NAMESPACE_SEC;
- namespaceEntry->brief = "STL namespace";
- namespaceEntry->hidden = TRUE;
- root->addSubEntry(namespaceEntry);
-
- STLInfo *info = g_stlinfo;
- while (info->className)
- {
- //printf("Adding STL class %s\n",info->className);
- QCString fullName = info->className;
- fullName.prepend("std::");
-
- // add fake Entry for the class
- Entry *classEntry = new Entry;
- classEntry->fileName = "[STL]";
- classEntry->startLine = 1;
- classEntry->name = fullName;
- classEntry->parent = namespaceEntry;
- classEntry->section = Entry::CLASS_SEC;
- classEntry->brief = "STL class";
- classEntry->hidden = TRUE;
- namespaceEntry->addSubEntry(classEntry);
-
- // add template arguments to class
- if (info->templType1)
- {
- ArgumentList *al = new ArgumentList;
- Argument *a=new Argument;
- a->type="typename";
- a->name=info->templType1;
- al->append(a);
- if (info->templType2) // another template argument
- {
- a=new Argument;
- a->type="typename";
- a->name=info->templType2;
- al->append(a);
- }
- classEntry->tArgLists = new QList<ArgumentList>;
- classEntry->tArgLists->setAutoDelete(TRUE);
- classEntry->tArgLists->append(al);
- }
- // add member variables
- if (info->templName1)
- {
- addSTLMember(classEntry,info->templType1,info->templName1);
- }
- if (info->templName2)
- {
- addSTLMember(classEntry,info->templType2,info->templName2);
- }
- if (info->baseClass1)
- {
- classEntry->extends->append(new BaseInfo(info->baseClass1,Public,info->virtualInheritance?Virtual:Normal));
- }
- if (info->baseClass2)
- {
- classEntry->extends->append(new BaseInfo(info->baseClass2,Public,info->virtualInheritance?Virtual:Normal));
- }
- info++;
- }
-}
-
-//----------------------------------------------------------------------------
-
-static void addRelatedPage(Entry *root)
-{
- GroupDef *gd=0;
- QListIterator<Grouping> gli(*root->groups);
- Grouping *g;
- for (;(g=gli.current());++gli)
- {
- if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict[g->groupname])) break;
- }
- //printf("---> addRelatedPage() %s gd=%p\n",root->name.data(),gd);
- QCString doc;
- if (root->brief.isEmpty())
- {
- doc=root->doc;
- }
- else
- {
- doc=root->brief+"\n\n"+root->doc;
- }
- PageDef *pd = addRelatedPage(root->name,root->args,doc,root->anchors,
- root->fileName,root->startLine,
- root->sli,
- gd,root->tagInfo
- );
- if (pd)
- {
-#if 0
- Definition *ctx = 0;
-
- // find the page's context
- if (root->parent->section & Entry::COMPOUND_MASK ) // inside class
- {
- QCString fullName=removeRedundantWhiteSpace(root->parent->name);
- fullName=stripAnonymousNamespaceScope(fullName);
- fullName=stripTemplateSpecifiersFromScope(fullName);
- ctx=getClass(fullName);
- }
- if (ctx==0 && root->parent->section == Entry::NAMESPACE_SEC ) // inside namespace
- {
- QCString nscope=removeAnonymousScopes(root->parent->name);
- if (!nscope.isEmpty())
- {
- ctx = getResolvedNamespace(nscope);
- }
- }
- if (ctx==0) // inside file
- {
- bool ambig;
- ctx=findFileDef(Doxygen::inputNameDict,root->fileName,ambig);
- }
- pd->setOuterScope(ctx);
-#endif
- pd->addSectionsToDefinition(root->anchors);
- //pi->context = ctx;
- }
-}
-
-static void buildGroupListFiltered(Entry *root,bool additional)
-{
- if (root->section==Entry::GROUPDOC_SEC && !root->name.isEmpty())
- {
- //printf("Found group %s title=`%s type=%d'\n",
- // root->name.data(),root->type.data(),root->groupDocType);
-
- if ((root->groupDocType==Entry::GROUPDOC_NORMAL && !additional) ||
- (root->groupDocType!=Entry::GROUPDOC_NORMAL && additional))
- {
- GroupDef *gd;
-
- if ((gd=Doxygen::groupSDict[root->name]))
- {
- if ( root->groupDocType==Entry::GROUPDOC_NORMAL )
- {
- warn(root->fileName,root->startLine,
- "Warning: group %s already documented. "
- "Skipping documentation.",
- root->name.data());
- }
- else
- {
- if ( !gd->hasGroupTitle() )
- gd->setGroupTitle( root->type );
- else if ( root->type.length() > 0 && root->name != root->type && gd->groupTitle() != root->type )
- warn( root->fileName,root->startLine,
- "group %s: ignoring title \"%s\" that does not match old title \"%s\"\n",
- root->name.data(), root->type.data(), gd->groupTitle() );
- if ( gd->briefDescription().isEmpty() )
- gd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- if ( !root->doc.stripWhiteSpace().isEmpty() )
- gd->setDocumentation( gd->documentation().isEmpty() ? root->doc :
- gd->documentation() + "\n\n" + root->doc,
- root->docFile, root->docLine );
- gd->addSectionsToDefinition(root->anchors);
- gd->setRefItems(root->sli);
- //addGroupToGroups(root,gd);
- }
- }
- else
- {
- if (root->tagInfo)
- {
- gd = new GroupDef(root->fileName,root->startLine,root->name,root->type,root->tagInfo->fileName);
- gd->setReference(root->tagInfo->tagName);
- }
- else
- {
- gd = new GroupDef(root->fileName,root->startLine,root->name,root->type);
- }
- gd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- gd->setDocumentation(root->doc,root->docFile,root->docLine);
- gd->addSectionsToDefinition(root->anchors);
- Doxygen::groupSDict.append(root->name,gd);
- gd->setRefItems(root->sli);
- }
- }
- }
- EntryListIterator eli(*root->sublist);
- Entry *e;
- for (;(e=eli.current());++eli)
- {
- buildGroupListFiltered(e,additional);
- }
-}
-
-static void buildGroupList(Entry *root)
-{
- // first process the @defgroups blocks
- buildGroupListFiltered(root,FALSE);
- // then process the @addtogroup, @weakgroup blocks
- buildGroupListFiltered(root,TRUE);
-}
-
-static void organizeSubGroupsFiltered(Entry *root,bool additional)
-{
- if (root->section==Entry::GROUPDOC_SEC && !root->name.isEmpty())
- {
- if ((root->groupDocType==Entry::GROUPDOC_NORMAL && !additional) ||
- (root->groupDocType!=Entry::GROUPDOC_NORMAL && additional))
- {
- GroupDef *gd;
- if ((gd=Doxygen::groupSDict[root->name]))
- {
- //printf("adding %s to group %s\n",root->name.data(),gd->name().data());
- addGroupToGroups(root,gd);
- }
- }
- }
- EntryListIterator eli(*root->sublist);
- Entry *e;
- for (;(e=eli.current());++eli)
- {
- organizeSubGroupsFiltered(e,additional);
- }
-}
-
-static void organizeSubGroups(Entry *root)
-{
- //printf("Defining groups\n");
- // first process the @defgroups blocks
- organizeSubGroupsFiltered(root,FALSE);
- //printf("Additional groups\n");
- // then process the @addtogroup, @weakgroup blocks
- organizeSubGroupsFiltered(root,TRUE);
-}
-
-//----------------------------------------------------------------------
-
-static void buildFileList(Entry *root)
-{
- if (((root->section==Entry::FILEDOC_SEC) ||
- ((root->section & Entry::FILE_MASK) && Config_getBool("EXTRACT_ALL"))) &&
- !root->name.isEmpty() && !root->tagInfo // skip any file coming from tag files
- )
- {
- bool ambig;
- FileDef *fd=findFileDef(Doxygen::inputNameDict,root->name,ambig);
- //printf("**************** root->name=%s fd=%p\n",root->name.data(),fd);
- if (fd && !ambig)
- {
- if ((!root->doc.isEmpty() && !fd->documentation().isEmpty()) ||
- (!root->brief.isEmpty() && !fd->briefDescription().isEmpty()))
- {
- warn(
- root->fileName,root->startLine,
- "Warning: file %s already documented. "
- "Skipping documentation.",
- root->name.data()
- );
- }
- else
- {
- //printf("Adding documentation!\n");
- // using FALSE in setDocumentation is small hack to make sure a file
- // is documented even if a \file command is used without further
- // documentation
- fd->setDocumentation(root->doc,root->docFile,root->docLine,FALSE);
- fd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- fd->addSectionsToDefinition(root->anchors);
- fd->setRefItems(root->sli);
- QListIterator<Grouping> gli(*root->groups);
- Grouping *g;
- for (;(g=gli.current());++gli)
- {
- GroupDef *gd=0;
- if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict[g->groupname]))
- {
- gd->addFile(fd);
- //printf("File %s: in group %s\n",fd->name().data(),s->data());
- }
- }
- }
- }
- else
- {
- const char *fn = root->fileName.data();
- QCString text;
- text.sprintf("Warning: the name `%s' supplied as "
- "the second argument in the \\file statement ",
- root->name.data()
- );
- if (ambig) // name is ambigious
- {
- text+="matches the following input files:\n";
- text+=showFileDefMatches(Doxygen::inputNameDict,root->name);
- text+="Please use a more specific name by "
- "including a (larger) part of the path!";
- }
- else // name is not an input file
- {
- text+="is not an input file";
- }
- warn(fn,root->startLine,text);
- }
- }
- EntryListIterator eli(*root->sublist);
- Entry *e;
- for (;(e=eli.current());++eli)
- {
- buildFileList(e);
- }
-}
-
-static void addIncludeFile(ClassDef *cd,FileDef *ifd,Entry *root)
-{
- if (
- (!root->doc.stripWhiteSpace().isEmpty() ||
- !root->brief.stripWhiteSpace().isEmpty() ||
- Config_getBool("EXTRACT_ALL")
- ) && root->protection!=Private
- )
- {
- //printf(">>>>>> includeFile=%s\n",root->includeFile.data());
-
- bool ambig;
- FileDef *fd=0;
- // see if we need to include a verbatim copy of the header file
- //printf("root->includeFile=%s\n",root->includeFile.data());
- if (!root->includeFile.isEmpty() &&
- (fd=findFileDef(Doxygen::inputNameDict,root->includeFile,ambig))==0
- )
- { // explicit request
- QCString text;
- text.sprintf("Warning: the name `%s' supplied as "
- "the second argument in the \\class statement ",
- root->includeFile.data()
- );
- if (ambig) // name is ambigious
- {
- text+="matches the following input files:\n";
- text+=showFileDefMatches(Doxygen::inputNameDict,root->includeFile);
- text+="Please use a more specific name by "
- "including a (larger) part of the path!";
- }
- else // name is not an input file
- {
- text+="is not an input file";
- }
- warn(root->fileName,root->startLine,text);
- }
- else if (root->includeFile.isEmpty() && ifd &&
- // see if the file extension makes sense
- guessSection(ifd->name())==Entry::HEADER_SEC)
- { // implicit assumption
- fd=ifd;
- }
-
- // if a file is found, we mark it as a source file.
- if (fd)
- {
- QCString iName = !root->includeName.isEmpty() ?
- root->includeName.data() : root->includeFile.data();
- bool local=FALSE;
- if (!iName.isEmpty()) // user specified include file
- {
- local = iName.at(0)=='"'; // is it a local include file
- if (local || iName.at(0)=='<')
- {
- iName=iName.mid(1,iName.length()-2); // strip quotes or brackets
- }
- }
- else if (!Config_getList("STRIP_FROM_INC_PATH").isEmpty())
- {
- iName=stripFromIncludePath(fd->absFilePath());
- }
- else // use name of the file containing the class definition
- {
- iName=fd->name();
- }
- if (fd->generateSourceFile()) // generate code for header
- {
- cd->setIncludeFile(fd,iName,local,!root->includeName.isEmpty());
- }
- else // put #include in the class documentation without link
- {
- cd->setIncludeFile(0,iName,local,TRUE);
- }
- }
- }
-}
-
-#if 0
-static bool addNamespace(Entry *root,ClassDef *cd)
-{
- // see if this class is defined inside a namespace
- if (root->section & Entry::COMPOUND_MASK)
- {
- Entry *e = root->parent;
- while (e)
- {
- if (e->section==Entry::NAMESPACE_SEC)
- {
- NamespaceDef *nd=0;
- QCString nsName = stripAnonymousNamespaceScope(e->name);
- //printf("addNameSpace() trying: %s\n",nsName.data());
- if (!nsName.isEmpty() && nsName.at(0)!='@' &&
- (nd=getResolvedNamespace(nsName))
- )
- {
- cd->setNamespace(nd);
- cd->setOuterScope(nd);
- nd->insertClass(cd);
- return TRUE;
- }
- }
- e=e->parent;
- }
- }
- return FALSE;
-}
-#endif
-
-static Definition *findScope(Entry *root,int level=0)
-{
- if (root==0) return 0;
- //printf("start findScope name=%s\n",root->name.data());
- Definition *result=0;
- if (root->section&Entry::SCOPE_MASK)
- {
- result = findScope(root->parent,level+1); // traverse to the root of the tree
- if (result)
- {
- //printf("Found %s inside %s at level %d\n",root->name.data(),result->name().data(),level);
- // TODO: look at template arguments
- result = result->findInnerCompound(root->name);
- }
- else // reached the global scope
- {
- // TODO: look at template arguments
- result = Doxygen::globalScope->findInnerCompound(root->name);
- //printf("Found in globalScope %s at level %d\n",result->name().data(),level);
- }
- }
- //printf("end findScope(%s,%d)=%s\n",root->name.data(),
- // level,result==0 ? "<none>" : result->name().data());
- return result;
-}
-
-static Definition *findScopeFromQualifiedName(Definition *startScope,const QCString &n)
-{
- //printf("findScopeFromQualifiedName(%s,%s)\n",startScope ? startScope->name().data() : 0, n.data());
- Definition *resultScope=startScope;
- if (resultScope==0) resultScope=Doxygen::globalScope;
- QCString scope=stripTemplateSpecifiersFromScope(n,FALSE);
- int l1=0,i1;
- i1=getScopeFragment(scope,0,&l1);
- if (i1==-1) return resultScope;
- int p=i1+l1,l2=0,i2;
- while ((i2=getScopeFragment(scope,p,&l2))!=-1)
- {
- QCString nestedNameSpecifier = scope.mid(i1,l1);
- //Definition *oldScope = resultScope;
- resultScope = resultScope->findInnerCompound(nestedNameSpecifier);
- if (resultScope==0)
- {
- //printf("name %s not found in scope %s\n",nestedNameSpecifier.data(),oldScope->name().data());
- return 0;
- }
- i1=i2;
- l1=l2;
- p=i2+l2;
- }
- //printf("scope %s\n",resultScope->name().data());
- return resultScope;
-}
-
-ArgumentList *getTemplateArgumentsFromName(
- const QCString &name,
- const QList<ArgumentList> *tArgLists)
-{
- if (tArgLists==0) return 0;
-
- QListIterator<ArgumentList> ali(*tArgLists);
- // for each scope fragment, check if it is a template and advance through
- // the list if so.
- int i,p=0;
- while ((i=name.find("::",p))!=-1)
- {
- NamespaceDef *nd = Doxygen::namespaceSDict[name.left(i)];
- if (nd==0)
- {
- ClassDef *cd = getClass(name.left(i));
- if (cd)
- {
- if (cd->templateArguments())
- {
- ++ali;
- }
- }
- }
- p=i+2;
- }
- return ali.current();
-}
-
-static ClassDef::CompoundType convertToCompoundType(int section)
-{
- ClassDef::CompoundType sec=ClassDef::Class;
- switch(section)
- {
- case Entry::UNION_SEC:
- case Entry::UNIONDOC_SEC:
- sec=ClassDef::Union;
- break;
- case Entry::STRUCT_SEC:
- case Entry::STRUCTDOC_SEC:
- sec=ClassDef::Struct;
- break;
- case Entry::INTERFACE_SEC:
- case Entry::INTERFACEDOC_SEC:
- sec=ClassDef::Interface;
- break;
- case Entry::PROTOCOL_SEC:
- case Entry::PROTOCOLDOC_SEC:
- sec=ClassDef::Protocol;
- break;
- case Entry::CATEGORY_SEC:
- case Entry::CATEGORYDOC_SEC:
- sec=ClassDef::Category;
- break;
- case Entry::EXCEPTION_SEC:
- case Entry::EXCEPTIONDOC_SEC:
- sec=ClassDef::Exception;
- break;
- }
- return sec;
-}
-
-
-static void addClassToContext(Entry *root)
-{
-// QCString fullName=removeRedundantWhiteSpace(root->name);
-//
-// if (fullName.isEmpty())
-// {
-// // this should not be called
-// warn(root->fileName,root->startLine,
-// "Warning: invalid class name found!"
-// );
-// return;
-// }
-// Debug::print(Debug::Classes,0," Found class with raw name %s\n",fullName.data());
-//
-// fullName=stripAnonymousNamespaceScope(fullName);
-// fullName=stripTemplateSpecifiersFromScope(fullName);
-//
-// Debug::print(Debug::Classes,0," Found class with name %s\n",fullName.data());
-
- bool ambig;
-
- //NamespaceDef *nd = 0;
- FileDef *fd = findFileDef(Doxygen::inputNameDict,root->fileName,ambig);
-
- QCString scName;
- if (root->parent->section&Entry::SCOPE_MASK)
- {
- scName=root->parent->name;
- }
- // name without parent's scope
- QCString fullName = root->name;
-
- // strip off any template parameters (but not those for specializations)
- fullName=stripTemplateSpecifiersFromScope(fullName);
-
- // name with scope
- QCString qualifiedName = scName.isEmpty() ? fullName : scName+"::"+fullName;
-
- ClassDef *cd = getClass(qualifiedName);
-
- Debug::print(Debug::Classes,0, " Found class with name %s (qualifiedName=%s -> cd=%p)\n",
- cd ? cd->name().data() : root->name.data(), qualifiedName.data(),cd);
-
- if (cd)
- {
- fullName=cd->name();
- Debug::print(Debug::Classes,0," Existing class %s!\n",cd->name().data());
- //if (cd->templateArguments()==0)
- //{
- // //printf("existing ClassDef tempArgList=%p specScope=%s\n",root->tArgList,root->scopeSpec.data());
- // cd->setTemplateArguments(tArgList);
- //}
- if (!root->doc.isEmpty() || !root->brief.isEmpty() ||
- (root->bodyLine!=-1 && Config_getBool("SOURCE_BROWSER"))
- )
- // block contains something that ends up in the docs
- {
- if (!root->doc.isEmpty() && !cd->documentation().isEmpty())
- {
- warn(
- root->fileName,root->startLine,
- "Warning: class %s already has a detailed description. "
- "Skipping the one found here.",
- fullName.data()
- );
- }
- else if (!root->doc.isEmpty())
- {
- cd->setDocumentation(root->doc,root->docFile,root->docLine);
- }
- if (!root->brief.isEmpty() && !cd->briefDescription().isEmpty())
- {
- warn(
- root->fileName,root->startLine,
- "Warning: class %s already has a brief description\n"
- " skipping the one found here.",
- fullName.data()
- );
- }
- else if (!root->brief.isEmpty())
- {
- cd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- }
- if (root->bodyLine!=-1 && cd->getStartBodyLine()==-1)
- {
- cd->setBodySegment(root->bodyLine,root->endBodyLine);
- cd->setBodyDef(fd);
- }
- //cd->setName(fullName); // change name to match docs
- }
-
- if (cd->templateArguments()==0)
- {
- // this happens if a template class declared with @class is found
- // before the actual definition.
- ArgumentList *tArgList =
- getTemplateArgumentsFromName(cd->name(),root->tArgLists);
- cd->setTemplateArguments(tArgList);
- }
-
- cd->setCompoundType(convertToCompoundType(root->section));
- }
- else // new class
- {
- ClassDef::CompoundType sec = convertToCompoundType(root->section);
- Debug::print(Debug::Classes,0," New class `%s' (sec=0x%08x)! #tArgLists=%d\n",
- fullName.data(),root->section,root->tArgLists ? (int)root->tArgLists->count() : -1);
- QCString className;
- QCString namespaceName;
- extractNamespaceName(fullName,className,namespaceName);
-
- //printf("New class: namespace `%s' name=`%s' brief=`%s' docs=`%s'\n",
- // className.data(),namespaceName.data(),root->brief.data(),root->doc.data());
-
- QCString tagName;
- QCString refFileName;
- if (root->tagInfo)
- {
- tagName = root->tagInfo->tagName;
- refFileName = root->tagInfo->fileName;
- }
- cd=new ClassDef(root->fileName,root->startLine,fullName,sec,
- tagName,refFileName);
- cd->setDocumentation(root->doc,root->docFile,root->docLine); // copy docs to definition
- cd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- cd->setIsObjectiveC(root->objc);
- cd->setHidden(root->hidden);
- //printf("new ClassDef %s tempArgList=%p specScope=%s\n",fullName.data(),root->tArgList,root->scopeSpec.data());
-
- ArgumentList *tArgList =
- getTemplateArgumentsFromName(fullName,root->tArgLists);
- //printf("class %s template args=%s\n",fullName.data(),
- // tArgList ? tempArgListToString(tArgList).data() : "<none>");
- cd->setTemplateArguments(tArgList);
- cd->setProtection(root->protection);
- cd->setIsStatic(root->stat);
-
- // file definition containing the class cd
- cd->setBodySegment(root->bodyLine,root->endBodyLine);
- cd->setBodyDef(fd);
-
- // see if the class is found inside a namespace
- //bool found=addNamespace(root,cd);
-
-
- // the empty string test is needed for extract all case
- cd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- cd->insertUsedFile(root->fileName);
-
- // add class to the list
- //printf("ClassDict.insert(%s)\n",resolveDefines(fullName).data());
- Doxygen::classSDict.append(fullName,cd);
-
- }
-
- cd->addSectionsToDefinition(root->anchors);
- if (!root->subGrouping) cd->setSubGrouping(FALSE);
- 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);
-}
-
-//----------------------------------------------------------------------
-// build a list of all classes mentioned in the documentation
-// and all classes that have a documentation block before their definition.
-static void buildClassList(Entry *root)
-{
- if (
- ((root->section & Entry::COMPOUND_MASK) ||
- root->section==Entry::OBJCIMPL_SEC) && !root->name.isEmpty()
- )
- {
- addClassToContext(root);
- }
- EntryListIterator eli(*root->sublist);
- Entry *e;
- for (;(e=eli.current());++eli)
- {
- buildClassList(e);
- }
-}
-
-static void buildClassDocList(Entry *root)
-{
- if (
- (root->section & Entry::COMPOUNDDOC_MASK) && !root->name.isEmpty()
- )
- {
- addClassToContext(root);
- }
- EntryListIterator eli(*root->sublist);
- Entry *e;
- for (;(e=eli.current());++eli)
- {
- buildClassDocList(e);
- }
-}
-
-Definition *buildScopeFromQualifiedName(const QCString name,int level)
-{
- int i=0;
- int p=0,l;
- Definition *prevScope=Doxygen::globalScope;
- QCString fullScope;
- while (i<level)
- {
- int idx=getScopeFragment(name,p,&l);
- QCString nsName = name.mid(idx,l);
- if (!fullScope.isEmpty()) fullScope+="::";
- fullScope+=nsName;
- NamespaceDef *nd=Doxygen::namespaceSDict.find(fullScope);
- if (nd==0)
- {
- // introduce bogus namespace
- //printf("adding dummy namespace %s to %s\n",nsName.data(),prevScope->name().data());
- nd=new NamespaceDef(
- "[generated]",1,fullScope);
-
- // add namespace to the list
- Doxygen::namespaceSDict.inSort(fullScope,nd);
- }
- prevScope->addInnerCompound(nd);
- nd->setOuterScope(prevScope);
- p=idx+l+2;
- prevScope=nd;
- i++;
- }
- return prevScope;
-}
-
-static void resolveClassNestingRelations()
-{
- ClassSDict::Iterator cli(Doxygen::classSDict);
- for (cli.toFirst();cli.current();++cli) cli.current()->visited=FALSE;
-
- int nestingLevel=0;
- bool done=FALSE;
- while (!done)
- {
- // iterate over all classes searching for a class with right nesting
- // level (starting with 0 and going up until no more classes are found)
- done=TRUE;
- ClassSDict::Iterator cli(Doxygen::classSDict);
- ClassDef *cd=0;
- for (cli.toFirst();(cd=cli.current());++cli)
- {
- //printf("nested relation for class %s\n",cd->name().data());
- if (cd->name().contains("::")==nestingLevel)
- {
- cd->visited=TRUE;
- //printf("Level=%d processing=%s\n",nestingLevel,cd->name().data());
- // also add class to the correct structural context
- Definition *d = findScopeFromQualifiedName(Doxygen::globalScope,cd->name());
- if (d==0)
- {
- Definition *d = buildScopeFromQualifiedName(cd->name(),cd->name().contains("::"));
- d->addInnerCompound(cd);
- cd->setOuterScope(d);
- //warn(cd->getDefFileName(),cd->getDefLine(),
- // "Warning: Internal inconsistency: scope for class %s not "
- // "found!\n",cd->name().data()
- // );
- }
- else
- {
- //printf("****** adding %s to scope %s\n",cd->name().data(),d->name().data());
- d->addInnerCompound(cd);
- cd->setOuterScope(d);
- }
- }
- if (!cd->visited) done=FALSE;
- }
- nestingLevel++;
- //printf("nestingLevel=%d\n",nestingLevel);
- }
-}
-
-
-//----------------------------------------------------------------------
-// build a list of all namespaces mentioned in the documentation
-// and all namespaces that have a documentation block before their definition.
-static void buildNamespaceList(Entry *root)
-{
- if (
- (root->section==Entry::NAMESPACE_SEC ||
- root->section==Entry::NAMESPACEDOC_SEC ||
- root->section==Entry::PACKAGEDOC_SEC
- ) &&
- !root->name.isEmpty()
- )
- {
- QCString fullName = root->name;
- if (root->section==Entry::PACKAGEDOC_SEC)
- {
- fullName=substitute(fullName,".","::");
- }
-
- fullName = stripAnonymousNamespaceScope(fullName);
- if (!fullName.isEmpty())
- {
- //printf("Found namespace %s in %s at line %d\n",root->name.data(),
- // root->fileName.data(), root->startLine);
- NamespaceDef *nd;
- if ((nd=Doxygen::namespaceSDict[fullName])) // existing namespace
- {
- if (!root->doc.isEmpty() || !root->brief.isEmpty()) // block contains docs
- {
- if (nd->documentation().isEmpty() && !root->doc.isEmpty())
- {
- nd->setDocumentation(root->doc,root->docFile,root->docLine);
- nd->setName(fullName); // change name to match docs
- nd->addSectionsToDefinition(root->anchors);
- }
- else if (!nd->documentation().isEmpty() && !root->doc.isEmpty())
- {
- warn(
- root->fileName,root->startLine,
- "Warning: namespace %s already has a detailed description. "
- "Skipping the documentation found here.",
- fullName.data());
- }
- if (nd->briefDescription().isEmpty() && !root->brief.isEmpty())
- {
- nd->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- nd->setName(fullName); // change name to match docs
- }
- else if (!nd->briefDescription().isEmpty() && !root->brief.isEmpty())
- {
- warn(root->fileName,root->startLine,
- "Warning: namespace %s already has a brief description. "
- "Skipping the documentation found here.",
- fullName.data()
- );
- }
- }
-
- bool ambig;
- // file definition containing the namespace nd
- FileDef *fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig);
- // insert the namespace in the file definition
- if (fd) fd->insertNamespace(nd);
- addNamespaceToGroups(root,nd);
- nd->setRefItems(root->sli);
- }
- else // fresh namespace
- {
- QCString tagName;
- QCString tagFileName;
- if (root->tagInfo)
- {
- tagName=root->tagInfo->tagName;
- tagFileName=root->tagInfo->fileName;
- }
- NamespaceDef *nd=new NamespaceDef(root->fileName,root->startLine,fullName,tagName,tagFileName);
- 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);
-
- //printf("Adding namespace to group\n");
- addNamespaceToGroups(root,nd);
- nd->setRefItems(root->sli);
-
- bool ambig;
- // file definition containing the namespace nd
- FileDef *fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig);
- // 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(root->fileName);
- 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);
- //printf("adding namespace %s to context %s\n",nd->name().data(),d?d->name().data():"none");
- if (d==0)
- {
- Definition *d = buildScopeFromQualifiedName(fullName,fullName.contains("::"));
- 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
- {
- d->addInnerCompound(nd);
- nd->setOuterScope(d);
- }
- }
- }
- }
- EntryListIterator eli(*root->sublist);
- Entry *e;
- for (;(e=eli.current());++eli)
- {
- buildNamespaceList(e);
- }
-}
-
-//----------------------------------------------------------------------
-
-static void findUsingDirectives(Entry *root)
-{
- if (root->section==Entry::USINGDIR_SEC)
- {
- //printf("Found using directive %s at line %d of %s\n",
- // root->name.data(),root->startLine,root->fileName.data());
- QCString name=substitute(root->name,".","::");
- bool ambig;
- if (!name.isEmpty())
- {
- NamespaceDef *usingNd = 0;
- NamespaceDef *nd = 0;
- FileDef *fd = findFileDef(Doxygen::inputNameDict,root->fileName,ambig);
- QCString nsName;
-
- // see if the using statement was found inside a namespace or inside
- // the global file scope.
- if (root->parent->section == Entry::NAMESPACE_SEC)
- {
- nsName=stripAnonymousNamespaceScope(root->parent->name);
- if (!nsName.isEmpty())
- {
- nd = getResolvedNamespace(nsName);
- }
- }
-
- // find the scope in which the `using' namespace is defined by prepending
- // the possible scopes in which the using statement was found, starting
- // with the most inner scope and going to the most outer scope (i.e.
- // file scope).
- int scopeOffset = nsName.length();
- do
- {
- QCString scope=scopeOffset>0 ?
- nsName.left(scopeOffset)+"::" : QCString();
- usingNd = getResolvedNamespace(scope+name);
- //printf("Trying with scope=`%s' usingNd=%p\n",(scope+name).data(),usingNd);
- if (scopeOffset==0)
- {
- scopeOffset=-1;
- }
- else if ((scopeOffset=nsName.findRev("::",scopeOffset-1))==-1)
- {
- scopeOffset=0;
- }
- } while (scopeOffset>=0 && usingNd==0);
-
- //printf("%s -> %p\n",name.data(),usingNd);
-
- // add the namespace the correct scope
- if (usingNd)
- {
- //printf("using fd=%p nd=%p\n",fd,nd);
- if (nd)
- {
- //printf("Inside namespace %s\n",nd->name().data());
- nd->addUsingDirective(usingNd);
- }
- else if (fd)
- {
- //printf("Inside file %s\n",fd->name().data());
- fd->addUsingDirective(usingNd);
- }
- }
- else // unknown namespace, but add it anyway.
- {
- NamespaceDef *nd=new NamespaceDef(root->fileName,root->startLine,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);
- nd->setHidden(root->hidden);
-
- QListIterator<Grouping> gli(*root->groups);
- Grouping *g;
- for (;(g=gli.current());++gli)
- {
- GroupDef *gd=0;
- if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict[g->groupname]))
- gd->addNamespace(nd);
- }
-
- // 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(root->fileName);
- // add class to the list
- Doxygen::namespaceSDict.inSort(name,nd);
- nd->setRefItems(root->sli);
- }
- }
- }
- EntryListIterator eli(*root->sublist);
- Entry *e;
- for (;(e=eli.current());++eli)
- {
- findUsingDirectives(e);
- }
-}
-
-//----------------------------------------------------------------------
-
-static void findUsingDeclarations(Entry *root)
-{
- if (root->section==Entry::USINGDECL_SEC &&
- !(root->parent->section&Entry::COMPOUND_MASK) // not a class/struct member
- )
- {
- //printf("Found using declaration %s at line %d of %s inside section %x\n",
- // root->name.data(),root->startLine,root->fileName.data(),
- // root->parent->section);
- bool ambig;
- if (!root->name.isEmpty())
- {
- ClassDef *usingCd = 0;
- NamespaceDef *nd = 0;
- FileDef *fd = findFileDef(Doxygen::inputNameDict,root->fileName,ambig);
- QCString scName;
-
- // see if the using statement was found inside a namespace or inside
- // the global file scope.
- if (root->parent->section == Entry::NAMESPACE_SEC)
- {
- scName=root->parent->name.copy();
- if (!scName.isEmpty())
- {
- nd = getResolvedNamespace(scName);
- }
- }
-
- // Assume the using statement was used to import a class.
- // Find the scope in which the `using' namespace is defined by prepending
- // the possible scopes in which the using statement was found, starting
- // with the most inner scope and going to the most outer scope (i.e.
- // file scope).
-
- QCString name = substitute(root->name,".","::");
- MemberDef *mtd=0;
- usingCd = getResolvedClass(nd,fd,name,&mtd);
-
- //printf("%s -> %p\n",root->name.data(),usingCd);
- if (usingCd==0) // definition not in the input => add an artificial class
- {
- Debug::print(Debug::Classes,0," New using class `%s' (sec=0x%08x)! #tArgLists=%d\n",
- name.data(),root->section,root->tArgLists ? (int)root->tArgLists->count() : -1);
- usingCd = new ClassDef(
- "<using>",1,
- root->name,ClassDef::Class);
- Doxygen::hiddenClasses.append(root->name,usingCd);
- usingCd->setClassIsArtificial();
- }
- else
- {
- Debug::print(Debug::Classes,0," Found used class %s in scope=%s\n",
- usingCd->name().data(),nd?nd->name().data():fd->name().data());
- }
-
- if (mtd) // add the typedef to the correct scope
- {
- if (nd)
- {
- //printf("Inside namespace %s\n",nd->name().data());
- nd->addUsingDeclaration(mtd);
- }
- else if (fd)
- {
- //printf("Inside file %s\n",nd->name().data());
- fd->addUsingDeclaration(mtd);
- }
- }
- else if (usingCd) // add the class to the correct scope
- {
- if (nd)
- {
- //printf("Inside namespace %s\n",nd->name().data());
- nd->addUsingDeclaration(usingCd);
- }
- else if (fd)
- {
- //printf("Inside file %s\n",nd->name().data());
- fd->addUsingDeclaration(usingCd);
- }
- }
- }
- }
- EntryListIterator eli(*root->sublist);
- Entry *e;
- for (;(e=eli.current());++eli)
- {
- findUsingDeclarations(e);
- }
-}
-
-//----------------------------------------------------------------------
-
-static void findUsingDeclImports(Entry *root)
-{
- if (root->section==Entry::USINGDECL_SEC &&
- (root->parent->section&Entry::COMPOUND_MASK) // in a class/struct member
- )
- {
- //printf("Found using declaration %s at line %d of %s inside section %x\n",
- // root->name.data(),root->startLine,root->fileName.data(),
- // root->parent->section);
- QCString fullName=removeRedundantWhiteSpace(root->parent->name);
- fullName=stripAnonymousNamespaceScope(fullName);
- fullName=stripTemplateSpecifiersFromScope(fullName);
- ClassDef *cd = getClass(fullName);
- if (cd)
- {
- //printf("found class %s\n",cd->name().data());
- int i=root->name.find("::");
- if (i!=-1)
- {
- QCString scope=root->name.left(i);
- QCString memName=root->name.right(root->name.length()-i-2);
- ClassDef *bcd = getResolvedClass(cd,0,scope); // todo: file in fileScope parameter
- if (bcd)
- {
- //printf("found class %s\n",bcd->name().data());
- MemberNameInfoSDict *mndict=bcd->memberNameInfoSDict();
- MemberNameInfo *mni = mndict->find(memName);
- if (mni)
- {
- MemberNameInfoIterator mnii(*mni);
- MemberInfo *mi;
- for ( ; (mi=mnii.current()) ; ++mnii )
- {
- MemberDef *md = mi->memberDef;
- if (md && md->protection()!=Private)
- {
- //printf("found member %s\n",mni->memberName());
- MemberDef *newMd = new MemberDef(
- root->fileName,root->startLine,
- md->typeString(),memName,md->argsString(),
- md->excpString(),root->protection,root->virt,
- md->isStatic(),FALSE,md->memberType(),
- md->templateArguments(),md->argumentList()
- );
- cd->insertMember(newMd);
- newMd->setMemberClass(cd);
- 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->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());
- }
- }
- }
- }
- }
- }
- }
- EntryListIterator eli(*root->sublist);
- Entry *e;
- for (;(e=eli.current());++eli)
- {
- findUsingDeclImports(e);
- }
-}
-
-//----------------------------------------------------------------------
-
-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->visited=FALSE;
- }
- }
- // then recursively add using directives found in #include files
- // to files that have not been visited.
- for (fnli.toFirst();(fn=fnli.current());++fnli)
- {
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (fni.toFirst();(fd=fni.current());++fni)
- {
- if (!fd->visited)
- {
- //printf("----- adding using directives for file %s\n",fd->name().data());
- fd->addIncludedUsingDirectives();
- }
- }
- }
-}
-
-//----------------------------------------------------------------------
-
-static MemberDef *addVariableToClass(
- Entry *root,
- ClassDef *cd,
- MemberDef::MemberType mtype,
- const QCString &name,
- bool fromAnnScope,
- MemberDef *fromAnnMemb,
- Protection prot,
- bool related)
-{
- QCString qualScope = cd->qualifiedNameWithTemplateParameters();
- QCString scopeSeparator="::";
- if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
- {
- qualScope = substitute(qualScope,"::",".");
- scopeSeparator=".";
- }
- Debug::print(Debug::Variables,0,
- " class variable:\n"
- " %s' %s'::`%s' `%s' prot=`%d ann=%d init=%s\n",
- root->type.data(),
- qualScope.data(),
- name.data(),
- root->args.data(),
- root->protection,
- fromAnnScope,
- root->initializer.data()
- );
-
- QCString def;
- if (!root->type.isEmpty())
- {
- if (related || mtype==MemberDef::Friend || Config_getBool("HIDE_SCOPE_NAMES"))
- {
- def=root->type+" "+name+root->args;
- }
- else
- {
- def=root->type+" "+qualScope+scopeSeparator+name+root->args;
- }
- }
- else
- {
- if (Config_getBool("HIDE_SCOPE_NAMES"))
- {
- def=name+root->args;
- }
- else
- {
- def=qualScope+scopeSeparator+name+root->args;
- }
- }
- def.stripPrefix("static ");
-
- // 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[name];
- if (mn)
- {
- MemberNameIterator mni(*mn);
- MemberDef *md;
- for (mni.toFirst();(md=mni.current());++mni)
- {
- if (md->getClassDef()==cd && root->type==md->typeString())
- // member already in the scope
- {
- addMemberDocs(root,md,def,0,FALSE);
- return md;
- }
- }
- }
- // new member variable, typedef or enum value
- MemberDef *md=new MemberDef(
- root->fileName,root->startLine,
- root->type,name,root->args,0,
- prot,Normal,root->stat,related,
- mtype,0,0);
- 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);
- md->setDefinition(def);
- md->setBitfields(root->bitfields);
- md->addSectionsToDefinition(root->anchors);
- md->setFromAnonymousScope(fromAnnScope);
- md->setFromAnonymousMember(fromAnnMemb);
- //md->setIndentDepth(indentDepth);
- md->setBodySegment(root->bodyLine,root->endBodyLine);
- md->setInitializer(root->initializer);
- md->setMaxInitLines(root->initLines);
- md->setMemberGroupId(root->mGrpId);
- md->setMemberSpecifiers(root->memSpec);
- md->setReadAccessor(root->read);
- md->setWriteAccessor(root->write);
- md->enableCallGraph(root->callGraph);
- md->setHidden(root->hidden);
- addMemberToGroups(root,md);
- //if (root->mGrpId!=-1)
- //{
- // printf("memberdef %s in memberGroup %d\n",name.data(),root->mGrpId);
- // md->setMemberGroup(memberGroupDict[root->mGrpId]);
- //
- bool ambig;
- md->setBodyDef(findFileDef(Doxygen::inputNameDict,root->fileName,ambig));
-
- //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
- }
- cd->insertMember(md);
- md->setRefItems(root->sli);
-
- //TODO: insert FileDef instead of filename strings.
- cd->insertUsedFile(root->fileName);
- root->section = Entry::EMPTY_SEC;
- return md;
-}
-
-//----------------------------------------------------------------------
-
-static MemberDef *addVariableToFile(
- Entry *root,
- MemberDef::MemberType mtype,
- const QCString &scope,
- const QCString &name,
- bool fromAnnScope,
- /*int indentDepth,*/
- MemberDef *fromAnnMemb)
-{
- Debug::print(Debug::Variables,0,
- " global variable:\n"
- " type=`%s' scope=`%s' name=`%s' args=`%s' prot=`%d mtype=%d\n",
- root->type.data(),
- scope.data(),
- name.data(),
- root->args.data(),
- root->protection,
- mtype
- );
-
- bool ambig;
- FileDef *fd = findFileDef(Doxygen::inputNameDict,root->fileName,ambig);
-
- // see if the function is inside a namespace
- NamespaceDef *nd = 0;
- if (!scope.isEmpty())
- {
- QCString nscope=removeAnonymousScopes(scope);
- if (!nscope.isEmpty())
- {
- nd = getResolvedNamespace(nscope);
- }
- }
- QCString def;
-
- // determine the definition of the global variable
- if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@' &&
- !Config_getBool("HIDE_SCOPE_NAMES")
- )
- // variable is inside a namespace, so put the scope before the name
- {
- static bool optimizeForJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
- QCString sep="::";
- if (optimizeForJava) sep=".";
-
- if (!root->type.isEmpty())
- {
- def=root->type+" "+nd->name()+sep+name+root->args;
- }
- else
- {
- def=nd->name()+sep+name+root->args;
- }
- }
- else
- {
- if (!root->type.isEmpty())
- {
- if (name.at(0)=='@') // dummy variable representing annonymous union
- def=root->type;
- else
- def=root->type+" "+name+root->args;
- }
- else
- {
- def=name+root->args;
- }
- }
- def.stripPrefix("static ");
-
- MemberName *mn=Doxygen::functionNameSDict[name];
- if (mn)
- {
- QCString nscope=removeAnonymousScopes(scope);
- NamespaceDef *nd=0;
- if (!nscope.isEmpty())
- {
- nd = getResolvedNamespace(nscope);
- }
- MemberNameIterator mni(*mn);
- MemberDef *md;
- for (mni.toFirst();(md=mni.current());++mni)
- {
- if (
- ((nd==0 && md->getNamespaceDef()==0 && md->getFileDef() &&
- root->fileName==md->getFileDef()->absFilePath()
- ) // both variable names in the same file
- || (nd!=0 && md->getNamespaceDef()==nd) // both in same namespace
- )
- && !md->isDefine() // function style #define's can be "overloaded" by typedefs or variables
- )
- // variable already in the scope
- {
- Debug::print(Debug::Variables,0,
- " variable already found: scope=%s\n",md->getOuterScope()->name().data());
- addMemberDocs(root,md,def,0,FALSE);
- md->setRefItems(root->sli);
- return md;
- }
- }
- }
- Debug::print(Debug::Variables,0,
- " new variable!\n");
- // new global variable, enum value or typedef
- MemberDef *md=new MemberDef(
- root->fileName,root->startLine,
- root->type,name,root->args,0,
- Public, Normal,root->stat,FALSE,
- mtype,0,0);
- md->setTagInfo(root->tagInfo);
- 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->addSectionsToDefinition(root->anchors);
- md->setFromAnonymousScope(fromAnnScope);
- md->setFromAnonymousMember(fromAnnMemb);
- md->setInitializer(root->initializer);
- md->setMaxInitLines(root->initLines);
- md->setMemberGroupId(root->mGrpId);
- md->setDefinition(def);
- md->enableCallGraph(root->callGraph);
- md->setExplicitExternal(root->explicitExternal);
- //md->setOuterScope(fd);
- if (!root->explicitExternal)
- {
- md->setBodySegment(root->bodyLine,root->endBodyLine);
- md->setBodyDef(fd);
- }
- addMemberToGroups(root,md);
-
- md->setRefItems(root->sli);
- if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@')
- {
- nd->insertMember(md);
- md->setNamespace(nd);
- }
-
- // add member to the file (we do this even if we have already inserted
- // it into the namespace.
- if (fd)
- {
- fd->insertMember(md);
- md->setFileDef(fd);
- }
-
- // 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->section = Entry::EMPTY_SEC;
- return md;
-}
-
-/*! See if the return type string \a type is that of a function pointer
- * \returns -1 if this is not a function pointer variable or
- * the index at which the brace of (...*name) was found.
- */
-static int findFunctionPtr(const QCString &type,int *pLength=0)
-{
- static const QRegExp re("([^)]*)");
- int i=-1,l;
- if (!type.isEmpty() && // return type is non-empty
- (i=re.match(type,0,&l))!=-1 && // contains a (*
- type.find("operator")==-1 && // not an operator
- type.find(")(")==-1 // not a function pointer return type
- )
- {
- if (pLength) *pLength=l;
- return i;
- }
- else
- {
- return -1;
- }
-}
-
-
-/*! Returns TRUE iff \a type is a class within scope \a context.
- * Used to detect variable declarations that look like function prototypes.
- */
-static bool isVarWithConstructor(Entry *root)
-{
- static QRegExp initChars("[0-9\"'&*!^]+");
- static QRegExp idChars("[a-z_A-Z][a-z_A-Z0-9]*");
- bool result=FALSE;
- bool typeIsClass;
- QCString type;
- Definition *ctx = 0;
- FileDef *fd = 0;
- bool ambig;
- int ti;
-
- if (root->parent && root->parent->section&Entry::COMPOUND_MASK)
- { // inside a class
- result=FALSE;
- goto done;
- }
- else if ((fd = findFileDef(Doxygen::inputNameDict,root->fileName,ambig)) &&
- fd->name().right(2)==".c"
- )
- { // inside a .c file
- result=FALSE;
- goto done;
- }
- if (root->type.isEmpty())
- {
- result=FALSE;
- goto done;
- }
- if (root->parent->name) ctx=Doxygen::namespaceSDict.find(root->parent->name);
- type = root->type;
- // remove qualifiers
- findAndRemoveWord(type,"const");
- findAndRemoveWord(type,"static");
- findAndRemoveWord(type,"volatile");
- //if (type.left(6)=="const ") type=type.right(type.length()-6);
- typeIsClass=getResolvedClass(ctx,fd,type)!=0;
- if (!typeIsClass && (ti=type.find('<'))!=-1)
- {
- typeIsClass=getResolvedClass(ctx,fd,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
- // we need to rely on heuristics :-(
- {
- //printf("typeIsClass\n");
- ArgumentList *al = root->argList;
- if (al==0 || al->isEmpty())
- {
- result=FALSE; // empty arg list -> function prototype.
- goto done;
- }
- ArgumentListIterator ali(*al);
- Argument *a;
- for (ali.toFirst();(a=ali.current());++ali)
- {
- if (!a->name.isEmpty() || !a->defval.isEmpty())
- {
- if (a->name.find(initChars)==0)
- {
- result=TRUE;
- }
- else
- {
- result=FALSE; // arg has (type,name) pair -> function prototype
- }
- goto done;
- }
- if (a->type.isEmpty() || getResolvedClass(ctx,fd,a->type)!=0)
- {
- result=FALSE; // arg type is a known type
- goto done;
- }
- if (a->type.find(initChars)==0)
- {
- result=TRUE; // argument type starts with typical initializer char
- goto done;
- }
- QCString resType=resolveTypeDef(ctx,a->type);
- if (resType.isEmpty()) resType=a->type;
- int len;
- if (idChars.match(resType,0,&len)==0) // resType starts with identifier
- {
- resType=resType.left(len);
- //printf("resType=%s\n",resType.data());
- if (resType=="int" || resType=="long" || resType=="float" ||
- resType=="double" || resType=="char" || resType=="signed" ||
- resType=="const" || resType=="unsigned" || resType=="void")
- {
- result=FALSE; // type keyword -> function prototype
- goto done;
- }
- }
- }
- result=TRUE;
- }
-done:
- //printf("isVarWithConstructor(%s,%s)=%d\n",root->parent->name.data(),
- // root->type.data(),result);
- return result;
-}
-
-//----------------------------------------------------------------------
-// Searches the Entry tree for Variable documentation sections.
-// If found they are stored in their class or in the global list.
-
-static void buildVarList(Entry *root)
-{
- if (!root->name.isEmpty() &&
- (root->type.isEmpty() || compoundKeywordDict.find(root->type)==0) &&
- (
- (root->section==Entry::VARIABLE_SEC // it's a variable
- ) ||
- (root->section==Entry::FUNCTION_SEC && // or maybe a function pointer variable
- findFunctionPtr(root->type)!=-1
- ) ||
- (root->section==Entry::FUNCTION_SEC && // class variable initialized by constructor
- isVarWithConstructor(root)
- )
- )
- ) // documented variable
- {
- Debug::print(Debug::Variables,0,
- "VARIABLE_SEC: \n"
- " type=`%s' name=`%s' args=`%s' bodyLine=`%d' mGrpId=%d\n",
- root->type.data(),
- root->name.data(),
- root->args.data(),
- root->bodyLine,
- root->mGrpId
- );
- //printf("root->parent->name=%s\n",root->parent->name.data());
-
- if (root->type.isEmpty() && root->name.find("operator")==-1 &&
- (root->name.find('*')!=-1 || root->name.find('&')!=-1))
- {
- // recover from parse error caused by redundant braces
- // like in "int *(var[10]);", which is parsed as
- // type="" name="int *" args="(var[10])"
-
- root->type=root->name;
- static const QRegExp reName("[a-z_A-Z][a-z_A-Z0-9]*");
- int l;
- int i=root->args.isEmpty() ? -1 : reName.match(root->args,0,&l);
- root->name=root->args.mid(i,l);
- root->args=root->args.mid(i+l,root->args.find(')',i+l)-i-l);
- //printf("new: type=`%s' name=`%s' args=`%s'\n",
- // root->type.data(),root->name.data(),root->args.data());
- }
- else
- {
- int i=findFunctionPtr(root->type);
- if (i!=-1) // function pointer
- {
- int ai = root->type.find('[',i);
- if (ai>i) // function pointer array
- {
- root->args.prepend(root->type.right(root->type.length()-ai));
- root->type=root->type.left(ai);
- }
- else if (root->type.find(')',i)!=-1) // function ptr, not variable like "int (*bla)[10]"
- {
- root->type=root->type.left(root->type.length()-1);
- root->args.prepend(")");
- //printf("root->type=%s root->args=%s\n",root->type.data(),root->args.data());
- }
- }
- }
-
- QCString scope,name=removeRedundantWhiteSpace(root->name);
-
- // find the scope of this variable
- Entry *p = root->parent;
- while ((p->section & Entry::SCOPE_MASK))
- {
- QCString scopeName = p->name.copy();
- if (!scopeName.isEmpty())
- {
- scope.prepend(scopeName);
- break;
- }
- p=p->parent;
- }
-
- MemberDef::MemberType mtype;
- QCString type=root->type.stripWhiteSpace();
- ClassDef *cd=0;
-
- if (root->name.findRev("::")!=-1)
- {
- if (root->type=="friend class" || root->type=="friend struct" ||
- root->type=="friend union")
- {
- cd=getClass(scope);
- if (cd)
- {
- addVariableToClass(root, // entry
- cd, // class to add member to
- MemberDef::Friend, // type of member
- name, // name of the member
- FALSE, // from Anonymous scope
- 0, // anonymous member
- Public, // protection
- FALSE // related to a class
- );
- }
- }
- goto nextMember;
- /* skip this member, because it is a
- * static variable definition (always?), which will be
- * found in a class scope as well, but then we know the
- * correct protection level, so only then it will be
- * inserted in the correct list!
- */
- }
-
- if (type=="@")
- mtype=MemberDef::EnumValue;
- else if (type.left(8)=="typedef ")
- mtype=MemberDef::Typedef;
- else if (type.left(7)=="friend ")
- mtype=MemberDef::Friend;
- else if (root->mtype==Property)
- mtype=MemberDef::Property;
- else if (root->mtype==Event)
- mtype=MemberDef::Event;
- else
- mtype=MemberDef::Variable;
-
- QCString classScope=stripAnonymousNamespaceScope(scope);
- classScope=stripTemplateSpecifiersFromScope(classScope,FALSE);
- QCString annScopePrefix=scope.left(scope.length()-classScope.length());
-
- bool isRelated=FALSE;
- if (!root->relates.isEmpty()) // related variable
- {
- isRelated=TRUE;
- if (getClass(root->relates)==0 && !scope.isEmpty())
- scope=mergeScopes(scope,root->relates);
- else
- scope=root->relates.copy();
- }
-
- if (!scope.isEmpty() && !name.isEmpty() && (cd=getClass(scope)))
- {
- MemberDef *md=0;
-
- // if cd is an annonymous scope we insert the member
- // into a non-annonymous scope as well. This is needed to
- // be able to refer to it using \var or \fn
-
- //int indentDepth=0;
- int si=scope.find('@');
- //int anonyScopes = 0;
- bool added=FALSE;
- if (si!=-1) // anonymous scope
- {
- QCString pScope;
- ClassDef *pcd=0;
- pScope = scope.left(QMAX(si-2,0));
- if (!pScope.isEmpty())
- pScope.prepend(annScopePrefix);
- else if (annScopePrefix.length()>2)
- pScope=annScopePrefix.left(annScopePrefix.length()-2);
- if (name.at(0)!='@')
- {
- if (!pScope.isEmpty() && (pcd=getClass(pScope)))
- {
- md=addVariableToClass(root, // entry
- pcd, // class to add member to
- mtype, // member type
- name, // member name
- TRUE, // from anonymous scope
- 0, // from anonymous member
- root->protection,
- isRelated
- );
- added=TRUE;
- }
- else // anonymous scope inside namespace or file => put variable in the global scope
- {
- if (mtype==MemberDef::Variable)
- {
- md=addVariableToFile(root,mtype,pScope,name,TRUE,0);
- }
- added=TRUE;
- }
- }
- }
- //printf("name=`%s' scope=%s scope.right=%s indentDepth=%d anonyScopes=%d\n",
- // name.data(),scope.data(),
- // scope.right(scope.length()-si).data(),
- // indentDepth,
- // anonyScopes);
- addVariableToClass(root, // entry
- cd, // class to add member to
- mtype, // member type
- name, // name of the member
- FALSE, // from anonymous scope
- md, // from anonymous member
- root->protection,
- isRelated);
- }
- else if (!name.isEmpty()) // global variable
- {
- //printf("Inserting member in global scope %s!\n",scope.data());
- addVariableToFile(root,mtype,scope,name,FALSE,/*0,*/0);
- }
- }
-nextMember:
- EntryListIterator eli(*root->sublist);
- Entry *e;
- for (;(e=eli.current());++eli)
- {
- if (e->section!=Entry::ENUM_SEC) buildVarList(e);
- }
-}
-
-//----------------------------------------------------------------------
-// Searches the Entry tree for Function sections.
-// If found they are stored in their class or in the global list.
-
-static void addMethodToClass(Entry *root,ClassDef *cd,
- const QCString &rname,/*const QCString &scope,*/bool isFriend)
-{
- int l,i;
- static QRegExp re("([a-z_A-Z0-9: ]*[ *]*[ ]*");
-
- if (!root->type.isEmpty() && (i=re.match(root->type,0,&l))!=-1) // function variable
- {
- root->args+=root->type.right(root->type.length()-i-l);
- root->type=root->type.left(i+l);
- }
-
- QCString name=removeRedundantWhiteSpace(rname);
- if (name.left(2)=="::") name=name.right(name.length()-2);
-
- MemberDef::MemberType mtype;
- if (isFriend) mtype=MemberDef::Friend;
- else if (root->mtype==Signal) mtype=MemberDef::Signal;
- else if (root->mtype==Slot) mtype=MemberDef::Slot;
- else if (root->mtype==DCOP) mtype=MemberDef::DCOP;
- else mtype=MemberDef::Function;
-
- // strip redundant template specifier for constructors
- if ((i=name.find('<'))!=-1 && name.find('>')!=-1)
- {
- name=name.left(i);
- }
-
- //printf("root->name=`%s; root->args=`%s' root->argList=`%s'\n",
- // root->name.data(),root->args.data(),argListToString(root->argList).data()
- // );
-
- // adding class member
- MemberDef *md=new MemberDef(
- root->fileName,root->startLine,
- root->type,name,root->args,root->exception,
- root->protection,root->virt,root->stat,!root->relates.isEmpty(),
- mtype,root->tArgLists ? root->tArgLists->last() : 0,root->argList);
- 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->setMemberSpecifiers(root->memSpec);
- md->setMemberGroupId(root->mGrpId);
- bool ambig;
- FileDef *fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig);
- md->setBodyDef(fd);
- md->setFileDef(fd);
- //md->setScopeTemplateArguments(root->tArgList);
- md->addSectionsToDefinition(root->anchors);
- QCString def;
- QCString qualScope = cd->qualifiedNameWithTemplateParameters();
- QCString scopeSeparator="::";
- if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
- {
- qualScope = substitute(qualScope,"::",".");
- scopeSeparator=".";
- }
- if (!root->relates.isEmpty() || isFriend || Config_getBool("HIDE_SCOPE_NAMES"))
- {
- if (!root->type.isEmpty())
- {
- if (root->argList)
- {
- def=root->type+" "+name;
- }
- else
- {
- def=root->type+" "+name+root->args;
- }
- }
- else
- {
- if (root->argList)
- {
- def=name;
- }
- else
- {
- def=name+root->args;
- }
- }
- }
- else
- {
- if (!root->type.isEmpty())
- {
- if (root->argList)
- {
- def=root->type+" "+qualScope+scopeSeparator+name;
- }
- else
- {
- def=root->type+" "+qualScope+scopeSeparator+name+root->args;
- }
- }
- else
- {
- if (root->argList)
- {
- def=qualScope+scopeSeparator+name;
- }
- else
- {
- def=qualScope+scopeSeparator+name+root->args;
- }
- }
- }
- if (def.left(7)=="friend ") def=def.right(def.length()-7);
- md->setDefinition(def);
- md->enableCallGraph(root->callGraph);
-
- Debug::print(Debug::Functions,0,
- " Func Member:\n"
- " `%s' `%s'::`%s' `%s' proto=%d\n"
- " def=`%s'\n",
- root->type.data(),
- qualScope.data(),
- rname.data(),
- root->args.data(),
- root->proto,
- def.data()
- );
-
- // 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[name]))
- {
- mn->append(md);
- }
- else
- {
- mn = new MemberName(name);
- mn->append(md);
- Doxygen::memberNameSDict.append(name,mn);
- }
-
- // add member to the class cd
- cd->insertMember(md);
- // add file to list of used files
- cd->insertUsedFile(root->fileName);
-
- addMemberToGroups(root,md);
- root->section = Entry::EMPTY_SEC;
- md->setRefItems(root->sli);
-}
-
-
-static void buildFunctionList(Entry *root)
-{
- if (root->section==Entry::FUNCTION_SEC)
- {
- Debug::print(Debug::Functions,0,
- "FUNCTION_SEC:\n"
- " `%s' `%s'::`%s' `%s' relates=`%s' relatesDup=`%d' file=`%s' line=`%d' bodyLine=`%d' #tArgLists=%d mGrpId=%d memSpec=%d proto=%d docFile=%s\n",
- root->type.data(),
- root->parent->name.data(),
- root->name.data(),
- root->args.data(),
- root->relates.data(),
- root->relatesDup,
- root->fileName.data(),
- root->startLine,
- root->bodyLine,
- root->tArgLists ? (int)root->tArgLists->count() : -1,
- root->mGrpId,
- root->memSpec,
- root->proto,
- root->docFile.data()
- );
-
- bool isFriend=root->type.find("friend ")!=-1;
- QCString rname = removeRedundantWhiteSpace(root->name);
- //printf("rname=%s\n",rname.data());
-
- if (!rname.isEmpty())
- {
-
- ClassDef *cd=0;
- // check if this function's parent is a class
- static QRegExp re("([a-z_A-Z0-9: ]*[ *]*[ ]*");
- //printf("root->parent=`%s' %x cd=%p root->type.find(re,0)=%d\n",
- // root->parent->name.data(),root->parent->section,getClass(root->parent->name),
- // root->type.find(re,0));
- QCString scope=root->parent->name; //stripAnonymousNamespaceScope(root->parent->name);
- scope=stripTemplateSpecifiersFromScope(scope,FALSE);
- //printf("scope=%s\n",scope.data());
-
- cd=getClass(scope);
- //printf("cd=%p\n",cd);
- 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;
- int memIndex=rname.findRev("::");
- if (memIndex!=-1)
- {
- int ts=rname.find('<');
- int te=rname.find('>');
- if (memIndex>0 && (ts==-1 || te==-1))
- {
- nd = Doxygen::namespaceSDict.find(rname.left(memIndex));
- isMember = nd==0;
- if (nd)
- {
- // strip namespace scope from name
- scope=rname.left(memIndex);
- rname=rname.right(rname.length()-memIndex-2);
- }
- }
- else
- {
- isMember=memIndex<ts || memIndex>te;
- }
- }
-
- if (root->parent &&
- !root->parent->name.isEmpty() &&
- (root->parent->section & Entry::COMPOUND_MASK) &&
- cd &&
- // do some fuzzy things to exclude function pointers
- (root->type.isEmpty() || root->type.find(re,0)==-1 ||
- root->type.find(")(")!=-1 || root->type.find("operator")!=-1
- )
- )
- {
- Debug::print(Debug::Functions,0," --> member %s of class %s!\n",
- rname.data(),cd->name().data());
- addMethodToClass(root,cd,rname,isFriend);
- }
- else if (root->parent &&
- !((root->parent->section & Entry::COMPOUND_MASK)
- || root->parent->section==Entry::OBJCIMPL_SEC
- ) &&
- !isMember &&
- (root->relates.isEmpty() || root->relatesDup) &&
- root->type.left(7)!="extern " && root->type.left(8)!="typedef "
- )
- // no member => unrelated function
- {
- /* check the uniqueness of the function name in the file.
- * A file could contain a function prototype and a function definition
- * or even multiple function prototypes.
- */
- bool found=FALSE;
- MemberName *mn;
- MemberDef *md=0;
- if ((mn=Doxygen::functionNameSDict[rname]))
- {
- Debug::print(Debug::Functions,0," --> function %s already found!\n",rname.data());
- MemberNameIterator mni(*mn);
- for (mni.toFirst();(!found && (md=mni.current()));++mni)
- {
- NamespaceDef *mnd = md->getNamespaceDef();
- NamespaceDef *rnd = 0;
- if (!root->parent->name.isEmpty())
- {
- rnd = getResolvedNamespace(root->parent->name);
- }
- FileDef *mfd = md->getFileDef();
- QCString nsName,rnsName;
- if (mnd) nsName = mnd->name().copy();
- if (rnd) rnsName = rnd->name().copy();
- bool ambig;
- FileDef *rfd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig);
- //printf("matching arguments for %s%s %s%s\n",
- // md->name().data(),md->argsString(),rname.data(),argListToString(root->argList).data());
- if (
- matchArguments2(md->getOuterScope(),mfd,md->argumentList(),
- rnd ? rnd : Doxygen::globalScope,rfd,root->argList,
- FALSE)
- )
- {
- GroupDef *gd=0;
- if (root->groups->first()!=0)
- {
- gd = Doxygen::groupSDict[root->groups->first()->groupname.data()];
- }
- //printf("match!\n");
- // see if we need to create a new member
- found=(mnd && rnd && nsName==rnsName) || // members are in the same namespace
- ((mnd==0 && rnd==0 && mfd!=0 && // no external reference and
- mfd->absFilePath()==root->fileName // prototype in the same file
- )
- );
- // otherwise, allow a duplicate global member with the same argument list
- if (!found && gd && gd==md->getGroupDef())
- {
- // member is already in the group, so we don't want to add it again.
- found=TRUE;
- }
-
- //printf("combining function with prototype found=%d in namespace %s\n",
- // found,nsName.data());
-
- if (found)
- {
- // merge argument lists
- mergeArguments(md->argumentList(),root->argList,!root->doc.isEmpty());
- // merge documentation
- if (md->documentation().isEmpty() && !root->doc.isEmpty())
- {
- md->setDocumentation(root->doc,root->docFile,root->docLine);
- md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
- md->setDocsForDefinition(!root->proto);
- ArgumentList *argList = new ArgumentList;
- stringToArgumentList(root->args,argList);
- if (root->proto)
- {
- //printf("setDeclArgumentList to %p\n",argList);
- md->setDeclArgumentList(argList);
- }
- else
- {
- md->setArgumentList(argList);
- }
- }
- else if (!md->documentation().isEmpty() && !root->doc.isEmpty() && mnd==rnd)
- {
- warn(root->docFile,root->docLine,"Warning: member %s: ignoring the detailed description found here, since another one was found at line %d of file %s!",md->name().data(),md->docLine(),md->docFile().data());
- //printf("md->docs=[%s] root->docs=[%s]\n",md->documentation().data(),root->doc.data());
- }
-
- if (md->briefDescription().isEmpty() && !root->brief.isEmpty())
- {
- md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- md->setArgsString(root->args);
- }
- else if (!md->briefDescription().isEmpty() && !root->brief.isEmpty() && mnd==rnd)
- {
- warn(root->briefFile,root->briefLine,"Warning: member %s: ignoring the brief description found here, since another one was found at line %d of file %s!",md->name().data(),md->briefLine(),md->briefFile().data());
- }
-
- md->addSectionsToDefinition(root->anchors);
-
- md->enableCallGraph(md->hasCallGraph() || root->callGraph);
-
- // merge ingroup specifiers
- if (md->getGroupDef()==0 && root->groups->first()!=0)
- {
- addMemberToGroups(root,md);
- }
- else if (md->getGroupDef()!=0 && root->groups->count()==0)
- {
- //printf("existing member is grouped, new member not\n");
- root->groups->append(new Grouping(md->getGroupDef()->name(), md->getGroupPri()));
- }
- else if (md->getGroupDef()!=0 && root->groups->first()!=0)
- {
- //printf("both members are grouped\n");
- }
- }
- }
- }
- }
- if (!found) /* global function is unique with respect to the file */
- {
- Debug::print(Debug::Functions,0," --> new function %s found!\n",rname.data());
- //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
- ArgumentList *tArgList = root->tArgLists ? root->tArgLists->last() : 0;
- QCString name=removeRedundantWhiteSpace(rname);
- md=new MemberDef(
- root->fileName,root->startLine,
- root->type,name,root->args,root->exception,
- root->protection,root->virt,root->stat,FALSE,
- MemberDef::Function,tArgList,root->argList);
-
- md->setTagInfo(root->tagInfo);
- //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);
- md->setDocsForDefinition(!root->proto);
- //md->setBody(root->body);
- md->setBodySegment(root->bodyLine,root->endBodyLine);
- bool ambig;
- FileDef *fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig);
- md->setBodyDef(fd);
- md->addSectionsToDefinition(root->anchors);
- md->setMemberSpecifiers(root->memSpec);
- 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);
- if (!nscope.isEmpty())
- {
- nd = getResolvedNamespace(nscope);
- }
- }
-
- if (!scope.isEmpty())
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
- {
- scope = substitute(scope,"::",".")+".";
- }
- else
- {
- scope+="::";
- }
- }
-
- QCString def;
- if (!root->type.isEmpty())
- {
- if (root->argList)
- {
- def=root->type+" "+scope+name;
- }
- else
- {
- def=root->type+" "+scope+name+root->args;
- }
- }
- else
- {
- if (root->argList)
- {
- def=scope+name.copy();
- }
- else
- {
- def=scope+name+root->args;
- }
- }
- Debug::print(Debug::Functions,0,
- " Global Function:\n"
- " `%s' `%s'::`%s' `%s' proto=%d\n"
- " def=`%s'\n",
- root->type.data(),
- root->parent->name.data(),
- rname.data(),
- root->args.data(),
- root->proto,
- def.data()
- );
- md->setDefinition(def);
- md->enableCallGraph(root->callGraph);
- //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
- nd->insertMember(md);
- md->setNamespace(nd);
- }
- if (fd)
- {
- // add member to the file (we do this even if we have already
- // inserted it into the namespace)
- fd->insertMember(md);
- md->setFileDef(fd);
- }
-
- // add member to the list of file members
- //printf("Adding member=%s\n",md->name().data());
- MemberName *mn;
- if ((mn=Doxygen::functionNameSDict[name]))
- {
- mn->append(md);
- }
- else
- {
- mn = new MemberName(name);
- mn->append(md);
- Doxygen::functionNameSDict.append(name,mn);
- }
- addMemberToGroups(root,md);
- if (!root->relatesDup) // if this is a relatesalso command, allow find
- // Member to pick it up
- {
- root->section = Entry::EMPTY_SEC; // Otherwise we have finished
- // with this entry.
-
- }
- }
- else
- {
- bool ambig;
- FileDef *fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig);
- if (fd)
- {
- // add member to the file (we do this even if we have already
- // inserted it into the namespace)
- fd->insertMember(md);
- }
- }
-
- //printf("unrelated function %d `%s' `%s' `%s'\n",
- // root->parent->section,root->type.data(),rname.data(),root->args.data());
- }
- }
- else if (rname.isEmpty())
- {
- warn(root->fileName,root->startLine,
- "Warning: Illegal member name found."
- );
- }
- }
- EntryListIterator eli(*root->sublist);
- Entry *e;
- for (;(e=eli.current());++eli)
- {
- buildFunctionList(e);
- }
-}
-
-//----------------------------------------------------------------------
-
-static void findFriends()
-{
- //printf("findFriends()\n");
- MemberNameSDict::Iterator fnli(Doxygen::functionNameSDict);
- MemberName *fn;
- for (;(fn=fnli.current());++fnli) // for each global function name
- {
- //printf("Function name=`%s'\n",fn->memberName());
- MemberName *mn;
- if ((mn=Doxygen::memberNameSDict[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
- {
- MemberNameIterator mni(*mn);
- MemberDef *mmd;
- for (;(mmd=mni.current());++mni) // for each member with that name
- {
- //printf("Checking for matching arguments
- // mmd->isRelated()=%d mmd->isFriend()=%d mmd->isFunction()=%d\n",
- // mmd->isRelated(),mmd->isFriend(),mmd->isFunction());
- if ((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.
- {
- mergeArguments(mmd->argumentList(),fmd->argumentList());
- if (!fmd->documentation().isEmpty())
- {
- mmd->setDocumentation(fmd->documentation(),fmd->docFile(),fmd->docLine());
- }
- else if (!mmd->documentation().isEmpty())
- {
- fmd->setDocumentation(mmd->documentation(),mmd->docFile(),mmd->docLine());
- }
- if (mmd->briefDescription().isEmpty() && !fmd->briefDescription().isEmpty())
- {
- mmd->setBriefDescription(fmd->briefDescription(),fmd->briefFile(),fmd->briefLine());
- }
- else if (!mmd->briefDescription().isEmpty() && !fmd->briefDescription().isEmpty())
- {
- fmd->setBriefDescription(mmd->briefDescription(),mmd->briefFile(),mmd->briefLine());
- }
- if (!fmd->inbodyDocumentation().isEmpty())
- {
- mmd->setInbodyDocumentation(fmd->inbodyDocumentation(),fmd->inbodyFile(),fmd->inbodyLine());
- }
- else if (!mmd->inbodyDocumentation().isEmpty())
- {
- fmd->setInbodyDocumentation(mmd->inbodyDocumentation(),mmd->inbodyFile(),mmd->inbodyLine());
- }
- //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->setBodyDef(fmd->getBodyDef());
- //mmd->setBodyMember(fmd);
- }
- else if (mmd->getStartBodyLine()!=-1 && fmd->getStartBodyLine()==-1)
- {
- fmd->setBodySegment(mmd->getStartBodyLine(),mmd->getEndBodyLine());
- fmd->setBodyDef(mmd->getBodyDef());
- //fmd->setBodyMember(mmd);
- }
- mmd->setDocsForDefinition(fmd->isDocsForDefinition());
-
- mmd->enableCallGraph(mmd->hasCallGraph() || fmd->hasCallGraph());
- fmd->enableCallGraph(mmd->hasCallGraph() || fmd->hasCallGraph());
- }
- }
- }
- }
- }
-}
-
-//----------------------------------------------------------------------
-
-static void transferArgumentDocumentation(ArgumentList *decAl,ArgumentList *defAl)
-{
- if (decAl && defAl)
- {
- ArgumentListIterator decAli(*decAl);
- ArgumentListIterator defAli(*defAl);
- Argument *decA,*defA;
- for (decAli.toFirst(),defAli.toFirst();
- (decA=decAli.current()) && (defA=defAli.current());
- ++decAli,++defAli)
- {
- //printf("Argument decA->name=%s (doc=%s) defA->name=%s (doc=%s)\n",
- // decA->name.data(),decA->docs.data(),
- // defA->name.data(),defA->docs.data()
- // );
- if (decA->docs.isEmpty() && !defA->docs.isEmpty())
- {
- decA->docs = defA->docs.copy();
- }
- else if (defA->docs.isEmpty() && !decA->docs.isEmpty())
- {
- defA->docs = decA->docs.copy();
- }
- }
- }
-}
-
-static void transferFunctionDocumentation()
-{
- //printf("transferFunctionDocumentation()\n");
-
- // find matching function declaration and definitions.
- MemberNameSDict::Iterator mnli(Doxygen::functionNameSDict);
- MemberName *mn;
- for (;(mn=mnli.current());++mnli)
- {
- //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)
- {
- if (mdec->isPrototype() ||
- (mdec->isVariable() && mdec->isExternal())
- )
- {
- MemberNameIterator mni2(*mn);
- for (;(mdef=mni2.current());++mni2)
- {
- if (
- (mdef->isFunction() && !mdef->isStatic() && !mdef->isPrototype()) ||
- (mdef->isVariable() && !mdef->isExternal() && !mdef->isStatic())
- )
- {
- //printf("mdef=(%p,%s) mdec=(%p,%s)\n",
- // mdef, mdef ? mdef->name().data() : "",
- // mdec, mdec ? mdec->name().data() : "");
- if (mdef && mdec &&
- matchArguments2(mdef->getOuterScope(),mdef->getFileDef(),mdef->argumentList(),
- mdec->getOuterScope(),mdec->getFileDef(),mdec->argumentList(),
- TRUE
- )
- ) /* match found */
- {
- //printf("Found member %s: definition in %s (doc=`%s') and declaration in %s (doc=`%s')\n",
- // mn->memberName(),
- // mdef->getFileDef()->name().data(),mdef->documentation().data(),
- // mdec->getFileDef()->name().data(),mdec->documentation().data()
- // );
-
- // first merge argument documentation
- transferArgumentDocumentation(mdec->argumentList(),mdef->argumentList());
-
- /* copy documentation between function definition and declaration */
- if (!mdec->briefDescription().isEmpty())
- {
- mdef->setBriefDescription(mdec->briefDescription(),mdec->briefFile(),mdec->briefLine());
- }
- else if (!mdef->briefDescription().isEmpty())
- {
- mdec->setBriefDescription(mdef->briefDescription(),mdef->briefFile(),mdef->briefLine());
- }
- if (!mdef->documentation().isEmpty())
- {
- //printf("transfering docs mdef->mdec (%s->%s)\n",mdef->argsString(),mdec->argsString());
- mdec->setDocumentation(mdef->documentation(),mdef->docFile(),mdef->docLine());
- mdec->setDocsForDefinition(mdef->isDocsForDefinition());
- if (mdef->argumentList())
- {
- ArgumentList *mdefAl = new ArgumentList;
- stringToArgumentList(mdef->argsString(),mdefAl);
- transferArgumentDocumentation(mdef->argumentList(),mdefAl);
- mdec->setArgumentList(mdefAl);
- }
- }
- else if (!mdec->documentation().isEmpty())
- {
- //printf("transfering docs mdec->mdef (%s->%s)\n",mdec->argsString(),mdef->argsString());
- mdef->setDocumentation(mdec->documentation(),mdec->docFile(),mdec->docLine());
- mdef->setDocsForDefinition(mdec->isDocsForDefinition());
- if (mdec->argumentList())
- {
- ArgumentList *mdecAl = new ArgumentList;
- stringToArgumentList(mdec->argsString(),mdecAl);
- transferArgumentDocumentation(mdec->argumentList(),mdecAl);
- mdef->setDeclArgumentList(mdecAl);
- }
- }
- if (!mdef->inbodyDocumentation().isEmpty())
- {
- mdec->setInbodyDocumentation(mdef->inbodyDocumentation(),mdef->inbodyFile(),mdef->inbodyLine());
- }
- else if (!mdec->inbodyDocumentation().isEmpty())
- {
- mdef->setInbodyDocumentation(mdec->inbodyDocumentation(),mdec->inbodyFile(),mdec->inbodyLine());
- }
- 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->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->setBodyDef(mdef->getBodyDef());
- //mdec->setBodyMember(mdef);
- }
- mdec->mergeMemberSpecifiers(mdef->getMemberSpecifiers());
- mdef->mergeMemberSpecifiers(mdec->getMemberSpecifiers());
-
-
- // copy group info.
- if (mdec->getGroupDef()==0 && mdef->getGroupDef()!=0)
- {
- mdec->setGroupDef(mdef->getGroupDef(),
- mdef->getGroupPri(),
- mdef->docFile(),
- mdef->docLine(),
- mdef->hasDocumentation(),
- mdef
- );
- }
- else if (mdef->getGroupDef()==0 && mdec->getGroupDef()!=0)
- {
- mdef->setGroupDef(mdec->getGroupDef(),
- mdec->getGroupPri(),
- mdec->docFile(),
- mdec->docLine(),
- mdec->hasDocumentation(),
- mdec
- );
- }
-
- mdec->mergeRefItems(mdef);
- mdef->mergeRefItems(mdec);
-
- mdef->setMemberDeclaration(mdec);
- mdec->setMemberDefinition(mdef);
-
- mdef->enableCallGraph(mdec->hasCallGraph() || mdef->hasCallGraph());
- mdec->enableCallGraph(mdec->hasCallGraph() || mdef->hasCallGraph());
- }
- }
- }
- }
- }
- }
-}
-
-//----------------------------------------------------------------------
-
-static void transferFunctionReferences()
-{
- MemberNameSDict::Iterator mnli(Doxygen::functionNameSDict);
- MemberName *mn;
- for (;(mn=mnli.current());++mnli)
- {
- MemberDef *md,*mdef=0,*mdec=0;
- MemberNameIterator mni(*mn);
- /* find a matching function declaration and definition for this function */
- for (;(md=mni.current());++mni)
- {
- 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 (mdef && mdec &&
- matchArguments2(mdef->getOuterScope(),mdef->getFileDef(),mdef->argumentList(),
- mdec->getOuterScope(),mdec->getFileDef(),mdec->argumentList(),
- TRUE
- )
- ) /* match found */
- {
- MemberSDict *defDict = mdef->getReferencesMembers();
- MemberSDict *decDict = mdec->getReferencesMembers();
- if (defDict)
- {
- MemberSDict::Iterator msdi(*defDict);
- MemberDef *rmd;
- for (msdi.toFirst();(rmd=msdi.current());++msdi)
- {
- if (decDict==0 || decDict->find(rmd->name())==0)
- {
- mdec->addSourceReferences(rmd);
- }
- }
- }
- if (decDict)
- {
- MemberSDict::Iterator 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)
- {
- MemberSDict::Iterator msdi(*defDict);
- MemberDef *rmd;
- for (msdi.toFirst();(rmd=msdi.current());++msdi)
- {
- if (decDict==0 || decDict->find(rmd->name())==0)
- {
- mdec->addSourceReferencedBy(rmd);
- }
- }
- }
- if (decDict)
- {
- MemberSDict::Iterator msdi(*decDict);
- MemberDef *rmd;
- for (msdi.toFirst();(rmd=msdi.current());++msdi)
- {
- if (defDict==0 || defDict->find(rmd->name())==0)
- {
- mdef->addSourceReferencedBy(rmd);
- }
- }
- }
- }
- }
-}
-
-//----------------------------------------------------------------------
-
-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)
- {
- 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[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() && // 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
- md->makeRelated();
- }
- }
- }
- }
- }
-}
-
-//----------------------------------------------------------------------
-
-/*! make a dictionary of all template arguments of class cd
- * that are part of the base class name.
- * Example: A template class A with template arguments <R,S,T>
- * that inherits from B<T,T,S> will have T and S in the dictionary.
- */
-static QDict<int> *getTemplateArgumentsInName(ArgumentList *templateArguments,const QCString &name)
-{
- QDict<int> *templateNames = new QDict<int>(17);
- templateNames->setAutoDelete(TRUE);
- static QRegExp re("[a-z_A-Z][a-z_A-Z0-9:]*");
- if (templateArguments)
- {
- ArgumentListIterator ali(*templateArguments);
- Argument *arg;
- int count=0;
- for (ali.toFirst();(arg=ali.current());++ali,count++)
- {
- int i,p=0,l;
- while ((i=re.match(name,p,&l))!=-1)
- {
- QCString n = name.mid(i,l);
- if (n==arg->name)
- {
- if (templateNames->find(n)==0)
- {
- templateNames->insert(n,new int(count));
- }
- }
- p=i+l;
- }
- }
- }
- return templateNames;
-}
-
-/*! Searches a class from within \a context and \a cd and returns its
- * definition if found (otherwise 0 is returned).
- */
-static ClassDef *findClassWithinClassContext(Definition *context,ClassDef *cd,const QCString &name)
-{
-
-#if 0
- ClassDef *result=0;
-
- FileDef *fd=cd->getFileDef();
- // try using of namespaces in namespace scope
- NamespaceDef *nd=cd->getNamespaceDef();
- if (nd) // class is inside a namespace
- {
- QCString fName = nd->name()+"::"+name;
- result = getResolvedClass(cd,fd,fName);
- if (result && result!=cd)
- {
- return result;
- }
- NamespaceSDict *nl = nd->getUsedNamespaces();
- if (nl) // try to prepend any of the using namespace scopes.
- {
- NamespaceSDict::Iterator nli(*nl);
- NamespaceDef *nd;
- for (nli.toFirst() ; (nd=nli.current()) ; ++nli)
- {
- fName = nd->name()+"::"+name;
- result = getResolvedClass(cd,fd,fName);
- if (result && result!=cd) return result;
- }
- }
- SDict<Definition> *cl = nd->getUsedClasses();
- if (cl)
- {
- SDict<Definition>::Iterator cli(*cl);
- Definition *ucd;
- for (cli.toFirst(); (ucd=cli.current()) ; ++cli)
- {
- if (ucd->definitionType()==Definition::TypeClass &&
- rightScopeMatch(ucd->name(),name))
- {
- return (ClassDef *)ucd;
- }
- }
- }
- // TODO: check any inbetween namespaces as well!
- if (fd) // and in the global namespace
- {
- SDict<Definition> *cl = fd->getUsedClasses();
- if (cl)
- {
- SDict<Definition>::Iterator cli(*cl);
- Definition *ucd;
- for (cli.toFirst(); (ucd=cli.current()); ++cli)
- {
- if (ucd->definitionType()==Definition::TypeClass &&
- rightScopeMatch(ucd->name(),name))
- {
- return (ClassDef *)ucd;
- }
- }
- }
- }
- }
-
- // try using of namespaces in file scope
- if (fd)
- {
- // look for the using statement in this file in which the
- // class was found
- NamespaceSDict *nl = fd->getUsedNamespaces();
- if (nl) // try to prepend any of the using namespace scopes.
- {
- NamespaceSDict::Iterator nli(*nl);
- NamespaceDef *nd;
- for (nli.toFirst() ; (nd=nli.current()) ; ++nli)
- {
- QCString fName = nd->name()+"::"+name;
- result=getResolvedClass(cd,fd,fName);
- if (result && result!=cd)
- {
- return result;
- }
- }
- }
- SDict<Definition> *cl = fd->getUsedClasses();
- if (cl)
- {
- SDict<Definition>::Iterator cli(*cl);
- Definition *ucd;
- for (cli.toFirst(); (ucd=cli.current()) ; ++cli)
- {
- if (ucd->definitionType()==Definition::TypeClass &&
- rightScopeMatch(ucd->name(),name))
- {
- return (ClassDef *)ucd;
- }
- }
- }
- }
-#endif
-
- FileDef *fd=cd->getFileDef();
- ClassDef *result=0;
- if (context && cd!=context)
- {
- result = getResolvedClass(context,0,name);
- }
- if (result==0)
- {
- result = getResolvedClass(cd,fd,name);
- }
- //printf("** Trying to find %s within context %s class %s result=%s\n",
- // name.data(),
- // context ? context->name().data() : "<none>",
- // cd ? cd->name().data() : "<none>",
- // result ? result->name().data() : "<none>"
- // );
- return result;
-}
-
-enum FindBaseClassRelation_Mode
-{
- TemplateInstances,
- DocumentedOnly,
- Undocumented
-};
-
-static bool findClassRelation(
- Entry *root,
- Definition *context,
- ClassDef *cd,
- BaseInfo *bi,
- QDict<int> *templateNames,
- /*bool insertUndocumented*/
- FindBaseClassRelation_Mode mode,
- bool isArtificial
- );
-
-
-static void findUsedClassesForClass(Entry *root,
- Definition *context,
- ClassDef *masterCd,
- ClassDef *instanceCd,
- bool isArtificial,
- ArgumentList *actualArgs=0,
- QDict<int> *templateNames=0
- )
-{
- masterCd->visited=TRUE;
- ArgumentList *formalArgs = masterCd->templateArguments();
- MemberNameInfoSDict::Iterator mnili(*masterCd->memberNameInfoSDict());
- MemberNameInfo *mni;
- for (;(mni=mnili.current());++mnili)
- {
- MemberNameInfoIterator mnii(*mni);
- MemberInfo *mi;
- for (mnii.toFirst();(mi=mnii.current());++mnii)
- {
- MemberDef *md=mi->memberDef;
- if (md->isVariable()) // for each member variable in this class
- {
- //printf("Found variable %s in class %s\n",md->name().data(),masterCd->name().data());
- QCString type=removeRedundantWhiteSpace(md->typeString());
- int pos=0;
- QCString usedClassName;
- QCString templSpec;
- bool found=FALSE;
- // the type can contain template variables, replace them if present
- if (actualArgs)
- {
- type = substituteTemplateArgumentsInString(type,formalArgs,actualArgs);
- }
-
- //printf(" template substitution gives=%s\n",type.data());
- while (!found && extractClassNameFromType(type,pos,usedClassName,templSpec)!=-1)
- {
- // find the type (if any) that matches usedClassName
- ClassDef *typeCd = getResolvedClass(masterCd,masterCd->getFileDef(),usedClassName);
- //printf("====> usedClassName=%s -> typeCd=%s\n",
- // usedClassName.data(),typeCd?typeCd->name().data():"<none>");
- if (typeCd)
- {
- usedClassName = typeCd->name();
- }
-
- 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);
-
- if (masterCd->templateArguments())
- {
- ArgumentListIterator ali(*masterCd->templateArguments());
- Argument *arg;
- int count=0;
- for (ali.toFirst();(arg=ali.current());++ali,++count)
- {
- if (arg->name==usedName) // type is a template argument
- {
- found=TRUE;
- Debug::print(Debug::Classes,0," New used class `%s'\n", usedName.data());
-
- ClassDef *usedCd = Doxygen::hiddenClasses.find(usedName);
- if (usedCd==0)
- {
- usedCd = new ClassDef(
- masterCd->getDefFileName(),masterCd->getDefLine(),
- usedName,ClassDef::Class);
- Doxygen::hiddenClasses.append(usedName,usedCd);
- }
- if (usedCd)
- {
- if (isArtificial) usedCd->setClassIsArtificial();
- Debug::print(Debug::Classes,0," Adding used class `%s' (1)\n", usedCd->name().data());
- instanceCd->addUsedClass(usedCd,md->name());
- usedCd->addUsedByClass(instanceCd,md->name());
- }
- }
- }
- }
-
- 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)
- {
- found=TRUE;
- Debug::print(Debug::Classes,0," Adding used class `%s' (2)\n", usedCd->name().data());
- instanceCd->addUsedClass(usedCd,md->name()); // class exists
- usedCd->addUsedByClass(instanceCd,md->name());
- }
- }
- if (delTempNames)
- {
- delete templateNames;
- templateNames=0;
- }
- }
- if (!found && !type.isEmpty()) // used class is not documented in any scope
- {
- ClassDef *usedCd = Doxygen::hiddenClasses.find(type);
- if (usedCd==0 && !Config_getBool("HIDE_UNDOC_RELATIONS"))
- {
- if (type.right(2)=="(*") // type is a function pointer
- {
- type+=md->argsString();
- }
- Debug::print(Debug::Classes,0," New undocumented used class `%s'\n", type.data());
- usedCd = new ClassDef(
- masterCd->getDefFileName(),masterCd->getDefLine(),
- type,ClassDef::Class);
- Doxygen::hiddenClasses.append(type,usedCd);
- }
- if (usedCd)
- {
- if (isArtificial) usedCd->setClassIsArtificial();
- Debug::print(Debug::Classes,0," Adding used class `%s' (3)\n", usedCd->name().data());
- instanceCd->addUsedClass(usedCd,md->name());
- usedCd->addUsedByClass(instanceCd,md->name());
- }
- }
- }
- }
- }
-}
-
-static void findBaseClassesForClass(
- Entry *root,
- Definition *context,
- ClassDef *masterCd,
- ClassDef *instanceCd,
- FindBaseClassRelation_Mode mode,
- bool isArtificial,
- ArgumentList *actualArgs=0,
- QDict<int> *templateNames=0
- )
-{
- //if (masterCd->visited) return;
- masterCd->visited=TRUE;
- // The base class could ofcouse also be a non-nested class
- ArgumentList *formalArgs = masterCd->templateArguments();
- QListIterator<BaseInfo> bii(*root->extends);
- BaseInfo *bi=0;
- for (bii.toFirst();(bi=bii.current());++bii)
- {
- //printf("masterCd=%s bi->name=%s #actualArgs=%d\n",
- // masterCd->localName().data(),bi->name.data(),actualArgs?(int)actualArgs->count():-1);
- bool delTempNames=FALSE;
- if (templateNames==0)
- {
- templateNames = getTemplateArgumentsInName(formalArgs,bi->name);
- delTempNames=TRUE;
- }
- BaseInfo tbi(bi->name,bi->prot,bi->virt);
- if (actualArgs) // substitute the formal template arguments of the base class
- {
- tbi.name = substituteTemplateArgumentsInString(bi->name,formalArgs,actualArgs);
- }
- //printf("bi->name=%s tbi.name=%s\n",bi->name.data(),tbi.name.data());
-
- if (mode==DocumentedOnly)
- {
- // find a documented base class in the correct scope
- if (!findClassRelation(root,context,instanceCd,&tbi,templateNames,DocumentedOnly,isArtificial))
- {
- if (!Config_getBool("HIDE_UNDOC_RELATIONS"))
- {
- // no documented base class -> try to find an undocumented one
- findClassRelation(root,context,instanceCd,&tbi,templateNames,Undocumented,isArtificial);
- }
- }
- }
- else if (mode==TemplateInstances)
- {
- findClassRelation(root,context,instanceCd,&tbi,templateNames,TemplateInstances,isArtificial);
- }
- if (delTempNames)
- {
- delete templateNames;
- templateNames=0;
- }
- }
-}
-
-//----------------------------------------------------------------------
-
-static bool findTemplateInstanceRelation(Entry *root,
- Definition *context,
- ClassDef *templateClass,const QCString &templSpec,
- QDict<int> *templateNames,
- bool isArtificial)
-{
- Debug::print(Debug::Classes,0," derived from template %s with parameters %s\n",
- templateClass->name().data(),templSpec.data());
- //printf("findTemplateInstanceRelation(base=%s templSpec=%s templateNames=",
- // templateClass->name().data(),templSpec.data());
- //if (templateNames)
- //{
- // QDictIterator<int> qdi(*templateNames);
- // int *tempArgIndex;
- // for (;(tempArgIndex=qdi.current());++qdi)
- // {
- // printf("(%s->%d) ",qdi.currentKey().data(),*tempArgIndex);
- // }
- //}
- //printf("\n");
-
- bool existingClass = (templSpec==tempArgListToString(templateClass->templateArguments()));
- if (existingClass) return TRUE;
-
- bool freshInstance=FALSE;
- ClassDef *instanceClass = templateClass->insertTemplateInstance(
- root->fileName,root->startLine,templSpec,freshInstance);
- if (isArtificial) instanceClass->setClassIsArtificial();
- instanceClass->setIsObjectiveC(root->objc);
-
- if (freshInstance)
- {
- Debug::print(Debug::Classes,0," found fresh instance!\n");
- Doxygen::classSDict.append(instanceClass->name(),instanceClass);
- instanceClass->setTemplateBaseClassNames(templateNames);
-
- // search for new template instances caused by base classes of
- // instanceClass
- Entry *templateRoot = classEntries.find(templateClass->name());
- if (templateRoot)
- {
- Debug::print(Debug::Classes,0," template root found %s templSpec=%s!\n",
- templateRoot->name.data(),templSpec.data());
- ArgumentList *templArgs = new ArgumentList;
- stringToArgumentList(templSpec,templArgs);
- findBaseClassesForClass(templateRoot,context,templateClass,instanceClass,
- TemplateInstances,isArtificial,templArgs,templateNames);
-
- findUsedClassesForClass(templateRoot,context,templateClass,instanceClass,
- isArtificial,templArgs,templateNames);
- delete templArgs;
- }
- else
- {
- Debug::print(Debug::Classes,0," no template root entry found!\n");
- // TODO: what happened if we get here?
- }
-
- //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)
-{
- QCString n=name;
- int index=n.find('<');
- if (index!=-1)
- {
- n=n.left(index);
- }
- bool result = rightScopeMatch(scope,n);
- return result;
-}
-
-static bool findClassRelation(
- Entry *root,
- Definition *context,
- ClassDef *cd,
- BaseInfo *bi,
- QDict<int> *templateNames,
- FindBaseClassRelation_Mode mode,
- bool isArtificial
- )
-{
- //printf("findClassRelation(class=%s base=%s templateNames=",
- // cd->name().data(),bi->name.data());
- //if (templateNames)
- //{
- // QDictIterator<int> qdi(*templateNames);
- // int *tempArgIndex;
- // for (;(tempArgIndex=qdi.current());++qdi)
- // {
- // printf("(%s->%d) ",qdi.currentKey().data(),*tempArgIndex);
- // }
- //}
- //printf("\n");
-
- QCString biName=bi->name;
- bool explicitGlobalScope=FALSE;
- if (biName.left(2)=="::") // explicit global scope
- {
- biName=biName.right(biName.length()-2);
- explicitGlobalScope=TRUE;
- }
- //printf("biName=`%s'\n",biName.data());
-
- Entry *parentNode=root->parent;
- bool lastParent=FALSE;
- do // for each parent scope, starting with the largest scope
- // (in case of nested classes)
- {
- QCString scopeName= parentNode ? parentNode->name.data() : "";
- int scopeOffset=explicitGlobalScope ? 0 : scopeName.length();
- do // try all parent scope prefixes, starting with the largest scope
- {
- //printf("scopePrefix=`%s' biName=`%s'\n",
- // scopeName.left(scopeOffset).data(),biName.data());
-
- QCString baseClassName=biName;
- if (scopeOffset>0)
- {
- baseClassName.prepend(scopeName.left(scopeOffset)+"::");
- }
- baseClassName=stripTemplateSpecifiersFromScope
- (removeRedundantWhiteSpace(baseClassName));
- MemberDef *baseClassTypeDef=0;
- QCString templSpec;
- ClassDef *baseClass=getResolvedClass(explicitGlobalScope ? 0 : cd,
- cd->getFileDef(), // todo: is this ok?
- baseClassName,
- &baseClassTypeDef,
- &templSpec,
- mode==Undocumented
- );
- //printf("baseClassName=%s baseClass=%p cd=%p explicitGlobalScope=%d\n",
- // baseClassName.data(),baseClass,cd,explicitGlobalScope);
- //printf(" root->name=`%s' baseClassName=`%s' baseClass=%s templSpec=%s\n",
- // root->name.data(),
- // baseClassName.data(),
- // baseClass?baseClass->name().data():"<none>",
- // templSpec.data()
- // );
- //if (baseClassName.left(root->name.length())!=root->name ||
- // baseClassName.at(root->name.length())!='<'
- // ) // Check for base class with the same name.
- // // If found then look in the outer scope for a match
- // // and prevent recursion.
- if (!isRecursiveBaseClass(root->name,baseClassName) || explicitGlobalScope)
- {
- Debug::print(
- Debug::Classes,0," class relation %s inherited/used by %s found (%s and %s)\n",
- baseClassName.data(),
- root->name.data(),
- (bi->prot==Private)?"private":((bi->prot==Protected)?"protected":"public"),
- (bi->virt==Normal)?"normal":"virtual"
- );
-
- int i=baseClassName.find('<');
- int si=baseClassName.findRev("::",i==-1 ? baseClassName.length() : i);
- if (si==-1) si=0;
- if (baseClass==0 && i!=-1)
- // base class has template specifiers
- {
- // TODO: here we should try to find the correct template specialization
- // but for now, we only look for the unspecializated base class.
- // locate end of template
- int e=i+1;
- int brCount=1;
- int typeLen = baseClassName.length();
- while (e<typeLen && brCount!=0)
- {
- if (baseClassName.at(e)=='<')
- {
- if (e<typeLen-1 && baseClassName.at(e+1)=='<') e++; else brCount++;
- }
- if (baseClassName.at(e)=='>')
- {
- if (e<typeLen-1 && baseClassName.at(e+1)=='>') e++; else brCount--;
- }
- e++;
- }
- if (brCount==0) // end of template was found at e
- {
- templSpec=baseClassName.mid(i,e-i);
- baseClassName=baseClassName.left(i)+baseClassName.right(baseClassName.length()-e);
- baseClass=getResolvedClass(cd,cd->getFileDef(),baseClassName);
- //printf("baseClass=%p -> baseClass=%s templSpec=%s\n",
- // baseClass,baseClassName.data(),templSpec.data());
- }
- }
-
- //printf("cd=%p baseClass=%p\n",cd,baseClass);
- bool found=baseClass!=0 && (baseClass!=cd || mode==TemplateInstances);
- if (!found && si!=-1)
- {
- // replace any namespace aliases
- replaceNamespaceAliases(baseClassName,si);
- baseClass=getResolvedClass(cd,cd->getFileDef(),baseClassName);
- found=baseClass!=0 && baseClass!=cd;
- }
-
- //printf("root->name=%s biName=%s baseClassName=%s\n",
- // root->name.data(),biName.data(),baseClassName.data());
-
- //FileDef *fd=cd->getFileDef();
- //NamespaceDef *nd=cd->getNamespaceDef();
- if (!found)
- {
- baseClass=findClassWithinClassContext(context,cd,baseClassName);
- //printf("findClassWithinClassContext(%s,%s)=%p\n",
- // cd->name().data(),baseClassName.data(),baseClass);
- found = baseClass!=0 && baseClass!=cd;
-
- }
- bool isATemplateArgument = templateNames!=0 && templateNames->find(biName)!=0;
- if (found)
- {
- Debug::print(Debug::Classes,0," Documented class `%s' templSpec=%s\n",biName.data(),templSpec.data());
- // add base class to this class
-
- // if templSpec is not empty then we should "instantiate"
- // the template baseClass. A new ClassDef should be created
- // to represent the instance. To be able to add the (instantiated)
- // members and documentation of a template class
- // (inserted in that template class at a later stage),
- // the template should know about its instances.
- // the instantiation process, should be done in a recursive way,
- // since instantiating a template may introduce new inheritance
- // relations.
- if (!templSpec.isEmpty() && mode==TemplateInstances)
- {
- findTemplateInstanceRelation(root,context,baseClass,templSpec,templateNames,isArtificial);
- }
- else if (mode==DocumentedOnly || mode==Undocumented)
- {
- QCString usedName;
- if (baseClassTypeDef)
- {
- usedName=biName;
- //printf("***** usedName=%s templSpec=%s\n",usedName.data(),templSpec.data());
- }
- cd->insertBaseClass(baseClass,usedName,bi->prot,bi->virt,templSpec);
- // add this class as super class to the base class
- baseClass->insertSubClass(cd,bi->prot,bi->virt,templSpec);
- }
- return TRUE;
- }
- else if (mode==Undocumented && (scopeOffset==0 || isATemplateArgument))
- {
- Debug::print(Debug::Classes,0,
- " New undocumented base class `%s' baseClassName=%s\n",
- biName.data(),baseClassName.data()
- );
- baseClass=0;
- if (isATemplateArgument)
- {
- baseClass=Doxygen::hiddenClasses.find(baseClassName);
- if (baseClass==0)
- {
- baseClass=new ClassDef(root->fileName,root->startLine,
- baseClassName,ClassDef::Class);
- Doxygen::hiddenClasses.append(baseClassName,baseClass);
- if (isArtificial) baseClass->setClassIsArtificial();
- }
- }
- else
- {
- baseClass=Doxygen::classSDict.find(baseClassName);
- if (baseClass==0)
- {
- baseClass=new ClassDef(root->fileName,root->startLine,
- baseClassName,ClassDef::Class);
- Doxygen::classSDict.append(baseClassName,baseClass);
- if (isArtificial) baseClass->setClassIsArtificial();
- }
- }
- // 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->fileName);
- baseClass->setOuterScope(Doxygen::globalScope);
- return TRUE;
- }
- else
- {
- Debug::print(Debug::Classes,0," Base class `%s' not found\n",biName.data());
- }
- }
- else
- {
- if (mode!=TemplateInstances)
- {
- warn(root->fileName,root->startLine,
- "Detected potential recursive class relation "
- "between class %s and base class %s!\n",
- root->name.data(),baseClassName.data()
- );
- }
- // for mode==TemplateInstance this case is quite common and
- // indicates a relation between a template class and a template
- // instance with the same name.
- }
- if (scopeOffset==0)
- {
- scopeOffset=-1;
- }
- else if ((scopeOffset=scopeName.findRev("::",scopeOffset-1))==-1)
- {
- scopeOffset=0;
- }
- //printf("new scopeOffset=`%d'",scopeOffset);
- } while (scopeOffset>=0);
-
- if (parentNode==0)
- {
- lastParent=TRUE;
- }
- else
- {
- parentNode=parentNode->parent;
- }
- } while (lastParent);
-
- return FALSE;
-}
-
-//----------------------------------------------------------------------
-// Computes the base and super classes for each class in the tree
-
-static bool isClassSection(Entry *root)
-{
- return
- (
- (
- (
- // is it a compound (class, struct, union, interface ...)
- root->section & Entry::COMPOUND_MASK
- )
- ||
- (
- // is it a documentation block with inheritance info.
- (root->section & Entry::COMPOUNDDOC_MASK) && root->extends->count()>0
- )
- )
- && !root->name.isEmpty() // sanity check
- );
-}
-
-
-/*! Builds a dictionary of all entry nodes in the tree starting with \a root
- */
-static void findClassEntries(Entry *root)
-{
- if (isClassSection(root))
- {
- classEntries.insert(root->name,root);
- }
- EntryListIterator eli(*root->sublist);
- Entry *e;
- for (;(e=eli.current());++eli)
- {
- findClassEntries(e);
- }
-}
-
-/*! Using the dictionary build by findClassEntries(), this
- * function will look for additional template specialization that
- * exists as inheritance relations only. These instances will be
- * added to the template they are derived from.
- */
-static void findInheritedTemplateInstances()
-{
- ClassSDict::Iterator cli(Doxygen::classSDict);
- for (cli.toFirst();cli.current();++cli) cli.current()->visited=FALSE;
- QDictIterator<Entry> edi(classEntries);
- Entry *root;
- for (;(root=edi.current());++edi)
- {
- ClassDef *cd;
- // strip any annonymous scopes first
- QCString bName=stripAnonymousNamespaceScope(root->name);
- bName=stripTemplateSpecifiersFromScope(bName);
- Debug::print(Debug::Classes,0," Class %s : \n",bName.data());
- if ((cd=getClass(bName)))
- {
- //printf("Class %s %d\n",cd->name().data(),root->extends->count());
- findBaseClassesForClass(root,cd,cd,cd,TemplateInstances,FALSE);
- }
- }
-}
-
-static void findUsedTemplateInstances()
-{
- ClassSDict::Iterator cli(Doxygen::classSDict);
- for (cli.toFirst();cli.current();++cli) cli.current()->visited=FALSE;
- QDictIterator<Entry> edi(classEntries);
- Entry *root;
- for (;(root=edi.current());++edi)
- {
- ClassDef *cd;
- // strip any annonymous scopes first
- QCString bName=stripAnonymousNamespaceScope(root->name);
- bName=stripTemplateSpecifiersFromScope(bName);
- Debug::print(Debug::Classes,0," Class %s : \n",bName.data());
- if ((cd=getClass(bName)))
- {
- findUsedClassesForClass(root,cd,cd,cd,TRUE);
- }
- }
-}
-
-static void computeClassRelations()
-{
- ClassSDict::Iterator cli(Doxygen::classSDict);
- for (cli.toFirst();cli.current();++cli) cli.current()->visited=FALSE;
- QDictIterator<Entry> edi(classEntries);
- Entry *root;
- for (;(root=edi.current());++edi)
- {
- ClassDef *cd;
-
- // strip any annonymous scopes first
- QCString bName=stripAnonymousNamespaceScope(root->name);
- bName=stripTemplateSpecifiersFromScope(bName);
- Debug::print(Debug::Classes,0," Class %s : \n",bName.data());
- if ((cd=getClass(bName)))
- {
- findBaseClassesForClass(root,cd,cd,cd,DocumentedOnly,FALSE);
- }
- if ((cd==0 || (!cd->hasDocumentation() && !cd->isReference())) &&
- bName.right(2)!="::")
- {
- if (!root->name.isEmpty() && root->name.find('@')==-1 && // normal name
- (guessSection(root->fileName)==Entry::HEADER_SEC ||
- Config_getBool("EXTRACT_LOCAL_CLASSES")) && // not defined in source file
- (root->protection!=Private || Config_getBool("EXTRACT_PRIVATE")) && // hidden by protection
- !Config_getBool("HIDE_UNDOC_CLASSES") // undocumented class are visible
- )
- warn_undoc(
- root->fileName,root->startLine,
- "Warning: Compound %s is not documented.",
- root->name.data()
- );
- }
- }
-}
-
-static void computeTemplateClassRelations()
-{
- QDictIterator<Entry> edi(classEntries);
- Entry *root;
- for (;(root=edi.current());++edi)
- {
- QCString bName=stripAnonymousNamespaceScope(root->name);
- bName=stripTemplateSpecifiersFromScope(bName);
- ClassDef *cd=getClass(bName);
- // strip any annonymous scopes first
- QDict<ClassDef> *templInstances = 0;
- if (cd && (templInstances=cd->getTemplateInstances()))
- {
- Debug::print(Debug::Classes,0," Template class %s : \n",cd->name().data());
- 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",tcd->name().data());
- QCString templSpec = tdi.currentKey();
- ArgumentList *templArgs = new ArgumentList;
- stringToArgumentList(templSpec,templArgs);
- QList<BaseInfo> *baseList=root->extends;
- BaseInfo *bi=baseList->first();
- while (bi) // for each base class of the template
- {
- // check if the base class is a template argument
- BaseInfo tbi(bi->name,bi->prot,bi->virt);
- ArgumentList *tl = cd->templateArguments();
- if (tl)
- {
- 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)
- {
- int templIndex = *qdi.current();
- Argument *actArg = 0;
- if (templIndex<(int)templArgs->count())
- {
- actArg=templArgs->at(templIndex);
- }
- if (actArg!=0 &&
- baseClassNames!=0 &&
- baseClassNames->find(actArg->type)!=0 &&
- actualTemplateNames->find(actArg->type)==0
- )
- {
- actualTemplateNames->insert(actArg->type,new int(templIndex));
- }
- }
- 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,FALSE);
- }
- delete actualTemplateNames;
- }
- bi=baseList->next();
- }
- delete templArgs;
- } // class has no base classes
- }
- }
-}
-
-//-----------------------------------------------------------------------
-// compute the references (anchors in HTML) for each function in the file
-
-static void computeMemberReferences()
-{
- ClassSDict::Iterator cli(Doxygen::classSDict);
- ClassDef *cd=0;
- for (cli.toFirst();(cd=cli.current());++cli)
- {
- cd->computeAnchors();
- }
- FileName *fn=Doxygen::inputNameList.first();
- while (fn)
- {
- FileDef *fd=fn->first();
- while (fd)
- {
- fd->computeAnchors();
- fd=fn->next();
- }
- fn=Doxygen::inputNameList.next();
- }
- NamespaceSDict::Iterator nli(Doxygen::namespaceSDict);
- NamespaceDef *nd=0;
- for (nli.toFirst();(nd=nli.current());++nli)
- {
- nd->computeAnchors();
- }
- GroupSDict::Iterator gli(Doxygen::groupSDict);
- GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
- {
- gd->computeAnchors();
- }
-}
-
-//----------------------------------------------------------------------
-
-static void addListReferences()
-{
- MemberNameSDict::Iterator mnli(Doxygen::memberNameSDict);
- MemberName *mn=0;
- for (mnli.toFirst();(mn=mnli.current());++mnli)
- {
- MemberNameIterator mni(*mn);
- MemberDef *md=0;
- for (mni.toFirst();(md=mni.current());++mni)
- {
- md->visited=FALSE;
- }
- }
- MemberNameSDict::Iterator fnli(Doxygen::functionNameSDict);
- for (fnli.toFirst();(mn=fnli.current());++fnli)
- {
- MemberNameIterator mni(*mn);
- MemberDef *md=0;
- for (mni.toFirst();(md=mni.current());++mni)
- {
- md->visited=FALSE;
- }
- }
-
- ClassSDict::Iterator cli(Doxygen::classSDict);
- ClassDef *cd=0;
- for (cli.toFirst();(cd=cli.current());++cli)
- {
- cd->addListReferences();
- }
- FileName *fn=Doxygen::inputNameList.first();
- while (fn)
- {
- FileDef *fd=fn->first();
- while (fd)
- {
- fd->addListReferences();
- fd=fn->next();
- }
- fn=Doxygen::inputNameList.next();
- }
- NamespaceSDict::Iterator nli(Doxygen::namespaceSDict);
- NamespaceDef *nd=0;
- for (nli.toFirst();(nd=nli.current());++nli)
- {
- nd->addListReferences();
- }
- GroupSDict::Iterator gli(Doxygen::groupSDict);
- GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
- {
- gd->addListReferences();
- }
- PageSDict::Iterator pdi(*Doxygen::pageSDict);
- PageDef *pd=0;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
- {
- QCString name = pd->name();
- if (pd->getGroupDef())
- {
- name = pd->getGroupDef()->getOutputFileBase().copy();
- }
- addRefItem(pd->xrefListItems(),
- theTranslator->trPage(TRUE,TRUE),
- name,pd->title());
- }
-}
-
-//----------------------------------------------------------------------
-// Copy the documentation in entry `root' to member definition `md' and
-// set the function declaration of the member to `funcDecl'. If the boolean
-// over_load is set the standard overload text is added.
-
-static void addMemberDocs(Entry *root,
- MemberDef *md, const char *funcDecl,
- ArgumentList *al,
- bool over_load,
- NamespaceSDict *
- )
-{
- //printf("addMemberDocs: `%s'::`%s' `%s' funcDecl=`%s' memSpec=%d\n",
- // root->parent->name.data(),md->name().data(),md->argsString(),funcDecl,root->memSpec);
- QCString fDecl=funcDecl;
- // strip extern specifier
- fDecl.stripPrefix("extern ");
- md->setDefinition(fDecl);
- md->enableCallGraph(root->callGraph);
- ClassDef *cd=md->getClassDef();
- NamespaceDef *nd=md->getNamespaceDef();
- QCString fullName;
- if (cd)
- fullName = cd->name();
- else if (nd)
- fullName = nd->name();
-
- if (!fullName.isEmpty()) fullName+="::";
- fullName+=md->name();
- bool ambig;
- FileDef *rfd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig);
-
- // TODO determine scope based on root not md
- Definition *rscope = md->getOuterScope();
-
- if (al)
- {
- //printf("merging arguments (1) docs=%d\n",root->doc.isEmpty());
- mergeArguments(md->argumentList(),al,!root->doc.isEmpty());
- }
- else
- {
- if (
- matchArguments2( md->getOuterScope(), md->getFileDef(), md->argumentList(),
- rscope,rfd,root->argList,
- TRUE
- )
- )
- {
- //printf("merging arguments (2)\n");
- mergeArguments(md->argumentList(),root->argList,!root->doc.isEmpty());
- }
- }
- if (over_load) // the \overload keyword was used
- {
- QCString doc=getOverloadDocs();
- if (!root->doc.isEmpty())
- {
- doc+="<p>";
- doc+=root->doc;
- }
- md->setDocumentation(doc,root->docFile,root->docLine);
- md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
- md->setDocsForDefinition(!root->proto);
- }
- else
- {
- //printf("Adding docs md->docs=`%s' root->docs=`%s'!\n",
- // md->documentation().data(),root->doc.data());
- // documentation outside a compound overrides the documentation inside it
- if ( /* !md->isStatic() && !root->stat && do not replace doc of a static */
- (
- md->documentation().isEmpty() || /* no docs yet */
- (root->parent->name.isEmpty() && /* or overwrite prototype docs */
- !root->proto && md->isPrototype() /* with member definition docs */
- )
- ) && !root->doc.isEmpty()
- )
- {
- //printf("overwrite!\n");
- md->setDocumentation(root->doc,root->docFile,root->docLine);
- md->setDocsForDefinition(!root->proto);
- }
-
- //printf("Adding brief md->brief=`%s' root->brief=`%s'!\n",
- // md->briefDescription().data(),root->brief.data());
- // brief descriptions inside a compound override the documentation
- // outside it
- if ( /* !md->isStatic() && !root->stat && do not replace doc of static */
- (
- md->briefDescription().isEmpty() || /* no docs yet */
- !root->parent->name.isEmpty() /* member of a class */
- ) && !root->brief.isEmpty()
- )
- {
- //printf("overwrite!\n");
- md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- }
-
- if (
- (md->inbodyDocumentation().isEmpty() ||
- !root->parent->name.isEmpty()
- ) && !root->inbodyDocs.isEmpty()
- )
- {
- md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
- }
- }
-
- if (md->initializer().isEmpty() && !root->initializer.isEmpty())
- {
- md->setInitializer(root->initializer);
- md->setMaxInitLines(root->initLines);
- }
-
- if (rfd)
- {
-
- if ((md->getStartBodyLine()==-1 && root->bodyLine!=-1)
- // || (md->isVariable() && !root->explicitExternal)
- )
- {
- //printf("Setting new body segment [%d,%d]\n",root->bodyLine,root->endBodyLine);
- md->setBodySegment(root->bodyLine,root->endBodyLine);
- md->setBodyDef(rfd);
- }
-
- md->setRefItems(root->sli);
- }
-
- md->enableCallGraph(md->hasCallGraph() || root->callGraph);
-
- md->mergeMemberSpecifiers(root->memSpec);
- md->addSectionsToDefinition(root->anchors);
- addMemberToGroups(root,md);
- if (cd) cd->insertUsedFile(root->fileName);
- //printf("root->mGrpId=%d\n",root->mGrpId);
- if (root->mGrpId!=-1)
- {
- if (md->getMemberGroupId()!=-1)
- {
- if (md->getMemberGroupId()!=root->mGrpId)
- {
- warn(
- root->fileName,root->startLine,
- "Warning: member %s belongs to two different groups. The second "
- "one found here will be ignored.",
- md->name().data()
- );
- }
- }
- else // set group id
- {
- //printf("setMemberGroupId=%d md=%s\n",root->mGrpId,md->name().data());
- md->setMemberGroupId(root->mGrpId);
- }
- }
-}
-
-//----------------------------------------------------------------------
-// find a class definition given the scope name and (optionally) a
-// template list specifier
-
-static ClassDef *findClassDefinition(FileDef *fd,NamespaceDef *nd,
- const char *scopeName)
-{
- ClassDef *tcd = getResolvedClass(nd,fd,scopeName,0,0,TRUE);
- return tcd;
-}
-
-
-//----------------------------------------------------------------------
-// Adds the documentation contained in `root' to a global function
-// with name `name' and argument list `args' (for overloading) and
-// function declaration `decl' to the corresponding member definition.
-
-static bool findGlobalMember(Entry *root,
- const QCString &namespaceName,
- const char *name,
- const char *tempArg,
- const char *,
- const char *decl)
-{
- Debug::print(Debug::FindMembers,0,
- "2. findGlobalMember(namespace=%s,name=%s,tempArg=%s,decl=%s)\n",
- namespaceName.data(),name,tempArg,decl);
- QCString n=name;
- if (n.isEmpty()) return FALSE;
- if (n.find("::")!=-1) return FALSE; // skip undefined class members
- MemberName *mn=Doxygen::functionNameSDict[n+tempArg]; // look in function dictionary
- if (mn==0)
- {
- mn=Doxygen::functionNameSDict[n]; // try without template arguments
- }
- if (mn) // function name defined
- {
- Debug::print(Debug::FindMembers,0,"3. Found function scope\n");
- //int count=0;
- MemberNameIterator mni(*mn);
- MemberDef *md;
- bool found=FALSE;
- for (mni.toFirst();(md=mni.current()) && !found;++mni)
- {
- bool ambig;
- NamespaceDef *nd=md->getNamespaceDef();
-
- //printf("Namespace namespaceName=%s nd=%s\n",
- // namespaceName.data(),nd ? nd->name().data() : "<none>");
-
- FileDef *fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig);
- //printf("File %s\n",fd ? fd->name().data() : "<none>");
- NamespaceSDict *nl = fd ? fd->getUsedNamespaces() : 0;
- //SDict<Definition> *cl = fd ? fd->getUsedClasses() : 0;
- //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;
-
- if ((namespaceName.isEmpty() && nd==0) || // not in a namespace
- (nd && nd->name()==namespaceName) || // or in the same namespace
- viaUsingDirective // member in `using' namespace
- )
- {
- Debug::print(Debug::FindMembers,0,"4. Try to add member `%s' to scope `%s'\n",
- md->name().data(),namespaceName.data());
- QCString nsName = nd ? nd->name().data() : "";
-
- NamespaceDef *rnd = 0;
- if (!namespaceName.isEmpty()) rnd = Doxygen::namespaceSDict[namespaceName];
-
- bool matching=
- (md->argumentList()==0 && root->argList->count()==0) ||
- md->isVariable() || md->isTypedef() || /* in case of function pointers */
- matchArguments2(md->getOuterScope(),md->getFileDef(),md->argumentList(),
- rnd ? rnd : Doxygen::globalScope,fd,root->argList,
- FALSE);
-
- // for static members we also check if the comment block was found in
- // the same file. This is needed because static members with the same
- // name can be in different files. Thus it would be wrong to just
- // put the comment block at the first syntactically matching member.
- if (matching && md->isStatic() &&
- md->getDefFileName()!=root->fileName &&
- mn->count()>1)
- {
- matching = FALSE;
- }
-
- if (matching) // add docs to the member
- {
- Debug::print(Debug::FindMembers,0,"5. Match found\n");
- addMemberDocs(root,md,decl,root->argList,FALSE);
- found=TRUE;
- }
- }
- }
- if (!found && !root->relatesDup) // no match
- {
- QCString fullFuncDecl=decl;
- if (root->argList) fullFuncDecl+=argListToString(root->argList,TRUE);
- warn(root->fileName,root->startLine,
- "Warning: no matching file member found for \n%s",fullFuncDecl.data());
- if (mn->count()>0)
- {
- warn_cont("Possible candidates:\n");
- for (mni.toFirst();(md=mni.current());++mni)
- {
- warn_cont(" %s\n",md->declaration());
- }
- }
- }
- }
- else // got docs for an undefined member!
- {
- if (root->type!="friend class" &&
- root->type!="friend struct" &&
- root->type!="friend union")
- {
- warn(root->fileName,root->startLine,
- "Warning: documented function `%s' was not defined.",decl
- );
- }
- }
- return TRUE;
-}
-
-static QCString substituteTemplatesInString(
- const QList<ArgumentList> &srcTempArgLists,
- const QList<ArgumentList> &dstTempArgLists,
- const QCString &src
- )
-{
- QCString dst;
- QRegExp re(idMask);
- //printf("type=%s\n",sa->type.data());
-
- int i,p=0,l;
- while ((i=re.match(src,p,&l))!=-1) // for each word in srcType
- {
- bool found=FALSE;
- dst+=src.mid(p,i-p);
- QCString name=src.mid(i,l);
-
- QListIterator<ArgumentList> srclali(srcTempArgLists);
- QListIterator<ArgumentList> dstlali(dstTempArgLists);
- for (;srclali.current() && !found;++srclali,++dstlali)
- {
- ArgumentListIterator tsali(*srclali.current());
- ArgumentListIterator tdali(*dstlali.current());
- Argument *tsa =0,*tda=0;
-
- for (tsali.toFirst();(tsa=tsali.current()) && !found;++tsali)
- {
- tda = tdali.current();
- if (tda && name==tsa->name)
- {
- name=tda->name; // substitute
- found=TRUE;
- }
- if (tda) ++tdali;
- }
- }
- dst+=name;
- p=i+l;
- }
- dst+=src.right(src.length()-p);
- return dst;
-}
-
-static void substituteTemplatesInArgList(
- const QList<ArgumentList> &srcTempArgLists,
- const QList<ArgumentList> &dstTempArgLists,
- ArgumentList *src,
- ArgumentList *dst)
-{
- ArgumentListIterator sali(*src);
- Argument *sa=0;
- Argument *da=dst->first();
-
- for (sali.toFirst();(sa=sali.current());++sali) // for each member argument
- {
- QCString dstType = substituteTemplatesInString(
- srcTempArgLists,dstTempArgLists,sa->type);
- QCString dstArray = substituteTemplatesInString(
- srcTempArgLists,dstTempArgLists,sa->array);
- if (da==0)
- {
- da=new Argument(*sa);
- dst->append(da);
- da->type=dstType;
- da->array=dstArray;
- da=0;
- }
- else
- {
- da->type=dstType;
- da->type=dstArray;
- da=dst->next();
- }
- }
- dst->constSpecifier = src->constSpecifier;
- dst->volatileSpecifier = src->volatileSpecifier;
- dst->pureSpecifier = src->pureSpecifier;
- //printf("substituteTemplatesInArgList: replacing %s with %s\n",
- // argListToString(src).data(),argListToString(dst).data());
-}
-
-
-
-/*! This function tries to find a member (in a documented class/file/namespace)
- * that corresponds to the function/variable declaration given in \a funcDecl.
- *
- * The boolean \a overloaded is used to specify whether or not a standard
- * overload documentation line should be generated.
- *
- * The boolean \a isFunc is a hint that indicates that this is a function
- * instead of a variable or typedef.
- */
-static void findMember(Entry *root,
- QCString funcDecl,
- bool overloaded,
- bool isFunc
- )
-{
- Debug::print(Debug::FindMembers,0,
- "findMember(root=%p,funcDecl=`%s',related=`%s',overload=%d,"
- "isFunc=%d mGrpId=%d tArgList=%p (#=%d) "
- "memSpec=%d isObjC=%d\n",
- root,funcDecl.data(),root->relates.data(),overloaded,isFunc,root->mGrpId,
- root->tArgLists,root->tArgLists ? root->tArgLists->count() : 0,
- root->memSpec,root->objc
- );
-
- QCString scopeName;
- QCString className;
- QCString namespaceName;
- QCString funcType;
- QCString funcName;
- QCString funcArgs;
- QCString funcTempList;
- QCString exceptions;
- QCString funcSpec;
- bool isRelated=FALSE;
- bool isFriend=FALSE;
- bool done;
- do
- {
- done=TRUE;
- if (funcDecl.stripPrefix("friend ")) // treat friends as related members
- {
- isFriend=TRUE;
- done=FALSE;
- }
- if (funcDecl.stripPrefix("inline "))
- {
- root->memSpec|=Entry::Inline;
- done=FALSE;
- }
- if (funcDecl.stripPrefix("explicit "))
- {
- root->memSpec|=Entry::Explicit;
- done=FALSE;
- }
- if (funcDecl.stripPrefix("mutable "))
- {
- root->memSpec|=Entry::Mutable;
- done=FALSE;
- }
- if (funcDecl.stripPrefix("virtual "))
- {
- done=FALSE;
- }
- } while (!done);
-
- // delete any ; from the function declaration
- int sep;
- while ((sep=funcDecl.find(';'))!=-1)
- {
- funcDecl=(funcDecl.left(sep)+funcDecl.right(funcDecl.length()-sep-1)).stripWhiteSpace();
- }
-
- // make sure the first character is a space to simplify searching.
- if (!funcDecl.isEmpty() && funcDecl[0]!=' ') funcDecl.prepend(" ");
-
- // remove some superfluous spaces
- funcDecl= substitute(
- substitute(
- substitute(funcDecl,"~ ","~"),
- ":: ","::"
- ),
- " ::","::"
- ).stripWhiteSpace();
-
- //printf("funcDecl=`%s'\n",funcDecl.data());
- if (isFriend && funcDecl.left(6)=="class ")
- {
- //printf("friend class\n");
- funcDecl=funcDecl.right(funcDecl.length()-6);
- funcName = funcDecl.copy();
- }
- else if (isFriend && funcDecl.left(7)=="struct ")
- {
- funcDecl=funcDecl.right(funcDecl.length()-7);
- funcName = funcDecl.copy();
- }
- else
- {
- // extract information from the declarations
- parseFuncDecl(funcDecl,root->objc,scopeName,funcType,funcName,
- funcArgs,funcTempList,exceptions
- );
- }
- //printf("scopeName=`%s' funcType=`%s' funcName=`%s' funcArgs=`%s'\n",
- // scopeName.data(),funcType.data(),funcName.data(),funcArgs.data());
-
- // the class name can also be a namespace name, we decide this later.
- // if a related class name is specified and the class name could
- // not be derived from the function declaration, then use the
- // related field.
- //printf("scopeName=`%s' className=`%s' namespaceName=`%s'\n",
- // scopeName.data(),className.data(),namespaceName.data());
- if (!root->relates.isEmpty())
- { // related member, prefix user specified scope
- isRelated=TRUE;
- if (getClass(root->relates)==0 && !scopeName.isEmpty())
- scopeName= mergeScopes(scopeName,root->relates);
- else
- scopeName = root->relates.copy();
- }
-
- if (root->relates.isEmpty() && root->parent &&
- (root->parent->section&Entry::SCOPE_MASK) &&
- !root->parent->name.isEmpty()) // see if we can combine scopeName
- // with the scope in which it was found
- {
- QCString joinedName = root->parent->name+"::"+scopeName;
- if (!scopeName.isEmpty() &&
- (getClass(joinedName) || Doxygen::namespaceSDict[joinedName]))
- {
- scopeName = joinedName;
- }
- else
- {
- scopeName = mergeScopes(root->parent->name,scopeName);
- }
- }
- else // see if we can prefix a namespace or class that is used from the file
- {
- bool ambig;
- FileDef *fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig);
- if (fd)
- {
- NamespaceSDict *fnl = fd->getUsedNamespaces();
- if (fnl)
- {
- QCString joinedName;
- NamespaceDef *fnd;
- NamespaceSDict::Iterator nsdi(*fnl);
- for (nsdi.toFirst();(fnd=nsdi.current());++nsdi)
- {
- joinedName = fnd->name()+"::"+scopeName;
- if (Doxygen::namespaceSDict[joinedName])
- {
- scopeName=joinedName;
- break;
- }
- }
- }
- }
- }
- scopeName=stripTemplateSpecifiersFromScope(
- removeRedundantWhiteSpace(scopeName),FALSE,&funcSpec);
-
- // funcSpec contains the last template specifiers of the given scope.
- // If this method does not have any template arguments or they are
- // empty while funcSpec is not empty we assume this is a
- // specialization of a method. If not, we clear the funcSpec and treat
- // this as a normal method of a template class.
- if (!(root->tArgLists &&
- root->tArgLists->count()>0 &&
- root->tArgLists->first()->count()==0
- )
- )
- {
- funcSpec.resize(0);
- }
-
- // split scope into a namespace and a class part
- extractNamespaceName(scopeName,className,namespaceName,TRUE);
- //printf("scopeName=`%s' className=`%s' namespaceName=`%s'\n",
- // scopeName.data(),className.data(),namespaceName.data());
-
- namespaceName=removeAnonymousScopes(namespaceName);
- //printf("namespaceName=`%s' className=`%s'\n",namespaceName.data(),className.data());
- // merge class and namespace scopes again
- scopeName.resize(0);
- if (!namespaceName.isEmpty())
- {
- if (className.isEmpty())
- {
- scopeName=namespaceName;
- }
- else if (!getClass(className)) // class name only exists in a namespace
- {
- scopeName=namespaceName+"::"+className;
- }
- else
- {
- scopeName=className;
- }
- }
- else if (!className.isEmpty())
- {
- scopeName=className;
- }
- //printf("new scope=`%s'\n",scopeName.data());
-
- QCString tempScopeName=scopeName;
- ClassDef *cd=getClass(scopeName);
- if (cd)
- {
- if (root->tArgLists) root->tArgLists->first();
- if (funcSpec.isEmpty())
- {
- tempScopeName=cd->qualifiedNameWithTemplateParameters(root->tArgLists);
- }
- else
- {
- tempScopeName=scopeName+funcSpec;
- }
- }
- //printf("scopeName=%s cd=%p root->tArgLists=%p result=%s\n",
- // scopeName.data(),cd,root->tArgLists,tempScopeName.data());
-
- //printf("scopeName=`%s' className=`%s'\n",scopeName.data(),className.data());
- // rebuild the function declaration (needed to get the scope right).
- if (!scopeName.isEmpty() && !isRelated && !isFriend && !Config_getBool("HIDE_SCOPE_NAMES"))
- {
- if (!funcType.isEmpty())
- {
- if (isFunc) // a function -> we use argList for the arguments
- {
- funcDecl=funcType+" "+tempScopeName+"::"+funcName+funcTempList;
- }
- else
- {
- funcDecl=funcType+" "+tempScopeName+"::"+funcName+funcArgs;
- }
- }
- else
- {
- if (isFunc) // a function => we use argList for the arguments
- {
- funcDecl=tempScopeName+"::"+funcName+funcTempList;
- }
- else // variable => add `argument' list
- {
- funcDecl=tempScopeName+"::"+funcName+funcArgs;
- }
- }
- }
- else // build declaration without scope
- {
- if (!funcType.isEmpty()) // but with a type
- {
- if (isFunc) // function => omit argument list
- {
- funcDecl=funcType+" "+funcName+funcTempList;
- }
- else // variable => add `argument' list
- {
- funcDecl=funcType+" "+funcName+funcArgs;
- }
- }
- else // no type
- {
- if (isFunc)
- {
- funcDecl=funcName+funcTempList;
- }
- else
- {
- funcDecl=funcName+funcArgs;
- }
- }
- }
-
- if (funcType=="template class" && !funcTempList.isEmpty())
- return; // ignore explicit template instantiations
-
- Debug::print(Debug::FindMembers,0,
- "findMember() Parse results:\n"
- " namespaceName=`%s'\n"
- " className=`%s`\n"
- " funcType=`%s'\n"
- " funcSpec=`%s'\n"
- " funcName=`%s'\n"
- " funcArgs=`%s'\n"
- " funcTempList=`%s'\n"
- " funcDecl=`%s'\n"
- " related=`%s'\n"
- " exceptions=`%s'\n"
- " isRelated=%d\n"
- " isFriend=%d\n"
- " isFunc=%d\n\n",
- namespaceName.data(),className.data(),
- funcType.data(),funcSpec.data(),funcName.data(),funcArgs.data(),funcTempList.data(),
- funcDecl.data(),root->relates.data(),exceptions.data(),isRelated,isFriend,
- isFunc
- );
-
- MemberName *mn=0;
- if (!funcName.isEmpty()) // function name is valid
- {
- Debug::print(Debug::FindMembers,0,
- "1. funcName=`%s'\n",funcName.data());
- if (funcName.left(9)=="operator ") // strip class scope from cast operator
- {
- funcName = substitute(funcName,className+"::","");
- }
- if (!funcTempList.isEmpty()) // try with member specialization
- {
- mn=Doxygen::memberNameSDict[funcName+funcTempList];
- }
- if (mn==0) // try without specialization
- {
- mn=Doxygen::memberNameSDict[funcName];
- }
- if (!isRelated && mn) // function name already found
- {
- Debug::print(Debug::FindMembers,0,
- "2. member name exists (%d members with this name)\n",mn->count());
- if (!className.isEmpty()) // class name is valid
- {
- if (funcSpec.isEmpty()) // not a member specialization
- {
- int count=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",
- scopeName.data(),cd ? cd->name().data() : "<none>",
- md->argsString(),
- root->fileName.data());
- //printf("Member %s (member scopeName=%s) (this scopeName=%s) classTempList=%s\n",md->name().data(),cd->name().data(),scopeName.data(),classTempList.data());
- bool ambig;
- FileDef *fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig);
- NamespaceDef *nd=0;
- if (!namespaceName.isEmpty()) nd=getResolvedNamespace(namespaceName);
-
- ClassDef *tcd=findClassDefinition(fd,nd,scopeName);
- if (tcd==0 && stripAnonymousNamespaceScope(cd->name())==scopeName)
- {
- // don't be fooled by anonymous scopes
- tcd=cd;
- }
- //printf("Looking for %s inside nd=%s result=%p\n",
- // scopeName.data(),nd?nd->name().data():"<none>",tcd);
-
- if (cd && tcd==cd) // member's classes match
- {
- Debug::print(Debug::FindMembers,0,
- "4. class definition %s found\n",cd->name().data());
- //int ci;
- //ArgumentList *classTemplArgs = cd->templateArguments();
- //ArgumentList *funcTemplArgs = md->memberDefTemplateArguments();
- //if ((ci=cd->name().find("::"))!=-1) // nested class
- //{
- // ClassDef *parentClass = getClass(cd->name().left(ci));
- // if (parentClass)
- // classTemplArgs = parentClass->templateArguments();
- //}
- ////printf("cd->name=%s classTemplArgs=%s\n",cd->name().data(),
- //// argListToString(classTemplArgs).data());
-
-
- // get the template parameter lists found at the member declaration
- QList<ArgumentList> declTemplArgs;
- cd->getTemplateParameterLists(declTemplArgs);
- if (md->templateArguments())
- {
- declTemplArgs.append(md->templateArguments());
- }
-
- // get the template parameter lists found at the member definition
- QList<ArgumentList> *defTemplArgs = root->tArgLists;
- //printf("defTemplArgs=%p\n",defTemplArgs);
-
- // do we replace the decl argument lists with the def argument lists?
- bool substDone=FALSE;
- ArgumentList *argList=0;
-
- /* substitute the occurrences of class template names in the
- * argument list before matching
- */
- if (declTemplArgs.count()>0 && defTemplArgs &&
- declTemplArgs.count()==defTemplArgs->count() &&
- md->argumentList()
- )
- {
- /* 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.
- */
- argList = new ArgumentList;
- substituteTemplatesInArgList(declTemplArgs,*defTemplArgs,
- md->argumentList(),argList);
-
- substDone=TRUE;
- }
- else /* no template arguments, compare argument lists directly */
- {
- argList = md->argumentList();
- }
-
- Debug::print(Debug::FindMembers,0,
- "5. matching `%s'<=>`%s' className=%s namespaceName=%s\n",
- argListToString(argList,TRUE).data(),argListToString(root->argList,TRUE).data(),
- className.data(),namespaceName.data()
- );
-
- bool matching=
- md->isVariable() || md->isTypedef() || // needed for function pointers
- (md->argumentList()==0 && root->argList->count()==0) ||
- matchArguments2(
- md->getClassDef(),md->getFileDef(),argList,
- cd,fd,root->argList,
- TRUE);
-
- Debug::print(Debug::FindMembers,0,
- "6. match results of matchArguments2 = %d\n",matching);
-
- if (substDone) // found a new argument list
- {
- if (matching) // replace member's argument list
- {
- md->setDefinitionTemplateParameterLists(root->tArgLists);
- md->setArgumentList(argList);
- }
- else // no match -> delete argument list
- {
- delete argList;
- }
- }
- if (matching)
- {
- //printf("addMemberDocs root->inLine=%d md->isInline()=%d\n",
- // root->inLine,md->isInline());
- addMemberDocs(root,md,funcDecl,0,overloaded,0/* TODO */);
- count++;
- memFound=TRUE;
- }
- }
- }
- if (count==0 && root->parent && root->parent->section==Entry::OBJCIMPL_SEC)
- {
- goto localObjCMethod;
- }
- if (count==0 && !(isFriend && funcType=="class"))
- {
- int candidates=0;
- if (mn->count()>0)
- {
- //printf("Assume template class\n");
- for (mni.toFirst();(md=mni.current());++mni)
- {
- ClassDef *cd=md->getClassDef();
- //printf("cd->name()==%s className=%s\n",cd->name().data(),className.data());
- if (cd!=0 && rightScopeMatch(cd->name(),className))
- {
- if (root->tArgLists && md->templateArguments() &&
- root->tArgLists->getLast()->count()<=md->templateArguments()->count())
- { // assume we have found a template specialization
- // for which there is only a definition, no declaration in
- // the class. TODO: we should actually check whether
- // the arguments match!
- addMethodToClass(root,cd,md->name(),/*cd->name(),*/isFriend);
- return;
- }
- candidates++;
- }
- }
- }
-
- warn(root->fileName,root->startLine,
- "Warning: no matching class member found for"
- );
-
- if (root->tArgLists)
- {
- QListIterator<ArgumentList> alli(*root->tArgLists);
- ArgumentList *al;
- for (;(al=alli.current());++alli)
- {
- warn_cont(" template %s\n",tempArgListToString(al).data());
- }
- }
- QCString fullFuncDecl=funcDecl.copy();
- if (isFunc) fullFuncDecl+=argListToString(root->argList,TRUE);
-
- warn_cont(" %s\n",fullFuncDecl.data());
-
- if (candidates>0)
- {
- warn_cont("Possible candidates:\n");
- for (mni.toFirst();(md=mni.current());++mni)
- {
- ClassDef *cd=md->getClassDef();
- if (cd!=0 && rightScopeMatch(cd->name(),className))
- {
- if (md->templateArguments())
- {
- warn_cont(" template %s\n",tempArgListToString(md->templateArguments()).data());
- }
- warn_cont(" ");
- if (md->typeString())
- {
- warn_cont("%s ",md->typeString());
- }
- QCString qScope = cd->qualifiedNameWithTemplateParameters();
- if (!qScope.isEmpty()) warn_cont("%s::%s",qScope.data(),md->name().data());
- if (md->argsString()) warn_cont("%s",md->argsString());
- warn_cont("\n");
- }
- }
- }
- }
- }
- else if (cd) // member specialization
- {
- MemberDef::MemberType mtype=MemberDef::Function;
- ArgumentList *tArgList = new ArgumentList;
- // getTemplateArgumentsFromName(cd->name()+"::"+funcName,root->tArgLists);
- MemberDef *md=new MemberDef(
- root->fileName,root->startLine,
- funcType,funcName,funcArgs,exceptions,
- root->protection,root->virt,root->stat,FALSE,
- mtype,tArgList,root->argList);
- //printf("new specialized member %s args=`%s'\n",md->name().data(),funcArgs.data());
- md->setTagInfo(root->tagInfo);
- md->setMemberClass(cd);
- md->setTemplateSpecialization(TRUE);
- md->setDefinition(funcDecl);
- md->enableCallGraph(root->callGraph);
- md->setDocumentation(root->doc,root->docFile,root->docLine);
- md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
- md->setDocsForDefinition(!root->proto);
- md->setPrototype(root->proto);
- md->addSectionsToDefinition(root->anchors);
- md->setBodySegment(root->bodyLine,root->endBodyLine);
- bool ambig;
- FileDef *fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig);
- md->setBodyDef(fd);
- md->setMemberSpecifiers(root->memSpec);
- md->setMemberGroupId(root->mGrpId);
- mn->append(md);
- cd->insertMember(md);
- md->setRefItems(root->sli);
- }
- else
- {
- //printf("*** Specialized member %s of unknown scope %s%s found!\n",
- // scopeName.data(),funcName.data(),funcArgs.data());
- }
- }
- 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 compatable. 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)
- {
- ClassDef *cd=md->getClassDef();
- if (className!=cd->name()) unique=FALSE;
- }
- if (unique)
- {
- MemberDef::MemberType mtype;
- if (root->mtype==Signal) mtype=MemberDef::Signal;
- else if (root->mtype==Slot) mtype=MemberDef::Slot;
- else if (root->mtype==DCOP) mtype=MemberDef::DCOP;
- else mtype=MemberDef::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=new MemberDef(
- root->fileName,root->startLine,
- funcType,funcName,funcArgs,exceptions,
- root->protection,root->virt,root->stat,TRUE,
- mtype,tArgList,root->argList);
- md->setTagInfo(root->tagInfo);
- md->setMemberClass(cd);
- md->setDefinition(funcDecl);
- md->enableCallGraph(root->callGraph);
- QCString doc=getOverloadDocs();
- doc+="<p>";
- doc+=root->doc;
- md->setDocumentation(doc,root->docFile,root->docLine);
- md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
- md->setDocsForDefinition(!root->proto);
- md->setPrototype(root->proto);
- md->addSectionsToDefinition(root->anchors);
- md->setBodySegment(root->bodyLine,root->endBodyLine);
- bool ambig;
- FileDef *fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig);
- md->setBodyDef(fd);
- md->setMemberSpecifiers(root->memSpec);
- md->setMemberGroupId(root->mGrpId);
- mn->append(md);
- cd->insertMember(md);
- cd->insertUsedFile(root->fileName);
- md->setRefItems(root->sli);
- }
- }
- else // unrelated function with the same name as a member
- {
- if (!findGlobalMember(root,namespaceName,funcName,funcTempList,funcArgs,funcDecl))
- {
- QCString fullFuncDecl=funcDecl.copy();
- if (isFunc) fullFuncDecl+=argListToString(root->argList,TRUE);
- warn(root->fileName,root->startLine,
- "Warning: Cannot determine class for function\n%s",
- fullFuncDecl.data()
- );
- }
- }
- }
- else if (isRelated && !root->relates.isEmpty())
- {
- Debug::print(Debug::FindMembers,0,"2. related function\n"
- " scopeName=%s className=%s\n",scopeName.data(),className.data());
- if (className.isEmpty()) className=root->relates.copy();
- ClassDef *cd;
- //printf("scopeName=`%s' className=`%s'\n",scopeName.data(),className.data());
- if ((cd=getClass(scopeName)))
- {
- bool newMember=TRUE; // assume we have a new member
- bool newMemberName=FALSE;
- bool isDefine=FALSE;
- {
- MemberName *mn = Doxygen::functionNameSDict[funcName];
- if (mn)
- {
- MemberDef *md = mn->first();
- while (md && !isDefine)
- {
- isDefine = isDefine || md->isDefine();
- md = mn->next();
- }
- }
- }
-
- bool ambig;
- FileDef *fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig);
-
- if ((mn=Doxygen::memberNameSDict[funcName])==0)
- {
- mn=new MemberName(funcName);
- newMemberName=TRUE; // we create a new member name
- }
- else
- {
- MemberDef *rmd=mn->first();
- while (rmd && newMember) // see if we got another member with matching arguments
- {
-
- newMember=newMember &&
- !matchArguments2(rmd->getOuterScope(),rmd->getFileDef(),rmd->argumentList(),
- cd,fd,root->argList,
- TRUE);
- if (newMember) rmd=mn->next();
- }
- if (!newMember && rmd) // 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);
- }
- }
-
- if (newMember) // need to create a new member
- {
- MemberDef::MemberType mtype;
- if (isDefine)
- mtype=MemberDef::Define;
- else if (root->mtype==Signal)
- mtype=MemberDef::Signal;
- else if (root->mtype==Slot)
- mtype=MemberDef::Slot;
- else if (root->mtype==DCOP)
- mtype=MemberDef::DCOP;
- else
- mtype=MemberDef::Function;
-
- //printf("New related name `%s' `%d'\n",funcName.data(),
- // root->argList ? (int)root->argList->count() : -1);
-
- // new related (member) function
- ArgumentList *tArgList =
- getTemplateArgumentsFromName(scopeName+"::"+funcName,root->tArgLists);
- MemberDef *md=new MemberDef(
- root->fileName,root->startLine,
- funcType,funcName,funcArgs,exceptions,
- root->protection,root->virt,root->stat,TRUE,
- mtype,tArgList,funcArgs.isEmpty() ? 0 : root->argList);
- md->setTagInfo(root->tagInfo);
- //printf("Related member name=`%s' decl=`%s' bodyLine=`%d'\n",
- // funcName.data(),funcDecl.data(),root->bodyLine);
-
- // try to find the matching line number of the body from the
- // global function list
- bool found=FALSE;
- if (root->bodyLine==-1)
- {
- MemberName *rmn=Doxygen::functionNameSDict[funcName];
- if (rmn)
- {
- MemberDef *rmd=rmn->first();
- while (rmd && !found) // see if we got another member with matching arguments
- {
- // check for matching argument lists
- if (
- matchArguments2(rmd->getOuterScope(),rmd->getFileDef(),rmd->argumentList(),
- cd,fd,root->argList,
- TRUE)
- )
- {
- found=TRUE;
- }
- if (!found) rmd=rmn->next();
- }
- if (rmd) // member found -> copy line number info
- {
- md->setBodySegment(rmd->getStartBodyLine(),rmd->getEndBodyLine());
- md->setBodyDef(rmd->getBodyDef());
- //md->setBodyMember(rmd);
- }
- }
- }
- if (!found) // line number could not be found or is available in this
- // entry
- {
- md->setBodySegment(root->bodyLine,root->endBodyLine);
- md->setBodyDef(fd);
- }
-
- //if (root->mGrpId!=-1)
- //{
- // md->setMemberGroup(memberGroupDict[root->mGrpId]);
- //}
- md->setMemberClass(cd);
- md->setMemberSpecifiers(root->memSpec);
- md->setDefinition(funcDecl);
- md->enableCallGraph(root->callGraph);
- md->setDocumentation(root->doc,root->docFile,root->docLine);
- md->setInbodyDocumentation(root->inbodyDocs,root->inbodyFile,root->inbodyLine);
- md->setDocsForDefinition(!root->proto);
- md->setPrototype(root->proto);
- md->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- md->addSectionsToDefinition(root->anchors);
- md->setMemberGroupId(root->mGrpId);
- //md->setMemberDefTemplateArguments(root->mtArgList);
- mn->append(md);
- cd->insertMember(md);
- cd->insertUsedFile(root->fileName);
- md->setRefItems(root->sli);
- if (root->relatesDup) md->setRelatedAlso(cd);
- addMemberToGroups(root,md);
- //printf("Adding member=%s\n",md->name().data());
- if (newMemberName)
- {
- //Doxygen::memberNameList.append(mn);
- //Doxygen::memberNameDict.insert(funcName,mn);
- Doxygen::memberNameSDict.append(funcName,mn);
- }
- }
- if (root->relatesDup)
- {
- if (!findGlobalMember(root,namespaceName,funcName,funcTempList,funcArgs,funcDecl))
- {
- QCString fullFuncDecl=funcDecl.copy();
- if (isFunc) fullFuncDecl+=argListToString(root->argList,TRUE);
- warn(root->fileName,root->startLine,
- "Warning: Cannot determine file/namespace for relatedalso function\n%s",
- fullFuncDecl.data()
- );
- }
- }
- }
- else
- {
- warn_undoc(root->fileName,root->startLine,
- "Warning: class `%s' for related function `%s' is not "
- "documented.",
- className.data(),funcName.data()
- );
- }
- }
- 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)))
- {
- bool ambig;
- //printf("Local objective C method `%s' of class `%s' found\n",root->name.data(),cd->name().data());
- MemberDef *md=new MemberDef(
- root->fileName,root->startLine,
- funcType,funcName,funcArgs,exceptions,
- root->protection,root->virt,root->stat,FALSE,
- MemberDef::Function,0,root->argList);
- md->setTagInfo(root->tagInfo);
- md->makeImplementationDetail();
- md->setMemberClass(cd);
- md->setDefinition(funcDecl);
- md->enableCallGraph(root->callGraph);
- 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);
- md->addSectionsToDefinition(root->anchors);
- md->setBodySegment(root->bodyLine,root->endBodyLine);
- FileDef *fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig);
- md->setBodyDef(fd);
- md->setMemberSpecifiers(root->memSpec);
- md->setMemberGroupId(root->mGrpId);
- cd->insertMember(md);
- cd->insertUsedFile(root->fileName);
- md->setRefItems(root->sli);
- if ((mn=Doxygen::memberNameSDict[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
- }
- }
- else // unrelated not overloaded member found
- {
- bool globMem = findGlobalMember(root,namespaceName,funcName,funcTempList,funcArgs,funcDecl);
- if (className.isEmpty() && !globMem)
- {
- warn(root->fileName,root->startLine,
- "Warning: class for member `%s' cannot "
- "be found.", funcName.data()
- );
- }
- else if (!className.isEmpty() && !globMem)
- {
- warn(root->fileName,root->startLine,
- "Warning: member `%s' of class `%s' cannot be found",
- funcName.data(),className.data());
- }
- }
- }
- else
- {
- // this should not be called
- warn(root->fileName,root->startLine,
- "Warning: member with no name found.");
- }
- return;
-}
-
-//----------------------------------------------------------------------
-// find the members corresponding to the different documentation blocks
-// that are extracted from the sources.
-
-static void findMemberDocumentation(Entry *root)
-{
- int i=-1,l;
- Debug::print(Debug::FindMembers,0,
- "findMemberDocumentation(): root->type=`%s' root->inside=`%s' root->name=`%s' root->args=`%s' section=%x root->memSpec=%d root->mGrpId=%d\n",
- root->type.data(),root->inside.data(),root->name.data(),root->args.data(),root->section,root->memSpec,root->mGrpId
- );
- bool isFunc=TRUE;
-
- if (root->relatesDup && !root->relates.isEmpty())
- {
- QCString tmp = root->relates;
- root->relates.resize(0);
- findMemberDocumentation(root);
- root->relates = tmp;
- }
-
- if ( // detect func variable/typedef to func ptr
- (i=findFunctionPtr(root->type,&l))!=-1
- )
- {
- //printf("Fixing function pointer!\n");
- // fix type and argument
- root->args.prepend(root->type.right(root->type.length()-i-l));
- root->type=root->type.left(i+l);
- //printf("Results type=%s,name=%s,args=%s\n",root->type.data(),root->name.data(),root->args.data());
- isFunc=FALSE;
- }
- else if ((root->type.left(8)=="typedef " && root->args.find('(')!=-1))
- // detect function types marked as functions
- {
- isFunc=FALSE;
- }
-
- //printf("Member %s isFunc=%d\n",root->name.data(),isFunc);
- if (root->section==Entry::MEMBERDOC_SEC)
- {
- //printf("Documentation for inline member `%s' found args=`%s'\n",
- // root->name.data(),root->args.data());
- //if (root->relates.length()) printf(" Relates %s\n",root->relates.data());
- if (root->type.isEmpty())
- {
- findMember(root,root->name+root->args+root->exception,FALSE,isFunc);
- }
- else
- {
- findMember(root,root->type+" "+root->name+root->args+root->exception,FALSE,isFunc);
- }
- }
- else if (root->section==Entry::OVERLOADDOC_SEC)
- {
- //printf("Overloaded member %s found\n",root->name.data());
- findMember(root,root->name,TRUE,isFunc);
- }
- else if
- ((root->section==Entry::FUNCTION_SEC // function
- ||
- (root->section==Entry::VARIABLE_SEC && // variable
- !root->type.isEmpty() && // with a type
- compoundKeywordDict.find(root->type)==0 // that is not a keyword
- // (to skip forward declaration of class etc.)
- )
- )
- )
- {
- //printf("Documentation for member `%s' found args=`%s' excp=`%s'\n",
- // root->name.data(),root->args.data(),root->exception.data());
- //if (root->relates.length()) printf(" Relates %s\n",root->relates.data());
- //printf("Inside=%s\n Relates=%s\n",root->inside.data(),root->relates.data());
- if (root->type=="friend class" || root->type=="friend struct" ||
- root->type=="friend union")
- {
- findMember(root,
- root->type+" "+
- root->name,
- FALSE,FALSE);
-
- }
- else if (!root->type.isEmpty())
- {
- findMember(root,
- root->type+" "+
- root->inside+
- root->name+
- root->args+
- root->exception,
- FALSE,isFunc);
- }
- else
- {
- findMember(root,
- root->inside+
- root->name+
- root->args+
- root->exception,
- FALSE,isFunc);
- }
- }
- else if (root->section==Entry::DEFINE_SEC && !root->relates.isEmpty())
- {
- findMember(root,root->name+root->args,FALSE,!root->args.isEmpty());
- }
- else if (root->section==Entry::VARIABLEDOC_SEC)
- {
- //printf("Documentation for variable %s found\n",root->name.data());
- //if (!root->relates.isEmpty()) printf(" Relates %s\n",root->relates.data());
- findMember(root,root->name,FALSE,FALSE);
- }
- else
- {
- // skip section
- //printf("skip section\n");
- }
- EntryListIterator eli(*root->sublist);
- Entry *e;
- for (;(e=eli.current());++eli)
- {
- if (e->section!=Entry::ENUM_SEC) findMemberDocumentation(e);
- }
-}
-
-//----------------------------------------------------------------------
-
-static void findObjCMethodDefinitions(Entry *root)
-{
- EntryListIterator eli(*root->sublist);
- Entry *objCImpl;
- for (;(objCImpl=eli.current());++eli)
- {
- if (objCImpl->section==Entry::OBJCIMPL_SEC)
- {
- //printf("Found ObjC class implementation %s\n",objCImpl->name.data());
- EntryListIterator seli(*objCImpl->sublist);
- Entry *objCMethod;
- for (;(objCMethod=seli.current());++seli)
- {
- if (objCMethod->section==Entry::FUNCTION_SEC)
- {
- //Printf(" Found ObjC method definition %s\n",objCMethod->name.data());
- findMember(objCMethod, objCMethod->type+" "+objCImpl->name+"::"+objCMethod->name+" "+objCMethod->args, FALSE,TRUE);
- objCMethod->section=Entry::EMPTY_SEC;
- }
- }
- }
- }
-}
-
-//----------------------------------------------------------------------
-// find and add the enumeration to their classes, namespaces or files
-
-static void findEnums(Entry *root)
-{
- if (root->section==Entry::ENUM_SEC)
- // non anonymous enumeration
- {
- MemberDef *md=0;
- ClassDef *cd=0;
- FileDef *fd=0;
- NamespaceDef *nd=0;
- MemberNameSDict *mnsd=0;
- bool isGlobal;
- bool isRelated=FALSE;
- //printf("Found enum with name `%s' relates=%s\n",root->name.data(),root->relates.data());
- int i;
-
- QCString name;
- QCString scope;
-
- if ((i=root->name.findRev("::"))!=-1) // scope is specified
- {
- 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);
- }
- else // no scope, check the scope in which the docs where found
- {
- if (( root->parent->section & Entry::SCOPE_MASK )
- && !root->parent->name.isEmpty()
- ) // found enum docs inside a compound
- {
- scope=root->parent->name;
- if ((cd=getClass(scope))==0) nd=getResolvedNamespace(scope);
- }
- name=root->name.copy();
- }
-
- if (!root->relates.isEmpty())
- { // related member, prefix user specified scope
- isRelated=TRUE;
- if (getClass(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 && !name.isEmpty()) // found a enum inside a compound
- {
- //printf("Enum `%s'::`%s'\n",cd->name(),name.data());
- fd=0;
- mnsd=&Doxygen::memberNameSDict;
- isGlobal=FALSE;
- }
- else if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@') // found enum inside namespace
- {
- mnsd=&Doxygen::functionNameSDict;
- isGlobal=TRUE;
- }
- else // found a global enum
- {
- bool ambig;
- fd=findFileDef(Doxygen::inputNameDict,root->fileName,ambig);
- mnsd=&Doxygen::functionNameSDict;
- isGlobal=TRUE;
- }
-
- if (!name.isEmpty())
- {
- // new enum type
- md = new MemberDef(
- root->fileName,root->startLine,
- 0,name,0,0,
- root->protection,Normal,FALSE,isRelated,MemberDef::Enumeration,
- 0,0);
- md->setTagInfo(root->tagInfo);
- if (!isGlobal) md->setMemberClass(cd); else md->setFileDef(fd);
- md->setBodySegment(root->bodyLine,root->endBodyLine);
- bool ambig;
- md->setBodyDef(findFileDef(Doxygen::inputNameDict,root->fileName,ambig));
- //printf("Enum %s definition at line %d of %s: protection=%d\n",
- // root->name.data(),root->bodyLine,root->fileName.data(),root->protection);
- md->addSectionsToDefinition(root->anchors);
- md->setMemberGroupId(root->mGrpId);
- md->enableCallGraph(root->callGraph);
- md->setRefItems(root->sli);
- //printf("found enum %s nd=%p\n",name.data(),nd);
- bool defSet=FALSE;
- if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@')
- {
- if (isRelated || Config_getBool("HIDE_SCOPE_NAMES"))
- {
- md->setDefinition(name);
- }
- else
- {
- md->setDefinition(nd->name()+"::"+name);
- }
- //printf("definition=%s\n",md->definition());
- defSet=TRUE;
- nd->insertMember(md);
- md->setNamespace(nd);
- }
-
- // even if we have already added the enum to a namespace, we still
- // also want to add it to other appropriate places such as file
- // or class.
- if (isGlobal)
- {
- if (!defSet) md->setDefinition(name);
- if (fd==0 && root->parent)
- {
- bool ambig;
- QCString filePathName = root->parent->fileName;
- fd=findFileDef(Doxygen::inputNameDict,filePathName,ambig);
- }
- if (fd)
- {
- fd->insertMember(md);
- md->setFileDef(fd);
- }
- }
- else if (cd)
- {
- if (isRelated || Config_getBool("HIDE_SCOPE_NAMES"))
- {
- md->setDefinition(name);
- }
- else
- {
- md->setDefinition(cd->name()+"::"+name);
- }
- cd->insertMember(md);
- cd->insertUsedFile(root->fileName);
- }
- 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);
-
- //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);
-
- EntryListIterator eli(*root->sublist);
- Entry *e;
- for (;(e=eli.current());++eli)
- {
- //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]))
- // get list of members with the same name as the field
- {
- MemberNameIterator fmni(*fmn);
- MemberDef *fmd;
- for (fmni.toFirst(); (fmd=fmni.current()) ; ++fmni)
- {
- if (fmd->isEnumValue())
- {
- //printf("found enum value with same name\n");
- if (nd && !nd->name().isEmpty() && nd->name().at(0)!='@')
- {
- NamespaceDef *fnd=fmd->getNamespaceDef();
- if (fnd==nd) // enum value is inside a namespace
- {
- md->insertEnumField(fmd);
- fmd->setEnumScope(md);
- }
- }
- else if (isGlobal)
- {
- FileDef *ffd=fmd->getFileDef();
- if (ffd==fd) // enum value has file scope
- {
- md->insertEnumField(fmd);
- fmd->setEnumScope(md);
- }
- }
- else if (isRelated && cd) // reparent enum value to
- // match the enum's scope
- {
- md->insertEnumField(fmd); // add field def to list
- fmd->setEnumScope(md); // cross ref with enum name
- fmd->setEnumClassScope(cd); // cross ref with enum name
- fmd->setOuterScope(cd);
- fmd->makeRelated();
- cd->insertMember(fmd);
- }
- else
- {
- ClassDef *fcd=fmd->getClassDef();
- if (fcd==cd) // enum value is inside a class
- {
- //printf("Inserting enum field %s in enum scope %s\n",
- // fmd->name().data(),md->name().data());
- md->insertEnumField(fmd); // add field def to list
- fmd->setEnumScope(md); // cross ref with enum name
- }
- }
- }
- }
- }
- }
- }
- }
- else
- {
- EntryListIterator eli(*root->sublist);
- Entry *e;
- for (;(e=eli.current());++eli)
- {
- findEnums(e);
- }
- }
-}
-
-//----------------------------------------------------------------------
-// find the documentation blocks for the enumerations
-
-static void findEnumDocumentation(Entry *root)
-{
- if (root->section==Entry::ENUMDOC_SEC
- && !root->name.isEmpty()
- && root->name[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;
- if ((i=root->name.findRev("::"))!=-1) // scope is specified as part of the name
- {
- name=root->name.right(root->name.length()-i-2); // extract name
- scope=root->name.left(i); // extract scope
- //printf("Scope=`%s' Name=`%s'\n",scope.data(),name.data());
- }
- else // just the name
- {
- name=root->name;
- }
- if (( root->parent->section & Entry::SCOPE_MASK )
- && !root->parent->name.isEmpty()
- ) // found enum docs inside a compound
- {
- if (!scope.isEmpty()) scope.prepend("::");
- scope.prepend(root->parent->name);
- }
- ClassDef *cd=getClass(scope);
-
- if (!name.isEmpty())
- {
- bool found=FALSE;
- if (cd)
- {
- //printf("Enum: scope=`%s' name=`%s'\n",cd->name(),name.data());
- QCString className=cd->name().copy();
- MemberName *mn=Doxygen::memberNameSDict[name];
- if (mn)
- {
- MemberNameIterator mni(*mn);
- MemberDef *md;
- for (mni.toFirst();(md=mni.current()) && !found;++mni)
- {
- ClassDef *cd=md->getClassDef();
- if (cd && cd->name()==className)
- {
- // documentation outside a compound overrides the documentation inside it
- if (!md->documentation() || root->parent->name.isEmpty())
- {
- md->setDocumentation(root->doc,root->docFile,root->docLine);
- md->setDocsForDefinition(!root->proto);
- }
-
- // brief descriptions inside a compound override the documentation
- // outside it
- if (!md->briefDescription() || !root->parent->name.isEmpty())
- {
- 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);
-
- GroupDef *gd=md->getGroupDef();
- if (gd==0 &&root->groups->first()!=0) // member not grouped but out-of-line documentation is
- {
- addMemberToGroups(root,md);
- }
-
- found=TRUE;
- }
- }
- }
- 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);
- MemberDef *md;
- MemberName *mn=Doxygen::functionNameSDict[name];
- if (mn && (md=mn->getFirst()))
- {
- 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);
-
- GroupDef *gd=md->getGroupDef();
- if (gd==0 &&root->groups->first()!=0) // member not grouped but out-of-line documentation is
- {
- addMemberToGroups(root,md);
- }
-
- found=TRUE;
- }
- }
- if (!found)
- {
- warn(root->fileName,root->startLine,
- "Warning: Documentation for undefined enum `%s' found.",
- name.data()
- );
- }
- }
- }
- EntryListIterator eli(*root->sublist);
- Entry *e;
- for (;(e=eli.current());++eli)
- {
- findEnumDocumentation(e);
- }
-}
-
-// seach for each enum (member or function) in mnl if it has documented
-// enum values.
-static void findDEV(const MemberNameSDict &mnsd)
-{
- MemberName *mn;
- MemberNameSDict::Iterator mnli(mnsd);
- // for each member name
- for (mnli.toFirst();(mn=mnli.current());++mnli)
- {
- MemberDef *md;
- MemberNameIterator mni(*mn);
- // for each member definition
- for (mni.toFirst();(md=mni.current());++mni)
- {
- if (md->isEnumerate()) // member is an enum
- {
- MemberList *fmdl = md->enumFieldList();
- int documentedEnumValues=0;
- if (fmdl) // enum has values
- {
- MemberListIterator fmni(*fmdl);
- MemberDef *fmd;
- // for each enum value
- for (fmni.toFirst();(fmd=fmni.current());++fmni)
- {
- if (fmd->isLinkableInProject()) documentedEnumValues++;
- }
- }
- // at least one enum value is documented
- if (documentedEnumValues>0) md->setDocumentedEnumValues(TRUE);
- }
- }
- }
-}
-
-// seach for each enum (member or function) if it has documented enum
-// values.
-static void findDocumentedEnumValues()
-{
- findDEV(Doxygen::memberNameSDict);
- findDEV(Doxygen::functionNameSDict);
-}
-
-
-//----------------------------------------------------------------------
-// computes the relation between all members. For each member `m'
-// the members that override the implementation of `m' are searched and
-// the member that `m' overrides is searched.
-
-static void computeMemberRelations()
-{
- MemberNameSDict::Iterator mnli(Doxygen::memberNameSDict);
- MemberName *mn;
- for ( ; (mn=mnli.current()) ; ++mnli ) // for each member name
- {
- MemberNameIterator mdi(*mn);
- MemberDef *md;
- for ( ; (md=mdi.current()) ; ++mdi ) // for each member with a specific arg list
- {
- MemberNameIterator bmdi(*mn);
- MemberDef *bmd;
- for ( ; (bmd=bmdi.current()) ; ++bmdi ) // for each other member with that signature
- {
- ClassDef *bmcd = bmd->getClassDef();
- ClassDef *mcd = md->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 && mcd->isBaseClass(bmcd,TRUE))
- {
- //printf(" Base argList=`%s'\n Super argList=`%s'\n",
- // argListToString(bmd->argumentList()).data(),
- // argListToString(md->argumentList()).data()
- // );
- if (
- matchArguments2(bmd->getOuterScope(),bmd->getFileDef(),bmd->argumentList(),
- md->getOuterScope(), md->getFileDef(), md->argumentList(),
- TRUE
- )
- )
- {
- //printf(" match found!\n");
- if (mcd && bmcd &&
- mcd->isLinkable() && bmcd->isLinkable()
- )
- {
- 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 reimplements member %s\n",mcd->name().data(),bmcd->name().data());
- //md->setImplements(bmd);
- //printf("%s: add reimplementedBy member %s\n",bmcd->name().data(),mcd->name().data());
- bmd->insertReimplementedBy(md);
- }
- }
- }
- }
- }
- }
-}
-
-
-//----------------------------------------------------------------------------
-//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)
- {
- // that is a template
- QDict<ClassDef> *templInstances = cd->getTemplateInstances();
- if (templInstances)
- {
- QDictIterator<ClassDef> qdi(*templInstances);
- ClassDef *tcd=0;
- // for each instance of the template
- for (qdi.toFirst();(tcd=qdi.current());++qdi)
- {
- tcd->addMembersToTemplateInstance(cd,qdi.currentKey());
- }
- }
- }
-}
-
-//----------------------------------------------------------------------------
-
-// builds the list of all members for each class
-
-static void buildCompleteMemberLists()
-{
- ClassDef *cd;
- // merge members of categories into the class they extend
- ClassSDict::Iterator cli(Doxygen::classSDict);
- for (cli.toFirst();(cd=cli.current());++cli)
- {
- 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);
- if (baseClass)
- {
- //printf("*** merging members of category %s into %s\n",
- // cd->name().data(),baseClass->name().data());
- baseClass->mergeCategory(cd);
- }
- }
- }
- // merge the member list of base classes into the inherited classes.
- for (cli.toFirst();(cd=cli.current());++cli)
- {
- if (// !cd->isReference() && // not an external class
- cd->subClasses()->count()==0 && // is a root of the hierarchy
- cd->baseClasses()->count()>0) // and has at least one base class
- {
- //printf("*** merging members for %s\n",cd->name().data());
- cd->mergeMembers();
- }
- }
- // now sort the member list of all classes.
- for (cli.toFirst();(cd=cli.current());++cli)
- {
- cd->memberNameInfoSDict()->sort();
- }
-}
-
-//----------------------------------------------------------------------------
-
-static void generateFileSources()
-{
- if (documentedHtmlFiles==0) return;
-
- if (Doxygen::inputNameList.count()>0)
- {
- FileNameListIterator fnli(Doxygen::inputNameList);
- FileName *fn;
- for (;(fn=fnli.current());++fnli)
- {
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
- {
- if (fd->generateSourceFile())
- {
- msg("Generating code for file %s...\n",fd->docName().data());
- fd->writeSource(*outputList);
- }
- else if (!fd->isReference() &&
- (Doxygen::parseSourcesNeeded || Config_getBool("CALL_GRAPH")))
- {
- msg("Parsing code for file %s...\n",fd->docName().data());
- fd->parseSource();
- }
- }
- }
- }
-}
-
-//----------------------------------------------------------------------------
-
-static void generateFileDocs()
-{
- if (documentedHtmlFiles==0) return;
-
- if (Doxygen::inputNameList.count()>0)
- {
- 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)
- {
- bool doc = fd->isLinkableInProject();
- if (doc)
- {
- msg("Generating docs for file %s...\n",fd->docName().data());
- fd->writeDocumentation(*outputList);
- }
- }
- }
- }
-}
-
-//----------------------------------------------------------------------------
-
-static void addSourceReferences()
-{
- // add source references for class definitions
- ClassSDict::Iterator cli(Doxygen::classSDict);
- ClassDef *cd=0;
- for (cli.toFirst();(cd=cli.current());++cli)
- {
- FileDef *fd=cd->getBodyDef();
- if (fd && cd->isLinkableInProject() && cd->getStartBodyLine()!=-1)
- {
- fd->addSourceRef(cd->getStartBodyLine(),cd,0);
- }
- }
- // add source references for namespace definitions
- NamespaceSDict::Iterator nli(Doxygen::namespaceSDict);
- NamespaceDef *nd=0;
- for (nli.toFirst();(nd=nli.current());++nli)
- {
- FileDef *fd=nd->getBodyDef();
- if (fd && nd->isLinkableInProject() && nd->getStartBodyLine()!=-1)
- {
- fd->addSourceRef(nd->getStartBodyLine(),nd,0);
- }
- }
-
- // add source references for member names
- MemberNameSDict::Iterator mnli(Doxygen::memberNameSDict);
- MemberName *mn=0;
- for (mnli.toFirst();(mn=mnli.current());++mnli)
- {
- MemberNameIterator mni(*mn);
- MemberDef *md=0;
- for (mni.toFirst();(md=mni.current());++mni)
- {
- //printf("class member %s\n",md->name().data());
- FileDef *fd=md->getBodyDef();
- if (fd &&
- md->getStartBodyLine()!=-1 &&
- md->isLinkableInProject() &&
- fd->generateSourceFile())
- {
- //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);
- }
- }
- }
- MemberNameSDict::Iterator fnli(Doxygen::functionNameSDict);
- for (fnli.toFirst();(mn=fnli.current());++fnli)
- {
- MemberNameIterator mni(*mn);
- MemberDef *md=0;
- for (mni.toFirst();(md=mni.current());++mni)
- {
- FileDef *fd=md->getBodyDef();
- //printf("member %s body=[%d,%d] fd=%p\n",md->name().data(),
- // md->getStartBodyLine(),md->getEndBodyLine(),fd);
- if (fd &&
- md->getStartBodyLine()!=-1 &&
- md->isLinkableInProject() &&
- fd->generateSourceFile()
- )
- {
- //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);
- }
- }
- }
-}
-
-//----------------------------------------------------------------------------
-// generate the documentation of all classes
-
-static void generateClassList(ClassSDict &classSDict)
-{
- ClassSDict::Iterator cli(classSDict);
- for ( ; cli.current() ; ++cli )
- {
- ClassDef *cd=cli.current();
-
- //printf("cd=%s getOuterScope=%p global=%p\n",cd->name().data(),cd->getOuterScope(),Doxygen::globalScope);
- if ((cd->getOuterScope()==0 || // <-- should not happen, but can if we read an old tag file
- cd->getOuterScope()==Doxygen::globalScope // only look at global classes
- ) && !cd->isHidden()
- )
- {
- // skip external references, anonymous compounds and
- // template instances
- if ( cd->isLinkableInProject() && cd->templateMaster()==0)
- {
- msg("Generating docs for compound %s...\n",cd->name().data());
-
- cd->writeDocumentation(*outputList);
- cd->writeMemberList(*outputList);
- }
- // even for undocumented classes, the inner classes can be documented.
- cd->writeDocumentationForInnerClasses(*outputList);
- }
- }
-}
-
-static void generateClassDocs()
-{
- // write the installdox script if necessary
- if (Config_getBool("GENERATE_HTML") &&
- (Config_getList("TAGFILES").count()>0 ||
- Config_getBool("SEARCHENGINE")
- )
- )
- {
- writeInstallScript();
- }
-
- msg("Generating annotated compound index...\n");
- writeAnnotatedIndex(*outputList);
-
- if (Config_getBool("ALPHABETICAL_INDEX"))
- {
- msg("Generating alphabetical compound index...\n");
- writeAlphabeticalIndex(*outputList);
- }
-
- msg("Generating hierarchical class index...\n");
- writeHierarchicalIndex(*outputList);
-
- msg("Generating member index...\n");
- writeClassMemberIndex(*outputList);
-
- if (Doxygen::exampleSDict->count()>0)
- {
- msg("Generating example index...\n");
- }
-
- generateClassList(Doxygen::classSDict);
- generateClassList(Doxygen::hiddenClasses);
-}
-
-//----------------------------------------------------------------------------
-
-static void inheritDocumentation()
-{
- MemberNameSDict::Iterator mnli(Doxygen::memberNameSDict);
- MemberName *mn;
- //int count=0;
- for (;(mn=mnli.current());++mnli)
- {
- MemberNameIterator mni(*mn);
- MemberDef *md;
- for (;(md=mni.current());++mni)
- {
- //printf("%04d Member `%s'\n",count++,md->name().data());
- if (md->documentation().isEmpty() && md->briefDescription().isEmpty())
- { // no documentation yet
- MemberDef *bmd = md->reimplements();
- while (bmd && bmd->documentation().isEmpty() &&
- bmd->briefDescription().isEmpty()
- )
- { // search up the inheritance tree for a documentation member
- //printf("bmd=%s class=%s\n",bmd->name().data(),bmd->getClassDef()->name().data());
- bmd = bmd->reimplements();
- }
- if (bmd) // copy the documentation from the reimplemented member
- {
- md->setInheritsDocsFrom(bmd);
- md->setDocumentation(bmd->documentation(),bmd->docFile(),bmd->docLine());
- md->setDocsForDefinition(bmd->isDocsForDefinition());
- md->setBriefDescription(bmd->briefDescription(),bmd->briefFile(),bmd->briefLine());
- md->setInbodyDocumentation(bmd->inbodyDocumentation(),bmd->inbodyFile(),bmd->inbodyLine());
- }
- }
- }
- }
-}
-
-//----------------------------------------------------------------------------
-
-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->visited=FALSE;
- }
- }
- for (fnli.toFirst();(fn=fnli.current());++fnli)
- {
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (fni.toFirst();(fd=fni.current());++fni)
- {
- fd->combineUsingRelations();
- }
- }
-
- // for each namespace
- NamespaceSDict::Iterator nli(Doxygen::namespaceSDict);
- NamespaceDef *nd;
- for (nli.toFirst() ; (nd=nli.current()) ; ++nli )
- {
- nd->visited=FALSE;
- }
- for (nli.toFirst() ; (nd=nli.current()) ; ++nli )
- {
- nd->combineUsingRelations();
- }
-}
-
-//----------------------------------------------------------------------------
-
-static void addMembersToMemberGroup()
-{
- // for each class
- ClassSDict::Iterator cli(Doxygen::classSDict);
- ClassDef *cd;
- for ( ; (cd=cli.current()) ; ++cli )
- {
- cd->addMembersToMemberGroup();
- }
- // for each file
- FileName *fn=Doxygen::inputNameList.first();
- while (fn)
- {
- FileDef *fd=fn->first();
- while (fd)
- {
- fd->addMembersToMemberGroup();
- fd=fn->next();
- }
- fn=Doxygen::inputNameList.next();
- }
- // for each namespace
- NamespaceSDict::Iterator nli(Doxygen::namespaceSDict);
- NamespaceDef *nd;
- for ( ; (nd=nli.current()) ; ++nli )
- {
- nd->addMembersToMemberGroup();
- }
- // for each group
- GroupSDict::Iterator gli(Doxygen::groupSDict);
- GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
- {
- gd->addMembersToMemberGroup();
- }
-}
-
-//----------------------------------------------------------------------------
-
-static void distributeMemberGroupDocumentation()
-{
- // for each class
- ClassSDict::Iterator cli(Doxygen::classSDict);
- ClassDef *cd;
- for ( ; (cd=cli.current()) ; ++cli )
- {
- cd->distributeMemberGroupDocumentation();
- }
- // for each file
- FileName *fn=Doxygen::inputNameList.first();
- while (fn)
- {
- FileDef *fd=fn->first();
- while (fd)
- {
- fd->distributeMemberGroupDocumentation();
- fd=fn->next();
- }
- fn=Doxygen::inputNameList.next();
- }
- // for each namespace
- NamespaceSDict::Iterator nli(Doxygen::namespaceSDict);
- NamespaceDef *nd;
- for ( ; (nd=nli.current()) ; ++nli )
- {
- nd->distributeMemberGroupDocumentation();
- }
- // for each group
- GroupSDict::Iterator gli(Doxygen::groupSDict);
- GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
- {
- gd->distributeMemberGroupDocumentation();
- }
-}
-
-//----------------------------------------------------------------------------
-
-static void findSectionsInDocumentation()
-{
- // for each class
- ClassSDict::Iterator cli(Doxygen::classSDict);
- ClassDef *cd;
- for ( ; (cd=cli.current()) ; ++cli )
- {
- cd->findSectionsInDocumentation();
- }
- // for each file
- FileName *fn=Doxygen::inputNameList.first();
- while (fn)
- {
- FileDef *fd=fn->first();
- while (fd)
- {
- fd->findSectionsInDocumentation();
- fd=fn->next();
- }
- fn=Doxygen::inputNameList.next();
- }
- // for each namespace
- NamespaceSDict::Iterator nli(Doxygen::namespaceSDict);
- NamespaceDef *nd;
- for ( ; (nd=nli.current()) ; ++nli )
- {
- nd->findSectionsInDocumentation();
- }
- // for each group
- GroupSDict::Iterator gli(Doxygen::groupSDict);
- GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
- {
- gd->findSectionsInDocumentation();
- }
- // for each page
- PageSDict::Iterator pdi(*Doxygen::pageSDict);
- PageDef *pd=0;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
- {
- pd->findSectionsInDocumentation();
- }
- if (Doxygen::mainPage) Doxygen::mainPage->findSectionsInDocumentation();
-}
-
-static void flushCachedTemplateRelations()
-{
- // remove all references to classes from the cache
- // 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)
- {
- if (li->classDef)
- {
- Doxygen::lookupCache.remove(ci.currentKey());
- }
- }
- // 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
- {
- MemberNameIterator fni(*fn);
- MemberDef *fmd;
- for (;(fmd=fni.current());++fni) // for each function with that name
- {
- if (fmd->isTypedefValCached())
- {
- ClassDef *cd = fmd->getCachedTypedefVal();
- if (cd->isTemplate()) fmd->invalidateTypedefValCache();
- }
- }
- }
- MemberNameSDict::Iterator mnli(Doxygen::memberNameSDict);
- for (;(fn=mnli.current());++mnli) // for each class method name
- {
- MemberNameIterator mni(*fn);
- MemberDef *fmd;
- for (;(fmd=mni.current());++mni) // for each function with that name
- {
- if (fmd->isTypedefValCached())
- {
- ClassDef *cd = fmd->getCachedTypedefVal();
- if (cd->isTemplate()) fmd->invalidateTypedefValCache();
- }
- }
- }
-}
-
-
-//----------------------------------------------------------------------------
-
-static void findDefineDocumentation(Entry *root)
-{
- if ((root->section==Entry::DEFINEDOC_SEC ||
- root->section==Entry::DEFINE_SEC) && !root->name.isEmpty()
- )
- {
- //printf("found define `%s' `%s' brief=`%s' doc=`%s'\n",
- // root->name.data(),root->args.data(),root->brief.data(),root->doc.data());
-
- if (root->tagInfo && !root->name.isEmpty()) // define read from a tag file
- {
- MemberDef *md=new MemberDef("<tagfile>",1,
- "#define",root->name,root->args,0,
- Public,Normal,FALSE,FALSE,MemberDef::Define,0,0);
- md->setTagInfo(root->tagInfo);
- bool ambig;
- QCString filePathName = root->parent->fileName;
- FileDef *fd=findFileDef(Doxygen::inputNameDict,filePathName,ambig);
- //printf("Searching for `%s' fd=%p\n",filePathName.data(),fd);
- md->setFileDef(fd);
- //printf("Adding member=%s\n",md->name().data());
- MemberName *mn;
- if ((mn=Doxygen::functionNameSDict[root->name]))
- {
- mn->append(md);
- }
- else
- {
- mn = new MemberName(root->name);
- mn->append(md);
- //Doxygen::functionNameDict.insert(root->name,mn);
- //Doxygen::functionNameList.append(mn);
- Doxygen::functionNameSDict.append(root->name,mn);
- }
- }
- MemberName *mn=Doxygen::functionNameSDict[root->name];
- if (mn)
- {
- int count=0;
- MemberDef *md=mn->first();
- while (md)
- {
- if (md->memberType()==MemberDef::Define) count++;
- md=mn->next();
- }
- if (count==1)
- {
- md=mn->first();
- while (md)
- {
- if (md->memberType()==MemberDef::Define)
- {
- if (md->documentation().isEmpty())
- {
- md->setDocumentation(root->doc,root->docFile,root->docLine);
- md->setDocsForDefinition(!root->proto);
- }
- if (md->briefDescription().isEmpty())
- {
- 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);
- bool ambig;
- md->setBodyDef(findFileDef(Doxygen::inputNameDict,root->fileName,ambig));
- md->addSectionsToDefinition(root->anchors);
- md->setMaxInitLines(root->initLines);
- md->setRefItems(root->sli);
- if (root->mGrpId!=-1) md->setMemberGroupId(root->mGrpId);
- addMemberToGroups(root,md);
- }
- md=mn->next();
- }
- }
- else if (count>1 &&
- (!root->doc.isEmpty() ||
- !root->brief.isEmpty() ||
- root->bodyLine!=-1
- )
- )
- // multiple defines don't know where to add docs
- // but maybe they are in different files together with their documentation
- {
- md=mn->first();
- while (md)
- {
- if (md->memberType()==MemberDef::Define)
- {
- FileDef *fd=md->getFileDef();
- if (fd && fd->absFilePath()==root->fileName)
- // doc and define in the same file assume they belong together.
- {
- if (md->documentation().isEmpty())
- {
- md->setDocumentation(root->doc,root->docFile,root->docLine);
- md->setDocsForDefinition(!root->proto);
- }
- if (md->briefDescription().isEmpty())
- {
- 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);
- bool ambig;
- md->setBodyDef(findFileDef(Doxygen::inputNameDict,root->fileName,ambig));
- md->addSectionsToDefinition(root->anchors);
- md->setRefItems(root->sli);
- if (root->mGrpId!=-1) md->setMemberGroupId(root->mGrpId);
- addMemberToGroups(root,md);
- }
- }
- md=mn->next();
- }
- //warn("Warning: define %s found in the following files:\n",root->name.data());
- //warn("Cannot determine where to add the documentation found "
- // "at line %d of file %s. \n",
- // root->startLine,root->fileName.data());
- }
- }
- else if (!root->doc.isEmpty() || !root->brief.isEmpty()) // define not found
- {
- warn(root->fileName,root->startLine,
- "Warning: documentation for unknown define %s found.\n",
- root->name.data()
- );
- }
- }
- EntryListIterator eli(*root->sublist);
- Entry *e;
- for (;(e=eli.current());++eli)
- {
- findDefineDocumentation(e);
- }
-}
-
-//----------------------------------------------------------------------------
-
-static void findDirDocumentation(Entry *root)
-{
- if (root->section == Entry::DIRDOC_SEC)
- {
- QCString normalizedName = root->name;
- normalizedName = substitute(normalizedName,"\\","/");
- if (normalizedName.at(normalizedName.length()-1)!='/')
- {
- normalizedName+='/';
- }
- DirDef *dir,*matchingDir=0;
- SDict<DirDef>::Iterator sdi(Doxygen::directories);
- for (sdi.toFirst();(dir=sdi.current());++sdi)
- {
- //printf("Dir: %s<->%s\n",dir->name().data(),normalizedName.data());
- if (dir->name().right(normalizedName.length())==normalizedName)
- {
- if (matchingDir)
- {
- warn(root->fileName,root->startLine,
- "Warning: \\dir command matches multiple directories.\n"
- " Applying the command for directory %s\n"
- " Ignoring the command for directory %s\n",
- matchingDir->name().data(),dir->name().data()
- );
- }
- else
- {
- matchingDir=dir;
- }
- }
- }
- if (matchingDir)
- {
- //printf("Match for with dir %s\n",matchingDir->name().data());
- matchingDir->setBriefDescription(root->brief,root->briefFile,root->briefLine);
- matchingDir->setDocumentation(root->doc,root->docFile,root->docLine);
- addDirToGroups(root,matchingDir);
- }
- else
- {
- warn(root->fileName,root->startLine,"Warning: No matching "
- "directory found for command \\dir %s\n",root->name.data());
- }
- }
- EntryListIterator eli(*root->sublist);
- Entry *e;
- for (;(e=eli.current());++eli)
- {
- findDirDocumentation(e);
- }
-}
-
-
-//----------------------------------------------------------------------------
-// create a (sorted) list of separate documentation pages
-
-static void buildPageList(Entry *root)
-{
- if (root->section == Entry::PAGEDOC_SEC)
- {
- //printf("buildPageList %s\n",root->name.data());
- if (!root->name.isEmpty())
- {
- addRelatedPage(root);
- }
- }
- else if (root->section == Entry::MAINPAGEDOC_SEC)
- {
- QCString title=root->args.stripWhiteSpace();
- if (title.isEmpty()) title=theTranslator->trMainPage();
- addRefItem(root->sli,"page",
- Config_getBool("GENERATE_TREEVIEW")?"main":"index",
- title
- );
- }
- EntryListIterator eli(*root->sublist);
- Entry *e;
- for (;(e=eli.current());++eli)
- {
- buildPageList(e);
- }
-}
-
-static void findMainPage(Entry *root)
-{
- if (root->section == Entry::MAINPAGEDOC_SEC)
- {
- if (Doxygen::mainPage==0)
- {
- //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";
- Doxygen::mainPage = new PageDef(root->fileName,root->startLine,
- indexName, root->doc,title);
- //setFileNameForSections(root->anchors,"index",Doxygen::mainPage);
- Doxygen::mainPage->setFileName(indexName);
-
- // a page name is a label as well!
- SectionInfo *si=new SectionInfo(
- indexName,
- Doxygen::mainPage->name(),
- Doxygen::mainPage->title(),
- SectionInfo::Section);
- Doxygen::sectionDict.insert(indexName,si);
- Doxygen::mainPage->addSectionsToDefinition(root->anchors);
- }
- else
- {
- warn(root->fileName,root->startLine,
- "Warning: found more than one \\mainpage comment block! Skipping this "
- "block."
- );
- }
- }
- EntryListIterator eli(*root->sublist);
- Entry *e;
- for (;(e=eli.current());++eli)
- {
- findMainPage(e);
- }
-}
-
-static void computePageRelations(Entry *root)
-{
- if ((root->section==Entry::PAGEDOC_SEC ||
- root->section==Entry::MAINPAGEDOC_SEC
- )
- && !root->name.isEmpty()
- )
- {
- PageDef *pd = root->section==Entry::PAGEDOC_SEC ?
- Doxygen::pageSDict->find(root->name) :
- Doxygen::mainPage;
- if (pd)
- {
- QListIterator<BaseInfo> bii(*root->extends);
- BaseInfo *bi;
- for (bii.toFirst();(bi=bii.current());++bii)
- {
- PageDef *subPd = Doxygen::pageSDict->find(bi->name);
- if (subPd)
- {
- pd->addInnerCompound(subPd);
- //printf("*** Added subpage relation: %s->%s\n",
- // pd->name().data(),subPd->name().data());
- }
- }
- }
- }
- EntryListIterator eli(*root->sublist);
- Entry *e;
- for (;(e=eli.current());++eli)
- {
- computePageRelations(e);
- }
-}
-
-static void checkPageRelations()
-{
- PageSDict::Iterator pdi(*Doxygen::pageSDict);
- PageDef *pd=0;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
- {
- Definition *ppd = pd->getOuterScope();
- while (ppd)
- {
- if (ppd==pd)
- {
- err("Warning: page defined at line %d of file %s with label %s is a subpage "
- "of itself! Please remove this cyclic dependency.\n",
- pd->docLine(),pd->docFile().data(),pd->name().data());
- exit(1);
- }
- ppd=ppd->getOuterScope();
- }
- }
-}
-
-//----------------------------------------------------------------------------
-
-static void resolveUserReferences()
-{
- QDictIterator<SectionInfo> sdi(Doxygen::sectionDict);
- SectionInfo *si;
- for (;(si=sdi.current());++sdi)
- {
- //printf("si->label=`%s' si->definition=%s si->fileName=`%s'\n",
- // si->label.data(),si->definition?si->definition->name().data():"<none>",
- // si->fileName.data());
- PageDef *pd=0;
-
- // hack: the items of a todo/test/bug/deprecated list are all fragments from
- // different files, so the resulting section's all have the wrong file
- // 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)
- {
- QCString label="_"+rl->listName(); // "_todo", "_test", ...
- if (si->label.left(label.length())==label)
- {
- si->fileName=rl->listName();
- si->generated=TRUE;
- break;
- }
- }
-
- //printf("start: si->label=%s si->fileName=%s\n",si->label.data(),si->fileName.data());
- 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)) &&
- pd->getGroupDef())
- {
- si->fileName=pd->getGroupDef()->getOutputFileBase().copy();
- }
-
- 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.
- GroupDef *gd=0;
- if (si->definition->definitionType()==Definition::TypeMember)
- {
- gd = ((MemberDef *)si->definition)->getGroupDef();
- }
-
- if (gd)
- {
- si->fileName=gd->getOutputFileBase().copy();
- }
- else
- {
- //si->fileName=si->definition->getOutputFileBase().copy();
- //printf("Setting si->fileName to %s\n",si->fileName.data());
- }
- }
- }
- //printf("end: si->label=%s si->fileName=%s\n",si->label.data(),si->fileName.data());
- }
-}
-
-
-//----------------------------------------------------------------------------
-// generate all separate documentation pages
-
-
-static void generatePageDocs()
-{
- //printf("documentedPages=%d real=%d\n",documentedPages,Doxygen::pageSDict->count());
- if (documentedPages==0) return;
- PageSDict::Iterator pdi(*Doxygen::pageSDict);
- PageDef *pd=0;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
- {
- if (!pd->getGroupDef() && !pd->isReference())
- {
- msg("Generating docs for page %s...\n",pd->name().data());
- pd->writeDocumentation(*outputList);
- }
- }
-}
-
-//----------------------------------------------------------------------------
-// create a (sorted) list & dictionary of example pages
-
-static void buildExampleList(Entry *root)
-{
- if (root->section == Entry::EXAMPLE_SEC)
- {
- if (!root->name.isEmpty())
- {
- if (Doxygen::exampleSDict->find(root->name))
- {
- warn(root->fileName,root->startLine,
- "Warning: Example %s was already documented. Ignoring "
- "documentation found here.",
- root->name.data()
- );
- }
- else
- {
- PageDef *pd=new PageDef(root->fileName,root->startLine,
- root->name,root->doc,root->args);
- pd->setFileName(convertNameToFile(pd->name()+"-example"));
- pd->addSectionsToDefinition(root->anchors);
- //pi->addSections(root->anchors);
-
- Doxygen::exampleSDict->inSort(root->name,pd);
- //we don't add example to groups
- //addExampleToGroups(root,pd);
- }
- }
- }
- EntryListIterator eli(*root->sublist);
- Entry *e;
- for (;(e=eli.current());++eli)
- {
- buildExampleList(e);
- }
-}
-
-//----------------------------------------------------------------------------
-// generate the example documentation
-
-static void generateExampleDocs()
-{
- outputList->disable(OutputGenerator::Man);
- PageSDict::Iterator pdi(*Doxygen::exampleSDict);
- PageDef *pd=0;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
- {
- msg("Generating docs for example %s...\n",pd->name().data());
- QCString n=pd->getOutputFileBase();
- startFile(*outputList,n,n,pd->name());
- startTitle(*outputList,n);
- outputList->docify(pd->name());
- endTitle(*outputList,n,0);
- outputList->parseDoc(pd->docFile(), // file
- pd->docLine(), // startLine
- pd, // context
- 0, // memberDef
- pd->documentation()+"\n\n\\include "+pd->name(), // docs
- TRUE, // index words
- TRUE, // is example
- pd->name()
- );
- endFile(*outputList);
- }
- outputList->enable(OutputGenerator::Man);
-}
-
-//----------------------------------------------------------------------------
-// generate module pages
-
-static void generateGroupDocs()
-{
- GroupSDict::Iterator gli(Doxygen::groupSDict);
- GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
- {
- if (!gd->isReference())
- {
- gd->writeDocumentation(*outputList);
- }
- }
-}
-
-//----------------------------------------------------------------------------
-
-//static void generatePackageDocs()
-//{
-// writePackageIndex(*outputList);
-//
-// if (Doxygen::packageDict.count()>0)
-// {
-// PackageSDict::Iterator pdi(Doxygen::packageDict);
-// PackageDef *pd;
-// for (pdi.toFirst();(pd=pdi.current());++pdi)
-// {
-// pd->writeDocumentation(*outputList);
-// }
-// }
-//}
-
-//----------------------------------------------------------------------------
-// generate module pages
-
-static void generateNamespaceDocs()
-{
- writeNamespaceIndex(*outputList);
-
- NamespaceSDict::Iterator nli(Doxygen::namespaceSDict);
- NamespaceDef *nd;
- // for each namespace...
- for (;(nd=nli.current());++nli)
- {
- if (nd->isLinkableInProject())
- {
- msg("Generating docs for namespace %s\n",nd->name().data());
- nd->writeDocumentation(*outputList);
- }
- // for each class in the namespace...
- ClassSDict::Iterator cli(*nd->classSDict);
- for ( ; cli.current() ; ++cli )
- {
- ClassDef *cd=cli.current();
- if ( ( cd->isLinkableInProject() &&
- cd->templateMaster()==0
- ) // skip external references, anonymous compounds and
- // template instances and nested classes
- && !cd->isHidden()
- )
- {
- msg("Generating docs for compound %s...\n",cd->name().data());
-
- cd->writeDocumentation(*outputList);
- cd->writeMemberList(*outputList);
- }
- cd->writeDocumentationForInnerClasses(*outputList);
- }
- }
-}
-
-#if defined(_WIN32)
-static QCString fixSlashes(QCString &s)
-{
- QCString result;
- uint i;
- for (i=0;i<s.length();i++)
- {
- switch(s.at(i))
- {
- case '/':
- case '\\':
- result+="\\\\";
- break;
- default:
- result+=s.at(i);
- }
- }
- return result;
-}
-#endif
-
-
-//----------------------------------------------------------------------------
-// generate files for the search engine
-
-//static void generateSearchIndex()
-//{
-// if (Config_getBool("SEARCHENGINE") && Config_getBool("GENERATE_HTML"))
-// {
-// // create search index
-// QCString fileName;
-// writeSearchButton(Config_getString("HTML_OUTPUT"));
-//
-//#if !defined(_WIN32)
-// // create cgi script
-// fileName = Config_getString("HTML_OUTPUT")+"/"+Config_getString("CGI_NAME");
-// QFile f(fileName);
-// if (f.open(IO_WriteOnly))
-// {
-// QTextStream t(&f);
-// t << "#!/bin/sh" << endl
-// << "DOXYSEARCH=" << Config_getString("BIN_ABSPATH") << "/doxysearch" << endl
-// << "DOXYPATH=\"" << Config_getString("DOC_ABSPATH") << " ";
-//
-// QStrList &extDocPaths=Config_getList("EXT_DOC_PATHS");
-// char *s= extDocPaths.first();
-// while (s)
-// {
-// t << s << " ";
-// s=extDocPaths.next();
-// }
-//
-// t << "\"" << endl
-// << "if [ -f $DOXYSEARCH ]" << endl
-// << "then" << endl
-// << " $DOXYSEARCH $DOXYPATH" << endl
-// << "else" << endl
-// << " echo \"Content-Type: text/html\"" << endl
-// << " echo \"\"" << endl
-// << " echo \"<h2>Error: $DOXYSEARCH not found. Check cgi script!</h2>\"" << endl
-// << "fi" << endl;
-//
-// f.close();
-// struct stat stat_struct;
-// stat(fileName,&stat_struct);
-// chmod(fileName,stat_struct.st_mode|S_IXUSR|S_IXGRP|S_IXOTH);
-// }
-// else
-// {
-// err("Error: Cannot open file %s for writing\n",fileName.data());
-// }
-//#else /* Windows platform */
-// // create cgi program
-// fileName = Config_getString("CGI_NAME").copy();
-// if (fileName.right(4)==".cgi")
-// fileName=fileName.left(fileName.length()-4);
-// fileName+=".c";
-// fileName.prepend(Config_getString("HTML_OUTPUT")+"/");
-// QFile f(fileName);
-// if (f.open(IO_WriteOnly))
-// {
-// QTextStream t(&f);
-// t << "#include <stdio.h>" << endl;
-// t << "#include <stdlib.h>" << endl;
-// t << "#include <process.h>" << endl;
-// t << endl;
-// t << "const char *DOXYSEARCH = \"" <<
-// fixSlashes(Config_getString("BIN_ABSPATH")) << "\\\\doxysearch.exe\";" << endl;
-// t << "const char *DOXYPATH = \"" <<
-// fixSlashes(Config_getString("DOC_ABSPATH")) << "\";" << endl;
-// t << endl;
-// t << "int main(void)" << endl;
-// t << "{" << endl;
-// t << " char buf[1024];" << endl;
-// t << " sprintf(buf,\"%s %s\",DOXYSEARCH,DOXYPATH);" << endl;
-// t << " if (system(buf))" << endl;
-// t << " {" << endl;
-// t << " printf(\"Content-Type: text/html\\n\\n\");" << endl;
-// t << " printf(\"<h2>Error: failed to execute %s</h2>\\n\",DOXYSEARCH);" << endl;
-// t << " exit(1);" << endl;
-// t << " }" << endl;
-// t << " return 0;" << endl;
-// t << "}" << endl;
-// f.close();
-// }
-// else
-// {
-// err("Error: Cannot open file %s for writing\n",fileName.data());
-// }
-//#endif /* !defined(_WIN32) */
-//
-// // create config file
-// fileName = Config_getString("HTML_OUTPUT")+"/search.cfg";
-// f.setName(fileName);
-// if (f.open(IO_WriteOnly))
-// {
-// QTextStream t(&f);
-// t << Config_getString("DOC_URL") << "/" << endl
-// << Config_getString("CGI_URL") << "/" << Config_getString("CGI_NAME") << endl;
-// f.close();
-// }
-// else
-// {
-// err("Error: Cannot open file %s for writing\n",fileName.data());
-// }
-// //outputList->generateExternalIndex();
-// outputList->pushGeneratorState();
-// outputList->disableAllBut(OutputGenerator::Html);
-// startFile(*outputList,"header"+Doxygen::htmlFileExtension,0,"Search Engine",TRUE);
-// outputList->endPlainFile();
-// outputList->startPlainFile("footer"+Doxygen::htmlFileExtension);
-// endFile(*outputList,TRUE);
-// outputList->popGeneratorState();
-// }
-//}
-
-//----------------------------------------------------------------------------
-
-static bool openOutputFile(const char *outFile,QFile &f)
-{
- bool fileOpened=FALSE;
- bool writeToStdout=(outFile[0]=='-' && outFile[1]=='\0');
- if (writeToStdout) // write to stdout
- {
- fileOpened = f.open(IO_WriteOnly,stdout);
- }
- else // write to file
- {
- QFileInfo fi(outFile);
- if (fi.exists()) // create a backup
- {
- QDir dir=fi.dir();
- QFileInfo backup(fi.fileName()+".bak");
- if (backup.exists()) // remove existing backup
- dir.remove(backup.fileName());
- dir.rename(fi.fileName(),fi.fileName()+".bak");
- }
- f.setName(outFile);
- fileOpened = f.open(IO_WriteOnly|IO_Translate);
- }
- return fileOpened;
-}
-
-/*! Generate a template version of the configuration file.
- * If the \a shortList parameter is TRUE a configuration file without
- * comments will be generated.
- */
-static void generateConfigFile(const char *configFile,bool shortList,
- bool updateOnly=FALSE)
-{
- QFile f;
- bool fileOpened=openOutputFile(configFile,f);
- bool writeToStdout=(configFile[0]=='-' && configFile[1]=='\0');
- if (fileOpened)
- {
- QTextStream t(&f);
- Config::instance()->writeTemplate(t,shortList,updateOnly);
- if (!writeToStdout)
- {
- if (!updateOnly)
- {
- msg("\n\nConfiguration file `%s' created.\n\n",configFile);
- msg("Now edit the configuration file and enter\n\n");
- if (strcmp(configFile,"Doxyfile") || strcmp(configFile,"doxyfile"))
- msg(" doxygen %s\n\n",configFile);
- else
- msg(" doxygen\n\n");
- msg("to generate the documentation for your project\n\n");
- }
- else
- {
- msg("\n\nConfiguration file `%s' updated.\n\n",configFile);
- }
- }
- }
- else
- {
- err("Error: Cannot open file %s for writing\n",configFile);
- exit(1);
- }
-}
-
-//----------------------------------------------------------------------------
-// read and parse a tag file
-
-//static bool readLineFromFile(QFile &f,QCString &s)
-//{
-// char c=0;
-// s.resize(0);
-// while (!f.atEnd() && (c=f.getch())!='\n') s+=c;
-// return f.atEnd();
-//}
-
-//----------------------------------------------------------------------------
-
-static void readTagFile(Entry *root,const char *tl)
-{
- QCString tagLine = tl;
- QCString fileName;
- QCString destName;
- int eqPos = tagLine.find('=');
- if (eqPos!=-1) // tag command contains a destination
- {
- fileName = tagLine.left(eqPos).stripWhiteSpace();
- destName = tagLine.right(tagLine.length()-eqPos-1).stripWhiteSpace();
- QFileInfo fi(fileName);
- Doxygen::tagDestinationDict.insert(fi.fileName(),new QCString(destName));
- //printf("insert tagDestination %s->%s\n",fi.fileName().data(),destName.data());
- }
- else
- {
- fileName = tagLine;
- }
-
- QFileInfo fi(fileName);
- if (!fi.exists() || !fi.isFile())
- {
- err("Error: Tag file `%s' does not exist or is not a file. Skipping it...\n",
- fileName.data());
- return;
- }
-
- if (!destName.isEmpty())
- msg("Reading tag file `%s', location `%s'...\n",fileName.data(),destName.data());
- else
- msg("Reading tag file `%s'...\n",fileName.data());
-
- parseTagFile(root,fi.absFilePath(),fi.fileName());
-}
-
-//----------------------------------------------------------------------------
-// returns TRUE if the name of the file represented by `fi' matches
-// one of the file patterns in the `patList' list.
-
-static bool patternMatch(QFileInfo *fi,QStrList *patList)
-{
- bool found=FALSE;
- if (patList)
- {
- QCString pattern=patList->first();
- while (!pattern.isEmpty() && !found)
- {
- int i=pattern.find('=');
- if (i!=-1) pattern=pattern.left(i); // strip of the extension specific filter name
-
- //printf("Matching `%s' against pattern `%s'\n",fi->fileName().data(),pattern);
-#if defined(_WIN32) // windows
- QRegExp re(pattern,FALSE,TRUE); // case insensitive match
-#else // unix
- QRegExp re(pattern,TRUE,TRUE); // case sensitive match
-#endif
- found = found || re.match(fi->fileName())!=-1 ||
- re.match(fi->filePath())!=-1 ||
- re.match(fi->absFilePath())!=-1;
- pattern=patList->next();
- }
- }
- return found;
-}
-
-//----------------------------------------------------------------------------
-// reads a file into an array and filters out any 0x00 and 0x06 bytes,
-// because these are special for the parser.
-
-static void copyAndFilterFile(const char *fileName,BufStr &dest)
-{
- // try to open file
- int size=0;
- uint oldPos = dest.curPos();
- //printf(".......oldPos=%d\n",oldPos);
-
- QFileInfo fi(fileName);
- if (!fi.exists()) return;
- QCString filterName = getFileFilter(fileName);
- if (filterName.isEmpty())
- {
- QFile f(fileName);
- if (!f.open(IO_ReadOnly))
- {
- err("Error: could not open file %s\n",fileName);
- return;
- }
- size=fi.size();
- // read the file
- dest.skip(size);
- if (f.readBlock(dest.data()+oldPos,size)!=size)
- {
- err("Error while reading file %s\n",fileName);
- return;
- }
- }
- else
- {
- QCString cmd=filterName+" \""+fileName+"\"";
- FILE *f=popen(cmd,"r");
- if (!f)
- {
- err("Error: could not execute filter %s\n",filterName.data());
- return;
- }
- const int bufSize=1024;
- char buf[bufSize];
- int numRead;
- while ((numRead=fread(buf,1,bufSize,f))>0)
- {
- //printf(">>>>>>>>Reading %d bytes\n",numRead);
- dest.addArray(buf,numRead),size+=numRead;
- }
- pclose(f);
- }
- // filter unwanted bytes from the resulting data
- uchar conv[256];
- int i;
- for (i=0;i<256;i++) conv[i]=i;
- conv[0x06]=0x20; // replace the offending characters with spaces
- conv[0x00]=0x20;
- // remove any special markers from the input
- uchar *p=(uchar *)dest.data()+oldPos;
- for (i=0;i<size;i++,p++) *p=conv[*p];
- // and translate CR's
- int newSize=filterCRLF(dest.data()+oldPos,size);
- //printf("filter char at %p size=%d newSize=%d\n",dest.data()+oldPos,size,newSize);
- if (newSize!=size) // we removed chars
- {
- dest.shrink(oldPos+newSize); // resize the array
- //printf(".......resizing from %d to %d result=[%s]\n",oldPos+size,oldPos+newSize,dest.data());
- }
-}
-
-//----------------------------------------------------------------------------
-static void copyStyleSheet()
-{
- QCString &htmlStyleSheet = Config_getString("HTML_STYLESHEET");
- if (!htmlStyleSheet.isEmpty())
- {
- QFile cssf(htmlStyleSheet);
- QFileInfo cssfi(htmlStyleSheet);
- if (cssf.open(IO_ReadOnly))
- {
- QCString destFileName = Config_getString("HTML_OUTPUT")+"/"+cssfi.fileName().data();
- QFile df(destFileName);
- if (df.open(IO_WriteOnly))
- {
- char *buffer = new char[cssf.size()];
- cssf.readBlock(buffer,cssf.size());
- df.writeBlock(buffer,cssf.size());
- df.flush();
- delete[] buffer;
- }
- else
- {
- err("Error: could not write to style sheet %s\n",destFileName.data());
- }
- }
- else
- {
- err("Error: could not open user specified style sheet %s\n",Config_getString("HTML_STYLESHEET").data());
- htmlStyleSheet.resize(0); // revert to the default
- }
- }
-}
-
-static void parseFiles(Entry *root)
-{
-
- QCString *s=inputFiles.first();
- while (s)
- {
- QCString fileName=*s;
- QCString extension;
- int ei = fileName.findRev('.');
- if (ei!=-1) extension=fileName.right(fileName.length()-ei);
- ParserInterface *parser = Doxygen::parserManager->getParser(extension);
-
- QFileInfo fi(fileName);
- BufStr preBuf(fi.size()+4096);
- BufStr *bufPtr = &preBuf;
-
- if (Config_getBool("ENABLE_PREPROCESSING") &&
- parser->needsPreprocessing(extension))
- {
- msg("Preprocessing %s...\n",s->data());
- preprocessFile(fileName,*bufPtr);
- }
- else
- {
- msg("Reading %s...\n",s->data());
- copyAndFilterFile(fileName,*bufPtr);
- }
-
- bufPtr->addChar('\n'); /* to prevent problems under Windows ? */
-
- BufStr convBuf(bufPtr->curPos()+1024);
-
- convertCppComments(&preBuf,&convBuf,fileName);
-
- convBuf.addChar('\0');
-
- parser->parseInput(fileName,convBuf.data(),root);
-
- s=inputFiles.next();
- }
-}
-
-//----------------------------------------------------------------------------
-// Read all files matching at least one pattern in `patList' in the
-// directory represented by `fi'.
-// The directory is read iff the recusiveFlag is set.
-// The contents of all files is append to the input string
-
-static 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
- )
-{
- QDir dir((const char *)fi->absFilePath());
- dir.setFilter( QDir::Files | QDir::Dirs | QDir::Hidden );
- int totalSize=0;
- //printf("readDir `%s'\n",fi->absFilePath().data());
- //printf("killDict=%p count=%d\n",killDict,killDict->count());
-
- const QFileInfoList *list = dir.entryInfoList();
- QFileInfoListIterator it( *list );
- QFileInfo *cfi;
-
- while ((cfi=it.current()))
- {
- if (exclDict==0 || exclDict->find(cfi->absFilePath())==0)
- { // file should not be excluded
- //printf("killDict->find(%s)\n",cfi->absFilePath().data());
- if (!cfi->exists() || !cfi->isReadable())
- {
- if (errorIfNotExist)
- {
- err("Error: 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())==0)
- )
- {
- totalSize+=cfi->size()+cfi->absFilePath().length()+4;
- QCString name=convertToQCString(cfi->fileName());
- //printf("New file %s\n",name.data());
- if (fnDict)
- {
- FileDef *fd=new FileDef(cfi->dirPath()+"/",name);
- FileName *fn=0;
- if (!name.isEmpty() && (fn=(*fnDict)[name]))
- {
- fn->append(fd);
- }
- else
- {
- fn = new FileName(cfi->absFilePath(),name);
- fn->append(fd);
- if (fnList) fnList->inSort(fn);
- fnDict->insert(name,fn);
- }
- }
- QCString *rs=0;
- if (resultList || resultDict)
- {
- rs=new QCString(cfi->absFilePath());
- }
- if (resultList) resultList->append(rs);
- if (resultDict) resultDict->insert(cfi->absFilePath(),rs);
- if (killDict) killDict->insert(cfi->absFilePath(),(void *)0x8);
- }
- else if (recursive &&
- (!Config_getBool("EXCLUDE_SYMLINKS") || !cfi->isSymLink()) &&
- cfi->isDir() && cfi->fileName()!="." &&
- cfi->fileName()!="..")
- {
- cfi->setFile(cfi->absFilePath());
- totalSize+=readDir(cfi,fnList,fnDict,exclDict,
- patList,exclPatList,resultList,resultDict,errorIfNotExist,
- recursive,killDict);
- }
- }
- ++it;
- }
- return totalSize;
-}
-
-
-//----------------------------------------------------------------------------
-// read a file or all files in a directory and append their contents to the
-// input string. The names of the files are appended to the `fiList' list.
-
-static int readFileOrDirectory(const char *s,
- FileNameList *fnList,
- FileNameDict *fnDict,
- StringDict *exclDict,
- QStrList *patList,
- QStrList *exclPatList,
- StringList *resultList,
- StringDict *resultDict,
- bool recursive,
- bool errorIfNotExist=TRUE,
- QDict<void> *killDict = 0
- )
-{
- //printf("killDict=%p count=%d\n",killDict,killDict->count());
- // strip trailing slashes
- QCString fs = s;
- char lc = fs.at(fs.length()-1);
- if (lc=='/' || lc=='\\') fs = fs.left(fs.length()-1);
-
- QFileInfo fi(fs);
- //printf("readFileOrDirectory(%s)\n",s);
- int totalSize=0;
- {
- if (exclDict==0 || exclDict->find(fi.absFilePath())==0)
- {
- if (!fi.exists() || !fi.isReadable())
- {
- if (errorIfNotExist)
- {
- err("Error: source %s is not a readable file or directory... skipping.\n",s);
- }
- }
- else if (!Config_getBool("EXCLUDE_SYMLINKS") || !fi.isSymLink())
- {
- if (fi.isFile())
- {
- //printf("killDict->find(%s)\n",fi.absFilePath().data());
- if (killDict==0 || killDict->find(fi.absFilePath())==0)
- {
- totalSize+=fi.size()+fi.absFilePath().length()+4; //readFile(&fi,fiList,input);
- //fiList->inSort(new FileInfo(fi));
- QCString name=convertToQCString(fi.fileName());
- //printf("New file %s\n",name.data());
- if (fnDict)
- {
- FileDef *fd=new FileDef(fi.dirPath(TRUE)+"/",name);
- FileName *fn=0;
- if (!name.isEmpty() && (fn=(*fnDict)[name]))
- {
- fn->append(fd);
- }
- else
- {
- fn = new FileName(fi.absFilePath(),name);
- fn->append(fd);
- if (fnList) fnList->inSort(fn);
- fnDict->insert(name,fn);
- }
- }
- QCString *rs=0;
- if (resultList || resultDict)
- {
- rs=new QCString(fi.absFilePath());
- if (resultList) resultList->append(rs);
- if (resultDict) resultDict->insert(fi.absFilePath(),rs);
- }
-
- if (killDict) killDict->insert(fi.absFilePath(),(void *)0x8);
- }
- }
- else if (fi.isDir()) // readable dir
- {
- totalSize+=readDir(&fi,fnList,fnDict,exclDict,patList,
- exclPatList,resultList,resultDict,errorIfNotExist,
- recursive,killDict);
- }
- }
- }
- }
- return totalSize;
-}
-
-//----------------------------------------------------------------------------
-
-static void readFormulaRepository()
-{
- QFile f(Config_getString("HTML_OUTPUT")+"/formula.repository");
- if (f.open(IO_ReadOnly)) // open repository
- {
- msg("Reading formula repository...\n");
- QTextStream t(&f);
- QCString line;
- while (!t.eof())
- {
- line=t.readLine();
- int se=line.find(':'); // find name and text separator.
- if (se==-1)
- {
- err("Error: formula.repository is corrupted!\n");
- break;
- }
- else
- {
- QCString formName = line.left(se);
- QCString formText = line.right(line.length()-se-1);
- Formula *f=new Formula(formText);
- Doxygen::formulaList.append(f);
- Doxygen::formulaDict.insert(formText,f);
- Doxygen::formulaNameDict.insert(formName,f);
- }
- }
- }
-}
-
-//----------------------------------------------------------------------------
-
-static QDict<void> aliasesProcessed;
-
-static QCString expandAliasesRec(const QCString s)
-{
- QCString result;
- static QRegExp cmdPat("[\\\\@][a-z_A-Z][a-z_A-Z0-9]*");
- QCString value=s;
- int i,p=0,l;
- while ((i=cmdPat.match(value,p,&l))!=-1)
- {
- result+=value.mid(p,i-p);
- QCString cmd=value.mid(i+1,l-1);
- //printf("Found command '%s'\n",cmd.data());
- QCString *aliasText=Doxygen::aliasDict.find(cmd);
- if (aliasesProcessed.find(cmd)==0 && aliasText) // expand the alias
- {
- aliasesProcessed.insert(cmd,(void *)0x8);
- result+=expandAliasesRec(*aliasText);
- aliasesProcessed.remove(cmd);
- }
- else // command is not an alias
- {
- result+=value.mid(i,l);
- }
- p=i+l;
- }
- result+=value.right(value.length()-p);
-
- //printf("expandAliases '%s'->'%s'\n",s.data(),result.data());
- return result;
-}
-
-static void expandAliases()
-{
- QDictIterator<QCString> adi(Doxygen::aliasDict);
- QCString *s;
- for (adi.toFirst();(s=adi.current());++adi)
- {
- aliasesProcessed.clear();
- // avoid expanding this command recursively
- aliasesProcessed.insert(adi.currentKey(),(void *)0x8);
- // expand embedded commands
- *s = expandAliasesRec(*s);
- }
-}
-
-//----------------------------------------------------------------------------
-
-static void escapeAliases()
-{
- QDictIterator<QCString> adi(Doxygen::aliasDict);
- QCString *s;
- for (adi.toFirst();(s=adi.current());++adi)
- {
- QCString value=*s,newValue;
- int in,p=0;
- // for each \n in the alias command value
- while ((in=value.find("\\n",p))!=-1)
- {
- 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)!="\\name" &&
- value.mid(in,10)!="\\namespace" &&
- value.mid(in,14)!="\\nosubgrouping"
- )
- {
- newValue+="\\_linebr ";
- }
- else
- {
- newValue+="\\n";
- }
- p=in+2;
- }
- newValue+=value.mid(p,value.length()-p);
- *s=newValue;
- //printf("Alias %s has value %s\n",adi.currentKey().data(),s->data());
- }
-}
-
-//----------------------------------------------------------------------------
-
-static void readAliases()
-{
- // add aliases to a dictionary
- Doxygen::aliasDict.setAutoDelete(TRUE);
- QStrList &aliasList = Config_getList("ALIASES");
- const char *s=aliasList.first();
- while (s)
- {
- if (Doxygen::aliasDict[s]==0)
- {
- QCString alias=s;
- int i=alias.find('=');
- if (i>0)
- {
- QCString name=alias.left(i).stripWhiteSpace();
- QCString value=alias.right(alias.length()-i-1);
- //printf("Alias: found name=`%s' value=`%s'\n",name.data(),value.data());
- if (!name.isEmpty())
- {
- QCString *dn=Doxygen::aliasDict[name];
- if (dn==0) // insert new alias
- {
- Doxygen::aliasDict.insert(name,new QCString(value));
- }
- else // overwrite previous alias
- {
- *dn=value;
- }
- }
- }
- }
- s=aliasList.next();
- }
- expandAliases();
- escapeAliases();
- aliasesProcessed.clear();
-}
-
-//----------------------------------------------------------------------------
-// print the usage of doxygen
-
-static void usage(const char *name)
-{
- msg("Doxygen version %s\nCopyright Dimitri van Heesch 1997-2005\n\n",versionString);
- msg("You can use doxygen in a number of ways:\n\n");
- msg("1) Use doxygen to generate a template configuration file:\n");
- msg(" %s [-s] -g [configName]\n\n",name);
- msg(" If - is used for configName doxygen will write to standard output.\n\n");
- msg("2) Use doxygen to update an old configuration file:\n");
- msg(" %s [-s] -u [configName]\n\n",name);
- msg("3) Use doxygen to generate documentation using an existing ");
- msg("configuration file:\n");
- msg(" %s [configName]\n\n",name);
- msg(" If - is used for configName doxygen will read from standard input.\n\n");
- msg("4) Use doxygen to generate a template style sheet file for RTF, HTML or Latex.\n");
- msg(" RTF: %s -w rtf styleSheetFile\n",name);
- msg(" HTML: %s -w html headerFile footerFile styleSheetFile [configFile]\n",name);
- msg(" LaTeX: %s -w latex headerFile styleSheetFile [configFile]\n\n",name);
- msg("5) Use doxygen to generate an rtf extensions file\n");
- msg(" RTF: %s -e rtf extensionsFile\n\n",name);
- msg("If -s is specified the comments in the config file will be omitted.\n");
- msg("If configName is omitted `Doxyfile' will be used as a default.\n\n");
- exit(1);
-}
-
-//----------------------------------------------------------------------------
-// read the argument of option `c' from the comment argument list and
-// update the option index `optind'.
-
-static const char *getArg(int argc,char **argv,int &optind)
-{
- char *s=0;
- if (strlen(&argv[optind][2])>0)
- s=&argv[optind][2];
- else if (optind+1<argc && argv[optind+1][0]!='-')
- s=argv[++optind];
- return s;
-}
-
-//----------------------------------------------------------------------------
-
-extern void commentScanTest();
-
-void initDoxygen()
-{
-#if QT_VERSION >= 200
- setlocale(LC_ALL,"");
- setlocale(LC_NUMERIC,"C");
-#endif
- Doxygen::symbolMap = new SDict<DefinitionList>(1000);
- Doxygen::symbolMap->setAutoDelete(TRUE);
- Doxygen::globalScope = new NamespaceDef("<globalScope>",1,"<globalScope>");
-
- Doxygen::runningTime.start();
- initPreprocessor();
-
- ParserInterface *defaultParser = new CLanguageScanner;
- Doxygen::parserManager = new ParserManager(defaultParser);
- Doxygen::parserManager->registerParser(".py",new PythonLanguageScanner);
-
- // register any additional parsers here...
-
- Doxygen::sectionDict.setAutoDelete(TRUE);
- Doxygen::inputNameList.setAutoDelete(TRUE);
- Doxygen::memberNameSDict.setAutoDelete(TRUE);
- Doxygen::functionNameSDict.setAutoDelete(TRUE);
- Doxygen::hiddenClasses.setAutoDelete(TRUE);
- Doxygen::classSDict.setAutoDelete(TRUE);
- Doxygen::pageSDict->setAutoDelete(TRUE);
- Doxygen::exampleSDict->setAutoDelete(TRUE);
- excludeNameDict.setAutoDelete(TRUE);
- Doxygen::memGrpInfoDict.setAutoDelete(TRUE);
- Doxygen::tagDestinationDict.setAutoDelete(TRUE);
- Doxygen::lookupCache.setAutoDelete(TRUE);
- Doxygen::directories.setAutoDelete(TRUE);
- Doxygen::dirRelations.setAutoDelete(TRUE);
-}
-
-void cleanUpDoxygen()
-{
- delete Doxygen::inputNameDict;
- delete Doxygen::includeNameDict;
- delete Doxygen::exampleNameDict;
- delete Doxygen::imageNameDict;
- delete Doxygen::dotFileNameDict;
- delete Doxygen::mainPage;
- delete Doxygen::pageSDict;
- delete Doxygen::exampleSDict;
- delete Doxygen::globalScope;
- delete Doxygen::xrefLists;
- delete Doxygen::parserManager;
- cleanUpPreprocessor();
- Config::deleteInstance();
- QTextCodec::deleteAllCodecs();
- delete theTranslator;
- delete outputList;
- Mappers::freeMappers();
- //delete Doxygen::symbolMap; <- we cannot do this unless all static lists
- // (such as Doxygen::namespaceSDict)
- // with objects based on Definition are made
- // dynamic first
-}
-
-void readConfiguration(int argc, char **argv)
-{
- /**************************************************************************
- * Handle arguments *
- **************************************************************************/
-
- int optind=1;
- const char *configName=0;
- const char *debugLabel;
- const char *formatName;
- bool genConfig=FALSE;
- bool shortList=FALSE;
- bool updateConfig=FALSE;
- while (optind<argc && argv[optind][0]=='-' &&
- (isalpha(argv[optind][1]) || argv[optind][1]=='?' ||
- argv[optind][1]=='-')
- )
- {
- switch(argv[optind][1])
- {
- case 'g':
- genConfig=TRUE;
- configName=getArg(argc,argv,optind);
- if (strcmp(argv[optind+1],"-")==0)
- { configName="-"; optind++; }
- if (!configName)
- { configName="Doxyfile"; }
- break;
- case 'd':
- debugLabel=getArg(argc,argv,optind);
- Debug::setFlag(debugLabel);
- break;
- case 's':
- shortList=TRUE;
- break;
- case 'u':
- updateConfig=TRUE;
- break;
- case 'e':
- formatName=getArg(argc,argv,optind);
- if (!formatName)
- {
- err("Error:option -e is missing format specifier rtf.\n");
- cleanUpDoxygen();
- exit(1);
- }
- if (stricmp(formatName,"rtf")==0)
- {
- if (optind+1>=argc)
- {
- err("Error: option \"-e rtf\" is missing an extensions file name\n");
- cleanUpDoxygen();
- exit(1);
- }
- QFile f;
- if (openOutputFile(argv[optind+1],f))
- {
- RTFGenerator::writeExtensionsFile(f);
- }
- cleanUpDoxygen();
- exit(1);
- }
- err("Error: option \"-e\" has invalid format specifier.\n");
- cleanUpDoxygen();
- exit(1);
- break;
- case 'w':
- formatName=getArg(argc,argv,optind);
- if (!formatName)
- {
- err("Error: option -w is missing format specifier rtf, html or latex\n");
- cleanUpDoxygen();
- exit(1);
- }
- if (stricmp(formatName,"rtf")==0)
- {
- if (optind+1>=argc)
- {
- err("Error: option \"-w rtf\" is missing a style sheet file name\n");
- cleanUpDoxygen();
- exit(1);
- }
- QFile f;
- if (openOutputFile(argv[optind+1],f))
- {
- RTFGenerator::writeStyleSheetFile(f);
- }
- cleanUpDoxygen();
- exit(1);
- }
- else if (stricmp(formatName,"html")==0)
- {
- if (optind+4<argc)
- {
- if (!Config::instance()->parse(argv[optind+4]))
- {
- err("Error opening or reading configuration file %s!\n",argv[optind+4]);
- cleanUpDoxygen();
- exit(1);
- }
- Config::instance()->substituteEnvironmentVars();
- Config::instance()->convertStrToVal();
- Config::instance()->check();
- }
- else
- {
- Config::instance()->init();
- }
- if (optind+3>=argc)
- {
- err("Error: option \"-w html\" does not have enough arguments\n");
- cleanUpDoxygen();
- exit(1);
- }
-
- QCString outputLanguage=Config_getEnum("OUTPUT_LANGUAGE");
- if (!setTranslator(outputLanguage))
- {
- err("Error: Output language %s not supported! Using English instead.\n", outputLanguage.data());
- }
-
- QFile f;
- if (openOutputFile(argv[optind+1],f))
- {
- HtmlGenerator::writeHeaderFile(f);
- }
- f.close();
- if (openOutputFile(argv[optind+2],f))
- {
- HtmlGenerator::writeFooterFile(f);
- }
- f.close();
- if (openOutputFile(argv[optind+3],f))
- {
- HtmlGenerator::writeStyleSheetFile(f);
- }
- cleanUpDoxygen();
- exit(0);
- }
- else if (stricmp(formatName,"latex")==0)
- {
- if (optind+3<argc) // use config file to get settings
- {
- if (!Config::instance()->parse(argv[optind+3]))
- {
- err("Error opening or reading configuration file %s!\n",argv[optind+3]);
- exit(1);
- }
- Config::instance()->substituteEnvironmentVars();
- Config::instance()->convertStrToVal();
- Config::instance()->check();
- }
- else // use default config
- {
- Config::instance()->init();
- }
- if (optind+2>=argc)
- {
- err("Error: option \"-w latex\" does not have enough arguments\n");
- cleanUpDoxygen();
- exit(1);
- }
-
- QCString outputLanguage=Config_getEnum("OUTPUT_LANGUAGE");
- if (!setTranslator(outputLanguage))
- {
- err("Error: Output language %s not supported! Using English instead.\n", outputLanguage.data());
- }
-
- QFile f;
- if (openOutputFile(argv[optind+1],f))
- {
- LatexGenerator::writeHeaderFile(f);
- }
- f.close();
- if (openOutputFile(argv[optind+2],f))
- {
- LatexGenerator::writeStyleSheetFile(f);
- }
- cleanUpDoxygen();
- exit(0);
- }
- else
- {
- err("Error: Illegal format specifier %s: should be one of rtf, html, or latex\n",formatName);
- cleanUpDoxygen();
- exit(1);
- }
- break;
- case '-':
- if (strcmp(&argv[optind][2],"help")==0)
- {
- usage(argv[0]);
- }
- else if (strcmp(&argv[optind][2],"version")==0)
- {
- msg("%s\n",versionString);
- cleanUpDoxygen();
- exit(0);
- }
- break;
- case 'b':
- setvbuf(stdout,NULL,_IONBF,0);
- Doxygen::outputToWizard=TRUE;
- break;
- case 'h':
- case '?':
- usage(argv[0]);
- break;
- default:
- err("Unknown option -%c\n",argv[optind][1]);
- usage(argv[0]);
- }
- optind++;
- }
-
- /**************************************************************************
- * Parse or generate the config file *
- **************************************************************************/
-
- Config::instance()->init();
-
- if (genConfig)
- {
- generateConfigFile(configName,shortList);
- cleanUpDoxygen();
- exit(0);
- }
-
- QFileInfo configFileInfo1("Doxyfile"),configFileInfo2("doxyfile");
- if (optind>=argc)
- {
- if (configFileInfo1.exists())
- {
- configName="Doxyfile";
- }
- else if (configFileInfo2.exists())
- {
- configName="doxyfile";
- }
- else
- {
- err("Doxyfile not found and no input file specified!\n");
- usage(argv[0]);
- }
- }
- else
- {
- QFileInfo fi(argv[optind]);
- if (fi.exists() || strcmp(argv[optind],"-")==0)
- {
- configName=argv[optind];
- }
- else
- {
- err("Error: configuration file %s not found!\n",argv[optind]);
- usage(argv[0]);
- }
- }
-
-
- if (!Config::instance()->parse(configName))
- {
- err("Error: could not open or read configuration file %s!\n",configName);
- cleanUpDoxygen();
- exit(1);
- }
-
- if (updateConfig)
- {
- generateConfigFile(configName,shortList,TRUE);
- cleanUpDoxygen();
- exit(0);
- }
-
- Config::instance()->substituteEnvironmentVars();
- Config::instance()->convertStrToVal();
- Config::instance()->check();
-
- initWarningFormat();
-
- QCString outputLanguage=Config_getEnum("OUTPUT_LANGUAGE");
- if (!setTranslator(outputLanguage))
- {
- err("Error: Output language %s not supported! Using English instead.\n",
- outputLanguage.data());
- }
- QStrList &includePath = Config_getList("INCLUDE_PATH");
- char *s=includePath.first();
- while (s)
- {
- QFileInfo fi(s);
- addSearchDir(fi.absFilePath());
- s=includePath.next();
- }
-
- /* Set the global html file extension. */
- Doxygen::htmlFileExtension = Config_getString("HTML_FILE_EXTENSION");
-
- /* Perlmod wants to know the path to the config file.*/
- QFileInfo configFileInfo(configName);
- setPerlModDoxyfile(configFileInfo.absFilePath());
-
- Doxygen::xrefLists->setAutoDelete(TRUE);
-
-}
-
-void parseInput()
-{
- 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::dotFileNameDict = new FileNameDict(257);
-
- /**************************************************************************
- * Initialize some global constants
- **************************************************************************/
-
- int &tabSize = Config_getInt("TAB_SIZE");
- spaces.resize(tabSize+1);
- int sp;for (sp=0;sp<tabSize;sp++) spaces.at(sp)=' ';
- spaces.at(tabSize)='\0';
-
- compoundKeywordDict.insert("template class",(void *)8);
- compoundKeywordDict.insert("template struct",(void *)8);
- compoundKeywordDict.insert("class",(void *)8);
- compoundKeywordDict.insert("struct",(void *)8);
- compoundKeywordDict.insert("union",(void *)8);
- compoundKeywordDict.insert("interface",(void *)8);
- compoundKeywordDict.insert("exception",(void *)8);
-
- bool alwaysRecursive = Config_getBool("RECURSIVE");
-
- /**************************************************************************
- * Read and preprocess input *
- **************************************************************************/
-
- // gather names of all files in the include path
- msg("Searching for include files...\n");
- 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,
- &Config_getList("EXCLUDE_PATTERNS"),0,0,
- alwaysRecursive);
- s=includePathList.next();
- }
-
- msg("Searching for example files...\n");
- 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")));
- s=examplePathList.next();
- }
-
- msg("Searching for images...\n");
- QStrList &imagePathList=Config_getList("IMAGE_PATH");
- s=imagePathList.first();
- while (s)
- {
- readFileOrDirectory(s,0,Doxygen::imageNameDict,0,0,
- 0,0,0,
- alwaysRecursive);
- s=imagePathList.next();
- }
-
- msg("Searching for dot files...\n");
- QStrList &dotFileList=Config_getList("DOTFILE_DIRS");
- s=dotFileList.first();
- while (s)
- {
- readFileOrDirectory(s,0,Doxygen::dotFileNameDict,0,0,
- 0,0,0,
- alwaysRecursive);
- s=dotFileList.next();
- }
-
- msg("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();
- }
-
- /**************************************************************************
- * Determine Input Files *
- **************************************************************************/
-
- msg("Reading input files...\n");
- QDict<void> *killDict = new QDict<void>(10007);
- int inputSize=0;
- QStrList &inputList=Config_getList("INPUT");
- inputFiles.setAutoDelete(TRUE);
- s=inputList.first();
- while (s)
- {
- QCString path=s;
- uint l = path.length();
- // strip trailing slashes
- if (path.at(l-1)=='\\' || path.at(l-1)=='/') path=path.left(l-1);
-
- inputSize+=readFileOrDirectory(
- path,&Doxygen::inputNameList,
- Doxygen::inputNameDict,&excludeNameDict,
- &Config_getList("FILE_PATTERNS"),
- &Config_getList("EXCLUDE_PATTERNS"),
- &inputFiles,0,
- alwaysRecursive,
- TRUE,
- killDict);
- s=inputList.next();
- }
- delete killDict;
-
- // add predefined macro name to a dictionary
- QStrList &expandAsDefinedList =Config_getList("EXPAND_AS_DEFINED");
- s=expandAsDefinedList.first();
- while (s)
- {
- if (Doxygen::expandAsDefinedDict[s]==0)
- {
- Doxygen::expandAsDefinedDict.insert(s,(void *)666);
- }
- s=expandAsDefinedList.next();
- }
-
- // read aliases and store them in a dictionary
- readAliases();
-
- /**************************************************************************
- * Handle Tag Files *
- **************************************************************************/
-
- Entry *root=new Entry;
- msg("Reading and parsing tag files\n");
-
- QStrList &tagFileList = Config_getList("TAGFILES");
- s=tagFileList.first();
- while (s)
- {
- readTagFile(root,s);
- s=tagFileList.next();
- }
-
- /**************************************************************************
- * Check/create output directorties *
- **************************************************************************/
-
- QCString &outputDirectory = Config_getString("OUTPUT_DIRECTORY");
- if (outputDirectory.isEmpty())
- {
- outputDirectory=QDir::currentDirPath();
- }
- else
- {
- QDir dir(outputDirectory);
- if (!dir.exists())
- {
- dir.setPath(QDir::currentDirPath());
- if (!dir.mkdir(outputDirectory))
- {
- err("Error: tag OUTPUT_DIRECTORY: Output directory `%s' does not "
- "exist and cannot be created\n",outputDirectory.data());
- delete root;
- cleanUpDoxygen();
- exit(1);
- }
- else if (!Config_getBool("QUIET"))
- {
- err("Notice: Output directory `%s' does not exist. "
- "I have created it for you.\n", outputDirectory.data());
- }
- dir.cd(outputDirectory);
- }
- outputDirectory=dir.absPath();
- }
-
- QCString &htmlOutput = Config_getString("HTML_OUTPUT");
- bool &generateHtml = Config_getBool("GENERATE_HTML");
- if (htmlOutput.isEmpty() && generateHtml)
- {
- htmlOutput=outputDirectory+"/html";
- }
- else if (htmlOutput && htmlOutput[0]!='/' && htmlOutput[1]!=':')
- {
- htmlOutput.prepend(outputDirectory+'/');
- }
- QDir htmlDir(htmlOutput);
- if (generateHtml && !htmlDir.exists() && !htmlDir.mkdir(htmlOutput))
- {
- err("Could not create output directory %s\n",htmlOutput.data());
- delete root;
- cleanUpDoxygen();
- exit(1);
- }
-
- QCString &xmlOutput = Config_getString("XML_OUTPUT");
- bool &generateXml = Config_getBool("GENERATE_XML");
- if (xmlOutput.isEmpty() && generateXml)
- {
- xmlOutput=outputDirectory+"/xml";
- }
- else if (xmlOutput && xmlOutput[0]!='/' && xmlOutput[1]!=':')
- {
- xmlOutput.prepend(outputDirectory+'/');
- }
- QDir xmlDir(xmlOutput);
- if (generateXml && !xmlDir.exists() && !xmlDir.mkdir(xmlOutput))
- {
- err("Could not create output directory %s\n",xmlOutput.data());
- delete root;
- cleanUpDoxygen();
- exit(1);
- }
-
- QCString &latexOutput = Config_getString("LATEX_OUTPUT");
- bool &generateLatex = Config_getBool("GENERATE_LATEX");
- if (latexOutput.isEmpty() && generateLatex)
- {
- latexOutput=outputDirectory+"/latex";
- }
- else if (latexOutput && latexOutput[0]!='/' && latexOutput[1]!=':')
- {
- latexOutput.prepend(outputDirectory+'/');
- }
- QDir latexDir(latexOutput);
- if (generateLatex && !latexDir.exists() && !latexDir.mkdir(latexOutput))
- {
- err("Could not create output directory %s\n",latexOutput.data());
- delete root;
- cleanUpDoxygen();
- exit(1);
- }
-
- QCString &rtfOutput = Config_getString("RTF_OUTPUT");
- bool &generateRtf = Config_getBool("GENERATE_RTF");
- if (rtfOutput.isEmpty() && generateRtf)
- {
- rtfOutput=outputDirectory+"/rtf";
- }
- else if (rtfOutput && rtfOutput[0]!='/' && rtfOutput[1]!=':')
- {
- rtfOutput.prepend(outputDirectory+'/');
- }
- QDir rtfDir(rtfOutput);
- if (generateRtf && !rtfDir.exists() && !rtfDir.mkdir(rtfOutput))
- {
- err("Could not create output directory %s\n",rtfOutput.data());
- delete root;
- cleanUpDoxygen();
- exit(1);
- }
-
- QCString &manOutput = Config_getString("MAN_OUTPUT");
- bool &generateMan = Config_getBool("GENERATE_MAN");
- if (manOutput.isEmpty() && generateMan)
- {
- manOutput=outputDirectory+"/man";
- }
- else if (manOutput && manOutput[0]!='/' && manOutput[1]!=':')
- {
- manOutput.prepend(outputDirectory+'/');
- }
- QDir manDir(manOutput);
- if (generateMan && !manDir.exists() && !manDir.mkdir(manOutput))
- {
- err("Could not create output directory %s\n",manOutput.data());
- delete root;
- cleanUpDoxygen();
- exit(1);
- }
-
- // Notice: the order of the function calls below is very important!
-
- if (Config_getBool("GENERATE_HTML"))
- {
- readFormulaRepository();
- }
-
- parseFiles(root);
-
- /**************************************************************************
- * Gather information *
- **************************************************************************/
-
- msg("Building group list...\n");
- buildGroupList(root);
- organizeSubGroups(root);
-
- msg("Building directory list...\n");
- buildDirectories();
- findDirDocumentation(root);
-
- if (Config_getBool("BUILTIN_STL_SUPPORT"))
- {
- addSTLClasses(root);
- }
-
- msg("Building namespace list...\n");
- buildNamespaceList(root);
- findUsingDirectives(root);
-
- msg("Building file list...\n");
- buildFileList(root);
- //generateFileTree();
-
- msg("Searching for included using directives...\n");
- findIncludedUsingDirectives();
-
- msg("Building class list...\n");
- buildClassList(root);
-
- msg("Associating documentation with classes...\n");
- buildClassDocList(root);
-
- msg("Computing nesting relations for classes...\n");
- resolveClassNestingRelations();
- // calling buildClassList may result in cached relations that
- // become invalid after resolveClassNestingRelation(), that's why
- // we need to clear the cache here
- Doxygen::lookupCache.clear();
-
- msg("Searching for members imported via using declarations...\n");
- findUsingDeclImports(root);
- findUsingDeclarations(root);
-
- msg("Building example list...\n");
- buildExampleList(root);
-
- msg("Searching for documented variables...\n");
- buildVarList(root);
-
- msg("Building member list...\n"); // using class info only !
- buildFunctionList(root);
-
- msg("Searching for friends...\n");
- findFriends();
-
- msg("Searching for documented defines...\n");
- findDefineDocumentation(root);
-
- msg("Computing template instances...\n");
- findClassEntries(root);
- findInheritedTemplateInstances();
- findUsedTemplateInstances();
-
- msg("Flushing cached template relations that have become invalid...\n");
- flushCachedTemplateRelations();
-
- msg("Creating members for template instances...\n");
- createTemplateInstanceMembers();
-
- msg("Computing class relations...\n");
- computeTemplateClassRelations();
- computeClassRelations();
- classEntries.clear();
-
- msg("Searching for enumerations...\n");
- findEnums(root);
- findEnumDocumentation(root);
-
- msg("Searching for member function documentation...\n");
- findObjCMethodDefinitions(root);
- findMemberDocumentation(root); // may introduce new members !
- transferRelatedFunctionDocumentation();
- transferFunctionDocumentation();
-
- msg("Building page list...\n");
- buildPageList(root);
-
- msg("Search for main page...\n");
- findMainPage(root);
-
- msg("Computing page relations...\n");
- computePageRelations(root);
- checkPageRelations();
-
- msg("Sorting lists...\n");
- Doxygen::memberNameSDict.sort();
- Doxygen::functionNameSDict.sort();
- Doxygen::hiddenClasses.sort();
- Doxygen::classSDict.sort();
-
- msg("Freeing entry tree\n");
- delete root;
-
- msg("Determining which enums are documented\n");
- findDocumentedEnumValues();
-
- msg("Computing member relations...\n");
- computeMemberRelations();
-
- msg("Building full member lists recursively...\n");
- buildCompleteMemberLists();
-
- msg("Adding members to member groups.\n");
- addMembersToMemberGroup();
-
- if (Config_getBool("DISTRIBUTE_GROUP_DOC"))
- {
- msg("Distributing member group documentation.\n");
- distributeMemberGroupDocumentation();
- }
-
- msg("Computing member references...\n");
- computeMemberReferences();
-
- if (Config_getBool("INHERIT_DOCS"))
- {
- msg("Inheriting documentation...\n");
- inheritDocumentation();
- }
-
- // compute the shortest possible names of all files
- // without loosing the uniqueness of the file names.
- msg("Generating disk names...\n");
- Doxygen::inputNameList.generateDiskNames();
-
- msg("Adding source references...\n");
- addSourceReferences();
-
- msg("Adding todo/test/bug list items...\n");
- addListReferences();
-
- if (Config_getBool("SHOW_DIRECTORIES"))
- {
- msg("Computing dependencies between directories...\n");
- computeDirDependencies();
- }
-}
-
-void generateOutput()
-{
- /**************************************************************************
- * Initialize output generators *
- **************************************************************************/
-
- //// dump all symbols
- //SDict<DefinitionList>::Iterator sdi(Doxygen::symbolMap);
- //DefinitionList *dl;
- //for (sdi.toFirst();(dl=sdi.current());++sdi)
- //{
- // DefinitionListIterator dli(*dl);
- // Definition *d;
- // printf("Symbol: ");
- // for (dli.toFirst();(d=dli.current());++dli)
- // {
- // printf("%s ",d->qualifiedName().data());
- // }
- // printf("\n");
- //}
-
- initDocParser();
-
- //{
- // QCString fileName = Config_getString("HTML_OUTPUT")+"/filetree.html";
- // QFile f(fileName);
- // if (f.open(IO_WriteOnly))
- // {
- // QTextStream t(&f);
- // t << "<html>\n";
- // t << " <head>\n";
- // t << " <style type=\"text/css\">\n";
- // t << " <!--\n";
- // t << " .directory { font-size: 10pt; font-weight: bold; }\n";
- // t << " .directory h3 { margin: 0px; margin-top: 1em; font-size: 11pt; }\n";
- // t << " .directory p { margin: 0px; white-space: nowrap; }\n";
- // t << " .directory div { display: visible; margin: 0px; }\n";
- // t << " .directory img { vertical-align: middle; }\n";
- // t << " -->\n";
- // t << " </style>\n";
- // t << " </head>\n";
- // t << " <body>\n";
- // generateFileTree(t);
- // t << " </body>\n";
- // t << "</html>\n";
- // }
- //}
-
- outputList = new OutputList(TRUE);
- if (Config_getBool("GENERATE_HTML"))
- {
- outputList->add(new HtmlGenerator);
- HtmlGenerator::init();
- if (Config_getBool("GENERATE_HTMLHELP")) HtmlHelp::getInstance()->initialize();
- if (Config_getBool("GENERATE_TREEVIEW")) FTVHelp::getInstance()->initialize();
- copyStyleSheet();
- }
- if (Config_getBool("GENERATE_LATEX"))
- {
- outputList->add(new LatexGenerator);
- LatexGenerator::init();
- }
- if (Config_getBool("GENERATE_MAN"))
- {
- outputList->add(new ManGenerator);
- ManGenerator::init();
- }
- if (Config_getBool("GENERATE_RTF"))
- {
- outputList->add(new RTFGenerator);
- RTFGenerator::init();
- }
-
- if (Config_getBool("USE_HTAGS"))
- {
- Htags::useHtags = TRUE;
- QCString htmldir = Config_getString("HTML_OUTPUT");
- if (!Htags::execute(htmldir))
- err("Error: USE_HTAGS is YES but htags(1) failed. \n");
- if (!Htags::loadFilemap(htmldir))
- err("Error: htags(1) ended normally but failed to load the filemap. \n");
- }
-
- /**************************************************************************
- * Generate documentation *
- **************************************************************************/
-
- QFile *tag=0;
- QCString &generateTagFile = Config_getString("GENERATE_TAGFILE");
- if (!generateTagFile.isEmpty())
- {
- tag=new QFile(generateTagFile);
- if (!tag->open(IO_WriteOnly))
- {
- err("Error: cannot open tag file %s for writing\n",
- generateTagFile.data()
- );
- cleanUpDoxygen();
- exit(1);
- }
- Doxygen::tagFile.setDevice(tag);
- Doxygen::tagFile.setEncoding(QTextStream::Latin1);
- Doxygen::tagFile << "<?xml version='1.0' encoding='ISO-8859-1' standalone='yes' ?>" << endl;
- Doxygen::tagFile << "<tagfile>" << endl;
- }
-
- if (Config_getBool("GENERATE_HTML")) writeDoxFont(Config_getString("HTML_OUTPUT"));
- if (Config_getBool("GENERATE_LATEX")) writeDoxFont(Config_getString("LATEX_OUTPUT"));
- if (Config_getBool("GENERATE_RTF")) writeDoxFont(Config_getString("RTF_OUTPUT"));
-
- msg("Generating style sheet...\n");
- //printf("writing style info\n");
- outputList->writeStyleInfo(0); // write first part
- outputList->disableAllBut(OutputGenerator::Latex);
- outputList->parseText(
- theTranslator->trGeneratedAt(dateToString(TRUE),Config_getString("PROJECT_NAME"))
- );
- outputList->writeStyleInfo(1); // write second part
- //parseText(*outputList,theTranslator->trWrittenBy());
- outputList->writeStyleInfo(2); // write third part
- outputList->parseText(
- theTranslator->trGeneratedAt(dateToString(TRUE),Config_getString("PROJECT_NAME"))
- );
- outputList->writeStyleInfo(3); // write fourth part
- //parseText(*outputList,theTranslator->trWrittenBy());
- outputList->writeStyleInfo(4); // write last part
- outputList->enableAll();
-
- //statistics();
-
- // count the number of documented elements in the lists we have built.
- // If the result is 0 we do not generate the lists and omit the
- // corresponding links in the index.
- msg("Counting data structures...\n");
- countDataStructures();
-
- msg("Resolving user defined references...\n");
- resolveUserReferences();
-
- msg("Combining using relations...\n");
- combineUsingRelations();
-
- msg("Finding anchors and sections in the documentation...\n");
- findSectionsInDocumentation();
-
- msg("Generating index page...\n");
- writeIndex(*outputList);
-
- msg("Generating file index...\n");
- writeFileIndex(*outputList);
-
- msg("Generating example documentation...\n");
- generateExampleDocs();
-
- msg("Generating file sources...\n");
- if (!Htags::useHtags)
- {
- generateFileSources();
- }
- transferFunctionReferences();
-
- msg("Generating file documentation...\n");
- generateFileDocs();
-
- msg("Generating class documentation...\n");
- generateClassDocs();
-
- msg("Generating page documentation...\n");
- generatePageDocs();
-
- msg("Generating group documentation...\n");
- generateGroupDocs();
-
- if (Config_getBool("SHOW_DIRECTORIES"))
- {
- msg("Generating directory documentation...\n");
- generateDirDocs(*outputList);
- }
-
- msg("Generating namespace index...\n");
- generateNamespaceDocs();
-
- msg("Generating group index...\n");
- writeGroupIndex(*outputList);
-
- if (Config_getBool("SHOW_DIRECTORIES"))
- {
- msg("Generating directory index...\n");
- writeDirIndex(*outputList);
- }
-
- msg("Generating example index...\n");
- writeExampleIndex(*outputList);
-
- msg("Generating file member index...\n");
- writeFileMemberIndex(*outputList);
-
- msg("Generating namespace member index...\n");
- writeNamespaceMemberIndex(*outputList);
-
- msg("Generating page index...\n");
- writePageIndex(*outputList);
-
- if (Config_getBool("GENERATE_LEGEND"))
- {
- msg("Generating graph info page...\n");
- writeGraphInfo(*outputList);
- }
-
- //writeDirDependencyGraph(Config_getString("HTML_OUTPUT"));
-
- if (Config_getBool("GENERATE_RTF"))
- {
- msg("Combining RTF output...\n");
- if (!RTFGenerator::preProcessFileInplace(Config_getString("RTF_OUTPUT"),"refman.rtf"))
- {
- err("An error occurred during post-processing the RTF files!\n");
- }
- }
-
- if (Config_getBool("HAVE_DOT") && Config_getBool("GRAPHICAL_HIERARCHY"))
- {
- msg("Generating graphical class hierarchy...\n");
- writeGraphicalClassHierarchy(*outputList);
- }
-
- if (Doxygen::formulaList.count()>0 && Config_getBool("GENERATE_HTML"))
- {
- msg("Generating bitmaps for formulas in HTML...\n");
- Doxygen::formulaList.generateBitmaps(Config_getString("HTML_OUTPUT"));
- }
-
- if (Config_getBool("GENERATE_HTML") && Config_getBool("GENERATE_HTMLHELP"))
- {
- HtmlHelp::getInstance()->finalize();
- }
- if (Config_getBool("GENERATE_HTML") && Config_getBool("GENERATE_TREEVIEW"))
- {
- FTVHelp::getInstance()->finalize();
- }
- if (!Config_getString("GENERATE_TAGFILE").isEmpty())
- {
- Doxygen::tagFile << "</tagfile>" << endl;
- delete tag;
- }
-
- if (Config_getBool("GENERATE_HTML") && Config_getBool("DOT_CLEANUP")) removeDoxFont(Config_getString("HTML_OUTPUT"));
- if (Config_getBool("GENERATE_RTF") && Config_getBool("DOT_CLEANUP")) removeDoxFont(Config_getString("RTF_OUTPUT"));
- if (Config_getBool("GENERATE_XML"))
- {
- msg("Generating XML output...\n");
- generateXML();
- }
- if (Config_getBool("GENERATE_AUTOGEN_DEF"))
- {
- msg("Generating AutoGen DEF output...\n");
- generateDEF();
- }
- if (Config_getBool("GENERATE_PERLMOD"))
- {
- msg("Generating Perl module output...\n");
- generatePerlMod();
- }
- if (Config_getBool("GENERATE_HTMLHELP") && !Config_getString("HHC_LOCATION").isEmpty())
- {
- msg("Running html help compiler...\n");
- QString oldDir = QDir::currentDirPath();
- QDir::setCurrent(Config_getString("HTML_OUTPUT"));
- if (iSystem(Config_getString("HHC_LOCATION"), "index.hhp", FALSE))
- {
- err("Error: failed to run html help compiler on index.hhp");
- }
- QDir::setCurrent(oldDir);
- }
- if (Config_getBool("SEARCHENGINE"))
- {
- msg("Generating search index\n");
- HtmlGenerator::writeSearchPage();
- Doxygen::searchIndex->write(Config_getString("HTML_OUTPUT")+"/search.idx");
- }
- 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,
- Doxygen::sysElapsedTime
- );
- }
- cleanUpDoxygen();
-}
-
diff --git a/src/doxygen.h b/src/doxygen.h
deleted file mode 100644
index dd6ae1f..0000000
--- a/src/doxygen.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 DOXYGEN_H
-#define DOXYGEN_H
-
-#include "qtbc.h"
-#include <qtextstream.h>
-#include <qdatetime.h>
-#include <qcache.h>
-#include "groupdef.h"
-#include "filedef.h"
-#include "classdef.h"
-#include "memberdef.h"
-#include "classlist.h"
-#include "membername.h"
-#include "filename.h"
-#include "namespacedef.h"
-#include "formula.h"
-#include "section.h"
-#include "membergroup.h"
-#include "reflist.h"
-#include "dirdef.h"
-
-class PageSList;
-class PageSDict;
-class PageDef;
-class SearchIndex;
-class DirDef;
-class ParserManager;
-
-typedef QList<QCString> StringList;
-typedef QDict<FileDef> FileDict;
-typedef QDict<GroupDef> GroupDict;
-
-class StringDict : public QDict<QCString>
-{
- public:
- StringDict(uint size=17) : QDict<QCString>(size) {}
- virtual ~StringDict() {}
-};
-
-struct LookupInfo
-{
- LookupInfo(ClassDef *cd=0,MemberDef *td=0,QCString ts="")
- : classDef(cd), typeDef(td), templSpec(ts) {}
- ClassDef *classDef;
- MemberDef *typeDef;
- QCString templSpec;
-};
-
-
-extern QCString spaces;
-
-/*! \brief This class serves as a namespace for global variables used by doxygen.
- *
- * All fields in this class are public and static, so they can be used directly.
- */
-class Doxygen
-{
- public:
- static ClassSDict classSDict;
- static ClassSDict hiddenClasses;
- static PageSDict *exampleSDict;
- static PageSDict *pageSDict;
- static PageDef *mainPage;
- static bool insideMainPage;
- static FileNameDict *includeNameDict;
- static FileNameDict *exampleNameDict;
- static FileNameDict *inputNameDict;
- static FileNameList inputNameList;
- static FileNameDict *imageNameDict;
- static FileNameDict *dotFileNameDict;
- static QStrList tagfileList;
- static MemberNameSDict memberNameSDict;
- static MemberNameSDict functionNameSDict;
- static FileList fileList;
- static FileDict fileDict;
- static ClassDef unrelatedClass;
- static QTextStream tagFile;
- static SectionDict sectionDict;
- static StringDict namespaceAliasDict;
- static GroupSDict groupSDict;
- static NamespaceSDict namespaceSDict;
- static FormulaList formulaList;
- static FormulaDict formulaDict;
- static FormulaDict formulaNameDict;
- 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 QCString htmlFileExtension;
- static bool parseSourcesNeeded;
- static double sysElapsedTime;
- static QTime runningTime;
- static SearchIndex *searchIndex;
- static SDict<DefinitionList> *symbolMap;
- static bool outputToWizard;
- static QDict<int> *htmlDirMap;
- static QCache<LookupInfo> lookupCache;
- static DirSDict directories;
- static SDict<DirRelation> dirRelations;
- static ParserManager *parserManager;
-};
-
-void initDoxygen();
-void readConfiguration(int argc, char **argv);
-void parseInput();
-void generateOutput();
-
-#define NEWMATCH
-
-#endif
diff --git a/src/doxygen.pro.in b/src/doxygen.pro.in
deleted file mode 100644
index 9ba5c44..0000000
--- a/src/doxygen.pro.in
+++ /dev/null
@@ -1,40 +0,0 @@
-#
-#
-#
-# Copyright (C) 1997-2005 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.
-#
-# TMake project file for doxygen
-
-TEMPLATE = app.t
-CONFIG = console warn_on $extraopts
-HEADERS = doxygen.h
-SOURCES = main.cpp
-unix:LIBS += -L../lib -ldoxygen -ldoxycfg -lqtools -lpng -lmd5
-win32:INCLUDEPATH += .
-win32-mingw:LIBS += -L../lib -ldoxygen -ldoxycfg -lqtools -lpng -lmd5
-win32-msvc:LIBS += qtools.lib png.lib md5.lib doxygen.lib doxycfg.lib shell32.lib
-win32-msvc:TMAKE_LFLAGS += /LIBPATH:..\lib
-win32-borland:LIBS += qtools.lib png.lib md5.lib doxygen.lib doxycfg.lib shell32.lib
-win32-borland:TMAKE_LFLAGS += -L..\lib -L$(BCB)\lib\psdk
-win32:TMAKE_CXXFLAGS += -DQT_NODLL
-win32-g++:LIBS = -L../lib -ldoxygen -ldoxycfg -lqtools -lpng -lmd5
-win32-g++:TMAKE_CXXFLAGS += -fno-exceptions -fno-rtti
-INCLUDEPATH += ../qtools ../libpng ../libmd5 .
-#win32-g++:INCLUDEPATH -= ../libpng
-DESTDIR = ../bin
-TARGET = doxygen
-unix:TARGETDEPS = ../lib/libdoxygen.a ../lib/libdoxycfg.a
-win32:TARGETDEPS = ..\lib\doxygen.lib ..\lib\doxycfg.lib
-win32-g++:TARGETDEPS = ../lib/libdoxygen.a ../lib/libdoxycfg.a
-win32-mingw:TARGETDEPS = ../lib/libdoxygen.a ../lib/libdoxycfg.a
-OBJECTS_DIR = ../objects
-
diff --git a/src/doxytag.l b/src/doxytag.l
deleted file mode 100644
index 8fcc88e..0000000
--- a/src/doxytag.l
+++ /dev/null
@@ -1,929 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-
-%{
-/*
- * includes
- */
-#include <stdio.h>
-#include <assert.h>
-#include <ctype.h>
-
-#include "qtbc.h"
-#include <qstrlist.h>
-#include <qfileinfo.h>
-#include <qfile.h>
-#include <qdict.h>
-#include <qtextstream.h>
-#include <qdir.h>
-
-#include "version.h"
-//#include "suffixtree.h"
-//#include "searchindex.h"
-#include "logos.h"
-
-static QCString convertToXML(const char *s)
-{
- QCString result;
- if (s==0) return result;
- const char *p=s;
- char c;
- while ((c=*p++))
- {
- switch (c)
- {
- case '<': result+="&lt;"; break;
- case '>': result+="&gt;"; break;
- case '&': result+="&amp;"; break;
- case '\'': result+="&apos;"; break;
- case '"': result+="&quot;"; break;
- default: result+=c; break;
- }
- }
- return result;
-}
-
-struct MemberDef
-{
- QCString name;
- QCString anchor;
- QCString args;
-};
-
-struct ClassDef
-{
- QCString name;
- QStrList bases;
- QCString fileName;
- bool isFile;
- QList<MemberDef> memberList;
-};
-
-QList<ClassDef> classList;
-QDict<ClassDef> classDict(1009);
-QList<ClassDef> fileList;
-QDict<ClassDef> fileDict(1009);
-
-static bool genTag;
-static bool genIndex;
-
-static QStrList bases;
-static QCString inputString;
-static int inputPosition;
-static QCString yyFileName;
-static int yyLineNr;
-static QCString classFile;
-static QCString memberRef;
-static QCString memberName;
-static QCString memberArgs;
-static QCString className;
-static QCString baseName;
-static QCString docBaseLink;
-static QCString docAnchor;
-static QCString docRefName;
-static bool nameBug;
-//static SearchIndex searchIndex;
-
-#define YY_NEVER_INTERACTIVE 1
-
-/* -----------------------------------------------------------------
- */
-#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 && inputString[inputPosition] )
- {
- *buf = inputString[inputPosition++] ;
- c++; buf++;
- }
- return c;
-}
-
-static void addClass(const char *clName)
-{
- if (classDict[clName]==0)
- {
- //printf("addClass(%s)\n",clName);
- ClassDef *cd=new ClassDef;
- cd->name=clName;
- cd->fileName=yyFileName;
- cd->isFile=FALSE;
- classList.append(cd);
- classDict.insert(clName,cd);
- }
-}
-
-static void addFile(const char *fName)
-{
- if (classDict[fName]==0)
- {
- ClassDef *fd=new ClassDef;
- fd->name=fName;
- fd->fileName=yyFileName;
- fd->isFile=TRUE;
- classList.append(fd);
- classDict.insert(fName,fd);
- }
-}
-
-static void addBases(const char *clName)
-{
- ClassDef *cd=0;
- if (clName && (cd=classDict[clName])) cd->bases=bases;
-}
-
-static void addMember(const char *memName,const char *memRef,const char *memArgs)
-{
- //printf("addMember(%s,%s,%s)\n",memName,memRef,memArgs);
- ClassDef *cd=classList.last();
- if (cd)
- {
- MemberDef *md;
- md=new MemberDef;
- md->name=memName;
- md->anchor=memRef;
- md->args=memArgs;
- cd->memberList.append(md);
- }
- else
- {
- //printf("Warning: found member %s %s but not class was found to insert it!\n",
- // memName,memArgs);
- }
-}
-
-static void addReference()
-{
- //printf("addReference() key: %s ref:%s\n",
- // docRefName.data(),(docBaseLink+"#"+docAnchor).data());
- //if (genIndex && !docRefName.isEmpty() && !docBaseLink.isEmpty())
- //{
- // if (docAnchor.isEmpty())
- // searchIndex.addReference(docRefName,docBaseLink);
- // else
- // searchIndex.addReference(docRefName,docBaseLink+"#"+docAnchor);
- // searchIndex.addWord(docRefName,docRefName,TRUE);
- //}
-}
-
-QCString unhtmlify(const char *str)
-{
- QCString result;
- const char *p=str;
- char c;
- while ((c=*p)!='\0')
- {
- if (c!='&') { result+=c; p++; }
- else
- {
- if (strncmp(p,"&amp;",5)==0) { result+='&'; p+=5; }
- else if (strncmp(p,"&lt;",4)==0) { result+='<'; p+=4; }
- else if (strncmp(p,"&gt;",4)==0) { result+='>'; p+=4; }
- else if (strncmp(p,"&quot;",6)==0) { result+='"'; p+=4; }
- else /* should not happen */ { result+='&'; p++; }
- }
- }
- return result;
-}
-
-%}
-
-%x Start
-%x SearchClassFile
-%x ReadClassFile
-%x CheckClassName
-%x ReadClassName
-%x SearchMemberRef
-%x ReadMemberRef
-%x SearchMemberName
-%x ReadMemberName
-%x ReadOperator
-%x SearchBaseClasses
-%x ReadBaseClass
-%x SearchRefName
-%x ReadRefName
-%x SearchArgs
-%x ReadArgs
-%x SearchWords
-%x SkipHTMLTag
-%x CheckConstructor
-%x SkipPreformated
-
-%x Qt3ReadType
-%x Qt3ReadAnchor
-%x Qt3ReadName
-%x Qt3ReadOperator
-%x Qt3ReadArgs
-
-%x DoxReadAnchor
-%x DoxReadName
-%x DoxReadArgs
-%x DoxClassName
-%x DoxClassBase
-
-%%
-
-<Start>^"<li>" {
- BEGIN( SearchClassFile );
- }
-<Start>^"<td"[^\n]*"<h1 align=center>" | // Qt-3.x.x
-<Start>"</table><h1 align=\"center\">" | // Qt-4
-<Start>^"<h1 align=center>" { // Qt variant
- BEGIN( ReadClassName );
- }
-<Start>^("<hr>")?"<h1>" { // Doxygen variant
- BEGIN( ReadClassName );
- }
-<Start>^"Inherits " {
- //printf("Inherits found\n");
- BEGIN( SearchBaseClasses );
- }
-<Start>^"<h3 class=\"fn\">"/[a-z_A-Z0-9] { // needed due to inconsistency in the Qt docs
- BEGIN( CheckConstructor );
- }
-
- /* --------------------------------------------------- */
- /* Qt member extraction rules */
-
-<Start>^"<h3 class=fn>" {
- BEGIN( Qt3ReadType );
- }
-<Start>^"<h3 class=fn><a name=\"" { // Qt-3.3+ html file
- BEGIN( Qt3ReadAnchor );
- }
-<Start>^"<h3 class=\"fn\"><a name=\"" { // Qt-4 html file
- BEGIN( Qt3ReadAnchor );
- }
-<Qt3ReadType>"<a name=\"" {
- BEGIN( Qt3ReadAnchor );
- }
-<Qt3ReadType>.
-<Qt3ReadAnchor>[~a-z_A-Z0-9\-\[\]*+%\^&|!]+ {
- memberRef = yytext;
- }
-<Qt3ReadAnchor>"\"></a>" {
- BEGIN( Qt3ReadName );
- }
-<Qt3ReadAnchor>. {
- BEGIN( Start );
- }
-<Qt3ReadName>[a-z_A-Z0-9]+"::operator" {
- memberName="operator";
- BEGIN(Qt3ReadOperator);
- }
-<Qt3ReadOperator>[+\-*/%\^&|~!=\[\]]+ { memberName+=yytext; }
-<Qt3ReadOperator>"&lt;" { memberName+="<"; }
-<Qt3ReadOperator>"&gt;" { memberName+=">"; }
-<Qt3ReadOperator>"new" { memberName+=" new"; }
-<Qt3ReadOperator>"delete" { memberName+=" delete"; }
-<Qt3ReadOperator>"()" { memberName+="()"; BEGIN( Qt3ReadArgs ); }
-<Qt3ReadOperator>. { unput(*yytext); BEGIN( Qt3ReadArgs ); }
-<Qt3ReadName>[a-z_A-Z0-9]+"::"[~a-z_A-Z0-9]+ {
- memberName=yytext;
- memberName=memberName.mid(memberName.find("::")+2);
- BEGIN(Qt3ReadArgs);
- }
-<Qt3ReadName>.
-<Qt3ReadArgs>[ \t]*"(" {
- memberArgs+='(';
- }
-<Qt3ReadArgs>"&amp;" { memberArgs+='&'; }
-<Qt3ReadArgs>"&lt;" { memberArgs+='<'; }
-<Qt3ReadArgs>"&gt;" { memberArgs+='>'; }
-<Qt3ReadArgs>"&quot;" { memberArgs+='"'; }
-<Qt3ReadArgs>"&nbsp;" { memberArgs+=' '; }
-<Qt3ReadArgs>"</h3>" {
- addMember(memberName,memberRef,memberArgs);
- memberName.resize(0);
- memberRef.resize(0);
- memberArgs.resize(0);
- BEGIN(Start);
- }
-<Qt3ReadArgs>"<"[^>]+">"
-<Qt3ReadArgs>")" {
- memberArgs+=')';
- addMember(memberName,memberRef,memberArgs);
- memberName.resize(0);
- memberRef.resize(0);
- memberArgs.resize(0);
- BEGIN(Start);
- }
-<Qt3ReadArgs>[a-z_A-Z0-9]+ { memberArgs+=yytext; }
-<Qt3ReadArgs>. { memberArgs+=*yytext; }
-
- /* --------------------------------------------------- */
- /* Doxygen class extraction rules */
-
-<Start>"<!-- doxytag: class=\"" {
- className.resize(0);
- BEGIN(DoxClassName);
- }
-<DoxClassName>[^&"]+ {
- className=yytext;
- addClass(className);
- }
-<DoxClassName>"&lt;" {
- className+='<';
- }
-<DoxClassName>"&gt;" {
- className+='>';
- }
-<DoxClassName>"&amp;" {
- className+='&';
- }
-<DoxClassName>"&quot;" {
- className+='"';
- }
-<DoxClassName>. {
- className+=*yytext;
- }
-<DoxClassName>"\" -->" {
- BEGIN(Start);
- }
-
- /* --------------------------------------------------- */
- /* Doxygen inheritance extraction rules */
-
-<Start>"<!-- doxytag: inherits=\"" {
- bases.clear();
- baseName.resize(0);
- BEGIN(DoxClassBase);
- }
-<DoxClassBase>[^&,"]+ {
- baseName+=yytext;
- }
-<DoxClassBase>"," {
- bases.append(baseName);
- baseName.resize(0);
- }
-<DoxClassBase>"&lt;" {
- baseName+='<';
- }
-<DoxClassBase>"&gt;" {
- baseName+='>';
- }
-<DoxClassBase>"&amp;" {
- baseName+='&';
- }
-<DoxClassBase>"&quot;" {
- baseName+='"';
- }
-<DoxClassBase>. {
- baseName+=*yytext;
- }
-<DoxClassBase>"\" -->" {
- bases.append(baseName);
- baseName.resize(0);
- addBases(className);
- BEGIN(Start);
- }
-
- /* --------------------------------------------------- */
- /* Doxygen member extraction rules */
-
-<Start>"<!-- doxytag: member=\"" {
- memberName.resize(0);
- BEGIN(DoxReadName);
- }
-<DoxReadName>[^&"]+ {
- memberName+=yytext;
- }
-<DoxReadName>"&lt;" {
- memberName+='<';
- }
-<DoxReadName>"&gt;" {
- memberName+='>';
- }
-<DoxReadName>"&amp;" {
- memberName+='&';
- }
-<DoxReadName>"&quot;" {
- memberName+='"';
- }
-<DoxReadName>. {
- memberName+=*yytext;
- }
-<DoxReadName>"\" ref=\"" {
- memberName=memberName.mid(memberName.find("::")+2);
- memberRef.resize(0);
- BEGIN(DoxReadAnchor);
- }
-<DoxReadAnchor>[^&"]+ {
- memberRef+=yytext;
- }
-<DoxReadAnchor>"&lt;" {
- memberRef+='<';
- }
-<DoxReadAnchor>"&gt;" {
- memberRef+='>';
- }
-<DoxReadAnchor>"&amp;" {
- memberRef+='&';
- }
-<DoxReadAnchor>"&quot;" {
- memberRef+='"';
- }
-<DoxReadAnchor>. {
- memberRef+=*yytext;
- }
-<DoxReadAnchor>"\" args=\"" {
- memberArgs.resize(0);
- BEGIN(DoxReadArgs);
- }
-<DoxReadArgs>[^&"]+ {
- memberArgs+=yytext;
- }
-<DoxReadArgs>"&lt;" {
- memberArgs+='<';
- }
-<DoxReadArgs>"&gt;" {
- memberArgs+='>';
- }
-<DoxReadArgs>"&amp;" {
- memberArgs+='&';
- }
-<DoxReadArgs>"&quot;" {
- memberArgs+='"';
- }
-<DoxReadArgs>. {
- memberArgs+=*yytext;
- }
-<DoxReadArgs>"\" -->" {
- addMember(memberName,memberRef,memberArgs);
- memberName.resize(0);
- memberRef.resize(0);
- memberArgs.resize(0);
- BEGIN(Start);
- }
-
- /** --------------------------------------------------- */
-
-<Start>"<pre>" {
- BEGIN( SkipPreformated );
- }
-<Start>"<a name=\"" {
- BEGIN( SearchWords );
- }
-<Start>"<" {
- BEGIN( SkipHTMLTag );
- }
-<Start>"&"[a-zA-Z]+";"
-<Start,SkipPreformated>[a-z_A-Z][a-z_A-Z0-9]* {
- //printf("tag: %s#%s ref: %s word: `%s'\n",
- // docBaseLink.data(),docAnchor.data(),
- // docRefName.data(),yytext);
- //if (genIndex && !docRefName.isEmpty() && yyleng>2)
- // searchIndex.addWord(docRefName,
- // yytext,FALSE
- // );
- }
-<SkipPreformated>"</pre>" {
- BEGIN( Start );
- }
-<SkipPreformated>[^\<\n]+
-<CheckConstructor>[a-z_A-Z0-9~:]+ {
- QCString s=yytext;
- if (s.find("::")!=-1)
- {
- docRefName=yytext;
- addReference();
- nameBug=TRUE;
- }
- else
- {
- nameBug=FALSE;
- }
- BEGIN( Start );
- }
-<SearchWords>[a-z_A-Z0-9]+ {
- docAnchor = yytext;
- if (docAnchor=="details" ||
- docAnchor=="_details")
- {
- docRefName=className.copy();
- addReference();
- BEGIN( Start );
- }
- else
- {
- BEGIN( SearchRefName );
- }
- }
-<SearchRefName>"\" doxytag=\"" {
- BEGIN( ReadRefName );
- }
-<SearchRefName>"\"></a><a" { // HACK: avoid finding links in code fragments
- BEGIN( Start );
- }
-<SearchRefName>"\"></a>" { // HACK: deal with Qt code
- if (nameBug)
- BEGIN( Start );
- else
- BEGIN( ReadRefName );
- }
-
-<ReadRefName>[a-z_A-Z0-9:\.\+\-]*"operator"[ \t]*("new"|"delete"|("&amp;"("&amp"|"=")*)|("&gt;"("&gt;"|"=")*)|("&lt;"("&lt;"|"=")*)|("-&gt;"[*]*)|[+\-*%/|~!=,\^]|[+\-*%/\^!|~=\[(][=|+\-\])]) { // hmm, looks impressive :-)
- docRefName=unhtmlify(yytext);
- addReference();
- BEGIN( Start );
- }
-<ReadRefName>[a-z_A-Z0-9~:\.\+\-]+ {
- //printf("ReadRef=%s\n",yytext);
- docRefName=yytext;
- addReference();
- BEGIN( Start );
- }
-<SearchBaseClasses>"<a "[a-z_A-Z0-9 .:\=\"\-\+\/\@]+">" {
- //printf("Search %s\n",yytext);
- BEGIN( ReadBaseClass );
- }
-<SearchBaseClasses>\n {
- addBases(className);
- BEGIN( Start );
- }
-<ReadBaseClass>[a-z_A-Z0-9]+ {
- bases.append(yytext);
- BEGIN( SearchBaseClasses );
- }
-<SearchClassFile>"<a class=\"el\" href=\"" {
- BEGIN( ReadClassFile );
- }
-<SearchClassFile>"<a href=\"" {
- BEGIN( ReadClassFile );
- }
-<ReadClassName>[a-z_A-Z0-9:\.\-\+]+ {
- className=yytext;
- BEGIN( CheckClassName);
- }
-<CheckClassName>"Class Reference" {
- //printf("className=%s\n",className.data());
- addClass(className);
- BEGIN( Start );
- }
-<CheckClassName>"File Reference" {
- //printf("className=%s\n",className.data());
- addFile(className);
- BEGIN( Start );
- }
-<CheckClassName>[a-z_A-Z0-9]+ { // not a class file
- className.resize(0);
- BEGIN( Start );
- }
-<ReadClassFile>[a-z_A-Z0-9.\-\+]+ {
- classFile=yytext;
- BEGIN( SearchMemberRef );
- }
-<SearchMemberRef,ReadClassFile>"#" {
- if (YY_START==ReadClassFile)
- {
- classFile=yyFileName;
- }
- //BEGIN( ReadMemberRef );
- BEGIN( Start );
- }
-<ReadMemberRef>[a-z_A-Z0-9]+ {
- memberRef=yytext;
- BEGIN( SearchMemberName );
- }
-<SearchMemberName>"<strong>"|"<b>" { // <strong> is for qt-1.44, <b> is for qt-2.00
- BEGIN( ReadMemberName );
- }
-<SearchMemberName>[a-z_A-Z~] {
- unput(*yytext);
- BEGIN( ReadMemberName );
- }
-<ReadMemberName>"operator" {
- memberName="operator";
- BEGIN( ReadOperator );
- }
-<ReadOperator>[+\-*/%\^&|~!=()\[\]] { memberName+=*yytext; }
-<ReadOperator>"&lt;" { memberName+="<"; }
-<ReadOperator>"&gt;" { memberName+=">"; }
-<ReadOperator>"new" { memberName+=" new"; }
-<ReadOperator>"delete" { memberName+=" delete"; }
-<ReadOperator>"<" { BEGIN( SearchArgs ); }
-<ReadMemberName>[a-z_A-Z0-9]+ {
- memberName=yytext;
- BEGIN( SearchArgs );
- }
-<SearchArgs>"</a>" {
- //printf("SearchArg className=%s memberName=%s\n",className.data(),memberName.data());
- if (!className.isEmpty() && !memberName.isEmpty())
- BEGIN( ReadArgs );
- else
- BEGIN( Start );
- }
-<ReadArgs>"&amp;" { memberArgs+='&'; }
-<ReadArgs>"&lt;" { memberArgs+='<'; }
-<ReadArgs>"&gt;" { memberArgs+='>'; }
-<ReadArgs>"&quot;" { memberArgs+='"'; }
-<ReadArgs>"&nbsp;" { memberArgs+=' '; }
- /*
-<ReadArgs>[{}] { // handle enums
- memberArgs.resize(0);
- addMember(memberName,memberRef,memberArgs);
- if (*yytext=='}')
- BEGIN( Start );
- else
- BEGIN( SearchClassFile );
- }
- */
-<ReadArgs>"<"|"\n" {
- //printf("adding member %s\n",memberName.data());
- memberArgs=memberArgs.stripWhiteSpace();
- //if (newClass)
- //{
- // newClass=FALSE;
- // addClass(className);
- //}
- addMember(memberName,memberRef,memberArgs);
- memberName.resize(0);
- memberRef.resize(0);
- memberArgs.resize(0);
- if (*yytext=='<')
- BEGIN( SkipHTMLTag);
- else
- BEGIN( Start );
- }
-<ReadArgs>. { memberArgs+=(*yytext)&0x7f; }
-<SkipHTMLTag>">" { BEGIN( Start ); }
-<SkipHTMLTag>[a-zA-Z]+
-<*>.
-<*>\n { yyLineNr++;
- if (YY_START!=SkipHTMLTag) BEGIN( Start );
- }
-
-%%
-
-/*@ ----------------------------------------------------------------------------
- */
-
-
-void parse(QCString &s)
-{
- bases.clear();
- nameBug = FALSE;
- //newClass = TRUE;
- inputString = s;
- inputPosition = 0;
- yyLineNr = 0;
- tagYYrestart( tagYYin );
- BEGIN( Start );
- tagYYlex();
- //printf("Number of lines scanned: %d\n",yyLineNr);
-}
-
-void parseFile(QFileInfo &fi)
-{
- printf("Parsing file %s...\n",fi.fileName().data());
- QFile f;
- f.setName(fi.absFilePath());
- if (f.open(IO_ReadOnly))
- {
- yyFileName = fi.fileName();
- className.resize(0);
- memberName.resize(0);
- //printf("Parsing file %s...\n",fi.fileName().data());
- QCString input(fi.size()+1);
- docBaseLink=fi.fileName();
- docRefName=fi.fileName().copy();
- //searchIndex.addReference(docRefName,docBaseLink);
- //searchIndex.addWord(docRefName,docRefName,TRUE);
- f.readBlock(input.data(),fi.size());
- input.at(fi.size())='\0';
- parse(input);
- }
- else
- {
- fprintf(stderr,"Warning: Cannot open file %s\n",fi.fileName().data());
- }
-}
-
-void parseFileOrDir(const char *fileName)
-{
- QFileInfo fi(fileName);
- if (fi.exists())
- {
- if (fi.isFile())
- {
- parseFile(fi);
- }
- else if (fi.isDir())
- {
- QDir dir(fileName);
- dir.setFilter( QDir::Files );
- dir.setNameFilter( "*.html" );
- const QFileInfoList *list = dir.entryInfoList();
- QFileInfoListIterator it( *list );
- QFileInfo *cfi;
- for ( it.toFirst() ; (cfi=it.current()) ; ++it)
- {
- if (cfi->isFile())
- {
- parseFile(*cfi);
- }
- }
- }
- }
- else
- {
- fprintf(stderr,"Warning: File %s does not exist\n",fileName);
- }
-}
-
-void usage(const char *name)
-{
- fprintf(stderr,"Doxytag version %s\nCopyright Dimitri van Heesch 1997-2005\n\n",
- versionString);
- fprintf(stderr," Generates a tag file and/or a search index for a set of HTML files\n\n");
- fprintf(stderr,"Usage: %s [-t tag_file] [ html_file [html_file...] ]\n",name);
- fprintf(stderr,"Options:\n");
- fprintf(stderr," -t <tag_file> Generate tag file <tag_file>.\n");
- fprintf(stderr,"If no HTML files are given all files in the current dir that\n"
- "have a .html extension are parsed.\n\n");
- exit(1);
-}
-
-const char *getArg(int argc,char **argv,int &optind,const char c)
-{
- char *s=0;
- if (strlen(&argv[optind][2])>0)
- s=&argv[optind][2];
- else if (optind+1<argc)
- s=argv[++optind];
- else
- {
- fprintf(stderr,"option -%c requires an argument\n",c);
- exit(1);
- }
- return s;
-}
-
-int main(int argc,char **argv)
-{
- QCString tagName;
- QCString indexName;
-
- int optind=1;
- const char *arg;
- while (optind<argc && argv[optind][0]=='-')
- {
- switch(argv[optind][1])
- {
- case 't':
- arg=getArg(argc,argv,optind,'t');
- tagName=arg;
- break;
- case 's':
- arg=getArg(argc,argv,optind,'s');
- indexName=arg;
- break;
- case 'h':
- case '?':
- usage(argv[0]);
- break;
- default:
- fprintf(stderr,"Unknown option -%c\n",argv[optind][1]);
- usage(argv[0]);
- }
- optind++;
- }
-
- genTag = !tagName.isEmpty();
- genIndex = !indexName.isEmpty();
-
- if (!genTag && !genIndex)
- {
- fprintf(stderr,"Nothing to do !\n\n");
- usage(argv[0]);
- }
-
- int i;
- if (optind>=argc)
- {
- parseFileOrDir(".");
- }
- else
- {
- for (i=optind;i<argc;i++)
- {
- parseFileOrDir(argv[i]);
- }
- }
- if (genIndex)
- {
- fprintf(stderr,"Error: doxytag cannot be used to generate a search index anymore.\n"
- "This functionality has been integrated into doxygen.\n");
-// printf("Writing search index\n");
-// if (!searchIndex.saveIndex(indexName))
-// {
-// fprintf(stderr,"Error: Could not write search index\n");
-// }
-// QFileInfo fi(indexName);
-// if (fi.exists())
-// {
-// QCString dir=convertToQCString(fi.dir().absPath());
-// fi.setFile(dir+"/search.png");
-// if (!fi.exists()) writeSearchButton(dir);
-// fi.setFile(dir+"/doxygen.png");
-// if (!fi.exists()) writeLogo(dir);
-// fi.setFile(dir+"/search.cgi");
-// if (!fi.exists())
-// {
-// QFile f;
-// f.setName(dir+"/search.cgi");
-// if (f.open(IO_WriteOnly))
-// {
-// QTextStream t(&f);
-// t << "#!/bin/sh" << endl
-// << "DOXYSEARCH=" << endl
-// << "DOXYPATH=" << endl
-// << "if [ -f $DOXYSEARCH ]" << endl
-// << "then" << endl
-// << " $DOXYSEARCH $DOXYPATH" << endl
-// << "else" << endl
-// << " echo \"Content-Type: text/html\"" << endl
-// << " echo \"\"" << endl
-// << " echo \"<H1>Error: $DOXYSEARCH not found. Check cgi script!\"" << endl
-// << "fi" << endl;
-// f.close();
-// }
-// else
-// {
-// fprintf(stderr,"Error: could not open file %s for writing\n",(dir+"/search.cgi").data());
-// }
-// }
-// }
- }
- if (genTag)
- {
- QFile f;
- f.setName(tagName);
- if (f.open(IO_WriteOnly))
- {
- QTextStream t(&f);
- t << "<tagfile>" << endl;
- ClassDef *cd=classList.first();
- while (cd)
- {
- t << " <compound kind=\"";
- if (cd->isFile) t << "file"; else t << "class";
- t << "\">" << endl;
- t << " <name>" << convertToXML(cd->name) << "</name>" << endl;
- char *base=cd->bases.first();
- while (base)
- {
- t << " <base>" << convertToXML(base) << "</base>" << endl;
- base=cd->bases.next();
- }
- t << " <filename>" << convertToXML(cd->fileName) << "</filename>" << endl;
- MemberDef *md=cd->memberList.first();
- while (md)
- {
- if (md->anchor.right(5)=="-enum")
- {
- t << " <member kind=\"enum\">" << endl;
- }
- else
- {
- t << " <member kind=\"function\">" << endl;
- }
- t << " <name>" << convertToXML(md->name) << "</name>" << endl;
- t << " <anchor>" << convertToXML(md->anchor) << "</anchor>" << endl;
- t << " <arglist>" << convertToXML(md->args) << "</arglist>" << endl;
- t << " </member>" << endl;
- md=cd->memberList.next();
- }
- t << " </compound>" << endl;
- cd=classList.next();
- }
- t << "</tagfile>" << endl;
- }
- else
- {
- fprintf(stderr,"Error: Could not write tag file %s\n",tagName.data());
- }
- }
- return 0;
-}
-
-extern "C" {
-int tagYYwrap() { return 1 ; }
-};
diff --git a/src/doxytag.pro.in b/src/doxytag.pro.in
deleted file mode 100644
index 73fab9c..0000000
--- a/src/doxytag.pro.in
+++ /dev/null
@@ -1,31 +0,0 @@
-#
-#
-#
-# Copyright (C) 1997-2005 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.
-#
-# TMake project file for doxytag
-
-TEMPLATE = doxytag.t
-CONFIG = console warn_on $extraopts
-HEADERS = logos.h version.h
-SOURCES = doxytag.cpp logos.cpp version.cpp
-unix:LIBS += -L../lib -lqtools
-win32:INCLUDEPATH += .
-win32-mingw:LIBS += -L../lib -lqtools
-win32-msvc:LIBS += qtools.lib shell32.lib
-win32-msvc:TMAKE_LFLAGS += /LIBPATH:..\lib
-win32-borland:LIBS += qtools.lib shell32.lib
-win32-borland:TMAKE_LFLAGS += -L..\lib -L$(BCB)\lib\psdk
-win32:TMAKE_CXXFLAGS += -DQT_NODLL
-INCLUDEPATH += ../qtools
-OBJECTS_DIR = ../objects
-TARGET = ../bin/doxytag
diff --git a/src/doxytag.t b/src/doxytag.t
deleted file mode 100644
index 27bd150..0000000
--- a/src/doxytag.t
+++ /dev/null
@@ -1,50 +0,0 @@
-#
-#
-#
-# Copyright (C) 1997-2005 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.
-#
-#!
-#! doxytag.t: This is a custom template for building Doxytag
-#!
-#$ IncludeTemplate("app.t");
-
-LEX = flex
-
-#${
-sub GenerateDep {
- my($obj,$src,$dep) = @_;
- my(@objv,$srcv,$i,$s,$o,$d,$c);
- @objv = split(/\s+/,$obj);
- @srcv = split(/\s+/,$src);
- for $i ( 0..$#objv ) {
- $s = $srcv[$i];
- $o = $objv[$i];
- next if $s eq "";
- $text .= $o . ": " . $s;
- $text .= " ${linebreak}\n\t\t" . $dep if $dep ne "";
- if ( $moc_output{$s} ne "" ) {
- $text .= " ${linebreak}\n\t\t" . $moc_output{$s};
- }
- $d = &make_depend($s);
- $text .= " ${linebreak}\n\t\t" . $d if $d ne "";
- $text .= "\n";
- }
- chop $text;
-}
-#$}
-
-#####################
-
-#$ GenerateDep("doxytag.cpp","doxytag.l");
- $(LEX) -PtagYY -t doxytag.l >doxytag.cpp
-
-
diff --git a/src/entry.cpp b/src/entry.cpp
deleted file mode 100644
index 5ce3239..0000000
--- a/src/entry.cpp
+++ /dev/null
@@ -1,284 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 "entry.h"
-#include "util.h"
-#include "section.h"
-
-int Entry::num=0;
-
-Entry::Entry()
-{
- num++;
- //printf("New Entry %d\n",num);
- parent=0;
- section = EMPTY_SEC;
- sublist = new QList<Entry>;
- sublist->setAutoDelete(TRUE);
- extends = new QList<BaseInfo>;
- extends->setAutoDelete(TRUE);
- groups = new QList<Grouping>;
- groups->setAutoDelete(TRUE);
- anchors = new QList<SectionInfo>;
- argList = new ArgumentList;
- argList->setAutoDelete(TRUE);
- //printf("Entry::Entry() tArgList=0\n");
- tArgLists = 0;
- mGrpId = -1;
- tagInfo = 0;
- sli = 0;
- relatesDup = FALSE;
- hidden = FALSE;
- groupDocType = GROUPDOC_NORMAL;
- reset();
-}
-
-Entry::Entry(const Entry &e)
-{
- num++;
- //printf("Copy New Entry %d\n",num);
- section = e.section;
- protection = e.protection;
- mtype = e.mtype;
- stat = e.stat;
- explicitExternal = e.explicitExternal;
- virt = e.virt;
- parent = e.parent;
- type = e.type.copy();
- name = e.name.copy();
- args = e.args.copy();
- bitfields = e.bitfields.copy();
- exception = e.exception.copy();
- program = e.program.copy();
- includeFile = e.includeFile.copy();
- includeName = e.includeFile.copy();
- doc = e.doc.copy();
- docLine = e.docLine;
- docFile = e.docFile.copy();
- relates = e.relates.copy();
- relatesDup = e.relatesDup;
- read = e.read.copy();
- write = e.write.copy();
- brief = e.brief.copy();
- briefLine = e.briefLine;
- briefFile = e.briefFile.copy();
- inbodyDocs = e.inbodyDocs.copy();
- inbodyLine = e.inbodyLine;
- inbodyFile = e.inbodyFile.copy();
- inside = e.inside.copy();
- fileName = e.fileName.copy();
- startLine = e.startLine;
- mGrpId = e.mGrpId;
- bodyLine = e.bodyLine;
- endBodyLine = e.endBodyLine;
- memSpec = e.memSpec;
- initializer = e.initializer;
- initLines = e.initLines;
- callGraph = e.callGraph;
- objc = e.objc;
- tagInfo = e.tagInfo;
- hidden = e.hidden;
- sublist = new QList<Entry>;
- sublist->setAutoDelete(TRUE);
- extends = new QList<BaseInfo>;
- extends->setAutoDelete(TRUE);
- groups = new QList<Grouping>;
- groups->setAutoDelete(TRUE);
- anchors = new QList<SectionInfo>;
- argList = new ArgumentList;
- argList->setAutoDelete(TRUE);
- tArgLists = 0;
- groupDocType = e.groupDocType;
-
- // deep copy of the child entry list
- QListIterator<Entry> eli(*e.sublist);
- Entry *cur;
- for (;(cur=eli.current());++eli)
- {
- sublist->append(new Entry(*cur));
- }
-
- // deep copy base class list
- QListIterator<BaseInfo> bli(*e.extends);
- BaseInfo *bi;
- for (;(bi=bli.current());++bli)
- {
- extends->append(new BaseInfo(*bi));
- }
-
- // deep copy group list
- QListIterator<Grouping> gli(*e.groups);
- Grouping *g;
- for (;(g=gli.current());++gli)
- {
- groups->append(new Grouping(*g));
- }
-
- QListIterator<SectionInfo> sli2(*e.anchors);
- SectionInfo *s;
- for (;(s=sli2.current());++sli2)
- {
- anchors->append(new SectionInfo(*s));
- }
-
- // deep copy argument list
- QListIterator<Argument> ali(*e.argList);
- Argument *a;
- for (;(a=ali.current());++ali)
- {
- argList->append(new Argument(*a));
- }
- argList->constSpecifier = e.argList->constSpecifier;
- argList->volatileSpecifier = e.argList->volatileSpecifier;
- argList->pureSpecifier = e.argList->pureSpecifier;
-
- // deep copy template argument lists
- if (e.tArgLists)
- {
- tArgLists = copyArgumentLists(e.tArgLists);
- }
-
- if (e.sli)
- {
- sli = new QList<ListItemInfo>;
- sli->setAutoDelete(TRUE);
- QListIterator<ListItemInfo> slii(*e.sli);
- ListItemInfo *ili;
- for (slii.toFirst();(ili=slii.current());++slii)
- {
- sli->append(new ListItemInfo(*ili));
- }
- }
- else
- {
- sli=0;
- }
-}
-
-Entry::~Entry()
-{
- //printf("Deleting entry %d name %s type %x chilren %d\n",
- // num,name.data(),section,sublist->count());
- delete sublist;
- delete extends;
- delete groups;
- delete anchors;
- delete argList;
- delete tArgLists;
- //delete mtArgList;
- delete tagInfo;
- delete sli;
- num--;
-}
-
-void Entry::addSubEntry(Entry *current)
-{
- //printf("Entry %d with name %s type 0x%x added to %s type 0x%x\n",
- // current->num,current->name.data(),current->section,
- // name.data(),section);
- //printf("Entry::addSubEntry(%s) %p\n",current->name.data(),current->tArgList);
- current->parent=this;
- sublist->append(current);
-}
-
-void Entry::reset()
-{
- name.resize(0);
- type.resize(0);
- args.resize(0);
- bitfields.resize(0);
- exception.resize(0);
- program.resize(0);
- includeFile.resize(0);
- includeName.resize(0);
- doc.resize(0);
- docFile.resize(0);
- docLine=-1;
- relates.resize(0);
- relatesDup=FALSE;
- brief.resize(0);
- briefFile.resize(0);
- briefLine=-1;
- inbodyDocs.resize(0);
- inbodyFile.resize(0);
- inbodyLine=-1;
- inside.resize(0);
- fileName.resize(0);
- initializer.resize(0);
- initLines = -1;
- startLine = 1;
- bodyLine = -1;
- endBodyLine = -1;
- mGrpId = -1;
- callGraph = FALSE;
- section = EMPTY_SEC;
- mtype = Method;
- virt = Normal;
- stat = FALSE;
- proto = FALSE;
- explicitExternal = FALSE;
- memSpec = 0;
- objc = FALSE;
- hidden = FALSE;
- subGrouping = TRUE;
- protection = Public;
- groupDocType = GROUPDOC_NORMAL;
- sublist->clear();
- extends->clear();
- groups->clear();
- anchors->clear();
- argList->clear();
- if (tagInfo) { delete tagInfo; tagInfo=0; }
- if (tArgLists) { delete tArgLists; tArgLists=0; }
- if (sli) { delete sli; sli=0; }
- //if (mtArgList) { delete mtArgList; mtArgList=0; }
-}
-
-
-int Entry::getSize()
-{
- return sizeof(Entry);
-}
-
-/*! the argument list is documented if one of its
- * arguments is documented
- */
-bool ArgumentList::hasDocumentation() const
-{
- bool hasDocs=FALSE;
- ArgumentListIterator ali(*this);
- Argument *a;
- for (ali.toFirst();!hasDocs && (a=ali.current());++ali)
- {
- hasDocs = hasDocs || a->hasDocumentation();
- }
- return hasDocs;
-}
-
-void Entry::addSpecialListItem(const char *listName,int itemId)
-{
- if (sli==0)
- {
- sli = new QList<ListItemInfo>;
- sli->setAutoDelete(TRUE);
- }
- ListItemInfo *ili=new ListItemInfo;
- ili->type = listName;
- ili->itemId = itemId;
- sli->append(ili);
-}
-
diff --git a/src/entry.h b/src/entry.h
deleted file mode 100644
index b10315b..0000000
--- a/src/entry.h
+++ /dev/null
@@ -1,352 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 ENTRY_H
-#define ENTRY_H
-
-#include "qtbc.h"
-#include <qlist.h>
-
-struct SectionInfo;
-
-enum Protection { Public, Protected, Private, Package } ;
-enum Specifier { Normal, Virtual, Pure } ;
-enum MethodTypes { Method, Signal, Slot, DCOP, Property, Event };
-
-struct ListItemInfo
-{
- QCString type;
- int itemId;
-};
-
-/*! \brief This class stores information about an inheritance relation
- */
-struct BaseInfo
-{
- /*! Creates an object representing an inheritance relation */
- BaseInfo(const char *n,Protection p,Specifier v) :
- name(n),prot(p),virt(v) {}
- QCString name; //!< the name of the base class
- Protection prot; //!< inheritance type
- Specifier virt; //!< virtualness
-};
-
-/*! \brief This class contains the information about the argument of a
- * function or template
- *
- */
-struct Argument
-{
- /*! Construct a new argument. */
- Argument() {}
- /*! Copy an argument (does a deep copy of all strings). */
- Argument(const Argument &a)
- {
- attrib=a.attrib.copy();
- type=a.type.copy();
- name=a.name.copy();
- defval=a.defval.copy();
- docs=a.docs.copy();
- array=a.array.copy();
- }
- /*! Assignment of an argument (does a deep copy of all strings). */
- Argument &operator=(const Argument &a)
- {
- if (this!=&a)
- {
- attrib=a.attrib.copy();
- type=a.type.copy();
- name=a.name.copy();
- defval=a.defval.copy();
- docs=a.docs.copy();
- array=a.array.copy();
- }
- return *this;
- }
- /*! return TRUE if this argument is documentation and the argument has a
- * non empty name.
- */
- bool hasDocumentation() const
- {
- return !name.isEmpty() && !docs.isEmpty();
- }
-
- QCString attrib; /*!< Argument's attribute (IDL only) */
- QCString type; /*!< Argument's type */
- QCString canType; /*!< Cached value of canonical type (after type resolution). Empty initially. */
- QCString name; /*!< Argument's name (may be empty) */
- QCString array; /*!< Argument's array specifier (may be empty) */
- QCString defval; /*!< Argument's default value (may be empty) */
- QCString docs; /*!< Argument's documentation (may be empty) */
-};
-
-/*! \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 wether the member is const,
- * volatile or pure virtual.
- */
-class ArgumentList : public QList<Argument>
-{
- public:
- /*! Creates an empty argument list */
- ArgumentList() : QList<Argument>(),
- constSpecifier(FALSE),
- volatileSpecifier(FALSE),
- pureSpecifier(FALSE) { setAutoDelete(TRUE); }
- /*! Destroys the argument list */
- ~ArgumentList() {}
- bool hasDocumentation() const;
- /*! Does the member modify the state of the class? default: FALSE. */
- bool constSpecifier;
- /*! Is the member volatile? default: FALSE. */
- bool volatileSpecifier;
- /*! Is this a pure virtual member? default: FALSE */
- bool pureSpecifier;
-};
-
-typedef QListIterator<Argument> ArgumentListIterator;
-
-/*! \brief This struct is used to capture the tag file information
- * for an Entry.
- */
-struct TagInfo
-{
- QCString tagName;
- QCString fileName;
- QCString anchor;
-};
-
-struct Grouping
-{
- enum GroupPri_t
- {
- GROUPING_LOWEST,
- GROUPING_AUTO_WEAK =
- GROUPING_LOWEST, //!< membership in group was defined via \@weakgroup
- GROUPING_AUTO_ADD, //!< membership in group was defined via \@add[to]group
- GROUPING_AUTO_DEF, //!< membership in group was defined via \@defgroup
- GROUPING_AUTO_HIGHEST = GROUPING_AUTO_DEF,
- GROUPING_INGROUP, //!< membership in group was defined by \@ingroup
- GROUPING_HIGHEST = GROUPING_INGROUP
- };
-
- static const char *getGroupPriName( GroupPri_t priority )
- {
- switch( priority )
- {
- case GROUPING_AUTO_WEAK:
- return "@weakgroup";
- case GROUPING_AUTO_ADD:
- return "@addtogroup";
- case GROUPING_AUTO_DEF:
- return "@defgroup";
- case GROUPING_INGROUP:
- return "@ingroup";
- }
- return "???";
- }
-
- Grouping( const char *gn, GroupPri_t p ) : groupname(gn), pri(p) {}
- Grouping( const Grouping &g ) : groupname(g.groupname), pri(g.pri) {}
- QCString groupname; //!< name of the group
- GroupPri_t pri; //!< priority of this definition
-
-};
-
-/*! \brief Represents an unstructured piece of information, about an
- * entity found in the sources.
- *
- * parseMain() in scanner.l will generate a tree of these
- * entries.
- */
-class Entry
-{
- public:
-
- /*! Kind of entries that are supported */
- enum Sections {
- CLASS_SEC = 0x00000001,
- STRUCT_SEC = 0x00000002,
- UNION_SEC = 0x00000004,
- EXCEPTION_SEC = 0x00000008,
- NAMESPACE_SEC = 0x00000010,
- INTERFACE_SEC = 0x00000020,
- PROTOCOL_SEC = 0x00000040,
- CATEGORY_SEC = 0x00000080,
- COMPOUND_MASK = CLASS_SEC | STRUCT_SEC | UNION_SEC |
- INTERFACE_SEC | EXCEPTION_SEC |
- PROTOCOL_SEC | CATEGORY_SEC,
- SCOPE_MASK = COMPOUND_MASK | NAMESPACE_SEC,
-
- CLASSDOC_SEC = 0x00000800,
- STRUCTDOC_SEC = 0x00001000,
- UNIONDOC_SEC = 0x00002000,
- EXCEPTIONDOC_SEC = 0x00004000,
- NAMESPACEDOC_SEC = 0x00008000,
- INTERFACEDOC_SEC = 0x00010000,
- PROTOCOLDOC_SEC = 0x00020000,
- CATEGORYDOC_SEC = 0x00040000,
- COMPOUNDDOC_MASK = CLASSDOC_SEC | STRUCTDOC_SEC | UNIONDOC_SEC |
- INTERFACEDOC_SEC | EXCEPTIONDOC_SEC | PROTOCOLDOC_SEC |
- CATEGORYDOC_SEC,
-
- SOURCE_SEC = 0x00400000,
- HEADER_SEC = 0x00800000,
- FILE_MASK = SOURCE_SEC | HEADER_SEC,
-
- ENUMDOC_SEC = 0x01000000,
- ENUM_SEC = 0x02000000,
- EMPTY_SEC = 0x03000000,
- PAGEDOC_SEC = 0x04000000,
- VARIABLE_SEC = 0x05000000,
- FUNCTION_SEC = 0x06000000,
- TYPEDEF_SEC = 0x07000000,
- MEMBERDOC_SEC = 0x08000000,
- OVERLOADDOC_SEC = 0x09000000,
- EXAMPLE_SEC = 0x0a000000,
- VARIABLEDOC_SEC = 0x0b000000,
- FILEDOC_SEC = 0x0c000000,
- DEFINEDOC_SEC = 0x0d000000,
- INCLUDE_SEC = 0x0e000000,
- DEFINE_SEC = 0x0f000000,
- GROUPDOC_SEC = 0x10000000,
- USINGDIR_SEC = 0x11000000,
- MAINPAGEDOC_SEC = 0x12000000,
- MEMBERGRP_SEC = 0x13000000,
- USINGDECL_SEC = 0x14000000,
- PACKAGE_SEC = 0x15000000,
- PACKAGEDOC_SEC = 0x16000000,
- OBJCIMPL_SEC = 0x17000000,
- DIRDOC_SEC = 0x18000000,
- };
- enum MemberSpecifier
- {
- Inline = 0x0001,
- Explicit = 0x0002,
- Mutable = 0x0004,
- Settable = 0x0008,
- Gettable = 0x0010,
- Readable = 0x0020,
- Writable = 0x0040,
- Final = 0x0080,
- Abstract = 0x0100,
- };
-
- Entry();
- Entry(const Entry &);
- ~Entry();
- int getSize();
- void addSpecialListItem(const char *listName,int index);
-
- /*! Adds entry \e as a child to this entry */
- void addSubEntry (Entry* e) ;
- /*! Restore the state of this Entry to the default value it has
- * at construction time.
- */
- void reset();
-
- int section; //!< entry type (see Sections);
- Protection protection; //!< class protection
- MethodTypes mtype; //!< signal, slot, (dcop) method, or property?
- bool stat; //!< static ?
- bool explicitExternal; //!< explicitly defined as external?
- bool proto; //!< prototype ?
- int memSpec; //!< member specifiers
- int initLines; //!< define/variable initializer lines to show
- bool subGrouping; //!< automatically group class members?
- bool callGraph; //!< do we need to draw the call graph?
- Specifier virt; //!< virtualness of the entry
- Entry *parent; //!< parent node in the tree
- QCString type; //!< member type
- QCString name; //!< member name
- QCString args; //!< member argument string
- QCString bitfields; //!< member's bit fields
- ArgumentList *argList; //!< member arguments as a list
- QList<ArgumentList> *tArgLists; //!< template argument declarations
- QCString program; //!< the program text
- QCString initializer; //!< initial value (for variables)
- QCString includeFile; //!< include file (2 arg of \\class, must be unique)
- QCString includeName; //!< include name (3 arg of \\class)
- QCString doc; //!< documentation block (partly parsed)
- int docLine; //!< line number at which the documentation was found
- QCString docFile; //!< file in which the documentation was found
- QCString brief; //!< brief description (doc block)
- int briefLine; //!< line number at which the brief desc. was found
- QCString briefFile; //!< file in which the brief desc. was found
- QCString inbodyDocs; //!< documentation inside the body of a function
- int inbodyLine; //!< line number at which the body doc was found
- QCString inbodyFile; //!< file in which the body doc was found
- QCString relates; //!< related class (doc block)
- bool relatesDup; //!< keep duplicate doc in original file also
- QCString read; //!< property read accessor
- QCString write; //!< property write accessor
- QCString inside; //!< name of the class in which documents are found
- QCString exception; //!< throw specification
- int bodyLine; //!< line number of the definition in the source
- int endBodyLine; //!< line number where the definition ends
- int mGrpId; //!< member group id
- QList<Entry> *sublist; //!< entries that are children of this one
- QList<BaseInfo> *extends; //!< list of base classes
- QList<Grouping> *groups; //!< list of groups this entry belongs to
- QList<SectionInfo> *anchors; //!< list of anchors defined in this entry
- QCString fileName; //!< file this entry was extracted from
- int startLine; //!< start line of entry in the source
- QList<ListItemInfo> *sli; //!< special lists (test/todo/bug/deprecated/..) this entry is in
- TagInfo *tagInfo; //!< tag file info
- static int num; //!< counts the total number of entries
- bool objc; //!< Objective-C construct
- bool hidden; //!< does this represent an entity this is hidden from the output
- enum
- {
- GROUPDOC_NORMAL, //!< defgroup
- GROUPDOC_ADD, //!< addgroup
- GROUPDOC_WEAK //!< weakgroup
- } groupDocType; //!< kind of group
- /// return the command name used to define GROUPDOC_SEC
- const char *groupDocCmd() const
- {
- switch( groupDocType )
- {
- case GROUPDOC_NORMAL: return "\\defgroup";
- case GROUPDOC_ADD: return "\\addgroup";
- case GROUPDOC_WEAK: return "\\weakgroup";
- default: return "unknown group command";
- }
- }
- Grouping::GroupPri_t groupingPri() const
- {
- if( section != GROUPDOC_SEC )
- {
- return Grouping::GROUPING_LOWEST;
- }
- switch( groupDocType )
- {
- case GROUPDOC_NORMAL: return Grouping::GROUPING_AUTO_DEF;
- case GROUPDOC_ADD: return Grouping::GROUPING_AUTO_ADD;
- case GROUPDOC_WEAK: return Grouping::GROUPING_AUTO_WEAK;
- default: return Grouping::GROUPING_LOWEST;
- }
- }
- private:
- Entry &operator=(const Entry &);
-} ;
-
-typedef QList<Entry> EntryList;
-typedef QListIterator<Entry> EntryListIterator;
-
-#endif
diff --git a/src/example.h b/src/example.h
deleted file mode 100644
index 984e4bf..0000000
--- a/src/example.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 EXAMPLE_H
-#define EXAMPLE_H
-
-#include "qtbc.h"
-#include <qdict.h>
-
-class ClassDef;
-class MemberName;
-
-struct Example
-{
- QCString anchor;
- QCString name;
- QCString file;
-};
-
-class ExampleSDict : public SDict<Example>
-{
- public:
- ExampleSDict(int size=17) : SDict<Example>(size) {}
- ~ExampleSDict() {}
- int compareItems(GCI item1,GCI item2)
- {
- return stricmp(((Example *)item1)->name,((Example *)item2)->name);
- }
-};
-
-#endif
diff --git a/src/filedef.cpp b/src/filedef.cpp
deleted file mode 100644
index 46e0b6b..0000000
--- a/src/filedef.cpp
+++ /dev/null
@@ -1,1293 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 "qtbc.h"
-#include "memberlist.h"
-#include "classlist.h"
-#include "filedef.h"
-#include "doxygen.h"
-#include "memberdef.h"
-#include "classdef.h"
-#include "namespacedef.h"
-#include "util.h"
-#include "language.h"
-#include "outputlist.h"
-#include "dot.h"
-#include "message.h"
-#include "docparser.h"
-#include "ftvhelp.h"
-#include "searchindex.h"
-#include "htags.h"
-#include "parserintf.h"
-
-#if defined(_MSC_VER) || defined(__BORLANDC__)
-#define popen _popen
-#define pclose _pclose
-#endif
-
-class DevNullCodeDocInterface : public CodeOutputInterface
-{
- public:
- virtual void codify(const char *) {}
- virtual void writeCodeLink(const char *ref,const char *file,
- const char *anchor,const char *name)
- { ref=ref; file=file; anchor=anchor; name=name; }
- virtual void writeLineNumber(const char *,const char *,
- const char *,int) {}
- virtual void startCodeLine() {}
- virtual void endCodeLine() {}
- virtual void startCodeAnchor(const char *) {}
- virtual void endCodeAnchor() {}
- virtual void startFontClass(const char *) {}
- virtual void endFontClass() {}
- virtual void writeCodeAnchor(const char *) {}
-};
-
-
-
-/*! create a new file definition, where \a p is the file path,
- \a nm the file name, and \a ref is an HTML anchor name if the
- file was read from a tag file or 0 otherwise
-*/
-FileDef::FileDef(const char *p,const char *nm,
- const char *lref,const char *dn)
- : Definition((QCString)p+nm,1,nm)
-{
- path=p;
- filepath=path+nm;
- filename=nm;
- diskname=dn;
- if (diskname.isEmpty()) diskname=nm;
- setReference(lref);
- //printf("new FileDef(path=%s,name=%s,ref=%s)\n",p,nm,lref);
- classSDict = new ClassSDict(17);
- includeList = new QList<IncludeInfo>;
- includeList->setAutoDelete(TRUE);
- includeDict = new QDict<IncludeInfo>(61);
- includedByList = new QList<IncludeInfo>;
- includedByList->setAutoDelete(TRUE);
- includedByDict = new QDict<IncludeInfo>(61);
- namespaceSDict = new NamespaceSDict;
- srcDefDict = 0;
- srcMemberDict = 0;
- usingDirList = 0;
- usingDeclList = 0;
- package = 0;
- isSource = FALSE;
- docname = nm;
- dir = 0;
- if (Config_getBool("FULL_PATH_NAMES"))
- {
- docname.prepend(stripFromPath(path.copy()));
- }
- memberGroupSDict = new MemberGroupSDict;
- memberGroupSDict->setAutoDelete(TRUE);
- acquireFileVersion();
-
- // members in the detailed part of the documentation
- docDefineMembers.setInFile(TRUE);
- docProtoMembers.setInFile(TRUE);
- docTypedefMembers.setInFile(TRUE);
- docEnumMembers.setInFile(TRUE);
- docFuncMembers.setInFile(TRUE);
- docVarMembers.setInFile(TRUE);
-
-}
-
-/*! destroy the file definition */
-FileDef::~FileDef()
-{
- delete classSDict;
- delete includeDict;
- delete includeList;
- delete includedByDict;
- delete includedByList;
- delete namespaceSDict;
- delete srcDefDict;
- delete srcMemberDict;
- delete usingDirList;
- delete usingDeclList;
- delete memberGroupSDict;
-}
-
-/*! Compute the HTML anchor names for all members in the class */
-void FileDef::computeAnchors()
-{
- setAnchors(0,'a',&allMemberList);
-}
-
-void FileDef::distributeMemberGroupDocumentation()
-{
- //printf("FileDef::distributeMemberGroupDocumentation()\n");
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->distributeMemberGroupDocumentation();
- }
-}
-
-void FileDef::findSectionsInDocumentation()
-{
- docFindSections(documentation(),this,0,docFile());
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->findSectionsInDocumentation();
- }
- decDefineMembers.findSectionsInDocumentation();
- decProtoMembers.findSectionsInDocumentation();
- decTypedefMembers.findSectionsInDocumentation();
- decEnumMembers.findSectionsInDocumentation();
- decFuncMembers.findSectionsInDocumentation();
- decVarMembers.findSectionsInDocumentation();
-}
-
-void FileDef::writeDetailedDocumentation(OutputList &ol)
-{
- if ((!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) ||
- !documentation().isEmpty()
- )
- {
- ol.writeRuler();
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Latex);
- ol.disable(OutputGenerator::RTF);
- ol.writeAnchor(0,"_details");
- ol.popGeneratorState();
- ol.startGroupHeader();
- ol.parseText(theTranslator->trDetailedDescription());
- ol.endGroupHeader();
- if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
- {
- ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
- }
- if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") &&
- !documentation().isEmpty())
- {
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
- ol.newParagraph();
- ol.enableAll();
- ol.disableAllBut(OutputGenerator::Man);
- ol.writeString("\n\n");
- ol.popGeneratorState();
- }
- if (!documentation().isEmpty())
- {
- //if (doc.at(dl-1)!='.' && doc.at(dl-1)!='!' && doc.at(dl-1)!='?')
- // doc+='.';
- ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
- }
- //printf("Writing source ref for file %s\n",name().data());
- if (Config_getBool("SOURCE_BROWSER"))
- {
- ol.newParagraph();
- QCString refText = theTranslator->trDefinedInSourceFile();
- int fileMarkerPos = refText.find("@0");
- if (fileMarkerPos!=-1) // should always pass this.
- {
- ol.parseText(refText.left(fileMarkerPos)); //text left from marker 1
- ol.writeObjectLink(0,getSourceFileBase(),
- 0,name());
- ol.parseText(refText.right(
- refText.length()-fileMarkerPos-2)); // text right from marker 2
- }
- }
- }
-}
-
-/*! Write the documentation page for this file to the file of output
- generators \a ol.
-*/
-void FileDef::writeDocumentation(OutputList &ol)
-{
- //funcList->countDecMembers();
-
- //QCString fn = name();
- //if (Config_getBool("FULL_PATH_NAMES"))
- //{
- // fn.prepend(stripFromPath(getPath().copy()));
- //}
-
- //printf("WriteDocumentation diskname=%s\n",diskname.data());
-
- QCString versionTitle;
- if (!fileVersion.isEmpty())
- {
- versionTitle=("("+fileVersion+")");
- }
- QCString title = docname+versionTitle;
- QCString pageTitle=theTranslator->trFileReference(docname);
- startFile(ol,getOutputFileBase(),name(),pageTitle);
-
- if (Config_getBool("SHOW_DIRECTORIES") && getDirDef())
- {
- getDirDef()->writeNavigationPath(ol);
- QCString pageTitleShort=theTranslator->trFileReference(name());
- startTitle(ol,getOutputFileBase());
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
- ol.parseText(pageTitleShort); // Html only
- ol.enableAll();
- ol.disable(OutputGenerator::Html);
- ol.parseText(pageTitle); // other output formats
- ol.popGeneratorState();
- addGroupListToTitle(ol,this);
- endTitle(ol,getOutputFileBase(),title);
- }
- else
- {
- startTitle(ol,getOutputFileBase());
- ol.parseText(pageTitle);
- addGroupListToTitle(ol,this);
- endTitle(ol,getOutputFileBase(),title);
- }
- if (!fileVersion.isEmpty())
- {
- ol.disableAllBut(OutputGenerator::Html);
- ol.startProjectNumber();
- ol.docify(versionTitle);
- ol.endProjectNumber();
- ol.enableAll();
- }
-
- if (Config_getBool("SEARCHENGINE"))
- {
- Doxygen::searchIndex->setCurrentDoc(pageTitle,getOutputFileBase());
- Doxygen::searchIndex->addWord(localName(),TRUE);
- }
-
- if (!Config_getString("GENERATE_TAGFILE").isEmpty())
- {
- Doxygen::tagFile << " <compound kind=\"file\">" << endl;
- Doxygen::tagFile << " <name>" << convertToXML(name()) << "</name>" << endl;
- Doxygen::tagFile << " <path>" << convertToXML(getPath()) << "</path>" << endl;
- Doxygen::tagFile << " <filename>"
- << convertToXML(getOutputFileBase())
- << "</filename>" << endl;
- }
-
- if (Config_getBool("DETAILS_AT_TOP"))
- {
- ol.startTextBlock();
- writeDetailedDocumentation(ol);
- ol.endTextBlock();
-
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
- ol.disable(OutputGenerator::RTF);
- ol.newParagraph();
- ol.popGeneratorState();
- }
- else if (!briefDescription().isEmpty())
- {
- ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE);
- //ol.writeString(" \n");
- ol.disableAllBut(OutputGenerator::Html);
- ol.startTextLink(0,"_details");
- ol.parseText(theTranslator->trMore());
- ol.endTextLink();
- ol.enableAll();
-
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
- ol.disable(OutputGenerator::RTF);
- ol.newParagraph();
- ol.popGeneratorState();
- }
- ol.writeSynopsis();
-
- if (Config_getBool("SHOW_INCLUDE_FILES") && includeList->count()>0)
- {
- ol.startTextBlock(TRUE);
- QListIterator<IncludeInfo> ili(*includeList);
- IncludeInfo *ii;
- for (;(ii=ili.current());++ili)
- {
- FileDef *fd=ii->fileDef;
- bool isIDLorJava = FALSE;
- if (fd)
- {
- isIDLorJava = fd->name().right(4)==".idl" ||
- fd->name().right(5)==".pidl" ||
- fd->name().right(5)==".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);
- if (!Config_getString("GENERATE_TAGFILE").isEmpty() && !fd->isReference())
- {
- const char *locStr = (ii->local || isIDLorJava) ? "yes" : "no";
- const char *impStr = (ii->imported || isIDLorJava) ? "yes" : "no";
- Doxygen::tagFile << " <includes id=\""
- << convertToXML(fd->getOutputFileBase()) << "\" "
- << "name=\"" << convertToXML(fd->name()) << "\" "
- << "local=\"" << locStr << "\" "
- << "imported=\"" << impStr << "\">"
- << convertToXML(ii->includeName)
- << "</includes>"
- << endl;
- }
- }
- 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.endTextBlock();
- }
-
- if (Config_getBool("HAVE_DOT") && Config_getBool("INCLUDE_GRAPH"))
- {
- //printf("Graph for file %s\n",name().data());
- DotInclDepGraph incDepGraph(this,Config_getInt("MAX_DOT_GRAPH_DEPTH"),FALSE);
- if (!incDepGraph.isTrivial())
- {
- ol.startTextBlock();
- ol.disable(OutputGenerator::Man);
- ol.newParagraph();
- ol.startInclDepGraph();
- ol.parseText(theTranslator->trInclDepGraph(name()));
- ol.endInclDepGraph(incDepGraph);
- ol.enableAll();
- ol.endTextBlock(TRUE);
- }
- //incDepGraph.writeGraph(Config_getString("HTML_OUTPUT"),fd->getOutputFileBase());
- }
-
- if (Config_getBool("HAVE_DOT") && Config_getBool("INCLUDED_BY_GRAPH"))
- {
- //printf("Graph for file %s\n",name().data());
- DotInclDepGraph incDepGraph(this,Config_getInt("MAX_DOT_GRAPH_DEPTH"),TRUE);
- if (!incDepGraph.isTrivial())
- {
- ol.startTextBlock();
- ol.disable(OutputGenerator::Man);
- ol.newParagraph();
- ol.startInclDepGraph();
- ol.parseText(theTranslator->trInclByDepGraph());
- ol.endInclDepGraph(incDepGraph);
- ol.enableAll();
- ol.endTextBlock(TRUE);
- }
- //incDepGraph.writeGraph(Config_getString("HTML_OUTPUT"),fd->getOutputFileBase());
- }
-
- //printf("%s: generateSourceFile()=%d\n",name().data(),generateSourceFile());
- if (generateSourceFile())
- {
- ol.disableAllBut(OutputGenerator::Html);
- ol.newParagraph();
- ol.startTextLink(includeName(),0);
- ol.parseText(theTranslator->trGotoSourceCode());
- ol.endTextLink();
- ol.enableAll();
- }
-
- ol.startMemberSections();
-
- if (namespaceSDict->count()>0)
- {
- NamespaceSDict::Iterator ndi(*namespaceSDict);
- NamespaceDef *nd;
- bool found=FALSE;
- for (ndi.toFirst();(nd=ndi.current());++ndi)
- {
- if (nd->name().find('@')==-1)
- {
- if (!found)
- {
- ol.startMemberHeader();
- ol.parseText(theTranslator->trNamespaces());
- ol.endMemberHeader();
- ol.startMemberList();
- found=TRUE;
- }
- ol.startMemberItem(0);
- ol.writeString("namespace ");
- ol.insertMemberAlign();
- if (nd->isLinkable())
- {
- ol.writeObjectLink(nd->getReference(),
- nd->getOutputFileBase(),
- 0,
- nd->displayName()
- );
- if (!Config_getString("GENERATE_TAGFILE").isEmpty())
- {
- Doxygen::tagFile << " <namespace>" << convertToXML(nd->name()) << "</namespace>" << endl;
- }
- }
- else
- {
- ol.startBold();
- ol.docify(nd->displayName());
- ol.endBold();
- }
- ol.endMemberItem();
- }
- }
- if (found) ol.endMemberList();
- }
-
- classSDict->writeDeclaration(ol);
-
- /* write user defined member groups */
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- if (mg->header()!="[NOHEADER]")
- {
- mg->writeDeclarations(ol,0,0,this,0);
- }
- }
-
- //allMemberList.writeDeclarations(ol,0,0,this,0,0,0);
- decDefineMembers.writeDeclarations(ol,0,0,this,0,theTranslator->trDefines(),0);
- decProtoMembers.writeDeclarations(ol,0,0,this,0,theTranslator->trFuncProtos(),0);
- decTypedefMembers.writeDeclarations(ol,0,0,this,0,theTranslator->trTypedefs(),0);
- decEnumMembers.writeDeclarations(ol,0,0,this,0,theTranslator->trEnumerations(),0);
- decFuncMembers.writeDeclarations(ol,0,0,this,0,theTranslator->trFunctions(),0);
- decVarMembers.writeDeclarations(ol,0,0,this,0,theTranslator->trVariables(),0);
- ol.endMemberSections();
-
- if (!Config_getBool("DETAILS_AT_TOP"))
- {
- writeDetailedDocumentation(ol);
- }
-
- writeMemberDocumentation(ol);
-
- // write Author section (Man only)
- ol.disableAllBut(OutputGenerator::Man);
- ol.startGroupHeader();
- ol.parseText(theTranslator->trAuthor(TRUE,TRUE));
- ol.endGroupHeader();
- ol.parseText(theTranslator->trGeneratedAutomatically(Config_getString("PROJECT_NAME")));
- ol.enableAll();
-
- if (!Config_getString("GENERATE_TAGFILE").isEmpty())
- {
- writeDocAnchorsToTagFile();
- Doxygen::tagFile << " </compound>" << endl;
- }
-
- endFile(ol);
-
- if (Config_getBool("SEPARATE_MEMBER_PAGES"))
- {
- allMemberList.sort();
- writeMemberPages(ol);
- }
-}
-
-void FileDef::writeMemberDocumentation(OutputList &ol)
-{
- if (Config_getBool("SEPARATE_MEMBER_PAGES"))
- {
- ol.disable(OutputGenerator::Html);
- }
-
- docDefineMembers.writeDocumentation(ol,name(),this,
- theTranslator->trDefineDocumentation());
-
- docProtoMembers.writeDocumentation(ol,name(),this,
- theTranslator->trFunctionPrototypeDocumentation());
-
- docTypedefMembers.writeDocumentation(ol,name(),this,
- theTranslator->trTypedefDocumentation());
-
- docEnumMembers.writeDocumentation(ol,name(),this,
- theTranslator->trEnumerationTypeDocumentation());
-
- docFuncMembers.writeDocumentation(ol,name(),this,
- theTranslator->trFunctionDocumentation());
-
- docVarMembers.writeDocumentation(ol,name(),this,
- theTranslator->trVariableDocumentation());
-
- if (Config_getBool("SEPARATE_MEMBER_PAGES"))
- {
- ol.enable(OutputGenerator::Html);
- }
-}
-
-void FileDef::writeMemberPages(OutputList &ol)
-{
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
-
- docDefineMembers.writeDocumentationPage(ol,name(),this);
- docProtoMembers.writeDocumentationPage(ol,name(),this);
- docTypedefMembers.writeDocumentationPage(ol,name(),this);
- docEnumMembers.writeDocumentationPage(ol,name(),this);
- docFuncMembers.writeDocumentationPage(ol,name(),this);
- docVarMembers.writeDocumentationPage(ol,name(),this);
-
- ol.popGeneratorState();
-}
-
-void FileDef::writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const
-{
- static bool createSubDirs=Config_getBool("CREATE_SUBDIRS");
-
- ol.writeString(" <div class=\"navtab\">\n");
- ol.writeString(" <table>\n");
-
- MemberListIterator mli(allMemberList);
- MemberDef *md;
- for (mli.toFirst();(md=mli.current());++mli)
- {
- if (md->getFileDef()==this && md->getNamespaceDef()==0 && md->isLinkable())
- {
- ol.writeString(" <tr><td class=\"navtab\">");
- if (md->isLinkableInProject())
- {
- 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(md->localName());
- ol.writeString("</a>");
- }
- ol.writeString("</td></tr>\n");
- }
- }
-
- ol.writeString(" </table>\n");
- ol.writeString(" </div>\n");
-}
-
-/*! Write a source listing of this file to the output */
-void FileDef::writeSource(OutputList &ol)
-{
- QCString title = docname;
- if (!fileVersion.isEmpty())
- {
- title+=(" ("+fileVersion+")");
- }
- QCString pageTitle = theTranslator->trSourceFile(title);
- ol.disableAllBut(OutputGenerator::Html);
- startFile(ol,getSourceFileBase(),0,pageTitle);
-
- if (Config_getBool("SHOW_DIRECTORIES") && getDirDef())
- {
- getDirDef()->writeNavigationPath(ol);
- startTitle(ol,getOutputFileBase());
- ol.parseText(name());
- endTitle(ol,getOutputFileBase(),title);
- }
- else
- {
- startTitle(ol,0);
- ol.parseText(title);
- endTitle(ol,0,0);
- }
-
- if (isLinkable())
- {
- ol.startTextLink(getOutputFileBase(),0);
- ol.parseText(theTranslator->trGotoDocumentation());
- ol.endTextLink();
- }
-
- ParserInterface *pIntf = Doxygen::parserManager->getParser(getDefFileExtension());
- pIntf->resetCodeParserState();
- ol.startCodeFragment();
- pIntf->parseCode(ol,0,
- fileToString(absFilePath(),Config_getBool("FILTER_SOURCE_FILES")),
- FALSE,0,this
- );
- ol.endCodeFragment();
- endFile(ol);
- ol.enableAll();
-}
-
-void FileDef::parseSource()
-{
- DevNullCodeDocInterface devNullIntf;
- ParserInterface *pIntf = Doxygen::parserManager->getParser(getDefFileExtension());
- pIntf->resetCodeParserState();
- pIntf->parseCode(
- devNullIntf,0,
- fileToString(absFilePath(),Config_getBool("FILTER_SOURCE_FILES")),
- FALSE,0,this
- );
-}
-
-void FileDef::addMembersToMemberGroup()
-{
- ::addMembersToMemberGroup(&decDefineMembers,memberGroupSDict,this);
- ::addMembersToMemberGroup(&decProtoMembers,memberGroupSDict,this);
- ::addMembersToMemberGroup(&decTypedefMembers,memberGroupSDict,this);
- ::addMembersToMemberGroup(&decEnumMembers,memberGroupSDict,this);
- ::addMembersToMemberGroup(&decFuncMembers,memberGroupSDict,this);
- ::addMembersToMemberGroup(&decVarMembers,memberGroupSDict,this);
-}
-
-/*! Adds member definition \a md to the list of all members of this file */
-void FileDef::insertMember(MemberDef *md)
-{
- //printf("%s:FileDef::insertMember(%s (=%p) list has %d elements)\n",
- // name().data(),md->name().data(),md,allMemberList.count());
- if (allMemberList.findRef(md)!=-1)
- {
- return;
- }
-
- allMemberList.append(md);
- bool sortBriefDocs = Config_getBool("SORT_BRIEF_DOCS");
- bool sortMemberDocs = Config_getBool("SORT_MEMBER_DOCS");
- switch (md->memberType())
- {
- case MemberDef::Variable:
- case MemberDef::Property:
- if (sortBriefDocs) decVarMembers.inSort(md); else decVarMembers.append(md);
- if (sortMemberDocs) docVarMembers.inSort(md); else docVarMembers.append(md);
- break;
- case MemberDef::Function:
- if (sortBriefDocs) decFuncMembers.inSort(md); else decFuncMembers.append(md);
- if (sortMemberDocs) docFuncMembers.inSort(md); else docFuncMembers.append(md);
- break;
- case MemberDef::Typedef:
- if (sortBriefDocs) decTypedefMembers.inSort(md); else decTypedefMembers.append(md);
- if (sortMemberDocs) docTypedefMembers.inSort(md); else docTypedefMembers.append(md);
- break;
- case MemberDef::Enumeration:
- if (sortBriefDocs) decEnumMembers.inSort(md); else decEnumMembers.append(md);
- if (sortMemberDocs) docEnumMembers.inSort(md); else docEnumMembers.append(md);
- break;
- case MemberDef::EnumValue: // enum values are shown inside their enums
- break;
- case MemberDef::Prototype:
- if (sortBriefDocs) decProtoMembers.inSort(md); else decProtoMembers.append(md);
- if (sortMemberDocs) docProtoMembers.inSort(md); else docProtoMembers.append(md);
- break;
- case MemberDef::Define:
- if (sortBriefDocs) decDefineMembers.inSort(md); else decDefineMembers.append(md);
- if (sortMemberDocs) docDefineMembers.inSort(md); else docDefineMembers.append(md);
- break;
- default:
- err("FileDef::insertMembers(): "
- "member `%s' with class scope `%s' inserted in file scope `%s'!\n",
- md->name().data(),
- md->getClassDef() ? md->getClassDef()->name().data() : "",
- name().data());
- }
- //addMemberToGroup(md,groupId);
-}
-
-/*! Adds compound definition \a cd to the list of all compounds of this file */
-void FileDef::insertClass(ClassDef *cd)
-{
- if (Config_getBool("SORT_BRIEF_DOCS"))
- classSDict->inSort(cd->name(),cd);
- else
- classSDict->append(cd->name(),cd);
-}
-
-/*! Adds namespace definition \a nd to the list of all compounds of this file */
-void FileDef::insertNamespace(NamespaceDef *nd)
-{
- if (!nd->name().isEmpty() && namespaceSDict->find(nd->name())==0)
- {
- if (Config_getBool("SORT_BRIEF_DOCS"))
- namespaceSDict->inSort(nd->name(),nd);
- else
- namespaceSDict->append(nd->name(),nd);
- }
-}
-
-void FileDef::addSourceRef(int line,Definition *d,MemberDef *md)
-{
- //printf("FileDef::addSourceDef(%d,%p,%p)\n",line,d,md);
- if (d)
- {
- if (srcDefDict==0) srcDefDict = new QIntDict<Definition>(257);
- if (srcMemberDict==0) srcMemberDict = new QIntDict<MemberDef>(257);
- srcDefDict->insert(line,d);
- if (md) srcMemberDict->insert(line,md);
- //printf("Adding member %s with anchor %s at line %d to file %s\n",
- // d->name().data(),anchor,line,name().data());
- }
-}
-
-Definition *FileDef::getSourceDefinition(int lineNr)
-{
- Definition *result=0;
- if (srcDefDict)
- {
- result = srcDefDict->find(lineNr);
- }
- return result;
-}
-
-MemberDef *FileDef::getSourceMember(int lineNr)
-{
- MemberDef *result=0;
- if (srcMemberDict)
- {
- result = srcMemberDict->find(lineNr);
- }
- return result;
-}
-
-
-void FileDef::addUsingDirective(NamespaceDef *nd)
-{
- if (usingDirList==0)
- {
- usingDirList = new NamespaceSDict;
- }
- if (usingDirList->find(nd->qualifiedName())==0)
- {
- usingDirList->append(nd->qualifiedName(),nd);
- }
-}
-
-void FileDef::addUsingDeclaration(Definition *d)
-{
- if (usingDeclList==0)
- {
- usingDeclList = new SDict<Definition>(17);
- }
- if (usingDeclList->find(d->qualifiedName())==0)
- {
- usingDeclList->append(d->qualifiedName(),d);
- }
-}
-
-void FileDef::addIncludeDependency(FileDef *fd,const char *incName,bool local,
- bool imported)
-{
- //printf("FileDef::addIncludeDependency(%p,%s,%d)\n",fd,incName,local);
- QCString iName = fd ? fd->absFilePath().data() : incName;
- if (!iName.isEmpty() && includeDict->find(iName)==0)
- {
- IncludeInfo *ii = new IncludeInfo;
- ii->fileDef = fd;
- ii->includeName = incName;
- ii->local = local;
- ii->imported = imported;
- includeList->append(ii);
- includeDict->insert(iName,ii);
- }
-}
-
-void FileDef::addIncludedUsingDirectives()
-{
- if (visited) return;
- visited=TRUE;
- //printf("( FileDef::addIncludedUsingDirectives for file %s\n",name().data());
-
- NamespaceList nl;
- if (includeList) // file contains #includes
- {
- {
- QListIterator<IncludeInfo> iii(*includeList);
- IncludeInfo *ii;
- for (iii.toFirst();(ii=iii.current());++iii) // foreach #include...
- {
- if (ii->fileDef && !ii->fileDef->visited) // ...that is a known file
- {
- // recurse into this file
- ii->fileDef->addIncludedUsingDirectives();
- }
- }
- }
- {
- QListIterator<IncludeInfo> iii(*includeList);
- IncludeInfo *ii;
- // iterate through list from last to first
- for (iii.toLast();(ii=iii.current());--iii)
- {
- if (ii->fileDef && ii->fileDef!=this)
- {
- NamespaceSDict *unl = ii->fileDef->usingDirList;
- if (unl)
- {
- NamespaceSDict::Iterator nli(*unl);
- NamespaceDef *nd;
- for (nli.toLast();(nd=nli.current());--nli)
- {
- // append each using directive found in a #include file
- if (usingDirList==0) usingDirList = new NamespaceSDict;
- //printf("Prepending used namespace %s to the list of file %s\n",
- // nd->name().data(),name().data());
- usingDirList->prepend(nd->qualifiedName(),nd);
- }
- }
- }
- }
- }
- }
- //printf(") end FileDef::addIncludedUsingDirectives for file %s\n",name().data());
-}
-
-
-void FileDef::addIncludedByDependency(FileDef *fd,const char *incName,
- bool local,bool imported)
-{
- //printf("FileDef::addIncludedByDependency(%p,%s,%d)\n",fd,incName,local);
- QCString iName = fd ? fd->absFilePath().data() : incName;
- if (!iName.isEmpty() && includedByDict->find(iName)==0)
- {
- IncludeInfo *ii = new IncludeInfo;
- ii->fileDef = fd;
- ii->includeName = incName;
- ii->local = local;
- ii->imported = imported;
- includedByList->append(ii);
- includedByDict->insert(iName,ii);
- }
-}
-
-bool FileDef::isIncluded(const QCString &name) const
-{
- if (name.isEmpty()) return FALSE;
- return includeDict->find(name)!=0;
-}
-
-bool FileDef::generateSourceFile() const
-{
- QCString extension = name().right(4);
- return !isReference() &&
- (Config_getBool("SOURCE_BROWSER") ||
- (Config_getBool("VERBATIM_HEADERS") && guessSection(name())==Entry::HEADER_SEC)
- ) &&
- extension!=".doc" && extension!=".txt" && extension!=".dox";
-}
-
-
-void FileDef::addListReferences()
-{
- addRefItem(xrefListItems(),
- theTranslator->trFile(TRUE,TRUE),
- getOutputFileBase(),name()
- );
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->addListReferences(this);
- }
- docDefineMembers.addListReferences(this);
- docProtoMembers.addListReferences(this);
- docTypedefMembers.addListReferences(this);
- docEnumMembers.addListReferences(this);
- docFuncMembers.addListReferences(this);
- docVarMembers.addListReferences(this);
-}
-
-//-------------------------------------------------------------------
-
-static int findMatchingPart(const QCString &path,const QCString dir)
-{
- int si1;
- int pos1=0,pos2=0;
- while ((si1=path.find('/',pos1))!=-1)
- {
- int si2=dir.find('/',pos2);
- //printf(" found slash at pos %d in path %d: %s<->%s\n",si1,si2,
- // path.mid(pos1,si1-pos2).data(),dir.mid(pos2).data());
- if (si2==-1 && path.mid(pos1,si1-pos2)==dir.mid(pos2)) // match at end
- {
- return dir.length();
- }
- if (si1!=si2 || path.mid(pos1,si1-pos2)!=dir.mid(pos2,si2-pos2)) // no match in middle
- {
- return QMAX(pos1-1,0);
- }
- pos1=si1+1;
- pos2=si2+1;
- }
- return 0;
-}
-
-static Directory *findDirNode(Directory *root,const QCString &name)
-{
- QListIterator<DirEntry> dli(root->children());
- DirEntry *de;
- for (dli.toFirst();(de=dli.current());++dli)
- {
- if (de->kind()==DirEntry::Dir)
- {
- Directory *dir = (Directory *)de;
- QCString dirName=dir->name();
- int sp=findMatchingPart(name,dirName);
- //printf("findMatchingPart(%s,%s)=%d\n",name.data(),dirName.data(),sp);
- if (sp>0) // match found
- {
- if ((uint)sp==dirName.length()) // whole directory matches
- {
- // 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);
- QCString oldBranchName=dirName.mid(sp+1);
- QCString newBranchName=name.mid(sp+1);
- // strip file name from path
- int newIndex=newBranchName.findRev('/');
- if (newIndex>0) newBranchName=newBranchName.left(newIndex);
-
- //printf("Splitting off part in new branch \n"
- // "base=%s old=%s new=%s\n",
- // baseName.data(),
- // oldBranchName.data(),
- // newBranchName.data()
- // );
- Directory *base = new Directory(root,baseName);
- Directory *newBranch = new Directory(base,newBranchName);
- dir->reParent(base);
- dir->rename(oldBranchName);
- base->addChild(dir);
- base->addChild(newBranch);
- dir->setLast(FALSE);
- // remove DirEntry container from list (without deleting it)
- root->children().setAutoDelete(FALSE);
- root->children().removeRef(dir);
- root->children().setAutoDelete(TRUE);
- // add new branch to the root
- if (!root->children().isEmpty())
- {
- root->children().last()->setLast(FALSE);
- }
- root->addChild(base);
- return newBranch;
- }
- }
- }
- }
- int si=name.findRev('/');
- if (si==-1) // no subdir
- {
- return root; // put the file under the root node.
- }
- 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().last()->setLast(FALSE);
- }
- root->addChild(newBranch);
- return newBranch;
- }
-}
-
-static void mergeFileDef(Directory *root,FileDef *fd)
-{
- QCString rootPath = root->name();
- QCString filePath = fd->absFilePath();
- //printf("merging %s\n",filePath.data());
- Directory *dirNode = findDirNode(root,filePath);
- if (!dirNode->children().isEmpty())
- {
- dirNode->children().last()->setLast(FALSE);
- }
- DirEntry *e=new DirEntry(dirNode,fd);
- dirNode->addChild(e);
-}
-
-#if 0
-static void generateIndent(QTextStream &t,DirEntry *de,int level)
-{
- if (de->parent())
- {
- generateIndent(t,de->parent(),level+1);
- }
- // from the root up to node n do...
- if (level==0) // item before a dir or document
- {
- if (de->isLast())
- {
- if (de->kind()==DirEntry::Dir)
- {
- t << "<img " << FTV_IMGATTRIBS(plastnode) << "/>";
- }
- else
- {
- t << "<img " << FTV_IMGATTRIBS(lastnode) << "/>";
- }
- }
- else
- {
- if (de->kind()==DirEntry::Dir)
- {
- t << "<img " << FTV_IMGATTRIBS(pnode) << "/>";
- }
- else
- {
- t << "<img " << FTV_IMGATTRIBS(node) << "/>";
- }
- }
- }
- else // item at another level
- {
- if (de->isLast())
- {
- t << "<img " << FTV_IMGATTRIBS(blank) << "/>";
- }
- else
- {
- t << "<img " << FTV_IMGATTRIBS(vertline) << "/>";
- }
- }
-}
-
-static void writeDirTreeNode(QTextStream &t,Directory *root,int level)
-{
- QCString indent;
- indent.fill(' ',level*2);
- QListIterator<DirEntry> dli(root->children());
- DirEntry *de;
- for (dli.toFirst();(de=dli.current());++dli)
- {
- t << indent << "<p>";
- generateIndent(t,de,0);
- if (de->kind()==DirEntry::Dir)
- {
- Directory *dir=(Directory *)de;
- //printf("%s [dir]: %s (last=%d,dir=%d)\n",indent.data(),dir->name().data(),dir->isLast(),dir->kind()==DirEntry::Dir);
- t << "<img " << FTV_IMGATTRIBS(folderclosed) << "/>";
- t << dir->name();
- t << "</p>\n";
- t << indent << "<div>\n";
- writeDirTreeNode(t,dir,level+1);
- t << indent << "</div>\n";
- }
- else
- {
- //printf("%s [file]: %s (last=%d,dir=%d)\n",indent.data(),de->file()->name().data(),de->isLast(),de->kind()==DirEntry::Dir);
- t << "<img " << FTV_IMGATTRIBS(doc) << "/>";
- t << de->file()->name();
- t << "</p>\n";
- }
- }
-}
-#endif
-
-static void addDirsAsGroups(Directory *root,GroupDef *parent,int level)
-{
- GroupDef *gd=0;
- if (root->kind()==DirEntry::Dir)
- {
- gd = new GroupDef("[generated]",
- 1,
- root->path(), // name
- root->name() // title
- );
- if (parent)
- {
- parent->addGroup(gd);
- gd->makePartOfGroup(parent);
- }
- else
- {
- Doxygen::groupSDict.append(root->path(),gd);
- }
- }
- QListIterator<DirEntry> dli(root->children());
- DirEntry *de;
- for (dli.toFirst();(de=dli.current());++dli)
- {
- if (de->kind()==DirEntry::Dir)
- {
- addDirsAsGroups((Directory *)de,gd,level+1);
- }
- }
-}
-
-void generateFileTree()
-{
- FTVHelp::generateTreeViewImages();
-
- Directory *root=new Directory(0,"root");
- root->setLast(TRUE);
- FileNameListIterator fnli(Doxygen::inputNameList);
- FileName *fn;
- for (fnli.toFirst();(fn=fnli.current());++fnli)
- {
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
- {
- mergeFileDef(root,fd);
- }
- }
- //t << "<div class=\"directory\">\n";
- //writeDirTreeNode(t,root,0);
- //t << "</div>\n";
- addDirsAsGroups(root,0,0);
- delete root;
-}
-
-//-------------------------------------------------------------------
-
-void FileDef::combineUsingRelations()
-{
- if (visited) return; // already done
- visited=TRUE;
- if (usingDirList)
- {
- NamespaceSDict::Iterator nli(*usingDirList);
- NamespaceDef *nd;
- for (nli.toFirst();(nd=nli.current());++nli)
- {
- nd->combineUsingRelations();
- }
- for (nli.toFirst();(nd=nli.current());++nli)
- {
- // 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);
- }
- }
- }
- }
-}
-
-bool FileDef::isDocumentationFile() const
-{
- return name().right(4)==".doc" ||
- name().right(4)==".txt" ||
- name().right(4)==".dox";
-}
-
-void FileDef::acquireFileVersion()
-{
- QCString vercmd = Config_getString("FILE_VERSION_FILTER");
- if (!vercmd.isEmpty())
- {
- msg("Version of %s : ",filepath.data());
- FILE *f=popen("\""+vercmd+"\" \""+filepath+"\"","r");
- if (!f)
- {
- err("Error: could not execute %s\n",vercmd.data());
- return;
- }
- const int bufSize=1024;
- char buf[bufSize];
- int numRead = fread(buf,1,bufSize,f);
- pclose(f);
- if (numRead > 0)
- {
- fileVersion = QCString(buf,numRead).stripWhiteSpace();
- msg("%s\n",fileVersion.data());
- }
- else
- {
- msg("no version available\n");
- }
- }
-}
-
-
-QCString FileDef::getSourceFileBase() const
-{
- if (Htags::useHtags)
- {
- return Htags::path2URL(filepath);
- }
- else
- {
- return convertNameToFile(diskname+"-source");
- }
-}
-
-/*! Returns the name of the verbatim copy of this file (if any). */
-QCString FileDef::includeName() const
-{
- if (Htags::useHtags)
- {
- return Htags::path2URL(filepath);
- }
- else
- {
- return convertNameToFile(diskname+"-source");
- }
-}
-
diff --git a/src/filedef.h b/src/filedef.h
deleted file mode 100644
index b7feb3d..0000000
--- a/src/filedef.h
+++ /dev/null
@@ -1,313 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 FILEDEF_H
-#define FILEDEF_H
-
-#include "index.h"
-#include <qlist.h>
-#include <qintdict.h>
-#include <qdict.h>
-#include "config.h"
-#include "definition.h"
-#include "memberlist.h"
-#include "util.h"
-
-class FileDef;
-class FileList;
-class ClassSDict;
-class ClassDef;
-class ClassList;
-class MemberDef;
-class OutputList;
-class NamespaceDef;
-class NamespaceSDict;
-class MemberGroupSDict;
-class PackageDef;
-class DirDef;
-
-struct IncludeInfo
-{
- IncludeInfo() { fileDef=0; local=FALSE; }
- ~IncludeInfo() {}
- FileDef *fileDef;
- QCString includeName;
- bool local;
- bool imported;
-};
-
-/*! \class FileDef filedef.h
- \brief A File definition.
-
- 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 : public Definition
-{
- friend class FileName;
-
- public:
- //enum FileType { Source, Header, Unknown };
-
- FileDef(const char *p,const char *n,const char *ref=0,const char *dn=0);
- ~FileDef();
- DefType definitionType() const { return TypeFile; }
-
- /*! Returns the unique file name (this may include part of the path). */
- QCString name() const
- {
- if (Config_getBool("FULL_PATH_NAMES"))
- return filename;
- else
- return Definition::name();
- }
-
- QCString getOutputFileBase() const
- { return convertNameToFile(diskname); }
-
- QCString getFileBase() const
- { return diskname; }
-
- QCString getSourceFileBase() const;
-
- /*! Returns the name of the verbatim copy of this file (if any). */
- QCString includeName() const;
-
- /*! Returns the absolute path including the file name. */
- QCString absFilePath() const { return filepath; }
-
-
- /*! Returns the name as it is used in the documentation */
- QCString docName() const { return docname; }
-
- void addSourceRef(int line,Definition *d,MemberDef *md);
- Definition *getSourceDefinition(int lineNr);
- MemberDef *getSourceMember(int lineNr);
-
- /* Sets the name of the include file to \a n. */
- //void setIncludeName(const char *n_) { incName=n_; }
-
- /*! Returns the absolute path of this file. */
- QCString getPath() const { return path; }
-
- /*! Returns version of this file. */
- QCString getVersion() const { return fileVersion; }
-
- bool isLinkableInProject() const
- {
- return hasDocumentation() && !isReference();
- }
-
- bool isLinkable() const
- {
- return isLinkableInProject() || isReference();
- }
- bool isIncluded(const QCString &name) const;
-
- void writeDetailedDocumentation(OutputList &ol);
- void writeDocumentation(OutputList &ol);
- void writeMemberDocumentation(OutputList &ol);
- void writeMemberPages(OutputList &ol);
- void writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const;
-
- void writeSource(OutputList &ol);
- void parseSource();
- friend void generatedFileNames();
- void insertMember(MemberDef *md);
- void insertClass(ClassDef *cd);
- void insertNamespace(NamespaceDef *nd);
- void computeAnchors();
-
- void setPackageDef(PackageDef *pd) { package=pd; }
- PackageDef *packageDef() const { return package; }
-
- void setDirDef(DirDef *dd) { dir=dd; }
- DirDef *getDirDef() const { return dir; }
-
- void addUsingDirective(NamespaceDef *nd);
- NamespaceSDict *getUsedNamespaces() const { return usingDirList; }
- void addUsingDeclaration(Definition *def);
- SDict<Definition> *getUsedClasses() const { return usingDeclList; }
- void combineUsingRelations();
-
- bool generateSourceFile() const;
-
- void addIncludeDependency(FileDef *fd,const char *incName,bool local,bool imported);
- void addIncludedByDependency(FileDef *fd,const char *incName,bool local,bool imported);
- QList<IncludeInfo> *includeFileList() const { return includeList; }
- QList<IncludeInfo> *includedByFileList() const { return includedByList; }
-
- void addMembersToMemberGroup();
- void distributeMemberGroupDocumentation();
- void findSectionsInDocumentation();
- void addIncludedUsingDirectives();
-
- void addListReferences();
- bool isDocumentationFile() const;
-
- //void generateXML(QTextStream &t);
- //void generateXMLSection(QTextStream &t,MemberList *ml,const char *type);
-
- MemberList allMemberList;
-
- // members in the declaration part of the documentation
- MemberList decDefineMembers;
- MemberList decProtoMembers;
- MemberList decTypedefMembers;
- MemberList decEnumMembers;
- MemberList decFuncMembers;
- MemberList decVarMembers;
-
- // members in the detailed part of the documentation
- MemberList docDefineMembers;
- MemberList docProtoMembers;
- MemberList docTypedefMembers;
- MemberList docEnumMembers;
- MemberList docFuncMembers;
- MemberList docVarMembers;
-
- /* user defined member groups */
- MemberGroupSDict *memberGroupSDict;
-
- NamespaceSDict *namespaceSDict;
- ClassSDict *classSDict;
-
- bool visited;
-
- protected:
- /**
- * Retrieves the file version from version control system.
- */
- void acquireFileVersion();
-
-
- private:
-
- QDict<IncludeInfo> *includeDict;
- QList<IncludeInfo> *includeList;
- QDict<IncludeInfo> *includedByDict;
- QList<IncludeInfo> *includedByList;
- NamespaceSDict *usingDirList;
- SDict<Definition> *usingDeclList;
- QCString path;
- QCString filepath;
- QCString diskname;
- QCString filename;
- QCString docname;
- QIntDict<Definition> *srcDefDict;
- QIntDict<MemberDef> *srcMemberDict;
- bool isSource;
- QCString fileVersion;
-
- PackageDef *package;
- DirDef *dir;
-};
-
-
-class FileList : public QList<FileDef>
-{
- public:
- FileList() : m_pathName("tmp") {}
- FileList(const char *path) : QList<FileDef>(), m_pathName(path) {}
- ~FileList() {}
- QCString path() const { return m_pathName; }
- int compareItems(GCI item1,GCI item2)
- {
- FileDef *md1 = (FileDef *)item1;
- FileDef *md2 = (FileDef *)item2;
- return stricmp(md1->name(),md2->name());
- }
- private:
- QCString m_pathName;
-};
-
-class OutputNameList : public QList<FileList>
-{
- public:
- OutputNameList() : QList<FileList>() {}
- ~OutputNameList() {}
- int compareItems(GCI item1,GCI item2)
- {
- FileList *fl1 = (FileList *)item1;
- FileList *fl2 = (FileList *)item2;
- return stricmp(fl1->path(),fl2->path());
- }
-};
-
-class OutputNameDict : public QDict<FileList>
-{
- public:
- OutputNameDict(int size) : QDict<FileList>(size) {}
- ~OutputNameDict() {}
-};
-
-class Directory;
-
-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),
- m_isLast(FALSE) { }
- 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; }
- FileDef *file() const { return m_fd; }
- bool isLast() const { return m_isLast; }
- void setLast(bool b) { m_isLast=b; }
- DirEntry *parent() const { return m_parent; }
- QCString name() const { return m_name; }
- QCString path() const { return parent() ? parent()->path()+"/"+name() : name(); }
-
- protected:
- DirEntry *m_parent;
- QCString m_name;
- private:
- EntryKind m_kind;
- FileDef *m_fd;
- int num;
- bool m_isLast;
-};
-
-class Directory : public DirEntry
-{
- public:
- Directory(Directory *parent,const QCString &name)
- : DirEntry(parent,name)
- { m_children.setAutoDelete(TRUE); }
- virtual ~Directory() {}
- void addChild(DirEntry *d) { m_children.append(d); d->setLast(TRUE); }
- QList<DirEntry> &children() { return m_children; }
- void rename(const QCString &name) { m_name=name; }
- void reParent(Directory *parent) { m_parent=parent; }
-
- private:
- QList<DirEntry> m_children;
-};
-
-//void generateFileTree(QTextStream &t);
-void generateFileTree();
-
-#endif
-
diff --git a/src/filename.cpp b/src/filename.cpp
deleted file mode 100644
index 76bffe7..0000000
--- a/src/filename.cpp
+++ /dev/null
@@ -1,144 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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"
-
-FileName::FileName(const char *fn,const char *n) : FileList()
-{
- setAutoDelete(TRUE);
- fName=fn;
- name=n;
-}
-
-FileName::~FileName()
-{
-}
-
-
-void FileName::generateDiskNames()
-{
- //QCString commonPrefix;
- FileDef *fd=first();
- int count=0;
- while (fd)
- {
- if (!fd->isReference()) count++;
- fd=next();
- }
- if (count==1)
- {
- fd=first();
- // skip references
- while (fd && fd->isReference()) fd=next();
- // name if unique, so diskname is simply the name
- //printf("!!!!!!!! Unique disk name=%s for fd=%s\n",name.data(),fd->diskname.data());
- fd->diskname=name.copy();
- }
- 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
- {
- fd=first();
- while (fd && fd->isReference()) fd=next();
- char c=fd->path.at(i);
- if (c=='/') j=i; // remember last position of dirname
- fd=next();
- while (fd && !found)
- {
- 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)fd->path.length())
- {
- //warning("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 (fd->path[i]!=c)
- {
- found=TRUE;
- }
- }
- fd=next();
- }
- i++;
- }
- fd=first();
- while (fd)
- {
- //printf("fd->setName(%s)\n",(fd->path.right(fd->path.length()-j-1)+name).data());
- if (!fd->isReference())
- {
- QCString prefix = fd->path.right(fd->path.length()-j-1);
- fd->setName(prefix+name);
- //printf("!!!!!!!! non unique disk name=%s for fd=%s\n",(prefix+name).data(),fd->diskname.data());
- fd->diskname=prefix+name;
- }
- fd=next();
- }
- }
-}
-
-int FileName::compareItems(GCI item1, GCI item2)
-{
- FileName *f1=(FileName *)item1;
- FileName *f2=(FileName *)item2;
- return stricmp(f1->fileName(),f2->fileName());
-}
-
-FileNameIterator::FileNameIterator(const FileName &fname) :
- QListIterator<FileDef>(fname)
-{
-}
-
-FileNameList::FileNameList() : QList<FileName>()
-{
-}
-
-FileNameList::~FileNameList()
-{
-}
-
-void FileNameList::generateDiskNames()
-{
- FileName *fn=first();
- while (fn)
- {
- fn->generateDiskNames();
- fn=next();
- }
-}
-
-int FileNameList::compareItems(GCI item1, GCI item2)
-{
- FileName *f1=(FileName *)item1;
- FileName *f2=(FileName *)item2;
- //printf("FileNameList::compareItems `%s'<->`%s'\n",
- // f1->fileName(),f2->fileName());
- return Config_getBool("FULL_PATH_NAMES") ?
- stricmp(f1->fullName(),f2->fullName()) :
- stricmp(f1->fileName(),f2->fileName());
-}
-
-FileNameListIterator::FileNameListIterator(const FileNameList &fnlist) :
- QListIterator<FileName>(fnlist)
-{
-}
diff --git a/src/filename.h b/src/filename.h
deleted file mode 100644
index 87975d5..0000000
--- a/src/filename.h
+++ /dev/null
@@ -1,69 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 FILENAME_H
-#define FILENAME_H
-
-#include "qtbc.h"
-#include <qdict.h>
-#include "filedef.h"
-
-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();
- int compareItems(GCI item1,GCI item2);
-
- private:
- QCString name;
- QCString fName;
-};
-
-class FileNameIterator : public QListIterator<FileDef>
-{
- public:
- FileNameIterator(const FileName &list);
-};
-
-class FileNameList : public QList<FileName>
-{
- public:
- FileNameList();
- ~FileNameList();
- void generateDiskNames();
- int compareItems(GCI item1,GCI item2);
-};
-
-class FileNameListIterator : public QListIterator<FileName>
-{
- public:
- FileNameListIterator( const FileNameList &list );
-};
-
-class FileNameDict : public QDict<FileName>
-{
- public:
- FileNameDict(uint size) :
- QDict<FileName>(size,Config_getBool("CASE_SENSE_NAMES")) {}
- ~FileNameDict() {}
-};
-
-#endif
diff --git a/src/formula.cpp b/src/formula.cpp
deleted file mode 100644
index 07c6bb4..0000000
--- a/src/formula.cpp
+++ /dev/null
@@ -1,353 +0,0 @@
-/******************************************************************************
- i
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-
-#include <stdlib.h>
-#include <unistd.h>
-#ifdef _WIN32
-#include <windows.h>
-#endif
-
-#include "qtbc.h"
-#include <qfile.h>
-#include <qtextstream.h>
-#include <qfileinfo.h>
-#include <qdir.h>
-
-#include "formula.h"
-#include "image.h"
-#include "util.h"
-#include "message.h"
-#include "config.h"
-
-Formula::Formula(const char *text)
-{
- static int count=0;
- number = count++;
- form=text;
-}
-
-Formula::~Formula()
-{
-}
-
-int Formula::getId()
-{
- return number;
-}
-
-void FormulaList::generateBitmaps(const char *path)
-{
- int x1,y1,x2,y2;
- QDir d(path);
- // store the original directory
- if (!d.exists()) { err("Error: Output dir %s does not exist!\n",path); exit(1); }
- QCString oldDir = convertToQCString(QDir::currentDirPath());
- // go to the html output directory (i.e. path)
- QDir::setCurrent(d.absPath());
- QDir thisDir;
- // generate a latex file containing one formula per page.
- QCString texName="_formulas.tex";
- QList<int> pagesToGenerate;
- pagesToGenerate.setAutoDelete(TRUE);
- FormulaListIterator fli(*this);
- Formula *formula;
- QFile f(texName);
- bool formulaError=FALSE;
- if (f.open(IO_WriteOnly))
- {
- QTextStream t(&f);
- if (Config_getBool("LATEX_BATCHMODE")) t << "\\batchmode" << endl;
- t << "\\documentclass{article}" << endl;
- t << "\\usepackage{epsfig}" << endl; // for those who want to include images
- const char *s=Config_getList("EXTRA_PACKAGES").first();
- while (s)
- {
- t << "\\usepackage{" << s << "}\n";
- s=Config_getList("EXTRA_PACKAGES").next();
- }
- t << "\\pagestyle{empty}" << endl;
- t << "\\begin{document}" << endl;
- int page=0;
- for (fli.toFirst();(formula=fli.current());++fli)
- {
- QCString resultName;
- resultName.sprintf("form_%d.png",formula->getId());
- // 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));
- }
- page++;
- }
- t << "\\end{document}" << endl;
- f.close();
- }
- if (pagesToGenerate.count()>0) // there are new formulas
- {
- //printf("Running latex...\n");
- //system("latex _formulas.tex </dev/null >/dev/null");
- QCString latexCmd = Config_getString("LATEX_CMD_NAME");
- if (latexCmd.isEmpty()) latexCmd="latex";
- if (iSystem(latexCmd,"_formulas.tex")!=0)
- {
- err("Problems running latex. Check your installation or look for typos in _formulas.tex!\n");
- formulaError=TRUE;
- //return;
- }
- //printf("Running dvips...\n");
- QListIterator<int> pli(pagesToGenerate);
- int *pagePtr;
- int pageIndex=1;
- for (;(pagePtr=pli.current());++pli,++pageIndex)
- {
- int pageNum=*pagePtr;
- msg("Generating image form_%d.png for formula\n",pageNum);
- char dviArgs[4096];
- QCString formBase;
- formBase.sprintf("_form%d",pageNum);
- // run dvips to convert the page with number pageIndex to an
- // encapsulated postscript.
- sprintf(dviArgs,"-q -D 600 -E -n 1 -p %d -o %s.eps _formulas.dvi",
- pageIndex,formBase.data());
- if (iSystem("dvips",dviArgs)!=0)
- {
- err("Problems running dvips. Check your installation!\n");
- return;
- }
- // now we read the generated postscript file to extract the bounding box
- QFileInfo fi(formBase+".eps");
- if (fi.exists())
- {
- QCString eps = fileToString(formBase+".eps");
- int i=eps.find("%%BoundingBox:");
- if (i!=-1)
- {
- sscanf(eps.data()+i,"%%%%BoundingBox:%d %d %d %d",&x1,&y1,&x2,&y2);
- }
- else
- {
- err("Error: Couldn't extract bounding box!\n");
- }
- }
- // 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))
- {
- QTextStream 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.
- const double scaleFactor = 16.0/3.0;
- int gx = (((int)((x2-x1)*scaleFactor))+3)&~2;
- int gy = (((int)((y2-y1)*scaleFactor))+3)&~2;
- // Then we run ghostscript to convert the postscript to a pixmap
- // The pixmap is a truecolor image, where only black and white are
- // used.
-#if defined(_WIN32) && !defined(__CYGWIN__)
- char gsArgs[256];
- sprintf(gsArgs,"-q -g%dx%d -r%dx%dx -sDEVICE=ppmraw "
- "-sOutputFile=%s.pnm -dNOPAUSE -dBATCH -- %s.ps",
- gx,gy,(int)(scaleFactor*72),(int)(scaleFactor*72),
- formBase.data(),formBase.data()
- );
- // gswin32 is a GUI api which will pop up a window and run
- // asynchronously. To prevent both, we use ShellExecuteEx and
- // WaitForSingleObject (thanks to Robert Golias for the code)
- SHELLEXECUTEINFO sInfo = {
- sizeof(SHELLEXECUTEINFO), /* structure size */
- SEE_MASK_NOCLOSEPROCESS, /* leave the process running */
- NULL, /* window handle */
- NULL, /* action to perform: open */
- "gswin32.exe", /* file to execute */
- gsArgs, /* argument list */
- NULL, /* use current working dir */
- SW_HIDE, /* minimize on start-up */
- 0, /* application instance handle */
- NULL, /* ignored: id list */
- NULL, /* ignored: class name */
- NULL, /* ignored: key class */
- 0, /* ignored: hot key */
- NULL, /* ignored: icon */
- NULL /* resulting application handle */
- };
- if (!ShellExecuteEx(&sInfo))
- {
- err("Problem running ghostscript. Check your installation!\n");
- return;
- }
- else if (sInfo.hProcess) /* executable was launched, wait for it to finish */
- {
- WaitForSingleObject(sInfo.hProcess,INFINITE);
- }
-#else
- char gsArgs[4096];
- sprintf(gsArgs,"-q -g%dx%d -r%dx%dx -sDEVICE=ppmraw "
- "-sOutputFile=%s.pnm -dNOPAUSE -dBATCH -- %s.ps",
- gx,gy,(int)(scaleFactor*72),(int)(scaleFactor*72),
- formBase.data(),formBase.data()
- );
- if (iSystem("gs",gsArgs)!=0)
- {
- err("Problem running ghostscript. Check your installation!\n");
- return;
- }
-#endif
- 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))
- {
- QTextStream t(&f);
- QCString s;
- if (!t.eof())
- s=t.readLine();
- if (s.length()<2 || s.left(2)!="P6")
- err("Error: ghostscript produced an illegal image format!");
- else
- {
- // assume the size if after the first line that does not start with
- // # excluding the first line of the file.
- while (!t.eof() && (s=t.readLine()) && !s.isEmpty() && s.at(0)=='#');
- sscanf(s,"%d %d",&imageX,&imageY);
- }
- if (imageX>0 && imageY>0)
- {
- //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++)
- {
- for (x=0;x<srcImage.getWidth();x++)
- {
- int s=0;
- for (iy=0;iy<2;iy++)
- {
- for (ix=0;ix<2;ix++)
- {
- s+=srcImage.getPixel(x+ix-1,y+iy-1)*filterMask[iy*3+ix];
- }
- }
- 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 png
- 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;
- }
- f.close();
- }
- // remove intermediate image files
- thisDir.remove(formBase+".eps");
- thisDir.remove(formBase+".pnm");
- thisDir.remove(formBase+".ps");
- }
- // remove intermediate files produced by latex
- thisDir.remove("_formulas.dvi");
- thisDir.remove("_formulas.log");
- 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
- // generated pngs represent (we use this next time to avoid regeneration
- // of the pngs, and to avoid forcing the user to delete all pngs in order
- // to let a browser refresh the images).
- f.setName("formula.repository");
- if (f.open(IO_WriteOnly))
- {
- QTextStream t(&f);
- for (fli.toFirst();(formula=fli.current());++fli)
- {
- t << "\\form#" << formula->getId() << ":" << formula->getFormulaText() << endl;
- }
- f.close();
- }
- // reset the directory to the original location.
- QDir::setCurrent(oldDir);
-}
-
-
-#ifdef FORMULA_TEST
-int main()
-{
- 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;
-}
-#endif
diff --git a/src/formula.h b/src/formula.h
deleted file mode 100644
index f90f0c6..0000000
--- a/src/formula.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 FORMULA_H
-#define FORMULA_H
-
-#include "qtbc.h"
-#include <qlist.h>
-#include <qdict.h>
-
-class Formula
-{
- public:
- Formula(const char *text);
- ~Formula();
- int getId();
- QCString getFormulaText() const { return form; }
-
- private:
- int number;
- QCString form;
-};
-
-class FormulaList : public QList<Formula>
-{
- public:
- void generateBitmaps(const char *path);
-};
-
-class FormulaListIterator : public QListIterator<Formula>
-{
- public:
- FormulaListIterator(const FormulaList &l) :
- QListIterator<Formula>(l) {}
-};
-
-class FormulaDict : public QDict<Formula>
-{
- public:
- FormulaDict(uint size) :
- QDict<Formula>(size) {}
- ~FormulaDict() {}
-};
-
-#endif
diff --git a/src/ftvhelp.cpp b/src/ftvhelp.cpp
deleted file mode 100644
index 27310ca..0000000
--- a/src/ftvhelp.cpp
+++ /dev/null
@@ -1,788 +0,0 @@
-/******************************************************************************
- * ftvhelp.cpp,v 1.0 2000/09/06 16:09:00
- *
- * Contributed by Kenney Wong <kwong@ea.com>
- * Modified by Dimitri van Heesch (c) 2003
- *
- * Folder Tree View for offline help on browsers that do not support HTML Help.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <qlist.h>
-#include <qdict.h>
-#include <qfileinfo.h>
-
-#include "ftvhelp.h"
-#include "config.h"
-#include "message.h"
-#include "doxygen.h"
-#include "language.h"
-
-#define MAX_INDENT 1024
-
-unsigned char ftv2blank_png[] = {
- 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
- 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x16,
- 0x01, 0x00, 0x00, 0x00, 0x01, 0x96, 0xd6, 0x11, 0x47, 0x00, 0x00, 0x00,
- 0x02, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x01, 0x01, 0x94, 0xfd, 0xae, 0x00,
- 0x00, 0x00, 0x16, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77,
- 0x61, 0x72, 0x65, 0x00, 0x67, 0x69, 0x66, 0x32, 0x70, 0x6e, 0x67, 0x20,
- 0x32, 0x2e, 0x34, 0x2e, 0x32, 0xa3, 0x5e, 0x47, 0x0e, 0x00, 0x00, 0x00,
- 0x25, 0x74, 0x45, 0x58, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74,
- 0x00, 0x55, 0x6c, 0x65, 0x61, 0x64, 0x20, 0x47, 0x49, 0x46, 0x20, 0x53,
- 0x6d, 0x61, 0x72, 0x74, 0x53, 0x61, 0x76, 0x65, 0x72, 0x20, 0x56, 0x65,
- 0x72, 0x20, 0x32, 0x2e, 0x30, 0x21, 0xf8, 0xd7, 0x5e, 0x53, 0x00, 0x00,
- 0x00, 0x14, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x63, 0x38, 0xc0, 0x80,
- 0x80, 0x1f, 0x30, 0xe0, 0x7f, 0x42, 0x90, 0x00, 0x02, 0x00, 0x78, 0x3c,
- 0x32, 0xcb, 0x72, 0x8f, 0x7c, 0x12, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45,
- 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
-};
-
-unsigned char ftv2doc_png[] = {
- 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
- 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x16,
- 0x04, 0x03, 0x00, 0x00, 0x01, 0x5f, 0x54, 0x71, 0x2d, 0x00, 0x00, 0x00,
- 0x15, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff,
- 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0xff, 0xb3, 0xbd, 0xfb, 0xc8, 0x00, 0x00, 0x00, 0x01, 0x74, 0x52,
- 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00, 0x00, 0x16, 0x74,
- 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x00,
- 0x67, 0x69, 0x66, 0x32, 0x70, 0x6e, 0x67, 0x20, 0x32, 0x2e, 0x34, 0x2e,
- 0x32, 0xa3, 0x5e, 0x47, 0x0e, 0x00, 0x00, 0x00, 0x76, 0x49, 0x44, 0x41,
- 0x54, 0x78, 0xda, 0x63, 0x60, 0x60, 0x60, 0x60, 0x63, 0x60, 0x60, 0x64,
- 0x00, 0x01, 0x27, 0x30, 0x62, 0x71, 0x01, 0xe2, 0x24, 0x06, 0x38, 0x60,
- 0x71, 0x00, 0xca, 0x27, 0x33, 0x30, 0x30, 0x01, 0x31, 0xa3, 0x32, 0x03,
- 0x0a, 0x70, 0x54, 0x32, 0x01, 0x53, 0x69, 0x60, 0x71, 0x27, 0x08, 0x15,
- 0x1a, 0x1a, 0xca, 0x80, 0x01, 0x5c, 0x5c, 0xc0, 0x94, 0xa2, 0x90, 0x02,
- 0x88, 0x52, 0x4b, 0x52, 0x05, 0x53, 0x69, 0xc8, 0x94, 0x18, 0x84, 0x52,
- 0x52, 0x12, 0xc5, 0x69, 0x0a, 0x36, 0xe0, 0xa4, 0xa4, 0xa4, 0x68, 0x82,
- 0xc4, 0x51, 0x82, 0x6b, 0x04, 0x71, 0x14, 0x4d, 0x61, 0x4e, 0x55, 0x04,
- 0xf2, 0x60, 0x1c, 0x27, 0x45, 0x24, 0x19, 0x90, 0x01, 0x70, 0x19, 0x67,
- 0x63, 0x20, 0x30, 0xc5, 0x6f, 0x23, 0x00, 0xf5, 0xd0, 0x11, 0xe0, 0x55,
- 0x83, 0x47, 0xbd, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae,
- 0x42, 0x60, 0x82
-};
-
-unsigned char ftv2folderclosed_png[] = {
- 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
- 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x16,
- 0x04, 0x03, 0x00, 0x00, 0x01, 0x5f, 0x54, 0x71, 0x2d, 0x00, 0x00, 0x00,
- 0x12, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xc0,
- 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80, 0x00, 0x80, 0x42,
- 0xee, 0x40, 0xe1, 0x00, 0x00, 0x00, 0x01, 0x74, 0x52, 0x4e, 0x53, 0x00,
- 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00, 0x00, 0x16, 0x74, 0x45, 0x58, 0x74,
- 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x00, 0x67, 0x69, 0x66,
- 0x32, 0x70, 0x6e, 0x67, 0x20, 0x32, 0x2e, 0x34, 0x2e, 0x32, 0xa3, 0x5e,
- 0x47, 0x0e, 0x00, 0x00, 0x00, 0x7d, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda,
- 0x8d, 0x8e, 0xc1, 0x0a, 0x84, 0x30, 0x10, 0x43, 0x23, 0x8c, 0x77, 0x0f,
- 0xfb, 0x03, 0x42, 0xbd, 0x2b, 0xf8, 0x01, 0x65, 0x6d, 0xef, 0xa2, 0xcd,
- 0xff, 0xff, 0x8a, 0x33, 0xad, 0xee, 0x5a, 0xf6, 0xb0, 0x06, 0xda, 0xf0,
- 0x86, 0xa6, 0x13, 0x00, 0x88, 0x40, 0x03, 0x53, 0x02, 0x82, 0x9a, 0xd7,
- 0x51, 0x42, 0x25, 0xae, 0x7a, 0x76, 0xa0, 0xed, 0xea, 0x79, 0x79, 0x17,
- 0x49, 0x73, 0xe1, 0xf2, 0x32, 0x14, 0x8f, 0x5f, 0x49, 0xb9, 0xed, 0x23,
- 0x60, 0x20, 0xcd, 0x36, 0x66, 0xe4, 0x40, 0x4b, 0xb4, 0xdb, 0xdb, 0xe5,
- 0x16, 0xee, 0x16, 0x78, 0x20, 0xf9, 0x96, 0x15, 0x6d, 0xc2, 0x8b, 0xa2,
- 0x6e, 0xf9, 0x50, 0x64, 0xa6, 0x70, 0xb6, 0x50, 0x0a, 0xd3, 0x78, 0x86,
- 0x98, 0xa6, 0xde, 0x5d, 0x9d, 0x25, 0xcd, 0xfe, 0xdf, 0xc6, 0x03, 0xa0,
- 0x13, 0x15, 0x98, 0x60, 0xbd, 0x81, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x49,
- 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
-};
-
-unsigned char ftv2folderopen_png[] = {
- 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
- 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x16,
- 0x04, 0x03, 0x00, 0x00, 0x01, 0x5f, 0x54, 0x71, 0x2d, 0x00, 0x00, 0x00,
- 0x15, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0xff,
- 0xff, 0xff, 0xc0, 0xc0, 0xc0, 0x80, 0x80, 0x80, 0x00, 0x00, 0x00, 0x80,
- 0x00, 0x80, 0x92, 0x32, 0x8c, 0xe5, 0x00, 0x00, 0x00, 0x01, 0x74, 0x52,
- 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00, 0x00, 0x16, 0x74,
- 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x00,
- 0x67, 0x69, 0x66, 0x32, 0x70, 0x6e, 0x67, 0x20, 0x32, 0x2e, 0x34, 0x2e,
- 0x32, 0xa3, 0x5e, 0x47, 0x0e, 0x00, 0x00, 0x00, 0x7c, 0x49, 0x44, 0x41,
- 0x54, 0x78, 0xda, 0x85, 0x8d, 0x41, 0x0e, 0x82, 0x30, 0x10, 0x45, 0x5f,
- 0x08, 0xf5, 0x1e, 0x2d, 0x53, 0xd6, 0xc6, 0x18, 0xd7, 0x8d, 0x18, 0xd7,
- 0x06, 0xd2, 0x1e, 0xa0, 0xb1, 0xde, 0xff, 0x08, 0x3a, 0x20, 0x21, 0x10,
- 0xa2, 0x6f, 0xf3, 0xfe, 0xff, 0x8b, 0x19, 0x80, 0x0a, 0x6a, 0x14, 0x81,
- 0x3c, 0x06, 0x2a, 0x61, 0xc5, 0xd3, 0x43, 0x69, 0xc1, 0xb4, 0xab, 0xf9,
- 0x70, 0xac, 0x83, 0xca, 0xbb, 0xfb, 0xa4, 0x8b, 0xae, 0x26, 0x46, 0xb6,
- 0x4c, 0x0f, 0xe8, 0xc3, 0x18, 0xfa, 0xb3, 0x7d, 0xa8, 0x1a, 0xeb, 0x17,
- 0xa5, 0x46, 0x54, 0x46, 0x4e, 0x2a, 0xe2, 0xce, 0x95, 0x3d, 0xba, 0xb0,
- 0x64, 0x93, 0x85, 0x9b, 0x0b, 0x73, 0x71, 0x83, 0x75, 0xd7, 0xf2, 0xa7,
- 0x90, 0xf2, 0x20, 0x9d, 0xfb, 0x16, 0xd2, 0xeb, 0x43, 0xf9, 0xfd, 0xf2,
- 0x0d, 0xa4, 0x29, 0x14, 0xcb, 0xda, 0x47, 0xac, 0x44, 0x00, 0x00, 0x00,
- 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
-};
-
-unsigned char ftv2lastnode_png[] = {
- 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
- 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x16,
- 0x04, 0x03, 0x00, 0x00, 0x01, 0x4c, 0x83, 0x31, 0xd9, 0x00, 0x00, 0x00,
- 0x30, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x80, 0x80, 0x80, 0x18, 0xd3, 0xa0, 0x90, 0x00, 0x00, 0x00,
- 0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00,
- 0x00, 0x16, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61,
- 0x72, 0x65, 0x00, 0x67, 0x69, 0x66, 0x32, 0x70, 0x6e, 0x67, 0x20, 0x32,
- 0x2e, 0x34, 0x2e, 0x32, 0xa3, 0x5e, 0x47, 0x0e, 0x00, 0x00, 0x00, 0x26,
- 0x74, 0x45, 0x58, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00,
- 0x55, 0x6c, 0x65, 0x61, 0x64, 0x20, 0x47, 0x49, 0x46, 0x20, 0x53, 0x6d,
- 0x61, 0x72, 0x74, 0x53, 0x61, 0x76, 0x65, 0x72, 0x20, 0x56, 0x65, 0x72,
- 0x20, 0x32, 0x2e, 0x30, 0x69, 0x01, 0x6f, 0x3f, 0xcd, 0x06, 0x00, 0x00,
- 0x00, 0x13, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x63, 0x60, 0x18, 0x30,
- 0xc0, 0x4f, 0x0c, 0x03, 0x04, 0xc8, 0x33, 0x1e, 0x00, 0x24, 0xa7, 0x00,
- 0x88, 0x10, 0xca, 0x33, 0x3d, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e,
- 0x44, 0xae, 0x42, 0x60, 0x82
-};
-
-unsigned char ftv2link_png[] = {
- 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
- 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x18, 0x00, 0x00, 0x00, 0x16,
- 0x04, 0x03, 0x00, 0x00, 0x01, 0x5f, 0x54, 0x71, 0x2d, 0x00, 0x00, 0x00,
- 0x30, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xff, 0x00, 0x80, 0x00, 0xff,
- 0xff, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0xff, 0x00, 0x80, 0x80, 0x80,
- 0x80, 0x80, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x7e, 0x9b, 0x08, 0x00, 0x00, 0x00,
- 0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00,
- 0x00, 0x16, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61,
- 0x72, 0x65, 0x00, 0x67, 0x69, 0x66, 0x32, 0x70, 0x6e, 0x67, 0x20, 0x32,
- 0x2e, 0x34, 0x2e, 0x32, 0xa3, 0x5e, 0x47, 0x0e, 0x00, 0x00, 0x00, 0x26,
- 0x74, 0x45, 0x58, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00,
- 0x55, 0x6c, 0x65, 0x61, 0x64, 0x20, 0x47, 0x49, 0x46, 0x20, 0x53, 0x6d,
- 0x61, 0x72, 0x74, 0x53, 0x61, 0x76, 0x65, 0x72, 0x20, 0x56, 0x65, 0x72,
- 0x20, 0x32, 0x2e, 0x30, 0x19, 0x02, 0xd9, 0x09, 0xe5, 0x4a, 0x00, 0x00,
- 0x00, 0x90, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x7d, 0x8c, 0xb1, 0x0a,
- 0xc2, 0x30, 0x14, 0x45, 0x6f, 0x33, 0xb4, 0x63, 0x7e, 0xa1, 0x53, 0x57,
- 0x8b, 0x7e, 0x80, 0x6e, 0xae, 0x16, 0x5a, 0xb2, 0xbe, 0x3a, 0x64, 0x35,
- 0xb8, 0x64, 0xec, 0x2f, 0x07, 0x05, 0x1d, 0x9f, 0x79, 0x8d, 0x21, 0x50,
- 0xd0, 0x03, 0xc9, 0xcd, 0xe1, 0xbe, 0x17, 0x00, 0xa8, 0x00, 0x82, 0xe0,
- 0x81, 0x66, 0x7d, 0xc0, 0x9e, 0x51, 0x70, 0x40, 0x1d, 0xcf, 0xad, 0x07,
- 0x18, 0x1b, 0x74, 0x90, 0xdb, 0x1c, 0x62, 0x0f, 0xe2, 0x20, 0xc1, 0xcc,
- 0x61, 0x3b, 0x06, 0x6a, 0xbb, 0x14, 0x3b, 0xe9, 0x68, 0xba, 0xac, 0x51,
- 0x9d, 0x24, 0xec, 0xdc, 0x4b, 0x68, 0xed, 0xd2, 0x5e, 0x1b, 0x7e, 0xfd,
- 0x92, 0xa8, 0x6d, 0x84, 0xb2, 0x28, 0x28, 0x38, 0xca, 0xd2, 0x4c, 0x46,
- 0x2d, 0x59, 0xcc, 0x38, 0x5c, 0x8b, 0xcc, 0xe3, 0xfe, 0x2b, 0x71, 0xfa,
- 0x79, 0xbc, 0x67, 0x79, 0x85, 0x07, 0x54, 0x69, 0xde, 0xde, 0x2f, 0xf8,
- 0xcf, 0x07, 0x71, 0x95, 0x2b, 0xa1, 0x10, 0x78, 0xd0, 0xff, 0x00, 0x00,
- 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
-};
-
-unsigned char ftv2mlastnode_png[] = {
- 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
- 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x16,
- 0x02, 0x03, 0x00, 0x00, 0x01, 0xc3, 0xc3, 0xc4, 0x79, 0x00, 0x00, 0x00,
- 0x09, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x00,
- 0x00, 0x00, 0x3c, 0x5e, 0xbb, 0x2c, 0x00, 0x00, 0x00, 0x01, 0x74, 0x52,
- 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00, 0x00, 0x16, 0x74,
- 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x00,
- 0x67, 0x69, 0x66, 0x32, 0x70, 0x6e, 0x67, 0x20, 0x32, 0x2e, 0x34, 0x2e,
- 0x32, 0xa3, 0x5e, 0x47, 0x0e, 0x00, 0x00, 0x00, 0x23, 0x49, 0x44, 0x41,
- 0x54, 0x78, 0xda, 0x63, 0x60, 0x20, 0x0b, 0x08, 0x08, 0x20, 0x10, 0x0a,
- 0x60, 0x84, 0x11, 0x8c, 0xa1, 0xa1, 0x20, 0x06, 0x90, 0xc9, 0xa8, 0xb5,
- 0x50, 0x10, 0xca, 0x02, 0x89, 0x61, 0x01, 0x00, 0x6d, 0x17, 0x02, 0xba,
- 0xc0, 0xdc, 0x69, 0xc8, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44,
- 0xae, 0x42, 0x60, 0x82
-};
-
-unsigned char ftv2mnode_png[] = {
- 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
- 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x16,
- 0x04, 0x03, 0x00, 0x00, 0x01, 0x4c, 0x83, 0x31, 0xd9, 0x00, 0x00, 0x00,
- 0x24, 0x50, 0x4c, 0x54, 0x45, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x80, 0x80, 0x80, 0x53, 0xbe, 0x1e, 0x99, 0x00, 0x00, 0x00,
- 0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00,
- 0x00, 0x16, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61,
- 0x72, 0x65, 0x00, 0x67, 0x69, 0x66, 0x32, 0x70, 0x6e, 0x67, 0x20, 0x32,
- 0x2e, 0x34, 0x2e, 0x32, 0xa3, 0x5e, 0x47, 0x0e, 0x00, 0x00, 0x00, 0x2a,
- 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x63, 0x60, 0xa0, 0x2e, 0xe0, 0x06,
- 0x42, 0x74, 0x02, 0xa7, 0x52, 0x54, 0x06, 0xf7, 0x6e, 0x20, 0x80, 0xf1,
- 0xc1, 0x62, 0xdc, 0x4c, 0x4a, 0x4a, 0xdc, 0xdc, 0xdc, 0xc8, 0x22, 0x30,
- 0x35, 0x98, 0xda, 0xd1, 0x19, 0x00, 0xb7, 0x79, 0x07, 0x27, 0xaa, 0xf7,
- 0x96, 0x03, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42,
- 0x60, 0x82
-};
-
-unsigned char ftv2node_png[] = {
- 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
- 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x16,
- 0x04, 0x03, 0x00, 0x00, 0x01, 0x4c, 0x83, 0x31, 0xd9, 0x00, 0x00, 0x00,
- 0x30, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x80, 0x80, 0x80, 0x18, 0xd3, 0xa0, 0x90, 0x00, 0x00, 0x00,
- 0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00,
- 0x00, 0x16, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61,
- 0x72, 0x65, 0x00, 0x67, 0x69, 0x66, 0x32, 0x70, 0x6e, 0x67, 0x20, 0x32,
- 0x2e, 0x34, 0x2e, 0x32, 0xa3, 0x5e, 0x47, 0x0e, 0x00, 0x00, 0x00, 0x26,
- 0x74, 0x45, 0x58, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00,
- 0x55, 0x6c, 0x65, 0x61, 0x64, 0x20, 0x47, 0x49, 0x46, 0x20, 0x53, 0x6d,
- 0x61, 0x72, 0x74, 0x53, 0x61, 0x76, 0x65, 0x72, 0x20, 0x56, 0x65, 0x72,
- 0x20, 0x32, 0x2e, 0x30, 0x69, 0x01, 0x6f, 0x3f, 0xcd, 0x06, 0x00, 0x00,
- 0x00, 0x15, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x63, 0x60, 0x18, 0x30,
- 0xc0, 0x4f, 0x0c, 0x03, 0x04, 0x88, 0x56, 0x8c, 0xc2, 0x00, 0x00, 0x2e,
- 0x52, 0x00, 0xe2, 0xfa, 0x45, 0x3a, 0xe1, 0x00, 0x00, 0x00, 0x00, 0x49,
- 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
-};
-
-unsigned char ftv2plastnode_png[] = {
- 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
- 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x16,
- 0x02, 0x03, 0x00, 0x00, 0x01, 0xc3, 0xc3, 0xc4, 0x79, 0x00, 0x00, 0x00,
- 0x09, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xff, 0x80, 0x80, 0x80, 0x00,
- 0x00, 0x00, 0x3c, 0x5e, 0xbb, 0x2c, 0x00, 0x00, 0x00, 0x01, 0x74, 0x52,
- 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00, 0x00, 0x16, 0x74,
- 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61, 0x72, 0x65, 0x00,
- 0x67, 0x69, 0x66, 0x32, 0x70, 0x6e, 0x67, 0x20, 0x32, 0x2e, 0x34, 0x2e,
- 0x32, 0xa3, 0x5e, 0x47, 0x0e, 0x00, 0x00, 0x00, 0x28, 0x49, 0x44, 0x41,
- 0x54, 0x78, 0xda, 0x63, 0x60, 0x20, 0x0b, 0x08, 0x08, 0x30, 0x08, 0x81,
- 0x11, 0x90, 0x81, 0x02, 0x18, 0x61, 0x04, 0x63, 0x68, 0x28, 0x90, 0x60,
- 0x02, 0x32, 0x19, 0xb5, 0x16, 0x0a, 0x42, 0x59, 0x20, 0x31, 0x2c, 0x00,
- 0x00, 0x6e, 0xc1, 0x02, 0xc2, 0xe5, 0xed, 0x75, 0xa7, 0x00, 0x00, 0x00,
- 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
-};
-
-unsigned char ftv2pnode_png[] = {
- 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
- 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x16,
- 0x04, 0x03, 0x00, 0x00, 0x01, 0x4c, 0x83, 0x31, 0xd9, 0x00, 0x00, 0x00,
- 0x24, 0x50, 0x4c, 0x54, 0x45, 0xc0, 0xc0, 0xc0, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x80, 0x80, 0x80, 0x53, 0xbe, 0x1e, 0x99, 0x00, 0x00, 0x00,
- 0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00,
- 0x00, 0x16, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61,
- 0x72, 0x65, 0x00, 0x67, 0x69, 0x66, 0x32, 0x70, 0x6e, 0x67, 0x20, 0x32,
- 0x2e, 0x34, 0x2e, 0x32, 0xa3, 0x5e, 0x47, 0x0e, 0x00, 0x00, 0x00, 0x30,
- 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x63, 0x60, 0xa0, 0x2e, 0xe0, 0x06,
- 0x42, 0x06, 0x6e, 0x26, 0x38, 0x01, 0xe2, 0xe2, 0x54, 0x8a, 0xca, 0xe0,
- 0xde, 0x0d, 0x04, 0x10, 0x3e, 0x13, 0x44, 0x8c, 0x9b, 0x49, 0x49, 0x89,
- 0x9b, 0x9b, 0x1b, 0x59, 0x04, 0xa6, 0x06, 0x53, 0x3b, 0x3a, 0x03, 0x00,
- 0xba, 0x6b, 0x07, 0x2f, 0xaa, 0xcb, 0x1f, 0x6f, 0x00, 0x00, 0x00, 0x00,
- 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
-};
-
-unsigned char ftv2vertline_png[] = {
- 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
- 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x16,
- 0x04, 0x03, 0x00, 0x00, 0x01, 0x4c, 0x83, 0x31, 0xd9, 0x00, 0x00, 0x00,
- 0x30, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x80, 0x80, 0x80, 0x18, 0xd3, 0xa0, 0x90, 0x00, 0x00, 0x00,
- 0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00,
- 0x00, 0x16, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61,
- 0x72, 0x65, 0x00, 0x67, 0x69, 0x66, 0x32, 0x70, 0x6e, 0x67, 0x20, 0x32,
- 0x2e, 0x34, 0x2e, 0x32, 0xa3, 0x5e, 0x47, 0x0e, 0x00, 0x00, 0x00, 0x26,
- 0x74, 0x45, 0x58, 0x74, 0x43, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x74, 0x00,
- 0x55, 0x6c, 0x65, 0x61, 0x64, 0x20, 0x47, 0x49, 0x46, 0x20, 0x53, 0x6d,
- 0x61, 0x72, 0x74, 0x53, 0x61, 0x76, 0x65, 0x72, 0x20, 0x56, 0x65, 0x72,
- 0x20, 0x32, 0x2e, 0x30, 0x69, 0x01, 0x6f, 0x3f, 0xcd, 0x06, 0x00, 0x00,
- 0x00, 0x0f, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0x63, 0x60, 0x18, 0x30,
- 0xc0, 0x4f, 0x5b, 0x06, 0x00, 0x21, 0x14, 0x00, 0xa6, 0xe5, 0x3c, 0xe8,
- 0x3a, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60,
- 0x82
-};
-
-
-FTVImageInfo image_info[] =
-{
- { "&nbsp;", "ftv2blank.png",ftv2blank_png,174,16,22 },
- { "*", "ftv2doc.png",ftv2doc_png,255,24,22 },
- { "+", "ftv2folderclosed.png",ftv2folderclosed_png,259,24,22 },
- { "-", "ftv2folderopen.png",ftv2folderopen_png,261,24,22 },
- { "\\", "ftv2lastnode.png",ftv2lastnode_png,233,16,22 },
- { "-", "ftv2link.png",ftv2link_png,358,24,22 },
- { "\\", "ftv2mlastnode.png",ftv2mlastnode_png,160,16,22 },
- { "o", "ftv2mnode.png",ftv2mnode_png,194,16,22 },
- { "o", "ftv2node.png",ftv2node_png,235,16,22 },
- { "\\", "ftv2plastnode.png",ftv2plastnode_png,165,16,22 },
- { "o", "ftv2pnode.png",ftv2pnode_png,200,16,22 },
- { "|", "ftv2vertline.png",ftv2vertline_png,229,16,22 },
- { 0,0,0,0,0,0 }
-};
-
-struct FTVNode
-{
- FTVNode(bool dir,const char *r,const char *f,const char *a,const char *n)
- : isLast(TRUE), isDir(dir),ref(r),file(f),anchor(a),name(n),
- parent(0) { children.setAutoDelete(TRUE); }
- bool isLast;
- bool isDir;
- QCString ref;
- QCString file;
- QCString anchor;
- QCString name;
- QList<FTVNode> children;
- FTVNode *parent;
-};
-
-
-//----------------------------------------------------------------------------
-
-FTVHelp *FTVHelp::m_theInstance = 0;
-
-/*! Construm_cts an ftv help object.
- * The object has to be \link initialize() initialized\endlink before it can
- * be used.
- */
-FTVHelp::FTVHelp()
-{
- /* initial depth */
- //m_dc = 0;
- //m_cf = 0;
- m_indentNodes = new QList<FTVNode>[MAX_INDENT];
- m_indentNodes[0].setAutoDelete(TRUE);
- m_indent=0;
-}
-
-FTVHelp::~FTVHelp()
-{
- delete[] m_indentNodes;
-}
-
-/*! return a reference to the one and only instance of this class.
- */
-FTVHelp *FTVHelp::getInstance()
-{
- if (m_theInstance==0) m_theInstance = new FTVHelp;
- return m_theInstance;
-}
-
-/*! This will create a folder tree view table of contents file (tree.js).
- * \sa finalize()
- */
-void FTVHelp::initialize()
-{
-}
-
-/*! Finalizes the FTV help. This will finish and close the
- * contents file (index.js).
- * \sa initialize()
- */
-void FTVHelp::finalize()
-{
- generateTreeView();
-}
-
-/*! Increase the level of the contents hierarchy.
- * This will start a new sublist in contents file.
- * \sa decContentsDepth()
- */
-int FTVHelp::incContentsDepth()
-{
- //int i; for (i=0;i<m_dc+1;i++) m_cts << " ";
- m_indent++;
- ASSERT(m_indent<MAX_INDENT);
- return m_indent;
-}
-
-/*! Decrease the level of the contents hierarchy.
- * This will end the current sublist.
- * \sa incContentsDepth()
- */
-int FTVHelp::decContentsDepth()
-{
- //int i; for (i=0;i<m_dc;i++) m_cts << " ";
-
- ASSERT(m_indent>0);
- if (m_indent>0)
- {
- m_indent--;
- QList<FTVNode> *nl = &m_indentNodes[m_indent];
- FTVNode *parent = nl->getLast();
- QList<FTVNode> *children = &m_indentNodes[m_indent+1];
- while (!children->isEmpty())
- {
- parent->children.append(children->take(0));
- }
- }
- return m_indent;
-}
-
-/*! Add a list item to the contents file.
- * \param isDir TRUE if the item is a directory, FALSE if it is a text
- * \param ref the URL of to the item.
- * \param file the file containing the definition of the item
- * \param anchor the anchor within the file.
- * \param name the name of the item.
- */
-void FTVHelp::addContentsItem(bool isDir,
- const char *ref,
- const char *file,
- const char *anchor,
- const char *name
- )
-{
- QList<FTVNode> *nl = &m_indentNodes[m_indent];
- FTVNode *newNode = new FTVNode(isDir,ref,file,anchor,name);
- if (!nl->isEmpty())
- {
- nl->getLast()->isLast=FALSE;
- }
- nl->append(newNode);
- if (m_indent>0)
- {
- QList<FTVNode> *pnl = &m_indentNodes[m_indent-1];
- newNode->parent = pnl->getLast();
- }
-
-}
-
-static int folderId=1;
-
-void FTVHelp::generateIndent(QTextStream &t, FTVNode *n,int level)
-{
- if (n->parent)
- {
- generateIndent(t,n->parent,level+1);
- }
- // from the root up to node n do...
- if (level==0) // item before a dir or document
- {
- if (n->isLast)
- {
- if (n->isDir)
- {
- t << "<img " << FTV_IMGATTRIBS(plastnode) << "onclick=\"toggleFolder('folder" << folderId << "', this)\"/>";
- }
- else
- {
- t << "<img " << FTV_IMGATTRIBS(lastnode) << "/>";
- }
- }
- else
- {
- if (n->isDir)
- {
- t << "<img " << FTV_IMGATTRIBS(pnode) << "onclick=\"toggleFolder('folder" << folderId << "', this)\"/>";
- }
- else
- {
- t << "<img " << FTV_IMGATTRIBS(node) << "/>";
- }
- }
- }
- else // item at another level
- {
- if (n->isLast)
- {
- t << "<img " << FTV_IMGATTRIBS(blank) << "/>";
- }
- else
- {
- t << "<img " << FTV_IMGATTRIBS(vertline) << "/>";
- }
- }
-}
-
-void FTVHelp::generateLink(QTextStream &t,FTVNode *n)
-{
- QCString *dest;
- //printf("FTVHelp::generateLink(ref=%s,file=%s,anchor=%s\n",
- // n->ref.data(),n->file.data(),n->anchor.data());
- if (n->file.isEmpty()) // no link
- {
- t << "<b>" << n->name << "</b>";
- }
- else // link into other frame
- {
- if (!n->ref.isEmpty()) // link to entity imported via tag file
- {
- t << "<a class=\"elRef\" ";
- t << "doxygen=\"" << n->ref << ":";
- if ((dest=Doxygen::tagDestinationDict[n->ref])) t << *dest << "/";
- t << "\" ";
- }
- else // local link
- {
- t << "<a class=\"el\" ";
- }
- t << "href=\"";
- if (!n->ref.isEmpty())
- {
- if ((dest=Doxygen::tagDestinationDict[n->ref])) t << *dest << "/";
- }
- t << n->file << Doxygen::htmlFileExtension;
- if (!n->anchor.isEmpty()) t << "#" << n->anchor;
- t << "\" target=\"basefrm\">";
- t << n->name;
- t << "</a>";
- if (!n->ref.isEmpty())
- {
- t << "&nbsp;[external]";
- }
- }
-}
-
-void FTVHelp::generateTree(QTextStream &t, const QList<FTVNode> &nl,int level)
-{
- QCString spaces;
- spaces.fill(' ',level*2+8);
- QListIterator<FTVNode> nli(nl);
- FTVNode *n;
- for (nli.toFirst();(n=nli.current());++nli)
- {
- t << spaces << "<p>";
- generateIndent(t,n,0);
- if (n->isDir)
- {
- t << "<img " << FTV_IMGATTRIBS(folderclosed) << "onclick=\"toggleFolder('folder" << folderId << "', this)\"/>";
- generateLink(t,n);
- t << "</p>\n";
- t << spaces << "<div id=\"folder" << folderId << "\">\n";
- folderId++;
- generateTree(t,n->children,level+1);
- t << spaces << "</div>\n";
- }
- else
- {
- t << "<img " << FTV_IMGATTRIBS(doc) << "/>";
- generateLink(t,n);
- t << "</p>\n";
- }
- }
-}
-
-void FTVHelp::generateTreeViewImages()
-{
- static bool done=FALSE;
- if (done) return;
- done=TRUE;
-
- // Generate tree view images
- FTVImageInfo *p = image_info;
- while (p->name)
- {
- QCString fileName=Config_getString("HTML_OUTPUT")+"/"+p->name;
- QFile f(fileName);
- if (f.open(IO_WriteOnly))
- {
- f.writeBlock((char *)p->data,p->len);
- }
- else
- {
- fprintf(stderr,"Warning: Cannot open file %s for writing\n",fileName.data());
- }
- f.close();
- p++;
- }
-}
-
-void FTVHelp::generateTreeView()
-{
- // Generate alternative index.html as a frame
- QCString fileName=Config_getString("HTML_OUTPUT")+"/index"+Doxygen::htmlFileExtension;
- QFile f;
- f.setName(fileName);
- if (!f.open(IO_WriteOnly))
- {
- err("Cannot open file %s for writing!\n",fileName.data());
- return;
- }
- else
- {
- QTextStream t(&f);
-#if QT_VERSION >= 200
- t.setEncoding(QTextStream::Latin1);
-#endif
- t << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\">\n";
- t << "<html><head>";
- t << "<meta http-equiv=\"Content-Type\" content=\"text/html;charset="
- << theTranslator->idLanguageCharset() << "\">\n";
- t << "<title>";
- if (Config_getString("PROJECT_NAME").isEmpty())
- {
- t << "Doxygen Documentation";
- }
- else
- {
- t << Config_getString("PROJECT_NAME");
- }
- t << "</title></head>" << endl;
- t << "<frameset cols=\"" << Config_getInt("TREEVIEW_WIDTH") << ",*\">" << endl;
- t << " <frame src=\"tree" << Doxygen::htmlFileExtension << "\" name=\"treefrm\">" << endl;
- t << " <frame src=\"main" << Doxygen::htmlFileExtension << "\" name=\"basefrm\">" << endl;
- t << "</frameset>" << endl;
- t << "</html>" << endl;
- f.close();
- }
-
- // Generate tree view frame
- fileName=Config_getString("HTML_OUTPUT")+"/tree"+Doxygen::htmlFileExtension;
- f.setName(fileName);
- if (!f.open(IO_WriteOnly))
- {
- err("Cannot open file %s for writing!\n",fileName.data());
- return;
- }
- else
- {
- QTextStream t(&f);
-#if QT_VERSION >= 200
- t.setEncoding(QTextStream::Latin1);
-#endif
- t << "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"en\" lang=\"en\">\n";
- t << " <head>\n";
- t << " <meta http-equiv=\"Content-Type\" content=\"text/xhtml;charset="
- << theTranslator->idLanguageCharset() << "\" />\n";
- t << " <meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n";
- t << " <meta http-equiv=\"Content-Language\" content=\"en\" />\n";
- t << " <link rel=\"stylesheet\" href=\"";
- QCString cssname=Config_getString("HTML_STYLESHEET");
- if (cssname.isEmpty())
- {
- t << "doxygen.css";
- }
- else
- {
- QFileInfo cssfi(cssname);
- if (!cssfi.exists())
- {
- err("Error: user specified HTML style sheet file does not exist!\n");
- }
- t << cssfi.fileName();
- }
- t << "\">" << endl;
- t << " <title>TreeView</title>\n";
- t << " <style type=\"text/css\">\n";
- t << " <!--\n";
- t << " .directory { font-size: 10pt; font-weight: bold; }\n";
- t << " .directory h3 { margin: 0px; margin-top: 1em; font-size: 11pt; }\n";
- t << " .directory p { margin: 0px; white-space: nowrap; }\n";
- t << " .directory div { display: none; margin: 0px; }\n";
- t << " .directory img { vertical-align: middle; }\n";
- t << " -->\n";
- t << " </style>\n";
- t << " <script type=\"text/javascript\">\n";
- t << " <!-- // Hide script from old browsers\n";
- t << " \n";
- //t << " function findChildNode(node, name) \n";
- //t << " {\n";
- //t << " var temp;\n";
- //t << " if (node == null) \n";
- //t << " {\n";
- //t << " return null;\n";
- //t << " } \n";
- //t << " node = node.firstChild;\n";
- //t << " while (node != null) \n";
- //t << " {\n";
- //t << " if (node.nodeName == name) \n";
- //t << " {\n";
- //t << " return node;\n";
- //t << " }\n";
- //t << " temp = findChildNode(node, name);\n";
- //t << " if (temp != null) \n";
- //t << " {\n";
- //t << " return temp;\n";
- //t << " }\n";
- //t << " node = node.nextSibling;\n";
- //t << " }\n";
- //t << " return null;\n";
- //t << " }\n";
- //t << "\n";
-
- /* User has clicked on a node (folder or +/-) in the tree */
- t << " function toggleFolder(id, imageNode) \n";
- t << " {\n";
- t << " var folder = document.getElementById(id);\n";
- t << " var l = imageNode.src.length;\n";
- /* If the user clicks on the book icon, we move left one image so
- * the code (below) will also adjust the '+' icon.
- */
- t << " if (imageNode.src.substring(l-20,l)==\"" FTV_ICON_FILE(folderclosed) "\" || \n";
- t << " imageNode.src.substring(l-18,l)==\"" FTV_ICON_FILE(folderopen) "\")\n";
- t << " {\n";
- t << " imageNode = imageNode.previousSibling;\n";
- t << " l = imageNode.src.length;\n";
- t << " }\n";
- //t << " var vl = \"" FTV_ICON_FILE(vertline) "\";\n";
- //t << " if (imageNode != null && imageNode.nodeName != \"IMG\") \n";
- //t << " {\n";
- //t << " imageNode = findChildNode(imageNode, \"IMG\");\n";
- //t << " if (imageNode!=null) l = imageNode.src.length;\n";
- //t << " }\n";
- t << " if (folder == null) \n";
- t << " {\n";
- t << " } \n";
- /* Node controls a open section, we need to close it */
- t << " else if (folder.style.display == \"block\") \n";
- t << " {\n";
- //t << " while (imageNode != null && \n";
- //t << " imageNode.src.substring(l-vl.length,l) == vl)\n";
- //t << " {\n";
- //t << " imageNode = imageNode.nextSibling;\n";
- //t << " }\n";
- t << " if (imageNode != null) \n";
- t << " {\n";
- t << " imageNode.nextSibling.src = \"" FTV_ICON_FILE(folderclosed) "\";\n";
- t << " if (imageNode.src.substring(l-13,l) == \"" FTV_ICON_FILE(mnode) "\")\n";
- t << " {\n";
- t << " imageNode.src = \"" FTV_ICON_FILE(pnode) "\";\n";
- t << " }\n";
- t << " else if (imageNode.src.substring(l-17,l) == \"" FTV_ICON_FILE(mlastnode) "\")\n";
- t << " {\n";
- t << " imageNode.src = \"" FTV_ICON_FILE(plastnode) "\";\n";
- t << " }\n";
- t << " }\n";
- t << " folder.style.display = \"none\";\n";
- t << " } \n";
- t << " else \n"; /* section is closed, we need to open it */
- t << " {\n";
- //t << " while (imageNode != null && \n";
- //t << " imageNode.src.substring(l-vl.length,l) == vl)\n";
- //t << " {\n";
- //t << " imageNode = imageNode.nextSibling;\n";
- //t << " }\n";
- t << " if (imageNode != null) \n";
- t << " {\n";
- t << " imageNode.nextSibling.src = \"" FTV_ICON_FILE(folderopen) "\";\n";
- t << " if (imageNode.src.substring(l-13,l) == \"" FTV_ICON_FILE(pnode) "\")\n";
- t << " {\n";
- t << " imageNode.src = \"" FTV_ICON_FILE(mnode) "\";\n";
- t << " }\n";
- t << " else if (imageNode.src.substring(l-17,l) == \"" FTV_ICON_FILE(plastnode) "\")\n";
- t << " {\n";
- t << " imageNode.src = \"" FTV_ICON_FILE(mlastnode) "\";\n";
- t << " }\n";
- t << " }\n";
- t << " folder.style.display = \"block\";\n";
- t << " }\n";
- t << " }\n";
- t << "\n";
- t << " // End script hiding --> \n";
- t << " </script>\n";
- t << " </head>\n";
- t << "\n";
- t << " <body>\n";
- t << " <div class=\"directory\">\n";
- t << " <h3>";
- QCString &projName = Config_getString("PROJECT_NAME");
- if (projName.isEmpty())
- {
- t << "Root";
- }
- else
- {
- t << projName;
- }
- t << "</h3>\n";
- t << " <div style=\"display: block;\">\n";
-
- generateTree(t,m_indentNodes[0],0);
-
- t << " </div>\n";
- t << " </div>\n";
- t << " </body>\n";
- t << "</html>\n";
- }
- generateTreeViewImages();
-
-}
-
diff --git a/src/ftvhelp.h b/src/ftvhelp.h
deleted file mode 100644
index 8fdca6a..0000000
--- a/src/ftvhelp.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/******************************************************************************
- * ftvhelp.h,v 1.0 2000/09/06 16:09:00
- *
- * Kenney Wong <kwong@ea.com>
- *
- * Folder Tree View for offline help on browsers that do not support HTML Help.
- * Uses the FTV structure from:
- * http://www.geocities.com/Paris/LeftBank/2178/ftexample.html
- */
-
-#ifndef FTVHELP_H
-#define FTVHELP_H
-
-#include "qtbc.h"
-#include <qtextstream.h>
-#include <qlist.h>
-
-class QFile;
-struct FTVNode;
-
-struct FTVImageInfo
-{
- const char *alt;
- const char *name;
- const unsigned char *data;
- unsigned int len;
- unsigned short width, height;
-};
-
-extern FTVImageInfo image_info[];
-
-#define FTVIMG_blank 0
-#define FTVIMG_doc 1
-#define FTVIMG_folderclosed 2
-#define FTVIMG_folderopen 3
-#define FTVIMG_lastnode 4
-#define FTVIMG_link 5
-#define FTVIMG_mlastnode 6
-#define FTVIMG_mnode 7
-#define FTVIMG_node 8
-#define FTVIMG_plastnode 9
-#define FTVIMG_pnode 10
-#define FTVIMG_vertline 11
-
-#define FTV_S(name) #name
-#define FTV_ICON_FILE(name) "ftv2" FTV_S(name) ".png"
-#define FTVIMG_INDEX(name) FTVIMG_ ## name
-#define FTV_INFO(name) ( image_info[FTVIMG_INDEX(name)] )
-#define FTV_IMGATTRIBS(name) \
- "src=\"" FTV_ICON_FILE(name) "\" " \
- "alt=\"" << FTV_INFO(name).alt << "\" " \
- "width=" << FTV_INFO(name).width << " " \
- "height=" << FTV_INFO(name).height << " "
-
-/*! A class that generates a dynamic tree view side panel.
- */
-class FTVHelp
-{
- public:
- static FTVHelp *getInstance();
- void initialize();
- void finalize();
- int incContentsDepth();
- int decContentsDepth();
- /*! return the current depth of the contents tree */
- int contentsDepth() const { return m_indent; }
- void addContentsItem(bool isDir,
- const char *ref,
- const char *file,
- const char *anchor,
- const char *name);
- static void generateTreeViewImages();
-
- private:
- void generateTreeView();
- void generateTree(QTextStream &t,const QList<FTVNode> &nl,int level);
- void generateIndent(QTextStream &t,FTVNode *n,int level);
- void generateLink(QTextStream &t,FTVNode *n);
- FTVHelp();
- ~FTVHelp();
- //QFile *m_cf;
- //QTextStream m_cts;
- //int m_dc;
- static FTVHelp *m_theInstance;
- QList<FTVNode> *m_indentNodes;
- int m_indent;
-};
-
-
-#endif /* FTVHELP_H */
-
diff --git a/src/groupdef.cpp b/src/groupdef.cpp
deleted file mode 100644
index f8a9be6..0000000
--- a/src/groupdef.cpp
+++ /dev/null
@@ -1,1019 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 <ctype.h>
-#include <qregexp.h>
-#include "qtbc.h"
-#include "groupdef.h"
-#include "classdef.h"
-#include "filedef.h"
-#include "classlist.h"
-#include "outputlist.h"
-#include "namespacedef.h"
-#include "language.h"
-#include "util.h"
-#include "memberlist.h"
-#include "message.h"
-#include "membergroup.h"
-#include "doxygen.h"
-#include "pagedef.h"
-#include "docparser.h"
-#include "searchindex.h"
-#include "dot.h"
-
-GroupDef::GroupDef(const char *df,int dl,const char *na,const char *t,
- const char *refFileName) : Definition(df,dl,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;
- allMemberList = new MemberList;
- allMemberNameInfoSDict = new MemberNameInfoSDict(17);
- if (refFileName)
- {
- fileName=stripExtension(refFileName);
- }
- else
- {
- fileName = (QCString)"group_"+na;
- }
- setGroupTitle( t );
- memberGroupSDict = new MemberGroupSDict;
- memberGroupSDict->setAutoDelete(TRUE);
-
- decDefineMembers.setInGroup(TRUE);
- decProtoMembers.setInGroup(TRUE);
- decTypedefMembers.setInGroup(TRUE);
- decEnumMembers.setInGroup(TRUE);
- decEnumValMembers.setInGroup(TRUE);
- decFuncMembers.setInGroup(TRUE);
- decVarMembers.setInGroup(TRUE);
-
- docDefineMembers.setInGroup(TRUE);
- docProtoMembers.setInGroup(TRUE);
- docTypedefMembers.setInGroup(TRUE);
- docEnumMembers.setInGroup(TRUE);
- docFuncMembers.setInGroup(TRUE);
- docVarMembers.setInGroup(TRUE);
-
- visited = 0;
-}
-
-GroupDef::~GroupDef()
-{
- delete fileList;
- delete classSDict;
- delete groupList;
- delete namespaceSDict;
- delete pageDict;
- delete exampleDict;
- delete allMemberList;
- delete allMemberNameInfoSDict;
- delete memberGroupSDict;
- delete dirList;
-}
-
-void GroupDef::setGroupTitle( const char *t )
-{
- if ( t && strlen(t) )
- {
- title = t;
- titleSet = TRUE;
- }
- else
- {
- title = name();
- title.at(0)=toupper(title.at(0));
- titleSet = FALSE;
- }
-}
-
-
-void GroupDef::distributeMemberGroupDocumentation()
-{
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->distributeMemberGroupDocumentation();
- }
-}
-
-void GroupDef::findSectionsInDocumentation()
-{
- docFindSections(documentation(),this,0,docFile());
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->findSectionsInDocumentation();
- }
- decDefineMembers.findSectionsInDocumentation();
- decProtoMembers.findSectionsInDocumentation();
- decTypedefMembers.findSectionsInDocumentation();
- decEnumMembers.findSectionsInDocumentation();
- decFuncMembers.findSectionsInDocumentation();
- decVarMembers.findSectionsInDocumentation();
-}
-
-void GroupDef::addFile(const FileDef *def)
-{
- if (Config_getBool("SORT_BRIEF_DOCS"))
- fileList->inSort(def);
- else
- fileList->append(def);
-}
-
-void GroupDef::addClass(const ClassDef *cd)
-{
- if (Config_getBool("SORT_BRIEF_DOCS"))
- classSDict->inSort(cd->name(),cd);
- else
- classSDict->append(cd->name(),cd);
-}
-
-void GroupDef::addNamespace(const NamespaceDef *def)
-{
- if (Config_getBool("SORT_BRIEF_DOCS"))
- namespaceSDict->inSort(def->name(),def);
- else
- namespaceSDict->append(def->name(),def);
-}
-
-void GroupDef::addDir(const DirDef *def)
-{
- if (Config_getBool("SORT_BRIEF_DOCS"))
- dirList->inSort(def);
- else
- dirList->append(def);
-}
-
-void GroupDef::addPage(PageDef *def)
-{
- //printf("Making page %s part of a group\n",def->name.data());
- pageDict->append(def->name(),def);
- def->makePartOfGroup(this);
-}
-
-void GroupDef::addExample(const PageDef *def)
-{
- exampleDict->append(def->name(),def);
-}
-
-
-void GroupDef::addMembersToMemberGroup()
-{
- ::addMembersToMemberGroup(&decDefineMembers,memberGroupSDict,this);
- ::addMembersToMemberGroup(&decProtoMembers,memberGroupSDict,this);
- ::addMembersToMemberGroup(&decTypedefMembers,memberGroupSDict,this);
- ::addMembersToMemberGroup(&decEnumMembers,memberGroupSDict,this);
- ::addMembersToMemberGroup(&decEnumValMembers,memberGroupSDict,this);
- ::addMembersToMemberGroup(&decFuncMembers,memberGroupSDict,this);
- ::addMembersToMemberGroup(&decVarMembers,memberGroupSDict,this);
-
- //printf("GroupDef::addMembersToMemberGroup() memberGroupList=%d\n",memberGroupList->count());
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->setInGroup(TRUE);
- }
-}
-
-
-bool GroupDef::insertMember(MemberDef *md,bool docOnly)
-{
- //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);
- MemberInfo *srcMi;
- for ( ; (srcMi=srcMnii.current()) ; ++srcMnii )
- {
- 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);
-
- if (srcMd->isFunction() && md->isFunction() &&
- matchArguments2(srcMd->getOuterScope(),srcMd->getFileDef(),srcMd->argumentList(),
- md->getOuterScope(),md->getFileDef(),md->argumentList(),
- TRUE
- ) &&
- sameScope
- )
- {
- if (srcMd->getGroupAlias()==0)
- {
- md->setGroupAlias(srcMd);
- }
- else
- {
- md->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);
- }
- //printf("Added member!\n");
- allMemberList->append(md);
- switch(md->memberType())
- {
- case MemberDef::Variable:
- if (!docOnly)
- {
- if (Config_getBool("SORT_BRIEF_DOCS"))
- decVarMembers.inSort(md);
- else
- decVarMembers.append(md);
- }
- if (Config_getBool("SORT_MEMBER_DOCS"))
- docVarMembers.inSort(md);
- else
- docVarMembers.append(md);
- break;
- case MemberDef::Function:
- if (!docOnly)
- {
- if (Config_getBool("SORT_BRIEF_DOCS"))
- decFuncMembers.inSort(md);
- else
- decFuncMembers.append(md);
- }
- if (Config_getBool("SORT_MEMBER_DOCS"))
- docFuncMembers.inSort(md);
- else
- docFuncMembers.append(md);
- break;
- case MemberDef::Typedef:
- if (!docOnly)
- {
- if (Config_getBool("SORT_BRIEF_DOCS"))
- decTypedefMembers.inSort(md);
- else
- decTypedefMembers.append(md);
- }
- if (Config_getBool("SORT_MEMBER_DOCS"))
- docTypedefMembers.inSort(md);
- else
- docTypedefMembers.append(md);
- break;
- case MemberDef::Enumeration:
- if (!docOnly)
- {
- if (Config_getBool("SORT_BRIEF_DOCS"))
- decEnumMembers.inSort(md);
- else
- decEnumMembers.append(md);
- }
- if (Config_getBool("SORT_MEMBER_DOCS"))
- docEnumMembers.inSort(md);
- else
- docEnumMembers.append(md);
- break;
- case MemberDef::EnumValue:
- break;
- case MemberDef::Prototype:
- if (!docOnly)
- {
- if (Config_getBool("SORT_BRIEF_DOCS"))
- decProtoMembers.inSort(md);
- else
- decProtoMembers.append(md);
- }
- if (Config_getBool("SORT_MEMBER_DOCS"))
- docProtoMembers.inSort(md);
- else
- docProtoMembers.append(md);
- break;
- case MemberDef::Define:
- if (!docOnly)
- {
- if (Config_getBool("SORT_BRIEF_DOCS"))
- decDefineMembers.inSort(md);
- else
- decDefineMembers.append(md);
- }
- if (Config_getBool("SORT_MEMBER_DOCS"))
- docDefineMembers.inSort(md);
- else
- docDefineMembers.append(md);
- break;
- default:
- err("GroupDef::insertMembers(): "
- "member `%s' (typeid=%d) with scope `%s' inserted in group scope `%s'!\n",
- md->name().data(),md->memberType(),
- md->getClassDef() ? md->getClassDef()->name().data() : "",
- name().data());
- }
- return TRUE;
-}
-
-void GroupDef::removeMember(MemberDef *md)
-{
- // fprintf(stderr, "GroupDef(%s)::removeMember( %s )\n", title.data(), md->name().data());
- MemberNameInfo *mni = allMemberNameInfoSDict->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());
- delete mni;
- }
-
- allMemberList->remove(md);
- switch(md->memberType())
- {
- case MemberDef::Variable:
- decVarMembers.remove(md);
- docVarMembers.remove(md);
- break;
- case MemberDef::Function:
- decFuncMembers.remove(md);
- docFuncMembers.remove(md);
- break;
- case MemberDef::Typedef:
- decTypedefMembers.remove(md);
- docTypedefMembers.remove(md);
- break;
- case MemberDef::Enumeration:
- decEnumMembers.remove(md);
- docEnumMembers.remove(md);
- break;
- case MemberDef::EnumValue:
- break;
- case MemberDef::Prototype:
- decProtoMembers.remove(md);
- docProtoMembers.remove(md);
- break;
- case MemberDef::Define:
- decDefineMembers.remove(md);
- docDefineMembers.remove(md);
- break;
- default:
- err("GroupDef::removeMember(): unexpected member remove in file!\n");
- }
- }
-}
-
-bool GroupDef::containsGroup(const GroupDef *def)
-{
- return groupList->find(def) >= 0;
-}
-
-void GroupDef::addGroup(const GroupDef *def)
-{
- //printf("adding group `%s' to group `%s'\n",def->name().data(),name().data());
- //if (Config_getBool("SORT_MEMBER_DOCS"))
- // groupList->inSort(def);
- //else
- groupList->append(def);
-}
-
-bool GroupDef::isASubGroup() const
-{
- return m_partOfGroups && m_partOfGroups->count()!=0;
-}
-
-int GroupDef::countMembers() const
-{
- return fileList->count()+
- classSDict->count()+
- namespaceSDict->count()+
- groupList->count()+
- allMemberList->count()+
- pageDict->count()+
- exampleDict->count();
-}
-
-/*! Compute the HTML anchor names for all members in the group */
-void GroupDef::computeAnchors()
-{
- //printf("GroupDef::computeAnchors()\n");
- setAnchors(0,'a',allMemberList);
-}
-
-void GroupDef::writeDetailedDocumentation(OutputList &ol)
-{
- if (!briefDescription().isEmpty() || !documentation().isEmpty())
- {
-
- if (pageDict->count()!=countMembers()) // classical layout
- {
- ol.writeRuler();
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Latex);
- ol.disable(OutputGenerator::RTF);
- ol.writeAnchor(0,"_details");
- ol.popGeneratorState();
- ol.startGroupHeader();
- ol.parseText(theTranslator->trDetailedDescription());
- ol.endGroupHeader();
-
- // repeat brief description
- if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
- {
- ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
- ol.newParagraph();
- }
- }
-
- // write documentation
- if (!documentation().isEmpty())
- {
- ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
- }
- }
-}
-
-
-void GroupDef::writeDocumentation(OutputList &ol)
-{
- ol.pushGeneratorState();
- startFile(ol,getOutputFileBase(),name(),title);
- startTitle(ol,getOutputFileBase());
- ol.parseText(title);
- addGroupListToTitle(ol,this);
- endTitle(ol,getOutputFileBase(),title);
-
- if (Config_getBool("SEARCHENGINE"))
- {
- Doxygen::searchIndex->setCurrentDoc(title,getOutputFileBase());
- 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
- {
- Doxygen::searchIndex->addWord(title.mid(i,l),TRUE);
- p=i+l;
- }
- }
-
- if (Config_getBool("HAVE_DOT") && Config_getBool("GROUP_GRAPHS") )
- {
- DotGroupCollaboration graph(this);
- if (!graph.isTrivial())
- {
- msg("Generating dependency graph for group %s\n",qualifiedName().data());
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
- ol.newParagraph();
- ol.startGroupCollaboration();
- ol.parseText(theTranslator->trCollaborationDiagram(title));
- ol.endGroupCollaboration(graph);
- ol.popGeneratorState();
- }
- }
-
-
- if (Config_getBool("DETAILS_AT_TOP"))
- {
- writeDetailedDocumentation(ol);
- ol.newParagraph();
- }
- else if (!briefDescription().isEmpty())
- {
- ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE);
- ol.writeString(" \n");
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Latex);
- ol.disable(OutputGenerator::RTF);
- ol.disable(OutputGenerator::Man);
- ol.startTextLink(0,"_details");
- ol.parseText(theTranslator->trMore());
- ol.endTextLink();
- ol.enableAll();
- ol.disableAllBut(OutputGenerator::Man);
- ol.newParagraph();
- ol.popGeneratorState();
- }
-
- if (!Config_getString("GENERATE_TAGFILE").isEmpty())
- {
- Doxygen::tagFile << " <compound kind=\"group\">" << endl;
- Doxygen::tagFile << " <name>" << convertToXML(name()) << "</name>" << endl;
- Doxygen::tagFile << " <title>" << convertToXML(title) << "</title>" << endl;
- Doxygen::tagFile << " <filename>" << convertToXML(getOutputFileBase()) << Doxygen::htmlFileExtension << "</filename>" << endl;
- }
-
- ol.startMemberSections();
-
- // write list of files
- if (fileList->count()>0)
- {
- ol.startMemberHeader();
- ol.parseText(theTranslator->trFile(TRUE,FALSE));
- ol.endMemberHeader();
- ol.startMemberList();
- FileDef *fd=fileList->first();
- while (fd)
- {
- ol.startMemberItem(0);
- ol.docify(theTranslator->trFile(FALSE,TRUE)+" ");
- ol.insertMemberAlign();
- ol.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,fd->name());
- if (!Config_getString("GENERATE_TAGFILE").isEmpty())
- {
- Doxygen::tagFile << " <file>" << convertToXML(fd->name()) << "</file>" << endl;
- }
- ol.endMemberItem();
- if (!fd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
- {
- ol.startMemberDescription();
- ol.parseDoc(briefFile(),briefLine(),fd,0,fd->briefDescription(),FALSE,FALSE);
- ol.endMemberDescription();
- ol.newParagraph();
- }
- fd=fileList->next();
- }
- ol.endMemberList();
- }
-
- // write list of namespaces
- namespaceSDict->writeDeclaration(ol);
-
- // write list of groups
- if (groupList->count()>0)
- {
- ol.startMemberHeader();
- ol.parseText(theTranslator->trModules());
- ol.endMemberHeader();
- ol.startMemberList();
- GroupDef *gd=groupList->first();
- while (gd)
- {
- ol.startMemberItem(0);
- //ol.docify(theTranslator->trGroup(FALSE,TRUE));
- //ol.docify(" ");
- ol.insertMemberAlign();
- ol.writeObjectLink(gd->getReference(),gd->getOutputFileBase(),0,gd->groupTitle());
- if (!Config_getString("GENERATE_TAGFILE").isEmpty())
- {
- Doxygen::tagFile << " <subgroup>" << convertToXML(gd->name()) << "</subgroup>" << endl;
- }
- ol.endMemberItem();
- if (!gd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
- {
- ol.startMemberDescription();
- ol.parseDoc(briefFile(),briefLine(),gd,0,gd->briefDescription(),FALSE,FALSE);
- ol.endMemberDescription();
- ol.newParagraph();
- }
- gd=groupList->next();
- }
- ol.endMemberList();
- }
-
- // write list of directories
- if (dirList->count()>0)
- {
- ol.startMemberHeader();
- ol.parseText(theTranslator->trDirectories());
- ol.endMemberHeader();
- ol.startMemberList();
- DirDef *dd=dirList->first();
- while (dd)
- {
- ol.startMemberItem(0);
- ol.parseText(theTranslator->trDir(FALSE,TRUE));
- ol.insertMemberAlign();
- ol.writeObjectLink(dd->getReference(),dd->getOutputFileBase(),0,dd->shortName());
- ol.endMemberItem();
- if (!Config_getString("GENERATE_TAGFILE").isEmpty())
- {
- Doxygen::tagFile << " <dir>" << convertToXML(dd->displayName()) << "</dir>" << endl;
- }
- if (!dd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
- {
- ol.startMemberDescription();
- ol.parseDoc(briefFile(),briefLine(),dd,0,dd->briefDescription(),FALSE,FALSE);
- ol.endMemberDescription();
- ol.newParagraph();
- }
- dd=dirList->next();
- }
-
- ol.endMemberList();
- }
-
- // write list of classes
- classSDict->writeDeclaration(ol);
-
- // write list of members
- if (allMemberList->count()>0)
- {
- /* write user defined member groups */
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->writeDeclarations(ol,0,0,0,this);
- }
-
- //allMemberList->writeDeclarations(ol,0,0,0,this,0,0);
- decDefineMembers.writeDeclarations(ol,0,0,0,this,theTranslator->trDefines(),0);
- decProtoMembers.writeDeclarations(ol,0,0,0,this,theTranslator->trFuncProtos(),0);
- decTypedefMembers.writeDeclarations(ol,0,0,0,this,theTranslator->trTypedefs(),0);
- decEnumMembers.writeDeclarations(ol,0,0,0,this,theTranslator->trEnumerations(),0);
- decFuncMembers.writeDeclarations(ol,0,0,0,this,theTranslator->trFunctions(),0);
- decVarMembers.writeDeclarations(ol,0,0,0,this,theTranslator->trVariables(),0);
- }
- ol.endMemberSections();
-
- if (!Config_getBool("DETAILS_AT_TOP"))
- {
- writeDetailedDocumentation(ol);
- }
-
- PageDef *pd=0;
- PageSDict::Iterator pdi(*pageDict);
- for (pdi.toFirst();(pd=pdi.current());++pdi)
- {
- if (!pd->isReference())
- {
- QCString pageName = pd->getOutputFileBase();
-
- if (!Config_getString("GENERATE_TAGFILE").isEmpty())
- {
- Doxygen::tagFile << " <page>" << convertToXML(pageName) << "</page>" << endl;
- }
-
- SectionInfo *si=0;
- if (!pd->title().isEmpty() && !pd->name().isEmpty() &&
- (si=Doxygen::sectionDict[pd->name()])!=0)
- {
- ol.startSection(si->label,si->title,SectionInfo::Subsection);
- ol.docify(si->title);
- ol.endSection(si->label,SectionInfo::Subsection);
- }
- ol.startTextBlock();
- ol.parseDoc(pd->docFile(),pd->docLine(),pd,0,pd->documentation(),TRUE,FALSE);
- ol.endTextBlock();
- }
- }
-
- writeMemberDocumentation(ol);
-
- if (!Config_getString("GENERATE_TAGFILE").isEmpty())
- {
- writeDocAnchorsToTagFile();
- Doxygen::tagFile << " </compound>" << endl;
- }
-
- endFile(ol);
- ol.popGeneratorState();
-
- if (Config_getBool("SEPARATE_MEMBER_PAGES"))
- {
- allMemberList->sort();
- writeMemberPages(ol);
- }
-
-}
-
-void GroupDef::writeMemberDocumentation(OutputList &ol)
-{
- if (Config_getBool("SEPARATE_MEMBER_PAGES"))
- {
- ol.disable(OutputGenerator::Html);
- }
-
- docDefineMembers.writeDocumentation(ol,name(),this,
- theTranslator->trDefineDocumentation());
-
- docProtoMembers.writeDocumentation(ol,name(),this,
- theTranslator->trFunctionPrototypeDocumentation());
-
- docTypedefMembers.writeDocumentation(ol,name(),this,
- theTranslator->trTypedefDocumentation());
-
- docEnumMembers.writeDocumentation(ol,name(),this,
- theTranslator->trEnumerationTypeDocumentation());
-
- docFuncMembers.writeDocumentation(ol,name(),this,
- theTranslator->trFunctionDocumentation());
-
- docVarMembers.writeDocumentation(ol,name(),this,
- theTranslator->trVariableDocumentation());
-
- if (Config_getBool("SEPARATE_MEMBER_PAGES"))
- {
- ol.enable(OutputGenerator::Html);
- }
-}
-
-void GroupDef::writeMemberPages(OutputList &ol)
-{
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
-
- docDefineMembers.writeDocumentationPage(ol,name(),this);
- docProtoMembers.writeDocumentationPage(ol,name(),this);
- docTypedefMembers.writeDocumentationPage(ol,name(),this);
- docEnumMembers.writeDocumentationPage(ol,name(),this);
- docFuncMembers.writeDocumentationPage(ol,name(),this);
- docVarMembers.writeDocumentationPage(ol,name(),this);
-
- ol.popGeneratorState();
-}
-
-void GroupDef::writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const
-{
- static bool createSubDirs=Config_getBool("CREATE_SUBDIRS");
-
- ol.writeString(" <div class=\"navtab\">\n");
- ol.writeString(" <table>\n");
-
- MemberListIterator mli(*allMemberList);
- MemberDef *md;
- for (mli.toFirst();(md=mli.current());++mli)
- {
- if (md->getGroupDef()==this && md->isLinkable())
- {
- ol.writeString(" <tr><td class=\"navtab\">");
- if (md->isLinkableInProject())
- {
- 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(md->localName());
- ol.writeString("</a>");
- }
- ol.writeString("</td></tr>\n");
- }
- }
-
- ol.writeString(" </table>\n");
- ol.writeString(" </div>\n");
-}
-
-
-
-//---- helper functions ------------------------------------------------------
-
-void addClassToGroups(Entry *root,ClassDef *cd)
-{
- QListIterator<Grouping> gli(*root->groups);
- Grouping *g;
- for (;(g=gli.current());++gli)
- {
- GroupDef *gd=0;
- if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict[g->groupname]))
- {
- gd->addClass(cd);
- cd->makePartOfGroup(gd);
- //printf("Compound %s: in group %s\n",cd->name().data(),s->data());
- }
- }
-}
-
-void addNamespaceToGroups(Entry *root,NamespaceDef *nd)
-{
- //printf("root->groups->count()=%d\n",root->groups->count());
- QListIterator<Grouping> gli(*root->groups);
- Grouping *g;
- for (;(g=gli.current());++gli)
- {
- GroupDef *gd=0;
- //printf("group `%s'\n",s->data());
- if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict[g->groupname]))
- {
- gd->addNamespace(nd);
- nd->makePartOfGroup(gd);
- //printf("Namespace %s: in group %s\n",nd->name().data(),s->data());
- }
- }
-}
-
-void addDirToGroups(Entry *root,DirDef *dd)
-{
- //printf("*** root->groups->count()=%d\n",root->groups->count());
- QListIterator<Grouping> gli(*root->groups);
- Grouping *g;
- for (;(g=gli.current());++gli)
- {
- GroupDef *gd=0;
- //printf("group `%s'\n",g->groupname.data());
- if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict[g->groupname]))
- {
- gd->addDir(dd);
- dd->makePartOfGroup(gd);
- //printf("Dir %s: in group %s\n",dd->name().data(),g->groupname.data());
- }
- }
-}
-
-void addGroupToGroups(Entry *root,GroupDef *subGroup)
-{
- QListIterator<Grouping> gli(*root->groups);
- Grouping *g;
- for (;(g=gli.current());++gli)
- {
- GroupDef *gd=0;
- if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict[g->groupname]) &&
- !gd->containsGroup(subGroup) )
- {
- gd->addGroup(subGroup);
- subGroup->makePartOfGroup(gd);
- }
- }
-}
-
-/*! Add a member to the group with the highest priority */
-void addMemberToGroups(Entry *root,MemberDef *md)
-{
- //printf("addMemberToGroups: Root %p = %s, md %p=%s groups=%d\n",
- // root, root->name.data(), md, md->name().data(), root->groups->count() );
- QListIterator<Grouping> gli(*root->groups);
- Grouping *g;
-
- // Search entry's group list for group with highest pri.
- Grouping::GroupPri_t pri = Grouping::GROUPING_LOWEST;
- GroupDef *fgd=0;
- for (;(g=gli.current());++gli)
- {
- GroupDef *gd=0;
- if (!g->groupname.isEmpty() &&
- (gd=Doxygen::groupSDict[g->groupname]) &&
- g->pri >= pri)
- {
- if (fgd && gd!=fgd && g->pri==pri)
- {
- warn(root->fileName.data(), root->startLine,
- "Warning: Member %s found in multiple %s groups! "
- "The member will be put in group %s, and not in group %s",
- md->name().data(), Grouping::getGroupPriName( pri ),
- gd->name().data(), fgd->name().data()
- );
- }
-
- fgd = gd;
- pri = g->pri;
- }
- }
- //printf("fgd=%p\n",fgd);
-
- // put member into group defined by this entry?
- if (fgd)
- {
- GroupDef *mgd = md->getGroupDef();
- //printf("mgd=%p\n",mgd);
- bool insertit = FALSE;
- if (mgd==0)
- {
- insertit = TRUE;
- }
- else if (mgd!=fgd)
- {
- bool moveit = FALSE;
-
- // 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)
- {
- moveit = TRUE;
- }
- else
- {
- if (md->getGroupPri()==pri)
- {
- if (!root->doc.isEmpty() && !md->getGroupHasDocs())
- {
- moveit = TRUE;
- }
- else if (!root->doc.isEmpty() && md->getGroupHasDocs())
- {
- warn(md->getGroupFileName(),md->getGroupStartLine(),
- "Warning: Member documentation for %s found several times in %s groups!\n"
- "%s:%d: The member will remain in group %s, and won't be put into group %s",
- md->name().data(), Grouping::getGroupPriName( pri ),
- root->fileName.data(), root->startLine,
- mgd->name().data(),
- fgd->name().data()
- );
- }
- }
- }
-
- if (moveit)
- {
- //printf("removeMember\n");
- mgd->removeMember(md);
- insertit = TRUE;
- }
- }
-
- if (insertit)
- {
- //printf("insertMember found at %s line %d\n",md->getDefFileName().data(),md->getDefLine());
- 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) cd->setGroupDefForAllMembers(fgd,pri,root->fileName,root->startLine,root->doc.length() != 0);
- }
- }
- }
-}
-
-
-void addExampleToGroups(Entry *root,PageDef *eg)
-{
- QListIterator<Grouping> gli(*root->groups);
- Grouping *g;
- for (;(g=gli.current());++gli)
- {
- GroupDef *gd=0;
- if (!g->groupname.isEmpty() && (gd=Doxygen::groupSDict[g->groupname]))
- {
- gd->addExample(eg);
- eg->makePartOfGroup(gd);
- //printf("Example %s: in group %s\n",eg->name().data(),s->data());
- }
- }
-}
-
-QCString GroupDef::getOutputFileBase() const
-{
- if (isReference())
- {
- return fileName;
- }
- else
- {
- return convertNameToFile(fileName);
- }
-}
-
-void GroupDef::addListReferences()
-{
- addRefItem(xrefListItems(),
- theTranslator->trGroup(TRUE,TRUE),
- getOutputFileBase(),name()
- );
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->addListReferences(this);
- }
- docDefineMembers.addListReferences(this);
- docProtoMembers.addListReferences(this);
- docTypedefMembers.addListReferences(this);
- docEnumMembers.addListReferences(this);
- docFuncMembers.addListReferences(this);
- docVarMembers.addListReferences(this);
-}
-
-
diff --git a/src/groupdef.h b/src/groupdef.h
deleted file mode 100644
index 1f594a0..0000000
--- a/src/groupdef.h
+++ /dev/null
@@ -1,168 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 GROUPDEF_H
-#define GROUPDEF_H
-
-#include "qtbc.h"
-#include "sortdict.h"
-#include "definition.h"
-#include "memberlist.h"
-#include "memberdef.h"
-#include "htmlhelp.h"
-
-class FileList;
-class ClassSDict;
-class FileDef;
-class ClassDef;
-class NamespaceDef;
-class GroupList;
-class OutputList;
-class NamespaceSDict;
-class MemberGroupSDict;
-class MemberNameInfoSDict;
-class PageSDict;
-class PageDef;
-class DirDef;
-class DirList;
-
-class GroupDef : public Definition
-{
- public:
- GroupDef(const char *fileName,int line,const char *name,const char *title,const char *refFileName=0);
- ~GroupDef();
- DefType definitionType() const { return TypeGroup; }
- QCString getOutputFileBase() const;
- const char *groupTitle() const { return title; }
- void setGroupTitle( const char *newtitle );
- bool hasGroupTitle( ) { return titleSet; }
- void addFile(const FileDef *def);
- void addClass(const ClassDef *def);
- void addNamespace(const NamespaceDef *def);
- void addGroup(const GroupDef *def);
- void addParentGroup(const GroupDef *def);
- void addPage(PageDef *def);
- void addExample(const PageDef *def);
- void addDir(const DirDef *dd);
- bool insertMember(MemberDef *def,bool docOnly=FALSE);
- void removeMember(MemberDef *md);
- bool containsGroup(const GroupDef *def); // true if def is already a subgroup
- void writeDetailedDocumentation(OutputList &ol);
- void writeDocumentation(OutputList &ol);
- void writeMemberDocumentation(OutputList &ol);
- void writeMemberPages(OutputList &ol);
- void writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const;
- int countMembers() const;
- bool isLinkableInProject() const
- {
- return !isReference();
- }
- bool isLinkable() const
- {
- return TRUE;
- }
- bool isASubGroup() const;
- void computeAnchors();
-
- void addMembersToMemberGroup();
- void distributeMemberGroupDocumentation();
- void findSectionsInDocumentation();
-
- void addListReferences();
-
- bool visited; // number of times accessed for output - KPW
-
- friend void writeGroupTreeNode(OutputList&, GroupDef*, int);
- // make accessible for writing tree view of group in index.cpp - KPW
-
- // members in the declaration part of the documentation
- MemberList decDefineMembers;
- MemberList decProtoMembers;
- MemberList decTypedefMembers;
- MemberList decEnumMembers;
- MemberList decEnumValMembers;
- MemberList decFuncMembers;
- MemberList decVarMembers;
-
- // members in the documentation part of the documentation
- MemberList docDefineMembers;
- MemberList docProtoMembers;
- MemberList docTypedefMembers;
- MemberList docEnumMembers;
- MemberList docFuncMembers;
- MemberList docVarMembers;
-
- /* user defined member groups */
- MemberGroupSDict *memberGroupSDict;
-
- FileList * getFiles() const { return fileList; }
- ClassSDict * getClasses() const { return classSDict; }
- NamespaceSDict * getNamespaces() const { return namespaceSDict; }
- GroupList * getSubGroups() const { return groupList; }
- PageSDict * getPages() const { return pageDict; }
- DirList * getDirs() const { return dirList; }
- MemberList* getMembers() const { return allMemberList; }
-
- protected:
- void addMemberListToGroup(MemberList *,bool (MemberDef::*)() const);
-
- private:
- 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;
-
-
-};
-
-class GroupSDict : public SDict<GroupDef>
-{
- public:
- GroupSDict(uint size) : SDict<GroupDef>(size) {}
- virtual ~GroupSDict() {}
-};
-
-class GroupList : public QList<GroupDef>
-{
-};
-
-class GroupListIterator : public QListIterator<GroupDef>
-{
- public:
- GroupListIterator(const GroupList &l) : QListIterator<GroupDef>(l) {}
- virtual ~GroupListIterator() {}
-};
-
-void addClassToGroups(Entry *root,ClassDef *cd);
-void addNamespaceToGroups(Entry *root,NamespaceDef *nd);
-void addGroupToGroups(Entry *root,GroupDef *subGroup);
-void addMemberToGroups(Entry *root,MemberDef *md);
-void addPageToGroups(Entry *root,PageDef *pd);
-void addExampleToGroups(Entry *root,PageDef *eg);
-void addDirToGroups(Entry *root,DirDef *dd);
-
-#endif
-
diff --git a/src/htags.cpp b/src/htags.cpp
deleted file mode 100644
index 56b0a2d..0000000
--- a/src/htags.cpp
+++ /dev/null
@@ -1,176 +0,0 @@
-/******************************************************************************
- *
- * Copyright (C) 1997-2005 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 <qdir.h>
-#include <qdict.h>
-
-#include "qtbc.h"
-#include "htags.h"
-#include "util.h"
-#include "message.h"
-#include "config.h"
-
-
-bool Htags::useHtags = FALSE;
-
-static QDir g_inputDir;
-static QDict<QCString> g_symbolDict(10007);
-
-/*! constructs command line of htags(1) and executes it.
- * \retval TRUE success
- * \retval FALSE an error has occured.
- */
-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");
-
- QCString cwd = convertToQCString(QDir::currentDirPath());
- if (inputSource.isEmpty())
- {
- g_inputDir.setPath(cwd);
- }
- else if (inputSource.count()==1)
- {
- g_inputDir.setPath(inputSource.first());
- if (!g_inputDir.exists())
- err("Error: Cannot find directory %s. "
- "Check the value of the INPUT tag in the configuration file.\n",
- inputSource.first()
- );
- }
- else
- {
- err("Error: If you use USE_HTAGS then INPUT should specific a single directory. \n");
- return FALSE;
- }
-
- /*
- * Construct command line for htags(1).
- */
- QCString commandLine = " -g -s -a -n ";
- if (!quiet) commandLine += "-v ";
- if (warnings) commandLine += "-w ";
- if (!htagsOptions.isEmpty())
- {
- commandLine += ' ';
- commandLine += htagsOptions;
- }
- if (!projectName.isEmpty())
- {
- commandLine += "-t \"";
- commandLine += projectName;
- if (!projectNumber.isEmpty())
- {
- commandLine += '-';
- commandLine += projectNumber;
- }
- commandLine += "\" ";
- }
- commandLine += " \"" + htmldir + "\"";
- QCString oldDir = convertToQCString(QDir::currentDirPath());
- QDir::setCurrent(g_inputDir.absPath());
- //printf("CommandLine=[%s]\n",commandLine.data());
- bool result=iSystem("htags",commandLine,FALSE)==0;
- QDir::setCurrent(oldDir);
- return result;
-}
-
-
-/*! load filemap and make index.
- * \param htmlDir of HTML directory generated by htags(1).
- * \retval TRUE success
- * \retval FALSE error
- */
-bool Htags::loadFilemap(const QCString &htmlDir)
-{
- QCString fileMapName = htmlDir+"/HTML/FILEMAP";
- QCString fileMap;
- QFileInfo fi(fileMapName);
- /*
- * Construct FILEMAP dictionary using QDict.
- *
- * In FILEMAP, URL includes 'html' suffix but we cut it off according
- * to the method of FileDef class.
- *
- * FILEMAP format:
- * <NAME>\t<HREF>.html\n
- * QDICT:
- * dict[<NAME>] = <HREF>
- */
- if (fi.exists() && fi.isReadable())
- {
- QFile f(fileMapName);
- const int maxlen = 8192;
- QCString line(maxlen+1);
- line.at(maxlen)='\0';
- if (f.open(IO_ReadOnly))
- {
- while (f.readLine(line.data(),maxlen)>0)
- {
- //printf("Read line: %s",line.data());
- int sep = line.find('\t');
- if (sep!=-1)
- {
- QCString key = line.left(sep).stripWhiteSpace();
- QCString value = line.mid(sep+1).stripWhiteSpace();
- int ext=value.findRev('.');
- if (ext!=-1) value=value.left(ext); // strip extension
- g_symbolDict.setAutoDelete(TRUE);
- g_symbolDict.insert(key,new QCString(value));
- //printf("Key/Value=(%s,%s)\n",key.data(),value.data());
- }
- }
- return TRUE;
- }
- else
- {
- err("Error: file %s cannot be opened\n",fileMapName.data());
- }
- }
- return FALSE;
-}
-
-/*! convert path name into the url in the hypertext generated by htags.
- * \param path path name
- * \returns URL NULL: not found.
- */
-QCString Htags::path2URL(const QCString &path)
-{
- QCString url,symName=path;
- QCString dir = convertToQCString(g_inputDir.absPath());
- int dl=dir.length();
- if ((int)symName.length()>dl+1)
- {
- symName = symName.mid(dl+1);
- }
- if (!symName.isEmpty())
- {
- QCString *result = g_symbolDict[symName];
- //printf("path2URL=%s symName=%s result=%p\n",path.data(),symName.data(),result);
- if (result)
- {
- url = "HTML/" + *result;
- }
- }
- return url;
-}
-
diff --git a/src/htags.h b/src/htags.h
deleted file mode 100644
index 8373eb6..0000000
--- a/src/htags.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/******************************************************************************
- *
- * Copyright (C) 1997-2005 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 HTAGS_H
-#define HTAGS_H
-
-class QCString;
-
-struct Htags
-{
- static bool useHtags;
- static bool loadFilemap(const QCString &htmldir);
- static QCString path2URL(const QCString &path);
- static bool execute(const QCString &htmldir);
-};
-
-#endif /* HTAGS_H */
diff --git a/src/htmlattrib.h b/src/htmlattrib.h
deleted file mode 100644
index f0f5f5e..0000000
--- a/src/htmlattrib.h
+++ /dev/null
@@ -1,65 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#ifndef _HTMLATTRIB_H
-#define _HTMLATTRIB_H
-
-/*! A Html option. A name, value pair */
-struct HtmlAttrib
-{
- QString name;
- QString value;
-};
-
-/*! @brief A list of Html attributes.
- *
- * The Html attributes are deeply copied into the list.
- */
-class HtmlAttribList : public QList<HtmlAttrib>
-{
- public:
- HtmlAttribList() : QList<HtmlAttrib>() { setAutoDelete(TRUE); }
- ~HtmlAttribList() { clear(); }
- HtmlAttribList(const HtmlAttribList &l) : QList<HtmlAttrib>()
- { operator=(l); }
- HtmlAttribList &operator=(const HtmlAttribList &l)
- { clear(); QList<HtmlAttrib>::operator=(l); return *this; }
- QString toString() const
- {
- HtmlAttribList *that = (HtmlAttribList *)this;
- QString result;
- HtmlAttrib *attr=that->first();
- while (attr)
- {
- result+=" "+attr->name+"=\""+attr->value+"\"";
- attr=that->next();
- }
- return result;
- }
- private:
- QCollection::Item newItem( QCollection::Item d )
- { return (QCollection::Item)new HtmlAttrib(*(HtmlAttrib *)d); }
- void deleteItem(QCollection::Item d)
- { delete (HtmlAttrib *)d; }
-};
-
-/*! @brief Html attribute list iterator */
-class HtmlAttribListIterator : public QListIterator<HtmlAttrib>
-{
- public:
- HtmlAttribListIterator(const HtmlAttribList &l) : QListIterator<HtmlAttrib>(l) {}
-};
-
-#endif
-
diff --git a/src/htmldocvisitor.cpp b/src/htmldocvisitor.cpp
deleted file mode 100644
index 3a2f222..0000000
--- a/src/htmldocvisitor.cpp
+++ /dev/null
@@ -1,1123 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 <qdir.h>
-#include "htmldocvisitor.h"
-#include "docparser.h"
-#include "language.h"
-#include "doxygen.h"
-#include "outputgen.h"
-#include "dot.h"
-#include "message.h"
-#include "config.h"
-#include "htmlgen.h"
-#include "parserintf.h"
-
-
-static const int NUM_HTML_LIST_TYPES = 4;
-static const char types[][NUM_HTML_LIST_TYPES] = {"1", "a", "i", "A"};
-
-
-static QString htmlAttribsToString(const HtmlAttribList &attribs)
-{
- QString result;
- HtmlAttribListIterator li(attribs);
- HtmlAttrib *att;
- for (li.toFirst();(att=li.current());++li)
- {
- result+=" ";
- result+=att->name;
- if (!att->value.isEmpty()) result+="=\""+att->value+"\"";
- }
- return result;
-}
-
-//-------------------------------------------------------------------------
-
-HtmlDocVisitor::HtmlDocVisitor(QTextStream &t,CodeOutputInterface &ci,
- const char *langExt)
- : DocVisitor(DocVisitor_Html), m_t(t), m_ci(ci), m_insidePre(FALSE),
- m_hide(FALSE), m_langExt(langExt)
-{
-}
-
- //--------------------------------------
- // visitor functions for leaf nodes
- //--------------------------------------
-
-void HtmlDocVisitor::visit(DocWord *w)
-{
- if (m_hide) return;
- filter(w->word());
-}
-
-void HtmlDocVisitor::visit(DocLinkedWord *w)
-{
- if (m_hide) return;
- startLink(w->ref(),w->file(),w->relPath(),w->anchor());
- filter(w->word());
- endLink();
-}
-
-void HtmlDocVisitor::visit(DocWhiteSpace *w)
-{
- if (m_hide) return;
- if (m_insidePre)
- {
- m_t << w->chars();
- }
- else
- {
- m_t << " ";
- }
-}
-
-void HtmlDocVisitor::visit(DocSymbol *s)
-{
- if (m_hide) return;
- switch(s->symbol())
- {
- case DocSymbol::BSlash: m_t << "\\"; break;
- case DocSymbol::At: m_t << "@"; break;
- case DocSymbol::Less: m_t << "&lt;"; break;
- case DocSymbol::Greater: m_t << "&gt;"; break;
- case DocSymbol::Amp: m_t << "&amp;"; break;
- case DocSymbol::Dollar: m_t << "$"; break;
- case DocSymbol::Hash: m_t << "#"; break;
- case DocSymbol::Percent: m_t << "%"; break;
- case DocSymbol::Copy: m_t << "&copy;"; break;
- case DocSymbol::Tm: m_t << "&tm;"; break;
- case DocSymbol::Reg: m_t << "&reg;"; break;
- case DocSymbol::Apos: m_t << "'"; break;
- case DocSymbol::Quot: m_t << "\""; break;
- case DocSymbol::Uml: m_t << "&" << s->letter() << "uml;"; break;
- case DocSymbol::Acute: m_t << "&" << s->letter() << "acute;"; break;
- case DocSymbol::Grave: m_t << "&" << s->letter() << "grave;"; break;
- case DocSymbol::Circ: m_t << "&" << s->letter() << "circ;"; break;
- case DocSymbol::Slash: m_t << "&" << s->letter() << "slash;"; break;
- case DocSymbol::Tilde: m_t << "&" << s->letter() << "tilde;"; break;
- case DocSymbol::Szlig: m_t << "&szlig;"; break;
- case DocSymbol::Cedil: m_t << "&" << s->letter() << "cedil;"; break;
- case DocSymbol::Ring: m_t << "&" << s->letter() << "ring;"; break;
- case DocSymbol::Nbsp: m_t << "&nbsp;"; break;
- default:
- err("Error: unknown symbol found\n");
- }
-}
-
-void HtmlDocVisitor::visit(DocURL *u)
-{
- if (m_hide) return;
- m_t << "<a href=\"";
- if (u->isEmail()) m_t << "mailto:";
- m_t << u->url() << "\">";
- filter(u->url());
- m_t << "</a>";
-}
-
-void HtmlDocVisitor::visit(DocLineBreak *)
-{
- if (m_hide) return;
- m_t << "<br>\n";
-}
-
-void HtmlDocVisitor::visit(DocHorRuler *)
-{
- if (m_hide) return;
- m_t << "<hr>\n";
-}
-
-void HtmlDocVisitor::visit(DocStyleChange *s)
-{
- if (m_hide) return;
- switch (s->style())
- {
- case DocStyleChange::Bold:
- if (s->enable()) m_t << "<b" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</b>";
- break;
- case DocStyleChange::Italic:
- if (s->enable()) m_t << "<em" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</em>";
- break;
- case DocStyleChange::Code:
- if (s->enable()) m_t << "<code" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</code>";
- break;
- case DocStyleChange::Subscript:
- if (s->enable()) m_t << "<sub" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</sub>";
- break;
- case DocStyleChange::Superscript:
- if (s->enable()) m_t << "<sup" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</sup>";
- break;
- case DocStyleChange::Center:
- if (s->enable()) m_t << "<center" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</center>";
- break;
- case DocStyleChange::Small:
- if (s->enable()) m_t << "<small" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</small>";
- break;
- case DocStyleChange::Preformatted:
- if (s->enable())
- {
- m_t << "<pre" << htmlAttribsToString(s->attribs()) << ">";
- m_insidePre=TRUE;
- }
- else
- {
- m_insidePre=FALSE;
- m_t << "</pre>";
- }
- break;
- case DocStyleChange::Div:
- if (s->enable()) m_t << "<div" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</div>";
- break;
- case DocStyleChange::Span:
- if (s->enable()) m_t << "<span" << htmlAttribsToString(s->attribs()) << ">"; else m_t << "</span>";
- break;
-
- }
-}
-
-
-void HtmlDocVisitor::visit(DocVerbatim *s)
-{
- if (m_hide) return;
- switch(s->type())
- {
- case DocVerbatim::Code: // fall though
- m_t << PREFRAG_START;
- Doxygen::parserManager->getParser(m_langExt)
- ->parseCode(m_ci,s->context(),s->text().latin1(),
- s->isExample(),s->exampleFile());
- m_t << PREFRAG_END;
- break;
- case DocVerbatim::Verbatim:
- m_t << PREFRAG_START;
- filter(s->text());
- m_t << PREFRAG_END;
- break;
- case DocVerbatim::HtmlOnly:
- m_t << s->text();
- break;
- case DocVerbatim::ManOnly:
- case DocVerbatim::LatexOnly:
- case DocVerbatim::XmlOnly:
- /* nothing */
- break;
-
- case DocVerbatim::Dot:
- {
- static int dotindex = 1;
- QCString fileName(4096);
-
- fileName.sprintf("%s%d",
- (Config_getString("HTML_OUTPUT")+"/inline_dotgraph_").data(),
- dotindex++
- );
- QFile file(fileName);
- if (!file.open(IO_WriteOnly))
- {
- err("Could not open file %s for writing\n",fileName.data());
- }
- file.writeBlock( s->text(), s->text().length() );
- file.close();
-
- m_t << "<div align=\"center\">" << endl;
- writeDotFile(fileName,s->relPath());
- m_t << "</div>" << endl;
-
- file.remove();
- }
- break;
- }
-}
-
-void HtmlDocVisitor::visit(DocAnchor *anc)
-{
- if (m_hide) return;
- m_t << "<a class=\"anchor\" name=\"" << anc->anchor() << "\"></a>";
-}
-
-void HtmlDocVisitor::visit(DocInclude *inc)
-{
- if (m_hide) return;
- switch(inc->type())
- {
- case DocInclude::Include:
- m_t << PREFRAG_START;
- Doxygen::parserManager->getParser(inc->extension())
- ->parseCode(m_ci,inc->context(),inc->text().latin1(),
- inc->isExample(),inc->exampleFile());
- m_t << PREFRAG_END;
- break;
- case DocInclude::IncWithLines:
- {
- m_t << PREFRAG_START;
- QFileInfo cfi( inc->file() );
- FileDef fd( cfi.dirPath(), cfi.fileName() );
- Doxygen::parserManager->getParser(inc->extension())
- ->parseCode(m_ci,inc->context(),
- inc->text().latin1(),
- inc->isExample(),
- inc->exampleFile(), &fd);
- m_t << PREFRAG_END;
- }
- break;
- case DocInclude::DontInclude:
- break;
- case DocInclude::HtmlInclude:
- m_t << inc->text();
- break;
- case DocInclude::VerbInclude:
- m_t << PREFRAG_START;
- filter(inc->text());
- m_t << PREFRAG_END;
- break;
- }
-}
-
-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 (!m_hide) m_t << PREFRAG_START;
- pushEnabled();
- m_hide=TRUE;
- }
- if (op->type()!=DocIncOperator::Skip)
- {
- popEnabled();
- if (!m_hide)
- {
- Doxygen::parserManager->getParser(m_langExt)
- ->parseCode(m_ci,op->context(),
- op->text().latin1(),op->isExample(),
- op->exampleFile());
- }
- pushEnabled();
- m_hide=TRUE;
- }
- if (op->isLast())
- {
- popEnabled();
- if (!m_hide) m_t << PREFRAG_END;
- }
- else
- {
- if (!m_hide) m_t << endl;
- }
-}
-
-void HtmlDocVisitor::visit(DocFormula *f)
-{
- if (m_hide) return;
- bool bDisplay = f->text().at(0)=='\\';
- if (bDisplay) m_t << "<p class=\"formulaDsp\">" << endl;
- 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\">";
- if (bDisplay)
- m_t << endl << "<p>" << endl;
-}
-
-void HtmlDocVisitor::visit(DocIndexEntry *)
-{
-}
-
-//--------------------------------------
-// visitor functions for compound nodes
-//--------------------------------------
-
-
-void HtmlDocVisitor::visitPre(DocAutoList *l)
-{
- if (m_hide) return;
- if (l->isEnumList())
- {
- //
- // Do list type based on depth:
- // 1.
- // a.
- // i.
- // A.
- // 1. (repeat)...
- //
- m_t << "<ol type=" << types[l->depth() % NUM_HTML_LIST_TYPES] << ">";
- }
- else
- {
- m_t << "<ul>";
- }
- if (!l->isPreformatted()) m_t << "\n";
-}
-
-void HtmlDocVisitor::visitPost(DocAutoList *l)
-{
- if (m_hide) return;
- if (l->isEnumList())
- {
- m_t << "</ol>";
- }
- else
- {
- m_t << "</ul>";
- }
- if (!l->isPreformatted()) m_t << "\n";
-}
-
-void HtmlDocVisitor::visitPre(DocAutoListItem *)
-{
- if (m_hide) return;
- m_t << "<li>";
-}
-
-void HtmlDocVisitor::visitPost(DocAutoListItem *)
-{
- if (m_hide) return;
- m_t << "</li>";
-}
-
-void HtmlDocVisitor::visitPre(DocPara *)
-{
- if (m_hide) return;
-
- // TODO:
- // Paragraph should be surrounded by <p>..</p>, but
- //
- // A list item (li), description data (dd), or table data (td) should
- // only have paragraph markers if there are multiple paragraphs (otherwise
- // the output looks ugly).
- //
- // A list or table should be placed outside the paragraph context,
- // so the current paragraph should be ended and restarted. To avoid
- // empty paragraphs, it has to be checked if the list or table is the
- // first or last child within the paragraph.
-
-}
-
-void HtmlDocVisitor::visitPost(DocPara *p)
-{
- if (m_hide) return;
- if (!p->isLast() && // omit <p> for last paragraph
- !(p->parent() && // and for parameter sections
- p->parent()->kind()==DocNode::Kind_ParamSect
- )
- )
- {
- m_t << "<p>\n";
- }
-}
-
-void HtmlDocVisitor::visitPre(DocRoot *)
-{
-}
-
-void HtmlDocVisitor::visitPost(DocRoot *)
-{
-}
-
-void HtmlDocVisitor::visitPre(DocSimpleSect *s)
-{
- if (m_hide) return;
- m_t << "<dl compact><dt><b>";
- switch(s->type())
- {
- case DocSimpleSect::See:
- m_t << theTranslator->trSeeAlso(); break;
- case DocSimpleSect::Return:
- m_t << theTranslator->trReturns(); break;
- case DocSimpleSect::Author:
- m_t << theTranslator->trAuthor(TRUE,TRUE); break;
- case DocSimpleSect::Authors:
- m_t << theTranslator->trAuthor(TRUE,FALSE); break;
- case DocSimpleSect::Version:
- m_t << theTranslator->trVersion(); break;
- case DocSimpleSect::Since:
- m_t << theTranslator->trSince(); break;
- case DocSimpleSect::Date:
- m_t << theTranslator->trDate(); break;
- case DocSimpleSect::Note:
- m_t << theTranslator->trNote(); break;
- case DocSimpleSect::Warning:
- m_t << theTranslator->trWarning(); break;
- case DocSimpleSect::Pre:
- m_t << theTranslator->trPrecondition(); break;
- case DocSimpleSect::Post:
- m_t << theTranslator->trPostcondition(); break;
- case DocSimpleSect::Invar:
- m_t << theTranslator->trInvariant(); break;
- case DocSimpleSect::Remark:
- m_t << theTranslator->trRemarks(); break;
- case DocSimpleSect::Attention:
- m_t << theTranslator->trAttention(); break;
- case DocSimpleSect::User: break;
- case DocSimpleSect::Rcs: break;
- case DocSimpleSect::Unknown: break;
- }
-
- // special case 1: user defined title
- if (s->type()!=DocSimpleSect::User && s->type()!=DocSimpleSect::Rcs)
- {
- m_t << ":</b></dt><dd>";
- }
-}
-
-void HtmlDocVisitor::visitPost(DocSimpleSect *)
-{
- if (m_hide) return;
- m_t << "</dd></dl>\n";
-}
-
-void HtmlDocVisitor::visitPre(DocTitle *)
-{
-}
-
-void HtmlDocVisitor::visitPost(DocTitle *)
-{
- if (m_hide) return;
- m_t << "</b></dt><dd>";
-}
-
-void HtmlDocVisitor::visitPre(DocSimpleList *sl)
-{
- if (m_hide) return;
- m_t << "<ul>";
- if (!sl->isPreformatted()) m_t << "\n";
-}
-
-void HtmlDocVisitor::visitPost(DocSimpleList *sl)
-{
- if (m_hide) return;
- m_t << "</ul>";
- if (!sl->isPreformatted()) m_t << "\n";
-}
-
-void HtmlDocVisitor::visitPre(DocSimpleListItem *)
-{
- if (m_hide) return;
- m_t << "<li>";
-}
-
-void HtmlDocVisitor::visitPost(DocSimpleListItem *li)
-{
- if (m_hide) return;
- m_t << "</li>";
- if (!li->isPreformatted()) m_t << "\n";
-}
-
-void HtmlDocVisitor::visitPre(DocSection *s)
-{
- if (m_hide) return;
- m_t << "<h" << s->level()+1 << ">";
- m_t << "<a class=\"anchor\" name=\"" << s->anchor();
- m_t << "\">" << endl;
- filter(s->title());
- m_t << "</a></h" << s->level()+1 << ">\n";
-}
-
-void HtmlDocVisitor::visitPost(DocSection *)
-{
-}
-
-void HtmlDocVisitor::visitPre(DocHtmlList *s)
-{
- if (m_hide) return;
- if (s->type()==DocHtmlList::Ordered)
- m_t << "<ol" << htmlAttribsToString(s->attribs()) << ">\n";
- else
- m_t << "<ul" << htmlAttribsToString(s->attribs()) << ">\n";
-}
-
-void HtmlDocVisitor::visitPost(DocHtmlList *s)
-{
- if (m_hide) return;
- if (s->type()==DocHtmlList::Ordered)
- m_t << "</ol>";
- else
- m_t << "</ul>";
- if (!s->isPreformatted()) m_t << "\n";
-}
-
-void HtmlDocVisitor::visitPre(DocHtmlListItem *i)
-{
- if (m_hide) return;
- m_t << "<li" << htmlAttribsToString(i->attribs()) << ">";
- if (!i->isPreformatted()) m_t << "\n";
-}
-
-void HtmlDocVisitor::visitPost(DocHtmlListItem *)
-{
- if (m_hide) return;
- m_t << "</li>\n";
-}
-
-void HtmlDocVisitor::visitPre(DocHtmlDescList *dl)
-{
- if (m_hide) return;
- m_t << "<dl" << htmlAttribsToString(dl->attribs()) << ">\n";
-}
-
-void HtmlDocVisitor::visitPost(DocHtmlDescList *)
-{
- if (m_hide) return;
- m_t << "</dl>\n";
-}
-
-void HtmlDocVisitor::visitPre(DocHtmlDescTitle *dt)
-{
- if (m_hide) return;
- m_t << "<dt" << htmlAttribsToString(dt->attribs()) << ">";
-}
-
-void HtmlDocVisitor::visitPost(DocHtmlDescTitle *)
-{
- if (m_hide) return;
- m_t << "</dt>\n";
-}
-
-void HtmlDocVisitor::visitPre(DocHtmlDescData *dd)
-{
- if (m_hide) return;
- m_t << "<dd" << htmlAttribsToString(dd->attribs()) << ">";
-}
-
-void HtmlDocVisitor::visitPost(DocHtmlDescData *)
-{
- if (m_hide) return;
- m_t << "</dd>\n";
-}
-
-void HtmlDocVisitor::visitPre(DocHtmlTable *t)
-{
- if (m_hide) return;
- bool hasBorder = FALSE;
- bool hasCellSpacing = FALSE;
- bool hasCellPadding = FALSE;
-
- HtmlAttribListIterator li(t->attribs());
- HtmlAttrib *att;
- for (li.toFirst();(att=li.current());++li)
- {
- if (att->name=="border") hasBorder=TRUE;
- else if (att->name=="cellspacing") hasCellSpacing=TRUE;
- else if (att->name=="cellpadding") hasCellPadding=TRUE;
- }
- m_t << "<table" << htmlAttribsToString(t->attribs());
- if (!hasBorder) m_t << " border=\"1\"";
- if (!hasCellSpacing) m_t << " cellspacing=\"3\"";
- if (!hasCellPadding) m_t << " cellpadding=\"3\"";
- m_t << ">\n";
-}
-
-void HtmlDocVisitor::visitPost(DocHtmlTable *)
-{
- if (m_hide) return;
- m_t << "</table>\n";
-}
-
-void HtmlDocVisitor::visitPre(DocHtmlRow *tr)
-{
- if (m_hide) return;
- m_t << "<tr" << htmlAttribsToString(tr->attribs()) << ">\n";
-}
-
-void HtmlDocVisitor::visitPost(DocHtmlRow *)
-{
- if (m_hide) return;
- m_t << "</tr>\n";
-}
-
-void HtmlDocVisitor::visitPre(DocHtmlCell *c)
-{
- if (m_hide) return;
- if (c->isHeading())
- {
- m_t << "<th" << htmlAttribsToString(c->attribs()) << ">";
- }
- else
- {
- m_t << "<td" << htmlAttribsToString(c->attribs()) << ">";
- }
-}
-
-void HtmlDocVisitor::visitPost(DocHtmlCell *c)
-{
- if (m_hide) return;
- if (c->isHeading()) m_t << "</th>"; else m_t << "</td>";
-}
-
-void HtmlDocVisitor::visitPre(DocHtmlCaption *c)
-{
- if (m_hide) return;
- bool hasAlign = FALSE;
- HtmlAttribListIterator li(c->attribs());
- HtmlAttrib *att;
- for (li.toFirst();(att=li.current());++li)
- {
- if (att->name=="align") hasAlign=TRUE;
- }
- m_t << "<caption" << htmlAttribsToString(c->attribs());
- if (!hasAlign) m_t << " align=\"bottom\"";
- m_t << ">";
-}
-
-void HtmlDocVisitor::visitPost(DocHtmlCaption *)
-{
- if (m_hide) return;
- m_t << "</caption>\n";
-}
-
-void HtmlDocVisitor::visitPre(DocInternal *)
-{
- if (m_hide) return;
- m_t << "<p><b>" << theTranslator->trForInternalUseOnly() << "</b></p>" << endl;
- m_t << "<p>" << endl;
-}
-
-void HtmlDocVisitor::visitPost(DocInternal *)
-{
- if (m_hide) return;
- m_t << "</p>" << endl;
-}
-
-void HtmlDocVisitor::visitPre(DocHRef *href)
-{
- if (m_hide) return;
- m_t << "<a href=\"" << href->url() << "\""
- << htmlAttribsToString(href->attribs()) << ">";
-}
-
-void HtmlDocVisitor::visitPost(DocHRef *)
-{
- if (m_hide) return;
- m_t << "</a>";
-}
-
-void HtmlDocVisitor::visitPre(DocHtmlHeader *header)
-{
- if (m_hide) return;
- m_t << "<h" << header->level()
- << htmlAttribsToString(header->attribs()) << ">";
-}
-
-void HtmlDocVisitor::visitPost(DocHtmlHeader *header)
-{
- if (m_hide) return;
- m_t << "</h" << header->level() << ">\n";
-}
-
-void HtmlDocVisitor::visitPre(DocImage *img)
-{
- if (img->type()==DocImage::Html)
- {
- if (m_hide) return;
- QString baseName=img->name();
- int i;
- if ((i=baseName.findRev('/'))!=-1 || (i=baseName.findRev('\\'))!=-1)
- {
- baseName=baseName.right(baseName.length()-i-1);
- }
- m_t << "<div align=\"center\">" << endl;
- m_t << "<img src=\"" << img->relPath() << img->name() << "\" alt=\""
- << baseName << "\"" << ">" << endl;
- if (img->hasCaption())
- {
- m_t << "<p><strong>";
- }
- }
- else // other format -> skip
- {
- pushEnabled();
- m_hide=TRUE;
- }
-}
-
-void HtmlDocVisitor::visitPost(DocImage *img)
-{
- if (img->type()==DocImage::Html)
- {
- if (m_hide) return;
- if (img->hasCaption())
- {
- m_t << "</strong></p>";
- }
- m_t << "</div>" << endl;
- }
- else // other format
- {
- popEnabled();
- }
-}
-
-void HtmlDocVisitor::visitPre(DocDotFile *df)
-{
- if (m_hide) return;
- writeDotFile(df->file(),df->relPath());
- m_t << "<div align=\"center\">" << endl;
- if (df->hasCaption())
- {
- m_t << "<p><strong>";
- }
-}
-
-void HtmlDocVisitor::visitPost(DocDotFile *df)
-{
- if (m_hide) return;
- if (df->hasCaption())
- {
- m_t << "</strong></p>" << endl;
- }
- m_t << "</div>" << endl;
-}
-
-void HtmlDocVisitor::visitPre(DocLink *lnk)
-{
- if (m_hide) return;
- startLink(lnk->ref(),lnk->file(),lnk->relPath(),lnk->anchor());
-}
-
-void HtmlDocVisitor::visitPost(DocLink *)
-{
- if (m_hide) return;
- endLink();
-}
-
-void HtmlDocVisitor::visitPre(DocRef *ref)
-{
- if (m_hide) return;
- if (!ref->file().isEmpty())
- {
- startLink(ref->ref(),ref->file(),ref->relPath(),ref->anchor());
- }
- if (!ref->hasLinkText()) filter(ref->targetTitle());
-}
-
-void HtmlDocVisitor::visitPost(DocRef *ref)
-{
- if (m_hide) return;
- if (!ref->file().isEmpty()) endLink();
- //m_t << " ";
-}
-
-void HtmlDocVisitor::visitPre(DocSecRefItem *ref)
-{
- if (m_hide) return;
- QString refName=ref->file();
- if (refName.right(Doxygen::htmlFileExtension.length())!=
- QString(Doxygen::htmlFileExtension))
- {
- refName+=Doxygen::htmlFileExtension;
- }
- m_t << "<li><a href=\"" << refName << "#" << ref->anchor() << "\">";
-
-}
-
-void HtmlDocVisitor::visitPost(DocSecRefItem *)
-{
- if (m_hide) return;
- m_t << "</a> ";
-}
-
-void HtmlDocVisitor::visitPre(DocSecRefList *)
-{
- if (m_hide) return;
- m_t << "<multicol cols=3>" << endl;
- m_t << "<ul>" << endl;
-}
-
-void HtmlDocVisitor::visitPost(DocSecRefList *)
-{
- if (m_hide) return;
- m_t << "</ul>" << endl;
- m_t << "</multicol>" << endl;
-}
-
-//void HtmlDocVisitor::visitPre(DocLanguage *l)
-//{
-// QString langId = Config_getEnum("OUTPUT_LANGUAGE");
-// if (l->id().lower()!=langId.lower())
-// {
-// pushEnabled();
-// m_hide = TRUE;
-// }
-//}
-//
-//void HtmlDocVisitor::visitPost(DocLanguage *l)
-//{
-// QString langId = Config_getEnum("OUTPUT_LANGUAGE");
-// if (l->id().lower()!=langId.lower())
-// {
-// popEnabled();
-// }
-//}
-
-void HtmlDocVisitor::visitPre(DocParamSect *s)
-{
- if (m_hide) return;
- m_t << "<dl compact><dt><b>";
- switch(s->type())
- {
- case DocParamSect::Param:
- m_t << theTranslator->trParameters(); break;
- case DocParamSect::RetVal:
- m_t << theTranslator->trReturnValues(); break;
- case DocParamSect::Exception:
- m_t << theTranslator->trExceptions(); break;
- default:
- ASSERT(0);
- }
- m_t << ":";
- m_t << "</b></dt><dd>" << endl;
- m_t << " <table border=\"0\" cellspacing=\"2\" cellpadding=\"0\">" << endl;
-}
-
-void HtmlDocVisitor::visitPost(DocParamSect *)
-{
- if (m_hide) return;
- m_t << " </table>" << endl;
- m_t << "</dl>" << endl;
-}
-
-void HtmlDocVisitor::visitPre(DocParamList *pl)
-{
- if (m_hide) return;
- m_t << " <tr><td valign=\"top\">";
- if (pl->direction()!=DocParamSect::Unspecified)
- {
- m_t << "<tt>[";
- if (pl->direction()==DocParamSect::In)
- {
- m_t << "in";
- }
- else if (pl->direction()==DocParamSect::Out)
- {
- m_t << "out";
- }
- else if (pl->direction()==DocParamSect::InOut)
- {
- m_t << "in,out";
- }
- m_t << "]</tt>&nbsp;";
- }
- m_t << "</td><td valign=\"top\"><em>";
- //QStrListIterator li(pl->parameters());
- //const char *s;
- QListIterator<DocNode> li(pl->parameters());
- DocNode *param;
- bool first=TRUE;
- for (li.toFirst();(param=li.current());++li)
- {
- if (!first) m_t << ","; else first=FALSE;
- if (param->kind()==DocNode::Kind_Word)
- {
- visit((DocWord*)param);
- }
- else if (param->kind()==DocNode::Kind_LinkedWord)
- {
- visit((DocLinkedWord*)param);
- }
- }
- m_t << "</em>&nbsp;</td><td>";
-}
-
-void HtmlDocVisitor::visitPost(DocParamList *)
-{
- if (m_hide) return;
- m_t << "</td></tr>" << endl;
-}
-
-void HtmlDocVisitor::visitPre(DocXRefItem *x)
-{
- if (m_hide) return;
- bool anonymousEnum = x->file()=="@";
- if (!anonymousEnum)
- {
- m_t << "<dl compact><dt><b><a class=\"el\" href=\""
- << x->relPath() << x->file() << Doxygen::htmlFileExtension
- << "#" << x->anchor() << "\">";
- }
- else
- {
- m_t << "<dl compact><dt><b>";
- }
- filter(x->title());
- m_t << ":";
- if (!anonymousEnum) m_t << "</a>";
- m_t << "</b></dt><dd>";
-}
-
-void HtmlDocVisitor::visitPost(DocXRefItem *)
-{
- if (m_hide) return;
- m_t << "</dd></dl>" << endl;
-}
-
-void HtmlDocVisitor::visitPre(DocInternalRef *ref)
-{
- if (m_hide) return;
- startLink(0,ref->file(),ref->relPath(),ref->anchor());
-}
-
-void HtmlDocVisitor::visitPost(DocInternalRef *)
-{
- if (m_hide) return;
- endLink();
- m_t << " ";
-}
-
-void HtmlDocVisitor::visitPre(DocCopy *)
-{
-}
-
-void HtmlDocVisitor::visitPost(DocCopy *)
-{
-}
-
-void HtmlDocVisitor::visitPre(DocText *)
-{
-}
-
-void HtmlDocVisitor::visitPost(DocText *)
-{
-}
-
-void HtmlDocVisitor::filter(const char *str)
-{
- if (str==0) return;
- const char *p=str;
- char c;
- while (*p)
- {
- c=*p++;
- switch(c)
- {
- case '<': m_t << "&lt;"; break;
- case '>': m_t << "&gt;"; break;
- case '&': m_t << "&amp;"; break;
- default: m_t << c;
- }
- }
-}
-
-/// Escape basic entities to produce a valid CDATA attribute value,
-/// assume that the outer quoting will be using the double quote &quot;
-void HtmlDocVisitor::filterQuotedCdataAttr(const char* str)
-{
- if (str==0) return;
- const char *p=str;
- char c;
- while (*p)
- {
- c=*p++;
- switch(c)
- {
- case '&': m_t << "&amp;"; break;
- case '"': m_t << "&quot;"; break;
- // For SGML compliance, and given the SGML declaration for HTML syntax,
- // it's enough to replace these two, provided that the declaration
- // for the HTML version we generate (and as supported by the browser)
- // specifies that all the other symbols used in rawVal are
- // within the right charachter class (i.e., they're not
- // some multinational weird charachters not in the BASESET).
- // We assume that 1) the browser will support whatever is remaining
- // in the formula and 2) the TeX formulae are generally governed
- // by even stricter charachter restrictions so it should be enough.
- //
- // On some incompliant browsers, additional translation of
- // '>' and '<' into "&gt;" and "&lt;", respectively, might be needed;
- // but I'm unaware of particular modern (last 4 years) versions
- // with such problems, so let's not do it for performance.
- // Also, some brousers will (wrongly) not process the entity references
- // inside the attribute value and show the &...; form instead,
- // so we won't create entites unless necessary to minimize clutter there.
- // --vassilii
- default: m_t << c;
- }
- }
-}
-
-void HtmlDocVisitor::startLink(const QString &ref,const QString &file,
- const QString &relPath,const QString &anchor)
-{
- QCString *dest;
- if (!ref.isEmpty()) // link to entity imported via tag file
- {
- m_t << "<a class=\"elRef\" ";
- m_t << "doxygen=\"" << ref << ":";
- if ((dest=Doxygen::tagDestinationDict[ref])) m_t << *dest << "/";
- m_t << "\" ";
- }
- else // local link
- {
- m_t << "<a class=\"el\" ";
- }
- m_t << "href=\"";
- if (!ref.isEmpty())
- {
- if ((dest=Doxygen::tagDestinationDict[ref])) m_t << relPath << *dest << "/";
- }
- else
- {
- m_t << relPath;
- }
- if (!file.isEmpty()) m_t << file << Doxygen::htmlFileExtension;
- if (!anchor.isEmpty()) m_t << "#" << anchor;
- m_t << "\">";
-}
-
-void HtmlDocVisitor::endLink()
-{
- m_t << "</a>";
-}
-
-void HtmlDocVisitor::pushEnabled()
-{
- m_enabled.push(new bool(m_hide));
-}
-
-void HtmlDocVisitor::popEnabled()
-{
- bool *v=m_enabled.pop();
- ASSERT(v!=0);
- m_hide = *v;
- delete v;
-}
-
-void HtmlDocVisitor::writeDotFile(const QString &fileName,const QString &relPath)
-{
- QString baseName=fileName;
- int i;
- if ((i=baseName.findRev('/'))!=-1)
- {
- baseName=baseName.right(baseName.length()-i-1);
- }
- QString outDir = Config_getString("HTML_OUTPUT");
- writeDotGraphFromFile(fileName,outDir,baseName,BITMAP);
- QString mapName = baseName+".map";
- QString mapFile = fileName+".map";
- m_t << "<img src=\"" << relPath << baseName << "."
- << Config_getEnum("DOT_IMAGE_FORMAT") << "\" alt=\""
- << baseName << "\" border=\"0\" usemap=\"#" << mapName << "\">" << endl;
- QString imap = getDotImageMapFromFile(fileName,outDir,relPath.data());
- m_t << "<map name=\"" << mapName << "\">" << imap << "</map>" << endl;
-}
-
diff --git a/src/htmldocvisitor.h b/src/htmldocvisitor.h
deleted file mode 100644
index d83b41f..0000000
--- a/src/htmldocvisitor.h
+++ /dev/null
@@ -1,154 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 _HTMLDOCVISITOR_H
-#define _HTMLDOCVISITOR_H
-
-#include "docvisitor.h"
-#include <qstack.h>
-#include <qcstring.h>
-
-class QTextStream;
-class CodeOutputInterface;
-class QString;
-
-/*! @brief Concrete visitor implementation for HTML output. */
-class HtmlDocVisitor : public DocVisitor
-{
- public:
- HtmlDocVisitor(QTextStream &t,CodeOutputInterface &ci,const char *langExt);
-
- //--------------------------------------
- // visitor functions for leaf nodes
- //--------------------------------------
-
- void visit(DocWord *);
- void visit(DocLinkedWord *);
- void visit(DocWhiteSpace *);
- void visit(DocSymbol *);
- void visit(DocURL *);
- void visit(DocLineBreak *);
- void visit(DocHorRuler *);
- void visit(DocStyleChange *);
- void visit(DocVerbatim *);
- void visit(DocAnchor *);
- void visit(DocInclude *);
- void visit(DocIncOperator *);
- void visit(DocFormula *);
- void visit(DocIndexEntry *);
-
- //--------------------------------------
- // visitor functions for compound nodes
- //--------------------------------------
-
- void visitPre(DocAutoList *);
- void visitPost(DocAutoList *);
- void visitPre(DocAutoListItem *);
- void visitPost(DocAutoListItem *);
- void visitPre(DocPara *) ;
- void visitPost(DocPara *);
- void visitPre(DocRoot *);
- void visitPost(DocRoot *);
- void visitPre(DocSimpleSect *);
- void visitPost(DocSimpleSect *);
- void visitPre(DocTitle *);
- void visitPost(DocTitle *);
- void visitPre(DocSimpleList *);
- void visitPost(DocSimpleList *);
- void visitPre(DocSimpleListItem *);
- void visitPost(DocSimpleListItem *);
- void visitPre(DocSection *);
- void visitPost(DocSection *);
- void visitPre(DocHtmlList *);
- void visitPost(DocHtmlList *) ;
- void visitPre(DocHtmlListItem *);
- void visitPost(DocHtmlListItem *);
- void visitPre(DocHtmlDescList *);
- void visitPost(DocHtmlDescList *);
- void visitPre(DocHtmlDescTitle *);
- void visitPost(DocHtmlDescTitle *);
- void visitPre(DocHtmlDescData *);
- void visitPost(DocHtmlDescData *);
- void visitPre(DocHtmlTable *);
- void visitPost(DocHtmlTable *);
- void visitPre(DocHtmlRow *);
- void visitPost(DocHtmlRow *) ;
- void visitPre(DocHtmlCell *);
- void visitPost(DocHtmlCell *);
- void visitPre(DocHtmlCaption *);
- void visitPost(DocHtmlCaption *);
- void visitPre(DocInternal *);
- void visitPost(DocInternal *);
- void visitPre(DocHRef *);
- void visitPost(DocHRef *);
- void visitPre(DocHtmlHeader *);
- void visitPost(DocHtmlHeader *);
- void visitPre(DocImage *);
- void visitPost(DocImage *);
- void visitPre(DocDotFile *);
- void visitPost(DocDotFile *);
- void visitPre(DocLink *);
- void visitPost(DocLink *);
- void visitPre(DocRef *);
- void visitPost(DocRef *);
- void visitPre(DocSecRefItem *);
- void visitPost(DocSecRefItem *);
- void visitPre(DocSecRefList *);
- void visitPost(DocSecRefList *);
- void visitPre(DocParamSect *);
- void visitPost(DocParamSect *);
- void visitPre(DocParamList *);
- void visitPost(DocParamList *);
- void visitPre(DocXRefItem *);
- void visitPost(DocXRefItem *);
- void visitPre(DocInternalRef *);
- void visitPost(DocInternalRef *);
- void visitPre(DocCopy *);
- void visitPost(DocCopy *);
- void visitPre(DocText *);
- void visitPost(DocText *);
-
- private:
-
- //--------------------------------------
- // helper functions
- //--------------------------------------
-
- void filter(const char *str);
- void filterQuotedCdataAttr(const char* str);
- void startLink(const QString &ref,const QString &file,
- const QString &relPath,const QString &anchor);
- void endLink();
- void writeDotFile(const QString &fileName,const QString &relPath);
-
- void pushEnabled();
- void popEnabled();
-
- //--------------------------------------
- // state variables
- //--------------------------------------
-
- QTextStream &m_t;
- CodeOutputInterface &m_ci;
- bool m_insidePre;
- bool m_hide;
- QStack<bool> m_enabled;
- QCString m_langExt;
-};
-
-#endif
diff --git a/src/htmlgen.cpp b/src/htmlgen.cpp
deleted file mode 100644
index 9da1e6e..0000000
--- a/src/htmlgen.cpp
+++ /dev/null
@@ -1,1685 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-
-#include <stdlib.h>
-
-#include "qtbc.h"
-#include <qdir.h>
-#include "message.h"
-#include "htmlgen.h"
-#include "config.h"
-#include "util.h"
-#include "doxygen.h"
-#include "logos.h"
-#include "diagram.h"
-#include "version.h"
-#include "dot.h"
-#include "language.h"
-#include "htmlhelp.h"
-#include "docparser.h"
-#include "htmldocvisitor.h"
-#include "index.h"
-#include "pagedef.h"
-#include "debug.h"
-#include "dirdef.h"
-
-// #define GROUP_COLOR "#ff8080"
-
-//#define DBG_HTML(x) x;
-#define DBG_HTML(x)
-
-static const char *defaultStyleSheet =
-"BODY,H1,H2,H3,H4,H5,H6,P,CENTER,TD,TH,UL,DL,DIV {\n"
-" font-family: Geneva, Arial, Helvetica, sans-serif;\n"
-"}\n"
-"BODY,TD {\n"
-" font-size: 90%;\n"
-"}\n"
-"H1 {\n"
-" text-align: center;\n"
-" font-size: 160%;\n"
-"}\n"
-"H2 {\n"
-" font-size: 120%;\n"
-"}\n"
-"H3 {\n"
-" font-size: 100%;\n"
-"}\n"
-"CAPTION { font-weight: bold }\n"
-"DIV.qindex {\n"
-" width: 100%;\n"
-" background-color: #eeeeff;\n"
-" border: 1px solid #b0b0b0;\n"
-" text-align: center;\n"
-" margin: 2px;\n"
-" padding: 2px;\n"
-" line-height: 140%;\n"
-"}\n"
-"DIV.nav {\n"
-" width: 100%;\n"
-" background-color: #eeeeff;\n"
-" border: 1px solid #b0b0b0;\n"
-" text-align: center;\n"
-" margin: 2px;\n"
-" padding: 2px;\n"
-" line-height: 140%;\n"
-"}\n"
-"DIV.navtab {\n"
-" background-color: #eeeeff;\n"
-" border: 1px solid #b0b0b0;\n"
-" text-align: center;\n"
-" margin: 2px;\n"
-" margin-right: 15px;\n"
-" padding: 2px;\n"
-"}\n"
-"TD.navtab {\n"
-" font-size: 70%;\n"
-"}\n"
-"A.qindex {\n"
-" text-decoration: none;\n"
-" font-weight: bold;\n"
-" color: #1A419D;\n"
-"}\n"
-"A.qindex:visited {\n"
-" text-decoration: none;\n"
-" font-weight: bold;\n"
-" color: #1A419D\n"
-"}\n"
-"A.qindex:hover {\n"
-" text-decoration: none;\n"
-" background-color: #ddddff;\n"
-"}\n"
-"A.qindexHL {\n"
-" text-decoration: none;\n"
-" font-weight: bold;\n"
-" background-color: #6666cc;\n"
-" color: #ffffff;\n"
-" border: 1px double #9295C2;\n"
-"}\n"
-"A.qindexHL:hover {\n"
-" text-decoration: none;\n"
-" background-color: #6666cc;\n"
-" color: #ffffff;\n"
-"}\n"
-"A.qindexHL:visited { text-decoration: none; background-color: #6666cc; color: #ffffff }\n"
-"A.el { text-decoration: none; font-weight: bold }\n"
-"A.elRef { font-weight: bold }\n"
-"A.code:link { text-decoration: none; font-weight: normal; color: #0000FF}\n"
-"A.code:visited { text-decoration: none; font-weight: normal; color: #0000FF}\n"
-"A.codeRef:link { font-weight: normal; color: #0000FF}\n"
-"A.codeRef:visited { font-weight: normal; color: #0000FF}\n"
-"A:hover { text-decoration: none; background-color: #f2f2ff }\n"
-"DL.el { margin-left: -1cm }\n"
-".fragment {\n"
-" font-family: Fixed, monospace;\n"
-" font-size: 95%;\n"
-"}\n"
-"PRE.fragment {\n"
-" border: 1px solid #CCCCCC;\n"
-" background-color: #f5f5f5;\n"
-" margin-top: 4px;\n"
-" margin-bottom: 4px;\n"
-" margin-left: 2px;\n"
-" margin-right: 8px;\n"
-" padding-left: 6px;\n"
-" padding-right: 6px;\n"
-" padding-top: 4px;\n"
-" padding-bottom: 4px;\n"
-"}\n"
-//"DIV.fragment {\n"
-//" font-family: monospace\n"
-//" border: 1px solid #CCCCCC;\n"
-//" background-color: #f5f5f5;\n"
-//" padding: 6px;\n"
-//"}\n"
-"DIV.ah { background-color: black; font-weight: bold; color: #ffffff; margin-bottom: 3px; margin-top: 3px }\n"
-"TD.md { background-color: #F4F4FB; font-weight: bold; }\n"
-"TD.mdPrefix {\n"
-" background-color: #F4F4FB;\n"
-" color: #606060;\n"
-" font-size: 80%;\n"
-"}\n"
-"TD.mdname1 { background-color: #F4F4FB; font-weight: bold; color: #602020; }\n"
-"TD.mdname { background-color: #F4F4FB; font-weight: bold; color: #602020; width: 600px; }\n"
-"DIV.groupHeader {\n"
-" margin-left: 16px;\n"
-" margin-top: 12px;\n"
-" margin-bottom: 6px;\n"
-" font-weight: bold;\n"
-"}\n"
-"DIV.groupText { margin-left: 16px; font-style: italic; font-size: 90% }\n"
-"BODY {\n"
-" background: white;\n"
-" color: black;\n"
-" margin-right: 20px;\n"
-" margin-left: 20px;\n"
-"}\n"
-"TD.indexkey {\n"
-" background-color: #eeeeff;\n"
-" font-weight: bold;\n"
-" padding-right : 10px;\n"
-" padding-top : 2px;\n"
-" padding-left : 10px;\n"
-" padding-bottom : 2px;\n"
-" margin-left : 0px;\n"
-" margin-right : 0px;\n"
-" margin-top : 2px;\n"
-" margin-bottom : 2px;\n"
-" border: 1px solid #CCCCCC;\n"
-"}\n"
-"TD.indexvalue {\n"
-" background-color: #eeeeff;\n"
-" font-style: italic;\n"
-" padding-right : 10px;\n"
-" padding-top : 2px;\n"
-" padding-left : 10px;\n"
-" padding-bottom : 2px;\n"
-" margin-left : 0px;\n"
-" margin-right : 0px;\n"
-" margin-top : 2px;\n"
-" margin-bottom : 2px;\n"
-" border: 1px solid #CCCCCC;\n"
-"}\n"
-"TR.memlist {\n"
-" background-color: #f0f0f0; \n"
-"}\n"
-"P.formulaDsp { text-align: center; }\n"
-"IMG.formulaDsp { }\n"
-"IMG.formulaInl { vertical-align: middle; }\n"
-"SPAN.keyword { color: #008000 }\n"
-"SPAN.keywordtype { color: #604020 }\n"
-"SPAN.keywordflow { color: #e08000 }\n"
-"SPAN.comment { color: #800000 }\n"
-"SPAN.preprocessor { color: #806020 }\n"
-"SPAN.stringliteral { color: #002080 }\n"
-"SPAN.charliteral { color: #008080 }\n"
-".mdTable {\n"
-" border: 1px solid #868686;\n"
-" background-color: #F4F4FB;\n"
-"}\n"
-".mdRow {\n"
-" padding: 8px 10px;\n"
-"}\n"
-".mdescLeft {\n"
-" padding: 0px 8px 4px 8px;\n"
-" font-size: 80%;\n"
-" font-style: italic;\n"
-" background-color: #FAFAFA;\n"
-" border-top: 1px none #E0E0E0;\n"
-" border-right: 1px none #E0E0E0;\n"
-" border-bottom: 1px none #E0E0E0;\n"
-" border-left: 1px none #E0E0E0;\n"
-" margin: 0px;\n"
-"}\n"
-".mdescRight {\n"
-" padding: 0px 8px 4px 8px;\n"
-" font-size: 80%;\n"
-" font-style: italic;\n"
-" background-color: #FAFAFA;\n"
-" border-top: 1px none #E0E0E0;\n"
-" border-right: 1px none #E0E0E0;\n"
-" border-bottom: 1px none #E0E0E0;\n"
-" border-left: 1px none #E0E0E0;\n"
-" margin: 0px;\n"
-"}\n"
-".memItemLeft {\n"
-" padding: 1px 0px 0px 8px;\n"
-" margin: 4px;\n"
-" border-top-width: 1px;\n"
-" border-right-width: 1px;\n"
-" border-bottom-width: 1px;\n"
-" border-left-width: 1px;\n"
-" border-top-color: #E0E0E0;\n"
-" border-right-color: #E0E0E0;\n"
-" border-bottom-color: #E0E0E0;\n"
-" border-left-color: #E0E0E0;\n"
-" border-top-style: solid;\n"
-" border-right-style: none;\n"
-" border-bottom-style: none;\n"
-" border-left-style: none;\n"
-" background-color: #FAFAFA;\n"
-" font-size: 80%;\n"
-"}\n"
-".memItemRight {\n"
-" padding: 1px 8px 0px 8px;\n"
-" margin: 4px;\n"
-" border-top-width: 1px;\n"
-" border-right-width: 1px;\n"
-" border-bottom-width: 1px;\n"
-" border-left-width: 1px;\n"
-" border-top-color: #E0E0E0;\n"
-" border-right-color: #E0E0E0;\n"
-" border-bottom-color: #E0E0E0;\n"
-" border-left-color: #E0E0E0;\n"
-" border-top-style: solid;\n"
-" border-right-style: none;\n"
-" border-bottom-style: none;\n"
-" border-left-style: none;\n"
-" background-color: #FAFAFA;\n"
-" font-size: 80%;\n"
-"}\n"
-".memTemplItemLeft {\n"
-" padding: 1px 0px 0px 8px;\n"
-" margin: 4px;\n"
-" border-top-width: 1px;\n"
-" border-right-width: 1px;\n"
-" border-bottom-width: 1px;\n"
-" border-left-width: 1px;\n"
-" border-top-color: #E0E0E0;\n"
-" border-right-color: #E0E0E0;\n"
-" border-bottom-color: #E0E0E0;\n"
-" border-left-color: #E0E0E0;\n"
-" border-top-style: none;\n"
-" border-right-style: none;\n"
-" border-bottom-style: none;\n"
-" border-left-style: none;\n"
-" background-color: #FAFAFA;\n"
-" font-size: 80%;\n"
-"}\n"
-".memTemplItemRight {\n"
-" padding: 1px 8px 0px 8px;\n"
-" margin: 4px;\n"
-" border-top-width: 1px;\n"
-" border-right-width: 1px;\n"
-" border-bottom-width: 1px;\n"
-" border-left-width: 1px;\n"
-" border-top-color: #E0E0E0;\n"
-" border-right-color: #E0E0E0;\n"
-" border-bottom-color: #E0E0E0;\n"
-" border-left-color: #E0E0E0;\n"
-" border-top-style: none;\n"
-" border-right-style: none;\n"
-" border-bottom-style: none;\n"
-" border-left-style: none;\n"
-" background-color: #FAFAFA;\n"
-" font-size: 80%;\n"
-"}\n"
-".memTemplParams {\n"
-" padding: 1px 0px 0px 8px;\n"
-" margin: 4px;\n"
-" border-top-width: 1px;\n"
-" border-right-width: 1px;\n"
-" border-bottom-width: 1px;\n"
-" border-left-width: 1px;\n"
-" border-top-color: #E0E0E0;\n"
-" border-right-color: #E0E0E0;\n"
-" border-bottom-color: #E0E0E0;\n"
-" border-left-color: #E0E0E0;\n"
-" border-top-style: solid;\n"
-" border-right-style: none;\n"
-" border-bottom-style: none;\n"
-" border-left-style: none;\n"
-" color: #606060;\n"
-" background-color: #FAFAFA;\n"
-" font-size: 80%;\n"
-"}\n"
-".search { color: #003399;\n"
-" font-weight: bold;\n"
-"}\n"
-"FORM.search {\n"
-" margin-bottom: 0px;\n"
-" margin-top: 0px;\n"
-"}\n"
-"INPUT.search { font-size: 75%;\n"
-" color: #000080;\n"
-" font-weight: normal;\n"
-" background-color: #eeeeff;\n"
-"}\n"
-"TD.tiny { font-size: 75%;\n"
-"}\n"
-"a {\n"
-" color: #252E78;\n"
-"}\n"
-"a:visited {\n"
-" color: #3D2185;\n"
-"}\n"
-".dirtab { padding: 4px;\n"
-" border-collapse: collapse;\n"
-" border: 1px solid #b0b0b0;\n"
-"}\n"
-"TH.dirtab { background: #eeeeff;\n"
-" font-weight: bold;\n"
-"}\n"
-"HR { height: 1px;\n"
-" border: none;\n"
-" border-top: 1px solid black;\n"
-"}\n";
-
-
-
-static QCString g_header;
-static QCString g_footer;
-
-const char search_script[]=
-#include "search_php.h"
-;
-
-HtmlGenerator::HtmlGenerator() : OutputGenerator()
-{
- dir=Config_getString("HTML_OUTPUT");
- col=0;
-}
-
-HtmlGenerator::~HtmlGenerator()
-{
- //printf("HtmlGenerator::~HtmlGenerator()\n");
-}
-
-void HtmlGenerator::init()
-{
- QCString dname=Config_getString("HTML_OUTPUT");
- QDir d(dname);
- if (!d.exists() && !d.mkdir(dname))
- {
- err("Could not create output directory %s\n",dname.data());
- exit(1);
- }
- writeLogo(dname);
- if (!Config_getString("HTML_HEADER").isEmpty())
- {
- g_header=fileToString(Config_getString("HTML_HEADER"));
- //printf("g_header='%s'\n",g_header.data());
- }
- if (!Config_getString("HTML_FOOTER").isEmpty())
- {
- g_footer=fileToString(Config_getString("HTML_FOOTER"));
- //printf("g_footer='%s'\n",g_footer.data());
- }
- createSubDirs(d);
-}
-
-void HtmlGenerator::writeStyleSheetFile(QFile &file)
-{
- QTextStream t(&file);
- t << defaultStyleSheet;
-}
-
-static void writeDefaultHeaderFile(QTextStream &t, const char *title,
- const char *relPath,bool usePathCmd)
-{
- QString relPathStr;
- if (usePathCmd)
- relPathStr="$relpath$";
- else
- relPathStr=relPath;
-
- t << "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n"
- "<html><head>"
- "<meta http-equiv=\"Content-Type\" content=\"text/html;charset="
- << theTranslator->idLanguageCharset() << "\">\n"
- "<title>";
- t << convertToHtml(title);
- t << "</title>\n";
- t << "<link ";
- t << "href=\"";
- if (Config_getString("HTML_STYLESHEET").isEmpty())
- {
- t << relPathStr << "doxygen.css";
- }
- else
- {
- QCString cssname=Config_getString("HTML_STYLESHEET");
- QFileInfo cssfi(cssname);
- if (!cssfi.exists())
- {
- err("Error: user specified HTML style sheet file does not exist!\n");
- }
- t << relPathStr << cssfi.fileName();
- }
- t << "\" rel=\"stylesheet\" type=\"text/css\">\n"
- "</head><body>\n";
-}
-
-
-void HtmlGenerator::writeHeaderFile(QFile &file)
-{
- QTextStream t(&file);
-#if QT_VERSION >= 200
- t.setEncoding(QTextStream::Latin1);
-#endif
- writeDefaultHeaderFile(t,"$title",relativePathToRoot(0),TRUE);
-}
-
-void HtmlGenerator::writeFooterFile(QFile &file)
-{
- QTextStream t(&file);
- t << "<hr size=\"1\"><address style=\"align: right;\"><small>\n";
- t << theTranslator->trGeneratedAt( "$datetime", "$projectname" );
- t << "&nbsp;<a href=\"http://www.doxygen.org/index.html\">"
- << "<img src=\"doxygen.png\" alt=\"doxygen\" "
- << "align=\"middle\" border=\"0\">"
- << "</a> $doxygenversion";
- t << "</small></address>\n"
- << "</body>\n"
- << "</html>\n";
-}
-
-
-void HtmlGenerator::startFile(const char *name,const char *,
- const char *title)
-{
- //printf("HtmlGenerator::startFile(%s)\n",name);
- QCString fileName=name;
- lastTitle=title;
- relPath = relativePathToRoot(fileName);
-
- if (fileName.right(Doxygen::htmlFileExtension.length())!=Doxygen::htmlFileExtension)
- {
- fileName+=Doxygen::htmlFileExtension;
- }
- startPlainFile(fileName);
- if (Config_getBool("GENERATE_HTMLHELP"))
- {
- HtmlHelp::getInstance()->addIndexFile(fileName);
- }
-
- QCString dispTitle = title;
- QCString projName = Config_getString("PROJECT_NAME");
- if (!projName.isEmpty())
- {
- dispTitle.prepend(projName+": ");
- }
-
- lastFile = fileName;
- if (g_header.isEmpty())
- {
- writeDefaultHeaderFile(t,dispTitle,relPath,FALSE);
- }
- else
- {
- t << substituteKeywords(g_header,convertToHtml(dispTitle),relPath);
- }
- t << "<!-- " << theTranslator->trGeneratedBy() << " Doxygen "
- << versionString << " -->" << endl;
-}
-
-
-static void writePageFooter(QTextStream &t,const QCString &lastTitle,
- const QCString relPath)
-{
- if (g_footer.isEmpty())
- {
- t << "<hr size=\"1\"><address style=\"align: right;\"><small>";
- t << theTranslator->trGeneratedAt(
- dateToString(TRUE),
- Config_getString("PROJECT_NAME")
- );
- t << "&nbsp;" << endl << "<a href=\"http://www.doxygen.org/index.html\">";
- t << endl << "<img src=\"" << relPath << "doxygen.png\" alt=\"doxygen\" "
- << "align=\"middle\" border=\"0\">" << "</a> " << versionString << " ";
- t << "</small></address>";
- if (Debug::isFlagSet(Debug::Validate))
- {
- t << "<p><a href=\"http://validator.w3.org/check/referer\">"
- "<img border=\"0\" src=\"http://www.w3.org/Icons/valid-html401\""
- " height=\"31\" width=\"88\" alt=\"This page is Valid HTML 4.01 "
- "Transitional!\"></a><a href=\"http://jigsaw.w3.org/css-validator/\">"
- "<img style=\"border:0;width:88px;height:31px\" "
- "src=\"http://jigsaw.w3.org/css-validator/images/vcss\" "
- "alt=\"This page uses valid CSS!\"></a></p>";
- }
- t << "\n</body>\n</html>\n";
- }
- else
- {
- t << substituteKeywords(g_footer,convertToHtml(lastTitle),relPath);
- }
-}
-
-void HtmlGenerator::writeFooter()
-{
- writePageFooter(t,lastTitle,relPath);
-}
-
-void HtmlGenerator::endFile()
-{
- endPlainFile();
-}
-
-void HtmlGenerator::startProjectNumber()
-{
- t << "<h3 align=\"center\">";
-}
-
-void HtmlGenerator::endProjectNumber()
-{
- t << "</h3>";
-}
-
-void HtmlGenerator::writeStyleInfo(int part)
-{
- //printf("writeStyleInfo(%d)\n",part);
- if (part==0)
- {
- if (Config_getString("HTML_STYLESHEET").isEmpty()) // write default style sheet
- {
- //printf("write doxygen.css\n");
- startPlainFile("doxygen.css");
-
- // alternative, cooler looking titles
- //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 << defaultStyleSheet;
- endPlainFile();
- }
- else // write user defined style sheet
- {
- QCString cssname=Config_getString("HTML_STYLESHEET");
- QFileInfo cssfi(cssname);
- if (!cssfi.exists() || !cssfi.isFile() || !cssfi.isReadable())
- {
- err("Error: style sheet %s does not exist or is not readable!", Config_getString("HTML_STYLESHEET").data());
- }
- else
- {
- // convert style sheet to string
- QCString fileStr = fileToString(cssname);
- // write the string into the output dir
- startPlainFile(cssfi.fileName());
- t << fileStr;
- endPlainFile();
- }
- }
- }
-}
-
-void HtmlGenerator::startDoxyAnchor(const char *,const char *,
- const char *anchor, const char *name,
- const char *args)
-{
- t << "<a class=\"anchor\" name=\"" << anchor << "\"></a>";
- t << "<!-- doxytag: member=\"";
- docify(name);
- t << "\" ref=\"";
- docify(anchor);
- t << "\" args=\"";
- docify(args);
- t << "\" -->";
-}
-
-void HtmlGenerator::endDoxyAnchor(const char *,const char *)
-{
-}
-
-void HtmlGenerator::newParagraph()
-{
- t << endl << "<p>" << endl;
-}
-
-void HtmlGenerator::writeString(const char *text)
-{
- t << text;
-}
-
-void HtmlGenerator::writeIndexItem(const char *ref,const char *f,
- const char *name)
-{
- //printf("HtmlGenerator::writeIndexItem(%s,%s,%s)\n",ref,f,name);
- QCString *dest;
- t << "<li>";
- if (ref || f)
- {
- if (ref)
- {
- t << "<a class=\"elRef\" ";
- t << "doxygen=\"" << ref << ":";
- if ((dest=Doxygen::tagDestinationDict[ref])) t << *dest << "/";
- t << "\" ";
- }
- else
- {
- t << "<a class=\"el\" ";
- }
- t << "href=\"";
- if (ref)
- {
- if ((dest=Doxygen::tagDestinationDict[ref])) t << *dest << "/";
- }
- if (f) t << f << Doxygen::htmlFileExtension << "\">";
- }
- else
- {
- t << "<b>";
- }
- docify(name);
- if (ref || f)
- {
- t << "</a>" << endl;
- }
- else
- {
- t << "</b>";
- }
-}
-
-void HtmlGenerator::writeStartAnnoItem(const char *,const char *f,
- const char *path,const char *name)
-{
- t << "<li>";
- if (path) docify(path);
- t << "<a class=\"el\" href=\"" << f << Doxygen::htmlFileExtension << "\">";
- docify(name);
- t << "</a> ";
-}
-
-void HtmlGenerator::writeObjectLink(const char *ref,const char *f,
- const char *anchor, const char *name)
-{
- QCString *dest;
- if (ref)
- {
- t << "<a class=\"elRef\" ";
- t << "doxygen=\"" << ref << ":";
- if ((dest=Doxygen::tagDestinationDict[ref])) t << *dest << "/";
- t << "\" ";
- }
- else
- {
- t << "<a class=\"el\" ";
- }
- t << "href=\"";
- if (ref)
- {
- if ((dest=Doxygen::tagDestinationDict[ref])) t << relPath << *dest << "/";
- }
- else
- {
- t << relPath;
- }
- if (f) t << f << Doxygen::htmlFileExtension;
- if (anchor) t << "#" << anchor;
- t << "\">";
- docify(name);
- t << "</a>";
-}
-
-void HtmlGenerator::writeCodeLink(const char *ref,const char *f,
- const char *anchor, const char *name)
-{
- QCString *dest;
- if (ref)
- {
- t << "<a class=\"codeRef\" ";
- t << "doxygen=\"" << ref << ":";
- if ((dest=Doxygen::tagDestinationDict[ref])) t << *dest << "/";
- t << "\" ";
- }
- else
- {
- t << "<a class=\"code\" ";
- }
- t << "href=\"";
- if (ref)
- {
- if ((dest=Doxygen::tagDestinationDict[ref])) t << relPath << *dest << "/";
- }
- else
- {
- t << relPath;
- }
- if (f) t << f << Doxygen::htmlFileExtension;
- if (anchor) t << "#" << anchor;
- t << "\">";
- docify(name);
- t << "</a>";
- col+=strlen(name);
-}
-
-void HtmlGenerator::startTextLink(const char *f,const char *anchor)
-{
- t << "<a href=\"";
- if (f) t << relPath << f << Doxygen::htmlFileExtension;
- if (anchor) t << "#" << anchor;
- t << "\">";
-}
-
-void HtmlGenerator::endTextLink()
-{
- t << "</a>";
-}
-
-void HtmlGenerator::startHtmlLink(const char *url)
-{
- t << "<a ";
- if (Config_getBool("GENERATE_TREEVIEW")) t << "target=\"top\" ";
- t << "href=\"";
- if (url) t << url;
- t << "\">";
-}
-
-void HtmlGenerator::endHtmlLink()
-{
- t << "</a>";
-}
-
-void HtmlGenerator::startGroupHeader()
-{
- t << "<h2>";
-}
-
-void HtmlGenerator::endGroupHeader()
-{
- t << "</h2>" << endl;
-}
-
-void HtmlGenerator::startSection(const char *lab,const char *,SectionInfo::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;
- default: ASSERT(0); break;
- }
- t << "<a class=\"anchor\" name=\"" << lab << "\">";
-}
-
-void HtmlGenerator::endSection(const char *,SectionInfo::SectionType type)
-{
- t << "</a>";
- 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;
- default: ASSERT(0); break;
- }
-}
-
-void HtmlGenerator::docify(const char *str)
-{
- if (str)
- {
- const char *p=str;
- char c;
- while (*p)
- {
- c=*p++;
- switch(c)
- {
- case '<': t << "&lt;"; break;
- case '>': t << "&gt;"; break;
- case '&': t << "&amp;"; break;
- case '"': t << "&quot;"; break;
- case '\\':
- if (*p=='<')
- { t << "&lt;"; p++; }
- else if (*p=='>')
- { t << "&gt;"; p++; }
- else
- t << "\\";
- break;
- default: t << c;
- }
- }
- }
-}
-
-void HtmlGenerator::codify(const char *str)
-{
- //docify(str);
- //static char spaces[]=" ";
- if (str)
- {
- const char *p=str;
- char c;
- int spacesToNextTabStop;
- while (*p)
- {
- c=*p++;
- switch(c)
- {
- case '\t': spacesToNextTabStop =
- Config_getInt("TAB_SIZE") - (col%Config_getInt("TAB_SIZE"));
- t << spaces.left(spacesToNextTabStop);
- col+=spacesToNextTabStop;
- break;
- case '\n': t << "\n"; col=0;
- break;
- //case '\n': t << "<br>"; col=0;
- // break;
- case '\r': break;
- case '<': t << "&lt;"; col++;
- break;
- case '>': t << "&gt;"; col++;
- break;
- case '&': t << "&amp;"; col++;
- break;
- //case ' ': t << "&nbsp;"; col++;
- // break;
- case '\\':
- if (*p=='<')
- { t << "&lt;"; p++; }
- else if (*p=='>')
- { t << "&gt;"; p++; }
- else
- t << "\\";
- col++;
- break;
- default: t << c;
- col++;
- break;
- }
- }
- }
-}
-
-void HtmlGenerator::writeChar(char c)
-{
- char cs[2];
- cs[0]=c;
- cs[1]=0;
- docify(cs);
-}
-
-void HtmlGenerator::startClassDiagram()
-{
- t << "<p>";
-}
-
-void HtmlGenerator::endClassDiagram(ClassDiagram &d,
- const char *fileName,const char *name)
-{
- t << "\n<p><center><img src=\""
- << relPath << fileName << ".png\" usemap=\"#" << name << "_map\""
- << " border=\"0\" alt=\"\"></center>" << endl
- << "<map name=\"" << name << "_map\">" << endl;
-
- d.writeImage(t,dir,relPath,fileName);
-}
-
-
-void HtmlGenerator::startMemberList()
-{
- DBG_HTML(t << "<!-- startMemberList -->" << endl)
- if (Config_getBool("HTML_ALIGN_MEMBERS"))
- {
- }
- else
- {
- t << "<ul>" << endl;
- }
-}
-
-void HtmlGenerator::endMemberList()
-{
- DBG_HTML(t << "<!-- endMemberList -->" << endl)
- if (Config_getBool("HTML_ALIGN_MEMBERS"))
- {
- }
- else
- {
- t << "</ul>" << endl;
- }
-}
-
-// annonymous type:
-// 0 = single column right aligned
-// 1 = double column left aligned
-// 2 = single column left aligned
-void HtmlGenerator::startMemberItem(int annoType)
-{
- DBG_HTML(t << "<!-- startMemberItem() -->" << endl)
- if (Config_getBool("HTML_ALIGN_MEMBERS"))
- {
- t << "<tr>";
- switch(annoType)
- {
- case 0: t << "<td class=\"memItemLeft\" nowrap align=\"right\" valign=\"top\">"; break;
- case 1: t << "<td class=\"memItemLeft\" nowrap>"; break;
- case 2: t << "<td class=\"memItemLeft\" nowrap valign=\"top\">"; break;
- default: t << "<td class=\"memTemplParams\" nowrap colspan=\"2\">"; break;
- }
- }
- else
- {
- t << "<li>";
- }
-}
-
-void HtmlGenerator::endMemberItem()
-{
- //DBG_HTML(t << "<!-- endMemberItem(" << (int)inGroup << "," << fileName << "," << headerName << " -->" << endl)
- if (Config_getBool("HTML_ALIGN_MEMBERS"))
- {
- t << "</td></tr>\n";
- }
- t << endl;
-}
-
-void HtmlGenerator::startMemberTemplateParams()
-{
-}
-
-void HtmlGenerator::endMemberTemplateParams()
-{
- if (Config_getBool("HTML_ALIGN_MEMBERS"))
- {
- t << "</td></tr>" << endl;
- t << "<tr><td class=\"memTemplItemLeft\" nowrap align=\"right\" valign=\"top\">";
- }
-}
-
-
-void HtmlGenerator::insertMemberAlign(bool templ)
-{
- DBG_HTML(t << "<!-- insertMemberAlign -->" << endl)
- if (Config_getBool("HTML_ALIGN_MEMBERS"))
- {
- QCString className = templ ? "memTemplItemRight" : "memItemRight";
- t << "&nbsp;</td><td class=\"" << className << "\" valign=\"bottom\">";
- }
-}
-
-void HtmlGenerator::startMemberDescription()
-{
- DBG_HTML(t << "<!-- startMemberDescription -->" << endl)
- if (Config_getBool("HTML_ALIGN_MEMBERS"))
- {
- t << "<tr><td class=\"mdescLeft\">&nbsp;</td><td class=\"mdescRight\">";
- }
- else
- {
- t << "<dl class=\"el\"><dd class=\"mdescRight\">";
- }
-}
-
-void HtmlGenerator::endMemberDescription()
-{
- DBG_HTML(t << "<!-- endMemberDescription -->" << endl)
- if (Config_getBool("HTML_ALIGN_MEMBERS"))
- {
- t << "<br></td></tr>" << endl;
- }
- else
- {
- t << "<br></dl>";
- }
-}
-
-void HtmlGenerator::startMemberSections()
-{
- DBG_HTML(t << "<!-- startMemberSections -->" << endl)
- if (Config_getBool("HTML_ALIGN_MEMBERS"))
- {
- t << "<table border=\"0\" cellpadding=\"0\" cellspacing=\"0\">" << endl;
- // HTML is not recursively decomposable, sorry
- t << "<tr><td></td></tr>" << endl;
- }
-}
-
-void HtmlGenerator::endMemberSections()
-{
- DBG_HTML(t << "<!-- endMemberSections -->" << endl)
- if (Config_getBool("HTML_ALIGN_MEMBERS"))
- {
- t << "</table>" << endl;
- }
-}
-
-void HtmlGenerator::startMemberHeader()
-{
- DBG_HTML(t << "<!-- startMemberHeader -->" << endl)
- if (Config_getBool("HTML_ALIGN_MEMBERS"))
- {
- t << "<tr><td colspan=\"2\"><br><h2>";
- }
- else
- {
- startGroupHeader();
- }
-}
-
-void HtmlGenerator::endMemberHeader()
-{
- DBG_HTML(t << "<!-- endMemberHeader -->" << endl)
- if (Config_getBool("HTML_ALIGN_MEMBERS"))
- {
- t << "</h2></td></tr>" << endl;
- }
- else
- {
- endGroupHeader();
- }
-}
-
-void HtmlGenerator::startMemberSubtitle()
-{
- DBG_HTML(t << "<!-- startMemberSubtitle -->" << endl)
- if (Config_getBool("HTML_ALIGN_MEMBERS")) t << "<tr><td colspan=\"2\">";
-}
-
-void HtmlGenerator::endMemberSubtitle()
-{
- DBG_HTML(t << "<!-- endMemberSubtitle -->" << endl)
- if (Config_getBool("HTML_ALIGN_MEMBERS")) t << "<br><br></td></tr>" << endl;
-}
-
-void HtmlGenerator::startIndexList()
-{
- t << "<table>" << endl;
-}
-
-void HtmlGenerator::endIndexList()
-{
- t << "</table>" << endl;
-}
-
-void HtmlGenerator::startIndexKey()
-{
- // inserted 'class = ...', 02 jan 2002, jh
- t << " <tr><td class=\"indexkey\">";
-}
-
-void HtmlGenerator::endIndexKey()
-{
- t << "</td>";
-}
-
-void HtmlGenerator::startIndexValue(bool)
-{
- // inserted 'class = ...', 02 jan 2002, jh
- t << "<td class=\"indexvalue\">";
-}
-
-void HtmlGenerator::endIndexValue(const char *,bool)
-{
- t << "</td></tr>" << endl;
-}
-
-void HtmlGenerator::startMemberDoc(const char *,const char *,const char *,const char *)
-{
- DBG_HTML(t << "<!-- startMemberDoc -->" << endl;)
- t << "<p>" << endl;
- t << "<table class=\"mdTable\" cellpadding=\"2\" cellspacing=\"0\">" << endl;
- t << " <tr>" << endl;
- t << " <td class=\"mdRow\">" << endl;
- t << " <table cellpadding=\"0\" cellspacing=\"0\" border=\"0\">" << endl;
-}
-
-void HtmlGenerator::startMemberDocPrefixItem()
-{
- DBG_HTML(t << "<!-- startMemberDocPrefixItem -->" << endl;)
- t << " <tr>" << endl;
- t << " <td class=\"mdPrefix\" colspan=\"4\">" << endl;
-}
-
-void HtmlGenerator::endMemberDocPrefixItem()
-{
- DBG_HTML(t << "<!-- endMemberDocPrefixItem -->" << endl;)
- t << "</td>" << endl;
- t << " </tr>" << endl;
-}
-
-void HtmlGenerator::startMemberDocName(bool align)
-{
- DBG_HTML(t << "<!-- startMemberDocName -->" << endl;)
- t << " <tr>" << endl;
- t << " <td class=\"md\" nowrap valign=\"top\"";
- if (align) t << " align=\"right\"";
- t << ">";
-}
-
-void HtmlGenerator::endMemberDocName()
-{
- DBG_HTML(t << "<!-- endMemberDocName -->" << endl;)
- t << " </td>" << endl;
-}
-
-void HtmlGenerator::startParameterList(bool openBracket)
-{
- DBG_HTML(t << "<!-- startParameterList -->" << endl;)
- t << " <td class=\"md\" valign=\"top\">";
- if (openBracket)
- {
- t << "(&nbsp;";
- }
- t << "</td>" << endl;
-}
-
-void HtmlGenerator::startParameterType(bool first,const char *key)
-{
- if (first)
- {
- DBG_HTML(t << "<!-- startFirstParameterType -->" << endl;)
- t << " <td class=\"md\" nowrap valign=\"top\">";
- }
- else
- {
- DBG_HTML(t << "<!-- startParameterType -->" << endl;)
- t << " <tr>" << endl;
- t << " <td class=\"md\" nowrap align=\"right\">";
- if (key) t << key;
- t << "</td>" << endl;
- t << " <td class=\"md\"></td>" << endl;
- t << " <td class=\"md\" nowrap>";
- }
-}
-
-void HtmlGenerator::endParameterType()
-{
- DBG_HTML(t << "<!-- endParameterType -->" << endl;)
- t << "&nbsp;</td>" << endl;
-}
-
-void HtmlGenerator::startParameterName(bool oneArgOnly)
-{
- DBG_HTML(t << "<!-- startParameterName -->" << endl;)
- t << " <td class=\"mdname";
- if (oneArgOnly)
- {
- t << "1\" valign=\"top";
- }
- t << "\" nowrap>"; //&nbsp;";
-}
-
-void HtmlGenerator::endParameterName(bool last,bool emptyList,bool closeBracket)
-{
- DBG_HTML(t << "<!-- endParameterName -->" << endl;)
- if (last)
- {
- if (emptyList)
- {
- t << " </td>" << endl;
- t << " <td class=\"md\" valign=\"top\">";
- if (closeBracket) t << "&nbsp;)";
- t << "&nbsp;</td>" << endl;
- t << " <td class=\"md\" nowrap>";
- }
- else
- {
- t << "</td>" << endl;
- t << " </tr>" << endl;
- t << " <tr>" << endl;
- t << " <td class=\"md\"></td>" << endl;
- t << " <td class=\"md\">";
- if (closeBracket) t << ")";
- t << "&nbsp;</td>" << endl;
- t << " <td class=\"md\" colspan=\"2\">";
- }
- }
- else
- {
- t << "</td>" << endl;
- t << " </tr>" << endl;
- }
-}
-
-void HtmlGenerator::endParameterList()
-{
- DBG_HTML(t << "<!-- endParameterList -->" << endl;)
- t << "</td>" << endl;
- t << " </tr>" << endl;
-}
-
-void HtmlGenerator::endMemberDoc(bool hasArgs)
-{
- DBG_HTML(t << "<!-- endMemberDoc -->" << endl;)
- if (!hasArgs)
- {
- t << " </tr>" << endl;
- }
- t << " </table>" << endl;
- t << " </td>" << endl;
- t << " </tr>" << endl;
- t << "</table>" << endl;
-}
-
-void HtmlGenerator::startDotGraph()
-{
-}
-
-void HtmlGenerator::endDotGraph(DotClassGraph &g)
-{
- g.writeGraph(t,BITMAP,dir,relPath);
-}
-
-void HtmlGenerator::startInclDepGraph()
-{
-}
-
-void HtmlGenerator::endInclDepGraph(DotInclDepGraph &g)
-{
- g.writeGraph(t,BITMAP,dir,relPath);
-}
-
-
-void HtmlGenerator::startGroupCollaboration()
-{
-}
-
-void HtmlGenerator::endGroupCollaboration(DotGroupCollaboration &g)
-{
- g.writeGraph(t,BITMAP,dir,relPath);
-}
-
-
-void HtmlGenerator::startCallGraph()
-{
-}
-
-void HtmlGenerator::endCallGraph(DotCallGraph &g)
-{
- g.writeGraph(t,BITMAP,dir,relPath);
-}
-
-void HtmlGenerator::startDirDepGraph()
-{
-}
-
-void HtmlGenerator::endDirDepGraph(DotDirDeps &g)
-{
- g.writeGraph(t,BITMAP,dir,relPath);
-}
-
-void HtmlGenerator::writeGraphicalHierarchy(DotGfxHierarchyTable &g)
-{
- g.writeGraph(t,dir);
-}
-
-void HtmlGenerator::startMemberGroupHeader(bool)
-{
- t << "<tr><td colspan=\"2\"><div class=\"groupHeader\">";
-}
-
-void HtmlGenerator::endMemberGroupHeader()
-{
- t << "</div></td></tr>" << endl;
-}
-
-void HtmlGenerator::startMemberGroupDocs()
-{
- t << "<tr><td colspan=\"2\"><div class=\"groupText\">";
-}
-
-void HtmlGenerator::endMemberGroupDocs()
-{
- t << "<br><br></div></td></tr>" << endl;
-}
-
-void HtmlGenerator::startMemberGroup()
-{
-}
-
-void HtmlGenerator::endMemberGroup(bool)
-{
-}
-
-void HtmlGenerator::startIndent()
-{
- // I really wanted to use CSS here to provide an indented section, but
- // alas, Netscape is buggy enough to sometimes "forget" to end the
- // indent cause a staircase effect where the indent continuously increases.
- // It's back to abusing tables :-(
-
- //t << "<div class=\"in\">" << endl;
-
- t << "<table cellspacing=\"5\" cellpadding=\"0\" border=\"0\">\n"
- " <tr>\n"
- " <td>\n"
- " &nbsp;\n"
- " </td>\n"
- " <td>\n";
-}
-
-void HtmlGenerator::endIndent()
-{
- t << " </td>\n"
- " </tr>\n"
- "</table>\n";
- //t << "</div>" << endl;
-}
-
-void HtmlGenerator::addIndexItem(const char *,const char *)
-{
-}
-
-void HtmlGenerator::writeNonBreakableSpace(int n)
-{
- int i;
- for (i=0;i<n;i++)
- {
- t << "&nbsp;";
- }
-}
-
-void HtmlGenerator::writeLineNumber(const char *ref,const char *file,
- const char *anchor,int l)
-{
- QCString lineNumber,lineAnchor;
- lineNumber.sprintf("%05d",l);
- lineAnchor.sprintf("l%05d",l);
-
- if (file)
- {
- startCodeAnchor(lineAnchor);
- writeCodeLink(ref,file,anchor,lineNumber);
- endCodeAnchor();
- }
- else
- {
- startCodeAnchor(lineAnchor);
- codify(lineNumber);
- endCodeAnchor();
- }
- codify(" ");
-}
-
-void HtmlGenerator::startSimpleSect(SectionTypes,
- const char *file,const char *anchor,
- const char *title)
-{
- t << "<dl compact><dt><b>";
- if (file)
- {
- writeObjectLink(0,file,anchor,title);
- }
- else
- {
- docify(title);
- }
- t << "</b></dt>";
-}
-
-void HtmlGenerator::endSimpleSect()
-{
- t << "</dl>";
-}
-
-void HtmlGenerator::startParamList(ParamListTypes,
- const char *title)
-{
- t << "<dl compact><dt><b>";
- docify(title);
- t << "</b></dt>";
-}
-
-void HtmlGenerator::endParamList()
-{
- t << "</dl>";
-}
-
-void HtmlGenerator::printDoc(DocNode *n,const char *langExt)
-{
- HtmlDocVisitor *visitor = new HtmlDocVisitor(t,*this,langExt);
- n->accept(visitor);
- delete visitor;
-}
-
-static void startQuickIndexItem(QTextStream &t,const char *l,
- bool hl,bool compact,bool &first,
- const QCString &relPath)
-{
- if (!first && compact) t << " | ";
- first=FALSE;
- if (!compact) t << "<li>";
- if (hl && compact)
- {
- t << "<a class=\"qindexHL\" ";
- }
- else
- {
- t << "<a class=\"qindex\" ";
- }
- t << "href=\"" << relPath << l << "\">";
-}
-
-static void endQuickIndexItem(QTextStream &t)
-{
- t << "</a>";
-}
-
-static QCString fixSpaces(const QCString &s)
-{
- return substitute(s," ","&nbsp;");
-}
-
-static void writeDefaultQuickLinks(QTextStream &t,bool compact,
- HighlightedItem hli,const QCString &relPath)
-{
- bool first=TRUE;
- if (compact)
- {
- t << "<div class=\"qindex\">";
- }
- else
- {
- t << "<ul>";
- }
-
- if (Config_getBool("SEARCHENGINE"))
- {
- t << " <form class=\"search\" action=\"" << relPath
- << "search.php\" method=\"get\">\n";
- }
-
- if (Config_getBool("GENERATE_TREEVIEW"))
- {
- startQuickIndexItem(t,"main"+Doxygen::htmlFileExtension,
- hli==HLI_Main,compact,first,relPath);
- }
- else
- {
- startQuickIndexItem(t,"index"+Doxygen::htmlFileExtension,
- hli==HLI_Main,compact,first,relPath);
- }
- t << fixSpaces(theTranslator->trMainPage());
- endQuickIndexItem(t);
-
- if (documentedGroups>0)
- {
- startQuickIndexItem(t,"modules"+Doxygen::htmlFileExtension,
- hli==HLI_Modules,compact,first,relPath);
- t << fixSpaces(theTranslator->trModules());
- endQuickIndexItem(t);
- }
- if (documentedNamespaces>0)
- {
- startQuickIndexItem(t,"namespaces"+Doxygen::htmlFileExtension,
- hli==HLI_Namespaces,compact,first,relPath);
- if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
- {
- t << fixSpaces(theTranslator->trPackages());
- }
- else
- {
- t << theTranslator->trNamespaceList();
- }
- endQuickIndexItem(t);
- }
- if (hierarchyClasses>0)
- {
- startQuickIndexItem(t,"hierarchy"+Doxygen::htmlFileExtension,
- hli==HLI_Hierarchy,compact,first,relPath);
- t << fixSpaces(theTranslator->trClassHierarchy());
- endQuickIndexItem(t);
- }
- if (annotatedClasses>0)
- {
- if (Config_getBool("ALPHABETICAL_INDEX"))
- {
- startQuickIndexItem(t,"classes"+Doxygen::htmlFileExtension,
- hli==HLI_Classes,compact,first,relPath);
- t << fixSpaces(theTranslator->trAlphabeticalList());
- endQuickIndexItem(t);
- }
- startQuickIndexItem(t,"annotated"+Doxygen::htmlFileExtension,
- hli==HLI_Annotated,compact,first,relPath);
- t << fixSpaces(theTranslator->trCompoundList());
- endQuickIndexItem(t);
- }
- if (Config_getBool("SHOW_DIRECTORIES") && documentedDirs>0)
- {
- startQuickIndexItem(t,"dirs"+Doxygen::htmlFileExtension,
- hli==HLI_Directories,compact,first,relPath);
- t << fixSpaces(theTranslator->trDirectories());
- endQuickIndexItem(t);
- }
- if (documentedHtmlFiles>0)
- {
- startQuickIndexItem(t,"files"+Doxygen::htmlFileExtension,
- hli==HLI_Files,compact,first,relPath);
- t << fixSpaces(theTranslator->trFileList());
- endQuickIndexItem(t);
- }
- if (documentedNamespaceMembers[NMHL_All]>0)
- {
- startQuickIndexItem(t,"namespacemembers"+Doxygen::htmlFileExtension,
- hli==HLI_NamespaceMembers,compact,first,relPath);
- t << fixSpaces(theTranslator->trNamespaceMembers());
- endQuickIndexItem(t);
- }
- if (documentedClassMembers[CMHL_All]>0)
- {
- startQuickIndexItem(t,"functions"+Doxygen::htmlFileExtension,
- hli==HLI_Functions,compact,first,relPath);
- t << fixSpaces(theTranslator->trCompoundMembers());
- endQuickIndexItem(t);
- }
- if (documentedFileMembers[FMHL_All]>0)
- {
- startQuickIndexItem(t,"globals"+Doxygen::htmlFileExtension,
- hli==HLI_Globals,compact,first,relPath);
- t << fixSpaces(theTranslator->trFileMembers());
- endQuickIndexItem(t);
- }
- if (indexedPages>0)
- {
- startQuickIndexItem(t,"pages"+Doxygen::htmlFileExtension,
- hli==HLI_Pages,compact,first,relPath);
- t << fixSpaces(theTranslator->trRelatedPages());
- endQuickIndexItem(t);
- }
- if (Doxygen::exampleSDict->count()>0)
- {
- startQuickIndexItem(t,"examples"+Doxygen::htmlFileExtension,
- hli==HLI_Examples,compact,first,relPath);
- t << fixSpaces(theTranslator->trExamples());
- endQuickIndexItem(t);
- }
- if (Config_getBool("SEARCHENGINE"))
- {
- if (compact)
- {
- t << " | ";
- }
- else
- {
- t << "<li>";
- }
- t << "<span class=\"search";
- if (hli==HLI_Search) t << "HL";
- QCString searchFor = fixSpaces(theTranslator->trSearchForIndex());
- if (searchFor.at(0)=='S') searchFor="<u>S</u>"+searchFor.mid(1);
- t << "\">" << searchFor << "&nbsp;";
- if (hli!=HLI_Search)
- {
- t << "<input class=\"search\" type=\"text\" name=\"query\" value=\"\" size=\"20\" accesskey=\"s\"/>"
- "</span></form>";
- }
- }
- if (hli!=HLI_Search)
- {
- if (compact)
- {
- t << "</div>\n";
- }
- else
- {
- t << "</ul>\n";
- }
- }
-}
-
-void HtmlGenerator::writeQuickLinks(bool compact,HighlightedItem hli)
-{
- writeDefaultQuickLinks(t,compact,hli,relPath);
-}
-
-void HtmlGenerator::writeSearchPage()
-{
- if (Config_getBool("SEARCHENGINE") && Config_getBool("GENERATE_HTML"))
- {
- QCString fileName = Config_getString("HTML_OUTPUT")+"/search.php";
- QFile f(fileName);
- if (f.open(IO_WriteOnly))
- {
- QTextStream t(&f);
-#if QT_VERSION >= 200
- t.setEncoding(QTextStream::Latin1);
-#endif
- if (g_header.isEmpty())
- {
- writeDefaultHeaderFile(t,theTranslator->trSearch().data(),0,FALSE);
- }
- else
- {
- t << substituteKeywords(g_header,"Search","");
- }
- t << "<!-- " << theTranslator->trGeneratedBy() << " Doxygen "
- << versionString << " -->" << endl;
- if (!Config_getBool("DISABLE_INDEX"))
- {
- writeDefaultQuickLinks(t,TRUE,HLI_Search,"");
- }
- else
- {
- t << "<div class=\"qindex\">\n";
- t << " <form class=\"search\" action=\"search.php\" "
- << "method=\"get\">\n";
- }
-
- t << "\n<?php\n\n";
- t << "function search_results()\n";
- t << "{\n";
- t << " return \"" << theTranslator->trSearchResultsTitle() << "\";\n";
- t << "}\n";
- t << "\n";
- t << "function matches_text($num)\n";
- t << "{\n";
- t << " if ($num==0)\n";
- t << " {\n";
- t << " return \"" << theTranslator->trSearchResults(0) << "\";\n";
- t << " }\n";
- t << " else if ($num==1)\n";
- t << " {\n";
- t << " return \"" << theTranslator->trSearchResults(1) << "\";\n";
- t << " }\n";
- t << " else // $num>1\n";
- t << " {\n";
- t << " return \"" << theTranslator->trSearchResults(2) << "\";\n";
- t << " }\n";
- t << "}\n";
- t << "\n";
- t << "function report_matches()\n";
- t << "{\n";
- t << " return \"" << theTranslator->trSearchMatches() << " \";\n";
- t << "}\n";
- t << "\n";
- t << search_script;
- t << "\n";
- t << "?>\n";
- writePageFooter(t,"Search","");
- }
- }
-}
-
diff --git a/src/htmlgen.h b/src/htmlgen.h
deleted file mode 100644
index 567a166..0000000
--- a/src/htmlgen.h
+++ /dev/null
@@ -1,236 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 HTMLGEN_H
-#define HTMLGEN_H
-
-#include "qtbc.h"
-#include "outputgen.h"
-
-#define PREFRAG_START "<div class=\"fragment\"><pre class=\"fragment\">"
-#define PREFRAG_END "</pre></div>"
-
-class QFile;
-
-class HtmlGenerator : public OutputGenerator
-{
- public:
- HtmlGenerator();
- virtual ~HtmlGenerator();
- static void init();
- static void writeStyleSheetFile(QFile &f);
- static void writeHeaderFile(QFile &f);
- static void writeFooterFile(QFile &f);
-
- void enable()
- { if (genStack->top()) active=*genStack->top(); else active=TRUE; }
- void disable() { active=FALSE; }
- void enableIf(OutputType o) { if (o==Html) active=TRUE; }
- void disableIf(OutputType o) { if (o==Html) active=FALSE; }
- void disableIfNot(OutputType o) { if (o!=Html) active=FALSE; }
- bool isEnabled(OutputType o) { return (o==Html && active); }
- OutputGenerator *get(OutputType o) { return (o==Html) ? this : 0; }
-
- void printDoc(DocNode *,const char *);
-
- void startFile(const char *name,const char *manName,const char *title);
- void writeFooter();
- void endFile();
- void clearBuffer();
-
- void startIndexSection(IndexSections) {}
- void endIndexSection(IndexSections) {}
- void startProjectNumber();
- void endProjectNumber();
- void writeStyleInfo(int part);
- void startTitleHead(const char *) { startTitle(); }
- void endTitleHead(const char *,const char *) { endTitle(); }
- void startTitle() { t << "<h1>"; }
- void endTitle() { t << "</h1>"; }
-
- void newParagraph();
- void writeString(const char *text);
- void startIndexList();
- void endIndexList();
- void startIndexKey();
- void endIndexKey();
- void startIndexValue(bool);
- void endIndexValue(const char *,bool);
- void startItemList() { t << "<ul>" << endl; }
- void endItemList() { t << "</ul>" << endl; }
- void writeIndexItem(const char *ref,const char *file,const char *name);
- void docify(const char *text);
- void codify(const char *text);
- void writeObjectLink(const char *ref,const char *file,
- const char *anchor,const char *name);
- void writeCodeLink(const char *ref,const char *file,
- const char *anchor,const char *name);
- void startTextLink(const char *file,const char *anchor);
- void endTextLink();
- void startHtmlLink(const char *url);
- void endHtmlLink();
- void startTypewriter() { t << "<code>"; }
- void endTypewriter() { t << "</code>"; }
- void startGroupHeader();
- void endGroupHeader();
- void writeListItem() { t << "<li>"; }
-
- void startMemberSections();
- void endMemberSections();
- void startMemberHeader();
- void endMemberHeader();
- void startMemberSubtitle();
- void endMemberSubtitle();
- void startMemberList();
- void endMemberList();
- void startAnonTypeScope(int) {}
- void endAnonTypeScope(int) {}
- void startMemberItem(int);
- void endMemberItem();
- void startMemberTemplateParams();
- void endMemberTemplateParams();
-
- void startMemberGroupHeader(bool);
- void endMemberGroupHeader();
- void startMemberGroupDocs();
- void endMemberGroupDocs();
- void startMemberGroup();
- void endMemberGroup(bool);
-
- void insertMemberAlign(bool);
- void startMemberDescription();
- void endMemberDescription();
-
- void writeRuler() { t << "<hr>"; }
- void writeAnchor(const char *,const char *name)
- { t << "<a name=\"" << name <<"\"></a>"; }
- void startCodeFragment() { t << PREFRAG_START; }
- void endCodeFragment() { t << PREFRAG_END; }
- void writeLineNumber(const char *,const char *,const char *,int);
- void startCodeLine() { col=0; }
- void endCodeLine() { codify("\n"); }
- void startEmphasis() { t << "<em>"; }
- void endEmphasis() { t << "</em>"; }
- void startBold() { t << "<b>"; }
- void endBold() { t << "</b>"; }
- void startDescription() { t << endl << "<dl compact>" << endl; }
- void endDescription() { t << endl << "</dl>" << endl; }
- void startDescItem() { t << "<dt>"; }
- void endDescItem() { t << "<dd>"; }
- void lineBreak() { t << "<br>" << endl; }
- void writeChar(char c);
- void startMemberDoc(const char *,const char *,const char *,const char *);
- void endMemberDoc(bool);
- void startDoxyAnchor(const char *fName,const char *manName,
- const char *anchor,const char *name,
- const char *args);
- void endDoxyAnchor(const char *fName,const char *anchor);
- void startCodeAnchor(const char *label) { t << "<a name=\"" << label << "\"></a>"; }
- void endCodeAnchor() { }
- void writeLatexSpacing() {}
- void writeStartAnnoItem(const char *type,const char *file,
- const char *path,const char *name);
- void writeEndAnnoItem(const char *) { t << endl; }
- void startSubsection() { t << "<h2>"; }
- void endSubsection() { t << "</h2>" << endl; }
- void startSubsubsection() { t << "<h3>"; }
- void endSubsubsection() { t << "</h3>" << endl; }
- void startCenter() { t << "<center>" << endl; }
- void endCenter() { t << "</center>" << endl; }
- void startSmall() { t << "<small>" << endl; }
- void endSmall() { t << "</small>" << endl; }
- void startDescList(SectionTypes) { t << "<dl compact><dt><b>" << endl; }
- void endDescList() { t << "</dl>"; }
- void startSimpleSect(SectionTypes,const char *,const char *,const char *);
- void endSimpleSect();
- void startParamList(ParamListTypes,const char *);
- void endParamList();
- void writeDescItem() { t << "<dd>" << endl; }
- void startSection(const char *,const char *,SectionInfo::SectionType);
- void endSection(const char *,SectionInfo::SectionType);
- void addIndexItem(const char *,const char *);
- void startIndent();
- void endIndent();
- void writeSynopsis() {}
- void startClassDiagram();
- void endClassDiagram(ClassDiagram &,const char *,const char *);
- void startPageRef() {}
- void endPageRef(const char *,const char *) {}
- //void startQuickIndexItem(const char *,const char *);
- //void endQuickIndexItem();
- void writeQuickLinks(bool compact,HighlightedItem hli);
- void writeNonBreakableSpace(int);
-
- void startDescTable()
- { t << "<table border=\"0\" cellspacing=\"2\" cellpadding=\"0\">" << endl; }
- void endDescTable()
- { t << "</table>" << endl; }
- void startDescTableTitle()
- { t << "<tr><td valign=\"top\"><em>"; }
- void endDescTableTitle()
- { t << "</em>&nbsp;</td>"; }
- void startDescTableData()
- { t << "<td>" << endl; }
- void endDescTableData()
- { t << "</td></tr>" << endl; }
-
- void startDotGraph();
- void endDotGraph(DotClassGraph &g);
- void startInclDepGraph();
- void endInclDepGraph(DotInclDepGraph &g);
- void startGroupCollaboration();
- void endGroupCollaboration(DotGroupCollaboration &g);
- void startCallGraph();
- void endCallGraph(DotCallGraph &g);
- void startDirDepGraph();
- void endDirDepGraph(DotDirDeps &g);
- void writeGraphicalHierarchy(DotGfxHierarchyTable &g);
-
- void startTextBlock(bool) {}
- void endTextBlock(bool) {}
- void lastIndexPage() {}
-
- void startMemberDocPrefixItem();
- void endMemberDocPrefixItem();
- void startMemberDocName(bool);
- void endMemberDocName();
- void startParameterType(bool first,const char *key);
- void endParameterType();
- void startParameterName(bool);
- void endParameterName(bool last,bool emptyList,bool closeBracket);
- void startParameterList(bool);
- void endParameterList();
-
- void startFontClass(const char *s) { t << "<span class=\"" << s << "\">"; }
- void endFontClass() { t << "</span>"; }
-
- void writeCodeAnchor(const char *anchor)
- { t << "<a name=\"" << anchor << "\"></a>"; }
- static void writeSearchPage();
-
- private:
- QCString lastTitle;
- QCString lastFile;
- QCString relPath;
-
- HtmlGenerator &operator=(const HtmlGenerator &g);
- HtmlGenerator(const HtmlGenerator &g);
-
- int col;
-};
-
-#endif
diff --git a/src/htmlhelp.cpp b/src/htmlhelp.cpp
deleted file mode 100644
index c8d7187..0000000
--- a/src/htmlhelp.cpp
+++ /dev/null
@@ -1,566 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- * The code is this file is largely based on a contribution from
- * Harm van der Heijden <H.v.d.Heijden@phys.tue.nl>
- * Please send thanks to him and bug reports to me :-)
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <qlist.h>
-#include <qdict.h>
-
-#include "htmlhelp.h"
-#include "config.h"
-#include "message.h"
-#include "doxygen.h"
-#include "language.h"
-
-//----------------------------------------------------------------------------
-
-struct IndexField
-{
- QCString name;
- QCString url;
- QCString anchor;
- bool link;
- bool reversed;
-};
-
-class IndexFieldList : public QList<IndexField>
-{
- public:
- int compareItems(GCI item1, GCI item2)
- {
- return stricmp(((IndexField *)item1)->name,((IndexField *)item2)->name);
- }
- ~IndexFieldList() {}
-};
-
-class IndexFieldListIterator : public QListIterator<IndexField>
-{
- public:
- IndexFieldListIterator( const IndexFieldList &list) :
- QListIterator<IndexField>(list) {}
-};
-
-class IndexFieldDict : public QDict<IndexField>
-{
- public:
- IndexFieldDict(int size) : QDict<IndexField>(size) {}
- ~IndexFieldDict() {}
-};
-
-/*! A helper class for HtmlHelp that manages a two level index in
- * alphabetical order
- */
-class HtmlHelpIndex
-{
- public:
- HtmlHelpIndex();
- ~HtmlHelpIndex();
- void addItem(const char *first,const char *second,
- const char *url, const char *anchor,
- bool hasLink,bool reversed);
- void writeFields(QTextStream &t);
- private:
- IndexFieldList *list;
- IndexFieldDict *dict;
-};
-
-/*! Constructs a new HtmlHelp index */
-HtmlHelpIndex::HtmlHelpIndex()
-{
- list = new IndexFieldList;
- dict = new IndexFieldDict(10007);
- list->setAutoDelete(TRUE);
-}
-
-/*! Destroys the HtmlHelp index */
-HtmlHelpIndex::~HtmlHelpIndex()
-{
- delete list;
- delete dict;
-}
-
-/*! Stores an item in the index if it is not already present.
- * Items are stored in alphetical order, by sorting on the
- * concatenation of \a level1 and \a level2 (if present).
- *
- * \param level1 the string at level 1 in the index.
- * \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
- * 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.
- */
-void HtmlHelpIndex::addItem(const char *level1,const char *level2,
- const char *url,const char *anchor,bool hasLink,
- bool reversed)
-{
- QCString key = level1;
- if (level2) key+= (QCString)"?" + level2;
- if (dict->find(key)==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;
- list->inSort(f);
- dict->insert(key,f);
- }
-}
-
-/*! Writes the sorted list of index items into a html like list.
- *
- * An list of calls with <code>name = level1,level2</code> as follows:
- * <pre>
- * a1,b1
- * a1,b2
- * a2,b1
- * a2,b2
- * a3
- * a4,b1
- * </pre>
- *
- * Will result in the following list:
- *
- * <pre>
- * a1 -> link to url if hasLink==TRUE
- * b1 -> link to url#anchor
- * b2 -> link to url#anchor
- * a2 -> link to url if hasLink==TRUE
- * b1 -> link to url#anchor
- * b2 -> link to url#anchor
- * a3 -> link to url if hasLink==TRUE
- * a4 -> link to url if hasLink==TRUE
- * b1 -> link to url#anchor
- * </pre>
- */
-void HtmlHelpIndex::writeFields(QTextStream &t)
-{
- IndexFieldListIterator ifli(*list);
- IndexField *f;
- QCString lastLevel1;
- bool level2Started=FALSE;
- for (;(f=ifli.current());++ifli)
- {
- 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);
- }
- else
- {
- level1 = f->name.copy();
- }
-
- if (level1!=lastLevel1)
- { // finish old list at level 2
- if (level2Started) t << " </UL>" << endl;
- level2Started=FALSE;
-
- // <Antony>
- // Added this code so that an item with only one subitem is written
- // without any subitem.
- // For example:
- // a1, b1 -> will create only a1, not separate subitem for b1
- // a2, b2
- // a2, b3
- QCString nextLevel1;
- IndexField* fnext = ++ifli;
- if (fnext)
- {
- nextLevel1 = fnext->name.left(fnext->name.find('?'));
- --ifli;
- }
- if (level1 != nextLevel1)
- {
- level2 = "";
- }
- // </Antony>
-
- if (level2.isEmpty())
- {
- t << " <LI><OBJECT type=\"text/sitemap\">";
- t << "<param name=\"Local\" value=\"" << f->url << Doxygen::htmlFileExtension;
- if (!f->anchor.isEmpty() && f->reversed) t << "#" << f->anchor;
- t << "\">";
- t << "<param name=\"Name\" value=\"" << level1 << "\">"
- "</OBJECT>\n";
- }
- else
- {
- if (f->link)
- {
- t << " <LI><OBJECT type=\"text/sitemap\">";
- t << "<param name=\"Local\" value=\"" << f->url << Doxygen::htmlFileExtension;
- if (!f->anchor.isEmpty() && f->reversed) t << "#" << f->anchor;
- t << "\">";
- t << "<param name=\"Name\" value=\"" << level1 << "\">"
- "</OBJECT>\n";
- }
- else
- {
- t << " <LI><OBJECT type=\"text/sitemap\">";
- t << "<param name=\"See Also\" value=\"" << level1 << "\">";
- t << "<param name=\"Name\" value=\"" << level1 << "\">"
- "</OBJECT>\n";
- }
- }
- }
- if (!level2Started && !level2.isEmpty())
- { // start new list at level 2
- t << " <UL>" << endl;
- level2Started=TRUE;
- }
- else if (level2Started && level2.isEmpty())
- { // end list at level 2
- t << " </UL>" << endl;
- level2Started=FALSE;
- }
- if (level2Started)
- {
- t << " <LI><OBJECT type=\"text/sitemap\">";
- t << "<param name=\"Local\" value=\"" << f->url << Doxygen::htmlFileExtension;
- if (!f->anchor.isEmpty()) t << "#" << f->anchor;
- t << "\">";
- t << "<param name=\"Name\" value=\"" << level2 << "\">"
- "</OBJECT>\n";
- }
- lastLevel1 = level1.copy();
- }
- if (level2Started) t << " </UL>" << endl;
-}
-
-//----------------------------------------------------------------------------
-
-HtmlHelp *HtmlHelp::theInstance = 0;
-
-/*! Constructs an html object.
- * The object has to be \link initialize() initialized\endlink before it can
- * be used.
- */
-HtmlHelp::HtmlHelp() : indexFileDict(1009)
-{
- /* initial depth */
- dc = 0;
- cf = kf = 0;
- index = new HtmlHelpIndex;
-}
-
-/*! return a reference to the one and only instance of this class.
- */
-HtmlHelp *HtmlHelp::getInstance()
-{
- if (theInstance==0) theInstance = new HtmlHelp;
- return theInstance;
-}
-
-static QDict<QCString> s_languageDict;
-
-/*! This will create a contents file (index.hhc) and a index file (index.hhk)
- * and write the header of those files.
- * It also creates a project file (index.hhp)
- * \sa finalize()
- */
-void HtmlHelp::initialize()
-{
- /* open the contents file */
- QCString fName = Config_getString("HTML_OUTPUT") + "/index.hhc";
- cf = new QFile(fName);
- if (!cf->open(IO_WriteOnly))
- {
- err("Could not open file %s for writing\n",fName.data());
- exit(1);
- }
- /* Write the header of the contents file */
- cts.setDevice(cf);
-#if QT_VERSION >= 200
- cts.setEncoding(QTextStream::Latin1);
-#endif
- 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))
- {
- err("Could not open file %s for writing\n",fName.data());
- exit(1);
- }
- /* Write the header of the contents file */
- kts.setDevice(kf);
-#if QT_VERSION >= 200
- kts.setEncoding(QTextStream::Latin1);
-#endif
- 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)
- */
- 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("greece", 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("portugese", new QCString("0x816 Portuguese(Portugal)"));
- s_languageDict.insert("brazil", new QCString("0x416 Portuguese(Brazil)"));
- s_languageDict.insert("russian", new QCString("0x419 Russian"));
- s_languageDict.insert("spanish", new QCString("0x40A Spannish(Traditional Sort)"));
- s_languageDict.insert("swedish", new QCString("0x41D Swedish"));
- s_languageDict.insert("turkey", 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("chinese", new QCString("0x804 Chinese (PRC)"));
- s_languageDict.insert("chinese-traditional", new QCString("0x404 Chinese (Taiwan)"));
-}
-
-
-static QCString getLanguageString()
-{
- if (!theTranslator->idLanguage().isEmpty())
- {
- QCString *s = s_languageDict[theTranslator->idLanguage()];
- if (s)
- {
- return *s;
- }
- }
- // default language
- return "0x409 English (United States)";
-}
-
-
-
-void HtmlHelp::createProjectFile()
-{
- /* Write the project file */
- QCString fName = Config_getString("HTML_OUTPUT") + "/index.hhp";
- QFile f(fName);
- if (f.open(IO_WriteOnly))
- {
- QTextStream t(&f);
-#if QT_VERSION >= 200
- t.setEncoding(QTextStream::Latin1);
-#endif
-
-
-
- QCString indexName="index"+Doxygen::htmlFileExtension;
- if (Config_getBool("GENERATE_TREEVIEW")) indexName="main"+Doxygen::htmlFileExtension;
- t << "[OPTIONS]\n";
- if (!Config_getString("CHM_FILE").isEmpty())
- {
- 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;
- if (Config_getBool("BINARY_TOC")) t << "Binary TOC=YES\n";
- if (Config_getBool("GENERATE_CHI")) t << "Create CHI file=YES\n";
- t << "Title=" << Config_getString("PROJECT_NAME") << endl << endl;
-
- t << "[WINDOWS]" << endl;
- t << "main=\"" << Config_getString("PROJECT_NAME") << "\",\"index.hhc\","
- "\"index.hhk\",\"" << indexName << "\",\"" <<
- indexName << "\",,,,,0x23520,,0x387e,,,,,,,,0" << endl << endl;
-
- t << "[FILES]" << endl;
- char *s = indexFiles.first();
- while (s)
- {
- t << s << endl;
- s = indexFiles.next();
- }
- f.close();
- }
- else
- {
- err("Could not open file %s for writing\n",fName.data());
- }
-}
-
-void HtmlHelp::addIndexFile(const char *s)
-{
- if (indexFileDict.find(s)==0)
- {
- indexFiles.append(s);
- indexFileDict.insert(s,(void *)0x8);
- }
-}
-
-/*! Finalizes the HTML help. This will finish and close the
- * contents file (index.hhc) and the index file (index.hhk).
- * \sa initialize()
- */
-void HtmlHelp::finalize()
-{
- // end the contents file
- cts << "</UL>\n";
- cts.unsetDevice();
- cf->close();
- delete cf;
-
- index->writeFields(kts);
-
- // end the index file
- kts << "</UL>\n";
- kts.unsetDevice();
- kf->close();
- delete kf;
-
- createProjectFile();
- s_languageDict.clear();
-}
-
-/*! Increase the level of the contents hierarchy.
- * This will start a new unnumbered HTML list in contents file.
- * \sa decContentsDepth()
- */
-int HtmlHelp::incContentsDepth()
-{
- int i; for (i=0;i<dc+1;i++) cts << " ";
- cts << "<UL>\n";
- return ++dc;
-}
-
-/*! Decrease the level of the contents hierarchy.
- * This will end the unnumber HTML list.
- * \sa incContentsDepth()
- */
-int HtmlHelp::decContentsDepth()
-{
- int i; for (i=0;i<dc;i++) cts << " ";
- cts << "</UL>\n";
- return --dc;
-}
-
-/*! Add an list item to the contents file.
- * \param isDir boolean indicating if this is a dir or file entry
- * \param name the name of the item.
- * \param ref the URL of to the item.
- * \param anchor the anchor of the item.
- */
-void HtmlHelp::addContentsItem(bool isDir,
- const char *name,const char *ref,
- const char *anchor)
-{
- // If we're using a binary toc then folders cannot have links.
- if(Config_getBool("BINARY_TOC") && isDir)
- {
- ref = 0;
- anchor = 0;
- }
-
- int i; for (i=0;i<dc;i++) cts << " ";
- cts << "<LI><OBJECT type=\"text/sitemap\">";
- cts << "<param name=\"Name\" value=\"" << name << "\">";
- if (ref) // made ref optional param - KPW
- {
- cts << "<param name=\"Local\" value=\"" << ref << Doxygen::htmlFileExtension;
- if (anchor) cts << "#" << anchor;
- cts << "\">";
- }
- cts << "<param name=\"ImageNumber\" value=\"";
- if (isDir) // added - KPW
- {
- cts << (int)BOOK_CLOSED ;
- }
- else
- {
- cts << (int)TEXT;
- }
- cts << "\">";
- cts << "</OBJECT>\n";
-}
-
-/*! Add an list item to the index file.
- * \param level1 the main index of the item.
- * \param level2 the sub index of the item.
- * \param contRef the output file refering to the container.
- * \param memRef the output file containing to the member documentation.
- * \param anchor the anchor of the item.
- * \sa HtmlHelpIndex
- */
-void HtmlHelp::addIndexItem(const char *level1, const char *level2,
- const char *contRef, const char *memRef,
- const char *anchor)
-{
- index->addItem(level1,level2,contRef,anchor,TRUE,FALSE);
- index->addItem(level2,level1,memRef,anchor,TRUE,TRUE);
-}
-
diff --git a/src/htmlhelp.h b/src/htmlhelp.h
deleted file mode 100644
index 6652989..0000000
--- a/src/htmlhelp.h
+++ /dev/null
@@ -1,96 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- * The code is this file is largely based on a contribution from
- * Harm van der Heijden <H.v.d.Heijden@phys.tue.nl>
- * Please send thanks to him and bug reports to me :-)
- */
-
-#ifndef HTMLHELP_H
-#define HTMLHELP_H
-
-#include "qtbc.h"
-#include <qtextstream.h>
-#include <qstrlist.h>
-
-class QFile;
-class HtmlHelpIndex;
-
-/*! A class that generated the HTML Help specific files.
- * These files can be used with the Microsoft HTML Help workshop
- * to generate compressed HTML files (.chm).
- */
-class HtmlHelp
-{
- /*! 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 {
- BOOK_CLOSED=1, BOOK_OPEN,
- BOOK_CLOSED_NEW, BOOK_OPEN_NEW,
- FOLDER_CLOSED, FOLDER_OPEN,
- FOLDER_CLOSED_NEW,FOLDER_OPEN_NEW,
- QUERY, QUERY_NEW,
- TEXT, TEXT_NEW,
- WEB_DOC, WEB_DOC_NEW,
- WEB_LINK, WEB_LINK_NEW,
- INFO, INFO_NEW,
- LINK, LINK_NEW,
- BOOKLET, BOOKLET_NEW,
- EMAIL, EMAIL_NEW,
- EMAIL2, EMAIL2_NEW,
- IMAGE, IMAGE_NEW,
- AUDIO, AUDIO_NEW,
- MUSIC, MUSIC_NEW,
- VIDEO, VIDEO_NEW,
- INDEX, INDEX_NEW,
- IDEA, IDEA_NEW,
- NOTE, NOTE_NEW,
- TOOL, TOOL_NEW
- };
- public:
- static HtmlHelp *getInstance();
- void initialize();
- void finalize();
- int incContentsDepth();
- int decContentsDepth();
- /*! return the current depth of the contents tree */
- int contentsDepth() { return dc; }
- // added imageNumber - KPW
- void addContentsItem(bool isDir,
- const char *name,
- const char *ref = 0,
- const char *anchor = 0);
- void addIndexItem(const char *level1, const char *level2,
- const char *contRef, const char *memRef,
- const char *anchor);
- void addIndexFile(const char *name);
-
-
- private:
- void createProjectFile();
-
- HtmlHelp();
- QFile *cf,*kf;
- QTextStream cts,kts;
- HtmlHelpIndex *index;
- int dc;
- QStrList indexFiles;
- QDict<void> indexFileDict;
- static HtmlHelp *theInstance;
-};
-
-#endif /* HTMLHELP_H */
-
diff --git a/src/image.cpp b/src/image.cpp
deleted file mode 100644
index 27317e8..0000000
--- a/src/image.cpp
+++ /dev/null
@@ -1,331 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 "qtbc.h"
-#include "image.h"
-#include "pngenc.h"
-#include <qglobal.h>
-
-const int charSetWidth=80;
-const int charHeight=12;
-const int numChars=96;
-
-unsigned short charPos[numChars] =
- {
- 0, 5, 8, 13, 20, 27, 38, 47,
- 50, 54, 58, 65, 72, 76, 83, 87,
- 91, 98,105,112,119,126,133,140,
- 147,154,161,164,167,174,181,188,
- 195,207,216,224,233,242,250,258,
- 267,276,279,286,294,301,312,321,
- 331,339,349,357,365,372,380,389,
- 400,409,418,427,430,434,437,443,
- 450,453,460,467,474,481,488,492,
- 499,506,509,512,518,521,530,537,
- 544,551,557,562,568,571,578,585,
- 594,600,607,613,617,620,624,631
- };
-
-unsigned char charWidth[numChars] =
- {
- 5, 3, 5, 7, 7,11, 9, 3,
- 4, 4, 7, 7, 4, 7, 4, 4,
-
- 7, 7, 7, 7, 7, 7, 7, 7,
- 7, 7, 3, 3, 7, 7, 7, 7,
- 12, 9, 8, 9, 9, 8, 8, 9,
- 9, 3, 7, 8, 7,11, 9,10,
- 8,10, 8, 8, 7, 8, 9,11,
- 9, 9, 9, 3, 4, 3, 6, 7,
- 3, 7, 7, 7, 7, 7, 4, 7,
- 7, 3, 3, 6, 3, 9, 7, 7,
- 7, 6, 5, 6, 3, 7, 7, 9,
- 6, 7, 6, 4, 3, 4, 7, 5
- };
-
-unsigned char fontRaw[charSetWidth*charHeight] = {
- 0x02, 0x50, 0x01, 0x06, 0x20, 0x60, 0xc6, 0x04, 0x00, 0x00, 0x00, 0x27,
- 0x04, 0x1c, 0x38, 0x11, 0xf1, 0xc7, 0xc7, 0x0e, 0x00, 0x00, 0x00, 0x03,
- 0x81, 0xf0, 0x10, 0x7c, 0x1e, 0x3e, 0x1f, 0x9f, 0x87, 0x88, 0x24, 0x09,
- 0x09, 0x02, 0x02, 0x41, 0x0f, 0x0f, 0x83, 0xc3, 0xe1, 0xe7, 0xf4, 0x24,
- 0x12, 0x22, 0x41, 0x20, 0x9f, 0xce, 0x30, 0x00, 0x10, 0x04, 0x00, 0x01,
- 0x00, 0x30, 0x08, 0x12, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40,
- 0x00, 0x00, 0x00, 0x00, 0x01, 0xac, 0x00, 0x00, 0x02, 0x51, 0x43, 0x89,
- 0x40, 0x90, 0x49, 0x15, 0x00, 0x00, 0x00, 0x28, 0x9c, 0x22, 0x44, 0x31,
- 0x02, 0x20, 0x48, 0x91, 0x00, 0x00, 0x00, 0x04, 0x46, 0x08, 0x28, 0x42,
- 0x21, 0x21, 0x10, 0x10, 0x08, 0x48, 0x24, 0x09, 0x11, 0x03, 0x06, 0x61,
- 0x10, 0x88, 0x44, 0x22, 0x12, 0x10, 0x84, 0x24, 0x12, 0x22, 0x22, 0x20,
- 0x80, 0x4a, 0x11, 0x00, 0x20, 0x04, 0x00, 0x01, 0x00, 0x40, 0x08, 0x00,
- 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00,
- 0x02, 0x22, 0x00, 0x00, 0x02, 0x51, 0x45, 0x49, 0x40, 0x90, 0x89, 0x0a,
- 0x00, 0x00, 0x00, 0x48, 0x84, 0x02, 0x04, 0x51, 0x02, 0x00, 0x88, 0x91,
- 0x00, 0x00, 0x00, 0x04, 0x44, 0xd4, 0x28, 0x42, 0x40, 0x20, 0x90, 0x10,
- 0x10, 0x08, 0x24, 0x09, 0x21, 0x03, 0x06, 0x51, 0x20, 0x48, 0x48, 0x12,
- 0x12, 0x00, 0x84, 0x22, 0x22, 0x22, 0x22, 0x11, 0x00, 0x89, 0x12, 0x80,
- 0x31, 0xc5, 0x87, 0x0d, 0x1c, 0xe3, 0x4b, 0x12, 0x49, 0x29, 0x16, 0x1c,
- 0x58, 0x69, 0x4c, 0xe8, 0x91, 0x44, 0x61, 0x44, 0xf2, 0x22, 0x00, 0x00,
- 0x02, 0x07, 0xe5, 0x06, 0x80, 0x60, 0x10, 0x95, 0x08, 0x00, 0x00, 0x48,
- 0x84, 0x04, 0x18, 0x51, 0xe2, 0xc0, 0x87, 0x11, 0x24, 0x18, 0x03, 0x00,
- 0x89, 0x24, 0x44, 0x42, 0x40, 0x20, 0x90, 0x10, 0x10, 0x08, 0x24, 0x09,
- 0x41, 0x02, 0x8a, 0x51, 0x20, 0x48, 0x48, 0x12, 0x11, 0x80, 0x84, 0x22,
- 0x21, 0x24, 0x14, 0x11, 0x01, 0x09, 0x14, 0x40, 0x02, 0x26, 0x48, 0x93,
- 0x22, 0x44, 0xcc, 0x92, 0x51, 0x36, 0x99, 0x22, 0x64, 0x99, 0x92, 0x48,
- 0x91, 0x44, 0x52, 0x44, 0x12, 0x22, 0x00, 0x00, 0x02, 0x01, 0x43, 0x80,
- 0x80, 0xa0, 0x10, 0x84, 0x08, 0x00, 0x00, 0x88, 0x84, 0x08, 0x04, 0x90,
- 0x13, 0x21, 0x08, 0x8f, 0x00, 0x61, 0xf0, 0xc0, 0x8a, 0x24, 0x44, 0x7c,
- 0x40, 0x20, 0x9f, 0x9f, 0x11, 0xcf, 0xe4, 0x09, 0xc1, 0x02, 0x8a, 0x49,
- 0x20, 0x4f, 0x88, 0x13, 0xe0, 0x60, 0x84, 0x22, 0x21, 0x54, 0x08, 0x0a,
- 0x02, 0x08, 0x90, 0x00, 0x00, 0x24, 0x48, 0x11, 0x22, 0x44, 0x48, 0x92,
- 0x61, 0x24, 0x91, 0x22, 0x44, 0x89, 0x10, 0x48, 0x91, 0x24, 0x8c, 0x44,
- 0x22, 0x22, 0x64, 0x00, 0x02, 0x07, 0xe1, 0x41, 0x31, 0x14, 0x10, 0x80,
- 0x3e, 0x07, 0xc0, 0x88, 0x84, 0x10, 0x05, 0x10, 0x12, 0x21, 0x08, 0x81,
- 0x01, 0x80, 0x00, 0x31, 0x0a, 0x24, 0x7c, 0x42, 0x40, 0x20, 0x90, 0x10,
- 0x10, 0x48, 0x24, 0x09, 0x21, 0x02, 0x52, 0x45, 0x20, 0x48, 0x08, 0x92,
- 0x20, 0x10, 0x84, 0x21, 0x41, 0x54, 0x14, 0x04, 0x04, 0x08, 0x90, 0x00,
- 0x01, 0xe4, 0x48, 0x11, 0x3e, 0x44, 0x48, 0x92, 0x61, 0x24, 0x91, 0x22,
- 0x44, 0x89, 0x0c, 0x48, 0x8a, 0x24, 0x8c, 0x48, 0x44, 0x21, 0x98, 0x00,
- 0x02, 0x02, 0x85, 0x41, 0x49, 0x08, 0x10, 0x80, 0x08, 0x00, 0x00, 0x88,
- 0x84, 0x20, 0x45, 0xf9, 0x12, 0x21, 0x08, 0x81, 0x00, 0x61, 0xf0, 0xc1,
- 0x0a, 0x68, 0x82, 0x42, 0x40, 0x20, 0x90, 0x10, 0x10, 0x48, 0x24, 0x89,
- 0x11, 0x02, 0x52, 0x45, 0x20, 0x48, 0x08, 0x52, 0x12, 0x10, 0x84, 0x21,
- 0x40, 0x88, 0x22, 0x04, 0x08, 0x08, 0x90, 0x00, 0x02, 0x24, 0x48, 0x11,
- 0x20, 0x44, 0x48, 0x92, 0x51, 0x24, 0x91, 0x22, 0x44, 0x89, 0x02, 0x48,
- 0x8a, 0x2a, 0x92, 0x28, 0x42, 0x22, 0x00, 0x00, 0x00, 0x02, 0x85, 0x41,
- 0x49, 0x18, 0x10, 0x80, 0x08, 0x00, 0x01, 0x08, 0x84, 0x20, 0x44, 0x11,
- 0x12, 0x22, 0x08, 0x91, 0x00, 0x18, 0x03, 0x00, 0x09, 0xb0, 0x82, 0x42,
- 0x21, 0x21, 0x10, 0x10, 0x08, 0xc8, 0x24, 0x89, 0x09, 0x02, 0x22, 0x43,
- 0x10, 0x88, 0x04, 0x22, 0x12, 0x10, 0x84, 0x20, 0x80, 0x88, 0x22, 0x04,
- 0x10, 0x08, 0x50, 0x00, 0x02, 0x26, 0x48, 0x93, 0x22, 0x44, 0xc8, 0x92,
- 0x49, 0x24, 0x91, 0x22, 0x64, 0x99, 0x12, 0x49, 0x84, 0x11, 0x21, 0x28,
- 0x82, 0x22, 0x00, 0x00, 0x02, 0x02, 0x83, 0x82, 0x30, 0xe4, 0x10, 0x80,
- 0x00, 0x20, 0x05, 0x07, 0x04, 0x3e, 0x38, 0x10, 0xe1, 0xc2, 0x07, 0x0e,
- 0x24, 0x00, 0x00, 0x01, 0x04, 0x00, 0x82, 0x7c, 0x1e, 0x3e, 0x1f, 0x90,
- 0x07, 0x48, 0x24, 0x71, 0x05, 0xf2, 0x22, 0x41, 0x0f, 0x08, 0x03, 0xd2,
- 0x11, 0xe0, 0x83, 0xc0, 0x80, 0x88, 0x41, 0x04, 0x1f, 0xc8, 0x50, 0x00,
- 0x01, 0xd5, 0x87, 0x0d, 0x1c, 0x43, 0x48, 0x92, 0x45, 0x24, 0x91, 0x1c,
- 0x58, 0x69, 0x0c, 0x66, 0x84, 0x11, 0x21, 0x10, 0xf2, 0x22, 0x00, 0x00,
- 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x20, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00,
- 0x03, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x40, 0x02, 0x00, 0x00, 0x00, 0x00, 0x40, 0x08, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x10, 0x02, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x09, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x08, 0x10, 0x1f, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x04, 0x40, 0x02,
- 0x00, 0x00, 0x00, 0x00, 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20,
- 0x02, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x30, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x80, 0x04, 0x00, 0x00, 0x00, 0x00,
- 0x40, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x01, 0xac, 0x00, 0x00
-};
-
-static Color palette[] =
-{
- { 0xff, 0xff, 0xff },
- { 0x00, 0x00, 0x00 },
- { 0xff, 0xff, 0xc0 },
- { 0x9f, 0x9f, 0x60 },
- { 0x90, 0x00, 0x00 },
- { 0x00, 0x90, 0x00 },
- { 0x00, 0x00, 0x90 },
- { 0xc0, 0xc0, 0xc0 }
-};
-
-static Color palette2[] =
-{
- { 0xff, 0xff, 0xff },
- { 0xe0, 0xe0, 0xe0 },
- { 0xd0, 0xd0, 0xd0 },
- { 0xc0, 0xc0, 0xc0 },
- { 0xb0, 0xb0, 0xb0 },
- { 0xa0, 0xa0, 0xa0 },
- { 0x90, 0x90, 0x90 },
- { 0x80, 0x80, 0x80 },
- { 0x70, 0x70, 0x70 },
- { 0x60, 0x60, 0x60 },
- { 0x50, 0x50, 0x50 },
- { 0x40, 0x40, 0x40 },
- { 0x30, 0x30, 0x30 },
- { 0x20, 0x20, 0x20 },
- { 0x10, 0x10, 0x10 },
- { 0x00, 0x00, 0x00 }
-};
-
-Image::Image(int w,int h)
-{
- data = new uchar[w*h];
- memset(data,0,w*h);
- width = w;
- height = h;
-}
-
-Image::~Image()
-{
- delete[] data;
-}
-
-void Image::setPixel(int x,int y,uchar val)
-{
- if (x>=0 && x<width && y>=0 && y<height)
- data[y*width+x] = val;
-}
-
-uchar Image::getPixel(int x,int y) const
-{
- if (x>=0 && x<width && y>=0 && y<height)
- return data[y*width+x];
- else
- return 0;
-}
-
-void Image::writeChar(int x,int y,char c,uchar fg)
-{
- if (c>=' ')
- {
- int xf,yf,ci=c-' ';
- int rowOffset=0;
- int cw = charWidth[ci];
- int 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;
- // get the bit pattern for row yf of the character from the font data
- while (bitsLeft>0)
- {
- int bits=8-bitOffset;
- if (bits>bitsLeft) bits=bitsLeft;
- bitPattern<<=bits;
- bitPattern|=((fontRaw[byteOffset]<<bitOffset)&0xff)>>(8-bits);
- bitsLeft-=bits;
- bitOffset=0;
- byteOffset++;
- }
- int mask=1<<(cw-1);
- // draw character row yf
- for (xf=0;xf<cw;xf++)
- {
- setPixel(x+xf,y+yf,(bitPattern&mask) ? fg : getPixel(x+xf,y+yf));
- mask>>=1;
- }
- rowOffset+=charSetWidth;
- }
- }
-}
-
-void Image::writeString(int x,int y,const char *s,uchar fg)
-{
- if (s)
- {
- char c;
- while ((c=*s++))
- {
- writeChar(x,y,c,fg);
- x+=charWidth[c-' '];
- }
- }
-}
-
-uint Image::stringLength(const char *s)
-{
- int w=0;
- if (s)
- {
- char c;
- while ((c=*s++)) w+=charWidth[c-' '];
- }
- return w;
-}
-
-void Image::drawHorzLine(int y,int xs,int xe,uchar colIndex,uint mask)
-{
- int x,i=0,j=0;
- for (x=xs;x<=xe;x++,j++)
- {
- if (j&1) i++;
- if (mask&(1<<(i&0x1f))) setPixel(x,y,colIndex);
- }
-}
-
-void Image::drawHorzArrow(int y,int xs,int xe,uchar colIndex,uint mask)
-{
- drawHorzLine(y,xs,xe,colIndex,mask);
- int i;
- for (i=0;i<6;i++)
- {
- int 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)
-{
- int 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)
-{
- drawVertLine(x,ys,ye,colIndex,mask);
- int i;
- for (i=0;i<6;i++)
- {
- int 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)
-{
- drawHorzLine(y,x,x+w-1,colIndex,mask);
- drawHorzLine(y+h-1,x,x+w-1,colIndex,mask);
- drawVertLine(x,y,y+h-1,colIndex,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)
-{
- 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++)
- if (mask&(1<<((xi+yi)&0x1f)))
- setPixel(xp,yp,colIndex);
-}
-
-bool Image::save(const char *fileName,int mode)
-{
- PngEncoder enc(data,
- mode==0 ? palette : palette2,
- width,height,
- mode==0 ? 3 : 4,
- 0);
- enc.write(fileName);
- return TRUE;
-}
diff --git a/src/image.h b/src/image.h
deleted file mode 100644
index 5daf006..0000000
--- a/src/image.h
+++ /dev/null
@@ -1,52 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 _IMAGE_H
-#define _IMAGE_H
-#include <qglobal.h>
-
-class Image
-{
- public:
- Image(int w,int 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);
- 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; }
- static uint stringLength(const char *s);
-
- private:
- int width;
- int height;
- uchar *data;
-};
-
-#endif
diff --git a/src/increasebuffer.pl b/src/increasebuffer.pl
deleted file mode 100755
index 056a6b5..0000000
--- a/src/increasebuffer.pl
+++ /dev/null
@@ -1,8 +0,0 @@
-# Since the internal token buffer of a generated flex file is hardcoded
-# to 16K, this script is used to increase the buffer size of a flex
-# generated scanner to 256K.
-while (<>)
-{
- s/YY_BUF_SIZE 16384/YY_BUF_SIZE 262144/g;
- print $_;
-}
diff --git a/src/index.cpp b/src/index.cpp
deleted file mode 100644
index bad0cc2..0000000
--- a/src/index.cpp
+++ /dev/null
@@ -1,3346 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-
-#include <stdlib.h>
-
-#include <qtextstream.h>
-#include <qdatetime.h>
-#include <qdir.h>
-#include <qregexp.h>
-
-#include "message.h"
-#include "index.h"
-#include "doxygen.h"
-#include "config.h"
-#include "filedef.h"
-#include "outputlist.h"
-#include "util.h"
-#include "groupdef.h"
-#include "language.h"
-#include "htmlhelp.h"
-#include "ftvhelp.h"
-#include "dot.h"
-#include "pagedef.h"
-#include "dirdef.h"
-
-#define MAX_ITEMS_BEFORE_MULTIPAGE_INDEX 200
-#define MAX_ITEMS_BEFORE_QUICK_INDEX 30
-
-int annotatedClasses;
-int hierarchyClasses;
-int documentedFiles;
-int documentedGroups;
-int documentedNamespaces;
-int indexedPages;
-int documentedClassMembers[CMHL_Total];
-int documentedFileMembers[FMHL_Total];
-int documentedNamespaceMembers[NMHL_Total];
-int documentedHtmlFiles;
-int documentedPages;
-int documentedDirs;
-
-int countClassHierarchy();
-int countClassMembers(int filter=CMHL_All);
-int countFileMembers(int filter=FMHL_All);
-void countFiles(int &htmlFiles,int &files);
-int countGroups();
-int countDirs();
-int countNamespaces();
-int countAnnotatedClasses();
-int countNamespaceMembers(int filter=NMHL_All);
-int countIncludeFiles();
-void countRelatedPages(int &docPages,int &indexPages);
-
-void countDataStructures()
-{
- annotatedClasses = countAnnotatedClasses();
- hierarchyClasses = countClassHierarchy();
- countFiles(documentedHtmlFiles,documentedFiles);
- countRelatedPages(documentedPages,indexedPages);
- documentedGroups = countGroups();
- documentedNamespaces = countNamespaces();
- documentedDirs = countDirs();
- int i;
- for (i=0;i<(int)CMHL_Total;i++)
- {
- documentedClassMembers[i] = countClassMembers(i);
- }
- for (i=0;i<(int)FMHL_Total;i++)
- {
- documentedFileMembers[i] = countFileMembers(i);
- }
- for (i=0;i<(int)NMHL_Total;i++)
- {
- documentedNamespaceMembers[i] = countNamespaceMembers(i);
- }
-}
-
-static void startIndexHierarchy(OutputList &ol,int level)
-{
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
- ol.disable(OutputGenerator::Html);
- if (level<6) ol.startIndexList();
- ol.enableAll();
- ol.disable(OutputGenerator::Latex);
- ol.disable(OutputGenerator::RTF);
- ol.startItemList();
- ol.popGeneratorState();
-}
-
-static void endIndexHierarchy(OutputList &ol,int level)
-{
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
- ol.disable(OutputGenerator::Html);
- if (level<6) ol.endIndexList();
- ol.enableAll();
- ol.disable(OutputGenerator::Latex);
- ol.disable(OutputGenerator::RTF);
- ol.endItemList();
- ol.popGeneratorState();
-}
-
-//----------------------------------------------------------------------------
-
-static bool g_memberIndexLetterUsed[CMHL_Total][256];
-static bool g_fileIndexLetterUsed[FMHL_Total][256];
-static bool g_namespaceIndexLetterUsed[NMHL_Total][256];
-static bool g_classIndexLetterUsed[CHL_Total][256];
-
-const int maxItemsBeforeQuickIndex = MAX_ITEMS_BEFORE_QUICK_INDEX;
-
-//----------------------------------------------------------------------------
-
-// strips w from s iff s starts with w
-bool stripWord(QCString &s,QCString w)
-{
- bool success=FALSE;
- if (s.left(w.length())==w)
- {
- success=TRUE;
- s=s.right(s.length()-w.length());
- }
- return success;
-}
-
-//----------------------------------------------------------------------------
-// some quasi intelligent brief description abbreviator :^)
-QCString abbreviate(const char *s,const char *name)
-{
- QCString scopelessName=name;
- int i=scopelessName.findRev("::");
- if (i!=-1) scopelessName=scopelessName.mid(i);
- QCString result=s;
- result=result.stripWhiteSpace();
- // strip trailing .
- 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)
- {
- QCString s = p;
- s.replace(QRegExp("\\$name"), scopelessName); // replace $name with entity name
- s += " ";
- stripWord(result,s);
- p = briefDescAbbrev.next();
- }
-
- // capitalize first word
- if (!result.isEmpty())
- {
- int c=result[0];
- if (c>='a' && c<='z') c+='A'-'a';
- result[0]=c;
- }
- return result;
-}
-
-//----------------------------------------------------------------------------
-
-static void startQuickIndexItem(OutputList &ol,const char *l,
- bool hl,bool compact,bool &first)
-{
- if (!first && compact) ol.writeString(" | ");
- first=FALSE;
- if (!compact) ol.writeString("<li>");
- if (hl && compact)
- {
- ol.writeString("<a class=\"qindexHL\" ");
- }
- else
- {
- ol.writeString("<a class=\"qindex\" ");
- }
- ol.writeString("href=\"");
- ol.writeString(l);
- ol.writeString("\">");
-}
-
-static void endQuickIndexItem(OutputList &ol)
-{
- ol.writeString("</a>");
-}
-
-
-static QCString fixSpaces(const QCString &s)
-{
- return substitute(s," ","&nbsp;");
-}
-
-
-void startTitle(OutputList &ol,const char *fileName)
-{
- ol.startTitleHead(fileName);
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
-}
-
-void endTitle(OutputList &ol,const char *fileName,const char *name)
-{
- ol.popGeneratorState();
- ol.endTitleHead(fileName,name);
-}
-
-void startFile(OutputList &ol,const char *name,const char *manName,
- const char *title,HighlightedItem hli)
-{
- ol.startFile(name,manName,title);
- if (!Config_getBool("DISABLE_INDEX")) ol.writeQuickLinks(TRUE,hli);
-}
-
-void endFile(OutputList &ol,bool)
-{
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
- ol.writeFooter(); // write the footer
- ol.popGeneratorState();
- ol.endFile();
-}
-
-//----------------------------------------------------------------------------
-
-static bool classHasVisibleChildren(ClassDef *cd)
-{
- if (cd->subClasses()->count()==0) return FALSE;
- BaseClassList *bcl=cd->subClasses();
- BaseClassListIterator bcli(*bcl);
- for ( ; bcli.current() ; ++bcli)
- {
- if (bcli.current()->classDef->isVisibleInHierarchy())
- {
- return TRUE;
- }
- }
- return FALSE;
-}
-
-void writeClassTree(OutputList &ol,BaseClassList *bcl,bool hideSuper,int level)
-{
- HtmlHelp *htmlHelp=0;
- FTVHelp *ftvHelp=0;
- bool &generateHtml = Config_getBool("GENERATE_HTML") ;
- bool hasHtmlHelp = generateHtml && Config_getBool("GENERATE_HTMLHELP");
- bool hasFtvHelp = generateHtml && Config_getBool("GENERATE_TREEVIEW");
- if (hasHtmlHelp)
- {
- htmlHelp = HtmlHelp::getInstance();
- }
- if (hasFtvHelp)
- {
- ftvHelp = FTVHelp::getInstance();
- }
- BaseClassListIterator bcli(*bcl);
- bool started=FALSE;
- for ( ; bcli.current() ; ++bcli)
- {
- ClassDef *cd=bcli.current()->classDef;
- if (cd->isVisibleInHierarchy() && hasVisibleRoot(cd->baseClasses()))
- {
- if (!started)
- {
- startIndexHierarchy(ol,level);
- if (hasHtmlHelp) htmlHelp->incContentsDepth();
- if (hasFtvHelp) ftvHelp->incContentsDepth();
- started=TRUE;
- }
- //printf("Passed...\n");
- bool hasChildren = !cd->visited && !hideSuper && classHasVisibleChildren(cd);
- //printf("tree4: Has children %s: %d\n",cd->name().data(),hasChildren);
- if (cd->isLinkable() && !cd->isHidden())
- {
- //printf("Writing class %s\n",cd->displayName().data());
- ol.writeIndexItem(cd->getReference(),cd->getOutputFileBase(),cd->displayName());
- if (cd->isReference())
- {
- ol.startTypewriter();
- ol.docify(" [external]");
- ol.endTypewriter();
- }
- if (hasHtmlHelp)
- {
- htmlHelp->addContentsItem(hasChildren,cd->displayName(),cd->getOutputFileBase());
- }
- if (hasFtvHelp)
- {
- ftvHelp->addContentsItem(hasChildren,cd->getReference(),cd->getOutputFileBase(),0,cd->displayName());
- }
- }
- else
- {
- ol.writeIndexItem(0,0,cd->name());
- if (hasHtmlHelp)
- {
- htmlHelp->addContentsItem(hasChildren,cd->displayName(),0);
- }
- if (hasFtvHelp)
- {
- ftvHelp->addContentsItem(hasChildren,0,0,0,cd->displayName());
- }
- }
- if (hasChildren)
- {
- //printf("Class %s at %p visited=%d\n",cd->name().data(),cd,cd->visited);
- bool wasVisited=cd->visited;
- cd->visited=TRUE;
- writeClassTree(ol,cd->subClasses(),wasVisited,level+1);
- }
- }
- }
- if (started)
- {
- endIndexHierarchy(ol,level);
- if (hasHtmlHelp) htmlHelp->decContentsDepth();
- if (hasFtvHelp) ftvHelp->decContentsDepth();
- }
-}
-
-
-//----------------------------------------------------------------------------
-/*! Generates HTML Help tree of classes */
-
-void writeClassTree(BaseClassList *cl,int level)
-{
- HtmlHelp *htmlHelp=0;
- FTVHelp *ftvHelp=0;
- bool &generateHtml = Config_getBool("GENERATE_HTML") ;
- bool hasHtmlHelp = generateHtml && Config_getBool("GENERATE_HTMLHELP");
- bool hasFtvHelp = generateHtml && Config_getBool("GENERATE_TREEVIEW");
- if (hasHtmlHelp)
- {
- htmlHelp = HtmlHelp::getInstance();
- }
- if (hasFtvHelp)
- {
- ftvHelp = FTVHelp::getInstance();
- }
- BaseClassListIterator cli(*cl);
- bool started=FALSE;
- for ( ; cli.current() ; ++cli)
- {
- ClassDef *cd=cli.current()->classDef;
- if (cd->isVisibleInHierarchy() && hasVisibleRoot(cd->baseClasses()))
- //if (cd->isVisibleInHierarchy() && !cd->visited)
- {
- if (!started)
- {
- if (hasHtmlHelp) htmlHelp->incContentsDepth();
- if (hasFtvHelp) ftvHelp->incContentsDepth();
- started=TRUE;
- }
- bool hasChildren = !cd->visited && classHasVisibleChildren(cd);
- //printf("tree2: Has children %s: %d\n",cd->name().data(),hasChildren);
- if (cd->isLinkable() && !cd->isHidden())
- {
- if (hasHtmlHelp)
- {
- htmlHelp->addContentsItem(hasChildren,cd->displayName(),cd->getOutputFileBase());
- }
- if (hasFtvHelp)
- {
- ftvHelp->addContentsItem(hasChildren,cd->getReference(),cd->getOutputFileBase(),0,cd->displayName());
- }
- }
- if (hasChildren)
- {
- writeClassTree(cd->subClasses(),level+1);
- }
- cd->visited=TRUE;
- }
- }
- if (started)
- {
- if (hasHtmlHelp) htmlHelp->decContentsDepth();
- if (hasFtvHelp) ftvHelp->decContentsDepth();
- }
-}
-
-//----------------------------------------------------------------------------
-/*! Generates HTML Help tree of classes */
-
-void writeClassTreeNode(ClassDef *cd,bool hasHtmlHelp,bool hasFtvHelp,bool &started,int level)
-{
- //printf("writeClassTreeNode(%s) visited=%d\n",cd->name().data(),cd->visited);
- if (cd->isVisibleInHierarchy() && !cd->visited)
- {
- if (!started)
- {
- started=TRUE;
- }
- bool hasChildren = classHasVisibleChildren(cd);
- //printf("node: Has children %s: %d\n",cd->name().data(),hasChildren);
- if (cd->isLinkable() && !cd->isHidden())
- {
- if (hasHtmlHelp)
- {
- HtmlHelp::getInstance()->addContentsItem(hasChildren,cd->displayName(),cd->getOutputFileBase());
- }
- if (hasFtvHelp)
- {
- FTVHelp::getInstance()->addContentsItem(hasChildren,cd->getReference(),cd->getOutputFileBase(),0,cd->displayName());
- }
- }
- if (hasChildren)
- {
- writeClassTree(cd->subClasses(),level+1);
- }
- cd->visited=TRUE;
- }
-}
-
-void writeClassTree(ClassList *cl,int level)
-{
- bool &generateHtml = Config_getBool("GENERATE_HTML") ;
- bool hasHtmlHelp = generateHtml && Config_getBool("GENERATE_HTMLHELP");
- bool hasFtvHelp = generateHtml && Config_getBool("GENERATE_TREEVIEW");
- ClassListIterator cli(*cl);
- bool started=FALSE;
- for ( cli.toFirst() ; cli.current() ; ++cli)
- {
- cli.current()->visited=FALSE;
- }
- for ( cli.toFirst() ; cli.current() ; ++cli)
- {
- writeClassTreeNode(cli.current(),hasHtmlHelp,hasFtvHelp,started,level);
- }
-}
-
-void writeClassTree(ClassSDict *d,int level)
-{
- bool &generateHtml = Config_getBool("GENERATE_HTML") ;
- bool hasHtmlHelp = generateHtml && Config_getBool("GENERATE_HTMLHELP");
- bool hasFtvHelp = generateHtml && Config_getBool("GENERATE_TREEVIEW");
- ClassSDict::Iterator cli(*d);
- bool started=FALSE;
- for ( cli.toFirst() ; cli.current() ; ++cli)
- {
- cli.current()->visited=FALSE;
- }
- for ( cli.toFirst() ; cli.current() ; ++cli)
- {
- writeClassTreeNode(cli.current(),hasHtmlHelp,hasFtvHelp,started,level);
- }
-}
-
-//----------------------------------------------------------------------------
-
-static void writeClassTreeForList(OutputList &ol,ClassSDict *cl,bool &started)
-{
- HtmlHelp *htmlHelp=0;
- FTVHelp *ftvHelp=0;
- bool &generateHtml = Config_getBool("GENERATE_HTML") ;
- bool hasHtmlHelp = generateHtml && Config_getBool("GENERATE_HTMLHELP");
- bool hasFtvHelp = generateHtml && Config_getBool("GENERATE_TREEVIEW");
- if (hasHtmlHelp)
- {
- htmlHelp = HtmlHelp::getInstance();
- }
- if (hasFtvHelp)
- {
- ftvHelp = FTVHelp::getInstance();
- }
-
- ClassSDict::Iterator cli(*cl);
- for (;cli.current(); ++cli)
- {
- ClassDef *cd=cli.current();
- //printf("class %s hasVisibleRoot=%d isVisibleInHierarchy=%d\n",
- // cd->name().data(),
- // hasVisibleRoot(cd->baseClasses()),
- // cd->isVisibleInHierarchy()
- // );
- if (!hasVisibleRoot(cd->baseClasses())) // filter on root classes
- {
- if (cd->isVisibleInHierarchy()) // should it be visible
- {
- if (!started)
- {
- startIndexHierarchy(ol,0);
- if (hasHtmlHelp) htmlHelp->incContentsDepth();
- if (hasFtvHelp) ftvHelp->incContentsDepth();
- started=TRUE;
- }
- bool hasChildren = !cd->visited && classHasVisibleChildren(cd);
- //printf("list: Has children %s: %d\n",cd->name().data(),hasChildren);
- if (cd->isLinkable() && !cd->isHidden())
- {
- //printf("Writing class %s isLinkable()=%d isLinkableInProject()=%d cd->templateMaster()=%p\n",
- // cd->displayName().data(),cd->isLinkable(),cd->isLinkableInProject(),cd->templateMaster());
- ol.writeIndexItem(cd->getReference(),cd->getOutputFileBase(),cd->displayName());
- if (cd->isReference())
- {
- ol.startTypewriter();
- ol.docify(" [external]");
- ol.endTypewriter();
- }
- if (hasHtmlHelp)
- {
- htmlHelp->addContentsItem(hasChildren,cd->displayName(),cd->getOutputFileBase());
- }
- if (hasFtvHelp)
- {
- ftvHelp->addContentsItem(hasChildren,cd->getReference(),cd->getOutputFileBase(),0,cd->displayName());
- }
- }
- else
- {
- ol.writeIndexItem(0,0,cd->displayName());
- if (hasHtmlHelp)
- {
- htmlHelp->addContentsItem(hasChildren,cd->displayName(),0);
- }
- if (hasFtvHelp)
- {
- ftvHelp->addContentsItem(hasChildren,0,0,0,cd->displayName());
- }
- }
- if (hasChildren)
- {
- writeClassTree(ol,cd->subClasses(),cd->visited,1);
- cd->visited=TRUE;
- }
- }
- }
- }
-}
-
-void writeClassHierarchy(OutputList &ol)
-{
- HtmlHelp *htmlHelp=0;
- FTVHelp *ftvHelp=0;
- bool &generateHtml = Config_getBool("GENERATE_HTML") ;
- bool hasHtmlHelp = generateHtml && Config_getBool("GENERATE_HTMLHELP");
- bool hasFtvHelp = generateHtml && Config_getBool("GENERATE_TREEVIEW");
- if (hasHtmlHelp)
- {
- htmlHelp = HtmlHelp::getInstance();
- }
- if (hasFtvHelp)
- {
- ftvHelp = FTVHelp::getInstance();
- }
-
- initClassHierarchy(&Doxygen::classSDict);
- initClassHierarchy(&Doxygen::hiddenClasses);
-
- bool started=FALSE;
- writeClassTreeForList(ol,&Doxygen::classSDict,started);
- writeClassTreeForList(ol,&Doxygen::hiddenClasses,started);
- if (started)
- {
- endIndexHierarchy(ol,0);
- if (hasHtmlHelp) htmlHelp->decContentsDepth();
- if (hasFtvHelp) ftvHelp->decContentsDepth();
- }
-}
-
-//----------------------------------------------------------------------------
-
-// TODO: let this function return the real number of items in the hierarchy.
-int countClassHierarchy()
-{
- initClassHierarchy(&Doxygen::classSDict);
- int count=0;
- ClassSDict::Iterator cli(Doxygen::classSDict);
- for ( ; cli.current(); ++cli)
- {
- if (cli.current()->subClasses()->count()>0) count++;
- }
- return count;
-}
-
-//----------------------------------------------------------------------------
-
-void writeHierarchicalIndex(OutputList &ol)
-{
- //printf("writeHierarchicalIndex: %d classes\n",hierarchyClasses);
- if (hierarchyClasses==0) return;
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
- startFile(ol,"hierarchy",0, theTranslator->trHierarchicalIndex().data(), HLI_Hierarchy);
- startTitle(ol,0);
- QCString title = theTranslator->trClassHierarchy();
- QCString htmlHelpTitle = title;
- QCString ftvHelpTitle = title;
- if (!Config_getString("PROJECT_NAME").isEmpty())
- {
- title.prepend(Config_getString("PROJECT_NAME")+" ");
- }
- ol.parseText(title);
- endTitle(ol,0,0);
- ol.startTextBlock();
- HtmlHelp *htmlHelp = 0;
- FTVHelp *ftvHelp = 0;
- bool &generateHtml = Config_getBool("GENERATE_HTML") ;
- bool hasHtmlHelp = generateHtml && Config_getBool("GENERATE_HTMLHELP");
- bool hasFtvHelp = generateHtml && Config_getBool("GENERATE_TREEVIEW");
- if (hasHtmlHelp)
- {
- htmlHelp = HtmlHelp::getInstance();
- htmlHelp->addContentsItem(TRUE,htmlHelpTitle,"hierarchy");
- }
- if (hasFtvHelp)
- {
- ftvHelp = FTVHelp::getInstance();
- ftvHelp->addContentsItem(TRUE,0,"hierarchy",0,ftvHelpTitle);
- }
- if (Config_getBool("HAVE_DOT") && Config_getBool("GRAPHICAL_HIERARCHY"))
- {
- ol.disable(OutputGenerator::Latex);
- ol.disable(OutputGenerator::RTF);
- ol.startTextLink("inherits",0);
- ol.parseText(theTranslator->trGotoGraphicalHierarchy());
- ol.endTextLink();
- ol.newParagraph();
- ol.enable(OutputGenerator::Latex);
- ol.enable(OutputGenerator::RTF);
- }
- ol.parseText(theTranslator->trClassHierarchyDescription());
- ol.endTextBlock();
- writeClassHierarchy(ol);
- endFile(ol);
- ol.popGeneratorState();
-}
-
-//----------------------------------------------------------------------------
-
-void writeGraphicalClassHierarchy(OutputList &ol)
-{
- if (hierarchyClasses==0) return;
- ol.disableAllBut(OutputGenerator::Html);
- QCString title = theTranslator->trGraphicalHierarchy();
- startFile(ol,"inherits",0,title.data());
- startTitle(ol,0);
- QCString htmlHelpTitle = title;
- QCString ftvHelpTitle = title;
- if (!Config_getString("PROJECT_NAME").isEmpty()) title.prepend(Config_getString("PROJECT_NAME")+" ");
- ol.parseText(title);
- endTitle(ol,0,0);
- ol.startTextBlock();
- HtmlHelp *htmlHelp = 0;
- FTVHelp *ftvHelp = 0;
- bool &generateHtml = Config_getBool("GENERATE_HTML") ;
- bool hasHtmlHelp = generateHtml && Config_getBool("GENERATE_HTMLHELP");
- bool hasFtvHelp = generateHtml && Config_getBool("GENERATE_TREEVIEW");
- if (hasHtmlHelp)
- {
- htmlHelp = HtmlHelp::getInstance();
- htmlHelp->addContentsItem(FALSE,htmlHelpTitle,"inherits");
- }
- if (hasFtvHelp)
- {
- ftvHelp = FTVHelp::getInstance();
- ftvHelp->addContentsItem(FALSE,0,"inherits",0,ftvHelpTitle);
- }
- ol.startTextLink("hierarchy",0);
- ol.parseText(theTranslator->trGotoTextualHierarchy());
- ol.endTextLink();
- ol.newParagraph();
- //parseText(ol,theTranslator->trClassHierarchyDescription());
- //ol.newParagraph();
- ol.endTextBlock();
- DotGfxHierarchyTable g;
- ol.writeGraphicalHierarchy(g);
- endFile(ol);
- ol.enableAll();
-}
-
-//----------------------------------------------------------------------------
-
-void countFiles(int &htmlFiles,int &files)
-{
- htmlFiles=0;
- files=0;
- FileNameListIterator fnli(Doxygen::inputNameList);
- FileName *fn;
- for (;(fn=fnli.current());++fnli)
- {
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
- {
- bool doc = fd->isLinkableInProject();
- bool src = fd->generateSourceFile();
- bool nameOk = !fd->isDocumentationFile();
- if (nameOk)
- {
- if (doc || src)
- {
- htmlFiles++;
- }
- if (doc)
- {
- files++;
- }
- }
- }
- }
-}
-
-//----------------------------------------------------------------------------
-
-void writeFileIndex(OutputList &ol)
-{
- if (documentedHtmlFiles==0) return;
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
- if (documentedFiles==0) ol.disableAllBut(OutputGenerator::Html);
- startFile(ol,"files",0,theTranslator->trFileIndex().data(),HLI_Files);
- startTitle(ol,0);
- QCString title = theTranslator->trFileList();
- QCString htmlHelpTitle = title;
- QCString ftvHelpTitle = title;
- if (!Config_getString("PROJECT_NAME").isEmpty()) title.prepend(Config_getString("PROJECT_NAME")+" ");
- ol.parseText(title);
- endTitle(ol,0,0);
- ol.startTextBlock();
- HtmlHelp *htmlHelp = 0;
- FTVHelp *ftvHelp = 0;
- bool &generateHtml = Config_getBool("GENERATE_HTML") ;
- bool hasHtmlHelp = generateHtml && Config_getBool("GENERATE_HTMLHELP");
- bool hasFtvHelp = generateHtml && Config_getBool("GENERATE_TREEVIEW");
- if (hasHtmlHelp)
- {
- htmlHelp = HtmlHelp::getInstance();
- htmlHelp->addContentsItem(TRUE,htmlHelpTitle,"files");
- htmlHelp->incContentsDepth();
- }
- if (hasFtvHelp)
- {
- ftvHelp = FTVHelp::getInstance();
- ftvHelp->addContentsItem(TRUE,0,"files",0,ftvHelpTitle);
- ftvHelp->incContentsDepth();
- }
- ol.parseText(theTranslator->trFileListDescription(Config_getBool("EXTRACT_ALL")));
- ol.endTextBlock();
-
- OutputNameDict outputNameDict(1009);
- OutputNameList outputNameList;
- outputNameList.setAutoDelete(TRUE);
-
- if (Config_getBool("FULL_PATH_NAMES"))
- {
- // re-sort input files in (dir,file) output order instead of (file,dir) input order
- FileName *fn=Doxygen::inputNameList.first();
- while (fn)
- {
- FileDef *fd=fn->first();
- while (fd)
- {
- QCString path=fd->getPath();
- if (path.isEmpty()) path="[external]";
- FileList *fl = outputNameDict.find(path);
- if (fl)
- {
- fl->inSort(fd);
- //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->inSort(fd);
- outputNameList.inSort(fl);
- outputNameDict.insert(path,fl);
- }
- fd=fn->next();
- }
- fn=Doxygen::inputNameList.next();
- }
- }
-
- ol.startIndexList();
- FileList *fl=0;
- if (Config_getBool("FULL_PATH_NAMES"))
- {
- fl = outputNameList.first();
- }
- else
- {
- fl = Doxygen::inputNameList.first();
- }
- while (fl)
- {
- FileDef *fd=fl->first();
- while (fd)
- {
- //printf("Found filedef %s\n",fd->name().data());
- bool doc = fd->isLinkableInProject();
- bool src = fd->generateSourceFile();
- bool nameOk = !fd->isDocumentationFile();
- if (nameOk && (doc || src) &&
- !fd->isReference())
- {
- QCString path;
- if (Config_getBool("FULL_PATH_NAMES"))
- {
- path=stripFromPath(fd->getPath().copy());
- }
- QCString fullName=fd->name();
- if (!path.isEmpty())
- {
- if (path.at(path.length()-1)!='/') fullName.prepend("/");
- fullName.prepend(path);
- }
-
- ol.startIndexKey();
- ol.docify(path);
- if (doc)
- {
- ol.writeObjectLink(0,fd->getOutputFileBase(),0,fd->name());
- if (hasHtmlHelp)
- {
- htmlHelp->addContentsItem(FALSE,fullName,fd->getOutputFileBase());
- }
- if (hasFtvHelp)
- {
- ftvHelp->addContentsItem(FALSE,fd->getReference(),fd->getOutputFileBase(),0,fullName);
- }
- }
- else
- {
- ol.startBold();
- ol.docify(fd->name());
- ol.endBold();
- if (hasHtmlHelp)
- {
- htmlHelp->addContentsItem(FALSE,fullName,0);
- }
- if (hasFtvHelp)
- {
- ftvHelp->addContentsItem(FALSE,0,0,0,fullName);
- }
- }
- if (src)
- {
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
- ol.docify(" ");
- ol.startTextLink(fd->includeName(),0);
- ol.docify("[");
- ol.parseText(theTranslator->trCode());
- ol.docify("]");
- ol.endTextLink();
- ol.popGeneratorState();
- }
- ol.endIndexKey();
- bool hasBrief = !fd->briefDescription().isEmpty();
- ol.startIndexValue(hasBrief);
- if (hasBrief)
- {
- //ol.docify(" (");
- ol.parseDoc(
- fd->briefFile(),fd->briefLine(),
- fd,0,
- abbreviate(fd->briefDescription(),fd->name()),
- FALSE, // index words
- FALSE, // isExample
- 0, // example name
- TRUE, // single line
- TRUE // link from index
- );
- //ol.docify(")");
- }
- ol.endIndexValue(fd->getOutputFileBase(),hasBrief);
- //ol.popGeneratorState();
- // --------------------------------------------------------
- }
- fd=fl->next();
- }
- if (Config_getBool("FULL_PATH_NAMES"))
- {
- fl=outputNameList.next();
- }
- else
- {
- fl=Doxygen::inputNameList.next();
- }
- }
- ol.endIndexList();
- if (hasHtmlHelp)
- {
- htmlHelp->decContentsDepth();
- }
- if (hasFtvHelp)
- {
- ftvHelp->decContentsDepth();
- }
- endFile(ol);
- ol.popGeneratorState();
-}
-
-//----------------------------------------------------------------------------
-int countNamespaces()
-{
- int count=0;
- NamespaceSDict::Iterator nli(Doxygen::namespaceSDict);
- NamespaceDef *nd;
- for (;(nd=nli.current());++nli)
- {
- if (nd->isLinkableInProject() && !nd->isHidden()) count++;
- }
- return count;
-}
-
-//----------------------------------------------------------------------------
-
-void writeNamespaceIndex(OutputList &ol)
-{
- if (documentedNamespaces==0) return;
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
- QCString title;
- if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
- {
- startFile(ol,"namespaces",0,theTranslator->trPackageList().data(),HLI_Namespaces);
- title = theTranslator->trPackageList();
- }
- else
- {
- startFile(ol,"namespaces",0,theTranslator->trNamespaceIndex().data(),HLI_Namespaces);
- title = theTranslator->trNamespaceList();
- }
- startTitle(ol,0);
- QCString htmlHelpTitle = title;
- QCString ftvHelpTitle = title;
- if (!Config_getString("PROJECT_NAME").isEmpty()) title.prepend(Config_getString("PROJECT_NAME")+" ");
- ol.parseText(title);
- endTitle(ol,0,0);
- ol.startTextBlock();
- HtmlHelp *htmlHelp = 0;
- FTVHelp *ftvHelp = 0;
- bool &generateHtml = Config_getBool("GENERATE_HTML") ;
- bool hasHtmlHelp = generateHtml && Config_getBool("GENERATE_HTMLHELP");
- bool hasFtvHelp = generateHtml && Config_getBool("GENERATE_TREEVIEW");
- if (hasHtmlHelp)
- {
- htmlHelp = HtmlHelp::getInstance();
- htmlHelp->addContentsItem(TRUE,htmlHelpTitle,"namespaces");
- htmlHelp->incContentsDepth();
- }
- if (hasFtvHelp)
- {
- ftvHelp = FTVHelp::getInstance();
- ftvHelp->addContentsItem(TRUE,0,"namespaces",0,ftvHelpTitle);
- ftvHelp->incContentsDepth();
- }
- //ol.newParagraph();
- if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
- {
- ol.parseText(theTranslator->trPackageListDescription());
- }
- else
- {
- ol.parseText(theTranslator->trNamespaceListDescription(Config_getBool("EXTRACT_ALL")));
- }
- //ol.newParagraph();
- ol.endTextBlock();
-
- bool first=TRUE;
-
- NamespaceSDict::Iterator nli(Doxygen::namespaceSDict);
- NamespaceDef *nd;
- for (nli.toFirst();(nd=nli.current());++nli)
- {
- if (nd->isLinkableInProject() && !nd->isHidden())
- {
- if (first)
- {
- ol.startIndexList();
- first=FALSE;
- }
- //ol.writeStartAnnoItem("namespace",nd->getOutputFileBase(),0,nd->name());
- ol.startIndexKey();
- ol.writeObjectLink(0,nd->getOutputFileBase(),0,nd->displayName());
- ol.endIndexKey();
- bool hasBrief = !nd->briefDescription().isEmpty();
- ol.startIndexValue(hasBrief);
- if (hasBrief)
- {
- //ol.docify(" (");
- ol.parseDoc(
- nd->briefFile(),nd->briefLine(),
- nd,0,
- abbreviate(nd->briefDescription(),nd->displayName()),
- FALSE, // index words
- FALSE, // isExample
- 0, // example name
- TRUE, // single line
- TRUE // link from index
- );
- //ol.docify(")");
- }
- ol.endIndexValue(nd->getOutputFileBase(),hasBrief);
- //ol.writeEndAnnoItem(nd->getOutputFileBase());
- if (hasHtmlHelp)
- {
- htmlHelp->addContentsItem(FALSE,nd->displayName(),nd->getOutputFileBase());
- }
- if (hasFtvHelp)
- {
- ftvHelp->addContentsItem(FALSE,nd->getReference(),nd->getOutputFileBase(),0,nd->displayName());
- }
- }
- }
- if (!first) ol.endIndexList();
- if (hasHtmlHelp)
- {
- htmlHelp->decContentsDepth();
- }
- if (hasFtvHelp)
- {
- ftvHelp->decContentsDepth();
- }
- endFile(ol);
- ol.popGeneratorState();
-}
-
-//----------------------------------------------------------------------------
-
-int countAnnotatedClasses()
-{
- int count=0;
- //ClassDef *cd=Doxygen::classList.first();
- ClassSDict::Iterator cli(Doxygen::classSDict);
- ClassDef *cd;
- for (;(cd=cli.current());++cli)
- {
- if (cd->isLinkableInProject() && cd->templateMaster()==0 && !cd->isHidden())
- {
- //printf("Annotated class %s\n",cd->name().data());
- count++;
- }
- }
- return count;
-}
-
-//----------------------------------------------------------------------
-
-void writeAnnotatedClassList(OutputList &ol)
-{
- bool &generateHtml = Config_getBool("GENERATE_HTML") ;
- bool hasHtmlHelp = generateHtml && Config_getBool("GENERATE_HTMLHELP");
- bool hasFtvHelp = generateHtml && Config_getBool("GENERATE_TREEVIEW");
- ol.startIndexList();
- ClassSDict::Iterator cli(Doxygen::classSDict);
- ClassDef *cd;
-
- // clear index
- for (int y=0;y<CHL_Total;y++)
- {
- for (int x=0;x<256;x++)
- {
- g_classIndexLetterUsed[y][x]=FALSE;
- }
- }
-
- // see which elements are in use
- for (cli.toFirst();(cd=cli.current());++cli)
- {
- if (cd->isLinkableInProject() && cd->templateMaster()==0 && !cd->isHidden())
- {
- int c = cd->displayName().at(0);
- g_classIndexLetterUsed[CHL_All][c]=TRUE;
- switch(cd->compoundType())
- {
- case ClassDef::Class:
- g_classIndexLetterUsed[CHL_Classes][c]=TRUE;
- break;
- case ClassDef::Struct:
- g_classIndexLetterUsed[CHL_Structs][c]=TRUE;
- break;
- case ClassDef::Union:
- g_classIndexLetterUsed[CHL_Unions][c]=TRUE;
- break;
- case ClassDef::Interface:
- g_classIndexLetterUsed[CHL_Interfaces][c]=TRUE;
- break;
- case ClassDef::Protocol:
- g_classIndexLetterUsed[CHL_Protocols][c]=TRUE;
- break;
- case ClassDef::Category:
- g_classIndexLetterUsed[CHL_Categories][c]=TRUE;
- break;
- case ClassDef::Exception:
- g_classIndexLetterUsed[CHL_Exceptions][c]=TRUE;
- break;
-
- }
- }
- }
-
- for (cli.toFirst();(cd=cli.current());++cli)
- {
- if (cd->isLinkableInProject() && cd->templateMaster()==0 && !cd->isHidden())
- {
- QCString type=cd->compoundTypeString();
- ol.startIndexKey();
- ol.writeObjectLink(0,cd->getOutputFileBase(),0,cd->displayName());
- ol.endIndexKey();
- bool hasBrief = !cd->briefDescription().isEmpty();
- ol.startIndexValue(hasBrief);
- if (hasBrief)
- {
- ol.parseDoc(
- cd->briefFile(),cd->briefLine(),
- cd,0,
- abbreviate(cd->briefDescription(),cd->displayName()),
- FALSE, // indexWords
- FALSE, // isExample
- 0, // example name
- TRUE, // single line
- TRUE // link from index
- );
- }
- ol.endIndexValue(cd->getOutputFileBase(),hasBrief);
- //ol.writeEndAnnoItem(cd->getOutputFileBase());
- if (hasHtmlHelp)
- {
- HtmlHelp::getInstance()->addContentsItem(FALSE,cd->displayName(),cd->getOutputFileBase());
- }
- if (hasFtvHelp)
- {
- FTVHelp::getInstance()->addContentsItem(FALSE,cd->getReference(),cd->getOutputFileBase(),0,cd->displayName());
- }
- }
- }
- ol.endIndexList();
-}
-
-//----------------------------------------------------------------------------
-
-// write an alphabetical index of all class with a header for each letter
-void writeAlphabeticalClassList(OutputList &ol)
-{
- //ol.startAlphabeticalIndexList();
-
- // first count the number of headers
- ClassSDict::Iterator cli(Doxygen::classSDict);
- ClassDef *cd;
- char startLetter=0;
- int headerItems=0;
- QCString alphaLinks = "<p><div class=\"qindex\">";
- for (;(cd=cli.current());++cli)
- {
- if (cd->isLinkableInProject() && cd->templateMaster()==0 && !cd->isHidden())
- {
- int index = getPrefixIndex(cd->className());
- //printf("name=%s index=%d\n",cd->className().data(),index);
- if (toupper(cd->className().at(index))!=startLetter) // new begin letter => new header
- {
- startLetter=toupper(cd->className().at(index));
- if (headerItems) alphaLinks += "&nbsp;|&nbsp;";
- headerItems++;
- alphaLinks += (QCString)"<a class=\"qindex\" href=\"#letter_" +
- startLetter + "\">" +
- startLetter + "</a>";
- }
- }
- }
- alphaLinks += "</div><p>\n";
- ol.writeString(alphaLinks);
-
- ol.writeString("<table align=\"center\" width=\"95%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n");
-
- // the number of columns in the table
- const int columns = Config_getInt("COLS_IN_ALPHA_INDEX");
-
- int i,j;
- int totalItems = headerItems + annotatedClasses; // number of items in the table
- int rows = (totalItems + columns - 1)/columns; // number of rows in the table
- int itemsInLastRow = (totalItems + columns -1)%columns + 1; // number of items in the last row
-
- //printf("headerItems=%d totalItems=%d columns=%d rows=%d itemsInLastRow=%d\n",
- // headerItems,totalItems,columns,rows,itemsInLastRow);
-
- // create one class list for each column
- ClassList *colList = new ClassList[columns];
-
- // fill the columns with the class list (row elements in each column,
- // expect for the columns with number >= itemsInLastRow, which get on
- // item less.
- int col=0,row=0;
- //int icount=0;
- startLetter=0;
- for (cli.toFirst();(cd=cli.current());++cli)
- {
- if (cd->isLinkableInProject() && cd->templateMaster()==0 && !cd->isHidden())
- {
- int index = getPrefixIndex(cd->className());
- if (toupper(cd->className().at(index))!=startLetter)
- {
- // insert a new header using a dummy class pointer.
- startLetter=toupper(cd->className().at(index));
- colList[col].append((ClassDef *)8); // insert dummy for the header
- row++;
- if ( row >= rows + ((col<itemsInLastRow) ? 0 : -1))
- {
- // if the header is the last item in the row, we add an extra
- // row to make it easier to find the text of the header (this
- // is then contained in the next cell)
- colList[col].append(cd);
- col++;
- row=0;
- }
- }
- // add the class definition to the correct column list
- colList[col].append(cd);
- row++;
- if ( row >= rows + ((col<itemsInLastRow) ? 0 : -1)) { col++; row=0; }
- }
- }
-
- // create iterators for each column
- ClassListIterator **colIterators = new ClassListIterator*[columns];
- for (i=0;i<columns;i++)
- {
- colIterators[i] = new ClassListIterator(colList[i]);
- }
-
- // generate table
- for (i=0;i<rows;i++) // foreach table row
- {
- //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);
- for (j=0;j<colsInRow;j++) // foreach table column
- {
- ol.writeString("<td>");
- ClassDef *cd = colIterators[j]->current();
- //printf("columns [%d] cd=%p\n",j,cd);
- if (cd==(ClassDef *)8) // the class pointer is really a header
- {
- cd=++(*colIterators[j]); // get the next item
- if (cd)
- {
- //printf("head ClassDef=%p %s\n",cd,cd ? cd->name().data() : "<none>");
- int index = getPrefixIndex(cd->className());
- startLetter=toupper(cd->className().at(index));
- char s[2]; s[0]=startLetter; s[1]=0;
- //ol.writeIndexHeading(s);
- 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\">&nbsp;&nbsp;");
- ol.writeString(s);
- ol.writeString( "&nbsp;&nbsp;</div>"
- "</td>"
- "</tr>"
- "</table>\n");
-
- }
- }
- else if (cd) // a real class, insert a link
- {
- QCString namesp,cname;
- //if (cd->getNamespaceDef()) namesp=cd->getNamespaceDef()->displayName();
- //QCString cname=cd->className();
- extractNamespaceName(cd->name(),cname,namesp);
- QCString nsDispName;
- if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
- {
- nsDispName=substitute(namesp,"::",".");
- }
- else
- {
- nsDispName=namesp.copy();
- }
-
- ol.writeObjectLink(cd->getReference(),
- cd->getOutputFileBase(),0,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);
- //printf("item ClassDef=%p %s\n",cd,cd ? cd->name().data() : "<none>");
- ++(*colIterators[j]);
- }
- //ol.endTableColumn();
- ol.writeString("</td>");
- //if (j<colsInRow-1) ol.nextTableColumn();
- }
- //ol.endTableRow();
- ol.writeString("</tr>");
- }
- //ol.endAlphabeticalIndexList();
- ol.writeString("</table>");
-
- ol.writeString(alphaLinks);
-
- // release the temporary memory
- for (i=0;i<columns;i++)
- {
- delete colIterators[i];
- }
- delete[] colIterators;
- delete[] colList;
-}
-
-//----------------------------------------------------------------------------
-
-void writeAlphabeticalIndex(OutputList &ol)
-{
- if (annotatedClasses==0) return;
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
- startFile(ol,"classes"+Doxygen::htmlFileExtension,0,theTranslator->trAlphabeticalList().data(),HLI_Classes);
- startTitle(ol,0);
- ol.parseText(Config_getString("PROJECT_NAME")+" "+theTranslator->trCompoundIndex());
- endTitle(ol,0,0);
- writeAlphabeticalClassList(ol);
- endFile(ol);
- ol.popGeneratorState();
-}
-
-//----------------------------------------------------------------------------
-
-void writeAnnotatedIndex(OutputList &ol)
-{
- bool &generateHtml = Config_getBool("GENERATE_HTML") ;
- bool hasHtmlHelp = generateHtml && Config_getBool("GENERATE_HTMLHELP");
- bool hasFtvHelp = generateHtml && Config_getBool("GENERATE_TREEVIEW");
-
- if (annotatedClasses==0) return;
-
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
- QCString title = theTranslator->trCompoundList();
- startFile(ol,"annotated",0,title.data(),HLI_Annotated);
- startTitle(ol,0);
- QCString htmlHelpTitle = title;
- QCString ftvHelpTitle = title;
- if (!Config_getString("PROJECT_NAME").isEmpty()) title.prepend(Config_getString("PROJECT_NAME")+" ");
- ol.parseText(title);
- endTitle(ol,0,0);
- ol.startTextBlock();
- HtmlHelp *htmlHelp = 0;
- FTVHelp *ftvHelp = 0;
- if (hasHtmlHelp)
- {
- htmlHelp = HtmlHelp::getInstance();
- htmlHelp->addContentsItem(TRUE,htmlHelpTitle,"annotated");
- htmlHelp->incContentsDepth();
- }
- if (hasFtvHelp)
- {
- ftvHelp = FTVHelp::getInstance();
- ftvHelp->addContentsItem(TRUE,0,"annotated",0,ftvHelpTitle);
- ftvHelp->incContentsDepth();
- }
- ol.parseText(theTranslator->trCompoundListDescription());
- ol.endTextBlock();
- writeAnnotatedClassList(ol);
- if (hasHtmlHelp)
- {
- htmlHelp->decContentsDepth();
- }
- if (hasFtvHelp)
- {
- ftvHelp->decContentsDepth();
- }
-
- endFile(ol);
- ol.popGeneratorState();
-}
-
-//----------------------------------------------------------------------------
-
-void writeMemberList(OutputList &ol,bool useSections,
- ClassMemberHighlight filter,char sectionFilter)
-{
- bool first = TRUE;
- char lastChar = 0;
- static bool hideFriendCompounds = Config_getBool("HIDE_FRIEND_COMPOUNDS");
-
- MemberNameSDict::Iterator mnli(Doxygen::memberNameSDict);
- MemberName *mn=0;
- for (mnli.toFirst();(mn=mnli.current());++mnli)
- {
- if (sectionFilter==0 || tolower(sectionFilter)==tolower(mn->memberName()[0]))
- {
- MemberDef *md=mn->first();
- bool found=FALSE;
- bool isFunc=FALSE;
- while (md && !found)
- {
- ClassDef *cd;
- bool isFriendToHide = hideFriendCompounds &&
- (QCString(md->typeString())=="friend class" ||
- QCString(md->typeString())=="friend struct" ||
- QCString(md->typeString())=="friend union");
- if (
- md->isLinkableInProject() &&
- (cd=md->getClassDef()) &&
- cd->isLinkableInProject() && cd->templateMaster()==0 && !cd->isHidden() &&
- ( (filter==CMHL_All && !(md->isFriend() && isFriendToHide)) ||
- (filter==CMHL_Functions && (md->isFunction() || md->isSlot() || md->isSignal())) ||
- (filter==CMHL_Variables && md->isVariable()) ||
- (filter==CMHL_Typedefs && md->isTypedef()) ||
- (filter==CMHL_Enums && md->isEnumerate()) ||
- (filter==CMHL_EnumValues && md->isEnumValue()) ||
- (filter==CMHL_Properties && md->isProperty()) ||
- (filter==CMHL_Events && md->isEvent()) ||
- (filter==CMHL_Related && (md->isRelated() || (md->isFriend() && !isFriendToHide)))
- )
- )
- {
- found=TRUE;
- isFunc=!md->isObjCMethod() &&
- (md->isFunction() || md->isSlot() || md->isSignal());
- }
- md=mn->next();
- }
- if (found)
- {
- if (useSections)
- {
- QCString name = mn->memberName();
- if (tolower(name.at(0))!=lastChar)
- {
- if (!first) ol.endItemList();
- char cs[2];
- lastChar=cs[0]=tolower(name.at(0));cs[1]='\0';
- QCString anchor=(QCString)"index_"+cs;
- QCString title=(QCString)"- "+cs+" -";
- ol.startSection(anchor,title,SectionInfo::Subsection);
- ol.docify(title);
- ol.endSection(anchor,SectionInfo::Subsection);
- ol.startItemList();
- first=FALSE;
- }
- }
- else if (first)
- {
- first=FALSE;
- ol.startItemList();
- }
- ol.writeListItem();
- ol.docify(mn->memberName());
- if (isFunc) ol.docify("()");
- ol.writeString("\n");
-
- int count=0;
- md=mn->last();
- QCString prevName;
- while (md)
- {
- ClassDef *cd=md->getClassDef();
- if (
- md->isLinkableInProject() &&
- prevName!=cd->displayName() &&
- cd->templateMaster()==0 && !cd->isHidden()
- )
- {
- if (count==0)
- ol.docify(": ");
- else
- ol.docify(", ");
- ol.writeObjectLink(md->getReference(),md->getOutputFileBase(),md->anchor(),
- cd->displayName());
- count++;
- prevName=cd->displayName();
- }
- md=mn->prev();
- }
- }
- }
- }
- ol.endItemList();
-}
-
-//----------------------------------------------------------------------------
-
-int countClassMembers(int filter)
-{
- static bool hideFriendCompounds = Config_getBool("HIDE_FRIEND_COMPOUNDS");
- int i=0;for (i=0;i<256;i++) g_memberIndexLetterUsed[filter][i]=FALSE;
- int count=0;
- MemberNameSDict::Iterator mnli(Doxygen::memberNameSDict);
- MemberName *mn=0;
- for (mnli.toFirst();(mn=mnli.current());++mnli)
- {
- MemberDef *md=mn->first();
- bool found=FALSE;
- ClassDef *cd;
- while (md && !found)
- {
- bool isFriendToHide = hideFriendCompounds &&
- (QCString(md->typeString())=="friend class" ||
- QCString(md->typeString())=="friend struct" ||
- QCString(md->typeString())=="friend union");
- if (
- md->isLinkableInProject() &&
- (cd=md->getClassDef()) &&
- cd->isLinkableInProject() &&
- ( filter==CMHL_All && !(md->isFriend() && isFriendToHide) ||
- (filter==CMHL_Functions && (md->isFunction() || md->isSlot() || md->isSignal())) ||
- (filter==CMHL_Variables && md->isVariable()) ||
- (filter==CMHL_Typedefs && md->isTypedef()) ||
- (filter==CMHL_Enums && md->isEnumerate()) ||
- (filter==CMHL_EnumValues && md->isEnumValue()) ||
- (filter==CMHL_Properties && md->isProperty()) ||
- (filter==CMHL_Events && md->isEvent()) ||
- (filter==CMHL_Related && (md->isRelated() || (md->isFriend() && !isFriendToHide)))
- )
- )
- {
- found=TRUE;
- }
- md=mn->next();
- }
- if (found)
- {
- QCString n = mn->memberName();
- if (!n.isEmpty()) g_memberIndexLetterUsed[filter][tolower(n.at(0))]=TRUE;
- count++;
- }
- }
- return count;
-}
-
-//----------------------------------------------------------------------------
-
-void writeQuickMemberIndex(OutputList &ol,bool *charUsed,int page,
- QCString fullName,bool multiPage)
-{
- bool first=TRUE;
- int i;
- ol.writeString("<div class=\"qindex\">");
- for (i=33;i<127;i++)
- {
- char is[2];is[0]=(char)i;is[1]='\0';
- if (charUsed[i])
- {
- QCString anchor;
- QCString extension=Doxygen::htmlFileExtension;
- if (!multiPage)
- anchor="#index_";
- else if (first)
- anchor=fullName+extension+"#index_";
- else
- anchor=fullName+QCString().sprintf("_0x%02x",i)+extension+"#index_";
- startQuickIndexItem(ol,anchor+is,i==page,TRUE,first);
- ol.writeString(is);
- endQuickIndexItem(ol);
- first=FALSE;
- }
- }
- ol.writeString("</div>\n");
- ol.newParagraph();
-}
-
-//----------------------------------------------------------------------------
-
-static void writeClassMemberIndexFiltered(OutputList &ol, ClassMemberHighlight hl)
-{
- if (documentedClassMembers[hl]==0) return;
-
- bool multiPageIndex=FALSE;
- int numPages=1;
- if (documentedClassMembers[hl]>MAX_ITEMS_BEFORE_MULTIPAGE_INDEX)
- {
- multiPageIndex=TRUE;
- numPages=127;
- }
-
- struct CmhlInfo
- {
- CmhlInfo(const char *fn,const char *t) : fname(fn), title(t) {}
- const char *fname;
- QCString title;
- } cmhlInfo[] =
- {
- CmhlInfo("functions", theTranslator->trAll()),
- CmhlInfo("functions_func",theTranslator->trFunctions()),
- CmhlInfo("functions_vars",theTranslator->trVariables()),
- CmhlInfo("functions_type",theTranslator->trTypedefs()),
- CmhlInfo("functions_enum",theTranslator->trEnumerations()),
- CmhlInfo("functions_eval",theTranslator->trEnumerationValues()),
- CmhlInfo("functions_prop",theTranslator->trProperties()),
- CmhlInfo("functions_evnt",theTranslator->trEvents()),
- CmhlInfo("functions_rela",theTranslator->trRelatedFunctions())
- };
-
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
-
- QCString extension=Doxygen::htmlFileExtension;
- QCString title = theTranslator->trCompoundMembers();
- if (hl!=CMHL_All) title+=(QCString)" - "+cmhlInfo[hl].title;
-
- int page;
- bool first=TRUE;
- for (page=0;page<numPages;page++)
- {
- if (!multiPageIndex || g_memberIndexLetterUsed[hl][page])
- {
- QCString fileName = cmhlInfo[hl].fname;
- if (multiPageIndex && !first)
- {
- fileName+=QCString().sprintf("_0x%02x",page);
- }
-
- startFile(ol,fileName+extension,0,title,HLI_Functions);
-
- ol.writeString("<div class=\"qindex\">");
-
- // index item for global member list
- startQuickIndexItem(ol,
- cmhlInfo[0].fname+Doxygen::htmlFileExtension,hl==CMHL_All,TRUE,first);
- ol.writeString(fixSpaces(cmhlInfo[0].title));
- endQuickIndexItem(ol);
-
- // index items per category member lists
- int i;
- for (i=1;i<CMHL_Total;i++)
- {
- if (documentedClassMembers[i]>0)
- {
- startQuickIndexItem(ol,cmhlInfo[i].fname+Doxygen::htmlFileExtension,hl==i,TRUE,first);
- ol.writeString(fixSpaces(cmhlInfo[i].title));
- //printf("multiPageIndex=%d first=%d fileName=%s file=%s title=%s\n",
- // multiPageIndex,first,fileName.data(),cmhlInfo[i].fname,cmhlInfo[i].title.data());
- endQuickIndexItem(ol);
- }
- }
-
- ol.writeString("</div>\n");
-
- // quick alphabetical index
- bool quickIndex = documentedClassMembers[hl]>maxItemsBeforeQuickIndex;
- if (quickIndex)
- {
- writeQuickMemberIndex(ol,g_memberIndexLetterUsed[hl],page,
- cmhlInfo[hl].fname,multiPageIndex);
- }
- if (hl==CMHL_All)
- {
- ol.parseText(theTranslator->trCompoundMembersDescription(Config_getBool("EXTRACT_ALL")));
- }
- ol.newParagraph();
- writeMemberList(ol,quickIndex,hl,page);
- endFile(ol);
- first=FALSE;
- }
- }
-
- ol.popGeneratorState();
-}
-
-void writeClassMemberIndex(OutputList &ol)
-{
- writeClassMemberIndexFiltered(ol,CMHL_All);
- writeClassMemberIndexFiltered(ol,CMHL_Functions);
- writeClassMemberIndexFiltered(ol,CMHL_Variables);
- writeClassMemberIndexFiltered(ol,CMHL_Typedefs);
- writeClassMemberIndexFiltered(ol,CMHL_Enums);
- writeClassMemberIndexFiltered(ol,CMHL_EnumValues);
- writeClassMemberIndexFiltered(ol,CMHL_Properties);
- writeClassMemberIndexFiltered(ol,CMHL_Events);
- writeClassMemberIndexFiltered(ol,CMHL_Related);
-
- if (documentedClassMembers[CMHL_All]>0)
- {
- QCString title = theTranslator->trCompoundMembers();
- bool &generateHtml = Config_getBool("GENERATE_HTML") ;
- bool hasHtmlHelp = generateHtml && Config_getBool("GENERATE_HTMLHELP");
- bool hasFtvHelp = generateHtml && Config_getBool("GENERATE_TREEVIEW");
- if (hasHtmlHelp)
- {
- HtmlHelp *htmlHelp = HtmlHelp::getInstance();
- htmlHelp->addContentsItem(FALSE,title,"functions");
- }
- if (hasFtvHelp)
- {
- FTVHelp *ftvHelp = FTVHelp::getInstance();
- ftvHelp->addContentsItem(FALSE,0,"functions",0,title);
- }
- }
-}
-
-//----------------------------------------------------------------------------
-
-static void writeFileMemberList(OutputList &ol,
- bool useSections,
- FileMemberHighlight filter,
- char sectionFilter)
-{
- char lastChar=0;
- bool first=TRUE;
- MemberNameSDict::Iterator mnli(Doxygen::functionNameSDict);
- MemberName *mn=0;
- for (mnli.toFirst();(mn=mnli.current());++mnli)
- {
- if (sectionFilter==0 || tolower(sectionFilter)==tolower(mn->memberName()[0]))
- {
- MemberDef *md=mn->first();
- bool found=FALSE;
- while (md && !found)
- {
- FileDef *fd=md->getFileDef();
- bool hasDocs = md->getFileDef() &&
- md->getFileDef()->isLinkableInProject();
-
- if (fd && hasDocs &&
- md->isLinkableInProject() &&
- ( filter==FMHL_All ||
- (filter==FMHL_Functions && md->isFunction()) ||
- (filter==FMHL_Variables && md->isVariable()) ||
- (filter==FMHL_Typedefs && md->isTypedef()) ||
- (filter==FMHL_Enums && md->isEnumerate()) ||
- (filter==FMHL_EnumValues && md->isEnumValue()) ||
- (filter==FMHL_Defines && md->isDefine())
- )
- )
- {
- found=TRUE;
- }
- else
- {
- md=mn->next();
- }
- }
- if (found) // function is documented
- {
- if (useSections)
- {
- QCString name = mn->memberName();
- if (tolower(name.at(0))!=lastChar)
- {
- if (!first) ol.endItemList();
- char cs[2];
- lastChar=cs[0]=tolower(name.at(0));cs[1]='\0';
- QCString anchor=(QCString)"index_"+cs;
- QCString title=(QCString)"- "+cs+" -";
- ol.startSection(anchor,title,SectionInfo::Subsection);
- ol.docify(title);
- ol.endSection(anchor,SectionInfo::Subsection);
- ol.startItemList();
- first=FALSE;
- }
- }
- else if (first)
- {
- first=FALSE;
- ol.startItemList();
- }
- ol.writeListItem();
- ol.docify(md->name());
- if (md->isFunction()) ol.docify("()");
- ol.writeString("\n");
-
- int count=0;
- md=mn->last();
- QCString prevName;
- while (md)
- {
- FileDef *fd=md->getFileDef();
- if (fd && fd->isLinkableInProject() &&
- md->isLinkableInProject() &&
- prevName!=fd->name())
- {
- if (count==0)
- ol.docify(": ");
- else
- ol.docify(", ");
- QCString baseName=fd->name();
- ol.writeObjectLink(md->getReference(),
- md->getOutputFileBase(),md->anchor(), baseName);
- count++;
- prevName=fd->name();
- }
- md=mn->prev();
- }
- }
- }
- }
- ol.endItemList();
-}
-
-//----------------------------------------------------------------------------
-
-void writeNamespaceMemberList(OutputList &ol,bool useSections,
- NamespaceMemberHighlight filter,
- char sectionFilter)
-{
- char lastChar=0;
- bool first=TRUE;
- MemberNameSDict::Iterator mnli(Doxygen::functionNameSDict);
- MemberName *mn=0;
- for (mnli.toFirst();(mn=mnli.current());++mnli)
- {
- if (sectionFilter==0 || tolower(sectionFilter)==tolower(mn->memberName()[0]))
- {
- MemberDef *md=mn->first();
- bool found=FALSE;
- while (md && !found)
- {
- NamespaceDef *nd=md->getNamespaceDef();
- if (nd && nd->isLinkableInProject() && md->isLinkableInProject() &&
- ( filter==NMHL_All ||
- (filter==NMHL_Functions && md->isFunction()) ||
- (filter==NMHL_Variables && md->isVariable()) ||
- (filter==NMHL_Typedefs && md->isTypedef()) ||
- (filter==NMHL_Enums && md->isEnumerate()) ||
- (filter==NMHL_EnumValues && md->isEnumValue())
- )
- )
- {
- found=TRUE;
- }
- else
- {
- md=mn->next();
- }
- }
- if (found) // member is documented and in a documented namespace
- {
- if (useSections)
- {
- QCString name = mn->memberName();
- if (tolower(name.at(0))!=lastChar)
- {
- if (!first) ol.endItemList();
- char cs[2];
- lastChar=cs[0]=tolower(name.at(0));cs[1]='\0';
- QCString anchor=(QCString)"index_"+cs;
- QCString title=(QCString)"- "+cs+" -";
- ol.startSection(anchor,title,SectionInfo::Subsection);
- ol.docify(title);
- ol.endSection(anchor,SectionInfo::Subsection);
- ol.startItemList();
- first=FALSE;
- }
- }
- else if (first)
- {
- ol.startItemList();
- first=FALSE;
- }
- ol.writeListItem();
- ol.docify(md->name());
- if (md->isFunction()) ol.docify("()");
- ol.writeString("\n");
-
- int count=0;
- md=mn->last();
- QCString prevName;
- while (md)
- {
- NamespaceDef *nd=md->getNamespaceDef();
- if (nd && nd->isLinkableInProject() && md->isLinkableInProject() &&
- prevName!=nd->name()
- )
- {
- if (count==0)
- ol.docify(": ");
- else
- ol.docify(", ");
- ol.writeObjectLink(md->getReference(),md->getOutputFileBase(),
- md->anchor(),nd->name());
- count++;
- prevName=nd->name();
- }
- md=mn->prev();
- }
- }
- }
- }
- if (!first) ol.endItemList();
-}
-
-//----------------------------------------------------------------------------
-
-int countNamespaceMembers(int filter)
-{
- int i=0;for (i=0;i<256;i++) g_namespaceIndexLetterUsed[filter][i]=FALSE;
- int count=0;
- MemberNameSDict::Iterator mnli(Doxygen::functionNameSDict);
- MemberName *mn=0;
- for (mnli.toFirst();(mn=mnli.current());++mnli)
- {
- MemberDef *md=mn->first();
- bool found=FALSE;
- while (md && !found)
- {
- NamespaceDef *nd=md->getNamespaceDef();
- if (nd && nd->isLinkableInProject() && md->isLinkableInProject() &&
- ( filter==NMHL_All ||
- (filter==NMHL_Functions && md->isFunction()) ||
- (filter==NMHL_Variables && md->isVariable()) ||
- (filter==NMHL_Typedefs && md->isTypedef()) ||
- (filter==NMHL_Enums && md->isEnumerate()) ||
- (filter==NMHL_EnumValues && md->isEnumValue())
- )
- )
- {
- QCString n = mn->memberName();
- if (!n.isEmpty()) g_namespaceIndexLetterUsed[filter][tolower(n.at(0))]=TRUE;
- found=TRUE;
- }
- else
- md=mn->next();
- }
- if (found) count++;
- }
- return count;
-}
-
-//----------------------------------------------------------------------------
-
-int countFileMembers(int filter)
-{
- int i=0;for (i=0;i<256;i++) g_fileIndexLetterUsed[filter][i]=FALSE;
- int count=0;
- MemberNameSDict::Iterator mnli(Doxygen::functionNameSDict);
- MemberName *mn=0;
- for (mnli.toFirst();(mn=mnli.current());++mnli)
- {
- MemberDef *md=mn->first();
- FileDef *fd;
- bool found=FALSE;
- while (md && !found)
- {
- if (md->isLinkableInProject() &&
- (fd=md->getFileDef()) &&
- fd->isLinkableInProject() &&
- ( filter==FMHL_All ||
- (filter==FMHL_Functions && md->isFunction()) ||
- (filter==FMHL_Variables && md->isVariable()) ||
- (filter==FMHL_Typedefs && md->isTypedef()) ||
- (filter==FMHL_Enums && md->isEnumerate()) ||
- (filter==FMHL_EnumValues && md->isEnumValue()) ||
- (filter==FMHL_Defines && md->isDefine())
- )
- )
- {
- QCString n = mn->memberName();
- if (!n.isEmpty())
- {
- g_fileIndexLetterUsed[filter][tolower(n.at(0))]=TRUE;
- }
- found=TRUE;
- }
- else
- md=mn->next();
- }
- if (found) count++;
- }
- return count;
-}
-
-//----------------------------------------------------------------------------
-
-static void writeFileMemberIndexFiltered(OutputList &ol, FileMemberHighlight hl)
-{
- if (documentedFileMembers[hl]==0) return;
-
- bool multiPageIndex=FALSE;
- int numPages=1;
- if (documentedFileMembers[hl]>MAX_ITEMS_BEFORE_MULTIPAGE_INDEX)
- {
- multiPageIndex=TRUE;
- numPages=127;
- }
-
- struct FmhlInfo
- {
- FmhlInfo(const char *fn,const char *t) : fname(fn), title(t) {}
- const char *fname;
- QCString title;
- } fmhlInfo[] =
- {
- FmhlInfo("globals", theTranslator->trAll()),
- FmhlInfo("globals_func",theTranslator->trFunctions()),
- FmhlInfo("globals_vars",theTranslator->trVariables()),
- FmhlInfo("globals_type",theTranslator->trTypedefs()),
- FmhlInfo("globals_enum",theTranslator->trEnumerations()),
- FmhlInfo("globals_eval",theTranslator->trEnumerationValues()),
- FmhlInfo("globals_defs",theTranslator->trDefines())
- };
-
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
-
- QCString extension=Doxygen::htmlFileExtension;
- QCString title = theTranslator->trCompoundMembers();
-
- int page;
- bool first=TRUE;
- for (page=0;page<numPages;page++)
- {
- if (!multiPageIndex || g_fileIndexLetterUsed[hl][page])
- {
- QCString fileName = fmhlInfo[hl].fname;
- if (multiPageIndex && !first)
- {
- fileName+=QCString().sprintf("_0x%02x",page);
- }
-
- startFile(ol,fileName+extension,0,title.data(),HLI_Globals);
-
- ol.writeString("<div class=\"qindex\">");
-
- // index item for all member lists
- startQuickIndexItem(ol,
- fmhlInfo[0].fname+Doxygen::htmlFileExtension,hl==FMHL_All,TRUE,first);
- ol.writeString(fixSpaces(fmhlInfo[0].title));
- endQuickIndexItem(ol);
-
- int i;
- // index items for per category member lists
- for (i=1;i<FMHL_Total;i++)
- {
- if (documentedFileMembers[i]>0)
- {
- startQuickIndexItem(ol,
- fmhlInfo[i].fname+Doxygen::htmlFileExtension,hl==i,TRUE,first);
- ol.writeString(fixSpaces(fmhlInfo[i].title));
- endQuickIndexItem(ol);
- }
- }
-
- ol.writeString("</div>\n");
-
- bool quickIndex = documentedFileMembers[hl]>maxItemsBeforeQuickIndex;
- if (quickIndex)
- {
- writeQuickMemberIndex(ol,g_fileIndexLetterUsed[hl],page,
- fmhlInfo[hl].fname,multiPageIndex);
- }
-
- if (hl==FMHL_All)
- {
- ol.parseText(theTranslator->trFileMembersDescription(Config_getBool("EXTRACT_ALL")));
- }
- ol.newParagraph();
- writeFileMemberList(ol,quickIndex,hl,page);
- endFile(ol);
- first=FALSE;
- }
- }
- ol.popGeneratorState();
-}
-
-void writeFileMemberIndex(OutputList &ol)
-{
- writeFileMemberIndexFiltered(ol,FMHL_All);
- writeFileMemberIndexFiltered(ol,FMHL_Functions);
- writeFileMemberIndexFiltered(ol,FMHL_Variables);
- writeFileMemberIndexFiltered(ol,FMHL_Typedefs);
- writeFileMemberIndexFiltered(ol,FMHL_Enums);
- writeFileMemberIndexFiltered(ol,FMHL_EnumValues);
- writeFileMemberIndexFiltered(ol,FMHL_Defines);
-
- if (documentedFileMembers[FMHL_All]>0)
- {
- QCString title = theTranslator->trFileMembers();
- bool &generateHtml = Config_getBool("GENERATE_HTML") ;
- bool hasHtmlHelp = generateHtml && Config_getBool("GENERATE_HTMLHELP");
- bool hasFtvHelp = generateHtml && Config_getBool("GENERATE_TREEVIEW");
- if (hasHtmlHelp)
- {
- HtmlHelp *htmlHelp = HtmlHelp::getInstance();
- htmlHelp->addContentsItem(FALSE,title,"globals");
- }
- if (hasFtvHelp)
- {
- FTVHelp *ftvHelp = FTVHelp::getInstance();
- ftvHelp->addContentsItem(FALSE,0,"globals",0,title);
- }
- }
-}
-
-
-//----------------------------------------------------------------------------
-
-static void writeNamespaceMemberIndexFiltered(OutputList &ol,
- NamespaceMemberHighlight hl)
-{
- if (documentedNamespaceMembers[hl]==0) return;
-
- bool multiPageIndex=FALSE;
- int numPages=1;
- if (documentedNamespaceMembers[hl]>MAX_ITEMS_BEFORE_MULTIPAGE_INDEX)
- {
- multiPageIndex=TRUE;
- numPages=127;
- }
-
- struct NmhlInfo
- {
- NmhlInfo(const char *fn,const char *t) : fname(fn), title(t) {}
- const char *fname;
- QCString title;
- } nmhlInfo[] =
- {
- NmhlInfo("namespacemembers", theTranslator->trAll()),
- NmhlInfo("namespacemembers_func",theTranslator->trFunctions()),
- NmhlInfo("namespacemembers_vars",theTranslator->trVariables()),
- NmhlInfo("namespacemembers_type",theTranslator->trTypedefs()),
- NmhlInfo("namespacemembers_enum",theTranslator->trEnumerations()),
- NmhlInfo("namespacemembers_eval",theTranslator->trEnumerationValues())
- };
-
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
-
- QCString extension=Doxygen::htmlFileExtension;
- QCString title = theTranslator->trCompoundMembers();
-
- int page;
- bool first=TRUE;
- for (page=0;page<numPages;page++)
- {
- if (!multiPageIndex || g_namespaceIndexLetterUsed[hl][page])
- {
- QCString fileName = nmhlInfo[hl].fname;
- if (multiPageIndex && !first)
- {
- fileName+=QCString().sprintf("_0x%02x",page);
- }
-
- startFile(ol,fileName+extension,0,title,HLI_NamespaceMembers);
-
- ol.writeString("<div class=\"qindex\">");
-
- startQuickIndexItem(ol,
- nmhlInfo[0].fname+Doxygen::htmlFileExtension,hl==NMHL_All,TRUE,first);
- ol.writeString(fixSpaces(nmhlInfo[0].title));
- endQuickIndexItem(ol);
-
- int i;
- for (i=1;i<NMHL_Total;i++)
- {
- if (documentedNamespaceMembers[i]>0)
- {
- startQuickIndexItem(ol,
- nmhlInfo[i].fname+Doxygen::htmlFileExtension,hl==i,TRUE,first);
- ol.writeString(fixSpaces(nmhlInfo[i].title));
- endQuickIndexItem(ol);
- }
- }
-
- ol.writeString("</div>\n");
-
- bool quickIndex = documentedNamespaceMembers[hl]>maxItemsBeforeQuickIndex;
- if (quickIndex)
- {
- writeQuickMemberIndex(ol,g_namespaceIndexLetterUsed[hl],page,
- nmhlInfo[hl].fname,multiPageIndex);
- }
- if (hl==NMHL_All)
- {
- ol.parseText(theTranslator->trNamespaceMemberDescription(Config_getBool("EXTRACT_ALL")));
- }
- ol.newParagraph();
-
- writeNamespaceMemberList(ol,quickIndex,hl,page);
- endFile(ol);
- }
- }
- ol.popGeneratorState();
-}
-
-void writeNamespaceMemberIndex(OutputList &ol)
-{
- writeNamespaceMemberIndexFiltered(ol,NMHL_All);
- writeNamespaceMemberIndexFiltered(ol,NMHL_Functions);
- writeNamespaceMemberIndexFiltered(ol,NMHL_Variables);
- writeNamespaceMemberIndexFiltered(ol,NMHL_Typedefs);
- writeNamespaceMemberIndexFiltered(ol,NMHL_Enums);
- writeNamespaceMemberIndexFiltered(ol,NMHL_EnumValues);
-
- if (documentedNamespaceMembers[NMHL_All]>0)
- {
- QCString title = theTranslator->trNamespaceMembers();
- bool &generateHtml = Config_getBool("GENERATE_HTML") ;
- bool hasHtmlHelp = generateHtml && Config_getBool("GENERATE_HTMLHELP");
- bool hasFtvHelp = generateHtml && Config_getBool("GENERATE_TREEVIEW");
- if (hasHtmlHelp)
- {
- HtmlHelp *htmlHelp = HtmlHelp::getInstance();
- htmlHelp->addContentsItem(FALSE,title,"namespacemembers");
- }
- if (hasFtvHelp)
- {
- FTVHelp *ftvHelp = FTVHelp::getInstance();
- ftvHelp->addContentsItem(FALSE,0,"namespacemembers",0,title);
- }
- }
-}
-
-//----------------------------------------------------------------------------
-
-void writeExampleIndex(OutputList &ol)
-{
- if (Doxygen::exampleSDict->count()==0) return;
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
- QCString title = theTranslator->trExamples();
- startFile(ol,"examples",0,title.data(),HLI_Examples);
- startTitle(ol,0);
- QCString htmlHelpTitle = title;
- QCString ftvHelpTitle = title;
- if (!Config_getString("PROJECT_NAME").isEmpty()) title.prepend(Config_getString("PROJECT_NAME")+" ");
- ol.parseText(title);
- endTitle(ol,0,0);
- ol.startTextBlock();
- HtmlHelp *htmlHelp = 0;
- FTVHelp *ftvHelp = 0;
- bool &generateHtml = Config_getBool("GENERATE_HTML") ;
- bool hasHtmlHelp = generateHtml && Config_getBool("GENERATE_HTMLHELP");
- bool hasFtvHelp = generateHtml && Config_getBool("GENERATE_TREEVIEW");
- if (hasHtmlHelp)
- {
- htmlHelp = HtmlHelp::getInstance();
- htmlHelp->addContentsItem(TRUE,htmlHelpTitle,"examples");
- htmlHelp->incContentsDepth();
- }
- if (hasFtvHelp)
- {
- ftvHelp = FTVHelp::getInstance();
- ftvHelp->addContentsItem(TRUE,0,"examples",0,ftvHelpTitle);
- ftvHelp->incContentsDepth();
- }
- ol.parseText(theTranslator->trExamplesDescription());
- //ol.newParagraph();
- ol.endTextBlock();
- ol.startItemList();
- PageSDict::Iterator pdi(*Doxygen::exampleSDict);
- PageDef *pd=0;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
- {
- ol.writeListItem();
- QCString n=pd->getOutputFileBase();
- if (!pd->title().isEmpty())
- {
- ol.writeObjectLink(0,n,0,pd->title());
- if (hasHtmlHelp) htmlHelp->addContentsItem(FALSE,pd->title(),n);
- if (hasFtvHelp) ftvHelp->addContentsItem(FALSE,pd->getReference(),n,0,pd->title());
- }
- else
- {
- ol.writeObjectLink(0,n,0,pd->name());
- if (hasHtmlHelp) htmlHelp->addContentsItem(FALSE,pd->name(),n);
- if (hasFtvHelp) ftvHelp->addContentsItem(FALSE,pd->getReference(),n,0,pd->name());
- }
- ol.writeString("\n");
- }
- ol.endItemList();
- if (hasHtmlHelp)
- {
- htmlHelp->decContentsDepth();
- }
- if (hasFtvHelp)
- {
- ftvHelp->decContentsDepth();
- }
- endFile(ol);
- ol.popGeneratorState();
-}
-
-//----------------------------------------------------------------------------
-
-void countRelatedPages(int &docPages,int &indexPages)
-{
- docPages=indexPages=0;
- PageSDict::Iterator pdi(*Doxygen::pageSDict);
- PageDef *pd=0;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
- {
- if ( pd->visibleInIndex())
- {
- indexPages++;
- }
- if ( pd->documentedPage())
- {
- docPages++;
- }
- }
-}
-
-//----------------------------------------------------------------------------
-
-static void writeSubPages(PageDef *pd)
-{
- //printf("Write subpages(%s #=%d)\n",pd->name().data(),pd->getSubPages() ? pd->getSubPages()->count() : 0 );
- static bool generateHtml = Config_getBool("GENERATE_HTML") ;
- static bool hasHtmlHelp = generateHtml && Config_getBool("GENERATE_HTMLHELP");
- static bool hasFtvHelp = generateHtml && Config_getBool("GENERATE_TREEVIEW");
- HtmlHelp *htmlHelp = 0;
- if (hasHtmlHelp)
- {
- htmlHelp = HtmlHelp::getInstance();
- htmlHelp->incContentsDepth();
- }
- FTVHelp *ftvHelp = 0;
- if (hasFtvHelp)
- {
- ftvHelp = FTVHelp::getInstance();
- ftvHelp->incContentsDepth();
- }
-
- PageSDict *subPages = pd->getSubPages();
- if (subPages)
- {
- PageSDict::Iterator pi(*subPages);
- PageDef *subPage;
- for (pi.toFirst();(subPage=pi.current());++pi)
- {
- QCString pageTitle;
-
- if (subPage->title().isEmpty())
- pageTitle=subPage->name();
- else
- pageTitle=subPage->title();
-
- bool hasSubPages = subPage->hasSubPages();
-
- if (hasHtmlHelp)
- {
- htmlHelp->addContentsItem(hasSubPages,pageTitle,subPage->getOutputFileBase());
- }
- if (hasFtvHelp)
- {
- ftvHelp->addContentsItem(hasSubPages,subPage->getReference(),subPage->getOutputFileBase(),0,pageTitle);
- }
- writeSubPages(subPage);
- }
- }
- if (hasHtmlHelp)
- {
- htmlHelp->decContentsDepth();
- }
- if (hasFtvHelp)
- {
- ftvHelp->decContentsDepth();
- }
-}
-
-void writePageIndex(OutputList &ol)
-{
- if (indexedPages==0) return;
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
- startFile(ol,"pages",0,theTranslator->trPageIndex().data(),HLI_Pages);
- startTitle(ol,0);
- QCString title = theTranslator->trRelatedPages();
- QCString htmlHelpTitle = title;
- QCString ftvHelpTitle = title;
- if (!Config_getString("PROJECT_NAME").isEmpty()) title.prepend(Config_getString("PROJECT_NAME")+" ");
- ol.parseText(title);
- endTitle(ol,0,0);
- ol.startTextBlock();
- HtmlHelp *htmlHelp = 0;
- FTVHelp *ftvHelp = 0;
- static bool generateHtml = Config_getBool("GENERATE_HTML") ;
- static bool hasHtmlHelp = generateHtml && Config_getBool("GENERATE_HTMLHELP");
- static bool hasFtvHelp = generateHtml && Config_getBool("GENERATE_TREEVIEW");
- if (hasHtmlHelp)
- {
- htmlHelp = HtmlHelp::getInstance();
- htmlHelp->addContentsItem(TRUE,htmlHelpTitle,"pages");
- htmlHelp->incContentsDepth();
- }
- if (hasFtvHelp)
- {
- ftvHelp = FTVHelp::getInstance();
- ftvHelp->addContentsItem(TRUE,0,"pages",0,ftvHelpTitle);
- ftvHelp->incContentsDepth();
- }
- ol.parseText(theTranslator->trRelatedPagesDescription());
- ol.endTextBlock();
- startIndexHierarchy(ol,0);
- PageSDict::Iterator pdi(*Doxygen::pageSDict);
- PageDef *pd=0;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
- {
- if ( pd->visibleInIndex())
- {
- QCString pageTitle;
-
- if (pd->title().isEmpty())
- pageTitle=pd->name();
- else
- pageTitle=pd->title();
-
- bool hasSubPages = pd->hasSubPages();
-
- ol.writeIndexItem(pd->getReference(),pd->getOutputFileBase(),pageTitle);
- if (pd->isReference())
- {
- ol.startTypewriter();
- ol.docify(" [external]");
- ol.endTypewriter();
- }
- ol.writeString("\n");
- if (hasHtmlHelp)
- {
- htmlHelp->addContentsItem(hasSubPages,pageTitle,pd->getOutputFileBase());
- }
- if (hasFtvHelp)
- {
- ftvHelp->addContentsItem(hasSubPages,pd->getReference(),pd->getOutputFileBase(),0,pageTitle);
- }
- writeSubPages(pd);
- }
- }
- endIndexHierarchy(ol,0);
- if (hasHtmlHelp)
- {
- htmlHelp->decContentsDepth();
- }
- if (hasFtvHelp)
- {
- ftvHelp->decContentsDepth();
- }
- endFile(ol);
- ol.popGeneratorState();
-}
-
-//----------------------------------------------------------------------------
-
-int countGroups()
-{
- int count=0;
- GroupSDict::Iterator gli(Doxygen::groupSDict);
- GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
- {
- if (!gd->isReference())
- {
- gd->visited=FALSE;
- count++;
- }
- }
- return count;
-}
-
-//----------------------------------------------------------------------------
-
-int countDirs()
-{
- int count=0;
- SDict<DirDef>::Iterator dli(Doxygen::directories);
- DirDef *dd;
- for (dli.toFirst();(dd=dli.current());++dli)
- {
- if (dd->isLinkableInProject())
- {
- dd->visited=FALSE;
- count++;
- }
- }
- return count;
-}
-
-
-//----------------------------------------------------------------------------
-
-void writeGraphInfo(OutputList &ol)
-{
- if (!Config_getBool("HAVE_DOT") || !Config_getBool("GENERATE_HTML")) return;
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
- generateGraphLegend(Config_getString("HTML_OUTPUT"));
- startFile(ol,"graph_legend",0,theTranslator->trLegendTitle().data());
- startTitle(ol,0);
- ol.parseText(theTranslator->trLegendTitle());
- endTitle(ol,0,0);
- bool oldStripCommentsState = Config_getBool("STRIP_CODE_COMMENTS");
- // temporarily disable the stripping of comments for our own code example!
- Config_getBool("STRIP_CODE_COMMENTS") = FALSE;
- ol.parseDoc("graph_legend",1,0,0,theTranslator->trLegendDocs(),FALSE,FALSE);
- Config_getBool("STRIP_CODE_COMMENTS") = oldStripCommentsState;
- endFile(ol);
- ol.popGeneratorState();
-}
-
-//----------------------------------------------------------------------------
-/*!
- * write groups as hierarchical trees
- * \author KPW
- */
-
-void writeGroupTreeNode(OutputList &ol, GroupDef *gd,int level)
-{
- HtmlHelp *htmlHelp=0;
- FTVHelp *ftvHelp = 0;
- if (level>20)
- {
- warn(gd->getDefFileName(),gd->getDefLine(),
- "Warning: maximum nesting level exceeded for group %s: check for possible recursive group relation!\n",gd->name().data()
- );
- return;
- }
- bool &generateHtml = Config_getBool("GENERATE_HTML") ;
- bool hasHtmlHelp = generateHtml && Config_getBool("GENERATE_HTMLHELP");
- bool hasFtvHelp = generateHtml && Config_getBool("GENERATE_TREEVIEW");
- if (hasHtmlHelp)
- {
- htmlHelp = HtmlHelp::getInstance();
- }
- if (hasFtvHelp)
- {
- ftvHelp = FTVHelp::getInstance();
- }
-
- /* Some groups should appear twice under different parent-groups.
- * That is why we should not check if it was visited
- */
- if (/*!gd->visited &&*/ (!gd->isASubGroup() || level>0) &&
- (!gd->isReference() || Config_getBool("EXTERNAL_GROUPS")) // hide external groups by default
- )
- {
- //printf("gd->name()=%s #members=%d\n",gd->name().data(),gd->countMembers());
- // write group info
- bool hasSubGroups = gd->groupList->count()>0;
- bool hasSubPages = gd->pageDict->count()>0;
- int numSubItems = 0;
- if ( Config_getBool("TOC_EXPAND"))
- {
- numSubItems += gd->docDefineMembers.count();
- numSubItems += gd->docTypedefMembers.count();
- numSubItems += gd->docEnumMembers.count();
- numSubItems += gd->docFuncMembers.count();
- numSubItems += gd->docVarMembers.count();
- numSubItems += gd->docProtoMembers.count();
- numSubItems += gd->namespaceSDict->count();
- numSubItems += gd->classSDict->count();
- numSubItems += gd->fileList->count();
- numSubItems += gd->exampleDict->count();
- }
-
- bool isDir = hasSubGroups || hasSubPages || numSubItems>0;
- //printf("gd=`%s': pageDict=%d\n",gd->name().data(),gd->pageDict->count());
- if (htmlHelp)
- {
- htmlHelp->addContentsItem(isDir,gd->groupTitle(),gd->getOutputFileBase());
- htmlHelp->incContentsDepth();
- }
- if (ftvHelp)
- {
- ftvHelp->addContentsItem(isDir,gd->getReference(),gd->getOutputFileBase(),
- 0,gd->groupTitle());
- ftvHelp->incContentsDepth();
- }
-
- //ol.writeListItem();
- //ol.startTextLink(gd->getOutputFileBase(),0);
- //parseText(ol,gd->groupTitle());
- //ol.endTextLink();
-
- ol.writeIndexItem(gd->getReference(),gd->getOutputFileBase(),gd->groupTitle());
- if (gd->isReference())
- {
- ol.startTypewriter();
- ol.docify(" [external]");
- ol.endTypewriter();
- }
-
- //ol.writeStartAnnoItem(0,gd->getOutputFileBase(),0,gd-);
- //parseText(ol,gd->groupTitle());
- //ol.writeEndAnnoItem(gd->getOutputFileBase());
-
- // write pages
- PageSDict::Iterator pli(*gd->pageDict);
- PageDef *pd = 0;
- for (pli.toFirst();(pd=pli.current());++pli)
- {
- SectionInfo *si=0;
- if (!pd->name().isEmpty()) si=Doxygen::sectionDict[pd->name()];
- if (htmlHelp) htmlHelp->addContentsItem(FALSE,
- convertToHtml(pd->title()),
- gd->getOutputFileBase(),
- si ? si->label.data() : 0
- );
- if (ftvHelp) ftvHelp->addContentsItem(FALSE,
- gd->getReference(),
- gd->getOutputFileBase(),
- si ? si->label.data() : 0,
- convertToHtml(pd->title())
- );
- }
-
- // write subgroups
- if (hasSubGroups)
- {
- startIndexHierarchy(ol,level+1);
- QListIterator<GroupDef> gli(*gd->groupList);
- GroupDef *subgd = 0;
- for (gli.toFirst();(subgd=gli.current());++gli)
- {
- writeGroupTreeNode(ol,subgd,level+1);
- }
- endIndexHierarchy(ol,level+1);
- }
-
-
- if (Config_getBool("TOC_EXPAND"))
- {
- // write members
- struct MemInfo
- {
- MemInfo(MemberList *l,const QCString &n) { list=l; name=n; }
- MemberList *list;
- QCString name;
- };
- MemInfo memberLists[] =
- {
- MemInfo(&gd->docDefineMembers, theTranslator->trDefines()),
- MemInfo(&gd->docTypedefMembers, theTranslator->trTypedefs()),
- MemInfo(&gd->docEnumMembers, theTranslator->trEnumerations()),
- MemInfo(&gd->docFuncMembers, theTranslator->trFunctions()),
- MemInfo(&gd->docVarMembers, theTranslator->trVariables()),
- MemInfo(&gd->docProtoMembers, theTranslator->trFuncProtos()),
- MemInfo(0,0)
- };
-
- MemberList *members;
- MemInfo *pMemInfo;
- for (pMemInfo=&memberLists[0]; (members=pMemInfo->list) ; pMemInfo++)
- {
- if (members->count()>0)
- {
- bool first=TRUE;
- MemberDef *md=members->first();
- while (md)
- {
- if (md->isDetailedSectionVisible(TRUE,FALSE))
- {
- if (first)
- {
- first=FALSE;
- if (htmlHelp)
- {
- htmlHelp->addContentsItem(TRUE, convertToHtml(pMemInfo->name), gd->getOutputFileBase(),0);
- htmlHelp->incContentsDepth();
- }
- if (ftvHelp)
- {
-
- ftvHelp->addContentsItem(TRUE, gd->getReference(), gd->getOutputFileBase(), 0, pMemInfo->name);
- ftvHelp->incContentsDepth();
- }
- }
- if (htmlHelp)
- {
- htmlHelp->addContentsItem(FALSE,md->name(),md->getOutputFileBase(),md->anchor());
- }
- if (ftvHelp)
- {
- ftvHelp->addContentsItem(FALSE,md->getReference(),md->getOutputFileBase(),md->anchor(),md->name());
- }
- }
- md=members->next();
- }
-
- if (htmlHelp && !first) htmlHelp->decContentsDepth();
- if (ftvHelp && !first) ftvHelp->decContentsDepth();
-
- }
- }
-
- // write namespaces
- NamespaceSDict *namespaceSDict=gd->namespaceSDict;
- if (namespaceSDict->count()>0)
- {
- if (htmlHelp)
- {
- htmlHelp->addContentsItem(TRUE, convertToHtml(theTranslator->trNamespaces()), gd->getOutputFileBase(), 0);
- htmlHelp->incContentsDepth();
- }
-
- if (ftvHelp)
- {
-
- ftvHelp->addContentsItem(TRUE, gd->getReference(), gd->getOutputFileBase(), 0, theTranslator->trNamespaces());
- ftvHelp->incContentsDepth();
- }
-
- NamespaceSDict::Iterator ni(*namespaceSDict);
- NamespaceDef *nsd;
- for (ni.toFirst();(nsd=ni.current());++ni)
- {
- if (htmlHelp)
- {
- htmlHelp->addContentsItem(FALSE, convertToHtml(nsd->name()), nsd->getOutputFileBase());
- }
- if (ftvHelp)
- {
- ftvHelp->addContentsItem(FALSE, nsd->getReference(), nsd->getOutputFileBase(), 0, convertToHtml(nsd->name()));
- }
- }
- if (htmlHelp) htmlHelp->decContentsDepth();
- if (ftvHelp) ftvHelp->decContentsDepth();
- }
-
- // write classes
- if (gd->classSDict->count()>0)
- {
- if (htmlHelp)
- {
- htmlHelp->addContentsItem(TRUE, convertToHtml(theTranslator->trClasses()), gd->getOutputFileBase(), 0);
- htmlHelp->incContentsDepth();
- }
-
- if (ftvHelp)
- {
-
- ftvHelp->addContentsItem(TRUE, gd->getReference(), gd->getOutputFileBase(), 0, theTranslator->trClasses());
- ftvHelp->incContentsDepth();
- }
-
- ClassDef *cd;
- ClassSDict::Iterator cdi(*gd->classSDict);
- for (cdi.toFirst();(cd=cdi.current());++cdi)
- {
- if (cd->isLinkable())
- {
- //printf("node: Has children %s\n",cd->name().data());
- if (htmlHelp)
- htmlHelp->addContentsItem(FALSE,cd->displayName(),cd->getOutputFileBase());
- if (ftvHelp)
- ftvHelp->addContentsItem(FALSE,cd->getReference(),cd->getOutputFileBase(),0,cd->displayName());
- }
- }
-
- //writeClassTree(gd->classSDict,1);
- if (htmlHelp) htmlHelp->decContentsDepth();
- if (ftvHelp) ftvHelp->decContentsDepth();
- }
-
- // write file list
- FileList *fileList=gd->fileList;
- if (fileList->count()>0)
- {
- if (htmlHelp)
- {
- htmlHelp->addContentsItem(TRUE,
- convertToHtml(theTranslator->trFile(TRUE,FALSE)),
- gd->getOutputFileBase(), 0);
- htmlHelp->incContentsDepth();
- }
-
- if (ftvHelp)
- {
-
- ftvHelp->addContentsItem(TRUE, gd->getReference(),
- gd->getOutputFileBase(), 0,
- theTranslator->trFile(TRUE,FALSE));
- ftvHelp->incContentsDepth();
- }
-
- FileDef *fd=fileList->first();
- while (fd)
- {
- if (htmlHelp)
- htmlHelp->addContentsItem(FALSE,convertToHtml(fd->name()),fd->getOutputFileBase());
- if (ftvHelp)
- ftvHelp->addContentsItem(FALSE, fd->getReference(), fd->getOutputFileBase(), 0, convertToHtml(fd->name()));
- fd=fileList->next();
- }
- if (htmlHelp)
- htmlHelp->decContentsDepth();
- if (ftvHelp)
- ftvHelp->decContentsDepth();
- }
-
- // write examples
- if (gd->exampleDict->count()>0)
- {
- if (htmlHelp)
- {
- htmlHelp->addContentsItem(TRUE, convertToHtml(theTranslator->trExamples()), gd->getOutputFileBase(), 0);
- htmlHelp->incContentsDepth();
- }
-
- if (ftvHelp)
- {
- ftvHelp->addContentsItem(TRUE, gd->getReference(), gd->getOutputFileBase(), 0, theTranslator->trExamples());
- ftvHelp->incContentsDepth();
- }
-
- PageSDict::Iterator eli(*(gd->exampleDict));
- PageDef *pd=eli.toFirst();
- while (pd)
- {
- if (htmlHelp)
- {
- htmlHelp->addContentsItem(FALSE,pd->getReference(),pd->getOutputFileBase());
- }
- if (ftvHelp)
- {
- ftvHelp->addContentsItem(FALSE,pd->getReference(),pd->getOutputFileBase(),0,pd->name());
- }
- pd=++eli;
- }
-
- if (htmlHelp) htmlHelp->decContentsDepth();
- if (ftvHelp) ftvHelp->decContentsDepth();
- }
- }
-
- if (htmlHelp) htmlHelp->decContentsDepth();
- if (ftvHelp) ftvHelp->decContentsDepth();
-
- //gd->visited=TRUE;
- }
-}
-
-void writeGroupHierarchy(OutputList &ol)
-{
- startIndexHierarchy(ol,0);
- GroupSDict::Iterator gli(Doxygen::groupSDict);
- GroupDef *gd;
- for (gli.toFirst();(gd=gli.current());++gli)
- {
- writeGroupTreeNode(ol,gd,0);
- }
- endIndexHierarchy(ol,0);
-}
-
-//----------------------------------------------------------------------------
-void writeDirTreeNode(OutputList &ol, DirDef *dd,int level)
-{
- HtmlHelp *htmlHelp=0;
- FTVHelp *ftvHelp = 0;
- if (level>20)
- {
- warn(dd->getDefFileName(),dd->getDefLine(),
- "Warning: maximum nesting level exceeded for directory %s: "
- "check for possible recursive directory relation!\n",dd->name().data()
- );
- return;
- }
- bool &generateHtml = Config_getBool("GENERATE_HTML") ;
- bool hasHtmlHelp = generateHtml && Config_getBool("GENERATE_HTMLHELP");
- bool hasFtvHelp = generateHtml && Config_getBool("GENERATE_TREEVIEW");
- if (hasHtmlHelp)
- {
- htmlHelp = HtmlHelp::getInstance();
- }
- if (hasFtvHelp)
- {
- ftvHelp = FTVHelp::getInstance();
- }
-
- bool isDir = TRUE;
- //printf("gd=`%s': pageDict=%d\n",gd->name().data(),gd->pageDict->count());
- if (htmlHelp)
- {
- htmlHelp->addContentsItem(isDir,dd->shortName(),dd->getOutputFileBase());
- htmlHelp->incContentsDepth();
- }
- if (ftvHelp)
- {
- ftvHelp->addContentsItem(isDir,dd->getReference(),dd->getOutputFileBase(),
- 0,dd->shortName());
- ftvHelp->incContentsDepth();
- }
-
- ol.writeIndexItem(dd->getReference(),dd->getOutputFileBase(),
- dd->shortName());
- if (dd->isReference())
- {
- ol.startTypewriter();
- ol.docify(" [external]");
- ol.endTypewriter();
- }
-
- // write subgroups
- if (dd->subDirs().count()>0)
- {
- startIndexHierarchy(ol,level+1);
- QListIterator<DirDef> dli(dd->subDirs());
- DirDef *subdd = 0;
- for (dli.toFirst();(subdd=dli.current());++dli)
- {
- writeDirTreeNode(ol,subdd,level+1);
- }
- endIndexHierarchy(ol,level+1);
- }
-
- if (Config_getBool("TOC_EXPAND"))
- {
- // write file list
- FileList *fileList=dd->getFiles();
- if (fileList && fileList->count()>0)
- {
- if (htmlHelp)
- {
- htmlHelp->addContentsItem(TRUE,
- convertToHtml(theTranslator->trFile(TRUE,FALSE)),
- dd->getOutputFileBase(), 0);
- htmlHelp->incContentsDepth();
- }
-
- if (ftvHelp)
- {
-
- ftvHelp->addContentsItem(TRUE, dd->getReference(),
- dd->getOutputFileBase(), 0,
- theTranslator->trFile(TRUE,FALSE));
- ftvHelp->incContentsDepth();
- }
-
- FileDef *fd=fileList->first();
- while (fd)
- {
- if (htmlHelp)
- htmlHelp->addContentsItem(FALSE,convertToHtml(fd->name()),fd->getOutputFileBase());
- if (ftvHelp)
- ftvHelp->addContentsItem(FALSE, fd->getReference(), fd->getOutputFileBase(), 0, convertToHtml(fd->name()));
- fd=fileList->next();
- }
- if (htmlHelp)
- htmlHelp->decContentsDepth();
- if (ftvHelp)
- ftvHelp->decContentsDepth();
- }
- }
-
- if (htmlHelp) htmlHelp->decContentsDepth();
- if (ftvHelp) ftvHelp->decContentsDepth();
-}
-
-void writeDirHierarchy(OutputList &ol)
-{
- startIndexHierarchy(ol,0);
- SDict<DirDef>::Iterator dli(Doxygen::directories);
- DirDef *dd;
- for (dli.toFirst();(dd=dli.current());++dli)
- {
- if (dd->getOuterScope()==Doxygen::globalScope) writeDirTreeNode(ol,dd,0);
- }
- endIndexHierarchy(ol,0);
-}
-
-//----------------------------------------------------------------------------
-
-void writeGroupIndex(OutputList &ol)
-{
- if (documentedGroups==0) return;
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
- startFile(ol,"modules",0,theTranslator->trModuleIndex().data(),HLI_Modules);
- startTitle(ol,0);
- QCString title = theTranslator->trModules();
- QCString htmlHelpTitle = title;
- QCString ftvHelpTitle = title;
- if (!Config_getString("PROJECT_NAME").isEmpty()) title.prepend(Config_getString("PROJECT_NAME")+" ");
- ol.parseText(title);
- endTitle(ol,0,0);
- ol.startTextBlock();
- HtmlHelp *htmlHelp = 0;
- FTVHelp *ftvHelp = 0;
- bool &generateHtml = Config_getBool("GENERATE_HTML") ;
- bool hasHtmlHelp = generateHtml && Config_getBool("GENERATE_HTMLHELP");
- bool hasFtvHelp = generateHtml && Config_getBool("GENERATE_TREEVIEW");
- if (hasHtmlHelp)
- {
- htmlHelp = HtmlHelp::getInstance();
- htmlHelp->addContentsItem(TRUE,htmlHelpTitle,"modules");
- htmlHelp->incContentsDepth();
- }
- if (hasFtvHelp)
- {
- ftvHelp = FTVHelp::getInstance();
- ftvHelp->addContentsItem(TRUE,0,"modules",0,ftvHelpTitle);
- ftvHelp->incContentsDepth();
- }
- ol.parseText(theTranslator->trModulesDescription());
- ol.endTextBlock();
- writeGroupHierarchy(ol);
- if (hasHtmlHelp)
- {
- htmlHelp->decContentsDepth();
- }
- if (hasFtvHelp)
- {
- ftvHelp->decContentsDepth();
- }
- endFile(ol);
- ol.popGeneratorState();
-}
-
-//----------------------------------------------------------------------------
-
-void writeDirIndex(OutputList &ol)
-{
- if (documentedDirs==0) return;
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
- startFile(ol,"dirs",0,theTranslator->trDirIndex().data(),HLI_Directories);
- startTitle(ol,0);
- QCString title = theTranslator->trDirectories();
- QCString htmlHelpTitle = title;
- QCString ftvHelpTitle = title;
- if (!Config_getString("PROJECT_NAME").isEmpty())
- {
- title.prepend(Config_getString("PROJECT_NAME")+" ");
- }
- ol.parseText(title);
- endTitle(ol,0,0);
- ol.startTextBlock();
- HtmlHelp *htmlHelp = 0;
- FTVHelp *ftvHelp = 0;
- bool &generateHtml = Config_getBool("GENERATE_HTML") ;
- bool hasHtmlHelp = generateHtml && Config_getBool("GENERATE_HTMLHELP");
- bool hasFtvHelp = generateHtml && Config_getBool("GENERATE_TREEVIEW");
- if (hasHtmlHelp)
- {
- htmlHelp = HtmlHelp::getInstance();
- htmlHelp->addContentsItem(TRUE,htmlHelpTitle,"dirs");
- htmlHelp->incContentsDepth();
- }
- if (hasFtvHelp)
- {
- ftvHelp = FTVHelp::getInstance();
- ftvHelp->addContentsItem(TRUE,0,"dirs",0,ftvHelpTitle);
- ftvHelp->incContentsDepth();
- }
- ol.parseText(theTranslator->trDirDescription());
- ol.endTextBlock();
-
- writeDirHierarchy(ol);
-
- if (hasHtmlHelp)
- {
- htmlHelp->decContentsDepth();
- }
- if (hasFtvHelp)
- {
- ftvHelp->decContentsDepth();
- }
- endFile(ol);
- ol.popGeneratorState();
-}
-
-//----------------------------------------------------------------------------
-
-static bool mainPageHasTitle()
-{
- if (Doxygen::mainPage==0) return FALSE;
- if (Doxygen::mainPage->title().isEmpty()) return FALSE;
- if (Doxygen::mainPage->title().lower()=="notitle") return FALSE;
- return TRUE;
-}
-
-//----------------------------------------------------------------------------
-
-void writeIndex(OutputList &ol)
-{
- // save old generator state
- ol.pushGeneratorState();
-
- QCString projPrefix;
- if (!Config_getString("PROJECT_NAME").isEmpty())
- {
- projPrefix=Config_getString("PROJECT_NAME")+" ";
- }
-
- //--------------------------------------------------------------------
- // write HTML index
- //--------------------------------------------------------------------
- ol.disableAllBut(OutputGenerator::Html);
-
- QCString defFileName =
- Doxygen::mainPage ? Doxygen::mainPage->getDefFileName().data() : "[generated]";
- int defLine =
- Doxygen::mainPage ? Doxygen::mainPage->getDefLine() : -1;
-
- QCString title;
- if (!mainPageHasTitle())
- {
- title = theTranslator->trMainPage();
- }
- else
- {
- title = substitute(Doxygen::mainPage->title(),"%","");
- }
-
- QCString indexName="index";
- if (Config_getBool("GENERATE_TREEVIEW")) indexName="main";
- ol.startFile(indexName,0,title);
-
- if (Doxygen::mainPage)
- {
- bool &generateHtml = Config_getBool("GENERATE_HTML") ;
- bool hasHtmlHelp = generateHtml && Config_getBool("GENERATE_HTMLHELP");
- bool hasFtvHelp = generateHtml && Config_getBool("GENERATE_TREEVIEW");
- if (hasHtmlHelp)
- {
- HtmlHelp::getInstance()->addContentsItem(Doxygen::mainPage->hasSubPages(),title,indexName);
- }
- if (hasFtvHelp)
- {
- FTVHelp::getInstance()->addContentsItem(Doxygen::mainPage->hasSubPages(),0,indexName,0,title);
- }
-
- if (Doxygen::mainPage->hasSubPages())
- {
- writeSubPages(Doxygen::mainPage);
- }
- }
-
- if (!Config_getBool("DISABLE_INDEX")) ol.writeQuickLinks(TRUE,HLI_Main);
- ol.startTitleHead(0);
- if (Doxygen::mainPage && !Doxygen::mainPage->title().isEmpty())
- {
- if (Doxygen::mainPage->title().lower()!="notitle")
- {
- ol.docify(Doxygen::mainPage->title());
- }
- }
- else
- {
- if (!Config_getString("PROJECT_NAME").isEmpty())
- {
- ol.parseText(projPrefix+theTranslator->trDocumentation());
- }
- }
- ol.endTitleHead(0,0);
- ol.newParagraph();
- if (!Config_getString("PROJECT_NUMBER").isEmpty())
- {
- ol.startProjectNumber();
- ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0,Config_getString("PROJECT_NUMBER"),TRUE,FALSE);
- ol.endProjectNumber();
- }
- if (Config_getBool("DISABLE_INDEX") && Doxygen::mainPage==0) ol.writeQuickLinks(FALSE,HLI_Main);
-
- if (Doxygen::mainPage)
- {
- Doxygen::insideMainPage=TRUE;
- ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0,
- Doxygen::mainPage->documentation(),TRUE,FALSE
- /*,Doxygen::mainPage->sectionDict*/);
-
- if (!Config_getString("GENERATE_TAGFILE").isEmpty())
- {
- Doxygen::tagFile << " <compound kind=\"page\">" << endl
- << " <name>"
- << convertToXML(Doxygen::mainPage->name())
- << "</name>" << endl
- << " <title>"
- << convertToXML(Doxygen::mainPage->title())
- << "</title>" << endl
- << " <filename>"
- << convertToXML(Doxygen::mainPage->getOutputFileBase())
- << "</filename>" << endl;
-
- Doxygen::mainPage->writeDocAnchorsToTagFile();
- Doxygen::tagFile << " </compound>" << endl;
- }
- Doxygen::insideMainPage=FALSE;
- }
-
- endFile(ol);
- ol.disable(OutputGenerator::Html);
-
- //--------------------------------------------------------------------
- // write LaTeX/RTF index
- //--------------------------------------------------------------------
- ol.enable(OutputGenerator::Latex);
- ol.enable(OutputGenerator::RTF);
-
- ol.startFile("refman",0,0);
- ol.startIndexSection(isTitlePageStart);
- if (!Config_getString("LATEX_HEADER").isEmpty())
- {
- ol.disable(OutputGenerator::Latex);
- }
-
- ol.parseText(projPrefix+theTranslator->trReferenceManual());
- if (!Config_getString("PROJECT_NUMBER").isEmpty())
- {
- ol.startProjectNumber();
- ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0,Config_getString("PROJECT_NUMBER"),FALSE,FALSE);
- ol.endProjectNumber();
- }
- ol.endIndexSection(isTitlePageStart);
- ol.startIndexSection(isTitlePageAuthor);
- ol.parseText(theTranslator->trGeneratedBy());
- ol.endIndexSection(isTitlePageAuthor);
- ol.enable(OutputGenerator::Latex);
-
- if (Doxygen::mainPage)
- {
- ol.startIndexSection(isMainPage);
- if (mainPageHasTitle())
- {
- ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0,Doxygen::mainPage->title(),FALSE,FALSE);
- }
- else
- {
- ol.parseText(projPrefix+theTranslator->trMainPage());
- }
- ol.endIndexSection(isMainPage);
- }
-
- if (!Config_getBool("LATEX_HIDE_INDICES"))
- {
- if (documentedGroups>0)
- {
- ol.startIndexSection(isModuleIndex);
- ol.parseText(projPrefix+theTranslator->trModuleIndex());
- ol.endIndexSection(isModuleIndex);
- }
- if (Config_getBool("SHOW_DIRECTORIES") && documentedDirs>0)
- {
- ol.startIndexSection(isDirIndex);
- ol.parseText(projPrefix+theTranslator->trDirIndex());
- ol.endIndexSection(isDirIndex);
- }
- if (documentedNamespaces>0)
- {
- ol.startIndexSection(isNamespaceIndex);
- ol.parseText(projPrefix+theTranslator->trNamespaceIndex());
- ol.endIndexSection(isNamespaceIndex);
- }
- if (hierarchyClasses>0)
- {
- ol.startIndexSection(isClassHierarchyIndex);
- ol.parseText(projPrefix+theTranslator->trHierarchicalIndex());
- ol.endIndexSection(isClassHierarchyIndex);
- }
- if (annotatedClasses>0)
- {
- ol.startIndexSection(isCompoundIndex);
- ol.parseText(projPrefix+theTranslator->trCompoundIndex());
- ol.endIndexSection(isCompoundIndex);
- }
- if (documentedFiles>0)
- {
- ol.startIndexSection(isFileIndex);
- ol.parseText(projPrefix+theTranslator->trFileIndex());
- ol.endIndexSection(isFileIndex);
- }
- if (indexedPages>0)
- {
- ol.startIndexSection(isPageIndex);
- ol.parseText(projPrefix+theTranslator->trPageIndex());
- ol.endIndexSection(isPageIndex);
- }
- }
- ol.lastIndexPage();
- if (documentedGroups>0)
- {
- ol.startIndexSection(isModuleDocumentation);
- ol.parseText(projPrefix+theTranslator->trModuleDocumentation());
- ol.endIndexSection(isModuleDocumentation);
- }
- if (Config_getBool("SHOW_DIRECTORIES") && documentedDirs>0)
- {
- ol.startIndexSection(isDirDocumentation);
- ol.parseText(projPrefix+theTranslator->trDirDocumentation());
- ol.endIndexSection(isDirDocumentation);
- }
- if (documentedNamespaces>0)
- {
- ol.startIndexSection(isNamespaceDocumentation);
- ol.parseText(projPrefix+theTranslator->trNamespaceDocumentation());
- ol.endIndexSection(isNamespaceDocumentation);
- }
- if (annotatedClasses>0)
- {
- ol.startIndexSection(isClassDocumentation);
- ol.parseText(projPrefix+theTranslator->trClassDocumentation());
- ol.endIndexSection(isClassDocumentation);
- }
- if (documentedFiles>0)
- {
- ol.startIndexSection(isFileDocumentation);
- ol.parseText(projPrefix+theTranslator->trFileDocumentation());
- ol.endIndexSection(isFileDocumentation);
- }
- if (Doxygen::exampleSDict->count()>0)
- {
- ol.startIndexSection(isExampleDocumentation);
- ol.parseText(projPrefix+theTranslator->trExampleDocumentation());
- ol.endIndexSection(isExampleDocumentation);
- }
- if (documentedPages>0)
- {
- ol.startIndexSection(isPageDocumentation);
- ol.parseText(projPrefix+theTranslator->trPageDocumentation());
- ol.endIndexSection(isPageDocumentation);
- }
- ol.endIndexSection(isEndIndex);
- endFile(ol);
-
- if (Doxygen::mainPage)
- {
- Doxygen::insideMainPage=TRUE;
- ol.disable(OutputGenerator::Man);
- startFile(ol,Doxygen::mainPage->name(),0,Doxygen::mainPage->title());
- ol.startTextBlock();
- ol.parseDoc(defFileName,defLine,Doxygen::mainPage,0,
- Doxygen::mainPage->documentation(),FALSE,FALSE
- /*,Doxygen::mainPage->sectionDict*/);
- ol.endTextBlock();
- endFile(ol);
- ol.enable(OutputGenerator::Man);
- Doxygen::insideMainPage=FALSE;
- }
-
- ol.popGeneratorState();
-}
-
-
-
diff --git a/src/index.h b/src/index.h
deleted file mode 100644
index 2b76a02..0000000
--- a/src/index.h
+++ /dev/null
@@ -1,165 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 INDEX_H
-#define INDEX_H
-
-#include "qtbc.h"
-#include <qfile.h>
-
-enum IndexSections
-{
- isTitlePageStart,
- isTitlePageAuthor,
- isMainPage,
- isModuleIndex,
- isDirIndex,
- isNamespaceIndex,
- isClassHierarchyIndex,
- isCompoundIndex,
- isFileIndex,
- isPageIndex,
- isModuleDocumentation,
- isDirDocumentation,
- isNamespaceDocumentation,
- isClassDocumentation,
- isFileDocumentation,
- isExampleDocumentation,
- isPageDocumentation,
- isEndIndex
-};
-
-class OutputList;
-
-void writeIndex(OutputList &ol);
-void writeHierarchicalIndex(OutputList &ol);
-void writeAlphabeticalIndex(OutputList &ol);
-void writeClassHierarchy(OutputList &ol);
-void writeAnnotatedIndex(OutputList &ol);
-void writeAnnotatedClassList(OutputList &ol);
-void writeMemberList(OutputList &ol,bool useSections);
-
-void writeSourceIndex(OutputList &ol);
-void writeHeaderIndex(OutputList &ol);
-void writeHeaderFileList(OutputList &ol);
-
-void writeExampleIndex(OutputList &ol);
-void writePageIndex(OutputList &ol);
-void writeFileIndex(OutputList &ol);
-void writeNamespaceIndex(OutputList &ol);
-void writeGroupIndex(OutputList &ol);
-void writeDirIndex(OutputList &ol);
-void writePackageIndex(OutputList &ol);
-
-void writeClassMemberIndex(OutputList &ol);
-void writeFileMemberIndex(OutputList &ol);
-void writeNamespaceMemberIndex(OutputList &ol);
-
-void writeGraphicalClassHierarchy(OutputList &ol);
-void writeGraphInfo(OutputList &ol);
-
-void countDataStructures();
-
-enum HighlightedItem
-{
- HLI_None=0,
- HLI_Main,
- HLI_Modules,
- HLI_Directories,
- HLI_Namespaces,
- HLI_Hierarchy,
- HLI_Classes,
- HLI_Annotated,
- HLI_Files,
- HLI_NamespaceMembers,
- HLI_Functions,
- HLI_Globals,
- HLI_Pages,
- HLI_Examples,
- HLI_Search
-};
-
-enum ClassMemberHighlight
-{
- CMHL_All = 0,
- CMHL_Functions,
- CMHL_Variables,
- CMHL_Typedefs,
- CMHL_Enums,
- CMHL_EnumValues,
- CMHL_Properties,
- CMHL_Events,
- CMHL_Related,
- CMHL_Total = CMHL_Related+1
-};
-
-enum FileMemberHighlight
-{
- FMHL_All = 0,
- FMHL_Functions,
- FMHL_Variables,
- FMHL_Typedefs,
- FMHL_Enums,
- FMHL_EnumValues,
- FMHL_Defines,
- FMHL_Total = FMHL_Defines+1
-};
-
-enum NamespaceMemberHighlight
-{
- NMHL_All = 0,
- NMHL_Functions,
- NMHL_Variables,
- NMHL_Typedefs,
- NMHL_Enums,
- NMHL_EnumValues,
- NMHL_Total = FMHL_EnumValues+1
-};
-
-enum ClassHighlight
-{
- CHL_All = 0,
- CHL_Classes,
- CHL_Structs,
- CHL_Unions,
- CHL_Interfaces,
- CHL_Protocols,
- CHL_Categories,
- CHL_Exceptions,
- CHL_Total = CHL_Exceptions+1
-};
-
-extern int annotatedClasses;
-extern int hierarchyClasses;
-extern int documentedFiles;
-extern int documentedGroups;
-extern int documentedNamespaces;
-extern int indexedPages;
-extern int documentedClassMembers[CMHL_Total];
-extern int documentedFileMembers[FMHL_Total];
-extern int documentedNamespaceMembers[NMHL_Total];
-extern int documentedHtmlFiles;
-extern int documentedPages;
-extern int documentedDirs;
-
-void startTitle(OutputList &ol,const char *fileName);
-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);
-void endFile(OutputList &ol,bool external=FALSE);
-
-#endif
diff --git a/src/index.xsd b/src/index.xsd
deleted file mode 100644
index d7ab2a9..0000000
--- a/src/index.xsd
+++ /dev/null
@@ -1,66 +0,0 @@
-<?xml version='1.0' encoding='utf-8' ?>
-<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- <xsd:element name="doxygenindex" type="DoxygenType"/>
-
- <xsd:complexType name="DoxygenType">
- <xsd:sequence>
- <xsd:element name="compound" type="CompoundType" minOccurs="0" maxOccurs="unbounded"/>
- </xsd:sequence>
- <xsd:attribute name="version" type="xsd:string" use="required"/>
- </xsd:complexType>
-
- <xsd:complexType name="CompoundType">
- <xsd:sequence>
- <xsd:element name="name" type="xsd:string"/>
- <xsd:element name="member" type="MemberType" minOccurs="0" maxOccurs="unbounded"/>
- </xsd:sequence>
- <xsd:attribute name="refid" type="xsd:string" use="required"/>
- <xsd:attribute name="kind" type="CompoundKind" use="required"/>
- </xsd:complexType>
-
- <xsd:complexType name="MemberType">
- <xsd:sequence>
- <xsd:element name="name" type="xsd:string"/>
- </xsd:sequence>
- <xsd:attribute name="refid" type="xsd:string" use="required"/>
- <xsd:attribute name="kind" type="MemberKind" use="required"/>
- </xsd:complexType>
-
- <xsd:simpleType name="CompoundKind">
- <xsd:restriction base="xsd:string">
- <xsd:enumeration value="class"/>
- <xsd:enumeration value="struct"/>
- <xsd:enumeration value="union"/>
- <xsd:enumeration value="interface"/>
- <xsd:enumeration value="protocol"/>
- <xsd:enumeration value="category"/>
- <xsd:enumeration value="exception"/>
- <xsd:enumeration value="file"/>
- <xsd:enumeration value="namespace"/>
- <xsd:enumeration value="group"/>
- <xsd:enumeration value="page"/>
- <xsd:enumeration value="example"/>
- <xsd:enumeration value="dir"/>
- </xsd:restriction>
- </xsd:simpleType>
-
- <xsd:simpleType name="MemberKind">
- <xsd:restriction base="xsd:string">
- <xsd:enumeration value="define"/>
- <xsd:enumeration value="property"/>
- <xsd:enumeration value="event"/>
- <xsd:enumeration value="variable"/>
- <xsd:enumeration value="typedef"/>
- <xsd:enumeration value="enum"/>
- <xsd:enumeration value="enumvalue"/>
- <xsd:enumeration value="function"/>
- <xsd:enumeration value="signal"/>
- <xsd:enumeration value="prototype"/>
- <xsd:enumeration value="friend"/>
- <xsd:enumeration value="dcop"/>
- <xsd:enumeration value="slot"/>
- </xsd:restriction>
- </xsd:simpleType>
-
-</xsd:schema>
-
diff --git a/src/index_xsd.h b/src/index_xsd.h
deleted file mode 100644
index 2f5d0c5..0000000
--- a/src/index_xsd.h
+++ /dev/null
@@ -1,66 +0,0 @@
-"<?xml version='1.0' encoding='utf-8' ?>\n"
-"<xsd:schema xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">\n"
-" <xsd:element name=\"doxygenindex\" type=\"DoxygenType\"/>\n"
-"\n"
-" <xsd:complexType name=\"DoxygenType\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"compound\" type=\"CompoundType\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n"
-" </xsd:sequence>\n"
-" <xsd:attribute name=\"version\" type=\"xsd:string\" use=\"required\"/>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"CompoundType\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"name\" type=\"xsd:string\"/>\n"
-" <xsd:element name=\"member\" type=\"MemberType\" minOccurs=\"0\" maxOccurs=\"unbounded\"/>\n"
-" </xsd:sequence>\n"
-" <xsd:attribute name=\"refid\" type=\"xsd:string\" use=\"required\"/>\n"
-" <xsd:attribute name=\"kind\" type=\"CompoundKind\" use=\"required\"/>\n"
-" </xsd:complexType>\n"
-"\n"
-" <xsd:complexType name=\"MemberType\">\n"
-" <xsd:sequence>\n"
-" <xsd:element name=\"name\" type=\"xsd:string\"/>\n"
-" </xsd:sequence>\n"
-" <xsd:attribute name=\"refid\" type=\"xsd:string\" use=\"required\"/>\n"
-" <xsd:attribute name=\"kind\" type=\"MemberKind\" use=\"required\"/>\n"
-" </xsd:complexType>\n"
-" \n"
-" <xsd:simpleType name=\"CompoundKind\">\n"
-" <xsd:restriction base=\"xsd:string\">\n"
-" <xsd:enumeration value=\"class\"/>\n"
-" <xsd:enumeration value=\"struct\"/>\n"
-" <xsd:enumeration value=\"union\"/>\n"
-" <xsd:enumeration value=\"interface\"/>\n"
-" <xsd:enumeration value=\"protocol\"/>\n"
-" <xsd:enumeration value=\"category\"/>\n"
-" <xsd:enumeration value=\"exception\"/>\n"
-" <xsd:enumeration value=\"file\"/>\n"
-" <xsd:enumeration value=\"namespace\"/>\n"
-" <xsd:enumeration value=\"group\"/>\n"
-" <xsd:enumeration value=\"page\"/>\n"
-" <xsd:enumeration value=\"example\"/>\n"
-" <xsd:enumeration value=\"dir\"/>\n"
-" </xsd:restriction>\n"
-" </xsd:simpleType>\n"
-"\n"
-" <xsd:simpleType name=\"MemberKind\">\n"
-" <xsd:restriction base=\"xsd:string\">\n"
-" <xsd:enumeration value=\"define\"/>\n"
-" <xsd:enumeration value=\"property\"/>\n"
-" <xsd:enumeration value=\"event\"/>\n"
-" <xsd:enumeration value=\"variable\"/>\n"
-" <xsd:enumeration value=\"typedef\"/>\n"
-" <xsd:enumeration value=\"enum\"/>\n"
-" <xsd:enumeration value=\"enumvalue\"/>\n"
-" <xsd:enumeration value=\"function\"/>\n"
-" <xsd:enumeration value=\"signal\"/>\n"
-" <xsd:enumeration value=\"prototype\"/>\n"
-" <xsd:enumeration value=\"friend\"/>\n"
-" <xsd:enumeration value=\"dcop\"/>\n"
-" <xsd:enumeration value=\"slot\"/>\n"
-" </xsd:restriction>\n"
-" </xsd:simpleType>\n"
-"\n"
-"</xsd:schema>\n"
-"\n"
diff --git a/src/instdox.cpp b/src/instdox.cpp
deleted file mode 100644
index 059236b..0000000
--- a/src/instdox.cpp
+++ /dev/null
@@ -1,186 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 <sys/types.h>
-#include <sys/stat.h>
-
-#include "qtbc.h"
-#include <qfile.h>
-#include <qfileinfo.h>
-#include <qtextstream.h>
-
-#include "instdox.h"
-#include "doxygen.h"
-#include "config.h"
-#include "message.h"
-
-void writeInstallScript()
-{
- QCString fileName=Config_getString("HTML_OUTPUT")+"/installdox";
- QFile f(fileName);
- if (f.open(IO_WriteOnly))
- {
- QTextStream t(&f);
- t << "#!" << Config_getString("PERL_PATH") << endl << endl << "%subst = ( ";
-
- char *s=Config_getList("TAGFILES").first();
- while (s)
- {
- QCString tagLine=s;
- QCString fileName;
- int eqPos = tagLine.find('=');
- if (eqPos!=-1) // strip destination part
- {
- fileName = tagLine.left(eqPos).stripWhiteSpace();
- }
- else
- {
- fileName = tagLine;
- }
- QFileInfo fi(fileName);
- t << "\"" << fi.fileName() << "\", \"\"";
- s=Config_getList("TAGFILES").next();
- if (s) t << ", ";
- }
-
- t << ");\n";
- t << "$quiet = 0;\n";
- t << "\n";
- t << "if (open(F,\"search.cfg\"))\n";
- t << "{\n";
- t << " $_=<F> ; s/[ \\t\\n]*$//g ; $subst{\"_doc\"} = $_;\n";
- t << " $_=<F> ; s/[ \\t\\n]*$//g ; $subst{\"_cgi\"} = $_;\n";
- t << "}\n";
- t << "\n";
- t << "while ( @ARGV ) {\n";
- t << " $_ = shift @ARGV;\n";
- t << " if ( s/^-// ) {\n";
- t << " if ( /^l(.*)/ ) {\n";
- t << " $v = ($1 eq \"\") ? shift @ARGV : $1;\n";
- t << " ($v =~ /\\/$/) || ($v .= \"/\");\n";
- t << " $_ = $v;\n";
- t << " if ( /(.+)\\@(.+)/ ) {\n";
- t << " if ( exists $subst{$1} ) {\n";
- t << " $subst{$1} = $2;\n";
- t << " } else {\n";
- t << " print STDERR \"Unknown tag file $1 given with option -l\\n\";\n";
- t << " &usage();\n";
- t << " }\n";
- t << " } else {\n";
- t << " print STDERR \"Argument $_ is invalid for option -l\\n\";\n";
- t << " &usage();\n";
- t << " }\n";
- t << " }\n";
- t << " elsif ( /^q/ ) {\n";
- t << " $quiet = 1;\n";
- t << " }\n";
- t << " elsif ( /^\\?|^h/ ) {\n";
- t << " &usage();\n";
- t << " }\n";
- t << " else {\n";
- t << " print STDERR \"Illegal option -$_\\n\";\n";
- t << " &usage();\n";
- t << " }\n";
- t << " }\n";
- t << " else {\n";
- t << " push (@files, $_ );\n";
- t << " }\n";
- t << "}\n";
- t << "\n";
- t << "foreach $sub (keys %subst)\n";
- t << "{\n";
- t << " if ( $subst{$sub} eq \"\" ) \n";
- t << " {\n";
- t << " print STDERR \"No substitute given for tag file `$sub'\\n\";\n";
- t << " &usage();\n";
- t << " }\n";
- t << " elsif ( ! $quiet && $sub ne \"_doc\" && $sub ne \"_cgi\" )\n";
- t << " {\n";
- t << " print \"Substituting $subst{$sub} for each occurence of tag file $sub\\n\"; \n";
- t << " }\n";
- t << "}\n";
- t << "\n";
- t << "if ( ! @files ) {\n";
- t << " if (opendir(D,\".\")) {\n";
- t << " foreach $file ( readdir(D) ) {\n";
- t << " $match = \"" << Config_getString("HTML_FILE_EXTENSION") << "\";\n";
- t << " next if ( $file =~ /^\\.\\.?$/ );\n";
- t << " ($file =~ /$match/) && (push @files, $file);\n";
- t << " ($file =~ \"tree.js\") && (push @files, $file);\n";
- t << " }\n";
- t << " closedir(D);\n";
- t << " }\n";
- t << "}\n";
- t << "\n";
- t << "if ( ! @files ) {\n";
- t << " print STDERR \"Warning: No input files given and none found!\\n\";\n";
- t << "}\n";
- t << "\n";
- t << "foreach $f (@files)\n";
- t << "{\n";
- t << " if ( ! $quiet ) {\n";
- t << " print \"Editing: $f...\\n\";\n";
- t << " }\n";
- t << " $oldf = $f;\n";
- t << " $f .= \".bak\";\n";
- t << " unless (rename $oldf,$f) {\n";
- t << " print STDERR \"Error: cannot rename file $oldf\\n\";\n";
- t << " exit 1;\n";
- t << " }\n";
- t << " if (open(F,\"<$f\")) {\n";
- t << " unless (open(G,\">$oldf\")) {\n";
- t << " print STDERR \"Error: opening file $oldf for writing\\n\";\n";
- t << " exit 1;\n";
- t << " }\n";
- t << " if ($oldf ne \"tree.js\") {\n";
- t << " while (<F>) {\n";
- t << " s/doxygen\\=\\\"([^ \\\"\\:\\t\\>\\<]*)\\:([^ \\\"\\t\\>\\<]*)\\\" (href|src)=\\\"\\2/doxygen\\=\\\"$1:$subst{$1}\\\" \\3=\\\"$subst{$1}/g;\n";
- t << " print G \"$_\";\n";
- t << " }\n";
- t << " }\n";
- t << " else {\n";
- t << " while (<F>) {\n";
- t << " s/\\\"([^ \\\"\\:\\t\\>\\<]*)\\:([^ \\\"\\t\\>\\<]*)\\\", \\\"\\2/\\\"$1:$subst{$1}\\\" ,\\\"$subst{$1}/g;\n";
- t << " print G \"$_\";\n";
- t << " }\n";
- t << " }\n";
- t << " } \n";
- t << " else {\n";
- t << " print STDERR \"Warning file $f does not exist\\n\";\n";
- t << " }\n";
- t << " unlink $f;\n";
- t << "}\n";
- t << "\n";
- t << "sub usage {\n";
- t << " print STDERR \"Usage: installdox [options] [html-file [html-file ...]]\\n\";\n";
- t << " print STDERR \"Options:\\n\";\n";
- t << " print STDERR \" -l tagfile\\@linkName tag file + URL or directory \\n\";\n";
- t << " print STDERR \" -q Quiet mode\\n\\n\";\n";
- t << " exit 1;\n";
- t << "}\n";
- }
- else
- {
- err("Error: Cannot open file %s for writing\n",fileName.data());
- }
- f.close();
- struct stat stat_struct;
- stat(fileName,&stat_struct);
-#if !defined(_WIN32)
- chmod(fileName,stat_struct.st_mode|S_IXUSR|S_IXGRP|S_IXOTH);
-#endif
-}
diff --git a/src/instdox.h b/src/instdox.h
deleted file mode 100644
index 0ad05d0..0000000
--- a/src/instdox.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 INSTDOX_H
-#define INSTDOX_H
-
-extern void writeInstallScript();
-
-#endif
diff --git a/src/lang_cfg.h b/src/lang_cfg.h
deleted file mode 100644
index d99d747..0000000
--- a/src/lang_cfg.h
+++ /dev/null
@@ -1,32 +0,0 @@
-#define LANG_NL
-#define LANG_SE
-#define LANG_CZ
-#define LANG_FR
-#define LANG_ID
-#define LANG_IT
-#define LANG_DE
-#define LANG_JP
-#define LANG_JE
-#define LANG_ES
-#define LANG_FI
-#define LANG_RU
-#define LANG_HR
-#define LANG_PL
-#define LANG_PT
-#define LANG_HU
-#define LANG_KR
-#define LANG_KE
-#define LANG_RO
-#define LANG_SI
-#define LANG_CN
-#define LANG_NO
-#define LANG_BR
-#define LANG_DK
-#define LANG_SK
-#define LANG_UA
-#define LANG_GR
-#define LANG_TW
-#define LANG_SR
-#define LANG_CA
-#define LANG_LT
-#define LANG_ZA
diff --git a/src/language.cpp b/src/language.cpp
deleted file mode 100644
index 7a80082..0000000
--- a/src/language.cpp
+++ /dev/null
@@ -1,351 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 "message.h"
-#include "language.h"
-#include "lang_cfg.h"
-#include "translator.h"
-#include "translator_en.h"
-#if !defined(ENGLISH_ONLY)
-#include "translator_adapter.h"
-#ifdef LANG_NL
-#include "translator_nl.h"
-#endif
-#ifdef LANG_SE
-#include "translator_se.h"
-#endif
-#ifdef LANG_CZ
-#include "translator_cz.h"
-#endif
-#ifdef LANG_FR
-#include "translator_fr.h"
-#endif
-#ifdef LANG_ID
-#include "translator_id.h"
-#endif
-#ifdef LANG_IT
-#include "translator_it.h"
-#endif
-#ifdef LANG_DE
-#include "translator_de.h"
-#endif
-#ifdef LANG_JP
-#include "translator_jp.h"
-#endif
-#ifdef LANG_JE
-#include "translator_je.h"
-#endif
-#ifdef LANG_ES
-#include "translator_es.h"
-#endif
-#ifdef LANG_FI
-//#include "translator_fi.h"
-#endif
-#ifdef LANG_RU
-#include "translator_ru.h"
-#endif
-#ifdef LANG_HR
-#include "translator_hr.h"
-#endif
-#ifdef LANG_PL
-#include "translator_pl.h"
-#endif
-#ifdef LANG_PT
-#include "translator_pt.h"
-#endif
-#ifdef LANG_HU
-#include "translator_hu.h"
-#endif
-#ifdef LANG_KE
-#include "translator_ke.h"
-#endif
-#ifdef LANG_KR
-#include "translator_kr.h"
-#endif
-#ifdef LANG_RO
-#include "translator_ro.h"
-#endif
-#ifdef LANG_SI
-#include "translator_si.h"
-#endif
-#ifdef LANG_CN
-#include "translator_cn.h"
-#endif
-#ifdef LANG_TW
-#include "translator_tw.h"
-#endif
-#ifdef LANG_NO
-#include "translator_no.h"
-#endif
-#ifdef LANG_BR
-#include "translator_br.h"
-#endif
-#ifdef LANG_DK
-#include "translator_dk.h"
-#endif
-#ifdef LANG_SK
-#include "translator_sk.h"
-#endif
-#ifdef LANG_UA
-#include "translator_ua.h"
-#endif
-#ifdef LANG_GR
-#include "translator_gr.h"
-#endif
-#ifdef LANG_SR
-#include "translator_sr.h"
-#endif
-#ifdef LANG_CA
-#include "translator_ca.h"
-#endif
-//#ifdef LANG_JS
-//#include "translator_js.h"
-//#endif
-#ifdef LANG_LT
-#include "translator_lt.h"
-#endif
-#ifdef LANG_ZA
-#include "translator_za.h"
-#endif
-#endif
-
-#define L_EQUAL(a) !stricmp(langName,a)
-
-Translator *theTranslator=0;
-
-static const char obsoleteMsg[] =
- "---------\n"
- "ERROR: The selected language is no longer supported!\n"
- "If you want doxygen to produce output in this language \n"
- "you are kindly requested to help bringing the documentation \n"
- "up to date. Please read the development section of the manual \n"
- "for more information or contact Petr Prikryl (Prikryl@skil.cz).\n"
- "Thanks in advance!\n"
- "---------\n";
-
-bool setTranslator(const char *langName)
-{
- if (L_EQUAL("english"))
- {
- theTranslator=new TranslatorEnglish;
- }
-#if !defined(ENGLISH_ONLY)
-#ifdef LANG_NL
- else if (L_EQUAL("dutch"))
- {
- theTranslator=new TranslatorDutch;
- }
-#endif
-#ifdef LANG_SE
- else if (L_EQUAL("swedish"))
- {
- theTranslator=new TranslatorSwedish;
- }
-#endif
-#ifdef LANG_CZ
- else if (L_EQUAL("czech"))
- {
- theTranslator=new TranslatorCzech;
- }
-#endif
-#ifdef LANG_FR
- else if (L_EQUAL("french"))
- {
- theTranslator=new TranslatorFrench;
- }
-#endif
-#ifdef LANG_ID
- else if (L_EQUAL("indonesian"))
- {
- theTranslator=new TranslatorIndonesian;
- }
-#endif
-#ifdef LANG_IT
- else if (L_EQUAL("italian"))
- {
- theTranslator=new TranslatorItalian;
- }
-#endif
-#ifdef LANG_DE
- else if (L_EQUAL("german"))
- {
- theTranslator=new TranslatorGerman;
- }
-#endif
-#ifdef LANG_JP
- else if (L_EQUAL("japanese"))
- {
- theTranslator=new TranslatorJapanese;
- }
-#endif
-#ifdef LANG_JE
- else if (L_EQUAL("japanese-en"))
- {
- theTranslator=new TranslatorJapaneseEn;
- }
-#endif
-#ifdef LANG_ES
- else if (L_EQUAL("spanish"))
- {
- theTranslator=new TranslatorSpanish;
- }
-#endif
-#ifdef LANG_FI
- else if (L_EQUAL("finnish"))
- {
- //theTranslator=new TranslatorFinnish;
- theTranslator=new TranslatorEnglish;
- err(obsoleteMsg);
- }
-#endif
-#ifdef LANG_RU
- else if (L_EQUAL("russian"))
- {
- theTranslator=new TranslatorRussian;
- }
-#endif
-#ifdef LANG_HR
- else if (L_EQUAL("croatian"))
- {
- theTranslator=new TranslatorCroatian;
- }
-#endif
-#ifdef LANG_PL
- else if (L_EQUAL("polish"))
- {
- theTranslator=new TranslatorPolish;
- }
-#endif
-#ifdef LANG_PT
- else if (L_EQUAL("portuguese"))
- {
- theTranslator=new TranslatorPortuguese;
- }
-#endif
-#ifdef LANG_HU
- else if (L_EQUAL("hungarian"))
- {
- theTranslator=new TranslatorHungarian;
- }
-#endif
-#ifdef LANG_KR
- else if (L_EQUAL("korean"))
- {
- theTranslator=new TranslatorKorean;
- }
-#endif
-#ifdef LANG_KE
- else if (L_EQUAL("korean-en"))
- {
- theTranslator=new TranslatorKoreanEn;
- }
-#endif
-#ifdef LANG_RO
- else if (L_EQUAL("romanian"))
- {
- theTranslator=new TranslatorRomanian;
- }
-#endif
-#ifdef LANG_SI
- else if (L_EQUAL("slovene"))
- {
- theTranslator=new TranslatorSlovene;
- }
-#endif
-#ifdef LANG_CN
- else if (L_EQUAL("chinese"))
- {
- theTranslator=new TranslatorChinese;
- }
-#endif
-#ifdef LANG_TW
- else if (L_EQUAL("chinese-traditional"))
- {
- theTranslator=new TranslatorChinesetraditional;
- }
-#endif
-#ifdef LANG_NO
- else if (L_EQUAL("norwegian"))
- {
- theTranslator=new TranslatorNorwegian;
- }
-#endif
-#ifdef LANG_BR
- else if (L_EQUAL("brazilian"))
- {
- theTranslator=new TranslatorBrazilian;
- }
-#endif
-#ifdef LANG_DK
- else if (L_EQUAL("danish"))
- {
- theTranslator=new TranslatorDanish;
- }
-#endif
-#ifdef LANG_SK
- else if (L_EQUAL("slovak"))
- {
- theTranslator=new TranslatorSlovak;
- }
-#endif
-#ifdef LANG_UA
- else if (L_EQUAL("ukrainian"))
- {
- theTranslator=new TranslatorUkrainian;
- }
-#endif
-#ifdef LANG_GR
- else if (L_EQUAL("greek"))
- {
- theTranslator=new TranslatorGreek;
- }
-#endif
-#ifdef LANG_SR
- else if (L_EQUAL("serbian"))
- {
- theTranslator=new TranslatorSerbian;
- }
-#endif
-#ifdef LANG_CA
- else if (L_EQUAL("catalan"))
- {
- theTranslator=new TranslatorCatalan;
- }
-#endif
-#ifdef LANG_LT
- else if (L_EQUAL("lithuanian"))
- {
- theTranslator=new TranslatorLithuanian;
- }
-#endif
-#ifdef LANG_ZA
- else if (L_EQUAL("afrikaans"))
- {
- theTranslator=new TranslatorAfrikaans;
- }
-#endif
-#endif // ENGLISH_ONLY
- else // use the default language (i.e. english)
- {
- theTranslator=new TranslatorEnglish;
- return FALSE;
- }
-
- QCString msg = theTranslator->updateNeededMessage();
- if (!msg.isEmpty()) warn_cont(msg);
- return TRUE;
-}
diff --git a/src/language.h b/src/language.h
deleted file mode 100644
index 3319a62..0000000
--- a/src/language.h
+++ /dev/null
@@ -1,26 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 LANGUAGE_H
-#define LANGUAGE_H
-
-#include "translator.h"
-
-extern Translator *theTranslator;
-extern bool setTranslator(const char *languageName);
-
-#endif
diff --git a/src/latexdocvisitor.cpp b/src/latexdocvisitor.cpp
deleted file mode 100644
index c8a172c..0000000
--- a/src/latexdocvisitor.cpp
+++ /dev/null
@@ -1,1115 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 <qfileinfo.h>
-#include "latexdocvisitor.h"
-#include "docparser.h"
-#include "language.h"
-#include "doxygen.h"
-#include "outputgen.h"
-#include "dot.h"
-#include "util.h"
-#include "message.h"
-#include "parserintf.h"
-
-static QString escapeLabelName(const char *s)
-{
- QString result;
- const char *p=s;
- char c;
- while ((c=*p++))
- {
- switch (c)
- {
- case '%': result+="\\%"; break;
- case '|': result+="\\texttt{\"|}"; break;
- case '!': result+="\"!"; break;
- default: result+=c;
- }
- }
- return result;
-}
-
-const int maxLevels=5;
-static const char *secLabels[maxLevels] =
- { "section","subsection","subsubsection","paragraph","subparagraph" };
-
-static const char *getSectionName(int level)
-{
- int l = level;
- if (Config_getBool("COMPACT_LATEX")) l++;
- if (Doxygen::insideMainPage) l--;
- return secLabels[QMIN(maxLevels-1,l)];
-}
-
-QString LatexDocVisitor::escapeMakeIndexChars(const char *s)
-{
- QString result;
- const char *p=s;
- char str[2]; str[1]=0;
- char c;
- while ((c=*p++))
- {
- switch (c)
- {
- case '!': m_t << "\"!"; break;
- case '"': m_t << "\"\""; break;
- case '@': m_t << "\"@"; break;
- case '|': m_t << "\\texttt{\"|}"; break;
- case '[': m_t << "["; break;
- case ']': m_t << "]"; break;
- default: str[0]=c; filter(str); break;
- }
- }
- return result;
-}
-
-
-LatexDocVisitor::LatexDocVisitor(QTextStream &t,CodeOutputInterface &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_insideTabbing(insideTabbing),
- m_langExt(langExt)
-{
-}
-
- //--------------------------------------
- // visitor functions for leaf nodes
- //--------------------------------------
-
-void LatexDocVisitor::visit(DocWord *w)
-{
- if (m_hide) return;
- filter(w->word());
-}
-
-void LatexDocVisitor::visit(DocLinkedWord *w)
-{
- if (m_hide) return;
- startLink(w->ref(),w->file(),w->anchor());
- filter(w->word());
- endLink(w->ref(),w->file(),w->anchor());
-}
-
-void LatexDocVisitor::visit(DocWhiteSpace *w)
-{
- if (m_hide) return;
- if (m_insidePre)
- {
- m_t << w->chars();
- }
- else
- {
- m_t << " ";
- }
-}
-
-void LatexDocVisitor::visit(DocSymbol *s)
-{
- if (m_hide) return;
- switch(s->symbol())
- {
- case DocSymbol::BSlash: m_t << "$\\backslash$"; break;
- case DocSymbol::At: m_t << "@"; break;
- case DocSymbol::Less: if (m_insidePre) m_t << "<"; else m_t << "$<$";
- break;
- case DocSymbol::Greater: if (m_insidePre) m_t << ">"; else m_t << "$>$"; break;
- case DocSymbol::Amp: m_t << "\\&"; break;
- case DocSymbol::Dollar: m_t << "\\$"; break;
- case DocSymbol::Hash: m_t << "\\#"; break;
- case DocSymbol::Percent: m_t << "\\%"; break;
- case DocSymbol::Copy: m_t << "\\copyright"; break;
- case DocSymbol::Tm: m_t << "\\texttrademark"; break;
- case DocSymbol::Reg: m_t << "\\textregistered"; break;
- case DocSymbol::Apos: m_t << "'"; break;
- case DocSymbol::Quot: m_t << "''"; break;
- case DocSymbol::Uml:
- if (s->letter()=='i')
- m_t << "\\\"{\\i}";
- else
- m_t << "\\\"{" << s->letter() << "}";
- break;
- case DocSymbol::Acute:
- if (s->letter()=='i')
- m_t << "\\'{\\i}";
- else
- m_t << "\\'{" << s->letter() << "}";
- break;
- case DocSymbol::Grave:
- if (s->letter()=='i')
- m_t << "\\`{\\i}";
- else
- m_t << "\\`{" << s->letter() << "}";
- break;
- case DocSymbol::Circ:
- if (s->letter()=='i')
- m_t << "\\^{\\i}";
- else
- m_t << "\\^{" << s->letter() << "}";
- break;
- case DocSymbol::Slash: if (tolower(s->letter())=='o')
- m_t << "\\" << s->letter();
- else
- m_t << s->letter();
- break;
- case DocSymbol::Tilde: m_t << "\\~{" << s->letter() << "}"; break;
- case DocSymbol::Szlig: m_t << "\"s"; break;
- case DocSymbol::Cedil: m_t << "\\c{" << s->letter() << "}"; break;
- case DocSymbol::Ring: m_t << "\\" << s->letter() << s->letter(); break;
- case DocSymbol::Nbsp: m_t << "~"; break;
- default:
- err("Error: unknown symbol found\n");
- }
-}
-
-void LatexDocVisitor::visit(DocURL *u)
-{
- if (m_hide) return;
- if (Config_getBool("PDF_HYPERLINKS"))
- {
- m_t << "\\href{";
- if (u->isEmail()) m_t << "mailto:";
- m_t << u->url() << "}";
- }
- m_t << "{\\tt ";
- filter(u->url());
- m_t << "}";
-}
-
-void LatexDocVisitor::visit(DocLineBreak *)
-{
- if (m_hide) return;
- m_t << "\\par\n";
-}
-
-void LatexDocVisitor::visit(DocHorRuler *)
-{
- if (m_hide) return;
- m_t << "\n\n";
-}
-
-void LatexDocVisitor::visit(DocStyleChange *s)
-{
- if (m_hide) return;
- switch (s->style())
- {
- case DocStyleChange::Bold:
- if (s->enable()) m_t << "{\\bf "; else m_t << "}";
- break;
- case DocStyleChange::Italic:
- if (s->enable()) m_t << "{\\em "; else m_t << "\\/}";
- break;
- case DocStyleChange::Code:
- if (s->enable()) m_t << "{\\tt "; else m_t << "}";
- break;
- case DocStyleChange::Subscript:
- if (s->enable()) m_t << "$_{\\mbox{"; else m_t << "}}$ ";
- break;
- case DocStyleChange::Superscript:
- if (s->enable()) m_t << "$^{\\mbox{"; else m_t << "}}$ ";
- break;
- case DocStyleChange::Center:
- if (s->enable()) m_t << "\\begin{center}"; else m_t << "\\end{center} ";
- break;
- case DocStyleChange::Small:
- if (s->enable()) m_t << "\\footnotesize "; else m_t << "\\normalsize ";
- break;
- case DocStyleChange::Preformatted:
- if (s->enable())
- {
- m_t << "\\small\\begin{alltt}";
- m_insidePre=TRUE;
- }
- else
- {
- m_insidePre=FALSE;
- m_t << "\\end{alltt}\\normalsize " << endl;
- }
- break;
- case DocStyleChange::Div: /* HTML only */ break;
- case DocStyleChange::Span: /* HTML only */ break;
- }
-}
-
-void LatexDocVisitor::visit(DocVerbatim *s)
-{
- if (m_hide) return;
- switch(s->type())
- {
- case DocVerbatim::Code:
- m_t << "\n\n\\footnotesize\\begin{verbatim}";
- Doxygen::parserManager->getParser(m_langExt)
- ->parseCode(m_ci,s->context(),s->text().latin1(),
- s->isExample(),s->exampleFile());
- m_t << "\\end{verbatim}\n\\normalsize" << endl;
- break;
- case DocVerbatim::Verbatim:
- m_t << "\n\n\\footnotesize\\begin{verbatim}";
- m_t << s->text();
- m_t << "\\end{verbatim}\n\\normalsize" << endl;
- break;
- case DocVerbatim::HtmlOnly:
- case DocVerbatim::XmlOnly:
- case DocVerbatim::ManOnly:
- /* nothing */
- break;
- case DocVerbatim::LatexOnly:
- m_t << s->text();
- break;
- case DocVerbatim::Dot:
- {
- static int dotindex = 1;
- QCString fileName(4096);
-
- fileName.sprintf("%s%d",
- (Config_getString("LATEX_OUTPUT")+"/inline_dotgraph_").data(),
- dotindex++
- );
- QFile file(fileName);
- if (!file.open(IO_WriteOnly))
- {
- err("Could not open file %s for writing\n",fileName.data());
- }
- file.writeBlock( s->text(), s->text().length() );
- file.close();
-
- m_t << "\\begin{center}\n";
- startDotFile(fileName,"","",FALSE);
- endDotFile(FALSE);
- m_t << "\\end{center}\n";
-
- file.remove();
- }
- break;
- }
-}
-
-void LatexDocVisitor::visit(DocAnchor *anc)
-{
- if (m_hide) return;
- m_t << "\\label{" << anc->file() << "_" << anc->anchor() << "}" << endl;
- if (!anc->file().isEmpty() && Config_getBool("PDF_HYPERLINKS"))
- {
- m_t << "\\hypertarget{" << anc->file() << "_" << anc->anchor()
- << "}{}" << endl;
- }
-}
-
-void LatexDocVisitor::visit(DocInclude *inc)
-{
- if (m_hide) return;
- switch(inc->type())
- {
- case DocInclude::IncWithLines:
- {
- m_t << "\n\n\\footnotesize\\begin{verbatim}";
- QFileInfo cfi( inc->file() );
- FileDef fd( cfi.dirPath(), cfi.fileName() );
- Doxygen::parserManager->getParser(inc->extension())
- ->parseCode(m_ci,inc->context(),
- inc->text().latin1(),
- inc->isExample(),
- inc->exampleFile(), &fd);
- m_t << "\\end{verbatim}\n\\normalsize" << endl;
- }
- break;
- case DocInclude::Include:
- m_t << "\n\n\\footnotesize\\begin{verbatim}";
- Doxygen::parserManager->getParser(inc->extension())
- ->parseCode(m_ci,inc->context(),
- inc->text().latin1(),inc->isExample(),
- inc->exampleFile());
- m_t << "\\end{verbatim}\n\\normalsize" << endl;
- break;
- case DocInclude::DontInclude:
- break;
- case DocInclude::HtmlInclude:
- break;
- case DocInclude::VerbInclude:
- m_t << "\n\n\\footnotesize\\begin{verbatim}";
- m_t << inc->text();
- m_t << "\\end{verbatim}\n\\normalsize" << endl;
- break;
- }
-}
-
-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 (!m_hide) m_t << "\n\n\\footnotesize\\begin{verbatim}";
- pushEnabled();
- m_hide = TRUE;
- }
- if (op->type()!=DocIncOperator::Skip)
- {
- popEnabled();
- if (!m_hide)
- {
- Doxygen::parserManager->getParser(m_langExt)
- ->parseCode(m_ci,op->context(),op->text().latin1(),
- op->isExample(),op->exampleFile());
- }
- pushEnabled();
- m_hide=TRUE;
- }
- if (op->isLast())
- {
- popEnabled();
- if (!m_hide) m_t << "\\end{verbatim}\n\\normalsize" << endl;
- }
- else
- {
- if (!m_hide) m_t << endl;
- }
-}
-
-void LatexDocVisitor::visit(DocFormula *f)
-{
- if (m_hide) return;
- m_t << f->text();
-}
-
-void LatexDocVisitor::visit(DocIndexEntry *i)
-{
- if (m_hide) return;
- m_t << "\\index{" << escapeLabelName(i->entry()) << "@{";
- escapeMakeIndexChars(i->entry());
- m_t << "}}";
-}
-
-//--------------------------------------
-// visitor functions for compound nodes
-//--------------------------------------
-
-void LatexDocVisitor::visitPre(DocAutoList *l)
-{
- if (m_hide) return;
- if (l->isEnumList())
- {
- m_t << "\\begin{enumerate}" << endl;
- }
- else
- {
- m_t << "\\begin{itemize}" << endl;
- }
-}
-
-void LatexDocVisitor::visitPost(DocAutoList *l)
-{
- if (m_hide) return;
- if (l->isEnumList())
- {
- m_t << "\\end{enumerate}" << endl;
- }
- else
- {
- m_t << "\\end{itemize}" << endl;
- }
-}
-
-void LatexDocVisitor::visitPre(DocAutoListItem *)
-{
- if (m_hide) return;
- m_t << "\\item ";
-}
-
-void LatexDocVisitor::visitPost(DocAutoListItem *)
-{
-}
-
-void LatexDocVisitor::visitPre(DocPara *)
-{
-}
-
-void LatexDocVisitor::visitPost(DocPara *p)
-{
- if (m_hide) return;
- if (!p->isLast() && // omit <p> for last paragraph
- !(p->parent() && // and for parameter sections
- p->parent()->kind()==DocNode::Kind_ParamSect
- )
- ) m_t << endl << endl;
-}
-
-void LatexDocVisitor::visitPre(DocRoot *)
-{
-}
-
-void LatexDocVisitor::visitPost(DocRoot *)
-{
-}
-
-void LatexDocVisitor::visitPre(DocSimpleSect *s)
-{
- if (m_hide) return;
- m_t << "\\begin{Desc}\n\\item[";
- switch(s->type())
- {
- case DocSimpleSect::See:
- filter(theTranslator->trSeeAlso()); break;
- case DocSimpleSect::Return:
- filter(theTranslator->trReturns()); break;
- case DocSimpleSect::Author:
- filter(theTranslator->trAuthor(TRUE,TRUE)); break;
- case DocSimpleSect::Authors:
- filter(theTranslator->trAuthor(TRUE,FALSE)); break;
- case DocSimpleSect::Version:
- filter(theTranslator->trVersion()); break;
- case DocSimpleSect::Since:
- filter(theTranslator->trSince()); break;
- case DocSimpleSect::Date:
- filter(theTranslator->trDate()); break;
- case DocSimpleSect::Note:
- filter(theTranslator->trNote()); break;
- case DocSimpleSect::Warning:
- filter(theTranslator->trWarning()); break;
- case DocSimpleSect::Pre:
- filter(theTranslator->trPrecondition()); break;
- case DocSimpleSect::Post:
- filter(theTranslator->trPostcondition()); break;
- case DocSimpleSect::Invar:
- filter(theTranslator->trInvariant()); break;
- case DocSimpleSect::Remark:
- filter(theTranslator->trRemarks()); break;
- case DocSimpleSect::Attention:
- filter(theTranslator->trAttention()); break;
- case DocSimpleSect::User: break;
- case DocSimpleSect::Rcs: break;
- case DocSimpleSect::Unknown: break;
- }
-
- // special case 1: user defined title
- if (s->type()!=DocSimpleSect::User && s->type()!=DocSimpleSect::Rcs)
- {
- m_t << ":]";
- }
- else
- {
- m_insideItem=TRUE;
- }
-}
-
-void LatexDocVisitor::visitPost(DocSimpleSect *)
-{
- if (m_hide) return;
- m_t << "\\end{Desc}" << endl;
-}
-
-void LatexDocVisitor::visitPre(DocTitle *)
-{
-}
-
-void LatexDocVisitor::visitPost(DocTitle *)
-{
- if (m_hide) return;
- m_insideItem=FALSE;
- m_t << "]";
-}
-
-void LatexDocVisitor::visitPre(DocSimpleList *)
-{
- if (m_hide) return;
- m_t << "\\begin{itemize}" << endl;
-}
-
-void LatexDocVisitor::visitPost(DocSimpleList *)
-{
- if (m_hide) return;
- m_t << "\\end{itemize}" << endl;
-}
-
-void LatexDocVisitor::visitPre(DocSimpleListItem *)
-{
- if (m_hide) return;
- m_t << "\\item ";
-}
-
-void LatexDocVisitor::visitPost(DocSimpleListItem *)
-{
-}
-
-void LatexDocVisitor::visitPre(DocSection *s)
-{
- if (m_hide) return;
- if (Config_getBool("PDF_HYPERLINKS"))
- {
- m_t << "\\hypertarget{" << s->file() << "_" << s->anchor() << "}{}";
- }
- m_t << "\\" << getSectionName(s->level()) << "{";
- filter(s->title());
- m_t << "}\\label{" << s->file() << "_" << s->anchor() << "}" << endl;
-}
-
-void LatexDocVisitor::visitPost(DocSection *)
-{
-}
-
-void LatexDocVisitor::visitPre(DocHtmlList *s)
-{
- if (m_hide) return;
- if (s->type()==DocHtmlList::Ordered)
- m_t << "\\begin{enumerate}" << endl;
- else
- m_t << "\\begin{itemize}" << endl;
-}
-
-void LatexDocVisitor::visitPost(DocHtmlList *s)
-{
- if (m_hide) return;
- if (s->type()==DocHtmlList::Ordered)
- m_t << "\\end{enumerate}" << endl;
- else
- m_t << "\\end{itemize}" << endl;
-}
-
-void LatexDocVisitor::visitPre(DocHtmlListItem *)
-{
- if (m_hide) return;
- m_t << "\\item ";
-}
-
-void LatexDocVisitor::visitPost(DocHtmlListItem *)
-{
-}
-
-//void LatexDocVisitor::visitPre(DocHtmlPre *)
-//{
-// m_t << "\\small\\begin{alltt}";
-// m_insidePre=TRUE;
-//}
-
-//void LatexDocVisitor::visitPost(DocHtmlPre *)
-//{
-// m_insidePre=FALSE;
-// m_t << "\\end{alltt}\\normalsize " << endl;
-//}
-
-void LatexDocVisitor::visitPre(DocHtmlDescList *)
-{
- if (m_hide) return;
- m_t << "\\begin{description}" << endl;
-}
-
-void LatexDocVisitor::visitPost(DocHtmlDescList *)
-{
- if (m_hide) return;
- m_t << "\\end{description}" << endl;
-}
-
-void LatexDocVisitor::visitPre(DocHtmlDescTitle *)
-{
- if (m_hide) return;
- m_t << "\\item[";
- m_insideItem=TRUE;
-}
-
-void LatexDocVisitor::visitPost(DocHtmlDescTitle *)
-{
- if (m_hide) return;
- m_insideItem=FALSE;
- m_t << "]";
-}
-
-void LatexDocVisitor::visitPre(DocHtmlDescData *)
-{
-}
-
-void LatexDocVisitor::visitPost(DocHtmlDescData *)
-{
-}
-
-void LatexDocVisitor::visitPre(DocHtmlTable *t)
-{
- if (m_hide) return;
- if (t->hasCaption())
- {
- m_t << "\\begin{table}[h]";
- }
- m_t << "\\begin{TabularC}{" << t->numCols() << "}\n\\hline\n";
-}
-
-void LatexDocVisitor::visitPost(DocHtmlTable *t)
-{
- if (m_hide) return;
- if (t->hasCaption())
- {
- m_t << "\\end{table}\n";
- }
- else
- {
- m_t << "\\end{TabularC}\n";
- }
-}
-
-void LatexDocVisitor::visitPre(DocHtmlCaption *)
-{
- if (m_hide) return;
- m_t << "\\end{TabularC}\n\\centering\n\\caption{";
-}
-
-void LatexDocVisitor::visitPost(DocHtmlCaption *)
-{
- if (m_hide) return;
- m_t << "}\n";
-}
-
-void LatexDocVisitor::visitPre(DocHtmlRow *)
-{
-}
-
-void LatexDocVisitor::visitPost(DocHtmlRow *)
-{
- if (m_hide) return;
- m_t << "\\\\\\hline\n";
-}
-
-void LatexDocVisitor::visitPre(DocHtmlCell *)
-{
-}
-
-void LatexDocVisitor::visitPost(DocHtmlCell *c)
-{
- if (m_hide) return;
- if (!c->isLast()) m_t << "&";
-}
-
-void LatexDocVisitor::visitPre(DocInternal *)
-{
- if (m_hide) return;
- m_t << "\\begin{Desc}" << endl
- << "\\item["; filter(theTranslator->trForInternalUseOnly()); m_t << "]" << endl;
-}
-
-void LatexDocVisitor::visitPost(DocInternal *)
-{
- if (m_hide) return;
- m_t << "\\end{Desc}" << endl;
-}
-
-void LatexDocVisitor::visitPre(DocHRef *href)
-{
- if (m_hide) return;
- if (Config_getBool("PDF_HYPERLINKS"))
- {
- m_t << "\\href{";
- m_t << href->url();
- m_t << "}";
- }
- m_t << "{\\tt ";
-}
-
-void LatexDocVisitor::visitPost(DocHRef *)
-{
- if (m_hide) return;
- m_t << "}";
-}
-
-void LatexDocVisitor::visitPre(DocHtmlHeader *header)
-{
- if (m_hide) return;
- m_t << "\\" << getSectionName(header->level()) << "*{";
-}
-
-void LatexDocVisitor::visitPost(DocHtmlHeader *)
-{
- if (m_hide) return;
- m_t << "}";
-}
-
-void LatexDocVisitor::visitPre(DocImage *img)
-{
- if (img->type()==DocImage::Latex)
- {
- if (m_hide) return;
- if (img->hasCaption())
- {
- m_t << "\\begin{figure}[H]" << endl;
- m_t << "\\begin{center}" << endl;
- }
- else
- {
- m_t << "\\mbox{";
- }
- QString gfxName = img->name();
- if (gfxName.right(4)==".eps" || gfxName.right(4)==".pdf")
- {
- gfxName=gfxName.left(gfxName.length()-4);
- }
- m_t << "\\includegraphics";
- if (!img->width().isEmpty())
- {
- m_t << "[width=" << img->width() << "]";
- }
- else if (!img->height().isEmpty())
- {
- m_t << "[height=" << img->height() << "]";
- }
- m_t << "{" << gfxName << "}";
- if (img->hasCaption())
- {
- m_t << "\\caption{";
- }
- }
- else // other format -> skip
- {
- pushEnabled();
- m_hide=TRUE;
- }
-}
-
-void LatexDocVisitor::visitPost(DocImage *img)
-{
- if (img->type()==DocImage::Latex)
- {
- if (m_hide) return;
- m_t << "}" << endl; // end mbox or caption
- if (img->hasCaption())
- {
- m_t << "\\end{center}" << endl;
- m_t << "\\end{figure}" << endl;
- }
- }
- else // other format
- {
- popEnabled();
- }
-}
-
-void LatexDocVisitor::visitPre(DocDotFile *df)
-{
- if (m_hide) return;
- startDotFile(df->file(),df->width(),df->height(),df->hasCaption());
-}
-
-void LatexDocVisitor::visitPost(DocDotFile *df)
-{
- if (m_hide) return;
- endDotFile(df->hasCaption());
-}
-
-void LatexDocVisitor::visitPre(DocLink *lnk)
-{
- if (m_hide) return;
- startLink(lnk->ref(),lnk->file(),lnk->anchor());
-}
-
-void LatexDocVisitor::visitPost(DocLink *lnk)
-{
- if (m_hide) return;
- endLink(lnk->ref(),lnk->file(),lnk->anchor());
-}
-
-void LatexDocVisitor::visitPre(DocRef *ref)
-{
- if (m_hide) return;
- if (!ref->file().isEmpty()) startLink(ref->ref(),ref->file(),ref->anchor());
- if (!ref->hasLinkText()) filter(ref->targetTitle());
-}
-
-void LatexDocVisitor::visitPost(DocRef *ref)
-{
- if (m_hide) return;
- if (!ref->file().isEmpty()) endLink(ref->ref(),ref->file(),ref->anchor());
-}
-
-void LatexDocVisitor::visitPre(DocSecRefItem *)
-{
- if (m_hide) return;
- m_t << "\\item \\contentsline{section}{";
-}
-
-void LatexDocVisitor::visitPost(DocSecRefItem *ref)
-{
- if (m_hide) return;
- m_t << "}{\\ref{" << ref->file() << "_" << ref->anchor() << "}}{}" << endl;
-}
-
-void LatexDocVisitor::visitPre(DocSecRefList *)
-{
- if (m_hide) return;
- m_t << "\\footnotesize" << endl;
- m_t << "\\begin{multicols}{2}" << endl;
- m_t << "\\begin{CompactList}" << endl;
-}
-
-void LatexDocVisitor::visitPost(DocSecRefList *)
-{
- if (m_hide) return;
- m_t << "\\end{CompactList}" << endl;
- m_t << "\\end{multicols}" << endl;
- m_t << "\\normalsize" << endl;
-}
-
-//void LatexDocVisitor::visitPre(DocLanguage *l)
-//{
-// QString langId = Config_getEnum("OUTPUT_LANGUAGE");
-// if (l->id().lower()!=langId.lower())
-// {
-// pushEnabled();
-// m_hide = TRUE;
-// }
-//}
-//
-//void LatexDocVisitor::visitPost(DocLanguage *l)
-//{
-// QString langId = Config_getEnum("OUTPUT_LANGUAGE");
-// if (l->id().lower()!=langId.lower())
-// {
-// popEnabled();
-// }
-//}
-
-void LatexDocVisitor::visitPre(DocParamSect *s)
-{
- if (m_hide) return;
- m_t << "\\begin{Desc}" << endl;
- m_t << "\\item[";
- switch(s->type())
- {
- case DocParamSect::Param:
- filter(theTranslator->trParameters()); break;
- case DocParamSect::RetVal:
- filter(theTranslator->trReturnValues()); break;
- case DocParamSect::Exception:
- filter(theTranslator->trExceptions()); break;
- default:
- ASSERT(0);
- }
- m_t << ":]" << endl;
- m_t << "\\begin{description}" << endl;
-}
-
-void LatexDocVisitor::visitPost(DocParamSect *)
-{
- if (m_hide) return;
- m_t << "\\end{description}" << endl;
- m_t << "\\end{Desc}" << endl;
-}
-
-void LatexDocVisitor::visitPre(DocParamList *pl)
-{
- if (m_hide) return;
- m_t << "\\item[";
- if (pl->direction()!=DocParamSect::Unspecified)
- {
- m_t << "\\mbox{";
- if (pl->direction()==DocParamSect::In)
- {
- m_t << "$\\leftarrow$";
- }
- else if (pl->direction()==DocParamSect::Out)
- {
- m_t << "$\\rightarrow$";
- }
- else if (pl->direction()==DocParamSect::InOut)
- {
- m_t << "$\\leftrightarrow$";
- }
- m_t << "} ";
- }
- m_t << "{\\em ";
- //QStrListIterator li(pl->parameters());
- //const char *s;
- QListIterator<DocNode> li(pl->parameters());
- DocNode *param;
- bool first=TRUE;
- for (li.toFirst();(param=li.current());++li)
- {
- if (!first) m_t << ","; else first=FALSE;
- m_insideItem=TRUE;
- if (param->kind()==DocNode::Kind_Word)
- {
- visit((DocWord*)param);
- }
- else if (param->kind()==DocNode::Kind_LinkedWord)
- {
- visit((DocLinkedWord*)param);
- }
- m_insideItem=FALSE;
- }
- m_t << "}]";
-}
-
-void LatexDocVisitor::visitPost(DocParamList *)
-{
-}
-
-void LatexDocVisitor::visitPre(DocXRefItem *x)
-{
- if (m_hide) return;
- m_t << "\\begin{Desc}" << endl;
- bool anonymousEnum = x->file()=="@";
- m_t << "\\item[";
- if (Config_getBool("PDF_HYPERLINKS") && !anonymousEnum)
- {
- m_t << "\\hyperlink{" << stripPath(x->file()) << "_" << x->anchor() << "}{";
- }
- else
- {
- m_t << "{\\bf ";
- }
- m_insideItem=TRUE;
- filter(x->title());
- m_insideItem=FALSE;
- m_t << "}]";
-}
-
-void LatexDocVisitor::visitPost(DocXRefItem *)
-{
- if (m_hide) return;
- m_t << "\\end{Desc}" << endl;
-}
-
-void LatexDocVisitor::visitPre(DocInternalRef *ref)
-{
- if (m_hide) return;
- startLink(0,ref->file(),ref->anchor());
-}
-
-void LatexDocVisitor::visitPost(DocInternalRef *ref)
-{
- if (m_hide) return;
- endLink(0,ref->file(),ref->anchor());
-}
-
-void LatexDocVisitor::visitPre(DocCopy *)
-{
-}
-
-void LatexDocVisitor::visitPost(DocCopy *)
-{
-}
-
-void LatexDocVisitor::visitPre(DocText *)
-{
-}
-
-void LatexDocVisitor::visitPost(DocText *)
-{
-}
-
-void LatexDocVisitor::filter(const char *str)
-{
- filterLatexString(m_t,str,m_insideTabbing,m_insidePre,m_insideItem);
-}
-
-void LatexDocVisitor::startLink(const QString &ref,const QString &file,const QString &anchor)
-{
- if (ref.isEmpty() && Config_getBool("PDF_HYPERLINKS"))
- {
- m_t << "\\hyperlink{";
- if (!file.isEmpty()) m_t << stripPath(file);
- if (!file.isEmpty() && !anchor.isEmpty()) m_t << "_";
- if (!anchor.isEmpty()) m_t << anchor;
- m_t << "}{";
-
- }
- else
- {
- m_t << "{\\bf ";
- }
-}
-
-void LatexDocVisitor::endLink(const QString &ref,const QString &file,const QString &anchor)
-{
- m_t << "}";
- if (ref.isEmpty() && !Config_getBool("PDF_HYPERLINKS"))
- {
- m_t << "{\\rm (";
- filter(theTranslator->trPageAbbreviation());
- m_t << "\\,\\pageref{" << file;
- if (!anchor.isEmpty()) m_t << "_" << anchor;
- m_t << "})}";
- }
-}
-
-void LatexDocVisitor::pushEnabled()
-{
- m_enabled.push(new bool(m_hide));
-}
-
-void LatexDocVisitor::popEnabled()
-{
- bool *v=m_enabled.pop();
- ASSERT(v!=0);
- m_hide = *v;
- delete v;
-}
-
-void LatexDocVisitor::startDotFile(const QString &fileName,
- const QString &width,
- const QString &height,
- bool hasCaption
- )
-{
- QString baseName=fileName;
- int i;
- if ((i=baseName.findRev('/'))!=-1)
- {
- baseName=baseName.right(baseName.length()-i-1);
- }
- if (baseName.right(4)==".eps" || baseName.right(4)==".pdf")
- {
- baseName=baseName.left(baseName.length()-4);
- }
- if (baseName.right(4)==".dot")
- {
- baseName=baseName.left(baseName.length()-4);
- }
- QString outDir = Config_getString("LATEX_OUTPUT");
- QString name = fileName;
- writeDotGraphFromFile(name,outDir,baseName,EPS);
- if (hasCaption)
- {
- m_t << "\\begin{figure}[H]" << endl;
- m_t << "\\begin{center}" << endl;
- }
- else
- {
- m_t << "\\mbox{";
- }
- m_t << "\\includegraphics";
- if (!width.isEmpty())
- {
- m_t << "[width=" << width << "]";
- }
- else if (!height.isEmpty())
- {
- m_t << "[height=" << height << "]";
- }
- m_t << "{" << baseName << "}";
-
- if (hasCaption)
- {
- m_t << "\\caption{";
- }
-}
-
-void LatexDocVisitor::endDotFile(bool hasCaption)
-{
- if (m_hide) return;
- m_t << "}" << endl; // end mbox or caption
- if (hasCaption)
- {
- m_t << "\\end{center}" << endl;
- m_t << "\\end{figure}" << endl;
- }
-}
-
diff --git a/src/latexdocvisitor.h b/src/latexdocvisitor.h
deleted file mode 100644
index fdebaf4..0000000
--- a/src/latexdocvisitor.h
+++ /dev/null
@@ -1,164 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 _LATEXDOCVISITOR_H
-#define _LATEXDOCVISITOR_H
-
-#include "docvisitor.h"
-#include <qstack.h>
-#include <qcstring.h>
-
-class QTextStream;
-class CodeOutputInterface;
-class QString;
-
-/*! @brief Concrete visitor implementation for LaTeX output. */
-class LatexDocVisitor : public DocVisitor
-{
- public:
- LatexDocVisitor(QTextStream &t,CodeOutputInterface &ci,
- const char *langExt,bool insideTabbing);
-
- //--------------------------------------
- // visitor functions for leaf nodes
- //--------------------------------------
-
- void visit(DocWord *);
- void visit(DocLinkedWord *);
- void visit(DocWhiteSpace *);
- void visit(DocSymbol *);
- void visit(DocURL *);
- void visit(DocLineBreak *);
- void visit(DocHorRuler *);
- void visit(DocStyleChange *);
- void visit(DocVerbatim *);
- void visit(DocAnchor *);
- void visit(DocInclude *);
- void visit(DocIncOperator *);
- void visit(DocFormula *);
- void visit(DocIndexEntry *);
-
- //--------------------------------------
- // visitor functions for compound nodes
- //--------------------------------------
-
- void visitPre(DocAutoList *);
- void visitPost(DocAutoList *);
- void visitPre(DocAutoListItem *);
- void visitPost(DocAutoListItem *);
- void visitPre(DocPara *);
- void visitPost(DocPara *);
- void visitPre(DocRoot *);
- void visitPost(DocRoot *);
- void visitPre(DocSimpleSect *);
- void visitPost(DocSimpleSect *);
- void visitPre(DocTitle *);
- void visitPost(DocTitle *);
- void visitPre(DocSimpleList *);
- void visitPost(DocSimpleList *);
- void visitPre(DocSimpleListItem *);
- void visitPost(DocSimpleListItem *);
- void visitPre(DocSection *s);
- void visitPost(DocSection *);
- void visitPre(DocHtmlList *s);
- void visitPost(DocHtmlList *s);
- void visitPre(DocHtmlListItem *);
- void visitPost(DocHtmlListItem *);
- //void visitPre(DocHtmlPre *);
- //void visitPost(DocHtmlPre *);
- void visitPre(DocHtmlDescList *);
- void visitPost(DocHtmlDescList *);
- void visitPre(DocHtmlDescTitle *);
- void visitPost(DocHtmlDescTitle *);
- void visitPre(DocHtmlDescData *);
- void visitPost(DocHtmlDescData *);
- void visitPre(DocHtmlTable *t);
- void visitPost(DocHtmlTable *t);
- void visitPre(DocHtmlCaption *);
- void visitPost(DocHtmlCaption *);
- void visitPre(DocHtmlRow *);
- void visitPost(DocHtmlRow *) ;
- void visitPre(DocHtmlCell *);
- void visitPost(DocHtmlCell *);
- void visitPre(DocInternal *);
- void visitPost(DocInternal *);
- void visitPre(DocHRef *);
- void visitPost(DocHRef *);
- void visitPre(DocHtmlHeader *);
- void visitPost(DocHtmlHeader *) ;
- void visitPre(DocImage *);
- void visitPost(DocImage *);
- void visitPre(DocDotFile *);
- void visitPost(DocDotFile *);
- void visitPre(DocLink *lnk);
- void visitPost(DocLink *);
- void visitPre(DocRef *ref);
- void visitPost(DocRef *);
- void visitPre(DocSecRefItem *);
- void visitPost(DocSecRefItem *);
- void visitPre(DocSecRefList *);
- void visitPost(DocSecRefList *);
- //void visitPre(DocLanguage *);
- //void visitPost(DocLanguage *);
- void visitPre(DocParamSect *);
- void visitPost(DocParamSect *);
- void visitPre(DocParamList *);
- void visitPost(DocParamList *);
- void visitPre(DocXRefItem *);
- void visitPost(DocXRefItem *);
- void visitPre(DocInternalRef *);
- void visitPost(DocInternalRef *);
- void visitPre(DocCopy *);
- void visitPost(DocCopy *);
- void visitPre(DocText *);
- void visitPost(DocText *);
-
- private:
-
- //--------------------------------------
- // helper functions
- //--------------------------------------
-
- void filter(const char *str);
- void startLink(const QString &ref,const QString &file,
- const QString &anchor);
- void endLink(const QString &ref,const QString &file,
- const QString &anchor);
- QString escapeMakeIndexChars(const char *s);
- void startDotFile(const QString &fileName,const QString &width,
- const QString &height, bool hasCaption);
- void endDotFile(bool hasCaption);
-
- void pushEnabled();
- void popEnabled();
-
- //--------------------------------------
- // state variables
- //--------------------------------------
-
- QTextStream &m_t;
- CodeOutputInterface &m_ci;
- bool m_insidePre;
- bool m_insideItem;
- bool m_hide;
- bool m_insideTabbing;
- QStack<bool> m_enabled;
- QCString m_langExt;
-};
-
-#endif
diff --git a/src/latexgen.cpp b/src/latexgen.cpp
deleted file mode 100644
index 7d5b79a..0000000
--- a/src/latexgen.cpp
+++ /dev/null
@@ -1,1551 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-
-#include <stdlib.h>
-
-#include "qtbc.h"
-#include <qdir.h>
-#include "latexgen.h"
-#include "config.h"
-#include "message.h"
-#include "doxygen.h"
-#include "util.h"
-#include "diagram.h"
-#include "language.h"
-#include "version.h"
-#include "dot.h"
-#include "pagedef.h"
-#include "docparser.h"
-#include "latexdocvisitor.h"
-#include "dirdef.h"
-
-//static QCString filterTitle(const char *s)
-//{
-// QCString tmp=s,result;
-// uint i;for (i=0;i<tmp.length();i++)
-// {
-// char c=tmp.at(i);
-// switch(c)
-// {
-// case '#': result+="\\#"; break;
-// case '"': result+="\\\""; break;
-// case '%': result+="\\%"; break;
-// case '[': result+="{"; break;
-// case ']': result+="}"; break;
-// default: result+=c; break;
-// }
-// }
-// return result;
-//}
-
-
-static QCString escapeLabelName(const char *s)
-{
- QCString result;
- const char *p=s;
- char c;
- while ((c=*p++))
- {
- switch (c)
- {
- case '%': result+="\\%"; break;
- case '|': result+="\\texttt{\"|}"; break;
- case '!': result+="\"!"; break;
- default: result+=c;
- }
- }
- return result;
-}
-
-static QCString escapeMakeIndexChars(LatexGenerator *g,QTextStream &t,const char *s)
-{
- QCString result;
- const char *p=s;
- char str[2];
- str[1]=0;
- char c;
- while ((c=*p++))
- {
- switch (c)
- {
- case '!': t << "\"!"; break;
- case '"': t << "\"\""; break;
- case '@': t << "\"@"; break;
- case '|': t << "\\texttt{\"|}"; break;
- case '[': t << "["; break;
- case ']': t << "]"; break;
- default: str[0]=c; g->docify(str); break;
- }
- }
- return result;
-}
-
-
-LatexGenerator::LatexGenerator() : OutputGenerator()
-{
- dir=Config_getString("LATEX_OUTPUT");
- col=0;
- //printf("LatexGenerator::LatexGenerator() insideTabbing=FALSE\n");
- insideTabbing=FALSE;
- firstDescItem=TRUE;
- m_indent=0;
-}
-
-LatexGenerator::~LatexGenerator()
-{
-}
-
-void LatexGenerator::init()
-{
- QCString dir=Config_getString("LATEX_OUTPUT");
- QDir d(dir);
- if (!d.exists() && !d.mkdir(dir))
- {
- err("Could not create output directory %s\n",dir.data());
- exit(1);
- }
-
- QCString fileName=dir+"/Makefile";
- QFile file(fileName);
- if (!file.open(IO_WriteOnly))
- {
- err("Could not open file %s for writing\n",fileName.data());
- exit(1);
- }
- // inserted by KONNO Akihisa <konno@researchers.jp> 2002-03-05
- QCString latex_command = Config_getString("LATEX_CMD_NAME");
- QCString mkidx_command = Config_getString("MAKEINDEX_CMD_NAME");
- // end insertion by KONNO Akihisa <konno@researchers.jp> 2002-03-05
- QTextStream t(&file);
- if (!Config_getBool("USE_PDFLATEX")) // use plain old latex
- {
- t << "all clean: refman.dvi" << endl
- << endl
- << "ps: refman.ps" << endl
- << endl
- << "pdf: refman.pdf" << endl
- << endl
- << "ps_2on1: refman_2on1.ps" << endl
- << endl
- << "pdf_2on1: refman_2on1.pdf" << endl
- << endl
- << "refman.ps: refman.dvi" << endl
- << "\tdvips -o refman.ps refman.dvi" << endl
- << endl;
- t << "refman.pdf: refman.ps" << endl;
-#if defined(_MSC_VER)
- // ps2pdf.bat does not work properly from a makefile using GNU make!
- t << "\tgswin32c -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite "
- "-sOutputFile=refman.pdf -c save pop -f refman.ps" << endl << endl;
-#else
- t << "\tps2pdf refman.ps refman.pdf" << endl << endl;
-#endif
- t << "refman.dvi: refman.tex doxygen.sty" << endl
- << "\techo \"Running latex...\"" << endl
- << "\t" << latex_command << " refman.tex" << endl
- << "\techo \"Running makeindex...\"" << endl
- << "\t" << mkidx_command << " refman.idx" << endl
- << "\techo \"Rerunning latex....\"" << endl
- << "\t" << latex_command << " refman.tex" << endl
- << "\tlatex_count=5 ; \\" << endl
- << "\twhile egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\\" << endl
- << "\t do \\" << endl
- << "\t echo \"Rerunning latex....\" ;\\" << endl
- << "\t " << latex_command << " refman.tex ;\\" << endl
- << "\t latex_count=`expr $$latex_count - 1` ;\\" << endl
- << "\t done" << endl << endl
- << "refman_2on1.ps: refman.ps" << endl
- << "\tpsnup -2 refman.ps >refman_2on1.ps" << endl
- << endl
- << "refman_2on1.pdf: refman_2on1.ps" << endl
-#if defined(_MSC_VER)
- // ps2pdf.bat does not work properly from a makefile using GNU make!
- << "\tgswin32c -q -dNOPAUSE -dBATCH -sDEVICE=pdfwrite "
- "-sOutputFile=refman_2on1.pdf -c save pop -f refman_2on1.ps" << endl;
-#else
- << "\tps2pdf refman_2on1.ps refman_2on1.pdf" << endl;
-#endif
- }
- else // use pdflatex for higher quality output
- {
- t << "all clean: refman.pdf" << endl << endl;
- t << "refman.pdf: refman.tex" << endl;
- t << "\tpdflatex refman.tex" << endl;
- t << "\tmakeindex refman.idx" << endl;
- t << "\tpdflatex refman.tex" << endl << endl
- << "\tlatex_count=5 ; \\" << endl
- << "\twhile egrep -s 'Rerun (LaTeX|to get cross-references right)' refman.log && [ $$latex_count -gt 0 ] ;\\" << endl
- << "\t do \\" << endl
- << "\t echo \"Rerunning latex....\" ;\\" << endl
- << "\t pdflatex refman.tex ;\\" << endl
- << "\t latex_count=`expr $$latex_count - 1` ;\\" << endl
- << "\t done" << endl << endl;
- }
-
- t << endl
- << "clean:" << endl
- << "\trm -f *.ps *.dvi *.aux *.toc *.idx *.ind *.ilg *.log *.out refman.pdf" << endl;
-
- createSubDirs(d);
-}
-
-static void writeDefaultHeaderPart1(QTextStream &t)
-{
- // part 1
-
- QCString paperName;
- if (Config_getBool("LATEX_BATCHMODE")) t << "\\batchmode" << endl;
- QCString &paperType=Config_getEnum("PAPER_TYPE");
- if (paperType=="a4wide")
- paperName="a4";
- else
- paperName=paperType;
- t << "\\documentclass[" << paperName << "paper";
- //if (Config_getBool("PDF_HYPERLINKS")) t << ",ps2pdf";
- t << "]{";
- if (Config_getBool("COMPACT_LATEX")) t << "article"; else t << "book";
- t << "}\n";
- if (paperType=="a4wide") t << "\\usepackage{a4wide}\n";
- t << "\\usepackage{makeidx}\n"
- "\\usepackage{fancyhdr}\n"
- "\\usepackage{graphicx}\n"
- "\\usepackage{multicol}\n"
- "\\usepackage{float}\n"
- "\\usepackage{textcomp}\n"
- "\\usepackage{alltt}\n"
- //"\\usepackage{ae,aecompl,aeguill}\n"
- ;
- if (Config_getBool("USE_PDFLATEX"))
- {
- t << "\\usepackage{times}" << endl;
- }
- if (Config_getBool("PDF_HYPERLINKS"))
- {
- t << "\\ifx\\pdfoutput\\undefined" << endl
- << "\\usepackage[ps2pdf," << endl
- << " pagebackref=true," << endl
- << " colorlinks=true," << endl
- << " linkcolor=blue" << endl
- << " ]{hyperref}" << endl
- << "\\usepackage{pspicture}" << endl
- << "\\else" << endl
- << "\\usepackage[pdftex," << endl
- << " pagebackref=true," << endl
- << " colorlinks=true," << endl
- << " linkcolor=blue" << endl
- << " ]{hyperref}" << endl
- << "\\fi" << endl;
- }
- // Try to get the command for switching on the language
- // support
- QCString sLanguageSupportCommand(
- theTranslator->latexLanguageSupportCommand());
-
- if (!sLanguageSupportCommand.isEmpty())
- {
- // The command is not empty. Put it to the output.
- // if the command is empty, no output is needed.
- t << sLanguageSupportCommand << endl;
- }
-
- t << "\\usepackage{doxygen}\n";
- QStrList &extraPackages = Config_getList("EXTRA_PACKAGES");
- const char *s=extraPackages.first();
- while (s)
- {
- t << "\\usepackage{" << s << "}\n";
- s=extraPackages.next();
- }
- t << "\\makeindex\n"
- "\\setcounter{tocdepth}{1}\n"
- "\\renewcommand{\\footrulewidth}{0.4pt}\n"
- "\\begin{document}\n";
- if (theTranslator->idLanguage()=="greek") t << "\\selectlanguage{greek}\n";
- t << "\\begin{titlepage}\n"
- "\\vspace*{7cm}\n"
- "\\begin{center}\n"
- "{\\Large ";
-}
-
-static void writeDefaultHeaderPart2(QTextStream &t)
-{
- // part 2
- t << "}\\\\" << endl
- << "\\vspace*{1cm}" << endl
- << "{\\large ";
-}
-
-static void writeDefaultHeaderPart3(QTextStream &t)
-{
- // part 3
- t << " Doxygen " << versionString << "}\\\\" << endl
- << "\\vspace*{0.5cm}" << endl
- << "{\\small " << dateToString(TRUE) << "}\\\\" << endl
- << "\\end{center}" << endl
- << "\\end{titlepage}" << endl;
- if (!Config_getBool("COMPACT_LATEX")) t << "\\clearemptydoublepage\n";
- t << "\\pagenumbering{roman}\n";
- t << "\\tableofcontents\n";
- if (!Config_getBool("COMPACT_LATEX")) t << "\\clearemptydoublepage\n";
- t << "\\pagenumbering{arabic}\n";
-}
-
-static void writeDefaultStyleSheetPart1(QTextStream &t)
-{
- // part 1
- t << "\\NeedsTeXFormat{LaTeX2e}\n";
- t << "\\ProvidesPackage{doxygen}\n";
- t << "\\RequirePackage{calc}\n";
- t << "\\RequirePackage{array}\n";
- t << "\\pagestyle{fancyplain}\n";
- //t << "\\addtolength{\\headwidth}{\\marginparsep}\n";
- //t << "\\addtolength{\\headwidth}{\\marginparwidth}\n";
- t << "\\newcommand{\\clearemptydoublepage}{\\newpage{\\pagestyle{empty}";
- t << "\\cleardoublepage}}\n";
- if (!Config_getBool("COMPACT_LATEX"))
- t << "\\renewcommand{\\chaptermark}[1]{\\markboth{#1}{}}\n";
- t << "\\renewcommand{\\sectionmark}[1]{\\markright{\\thesection\\ #1}}\n";
- t << "\\lhead[\\fancyplain{}{\\bfseries\\thepage}]\n";
- t << " {\\fancyplain{}{\\bfseries\\rightmark}}\n";
- t << "\\rhead[\\fancyplain{}{\\bfseries\\leftmark}]\n";
- t << " {\\fancyplain{}{\\bfseries\\thepage}}\n";
- t << "\\rfoot[\\fancyplain{}{\\bfseries\\scriptsize ";
-}
-
-static void writeDefaultStyleSheetPart2(QTextStream &t)
-{
- t << "\\lfoot[]{\\fancyplain{}{\\bfseries\\scriptsize ";
-}
-
-static void writeDefaultStyleSheetPart3(QTextStream &t)
-{
- t << "}}\n";
- t << "\\cfoot{}\n";
- t << "\\newenvironment{CompactList}\n";
- t << "{\\begin{list}{}{\n";
- t << " \\setlength{\\leftmargin}{0.5cm}\n";
- t << " \\setlength{\\itemsep}{0pt}\n";
- t << " \\setlength{\\parsep}{0pt}\n";
- t << " \\setlength{\\topsep}{0pt}\n";
- t << " \\renewcommand{\\makelabel}{}}}\n";
- t << "{\\end{list}}\n";
- t << "\\newenvironment{CompactItemize}\n";
- t << "{\n";
- t << " \\begin{itemize}\n";
- t << " \\setlength{\\itemsep}{-3pt}\n";
- t << " \\setlength{\\parsep}{0pt}\n";
- t << " \\setlength{\\topsep}{0pt}\n";
- t << " \\setlength{\\partopsep}{0pt}\n";
- t << "}\n";
- t << "{\\end{itemize}}\n";
- t << "\\newcommand{\\PBS}[1]{\\let\\temp=\\\\#1\\let\\\\=\\temp}\n";
- t << "\\newlength{\\tmplength}\n";
- t << "\\newenvironment{TabularC}[1]\n";
- t << "{\n";
- t << "\\setlength{\\tmplength}\n";
- t << " {\\linewidth/(#1)-\\tabcolsep*2-\\arrayrulewidth*(#1+1)/(#1)}\n";
- t << " \\par\\begin{tabular*}{\\linewidth}\n";
- t << " {*{#1}{|>{\\PBS\\raggedright\\hspace{0pt}}p{\\the\\tmplength}}|}\n";
- t << "}\n";
- t << "{\\end{tabular*}\\par}\n";
- t << "\\newcommand{\\entrylabel}[1]{\n";
- t << " {\\parbox[b]{\\labelwidth-4pt}{\\makebox[0pt][l]{\\textbf{#1}}\\\\}}}\n";
- t << "\\newenvironment{Desc}\n";
- t << "{\\begin{list}{}\n";
- t << " {\n";
- t << " \\settowidth{\\labelwidth}{40pt}\n";
- t << " \\setlength{\\leftmargin}{\\labelwidth}\n";
- t << " \\setlength{\\parsep}{0pt}\n";
- t << " \\setlength{\\itemsep}{-4pt}\n";
- t << " \\renewcommand{\\makelabel}{\\entrylabel}\n";
- t << " }\n";
- t << "}\n";
- t << "{\\end{list}}\n";
-
- t << "\\newenvironment{Indent}\n";
- t << " {\\begin{list}{}{\\setlength{\\leftmargin}{0.5cm}}\n";
- t << " \\item[]\\ignorespaces}\n";
- t << " {\\unskip\\end{list}}\n";
-
- t << "\\setlength{\\parindent}{0cm}\n";
- t << "\\setlength{\\parskip}{0.2cm}\n";
- t << "\\addtocounter{secnumdepth}{1}\n";
- t << "\\sloppy\n";
- t << "\\usepackage[T1]{fontenc}\n";
-}
-
-void LatexGenerator::writeHeaderFile(QFile &f)
-{
- QTextStream t(&f);
- writeDefaultHeaderPart1(t);
- t << "Your title here";
- writeDefaultHeaderPart2(t);
- t << "Generated by";
- writeDefaultHeaderPart3(t);
-}
-
-void LatexGenerator::writeStyleSheetFile(QFile &f)
-{
- QTextStream t(&f);
-#if QT_VERSION >= 200
- t.setEncoding(QTextStream::Latin1);
-#endif
-
- writeDefaultStyleSheetPart1(t);
- QCString &projectName = Config_getString("PROJECT_NAME");
-
- t << theTranslator->trGeneratedAt( dateToString(TRUE), projectName );
- t << " doxygen";
- //t << " " << theTranslator->trWrittenBy() << " ";
- //t << "Dimitri van Heesch \\copyright~1997-2005";
- writeDefaultStyleSheetPart2(t);
- t << theTranslator->trGeneratedAt( dateToString(TRUE), projectName );
- t << " doxygen";
- //t << " << theTranslator->trWrittenBy() << " ";
- //t << "Dimitri van Heesch \\copyright~1997-2005";
- writeDefaultStyleSheetPart3(t);
-}
-
-void LatexGenerator::startFile(const char *name,const char *,const char *)
-{
- QCString fileName=name;
- relPath = relativePathToRoot(fileName);
- if (fileName.right(4)!=".tex" && fileName.right(4)!=".sty") fileName+=".tex";
- startPlainFile(fileName);
-}
-
-void LatexGenerator::endFile()
-{
- endPlainFile();
-}
-
-//void LatexGenerator::writeIndex()
-//{
-// startFile("refman.tex");
-//}
-
-void LatexGenerator::startProjectNumber()
-{
- t << "\\\\[1ex]\\large ";
-}
-
-void LatexGenerator::startIndexSection(IndexSections is)
-{
- bool &compactLatex = Config_getBool("COMPACT_LATEX");
- QCString &latexHeader = Config_getString("LATEX_HEADER");
- switch (is)
- {
- case isTitlePageStart:
- {
- if (latexHeader.isEmpty())
- {
- writeDefaultHeaderPart1(t);
- }
- else
- {
- QCString header = fileToString(latexHeader);
- t << substituteKeywords(header,0);
- }
- }
- break;
- case isTitlePageAuthor:
- if (latexHeader.isEmpty())
- {
- writeDefaultHeaderPart2(t);
- }
- break;
- case isMainPage:
- if (compactLatex) t << "\\section"; else t << "\\chapter";
- t << "{"; //Introduction}\n"
- break;
- //case isPackageIndex:
- // if (compactLatex) t << "\\section"; else t << "\\chapter";
- // t << "{"; //Package Index}\n"
- // break;
- case isModuleIndex:
- if (compactLatex) t << "\\section"; else t << "\\chapter";
- t << "{"; //Module Index}\n"
- break;
- case isDirIndex:
- if (compactLatex) t << "\\section"; else t << "\\chapter";
- t << "{"; //Directory Index}\n"
- break;
- case isNamespaceIndex:
- if (compactLatex) t << "\\section"; else t << "\\chapter";
- t << "{"; //Namespace Index}\"
- break;
- case isClassHierarchyIndex:
- if (compactLatex) t << "\\section"; else t << "\\chapter";
- t << "{"; //Hierarchical Index}\n"
- break;
- case isCompoundIndex:
- if (compactLatex) t << "\\section"; else t << "\\chapter";
- t << "{"; //Annotated Compound Index}\n"
- break;
- case isFileIndex:
- if (compactLatex) t << "\\section"; else t << "\\chapter";
- t << "{"; //Annotated File Index}\n"
- break;
- case isPageIndex:
- if (compactLatex) t << "\\section"; else t << "\\chapter";
- t << "{"; //Annotated Page Index}\n"
- break;
- case isModuleDocumentation:
- {
- GroupSDict::Iterator gli(Doxygen::groupSDict);
- GroupDef *gd;
- bool found=FALSE;
- for (gli.toFirst();(gd=gli.current()) && !found;++gli)
- {
- if (!gd->isReference())
- {
- if (compactLatex) t << "\\section"; else t << "\\chapter";
- t << "{"; //Module Documentation}\n";
- found=TRUE;
- }
- }
- }
- 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())
- {
- if (compactLatex) t << "\\section"; else t << "\\chapter";
- t << "{"; //Module Documentation}\n";
- found=TRUE;
- }
- }
- }
- break;
- case isNamespaceDocumentation:
- {
- NamespaceSDict::Iterator nli(Doxygen::namespaceSDict);
- NamespaceDef *nd;
- bool found=FALSE;
- for (nli.toFirst();(nd=nli.current()) && !found;++nli)
- {
- if (nd->isLinkableInProject())
- {
- if (compactLatex) t << "\\section"; else t << "\\chapter";
- t << "{"; // Namespace Documentation}\n":
- found=TRUE;
- }
- }
- }
- break;
- case isClassDocumentation:
- {
- ClassSDict::Iterator cli(Doxygen::classSDict);
- ClassDef *cd=0;
- bool found=FALSE;
- for (cli.toFirst();(cd=cli.current()) && !found;++cli)
- {
- if (cd->isLinkableInProject() && cd->templateMaster()==0)
- {
- if (compactLatex) t << "\\section"; else t << "\\chapter";
- t << "{"; //Compound Documentation}\n";
- found=TRUE;
- }
- }
- }
- break;
- case isFileDocumentation:
- {
- bool isFirst=TRUE;
- FileName *fn=Doxygen::inputNameList.first();
- while (fn)
- {
- FileDef *fd=fn->first();
- while (fd)
- {
- if (fd->isLinkableInProject())
- {
- if (isFirst)
- {
- if (compactLatex) t << "\\section"; else t << "\\chapter";
- t << "{"; //File Documentation}\n";
- isFirst=FALSE;
- break;
- }
- }
- fd=fn->next();
- }
- fn=Doxygen::inputNameList.next();
- }
- }
- break;
- case isExampleDocumentation:
- {
- if (compactLatex) t << "\\section"; else t << "\\chapter";
- t << "{"; //Example Documentation}\n";
- }
- break;
- case isPageDocumentation:
- {
- if (compactLatex) t << "\\section"; else t << "\\chapter";
- t << "{"; //Page Documentation}\n";
- }
- break;
- case isEndIndex:
- break;
- }
-}
-
-void LatexGenerator::endIndexSection(IndexSections is)
-{
- bool &compactLatex = Config_getBool("COMPACT_LATEX");
- QCString &latexHeader = Config_getString("LATEX_HEADER");
- switch (is)
- {
- case isTitlePageStart:
- break;
- case isTitlePageAuthor:
- if (latexHeader.isEmpty())
- {
- writeDefaultHeaderPart3(t);
- }
- break;
- case isMainPage:
- {
- QCString indexName="index";
- if (Config_getBool("GENERATE_TREEVIEW")) indexName="main";
- t << "}\n\\label{index}";
- if (Config_getBool("PDF_HYPERLINKS")) t << "\\hypertarget{index}{}";
- t << "\\input{" << indexName << "}\n";
- }
- break;
- case isModuleIndex:
- t << "}\n\\input{modules}\n";
- break;
- case isDirIndex:
- t << "}\n\\input{dirs}\n";
- break;
- case isNamespaceIndex:
- t << "}\n\\input{namespaces}\n";
- break;
- case isClassHierarchyIndex:
- t << "}\n\\input{hierarchy}\n";
- break;
- case isCompoundIndex:
- t << "}\n\\input{annotated}\n";
- break;
- case isFileIndex:
- t << "}\n\\input{files}\n";
- break;
- case isPageIndex:
- t << "}\n\\input{pages}\n";
- break;
- case isModuleDocumentation:
- {
- GroupSDict::Iterator gli(Doxygen::groupSDict);
- GroupDef *gd;
- bool found=FALSE;
- for (gli.toFirst();(gd=gli.current()) && !found;++gli)
- {
- 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 << "{" << 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)
- {
- if (dd->isLinkableInProject())
- {
- if (compactLatex) t << "\\input"; else t << "\\include";
- t << "{" << dd->getOutputFileBase() << "}\n";
- }
- }
- }
- 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 << "}\n\\input{" << nd->getOutputFileBase() << "}\n";
- found=TRUE;
- }
- }
- while ((nd=nli.current()))
- {
- if (nd->isLinkableInProject())
- {
- if (compactLatex) t << "\\input"; else t << "\\include";
- t << "{" << 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)
- {
- if (cd->isLinkableInProject() && cd->templateMaster()==0)
- {
- t << "}\n\\input{" << cd->getOutputFileBase() << "}\n";
- found=TRUE;
- }
- }
- for (;(cd=cli.current());++cli)
- {
- if (cd->isLinkableInProject() && cd->templateMaster()==0)
- {
- if (compactLatex) t << "\\input"; else t << "\\include";
- t << "{" << cd->getOutputFileBase() << "}\n";
- }
- }
- }
- break;
- case isFileDocumentation:
- {
- bool isFirst=TRUE;
- FileName *fn=Doxygen::inputNameList.first();
- while (fn)
- {
- FileDef *fd=fn->first();
- while (fd)
- {
- if (fd->isLinkableInProject())
- {
- if (isFirst)
- {
- t << "}\n\\input{" << fd->getOutputFileBase() << "}\n";
- isFirst=FALSE;
- }
- else
- {
- if (compactLatex) t << "\\input" ; else t << "\\include";
- t << "{" << fd->getOutputFileBase() << "}\n";
- }
- }
- fd=fn->next();
- }
- fn=Doxygen::inputNameList.next();
- }
- }
- break;
- case isExampleDocumentation:
- {
- t << "}\n";
- PageSDict::Iterator pdi(*Doxygen::exampleSDict);
- PageDef *pd=pdi.toFirst();
- if (pd)
- {
- t << "\\input{" << pd->getOutputFileBase() << "}\n";
- }
- for (++pdi;(pd=pdi.current());++pdi)
- {
- if (compactLatex) t << "\\input" ; else t << "\\include";
- t << "{" << pd->getOutputFileBase() << "}\n";
- }
- }
- break;
- case isPageDocumentation:
- {
- t << "}\n";
- PageSDict::Iterator pdi(*Doxygen::pageSDict);
- PageDef *pd=pdi.toFirst();
- bool first=TRUE;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
- {
- if (!pd->getGroupDef() && !pd->isReference())
- {
- if (compactLatex || first) t << "\\input" ; else t << "\\include";
- t << "{" << pd->getOutputFileBase() << "}\n";
- first=FALSE;
- }
- }
- }
- break;
- case isEndIndex:
- t << "\\printindex\n";
- t << "\\end{document}\n";
- break;
- }
-}
-void LatexGenerator::writeStyleInfo(int part)
-{
- switch(part)
- {
- case 0:
- {
- //QCString pname=Config_getString("PROJECT_NAME").stripWhiteSpace();
- startPlainFile("doxygen.sty");
- writeDefaultStyleSheetPart1(t);
- }
- break;
- case 1:
- case 3:
- t << " Doxygen ";
- break;
- case 2:
- {
- //t << " Dimitri van Heesch \\copyright~1997-2005";
- t << "}]{}\n";
- writeDefaultStyleSheetPart2(t);
- }
- break;
- case 4:
- {
- //t << " Dimitri van Heesch \\copyright~1997-2005";
- writeDefaultStyleSheetPart3(t);
- endPlainFile();
- }
- break;
- }
-}
-
-void LatexGenerator::newParagraph()
-{
- t << endl << endl;
-}
-
-void LatexGenerator::writeString(const char *text)
-{
- t << text;
-}
-
-void LatexGenerator::writeIndexItem(const char *ref,const char *fn,
- const char *name)
-{
- t << "\\item ";
- if (!ref && fn)
- {
- t << "\\contentsline{section}{";
- docify(name);
- t << "}{\\pageref{" << fn << "}}{}" << endl;
- }
- else
- docify(name);
-}
-
-//void LatexGenerator::writeIndexFileItem(const char *,const char *text)
-//{
-// t << "\\item\\contentsline{section}{";
-// docify(text);
-// t << "}{\\pageref{" << text << "}}" << endl;
-//}
-
-
-void LatexGenerator::startHtmlLink(const char *url)
-{
- if (Config_getBool("PDF_HYPERLINKS"))
- {
- t << "\\href{";
- t << url;
- t << "}";
- }
- t << "{\\tt ";
-}
-
-void LatexGenerator::endHtmlLink()
-{
- t << "}";
-}
-
-//void LatexGenerator::writeMailLink(const char *url)
-//{
-// if (Config_getBool("PDF_HYPERLINKS"))
-// {
-// t << "\\href{mailto:";
-// t << url;
-// t << "}";
-// }
-// t << "{\\tt ";
-// docify(url);
-// t << "}";
-//}
-
-void LatexGenerator::writeStartAnnoItem(const char *,const char *,
- const char *path,const char *name)
-{
- t << "\\item\\contentsline{section}{{\\bf ";
- if (path) docify(path);
- docify(name);
- t << "} ";
-}
-
-void LatexGenerator::writeEndAnnoItem(const char *name)
-{
- t << "}{\\pageref{" << name << "}}{}" << endl;
-}
-
-void LatexGenerator::startIndexKey()
-{
- t << "\\item\\contentsline{section}{";
-}
-
-void LatexGenerator::endIndexKey()
-{
-}
-
-void LatexGenerator::startIndexValue(bool hasBrief)
-{
- t << " ";
- if (hasBrief) t << "(";
-}
-
-void LatexGenerator::endIndexValue(const char *name,bool hasBrief)
-{
- if (hasBrief) t << ")";
- t << "}{\\pageref{" << name << "}}{}" << endl;
-}
-
-//void LatexGenerator::writeClassLink(const char *,const char *,
-// const char *,const char *name)
-//{
-// t << "{\\bf ";
-// docify(name);
-// t << "}";
-//}
-
-void LatexGenerator::startTextLink(const char *f,const char *anchor)
-{
- if (Config_getBool("PDF_HYPERLINKS"))
- {
- t << "\\hyperlink{";
- if (f) t << stripPath(f);
- if (anchor) t << "_" << anchor;
- t << "}{";
- }
- else
- {
- t << "{\\bf ";
- }
-}
-
-void LatexGenerator::endTextLink()
-{
- t << "}";
-}
-
-void LatexGenerator::writeObjectLink(const char *ref, const char *f,
- const char *anchor, const char *text)
-{
- if (!ref && Config_getBool("PDF_HYPERLINKS"))
- {
- t << "\\hyperlink{";
- if (f) t << stripPath(f);
- if (f && anchor) t << "_";
- if (anchor) t << anchor;
- t << "}{";
- docify(text);
- t << "}";
- }
- else
- {
- t << "{\\bf ";
- docify(text);
- t << "}";
- }
-}
-
-void LatexGenerator::startPageRef()
-{
- t << " {\\rm (";
-}
-
-void LatexGenerator::endPageRef(const char *clname, const char *anchor)
-{
- t << "\\,\\pageref{";
- if (clname) t << clname;
- if (anchor) t << "_" << anchor;
- t << "})}";
-}
-
-void LatexGenerator::writeCodeLink(const char *,const char *,
- const char *,const char *name)
-{
- t << name;
- col+=strlen(name);
-}
-
-void LatexGenerator::startTitleHead(const char *fileName)
-{
- if (Config_getBool("PDF_HYPERLINKS") && fileName)
- {
- t << "\\hypertarget{" << stripPath(fileName) << "}{" << endl;
- }
- if (Config_getBool("COMPACT_LATEX"))
- {
- t << "\\subsection{";
- }
- else
- {
- t << "\\section{";
- }
-}
-
-void LatexGenerator::endTitleHead(const char *fileName,const char *name)
-{
- t << "}" << endl;
- if (name)
- {
- t << "\\label{" << fileName << "}\\index{"
- << name << "@{";
- escapeMakeIndexChars(this,t,name);
- t << "}}" << endl;
- }
- if (Config_getBool("PDF_HYPERLINKS") && fileName)
- {
- t << "}" << endl;
- }
-}
-
-void LatexGenerator::startTitle()
-{
- if (Config_getBool("COMPACT_LATEX"))
- {
- t << "\\subsection{";
- }
- else
- {
- t << "\\section{";
- }
-}
-
-void LatexGenerator::startGroupHeader()
-{
- if (Config_getBool("COMPACT_LATEX"))
- {
- t << "\\subsubsection{";
- }
- else
- {
- t << "\\subsection{";
- }
-}
-
-void LatexGenerator::endGroupHeader()
-{
- t << "}" << endl;
-}
-
-void LatexGenerator::startMemberHeader()
-{
- if (Config_getBool("COMPACT_LATEX"))
- {
- t << "\\subsubsection*{";
- }
- else
- {
- t << "\\subsection*{";
- }
-}
-
-void LatexGenerator::endMemberHeader()
-{
- t << "}" << endl;
-}
-
-void LatexGenerator::startMemberDoc(const char *clname,
- const char *memname,
- const char *,
- const char *)
-{
- if (memname && memname[0]!='@')
- {
- t << "\\index{";
- if (clname)
- {
- t << clname << "@{";
- docify(clname);
- t << "}!";
- }
- t << escapeLabelName(memname) << "@{";
- escapeMakeIndexChars(this,t,memname);
- t << "}}" << endl;
-
- t << "\\index{" << escapeLabelName(memname) << "@{";
- escapeMakeIndexChars(this,t,memname);
- t << "}";
- if (clname)
- {
- t << "!" << clname << "@{";
- docify(clname);
- t << "}";
- }
- t << "}" << endl;
- }
- if (Config_getBool("COMPACT_LATEX")) t << "\\paragraph"; else t << "\\subsubsection";
- if (Config_getBool("PDF_HYPERLINKS") && memname)
- {
- t << "[";
- escapeMakeIndexChars(this,t,memname);
- //filterTitle(title)
- t << "]";
- }
- t << "{\\setlength{\\rightskip}{0pt plus 5cm}";
-}
-
-void LatexGenerator::endMemberDoc(bool)
-{
- t << "}";
- if (Config_getBool("COMPACT_LATEX")) t << "\\hfill";
-}
-
-void LatexGenerator::startDoxyAnchor(const char *fName,const char *,
- const char *anchor, const char *,
- const char *)
-{
- if (Config_getBool("PDF_HYPERLINKS"))
- {
- t << "\\hypertarget{";
- if (fName) t << stripPath(fName);
- if (anchor) t << "_" << anchor;
- t << "}{" << endl;
- }
-}
-
-void LatexGenerator::endDoxyAnchor(const char *fName,const char *anchor)
-{
- if (Config_getBool("PDF_HYPERLINKS"))
- {
- t << "}" << endl;
- }
- t << "\\label{";
- if (fName) t << fName;
- if (anchor) t << "_" << anchor;
- t << "}" << endl;
-}
-
-void LatexGenerator::writeAnchor(const char *fName,const char *name)
-{
- //printf("LatexGenerator::writeAnchor(%s,%s)\n",fName,name);
- t << "\\label{" << name << "}" << endl;
- if (fName && Config_getBool("PDF_HYPERLINKS"))
- {
- t << "\\hypertarget{" << stripPath(fName) << "_" << name << "}{}" << endl;
- }
-}
-
-
-//void LatexGenerator::writeLatexLabel(const char *clName,const char *anchor)
-//{
-// writeDoxyAnchor(0,clName,anchor,0);
-//}
-
-void LatexGenerator::addIndexItem(const char *s1,const char *s2)
-{
- if (s1)
- {
- t << "\\index{" << escapeLabelName(s1) << "@{";
- escapeMakeIndexChars(this,t,s1);
- t << "}";
- if (s2)
- {
- t << "!" << escapeLabelName(s2) << "@{";
- escapeMakeIndexChars(this,t,s2);
- t << "}";
- }
- t << "}";
- }
-}
-
-
-void LatexGenerator::startSection(const char *lab,const char *,SectionInfo::SectionType type)
-{
- if (Config_getBool("PDF_HYPERLINKS"))
- {
- t << "\\hypertarget{" << stripPath(lab) << "}{}";
- }
- t << "\\";
- if (Config_getBool("COMPACT_LATEX"))
- {
- switch(type)
- {
- case SectionInfo::Page: t << "subsection"; break;
- case SectionInfo::Section: t << "subsubsection"; break;
- case SectionInfo::Subsection: t << "paragraph"; break;
- case SectionInfo::Subsubsection: t << "subparagraph"; break;
- case SectionInfo::Paragraph: t << "subparagraph"; break;
- default: ASSERT(0); break;
- }
- t << "{";
- }
- else
- {
- switch(type)
- {
- case SectionInfo::Page: t << "section"; break;
- case SectionInfo::Section: t << "subsection"; break;
- case SectionInfo::Subsection: t << "subsubsection"; break;
- case SectionInfo::Subsubsection: t << "paragraph"; break;
- case SectionInfo::Paragraph: t << "subparagraph"; break;
- default: ASSERT(0); break;
- }
- t << "{";
- }
-}
-
-void LatexGenerator::endSection(const char *lab,SectionInfo::SectionType)
-{
- t << "}\\label{" << lab << "}" << endl;
-}
-
-
-//void LatexGenerator::docifyStatic(QTextStream &t,const char *str)
-void LatexGenerator::docify(const char *str)
-{
- filterLatexString(t,str,insideTabbing,FALSE);
-}
-
-void LatexGenerator::codify(const char *str)
-{
- static bool isJapanese = theTranslator->idLanguage()=="japanese" ||
- theTranslator->idLanguage()=="japanese-en";
-
- if (str)
- {
- const char *p=str;
- char c;
- int spacesToNextTabStop;
- int &tabSize = Config_getInt("TAB_SIZE");
- while (*p)
- {
- static bool MultiByte = FALSE;
- c=*p++;
-
- if( isJapanese )
- {
- if ( MultiByte )
- {
- t << (char)c;
- MultiByte = FALSE;
- continue;
- }
- if ((uchar)c>=0x80) // char in range [0x80..0xff]
- {
- t << (char)c;
- MultiByte = TRUE;
- continue;
- }
- }
-
- switch(c)
- {
- case 0x0c: break; // remove ^L
- case '\t': spacesToNextTabStop =
- tabSize - (col%tabSize);
- t << spaces.left(spacesToNextTabStop);
- col+=spacesToNextTabStop;
- break;
- case '\n': t << '\n'; col=0; break;
- default: t << c; col++; break;
- }
- }
- }
-}
-
-void LatexGenerator::writeChar(char c)
-{
- char cs[2];
- cs[0]=c;
- cs[1]=0;
- docify(cs);
-}
-
-void LatexGenerator::startClassDiagram()
-{
- //if (Config_getBool("COMPACT_LATEX")) t << "\\subsubsection"; else t << "\\subsection";
- //t << "{";
-}
-
-void LatexGenerator::endClassDiagram(ClassDiagram &d,
- const char *fileName,const char *)
-{
- d.writeFigure(t,dir,fileName);
-}
-
-
-void LatexGenerator::startAnonTypeScope(int indent)
-{
- if (indent==0)
- {
- t << "\\begin{tabbing}" << endl;
- t << "xx\\=xx\\=xx\\=xx\\=xx\\=xx\\=xx\\=xx\\=xx\\=\\kill" << endl;
- //printf("LatexGenerator::startMemberItem() insideTabbing=TRUE\n");
- insideTabbing=TRUE;
- }
-}
-
-void LatexGenerator::endAnonTypeScope(int indent)
-{
- if (indent==0)
- {
- t << endl << "\\end{tabbing}";
- insideTabbing=FALSE;
- }
-}
-
-void LatexGenerator::startMemberItem(int)
-{
- //printf("LatexGenerator::startMemberItem(%d)\n",annType);
- if (!insideTabbing)
- {
- t << "\\item " << endl;
- }
-}
-
-void LatexGenerator::endMemberItem()
-{
- if (insideTabbing)
- {
- t << "\\\\";
- }
- t << endl;
-}
-
-void LatexGenerator::startMemberDescription()
-{
- if (!insideTabbing)
- {
- t << "\\begin{CompactList}\\small\\item\\em ";
- }
- else
- {
- for (int i=0;i<m_indent+1;i++) t << "\\>";
- t << "{\\em ";
- }
-}
-
-void LatexGenerator::endMemberDescription()
-{
- if (!insideTabbing)
- {
- t << "\\item\\end{CompactList}";
- }
- else
- {
- t << "}\\\\";
- m_indent=0;
- }
-}
-
-
-void LatexGenerator::writeNonBreakableSpace(int)
-{
- if (insideTabbing)
- {
- t << "\\>";
- m_indent++;
- }
- else
- t << "~";
-}
-
-void LatexGenerator::startMemberList()
-{
- if (!insideTabbing)
- {
- t << "\\begin{CompactItemize}" << endl;
- }
-}
-
-void LatexGenerator::endMemberList()
-{
- //printf("LatexGenerator::endMemberList(%d)\n",insideTabbing);
- if (!insideTabbing)
- {
- t << "\\end{CompactItemize}" << endl;
- }
-}
-
-
-void LatexGenerator::startMemberGroupHeader(bool hasHeader)
-{
- if (hasHeader) t << "\\begin{Indent}";
- t << "{\\bf ";
-}
-
-void LatexGenerator::endMemberGroupHeader()
-{
- t << "}\\par" << endl;
-}
-
-void LatexGenerator::startMemberGroupDocs()
-{
- t << "{\\em ";
-}
-
-void LatexGenerator::endMemberGroupDocs()
-{
- t << "}";
-}
-
-void LatexGenerator::startMemberGroup()
-{
-}
-
-void LatexGenerator::endMemberGroup(bool hasHeader)
-{
- if (hasHeader)t << "\\end{Indent}";
- t << endl;
-}
-
-void LatexGenerator::startDotGraph()
-{
-}
-
-void LatexGenerator::endDotGraph(DotClassGraph &g)
-{
- g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),relPath);
-}
-
-void LatexGenerator::startInclDepGraph()
-{
-}
-
-void LatexGenerator::endInclDepGraph(DotInclDepGraph &g)
-{
- g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),relPath);
-}
-
-void LatexGenerator::startGroupCollaboration()
-{
-}
-
-void LatexGenerator::endGroupCollaboration(DotGroupCollaboration &g)
-{
- g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),relPath);
-}
-
-void LatexGenerator::startCallGraph()
-{
-}
-
-void LatexGenerator::endCallGraph(DotCallGraph &g)
-{
- g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),relPath);
-}
-
-void LatexGenerator::startDirDepGraph()
-{
-}
-
-void LatexGenerator::endDirDepGraph(DotDirDeps &g)
-{
- g.writeGraph(t,EPS,Config_getString("LATEX_OUTPUT"),relPath);
-}
-
-void LatexGenerator::startDescription()
-{
- t << "\\begin{description}" << endl;
-}
-
-void LatexGenerator::endDescription()
-{
- t << "\\end{description}" << endl;
- firstDescItem=TRUE;
-}
-
-void LatexGenerator::startDescItem()
-{
- firstDescItem=TRUE;
- t << "\\item[";
-}
-
-void LatexGenerator::endDescItem()
-{
- if (firstDescItem)
- {
- t << "]" << endl;
- firstDescItem=FALSE;
- }
- else
- {
- lineBreak();
- }
-}
-
-void LatexGenerator::startSimpleSect(SectionTypes,const char *file,
- const char *anchor,const char *title)
-{
- t << "\\begin{Desc}\n\\item[";
- if (file)
- {
- writeObjectLink(0,file,anchor,title);
- }
- else
- {
- docify(title);
- }
- t << "]";
-}
-
-void LatexGenerator::endSimpleSect()
-{
- t << "\\end{Desc}" << endl;
-}
-
-void LatexGenerator::startParamList(ParamListTypes,const char *title)
-{
- t << "\\begin{Desc}\n\\item[";
- docify(title);
- t << "]";
-}
-
-void LatexGenerator::endParamList()
-{
- t << "\\end{Desc}" << endl;
-}
-
-
-void LatexGenerator::printDoc(DocNode *n,const char *langExt)
-{
- LatexDocVisitor *visitor = new LatexDocVisitor(t,*this,langExt,insideTabbing);
- n->accept(visitor);
- delete visitor;
-}
-
diff --git a/src/latexgen.h b/src/latexgen.h
deleted file mode 100644
index 2d347ea..0000000
--- a/src/latexgen.h
+++ /dev/null
@@ -1,224 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 LATEXGEN_H
-#define LATEXGEN_H
-
-#include "outputgen.h"
-
-class QFile;
-
-class LatexGenerator : public OutputGenerator
-{
- public:
- LatexGenerator();
- ~LatexGenerator();
- static void init();
- static void writeStyleSheetFile(QFile &f);
- static void writeHeaderFile(QFile &f);
-
- //OutputGenerator *copy();
- //OutputGenerator *clone() { return new LatexGenerator(*this); }
- //void append(const OutputGenerator *o);
- void enable()
- { if (genStack->top()) active=*genStack->top(); else active=TRUE; }
- void disable() { active=FALSE; }
- void enableIf(OutputType o) { if (o==Latex) active=TRUE; }
- void disableIf(OutputType o) { if (o==Latex) active=FALSE; }
- void disableIfNot(OutputType o) { if (o!=Latex) active=FALSE; }
- bool isEnabled(OutputType o) { return (o==Latex && active); }
- OutputGenerator *get(OutputType o) { return (o==Latex) ? this : 0; }
-
- void printDoc(DocNode *,const char *);
-
- void startFile(const char *name,const char *manName,const char *title);
- void writeFooter() {}
- void endFile();
- void clearBuffer();
-
- void startIndexSection(IndexSections);
- void endIndexSection(IndexSections);
- void startProjectNumber();
- void endProjectNumber() {}
- void writeStyleInfo(int part);
- void startTitleHead(const char *);
- void startTitle();
- void endTitleHead(const char *,const char *name);
- void endTitle() { t << "}"; }
-
- void newParagraph();
- void writeString(const char *text);
- void startIndexList() { t << "\\begin{CompactList}" << endl; }
- void endIndexList() { t << "\\end{CompactList}" << endl; }
- void startIndexKey();
- void endIndexKey();
- void startIndexValue(bool);
- void endIndexValue(const char *,bool);
- void startItemList() { t << "\\begin{CompactItemize}" << endl; }
- void endItemList() { t << "\\end{CompactItemize}" << endl; }
- void writeIndexItem(const char *ref,const char *file,const char *name);
- void docify(const char *text);
- void codify(const char *text);
- void writeObjectLink(const char *ref,const char *file,
- const char *anchor,const char *name);
- void writeCodeLink(const char *ref, const char *file,
- const char *anchor,const char *name);
- void startTextLink(const char *,const char *);
- void endTextLink();
- void startHtmlLink(const char *url);
- void endHtmlLink();
- void startTypewriter() { t << "{\\tt "; }
- void endTypewriter() { t << "}"; }
- void startGroupHeader();
- void endGroupHeader();
- void writeListItem() { t << "\\item " << endl; }
-
- void startMemberSections() {}
- void endMemberSections() {}
- void startMemberHeader();
- void endMemberHeader();
- void startMemberSubtitle() {}
- void endMemberSubtitle() {}
- void startMemberList();
- void endMemberList();
- void startAnonTypeScope(int);
- void endAnonTypeScope(int);
- void startMemberItem(int);
- void endMemberItem();
- void startMemberTemplateParams() {}
- void endMemberTemplateParams() {}
-
- void startMemberGroupHeader(bool);
- void endMemberGroupHeader();
- void startMemberGroupDocs();
- void endMemberGroupDocs();
- void startMemberGroup();
- void endMemberGroup(bool);
-
- void insertMemberAlign(bool) {}
-
- void writeRuler() { t << endl << endl; /*t << "\\vspace{0.4cm}\\hrule\\vspace{0.2cm}" << endl; */ }
- void writeAnchor(const char *fileName,const char *name);
- void startCodeFragment() { t << endl << endl << "\\footnotesize\\begin{verbatim}"; }
- void endCodeFragment() { t << "\\end{verbatim}\\normalsize " << endl; }
- void writeLineNumber(const char *,const char *,const char *,int l) { t << l << " "; }
- void startCodeLine() { col=0; }
- void endCodeLine() { codify("\n"); }
- void startEmphasis() { t << "{\\em "; }
- void endEmphasis() { t << "}"; }
- void startBold() { t << "{\\bf "; }
- void endBold() { t << "}"; }
- void startDescription();
- void endDescription();
- void startDescItem();
- void endDescItem();
- void lineBreak() { t << "\\par\n"; }
- void startMemberDoc(const char *,const char *,const char *,const char *);
- void endMemberDoc(bool);
- void startDoxyAnchor(const char *,const char *,const char *,const char *,const char *);
- void endDoxyAnchor(const char *,const char *);
- void startCodeAnchor(const char *) {}
- void endCodeAnchor() {}
- void writeChar(char c);
- void writeLatexSpacing() { t << "\\hspace{0.3cm}"; }
- void writeStartAnnoItem(const char *type,const char *file,
- const char *path,const char *name);
- void writeEndAnnoItem(const char *name);
- void startSubsection() { t << "\\subsection*{"; }
- void endSubsection() { t << "}" << endl; }
- void startSubsubsection() { t << "\\subsubsection*{"; }
- void endSubsubsection() { t << "}" << endl; }
- void startCenter() { t << "\\begin{center}" << endl; }
- void endCenter() { t << "\\end{center}" << endl; }
- void startSmall() { t << "\\footnotesize "; }
- void endSmall() { t << "\\normalsize "; }
- void startMemberDescription();
- void endMemberDescription();
- void startDescList(SectionTypes) { t << "\\begin{Desc}\n\\item["; }
- void endDescList() { t << "\\end{Desc}" << endl; }
- void startSimpleSect(SectionTypes,const char *,const char *,const char *);
- void endSimpleSect();
- void startParamList(ParamListTypes,const char *title);
- void endParamList();
- void writeDescItem() { t << "\\par" << endl; }
- void startSection(const char *,const char *,SectionInfo::SectionType);
- void endSection(const char *,SectionInfo::SectionType);
- void addIndexItem(const char *,const char *);
- void startIndent() {}
- void endIndent() {}
- void writeSynopsis() {}
- void startClassDiagram();
- void endClassDiagram(ClassDiagram &,const char *,const char *);
- void startPageRef();
- void endPageRef(const char *,const char *);
- void writeQuickLinks(bool,HighlightedItem) {}
- void writeNonBreakableSpace(int);
-
- void startDescTable()
- { t << "\\begin{description}" << endl; }
- void endDescTable()
- { t << "\\end{description}" << endl; }
- void startDescTableTitle()
- { t << "\\item[{\\em " << endl; }
- void endDescTableTitle()
- { t << "}]"; }
- void startDescTableData() {}
- void endDescTableData() {}
- void lastIndexPage() {}
-
- void startDotGraph();
- void endDotGraph(DotClassGraph &);
- void startInclDepGraph();
- void endInclDepGraph(DotInclDepGraph &);
- void startCallGraph();
- void startGroupCollaboration();
- void endGroupCollaboration(DotGroupCollaboration &g);
- void endCallGraph(DotCallGraph &);
- void startDirDepGraph();
- void endDirDepGraph(DotDirDeps &g);
- void writeGraphicalHierarchy(DotGfxHierarchyTable &) {}
-
- void startTextBlock(bool) {}
- void endTextBlock(bool) {}
-
- void startMemberDocPrefixItem() {}
- void endMemberDocPrefixItem() {}
- void startMemberDocName(bool) {}
- void endMemberDocName() {}
- void startParameterType(bool,const char *) {}
- void endParameterType() {}
- void startParameterName(bool) {}
- void endParameterName(bool,bool,bool) {}
- void startParameterList(bool) {}
- void endParameterList() {}
-
- void startFontClass(const char *) {}
- void endFontClass() {}
-
- void writeCodeAnchor(const char *) {}
-
- private:
- LatexGenerator(const LatexGenerator &);
- LatexGenerator &operator=(const LatexGenerator &);
- int col;
- bool insideTabbing;
- bool firstDescItem;
- QCString relPath;
- int m_indent;
-};
-
-#endif
diff --git a/src/libdoxycfg.pro.in b/src/libdoxycfg.pro.in
deleted file mode 100644
index 9dabaa6..0000000
--- a/src/libdoxycfg.pro.in
+++ /dev/null
@@ -1,27 +0,0 @@
-#
-#
-#
-# Copyright (C) 1997-2005 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.
-#
-# TMake project file for doxygen
-
-TEMPLATE = libdoxycfg.t
-CONFIG = console warn_on staticlib $extraopts
-HEADERS = config.h
-SOURCES = config.cpp
-win32:TMAKE_CXXFLAGS += -DQT_NODLL
-win32-g++:TMAKE_CXXFLAGS += -fno-exceptions -fno-rtti
-INCLUDEPATH += ../qtools
-win32:INCLUDEPATH += .
-DESTDIR = ../lib
-TARGET = doxycfg
-OBJECTS_DIR = ../objects
diff --git a/src/libdoxycfg.t b/src/libdoxycfg.t
deleted file mode 100644
index 3186e5d..0000000
--- a/src/libdoxycfg.t
+++ /dev/null
@@ -1,49 +0,0 @@
-#
-#
-#
-# Copyright (C) 1997-2005 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.
-#!
-#! doxygen.t: This is a custom template for building Doxygen
-#!
-#$ IncludeTemplate("lib.t");
-
-LEX = flex
-YACC = bison
-
-#${
-sub GenerateDep {
- my($obj,$src,$dep) = @_;
- my(@objv,$srcv,$i,$s,$o,$d,$c);
- @objv = split(/\s+/,$obj);
- @srcv = split(/\s+/,$src);
- for $i ( 0..$#objv ) {
- $s = $srcv[$i];
- $o = $objv[$i];
- next if $s eq "";
- $text .= $o . ": " . $s;
- $text .= " ${linebreak}\n\t\t" . $dep if $dep ne "";
- if ( $moc_output{$s} ne "" ) {
- $text .= " ${linebreak}\n\t\t" . $moc_output{$s};
- }
- $d = &make_depend($s);
- $text .= " ${linebreak}\n\t\t" . $d if $d ne "";
- $text .= "\n";
- }
- chop $text;
-}
-#$}
-
-####################
-
-#$ GenerateDep("config.cpp","config.l");
- $(LEX) -PconfigYY -t config.l >config.cpp
-
diff --git a/src/libdoxygen.pro.in b/src/libdoxygen.pro.in
deleted file mode 100644
index 6f6d2ab..0000000
--- a/src/libdoxygen.pro.in
+++ /dev/null
@@ -1,208 +0,0 @@
-#
-#
-#
-# Copyright (C) 1997-2005 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.
-#
-# TMake project file for doxygen
-
-TEMPLATE = libdoxygen.t
-CONFIG = console warn_on staticlib $extraopts
-HEADERS = bufstr.h \
- classdef.h \
- classlist.h \
- cmdmapper.h \
- code.h \
- commentcnv.h \
- commentscan.h \
- compound_xsd.h \
- config.h \
- constexp.h \
- cppvalue.h \
- debug.h \
- declinfo.h \
- defargs.h \
- defgen.h \
- define.h \
- definition.h \
- diagram.h \
- dirdef.h \
- docparser.h \
- doctokenizer.h \
- docvisitor.h \
- dot.h \
- doxygen.h \
- entry.h \
- example.h \
- filedef.h \
- filename.h \
- formula.h \
- ftvhelp.h \
- groupdef.h \
- htags.h \
- htmlattrib.h \
- htmldocvisitor.h \
- htmlgen.h \
- htmlhelp.h \
- image.h \
- index.h \
- index_xsd.h \
- instdox.h \
- language.h \
- latexdocvisitor.h \
- latexgen.h \
- logos.h \
- mandocvisitor.h \
- mangen.h \
- memberdef.h \
- membergroup.h \
- memberlist.h \
- membername.h \
- message.h \
- namespacedef.h \
- outputgen.h \
- outputlist.h \
- pagedef.h \
- perlmodgen.h \
- pngenc.h \
- pre.h \
- printdocvisitor.h \
- pycode.h \
- pyscanner.h \
- qtbc.h \
- reflist.h \
- rtfdocvisitor.h \
- rtfgen.h \
- rtfstyle.h \
- scanner.h \
- searchindex.h \
- search_php.h \
- section.h \
- sortdict.h \
- tagreader.h \
- translator.h \
- translator_adapter.h \
- translator_br.h \
- translator_ca.h \
- translator_cn.h \
- translator_cz.h \
- translator_de.h \
- translator_dk.h \
- translator_en.h \
- translator_es.h \
- translator_fi.h \
- translator_fr.h \
- translator_gr.h \
- translator_hr.h \
- translator_hu.h \
- translator_id.h \
- translator_it.h \
- translator_je.h \
- translator_jp.h \
- translator_ke.h \
- translator_kr.h \
- translator_nl.h \
- translator_no.h \
- translator_pl.h \
- translator_pt.h \
- translator_ro.h \
- translator_ru.h \
- translator_se.h \
- translator_si.h \
- translator_sk.h \
- translator_sr.h \
- translator_tw.h \
- translator_ua.h \
- translator_za.h \
- unistd.h \
- util.h \
- version.h \
- xmldocvisitor.h \
- xmlgen.h
-SOURCES = ce_lex.cpp \
- ce_parse.cpp \
- classdef.cpp \
- classlist.cpp \
- cmdmapper.cpp \
- code.cpp \
- commentcnv.cpp \
- cppvalue.cpp \
- debug.cpp \
- defgen.cpp \
- declinfo.cpp \
- defargs.cpp \
- define.cpp \
- definition.cpp \
- diagram.cpp \
- dirdef.cpp \
- docparser.cpp \
- doctokenizer.cpp \
- dot.cpp \
- doxygen.cpp \
- entry.cpp \
- filedef.cpp \
- filename.cpp \
- formula.cpp \
- ftvhelp.cpp \
- groupdef.cpp \
- htags.cpp \
- htmldocvisitor.cpp \
- htmlgen.cpp \
- htmlhelp.cpp \
- image.cpp \
- index.cpp \
- instdox.cpp \
- language.cpp \
- latexdocvisitor.cpp \
- latexgen.cpp \
- logos.cpp \
- mandocvisitor.cpp \
- mangen.cpp \
- memberdef.cpp \
- membergroup.cpp \
- memberlist.cpp \
- membername.cpp \
- message.cpp \
- namespacedef.cpp \
- outputgen.cpp \
- outputlist.cpp \
- pagedef.cpp \
- perlmodgen.cpp \
- pngenc.cpp \
- pre.cpp \
- pycode.cpp \
- pyscanner.cpp \
- reflist.cpp \
- rtfdocvisitor.cpp \
- rtfgen.cpp \
- rtfstyle.cpp \
- scanner.cpp \
- searchindex.cpp \
- tagreader.cpp \
- translator.cpp \
- util.cpp \
- version.cpp \
- xmldocvisitor.cpp \
- xmlgen.cpp \
- commentscan.cpp
-
-win32:TMAKE_CXXFLAGS += -DQT_NODLL
-win32-msvc:TMAKE_CXXFLAGS += -Zm200
-win32-g++:TMAKE_CXXFLAGS += -fno-exceptions -fno-rtti
-INCLUDEPATH += ../qtools
-INCLUDEPATH += ../libpng
-INCLUDEPATH += ../libmd5
-win32:INCLUDEPATH += .
-win32-g++:INCLUDEPATH = ../qtools /usr/include/libpng12 ../libmd5
-DESTDIR = ../lib
-TARGET = doxygen
-OBJECTS_DIR = ../objects
-
diff --git a/src/libdoxygen.t b/src/libdoxygen.t
deleted file mode 100644
index 189684e..0000000
--- a/src/libdoxygen.t
+++ /dev/null
@@ -1,96 +0,0 @@
-#
-#
-#
-# Copyright (C) 1997-2005 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.
-#!
-#! doxygen.t: This is a custom template for building Doxygen
-#!
-#$ IncludeTemplate("lib.t");
-
-LEX = flex
-YACC = bison
-INCBUFSIZE = $(PERL) increasebuffer.pl
-
-#${
-sub GenerateDep {
- my($obj,$src,$dep) = @_;
- my(@objv,$srcv,$i,$s,$o,$d,$c);
- @objv = split(/\s+/,$obj);
- @srcv = split(/\s+/,$src);
- for $i ( 0..$#objv ) {
- $s = $srcv[$i];
- $o = $objv[$i];
- next if $s eq "";
- $text .= $o . ": " . $s;
- $text .= " ${linebreak}\n\t\t" . $dep if $dep ne "";
- if ( $moc_output{$s} ne "" ) {
- $text .= " ${linebreak}\n\t\t" . $moc_output{$s};
- }
- $d = &make_depend($s);
- $text .= " ${linebreak}\n\t\t" . $d if $d ne "";
- $text .= "\n";
- }
- chop $text;
-}
-#$}
-
-####################
-
-#$ GenerateDep("scanner.cpp","scanner.l");
- $(LEX) -PscanYY -t scanner.l | $(INCBUFSIZE) >scanner.cpp
-
-#$ GenerateDep("code.cpp","code.l");
- $(LEX) -PcodeYY -t code.l | $(INCBUFSIZE) >code.cpp
-
-#$ GenerateDep("pyscanner.cpp","pyscanner.l");
- $(LEX) -PpyscanYY -t pyscanner.l | $(INCBUFSIZE) >pyscanner.cpp
-
-#$ GenerateDep("pycode.cpp","pycode.l");
- $(LEX) -PpycodeYY -t pycode.l | $(INCBUFSIZE) >pycode.cpp
-
-#$ GenerateDep("pre.cpp","pre.l");
- $(LEX) -PpreYY -t pre.l | $(INCBUFSIZE) >pre.cpp
-
-#$ GenerateDep("declinfo.cpp","declinfo.l");
- $(LEX) -PdeclinfoYY -t declinfo.l >declinfo.cpp
-
-#$ GenerateDep("defargs.cpp","defargs.l");
- $(LEX) -PdefargsYY -t defargs.l >defargs.cpp
-
-#$ GenerateDep("doctokenizer.cpp","doctokenizer.l");
- $(LEX) -PdoctokenizerYY -t doctokenizer.l >doctokenizer.cpp
-
-#$ GenerateDep("commentcnv.cpp","commentcnv.l");
- $(LEX) -PcommentcnvYY -t commentcnv.l >commentcnv.cpp
-
-#$GenerateDep("commentscan.cpp","commentscan.l");
- $(LEX) -PcommentScanYY -t commentscan.l >commentscan.cpp
-
-#$ GenerateDep("ce_lex.cpp","constexp.l","ce_parse.h");
- $(LEX) -PcppExpYY -t constexp.l >ce_lex.cpp
-
-#$ GenerateDep("ce_parse.cpp","constexp.y");
- $(YACC) -l -p cppExpYY constexp.y -o ce_parse.cpp
-
-#$ GenerateDep("ce_parse.h","constexp.y");
- $(YACC) -l -d -p cppExpYY constexp.y -o ce_parse.c
- -rm ce_parse.c
-
-index_xsd.h: index.xsd
- cat index.xsd | sed -e "s/\\\\/\\\\\\\\/g" -e "s/\"/\\\\\"/g" -e "s/^/\"/g" -e "s/$$/\\\\n\"/g" >index_xsd.h
-
-compound_xsd.h: compound.xsd
- cat compound.xsd | sed -e "s/\\\\/\\\\\\\\/g" -e "s/\"/\\\\\"/g" -e "s/^/\"/g" -e "s/$$/\\\\n\"/g" >compound_xsd.h
-
-search_php.h: search.php
- cat search.php | sed -e "s/\\\\/\\\\\\\\/g" -e "s/\"/\\\\\"/g" -e "s/^/\"/g" -e "s/$$/\\\\n\"/g" >search_php.h
-
diff --git a/src/logos.cpp b/src/logos.cpp
deleted file mode 100644
index cee90c1..0000000
--- a/src/logos.cpp
+++ /dev/null
@@ -1,3072 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 "qtbc.h"
-#include <qfile.h>
-#include <qdir.h>
-
-
-unsigned char doxygen_png_data[] = {
- 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
- 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x64, 0x00, 0x00, 0x00, 0x2d,
- 0x08, 0x03, 0x00, 0x00, 0x00, 0x6f, 0x6b, 0x3e, 0xc2, 0x00, 0x00, 0x00,
- 0x04, 0x67, 0x41, 0x4d, 0x41, 0x00, 0x00, 0xd6, 0xd8, 0xd4, 0x4f, 0x58,
- 0x32, 0x00, 0x00, 0x00, 0x19, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66,
- 0x74, 0x77, 0x61, 0x72, 0x65, 0x00, 0x41, 0x64, 0x6f, 0x62, 0x65, 0x20,
- 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x65, 0x61, 0x64, 0x79, 0x71, 0xc9,
- 0x65, 0x3c, 0x00, 0x00, 0x00, 0x5d, 0x50, 0x4c, 0x54, 0x45, 0x00, 0x00,
- 0x00, 0xc7, 0xbe, 0xcf, 0x22, 0x26, 0xa9, 0xc8, 0xce, 0xef, 0xb6, 0xbb,
- 0xd6, 0xd3, 0xda, 0xfa, 0x93, 0xa2, 0xde, 0xa0, 0xac, 0xe0, 0xb6, 0xc2,
- 0xf5, 0x7f, 0x87, 0xa7, 0xd5, 0xd9, 0xea, 0xc9, 0xca, 0xce, 0xe1, 0xe2,
- 0xe6, 0x7b, 0x8e, 0xd4, 0x8d, 0xa1, 0xeb, 0x88, 0x99, 0xd7, 0xa0, 0xb2,
- 0xf8, 0xa7, 0xac, 0xb9, 0xc0, 0xc0, 0xb1, 0xdd, 0xdd, 0xce, 0xf9, 0xf9,
- 0xe9, 0xf5, 0xf5, 0xe7, 0xeb, 0xeb, 0xe5, 0x45, 0x44, 0x39, 0xd7, 0xd6,
- 0xcb, 0x68, 0x67, 0x5d, 0x1f, 0x1d, 0x13, 0x5f, 0x58, 0x3c, 0x40, 0x3a,
- 0x23, 0x6d, 0x68, 0x55, 0xff, 0xff, 0xff, 0xdd, 0xc0, 0x7f, 0x31, 0x00,
- 0x00, 0x00, 0x1f, 0x74, 0x52, 0x4e, 0x53, 0xff, 0xff, 0xff, 0xff, 0xff,
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
- 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
- 0xff, 0x00, 0xcd, 0x19, 0x76, 0x10, 0x00, 0x00, 0x03, 0xff, 0x49, 0x44,
- 0x41, 0x54, 0x78, 0xda, 0x62, 0x90, 0x43, 0x00, 0x06, 0x08, 0x90, 0xa3,
- 0x3a, 0x00, 0x08, 0x20, 0x64, 0x23, 0x19, 0x84, 0x84, 0x85, 0x85, 0x85,
- 0x68, 0x60, 0x09, 0x40, 0x00, 0xa1, 0x58, 0x22, 0x2c, 0x2a, 0x2a, 0x2a,
- 0x4c, 0x03, 0x4b, 0x00, 0x02, 0x88, 0x2e, 0x96, 0x00, 0x04, 0x10, 0x5d,
- 0x2c, 0x01, 0x08, 0x20, 0xba, 0x58, 0x02, 0x10, 0x40, 0x74, 0xb1, 0x04,
- 0x20, 0x80, 0xe8, 0x62, 0x09, 0x40, 0x00, 0xd1, 0xc5, 0x12, 0x80, 0x00,
- 0x42, 0xb5, 0x44, 0x84, 0x36, 0x96, 0x00, 0x04, 0x10, 0x9a, 0x25, 0x22,
- 0x22, 0xb4, 0xb0, 0x04, 0x20, 0x80, 0x18, 0x90, 0x0b, 0x14, 0x98, 0x25,
- 0x0c, 0x0c, 0x88, 0x12, 0x06, 0x99, 0x42, 0x14, 0x3a, 0x48, 0xa2, 0x88,
- 0xb2, 0x08, 0xc1, 0x66, 0x40, 0x95, 0x00, 0x08, 0x20, 0x88, 0x52, 0x50,
- 0x79, 0x02, 0x04, 0x22, 0x10, 0x4b, 0x60, 0x5c, 0x50, 0x11, 0x03, 0x62,
- 0x43, 0x28, 0x21, 0x49, 0x06, 0x49, 0x21, 0x68, 0xa9, 0x03, 0x11, 0x85,
- 0xeb, 0x83, 0x28, 0x81, 0xf1, 0x84, 0x90, 0xc4, 0x21, 0xea, 0x01, 0x02,
- 0x88, 0x01, 0xac, 0x43, 0x04, 0x01, 0x84, 0x19, 0xc4, 0x85, 0xe0, 0x6c,
- 0x21, 0x30, 0x5b, 0x58, 0x5c, 0x4a, 0x5c, 0x18, 0x24, 0x03, 0x54, 0x08,
- 0x0e, 0x4d, 0x06, 0x88, 0x28, 0x92, 0x3e, 0x61, 0x06, 0x24, 0x53, 0x84,
- 0x18, 0x90, 0x0c, 0x04, 0xd9, 0x02, 0x10, 0x40, 0x0c, 0xd0, 0xa8, 0x40,
- 0x52, 0x2e, 0x24, 0x82, 0xac, 0x04, 0x4c, 0x4a, 0x42, 0x02, 0x52, 0x18,
- 0xa2, 0x89, 0x41, 0x10, 0xcc, 0x10, 0x47, 0x31, 0x0a, 0xac, 0x0b, 0x16,
- 0x18, 0xc2, 0x28, 0x46, 0xc8, 0x01, 0x04, 0x10, 0x83, 0x1c, 0xd4, 0x50,
- 0x68, 0x68, 0xc1, 0x54, 0xc0, 0x03, 0x0f, 0xa2, 0x19, 0x84, 0x25, 0x21,
- 0x1e, 0x60, 0x80, 0x26, 0x10, 0x71, 0xb0, 0x25, 0x10, 0x75, 0xc2, 0x0c,
- 0x50, 0x07, 0x20, 0xb9, 0x06, 0xa2, 0x0b, 0xac, 0x01, 0x20, 0x80, 0x18,
- 0x20, 0xb9, 0x43, 0x54, 0x08, 0x18, 0x24, 0x42, 0xa2, 0xe0, 0x7c, 0x82,
- 0xc2, 0x05, 0xba, 0x57, 0x14, 0x02, 0x84, 0xa4, 0x18, 0xc0, 0x6c, 0xa0,
- 0xa3, 0x21, 0x12, 0x42, 0x60, 0x52, 0x06, 0x24, 0x28, 0x0c, 0x16, 0x03,
- 0x85, 0x19, 0xc4, 0x08, 0x88, 0x91, 0x92, 0xc2, 0x10, 0x9e, 0x1c, 0x40,
- 0x00, 0x41, 0xc5, 0x25, 0xc4, 0x19, 0x18, 0xa4, 0xc4, 0x25, 0x40, 0x2c,
- 0x06, 0x28, 0x97, 0x01, 0xca, 0x15, 0x82, 0xda, 0x01, 0x12, 0x02, 0xb1,
- 0x25, 0x24, 0xc1, 0xe2, 0xe2, 0x52, 0x12, 0x50, 0x6d, 0x42, 0x20, 0x55,
- 0x60, 0x31, 0x49, 0x88, 0x59, 0x42, 0x0c, 0x08, 0x15, 0x20, 0x39, 0x39,
- 0x80, 0x00, 0x5c, 0x8d, 0x31, 0x02, 0x00, 0x20, 0x08, 0x02, 0x79, 0x43,
- 0x43, 0x12, 0x43, 0xff, 0x7f, 0x66, 0x22, 0x5b, 0x4e, 0xa0, 0x27, 0x00,
- 0xdc, 0x3d, 0x54, 0x47, 0xc8, 0x92, 0xf8, 0x6c, 0x05, 0x38, 0x98, 0x5e,
- 0x4b, 0xfb, 0x35, 0x8f, 0x3c, 0xea, 0x12, 0x53, 0x81, 0xe6, 0x52, 0xc9,
- 0xa4, 0x94, 0x25, 0xee, 0x13, 0x40, 0x40, 0x01, 0x1e, 0x20, 0xe0, 0x06,
- 0x9b, 0xca, 0x0d, 0x62, 0x31, 0xa0, 0x71, 0xc5, 0x41, 0x14, 0x0f, 0x8f,
- 0x10, 0x58, 0x48, 0x88, 0x07, 0x02, 0xb8, 0x81, 0x26, 0x81, 0xd8, 0x42,
- 0x92, 0x52, 0x20, 0x79, 0x09, 0x06, 0x6e, 0x98, 0x04, 0x50, 0x84, 0x01,
- 0xcc, 0xe3, 0x96, 0x02, 0x1b, 0x00, 0x34, 0x41, 0x0e, 0x20, 0x80, 0x80,
- 0x6a, 0xb9, 0x80, 0x80, 0x1b, 0x1c, 0x3e, 0xdc, 0x20, 0x16, 0x03, 0x98,
- 0x0b, 0x74, 0x21, 0x98, 0x2b, 0x28, 0x2e, 0xc8, 0xc5, 0x05, 0x57, 0x01,
- 0x51, 0x02, 0x12, 0x06, 0xb1, 0x41, 0x32, 0xdc, 0xdc, 0x10, 0x4d, 0x10,
- 0x55, 0xdc, 0x82, 0x92, 0x92, 0x82, 0x82, 0xe2, 0x0c, 0x60, 0x31, 0xa0,
- 0x25, 0x60, 0x31, 0x06, 0x39, 0x80, 0x00, 0x02, 0x46, 0x3c, 0x0b, 0x33,
- 0x10, 0x08, 0x02, 0x63, 0x5a, 0x10, 0xc4, 0x60, 0x01, 0xf3, 0x05, 0x65,
- 0x21, 0x5c, 0x16, 0x88, 0x20, 0x44, 0x05, 0xc8, 0x2b, 0x10, 0x2e, 0x0b,
- 0x38, 0x33, 0x8b, 0xb3, 0xc0, 0xe4, 0xb8, 0x21, 0x6c, 0x16, 0x59, 0x59,
- 0x41, 0x20, 0x2d, 0x08, 0x36, 0x82, 0x45, 0x4a, 0x8a, 0x05, 0xa2, 0x56,
- 0x0e, 0x20, 0x80, 0x40, 0xa9, 0x9e, 0x03, 0x04, 0x58, 0x58, 0x58, 0x20,
- 0x34, 0x84, 0x0f, 0xe5, 0x0a, 0xca, 0x40, 0x38, 0x10, 0x36, 0xd0, 0x60,
- 0x19, 0x08, 0x13, 0x52, 0x64, 0x08, 0x42, 0xb4, 0x80, 0x34, 0x49, 0x09,
- 0x22, 0x14, 0x02, 0xdd, 0x09, 0x22, 0x81, 0x96, 0x40, 0x78, 0x72, 0x00,
- 0x01, 0x04, 0xca, 0x8c, 0x82, 0x1c, 0x48, 0x80, 0x9d, 0x41, 0x1a, 0xca,
- 0x12, 0x10, 0x10, 0x60, 0x97, 0x66, 0x07, 0x09, 0xc9, 0xc8, 0xb0, 0x43,
- 0x8c, 0x06, 0x06, 0x22, 0x58, 0x00, 0x56, 0x30, 0xc9, 0x08, 0xb2, 0xb3,
- 0x43, 0x0c, 0x62, 0x40, 0x32, 0x85, 0x9d, 0x01, 0xac, 0x48, 0x0a, 0xac,
- 0x16, 0xc8, 0x93, 0x03, 0x08, 0x20, 0x70, 0x29, 0x21, 0x28, 0x00, 0x07,
- 0xec, 0x82, 0x20, 0x9d, 0x30, 0x8e, 0x34, 0x03, 0x88, 0x29, 0x28, 0x25,
- 0x05, 0x52, 0xc1, 0xce, 0x09, 0xb6, 0x04, 0x24, 0x80, 0x54, 0x00, 0xca,
- 0x80, 0xa5, 0xc0, 0xfe, 0x62, 0x87, 0x1b, 0x01, 0x62, 0x81, 0x2c, 0x01,
- 0x73, 0x19, 0xe4, 0x00, 0x02, 0xd0, 0x40, 0x06, 0x37, 0x00, 0xc0, 0x20,
- 0x08, 0xfc, 0xd1, 0xb0, 0x82, 0xd2, 0xee, 0x3f, 0x66, 0xa5, 0xd6, 0x97,
- 0x5c, 0x50, 0x49, 0x78, 0x21, 0x49, 0xb4, 0x0f, 0xa6, 0x22, 0x94, 0x8d,
- 0xc8, 0x88, 0x92, 0x33, 0xa8, 0x0a, 0x51, 0x59, 0x98, 0xff, 0x74, 0x81,
- 0x5e, 0x5e, 0xdb, 0xd8, 0x67, 0x76, 0x2d, 0x20, 0x7d, 0x3e, 0x57, 0x00,
- 0x81, 0x4a, 0x4f, 0x41, 0x56, 0x04, 0x60, 0x04, 0x03, 0x24, 0x26, 0x23,
- 0x94, 0x05, 0xa6, 0x04, 0x19, 0x38, 0xf9, 0xf8, 0xf8, 0x38, 0x19, 0x80,
- 0x5c, 0x46, 0x46, 0x20, 0x9b, 0x53, 0x46, 0x4a, 0x06, 0x24, 0xc2, 0xc6,
- 0x80, 0xd0, 0xc6, 0x8a, 0xd0, 0x0f, 0xa1, 0x18, 0xe4, 0x00, 0x02, 0x88,
- 0x81, 0x81, 0x89, 0x14, 0xc0, 0xc0, 0x0b, 0x34, 0x12, 0xaa, 0x85, 0x01,
- 0xc8, 0xe4, 0xe5, 0x05, 0x09, 0x00, 0x2d, 0xc1, 0xa7, 0x87, 0x01, 0x20,
- 0x80, 0x18, 0x48, 0xb2, 0x85, 0x81, 0x97, 0x9f, 0x9f, 0x9f, 0x17, 0x66,
- 0x09, 0x3f, 0x1c, 0xf0, 0xe2, 0x35, 0x84, 0x01, 0x20, 0x80, 0x18, 0x90,
- 0x6b, 0x31, 0xc2, 0x00, 0x64, 0x89, 0x2c, 0x8c, 0xc3, 0x09, 0xb3, 0x83,
- 0x93, 0x80, 0x2e, 0x80, 0x00, 0x22, 0xad, 0x46, 0x07, 0x99, 0xcb, 0xcb,
- 0x80, 0xe0, 0xf1, 0x82, 0xbd, 0xc1, 0x49, 0xc8, 0x10, 0x80, 0x00, 0x22,
- 0xb1, 0xd9, 0x00, 0x34, 0x17, 0xc9, 0x48, 0xa0, 0x67, 0x78, 0x81, 0x7c,
- 0x82, 0x66, 0x00, 0x04, 0x10, 0xa9, 0x6d, 0x13, 0x29, 0x29, 0x29, 0x39,
- 0xb4, 0x2e, 0x0d, 0x61, 0x4d, 0x00, 0x01, 0x44, 0x83, 0x06, 0x10, 0x26,
- 0x00, 0x08, 0x20, 0xba, 0x58, 0x02, 0x10, 0x40, 0x74, 0xb1, 0x04, 0x20,
- 0x80, 0xe8, 0x62, 0x09, 0x40, 0x00, 0xd1, 0xc5, 0x12, 0x80, 0x00, 0xa2,
- 0x8b, 0x25, 0x00, 0x01, 0x44, 0x17, 0x4b, 0x00, 0x02, 0x88, 0x2e, 0x96,
- 0x00, 0x04, 0x10, 0x5d, 0x2c, 0x01, 0x08, 0x20, 0xba, 0x58, 0x02, 0x10,
- 0x40, 0x74, 0xb1, 0x04, 0x20, 0x80, 0xe8, 0x62, 0x09, 0x40, 0x80, 0x01,
- 0x00, 0x64, 0x60, 0x82, 0xc9, 0xbd, 0x53, 0xb5, 0x4f, 0x00, 0x00, 0x00,
- 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
-};
-unsigned int doxygen_png_len = 1281;
-
-unsigned char search_png[] = {
- 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a, 0x00, 0x00, 0x00, 0x0d,
- 0x49, 0x48, 0x44, 0x52, 0x00, 0x00, 0x00, 0x78, 0x00, 0x00, 0x00, 0x1a,
- 0x08, 0x03, 0x00, 0x00, 0x01, 0x3c, 0x81, 0x58, 0x27, 0x00, 0x00, 0x02,
- 0x4c, 0x50, 0x4c, 0x54, 0x45, 0xff, 0xff, 0xcc, 0x4c, 0x00, 0x01, 0x4c,
- 0x01, 0x01, 0x4c, 0x00, 0x02, 0x4c, 0x01, 0x02, 0x00, 0x00, 0x00, 0x63,
- 0x01, 0x02, 0x63, 0x02, 0x02, 0x63, 0x01, 0x04, 0x63, 0x02, 0x04, 0x63,
- 0x04, 0x04, 0x63, 0x04, 0x07, 0x72, 0x02, 0x04, 0x72, 0x04, 0x04, 0x72,
- 0x04, 0x07, 0x72, 0x07, 0x07, 0x72, 0x04, 0x09, 0x72, 0x07, 0x09, 0x7d,
- 0x07, 0x09, 0x7d, 0x09, 0x09, 0x7d, 0x09, 0x0d, 0x87, 0x09, 0x0d, 0x87,
- 0x09, 0x11, 0x87, 0x0d, 0x11, 0x90, 0x0d, 0x11, 0x90, 0x0d, 0x15, 0x90,
- 0x11, 0x15, 0x9a, 0x11, 0x15, 0x9a, 0x11, 0x1a, 0x9a, 0x15, 0x1a, 0xa2,
- 0x15, 0x1a, 0xa2, 0x15, 0x20, 0xa2, 0x1a, 0x20, 0xa9, 0x1a, 0x20, 0xa9,
- 0x1a, 0x26, 0xa0, 0x20, 0x28, 0xa0, 0x24, 0x28, 0xa7, 0x2f, 0x37, 0xa7,
- 0x32, 0x37, 0xb0, 0x20, 0x26, 0xb0, 0x20, 0x2d, 0xb7, 0x26, 0x2d, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xb2, 0x29, 0x36, 0x00, 0x00, 0x00, 0xbd,
- 0x2d, 0x34, 0xb5, 0x32, 0x3c, 0xad, 0x3e, 0x45, 0x8e, 0x43, 0x3b, 0xad,
- 0x41, 0x45, 0xbf, 0x43, 0x4e, 0xb3, 0x4d, 0x53, 0xb3, 0x53, 0x4f, 0xb3,
- 0x50, 0x53, 0xba, 0x5e, 0x62, 0xb8, 0x71, 0x5f, 0xc3, 0x34, 0x3b, 0xc9,
- 0x3b, 0x44, 0xc9, 0x3b, 0x4d, 0xc9, 0x44, 0x4d, 0xcf, 0x44, 0x56, 0xcf,
- 0x4d, 0x56, 0xd5, 0x4d, 0x5f, 0xd5, 0x56, 0x5f, 0xcc, 0x54, 0x61, 0xda,
- 0x56, 0x6b, 0xda, 0x5f, 0x6b, 0xdf, 0x5f, 0x6b, 0xc0, 0x6b, 0x70, 0xc0,
- 0x6d, 0x70, 0x00, 0x00, 0x00, 0xc6, 0x7a, 0x7f, 0xc6, 0x7c, 0x7f, 0x00,
- 0x00, 0x00, 0xd6, 0x66, 0x72, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xd6,
- 0x71, 0x71, 0xe5, 0x6b, 0x75, 0x00, 0x00, 0x00, 0xe9, 0x75, 0x8c, 0x00,
- 0x00, 0x00, 0xcd, 0x85, 0x72, 0xcd, 0x88, 0x8d, 0xcd, 0x8a, 0x8d, 0xd3,
- 0x98, 0x9a, 0xd9, 0xa7, 0xa9, 0xdc, 0xaa, 0xa0, 0xdf, 0xb6, 0xb7, 0xee,
- 0x80, 0x8c, 0xe5, 0x8b, 0x92, 0xee, 0x8c, 0x9a, 0xf2, 0x8c, 0x9a, 0xea,
- 0x8c, 0xa0, 0xec, 0x99, 0xa3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea,
- 0xae, 0xa0, 0xef, 0xae, 0xb1, 0xe6, 0xb5, 0xac, 0x00, 0x00, 0x00, 0xfc,
- 0xa6, 0xc1, 0xfa, 0xaf, 0xc0, 0xf3, 0xc1, 0xb3, 0xf2, 0xd6, 0xac, 0x00,
- 0x00, 0x00, 0xe6, 0xc4, 0xc6, 0xec, 0xd2, 0xd0, 0xec, 0xd3, 0xd4, 0xf6,
- 0xcd, 0xc9, 0xfb, 0xc5, 0xd1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xf3, 0xdc, 0xdc, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0xfa, 0xd6, 0xda, 0xf9, 0xda, 0xd5, 0xf9, 0xdf, 0xe1, 0x00,
- 0x00, 0x00, 0xff, 0xff, 0xcb, 0x00, 0x00, 0x00, 0xf2, 0xe2, 0xe2, 0xfa,
- 0xe5, 0xe8, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf9, 0xf0, 0xf1, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x66, 0x11, 0x00, 0x66,
- 0x22, 0x00, 0x66, 0x33, 0x00, 0x9a, 0xa5, 0x67, 0x9f, 0x00, 0x00, 0x00,
- 0x01, 0x74, 0x52, 0x4e, 0x53, 0x00, 0x40, 0xe6, 0xd8, 0x66, 0x00, 0x00,
- 0x00, 0x16, 0x74, 0x45, 0x58, 0x74, 0x53, 0x6f, 0x66, 0x74, 0x77, 0x61,
- 0x72, 0x65, 0x00, 0x67, 0x69, 0x66, 0x32, 0x70, 0x6e, 0x67, 0x20, 0x32,
- 0x2e, 0x34, 0x2e, 0x32, 0xa3, 0x5e, 0x47, 0x0e, 0x00, 0x00, 0x00, 0x04,
- 0x67, 0x49, 0x46, 0x67, 0x02, 0x00, 0x00, 0x01, 0x41, 0x82, 0xfc, 0x50,
- 0x00, 0x00, 0x04, 0x71, 0x49, 0x44, 0x41, 0x54, 0x78, 0xda, 0xc5, 0x55,
- 0xff, 0x6f, 0xdb, 0x44, 0x14, 0xbf, 0x94, 0xa8, 0x69, 0x52, 0x92, 0x2c,
- 0x6e, 0x83, 0x93, 0xd8, 0xd7, 0x86, 0xd5, 0x84, 0x55, 0xaa, 0x46, 0x92,
- 0x25, 0x76, 0x37, 0xa0, 0x94, 0x01, 0xd1, 0xa2, 0x49, 0x9d, 0xd0, 0x6a,
- 0xc7, 0x5e, 0x07, 0x95, 0x58, 0xc4, 0x12, 0x99, 0xc0, 0x2f, 0x93, 0x60,
- 0x9a, 0x5c, 0xc9, 0xbf, 0xdf, 0x3f, 0xd5, 0xf5, 0x1f, 0xe3, 0xbd, 0x77,
- 0x67, 0xc7, 0x65, 0xab, 0xa0, 0xa0, 0x8a, 0x27, 0xd9, 0xe7, 0x3b, 0xbf,
- 0x77, 0x9f, 0xcf, 0xfb, 0x72, 0xef, 0x18, 0xfb, 0xab, 0x70, 0x2e, 0x84,
- 0xa0, 0x97, 0x88, 0x04, 0x87, 0x39, 0x4e, 0x85, 0xcd, 0xa5, 0x30, 0x36,
- 0xcf, 0x65, 0xc4, 0x7b, 0xc7, 0xfc, 0x77, 0x2e, 0x5c, 0xd0, 0xe7, 0x0b,
- 0x2e, 0x3c, 0xce, 0x6f, 0xb1, 0x56, 0x9b, 0x5b, 0xb4, 0x19, 0x0a, 0x2f,
- 0x31, 0xb6, 0x92, 0xb5, 0x07, 0x83, 0xd9, 0xab, 0xaf, 0xb7, 0xdf, 0x2f,
- 0x6d, 0xdd, 0x67, 0xec, 0x3e, 0xe7, 0x0e, 0x12, 0xa0, 0x87, 0x4f, 0x84,
- 0x18, 0x01, 0x39, 0x9c, 0x2e, 0x38, 0xaf, 0x30, 0xd6, 0x6b, 0x98, 0x83,
- 0x47, 0xe6, 0x60, 0x30, 0xd8, 0x19, 0x98, 0xf4, 0x98, 0xe6, 0xb1, 0xf9,
- 0x09, 0x8e, 0x46, 0xb5, 0xc7, 0xfe, 0x4e, 0xfe, 0x38, 0xbd, 0x02, 0x7a,
- 0xdb, 0xf8, 0x90, 0xb1, 0xd3, 0x2e, 0x00, 0x39, 0x29, 0xb6, 0x08, 0xc1,
- 0x33, 0x1c, 0xb9, 0xe8, 0x70, 0xdd, 0x62, 0x7b, 0xc4, 0x63, 0x12, 0xc0,
- 0x52, 0x60, 0x2b, 0x2d, 0xae, 0xa2, 0x67, 0xac, 0xb2, 0x4d, 0x13, 0x8c,
- 0x83, 0x49, 0xb2, 0x24, 0x62, 0x11, 0xc6, 0xe0, 0x49, 0x1f, 0x95, 0xf4,
- 0x0b, 0xc6, 0xb4, 0x26, 0x30, 0x45, 0xe6, 0x03, 0x7c, 0xef, 0x00, 0xf7,
- 0xe3, 0xae, 0x89, 0x4e, 0x98, 0x8d, 0x02, 0x72, 0xeb, 0xad, 0x7c, 0x90,
- 0x7b, 0xaf, 0x5c, 0x48, 0xee, 0xf3, 0x59, 0xf8, 0xe2, 0xe7, 0x67, 0xcf,
- 0xff, 0xb9, 0x7c, 0x7f, 0xf0, 0xa9, 0xa1, 0xf9, 0x64, 0xfa, 0x7a, 0xd6,
- 0x6d, 0x63, 0x36, 0x17, 0x42, 0xc4, 0x1c, 0x83, 0x2a, 0x90, 0x18, 0x1f,
- 0x23, 0x75, 0x39, 0x8d, 0xe0, 0xc3, 0x95, 0xab, 0xb8, 0x38, 0xc1, 0x70,
- 0xb7, 0x36, 0xd6, 0xde, 0x30, 0x76, 0x78, 0x42, 0xa6, 0x81, 0x88, 0x1d,
- 0xf8, 0x69, 0x91, 0x89, 0xf4, 0x51, 0xba, 0x4a, 0x4f, 0x2c, 0x26, 0x9c,
- 0x87, 0x23, 0x9e, 0x6e, 0xc0, 0x79, 0xb3, 0xba, 0xca, 0x58, 0xeb, 0x63,
- 0x55, 0x47, 0x63, 0x19, 0x54, 0x1b, 0x84, 0xf7, 0x61, 0xa4, 0xc0, 0x60,
- 0x7c, 0x47, 0x00, 0x0b, 0x9c, 0x46, 0x9c, 0x7b, 0x22, 0x72, 0x61, 0xa1,
- 0x83, 0xea, 0xad, 0x4a, 0x9e, 0xb1, 0xa1, 0xd6, 0x30, 0x39, 0x8f, 0x04,
- 0x25, 0x3f, 0x20, 0xd2, 0xa3, 0x58, 0x8c, 0x11, 0xc0, 0x46, 0x82, 0xa0,
- 0xcc, 0x3b, 0xb2, 0xce, 0x96, 0xa4, 0x21, 0x17, 0xd5, 0xdc, 0x53, 0x0a,
- 0xe8, 0x79, 0xa5, 0x5a, 0xbb, 0x9e, 0xac, 0x17, 0x0b, 0x6f, 0xd9, 0x7f,
- 0x97, 0x59, 0x18, 0x9e, 0xfe, 0x70, 0x9d, 0x54, 0x3d, 0xb9, 0xdb, 0xd6,
- 0x1c, 0x69, 0x3b, 0x3d, 0x0b, 0x8f, 0xba, 0xdb, 0xd7, 0x93, 0xad, 0xa6,
- 0x36, 0x24, 0xdc, 0xb3, 0x23, 0x0b, 0x23, 0x30, 0x82, 0x90, 0x78, 0x5c,
- 0x9d, 0x42, 0x4a, 0x52, 0xa8, 0x32, 0x86, 0xd1, 0xb3, 0x22, 0x4a, 0x77,
- 0x24, 0x55, 0x38, 0x37, 0xeb, 0x88, 0xfd, 0xd3, 0x6f, 0x3f, 0x52, 0x9e,
- 0x43, 0x31, 0xf1, 0x60, 0xd5, 0x21, 0x6d, 0x8f, 0x4a, 0x46, 0xd0, 0x91,
- 0x0c, 0xf1, 0x63, 0xa4, 0x36, 0x51, 0x6b, 0x18, 0x6d, 0xad, 0xcc, 0xd8,
- 0xfe, 0xf3, 0x7b, 0xaa, 0x28, 0x3c, 0xab, 0x83, 0xc3, 0x98, 0xa6, 0x36,
- 0x26, 0x98, 0x43, 0x71, 0x78, 0x98, 0x64, 0x2a, 0x1d, 0xcf, 0xeb, 0xf7,
- 0xe5, 0x1a, 0xa9, 0x6c, 0x94, 0x7d, 0xd6, 0x7a, 0x70, 0x3b, 0xad, 0x28,
- 0xd5, 0x88, 0xb0, 0x9a, 0xe4, 0x21, 0x4c, 0x9c, 0x88, 0x84, 0x4b, 0x4a,
- 0x51, 0xea, 0x14, 0xe7, 0x75, 0x30, 0xde, 0x6c, 0x6f, 0xc1, 0x17, 0x30,
- 0xef, 0x40, 0x81, 0xd8, 0x23, 0xaa, 0x30, 0xdc, 0xdd, 0xb1, 0xa5, 0x13,
- 0x21, 0x16, 0x17, 0xe9, 0x3b, 0x38, 0xba, 0x6e, 0xa0, 0x8c, 0x37, 0xd6,
- 0x7d, 0x36, 0xd4, 0xa1, 0xbe, 0xf8, 0x40, 0xd5, 0x0f, 0xd6, 0x22, 0xc7,
- 0x32, 0x94, 0x08, 0x31, 0xb9, 0x69, 0x53, 0x49, 0xab, 0xfd, 0x12, 0xd6,
- 0x46, 0x25, 0x3f, 0x67, 0xf3, 0x5a, 0x1d, 0xac, 0xbb, 0xea, 0x2c, 0x49,
- 0x23, 0x72, 0xd1, 0x4e, 0x99, 0xbb, 0x60, 0x40, 0x51, 0x8c, 0x91, 0xbd,
- 0x02, 0xd6, 0x8b, 0xd8, 0xa7, 0xfc, 0x5a, 0xbd, 0x61, 0x98, 0xe6, 0xa3,
- 0x63, 0xe8, 0x06, 0x3b, 0xd8, 0x14, 0x06, 0x5d, 0x68, 0x0a, 0xf4, 0xbd,
- 0x23, 0x3b, 0x44, 0x17, 0x5e, 0xc7, 0xdf, 0x99, 0xf8, 0x49, 0xcb, 0xf0,
- 0x65, 0x7c, 0x54, 0x92, 0x1d, 0xd8, 0xbf, 0x28, 0x5f, 0xb7, 0xb4, 0xab,
- 0xa5, 0xc2, 0xca, 0xbe, 0xaa, 0x4f, 0xbf, 0xb6, 0xb2, 0x92, 0xbb, 0x8e,
- 0xe4, 0x73, 0xbd, 0x79, 0xb6, 0xc0, 0xe7, 0xb3, 0xe9, 0xf4, 0xf4, 0xf4,
- 0xdb, 0x87, 0x87, 0x37, 0x24, 0x07, 0x9f, 0xdf, 0xbd, 0x63, 0x6a, 0xda,
- 0xbe, 0x7f, 0x09, 0x75, 0x36, 0xfd, 0x25, 0x3a, 0x7b, 0xfd, 0xeb, 0x8b,
- 0x67, 0x0f, 0xbf, 0x3a, 0xb8, 0x21, 0xf9, 0xf2, 0x8b, 0xfb, 0xbb, 0xb7,
- 0xb7, 0x8c, 0x96, 0x56, 0x19, 0xfa, 0xec, 0x4d, 0x02, 0xfb, 0xea, 0x2c,
- 0x3c, 0x79, 0x7c, 0x6f, 0x6f, 0xa7, 0xad, 0x9a, 0x99, 0x45, 0x6d, 0xec,
- 0x5f, 0x4a, 0x07, 0x6c, 0x3b, 0x57, 0xfc, 0x33, 0x5b, 0x8d, 0xba, 0xa6,
- 0x0d, 0xa7, 0x14, 0xe3, 0xe9, 0x0c, 0x5a, 0xc1, 0x67, 0x09, 0x26, 0xb7,
- 0x16, 0xc9, 0xad, 0x4a, 0x75, 0x1a, 0xa7, 0x33, 0xea, 0xdd, 0x9c, 0xf7,
- 0x63, 0xd9, 0x28, 0x49, 0x32, 0x7f, 0xe9, 0x2a, 0x77, 0xd2, 0x85, 0x18,
- 0xb0, 0xfb, 0xaa, 0xff, 0x4b, 0x3d, 0x79, 0x56, 0xcd, 0xe6, 0xa6, 0x56,
- 0x5e, 0x3b, 0x02, 0xe0, 0x93, 0x93, 0x97, 0x2f, 0x1f, 0xdf, 0x49, 0x39,
- 0x8d, 0xd4, 0xae, 0x78, 0xfe, 0x5d, 0x79, 0x5b, 0x2c, 0xb2, 0x9c, 0x3d,
- 0x91, 0x39, 0x92, 0x13, 0x45, 0x87, 0xda, 0x87, 0x23, 0x87, 0xa0, 0x2f,
- 0xb9, 0x4d, 0xe4, 0xe9, 0xf5, 0x12, 0xbd, 0x64, 0x17, 0x53, 0xd7, 0xaa,
- 0xe5, 0x35, 0xc8, 0x74, 0xff, 0xc1, 0x37, 0x87, 0x7b, 0xcb, 0x8d, 0x03,
- 0xb5, 0x71, 0x60, 0x27, 0x34, 0xc4, 0x22, 0x44, 0x09, 0x28, 0x1c, 0xb0,
- 0x65, 0x64, 0x25, 0xc0, 0x04, 0x34, 0xb6, 0x1d, 0x4f, 0xe2, 0xe2, 0x4d,
- 0x16, 0x5b, 0xef, 0x72, 0x94, 0x92, 0x46, 0xdf, 0xd8, 0xac, 0x94, 0x57,
- 0xe1, 0x86, 0xd4, 0xdb, 0xbb, 0xbb, 0xed, 0x8c, 0x4b, 0x76, 0xb8, 0x54,
- 0xb5, 0x32, 0x86, 0x8e, 0xba, 0xc8, 0xbc, 0xf4, 0xfa, 0x5b, 0x06, 0x3a,
- 0x9a, 0x74, 0xe8, 0xe8, 0xab, 0xc0, 0x4a, 0xe9, 0x5f, 0xc2, 0x1d, 0xa7,
- 0xeb, 0x46, 0xbd, 0xb2, 0x8e, 0xc0, 0x35, 0xbd, 0xb5, 0xac, 0x0b, 0xe8,
- 0x4d, 0x61, 0x3f, 0x21, 0x6b, 0x91, 0xfb, 0xc1, 0x72, 0xab, 0xc5, 0xe5,
- 0x8c, 0xca, 0x00, 0xd2, 0xed, 0x17, 0xab, 0xe4, 0x84, 0xb2, 0xe5, 0x8a,
- 0xd8, 0xbd, 0x22, 0xd0, 0x98, 0x64, 0xad, 0x94, 0xcf, 0xfb, 0xd8, 0x01,
- 0x36, 0xf5, 0xa6, 0x89, 0xdd, 0x8f, 0xb7, 0x89, 0xf4, 0x62, 0xe4, 0x20,
- 0x60, 0x64, 0xa9, 0x16, 0xaf, 0x42, 0x2f, 0x3d, 0xca, 0x00, 0x3b, 0x2a,
- 0x80, 0xa1, 0xaa, 0x43, 0x97, 0xd6, 0xc3, 0x58, 0x35, 0xed, 0x24, 0xff,
- 0xa9, 0x9e, 0xc2, 0x35, 0xea, 0xe5, 0x62, 0x7e, 0x1f, 0x4f, 0xb3, 0xdf,
- 0xab, 0x69, 0xd4, 0xfa, 0xa0, 0xa9, 0xf5, 0x55, 0xf4, 0x62, 0xd7, 0xe2,
- 0x97, 0x02, 0x2d, 0xac, 0x20, 0x71, 0x48, 0x32, 0xb0, 0xd3, 0x4a, 0xa5,
- 0x69, 0x98, 0x29, 0xe9, 0x85, 0x9d, 0x85, 0xb3, 0xb2, 0x81, 0x36, 0x0d,
- 0xbd, 0x56, 0x2a, 0xe4, 0x86, 0xea, 0x20, 0x03, 0x74, 0x45, 0xd3, 0xea,
- 0x75, 0x5d, 0x6f, 0xde, 0xa4, 0x34, 0xf4, 0x7a, 0xb5, 0x02, 0xdd, 0xf6,
- 0xfc, 0x69, 0xa6, 0x61, 0xfa, 0xbd, 0x8b, 0xf3, 0x42, 0xb1, 0x50, 0x2c,
- 0xdd, 0xa4, 0x14, 0x0b, 0xab, 0xf9, 0xb7, 0x43, 0x97, 0xfd, 0xaf, 0xf2,
- 0x27, 0x51, 0x22, 0xbd, 0xc0, 0xca, 0xc6, 0x8b, 0x9d, 0x00, 0x00, 0x00,
- 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
-};
-unsigned int search_png_len = 1857;
-
-unsigned char doxfont_data[] = {
- 0x00, 0x01, 0x00, 0x00, 0x00, 0x0f, 0x00, 0x80, 0x00, 0x03, 0x00, 0x70,
- 0x4f, 0x53, 0x2f, 0x32, 0x70, 0x32, 0x72, 0xfd, 0x00, 0x00, 0x00, 0xfc,
- 0x00, 0x00, 0x00, 0x56, 0x63, 0x6d, 0x61, 0x70, 0xcd, 0xf1, 0xa1, 0xad,
- 0x00, 0x00, 0x01, 0x54, 0x00, 0x00, 0x01, 0x4a, 0x67, 0x61, 0x73, 0x70,
- 0x00, 0x18, 0x00, 0x09, 0x00, 0x00, 0x02, 0xa0, 0x00, 0x00, 0x00, 0x10,
- 0x67, 0x6c, 0x79, 0x66, 0x64, 0x39, 0x01, 0x32, 0x00, 0x00, 0x02, 0xb0,
- 0x00, 0x00, 0x62, 0x94, 0x68, 0x65, 0x61, 0x64, 0x52, 0x77, 0xfb, 0x19,
- 0x00, 0x00, 0x65, 0x44, 0x00, 0x00, 0x00, 0x36, 0x68, 0x68, 0x65, 0x61,
- 0x0e, 0xfb, 0x06, 0x89, 0x00, 0x00, 0x65, 0x7c, 0x00, 0x00, 0x00, 0x24,
- 0x68, 0x6d, 0x74, 0x78, 0x98, 0xb8, 0x23, 0x19, 0x00, 0x00, 0x65, 0xa0,
- 0x00, 0x00, 0x01, 0x88, 0x6c, 0x6f, 0x63, 0x61, 0x00, 0x11, 0x2c, 0x88,
- 0x00, 0x00, 0x67, 0x28, 0x00, 0x00, 0x01, 0x8c, 0x6b, 0x65, 0x72, 0x6e,
- 0xff, 0xd5, 0xff, 0x45, 0x00, 0x00, 0x68, 0xb4, 0x00, 0x00, 0x02, 0x58,
- 0x6d, 0x61, 0x78, 0x70, 0x03, 0x6b, 0x08, 0x7f, 0x00, 0x00, 0x6b, 0x0c,
- 0x00, 0x00, 0x00, 0x20, 0x6e, 0x61, 0x6d, 0x65, 0x9d, 0xcb, 0xe0, 0x3f,
- 0x00, 0x00, 0x6b, 0x2c, 0x00, 0x00, 0x00, 0x82, 0x70, 0x6f, 0x73, 0x74,
- 0x33, 0x15, 0x3b, 0x1e, 0x00, 0x00, 0x6b, 0xb0, 0x00, 0x00, 0x00, 0xfd,
- 0x63, 0x76, 0x74, 0x20, 0x7b, 0x24, 0x9d, 0x31, 0x00, 0x00, 0x6c, 0xb0,
- 0x00, 0x00, 0x05, 0x88, 0x66, 0x70, 0x67, 0x6d, 0x77, 0x26, 0xa9, 0xf5,
- 0x00, 0x00, 0x72, 0x38, 0x00, 0x00, 0x05, 0xb0, 0x70, 0x72, 0x65, 0x70,
- 0x73, 0xc2, 0xd6, 0xc0, 0x00, 0x00, 0x77, 0xe8, 0x00, 0x00, 0x08, 0x0f,
- 0x00, 0x01, 0x03, 0x88, 0x01, 0x90, 0x00, 0x05, 0x00, 0x00, 0x05, 0x9a,
- 0x05, 0x33, 0x00, 0x00, 0x01, 0x1b, 0x05, 0x9a, 0x05, 0x33, 0x00, 0x00,
- 0x03, 0xd1, 0x00, 0x66, 0x02, 0x12, 0x08, 0x05, 0x02, 0x0b, 0x06, 0x04,
- 0x02, 0x02, 0x02, 0x02, 0x02, 0x04, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4d, 0x4f,
- 0x4e, 0x4f, 0x00, 0x40, 0x00, 0x20, 0x00, 0xad, 0x05, 0xd3, 0xfe, 0x51,
- 0x01, 0x33, 0x07, 0x3e, 0x01, 0xb2, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x14, 0x00, 0x03, 0x00, 0x01, 0x00, 0x00, 0x01, 0x1a,
- 0x00, 0x00, 0x01, 0x06, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x01, 0x02, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x00, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b, 0x0c,
- 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18,
- 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23, 0x24,
- 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 0x30,
- 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c,
- 0x3d, 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48,
- 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51, 0x52, 0x53, 0x54,
- 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 0x60,
- 0x61, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
- 0x00, 0x30, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x00, 0x02, 0x00, 0x00,
- 0x00, 0x7e, 0x00, 0xa0, 0x00, 0xad, 0xff, 0xff, 0x00, 0x00, 0x00, 0x20,
- 0x00, 0xa0, 0x00, 0xad, 0xff, 0xff, 0xff, 0xe3, 0xff, 0x63, 0xff, 0x63,
- 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x03, 0x00, 0x08, 0x00, 0x02, 0x00, 0x11, 0x00, 0x01,
- 0xff, 0xff, 0x00, 0x03, 0x00, 0x02, 0x01, 0x00, 0x00, 0x00, 0x05, 0x00,
- 0x05, 0x00, 0x00, 0x03, 0x00, 0x07, 0x00, 0x42, 0xb4, 0x02, 0x01, 0xe4,
- 0x06, 0x07, 0xb8, 0x02, 0x99, 0x40, 0x13, 0x00, 0x05, 0x04, 0xe4, 0x03,
- 0x00, 0x0a, 0x07, 0x04, 0xe4, 0x01, 0x00, 0x19, 0x08, 0x06, 0x05, 0xe4,
- 0x02, 0x03, 0xbc, 0x02, 0x31, 0x00, 0x09, 0x01, 0x99, 0x01, 0x2e, 0x00,
- 0x18, 0x2b, 0x10, 0xf6, 0x3c, 0xfd, 0x3c, 0x4e, 0x10, 0xf4, 0x3c, 0x4d,
- 0xfd, 0x3c, 0x00, 0x3f, 0x3c, 0xfd, 0x3c, 0x10, 0xfc, 0x3c, 0xfd, 0x3c,
- 0x31, 0x30, 0x21, 0x11, 0x21, 0x11, 0x25, 0x21, 0x11, 0x21, 0x01, 0x00,
- 0x04, 0x00, 0xfc, 0x20, 0x03, 0xc0, 0xfc, 0x40, 0x05, 0x00, 0xfb, 0x00,
- 0x20, 0x04, 0xc0, 0x00, 0x00, 0x02, 0x00, 0xb0, 0x00, 0x00, 0x01, 0x8f,
- 0x05, 0xba, 0x00, 0x05, 0x00, 0x09, 0x00, 0x57, 0xb1, 0x1c, 0x05, 0xb8,
- 0x02, 0xaf, 0x40, 0x26, 0x08, 0x3c, 0x06, 0x02, 0x00, 0x06, 0x0a, 0x0b,
- 0xcb, 0x03, 0x09, 0x3a, 0x05, 0x38, 0x04, 0x3c, 0x00, 0x38, 0x06, 0x3a,
- 0x01, 0x03, 0x3c, 0x02, 0x02, 0x20, 0x01, 0x01, 0x01, 0xcb, 0x0a, 0x0a,
- 0x0b, 0x81, 0x21, 0xa1, 0x98, 0x18, 0x2b, 0x2b, 0x4e, 0x10, 0xf4, 0x5d,
- 0x3c, 0x4d, 0x10, 0xed, 0x10, 0xe4, 0xe4, 0xfd, 0xe4, 0xe4, 0x10, 0xee,
- 0x00, 0x3f, 0x3f, 0x4d, 0x10, 0xfd, 0xe6, 0x4b, 0x53, 0x58, 0xb3, 0x05,
- 0x04, 0x00, 0x01, 0x01, 0x10, 0x3c, 0x10, 0x3c, 0x59, 0x31, 0x30, 0x13,
- 0x03, 0x11, 0x33, 0x11, 0x0b, 0x01, 0x35, 0x33, 0x15, 0xe7, 0x37, 0xdf,
- 0x34, 0xa3, 0xcf, 0x01, 0x6c, 0x03, 0x09, 0x01, 0x45, 0xfe, 0xbb, 0xfc,
- 0xf7, 0xfe, 0x94, 0xcd, 0xcd, 0x00, 0x00, 0x02, 0x00, 0x5e, 0x03, 0xb3,
- 0x02, 0x77, 0x05, 0xba, 0x00, 0x05, 0x00, 0x0b, 0x00, 0x75, 0xb9, 0x00,
- 0x00, 0xff, 0xf8, 0xb3, 0x22, 0x25, 0x34, 0x05, 0xb8, 0xff, 0xf8, 0x40,
- 0x22, 0x26, 0x29, 0x34, 0x0b, 0x06, 0x0a, 0x07, 0x05, 0x00, 0x04, 0x01,
- 0x00, 0x05, 0x05, 0x06, 0x0b, 0xee, 0x09, 0x08, 0x08, 0x03, 0x03, 0x02,
- 0x00, 0x07, 0x08, 0x3c, 0x0a, 0x0f, 0x09, 0x80, 0x09, 0x02, 0x09, 0xb8,
- 0xff, 0xc0, 0x40, 0x15, 0x0d, 0x0f, 0x34, 0x09, 0xde, 0x01, 0x03, 0x04,
- 0x3c, 0x02, 0x01, 0x40, 0x0d, 0x11, 0x34, 0x01, 0x19, 0x0c, 0x71, 0xa7,
- 0x18, 0x2b, 0x4e, 0x10, 0xf4, 0x2b, 0x3c, 0x4d, 0xfd, 0x3c, 0x10, 0xfd,
- 0x2b, 0x5d, 0x3c, 0xfd, 0x3c, 0x00, 0x3f, 0x3c, 0x10, 0x3c, 0x10, 0x3c,
- 0xfd, 0x3c, 0x3c, 0x10, 0x3c, 0x01, 0x11, 0x12, 0x39, 0x39, 0x11, 0x12,
- 0x39, 0x39, 0x31, 0x30, 0x01, 0x2b, 0x2b, 0x13, 0x03, 0x35, 0x33, 0x15,
- 0x03, 0x33, 0x03, 0x35, 0x33, 0x15, 0x03, 0x90, 0x32, 0xcd, 0x2d, 0xdd,
- 0x31, 0xcd, 0x30, 0x03, 0xb3, 0x01, 0x17, 0xf0, 0xf0, 0xfe, 0xe9, 0x01,
- 0x17, 0xf0, 0xf0, 0xfe, 0xe9, 0x00, 0x00, 0x02, 0x00, 0x15, 0xff, 0xe7,
- 0x04, 0x59, 0x05, 0xd3, 0x00, 0x1b, 0x00, 0x1f, 0x01, 0x31, 0x40, 0x87,
- 0x28, 0x1d, 0x38, 0x1d, 0x02, 0x09, 0x04, 0x09, 0x1d, 0x02, 0x57, 0x0f,
- 0xb7, 0x13, 0xb7, 0x1c, 0xc7, 0x13, 0xc7, 0x1c, 0xf8, 0x1d, 0x06, 0x01,
- 0x02, 0x15, 0x00, 0x09, 0x04, 0x03, 0x14, 0x00, 0x09, 0x05, 0x06, 0x11,
- 0x00, 0x09, 0x08, 0x07, 0x10, 0x00, 0x09, 0x0b, 0x07, 0x10, 0x1b, 0x0a,
- 0x0c, 0x07, 0x10, 0x18, 0x0d, 0x0f, 0x07, 0x10, 0x17, 0x0e, 0x12, 0x06,
- 0x11, 0x17, 0x0e, 0x13, 0x03, 0x14, 0x17, 0x0e, 0x16, 0x02, 0x15, 0x17,
- 0x0e, 0x19, 0x02, 0x15, 0x18, 0x0d, 0x1a, 0x02, 0x15, 0x1b, 0x0a, 0x1c,
- 0x03, 0x14, 0x1b, 0x0a, 0x1d, 0x03, 0x14, 0x18, 0x0d, 0x1e, 0x06, 0x11,
- 0x18, 0x0d, 0x1f, 0x06, 0x11, 0x1b, 0x0a, 0x0a, 0x1b, 0x1b, 0x25, 0x00,
- 0x09, 0x14, 0x00, 0x00, 0x09, 0x0d, 0x18, 0x18, 0x25, 0x17, 0x0e, 0x14,
- 0x17, 0x17, 0x0e, 0x15, 0x02, 0x25, 0x14, 0x03, 0x03, 0x00, 0x10, 0x07,
- 0x25, 0x11, 0x06, 0xb8, 0x01, 0xb6, 0x40, 0x38, 0x0e, 0x0e, 0x0d, 0x0d,
- 0x0a, 0x0a, 0x09, 0x00, 0x1b, 0x18, 0x18, 0x17, 0x17, 0x00, 0x0a, 0x15,
- 0x14, 0x14, 0x11, 0x10, 0x3e, 0x0e, 0x07, 0x06, 0x06, 0x03, 0x02, 0x3e,
- 0x00, 0x18, 0x94, 0x0d, 0x17, 0x94, 0x0d, 0x25, 0x0e, 0x40, 0x11, 0x39,
- 0x4f, 0x0e, 0x9f, 0x0e, 0x02, 0x0e, 0x75, 0x21, 0x0a, 0x94, 0x1b, 0x09,
- 0x94, 0x1b, 0x25, 0x00, 0xb8, 0xff, 0xc0, 0xb5, 0x11, 0x39, 0x20, 0x00,
- 0x01, 0x00, 0xb8, 0x02, 0xa1, 0xb3, 0x20, 0xa9, 0x68, 0x18, 0x2b, 0x10,
- 0xf6, 0x5d, 0x2b, 0xed, 0xe4, 0x10, 0xe4, 0x10, 0xf6, 0x5d, 0x2b, 0xed,
- 0xe4, 0x10, 0xe4, 0x10, 0xf4, 0x3c, 0x3c, 0x10, 0x3c, 0x10, 0xf4, 0x3c,
- 0x3c, 0x10, 0x3c, 0x00, 0x3f, 0x3c, 0x10, 0x3c, 0x10, 0x3c, 0x3f, 0x3c,
- 0x10, 0x3c, 0x10, 0x3c, 0x10, 0xfd, 0x3c, 0xfd, 0x3c, 0x11, 0x39, 0x2f,
- 0x3c, 0xfd, 0x3c, 0x87, 0x05, 0x2e, 0x2b, 0x7d, 0x10, 0xc4, 0x87, 0x2e,
- 0x18, 0x2b, 0x7d, 0x10, 0xc4, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f,
- 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x0f, 0x31, 0x30, 0x01,
- 0x5d, 0x5d, 0x71, 0x17, 0x13, 0x23, 0x35, 0x33, 0x13, 0x21, 0x35, 0x21,
- 0x13, 0x33, 0x03, 0x21, 0x13, 0x33, 0x03, 0x33, 0x15, 0x23, 0x03, 0x21,
- 0x15, 0x21, 0x03, 0x23, 0x13, 0x21, 0x03, 0x13, 0x21, 0x13, 0x21, 0x67,
- 0x57, 0xa9, 0xc7, 0x4a, 0xfe, 0xef, 0x01, 0x2f, 0x57, 0x96, 0x57, 0x01,
- 0x3b, 0x57, 0x97, 0x57, 0xad, 0xcb, 0x4b, 0x01, 0x16, 0xfe, 0xcc, 0x57,
- 0x96, 0x56, 0xfe, 0xc6, 0x57, 0x75, 0x01, 0x3a, 0x4b, 0xfe, 0xc5, 0x19,
- 0x01, 0xaa, 0x95, 0x01, 0x6b, 0x95, 0x01, 0xad, 0xfe, 0x53, 0x01, 0xad,
- 0xfe, 0x53, 0x95, 0xfe, 0x95, 0x95, 0xfe, 0x56, 0x01, 0xaa, 0xfe, 0x56,
- 0x02, 0x3f, 0x01, 0x6b, 0x00, 0x03, 0x00, 0x49, 0xff, 0x2d, 0x04, 0x13,
- 0x06, 0x41, 0x00, 0x2a, 0x00, 0x31, 0x00, 0x38, 0x01, 0xd4, 0x40, 0x25,
- 0x7c, 0x1e, 0x01, 0x04, 0x30, 0x2c, 0x36, 0x36, 0x2f, 0x46, 0x21, 0x55,
- 0x21, 0x50, 0x2f, 0x5d, 0x36, 0x6a, 0x03, 0x63, 0x2f, 0x7a, 0x03, 0x77,
- 0x21, 0x73, 0x2f, 0x7b, 0x36, 0x87, 0x21, 0x80, 0x2f, 0x8e, 0x36, 0x10,
- 0x31, 0xb8, 0xff, 0xde, 0xb7, 0x0b, 0x39, 0x1e, 0x20, 0x20, 0x24, 0x34,
- 0x2c, 0xb8, 0xff, 0xe0, 0x40, 0x2c, 0x20, 0x23, 0x34, 0x6a, 0x08, 0x38,
- 0x2a, 0x16, 0x0c, 0x37, 0x20, 0x16, 0x2a, 0x30, 0x21, 0x0b, 0x00, 0x15,
- 0x0c, 0x37, 0x31, 0x30, 0x21, 0x00, 0x15, 0x37, 0x21, 0x30, 0x30, 0xca,
- 0x0c, 0x37, 0x14, 0x0c, 0x0c, 0x37, 0x30, 0x0c, 0x21, 0x37, 0x04, 0x17,
- 0x32, 0x06, 0xb8, 0x02, 0xa4, 0xb6, 0x50, 0x05, 0x01, 0x05, 0xed, 0x01,
- 0x1c, 0xba, 0x02, 0xa4, 0x00, 0x1b, 0x02, 0xad, 0xb3, 0x17, 0x1f, 0xd3,
- 0x2b, 0xb8, 0x01, 0x35, 0x40, 0x0a, 0x14, 0x15, 0x16, 0x80, 0x17, 0x17,
- 0x14, 0x05, 0x00, 0x2a, 0xb8, 0x01, 0x37, 0xb2, 0x01, 0x0a, 0x32, 0xb8,
- 0x01, 0x35, 0xb4, 0x29, 0xd3, 0x01, 0x0d, 0x1c, 0xba, 0x01, 0x38, 0x00,
- 0x1b, 0x02, 0x98, 0xb2, 0x35, 0x73, 0x26, 0xb8, 0xff, 0xc0, 0x40, 0x0a,
- 0x12, 0x39, 0x30, 0x26, 0x40, 0x26, 0x80, 0x26, 0x03, 0x26, 0xb8, 0x02,
- 0x52, 0x40, 0x0f, 0x2a, 0x16, 0x17, 0x17, 0x1f, 0x1f, 0x20, 0x20, 0x38,
- 0x38, 0x32, 0x32, 0x29, 0x29, 0x2a, 0xb8, 0x01, 0x93, 0x40, 0x16, 0x00,
- 0x15, 0x14, 0x14, 0x2b, 0x2b, 0x31, 0x31, 0x0b, 0x0b, 0x0a, 0x0a, 0x30,
- 0x00, 0x40, 0x00, 0x80, 0x00, 0xd0, 0x00, 0x04, 0x00, 0xb8, 0x02, 0x0c,
- 0x40, 0x09, 0x05, 0x2e, 0x73, 0x6f, 0x10, 0x7f, 0x10, 0x02, 0x10, 0xba,
- 0x01, 0x8e, 0x00, 0x06, 0x01, 0x38, 0x40, 0x0f, 0x3f, 0x05, 0x4f, 0x05,
- 0x7f, 0x05, 0x8f, 0x05, 0x04, 0x05, 0x19, 0x39, 0xc7, 0x8b, 0x18, 0x2b,
- 0x4e, 0x10, 0xf4, 0x5d, 0x4d, 0xed, 0xf4, 0x71, 0xed, 0x10, 0xf4, 0x5d,
- 0x3c, 0x10, 0x3c, 0x10, 0x3c, 0x10, 0x3c, 0x10, 0x3c, 0x10, 0x3c, 0x10,
- 0xfd, 0x3c, 0x10, 0x3c, 0x10, 0x3c, 0x10, 0x3c, 0x10, 0x3c, 0x10, 0x3c,
- 0x10, 0x3c, 0x10, 0xf4, 0x5d, 0x2b, 0xed, 0xf4, 0xed, 0x00, 0x3f, 0xf4,
- 0xfd, 0x3c, 0x10, 0xf4, 0x3c, 0x3f, 0x3c, 0x10, 0xf4, 0x3c, 0x10, 0xfd,
- 0xe4, 0x10, 0xfd, 0xe4, 0x10, 0xfd, 0x5d, 0xe4, 0x11, 0x12, 0x17, 0x39,
- 0x87, 0x0e, 0x2e, 0x2b, 0x87, 0x0e, 0x7d, 0xc4, 0x0f, 0x0f, 0x0f, 0x0f,
- 0x31, 0x30, 0x18, 0x43, 0x79, 0x40, 0x4a, 0x21, 0x37, 0x0c, 0x13, 0x24,
- 0x25, 0x23, 0x25, 0x22, 0x25, 0x03, 0x06, 0x12, 0x26, 0x0e, 0x0f, 0x0d,
- 0x0f, 0x02, 0x06, 0x37, 0x21, 0x35, 0x4f, 0x01, 0x33, 0x28, 0x35, 0x4f,
- 0x01, 0x2c, 0x13, 0x2e, 0x4f, 0x00, 0x30, 0x0c, 0x2e, 0x4f, 0x00, 0x36,
- 0x25, 0x38, 0x4f, 0x01, 0x21, 0x20, 0x37, 0x38, 0x34, 0x27, 0x32, 0x4f,
- 0x00, 0x33, 0x32, 0x2d, 0x11, 0x2b, 0x4f, 0x01, 0x2c, 0x2b, 0x13, 0x14,
- 0x2f, 0x0f, 0x31, 0x4f, 0x00, 0x30, 0x31, 0x0c, 0x0b, 0x00, 0x10, 0x3c,
- 0x10, 0x3c, 0x2b, 0x10, 0x3c, 0x10, 0x3c, 0x2b, 0x10, 0x3c, 0x2b, 0x10,
- 0x3c, 0x10, 0x3c, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2a, 0x2b, 0x2a,
- 0x81, 0x81, 0x01, 0x2b, 0x2b, 0x00, 0x2b, 0x5d, 0x01, 0x5d, 0x05, 0x35,
- 0x2e, 0x02, 0x27, 0x37, 0x16, 0x17, 0x16, 0x17, 0x11, 0x26, 0x27, 0x2e,
- 0x01, 0x35, 0x34, 0x37, 0x36, 0x37, 0x35, 0x33, 0x15, 0x16, 0x17, 0x16,
- 0x17, 0x07, 0x2e, 0x01, 0x27, 0x11, 0x16, 0x17, 0x1e, 0x02, 0x15, 0x14,
- 0x06, 0x07, 0x15, 0x03, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x17, 0x13, 0x3e,
- 0x01, 0x35, 0x34, 0x26, 0x27, 0x01, 0xfe, 0x87, 0xa9, 0x7b, 0x0a, 0xb5,
- 0x15, 0x35, 0x4c, 0x6a, 0x6f, 0x74, 0x56, 0x5d, 0x88, 0x5b, 0xb3, 0x6a,
- 0x9d, 0x5c, 0x76, 0x18, 0xba, 0x10, 0x65, 0x58, 0x88, 0x2c, 0x54, 0x6a,
- 0x39, 0xee, 0xbd, 0x6a, 0x69, 0x79, 0x67, 0x7b, 0x6a, 0x69, 0x89, 0x61,
- 0x91, 0xd3, 0xb4, 0x11, 0x57, 0xc2, 0x8c, 0x22, 0x91, 0x44, 0x60, 0x0b,
- 0x02, 0x3d, 0x15, 0x41, 0x30, 0xaa, 0x6c, 0xc0, 0x77, 0x50, 0x12, 0x56,
- 0x56, 0x0f, 0x4d, 0x62, 0xab, 0x1c, 0x6a, 0x71, 0x12, 0xfd, 0xf9, 0x22,
- 0x13, 0x25, 0x6a, 0x92, 0x55, 0xbb, 0xfa, 0x09, 0xb6, 0x06, 0x28, 0x10,
- 0x88, 0x5d, 0x5c, 0x7c, 0x25, 0xfd, 0x16, 0x0d, 0x9c, 0x73, 0x62, 0x77,
- 0x2f, 0x00, 0x00, 0x05, 0x00, 0x77, 0xff, 0xca, 0x06, 0x9f, 0x05, 0xd3,
- 0x00, 0x0b, 0x00, 0x17, 0x00, 0x1b, 0x00, 0x27, 0x00, 0x33, 0x01, 0x07,
- 0x40, 0x0a, 0x90, 0x19, 0x90, 0x1a, 0x02, 0x68, 0x08, 0x1a, 0x1b, 0x1b,
- 0xb8, 0x02, 0x9a, 0x40, 0x0f, 0x18, 0x19, 0x14, 0x18, 0x18, 0x19, 0x18,
- 0x1b, 0x15, 0x0f, 0x19, 0x1a, 0x31, 0x2b, 0x12, 0xbc, 0x02, 0x9f, 0x00,
- 0x09, 0x01, 0x65, 0x00, 0x0c, 0x02, 0x9f, 0x40, 0x0b, 0x03, 0x1a, 0x19,
- 0x19, 0x03, 0x01, 0x1b, 0x18, 0x18, 0x25, 0x28, 0xbc, 0x02, 0x9f, 0x00,
- 0x1f, 0x01, 0x65, 0x00, 0x2e, 0x02, 0x9f, 0xb2, 0x25, 0x0b, 0x1c, 0xbc,
- 0x02, 0x9a, 0x00, 0x2b, 0x01, 0x00, 0x00, 0x31, 0x02, 0x9a, 0xb3, 0x22,
- 0xac, 0x35, 0x06, 0xbc, 0x02, 0x9a, 0x00, 0x15, 0x01, 0x00, 0x00, 0x0f,
- 0x02, 0x9a, 0x40, 0x09, 0x20, 0x00, 0x01, 0x00, 0x75, 0x34, 0x57, 0x5a,
- 0x18, 0x2b, 0x10, 0xf6, 0x5d, 0xed, 0xf4, 0xed, 0x10, 0xf6, 0xed, 0xf4,
- 0xed, 0x00, 0x3f, 0xed, 0xfd, 0xed, 0x10, 0x3c, 0x10, 0x3c, 0x3f, 0x3c,
- 0x10, 0x3c, 0x10, 0xed, 0xfd, 0xed, 0x01, 0x11, 0x12, 0x39, 0x39, 0x11,
- 0x12, 0x39, 0x39, 0x87, 0x2e, 0x2b, 0x7d, 0x10, 0xc4, 0x31, 0x30, 0x18,
- 0x43, 0x79, 0x40, 0x52, 0x01, 0x33, 0x29, 0x1e, 0x2b, 0x1f, 0x00, 0x33,
- 0x20, 0x31, 0x1f, 0x01, 0x2d, 0x26, 0x2b, 0x1f, 0x00, 0x2f, 0x24, 0x31,
- 0x1f, 0x01, 0x0d, 0x02, 0x0f, 0x1f, 0x00, 0x17, 0x04, 0x15, 0x1f, 0x01,
- 0x11, 0x0a, 0x0f, 0x1f, 0x00, 0x13, 0x08, 0x15, 0x1f, 0x01, 0x2a, 0x1d,
- 0x28, 0x1f, 0x01, 0x32, 0x21, 0x28, 0x1f, 0x01, 0x2c, 0x27, 0x2e, 0x1f,
- 0x00, 0x30, 0x23, 0x2e, 0x1f, 0x00, 0x0e, 0x01, 0x0c, 0x1f, 0x01, 0x16,
- 0x05, 0x0c, 0x1f, 0x01, 0x10, 0x0b, 0x12, 0x1f, 0x00, 0x14, 0x07, 0x12,
- 0x1f, 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01,
- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x81, 0x01, 0x5d, 0x13,
- 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06, 0x23, 0x22, 0x26, 0x01,
- 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x03,
- 0x01, 0x33, 0x09, 0x01, 0x34, 0x36, 0x33, 0x32, 0x16, 0x15, 0x14, 0x06,
- 0x23, 0x22, 0x26, 0x01, 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36,
- 0x35, 0x34, 0x26, 0x77, 0x9e, 0x96, 0x8a, 0xb5, 0xb7, 0x86, 0x85, 0xb1,
- 0x01, 0x39, 0x43, 0x59, 0x5a, 0x42, 0x44, 0x59, 0x5a, 0x42, 0x03, 0x22,
- 0x92, 0xfc, 0xe1, 0x01, 0xe5, 0x9e, 0x97, 0x8a, 0xb5, 0xb7, 0x87, 0x85,
- 0xb1, 0x01, 0x3a, 0x44, 0x59, 0x5a, 0x42, 0x45, 0x59, 0x5a, 0x04, 0x5a,
- 0x9d, 0xdc, 0xc5, 0xbf, 0xba, 0xc9, 0xc6, 0x01, 0xc5, 0x74, 0x9b, 0x8d,
- 0x73, 0x74, 0x9a, 0x8e, 0x73, 0xfa, 0x73, 0x06, 0x09, 0xf9, 0xf7, 0x01,
- 0x8e, 0x9e, 0xdb, 0xc5, 0xbf, 0xba, 0xc9, 0xc7, 0x01, 0xc4, 0x74, 0x9b,
- 0x8c, 0x74, 0x74, 0x9a, 0x8e, 0x73, 0x00, 0x03, 0x00, 0x58, 0xff, 0xde,
- 0x05, 0x27, 0x05, 0xd3, 0x00, 0x1f, 0x00, 0x2c, 0x00, 0x36, 0x01, 0x3d,
- 0x40, 0xc8, 0x7a, 0x15, 0x72, 0x16, 0x72, 0x17, 0x7a, 0x2e, 0x7a, 0x2f,
- 0x86, 0x16, 0xa6, 0x2f, 0xdd, 0x00, 0x08, 0x96, 0x1d, 0xa3, 0x16, 0x02,
- 0x89, 0x2f, 0x83, 0x36, 0x02, 0x83, 0x1c, 0x84, 0x21, 0x02, 0xb4, 0x16,
- 0x01, 0x60, 0x17, 0x61, 0x21, 0x02, 0x16, 0x15, 0x40, 0x16, 0x6a, 0x00,
- 0x03, 0xaa, 0x1e, 0xda, 0x16, 0x02, 0x73, 0x1c, 0x73, 0x1d, 0x02, 0x75,
- 0x1a, 0x72, 0x1b, 0x02, 0x75, 0x00, 0x7b, 0x16, 0x02, 0x8a, 0x17, 0x83,
- 0x1b, 0x02, 0xa9, 0x15, 0xae, 0x16, 0x02, 0x83, 0x1e, 0x8a, 0x20, 0x02,
- 0x8a, 0x0a, 0x83, 0x1c, 0x02, 0xcb, 0x20, 0xc6, 0x27, 0x02, 0xcd, 0x16,
- 0xc2, 0x1b, 0x02, 0xba, 0x1a, 0xc6, 0x14, 0x02, 0x69, 0x36, 0xba, 0x16,
- 0x02, 0x69, 0x17, 0x65, 0x33, 0x02, 0x65, 0x2f, 0x01, 0x56, 0x33, 0x5c,
- 0x36, 0x02, 0x46, 0x33, 0x5a, 0x1f, 0x02, 0x4d, 0x16, 0x42, 0x1b, 0x02,
- 0x30, 0x1a, 0x39, 0x1f, 0x02, 0x26, 0x1b, 0x24, 0x20, 0x02, 0x00, 0x2d,
- 0x2d, 0x1e, 0x2d, 0x2e, 0x0a, 0x0a, 0x00, 0x1b, 0x16, 0x16, 0x1d, 0x15,
- 0x20, 0x16, 0x16, 0x20, 0x20, 0xba, 0x0a, 0x2d, 0x14, 0x0a, 0x0a, 0x2d,
- 0x26, 0x29, 0x10, 0x01, 0x34, 0x29, 0x1e, 0x3a, 0x03, 0x0b, 0x1b, 0x86,
- 0x1d, 0x23, 0x5e, 0x60, 0x13, 0x70, 0x13, 0xa0, 0x13, 0x03, 0x2f, 0x13,
- 0x40, 0x13, 0x02, 0x13, 0xdc, 0x1d, 0x8f, 0x18, 0x01, 0x18, 0xb8, 0x02,
- 0x5a, 0x40, 0x1c, 0x19, 0x3e, 0x1e, 0x72, 0x20, 0x1d, 0x01, 0x1d, 0x38,
- 0x38, 0x29, 0x5e, 0xa0, 0x0d, 0x01, 0x0d, 0xa0, 0x31, 0x5e, 0x20, 0x07,
- 0x01, 0x07, 0x6a, 0x37, 0x71, 0x98, 0x18, 0x2b, 0x10, 0xf6, 0x5d, 0xed,
- 0xf4, 0x5d, 0xed, 0x10, 0xf4, 0x5d, 0xe4, 0xf4, 0xed, 0x5d, 0x10, 0xf4,
- 0x5d, 0x5d, 0xed, 0x10, 0xe4, 0x00, 0x3f, 0xe4, 0xed, 0x3f, 0xed, 0x87,
- 0x0e, 0x2e, 0x2b, 0x0e, 0x7d, 0x10, 0xc4, 0x07, 0x0e, 0x3c, 0x87, 0x0e,
- 0x10, 0xc4, 0x07, 0x0e, 0x10, 0x3c, 0x3c, 0x87, 0x0e, 0x10, 0xc4, 0x31,
- 0x30, 0x01, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d,
- 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x00, 0x5d, 0x5d,
- 0x5d, 0x5d, 0x5d, 0x5d, 0x5d, 0x25, 0x0e, 0x01, 0x23, 0x22, 0x27, 0x26,
- 0x35, 0x34, 0x36, 0x37, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16,
- 0x15, 0x14, 0x05, 0x01, 0x36, 0x37, 0x17, 0x06, 0x07, 0x16, 0x17, 0x07,
- 0x26, 0x01, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x15, 0x14,
- 0x16, 0x17, 0x09, 0x01, 0x0e, 0x01, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36,
- 0x03, 0xcd, 0x59, 0xd2, 0x7a, 0xe1, 0x84, 0x6b, 0xaf, 0xae, 0x63, 0x42,
- 0xcf, 0x9d, 0x96, 0xbf, 0xfe, 0xeb, 0x01, 0x07, 0x2d, 0x19, 0xbb, 0x30,
- 0x52, 0x65, 0x80, 0x79, 0x6d, 0xfe, 0x1e, 0x75, 0x45, 0x5f, 0x47, 0x49,
- 0x61, 0x23, 0x23, 0x01, 0x4d, 0xfe, 0xb6, 0x92, 0x66, 0x8e, 0x82, 0x51,
- 0xad, 0xad, 0x63, 0x63, 0x98, 0x7c, 0x99, 0x88, 0xdb, 0x53, 0x72, 0x8e,
- 0x42, 0x84, 0xc3, 0xb8, 0x81, 0xd1, 0x94, 0xfe, 0xb1, 0x58, 0x74, 0x28,
- 0xc0, 0x7c, 0x86, 0x5b, 0x8f, 0x46, 0x03, 0x85, 0x45, 0x68, 0x3f, 0x4b,
- 0x5f, 0x5e, 0x44, 0x22, 0x4b, 0x2a, 0xfd, 0x35, 0x01, 0x99, 0x57, 0x95,
- 0x49, 0x59, 0xc0, 0x65, 0x00, 0x01, 0x00, 0x5a, 0x03, 0xb3, 0x01, 0x27,
- 0x05, 0xba, 0x00, 0x05, 0x00, 0x26, 0x40, 0x15, 0x00, 0x05, 0x03, 0x01,
- 0x05, 0xee, 0x02, 0x00, 0x03, 0x81, 0x20, 0x01, 0x90, 0x01, 0x02, 0x01,
- 0x6a, 0x06, 0x71, 0xa7, 0x18, 0x2b, 0x10, 0xf6, 0x5d, 0xed, 0x00, 0x3f,
- 0xed, 0x01, 0x11, 0x12, 0x39, 0x39, 0x31, 0x30, 0x13, 0x03, 0x35, 0x33,
- 0x15, 0x03, 0x88, 0x2e, 0xcd, 0x30, 0x03, 0xb3, 0x01, 0x12, 0xf5, 0xf5,
- 0xfe, 0xee, 0x00, 0x01, 0x00, 0x7c, 0xfe, 0x51, 0x02, 0x60, 0x05, 0xd3,
- 0x00, 0x10, 0x00, 0x3d, 0x40, 0x0a, 0x27, 0x0f, 0x01, 0x00, 0x10, 0x12,
- 0x07, 0x08, 0x10, 0x10, 0xb8, 0x01, 0x33, 0xb3, 0x00, 0x9f, 0x0e, 0x08,
- 0xb8, 0x01, 0x33, 0x40, 0x11, 0x07, 0x9f, 0x0e, 0x5e, 0x00, 0x03, 0x10,
- 0x03, 0x20, 0x03, 0x03, 0x03, 0xac, 0x11, 0x9d, 0x8c, 0x18, 0x2b, 0x10,
- 0xf6, 0x5d, 0xfd, 0xf6, 0xed, 0x10, 0xf6, 0xed, 0x00, 0x3f, 0x3c, 0x3f,
- 0x3c, 0x31, 0x30, 0x01, 0x5d, 0x01, 0x26, 0x02, 0x11, 0x34, 0x37, 0x36,
- 0x37, 0x33, 0x06, 0x07, 0x06, 0x07, 0x06, 0x15, 0x10, 0x01, 0x01, 0xdf,
- 0x95, 0xce, 0x4d, 0x5a, 0xbc, 0x81, 0x79, 0x27, 0x3d, 0x23, 0x2b, 0x01,
- 0x2b, 0xfe, 0x51, 0xbc, 0x01, 0xf8, 0x01, 0x0e, 0xee, 0xda, 0xfd, 0xfb,
- 0xd0, 0x59, 0x8a, 0x96, 0xbb, 0xbd, 0xfe, 0x1f, 0xfe, 0x20, 0x00, 0x01,
- 0x00, 0x4b, 0xfe, 0x51, 0x02, 0x2f, 0x05, 0xd3, 0x00, 0x10, 0x00, 0x3d,
- 0x40, 0x0c, 0x28, 0x02, 0x28, 0x10, 0x02, 0x09, 0x0a, 0x10, 0x01, 0x00,
- 0x12, 0x09, 0xb8, 0x01, 0x33, 0xb3, 0x0a, 0x9f, 0x03, 0x01, 0xb8, 0x01,
- 0x33, 0x40, 0x0f, 0x00, 0x9f, 0x03, 0x5e, 0x0f, 0x0e, 0x1f, 0x0e, 0x02,
- 0x0e, 0xac, 0x12, 0x9d, 0x8c, 0x18, 0x2b, 0x10, 0xf6, 0x5d, 0xfd, 0xf6,
- 0xed, 0x10, 0xf6, 0xed, 0x00, 0x3f, 0x3c, 0x3f, 0x3c, 0x31, 0x30, 0x01,
- 0x5d, 0x13, 0x23, 0x00, 0x11, 0x34, 0x27, 0x26, 0x27, 0x26, 0x27, 0x33,
- 0x16, 0x17, 0x16, 0x15, 0x10, 0x02, 0xcc, 0x81, 0x01, 0x2b, 0x2b, 0x22,
- 0x3d, 0x27, 0x7a, 0x81, 0xbc, 0x5a, 0x4d, 0xcf, 0xfe, 0x51, 0x01, 0xe0,
- 0x01, 0xe1, 0xbc, 0xb9, 0x96, 0x8a, 0x5a, 0xd2, 0xfb, 0xfd, 0xda, 0xee,
- 0xfe, 0xf2, 0xfe, 0x08, 0x00, 0x01, 0x00, 0x40, 0x03, 0x63, 0x02, 0xd5,
- 0x05, 0xd3, 0x00, 0x18, 0x00, 0x86, 0x40, 0x4a, 0x0b, 0x01, 0x0b, 0x0a,
- 0x1b, 0x01, 0x1b, 0x0a, 0x04, 0x0a, 0x09, 0x0c, 0x0e, 0x0f, 0x10, 0x11,
- 0x07, 0x06, 0x0b, 0x01, 0x02, 0x18, 0x16, 0x15, 0x14, 0x13, 0x07, 0x00,
- 0x04, 0x03, 0x08, 0x17, 0x12, 0x0d, 0x07, 0x07, 0x06, 0x05, 0x18, 0x17,
- 0x16, 0x15, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0d, 0x0c, 0x0b, 0x14, 0x04,
- 0x07, 0x03, 0x08, 0x01, 0x0a, 0x06, 0x05, 0x0b, 0x00, 0x00, 0x10, 0x20,
- 0x14, 0x01, 0x14, 0xbf, 0x06, 0x05, 0x00, 0x0b, 0xa5, 0x06, 0xb8, 0x01,
- 0x95, 0x40, 0x0d, 0x05, 0xa5, 0x00, 0x40, 0x11, 0x13, 0x34, 0x00, 0x19,
- 0x19, 0x70, 0x8c, 0x18, 0x2b, 0x4e, 0x10, 0xf4, 0x2b, 0x4d, 0xf4, 0xfd,
- 0xe4, 0x00, 0x3f, 0x3c, 0xfd, 0x5d, 0x3c, 0x39, 0x2f, 0x3c, 0x12, 0x17,
- 0x39, 0x12, 0x17, 0x39, 0x01, 0x11, 0x12, 0x17, 0x39, 0x12, 0x17, 0x39,
- 0x11, 0x12, 0x17, 0x39, 0x31, 0x30, 0x00, 0x5d, 0x13, 0x37, 0x16, 0x17,
- 0x26, 0x27, 0x33, 0x06, 0x07, 0x36, 0x37, 0x17, 0x06, 0x07, 0x16, 0x17,
- 0x07, 0x26, 0x27, 0x06, 0x07, 0x27, 0x36, 0x37, 0x26, 0x40, 0x2e, 0x9f,
- 0x48, 0x13, 0x01, 0x91, 0x03, 0x14, 0x67, 0x85, 0x2e, 0x7f, 0x7a, 0x3d,
- 0x6f, 0x78, 0x3a, 0x4f, 0x4a, 0x38, 0x76, 0x74, 0x32, 0x81, 0x04, 0xad,
- 0x8e, 0x38, 0x29, 0xb5, 0x44, 0x63, 0x95, 0x34, 0x2c, 0x8e, 0x2a, 0x0e,
- 0x35, 0x88, 0x55, 0x4f, 0x88, 0x8d, 0x4a, 0x55, 0x8f, 0x2e, 0x19, 0x00,
- 0x00, 0x01, 0x00, 0x72, 0x00, 0xed, 0x04, 0x3a, 0x04, 0xb6, 0x00, 0x0b,
- 0x00, 0x38, 0x40, 0x1f, 0x00, 0x6e, 0x09, 0x02, 0xf9, 0x08, 0x03, 0x6e,
- 0x05, 0x07, 0x06, 0x09, 0x6e, 0x0a, 0x04, 0x0a, 0xf9, 0x05, 0x01, 0x6e,
- 0x3f, 0x02, 0x4f, 0x02, 0x02, 0x02, 0x19, 0x0c, 0x57, 0x5a, 0x18, 0x2b,
- 0x4e, 0x10, 0xf4, 0x5d, 0x4d, 0xf4, 0x3c, 0xed, 0x3c, 0x10, 0xe4, 0x3c,
- 0x3c, 0x00, 0x2f, 0xf4, 0x3c, 0xfd, 0x3c, 0xf4, 0x31, 0x30, 0x25, 0x11,
- 0x21, 0x35, 0x21, 0x11, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x02, 0x01,
- 0xfe, 0x71, 0x01, 0x8f, 0xaa, 0x01, 0x8f, 0xfe, 0x71, 0xed, 0x01, 0x92,
- 0xa8, 0x01, 0x8f, 0xfe, 0x71, 0xa8, 0xfe, 0x6e, 0x00, 0x01, 0x00, 0xaa,
- 0xfe, 0xde, 0x01, 0x83, 0x00, 0xcd, 0x00, 0x0a, 0x00, 0x4e, 0xb5, 0x0a,
- 0x03, 0x00, 0x07, 0xab, 0x06, 0xb8, 0x01, 0x50, 0x40, 0x26, 0x01, 0x03,
- 0x3c, 0x02, 0x02, 0x01, 0x0a, 0x01, 0x3c, 0x00, 0x0a, 0x02, 0x03, 0x01,
- 0x03, 0x3c, 0x00, 0x06, 0x38, 0x07, 0x3a, 0x4f, 0x00, 0x5f, 0x00, 0x6f,
- 0x00, 0x7f, 0x00, 0xa0, 0x00, 0x05, 0x00, 0xa0, 0x0b, 0xa1, 0x98, 0x18,
- 0x2b, 0x10, 0xf4, 0x5d, 0xf4, 0xe4, 0x10, 0xed, 0x3c, 0x10, 0x3c, 0x00,
- 0x3f, 0xed, 0x3c, 0x10, 0x3c, 0x10, 0xed, 0x10, 0xfd, 0xed, 0x01, 0x11,
- 0x12, 0x39, 0x31, 0x30, 0x33, 0x35, 0x33, 0x15, 0x14, 0x06, 0x07, 0x27,
- 0x3e, 0x01, 0x37, 0xb6, 0xcd, 0x50, 0x57, 0x32, 0x39, 0x36, 0x03, 0xcd,
- 0xcd, 0x71, 0x8b, 0x26, 0x4d, 0x19, 0x61, 0x5b, 0x00, 0x01, 0x00, 0x41,
- 0x01, 0xb8, 0x02, 0x6a, 0x02, 0x6d, 0x00, 0x03, 0x00, 0x2c, 0x40, 0x19,
- 0x70, 0x02, 0x70, 0x03, 0x02, 0x4d, 0x01, 0x4d, 0x02, 0x02, 0x01, 0x23,
- 0x00, 0x02, 0x1a, 0x05, 0x70, 0x00, 0x01, 0x00, 0x19, 0x04, 0x70, 0x8d,
- 0x18, 0x2b, 0x4e, 0x10, 0xe4, 0x5d, 0x10, 0xe6, 0x00, 0x2f, 0x4d, 0xed,
- 0x31, 0x30, 0x00, 0x71, 0x01, 0x5d, 0x13, 0x35, 0x21, 0x15, 0x41, 0x02,
- 0x29, 0x01, 0xb8, 0xb5, 0xb5, 0x00, 0x00, 0x01, 0x00, 0xba, 0x00, 0x00,
- 0x01, 0x87, 0x00, 0xcd, 0x00, 0x03, 0x00, 0x25, 0x40, 0x18, 0x02, 0x3c,
- 0x00, 0x0a, 0x02, 0x3c, 0x5f, 0x00, 0x6f, 0x00, 0x7f, 0x00, 0xaf, 0x00,
- 0x04, 0xa0, 0x00, 0x01, 0x00, 0xa0, 0x04, 0xa1, 0x98, 0x18, 0x2b, 0x10,
- 0xf6, 0x5d, 0x5d, 0xed, 0x00, 0x3f, 0xed, 0x31, 0x30, 0x33, 0x35, 0x33,
- 0x15, 0xba, 0xcd, 0xcd, 0xcd, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0xe7,
- 0x02, 0x39, 0x05, 0xd3, 0x00, 0x03, 0x00, 0x53, 0xb9, 0x00, 0x03, 0xff,
- 0xde, 0xb2, 0x14, 0x39, 0x02, 0xb8, 0xff, 0xde, 0x40, 0x20, 0x14, 0x39,
- 0x97, 0x03, 0x01, 0x02, 0x03, 0x9f, 0x03, 0xaf, 0x03, 0x02, 0x03, 0x76,
- 0x00, 0x01, 0x14, 0x00, 0x00, 0x01, 0x02, 0x01, 0x00, 0x03, 0x00, 0x0a,
- 0x03, 0xe8, 0x00, 0x02, 0xe8, 0x01, 0xb8, 0x01, 0xa9, 0xb5, 0x00, 0x00,
- 0x04, 0xb3, 0x7a, 0x18, 0x2b, 0x10, 0x3c, 0x10, 0xf4, 0xed, 0x10, 0xed,
- 0x00, 0x3f, 0x3c, 0x3f, 0x3c, 0x87, 0x05, 0x2e, 0x2b, 0x5d, 0x7d, 0x10,
- 0xc4, 0x31, 0x30, 0x01, 0x5d, 0x2b, 0x2b, 0x15, 0x01, 0x33, 0x01, 0x01,
- 0xa9, 0x90, 0xfe, 0x58, 0x19, 0x05, 0xec, 0xfa, 0x14, 0x00, 0x00, 0x02,
- 0x00, 0x55, 0xff, 0xe7, 0x04, 0x11, 0x05, 0xc0, 0x00, 0x10, 0x00, 0x1d,
- 0x00, 0xb5, 0xb4, 0x06, 0x20, 0x19, 0x10, 0x1c, 0xb8, 0xff, 0xf0, 0xb2,
- 0x02, 0x20, 0x0b, 0xbe, 0xff, 0xe0, 0x00, 0x16, 0xff, 0xe0, 0x00, 0x12,
- 0xff, 0xe0, 0x00, 0x0f, 0xff, 0xe0, 0x40, 0x62, 0x04, 0x06, 0x87, 0x02,
- 0x88, 0x0b, 0x88, 0x0f, 0xc9, 0x0e, 0x05, 0x09, 0x07, 0x0b, 0x18, 0x02,
- 0x45, 0x13, 0x4c, 0x15, 0x4a, 0x19, 0x43, 0x1b, 0x54, 0x13, 0x5c, 0x15,
- 0x5c, 0x19, 0x52, 0x1b, 0x6b, 0x07, 0x6b, 0x0b, 0x63, 0x13, 0x6c, 0x15,
- 0x6b, 0x19, 0x60, 0x1b, 0x79, 0x02, 0x77, 0x06, 0x76, 0x0b, 0x7a, 0x0f,
- 0x87, 0x06, 0x98, 0x07, 0x96, 0x10, 0xc9, 0x18, 0xda, 0x02, 0xd6, 0x06,
- 0xd6, 0x0b, 0xdb, 0x0f, 0x1a, 0x1a, 0x1e, 0x04, 0x05, 0x14, 0x1e, 0x0d,
- 0x0d, 0x17, 0x73, 0x09, 0x40, 0x21, 0x23, 0x34, 0x30, 0x09, 0x01, 0x00,
- 0x09, 0x10, 0x09, 0x02, 0x09, 0x90, 0x1f, 0x11, 0x73, 0x00, 0xb8, 0xff,
- 0xc0, 0x40, 0x0e, 0x21, 0x23, 0x34, 0x20, 0x00, 0x40, 0x00, 0x02, 0x00,
- 0x90, 0x1e, 0xc7, 0x8b, 0x18, 0x2b, 0x10, 0xf6, 0x5d, 0x2b, 0xed, 0x10,
- 0xf6, 0x5d, 0x71, 0x2b, 0xed, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x31, 0x30,
- 0x01, 0x5d, 0x71, 0x00, 0x5d, 0x00, 0x38, 0x38, 0x38, 0x38, 0x38, 0x01,
- 0x38, 0x38, 0x38, 0x13, 0x10, 0x12, 0x36, 0x33, 0x32, 0x1e, 0x01, 0x12,
- 0x15, 0x10, 0x02, 0x06, 0x23, 0x22, 0x27, 0x26, 0x13, 0x10, 0x16, 0x33,
- 0x32, 0x36, 0x11, 0x10, 0x26, 0x23, 0x22, 0x07, 0x06, 0x55, 0x6b, 0xd3,
- 0xa0, 0x76, 0xb2, 0x74, 0x42, 0x6a, 0xd3, 0xa1, 0xd4, 0x79, 0x91, 0xb9,
- 0xa9, 0x7c, 0x7c, 0xa9, 0xa9, 0x7e, 0x7c, 0x4a, 0x5d, 0x02, 0xd3, 0x01,
- 0x04, 0x01, 0x3d, 0xac, 0x5f, 0xb3, 0xfe, 0xff, 0xda, 0xfe, 0xfe, 0xfe,
- 0xc3, 0xad, 0x98, 0xb7, 0x01, 0x9d, 0xfe, 0x97, 0xef, 0xf0, 0x01, 0x68,
- 0x01, 0x6a, 0xee, 0x69, 0x86, 0x00, 0x00, 0x01, 0x00, 0xdf, 0x00, 0x00,
- 0x02, 0xfb, 0x05, 0xc0, 0x00, 0x0a, 0x00, 0x73, 0x40, 0x20, 0x03, 0x40,
- 0x0d, 0x11, 0x34, 0x6b, 0x04, 0x7f, 0x02, 0x8f, 0x02, 0x99, 0x08, 0x04,
- 0xac, 0x04, 0x01, 0x09, 0x00, 0x06, 0x05, 0x02, 0x03, 0x09, 0x05, 0x01,
- 0x0c, 0x02, 0x01, 0xca, 0x0a, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x12, 0x21,
- 0x23, 0x34, 0x30, 0x00, 0x01, 0x20, 0x00, 0x01, 0x00, 0x1a, 0x0c, 0x05,
- 0x40, 0x0d, 0x0f, 0x34, 0x05, 0xb8, 0xff, 0xc0, 0x40, 0x0e, 0x21, 0x23,
- 0x34, 0x30, 0x05, 0x01, 0x20, 0x05, 0x40, 0x05, 0x02, 0x05, 0x19, 0x0b,
- 0xba, 0x01, 0x3c, 0x01, 0x85, 0x00, 0x18, 0x2b, 0x4e, 0x10, 0xe4, 0x5d,
- 0x71, 0x2b, 0x2b, 0x10, 0xf6, 0x5d, 0x71, 0x2b, 0x3c, 0x4d, 0xfd, 0x3c,
- 0x00, 0x3f, 0x3f, 0x17, 0x39, 0x01, 0x11, 0x39, 0x31, 0x30, 0x01, 0x5d,
- 0x00, 0x5d, 0x2b, 0x21, 0x23, 0x11, 0x0e, 0x01, 0x07, 0x35, 0x3e, 0x01,
- 0x37, 0x33, 0x02, 0xfb, 0xb4, 0x41, 0xd3, 0x54, 0x97, 0xe2, 0x2f, 0x74,
- 0x04, 0x7b, 0x3e, 0x7c, 0x1f, 0xae, 0x47, 0xca, 0x5f, 0x00, 0x00, 0x01,
- 0x00, 0x3c, 0x00, 0x00, 0x04, 0x07, 0x05, 0xc0, 0x00, 0x1e, 0x00, 0xe7,
- 0x40, 0x36, 0x3b, 0x05, 0x3b, 0x06, 0xbb, 0x05, 0xbf, 0x06, 0xbb, 0x07,
- 0xc7, 0x08, 0xc9, 0x1c, 0x07, 0x49, 0x0c, 0x59, 0x0c, 0x54, 0x0e, 0x6b,
- 0x0c, 0x64, 0x0e, 0x7a, 0x12, 0x7a, 0x13, 0x89, 0x12, 0xbc, 0x12, 0xe5,
- 0x1a, 0xe5, 0x1b, 0xf0, 0x1a, 0x0c, 0xbf, 0x0b, 0xb7, 0x13, 0x02, 0x1b,
- 0x10, 0x1c, 0x10, 0x1d, 0x10, 0x1e, 0x10, 0x06, 0xbe, 0xff, 0xf0, 0x00,
- 0x07, 0xff, 0xe0, 0x00, 0x08, 0xff, 0xf0, 0x00, 0x09, 0xff, 0xf0, 0x40,
- 0x1a, 0x1e, 0x0a, 0x10, 0x08, 0x06, 0x06, 0xca, 0x1c, 0x1a, 0x14, 0x1c,
- 0x1c, 0x1a, 0x08, 0x1c, 0x1a, 0x03, 0x01, 0x02, 0x08, 0x1a, 0x1c, 0x03,
- 0x0d, 0x1e, 0x10, 0xb8, 0x02, 0xa4, 0xb3, 0x4f, 0x11, 0x01, 0x11, 0xb8,
- 0x01, 0x18, 0xb5, 0x0d, 0x1e, 0x14, 0x05, 0x00, 0x1e, 0xb8, 0x02, 0xbb,
- 0x40, 0x0f, 0x01, 0x02, 0x0c, 0x0a, 0x73, 0x17, 0xd3, 0x00, 0x00, 0x01,
- 0x40, 0x21, 0x23, 0x34, 0x01, 0xbb, 0x02, 0x81, 0x00, 0x20, 0x00, 0x10,
- 0x01, 0x38, 0x40, 0x0c, 0x11, 0xb5, 0x3f, 0x02, 0x5f, 0x02, 0x6f, 0x02,
- 0x7f, 0x02, 0x04, 0x02, 0xba, 0x02, 0x24, 0x00, 0x1f, 0x01, 0x8f, 0xb1,
- 0x8b, 0x18, 0x2b, 0x10, 0xf6, 0x5d, 0xf4, 0xed, 0x10, 0xf6, 0x2b, 0x3c,
- 0x10, 0xf4, 0xed, 0x00, 0x3f, 0x3c, 0xfd, 0x3c, 0x3f, 0xed, 0xfd, 0x5d,
- 0xe4, 0x11, 0x12, 0x17, 0x39, 0x01, 0x11, 0x12, 0x17, 0x39, 0x87, 0x0e,
- 0x2e, 0x2b, 0x0e, 0x7d, 0x10, 0xc4, 0x01, 0x11, 0x12, 0x39, 0x31, 0x30,
- 0x00, 0x38, 0x38, 0x38, 0x38, 0x01, 0x38, 0x38, 0x38, 0x38, 0x00, 0x5d,
- 0x01, 0x5d, 0x72, 0x25, 0x15, 0x21, 0x26, 0x37, 0x3e, 0x01, 0x37, 0x3e,
- 0x01, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x3e, 0x01, 0x33,
- 0x32, 0x16, 0x15, 0x14, 0x0e, 0x01, 0x07, 0x0e, 0x01, 0x07, 0x04, 0x07,
- 0xfc, 0x37, 0x02, 0x17, 0x25, 0xa3, 0x9a, 0xef, 0xa8, 0x99, 0x7b, 0x82,
- 0x9c, 0x01, 0xb9, 0x13, 0xf8, 0xd1, 0xd3, 0xf6, 0x48, 0xa7, 0xc2, 0xa2,
- 0x5c, 0x1e, 0xad, 0xad, 0x41, 0x3c, 0x63, 0xc0, 0x7e, 0xc4, 0xe5, 0x66,
- 0x6b, 0x93, 0x9c, 0x8a, 0x13, 0xcf, 0xd9, 0xea, 0xad, 0x58, 0xaa, 0xbc,
- 0xa4, 0x88, 0x61, 0x31, 0x00, 0x01, 0x00, 0x56, 0xff, 0xe6, 0x04, 0x16,
- 0x05, 0xc0, 0x00, 0x2b, 0x00, 0xd3, 0x40, 0x28, 0x05, 0x0d, 0x16, 0x0d,
- 0x45, 0x0d, 0x86, 0x0d, 0x04, 0x45, 0x11, 0x57, 0x11, 0x76, 0x1b, 0x03,
- 0x52, 0x16, 0x6c, 0x10, 0x6a, 0x14, 0x64, 0x16, 0x75, 0x0d, 0x79, 0x14,
- 0x86, 0x0d, 0x8a, 0x14, 0x89, 0x1b, 0xa5, 0x0d, 0x0a, 0x05, 0x20, 0x03,
- 0xb8, 0xff, 0xe0, 0x40, 0x0b, 0x0b, 0x0c, 0x0d, 0x0e, 0x04, 0x07, 0x01,
- 0x23, 0x0d, 0x0c, 0x01, 0xb8, 0x02, 0xa4, 0xb3, 0x40, 0x00, 0x01, 0x00,
- 0xbb, 0x01, 0x18, 0x00, 0x29, 0x00, 0x0d, 0x01, 0x35, 0xb4, 0x0c, 0x0c,
- 0x15, 0x04, 0x18, 0xba, 0x02, 0xa4, 0x00, 0x19, 0x02, 0x68, 0x40, 0x24,
- 0x15, 0x1e, 0x1c, 0x05, 0x04, 0x1e, 0x29, 0x0d, 0x12, 0x73, 0x5f, 0x20,
- 0x6f, 0x20, 0x02, 0x20, 0x80, 0x07, 0x73, 0x26, 0x40, 0x21, 0x23, 0x34,
- 0x30, 0x26, 0x01, 0x00, 0x26, 0x10, 0x26, 0x02, 0x26, 0x90, 0x2d, 0x18,
- 0xb8, 0x01, 0x38, 0xb2, 0x19, 0xd3, 0x01, 0xba, 0x01, 0x38, 0x00, 0x00,
- 0xff, 0xc0, 0x40, 0x0b, 0x21, 0x23, 0x34, 0x20, 0x00, 0x40, 0x00, 0x02,
- 0x00, 0x90, 0x2c, 0xb8, 0x01, 0x92, 0xb1, 0x8b, 0x18, 0x2b, 0x10, 0xf6,
- 0x5d, 0x2b, 0xed, 0xf4, 0xed, 0x10, 0xf6, 0x5d, 0x71, 0x2b, 0xed, 0xf4,
- 0x5d, 0xed, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0xfd, 0xe4, 0x11, 0x12, 0x39,
- 0x2f, 0xed, 0x10, 0xfd, 0x5d, 0xe4, 0x11, 0x12, 0x39, 0x01, 0x11, 0x12,
- 0x17, 0x39, 0x31, 0x30, 0x01, 0x38, 0x38, 0x01, 0x5d, 0x00, 0x5d, 0x01,
- 0x71, 0x13, 0x37, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23,
- 0x22, 0x07, 0x37, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22,
- 0x06, 0x07, 0x27, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x06,
- 0x07, 0x1e, 0x01, 0x15, 0x14, 0x00, 0x23, 0x22, 0x26, 0x56, 0xb4, 0x1f,
- 0x95, 0x6b, 0x7f, 0xaf, 0xa2, 0x7d, 0x33, 0x4c, 0x14, 0x12, 0x0b, 0x73,
- 0xb8, 0x86, 0x6a, 0x69, 0x8c, 0x14, 0xb4, 0x21, 0xea, 0xae, 0x78, 0xca,
- 0x6b, 0x66, 0x64, 0x82, 0x90, 0xfe, 0xe8, 0xd6, 0xc1, 0xff, 0x01, 0x83,
- 0x18, 0x99, 0x87, 0xb0, 0x82, 0x7c, 0xa1, 0x14, 0x9e, 0x02, 0x78, 0x7d,
- 0x63, 0x82, 0x84, 0x84, 0x20, 0xb5, 0xc7, 0x67, 0xb2, 0x64, 0x5f, 0x9c,
- 0x2e, 0x1e, 0xbd, 0x8e, 0xc0, 0xfe, 0xf5, 0xe6, 0x00, 0x02, 0x00, 0x1a,
- 0x00, 0x00, 0x04, 0x10, 0x05, 0xba, 0x00, 0x0a, 0x00, 0x0d, 0x00, 0xf4,
- 0x40, 0x36, 0x12, 0x58, 0x0c, 0x68, 0x0c, 0x9a, 0x0c, 0xa9, 0x0c, 0xc9,
- 0x0c, 0x05, 0x4c, 0x03, 0x4c, 0x0d, 0x94, 0x04, 0x03, 0x12, 0x01, 0x02,
- 0x08, 0x00, 0x0c, 0x06, 0x03, 0x07, 0x05, 0x0a, 0x0b, 0x03, 0x07, 0x00,
- 0x0c, 0x0c, 0x0d, 0x0d, 0xca, 0x03, 0x04, 0x14, 0x03, 0x03, 0x04, 0x03,
- 0x0d, 0x00, 0x02, 0x0c, 0x0d, 0x04, 0x07, 0x03, 0xbb, 0x02, 0xbb, 0x00,
- 0x08, 0x00, 0x02, 0x01, 0xa0, 0x40, 0x0a, 0x00, 0x04, 0x04, 0x00, 0x0c,
- 0x0c, 0x00, 0xca, 0x0a, 0x04, 0xb8, 0x02, 0x66, 0xb7, 0x05, 0x05, 0x0a,
- 0x40, 0x1d, 0x1f, 0x34, 0x0a, 0xb8, 0x01, 0x37, 0x40, 0x0d, 0x07, 0x40,
- 0x22, 0x23, 0x34, 0x07, 0x80, 0x21, 0x35, 0x07, 0x90, 0x0f, 0x02, 0xb8,
- 0xff, 0xc0, 0x40, 0x0d, 0x0d, 0x14, 0x34, 0x00, 0x02, 0x10, 0x02, 0x20,
- 0x02, 0x03, 0x02, 0xb5, 0x0e, 0xb8, 0x01, 0x8c, 0xb1, 0x8b, 0x18, 0x2b,
- 0x10, 0xec, 0x5d, 0x2b, 0x10, 0xf6, 0x2b, 0x2b, 0xf4, 0x2b, 0x3c, 0x10,
- 0xe6, 0x10, 0xfd, 0x3c, 0x00, 0x3f, 0x3f, 0x10, 0xf4, 0x3c, 0xf6, 0x3c,
- 0x11, 0x39, 0x39, 0x01, 0x11, 0x12, 0x39, 0x39, 0x87, 0x2e, 0x2b, 0x04,
- 0x7d, 0x10, 0xc4, 0x0f, 0x0f, 0x0f, 0x31, 0x30, 0x01, 0x43, 0x5c, 0x58,
- 0xb9, 0x00, 0x0d, 0xff, 0xde, 0xb2, 0x12, 0x39, 0x0d, 0xb8, 0xff, 0xd4,
- 0x40, 0x0b, 0x33, 0x39, 0x03, 0x22, 0x2d, 0x39, 0x03, 0x04, 0x1d, 0x1d,
- 0x3c, 0x2b, 0x2b, 0x2b, 0x2b, 0x59, 0x5d, 0x00, 0x5d, 0x43, 0x5c, 0x58,
- 0x40, 0x14, 0x0c, 0x40, 0x0b, 0x39, 0x0c, 0x80, 0x50, 0x39, 0x0c, 0x40,
- 0x26, 0x39, 0x0c, 0x22, 0x1c, 0x39, 0x0c, 0x40, 0x2d, 0x39, 0x2b, 0x2b,
- 0x2b, 0x2b, 0x2b, 0x59, 0x21, 0x11, 0x21, 0x35, 0x01, 0x33, 0x11, 0x33,
- 0x15, 0x23, 0x11, 0x03, 0x11, 0x01, 0x02, 0x96, 0xfd, 0x84, 0x02, 0x9d,
- 0x93, 0xc6, 0xc6, 0xb4, 0xfe, 0x35, 0x01, 0x5f, 0xa5, 0x03, 0xb6, 0xfc,
- 0x4a, 0xa5, 0xfe, 0xa1, 0x02, 0x04, 0x02, 0x95, 0xfd, 0x6b, 0x00, 0x01,
- 0x00, 0x55, 0xff, 0xe7, 0x04, 0x21, 0x05, 0xa6, 0x00, 0x1e, 0x00, 0xea,
- 0x40, 0x1d, 0x4b, 0x1a, 0x79, 0x1d, 0x8a, 0x1d, 0x96, 0x13, 0xa7, 0x13,
- 0xc3, 0x0c, 0xd6, 0x0c, 0xdb, 0x1b, 0x08, 0x09, 0x13, 0x18, 0x0e, 0x2a,
- 0x1a, 0x03, 0x09, 0x30, 0x05, 0x30, 0x0b, 0xba, 0xff, 0xe0, 0x00, 0x03,
- 0xff, 0xe0, 0x40, 0x10, 0x13, 0x0a, 0x15, 0x12, 0x13, 0x13, 0xca, 0x0e,
- 0x0f, 0x14, 0x0e, 0x13, 0x14, 0x0e, 0x0f, 0x0d, 0xb8, 0x02, 0xa4, 0x40,
- 0x13, 0x0e, 0x0a, 0x1e, 0x15, 0x40, 0x0e, 0xa0, 0x0e, 0x02, 0x0e, 0x0e,
- 0x0f, 0x40, 0x15, 0x01, 0x15, 0x15, 0x1c, 0x12, 0xb8, 0x02, 0xbb, 0xb7,
- 0x0f, 0x04, 0x01, 0xd3, 0x40, 0x00, 0x01, 0x00, 0xb8, 0x01, 0x18, 0x40,
- 0x23, 0x04, 0x1e, 0x1c, 0x0d, 0x11, 0x5f, 0x10, 0x6f, 0x10, 0x7f, 0x10,
- 0x8f, 0x10, 0x04, 0x10, 0x80, 0x07, 0x73, 0x18, 0x40, 0x21, 0x23, 0x34,
- 0x30, 0x18, 0x01, 0x00, 0x18, 0x10, 0x18, 0x02, 0x18, 0x90, 0x20, 0x12,
- 0xbc, 0x01, 0x35, 0x00, 0x0f, 0x01, 0x95, 0x00, 0x0d, 0x01, 0x38, 0xb2,
- 0x0e, 0xb5, 0x01, 0xba, 0x01, 0x38, 0x00, 0x00, 0xff, 0xc0, 0x40, 0x0b,
- 0x21, 0x23, 0x34, 0x20, 0x00, 0x40, 0x00, 0x02, 0x00, 0x90, 0x1f, 0xb8,
- 0x01, 0x92, 0xb1, 0x8b, 0x18, 0x2b, 0x10, 0xf6, 0x5d, 0x2b, 0xed, 0xf4,
- 0xed, 0xf4, 0xed, 0x10, 0xf6, 0x5d, 0x71, 0x2b, 0xed, 0xf4, 0x5d, 0x3c,
- 0x00, 0x3f, 0xed, 0xfd, 0x5d, 0xe4, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0x5d,
- 0x11, 0x39, 0x2f, 0x5d, 0x10, 0xed, 0x10, 0xe4, 0x87, 0x08, 0x2e, 0x2b,
- 0x05, 0x7d, 0x10, 0xc4, 0x00, 0x11, 0x12, 0x39, 0x31, 0x30, 0x01, 0x38,
- 0x38, 0x38, 0x38, 0x01, 0x71, 0x5d, 0x13, 0x37, 0x1e, 0x01, 0x33, 0x32,
- 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x13, 0x21, 0x15,
- 0x21, 0x03, 0x36, 0x33, 0x32, 0x00, 0x15, 0x14, 0x07, 0x06, 0x23, 0x22,
- 0x26, 0x55, 0xbd, 0x15, 0x99, 0x6c, 0x82, 0xb4, 0xad, 0x8c, 0x57, 0x8c,
- 0x28, 0xa9, 0x8e, 0x02, 0xd9, 0xfd, 0xb7, 0x4f, 0x84, 0x91, 0xc0, 0x01,
- 0x08, 0x74, 0x8d, 0xf4, 0xc8, 0xfd, 0x01, 0x80, 0x10, 0x8a, 0x8b, 0xc4,
- 0xa2, 0x9a, 0xb2, 0x4f, 0x3f, 0x16, 0x02, 0xf1, 0xac, 0xfe, 0x76, 0x5c,
- 0xfe, 0xf6, 0xd1, 0xc7, 0x91, 0xb2, 0xe0, 0x00, 0x00, 0x02, 0x00, 0x4d,
- 0xff, 0xe7, 0x04, 0x15, 0x05, 0xc0, 0x00, 0x1d, 0x00, 0x2a, 0x00, 0xb2,
- 0x40, 0x27, 0x6b, 0x19, 0x01, 0x44, 0x07, 0x40, 0x15, 0x44, 0x19, 0x44,
- 0x20, 0x5a, 0x12, 0x54, 0x20, 0x6b, 0x03, 0x64, 0x07, 0x64, 0x08, 0x6a,
- 0x12, 0x64, 0x20, 0x74, 0x08, 0x75, 0x1c, 0x85, 0x08, 0x86, 0x1c, 0xd6,
- 0x08, 0xd4, 0x16, 0x11, 0x07, 0xb8, 0xff, 0xe0, 0xb4, 0x27, 0x20, 0x23,
- 0x20, 0x21, 0xb8, 0xff, 0xe0, 0x40, 0x11, 0x28, 0x1e, 0x40, 0x0d, 0x50,
- 0x0d, 0x02, 0x0d, 0x0d, 0x14, 0x1b, 0x01, 0xd3, 0x5f, 0x00, 0x01, 0x00,
- 0xb8, 0x02, 0x68, 0x40, 0x09, 0x05, 0x1e, 0x1b, 0x05, 0x22, 0x1e, 0x14,
- 0x0d, 0x01, 0xb8, 0x01, 0x38, 0x40, 0x15, 0x00, 0xb5, 0x25, 0x73, 0x10,
- 0x40, 0x21, 0x23, 0x34, 0x30, 0x10, 0x01, 0x00, 0x10, 0x10, 0x10, 0x02,
- 0x10, 0x90, 0x2c, 0x0a, 0xba, 0x01, 0x38, 0x00, 0x1e, 0x01, 0x39, 0x40,
- 0x0a, 0x3f, 0x17, 0x5f, 0x17, 0x6f, 0x17, 0x7f, 0x17, 0x04, 0x17, 0xb8,
- 0x02, 0x24, 0xb3, 0x2b, 0xc7, 0x8b, 0x18, 0x2b, 0x10, 0xf6, 0x5d, 0xed,
- 0xed, 0x10, 0xf6, 0x5d, 0x71, 0x2b, 0xed, 0xf4, 0xed, 0x00, 0x3f, 0xed,
- 0x3f, 0xed, 0xfd, 0x5d, 0xe4, 0x11, 0x12, 0x39, 0x2f, 0x5d, 0xed, 0x31,
- 0x30, 0x01, 0x38, 0x38, 0x38, 0x38, 0x01, 0x5d, 0x00, 0x5d, 0x01, 0x07,
- 0x26, 0x27, 0x26, 0x23, 0x22, 0x07, 0x0e, 0x01, 0x07, 0x3e, 0x01, 0x33,
- 0x32, 0x12, 0x15, 0x14, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x11, 0x10, 0x37,
- 0x36, 0x33, 0x32, 0x16, 0x01, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35,
- 0x34, 0x26, 0x23, 0x22, 0x06, 0x03, 0xfb, 0xb3, 0x18, 0x2c, 0x49, 0x6b,
- 0x56, 0x41, 0x55, 0x62, 0x02, 0x41, 0xbc, 0x67, 0xb4, 0xfd, 0x77, 0xd0,
- 0x84, 0xe1, 0xfe, 0xe4, 0x9d, 0x89, 0xe8, 0xad, 0xdd, 0xfd, 0x37, 0x4f,
- 0x8e, 0x4e, 0x72, 0xa4, 0xa2, 0x7b, 0x7a, 0xaa, 0x04, 0x53, 0x0e, 0x6a,
- 0x30, 0x4d, 0x30, 0x3e, 0xee, 0xdc, 0x63, 0x60, 0xfe, 0xf7, 0xd2, 0x8a,
- 0xed, 0x7e, 0x01, 0x4b, 0x01, 0x7c, 0x01, 0xa9, 0xc1, 0xa8, 0xc2, 0xfc,
- 0xdd, 0x5d, 0xaa, 0x59, 0xb8, 0x9e, 0x98, 0xaf, 0xaf, 0x00, 0x00, 0x01,
- 0x00, 0x61, 0x00, 0x00, 0x04, 0x16, 0x05, 0xa7, 0x00, 0x0d, 0x00, 0x70,
- 0x40, 0x0e, 0xc4, 0x0d, 0x01, 0x04, 0x0d, 0x01, 0x04, 0x02, 0x08, 0x04,
- 0x09, 0x03, 0x0d, 0x00, 0xb8, 0x02, 0xbb, 0x40, 0x30, 0x02, 0x01, 0x04,
- 0x09, 0x0c, 0x0d, 0x73, 0x03, 0x03, 0x02, 0x40, 0x21, 0x23, 0x34, 0x4f,
- 0x02, 0x5f, 0x02, 0x6f, 0x02, 0x03, 0x02, 0x1a, 0x0f, 0x08, 0x73, 0x09,
- 0xeb, 0x00, 0x4f, 0x01, 0x5f, 0x01, 0x5f, 0x02, 0x03, 0x3f, 0x01, 0x5f,
- 0x01, 0x6f, 0x01, 0x7f, 0x01, 0x04, 0x01, 0x19, 0x0e, 0xb8, 0x01, 0x92,
- 0xb1, 0x8b, 0x18, 0x2b, 0x4e, 0x10, 0xf4, 0x5d, 0x71, 0x3c, 0x4d, 0xf4,
- 0xed, 0x4e, 0x10, 0xf6, 0x71, 0x2b, 0x3c, 0x4d, 0x10, 0xed, 0x00, 0x3f,
- 0x3f, 0x3c, 0xfd, 0x3c, 0x39, 0x11, 0x39, 0x01, 0x11, 0x12, 0x39, 0x31,
- 0x30, 0x01, 0x71, 0x5d, 0x13, 0x35, 0x21, 0x15, 0x06, 0x00, 0x03, 0x06,
- 0x07, 0x23, 0x36, 0x1a, 0x01, 0x37, 0x61, 0x03, 0xb5, 0x8c, 0xfe, 0xed,
- 0x4b, 0x36, 0x0f, 0xb9, 0x03, 0x82, 0xf3, 0x89, 0x04, 0xfa, 0xad, 0x8c,
- 0x95, 0xfe, 0x12, 0xfe, 0xfb, 0xb8, 0xdb, 0xad, 0x01, 0xea, 0x01, 0xc7,
- 0x9c, 0x00, 0x00, 0x03, 0x00, 0x53, 0xff, 0xe7, 0x04, 0x19, 0x05, 0xc0,
- 0x00, 0x17, 0x00, 0x23, 0x00, 0x30, 0x00, 0xdf, 0x40, 0x37, 0x35, 0x16,
- 0x01, 0x29, 0x16, 0x49, 0x16, 0x49, 0x26, 0xe6, 0x0c, 0xe9, 0x30, 0x05,
- 0x09, 0x30, 0x01, 0x7d, 0x00, 0x7d, 0x01, 0x7c, 0x04, 0x74, 0x08, 0x71,
- 0x0b, 0x72, 0x0c, 0x75, 0x0d, 0x7a, 0x17, 0x8b, 0x00, 0x8a, 0x01, 0x8c,
- 0x04, 0x86, 0x08, 0x81, 0x0b, 0x84, 0x0c, 0x86, 0x0d, 0x8d, 0x17, 0xcc,
- 0x11, 0xc6, 0x13, 0x12, 0x22, 0xb8, 0xff, 0xe0, 0xb2, 0x1c, 0x20, 0x1a,
- 0xb8, 0xff, 0xe0, 0xb2, 0x20, 0x20, 0x2f, 0xb8, 0xff, 0xe0, 0xb2, 0x2d,
- 0x20, 0x26, 0xb8, 0xff, 0xe0, 0x40, 0x1e, 0x29, 0x20, 0x0c, 0x00, 0x1e,
- 0x18, 0x00, 0x0c, 0x1b, 0x1e, 0x2e, 0xa0, 0x2e, 0x01, 0x2e, 0x12, 0x21,
- 0x1e, 0x06, 0x05, 0x28, 0x1e, 0x12, 0x0d, 0x1e, 0x73, 0xbf, 0x09, 0x01,
- 0x09, 0xb8, 0x02, 0x67, 0x40, 0x10, 0x2b, 0x73, 0x0f, 0x40, 0x20, 0x23,
- 0x34, 0x30, 0x0f, 0x01, 0x00, 0x0f, 0x10, 0x0f, 0x02, 0x0f, 0xb8, 0x01,
- 0x91, 0xb6, 0x32, 0x18, 0x73, 0xb0, 0x03, 0x01, 0x03, 0xb8, 0x02, 0x67,
- 0xb2, 0x24, 0x73, 0x15, 0xb8, 0xff, 0xc0, 0x40, 0x0e, 0x21, 0x23, 0x34,
- 0x20, 0x15, 0x40, 0x15, 0x02, 0x15, 0x90, 0x31, 0xc7, 0x8b, 0x18, 0x2b,
- 0x10, 0xf6, 0x5d, 0x2b, 0xed, 0xf4, 0x5d, 0xed, 0x10, 0xf4, 0x5d, 0x71,
- 0x2b, 0xed, 0xf4, 0x5d, 0xed, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39,
- 0x5d, 0x2f, 0xed, 0x39, 0x39, 0x01, 0x11, 0x12, 0x39, 0x39, 0x31, 0x30,
- 0x01, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x01, 0x5d, 0x72,
- 0x71, 0x00, 0x71, 0x01, 0x2e, 0x01, 0x35, 0x34, 0x36, 0x33, 0x32, 0x16,
- 0x15, 0x14, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x00, 0x23, 0x22, 0x00,
- 0x35, 0x34, 0x36, 0x13, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26,
- 0x23, 0x22, 0x06, 0x03, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34,
- 0x26, 0x23, 0x22, 0x06, 0x01, 0x6a, 0x70, 0x6c, 0xe6, 0xbf, 0xc0, 0xea,
- 0x6b, 0x6d, 0x87, 0x8d, 0xfe, 0xf6, 0xd9, 0xd9, 0xfe, 0xf6, 0x91, 0x62,
- 0x86, 0x6b, 0x68, 0x85, 0x89, 0x66, 0x67, 0x88, 0x3a, 0x49, 0x90, 0x53,
- 0x81, 0xa8, 0xad, 0x82, 0x7f, 0xa7, 0x03, 0x1b, 0x29, 0x98, 0x6a, 0xa0,
- 0xda, 0xdf, 0xa0, 0x66, 0x97, 0x29, 0x2c, 0xc4, 0x88, 0xbc, 0xff, 0x00,
- 0x01, 0x01, 0xc0, 0x8f, 0xc1, 0x01, 0x54, 0x68, 0x84, 0x83, 0x5f, 0x63,
- 0x87, 0x84, 0xfc, 0xff, 0x4d, 0x90, 0x4f, 0xa6, 0x80, 0x82, 0xaa, 0xa8,
- 0x00, 0x02, 0x00, 0x55, 0xff, 0xe7, 0x04, 0x19, 0x05, 0xc0, 0x00, 0x1e,
- 0x00, 0x2a, 0x00, 0xbe, 0x40, 0x34, 0x3a, 0x1a, 0x4c, 0x16, 0x40, 0x23,
- 0x5b, 0x16, 0x57, 0x23, 0x66, 0x03, 0x6c, 0x16, 0x6d, 0x1a, 0x67, 0x23,
- 0x7a, 0x1a, 0x7d, 0x1e, 0x8c, 0x1a, 0x8b, 0x1e, 0x9a, 0x16, 0xa9, 0x1a,
- 0xbc, 0x1a, 0xea, 0x16, 0xe6, 0x20, 0xf6, 0x20, 0x13, 0x3d, 0x16, 0x9e,
- 0x16, 0xad, 0x16, 0x03, 0x3a, 0x29, 0x64, 0x06, 0x02, 0x27, 0xba, 0xff,
- 0xe0, 0x00, 0x23, 0xff, 0xe0, 0x40, 0x18, 0x21, 0x20, 0x06, 0x20, 0x28,
- 0x1e, 0x4f, 0x0e, 0x5f, 0x0e, 0x02, 0x0e, 0x0e, 0x1c, 0x22, 0x1e, 0x14,
- 0x05, 0x01, 0xd3, 0x50, 0x00, 0x01, 0x00, 0xb8, 0x02, 0x68, 0xb4, 0x04,
- 0x1e, 0x1c, 0x0d, 0x1f, 0xba, 0x01, 0x39, 0x00, 0x0b, 0x01, 0x38, 0x40,
- 0x11, 0x18, 0x40, 0x21, 0x23, 0x34, 0x30, 0x18, 0x01, 0x00, 0x18, 0x10,
- 0x18, 0x02, 0x18, 0x90, 0x2c, 0x01, 0xb8, 0x01, 0x38, 0xb4, 0x00, 0xb5,
- 0x25, 0x73, 0x11, 0xb8, 0xff, 0xc0, 0x40, 0x0e, 0x21, 0x23, 0x34, 0x20,
- 0x11, 0x40, 0x11, 0x02, 0x11, 0x90, 0x2b, 0xc7, 0x8b, 0x18, 0x2b, 0x10,
- 0xf6, 0x5d, 0x2b, 0xed, 0xf4, 0xed, 0x10, 0xf6, 0x5d, 0x71, 0x2b, 0xed,
- 0xed, 0x00, 0x3f, 0xed, 0xfd, 0x5d, 0xe4, 0x3f, 0xed, 0x12, 0x39, 0x2f,
- 0x5d, 0xed, 0x31, 0x30, 0x01, 0x38, 0x38, 0x38, 0x38, 0x00, 0x5d, 0x71,
- 0x01, 0x5d, 0x13, 0x37, 0x1e, 0x01, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34,
- 0x27, 0x0e, 0x01, 0x23, 0x22, 0x02, 0x35, 0x34, 0x00, 0x33, 0x32, 0x16,
- 0x12, 0x11, 0x10, 0x02, 0x06, 0x23, 0x22, 0x26, 0x01, 0x34, 0x26, 0x23,
- 0x22, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36, 0x70, 0xad, 0x16, 0x7c,
- 0x61, 0x53, 0x7d, 0x50, 0x36, 0x01, 0x36, 0xbb, 0x6d, 0xb6, 0xfc, 0x01,
- 0x07, 0xc6, 0x8f, 0xed, 0x7b, 0x7a, 0xf1, 0xa2, 0xac, 0xda, 0x02, 0xcb,
- 0xa5, 0x74, 0x78, 0xb2, 0xa9, 0x7c, 0x7d, 0xa1, 0x01, 0x53, 0x10, 0x7a,
- 0x6e, 0x4c, 0x7f, 0xd8, 0x70, 0x0c, 0x18, 0x56, 0x6b, 0x01, 0x08, 0xd8,
- 0xdf, 0x01, 0x10, 0x9a, 0xfe, 0xe3, 0xfe, 0xf2, 0xfe, 0xe7, 0xfe, 0xb3,
- 0xae, 0xbf, 0x03, 0x34, 0x9b, 0xb6, 0xc4, 0x9c, 0x8c, 0xaf, 0xaf, 0x00,
- 0x00, 0x02, 0x00, 0xb9, 0x00, 0x00, 0x01, 0x86, 0x04, 0x26, 0x00, 0x03,
- 0x00, 0x07, 0x00, 0x38, 0x40, 0x20, 0x04, 0x05, 0x00, 0x06, 0x07, 0x09,
- 0x02, 0x06, 0x3c, 0x04, 0x03, 0x3c, 0x01, 0x06, 0x04, 0x0a, 0x02, 0x3c,
- 0x2f, 0x00, 0x3f, 0x00, 0x02, 0x20, 0x00, 0x01, 0x00, 0xa1, 0x08, 0xa1,
- 0x98, 0x18, 0x2b, 0x10, 0xf4, 0x5d, 0x71, 0xed, 0x00, 0x3f, 0x3f, 0xed,
- 0x10, 0xed, 0x01, 0x11, 0x12, 0x39, 0x39, 0x12, 0x39, 0x39, 0x31, 0x30,
- 0x13, 0x35, 0x33, 0x15, 0x03, 0x35, 0x33, 0x15, 0xb9, 0xcd, 0xcd, 0xcd,
- 0x03, 0x59, 0xcd, 0xcd, 0xfc, 0xa7, 0xcd, 0xcd, 0x00, 0x02, 0x00, 0xaa,
- 0xfe, 0xde, 0x01, 0x83, 0x04, 0x26, 0x00, 0x03, 0x00, 0x0e, 0x00, 0x85,
- 0x40, 0x2f, 0x73, 0x0b, 0x83, 0x0b, 0x93, 0x0b, 0xa3, 0x0b, 0xf0, 0x0b,
- 0x05, 0x00, 0x0b, 0x01, 0x26, 0x0a, 0x37, 0x0a, 0x46, 0x0a, 0x56, 0x0a,
- 0x65, 0x0a, 0xb5, 0x0a, 0xe2, 0x0a, 0x07, 0x0b, 0x0a, 0x0e, 0x07, 0x04,
- 0x03, 0x3c, 0x01, 0x07, 0x3c, 0x06, 0x06, 0x05, 0x0e, 0x04, 0x0b, 0xab,
- 0x0a, 0xb8, 0x01, 0x50, 0x40, 0x23, 0x05, 0x3c, 0x04, 0x01, 0x06, 0x04,
- 0x0a, 0x02, 0x81, 0x00, 0x00, 0x05, 0x06, 0x07, 0x3c, 0x04, 0x0a, 0x38,
- 0x0b, 0x3a, 0x05, 0x2f, 0x04, 0x3f, 0x04, 0x02, 0x20, 0x04, 0x01, 0x04,
- 0xa1, 0x0f, 0xa1, 0x98, 0x18, 0x2b, 0x10, 0xf4, 0x5d, 0x71, 0x3c, 0xf4,
- 0xe4, 0x10, 0xfd, 0x3c, 0x10, 0x3c, 0x10, 0xed, 0x00, 0x3f, 0x3f, 0x10,
- 0xfd, 0xfd, 0xed, 0x10, 0x3c, 0x10, 0x3c, 0x10, 0xed, 0x10, 0xed, 0x01,
- 0x11, 0x12, 0x39, 0x00, 0x10, 0xc9, 0x31, 0x30, 0x01, 0x71, 0x00, 0x72,
- 0x71, 0x13, 0x35, 0x33, 0x15, 0x03, 0x35, 0x33, 0x15, 0x14, 0x06, 0x07,
- 0x27, 0x3e, 0x01, 0x37, 0xb6, 0xcd, 0xcd, 0xcd, 0x50, 0x57, 0x32, 0x39,
- 0x36, 0x03, 0x03, 0x59, 0xcd, 0xcd, 0xfc, 0xa7, 0xcd, 0xcd, 0x71, 0x8b,
- 0x26, 0x4d, 0x19, 0x61, 0x5b, 0x00, 0x00, 0x01, 0x00, 0x70, 0x00, 0xe2,
- 0x04, 0x3b, 0x04, 0xc3, 0x00, 0x06, 0x00, 0x5a, 0x40, 0x0c, 0x8f, 0x03,
- 0x80, 0x05, 0x02, 0x03, 0x05, 0x06, 0x03, 0x08, 0x02, 0x05, 0xbb, 0x02,
- 0x5a, 0x00, 0x06, 0x00, 0x03, 0x02, 0x5a, 0xb2, 0x02, 0x40, 0x06, 0xba,
- 0x01, 0x50, 0x00, 0x02, 0x01, 0x50, 0x40, 0x15, 0x00, 0xab, 0x01, 0xab,
- 0x20, 0x04, 0x02, 0x1a, 0x08, 0x04, 0x3c, 0x01, 0x20, 0x00, 0x01, 0x00,
- 0x75, 0x07, 0x57, 0x5a, 0x18, 0x2b, 0x10, 0xf6, 0x5d, 0x3c, 0xed, 0x4e,
- 0x10, 0xf6, 0x00, 0x19, 0x2f, 0x1a, 0x4d, 0xed, 0xed, 0xed, 0xed, 0x18,
- 0x1a, 0x10, 0xed, 0x10, 0xed, 0x01, 0x11, 0x12, 0x17, 0x39, 0x31, 0x30,
- 0x00, 0x5d, 0x13, 0x35, 0x01, 0x15, 0x09, 0x01, 0x15, 0x70, 0x03, 0xcb,
- 0xfc, 0xfe, 0x03, 0x02, 0x02, 0x81, 0xa8, 0x01, 0x9a, 0xb3, 0xfe, 0xc4,
- 0xfe, 0xc1, 0xb3, 0x00, 0x00, 0x02, 0x00, 0x72, 0x01, 0xa1, 0x04, 0x3a,
- 0x04, 0x06, 0x00, 0x03, 0x00, 0x07, 0x00, 0x47, 0x40, 0x27, 0x05, 0x06,
- 0x01, 0x04, 0x07, 0x09, 0x00, 0x25, 0x03, 0x01, 0x25, 0x03, 0x02, 0x07,
- 0x25, 0x04, 0x04, 0x06, 0x25, 0x30, 0x02, 0x01, 0x9f, 0x02, 0xcf, 0x02,
- 0x02, 0x02, 0xbf, 0x05, 0x00, 0x1a, 0x09, 0x01, 0x19, 0x08, 0x57, 0x5a,
- 0x18, 0x2b, 0x4e, 0x10, 0xe4, 0x10, 0xe6, 0x00, 0x2f, 0x4d, 0xed, 0x5d,
- 0x71, 0xed, 0x3c, 0x10, 0xed, 0x10, 0x3c, 0xed, 0x10, 0xed, 0x01, 0x11,
- 0x39, 0x39, 0x11, 0x39, 0x39, 0x31, 0x30, 0x01, 0x21, 0x35, 0x21, 0x11,
- 0x21, 0x35, 0x21, 0x04, 0x3a, 0xfc, 0x38, 0x03, 0xc8, 0xfc, 0x38, 0x03,
- 0xc8, 0x03, 0x5e, 0xa8, 0xfd, 0x9b, 0xa8, 0x00, 0x00, 0x01, 0x00, 0x70,
- 0x00, 0xe2, 0x04, 0x3b, 0x04, 0xc3, 0x00, 0x06, 0x00, 0x5a, 0x40, 0x0c,
- 0x80, 0x02, 0x8f, 0x04, 0x02, 0x04, 0x02, 0x01, 0x03, 0x07, 0x05, 0x02,
- 0xbb, 0x02, 0x5a, 0x00, 0x01, 0x00, 0x04, 0x02, 0x5a, 0xb2, 0x05, 0x40,
- 0x01, 0xba, 0x01, 0x50, 0x00, 0x05, 0x01, 0x50, 0x40, 0x15, 0x00, 0xab,
- 0x06, 0xab, 0x20, 0x03, 0x03, 0x3c, 0x06, 0x00, 0x1a, 0x08, 0x20, 0x05,
- 0x01, 0x05, 0x75, 0x07, 0x57, 0x5a, 0x18, 0x2b, 0x10, 0xe6, 0x5d, 0x4e,
- 0x10, 0xf6, 0x3c, 0x4d, 0xed, 0x00, 0x19, 0x2f, 0x1a, 0xed, 0xed, 0xed,
- 0xed, 0x18, 0x1a, 0x10, 0xed, 0x10, 0xed, 0x01, 0x11, 0x12, 0x17, 0x39,
- 0x31, 0x30, 0x00, 0x5d, 0x09, 0x01, 0x35, 0x09, 0x01, 0x35, 0x01, 0x04,
- 0x3b, 0xfc, 0x35, 0x03, 0x01, 0xfc, 0xff, 0x03, 0xcb, 0x02, 0x81, 0xfe,
- 0x61, 0xb3, 0x01, 0x3f, 0x01, 0x3c, 0xb3, 0xfe, 0x66, 0x00, 0x00, 0x02,
- 0x00, 0x5a, 0x00, 0x00, 0x04, 0x0c, 0x05, 0xd3, 0x00, 0x1e, 0x00, 0x22,
- 0x00, 0x84, 0x40, 0x2f, 0x8c, 0x1a, 0x8b, 0x1b, 0x02, 0x7c, 0x1a, 0x7c,
- 0x1b, 0x02, 0x62, 0x1a, 0x65, 0x1b, 0x02, 0x6b, 0x0c, 0x61, 0x0e, 0x02,
- 0x5a, 0x0c, 0x54, 0x0e, 0x02, 0x36, 0x0e, 0x44, 0x0e, 0x02, 0x1b, 0x19,
- 0x08, 0x07, 0x04, 0x00, 0x10, 0x27, 0x11, 0x11, 0x00, 0x0d, 0x29, 0x14,
- 0x01, 0x1e, 0x00, 0xb8, 0x02, 0xaf, 0x40, 0x23, 0x21, 0x22, 0x21, 0x3c,
- 0x1f, 0x0a, 0x1f, 0x3c, 0x22, 0x22, 0x20, 0x3c, 0x21, 0x21, 0x1e, 0x00,
- 0x5e, 0x1e, 0x6e, 0x0a, 0x5e, 0x17, 0x6a, 0x24, 0x10, 0x5e, 0x20, 0x11,
- 0x01, 0x11, 0x6a, 0x23, 0x57, 0x5a, 0x18, 0x2b, 0x10, 0xf6, 0x5d, 0xed,
- 0x10, 0xf6, 0xed, 0xf4, 0xed, 0x10, 0x3c, 0x10, 0xed, 0x3c, 0x10, 0xfd,
- 0x00, 0x3f, 0xed, 0x3c, 0x10, 0xf6, 0x3c, 0x3f, 0xed, 0x12, 0x39, 0x2f,
- 0xe4, 0x11, 0x17, 0x39, 0x31, 0x30, 0x01, 0x5d, 0x5d, 0x5d, 0x5d, 0x00,
- 0x5d, 0x5d, 0x01, 0x26, 0x35, 0x34, 0x37, 0x36, 0x37, 0x3e, 0x02, 0x35,
- 0x34, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x3e, 0x01, 0x33, 0x32, 0x04,
- 0x15, 0x14, 0x06, 0x07, 0x0e, 0x02, 0x07, 0x03, 0x35, 0x33, 0x15, 0x01,
- 0xd8, 0x01, 0x1e, 0x16, 0x31, 0x24, 0xbb, 0x38, 0xa4, 0x77, 0x73, 0x9a,
- 0x18, 0xb9, 0x19, 0xf7, 0xcb, 0xd7, 0x01, 0x00, 0x5a, 0x83, 0x58, 0x36,
- 0x1a, 0x02, 0xb8, 0xcd, 0x01, 0x69, 0x24, 0x12, 0x6a, 0x4d, 0x3a, 0x3b,
- 0x2b, 0xa5, 0x62, 0x3a, 0x69, 0x9f, 0x90, 0x99, 0x16, 0xcd, 0xda, 0xea,
- 0xa6, 0x60, 0xa2, 0x74, 0x4e, 0x4a, 0x60, 0x6c, 0xfe, 0x97, 0xcd, 0xcd,
- 0x00, 0x02, 0x00, 0x6f, 0xfe, 0x51, 0x07, 0xd5, 0x05, 0xd5, 0x00, 0x47,
- 0x00, 0x57, 0x00, 0xf7, 0x40, 0x57, 0x04, 0x21, 0x10, 0x20, 0x16, 0x21,
- 0x21, 0x25, 0x35, 0x0d, 0x33, 0x0e, 0x45, 0x0e, 0x49, 0x18, 0x44, 0x21,
- 0x46, 0x24, 0x46, 0x49, 0x47, 0x56, 0x54, 0x0e, 0x7a, 0x29, 0x0e, 0x16,
- 0x25, 0x29, 0x01, 0x26, 0x09, 0x2a, 0x1d, 0x26, 0x29, 0x35, 0x1a, 0x36,
- 0x39, 0x43, 0x25, 0x56, 0x18, 0x59, 0x1d, 0x5b, 0x21, 0x56, 0x29, 0x56,
- 0x49, 0x59, 0x56, 0x65, 0x18, 0x65, 0x25, 0x66, 0x29, 0x76, 0x1a, 0x7a,
- 0x1d, 0x72, 0x24, 0x85, 0x18, 0x84, 0x1a, 0x8c, 0x1d, 0x8b, 0x21, 0x87,
- 0x26, 0x19, 0x0e, 0x10, 0x50, 0x0e, 0x00, 0x03, 0x53, 0xb8, 0x02, 0xbb,
- 0x40, 0x0a, 0x0f, 0x27, 0x30, 0x0b, 0x50, 0x0b, 0x02, 0x0b, 0x07, 0x16,
- 0xbb, 0x02, 0x48, 0x00, 0x43, 0x00, 0x4b, 0x02, 0xbb, 0xb4, 0x43, 0x3a,
- 0x03, 0x0a, 0x1f, 0xb8, 0x02, 0xbb, 0xb7, 0x3a, 0x01, 0x20, 0x2b, 0x70,
- 0x2b, 0x02, 0x2b, 0xba, 0x01, 0x4d, 0x00, 0x27, 0x02, 0xbb, 0xb6, 0x2f,
- 0x48, 0x24, 0x0f, 0x07, 0x01, 0x07, 0xb8, 0x02, 0x83, 0x40, 0x0f, 0x10,
- 0x50, 0x3e, 0x00, 0x24, 0x12, 0xa0, 0x0f, 0x24, 0x30, 0x10, 0x70, 0x10,
- 0x02, 0x10, 0xba, 0x01, 0xa9, 0x00, 0x1b, 0x02, 0x9e, 0xb4, 0x3f, 0x38,
- 0x2a, 0x24, 0x2b, 0xba, 0x01, 0x09, 0x00, 0x23, 0x02, 0x9e, 0x40, 0x09,
- 0x20, 0x35, 0x01, 0x35, 0x19, 0x58, 0x57, 0x8c, 0x18, 0x2b, 0x4e, 0x10,
- 0xf4, 0x5d, 0x4d, 0xed, 0xfd, 0xed, 0xf4, 0xed, 0xf4, 0x5d, 0xed, 0xf4,
- 0xfd, 0xe4, 0x10, 0xfd, 0x5d, 0xed, 0x00, 0x2f, 0xed, 0xed, 0x5d, 0x3f,
- 0xed, 0x3f, 0xe4, 0xed, 0x10, 0xed, 0x3f, 0x5d, 0xe4, 0xed, 0x12, 0x39,
- 0x39, 0x01, 0x11, 0x12, 0x39, 0x31, 0x30, 0x00, 0x5d, 0x01, 0x5d, 0x25,
- 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x01, 0x35, 0x34, 0x12, 0x36, 0x33, 0x32,
- 0x16, 0x17, 0x37, 0x33, 0x03, 0x06, 0x15, 0x14, 0x16, 0x33, 0x32, 0x37,
- 0x36, 0x12, 0x35, 0x34, 0x02, 0x24, 0x23, 0x22, 0x04, 0x02, 0x15, 0x14,
- 0x12, 0x04, 0x33, 0x20, 0x24, 0x37, 0x33, 0x0e, 0x01, 0x04, 0x23, 0x22,
- 0x2c, 0x01, 0x27, 0x26, 0x35, 0x34, 0x37, 0x12, 0x00, 0x21, 0x32, 0x04,
- 0x17, 0x16, 0x15, 0x10, 0x07, 0x06, 0x23, 0x22, 0x26, 0x27, 0x26, 0x01,
- 0x14, 0x16, 0x33, 0x32, 0x3e, 0x02, 0x35, 0x34, 0x26, 0x23, 0x22, 0x0e,
- 0x02, 0x04, 0x89, 0x41, 0xa1, 0x51, 0x59, 0xa8, 0x69, 0xa3, 0xf2, 0x72,
- 0x57, 0x9e, 0x39, 0x22, 0xb3, 0x90, 0x1e, 0x29, 0x1d, 0x35, 0x56, 0x72,
- 0x85, 0xab, 0xfe, 0xad, 0xcd, 0xea, 0xfe, 0x7d, 0xd5, 0xd5, 0x01, 0x93,
- 0xf5, 0x01, 0x06, 0x01, 0x62, 0x58, 0xb5, 0x33, 0xf8, 0xfe, 0xaa, 0xf1,
- 0xde, 0xfe, 0x89, 0xfe, 0xf8, 0x43, 0x54, 0x64, 0x7a, 0x01, 0xc1, 0x01,
- 0x40, 0xf8, 0x01, 0x8b, 0x72, 0x61, 0xcc, 0xb6, 0xd8, 0x45, 0x55, 0x14,
- 0x0d, 0xfe, 0x16, 0x82, 0x54, 0x38, 0x7c, 0x71, 0x48, 0x87, 0x61, 0x40,
- 0x71, 0x6a, 0x40, 0xa3, 0x4b, 0x5b, 0x68, 0xd8, 0x81, 0x9f, 0x01, 0x3f,
- 0xa0, 0x5b, 0x5d, 0x9b, 0xfd, 0x61, 0x8c, 0x0f, 0x1b, 0x27, 0x3d, 0x50,
- 0x01, 0x0d, 0x8f, 0xa7, 0x01, 0x22, 0xae, 0xdb, 0xfe, 0x67, 0xea, 0xf5,
- 0xfe, 0x9e, 0xa9, 0xb0, 0x7e, 0x69, 0xda, 0x7f, 0x72, 0xe5, 0x95, 0xbd,
- 0xdb, 0xf4, 0xdd, 0x01, 0x0f, 0x01, 0x20, 0xcb, 0xc9, 0xad, 0xcb, 0xfe,
- 0xde, 0xe1, 0xca, 0x2a, 0x27, 0x19, 0x01, 0x4c, 0x89, 0x98, 0x43, 0x84,
- 0xcb, 0x66, 0x88, 0x96, 0x41, 0x90, 0xce, 0x00, 0x00, 0x02, 0xff, 0xfd,
- 0x00, 0x00, 0x05, 0x59, 0x05, 0xba, 0x00, 0x07, 0x00, 0x0e, 0x00, 0x00,
- 0x23, 0x01, 0x33, 0x01, 0x23, 0x03, 0x21, 0x03, 0x13, 0x21, 0x03, 0x26,
- 0x27, 0x06, 0x07, 0x03, 0x02, 0x33, 0xd1, 0x02, 0x58, 0xdd, 0xab, 0xfd,
- 0x9b, 0xa1, 0xd9, 0x01, 0xf1, 0x99, 0x46, 0x22, 0x1c, 0x33, 0x05, 0xba,
- 0xfa, 0x46, 0x01, 0xbc, 0xfe, 0x44, 0x02, 0x5a, 0x01, 0x96, 0xb9, 0x77,
- 0x8d, 0x8b, 0x00, 0x03, 0x00, 0x96, 0x00, 0x00, 0x04, 0xe9, 0x05, 0xba,
- 0x00, 0x11, 0x00, 0x1d, 0x00, 0x2a, 0x00, 0x81, 0x40, 0x50, 0x04, 0x04,
- 0x46, 0x23, 0x56, 0x23, 0x66, 0x23, 0x73, 0x09, 0x84, 0x09, 0x06, 0x69,
- 0x1a, 0x75, 0x05, 0x70, 0x09, 0x73, 0x0b, 0x83, 0x05, 0x83, 0x0b, 0x06,
- 0x27, 0x16, 0x09, 0x03, 0x18, 0x27, 0x2a, 0x1e, 0x16, 0x1d, 0x09, 0x09,
- 0x13, 0x12, 0x1e, 0x2a, 0x2a, 0x29, 0x29, 0x00, 0x1c, 0x1d, 0x1e, 0x02,
- 0x01, 0x02, 0x1f, 0x1e, 0x1e, 0x11, 0x00, 0x08, 0x18, 0x26, 0x06, 0x54,
- 0x25, 0x26, 0x0c, 0x1a, 0x2c, 0x1d, 0x1e, 0x20, 0x01, 0x20, 0x00, 0x01,
- 0x00, 0x5d, 0x2b, 0x3b, 0x5c, 0x18, 0x2b, 0x10, 0xf6, 0x5d, 0x3c, 0xfd,
- 0x3c, 0x4e, 0x10, 0xf6, 0x4d, 0xed, 0xf4, 0xed, 0x00, 0x3f, 0x3c, 0xfd,
- 0x3c, 0x3f, 0x3c, 0xfd, 0x3c, 0x12, 0x39, 0x2f, 0x3c, 0x10, 0xfd, 0x3c,
- 0x39, 0x2f, 0x11, 0x39, 0x11, 0x12, 0x39, 0x01, 0x12, 0x17, 0x39, 0x31,
- 0x30, 0x01, 0x5d, 0x00, 0x5d, 0x33, 0x11, 0x21, 0x32, 0x1e, 0x01, 0x15,
- 0x14, 0x06, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x0e, 0x02, 0x23, 0x01, 0x21,
- 0x32, 0x37, 0x3e, 0x01, 0x35, 0x34, 0x2e, 0x01, 0x23, 0x21, 0x11, 0x21,
- 0x32, 0x37, 0x3e, 0x02, 0x35, 0x34, 0x2e, 0x01, 0x23, 0x21, 0x96, 0x02,
- 0x26, 0xa8, 0xcb, 0x73, 0x66, 0x67, 0x85, 0x8f, 0x57, 0x80, 0xc1, 0x8c,
- 0xfe, 0x93, 0x01, 0x3d, 0x81, 0x38, 0x4a, 0x4b, 0x46, 0x82, 0x9e, 0xfe,
- 0xdb, 0x01, 0x6d, 0x5e, 0x26, 0x43, 0x5a, 0x3a, 0x54, 0x95, 0x8c, 0xfe,
- 0xad, 0x05, 0xba, 0x59, 0xb9, 0x65, 0x5e, 0xa6, 0x33, 0x27, 0xbc, 0x80,
- 0x67, 0xb1, 0x60, 0x31, 0x03, 0x52, 0x11, 0x16, 0x66, 0x4d, 0x49, 0x6f,
- 0x29, 0xfb, 0xa0, 0x07, 0x0c, 0x38, 0x6b, 0x46, 0x52, 0x79, 0x31, 0x00,
- 0x00, 0x01, 0x00, 0x66, 0xff, 0xe7, 0x05, 0x76, 0x05, 0xd3, 0x00, 0x1d,
- 0x00, 0xb8, 0x40, 0x60, 0x63, 0x02, 0x6a, 0x1d, 0x02, 0x20, 0x00, 0x32,
- 0x0d, 0x63, 0x00, 0x70, 0x00, 0x74, 0x1d, 0x80, 0x00, 0x84, 0x1d, 0x90,
- 0x00, 0x9a, 0x05, 0xab, 0x03, 0xa5, 0x0d, 0xb9, 0x03, 0xb4, 0x0d, 0xc7,
- 0x0d, 0xd0, 0x00, 0xe4, 0x1d, 0xf3, 0x1d, 0x11, 0x0e, 0x12, 0x1d, 0x11,
- 0x1d, 0x1d, 0x03, 0x2a, 0x06, 0x28, 0x11, 0x2a, 0x1c, 0x20, 0x1f, 0x47,
- 0x0d, 0x56, 0x14, 0x57, 0x15, 0x56, 0x19, 0x68, 0x05, 0x6b, 0x1d, 0x7b,
- 0x12, 0x8b, 0x12, 0x9a, 0x03, 0x99, 0x0e, 0x9a, 0x1c, 0xa8, 0x01, 0xa4,
- 0x02, 0xa8, 0x11, 0xd5, 0x0e, 0x13, 0x00, 0x14, 0x00, 0x1a, 0x10, 0x14,
- 0x10, 0x1a, 0x04, 0x02, 0xb8, 0xff, 0xde, 0xb2, 0x28, 0x39, 0x01, 0xb8,
- 0xff, 0xc0, 0x40, 0x27, 0x28, 0x39, 0x10, 0x0f, 0x00, 0x01, 0x04, 0x1b,
- 0x13, 0x1e, 0x0c, 0x03, 0x1b, 0x1e, 0x04, 0x09, 0x10, 0x26, 0x0f, 0x4a,
- 0x00, 0x26, 0x20, 0x01, 0x01, 0x01, 0x1a, 0x1f, 0x17, 0x26, 0x20, 0x08,
- 0x01, 0x08, 0x19, 0x1e, 0x63, 0x5c, 0x18, 0x2b, 0x4e, 0x10, 0xf4, 0x5d,
- 0x4d, 0xed, 0x4e, 0x10, 0xf6, 0x5d, 0x4d, 0xed, 0xf4, 0xed, 0x00, 0x3f,
- 0xed, 0x3f, 0xed, 0x11, 0x17, 0x39, 0x31, 0x30, 0x01, 0x2b, 0x2b, 0x5d,
- 0x5d, 0x71, 0x00, 0x5d, 0x01, 0x72, 0x01, 0x17, 0x06, 0x04, 0x23, 0x22,
- 0x24, 0x02, 0x35, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x17, 0x07, 0x2e,
- 0x01, 0x23, 0x22, 0x06, 0x02, 0x15, 0x14, 0x12, 0x16, 0x33, 0x32, 0x36,
- 0x04, 0xb4, 0xc2, 0x3d, 0xfe, 0xc3, 0xe5, 0xed, 0xfe, 0xd7, 0x9b, 0xaf,
- 0x01, 0x43, 0xc2, 0xdc, 0x01, 0x2c, 0x3b, 0xbf, 0x33, 0xc2, 0x93, 0xa9,
- 0xe3, 0x5c, 0x6d, 0xe6, 0x86, 0xa3, 0xe2, 0x02, 0x02, 0x31, 0xef, 0xfb,
- 0xc1, 0x01, 0x6e, 0xd2, 0xe5, 0x01, 0x55, 0xb1, 0xe0, 0xcb, 0x2d, 0xa0,
- 0x92, 0xa2, 0xfe, 0xef, 0x91, 0xbb, 0xfe, 0xe9, 0x8a, 0xbc, 0x00, 0x02,
- 0x00, 0x9e, 0x00, 0x00, 0x05, 0x5a, 0x05, 0xba, 0x00, 0x0f, 0x00, 0x1d,
- 0x00, 0x84, 0x40, 0x26, 0x20, 0x1f, 0x01, 0x43, 0x08, 0x1c, 0x1d, 0x1e,
- 0x02, 0x01, 0x02, 0x11, 0x10, 0x1e, 0x0f, 0x00, 0x08, 0x17, 0x26, 0x20,
- 0x09, 0x01, 0x09, 0x1a, 0x1f, 0x1d, 0x10, 0x20, 0x01, 0x20, 0x00, 0x01,
- 0x00, 0x5d, 0x1e, 0x3b, 0x5c, 0x18, 0x2b, 0x10, 0xf6, 0x5d, 0x3c, 0xfd,
- 0x3c, 0x10, 0xf6, 0x5d, 0xed, 0x00, 0x3f, 0x3c, 0xfd, 0x3c, 0x3f, 0x3c,
- 0xfd, 0x3c, 0x31, 0x30, 0x43, 0x79, 0x40, 0x36, 0x03, 0x1b, 0x07, 0x08,
- 0x06, 0x08, 0x05, 0x08, 0x04, 0x08, 0x04, 0x06, 0x19, 0x18, 0x1a, 0x18,
- 0x02, 0x06, 0x0b, 0x0a, 0x0c, 0x0a, 0x0d, 0x0a, 0x03, 0x06, 0x15, 0x16,
- 0x14, 0x16, 0x13, 0x16, 0x03, 0x06, 0x1b, 0x03, 0x17, 0x21, 0x01, 0x12,
- 0x0e, 0x17, 0x21, 0x01, 0x18, 0x08, 0x1c, 0x21, 0x01, 0x16, 0x0a, 0x11,
- 0x21, 0x00, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x2a, 0x2a, 0x2a, 0x2a, 0x81,
- 0x01, 0x5d, 0x33, 0x11, 0x21, 0x32, 0x17, 0x16, 0x17, 0x16, 0x12, 0x15,
- 0x14, 0x02, 0x0e, 0x02, 0x23, 0x25, 0x21, 0x32, 0x36, 0x37, 0x3e, 0x01,
- 0x35, 0x34, 0x26, 0x27, 0x26, 0x23, 0x21, 0x9e, 0x01, 0xf9, 0xab, 0x5a,
- 0x7e, 0x59, 0x74, 0x73, 0x4e, 0x7a, 0x91, 0xcd, 0x85, 0xfe, 0xb1, 0x01,
- 0x39, 0x91, 0xa5, 0x31, 0x45, 0x4d, 0x97, 0x6c, 0x4e, 0xad, 0xfe, 0xcc,
- 0x05, 0xba, 0x15, 0x1d, 0x4c, 0x62, 0xfe, 0xcf, 0xc4, 0xa7, 0xfe, 0xfe,
- 0xa9, 0x61, 0x32, 0xad, 0x36, 0x31, 0x45, 0xe9, 0xa6, 0xe6, 0xf7, 0x2a,
- 0x1e, 0x00, 0x00, 0x01, 0x00, 0xa2, 0x00, 0x00, 0x04, 0xe8, 0x05, 0xba,
- 0x00, 0x0b, 0x00, 0x5b, 0x40, 0x15, 0x06, 0x05, 0x1e, 0x08, 0x08, 0x07,
- 0x07, 0x00, 0x03, 0x04, 0x1e, 0x02, 0x01, 0x02, 0x0a, 0x09, 0x1e, 0x0b,
- 0x00, 0x08, 0x07, 0xb8, 0xff, 0xc0, 0x40, 0x1c, 0x10, 0x12, 0x34, 0x07,
- 0x54, 0x03, 0x4a, 0x20, 0x0a, 0x20, 0x0d, 0x02, 0x0a, 0x1a, 0x0d, 0x04,
- 0x09, 0x20, 0x01, 0x20, 0x00, 0x01, 0x00, 0x5d, 0x0c, 0x3b, 0x5b, 0x18,
- 0x2b, 0x4e, 0x10, 0xf4, 0x5d, 0x3c, 0x4d, 0xfd, 0x3c, 0x4e, 0x10, 0xf6,
- 0x5d, 0x4d, 0xf4, 0xe4, 0x2b, 0x00, 0x3f, 0x3c, 0xfd, 0x3c, 0x3f, 0x3c,
- 0xfd, 0x3c, 0x12, 0x39, 0x2f, 0x3c, 0x10, 0xfd, 0x3c, 0x31, 0x30, 0x33,
- 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0xa2,
- 0x04, 0x24, 0xfc, 0x9e, 0x03, 0x2b, 0xfc, 0xd5, 0x03, 0x84, 0x05, 0xba,
- 0xad, 0xfe, 0x3f, 0xac, 0xfe, 0x0d, 0xad, 0x00, 0x00, 0x01, 0x00, 0xa8,
- 0x00, 0x00, 0x04, 0x85, 0x05, 0xba, 0x00, 0x09, 0x00, 0x4b, 0x40, 0x2a,
- 0x06, 0x05, 0x1e, 0x08, 0x08, 0x8f, 0x07, 0x01, 0x07, 0x07, 0x00, 0x03,
- 0x04, 0x1e, 0x02, 0x01, 0x02, 0x00, 0x08, 0x07, 0x9c, 0x20, 0x02, 0x20,
- 0x0b, 0x02, 0x02, 0x1a, 0x0b, 0x04, 0x09, 0x20, 0x01, 0x20, 0x00, 0x01,
- 0x00, 0x5d, 0x0a, 0x3b, 0x5c, 0x18, 0x2b, 0x4e, 0x10, 0xf4, 0x5d, 0x3c,
- 0x4d, 0xfd, 0x3c, 0x4e, 0x10, 0xf6, 0x5d, 0x4d, 0xe4, 0x00, 0x3f, 0x3f,
- 0x3c, 0xfd, 0x3c, 0x12, 0x39, 0x2f, 0x5d, 0x3c, 0x10, 0xfd, 0x3c, 0x31,
- 0x30, 0x33, 0x11, 0x21, 0x15, 0x21, 0x11, 0x21, 0x15, 0x21, 0x11, 0xa8,
- 0x03, 0xdd, 0xfc, 0xe5, 0x02, 0xb0, 0xfd, 0x50, 0x05, 0xba, 0xad, 0xfe,
- 0x3a, 0xad, 0xfd, 0x66, 0x00, 0x01, 0x00, 0x6d, 0xff, 0xe7, 0x05, 0xb9,
- 0x05, 0xd3, 0x00, 0x25, 0x00, 0xd8, 0x40, 0x45, 0x1b, 0x14, 0x1b, 0x15,
- 0x02, 0x60, 0x27, 0x01, 0x5e, 0x08, 0x13, 0x01, 0x12, 0x03, 0x24, 0x24,
- 0x00, 0x21, 0x12, 0x17, 0x02, 0x25, 0x00, 0x1e, 0x02, 0x01, 0x01, 0x06,
- 0x17, 0x1e, 0x0e, 0x03, 0x21, 0x1e, 0x06, 0x09, 0x01, 0x01, 0x26, 0x27,
- 0x25, 0x24, 0x20, 0x03, 0x03, 0x20, 0x02, 0x20, 0x27, 0x60, 0x02, 0x03,
- 0x02, 0x72, 0x80, 0x27, 0x01, 0x27, 0x1d, 0x26, 0x20, 0x0a, 0x01, 0x0a,
- 0x19, 0x26, 0x63, 0x5b, 0x18, 0x2b, 0x4e, 0x10, 0xf4, 0x5d, 0x4d, 0xed,
- 0x4d, 0x10, 0x5d, 0xf6, 0x5d, 0x3c, 0x4d, 0x10, 0xfd, 0x3c, 0x11, 0x12,
- 0x39, 0x2f, 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0x3c, 0xfd,
- 0x3c, 0x11, 0x12, 0x39, 0x11, 0x12, 0x39, 0x01, 0x11, 0x12, 0x39, 0x12,
- 0x39, 0x31, 0x30, 0x43, 0x79, 0x40, 0x44, 0x04, 0x23, 0x1b, 0x1c, 0x1a,
- 0x1c, 0x19, 0x1c, 0x03, 0x06, 0x0c, 0x26, 0x10, 0x25, 0x15, 0x26, 0x1f,
- 0x26, 0x08, 0x25, 0x04, 0x26, 0x23, 0x25, 0x18, 0x0d, 0x1d, 0x21, 0x00,
- 0x16, 0x0f, 0x13, 0x21, 0x01, 0x11, 0x12, 0x14, 0x13, 0x20, 0x07, 0x1d,
- 0x21, 0x00, 0x22, 0x05, 0x25, 0x21, 0x01, 0x1c, 0x0b, 0x17, 0x21, 0x01,
- 0x14, 0x11, 0x17, 0x21, 0x01, 0x1e, 0x09, 0x21, 0x21, 0x00, 0x24, 0x03,
- 0x21, 0x21, 0x00, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b, 0x10,
- 0x3c, 0x10, 0x3c, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b,
- 0x2a, 0x81, 0x01, 0x5d, 0x00, 0x5d, 0x01, 0x35, 0x25, 0x11, 0x06, 0x04,
- 0x23, 0x22, 0x24, 0x02, 0x35, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x16,
- 0x17, 0x07, 0x2e, 0x02, 0x23, 0x22, 0x0e, 0x01, 0x07, 0x06, 0x15, 0x14,
- 0x12, 0x04, 0x33, 0x32, 0x36, 0x37, 0x11, 0x03, 0x4c, 0x02, 0x6d, 0x8f,
- 0xfe, 0xd0, 0xa0, 0xd8, 0xfe, 0x9f, 0xb4, 0xb3, 0x01, 0x50, 0xdb, 0x9f,
- 0x01, 0x01, 0x92, 0x26, 0xaf, 0x21, 0x62, 0xb6, 0x6f, 0x85, 0xc2, 0x77,
- 0x21, 0x38, 0x87, 0x01, 0x02, 0x91, 0x7e, 0xf0, 0x3e, 0x02, 0x3f, 0xac,
- 0x01, 0xfd, 0xe0, 0x72, 0x73, 0xb9, 0x01, 0x5e, 0xd8, 0xd6, 0x01, 0x73,
- 0xb4, 0x67, 0xb8, 0x94, 0x30, 0x70, 0x80, 0x4d, 0x51, 0x84, 0x4f, 0x88,
- 0x9f, 0xc4, 0xfe, 0xf8, 0x80, 0x61, 0x37, 0x01, 0x11, 0x00, 0x00, 0x01,
- 0x00, 0xa1, 0x00, 0x00, 0x05, 0x1f, 0x05, 0xba, 0x00, 0x0b, 0x00, 0x68,
- 0xb9, 0x00, 0x0d, 0xff, 0xc0, 0x40, 0x27, 0x13, 0x15, 0x34, 0x04, 0x03,
- 0x1e, 0x09, 0x0a, 0xa0, 0x0a, 0xd0, 0x0a, 0x02, 0x0a, 0x05, 0x02, 0x02,
- 0x0b, 0x08, 0x08, 0x05, 0x08, 0x20, 0x07, 0x07, 0x06, 0x5d, 0x80, 0x0d,
- 0x01, 0x0d, 0x02, 0x0b, 0x20, 0x01, 0x20, 0x00, 0x01, 0x00, 0xb8, 0xff,
- 0xc0, 0x40, 0x15, 0x13, 0x15, 0x34, 0x00, 0x5d, 0x0c, 0x20, 0x0d, 0x01,
- 0x20, 0x0d, 0x50, 0x0d, 0x60, 0x0d, 0x70, 0x0d, 0x04, 0x3b, 0x59, 0x18,
- 0x2b, 0x5d, 0x71, 0x10, 0xf6, 0x2b, 0x5d, 0x3c, 0xfd, 0x3c, 0x10, 0x5d,
- 0xf6, 0x3c, 0x10, 0xfd, 0x3c, 0x00, 0x3f, 0x3c, 0x3f, 0x3c, 0x39, 0x5d,
- 0x2f, 0x3c, 0xfd, 0x3c, 0x31, 0x30, 0x01, 0x2b, 0x33, 0x11, 0x33, 0x11,
- 0x21, 0x11, 0x33, 0x11, 0x23, 0x11, 0x21, 0x11, 0xa1, 0xc2, 0x02, 0xfa,
- 0xc2, 0xc2, 0xfd, 0x06, 0x05, 0xba, 0xfd, 0xa6, 0x02, 0x5a, 0xfa, 0x46,
- 0x02, 0xb3, 0xfd, 0x4d, 0x00, 0x01, 0x00, 0xbf, 0x00, 0x00, 0x01, 0x81,
- 0x05, 0xba, 0x00, 0x03, 0x00, 0x94, 0xb5, 0x01, 0x02, 0x00, 0x08, 0x02,
- 0x05, 0xb8, 0xff, 0xc0, 0xb3, 0x38, 0x3d, 0x34, 0x05, 0xb8, 0xff, 0xc0,
- 0xb3, 0x33, 0x34, 0x34, 0x05, 0xb8, 0xff, 0xc0, 0xb3, 0x2d, 0x30, 0x34,
- 0x05, 0xb8, 0xff, 0xc0, 0xb3, 0x28, 0x29, 0x34, 0x05, 0xb8, 0xff, 0xc0,
- 0xb3, 0x23, 0x25, 0x34, 0x05, 0xb8, 0xff, 0xc0, 0xb3, 0x1d, 0x1e, 0x34,
- 0x05, 0xb8, 0xff, 0xc0, 0xb3, 0x18, 0x1a, 0x34, 0x05, 0xb8, 0xff, 0xc0,
- 0x40, 0x2f, 0x0d, 0x10, 0x34, 0x20, 0x05, 0x90, 0x05, 0xaf, 0x05, 0x03,
- 0x03, 0x20, 0x01, 0x00, 0x00, 0x8f, 0x00, 0xa0, 0x00, 0xb0, 0x00, 0x04,
- 0x2f, 0x00, 0x40, 0x00, 0x50, 0x00, 0xdf, 0x00, 0xf0, 0x00, 0x05, 0x12,
- 0x20, 0x00, 0x8f, 0x00, 0x90, 0x00, 0x03, 0x00, 0xa2, 0x04, 0xd6, 0x59,
- 0x18, 0x2b, 0x10, 0xf6, 0x5d, 0x43, 0x5c, 0x58, 0xb2, 0x80, 0x00, 0x01,
- 0x01, 0x5d, 0x59, 0x71, 0x72, 0x3c, 0xfd, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b,
- 0x2b, 0x2b, 0x2b, 0x2b, 0x3c, 0x00, 0x3f, 0x3f, 0x31, 0x30, 0x33, 0x11,
- 0x33, 0x11, 0xbf, 0xc2, 0x05, 0xba, 0xfa, 0x46, 0x00, 0x01, 0x00, 0x37,
- 0xff, 0xe7, 0x03, 0x61, 0x05, 0xba, 0x00, 0x11, 0x00, 0x4d, 0x40, 0x10,
- 0x65, 0x02, 0x67, 0x06, 0x74, 0x02, 0x75, 0x06, 0x88, 0x0d, 0x88, 0x11,
- 0x06, 0x09, 0x02, 0x01, 0xb8, 0x01, 0x1a, 0x40, 0x21, 0x04, 0x1e, 0x0f,
- 0x09, 0x09, 0x26, 0x0a, 0x0a, 0x08, 0x26, 0x0b, 0x5d, 0x20, 0x13, 0x01,
- 0x20, 0x13, 0x40, 0x13, 0x50, 0x13, 0x60, 0x13, 0x04, 0x13, 0x01, 0x26,
- 0x00, 0x4b, 0x12, 0xb6, 0x59, 0x18, 0x2b, 0x10, 0xf6, 0xed, 0x10, 0x5d,
- 0x71, 0xf6, 0xed, 0x3c, 0x10, 0xed, 0x00, 0x3f, 0xed, 0xed, 0x3f, 0x31,
- 0x30, 0x00, 0x5d, 0x13, 0x37, 0x1e, 0x01, 0x33, 0x32, 0x3e, 0x01, 0x35,
- 0x11, 0x33, 0x11, 0x14, 0x0e, 0x01, 0x23, 0x22, 0x26, 0x3b, 0xaf, 0x07,
- 0x70, 0x63, 0x49, 0x6a, 0x28, 0xc2, 0x59, 0xc1, 0x82, 0xc1, 0xcd, 0x01,
- 0xa0, 0x18, 0xa8, 0x7c, 0x43, 0x73, 0x7e, 0x03, 0xf2, 0xfc, 0x19, 0xb8,
- 0xca, 0x6a, 0xde, 0x00, 0x00, 0x01, 0x00, 0x96, 0x00, 0x00, 0x05, 0x52,
- 0x05, 0xba, 0x00, 0x0b, 0x01, 0x85, 0x40, 0x31, 0x03, 0x22, 0x37, 0x39,
- 0x08, 0x09, 0x3a, 0x27, 0x0a, 0x35, 0x06, 0x36, 0x0a, 0x47, 0x0a, 0x57,
- 0x03, 0x86, 0x03, 0xd7, 0x03, 0x07, 0x76, 0x0a, 0xd9, 0x03, 0xd9, 0x0a,
- 0x03, 0x28, 0x05, 0x8c, 0x04, 0x8a, 0x05, 0xaa, 0x04, 0xea, 0x08, 0x05,
- 0x0a, 0x04, 0x01, 0x35, 0x04, 0xd6, 0x04, 0x02, 0x09, 0xb8, 0xff, 0xe0,
- 0x40, 0x09, 0x12, 0x21, 0x34, 0x03, 0x20, 0x12, 0x21, 0x34, 0x03, 0xb8,
- 0xff, 0xde, 0xb3, 0x0c, 0x39, 0x12, 0x09, 0xb8, 0xff, 0xe0, 0xb3, 0x12,
- 0x21, 0x34, 0x08, 0xb8, 0xff, 0xe0, 0xb3, 0x12, 0x21, 0x34, 0x04, 0xb8,
- 0xff, 0xe0, 0xb3, 0x1d, 0x21, 0x34, 0x04, 0xb8, 0xff, 0xc0, 0xb3, 0x12,
- 0x16, 0x34, 0x08, 0xb8, 0xff, 0xde, 0x40, 0x3d, 0x19, 0x39, 0x08, 0x09,
- 0x25, 0x25, 0x3d, 0x08, 0x09, 0x19, 0x19, 0x3d, 0x06, 0x06, 0x07, 0x09,
- 0x0a, 0x09, 0x08, 0x0a, 0x05, 0x03, 0x04, 0x04, 0x20, 0x05, 0x0a, 0x14,
- 0x05, 0x05, 0x0a, 0x09, 0x08, 0x08, 0x20, 0x07, 0x06, 0x14, 0x07, 0x07,
- 0x06, 0x0a, 0x0a, 0x00, 0x05, 0x02, 0x04, 0x01, 0x02, 0x07, 0x0b, 0x08,
- 0x00, 0x08, 0x0a, 0x03, 0x02, 0x0b, 0x01, 0x00, 0x04, 0xb8, 0x02, 0x3a,
- 0x40, 0x0f, 0x30, 0x05, 0x01, 0xa0, 0x05, 0xb0, 0x05, 0xc0, 0x05, 0xe0,
- 0x05, 0x04, 0x05, 0x4a, 0x08, 0xb8, 0x02, 0x3a, 0x40, 0x0b, 0x30, 0x07,
- 0x01, 0x20, 0x07, 0x80, 0x07, 0xb0, 0x07, 0x03, 0x07, 0xb8, 0x02, 0x86,
- 0x40, 0x0b, 0x0b, 0x20, 0x20, 0x00, 0x01, 0x00, 0x5d, 0x0c, 0x3b, 0xa8,
- 0x18, 0x2b, 0x10, 0xf4, 0x5d, 0xed, 0xfd, 0x5d, 0x71, 0xed, 0xf4, 0x5d,
- 0x71, 0xed, 0x10, 0x3c, 0x10, 0x3c, 0x3c, 0x3c, 0x00, 0x3f, 0x3c, 0x3c,
- 0x3c, 0x3f, 0x3c, 0x3c, 0x3c, 0x12, 0x39, 0x2f, 0x87, 0x05, 0x2e, 0x2b,
- 0x0e, 0x7d, 0x10, 0xc4, 0x87, 0x05, 0x2e, 0x18, 0x2b, 0x04, 0x7d, 0x10,
- 0xc4, 0x07, 0x08, 0x10, 0x3c, 0x08, 0x3c, 0x01, 0x4b, 0xb0, 0x18, 0x53,
- 0x4b, 0xb0, 0x1b, 0x51, 0x5a, 0x58, 0xb9, 0x00, 0x04, 0xff, 0xd8, 0x38,
- 0x59, 0x31, 0x30, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x43,
- 0x5c, 0x58, 0x40, 0x11, 0x09, 0x22, 0x19, 0x39, 0x08, 0x2c, 0x19, 0x39,
- 0x04, 0x2c, 0x19, 0x39, 0x04, 0x22, 0x1b, 0x39, 0x05, 0xb8, 0xff, 0xde,
- 0xb6, 0x16, 0x39, 0x04, 0x22, 0x16, 0x39, 0x06, 0xb8, 0xff, 0xde, 0x40,
- 0x0b, 0x12, 0x39, 0x08, 0x22, 0x14, 0x39, 0x04, 0x40, 0x14, 0x39, 0x08,
- 0xb8, 0xff, 0xde, 0xb5, 0x25, 0x39, 0x04, 0x40, 0x15, 0x39, 0x2b, 0x2b,
- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x59, 0x00, 0x2b,
- 0x2b, 0x2b, 0x01, 0x71, 0x72, 0x5d, 0x00, 0x71, 0x5d, 0x2b, 0x2b, 0x33,
- 0x11, 0x33, 0x11, 0x01, 0x21, 0x09, 0x01, 0x21, 0x01, 0x07, 0x11, 0x96,
- 0xc2, 0x02, 0xd8, 0x01, 0x07, 0xfd, 0x99, 0x02, 0x82, 0xff, 0x00, 0xfd,
- 0xf6, 0xf0, 0x05, 0xba, 0xfd, 0x29, 0x02, 0xd7, 0xfd, 0xae, 0xfc, 0x98,
- 0x02, 0xe6, 0xea, 0xfe, 0x04, 0x00, 0x00, 0x01, 0x00, 0x96, 0x00, 0x00,
- 0x04, 0x2a, 0x05, 0xba, 0x00, 0x05, 0x00, 0x33, 0x40, 0x0c, 0x01, 0x02,
- 0x04, 0x03, 0x1e, 0x05, 0x00, 0x08, 0x20, 0x04, 0x01, 0x04, 0xb8, 0x02,
- 0xa7, 0x40, 0x0e, 0x07, 0x02, 0x03, 0x20, 0x01, 0x20, 0x00, 0x01, 0x00,
- 0x5d, 0x06, 0x3b, 0x5c, 0x18, 0x2b, 0x10, 0xf6, 0x5d, 0x3c, 0xfd, 0x3c,
- 0x10, 0xe6, 0x5d, 0x00, 0x3f, 0x3c, 0xfd, 0x3c, 0x3f, 0x31, 0x30, 0x33,
- 0x11, 0x33, 0x11, 0x21, 0x15, 0x96, 0xc2, 0x02, 0xd2, 0x05, 0xba, 0xfa,
- 0xf3, 0xad, 0x00, 0x01, 0x00, 0x98, 0x00, 0x00, 0x06, 0x0f, 0x05, 0xba,
- 0x00, 0x10, 0x01, 0x75, 0x40, 0x7f, 0x00, 0x02, 0x0f, 0x08, 0x14, 0x02,
- 0x1b, 0x08, 0x04, 0x76, 0x0c, 0x86, 0x0c, 0xc8, 0x0c, 0x03, 0x09, 0x0c,
- 0x49, 0x0c, 0x49, 0x0f, 0x03, 0x29, 0x04, 0x25, 0x0d, 0x2c, 0x0e, 0x58,
- 0x03, 0x5b, 0x04, 0x76, 0x0d, 0x78, 0x0e, 0x87, 0x0d, 0x08, 0x0b, 0x02,
- 0x05, 0x08, 0x39, 0x0d, 0x36, 0x0e, 0x4f, 0x02, 0x4b, 0x03, 0x44, 0x07,
- 0x40, 0x08, 0x4d, 0x0d, 0x42, 0x0e, 0x0a, 0x98, 0x02, 0x99, 0x03, 0x96,
- 0x07, 0x96, 0x08, 0xa8, 0x03, 0xa7, 0x07, 0x06, 0x12, 0x02, 0x0f, 0x0e,
- 0x0e, 0x30, 0x05, 0x02, 0x14, 0x05, 0x05, 0x02, 0x08, 0x0c, 0x0d, 0x0d,
- 0x30, 0x05, 0x08, 0x14, 0x05, 0x05, 0x08, 0x0c, 0x52, 0x0f, 0x52, 0x01,
- 0x40, 0x01, 0x02, 0x02, 0x08, 0x08, 0x09, 0x0a, 0x0b, 0x0b, 0x0d, 0x0d,
- 0x0e, 0x0e, 0x10, 0x00, 0x08, 0x09, 0x02, 0x60, 0x12, 0x80, 0x12, 0x02,
- 0x12, 0xba, 0x02, 0xa8, 0x00, 0x0d, 0x01, 0x31, 0xb2, 0x05, 0x20, 0x08,
- 0xb8, 0x01, 0x31, 0x40, 0x0a, 0x0c, 0x09, 0x0a, 0x20, 0x40, 0x0c, 0x7f,
- 0x0b, 0x01, 0x0b, 0xba, 0x02, 0x56, 0x00, 0x0e, 0x01, 0x0b, 0xb2, 0x05,
- 0x20, 0x02, 0xb8, 0x01, 0x0b, 0x40, 0x09, 0x0f, 0x01, 0x00, 0x20, 0x0f,
- 0x70, 0x10, 0x01, 0x10, 0xb8, 0x02, 0x56, 0xb7, 0x20, 0x05, 0x60, 0x05,
- 0x80, 0x05, 0x03, 0x05, 0xb8, 0x02, 0xa8, 0xb3, 0x11, 0x3b, 0x59, 0x18,
- 0x2b, 0x19, 0x10, 0xf4, 0x5d, 0xf4, 0x5d, 0x3c, 0x18, 0xfd, 0x3c, 0x10,
- 0xed, 0x1a, 0x19, 0x10, 0xed, 0xf4, 0x5d, 0x3c, 0x1a, 0x18, 0xfd, 0x3c,
- 0x10, 0xed, 0x1a, 0x19, 0x10, 0xed, 0xe4, 0x5d, 0x00, 0x18, 0x3f, 0x3f,
- 0x3c, 0x3c, 0x10, 0x3c, 0x10, 0x3c, 0x10, 0x3c, 0x10, 0x3c, 0x10, 0x3c,
- 0x10, 0x3c, 0x1a, 0x10, 0xed, 0xed, 0x87, 0x05, 0x2e, 0x2b, 0x87, 0x7d,
- 0xc4, 0x87, 0x2e, 0x18, 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, 0x00, 0x4b,
- 0xb0, 0x0b, 0x53, 0x4b, 0xb0, 0x1e, 0x51, 0x5a, 0x58, 0xbd, 0x00, 0x0c,
- 0xff, 0xfb, 0x00, 0x08, 0xff, 0xd6, 0x00, 0x02, 0xff, 0xd6, 0x38, 0x38,
- 0x38, 0x59, 0x01, 0x4b, 0xb0, 0x0c, 0x53, 0x4b, 0xb0, 0x28, 0x51, 0x5a,
- 0x58, 0xb9, 0x00, 0x0d, 0xff, 0xf8, 0xb1, 0x0e, 0x0a, 0x38, 0x38, 0x59,
- 0x01, 0x43, 0x5c, 0x58, 0xb9, 0x00, 0x0d, 0xff, 0xd4, 0xb6, 0x21, 0x39,
- 0x0e, 0x2c, 0x21, 0x39, 0x0d, 0xb8, 0xff, 0xd4, 0xb6, 0x37, 0x39, 0x0e,
- 0x32, 0x37, 0x39, 0x0d, 0xb8, 0xff, 0xd4, 0xb5, 0x2d, 0x39, 0x0e, 0x2c,
- 0x2d, 0x39, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x59, 0x72, 0x71, 0x5d,
- 0x00, 0x71, 0x5d, 0x01, 0x5d, 0x33, 0x11, 0x21, 0x01, 0x16, 0x17, 0x36,
- 0x37, 0x01, 0x21, 0x11, 0x23, 0x11, 0x01, 0x23, 0x01, 0x11, 0x98, 0x01,
- 0x24, 0x01, 0x5b, 0x30, 0x16, 0x19, 0x35, 0x01, 0x5f, 0x01, 0x05, 0xbb,
- 0xfe, 0x56, 0xaf, 0xfe, 0x58, 0x05, 0xba, 0xfb, 0xf2, 0x91, 0x48, 0x50,
- 0x9b, 0x03, 0xfc, 0xfa, 0x46, 0x04, 0xcb, 0xfb, 0x35, 0x04, 0xe0, 0xfb,
- 0x20, 0x00, 0x00, 0x01, 0x00, 0x9c, 0x00, 0x00, 0x05, 0x1f, 0x05, 0xba,
- 0x00, 0x09, 0x00, 0xea, 0xb1, 0x12, 0x0b, 0xb8, 0xff, 0xc0, 0x40, 0x35,
- 0x13, 0x15, 0x34, 0x08, 0x02, 0x03, 0x03, 0x20, 0x07, 0x08, 0x14, 0x07,
- 0x07, 0x08, 0x02, 0x07, 0x03, 0x03, 0x08, 0x09, 0x04, 0x02, 0x02, 0x09,
- 0x07, 0x08, 0x04, 0x03, 0x20, 0x06, 0x06, 0x05, 0x5d, 0x20, 0x0b, 0x01,
- 0x20, 0x0b, 0x50, 0x0b, 0x60, 0x0b, 0x70, 0x0b, 0x80, 0x0b, 0x05, 0x0b,
- 0x08, 0x09, 0x20, 0x01, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x0c, 0x13, 0x15,
- 0x34, 0x20, 0x00, 0x01, 0x00, 0x5d, 0x0a, 0x3b, 0x59, 0x18, 0x2b, 0x10,
- 0xf6, 0x5d, 0x2b, 0x3c, 0xfd, 0x3c, 0x10, 0x5d, 0x71, 0xf4, 0x3c, 0x10,
- 0xfd, 0x3c, 0x00, 0x3f, 0x3c, 0x3f, 0x3c, 0x12, 0x39, 0x39, 0x01, 0x11,
- 0x39, 0x39, 0x87, 0x04, 0x2e, 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30, 0x01,
- 0x2b, 0x43, 0x5c, 0x58, 0xb4, 0x08, 0x40, 0x46, 0x39, 0x03, 0xb8, 0xff,
- 0xc0, 0xb6, 0x46, 0x39, 0x08, 0x40, 0x32, 0x39, 0x03, 0xb8, 0xff, 0xc0,
- 0xb6, 0x32, 0x39, 0x07, 0x22, 0x19, 0x39, 0x02, 0xb8, 0xff, 0xde, 0xb6,
- 0x19, 0x39, 0x07, 0x22, 0x32, 0x39, 0x02, 0xb8, 0xff, 0xde, 0xb6, 0x32,
- 0x39, 0x07, 0x22, 0x23, 0x39, 0x02, 0xb8, 0xff, 0xde, 0x40, 0x0b, 0x23,
- 0x39, 0x07, 0x0e, 0x14, 0x39, 0x07, 0x0e, 0x13, 0x39, 0x02, 0xb8, 0xff,
- 0xf4, 0xb6, 0x13, 0x39, 0x07, 0x0e, 0x1d, 0x39, 0x02, 0xb8, 0xff, 0xf4,
- 0xb6, 0x1d, 0x39, 0x07, 0x0e, 0x15, 0x39, 0x02, 0xb8, 0xff, 0xf8, 0xb1,
- 0x15, 0x39, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x2b, 0x2b,
- 0x2b, 0x2b, 0x2b, 0x2b, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x59, 0x33, 0x11,
- 0x33, 0x01, 0x11, 0x33, 0x11, 0x23, 0x01, 0x11, 0x9c, 0xc7, 0x03, 0x02,
- 0xba, 0xc7, 0xfc, 0xfe, 0x05, 0xba, 0xfb, 0x81, 0x04, 0x7f, 0xfa, 0x46,
- 0x04, 0x80, 0xfb, 0x80, 0x00, 0x02, 0x00, 0x63, 0xff, 0xe7, 0x05, 0xdd,
- 0x05, 0xd4, 0x00, 0x0e, 0x00, 0x1b, 0x00, 0x7f, 0x40, 0x60, 0x1a, 0x0f,
- 0x01, 0x14, 0x10, 0x14, 0x14, 0x1b, 0x17, 0x1b, 0x1b, 0x04, 0x04, 0x10,
- 0x04, 0x14, 0x0b, 0x17, 0x0b, 0x1b, 0x04, 0xa9, 0x17, 0xb6, 0x0e, 0xc6,
- 0x0e, 0x03, 0x17, 0x17, 0x18, 0x1b, 0x02, 0x20, 0x1d, 0x40, 0x11, 0x4f,
- 0x13, 0x4f, 0x17, 0x40, 0x1a, 0x58, 0x05, 0x58, 0x09, 0x57, 0x10, 0x55,
- 0x11, 0x5f, 0x13, 0x5a, 0x17, 0x5f, 0x18, 0x56, 0x1a, 0x57, 0x1b, 0x8b,
- 0x17, 0x99, 0x02, 0x10, 0x19, 0x1e, 0x03, 0x03, 0x12, 0x1e, 0x0b, 0x09,
- 0x15, 0x26, 0x20, 0x07, 0x01, 0x07, 0x1a, 0x80, 0x1d, 0x01, 0x1d, 0x0f,
- 0x26, 0x20, 0x00, 0x01, 0x00, 0x19, 0x1c, 0x63, 0x5c, 0x18, 0x2b, 0x4e,
- 0x10, 0xf4, 0x5d, 0x4d, 0xed, 0x4e, 0x10, 0x5d, 0xf6, 0x5d, 0x4d, 0xed,
- 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x31, 0x30, 0x01, 0x5d, 0x71, 0x00, 0x5d,
- 0x5d, 0x5d, 0x71, 0x13, 0x10, 0x00, 0x21, 0x32, 0x04, 0x12, 0x15, 0x14,
- 0x02, 0x04, 0x23, 0x22, 0x24, 0x02, 0x37, 0x10, 0x00, 0x33, 0x32, 0x00,
- 0x11, 0x34, 0x02, 0x26, 0x23, 0x22, 0x00, 0x63, 0x01, 0x88, 0x01, 0x36,
- 0xcb, 0x01, 0x46, 0xab, 0xb4, 0xfe, 0xb6, 0xbf, 0xcf, 0xfe, 0xba, 0xa8,
- 0xc8, 0x01, 0x1d, 0xd7, 0xdb, 0x01, 0x1b, 0x79, 0xe9, 0x91, 0xce, 0xfe,
- 0xd7, 0x02, 0xca, 0x01, 0x6d, 0x01, 0x9d, 0xc2, 0xfe, 0xa5, 0xdc, 0xdf,
- 0xfe, 0xa0, 0xb5, 0xc8, 0x01, 0x5a, 0xbe, 0xfe, 0xf7, 0xfe, 0xcf, 0x01,
- 0x34, 0x01, 0x1b, 0xb3, 0x01, 0x0b, 0x93, 0xfe, 0xe5, 0x00, 0x00, 0x02,
- 0x00, 0x9e, 0x00, 0x00, 0x04, 0xfd, 0x05, 0xba, 0x00, 0x0d, 0x00, 0x18,
- 0x00, 0x57, 0x40, 0x35, 0x65, 0x11, 0x6b, 0x14, 0x02, 0x4b, 0x10, 0x4b,
- 0x14, 0x5b, 0x10, 0x5b, 0x14, 0x04, 0x0b, 0x0c, 0x1e, 0x0f, 0x0e, 0x0e,
- 0x00, 0x17, 0x18, 0x1e, 0x02, 0x01, 0x02, 0x00, 0x08, 0x12, 0x26, 0x08,
- 0x1a, 0x20, 0x1a, 0x01, 0x20, 0x1a, 0x01, 0x1a, 0x18, 0x0d, 0x20, 0x01,
- 0x20, 0x00, 0x01, 0x00, 0x5d, 0x19, 0x3b, 0x5c, 0x18, 0x2b, 0x10, 0xf6,
- 0x5d, 0x3c, 0xfd, 0x3c, 0x4e, 0x10, 0x71, 0x5d, 0xf6, 0x4d, 0xed, 0x00,
- 0x3f, 0x3f, 0x3c, 0xfd, 0x3c, 0x12, 0x39, 0x2f, 0x3c, 0xfd, 0x3c, 0x31,
- 0x30, 0x01, 0x5d, 0x00, 0x5d, 0x33, 0x11, 0x21, 0x32, 0x17, 0x1e, 0x02,
- 0x15, 0x14, 0x02, 0x29, 0x01, 0x19, 0x01, 0x21, 0x32, 0x36, 0x35, 0x34,
- 0x26, 0x27, 0x26, 0x23, 0x21, 0x9e, 0x02, 0x29, 0x92, 0x4d, 0x6c, 0x92,
- 0x59, 0xee, 0xfe, 0xc9, 0xfe, 0x88, 0x01, 0x7b, 0xbc, 0x9e, 0x5d, 0x4c,
- 0x31, 0x84, 0xfe, 0x89, 0x05, 0xba, 0x0e, 0x12, 0x65, 0xb6, 0x6d, 0xbb,
- 0xfe, 0xfd, 0xfd, 0xac, 0x03, 0x01, 0x8c, 0x7f, 0x5c, 0x83, 0x15, 0x0d,
- 0x00, 0x02, 0x00, 0x58, 0xff, 0x8e, 0x05, 0xee, 0x05, 0xd4, 0x00, 0x15,
- 0x00, 0x28, 0x01, 0x12, 0x40, 0x92, 0x5f, 0x26, 0x9f, 0x26, 0x02, 0x19,
- 0x18, 0x37, 0x15, 0x02, 0x0b, 0x1c, 0x04, 0x1f, 0x04, 0x23, 0x1b, 0x1c,
- 0x14, 0x1f, 0x14, 0x23, 0x06, 0x2a, 0x05, 0x2d, 0x17, 0x2b, 0x26, 0x3b,
- 0x05, 0x3c, 0x17, 0x3a, 0x26, 0x4c, 0x05, 0x4c, 0x17, 0x49, 0x26, 0x5d,
- 0x05, 0x55, 0x23, 0x58, 0x26, 0x6f, 0x05, 0x7b, 0x03, 0x7a, 0x05, 0x8c,
- 0x03, 0x8c, 0x05, 0x95, 0x00, 0x9a, 0x03, 0xa4, 0x00, 0xab, 0x03, 0xd5,
- 0x00, 0xd5, 0x16, 0xe5, 0x00, 0xe5, 0x17, 0xe5, 0x18, 0x1a, 0x1c, 0x05,
- 0x2b, 0x00, 0x2a, 0x05, 0x3b, 0x05, 0x04, 0x5d, 0x05, 0x92, 0x18, 0x96,
- 0x26, 0xd5, 0x26, 0x04, 0x25, 0x16, 0x2a, 0x26, 0x34, 0x16, 0x39, 0x26,
- 0x49, 0x18, 0x49, 0x1c, 0x45, 0x1f, 0x45, 0x23, 0x4b, 0x26, 0x56, 0x08,
- 0x58, 0x11, 0x55, 0x15, 0x5a, 0x1c, 0x5a, 0x1d, 0x56, 0x1f, 0x57, 0x20,
- 0x57, 0x22, 0x69, 0x05, 0x66, 0x15, 0x6b, 0x26, 0x7b, 0x26, 0x8e, 0x1c,
- 0x8e, 0x26, 0xdb, 0x18, 0xdc, 0x26, 0x19, 0x15, 0xb8, 0xff, 0xd4, 0xb2,
- 0x1b, 0x39, 0x00, 0xb8, 0xff, 0xd4, 0x40, 0x3d, 0x1b, 0x39, 0x02, 0x03,
- 0x16, 0x28, 0x03, 0x07, 0x28, 0x26, 0x18, 0x16, 0x05, 0x00, 0x06, 0x21,
- 0x03, 0x13, 0x1a, 0x05, 0x02, 0x28, 0x26, 0x18, 0x16, 0x00, 0x05, 0x24,
- 0x1e, 0x1e, 0x0f, 0x03, 0x02, 0x08, 0x24, 0x1e, 0x07, 0x09, 0x1a, 0x26,
- 0x13, 0x4a, 0x02, 0x1a, 0x20, 0x2a, 0x80, 0x2a, 0x02, 0x2a, 0x21, 0x26,
- 0x20, 0x0b, 0x01, 0x0b, 0x19, 0x29, 0x63, 0x5c, 0x18, 0x2b, 0x4e, 0x10,
- 0xf4, 0x5d, 0x4d, 0xed, 0x4e, 0x10, 0x5d, 0xf6, 0x4d, 0xf4, 0xed, 0x00,
- 0x3f, 0xed, 0x3f, 0x3f, 0xed, 0x11, 0x17, 0x39, 0x12, 0x39, 0x01, 0x11,
- 0x12, 0x39, 0x12, 0x17, 0x39, 0x00, 0x11, 0x33, 0x10, 0xc9, 0x10, 0xc9,
- 0x31, 0x30, 0x01, 0x2b, 0x2b, 0x5d, 0x00, 0x72, 0x71, 0x5d, 0x01, 0x5d,
- 0x71, 0x72, 0x25, 0x16, 0x17, 0x07, 0x26, 0x27, 0x06, 0x23, 0x22, 0x24,
- 0x02, 0x35, 0x34, 0x12, 0x24, 0x33, 0x32, 0x04, 0x12, 0x15, 0x14, 0x02,
- 0x25, 0x16, 0x17, 0x36, 0x11, 0x34, 0x02, 0x26, 0x23, 0x22, 0x00, 0x11,
- 0x10, 0x00, 0x33, 0x32, 0x37, 0x26, 0x27, 0x04, 0xf5, 0x87, 0x72, 0x39,
- 0x9e, 0x9d, 0xa3, 0xc5, 0xc7, 0xfe, 0xbc, 0xaf, 0xb0, 0x01, 0x45, 0xc9,
- 0xcb, 0x01, 0x46, 0xab, 0x6e, 0xfd, 0xe6, 0xa8, 0x6d, 0xab, 0x79, 0xe9,
- 0x91, 0xd9, 0xfe, 0xe2, 0x01, 0x1b, 0xdc, 0x68, 0x5c, 0x5b, 0x65, 0x9d,
- 0x5d, 0x2b, 0x87, 0x39, 0x7b, 0x5b, 0xc0, 0x01, 0x5c, 0xda, 0xd9, 0x01,
- 0x64, 0xba, 0xc1, 0xfe, 0xa5, 0xda, 0xb5, 0xfe, 0xdf, 0x8d, 0x2f, 0x5d,
- 0x9c, 0x01, 0x39, 0xb2, 0x01, 0x0a, 0x93, 0xfe, 0xd7, 0xfe, 0xd9, 0xfe,
- 0xe2, 0xfe, 0xce, 0x27, 0x3b, 0x19, 0x00, 0x02, 0x00, 0xa1, 0x00, 0x00,
- 0x05, 0xad, 0x05, 0xba, 0x00, 0x18, 0x00, 0x22, 0x01, 0x4c, 0x40, 0x0f,
- 0x12, 0x0b, 0x0e, 0x01, 0x12, 0x36, 0x1c, 0x5a, 0x1f, 0x66, 0x08, 0x6d,
- 0x1f, 0x04, 0x12, 0xb8, 0xff, 0xe2, 0xb3, 0x12, 0x1a, 0x34, 0x12, 0xb8,
- 0xff, 0xf0, 0xb3, 0x22, 0x27, 0x34, 0x11, 0xb8, 0xff, 0xe2, 0xb3, 0x1d,
- 0x27, 0x34, 0x10, 0xb8, 0xff, 0xe2, 0xb3, 0x1d, 0x27, 0x34, 0x0f, 0xb8,
- 0xff, 0xe2, 0xb3, 0x1d, 0x27, 0x34, 0x12, 0xb8, 0xff, 0xd8, 0xb3, 0x1d,
- 0x26, 0x34, 0x11, 0xb8, 0xff, 0xe2, 0xb3, 0x12, 0x1a, 0x34, 0x10, 0xb8,
- 0xff, 0xe2, 0xb3, 0x12, 0x1a, 0x34, 0x0f, 0xb8, 0xff, 0xe2, 0x40, 0x73,
- 0x12, 0x1a, 0x34, 0x25, 0x0e, 0x4a, 0x1c, 0x4a, 0x20, 0x53, 0x0b, 0x5c,
- 0x1c, 0x6d, 0x1c, 0x72, 0x09, 0x78, 0x0e, 0x79, 0x0f, 0x85, 0x0a, 0x88,
- 0x0f, 0x97, 0x0d, 0xa9, 0x0f, 0xb8, 0x0f, 0xe8, 0x0e, 0xe7, 0x0f, 0x10,
- 0x0e, 0x0c, 0x0c, 0x20, 0x11, 0x0f, 0x14, 0x11, 0x11, 0x0f, 0x11, 0x0f,
- 0x0c, 0x09, 0x12, 0x1b, 0x02, 0x21, 0x1a, 0x16, 0x0a, 0x06, 0x12, 0x11,
- 0x10, 0x0d, 0x0c, 0x05, 0x18, 0x09, 0x09, 0x16, 0x17, 0x1a, 0x19, 0x1e,
- 0x17, 0x17, 0x00, 0x21, 0x22, 0x1e, 0x02, 0x01, 0x02, 0x00, 0x18, 0x18,
- 0x0f, 0x0f, 0x0e, 0x08, 0x1e, 0x26, 0x0e, 0x9c, 0x06, 0x5d, 0x20, 0x24,
- 0x70, 0x24, 0x80, 0x24, 0x03, 0x24, 0x22, 0x18, 0x20, 0x01, 0x20, 0x00,
- 0x01, 0x00, 0x5d, 0x23, 0x3b, 0xa8, 0x18, 0x2b, 0x4e, 0x10, 0xf4, 0x5d,
- 0x3c, 0x4d, 0xfd, 0x3c, 0x10, 0x5d, 0xf6, 0x19, 0xe4, 0x18, 0xed, 0x00,
- 0x3f, 0x3c, 0x10, 0x3c, 0x10, 0x3c, 0x3f, 0x3c, 0xfd, 0x3c, 0x12, 0x39,
- 0x2f, 0xfd, 0x3c, 0x10, 0x3c, 0x39, 0x2f, 0x12, 0x17, 0x39, 0x01, 0x11,
- 0x17, 0x39, 0x87, 0x0e, 0x2e, 0x2b, 0x05, 0x7d, 0x10, 0xc4, 0x31, 0x30,
- 0x01, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x00,
- 0x5d, 0x43, 0x5c, 0x58, 0x40, 0x0a, 0x08, 0x40, 0x0f, 0x39, 0x0f, 0x10,
- 0x3a, 0x11, 0x12, 0x3a, 0x2b, 0x2b, 0x2b, 0x59, 0x01, 0x71, 0x43, 0x5c,
- 0x58, 0xb9, 0x00, 0x0e, 0xff, 0xde, 0x40, 0x1a, 0x19, 0x39, 0x11, 0x22,
- 0x19, 0x39, 0x12, 0x22, 0x19, 0x39, 0x0e, 0x40, 0x1c, 0x39, 0x10, 0x22,
- 0x14, 0x39, 0x10, 0x22, 0x1f, 0x39, 0x10, 0x22, 0x15, 0x39, 0x2b, 0x2b,
- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x59, 0x33, 0x11, 0x21, 0x32, 0x1e, 0x01,
- 0x15, 0x14, 0x06, 0x07, 0x16, 0x17, 0x16, 0x17, 0x13, 0x23, 0x03, 0x2e,
- 0x02, 0x27, 0x26, 0x2b, 0x01, 0x19, 0x01, 0x21, 0x32, 0x3e, 0x01, 0x35,
- 0x34, 0x26, 0x23, 0x21, 0xa1, 0x02, 0x8a, 0xc4, 0xcc, 0x7a, 0xca, 0xd3,
- 0x4d, 0x28, 0x55, 0x4c, 0xff, 0xf4, 0xc2, 0x55, 0x6e, 0x57, 0x2d, 0x21,
- 0x4b, 0xe1, 0x01, 0xa1, 0x85, 0x96, 0x4e, 0x97, 0xa3, 0xfe, 0x30, 0x05,
- 0xba, 0x4f, 0xc8, 0x79, 0x9c, 0xd6, 0x1d, 0x25, 0x24, 0x4e, 0x75, 0xfe,
- 0x71, 0x01, 0x31, 0x84, 0x8c, 0x38, 0x0b, 0x07, 0xfd, 0x75, 0x03, 0x33,
- 0x37, 0x79, 0x47, 0x68, 0x86, 0x00, 0x00, 0x01, 0x00, 0x5c, 0xff, 0xe7,
- 0x04, 0xeb, 0x05, 0xd3, 0x00, 0x30, 0x00, 0xfe, 0x40, 0x9c, 0x63, 0x03,
- 0x63, 0x04, 0x73, 0x03, 0x74, 0x04, 0x04, 0x25, 0x27, 0x35, 0x03, 0x39,
- 0x1c, 0x43, 0x03, 0x49, 0x07, 0x4c, 0x1d, 0x45, 0x1f, 0x44, 0x24, 0x46,
- 0x27, 0x53, 0x03, 0x59, 0x07, 0x5c, 0x1d, 0x57, 0x28, 0x89, 0x13, 0x0e,
- 0x28, 0x0d, 0x26, 0x24, 0x02, 0x24, 0x03, 0x27, 0x25, 0x36, 0x0f, 0x34,
- 0x23, 0x44, 0x25, 0x45, 0x2f, 0x5a, 0x20, 0x56, 0x23, 0x55, 0x25, 0x6c,
- 0x0b, 0x6a, 0x0d, 0x6b, 0x0e, 0x66, 0x14, 0x65, 0x18, 0x79, 0x0b, 0x7a,
- 0x0d, 0x7a, 0x0f, 0x7d, 0x10, 0x75, 0x24, 0x73, 0x25, 0x86, 0x03, 0x8a,
- 0x0b, 0x89, 0x0d, 0x8a, 0x0f, 0x8d, 0x10, 0x85, 0x24, 0x83, 0x25, 0x92,
- 0x0d, 0x96, 0x0f, 0x96, 0x15, 0x1e, 0x25, 0x24, 0x0e, 0x0d, 0x0b, 0x05,
- 0x21, 0x1c, 0x1d, 0x1e, 0x1b, 0x08, 0x07, 0x06, 0x04, 0x03, 0x02, 0x06,
- 0x01, 0x25, 0x24, 0x22, 0x0e, 0x0d, 0x0b, 0x06, 0x05, 0x1e, 0x1b, 0x2d,
- 0x8f, 0x1a, 0x01, 0x1a, 0xed, 0x16, 0x00, 0x2d, 0x10, 0x01, 0x20, 0x01,
- 0x50, 0x01, 0x60, 0x01, 0x70, 0x01, 0x90, 0x01, 0x06, 0x01, 0xb8, 0x01,
- 0xb0, 0x40, 0x25, 0x2d, 0x1e, 0x1e, 0x16, 0x03, 0x05, 0x1e, 0x2d, 0x09,
- 0x1b, 0x26, 0x1a, 0x4a, 0x09, 0x26, 0x00, 0x29, 0x01, 0x29, 0x1a, 0x32,
- 0x21, 0x26, 0x12, 0x01, 0x26, 0x12, 0x54, 0x20, 0x00, 0x01, 0x00, 0x19,
- 0x31, 0x63, 0x5b, 0x18, 0x2b, 0x4e, 0x10, 0xf4, 0x5d, 0x4d, 0xe4, 0xed,
- 0x10, 0xed, 0x4e, 0x10, 0xf6, 0x5d, 0x4d, 0xed, 0xf4, 0xed, 0x00, 0x3f,
- 0xed, 0x3f, 0xed, 0x10, 0xfd, 0x5d, 0xe4, 0x10, 0xfd, 0x5d, 0xf4, 0x11,
- 0x12, 0x17, 0x39, 0x11, 0x17, 0x39, 0x11, 0x12, 0x39, 0x39, 0x01, 0x12,
- 0x17, 0x39, 0x31, 0x30, 0x00, 0x5d, 0x71, 0x01, 0x5d, 0x71, 0x13, 0x37,
- 0x1e, 0x02, 0x33, 0x32, 0x3e, 0x01, 0x35, 0x34, 0x26, 0x27, 0x26, 0x24,
- 0x27, 0x2e, 0x01, 0x35, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x17,
- 0x07, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16, 0x04, 0x17,
- 0x1e, 0x01, 0x15, 0x14, 0x0e, 0x01, 0x23, 0x22, 0x24, 0x26, 0x5c, 0xb7,
- 0x0d, 0x5f, 0xc8, 0x7d, 0x6f, 0xaa, 0x53, 0x50, 0x5c, 0x3b, 0xfe, 0x6c,
- 0x51, 0x69, 0x67, 0x7e, 0xf2, 0x94, 0xa3, 0xf9, 0x86, 0x05, 0xba, 0x0f,
- 0xad, 0xa9, 0xb0, 0xa1, 0x39, 0x38, 0x01, 0xd9, 0x58, 0x80, 0x7a, 0x86,
- 0xfb, 0x9d, 0xc7, 0xfe, 0xf3, 0x99, 0x01, 0xd7, 0x10, 0x6e, 0x8d, 0x57,
- 0x42, 0x73, 0x44, 0x45, 0x67, 0x23, 0x17, 0x61, 0x2b, 0x37, 0xa3, 0x65,
- 0x6f, 0xc1, 0x64, 0x69, 0xcc, 0x81, 0x0e, 0x8b, 0x8e, 0x81, 0x5b, 0x4f,
- 0x33, 0x33, 0x6b, 0x28, 0x3b, 0xb5, 0x76, 0x75, 0xcf, 0x73, 0x74, 0xe9,
- 0x00, 0x01, 0x00, 0x30, 0x00, 0x00, 0x04, 0xba, 0x05, 0xba, 0x00, 0x07,
- 0x00, 0x4f, 0x40, 0x0d, 0x05, 0x02, 0x1e, 0x04, 0x03, 0x02, 0x00, 0x08,
- 0x07, 0x06, 0x05, 0x04, 0x09, 0xb8, 0x02, 0x73, 0xb3, 0x20, 0x04, 0x01,
- 0x04, 0xb8, 0x01, 0x01, 0xb7, 0x06, 0x20, 0x01, 0x02, 0x2f, 0x03, 0x01,
- 0x03, 0xb8, 0x01, 0x01, 0xb5, 0x01, 0x01, 0x20, 0x00, 0x01, 0x00, 0xb8,
- 0x02, 0x73, 0xb3, 0x08, 0xb6, 0x99, 0x18, 0x2b, 0x10, 0xf6, 0x5d, 0x3c,
- 0x10, 0xf4, 0x5d, 0x3c, 0x10, 0xfd, 0xe4, 0x5d, 0xe6, 0x10, 0x3c, 0x10,
- 0x3c, 0x00, 0x3f, 0x3f, 0x3c, 0xfd, 0x3c, 0x31, 0x30, 0x21, 0x11, 0x21,
- 0x35, 0x21, 0x15, 0x21, 0x11, 0x02, 0x13, 0xfe, 0x1d, 0x04, 0x8a, 0xfe,
- 0x1b, 0x05, 0x0d, 0xad, 0xad, 0xfa, 0xf3, 0x00, 0x00, 0x01, 0x00, 0xa1,
- 0xff, 0xe7, 0x05, 0x22, 0x05, 0xba, 0x00, 0x14, 0x00, 0x71, 0x40, 0x0a,
- 0x26, 0x0f, 0x58, 0x04, 0x58, 0x08, 0xc9, 0x08, 0x04, 0x16, 0xb8, 0xff,
- 0xc0, 0x40, 0x16, 0x13, 0x15, 0x34, 0x34, 0x04, 0x3b, 0x08, 0x46, 0x04,
- 0x4a, 0x08, 0x76, 0x0f, 0xa6, 0x05, 0xe8, 0x0f, 0x07, 0x0c, 0x00, 0x02,
- 0x11, 0xb8, 0x02, 0xbb, 0x40, 0x1c, 0x06, 0x09, 0x14, 0x26, 0x02, 0x5d,
- 0x20, 0x16, 0x01, 0x20, 0x16, 0x50, 0x16, 0x02, 0x60, 0x16, 0x70, 0x16,
- 0x80, 0x16, 0x03, 0x16, 0x0d, 0x26, 0x20, 0x0a, 0x01, 0x0a, 0xb8, 0xff,
- 0xc0, 0x40, 0x09, 0x13, 0x15, 0x34, 0x0a, 0x5d, 0x15, 0x3b, 0x59, 0x18,
- 0x2b, 0x4e, 0x10, 0xf4, 0x2b, 0x5d, 0xed, 0x4d, 0x10, 0x5d, 0x5d, 0x71,
- 0xf6, 0x4d, 0xed, 0x00, 0x3f, 0xed, 0x3f, 0x3c, 0x31, 0x30, 0x01, 0x5d,
- 0x2b, 0x00, 0x5d, 0x01, 0x33, 0x11, 0x14, 0x02, 0x04, 0x23, 0x22, 0x24,
- 0x02, 0x35, 0x11, 0x33, 0x11, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x11,
- 0x04, 0x60, 0xc2, 0x64, 0xfe, 0xfb, 0xd4, 0xce, 0xfe, 0xfa, 0x70, 0xc2,
- 0x47, 0xad, 0x7d, 0xd6, 0xb6, 0x05, 0xba, 0xfc, 0xb1, 0xdd, 0xfe, 0xfc,
- 0xa3, 0x8e, 0x01, 0x0d, 0xe9, 0x03, 0x4f, 0xfc, 0xb2, 0xbf, 0xb5, 0x62,
- 0xc2, 0x01, 0x14, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00, 0x05, 0x46,
- 0x05, 0xba, 0x00, 0x0a, 0x00, 0xf5, 0x40, 0x48, 0x2f, 0x05, 0x01, 0x2a,
- 0x00, 0x28, 0x03, 0x25, 0x0a, 0x2f, 0x0c, 0x30, 0x0c, 0x60, 0x0c, 0x89,
- 0x08, 0x89, 0x09, 0x90, 0x0c, 0xc0, 0x0c, 0xf0, 0x0c, 0x0b, 0x20, 0x0c,
- 0x50, 0x0c, 0x02, 0x04, 0x02, 0x0b, 0x08, 0x02, 0x0a, 0x09, 0x09, 0x20,
- 0x08, 0x05, 0x14, 0x08, 0x08, 0x05, 0x00, 0x01, 0x01, 0x20, 0x02, 0x05,
- 0x14, 0x02, 0x02, 0x05, 0x09, 0x01, 0x02, 0x05, 0xe9, 0x20, 0x0a, 0x00,
- 0x08, 0x09, 0x65, 0x08, 0x01, 0x65, 0x02, 0x08, 0xb8, 0xff, 0xc0, 0x40,
- 0x0b, 0x28, 0x39, 0x50, 0x08, 0x01, 0x80, 0x08, 0x90, 0x08, 0x02, 0x08,
- 0xb8, 0x01, 0x01, 0x40, 0x0d, 0x02, 0x40, 0x28, 0x39, 0x5f, 0x02, 0x01,
- 0x8f, 0x02, 0x9f, 0x02, 0x02, 0x02, 0xb8, 0x01, 0x01, 0x40, 0x11, 0x20,
- 0x05, 0x50, 0x05, 0x02, 0x30, 0x05, 0x60, 0x05, 0x90, 0x05, 0xc0, 0x05,
- 0xf0, 0x05, 0x05, 0x05, 0xb8, 0x02, 0x88, 0xb3, 0x0b, 0x60, 0xa8, 0x18,
- 0x2b, 0x19, 0x10, 0xf4, 0x5d, 0x71, 0xe4, 0x5d, 0x71, 0x2b, 0xe4, 0x5d,
- 0x71, 0x2b, 0x18, 0x10, 0xed, 0x10, 0xed, 0x00, 0x3f, 0x3c, 0x1a, 0x19,
- 0xed, 0x18, 0x3f, 0x3c, 0x87, 0x05, 0x2e, 0x2b, 0x7d, 0x10, 0xc4, 0x87,
- 0x2e, 0x18, 0x2b, 0x7d, 0x10, 0xc4, 0x01, 0x4b, 0xb0, 0x0b, 0x53, 0x4b,
- 0xb0, 0x14, 0x51, 0x5a, 0x58, 0xb2, 0x00, 0x0f, 0x0a, 0xb8, 0xff, 0xf1,
- 0xb2, 0x09, 0x12, 0x01, 0xb8, 0xff, 0xf1, 0xb2, 0x08, 0x14, 0x02, 0xb8,
- 0xff, 0xee, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x59, 0x01, 0x4b, 0xb0,
- 0x28, 0x53, 0x4b, 0xb0, 0x36, 0x51, 0x5a, 0x58, 0xb9, 0x00, 0x00, 0xff,
- 0xc0, 0x38, 0x59, 0x31, 0x30, 0x01, 0x5d, 0x71, 0x5d, 0x00, 0x5d, 0x21,
- 0x01, 0x33, 0x01, 0x16, 0x17, 0x36, 0x37, 0x01, 0x33, 0x01, 0x02, 0x41,
- 0xfd, 0xc8, 0xd2, 0x01, 0x7d, 0x2e, 0x1f, 0x22, 0x2d, 0x01, 0x8c, 0xc6,
- 0xfd, 0xc2, 0x05, 0xba, 0xfb, 0xd7, 0x80, 0x70, 0x78, 0x78, 0x04, 0x29,
- 0xfa, 0x46, 0x00, 0x01, 0x00, 0x19, 0x00, 0x00, 0x07, 0x76, 0x05, 0xba,
- 0x00, 0x18, 0x01, 0x8c, 0x40, 0x44, 0x29, 0x00, 0x26, 0x11, 0x29, 0x12,
- 0x26, 0x18, 0x39, 0x00, 0x36, 0x11, 0x39, 0x12, 0x36, 0x18, 0x49, 0x00,
- 0x47, 0x11, 0x49, 0x12, 0x47, 0x18, 0x58, 0x00, 0x57, 0x11, 0x58, 0x12,
- 0x57, 0x18, 0x10, 0x98, 0x08, 0x98, 0x0f, 0x02, 0x03, 0x04, 0x05, 0x05,
- 0x02, 0x06, 0x07, 0x08, 0x08, 0x05, 0x0a, 0x0b, 0x0c, 0x0c, 0x09, 0x0d,
- 0x0e, 0x0f, 0x0f, 0x0c, 0x14, 0x13, 0x12, 0x12, 0x15, 0x16, 0x17, 0x18,
- 0x18, 0x15, 0xb8, 0xff, 0x3c, 0xb3, 0x05, 0x00, 0x18, 0x20, 0xb8, 0xff,
- 0x3c, 0xb3, 0x0c, 0x12, 0x11, 0x20, 0xb8, 0xff, 0x3c, 0x40, 0x5a, 0x15,
- 0x08, 0x09, 0x20, 0x00, 0x05, 0x02, 0x02, 0x20, 0x01, 0x00, 0x14, 0x01,
- 0x01, 0x00, 0x18, 0x05, 0x08, 0x08, 0x1e, 0x15, 0x18, 0x14, 0x15, 0x15,
- 0x18, 0x12, 0x0c, 0x09, 0x09, 0x1e, 0x15, 0x12, 0x14, 0x15, 0x15, 0x12,
- 0x11, 0x0c, 0x0f, 0x0f, 0x20, 0x10, 0x11, 0x14, 0x10, 0x10, 0x11, 0x12,
- 0x09, 0x0c, 0x08, 0x18, 0x15, 0x05, 0x0f, 0x11, 0x10, 0x0c, 0x00, 0x02,
- 0x05, 0x15, 0x0c, 0x05, 0x03, 0x18, 0x10, 0x0f, 0x0f, 0x09, 0x09, 0x08,
- 0x08, 0x02, 0x02, 0x01, 0x02, 0x18, 0x12, 0x12, 0x11, 0x11, 0x00, 0x08,
- 0x1a, 0x17, 0x17, 0x1a, 0x10, 0x41, 0x09, 0x01, 0x51, 0x00, 0x20, 0x00,
- 0x0c, 0x01, 0x51, 0x00, 0x15, 0x01, 0x51, 0x00, 0x40, 0x00, 0x05, 0x01,
- 0x51, 0xb6, 0x20, 0x20, 0x01, 0x01, 0x01, 0x19, 0x19, 0xb8, 0x01, 0x8b,
- 0xb1, 0xa8, 0x18, 0x2b, 0x4e, 0x10, 0xf4, 0x5d, 0x1a, 0x19, 0x4d, 0xfd,
- 0x1a, 0x18, 0xfd, 0xfd, 0x1a, 0x19, 0xfd, 0x18, 0x4e, 0x45, 0x65, 0x44,
- 0xe6, 0x00, 0x3f, 0x3c, 0x10, 0x3c, 0x10, 0x3c, 0x3f, 0x3c, 0x10, 0x3c,
- 0x10, 0x3c, 0x10, 0x3c, 0x10, 0x3c, 0x12, 0x17, 0x39, 0x01, 0x12, 0x39,
- 0x39, 0x11, 0x12, 0x39, 0x39, 0x11, 0x12, 0x39, 0x39, 0x11, 0x39, 0x39,
- 0x87, 0x4d, 0x2e, 0x2b, 0x87, 0x7d, 0xc4, 0x87, 0x2e, 0x18, 0x2b, 0x87,
- 0x7d, 0xc4, 0x87, 0x2e, 0x18, 0x2b, 0x87, 0x7d, 0xc4, 0x87, 0x2e, 0x18,
- 0x2b, 0x87, 0x7d, 0xc4, 0x2b, 0x2b, 0x2b, 0x87, 0x0e, 0x10, 0xc4, 0xc4,
- 0x87, 0x0e, 0x10, 0x3c, 0xc4, 0x87, 0x0e, 0x10, 0xc4, 0xc4, 0x87, 0x0e,
- 0x10, 0xc4, 0xc4, 0x87, 0x0e, 0x10, 0xc4, 0xc4, 0x87, 0x0e, 0x10, 0xc4,
- 0xc4, 0x01, 0x4b, 0xb0, 0x0f, 0x53, 0x4b, 0xb0, 0x11, 0x51, 0x5a, 0x58,
- 0xb2, 0x12, 0x0a, 0x18, 0xb8, 0xff, 0xf6, 0x38, 0x38, 0x59, 0x01, 0x4b,
- 0xb0, 0x25, 0x53, 0x4b, 0xb0, 0x2a, 0x51, 0x5a, 0x58, 0xb9, 0x00, 0x00,
- 0xff, 0xc0, 0x38, 0x59, 0x00, 0x4b, 0xb0, 0x0b, 0x53, 0x4b, 0xb0, 0x0e,
- 0x51, 0x5a, 0x58, 0xb3, 0x0c, 0x40, 0x05, 0x40, 0x38, 0x38, 0x59, 0x31,
- 0x30, 0x01, 0x72, 0x5d, 0x21, 0x01, 0x33, 0x13, 0x16, 0x17, 0x36, 0x37,
- 0x01, 0x33, 0x13, 0x12, 0x17, 0x36, 0x37, 0x13, 0x33, 0x01, 0x23, 0x01,
- 0x26, 0x27, 0x06, 0x07, 0x01, 0x01, 0x9e, 0xfe, 0x7b, 0xc7, 0xdf, 0x24,
- 0x1a, 0x38, 0x0a, 0x01, 0x17, 0xea, 0xd2, 0x4f, 0x23, 0x1c, 0x2d, 0xe6,
- 0xc3, 0xfe, 0x6e, 0xbb, 0xfe, 0xcb, 0x27, 0x07, 0x17, 0x14, 0xfe, 0xc9,
- 0x05, 0xba, 0xfc, 0x3f, 0x97, 0x95, 0xeb, 0x24, 0x03, 0xde, 0xfd, 0x1a,
- 0xfe, 0xec, 0xf3, 0x8b, 0xb4, 0x03, 0xae, 0xfa, 0x46, 0x04, 0x5d, 0x8c,
- 0x20, 0x65, 0x47, 0xfb, 0xa3, 0x00, 0x00, 0x01, 0x00, 0x09, 0x00, 0x00,
- 0x05, 0x49, 0x05, 0xba, 0x00, 0x13, 0x02, 0x57, 0x40, 0x29, 0x26, 0x12,
- 0x01, 0x19, 0x01, 0x16, 0x0b, 0x02, 0x29, 0x12, 0x29, 0x13, 0x38, 0x01,
- 0x37, 0x03, 0x38, 0x08, 0x38, 0x09, 0x38, 0x0d, 0x3a, 0x0e, 0x35, 0x12,
- 0x37, 0x13, 0x0a, 0x12, 0x13, 0x20, 0x12, 0x21, 0x34, 0x12, 0x20, 0x12,
- 0x21, 0x34, 0x0e, 0xb8, 0xff, 0xe0, 0xb3, 0x12, 0x21, 0x34, 0x0d, 0xb8,
- 0xff, 0xe0, 0xb3, 0x12, 0x21, 0x34, 0x09, 0xb8, 0xff, 0xe0, 0xb3, 0x12,
- 0x21, 0x34, 0x08, 0xb8, 0xff, 0xe0, 0x40, 0xc8, 0x12, 0x21, 0x34, 0x04,
- 0x20, 0x12, 0x21, 0x34, 0x03, 0x20, 0x12, 0x21, 0x34, 0x77, 0x01, 0x77,
- 0x0b, 0x02, 0x26, 0x04, 0x29, 0x07, 0x28, 0x0b, 0x2a, 0x0e, 0x26, 0x12,
- 0x36, 0x04, 0x3a, 0x08, 0x3a, 0x0b, 0x3a, 0x0e, 0x35, 0x12, 0x48, 0x08,
- 0x54, 0x04, 0x5d, 0x08, 0x5c, 0x0b, 0x5a, 0x0e, 0x54, 0x12, 0x67, 0x01,
- 0x65, 0x04, 0x6a, 0x08, 0x6b, 0x0b, 0x69, 0x0e, 0x65, 0x12, 0x75, 0x04,
- 0x7a, 0x08, 0x79, 0x0b, 0x7a, 0x0d, 0x77, 0x12, 0x77, 0x13, 0x86, 0x04,
- 0x8a, 0x07, 0x8a, 0x0a, 0x95, 0x04, 0xb8, 0x08, 0xb7, 0x12, 0xc6, 0x04,
- 0xc9, 0x08, 0xd7, 0x04, 0xd8, 0x08, 0xd9, 0x0e, 0xd6, 0x12, 0xe7, 0x04,
- 0xe8, 0x08, 0xe8, 0x0e, 0xe6, 0x12, 0x2c, 0x06, 0x07, 0x08, 0x09, 0x09,
- 0x01, 0x06, 0x05, 0x04, 0x03, 0x03, 0x0b, 0x10, 0x10, 0x13, 0x0f, 0x0e,
- 0x0d, 0x0d, 0x01, 0x10, 0x10, 0x0d, 0x11, 0x12, 0x13, 0x13, 0x0b, 0x01,
- 0x00, 0x09, 0x02, 0x0d, 0x0b, 0x03, 0x0c, 0x13, 0x0a, 0x0b, 0x01, 0x06,
- 0x10, 0x02, 0x13, 0x09, 0x0a, 0x13, 0x13, 0x20, 0x00, 0x09, 0x14, 0x00,
- 0x00, 0x09, 0x03, 0x02, 0x0d, 0x0d, 0x20, 0x0c, 0x03, 0x14, 0x0c, 0x0c,
- 0x03, 0x0a, 0x09, 0x09, 0x03, 0x03, 0x02, 0x02, 0x13, 0x0d, 0x0d, 0x0c,
- 0x0c, 0x00, 0x08, 0x2f, 0x15, 0x01, 0x15, 0x17, 0x17, 0x1a, 0x20, 0x0c,
- 0x40, 0x0c, 0x02, 0x0c, 0xb8, 0x01, 0x5f, 0xb7, 0x20, 0x0a, 0x90, 0x0a,
- 0xc0, 0x0a, 0x03, 0x0a, 0xb8, 0x01, 0xb8, 0xb5, 0x5f, 0x02, 0x9f, 0x02,
- 0x02, 0x02, 0xb8, 0x01, 0xb8, 0x40, 0x0a, 0x06, 0xb4, 0x40, 0x10, 0x50,
- 0x10, 0xcf, 0x10, 0x03, 0x10, 0xb8, 0x01, 0x5f, 0x40, 0x0a, 0x20, 0x00,
- 0x19, 0x14, 0x15, 0xc2, 0x21, 0x60, 0xa8, 0x18, 0x2b, 0x2b, 0x4e, 0xf4,
- 0x1a, 0x19, 0x4d, 0xfd, 0x5d, 0x18, 0xe5, 0x19, 0xed, 0x5d, 0xed, 0x5d,
- 0xfd, 0x5d, 0x18, 0x4e, 0x45, 0x65, 0x44, 0xe6, 0x5d, 0x00, 0x3f, 0x3c,
- 0x10, 0x3c, 0x10, 0x3c, 0x3f, 0x3c, 0x10, 0x3c, 0x10, 0x3c, 0x87, 0x05,
- 0x4d, 0x2e, 0x2b, 0x87, 0x7d, 0xc4, 0x87, 0x2e, 0x18, 0x2b, 0x87, 0x7d,
- 0xc4, 0x00, 0x11, 0x12, 0x39, 0x39, 0x39, 0x39, 0x0f, 0x0f, 0x87, 0x0e,
- 0x10, 0x3c, 0x3c, 0x08, 0xc4, 0x87, 0x0e, 0x10, 0x3c, 0x3c, 0x08, 0xc4,
- 0x87, 0x0e, 0x10, 0x3c, 0x3c, 0xc4, 0x87, 0x0e, 0x10, 0xc4, 0xc4, 0xc4,
- 0x31, 0x30, 0x01, 0x5d, 0x00, 0x5d, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b,
- 0x2b, 0x2b, 0x2b, 0x43, 0x5c, 0x58, 0xb9, 0x00, 0x0b, 0xff, 0xde, 0x40,
- 0x0b, 0x19, 0x39, 0x01, 0x22, 0x19, 0x39, 0x0e, 0x18, 0x1b, 0x39, 0x12,
- 0xb8, 0xff, 0xde, 0xb2, 0x1b, 0x39, 0x13, 0xb8, 0xff, 0xde, 0xb2, 0x1b,
- 0x39, 0x04, 0xb8, 0xff, 0xe8, 0xb6, 0x1b, 0x39, 0x08, 0x22, 0x1b, 0x39,
- 0x09, 0xb8, 0xff, 0xc0, 0xb2, 0x1c, 0x39, 0x0d, 0xb8, 0xff, 0xc0, 0x40,
- 0x1f, 0x1c, 0x39, 0x13, 0x40, 0x1c, 0x39, 0x03, 0x40, 0x1c, 0x39, 0x0d,
- 0x0e, 0x16, 0x17, 0x3c, 0x13, 0x12, 0x16, 0x17, 0x3d, 0x08, 0x09, 0x16,
- 0x17, 0x3c, 0x03, 0x04, 0x16, 0x17, 0x3d, 0x0b, 0xb8, 0xff, 0xde, 0x40,
- 0x2e, 0x12, 0x39, 0x01, 0x22, 0x12, 0x39, 0x0b, 0x0c, 0x1d, 0x21, 0x3d,
- 0x01, 0x00, 0x1d, 0x21, 0x3c, 0x0b, 0x0a, 0x1d, 0x21, 0x3d, 0x01, 0x02,
- 0x1d, 0x21, 0x3c, 0x0b, 0x0c, 0x13, 0x17, 0x3d, 0x01, 0x00, 0x13, 0x17,
- 0x3c, 0x0b, 0x0a, 0x13, 0x17, 0x3d, 0x01, 0x02, 0x13, 0x17, 0x3c, 0x2b,
- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b,
- 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b,
- 0x2b, 0x59, 0x01, 0x71, 0x01, 0x5d, 0x71, 0x33, 0x09, 0x01, 0x33, 0x01,
- 0x16, 0x17, 0x36, 0x37, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x26, 0x27,
- 0x06, 0x07, 0x01, 0x09, 0x02, 0x37, 0xfe, 0x0c, 0xe7, 0x01, 0x0a, 0x53,
- 0x23, 0x31, 0x43, 0x01, 0x27, 0xd3, 0xfd, 0xfd, 0x02, 0x2b, 0xf0, 0xfe,
- 0x8f, 0x1f, 0x21, 0x31, 0x15, 0xfe, 0x90, 0x02, 0xfc, 0x02, 0xbe, 0xfe,
- 0x88, 0x75, 0x3f, 0x50, 0x57, 0x01, 0x85, 0xfd, 0x4d, 0xfc, 0xf9, 0x02,
- 0x0b, 0x2d, 0x35, 0x50, 0x1e, 0xfe, 0x01, 0x00, 0x00, 0x01, 0x00, 0x06,
- 0x00, 0x00, 0x05, 0x46, 0x05, 0xba, 0x00, 0x0c, 0x01, 0x34, 0xb6, 0x08,
- 0x09, 0x3a, 0x03, 0x04, 0x3b, 0x09, 0xb8, 0xff, 0xe7, 0xb3, 0x12, 0x17,
- 0x34, 0x08, 0xb8, 0xff, 0xe7, 0x40, 0x0e, 0x12, 0x17, 0x34, 0x04, 0x19,
- 0x12, 0x17, 0x34, 0x03, 0x19, 0x12, 0x17, 0x34, 0x09, 0xb8, 0xff, 0xd8,
- 0xb3, 0x18, 0x21, 0x34, 0x08, 0xb8, 0xff, 0xd8, 0x40, 0x46, 0x18, 0x21,
- 0x34, 0x04, 0x28, 0x18, 0x21, 0x34, 0x12, 0x26, 0x04, 0x29, 0x08, 0x2a,
- 0x0a, 0x2f, 0x0e, 0x04, 0x68, 0x01, 0x68, 0x06, 0x68, 0x0b, 0xde, 0x06,
- 0x04, 0x05, 0x04, 0x03, 0x03, 0x06, 0x08, 0x07, 0x09, 0x06, 0x06, 0x09,
- 0x06, 0x03, 0x09, 0x20, 0x0a, 0x0b, 0x14, 0x0a, 0x0a, 0x0b, 0x06, 0x03,
- 0x06, 0x09, 0x03, 0x20, 0x02, 0x01, 0x14, 0x02, 0x02, 0x01, 0x06, 0x0c,
- 0x0b, 0x06, 0x01, 0x03, 0x02, 0x00, 0x01, 0x0b, 0xb8, 0x02, 0x19, 0x40,
- 0x09, 0x0a, 0x0a, 0x09, 0x03, 0x02, 0x02, 0x00, 0x08, 0x0e, 0xb8, 0x02,
- 0x18, 0x40, 0x09, 0x0c, 0x09, 0x52, 0x40, 0x0a, 0x80, 0x0a, 0x02, 0x0a,
- 0xb8, 0x01, 0xb5, 0x40, 0x0d, 0x0b, 0x0b, 0x0c, 0x20, 0x00, 0x03, 0x52,
- 0x4f, 0x02, 0x8f, 0x02, 0x02, 0x02, 0xb8, 0x01, 0xb5, 0xb2, 0x01, 0x01,
- 0x00, 0xb8, 0x02, 0x18, 0xb6, 0x0d, 0x0e, 0xc2, 0x21, 0x60, 0xa8, 0x18,
- 0x2b, 0x2b, 0xf6, 0x3c, 0x10, 0xf4, 0x5d, 0xed, 0x10, 0xfd, 0x3c, 0x10,
- 0xf4, 0x5d, 0xed, 0x10, 0xe6, 0x00, 0x3f, 0x3f, 0x3c, 0x3c, 0x3c, 0x10,
- 0xf4, 0x3c, 0x11, 0x12, 0x17, 0x39, 0x01, 0x12, 0x39, 0x87, 0x2e, 0x2b,
- 0x08, 0x7d, 0x10, 0xc4, 0x05, 0x87, 0x2e, 0x18, 0x2b, 0x08, 0x7d, 0x10,
- 0xc4, 0x87, 0x0e, 0xc4, 0xc4, 0x87, 0x10, 0x0e, 0xc4, 0xc4, 0x4b, 0xb0,
- 0x17, 0x53, 0x4b, 0xb0, 0x1c, 0x51, 0x5a, 0x58, 0xb4, 0x08, 0x0c, 0x09,
- 0x0c, 0x04, 0xba, 0xff, 0xf4, 0x00, 0x03, 0xff, 0xf4, 0x01, 0x38, 0x38,
- 0x38, 0x38, 0x59, 0x31, 0x30, 0x00, 0x5d, 0x01, 0x5d, 0x43, 0x5c, 0x58,
- 0x40, 0x09, 0x09, 0x22, 0x19, 0x39, 0x08, 0x22, 0x19, 0x39, 0x04, 0xb8,
- 0xff, 0xde, 0xb1, 0x19, 0x39, 0x2b, 0x2b, 0x2b, 0x59, 0x2b, 0x2b, 0x2b,
- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x21, 0x11, 0x01, 0x33, 0x01, 0x16,
- 0x17, 0x36, 0x37, 0x01, 0x33, 0x01, 0x11, 0x02, 0x3b, 0xfd, 0xcb, 0xec,
- 0x01, 0x21, 0x50, 0x45, 0x42, 0x5e, 0x01, 0x1c, 0xe2, 0xfd, 0xb7, 0x02,
- 0x6d, 0x03, 0x4d, 0xfe, 0x46, 0x7c, 0x7c, 0x73, 0x90, 0x01, 0xaf, 0xfc,
- 0xb3, 0xfd, 0x93, 0x00, 0x00, 0x01, 0x00, 0x29, 0x00, 0x00, 0x04, 0xb0,
- 0x05, 0xba, 0x00, 0x0c, 0x00, 0xe6, 0xb1, 0x12, 0x0e, 0xb8, 0xff, 0xc0,
- 0x40, 0x3a, 0x0d, 0x11, 0x34, 0x48, 0x01, 0x47, 0x08, 0x48, 0x09, 0x03,
- 0x0a, 0x08, 0x0b, 0x09, 0x02, 0xab, 0x04, 0x01, 0x03, 0x02, 0x01, 0x01,
- 0x04, 0x09, 0x0a, 0x04, 0x08, 0x0a, 0x0a, 0x26, 0x1d, 0x21, 0x34, 0x28,
- 0x0a, 0x01, 0xf9, 0x0a, 0x01, 0x0a, 0x20, 0x01, 0x04, 0x14, 0x01, 0x01,
- 0x04, 0x0a, 0x28, 0x0b, 0x1c, 0x34, 0x01, 0x28, 0x0b, 0x1c, 0x34, 0x08,
- 0xb8, 0xff, 0xd8, 0xb3, 0x0b, 0x1c, 0x34, 0x04, 0xb8, 0xff, 0xd8, 0x40,
- 0x13, 0x0b, 0x1c, 0x34, 0x01, 0x0a, 0x04, 0x08, 0x05, 0x1e, 0x07, 0x06,
- 0x02, 0x0b, 0x0a, 0x1e, 0x0c, 0x00, 0x08, 0x0a, 0xbb, 0x01, 0xb5, 0x00,
- 0x01, 0x00, 0x04, 0x01, 0xb5, 0x40, 0x1b, 0x00, 0x07, 0x30, 0x08, 0x40,
- 0x08, 0x02, 0x08, 0x4a, 0x0c, 0x3f, 0x0b, 0x01, 0x0b, 0x1a, 0x0e, 0x01,
- 0x00, 0x05, 0x06, 0x51, 0x00, 0x19, 0x0d, 0xb6, 0x99, 0x18, 0x2b, 0x4e,
- 0x10, 0xf4, 0x4d, 0xf4, 0x3c, 0x10, 0x3c, 0x4e, 0x10, 0xf6, 0x5d, 0x3c,
- 0x4d, 0xf4, 0x71, 0x3c, 0x10, 0xe4, 0x10, 0xfc, 0x00, 0x3f, 0x3c, 0xfd,
- 0x3c, 0x3f, 0x3c, 0xfd, 0x3c, 0x3c, 0x11, 0x39, 0x01, 0x2b, 0x2b, 0x2b,
- 0x2b, 0x87, 0x05, 0x2e, 0x2b, 0x5d, 0x71, 0x2b, 0x87, 0x7d, 0xc4, 0x0e,
- 0x10, 0xc4, 0x87, 0x0e, 0x10, 0xc4, 0xc4, 0x01, 0x72, 0x31, 0x30, 0x01,
- 0x71, 0x5d, 0x2b, 0x43, 0x5c, 0x58, 0x40, 0x09, 0x02, 0x22, 0x21, 0x39,
- 0x01, 0x18, 0x21, 0x39, 0x09, 0xb8, 0xff, 0xde, 0xb5, 0x19, 0x39, 0x02,
- 0x22, 0x19, 0x39, 0x2b, 0x2b, 0x2b, 0x2b, 0x59, 0x33, 0x35, 0x01, 0x36,
- 0x37, 0x21, 0x35, 0x21, 0x15, 0x01, 0x07, 0x21, 0x15, 0x29, 0x02, 0xef,
- 0x50, 0x48, 0xfc, 0xce, 0x04, 0x1a, 0xfc, 0xc9, 0x59, 0x03, 0xa8, 0xb4,
- 0x03, 0xab, 0x64, 0x4a, 0xad, 0xad, 0xfc, 0x07, 0x67, 0xad, 0x00, 0x01,
- 0x00, 0x8b, 0xfe, 0x69, 0x02, 0x18, 0x05, 0xba, 0x00, 0x07, 0x00, 0x38,
- 0x40, 0x1f, 0x04, 0x03, 0x2b, 0x01, 0x02, 0x10, 0x05, 0x06, 0x2b, 0x00,
- 0x07, 0x12, 0x03, 0x02, 0x02, 0x07, 0x06, 0xae, 0x04, 0x05, 0x25, 0x01,
- 0x20, 0x00, 0x01, 0x00, 0xac, 0x08, 0x9d, 0x68, 0x18, 0x2b, 0x10, 0xf6,
- 0x5d, 0x3c, 0xfd, 0x3c, 0xf4, 0x3c, 0x3c, 0x10, 0x3c, 0x00, 0x3f, 0x3c,
- 0xfd, 0x3c, 0x3f, 0x3c, 0xfd, 0x3c, 0x31, 0x30, 0x13, 0x11, 0x21, 0x15,
- 0x23, 0x11, 0x33, 0x15, 0x8b, 0x01, 0x8d, 0xd9, 0xd9, 0xfe, 0x69, 0x07,
- 0x51, 0x95, 0xf9, 0xd9, 0x95, 0x00, 0x00, 0x01, 0x00, 0x00, 0xff, 0xe7,
- 0x02, 0x39, 0x05, 0xd3, 0x00, 0x03, 0x00, 0x4c, 0x40, 0x24, 0x01, 0x01,
- 0x22, 0x14, 0x39, 0x00, 0x22, 0x14, 0x39, 0x98, 0x00, 0x01, 0x01, 0x00,
- 0x90, 0x00, 0xa0, 0x00, 0x02, 0x00, 0x76, 0x03, 0x02, 0x14, 0x03, 0x03,
- 0x02, 0x02, 0x01, 0x00, 0x03, 0x00, 0x0a, 0x03, 0xe8, 0x00, 0xb8, 0x01,
- 0xa9, 0xb7, 0x02, 0xe8, 0x01, 0x01, 0x04, 0xb3, 0x7a, 0x18, 0x2b, 0x10,
- 0x3c, 0x10, 0xed, 0xf4, 0xed, 0x00, 0x3f, 0x3c, 0x3f, 0x3c, 0x87, 0x05,
- 0x2e, 0x2b, 0x5d, 0x7d, 0x10, 0xc4, 0x31, 0x30, 0x01, 0x5d, 0x2b, 0x2b,
- 0x05, 0x01, 0x33, 0x01, 0x01, 0xa9, 0xfe, 0x57, 0x91, 0x01, 0xa8, 0x19,
- 0x05, 0xec, 0xfa, 0x14, 0x00, 0x01, 0x00, 0x27, 0xfe, 0x69, 0x01, 0xb4,
- 0x05, 0xba, 0x00, 0x07, 0x00, 0x34, 0x40, 0x1c, 0x04, 0x05, 0x2b, 0x07,
- 0x06, 0x10, 0x03, 0x02, 0x2b, 0x00, 0x01, 0x12, 0x06, 0x05, 0x05, 0x01,
- 0x02, 0xae, 0x04, 0x03, 0x25, 0x07, 0x00, 0xac, 0x09, 0x9b, 0x5a, 0x18,
- 0x2b, 0x10, 0xf4, 0x3c, 0xfd, 0x3c, 0xf4, 0x3c, 0x3c, 0x10, 0x3c, 0x00,
- 0x3f, 0x3c, 0xfd, 0x3c, 0x3f, 0x3c, 0xfd, 0x3c, 0x31, 0x30, 0x01, 0x21,
- 0x35, 0x33, 0x11, 0x23, 0x35, 0x21, 0x01, 0xb4, 0xfe, 0x73, 0xd9, 0xd9,
- 0x01, 0x8d, 0xfe, 0x69, 0x95, 0x06, 0x27, 0x95, 0x00, 0x01, 0x00, 0x36,
- 0x02, 0xb2, 0x03, 0x8b, 0x05, 0xd3, 0x00, 0x06, 0x00, 0x61, 0xb9, 0x00,
- 0x00, 0xff, 0xc0, 0x40, 0x15, 0x14, 0x39, 0x00, 0x40, 0x14, 0x39, 0x26,
- 0x02, 0x29, 0x03, 0x02, 0x06, 0x02, 0x09, 0x03, 0x02, 0x05, 0x01, 0x06,
- 0x3c, 0x01, 0xb8, 0x01, 0x65, 0x40, 0x17, 0x02, 0x05, 0x3c, 0x04, 0x00,
- 0x3c, 0x01, 0x06, 0x06, 0x03, 0x02, 0x08, 0x38, 0x04, 0xdc, 0x03, 0x6c,
- 0x02, 0xdc, 0x01, 0x69, 0x07, 0x08, 0xbc, 0x01, 0x32, 0x00, 0x21, 0x01,
- 0xbf, 0x01, 0x81, 0x00, 0x18, 0x2b, 0x2b, 0xf6, 0xf4, 0xf6, 0xf4, 0xe4,
- 0x11, 0x12, 0x3d, 0x39, 0x2f, 0x18, 0x10, 0xed, 0x10, 0xed, 0x00, 0x2f,
- 0xed, 0xed, 0x10, 0x3c, 0x31, 0x30, 0x01, 0x71, 0x71, 0x2b, 0x2b, 0x13,
- 0x23, 0x01, 0x33, 0x01, 0x23, 0x03, 0xef, 0xb9, 0x01, 0x61, 0x91, 0x01,
- 0x63, 0xb5, 0xf7, 0x02, 0xb2, 0x03, 0x21, 0xfc, 0xdf, 0x02, 0x55, 0x00,
- 0x00, 0x01, 0xff, 0xe1, 0xfe, 0x69, 0x04, 0x8a, 0xfe, 0xeb, 0x00, 0x03,
- 0x00, 0x1a, 0x40, 0x0c, 0x01, 0x3f, 0x00, 0x02, 0x1a, 0x05, 0x00, 0x19,
- 0x04, 0x43, 0x41, 0x18, 0x2b, 0x4e, 0x10, 0xe4, 0x10, 0xe6, 0x00, 0x2f,
- 0x4d, 0xed, 0x31, 0x30, 0x03, 0x35, 0x21, 0x15, 0x1f, 0x04, 0xa9, 0xfe,
- 0x69, 0x82, 0x82, 0x00, 0x00, 0x01, 0x00, 0x59, 0x04, 0xaa, 0x01, 0xd1,
- 0x05, 0xc2, 0x00, 0x03, 0x00, 0x60, 0x40, 0x0b, 0x03, 0x38, 0x17, 0x19,
- 0x34, 0x02, 0x40, 0x0f, 0x11, 0x34, 0x00, 0xb8, 0xff, 0xc0, 0xb3, 0x17,
- 0x19, 0x34, 0x03, 0xb8, 0xff, 0xc0, 0x40, 0x1a, 0x16, 0x19, 0x34, 0x50,
- 0x01, 0x50, 0x03, 0x02, 0x40, 0x03, 0x50, 0x00, 0x02, 0x03, 0x02, 0x00,
- 0x00, 0x01, 0x10, 0x01, 0x02, 0x01, 0x87, 0x02, 0x00, 0x00, 0xb8, 0x02,
- 0x53, 0xb2, 0x01, 0x86, 0x03, 0xb8, 0x02, 0x60, 0xb3, 0x02, 0x19, 0x04,
- 0x71, 0xb9, 0x01, 0x2f, 0x00, 0x18, 0x2b, 0x4e, 0x10, 0xf4, 0x4d, 0xed,
- 0xf4, 0xed, 0x00, 0x3f, 0xfd, 0x5d, 0x3c, 0x10, 0x3c, 0x31, 0x30, 0x01,
- 0x5d, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x23, 0x03, 0x33, 0x01, 0xd1,
- 0x91, 0xe7, 0xf1, 0x04, 0xaa, 0x01, 0x18, 0x00, 0x00, 0x02, 0x00, 0x4a,
- 0xff, 0xe8, 0x04, 0x1c, 0x04, 0x3e, 0x00, 0x28, 0x00, 0x37, 0x01, 0x1d,
- 0x40, 0x8e, 0x09, 0x0d, 0x09, 0x2a, 0x19, 0x0d, 0x1a, 0x2a, 0x29, 0x0d,
- 0x2a, 0x2a, 0x39, 0x0d, 0x36, 0x15, 0x37, 0x1b, 0x3a, 0x2a, 0x49, 0x2a,
- 0x5d, 0x0d, 0x5d, 0x2a, 0x6a, 0x0d, 0x69, 0x2a, 0x60, 0x30, 0x8a, 0x0d,
- 0x86, 0x29, 0x9a, 0x16, 0x9b, 0x1a, 0xa9, 0x0d, 0x15, 0xa6, 0x19, 0xaa,
- 0x28, 0xb6, 0x19, 0xbb, 0x28, 0xc4, 0x19, 0xcf, 0x28, 0xd2, 0x15, 0xdd,
- 0x28, 0x08, 0x44, 0x16, 0x01, 0x1f, 0x17, 0x1f, 0x18, 0x2b, 0x2c, 0x2a,
- 0x34, 0x39, 0x04, 0x39, 0x2c, 0x49, 0x04, 0x48, 0x2c, 0x56, 0x08, 0x59,
- 0x2b, 0x66, 0x08, 0x69, 0x2b, 0x76, 0x0c, 0x87, 0x0c, 0xc9, 0x0c, 0xf9,
- 0x0d, 0xf9, 0x2b, 0x11, 0x37, 0x34, 0x0e, 0x01, 0x04, 0x10, 0x2f, 0x24,
- 0x34, 0x17, 0x32, 0x21, 0x14, 0x18, 0x5f, 0x29, 0x6f, 0x29, 0x02, 0x29,
- 0x1c, 0x2f, 0x0e, 0x3f, 0x0e, 0x8f, 0x0e, 0x9f, 0x0e, 0xff, 0x0e, 0x05,
- 0x9f, 0x0e, 0xaf, 0x0e, 0xef, 0x0e, 0x03, 0x0e, 0x0e, 0x1c, 0x03, 0x17,
- 0xb8, 0x02, 0xaa, 0x40, 0x16, 0x18, 0x95, 0x14, 0x1c, 0x1c, 0x07, 0x00,
- 0x45, 0x27, 0x0a, 0x32, 0x1c, 0x03, 0x0b, 0x29, 0x61, 0x10, 0x61, 0x00,
- 0x25, 0x21, 0x24, 0xb8, 0x02, 0x5b, 0x40, 0x10, 0x27, 0x40, 0x00, 0x26,
- 0x10, 0x26, 0x20, 0x26, 0x30, 0x26, 0xaf, 0x26, 0x05, 0x26, 0x31, 0x39,
- 0xb8, 0xff, 0xc0, 0x40, 0x1f, 0x1e, 0x23, 0x34, 0x30, 0x39, 0xc0, 0x39,
- 0x02, 0xa0, 0x39, 0x01, 0x39, 0x17, 0x25, 0x18, 0x22, 0x2f, 0x24, 0xbf,
- 0x06, 0xcf, 0x06, 0x02, 0x1f, 0x06, 0x3f, 0x06, 0x02, 0x06, 0x31, 0x38,
- 0x10, 0xf6, 0x5d, 0x71, 0xed, 0xf4, 0xed, 0x10, 0x5d, 0x71, 0x2b, 0xf6,
- 0x5d, 0xed, 0xf4, 0x3c, 0xfd, 0xe5, 0xe5, 0x00, 0x3f, 0xed, 0x3f, 0xe4,
- 0x3f, 0xed, 0xfd, 0xe4, 0x11, 0x12, 0x39, 0x2f, 0x5d, 0x71, 0xed, 0x71,
- 0x11, 0x12, 0x39, 0x11, 0x12, 0x39, 0x39, 0x01, 0x11, 0x12, 0x17, 0x39,
- 0x31, 0x30, 0x00, 0x5d, 0x01, 0x71, 0x5d, 0x00, 0x71, 0x25, 0x0e, 0x01,
- 0x23, 0x22, 0x26, 0x35, 0x34, 0x3e, 0x01, 0x37, 0x36, 0x37, 0x36, 0x37,
- 0x36, 0x35, 0x34, 0x27, 0x26, 0x23, 0x22, 0x06, 0x07, 0x27, 0x3e, 0x02,
- 0x33, 0x32, 0x1e, 0x01, 0x17, 0x16, 0x1d, 0x01, 0x14, 0x16, 0x17, 0x23,
- 0x26, 0x03, 0x06, 0x07, 0x0e, 0x02, 0x15, 0x14, 0x16, 0x33, 0x32, 0x36,
- 0x37, 0x36, 0x35, 0x03, 0x3c, 0x64, 0xb9, 0x6a, 0xaf, 0xbc, 0x47, 0x73,
- 0x48, 0x35, 0x6b, 0xda, 0x67, 0x01, 0x33, 0x45, 0x88, 0x7f, 0x79, 0x1d,
- 0xb0, 0x18, 0x6e, 0xd0, 0x89, 0x88, 0xaa, 0x50, 0x10, 0x09, 0x17, 0x22,
- 0xbc, 0x1c, 0x17, 0x62, 0xc4, 0x6f, 0x5c, 0x32, 0x6d, 0x69, 0x68, 0xa2,
- 0x26, 0x1d, 0x83, 0x55, 0x46, 0xab, 0x85, 0x4e, 0x81, 0x4e, 0x14, 0x0e,
- 0x0d, 0x1a, 0x24, 0x25, 0x0a, 0x6e, 0x2d, 0x3d, 0x59, 0x71, 0x18, 0x71,
- 0x8b, 0x4b, 0x40, 0x61, 0x4a, 0x2e, 0x78, 0xf0, 0xfb, 0x85, 0x3d, 0x38,
- 0x01, 0xdd, 0x28, 0x1c, 0x10, 0x28, 0x4d, 0x2f, 0x48, 0x60, 0x5b, 0x4f,
- 0x3d, 0x77, 0x00, 0x02, 0x00, 0x86, 0xff, 0xe8, 0x04, 0x1f, 0x05, 0xba,
- 0x00, 0x10, 0x00, 0x1d, 0x00, 0xd6, 0x40, 0xac, 0x01, 0x05, 0x0c, 0x0f,
- 0x24, 0x05, 0x35, 0x05, 0x45, 0x05, 0x05, 0x3f, 0x1f, 0xb0, 0x1f, 0x02,
- 0x1f, 0x1f, 0x22, 0x1c, 0x33, 0x1c, 0x42, 0x1c, 0x70, 0x1f, 0x90, 0x1f,
- 0x06, 0x3a, 0x13, 0x3c, 0x16, 0x3c, 0x1a, 0x4c, 0x16, 0x4c, 0x1a, 0x5d,
- 0x08, 0x5d, 0x0d, 0x58, 0x0f, 0x5d, 0x16, 0x5e, 0x1a, 0x6a, 0x08, 0x6c,
- 0x0d, 0x68, 0x0f, 0x6e, 0x16, 0x6e, 0x1a, 0xc0, 0x1f, 0xd9, 0x0c, 0xda,
- 0x17, 0xda, 0x19, 0xe2, 0x13, 0xec, 0x17, 0xec, 0x19, 0xe3, 0x1d, 0xe0,
- 0x1f, 0xff, 0x1f, 0x19, 0x20, 0x05, 0x2f, 0x0f, 0x2f, 0x14, 0x30, 0x05,
- 0x3f, 0x0f, 0x40, 0x05, 0x4c, 0x0f, 0x50, 0x05, 0x66, 0x05, 0xda, 0x1d,
- 0xf5, 0x04, 0xfa, 0x10, 0x0c, 0x10, 0x15, 0x0e, 0x04, 0x06, 0x02, 0x00,
- 0x1b, 0x1c, 0x06, 0x07, 0x01, 0x0a, 0x15, 0x1c, 0x0e, 0x0b, 0x18, 0x24,
- 0xd0, 0x0b, 0x01, 0x10, 0x0b, 0x40, 0x0b, 0x60, 0x0b, 0x80, 0x0b, 0x04,
- 0x0b, 0x74, 0x01, 0x11, 0x33, 0x00, 0x33, 0x03, 0x25, 0x02, 0x02, 0xc0,
- 0x01, 0x01, 0x90, 0x01, 0xa0, 0x01, 0xb0, 0x01, 0xf0, 0x01, 0x04, 0x1f,
- 0x01, 0x3f, 0x01, 0x4f, 0x01, 0x03, 0x01, 0x19, 0x1e, 0x47, 0x37, 0x18,
- 0x2b, 0x4e, 0x10, 0xf4, 0x5d, 0x71, 0x72, 0x3c, 0x4d, 0x10, 0xfd, 0xf4,
- 0xe4, 0x10, 0xfd, 0x5d, 0x71, 0xed, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0xed,
- 0x3f, 0x11, 0x39, 0x11, 0x12, 0x39, 0x31, 0x30, 0x00, 0x5d, 0x01, 0x5d,
- 0x71, 0x72, 0x00, 0x71, 0x21, 0x23, 0x11, 0x33, 0x11, 0x36, 0x33, 0x32,
- 0x1e, 0x02, 0x15, 0x10, 0x00, 0x23, 0x22, 0x27, 0x03, 0x14, 0x17, 0x16,
- 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x01, 0x2d, 0xa7,
- 0xb4, 0x72, 0xb1, 0x62, 0xaf, 0x71, 0x40, 0xfe, 0xf2, 0xbd, 0xbc, 0x6b,
- 0x02, 0x34, 0x55, 0x91, 0x76, 0xac, 0xa5, 0x75, 0x76, 0xac, 0x05, 0xba,
- 0xfd, 0xf5, 0x8f, 0x4f, 0x8f, 0xca, 0x73, 0xfe, 0xef, 0xfe, 0xd6, 0x9d,
- 0x01, 0x96, 0xbf, 0x55, 0x8b, 0xcd, 0xcb, 0xd0, 0xc6, 0xcd, 0x00, 0x01,
- 0x00, 0x50, 0xff, 0xe8, 0x03, 0xed, 0x04, 0x3e, 0x00, 0x1a, 0x00, 0xcd,
- 0x40, 0x47, 0x09, 0x0c, 0x01, 0x1f, 0x1c, 0x43, 0x13, 0x43, 0x17, 0x53,
- 0x13, 0x53, 0x17, 0x60, 0x13, 0x60, 0x17, 0x9b, 0x02, 0x9b, 0x03, 0x9a,
- 0x0d, 0xa4, 0x10, 0xa4, 0x1a, 0x0c, 0x08, 0x0d, 0x19, 0x0a, 0x6a, 0x02,
- 0x69, 0x03, 0x6a, 0x05, 0x75, 0x0c, 0x70, 0x0d, 0x80, 0x0d, 0xa6, 0x0c,
- 0xb5, 0x09, 0xb6, 0x0a, 0xb5, 0x0c, 0x0c, 0x16, 0x0c, 0x86, 0x0c, 0xe3,
- 0x02, 0x03, 0x0e, 0x22, 0x5f, 0x0f, 0x6f, 0x0f, 0x7f, 0x0f, 0x03, 0x0f,
- 0x01, 0xb8, 0x02, 0xaa, 0x40, 0x49, 0x30, 0x00, 0x40, 0x00, 0x50, 0x00,
- 0x60, 0x00, 0x70, 0x00, 0x90, 0x00, 0xa0, 0x00, 0xe0, 0x00, 0xf0, 0x00,
- 0x09, 0x00, 0x0f, 0x0f, 0x0b, 0x00, 0x00, 0x04, 0x12, 0x1c, 0x0b, 0x07,
- 0x18, 0x1c, 0x04, 0x0b, 0x1c, 0x0f, 0x01, 0x0f, 0x24, 0x0e, 0x22, 0x1b,
- 0x00, 0x01, 0x00, 0x24, 0x0b, 0x2b, 0x1f, 0x01, 0x01, 0x00, 0x01, 0x01,
- 0x01, 0x49, 0x1c, 0x15, 0x24, 0xcf, 0x07, 0x01, 0x1f, 0x07, 0x3f, 0x07,
- 0x02, 0x07, 0x31, 0x1b, 0x34, 0xc4, 0x18, 0x2b, 0x10, 0xf6, 0x5d, 0x71,
- 0xed, 0x10, 0xf6, 0x5d, 0x72, 0x4b, 0x53, 0x23, 0x4b, 0x51, 0x5a, 0x58,
- 0xb9, 0x00, 0x01, 0xff, 0xc0, 0x38, 0x59, 0xed, 0x72, 0xf4, 0xed, 0x72,
- 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0x11, 0x39, 0x2f, 0x10,
- 0x5d, 0xe4, 0x10, 0x5d, 0xe4, 0x31, 0x30, 0x00, 0x5d, 0x71, 0x01, 0x5d,
- 0x71, 0x01, 0x17, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x11, 0x34, 0x12, 0x36,
- 0x33, 0x32, 0x16, 0x17, 0x07, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14,
- 0x16, 0x33, 0x32, 0x36, 0x03, 0x3c, 0xb1, 0x1d, 0xef, 0xae, 0xda, 0xfe,
- 0xf7, 0x72, 0xe9, 0x89, 0xad, 0xdc, 0x1f, 0xaf, 0x19, 0x7f, 0x5a, 0x88,
- 0xaa, 0xa4, 0x84, 0x6a, 0x8e, 0x01, 0x85, 0x17, 0xb7, 0xcf, 0x01, 0x1d,
- 0x01, 0x0a, 0xac, 0x01, 0x02, 0x81, 0xaf, 0xa1, 0x1b, 0x6b, 0x6c, 0xc3,
- 0xd3, 0xd6, 0xc2, 0x82, 0x00, 0x02, 0x00, 0x46, 0xff, 0xe8, 0x03, 0xdf,
- 0x05, 0xba, 0x00, 0x11, 0x00, 0x1d, 0x00, 0xd6, 0x40, 0xab, 0x0a, 0x02,
- 0x04, 0x0d, 0x25, 0x0d, 0x34, 0x0d, 0x44, 0x0d, 0x05, 0x35, 0x14, 0x35,
- 0x1c, 0x57, 0x02, 0x54, 0x0a, 0x52, 0x14, 0x53, 0x1c, 0x67, 0x02, 0x64,
- 0x05, 0x65, 0x09, 0x63, 0x14, 0x60, 0x1c, 0xc0, 0x1f, 0xd4, 0x05, 0xd5,
- 0x13, 0xdd, 0x19, 0xe5, 0x13, 0xe5, 0x14, 0xef, 0x17, 0xeb, 0x19, 0xe5,
- 0x1d, 0xe0, 0x1f, 0xff, 0x1f, 0x16, 0x1f, 0x1f, 0x2b, 0x1a, 0x3c, 0x16,
- 0x3c, 0x1a, 0x4b, 0x1a, 0x70, 0x1f, 0x90, 0x1f, 0x07, 0x2e, 0x02, 0x24,
- 0x0d, 0x2e, 0x16, 0x3a, 0x02, 0x35, 0x0d, 0x4b, 0x02, 0x45, 0x0d, 0x46,
- 0x14, 0x49, 0x1c, 0x57, 0x0a, 0x56, 0x0d, 0x67, 0x0d, 0xe5, 0x06, 0xe7,
- 0x16, 0xfa, 0x01, 0xf4, 0x0e, 0x10, 0x01, 0x15, 0x03, 0x0e, 0x0b, 0x10,
- 0x0f, 0x00, 0x1b, 0x1c, 0x0b, 0x07, 0x11, 0x00, 0x0a, 0x15, 0x1c, 0x03,
- 0x0b, 0x18, 0x33, 0x01, 0x00, 0x25, 0x11, 0x0f, 0x25, 0x10, 0x10, 0xd0,
- 0x11, 0x01, 0x10, 0x11, 0x40, 0x11, 0x60, 0x11, 0x80, 0x11, 0x04, 0x11,
- 0x74, 0x12, 0x24, 0xbf, 0x07, 0xcf, 0x07, 0xdf, 0x07, 0xff, 0x07, 0x04,
- 0x1f, 0x07, 0x3f, 0x07, 0x4f, 0x07, 0x03, 0x07, 0x19, 0x1e, 0x34, 0x50,
- 0x18, 0x2b, 0x4e, 0x10, 0xf4, 0x5d, 0x71, 0x4d, 0xed, 0xfd, 0x5d, 0x71,
- 0x3c, 0x10, 0xed, 0x10, 0xfd, 0x3c, 0xe4, 0x00, 0x3f, 0xed, 0x3f, 0x3c,
- 0x3f, 0xed, 0x3f, 0x3c, 0x11, 0x39, 0x11, 0x12, 0x39, 0x31, 0x30, 0x00,
- 0x5d, 0x01, 0x71, 0x5d, 0x00, 0x71, 0x21, 0x35, 0x06, 0x23, 0x22, 0x2e,
- 0x01, 0x35, 0x34, 0x12, 0x36, 0x33, 0x32, 0x16, 0x17, 0x11, 0x33, 0x11,
- 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06,
- 0x03, 0x38, 0x65, 0xc4, 0x7f, 0xd5, 0x75, 0x6a, 0xd4, 0x83, 0x60, 0x96,
- 0x2f, 0xb3, 0xfd, 0x20, 0xac, 0x75, 0x76, 0xa5, 0xa8, 0x7b, 0x78, 0xa1,
- 0x86, 0x9e, 0x8c, 0xfb, 0xa3, 0x9f, 0x01, 0x03, 0x8a, 0x51, 0x41, 0x02,
- 0x0e, 0xfa, 0x46, 0x02, 0x12, 0xcc, 0xca, 0xc1, 0xc6, 0xda, 0xcc, 0xc4,
- 0x00, 0x02, 0x00, 0x4b, 0xff, 0xe8, 0x04, 0x1e, 0x04, 0x3e, 0x00, 0x15,
- 0x00, 0x1d, 0x00, 0xde, 0x40, 0x64, 0x1f, 0x00, 0x1c, 0x15, 0x02, 0x55,
- 0x03, 0x5d, 0x05, 0x5d, 0x09, 0x55, 0x0b, 0x65, 0x03, 0x6b, 0x05, 0x6f,
- 0x09, 0x65, 0x0b, 0x08, 0x10, 0x00, 0x10, 0x01, 0x10, 0x02, 0x27, 0x12,
- 0xd9, 0x05, 0xfa, 0x14, 0xf6, 0x1a, 0x07, 0x31, 0x12, 0x3a, 0x19, 0x31,
- 0x1c, 0x41, 0x12, 0x4d, 0x1a, 0x41, 0x1c, 0x51, 0x12, 0x5c, 0x19, 0x52,
- 0x1c, 0x61, 0x12, 0x6d, 0x1a, 0x61, 0x1c, 0x78, 0x06, 0x78, 0x15, 0xf6,
- 0x02, 0xf6, 0x18, 0x10, 0x00, 0x16, 0x01, 0x0f, 0x0d, 0x17, 0x17, 0x50,
- 0x16, 0x60, 0x16, 0x70, 0x16, 0x03, 0x16, 0x1c, 0x0f, 0x90, 0x10, 0xa0,
- 0x10, 0x02, 0x10, 0x10, 0x04, 0x1b, 0x1c, 0x0a, 0x07, 0x00, 0xb8, 0x02,
- 0xaa, 0x40, 0x09, 0x01, 0x95, 0x13, 0x1c, 0x04, 0x0b, 0x17, 0x40, 0x0d,
- 0xb8, 0xff, 0xc0, 0x40, 0x09, 0x27, 0x2a, 0x34, 0xb0, 0x0d, 0x01, 0x0d,
- 0x1a, 0x1f, 0xb8, 0xff, 0xc0, 0xb3, 0x25, 0x26, 0x34, 0x1f, 0xb8, 0xff,
- 0xc0, 0x40, 0x1d, 0x1e, 0x23, 0x34, 0x30, 0x1f, 0x01, 0x1f, 0x16, 0x33,
- 0x10, 0x24, 0x07, 0x40, 0x24, 0x2a, 0x34, 0x1f, 0x07, 0x3f, 0x07, 0x4f,
- 0x07, 0x03, 0x07, 0x19, 0x1e, 0x34, 0x37, 0x18, 0x2b, 0x4e, 0x10, 0xf4,
- 0x5d, 0x2b, 0x4d, 0xfd, 0xe4, 0x4e, 0x10, 0x71, 0x2b, 0x2b, 0xf6, 0x71,
- 0x2b, 0x4d, 0xed, 0x00, 0x3f, 0xed, 0xfd, 0xe4, 0x3f, 0xed, 0x12, 0x39,
- 0x2f, 0x5d, 0x3c, 0xfd, 0x71, 0x3c, 0x01, 0x11, 0x12, 0x39, 0x39, 0x12,
- 0x39, 0x31, 0x30, 0x01, 0x5d, 0x00, 0x5d, 0x01, 0x71, 0x72, 0x01, 0x17,
- 0x0e, 0x01, 0x23, 0x22, 0x00, 0x11, 0x10, 0x00, 0x33, 0x32, 0x00, 0x11,
- 0x14, 0x07, 0x21, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x01, 0x21, 0x26, 0x27,
- 0x26, 0x23, 0x22, 0x06, 0x03, 0x5e, 0xba, 0x2c, 0xee, 0xb9, 0xe9, 0xfe,
- 0xef, 0x01, 0x14, 0xdc, 0xd5, 0x01, 0x0e, 0x01, 0xfc, 0xe8, 0x0a, 0xb2,
- 0x85, 0x63, 0x8c, 0xfd, 0xda, 0x02, 0x51, 0x0c, 0x38, 0x56, 0x89, 0x7c,
- 0xa9, 0x01, 0x56, 0x17, 0xa3, 0xb4, 0x01, 0x1f, 0x01, 0x03, 0x01, 0x0c,
- 0x01, 0x28, 0xfe, 0xde, 0xfe, 0xf9, 0x10, 0x20, 0xaf, 0xba, 0x68, 0x01,
- 0x95, 0x86, 0x43, 0x68, 0xa6, 0x00, 0x00, 0x01, 0x00, 0x13, 0x00, 0x00,
- 0x02, 0x80, 0x05, 0xd3, 0x00, 0x17, 0x00, 0xb3, 0x40, 0x1e, 0x14, 0x09,
- 0x01, 0x0f, 0x19, 0x2f, 0x19, 0x30, 0x19, 0x40, 0x19, 0x70, 0x19, 0x9b,
- 0x0c, 0x9c, 0x0d, 0xa9, 0x0d, 0x08, 0x1a, 0x0d, 0x28, 0x0d, 0xb0, 0x19,
- 0xc0, 0x19, 0x04, 0x19, 0xb8, 0xff, 0xc0, 0x40, 0x28, 0x1a, 0x1f, 0x34,
- 0x1d, 0x08, 0x0d, 0x03, 0x0c, 0x0f, 0x1c, 0x0a, 0x01, 0x15, 0x02, 0x2b,
- 0x14, 0x13, 0x04, 0x03, 0x06, 0x00, 0x0a, 0x9f, 0x14, 0x01, 0x14, 0xff,
- 0x13, 0x40, 0x04, 0x17, 0x25, 0x04, 0x00, 0x03, 0x02, 0x92, 0x01, 0x01,
- 0x00, 0xb8, 0xff, 0xc0, 0xb3, 0x31, 0x38, 0x34, 0x00, 0xb8, 0xff, 0xc0,
- 0x40, 0x0a, 0x1c, 0x1f, 0x34, 0x90, 0x00, 0x01, 0x00, 0xa3, 0x18, 0x19,
- 0xbc, 0x01, 0xba, 0x00, 0x21, 0x00, 0xf6, 0x01, 0x0a, 0x00, 0x18, 0x2b,
- 0x2b, 0xf6, 0x5d, 0x2b, 0x2b, 0x3c, 0x10, 0xf4, 0x3c, 0x10, 0x3c, 0xed,
- 0x10, 0xed, 0xed, 0x5d, 0x00, 0x3f, 0x3f, 0x3c, 0x3c, 0x3c, 0xfd, 0x3c,
- 0x3f, 0xed, 0x39, 0x11, 0x39, 0x31, 0x30, 0x43, 0x79, 0x40, 0x14, 0x10,
- 0x11, 0x06, 0x09, 0x07, 0x06, 0x08, 0x06, 0x02, 0x06, 0x10, 0x09, 0x12,
- 0x1b, 0x00, 0x11, 0x06, 0x0f, 0x1b, 0x01, 0x2b, 0x01, 0x2b, 0x2a, 0x81,
- 0x81, 0x01, 0x2b, 0x71, 0x5d, 0x00, 0x72, 0x33, 0x11, 0x23, 0x35, 0x33,
- 0x35, 0x34, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x17, 0x07, 0x26, 0x23, 0x22,
- 0x06, 0x1d, 0x01, 0x33, 0x15, 0x23, 0x11, 0xb2, 0x9f, 0x9f, 0x13, 0x1a,
- 0x83, 0x76, 0x4c, 0x5c, 0x1b, 0x38, 0x32, 0x52, 0x44, 0xcf, 0xcf, 0x03,
- 0x9a, 0x8c, 0x71, 0x6b, 0x34, 0x46, 0x57, 0x12, 0x9d, 0x0a, 0x46, 0x60,
- 0x62, 0x8c, 0xfc, 0x66, 0x00, 0x02, 0x00, 0x42, 0xfe, 0x51, 0x03, 0xea,
- 0x04, 0x3e, 0x00, 0x1e, 0x00, 0x2a, 0x00, 0xf0, 0x40, 0x60, 0x0b, 0x0b,
- 0x05, 0x14, 0x2c, 0x0b, 0x25, 0x14, 0x4c, 0x0b, 0x45, 0x14, 0x06, 0x09,
- 0x1d, 0x19, 0x1d, 0x2c, 0x0b, 0x26, 0x14, 0x2c, 0x23, 0x39, 0x0b, 0x36,
- 0x14, 0x4a, 0x0b, 0x46, 0x14, 0x56, 0x07, 0x58, 0x0b, 0x68, 0x0b, 0xfa,
- 0x0a, 0xf5, 0x15, 0x0e, 0x2e, 0x23, 0x2c, 0x27, 0x3e, 0x23, 0x3e, 0x27,
- 0x4c, 0x27, 0x90, 0x2c, 0xa0, 0x2c, 0x07, 0x36, 0x21, 0x36, 0x29, 0x3f,
- 0x2c, 0x46, 0x0b, 0x46, 0x21, 0x45, 0x29, 0x54, 0x21, 0x54, 0x29, 0x69,
- 0x07, 0x63, 0x21, 0x63, 0x29, 0x60, 0x2c, 0x80, 0x2c, 0xda, 0x27, 0xe8,
- 0x21, 0xee, 0x23, 0xef, 0x27, 0x11, 0x17, 0x16, 0x06, 0x15, 0xb8, 0x02,
- 0xb1, 0xb4, 0x28, 0x1c, 0x13, 0x07, 0x01, 0xb8, 0x02, 0xaa, 0x40, 0x10,
- 0x20, 0x00, 0x30, 0x00, 0x60, 0x00, 0x70, 0x00, 0x80, 0x00, 0xc0, 0x00,
- 0xd0, 0x00, 0x07, 0x00, 0xb8, 0x02, 0x7d, 0x40, 0x41, 0x05, 0x1c, 0x1c,
- 0x0f, 0x0a, 0x45, 0x22, 0x1c, 0x0c, 0x0a, 0x16, 0x15, 0x33, 0x25, 0x33,
- 0x0a, 0x25, 0x18, 0x18, 0xd0, 0x17, 0x01, 0x10, 0x17, 0x40, 0x17, 0x60,
- 0x17, 0x80, 0x17, 0x04, 0x17, 0x74, 0x0f, 0x01, 0x25, 0x00, 0x22, 0x1f,
- 0x24, 0xbf, 0x0f, 0xcf, 0x0f, 0xdf, 0x0f, 0xff, 0x0f, 0x04, 0x1f, 0x0f,
- 0x3f, 0x0f, 0x4f, 0x0f, 0x03, 0x0f, 0x19, 0x2b, 0x2c, 0x74, 0x21, 0x34,
- 0x50, 0x18, 0x2b, 0x2b, 0x4e, 0xf4, 0x5d, 0x71, 0x4d, 0xed, 0xf4, 0xed,
- 0x10, 0xfd, 0x5d, 0x71, 0x3c, 0x10, 0xfd, 0xe4, 0xf6, 0x3c, 0x00, 0x3f,
- 0xed, 0xe4, 0x3f, 0xed, 0xfd, 0x5d, 0xe4, 0x3f, 0xed, 0xe4, 0x3f, 0x3c,
- 0x31, 0x30, 0x01, 0x5d, 0x71, 0x00, 0x5d, 0x71, 0x1f, 0x01, 0x16, 0x17,
- 0x16, 0x33, 0x32, 0x36, 0x37, 0x36, 0x27, 0x06, 0x23, 0x22, 0x02, 0x35,
- 0x34, 0x12, 0x36, 0x33, 0x32, 0x17, 0x35, 0x33, 0x11, 0x14, 0x0e, 0x01,
- 0x23, 0x22, 0x26, 0x13, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26,
- 0x23, 0x22, 0x06, 0x66, 0xaf, 0x0b, 0x32, 0x43, 0x74, 0x7d, 0x88, 0x18,
- 0x0e, 0x01, 0x76, 0xb0, 0xdb, 0xf0, 0x6e, 0xd1, 0x8d, 0xbc, 0x7a, 0xa6,
- 0x65, 0xdb, 0xa0, 0xbe, 0xea, 0x99, 0xa6, 0x7d, 0x7c, 0xa8, 0xad, 0x7a,
- 0x78, 0xa8, 0x58, 0x1a, 0x51, 0x25, 0x32, 0x64, 0x5a, 0x37, 0xb0, 0x8b,
- 0x01, 0x3c, 0xdd, 0x98, 0x01, 0x01, 0x8c, 0x98, 0x80, 0xfc, 0x6a, 0xf8,
- 0xcf, 0x78, 0xab, 0x03, 0x2a, 0xd1, 0xc0, 0xbf, 0xcc, 0xc3, 0xc6, 0xc3,
- 0x00, 0x01, 0x00, 0x87, 0x00, 0x00, 0x03, 0xe8, 0x05, 0xba, 0x00, 0x14,
- 0x00, 0xb1, 0xb9, 0x00, 0x16, 0xff, 0xc0, 0x40, 0x0d, 0x15, 0x17, 0x34,
- 0x25, 0x04, 0x35, 0x03, 0x45, 0x03, 0xba, 0x0d, 0x04, 0x03, 0xb8, 0xff,
- 0xe0, 0x40, 0x24, 0x17, 0x19, 0x34, 0x17, 0x08, 0x11, 0x0c, 0x11, 0x14,
- 0x03, 0x05, 0x01, 0x00, 0x0f, 0x1c, 0x05, 0x07, 0x14, 0x0b, 0x0a, 0x0c,
- 0x25, 0x09, 0x40, 0x33, 0x36, 0x34, 0xff, 0x09, 0x01, 0xc0, 0x09, 0x01,
- 0x09, 0x4e, 0x16, 0xb8, 0xff, 0xc0, 0x40, 0x17, 0x34, 0x36, 0x34, 0xb0,
- 0x16, 0xf0, 0x16, 0x02, 0x70, 0x16, 0xa0, 0x16, 0xb0, 0x16, 0xff, 0x16,
- 0x04, 0x16, 0x02, 0x14, 0x25, 0x01, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x15,
- 0x33, 0x36, 0x34, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00, 0xd0, 0x00,
- 0xe0, 0x00, 0x04, 0x00, 0x4e, 0x15, 0x47, 0x50, 0x18, 0x2b, 0x10, 0xf6,
- 0x5d, 0x71, 0x2b, 0x3c, 0xfd, 0x3c, 0x10, 0x5d, 0x71, 0x2b, 0xf4, 0x5d,
- 0x71, 0x2b, 0xed, 0x00, 0x3f, 0x3c, 0x3f, 0xed, 0x3f, 0x11, 0x39, 0x11,
- 0x39, 0x01, 0x12, 0x39, 0x31, 0x30, 0x43, 0x79, 0x40, 0x0e, 0x06, 0x0e,
- 0x07, 0x25, 0x0e, 0x06, 0x0c, 0x1b, 0x01, 0x0d, 0x08, 0x0f, 0x1b, 0x01,
- 0x00, 0x2b, 0x01, 0x2b, 0x2b, 0x81, 0x00, 0x2b, 0x5d, 0x01, 0x2b, 0x33,
- 0x11, 0x33, 0x11, 0x36, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x11, 0x23, 0x11,
- 0x34, 0x26, 0x23, 0x22, 0x0e, 0x01, 0x15, 0x11, 0x87, 0xb4, 0x7e, 0xc0,
- 0x76, 0xae, 0x4b, 0xb4, 0x75, 0x6b, 0x50, 0x8d, 0x3c, 0x05, 0xba, 0xfd,
- 0xf2, 0x92, 0x5d, 0xa4, 0x9c, 0xfd, 0x5f, 0x02, 0xa1, 0x87, 0x7b, 0x53,
- 0x8e, 0x7d, 0xfd, 0xbb, 0x00, 0x02, 0x00, 0x88, 0x00, 0x00, 0x01, 0x3c,
- 0x05, 0xba, 0x00, 0x03, 0x00, 0x07, 0x00, 0x7d, 0x40, 0x5d, 0x4f, 0x09,
- 0x90, 0x09, 0xa0, 0x09, 0xb0, 0x09, 0xc0, 0x09, 0xdf, 0x09, 0xf0, 0x09,
- 0x07, 0x00, 0x09, 0x1f, 0x09, 0x70, 0x09, 0x80, 0x09, 0x9f, 0x09, 0xb0,
- 0x09, 0xc0, 0x09, 0xdf, 0x09, 0xe0, 0x09, 0xff, 0x09, 0x0a, 0x1f, 0x09,
- 0x01, 0x00, 0x01, 0x07, 0x04, 0x02, 0x03, 0x09, 0x06, 0x03, 0x7e, 0x01,
- 0x00, 0x06, 0x05, 0x06, 0x04, 0x0a, 0x06, 0x07, 0x25, 0x05, 0x00, 0x04,
- 0x9f, 0x04, 0xa0, 0x04, 0xb0, 0x04, 0xc0, 0x04, 0xe0, 0x04, 0x06, 0xc0,
- 0x04, 0xf0, 0x04, 0x02, 0x00, 0x04, 0x20, 0x04, 0xd0, 0x04, 0xe0, 0x04,
- 0x04, 0x04, 0x4e, 0x08, 0x47, 0x50, 0x18, 0x2b, 0x10, 0xf6, 0x5d, 0x71,
- 0x72, 0x3c, 0xfd, 0x3c, 0x00, 0x3f, 0x3f, 0x3c, 0x3f, 0xed, 0x01, 0x11,
- 0x12, 0x39, 0x39, 0x11, 0x12, 0x39, 0x39, 0x31, 0x30, 0x01, 0x5d, 0x72,
- 0x71, 0x13, 0x35, 0x33, 0x15, 0x03, 0x11, 0x33, 0x11, 0x88, 0xb4, 0xb4,
- 0xb4, 0x04, 0xeb, 0xcf, 0xcf, 0xfb, 0x15, 0x04, 0x26, 0xfb, 0xda, 0x00,
- 0x00, 0x02, 0xff, 0xa2, 0xfe, 0x51, 0x01, 0x3a, 0x05, 0xba, 0x00, 0x03,
- 0x00, 0x12, 0x00, 0x99, 0x40, 0x4d, 0x04, 0x05, 0x25, 0x05, 0x3b, 0x04,
- 0x33, 0x05, 0x86, 0x05, 0x05, 0x17, 0x08, 0x05, 0x05, 0x07, 0x04, 0x04,
- 0x02, 0x04, 0x05, 0x13, 0x00, 0x01, 0x0d, 0x0b, 0x02, 0x03, 0x14, 0x0c,
- 0x04, 0x11, 0x05, 0x0b, 0x07, 0x03, 0x7e, 0x01, 0x00, 0x0b, 0x06, 0x07,
- 0x1c, 0x11, 0x0f, 0x90, 0x14, 0x01, 0x14, 0x17, 0x17, 0x1a, 0x0c, 0x0c,
- 0x0d, 0x25, 0x0a, 0x0a, 0x90, 0x0b, 0x01, 0x1f, 0x0b, 0x3f, 0x0b, 0x4f,
- 0x0b, 0x03, 0x0b, 0x19, 0x13, 0x14, 0xad, 0x21, 0x47, 0x50, 0x18, 0x2b,
- 0x2b, 0x4e, 0xf4, 0x5d, 0x71, 0x3c, 0x4d, 0x10, 0xfd, 0x3c, 0x4e, 0x10,
- 0x45, 0x65, 0x44, 0xe6, 0x71, 0x00, 0x3f, 0x4d, 0xed, 0x3f, 0x3f, 0xed,
- 0x11, 0x12, 0x39, 0x12, 0x39, 0x01, 0x11, 0x12, 0x39, 0x39, 0x11, 0x12,
- 0x39, 0x39, 0x11, 0x33, 0x33, 0x87, 0x10, 0x08, 0x3c, 0x31, 0x30, 0x43,
- 0x79, 0x40, 0x0e, 0x08, 0x10, 0x0f, 0x26, 0x08, 0x10, 0x0a, 0x1b, 0x01,
- 0x09, 0x0e, 0x07, 0x1b, 0x00, 0x00, 0x2b, 0x01, 0x2b, 0x2b, 0x81, 0x01,
- 0x5d, 0x13, 0x35, 0x33, 0x15, 0x01, 0x37, 0x16, 0x33, 0x32, 0x36, 0x35,
- 0x11, 0x33, 0x11, 0x14, 0x07, 0x06, 0x23, 0x22, 0x86, 0xb4, 0xfe, 0x68,
- 0x22, 0x36, 0x1f, 0x37, 0x36, 0xb4, 0x33, 0x41, 0x97, 0x49, 0x04, 0xe9,
- 0xd1, 0xd1, 0xf9, 0x7b, 0x99, 0x0e, 0x49, 0x92, 0x04, 0x5c, 0xfb, 0xa0,
- 0xc4, 0x4d, 0x64, 0x00, 0x00, 0x01, 0x00, 0x88, 0x00, 0x00, 0x03, 0xf8,
- 0x05, 0xba, 0x00, 0x0b, 0x01, 0xcc, 0x40, 0x1a, 0x07, 0x06, 0x56, 0x06,
- 0x5a, 0x09, 0x03, 0x0f, 0x0d, 0xf3, 0x05, 0xf6, 0x06, 0x03, 0x55, 0x03,
- 0x77, 0x0a, 0x02, 0x12, 0x06, 0x20, 0x13, 0x21, 0x34, 0x08, 0xb8, 0xff,
- 0xf0, 0xb3, 0x12, 0x27, 0x34, 0x09, 0xb8, 0xff, 0xf0, 0xb4, 0x12, 0x27,
- 0x34, 0x12, 0x05, 0xb8, 0xff, 0xf0, 0xb3, 0x12, 0x21, 0x34, 0x09, 0xb8,
- 0xff, 0xf0, 0x40, 0x84, 0x12, 0x27, 0x34, 0x06, 0x04, 0x04, 0x05, 0x04,
- 0x06, 0x37, 0x09, 0x47, 0x04, 0x05, 0x25, 0x06, 0x2d, 0x0a, 0x58, 0x0a,
- 0x77, 0x03, 0x75, 0x0a, 0xda, 0x03, 0xe3, 0x06, 0x07, 0xa6, 0x06, 0x01,
- 0x23, 0x06, 0x26, 0x07, 0x25, 0x08, 0x39, 0x06, 0x38, 0x09, 0x3f, 0x0d,
- 0x4f, 0x0d, 0x59, 0x04, 0x59, 0x06, 0x58, 0x07, 0x59, 0x09, 0x7d, 0x04,
- 0x79, 0x05, 0x99, 0x09, 0xc6, 0x06, 0xd2, 0x04, 0xd6, 0x06, 0xe4, 0x06,
- 0xe9, 0x07, 0xf7, 0x06, 0xf9, 0x08, 0x15, 0x12, 0x0a, 0x0a, 0x05, 0x03,
- 0x03, 0x04, 0x02, 0x06, 0x06, 0x07, 0x09, 0x09, 0x08, 0x0a, 0x0a, 0x05,
- 0x09, 0x08, 0x08, 0x25, 0x07, 0x06, 0x14, 0x07, 0x07, 0x06, 0x03, 0x04,
- 0x04, 0x25, 0x05, 0x0a, 0x14, 0x05, 0x05, 0x0a, 0x0a, 0x09, 0x06, 0x03,
- 0x04, 0x08, 0x01, 0x02, 0x00, 0x04, 0x05, 0x06, 0x07, 0x08, 0x08, 0x0b,
- 0x0b, 0x00, 0x0a, 0x04, 0xb8, 0x01, 0x0f, 0xb2, 0x05, 0x22, 0x08, 0xb8,
- 0x01, 0x0f, 0x40, 0x23, 0x20, 0x07, 0x3f, 0x07, 0x02, 0x07, 0x1a, 0x90,
- 0x0d, 0x01, 0x0d, 0x0b, 0x25, 0x00, 0x02, 0x25, 0x01, 0x01, 0x90, 0x00,
- 0x01, 0x3f, 0x00, 0x4f, 0x00, 0x02, 0x00, 0x19, 0x0c, 0x0d, 0xe1, 0x21,
- 0x47, 0x66, 0x18, 0x2b, 0x2b, 0x4e, 0xf4, 0x5d, 0x71, 0x3c, 0x4d, 0x10,
- 0xed, 0x10, 0xed, 0x4e, 0x10, 0x71, 0xf6, 0x5d, 0x4d, 0xed, 0xf4, 0xed,
- 0x00, 0x3f, 0x3c, 0x10, 0x3c, 0x10, 0x3c, 0x3f, 0x3c, 0x3f, 0x3c, 0x11,
- 0x17, 0x39, 0x87, 0x05, 0x2e, 0x2b, 0x04, 0x7d, 0x10, 0xc4, 0x87, 0x05,
- 0x2e, 0x18, 0x2b, 0x0e, 0x7d, 0x10, 0xc4, 0x07, 0x10, 0x08, 0x3c, 0x08,
- 0x3c, 0x03, 0x10, 0x08, 0x3c, 0x08, 0x3c, 0x31, 0x30, 0x01, 0x43, 0x5c,
- 0x58, 0x40, 0x0a, 0x09, 0x2c, 0x1d, 0x39, 0x09, 0x08, 0x1d, 0x1d, 0x3c,
- 0x06, 0xb8, 0xff, 0xde, 0xb2, 0x1d, 0x39, 0x06, 0xb8, 0xff, 0xd4, 0xb2,
- 0x20, 0x39, 0x06, 0xb8, 0xff, 0xd4, 0xb1, 0x21, 0x39, 0x2b, 0x2b, 0x2b,
- 0x2b, 0x2b, 0x59, 0x5d, 0x00, 0x71, 0x5d, 0x01, 0x71, 0x00, 0x2b, 0x2b,
- 0x43, 0x5c, 0x58, 0xb9, 0x00, 0x06, 0xff, 0xc0, 0xb2, 0x21, 0x39, 0x03,
- 0xb8, 0xff, 0xc0, 0xb2, 0x16, 0x39, 0x03, 0xb8, 0xff, 0xde, 0xb2, 0x10,
- 0x39, 0x06, 0xb8, 0xff, 0xde, 0xb2, 0x10, 0x39, 0x03, 0xb8, 0xff, 0xde,
- 0xb2, 0x0c, 0x39, 0x03, 0xb8, 0xff, 0xde, 0xb1, 0x0b, 0x39, 0x2b, 0x2b,
- 0x2b, 0x2b, 0x2b, 0x2b, 0x59, 0x01, 0x2b, 0x2b, 0x2b, 0x43, 0x5c, 0x58,
- 0x40, 0x12, 0xdd, 0x04, 0x01, 0x08, 0x14, 0x16, 0x39, 0x09, 0x08, 0x14,
- 0x14, 0x3c, 0x09, 0x08, 0x14, 0x14, 0x3c, 0x06, 0xb8, 0xff, 0xf6, 0xb2,
- 0x18, 0x39, 0x06, 0xb8, 0xff, 0xec, 0xb1, 0x1b, 0x39, 0x2b, 0x2b, 0x2b,
- 0x2b, 0x2b, 0x01, 0x5d, 0x59, 0x00, 0x5d, 0x01, 0x5d, 0x71, 0x33, 0x11,
- 0x33, 0x11, 0x01, 0x33, 0x09, 0x01, 0x23, 0x01, 0x07, 0x11, 0x88, 0xb4,
- 0x01, 0xaa, 0xe9, 0xfe, 0x6a, 0x01, 0xbf, 0xde, 0xfe, 0xa1, 0x7f, 0x05,
- 0xba, 0xfc, 0xbc, 0x01, 0xb0, 0xfe, 0x76, 0xfd, 0x64, 0x02, 0x1f, 0x7a,
- 0xfe, 0x5b, 0x00, 0x01, 0x00, 0x83, 0x00, 0x00, 0x01, 0x37, 0x05, 0xba,
- 0x00, 0x03, 0x00, 0x8c, 0xb9, 0x00, 0x05, 0xff, 0xc0, 0xb3, 0x37, 0x38,
- 0x34, 0x05, 0xb8, 0xff, 0xc0, 0xb3, 0x34, 0x35, 0x34, 0x05, 0xb8, 0xff,
- 0xc0, 0xb3, 0x30, 0x31, 0x34, 0x05, 0xb8, 0xff, 0xc0, 0xb3, 0x22, 0x25,
- 0x34, 0x05, 0xb8, 0xff, 0xc0, 0x40, 0x25, 0x15, 0x17, 0x34, 0x0f, 0x05,
- 0x1f, 0x05, 0x9f, 0x05, 0xdf, 0x05, 0x04, 0x4f, 0x05, 0xdf, 0x05, 0xf0,
- 0x05, 0x03, 0x1f, 0x05, 0x70, 0x05, 0x80, 0x05, 0xff, 0x05, 0x04, 0x01,
- 0x00, 0x00, 0x0a, 0x02, 0x03, 0x25, 0x01, 0x00, 0xb8, 0xff, 0xc0, 0xb3,
- 0x37, 0x38, 0x34, 0x00, 0xb8, 0xff, 0xc0, 0x40, 0x1a, 0x33, 0x35, 0x34,
- 0x9f, 0x00, 0x01, 0xc0, 0x00, 0xf0, 0x00, 0x02, 0x00, 0x00, 0x20, 0x00,
- 0xd0, 0x00, 0xe0, 0x00, 0x04, 0x00, 0x4e, 0x04, 0x47, 0x50, 0x18, 0x2b,
- 0x10, 0xf6, 0x5d, 0x71, 0x72, 0x2b, 0x2b, 0x3c, 0xfd, 0x3c, 0x00, 0x3f,
- 0x3f, 0x31, 0x30, 0x01, 0x5d, 0x71, 0x72, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b,
- 0x33, 0x11, 0x33, 0x11, 0x83, 0xb4, 0x05, 0xba, 0xfa, 0x46, 0x00, 0x01,
- 0x00, 0x87, 0x00, 0x00, 0x06, 0x26, 0x04, 0x3e, 0x00, 0x23, 0x00, 0xc6,
- 0xb9, 0x00, 0x09, 0xff, 0xd8, 0x40, 0x41, 0x0b, 0x0d, 0x34, 0x25, 0x04,
- 0xe4, 0x04, 0xe4, 0x09, 0xe1, 0x17, 0xe5, 0x20, 0x05, 0xd5, 0x05, 0xf6,
- 0x20, 0x02, 0x17, 0x08, 0x20, 0x23, 0x09, 0x18, 0x1b, 0x20, 0x09, 0x03,
- 0x03, 0x23, 0x1e, 0x1c, 0x06, 0x15, 0x1c, 0x0b, 0x0b, 0x06, 0x07, 0x01,
- 0x06, 0x23, 0x1a, 0x19, 0x10, 0x0a, 0xd0, 0x25, 0x01, 0x90, 0x25, 0xa0,
- 0x25, 0x02, 0x25, 0x17, 0x17, 0x1a, 0x0e, 0x25, 0x90, 0x11, 0x01, 0x11,
- 0xb8, 0x01, 0x5d, 0xb5, 0x18, 0x25, 0x90, 0x1b, 0x01, 0x1b, 0xb8, 0x01,
- 0x5d, 0x40, 0x19, 0x00, 0x02, 0x33, 0x23, 0x25, 0x01, 0xd0, 0x00, 0x01,
- 0x90, 0x00, 0xa0, 0x00, 0x02, 0x1f, 0x00, 0x3f, 0x00, 0x4f, 0x00, 0x03,
- 0x00, 0x19, 0x24, 0x25, 0xb8, 0x01, 0x78, 0xb3, 0x21, 0x47, 0x50, 0x18,
- 0x2b, 0x2b, 0x4e, 0xf4, 0x5d, 0x71, 0x72, 0x3c, 0x4d, 0xfd, 0xe4, 0x10,
- 0xf4, 0x5d, 0xed, 0xf4, 0x5d, 0xfd, 0x4e, 0x45, 0x65, 0x44, 0xe6, 0x71,
- 0x72, 0x00, 0x3f, 0x3c, 0x3c, 0x3c, 0x3f, 0x3f, 0x3c, 0x4d, 0x10, 0xed,
- 0x10, 0xed, 0x11, 0x17, 0x39, 0x01, 0x11, 0x12, 0x39, 0x12, 0x39, 0x31,
- 0x30, 0x43, 0x79, 0x40, 0x0e, 0x0c, 0x14, 0x13, 0x26, 0x14, 0x0c, 0x11,
- 0x1b, 0x01, 0x12, 0x0d, 0x15, 0x1b, 0x01, 0x00, 0x2b, 0x01, 0x2b, 0x2b,
- 0x81, 0x01, 0x5d, 0x00, 0x5d, 0x2b, 0x33, 0x11, 0x33, 0x15, 0x3e, 0x01,
- 0x33, 0x32, 0x16, 0x17, 0x36, 0x33, 0x32, 0x16, 0x15, 0x11, 0x23, 0x11,
- 0x34, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x11, 0x23, 0x11, 0x34, 0x26,
- 0x23, 0x22, 0x0e, 0x01, 0x15, 0x11, 0x87, 0xa1, 0x32, 0xa6, 0x6a, 0x76,
- 0x97, 0x1f, 0x7e, 0xca, 0x9e, 0xaa, 0xb3, 0x23, 0x5c, 0x3e, 0x70, 0x94,
- 0xb4, 0x58, 0x64, 0x4c, 0x81, 0x3a, 0x04, 0x26, 0x95, 0x4e, 0x5f, 0x62,
- 0x58, 0xba, 0xaf, 0xb6, 0xfd, 0x27, 0x02, 0x9d, 0x6c, 0x5f, 0x3a, 0x95,
- 0xa4, 0xfd, 0x97, 0x02, 0xb2, 0x78, 0x78, 0x50, 0x9a, 0x91, 0xfd, 0xd9,
- 0x00, 0x01, 0x00, 0x87, 0x00, 0x00, 0x03, 0xe6, 0x04, 0x3e, 0x00, 0x16,
- 0x00, 0xcc, 0x40, 0x13, 0x05, 0x03, 0x06, 0x13, 0x02, 0xa8, 0x10, 0xb8,
- 0x10, 0xe3, 0x03, 0xe7, 0x13, 0xf0, 0x03, 0xf6, 0x13, 0x06, 0x04, 0xb8,
- 0xff, 0xf0, 0x40, 0x31, 0x0b, 0x0d, 0x34, 0x79, 0x10, 0x01, 0x98, 0x10,
- 0xd0, 0x18, 0xe0, 0x18, 0xff, 0x18, 0x04, 0x20, 0x08, 0x14, 0x0e, 0x14,
- 0x16, 0x12, 0x1c, 0x05, 0x07, 0x01, 0x06, 0x16, 0x0d, 0x0a, 0x0d, 0x0e,
- 0x0c, 0x0e, 0x24, 0x0b, 0x40, 0x33, 0x36, 0x34, 0xff, 0x0b, 0x01, 0xff,
- 0x0b, 0x01, 0x0b, 0x4e, 0x18, 0xb8, 0xff, 0xc0, 0x40, 0x1a, 0x34, 0x36,
- 0x34, 0xb0, 0x18, 0xf0, 0x18, 0x02, 0x70, 0x18, 0xa0, 0x18, 0xb0, 0x18,
- 0xc0, 0x18, 0x04, 0x18, 0x03, 0x02, 0x33, 0x15, 0x16, 0x25, 0x01, 0x00,
- 0xb8, 0xff, 0xc0, 0x40, 0x12, 0x33, 0x36, 0x34, 0xf0, 0x00, 0x01, 0x00,
- 0x00, 0x20, 0x00, 0xd0, 0x00, 0xe0, 0x00, 0x04, 0x00, 0x4e, 0x17, 0x10,
- 0xf6, 0x5d, 0x71, 0x2b, 0x3c, 0xfd, 0x3c, 0xf4, 0x3c, 0x10, 0x5d, 0x71,
- 0x2b, 0xf6, 0x5d, 0x71, 0x2b, 0xed, 0x3c, 0x10, 0x3c, 0x00, 0x3f, 0x3c,
- 0x3f, 0x3f, 0xed, 0x11, 0x39, 0x01, 0x12, 0x39, 0x31, 0x30, 0x43, 0x79,
- 0x40, 0x16, 0x06, 0x11, 0x09, 0x0a, 0x08, 0x0a, 0x07, 0x0a, 0x03, 0x06,
- 0x10, 0x26, 0x11, 0x06, 0x0e, 0x1b, 0x01, 0x0f, 0x0a, 0x12, 0x1b, 0x01,
- 0x00, 0x2b, 0x01, 0x2b, 0x2b, 0x2a, 0x81, 0x01, 0x5d, 0x71, 0x00, 0x2b,
- 0x5d, 0x71, 0x33, 0x11, 0x33, 0x15, 0x36, 0x33, 0x32, 0x1e, 0x01, 0x17,
- 0x16, 0x15, 0x11, 0x23, 0x11, 0x34, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15,
- 0x11, 0x87, 0xa2, 0x75, 0xdd, 0x60, 0xa1, 0x50, 0x10, 0x0a, 0xb4, 0x2a,
- 0x6b, 0x48, 0x73, 0xa7, 0x04, 0x26, 0x97, 0xaf, 0x45, 0x70, 0x4d, 0x32,
- 0x7d, 0xfd, 0x73, 0x02, 0x86, 0x6e, 0x6d, 0x41, 0x92, 0xcc, 0xfd, 0xbc,
- 0x00, 0x02, 0x00, 0x44, 0xff, 0xe8, 0x04, 0x27, 0x04, 0x3e, 0x00, 0x0d,
- 0x00, 0x19, 0x00, 0xc1, 0x40, 0x5d, 0x12, 0x07, 0x0a, 0x19, 0x0c, 0x47,
- 0x06, 0x48, 0x08, 0x56, 0x06, 0x59, 0x08, 0x67, 0x06, 0x69, 0x08, 0x08,
- 0x34, 0x10, 0x3a, 0x12, 0x3a, 0x16, 0x35, 0x18, 0x45, 0x10, 0x4b, 0x12,
- 0x4b, 0x16, 0x45, 0x18, 0x5c, 0x05, 0x5c, 0x09, 0x52, 0x10, 0x5d, 0x12,
- 0x5d, 0x16, 0x52, 0x18, 0x6d, 0x05, 0x6d, 0x09, 0x64, 0x10, 0x6d, 0x12,
- 0x6d, 0x16, 0x64, 0x18, 0x77, 0x01, 0x15, 0x09, 0x06, 0x05, 0x0d, 0x5b,
- 0x03, 0x54, 0x05, 0x54, 0x0a, 0x5b, 0x0c, 0x6c, 0x03, 0x65, 0x05, 0x65,
- 0x0a, 0x6c, 0x0c, 0x0a, 0x17, 0x1c, 0x04, 0x07, 0x11, 0x1c, 0x0b, 0x0b,
- 0x14, 0x24, 0x07, 0xb8, 0xff, 0xc0, 0x40, 0x13, 0x24, 0x25, 0x34, 0x30,
- 0x07, 0x01, 0x00, 0x07, 0x10, 0x07, 0x20, 0x07, 0x03, 0x07, 0x31, 0xdf,
- 0x1b, 0x01, 0x1b, 0xb8, 0xff, 0xc0, 0x40, 0x19, 0x1e, 0x23, 0x34, 0x30,
- 0x1b, 0x01, 0x1b, 0x0e, 0x24, 0x00, 0x40, 0x24, 0x25, 0x34, 0x1f, 0x00,
- 0x3f, 0x00, 0x02, 0x00, 0x31, 0x1a, 0x34, 0x37, 0x18, 0x2b, 0x10, 0xf6,
- 0x5d, 0x2b, 0xed, 0x10, 0x71, 0x2b, 0x5d, 0xf6, 0x5d, 0x5d, 0x2b, 0xed,
- 0x00, 0x3f, 0xed, 0x3f, 0xed, 0x31, 0x30, 0x01, 0x71, 0x5d, 0x00, 0x71,
- 0x43, 0x5c, 0x58, 0x40, 0x09, 0x53, 0x05, 0x53, 0x09, 0x62, 0x05, 0x62,
- 0x09, 0x04, 0x01, 0x5d, 0x59, 0x13, 0x10, 0x37, 0x36, 0x33, 0x32, 0x00,
- 0x15, 0x14, 0x0e, 0x01, 0x23, 0x22, 0x00, 0x13, 0x14, 0x16, 0x33, 0x32,
- 0x36, 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x44, 0xa4, 0x89, 0xc5, 0xdb,
- 0x01, 0x16, 0x7b, 0xeb, 0x8b, 0xdf, 0xfe, 0xed, 0xb9, 0xb2, 0x87, 0x86,
- 0xb2, 0xb3, 0x85, 0x87, 0xb2, 0x02, 0x13, 0x01, 0x27, 0x8e, 0x76, 0xfe,
- 0xe1, 0xfd, 0xcd, 0xeb, 0x82, 0x01, 0x1e, 0x01, 0x0d, 0xcc, 0xcb, 0xcc,
- 0xd1, 0xc5, 0xcb, 0xca, 0x00, 0x02, 0x00, 0x87, 0xfe, 0x69, 0x04, 0x21,
- 0x04, 0x3e, 0x00, 0x12, 0x00, 0x1e, 0x00, 0xcf, 0x40, 0xa5, 0x0c, 0x10,
- 0x2d, 0x10, 0x3d, 0x10, 0x4b, 0x10, 0x04, 0x3f, 0x20, 0xb0, 0x20, 0x02,
- 0x1f, 0x20, 0x29, 0x0c, 0x23, 0x1d, 0x32, 0x15, 0x32, 0x1d, 0x42, 0x1d,
- 0x70, 0x20, 0x90, 0x20, 0x08, 0x3a, 0x17, 0x3a, 0x1b, 0x4a, 0x17, 0x4a,
- 0x1b, 0x59, 0x08, 0x5b, 0x0c, 0x5c, 0x17, 0x5c, 0x1b, 0x6a, 0x08, 0x6b,
- 0x0c, 0x69, 0x10, 0x6d, 0x17, 0x6b, 0x1b, 0xc0, 0x20, 0xd3, 0x14, 0xdd,
- 0x18, 0xdd, 0x1a, 0xd3, 0x1e, 0xe4, 0x14, 0xe4, 0x1e, 0xe0, 0x20, 0xff,
- 0x20, 0x16, 0x23, 0x04, 0x2b, 0x10, 0x2b, 0x15, 0x35, 0x04, 0x3a, 0x10,
- 0x46, 0x04, 0x4a, 0x10, 0x5a, 0x10, 0xe5, 0x0b, 0xeb, 0x1d, 0xfe, 0x10,
- 0x0b, 0x11, 0x0e, 0x03, 0x16, 0x1c, 0x1c, 0x06, 0x07, 0x01, 0x06, 0x16,
- 0x1c, 0x0e, 0x0b, 0x00, 0x0e, 0x19, 0x24, 0xd0, 0x0a, 0x01, 0x10, 0x0a,
- 0x40, 0x0a, 0x60, 0x0a, 0x80, 0x0a, 0x04, 0x0a, 0x74, 0x01, 0x13, 0x33,
- 0x02, 0x33, 0x12, 0x25, 0x00, 0x00, 0xc0, 0x01, 0x01, 0x90, 0x01, 0xa0,
- 0x01, 0xb0, 0x01, 0xf0, 0x01, 0x04, 0x1f, 0x01, 0x3f, 0x01, 0x4f, 0x01,
- 0x03, 0x01, 0x19, 0x1f, 0x47, 0x37, 0x18, 0x01, 0x2b, 0x4e, 0x10, 0xf4,
- 0x5d, 0x71, 0x72, 0x3c, 0x4d, 0x10, 0xfd, 0xf4, 0xe4, 0x10, 0xfd, 0x5d,
- 0x71, 0xed, 0x00, 0x3f, 0x3f, 0xed, 0x3f, 0x3f, 0xed, 0x11, 0x39, 0x12,
- 0x39, 0x31, 0x30, 0x00, 0x5d, 0x01, 0x5d, 0x71, 0x72, 0x00, 0x71, 0x13,
- 0x11, 0x33, 0x15, 0x3e, 0x01, 0x33, 0x32, 0x1e, 0x01, 0x15, 0x14, 0x02,
- 0x06, 0x23, 0x22, 0x26, 0x27, 0x11, 0x03, 0x14, 0x16, 0x33, 0x32, 0x36,
- 0x35, 0x34, 0x26, 0x23, 0x22, 0x06, 0x87, 0xa4, 0x3a, 0x92, 0x68, 0x88,
- 0xd0, 0x6a, 0x75, 0xdf, 0x7b, 0x5a, 0x8f, 0x2e, 0x11, 0xa6, 0x76, 0x78,
- 0xab, 0xa7, 0x74, 0x73, 0xb1, 0xfe, 0x69, 0x05, 0xbd, 0x8a, 0x51, 0x51,
- 0x8c, 0xff, 0x98, 0xa3, 0xfe, 0xfb, 0x8b, 0x4c, 0x3a, 0xfd, 0xfb, 0x03,
- 0xa4, 0xcd, 0xc4, 0xcb, 0xd5, 0xcb, 0xca, 0xd7, 0x00, 0x02, 0x00, 0x48,
- 0xfe, 0x69, 0x03, 0xe0, 0x04, 0x3e, 0x00, 0x10, 0x00, 0x1c, 0x00, 0xbe,
- 0x40, 0x98, 0x0b, 0x02, 0x2b, 0x02, 0x2a, 0x18, 0x3b, 0x02, 0x4b, 0x02,
- 0x79, 0x0c, 0x06, 0x3f, 0x15, 0x3f, 0x19, 0x4b, 0x19, 0x90, 0x1e, 0xa0,
- 0x1e, 0x05, 0x34, 0x13, 0x34, 0x1b, 0x3f, 0x1e, 0x44, 0x13, 0x44, 0x1b,
- 0x53, 0x13, 0x53, 0x1b, 0x63, 0x13, 0x63, 0x1b, 0x60, 0x1e, 0x80, 0x1e,
- 0xd4, 0x06, 0xd5, 0x12, 0xe6, 0x06, 0xe9, 0x0c, 0xea, 0x18, 0x10, 0x29,
- 0x02, 0x22, 0x0c, 0x2b, 0x15, 0x39, 0x02, 0x35, 0x0c, 0x49, 0x02, 0x46,
- 0x0c, 0x5a, 0x02, 0x69, 0x02, 0xd9, 0x0c, 0xdb, 0x18, 0xe3, 0x16, 0xe9,
- 0x19, 0xe6, 0x1b, 0xfc, 0x02, 0x0f, 0x01, 0x04, 0x0d, 0x14, 0x1a, 0x1c,
- 0x0b, 0x07, 0x0e, 0x06, 0x14, 0x1c, 0x04, 0x0b, 0x00, 0x0e, 0x17, 0x0e,
- 0x33, 0x00, 0x25, 0x10, 0x10, 0xd0, 0x0f, 0x01, 0x10, 0x0f, 0x40, 0x0f,
- 0x60, 0x0f, 0x80, 0x0f, 0x04, 0x0f, 0x74, 0x11, 0x24, 0xbf, 0x07, 0xcf,
- 0x07, 0xdf, 0x07, 0xff, 0x07, 0x04, 0x1f, 0x07, 0x3f, 0x07, 0x4f, 0x07,
- 0x03, 0x07, 0x19, 0x1d, 0x1e, 0x74, 0x21, 0x34, 0x50, 0x18, 0x2b, 0x2b,
- 0x4e, 0xf4, 0x5d, 0x71, 0x4d, 0xed, 0xfd, 0x5d, 0x71, 0x3c, 0x10, 0xfd,
- 0xf4, 0x3c, 0x00, 0x3f, 0x3f, 0xed, 0x3f, 0x3f, 0xed, 0x11, 0x39, 0x12,
- 0x39, 0x31, 0x30, 0x00, 0x5d, 0x01, 0x5d, 0x71, 0x00, 0x71, 0x01, 0x11,
- 0x0e, 0x01, 0x23, 0x22, 0x00, 0x11, 0x34, 0x3e, 0x01, 0x33, 0x32, 0x17,
- 0x35, 0x33, 0x11, 0x01, 0x14, 0x16, 0x33, 0x32, 0x36, 0x35, 0x34, 0x26,
- 0x23, 0x22, 0x06, 0x03, 0x2c, 0x2a, 0x97, 0x55, 0xbd, 0xfe, 0xef, 0x6f,
- 0xd3, 0x7e, 0xc5, 0x71, 0xa2, 0xfd, 0x21, 0xac, 0x78, 0x73, 0xa6, 0xaf,
- 0x76, 0x75, 0xa3, 0xfe, 0x69, 0x02, 0x08, 0x3b, 0x4e, 0x01, 0x2e, 0x01,
- 0x07, 0xa0, 0xfe, 0x83, 0xa6, 0x8e, 0xfa, 0x43, 0x03, 0xad, 0xcd, 0xcd,
- 0xc3, 0xc7, 0xd4, 0xd6, 0xc7, 0x00, 0x00, 0x01, 0x00, 0x85, 0x00, 0x00,
- 0x02, 0xc6, 0x04, 0x3e, 0x00, 0x11, 0x00, 0x83, 0x40, 0x3b, 0x2f, 0x13,
- 0x01, 0x10, 0x04, 0x01, 0x23, 0x04, 0x34, 0x04, 0x43, 0x04, 0x53, 0x04,
- 0x66, 0x04, 0x74, 0x04, 0x06, 0x09, 0x11, 0x08, 0x09, 0x08, 0x09, 0x0d,
- 0x13, 0x11, 0x09, 0x0d, 0x00, 0x03, 0x08, 0x01, 0x0b, 0x1c, 0x06, 0x07,
- 0x01, 0x06, 0x00, 0x0a, 0x09, 0x28, 0x90, 0x08, 0x01, 0x08, 0x22, 0x20,
- 0x13, 0x01, 0x13, 0x02, 0x22, 0x11, 0x25, 0x01, 0x00, 0xb8, 0xff, 0xc0,
- 0x40, 0x15, 0x33, 0x36, 0x34, 0xf0, 0x00, 0x01, 0x00, 0x00, 0x20, 0x00,
- 0xd0, 0x00, 0xe0, 0x00, 0x04, 0x00, 0x4e, 0x12, 0x47, 0xc4, 0x18, 0x2b,
- 0x10, 0xf6, 0x5d, 0x71, 0x2b, 0x3c, 0xfd, 0xe4, 0x10, 0x5d, 0xf4, 0x72,
- 0xe4, 0x00, 0x3f, 0x3f, 0x3f, 0xed, 0x11, 0x39, 0x39, 0x11, 0x39, 0x39,
- 0x01, 0x11, 0x12, 0x39, 0x39, 0x00, 0x10, 0xc9, 0x87, 0x0e, 0x7d, 0xc4,
- 0x31, 0x30, 0x00, 0x5d, 0x72, 0x01, 0x5d, 0x33, 0x11, 0x33, 0x15, 0x3e,
- 0x01, 0x33, 0x32, 0x17, 0x07, 0x26, 0x23, 0x22, 0x06, 0x07, 0x06, 0x15,
- 0x11, 0x85, 0xa2, 0x3e, 0x69, 0x3f, 0x5b, 0x5e, 0x3e, 0x42, 0x42, 0x3b,
- 0x5e, 0x14, 0x1e, 0x04, 0x26, 0xa1, 0x71, 0x48, 0x3a, 0xa7, 0x27, 0x47,
- 0x3f, 0x60, 0x72, 0xfd, 0xd4, 0x00, 0x00, 0x01, 0x00, 0x3f, 0xff, 0xe8,
- 0x03, 0xb1, 0x04, 0x3e, 0x00, 0x30, 0x01, 0xd9, 0x40, 0x7b, 0x04, 0x22,
- 0x14, 0x22, 0x3a, 0x09, 0x4a, 0x09, 0x44, 0x24, 0x56, 0x22, 0x65, 0x22,
- 0x7c, 0x09, 0x8e, 0x09, 0x84, 0x24, 0xa6, 0x13, 0xab, 0x2c, 0xc2, 0x03,
- 0x0d, 0x09, 0x17, 0x1a, 0x18, 0x17, 0x30, 0x4b, 0x2c, 0xd6, 0x17, 0x05,
- 0x1b, 0x02, 0x55, 0x02, 0x02, 0x10, 0x32, 0x01, 0x0a, 0x18, 0x5c, 0x08,
- 0x5c, 0x09, 0x5c, 0x0a, 0x5c, 0x0b, 0x5c, 0x0c, 0x5c, 0x0d, 0x6a, 0x08,
- 0x6a, 0x09, 0x6a, 0x0a, 0x6a, 0x0b, 0x6a, 0x0c, 0x6a, 0x0d, 0xb4, 0x26,
- 0xb4, 0x27, 0x0f, 0x27, 0x26, 0x24, 0x27, 0x24, 0x29, 0x36, 0x24, 0x5a,
- 0x0a, 0x59, 0x0b, 0x64, 0x26, 0x64, 0x28, 0x74, 0x23, 0x74, 0x24, 0x80,
- 0x24, 0x93, 0x0a, 0x9c, 0x0c, 0x92, 0x28, 0x97, 0x2c, 0x95, 0x30, 0xa4,
- 0x0a, 0xa9, 0x0c, 0xa3, 0x27, 0xa4, 0x28, 0xb3, 0x26, 0xc5, 0x26, 0x16,
- 0x1d, 0xb8, 0xff, 0xde, 0x40, 0x12, 0x1e, 0x39, 0x5a, 0x08, 0x27, 0x25,
- 0x0c, 0x0a, 0x04, 0x1a, 0x20, 0x26, 0x15, 0x04, 0x0b, 0x2e, 0x1d, 0x1a,
- 0xb8, 0x02, 0xaa, 0x40, 0x1c, 0x1f, 0x19, 0x3f, 0x19, 0x4f, 0x19, 0x5f,
- 0x19, 0xaf, 0x19, 0xcf, 0x19, 0x06, 0x0f, 0x19, 0x1f, 0x19, 0x6f, 0x19,
- 0xdf, 0x19, 0x04, 0x1f, 0x19, 0x8f, 0x19, 0x02, 0x19, 0xbb, 0x02, 0x55,
- 0x00, 0x15, 0x00, 0x00, 0x02, 0xaa, 0x40, 0x10, 0x10, 0x01, 0x40, 0x01,
- 0x02, 0x10, 0x01, 0xd0, 0x01, 0x02, 0x00, 0x01, 0x10, 0x01, 0x02, 0x01,
- 0xb8, 0xff, 0xc0, 0xb3, 0x14, 0x16, 0x34, 0x01, 0xb8, 0xff, 0xc0, 0x40,
- 0x1e, 0x0e, 0x11, 0x34, 0x01, 0x01, 0x2e, 0x5c, 0x1d, 0x6c, 0x1d, 0x02,
- 0x1d, 0x1c, 0x15, 0x07, 0x04, 0x1c, 0x2e, 0x0b, 0x1f, 0x1a, 0x01, 0x1a,
- 0x24, 0x19, 0x40, 0x13, 0x18, 0x34, 0x19, 0xb8, 0x02, 0x5b, 0xb2, 0x07,
- 0x24, 0x2a, 0xb8, 0xff, 0xc0, 0xb7, 0x1c, 0x39, 0xd0, 0x2a, 0x01, 0x2a,
- 0x1a, 0x32, 0xb8, 0xff, 0xc0, 0x40, 0x26, 0x27, 0x2a, 0x34, 0x60, 0x32,
- 0xc0, 0x32, 0x02, 0x3f, 0x32, 0x80, 0x32, 0x02, 0x32, 0x10, 0x01, 0x01,
- 0x01, 0x24, 0x00, 0x20, 0x24, 0x0f, 0x22, 0xdf, 0x00, 0x01, 0x3f, 0x00,
- 0x4f, 0x00, 0x02, 0x00, 0x19, 0x31, 0x34, 0x37, 0x18, 0x2b, 0x4e, 0x10,
- 0xf4, 0x5d, 0x71, 0x4d, 0xf4, 0xed, 0x10, 0xed, 0x72, 0x4e, 0x10, 0x5d,
- 0x71, 0x2b, 0xf6, 0x71, 0x2b, 0x4d, 0xed, 0xf4, 0x2b, 0xed, 0x72, 0x00,
- 0x3f, 0xed, 0x3f, 0xed, 0x71, 0x12, 0x39, 0x2f, 0x2b, 0x2b, 0x5d, 0x71,
- 0x72, 0xe4, 0x10, 0xfd, 0x5d, 0x71, 0x72, 0xe4, 0x11, 0x12, 0x39, 0x11,
- 0x12, 0x39, 0x01, 0x11, 0x12, 0x17, 0x39, 0x31, 0x30, 0x43, 0x79, 0x40,
- 0x40, 0x27, 0x2d, 0x1e, 0x23, 0x05, 0x14, 0x2c, 0x26, 0x11, 0x10, 0x12,
- 0x10, 0x13, 0x10, 0x03, 0x06, 0x22, 0x0d, 0x20, 0x1b, 0x00, 0x09, 0x28,
- 0x07, 0x1b, 0x01, 0x05, 0x2d, 0x07, 0x1b, 0x01, 0x1e, 0x14, 0x20, 0x1b,
- 0x00, 0x21, 0x0e, 0x23, 0x1b, 0x00, 0x22, 0x23, 0x0d, 0x0c, 0x08, 0x29,
- 0x0a, 0x1b, 0x01, 0x28, 0x27, 0x09, 0x0a, 0x06, 0x2b, 0x04, 0x1b, 0x00,
- 0x1f, 0x10, 0x1d, 0x1b, 0x01, 0x00, 0x2b, 0x2b, 0x10, 0x3c, 0x10, 0x3c,
- 0x2b, 0x10, 0x3c, 0x10, 0x3c, 0x2b, 0x01, 0x2b, 0x2b, 0x2b, 0x2b, 0x2a,
- 0x2b, 0x81, 0x81, 0x81, 0x00, 0x2b, 0x5d, 0x71, 0x01, 0x5d, 0x72, 0x71,
- 0x5d, 0x13, 0x37, 0x1e, 0x01, 0x33, 0x32, 0x36, 0x35, 0x34, 0x27, 0x26,
- 0x27, 0x2e, 0x02, 0x35, 0x34, 0x36, 0x37, 0x3e, 0x01, 0x33, 0x32, 0x1e,
- 0x01, 0x17, 0x07, 0x2e, 0x01, 0x23, 0x22, 0x06, 0x15, 0x14, 0x17, 0x16,
- 0x17, 0x16, 0x17, 0x1e, 0x02, 0x15, 0x14, 0x0e, 0x01, 0x23, 0x22, 0x26,
- 0x3f, 0xb2, 0x0f, 0x89, 0x7b, 0x7c, 0x78, 0x35, 0x25, 0x93, 0xc6, 0x99,
- 0x4f, 0x41, 0x38, 0x2a, 0x91, 0x53, 0x7d, 0xbd, 0x5a, 0x11, 0xb0, 0x0c,
- 0x73, 0x69, 0x7c, 0x6a, 0x16, 0x16, 0x2f, 0x1b, 0x84, 0xbf, 0x97, 0x56,
- 0x69, 0xc6, 0x7d, 0xcf, 0xd9, 0x01, 0x3d, 0x1c, 0x6b, 0x72, 0x65, 0x44,
- 0x3d, 0x23, 0x18, 0x25, 0x32, 0x49, 0x81, 0x4e, 0x47, 0x79, 0x28, 0x1f,
- 0x2b, 0x48, 0x7b, 0x67, 0x18, 0x52, 0x5c, 0x52, 0x37, 0x23, 0x1c, 0x1d,
- 0x13, 0x0a, 0x24, 0x33, 0x41, 0x7c, 0x5c, 0x5a, 0x9f, 0x57, 0xac, 0x00,
- 0x00, 0x01, 0x00, 0x24, 0xff, 0xf2, 0x02, 0x2a, 0x05, 0x99, 0x00, 0x17,
- 0x00, 0x80, 0xb9, 0x00, 0x0a, 0xff, 0xc0, 0xb3, 0x23, 0x26, 0x34, 0x09,
- 0xb8, 0xff, 0xc0, 0x40, 0x41, 0x23, 0x26, 0x34, 0x80, 0x19, 0x01, 0x00,
- 0x01, 0x0c, 0x0d, 0x0a, 0x01, 0x03, 0x00, 0x16, 0x10, 0x09, 0x2b, 0x0f,
- 0x0a, 0x06, 0x16, 0x1c, 0x03, 0x0b, 0x0f, 0x10, 0x22, 0x00, 0x22, 0x01,
- 0x0d, 0x12, 0x25, 0x0c, 0x01, 0xff, 0x07, 0x08, 0x45, 0x09, 0x45, 0x60,
- 0x07, 0x70, 0x07, 0x80, 0x07, 0x90, 0x07, 0x04, 0x00, 0x07, 0x20, 0x07,
- 0xa0, 0x07, 0xb0, 0x07, 0xc0, 0x07, 0xd0, 0x07, 0x06, 0x07, 0xba, 0x02,
- 0x6a, 0x00, 0x18, 0x01, 0x36, 0xb1, 0x66, 0x18, 0x2b, 0x10, 0xf6, 0x5d,
- 0x71, 0xf4, 0xe4, 0x10, 0xed, 0x3c, 0xfd, 0x3c, 0x10, 0xe4, 0xf4, 0x3c,
- 0x00, 0x3f, 0xed, 0x3f, 0x3c, 0xfd, 0x3c, 0x11, 0x39, 0x12, 0x39, 0x11,
- 0x33, 0x33, 0x10, 0xc9, 0x31, 0x30, 0x01, 0x5d, 0x2b, 0x2b, 0x25, 0x17,
- 0x06, 0x23, 0x22, 0x2e, 0x01, 0x35, 0x11, 0x23, 0x35, 0x33, 0x11, 0x37,
- 0x11, 0x33, 0x15, 0x23, 0x11, 0x14, 0x1e, 0x01, 0x33, 0x32, 0x02, 0x10,
- 0x1a, 0x4c, 0x3c, 0x62, 0x6c, 0x2c, 0x84, 0x84, 0xb3, 0xb5, 0xb5, 0x13,
- 0x2b, 0x28, 0x1e, 0xa1, 0x9f, 0x10, 0x3e, 0x65, 0xa2, 0x02, 0x63, 0x8c,
- 0x01, 0x07, 0x6c, 0xfe, 0x8d, 0x8c, 0xfd, 0x93, 0x4d, 0x2c, 0x1a, 0x00,
- 0x00, 0x01, 0x00, 0x83, 0xff, 0xe8, 0x03, 0xe0, 0x04, 0x26, 0x00, 0x18,
- 0x00, 0xbd, 0xb9, 0x00, 0x1a, 0xff, 0xc0, 0x40, 0x09, 0x15, 0x17, 0x34,
- 0x02, 0x20, 0x13, 0x16, 0x34, 0x0f, 0xb8, 0xff, 0xf0, 0x40, 0x29, 0x12,
- 0x14, 0x34, 0x2b, 0x13, 0x01, 0x24, 0x08, 0x13, 0x16, 0x0c, 0x01, 0x13,
- 0x16, 0x0b, 0x06, 0x00, 0x0a, 0x11, 0x1c, 0x03, 0x0b, 0x00, 0x33, 0x16,
- 0x25, 0x18, 0x17, 0x40, 0x33, 0x36, 0x34, 0xff, 0x17, 0x01, 0xc0, 0x17,
- 0x01, 0x17, 0x4e, 0x1a, 0xb8, 0xff, 0xc0, 0x40, 0x15, 0x34, 0x36, 0x34,
- 0xb0, 0x1a, 0xf0, 0x1a, 0x02, 0x70, 0x1a, 0xa0, 0x1a, 0xb0, 0x1a, 0xff,
- 0x1a, 0x04, 0x1a, 0x0c, 0x25, 0x09, 0xb8, 0xff, 0xc0, 0x40, 0x15, 0x33,
- 0x36, 0x34, 0xf0, 0x09, 0x01, 0x00, 0x09, 0x20, 0x09, 0xd0, 0x09, 0xe0,
- 0x09, 0x04, 0x09, 0x4e, 0x19, 0x47, 0x50, 0x18, 0x2b, 0x10, 0xf6, 0x5d,
- 0x71, 0x2b, 0xed, 0x10, 0x5d, 0x71, 0x2b, 0xf6, 0x5d, 0x71, 0x2b, 0x3c,
- 0xfd, 0xe4, 0x00, 0x3f, 0xed, 0x3f, 0x3f, 0x3c, 0x39, 0x39, 0x01, 0x11,
- 0x12, 0x39, 0x31, 0x30, 0x43, 0x79, 0x40, 0x1a, 0x04, 0x10, 0x0e, 0x0d,
- 0x0f, 0x0d, 0x02, 0x06, 0x07, 0x08, 0x06, 0x08, 0x05, 0x08, 0x03, 0x06,
- 0x10, 0x04, 0x0c, 0x1b, 0x00, 0x0d, 0x08, 0x11, 0x1b, 0x00, 0x00, 0x2b,
- 0x01, 0x2b, 0x2a, 0x2a, 0x81, 0x00, 0x5d, 0x01, 0x2b, 0x2b, 0x2b, 0x21,
- 0x35, 0x06, 0x23, 0x22, 0x2e, 0x01, 0x27, 0x26, 0x35, 0x11, 0x33, 0x11,
- 0x14, 0x17, 0x1e, 0x01, 0x33, 0x32, 0x3e, 0x01, 0x35, 0x11, 0x33, 0x11,
- 0x03, 0x3f, 0x7c, 0xd5, 0x5e, 0xa3, 0x4f, 0x10, 0x0b, 0xb4, 0x0b, 0x11,
- 0x6e, 0x51, 0x51, 0x8e, 0x3b, 0xb4, 0x9c, 0xb4, 0x48, 0x6d, 0x4f, 0x35,
- 0x73, 0x02, 0x92, 0xfd, 0xb3, 0x8d, 0x31, 0x47, 0x51, 0x53, 0x8f, 0x88,
- 0x02, 0x39, 0xfb, 0xda, 0x00, 0x01, 0x00, 0x1a, 0x00, 0x00, 0x03, 0xe8,
- 0x04, 0x26, 0x00, 0x0a, 0x01, 0x5e, 0xb7, 0x35, 0x05, 0x01, 0x00, 0x22,
- 0x11, 0x39, 0x0a, 0xb8, 0xff, 0xde, 0x40, 0x0d, 0x11, 0x39, 0x09, 0x16,
- 0x12, 0x1c, 0x34, 0x08, 0x16, 0x12, 0x1c, 0x34, 0x02, 0xb8, 0xff, 0xea,
- 0xb3, 0x12, 0x1c, 0x34, 0x01, 0xb8, 0xff, 0xea, 0xb3, 0x12, 0x1c, 0x34,
- 0x0a, 0xb8, 0xff, 0xd8, 0x40, 0x09, 0x1e, 0x21, 0x34, 0x00, 0x28, 0x1e,
- 0x21, 0x34, 0x0a, 0xb8, 0xff, 0xe8, 0x40, 0x09, 0x22, 0x25, 0x34, 0x00,
- 0x16, 0x22, 0x25, 0x34, 0x0a, 0xb8, 0xff, 0xda, 0x40, 0xb5, 0x28, 0x2e,
- 0x34, 0x00, 0x20, 0x28, 0x2e, 0x34, 0x0f, 0x0c, 0x29, 0x00, 0x28, 0x09,
- 0x26, 0x0a, 0x39, 0x00, 0x35, 0x0a, 0x48, 0x00, 0x47, 0x0a, 0x56, 0x01,
- 0x56, 0x02, 0x59, 0x08, 0x58, 0x09, 0x66, 0x01, 0x66, 0x02, 0x69, 0x08,
- 0x69, 0x09, 0x78, 0x00, 0x77, 0x01, 0x77, 0x02, 0x79, 0x08, 0x78, 0x09,
- 0x77, 0x0a, 0x87, 0x01, 0x87, 0x02, 0x86, 0x03, 0x89, 0x07, 0x88, 0x08,
- 0x8a, 0x09, 0x9d, 0x00, 0x98, 0x09, 0x91, 0x0a, 0xac, 0x00, 0xa2, 0x0a,
- 0xbd, 0x00, 0xb7, 0x07, 0xb1, 0x0a, 0xc9, 0x00, 0xc5, 0x0a, 0xda, 0x00,
- 0xd5, 0x0a, 0xec, 0x00, 0xe3, 0x0a, 0xfb, 0x00, 0xf4, 0x0a, 0x2c, 0x0a,
- 0x00, 0x05, 0x0a, 0x18, 0x00, 0x16, 0x0a, 0x28, 0x00, 0x26, 0x0a, 0x37,
- 0x0a, 0x4f, 0x00, 0x40, 0x0a, 0x09, 0x05, 0x40, 0x12, 0x16, 0x34, 0x05,
- 0x40, 0x0b, 0x0d, 0x34, 0x0a, 0x07, 0x08, 0x08, 0x25, 0x09, 0x0a, 0x14,
- 0x09, 0x09, 0x0a, 0x00, 0x03, 0x02, 0x02, 0x25, 0x01, 0x00, 0x14, 0x01,
- 0x01, 0x00, 0x05, 0x0a, 0x0a, 0x00, 0x0a, 0x09, 0x08, 0x08, 0x02, 0x02,
- 0x01, 0x06, 0x07, 0x0a, 0x09, 0x03, 0x00, 0x01, 0x05, 0x2f, 0x0c, 0x01,
- 0x0c, 0x22, 0x08, 0x40, 0x40, 0x40, 0x09, 0x80, 0x09, 0x02, 0x09, 0xb8,
- 0x01, 0x1b, 0xb5, 0x40, 0x05, 0x80, 0x05, 0x02, 0x05, 0xb8, 0x01, 0x1b,
- 0x40, 0x09, 0x20, 0x02, 0x40, 0x01, 0x22, 0x0b, 0xea, 0xd2, 0x18, 0x2b,
- 0x10, 0xf6, 0xed, 0x1a, 0x19, 0xfd, 0x5d, 0xfd, 0x5d, 0x1a, 0x18, 0xed,
- 0xe4, 0x5d, 0x11, 0x12, 0x39, 0x39, 0x12, 0x39, 0x39, 0x00, 0x3f, 0x3c,
- 0x10, 0x3c, 0x10, 0x3c, 0x3f, 0x3c, 0x11, 0x39, 0x87, 0x05, 0x2e, 0x2b,
- 0x87, 0x7d, 0xc4, 0x87, 0x2e, 0x18, 0x2b, 0x87, 0x7d, 0xc4, 0x31, 0x30,
- 0x00, 0x2b, 0x2b, 0x01, 0x71, 0x5d, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b,
- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x00, 0x5d, 0x21, 0x01, 0x33, 0x13,
- 0x16, 0x17, 0x36, 0x37, 0x13, 0x33, 0x01, 0x01, 0xae, 0xfe, 0x6c, 0xbe,
- 0xe4, 0x25, 0x1f, 0x18, 0x2b, 0xec, 0xb9, 0xfe, 0x6e, 0x04, 0x26, 0xfd,
- 0x84, 0x67, 0x6f, 0x54, 0x76, 0x02, 0x88, 0xfb, 0xda, 0x00, 0x00, 0x01,
- 0x00, 0x06, 0x00, 0x00, 0x05, 0xb7, 0x04, 0x26, 0x00, 0x12, 0x02, 0xb1,
- 0x40, 0x10, 0x0f, 0x14, 0x01, 0x2a, 0x04, 0x29, 0x0a, 0x02, 0x4a, 0x11,
- 0x5b, 0x11, 0x8e, 0x11, 0x03, 0x11, 0xb8, 0xff, 0xf0, 0x40, 0x09, 0x1f,
- 0x21, 0x34, 0x10, 0x1c, 0x1d, 0x27, 0x34, 0x09, 0xb8, 0xff, 0xf0, 0x40,
- 0xad, 0x1f, 0x24, 0x34, 0x04, 0x06, 0x0c, 0x09, 0x13, 0x06, 0x1b, 0x09,
- 0x19, 0x12, 0x05, 0x04, 0x00, 0x04, 0x06, 0x0b, 0x09, 0x0b, 0x0e, 0x08,
- 0x12, 0x10, 0x00, 0x13, 0x03, 0x14, 0x07, 0x1c, 0x08, 0x1b, 0x0b, 0x1d,
- 0x0e, 0x24, 0x00, 0x25, 0x07, 0x2a, 0x08, 0x2b, 0x0e, 0x34, 0x00, 0x35,
- 0x07, 0x3a, 0x08, 0x3b, 0x0e, 0x44, 0x03, 0x47, 0x06, 0x40, 0x07, 0x4d,
- 0x08, 0x4b, 0x0b, 0x43, 0x0f, 0x47, 0x11, 0x4a, 0x12, 0x5b, 0x0f, 0x52,
- 0x12, 0x6b, 0x07, 0x64, 0x08, 0x67, 0x12, 0x79, 0x06, 0x7a, 0x07, 0x74,
- 0x08, 0xb9, 0x06, 0xba, 0x0f, 0xb6, 0x12, 0xf5, 0x06, 0xfb, 0x09, 0x28,
- 0x0b, 0x11, 0x28, 0x00, 0x28, 0x0d, 0x27, 0x0e, 0x28, 0x0f, 0x27, 0x12,
- 0x2f, 0x14, 0x38, 0x00, 0x37, 0x12, 0x77, 0x08, 0x86, 0x08, 0x98, 0x03,
- 0x97, 0x0c, 0xa7, 0x01, 0xa8, 0x02, 0xa8, 0x0b, 0xa6, 0x0c, 0xb5, 0x00,
- 0xb6, 0x06, 0xba, 0x0e, 0xc8, 0x04, 0xd6, 0x06, 0xd9, 0x09, 0xe8, 0x04,
- 0xe8, 0x0f, 0xe7, 0x12, 0xf4, 0x06, 0xfa, 0x09, 0x1c, 0x12, 0x03, 0x05,
- 0x05, 0x02, 0x06, 0x07, 0x07, 0x05, 0x09, 0x0a, 0x0a, 0x08, 0x0b, 0x0c,
- 0x0c, 0x0a, 0x10, 0x11, 0x11, 0x0f, 0xb8, 0xff, 0x4b, 0xb3, 0x05, 0x00,
- 0x12, 0x20, 0xb8, 0xff, 0x49, 0x40, 0x66, 0x0a, 0x0f, 0x0e, 0x20, 0xc3,
- 0x11, 0x07, 0x08, 0x20, 0x07, 0x11, 0x12, 0x12, 0x2b, 0x05, 0x07, 0x14,
- 0x05, 0x05, 0x07, 0x0e, 0x0a, 0x0c, 0x0c, 0x25, 0x0d, 0x0e, 0x14, 0x0d,
- 0x0d, 0x0e, 0x08, 0x11, 0x0f, 0x0f, 0x2b, 0x0a, 0x08, 0x14, 0x0a, 0x0a,
- 0x08, 0x00, 0x05, 0x02, 0x02, 0x25, 0x01, 0x00, 0x14, 0x01, 0x01, 0x00,
- 0x00, 0x02, 0x01, 0x07, 0x12, 0x04, 0x08, 0x0f, 0x11, 0x0c, 0x0e, 0x0d,
- 0x0a, 0x11, 0x0a, 0x04, 0x03, 0x12, 0x0d, 0x0c, 0x0c, 0x08, 0x08, 0x07,
- 0x07, 0x02, 0x02, 0x01, 0x06, 0x12, 0x0f, 0x0f, 0x0e, 0x0e, 0x00, 0x0a,
- 0x14, 0xf6, 0x10, 0x0d, 0x01, 0x60, 0x0d, 0x70, 0x0d, 0x80, 0x0d, 0x03,
- 0x0d, 0xb8, 0x01, 0xa7, 0x40, 0x0a, 0x20, 0x4f, 0x0a, 0x01, 0x6f, 0x0a,
- 0x7f, 0x0a, 0x02, 0x0a, 0xb8, 0x02, 0x55, 0x40, 0x09, 0x4f, 0x11, 0x01,
- 0x6f, 0x11, 0x7f, 0x11, 0x02, 0x11, 0xb8, 0x02, 0x55, 0x40, 0x0b, 0x10,
- 0x05, 0x01, 0x60, 0x05, 0x70, 0x05, 0x80, 0x05, 0x03, 0x05, 0xb8, 0x01,
- 0xa7, 0xb5, 0x01, 0xf6, 0x13, 0xf6, 0x66, 0x18, 0x2b, 0x4e, 0x10, 0xf4,
- 0x19, 0x4d, 0xf4, 0x5d, 0x5d, 0x18, 0xfd, 0x5d, 0x71, 0xfd, 0x5d, 0x71,
- 0x1a, 0x19, 0xfd, 0x5d, 0x5d, 0x18, 0xe6, 0x00, 0x3f, 0x3c, 0x10, 0x3c,
- 0x10, 0x3c, 0x3f, 0x3c, 0x10, 0x3c, 0x10, 0x3c, 0x10, 0x3c, 0x10, 0x3c,
- 0x12, 0x17, 0x39, 0x01, 0x11, 0x12, 0x39, 0x39, 0x12, 0x39, 0x39, 0x11,
- 0x39, 0x39, 0x12, 0x39, 0x39, 0x87, 0x4d, 0x2e, 0x2b, 0x87, 0x7d, 0xc4,
- 0x87, 0x2e, 0x18, 0x2b, 0x87, 0x7d, 0xc4, 0x87, 0x2e, 0x18, 0x2b, 0x87,
- 0x7d, 0xc4, 0x87, 0x2e, 0x18, 0x2b, 0x87, 0x7d, 0xc4, 0x2b, 0x2b, 0x2b,
- 0x87, 0x0e, 0x10, 0xc4, 0x07, 0x0e, 0x10, 0x3c, 0x07, 0x0e, 0x10, 0x3c,
- 0x87, 0x0e, 0x10, 0xc4, 0x87, 0x0e, 0x10, 0xc4, 0x4b, 0xb0, 0x1f, 0x53,
- 0x58, 0xb4, 0x0d, 0x20, 0x0c, 0x20, 0x02, 0xbc, 0xff, 0xe0, 0x00, 0x01,
- 0xff, 0xe0, 0x00, 0x0e, 0xff, 0xd0, 0xb4, 0x00, 0x30, 0x0f, 0x20, 0x12,
- 0xb8, 0xff, 0xe0, 0x01, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38,
- 0x59, 0x4b, 0xb0, 0x34, 0x53, 0x58, 0xb9, 0x00, 0x08, 0xff, 0xd0, 0xb1,
- 0x07, 0x30, 0x01, 0x38, 0x38, 0x59, 0x4b, 0xb0, 0x21, 0x53, 0x4b, 0xb0,
- 0x33, 0x51, 0x5a, 0x58, 0xb9, 0x00, 0x08, 0xff, 0xe0, 0xb1, 0x07, 0x20,
- 0x01, 0x38, 0x38, 0x59, 0x4b, 0xb0, 0x12, 0x53, 0x4b, 0xb0, 0x1e, 0x51,
- 0x5a, 0x58, 0xb9, 0x00, 0x0e, 0xff, 0xd0, 0xb6, 0x0f, 0x20, 0x0d, 0x20,
- 0x0c, 0x20, 0x08, 0xb8, 0xff, 0xd0, 0xb2, 0x07, 0x30, 0x12, 0xb8, 0xff,
- 0xe0, 0xb2, 0x00, 0x38, 0x02, 0xba, 0xff, 0xe0, 0x00, 0x01, 0xff, 0xe0,
- 0x01, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x59,
- 0x4b, 0xb0, 0x12, 0x53, 0x4b, 0xb0, 0x17, 0x51, 0x5a, 0x58, 0xb9, 0x00,
- 0x11, 0xff, 0xe0, 0xb3, 0x0a, 0x20, 0x04, 0x20, 0x00, 0x38, 0x38, 0x38,
- 0x59, 0x31, 0x30, 0x01, 0x43, 0x5c, 0x58, 0xb9, 0x00, 0x0e, 0xff, 0xd4,
- 0xb6, 0x12, 0x39, 0x00, 0x2c, 0x12, 0x39, 0x00, 0xb8, 0xff, 0xd4, 0xb1,
- 0x13, 0x39, 0x2b, 0x2b, 0x2b, 0x59, 0x5d, 0x71, 0x72, 0x2b, 0x2b, 0x2b,
- 0x00, 0x71, 0x5d, 0x01, 0x5d, 0x21, 0x01, 0x33, 0x13, 0x17, 0x36, 0x37,
- 0x13, 0x33, 0x13, 0x17, 0x37, 0x13, 0x33, 0x01, 0x23, 0x03, 0x27, 0x03,
- 0x01, 0x4b, 0xfe, 0xbb, 0xba, 0xa9, 0x3f, 0x04, 0x33, 0xa9, 0xb9, 0x9f,
- 0x35, 0x3d, 0xb6, 0xaf, 0xfe, 0xb4, 0xbb, 0xa9, 0x29, 0xd7, 0x04, 0x26,
- 0xfd, 0x9b, 0xe4, 0x11, 0xca, 0x02, 0x6e, 0xfd, 0x98, 0xcb, 0xcd, 0x02,
- 0x66, 0xfb, 0xda, 0x02, 0x7c, 0xb5, 0xfc, 0xcf, 0x00, 0x01, 0x00, 0x0f,
- 0x00, 0x00, 0x03, 0xf1, 0x04, 0x26, 0x00, 0x10, 0x01, 0x77, 0xb7, 0x0f,
- 0x12, 0x01, 0x0f, 0x22, 0x19, 0x39, 0x06, 0xb8, 0xff, 0xde, 0x40, 0xb6,
- 0x19, 0x39, 0x5a, 0x0f, 0x96, 0x04, 0x96, 0x08, 0x99, 0x0e, 0x9a, 0x0f,
- 0xc0, 0x05, 0xc0, 0x06, 0xc0, 0x07, 0xcb, 0x0f, 0x09, 0x0f, 0x40, 0x16,
- 0x39, 0x1a, 0x03, 0x13, 0x09, 0x15, 0x0d, 0x1a, 0x10, 0x35, 0x01, 0x3a,
- 0x0b, 0x81, 0x01, 0x8e, 0x0b, 0x08, 0x2f, 0x12, 0x57, 0x04, 0x59, 0x07,
- 0x59, 0x0b, 0x58, 0x0e, 0x97, 0x01, 0x98, 0x0a, 0x98, 0x0b, 0xb7, 0x02,
- 0xb8, 0x0c, 0xc8, 0x0b, 0xca, 0x0e, 0xcc, 0x10, 0xda, 0x03, 0xd5, 0x09,
- 0xd1, 0x0d, 0xdb, 0x10, 0xe5, 0x0a, 0x12, 0x12, 0x06, 0x06, 0x03, 0x07,
- 0x08, 0x09, 0x09, 0x01, 0x06, 0x06, 0x09, 0x05, 0x04, 0x03, 0x03, 0x0b,
- 0x0f, 0x0f, 0x10, 0x0e, 0x0d, 0x0d, 0x01, 0x0f, 0x0f, 0x0d, 0x10, 0x0b,
- 0x01, 0x00, 0x09, 0x02, 0x0d, 0x0b, 0x03, 0x0c, 0x10, 0x0a, 0x06, 0x0f,
- 0x02, 0x0f, 0x0a, 0x10, 0xc6, 0x00, 0xc6, 0x09, 0x02, 0x10, 0x25, 0x00,
- 0x09, 0x14, 0x00, 0x00, 0x09, 0x03, 0x02, 0x0d, 0xc6, 0x0d, 0x01, 0x0d,
- 0x25, 0x0c, 0x03, 0x14, 0x0c, 0x0c, 0x03, 0x0a, 0x09, 0x09, 0x03, 0x03,
- 0x02, 0x06, 0x10, 0x0d, 0x0d, 0x0c, 0x0c, 0x00, 0x0a, 0x4f, 0x12, 0x01,
- 0x12, 0x49, 0x0d, 0x7e, 0x0c, 0x22, 0x0a, 0x0f, 0x61, 0x06, 0x09, 0x7e,
- 0x40, 0x0a, 0xb8, 0x01, 0x1b, 0xb7, 0x40, 0x06, 0x50, 0x06, 0x80, 0x06,
- 0x03, 0x06, 0xb8, 0x02, 0x43, 0x40, 0x0e, 0x20, 0x03, 0x7e, 0x02, 0x22,
- 0x4f, 0x00, 0x01, 0x00, 0x49, 0x11, 0x7c, 0xc4, 0x18, 0x2b, 0x10, 0xf6,
- 0x5d, 0xf4, 0xed, 0x1a, 0x19, 0xfd, 0x5d, 0xfd, 0x1a, 0x18, 0xed, 0x10,
- 0xe5, 0x10, 0xf4, 0xed, 0xe6, 0x5d, 0x00, 0x3f, 0x3c, 0x10, 0x3c, 0x10,
- 0x3c, 0x3f, 0x3c, 0x10, 0x3c, 0x10, 0x3c, 0x87, 0x05, 0x2e, 0x2b, 0x5d,
- 0x87, 0x7d, 0xc4, 0x87, 0x2e, 0x18, 0x2b, 0x5d, 0x7d, 0x10, 0xc4, 0x00,
- 0x11, 0x12, 0x39, 0x39, 0x0f, 0x0f, 0x87, 0x08, 0xc4, 0x87, 0x0e, 0x10,
- 0xc4, 0x08, 0xc4, 0x87, 0x0e, 0x10, 0xc4, 0xc4, 0x08, 0xc4, 0x07, 0x0e,
- 0x10, 0x3c, 0x3c, 0x08, 0x3c, 0x31, 0x30, 0x01, 0x43, 0x5c, 0x58, 0xb4,
- 0x0e, 0x18, 0x1d, 0x39, 0x0b, 0xb8, 0xff, 0xde, 0x40, 0x0b, 0x1d, 0x39,
- 0x0c, 0x22, 0x17, 0x39, 0x03, 0x22, 0x17, 0x39, 0x0b, 0xb8, 0xff, 0xde,
- 0xb2, 0x21, 0x39, 0x10, 0xb8, 0xff, 0xc0, 0x40, 0x0a, 0x15, 0x39, 0x01,
- 0x22, 0x21, 0x39, 0x09, 0x40, 0x1c, 0x39, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b,
- 0x2b, 0x2b, 0x2b, 0x59, 0x5d, 0x71, 0x00, 0x2b, 0x5d, 0x2b, 0x2b, 0x01,
- 0x5d, 0x33, 0x09, 0x01, 0x33, 0x17, 0x16, 0x17, 0x36, 0x3f, 0x01, 0x33,
- 0x09, 0x01, 0x23, 0x03, 0x27, 0x01, 0x0f, 0x01, 0x84, 0xfe, 0x99, 0xe1,
- 0xa3, 0x2e, 0x1c, 0x2c, 0x25, 0xb3, 0xd7, 0xfe, 0x91, 0x01, 0x8b, 0xdd,
- 0xda, 0x3a, 0xfe, 0xe9, 0x02, 0x28, 0x01, 0xfe, 0xf9, 0x47, 0x30, 0x42,
- 0x33, 0xfb, 0xfe, 0x0c, 0xfd, 0xce, 0x01, 0x4a, 0x59, 0xfe, 0x5d, 0x00,
- 0x00, 0x01, 0x00, 0x21, 0xfe, 0x51, 0x03, 0xee, 0x04, 0x26, 0x00, 0x1a,
- 0x01, 0x87, 0xb3, 0x0f, 0x1c, 0x01, 0x0f, 0xb8, 0xff, 0xde, 0x40, 0xa4,
- 0x1c, 0x39, 0x28, 0x14, 0x56, 0x0f, 0xaf, 0x0a, 0x03, 0x40, 0x0d, 0x40,
- 0x0f, 0x02, 0x0f, 0x20, 0x28, 0x30, 0x34, 0x10, 0x20, 0x28, 0x30, 0x34,
- 0x07, 0x0c, 0x09, 0x12, 0x16, 0x0d, 0x18, 0x12, 0x27, 0x0b, 0x27, 0x0c,
- 0x27, 0x0d, 0x36, 0x0c, 0x36, 0x0d, 0x35, 0x0e, 0x99, 0x11, 0x0b, 0x28,
- 0x12, 0x28, 0x13, 0x48, 0x16, 0x59, 0x12, 0x59, 0x13, 0x59, 0x15, 0x69,
- 0x12, 0x69, 0x13, 0x69, 0x15, 0x79, 0x06, 0x76, 0x0d, 0x79, 0x11, 0x7a,
- 0x14, 0x7a, 0x15, 0x85, 0x0d, 0x8a, 0x11, 0x8c, 0x12, 0x8c, 0x13, 0x89,
- 0x14, 0x98, 0x0a, 0xa8, 0x0b, 0xbc, 0x10, 0xbb, 0x11, 0xba, 0x14, 0xea,
- 0x0a, 0xe7, 0x14, 0xf5, 0x0d, 0xfd, 0x10, 0xf9, 0x14, 0xff, 0x1c, 0x1e,
- 0x12, 0x0f, 0x0f, 0x0c, 0x10, 0x11, 0x12, 0x12, 0x0a, 0x00, 0x03, 0x19,
- 0x14, 0x13, 0x13, 0x25, 0x12, 0x0a, 0x14, 0x12, 0x12, 0x0a, 0x0f, 0x0c,
- 0x0f, 0x11, 0x0c, 0x25, 0x0b, 0x0a, 0x14, 0x0b, 0x0b, 0x0a, 0x13, 0x12,
- 0x12, 0x0c, 0x0c, 0x0b, 0x06, 0x03, 0x1c, 0x19, 0x0f, 0x00, 0x1c, 0x10,
- 0x1c, 0x02, 0x2f, 0x1c, 0xbf, 0x1c, 0x02, 0x1c, 0xb8, 0x02, 0x3f, 0xb5,
- 0x0f, 0x13, 0x40, 0x12, 0x40, 0x14, 0xb8, 0x02, 0x54, 0x40, 0x0b, 0x3f,
- 0x12, 0x40, 0x12, 0x02, 0x5f, 0x12, 0xbf, 0x12, 0x02, 0x12, 0xb8, 0x01,
- 0x42, 0xb6, 0x0f, 0x01, 0x22, 0x00, 0x45, 0x1b, 0x0a, 0xb8, 0x02, 0x54,
- 0x40, 0x12, 0x0f, 0x20, 0x0b, 0x40, 0x40, 0x20, 0x0c, 0x30, 0x0c, 0x4f,
- 0x0c, 0x03, 0x50, 0x0c, 0xff, 0x0c, 0x02, 0x0c, 0xb8, 0x01, 0x42, 0xb3,
- 0x2f, 0x0f, 0x01, 0x0f, 0xb8, 0x02, 0x3f, 0xb4, 0x1b, 0x20, 0x7c, 0x66,
- 0x18, 0x2b, 0x1a, 0x19, 0x10, 0xfd, 0x71, 0xf4, 0x5d, 0x71, 0x1a, 0x18,
- 0xed, 0x1a, 0x19, 0x10, 0xed, 0x18, 0x10, 0xf4, 0xe4, 0x19, 0x10, 0xe4,
- 0x5d, 0x71, 0xed, 0x1a, 0x18, 0x10, 0xed, 0x19, 0x10, 0xe4, 0x5d, 0x71,
- 0x00, 0x18, 0x3f, 0xed, 0x3f, 0x3c, 0x10, 0x3c, 0x10, 0x3c, 0x87, 0x05,
- 0x2e, 0x2b, 0x08, 0x7d, 0x10, 0xc4, 0x87, 0x05, 0x2e, 0x18, 0x2b, 0x0e,
- 0x7d, 0x10, 0xc4, 0x00, 0x11, 0x12, 0x39, 0x87, 0x0e, 0x10, 0x3c, 0x3c,
- 0x08, 0xc4, 0x4b, 0xb0, 0x0e, 0x53, 0x4b, 0xb0, 0x18, 0x51, 0x5a, 0x58,
- 0xbb, 0x00, 0x0c, 0xff, 0xe8, 0x00, 0x0b, 0xff, 0xe8, 0x01, 0x38, 0x38,
- 0x59, 0x31, 0x30, 0x01, 0x43, 0x5c, 0x58, 0xb9, 0x00, 0x14, 0xff, 0xde,
- 0xb6, 0x37, 0x39, 0x0a, 0x22, 0x37, 0x39, 0x0e, 0xb8, 0xff, 0xe8, 0xb5,
- 0x15, 0x39, 0x11, 0x22, 0x15, 0x39, 0x2b, 0x2b, 0x2b, 0x2b, 0x59, 0x5d,
- 0x71, 0x2b, 0x2b, 0x00, 0x71, 0x5d, 0x2b, 0x01, 0x5d, 0x13, 0x27, 0x16,
- 0x33, 0x32, 0x36, 0x37, 0x36, 0x37, 0x36, 0x37, 0x01, 0x33, 0x13, 0x16,
- 0x17, 0x36, 0x37, 0x13, 0x33, 0x01, 0x06, 0x07, 0x0e, 0x01, 0x23, 0x22,
- 0x7f, 0x14, 0x3b, 0x2c, 0x3c, 0x48, 0x17, 0x11, 0x26, 0x05, 0x0b, 0xfe,
- 0x6d, 0xc2, 0xdd, 0x2b, 0x22, 0x1f, 0x2b, 0xe3, 0xb4, 0xfe, 0x6c, 0x41,
- 0x24, 0x30, 0x7c, 0x56, 0x34, 0xfe, 0x67, 0xa9, 0x10, 0x28, 0x24, 0x1b,
- 0x6b, 0x0f, 0x1d, 0x04, 0x28, 0xfd, 0x99, 0x75, 0x81, 0x7c, 0x76, 0x02,
- 0x6b, 0xfb, 0xc8, 0xaf, 0x42, 0x59, 0x53, 0x00, 0x00, 0x01, 0x00, 0x28,
- 0x00, 0x00, 0x03, 0xd4, 0x04, 0x26, 0x00, 0x0e, 0x01, 0x88, 0x40, 0x0d,
- 0x12, 0xb8, 0x02, 0xc9, 0x08, 0x02, 0x12, 0x01, 0x32, 0x12, 0x17, 0x34,
- 0x08, 0xb8, 0xff, 0xce, 0x40, 0x09, 0x12, 0x17, 0x34, 0x01, 0x3e, 0x1e,
- 0x21, 0x34, 0x08, 0xb8, 0xff, 0xc2, 0x40, 0x4a, 0x1e, 0x21, 0x34, 0x29,
- 0x02, 0x28, 0x09, 0x2f, 0x10, 0x39, 0x01, 0x39, 0x0a, 0x49, 0x01, 0x46,
- 0x02, 0x46, 0x08, 0x49, 0x09, 0x4f, 0x10, 0x5c, 0x01, 0x54, 0x02, 0x54,
- 0x08, 0x5a, 0x09, 0x50, 0x10, 0x6c, 0x01, 0x63, 0x02, 0x63, 0x08, 0x6a,
- 0x09, 0x7b, 0x01, 0x74, 0x08, 0x7b, 0x09, 0x8b, 0x01, 0x85, 0x08, 0x89,
- 0x09, 0xf9, 0x01, 0xf4, 0x02, 0x1b, 0x19, 0x08, 0x26, 0x01, 0x29, 0x08,
- 0x2b, 0x09, 0x39, 0x08, 0xa5, 0x08, 0xd7, 0x01, 0x07, 0x10, 0xb8, 0xff,
- 0xc0, 0xb7, 0x10, 0x15, 0x34, 0x02, 0x2c, 0x12, 0x39, 0x09, 0xb8, 0xff,
- 0xd4, 0x40, 0x27, 0x12, 0x39, 0x01, 0x02, 0x3a, 0x09, 0x0a, 0x02, 0x08,
- 0x0a, 0x0a, 0x25, 0x01, 0x02, 0x14, 0x01, 0x01, 0x02, 0x01, 0x0d, 0x0e,
- 0x08, 0x06, 0x02, 0x61, 0x05, 0x2b, 0x07, 0x06, 0x06, 0x0a, 0x61, 0x0d,
- 0x00, 0x0d, 0x2b, 0x0e, 0x0a, 0x02, 0xb8, 0x01, 0x0f, 0xb4, 0x08, 0x08,
- 0x07, 0x05, 0x06, 0xb8, 0x02, 0x5b, 0x40, 0x2c, 0x00, 0x07, 0x22, 0x0d,
- 0xa0, 0x0e, 0x01, 0x00, 0x0e, 0x40, 0x0e, 0x60, 0x0e, 0x80, 0x0e, 0xf0,
- 0x0e, 0x05, 0x0e, 0x74, 0x00, 0x0a, 0x7e, 0x01, 0x01, 0xaf, 0x00, 0x01,
- 0x4f, 0x00, 0x6f, 0x00, 0xff, 0x00, 0x03, 0x00, 0x19, 0x0f, 0x10, 0x74,
- 0x21, 0x7c, 0xc4, 0x18, 0x2b, 0x2b, 0x4e, 0xf4, 0x5d, 0x71, 0x3c, 0x4d,
- 0x10, 0xed, 0x10, 0xfd, 0x5d, 0x71, 0x3c, 0xe4, 0x10, 0xf4, 0x3c, 0x10,
- 0x3c, 0x10, 0xfd, 0x00, 0x3f, 0xed, 0x3c, 0x10, 0xe5, 0x3f, 0x3c, 0xfd,
- 0xe5, 0x11, 0x39, 0x11, 0x12, 0x39, 0x87, 0x05, 0x2e, 0x2b, 0x87, 0x7d,
- 0xc4, 0x10, 0x0e, 0xc4, 0x2b, 0x31, 0x30, 0x01, 0x2b, 0x2b, 0x2b, 0x71,
- 0x5d, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x43, 0x5c, 0x58, 0xb5, 0x29, 0x01,
- 0x26, 0x08, 0x02, 0x01, 0xb8, 0xff, 0xce, 0x40, 0x09, 0x12, 0x17, 0x34,
- 0x08, 0x32, 0x12, 0x17, 0x34, 0x01, 0xb8, 0xff, 0xc2, 0xb7, 0x1e, 0x21,
- 0x34, 0x08, 0x3e, 0x1e, 0x21, 0x34, 0x00, 0x2b, 0x2b, 0x2b, 0x2b, 0x01,
- 0x71, 0x59, 0x01, 0x5d, 0x43, 0x5c, 0x58, 0xb9, 0x00, 0x08, 0xff, 0xde,
- 0xb2, 0x0f, 0x39, 0x09, 0xb8, 0xff, 0xde, 0xb2, 0x0f, 0x39, 0x09, 0xb8,
- 0xff, 0xe8, 0xb7, 0x1b, 0x39, 0x09, 0x08, 0x16, 0x1b, 0x3d, 0x09, 0xb8,
- 0xff, 0xf0, 0xb2, 0x17, 0x39, 0x09, 0xb8, 0xff, 0xf8, 0x40, 0x0a, 0x16,
- 0x39, 0x02, 0x14, 0x16, 0x39, 0x02, 0x1a, 0x16, 0x39, 0x2b, 0x2b, 0x2b,
- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x59, 0x33, 0x35, 0x01, 0x06, 0x23, 0x21,
- 0x35, 0x21, 0x15, 0x01, 0x07, 0x36, 0x33, 0x21, 0x15, 0x28, 0x02, 0xa4,
- 0x73, 0x58, 0xfe, 0x4f, 0x03, 0x64, 0xfd, 0xc1, 0x6f, 0x79, 0x6a, 0x01,
- 0xeb, 0x92, 0x03, 0x08, 0x06, 0x92, 0x77, 0xfd, 0x5e, 0x7b, 0x09, 0x9b,
- 0x00, 0x01, 0x00, 0x39, 0xfe, 0x51, 0x02, 0x7c, 0x05, 0xd3, 0x00, 0x2a,
- 0x00, 0x7b, 0x40, 0x4d, 0x47, 0x0f, 0x01, 0x28, 0x12, 0x0f, 0x11, 0x34,
- 0x02, 0x12, 0x0f, 0x11, 0x34, 0x07, 0x18, 0x0b, 0x0e, 0x34, 0x25, 0x12,
- 0x0b, 0x0e, 0x34, 0x16, 0x27, 0x16, 0x00, 0x29, 0x2a, 0x2a, 0x0c, 0x1f,
- 0x25, 0x20, 0x13, 0x0d, 0x25, 0x0c, 0x11, 0x0d, 0x0c, 0x0c, 0x1f, 0x20,
- 0xae, 0x1b, 0x12, 0x11, 0x25, 0x05, 0x19, 0x3a, 0x1b, 0x25, 0x26, 0x03,
- 0x3a, 0x05, 0xae, 0x2a, 0x27, 0x3a, 0x26, 0xae, 0x2a, 0x2a, 0x5f, 0x00,
- 0x8f, 0x00, 0x02, 0x00, 0x69, 0x2b, 0x70, 0x68, 0x18, 0x2b, 0x10, 0xf6,
- 0x5d, 0x3c, 0x10, 0xf4, 0xe4, 0x10, 0xf4, 0xe4, 0x10, 0xfd, 0xe4, 0x10,
- 0xfd, 0x3c, 0x10, 0xf4, 0x3c, 0x3c, 0x10, 0x3c, 0x00, 0x3f, 0xed, 0x3f,
- 0xed, 0x12, 0x39, 0x2f, 0xed, 0x39, 0x01, 0x12, 0x39, 0x31, 0x30, 0x2b,
- 0x2b, 0x2b, 0x2b, 0x01, 0x71, 0x13, 0x3e, 0x02, 0x12, 0x37, 0x3e, 0x02,
- 0x37, 0x36, 0x3b, 0x01, 0x15, 0x23, 0x22, 0x06, 0x15, 0x10, 0x07, 0x0e,
- 0x01, 0x07, 0x1e, 0x01, 0x15, 0x14, 0x17, 0x1e, 0x01, 0x3b, 0x01, 0x15,
- 0x23, 0x22, 0x27, 0x2e, 0x02, 0x02, 0x2e, 0x01, 0x27, 0x39, 0x4d, 0x61,
- 0x20, 0x02, 0x05, 0x09, 0x31, 0x48, 0x38, 0x26, 0x56, 0x38, 0x1f, 0x68,
- 0x44, 0x0b, 0x12, 0x57, 0x5d, 0x6e, 0x63, 0x04, 0x08, 0x41, 0x5f, 0x1f,
- 0x38, 0x62, 0x2c, 0x40, 0x54, 0x19, 0x02, 0x20, 0x61, 0x4d, 0x02, 0x64,
- 0x02, 0x4f, 0x8a, 0x01, 0x4e, 0x35, 0x54, 0x66, 0x3d, 0x10, 0x0a, 0x9d,
- 0x4b, 0x82, 0xfe, 0xfa, 0x45, 0x6b, 0x74, 0x2d, 0x2e, 0xbd, 0xd7, 0xc3,
- 0x25, 0x44, 0x36, 0x9d, 0x10, 0x17, 0x67, 0x9e, 0x01, 0x68, 0x8a, 0x50,
- 0x02, 0x00, 0x00, 0x01, 0x00, 0xbc, 0xfe, 0x51, 0x01, 0x59, 0x05, 0xd3,
- 0x00, 0x03, 0x00, 0x32, 0xb9, 0x00, 0x03, 0x01, 0x7e, 0x40, 0x18, 0x01,
- 0x00, 0x05, 0xa1, 0x02, 0x02, 0x9f, 0x03, 0xaf, 0x03, 0x02, 0x03, 0x76,
- 0x00, 0x00, 0x20, 0x01, 0x01, 0x01, 0xa1, 0x04, 0xa1, 0x98, 0x18, 0x2b,
- 0x4e, 0x10, 0xf4, 0x5d, 0x3c, 0x4d, 0x10, 0xfd, 0x5d, 0x3c, 0x10, 0xee,
- 0x00, 0x3f, 0x4d, 0xed, 0x31, 0x30, 0x13, 0x11, 0x33, 0x11, 0xbc, 0x9d,
- 0xfe, 0x51, 0x07, 0x82, 0xf8, 0x7e, 0x00, 0x01, 0x00, 0x2f, 0xfe, 0x51,
- 0x02, 0x72, 0x05, 0xd3, 0x00, 0x2a, 0x00, 0x81, 0xb9, 0x00, 0x03, 0xff,
- 0xee, 0xb3, 0x0f, 0x11, 0x34, 0x29, 0xb8, 0xff, 0xee, 0xb3, 0x0f, 0x11,
- 0x34, 0x26, 0xb8, 0xff, 0xe8, 0xb3, 0x0b, 0x0e, 0x34, 0x08, 0xb8, 0xff,
- 0xee, 0x40, 0x39, 0x0b, 0x0e, 0x34, 0x17, 0x28, 0x17, 0x00, 0x29, 0x01,
- 0x01, 0x0d, 0x20, 0x25, 0x21, 0x11, 0x0e, 0x25, 0x0d, 0x13, 0x21, 0x20,
- 0x20, 0x0e, 0x0d, 0xae, 0x12, 0x1a, 0x3a, 0x1c, 0x25, 0x27, 0x14, 0x3a,
- 0x12, 0x25, 0x06, 0x27, 0x3a, 0x28, 0xae, 0x01, 0x04, 0x3a, 0x06, 0xae,
- 0x00, 0x50, 0x01, 0x80, 0x01, 0x02, 0x01, 0x69, 0x2c, 0x9b, 0x8d, 0x18,
- 0x2b, 0x10, 0xf4, 0x5d, 0x3c, 0xf4, 0xe4, 0x10, 0xf4, 0xe4, 0x10, 0xfd,
- 0xe4, 0x10, 0xfd, 0xe4, 0x10, 0xf4, 0x3c, 0x3c, 0x10, 0x3c, 0x00, 0x3f,
- 0xed, 0x3f, 0xed, 0x12, 0x39, 0x2f, 0xed, 0x39, 0x01, 0x11, 0x39, 0x31,
- 0x30, 0x2b, 0x2b, 0x2b, 0x2b, 0x01, 0x15, 0x0e, 0x02, 0x02, 0x07, 0x0e,
- 0x02, 0x07, 0x06, 0x2b, 0x01, 0x35, 0x33, 0x32, 0x36, 0x35, 0x34, 0x37,
- 0x3e, 0x01, 0x37, 0x2e, 0x01, 0x35, 0x34, 0x27, 0x2e, 0x01, 0x2b, 0x01,
- 0x35, 0x33, 0x32, 0x17, 0x1e, 0x02, 0x12, 0x1e, 0x01, 0x02, 0x72, 0x4d,
- 0x61, 0x20, 0x02, 0x05, 0x09, 0x31, 0x48, 0x38, 0x26, 0x56, 0x38, 0x1f,
- 0x68, 0x44, 0x09, 0x10, 0x60, 0x58, 0x73, 0x5e, 0x05, 0x07, 0x41, 0x5f,
- 0x1f, 0x38, 0x62, 0x2c, 0x40, 0x54, 0x19, 0x02, 0x20, 0x61, 0x02, 0x64,
- 0xa3, 0x02, 0x50, 0x89, 0xfe, 0xb2, 0x35, 0x55, 0x65, 0x3d, 0x10, 0x0b,
- 0x9d, 0x4b, 0x83, 0xfa, 0x43, 0x6f, 0x85, 0x25, 0x37, 0xb5, 0xd7, 0xc3,
- 0x26, 0x43, 0x35, 0x9d, 0x10, 0x16, 0x68, 0x9e, 0xfe, 0x98, 0x89, 0x50,
- 0x00, 0x01, 0x00, 0x57, 0x02, 0x2d, 0x04, 0x56, 0x03, 0x75, 0x00, 0x16,
- 0x00, 0x55, 0x40, 0x14, 0x0b, 0x0b, 0x04, 0x16, 0x1b, 0x0b, 0x14, 0x16,
- 0x04, 0x0d, 0x20, 0x2b, 0x0c, 0x3b, 0x0c, 0x02, 0x0c, 0x01, 0x20, 0x00,
- 0xb8, 0xff, 0xe0, 0x40, 0x0e, 0x0b, 0x0e, 0x34, 0x00, 0x10, 0x20, 0x09,
- 0xd4, 0x0c, 0x00, 0xd4, 0x14, 0x20, 0x03, 0xb8, 0x02, 0x58, 0x40, 0x0c,
- 0x0c, 0x0d, 0x0c, 0x1a, 0x18, 0x01, 0x00, 0x19, 0x17, 0x71, 0x8c, 0x18,
- 0x2b, 0x4e, 0x10, 0xf4, 0x3c, 0x10, 0xf6, 0x3c, 0x00, 0x2f, 0x4d, 0xf4,
- 0xfd, 0xe4, 0x10, 0xf4, 0xed, 0x10, 0x2b, 0xed, 0x10, 0x5d, 0xed, 0x31,
- 0x30, 0x00, 0x5d, 0x13, 0x35, 0x36, 0x33, 0x32, 0x16, 0x17, 0x1e, 0x01,
- 0x33, 0x32, 0x36, 0x37, 0x15, 0x0e, 0x01, 0x23, 0x22, 0x2e, 0x01, 0x23,
- 0x22, 0x06, 0x57, 0x6a, 0xac, 0x3c, 0x84, 0x7a, 0x45, 0x45, 0x23, 0x41,
- 0x8b, 0x36, 0x40, 0x83, 0x52, 0x3c, 0x6d, 0xed, 0x4f, 0x40, 0x71, 0x02,
- 0x2d, 0xcd, 0x78, 0x23, 0x34, 0x1d, 0x12, 0x4e, 0x3b, 0xd4, 0x3c, 0x36,
- 0x1c, 0x6a, 0x37, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x02, 0x80, 0x00,
- 0x98, 0x16, 0xa9, 0x36, 0x5f, 0x0f, 0x3c, 0xf5, 0x00, 0x19, 0x08, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0xa2, 0xe3, 0x27, 0x2a, 0x00, 0x00, 0x00, 0x00,
- 0xb0, 0xd9, 0x61, 0x28, 0xff, 0xa2, 0xfe, 0x51, 0x07, 0xd5, 0x06, 0x41,
- 0x00, 0x00, 0x00, 0x09, 0x00, 0x01, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x01, 0x00, 0x00, 0x07, 0x3e, 0xfe, 0x4e, 0x00, 0x43, 0x08, 0x1f,
- 0xff, 0xa2, 0xff, 0xb9, 0x07, 0xd5, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62,
- 0x06, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x39, 0x00, 0x00,
- 0x02, 0x39, 0x00, 0x00, 0x02, 0x39, 0x00, 0xb0, 0x02, 0xd7, 0x00, 0x5e,
- 0x04, 0x73, 0x00, 0x15, 0x04, 0x73, 0x00, 0x49, 0x07, 0x1d, 0x00, 0x77,
- 0x05, 0x56, 0x00, 0x58, 0x01, 0x87, 0x00, 0x5a, 0x02, 0xaa, 0x00, 0x7c,
- 0x02, 0xaa, 0x00, 0x7c, 0x03, 0x1d, 0x00, 0x40, 0x04, 0xac, 0x00, 0x72,
- 0x02, 0x39, 0x00, 0xaa, 0x02, 0xaa, 0x00, 0x41, 0x02, 0x39, 0x00, 0xba,
- 0x02, 0x39, 0x00, 0x00, 0x04, 0x73, 0x00, 0x55, 0x04, 0x73, 0x00, 0xdf,
- 0x04, 0x73, 0x00, 0x3c, 0x04, 0x73, 0x00, 0x56, 0x04, 0x73, 0x00, 0x1a,
- 0x04, 0x73, 0x00, 0x55, 0x04, 0x73, 0x00, 0x4d, 0x04, 0x73, 0x00, 0x61,
- 0x04, 0x73, 0x00, 0x53, 0x04, 0x73, 0x00, 0x55, 0x02, 0x39, 0x00, 0xb9,
- 0x02, 0x39, 0x00, 0xaa, 0x04, 0xac, 0x00, 0x70, 0x04, 0xac, 0x00, 0x72,
- 0x04, 0xac, 0x00, 0x70, 0x04, 0x73, 0x00, 0x5a, 0x08, 0x1f, 0x00, 0x6f,
- 0x05, 0x56, 0xff, 0xfd, 0x05, 0x56, 0x00, 0x96, 0x05, 0xc7, 0x00, 0x66,
- 0x05, 0xc7, 0x00, 0x9e, 0x05, 0x56, 0x00, 0xa2, 0x04, 0xe3, 0x00, 0xa8,
- 0x06, 0x39, 0x00, 0x6d, 0x05, 0xc7, 0x00, 0xa4, 0x02, 0x39, 0x00, 0xbf,
- 0x04, 0x00, 0x00, 0x37, 0x05, 0x56, 0x00, 0x96, 0x04, 0x73, 0x00, 0x96,
- 0x06, 0xaa, 0x00, 0x98, 0x05, 0xc7, 0x00, 0x9c, 0x06, 0x39, 0x00, 0x63,
- 0x05, 0x56, 0x00, 0x9e, 0x06, 0x39, 0x00, 0x58, 0x05, 0xc7, 0x00, 0xa1,
- 0x05, 0x56, 0x00, 0x5c, 0x04, 0xe3, 0x00, 0x30, 0x05, 0xc7, 0x00, 0xa1,
- 0x05, 0x56, 0x00, 0x09, 0x07, 0x8d, 0x00, 0x19, 0x05, 0x56, 0x00, 0x09,
- 0x05, 0x56, 0x00, 0x06, 0x04, 0xe3, 0x00, 0x29, 0x02, 0x39, 0x00, 0x8b,
- 0x02, 0x39, 0x00, 0x00, 0x02, 0x39, 0x00, 0x27, 0x03, 0xc1, 0x00, 0x36,
- 0x04, 0x73, 0xff, 0xe1, 0x02, 0xaa, 0x00, 0x59, 0x04, 0x73, 0x00, 0x4a,
- 0x04, 0x73, 0x00, 0x86, 0x04, 0x00, 0x00, 0x50, 0x04, 0x73, 0x00, 0x46,
- 0x04, 0x73, 0x00, 0x4b, 0x02, 0x39, 0x00, 0x13, 0x04, 0x73, 0x00, 0x42,
- 0x04, 0x73, 0x00, 0x87, 0x01, 0xc7, 0x00, 0x88, 0x01, 0xc7, 0xff, 0xa2,
- 0x04, 0x00, 0x00, 0x88, 0x01, 0xc7, 0x00, 0x83, 0x06, 0xaa, 0x00, 0x87,
- 0x04, 0x73, 0x00, 0x87, 0x04, 0x73, 0x00, 0x44, 0x04, 0x73, 0x00, 0x87,
- 0x04, 0x73, 0x00, 0x48, 0x02, 0xaa, 0x00, 0x85, 0x04, 0x00, 0x00, 0x3f,
- 0x02, 0x39, 0x00, 0x24, 0x04, 0x73, 0x00, 0x83, 0x04, 0x00, 0x00, 0x1a,
- 0x05, 0xc7, 0x00, 0x06, 0x04, 0x00, 0x00, 0x0f, 0x04, 0x00, 0x00, 0x21,
- 0x04, 0x00, 0x00, 0x28, 0x02, 0xac, 0x00, 0x39, 0x02, 0x14, 0x00, 0xbc,
- 0x02, 0xac, 0x00, 0x2f, 0x04, 0xac, 0x00, 0x57, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0x6c,
- 0x00, 0x00, 0x00, 0x6c, 0x00, 0x00, 0x00, 0xf2, 0x00, 0x00, 0x01, 0x9a,
- 0x00, 0x00, 0x03, 0x3c, 0x00, 0x00, 0x05, 0xc2, 0x00, 0x00, 0x07, 0x6a,
- 0x00, 0x00, 0x09, 0x54, 0x00, 0x00, 0x09, 0x9a, 0x00, 0x00, 0x0a, 0x1a,
- 0x00, 0x00, 0x0a, 0x98, 0x00, 0x00, 0x0b, 0x78, 0x00, 0x00, 0x0b, 0xe0,
- 0x00, 0x00, 0x0c, 0x58, 0x00, 0x00, 0x0c, 0x9e, 0x00, 0x00, 0x0c, 0xda,
- 0x00, 0x00, 0x0d, 0x4a, 0x00, 0x00, 0x0e, 0x66, 0x00, 0x00, 0x0f, 0x06,
- 0x00, 0x00, 0x10, 0x50, 0x00, 0x00, 0x11, 0xa4, 0x00, 0x00, 0x12, 0xd2,
- 0x00, 0x00, 0x14, 0x20, 0x00, 0x00, 0x15, 0x5a, 0x00, 0x00, 0x16, 0x06,
- 0x00, 0x00, 0x17, 0x78, 0x00, 0x00, 0x18, 0xbc, 0x00, 0x00, 0x19, 0x18,
- 0x00, 0x00, 0x19, 0xd6, 0x00, 0x00, 0x1a, 0x58, 0x00, 0x00, 0x1a, 0xc8,
- 0x00, 0x00, 0x1b, 0x4e, 0x00, 0x00, 0x1c, 0x40, 0x00, 0x00, 0x1e, 0x40,
- 0x00, 0x00, 0x1e, 0x82, 0x00, 0x00, 0x1f, 0x88, 0x00, 0x00, 0x20, 0xa6,
- 0x00, 0x00, 0x21, 0x8e, 0x00, 0x00, 0x22, 0x18, 0x00, 0x00, 0x22, 0x8c,
- 0x00, 0x00, 0x23, 0xe2, 0x00, 0x00, 0x24, 0x78, 0x00, 0x00, 0x25, 0x24,
- 0x00, 0x00, 0x25, 0xb0, 0x00, 0x00, 0x27, 0x6e, 0x00, 0x00, 0x27, 0xbe,
- 0x00, 0x00, 0x29, 0x7a, 0x00, 0x00, 0x2a, 0x90, 0x00, 0x00, 0x2b, 0x7a,
- 0x00, 0x00, 0x2c, 0x24, 0x00, 0x00, 0x2d, 0xc2, 0x00, 0x00, 0x2f, 0x7e,
- 0x00, 0x00, 0x31, 0x10, 0x00, 0x00, 0x31, 0x84, 0x00, 0x00, 0x32, 0x40,
- 0x00, 0x00, 0x33, 0x6a, 0x00, 0x00, 0x35, 0x5a, 0x00, 0x00, 0x38, 0x08,
- 0x00, 0x00, 0x39, 0x78, 0x00, 0x00, 0x3a, 0x92, 0x00, 0x00, 0x3a, 0xee,
- 0x00, 0x00, 0x3b, 0x58, 0x00, 0x00, 0x3b, 0xb0, 0x00, 0x00, 0x3c, 0x38,
- 0x00, 0x00, 0x3c, 0x6c, 0x00, 0x00, 0x3c, 0xe8, 0x00, 0x00, 0x3e, 0xaa,
- 0x00, 0x00, 0x3f, 0xde, 0x00, 0x00, 0x41, 0x04, 0x00, 0x00, 0x42, 0x38,
- 0x00, 0x00, 0x43, 0x82, 0x00, 0x00, 0x44, 0x7c, 0x00, 0x00, 0x45, 0xec,
- 0x00, 0x00, 0x46, 0xe0, 0x00, 0x00, 0x47, 0x84, 0x00, 0x00, 0x48, 0x60,
- 0x00, 0x00, 0x4a, 0x62, 0x00, 0x00, 0x4b, 0x06, 0x00, 0x00, 0x4c, 0x34,
- 0x00, 0x00, 0x4d, 0x48, 0x00, 0x00, 0x4e, 0x60, 0x00, 0x00, 0x4f, 0x90,
- 0x00, 0x00, 0x50, 0xae, 0x00, 0x00, 0x51, 0x6e, 0x00, 0x00, 0x53, 0xd8,
- 0x00, 0x00, 0x54, 0xa4, 0x00, 0x00, 0x55, 0xb0, 0x00, 0x00, 0x57, 0x42,
- 0x00, 0x00, 0x5a, 0x40, 0x00, 0x00, 0x5c, 0x00, 0x00, 0x00, 0x5d, 0xe8,
- 0x00, 0x00, 0x5f, 0xa8, 0x00, 0x00, 0x60, 0xa6, 0x00, 0x00, 0x60, 0xf2,
- 0x00, 0x00, 0x61, 0xf4, 0x00, 0x00, 0x62, 0x94, 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x00, 0x02, 0x54, 0x00, 0x01, 0x00, 0x61, 0x01, 0x80, 0x00, 0x06,
- 0x00, 0xc6, 0x00, 0x03, 0x00, 0x24, 0xff, 0x8f, 0x00, 0x03, 0x00, 0x37,
- 0xff, 0xdb, 0x00, 0x03, 0x00, 0x3c, 0xff, 0xdb, 0x00, 0x14, 0x00, 0x14,
- 0xff, 0x68, 0x00, 0x24, 0x00, 0x03, 0xff, 0x8f, 0x00, 0x24, 0x00, 0x37,
- 0xff, 0x68, 0x00, 0x24, 0x00, 0x39, 0xff, 0x68, 0x00, 0x24, 0x00, 0x3a,
- 0xff, 0xb4, 0x00, 0x24, 0x00, 0x3c, 0xff, 0x68, 0x00, 0x24, 0x00, 0x59,
- 0xff, 0xdb, 0x00, 0x24, 0x00, 0x5a, 0xff, 0xdb, 0x00, 0x24, 0x00, 0x5c,
- 0xff, 0xdb, 0x00, 0x29, 0x00, 0x0f, 0xff, 0x1d, 0x00, 0x29, 0x00, 0x11,
- 0xff, 0x1d, 0x00, 0x29, 0x00, 0x24, 0xff, 0x8f, 0x00, 0x2f, 0x00, 0x03,
- 0xff, 0xb4, 0x00, 0x2f, 0x00, 0x37, 0xff, 0x68, 0x00, 0x2f, 0x00, 0x39,
- 0xff, 0x68, 0x00, 0x2f, 0x00, 0x3a, 0xff, 0x68, 0x00, 0x2f, 0x00, 0x3c,
- 0xff, 0x68, 0x00, 0x2f, 0x00, 0x5c, 0xff, 0xb4, 0x00, 0x33, 0x00, 0x03,
- 0xff, 0xdb, 0x00, 0x33, 0x00, 0x0f, 0xfe, 0xf8, 0x00, 0x33, 0x00, 0x11,
- 0xfe, 0xf8, 0x00, 0x33, 0x00, 0x24, 0xff, 0x68, 0x00, 0x35, 0x00, 0x37,
- 0xff, 0xdb, 0x00, 0x35, 0x00, 0x39, 0xff, 0xdb, 0x00, 0x35, 0x00, 0x3a,
- 0xff, 0xdb, 0x00, 0x35, 0x00, 0x3c, 0xff, 0xdb, 0x00, 0x37, 0x00, 0x03,
- 0xff, 0xdb, 0x00, 0x37, 0x00, 0x0f, 0xff, 0x1d, 0x00, 0x37, 0x00, 0x10,
- 0xff, 0x8f, 0x00, 0x37, 0x00, 0x11, 0xff, 0x1d, 0x00, 0x37, 0x00, 0x1d,
- 0xff, 0x1d, 0x00, 0x37, 0x00, 0x1e, 0xff, 0x1d, 0x00, 0x37, 0x00, 0x24,
- 0xff, 0x68, 0x00, 0x37, 0x00, 0x32, 0xff, 0xdb, 0x00, 0x37, 0x00, 0x44,
- 0xff, 0x1d, 0x00, 0x37, 0x00, 0x46, 0xff, 0x1d, 0x00, 0x37, 0x00, 0x48,
- 0xff, 0x1d, 0x00, 0x37, 0x00, 0x4c, 0xff, 0xb4, 0x00, 0x37, 0x00, 0x52,
- 0xff, 0x1d, 0x00, 0x37, 0x00, 0x55, 0xff, 0xb4, 0x00, 0x37, 0x00, 0x56,
- 0xff, 0x1d, 0x00, 0x37, 0x00, 0x58, 0xff, 0xb4, 0x00, 0x37, 0x00, 0x5a,
- 0xff, 0x8f, 0x00, 0x37, 0x00, 0x5c, 0xff, 0x8f, 0x00, 0x39, 0x00, 0x0f,
- 0xff, 0x44, 0x00, 0x39, 0x00, 0x10, 0xff, 0x8f, 0x00, 0x39, 0x00, 0x11,
- 0xff, 0x44, 0x00, 0x39, 0x00, 0x1d, 0xff, 0xb4, 0x00, 0x39, 0x00, 0x1e,
- 0xff, 0xb4, 0x00, 0x39, 0x00, 0x24, 0xff, 0x68, 0x00, 0x39, 0x00, 0x44,
- 0xff, 0x68, 0x00, 0x39, 0x00, 0x48, 0xff, 0x8f, 0x00, 0x39, 0x00, 0x4c,
- 0xff, 0xdb, 0x00, 0x39, 0x00, 0x52, 0xff, 0x8f, 0x00, 0x39, 0x00, 0x55,
- 0xff, 0xb4, 0x00, 0x39, 0x00, 0x58, 0xff, 0xb4, 0x00, 0x39, 0x00, 0x5c,
- 0xff, 0xb4, 0x00, 0x3a, 0x00, 0x0f, 0xff, 0x8f, 0x00, 0x3a, 0x00, 0x10,
- 0xff, 0xdb, 0x00, 0x3a, 0x00, 0x11, 0xff, 0x8f, 0x00, 0x3a, 0x00, 0x1d,
- 0xff, 0xdb, 0x00, 0x3a, 0x00, 0x1e, 0xff, 0xdb, 0x00, 0x3a, 0x00, 0x24,
- 0xff, 0xb4, 0x00, 0x3a, 0x00, 0x44, 0xff, 0xb4, 0x00, 0x3a, 0x00, 0x48,
- 0xff, 0xdb, 0x00, 0x3a, 0x00, 0x4c, 0x00, 0x00, 0x00, 0x3a, 0x00, 0x52,
- 0xff, 0xdb, 0x00, 0x3a, 0x00, 0x55, 0xff, 0xdb, 0x00, 0x3a, 0x00, 0x58,
- 0xff, 0xdb, 0x00, 0x3a, 0x00, 0x5c, 0xff, 0xee, 0x00, 0x3c, 0x00, 0x03,
- 0xff, 0xdb, 0x00, 0x3c, 0x00, 0x0f, 0xfe, 0xf8, 0x00, 0x3c, 0x00, 0x10,
- 0xff, 0x44, 0x00, 0x3c, 0x00, 0x11, 0xfe, 0xf8, 0x00, 0x3c, 0x00, 0x1d,
- 0xff, 0x8f, 0x00, 0x3c, 0x00, 0x1e, 0xff, 0x7b, 0x00, 0x3c, 0x00, 0x24,
- 0xff, 0x68, 0x00, 0x3c, 0x00, 0x44, 0xff, 0x68, 0x00, 0x3c, 0x00, 0x48,
- 0xff, 0x44, 0x00, 0x3c, 0x00, 0x4c, 0xff, 0xb4, 0x00, 0x3c, 0x00, 0x52,
- 0xff, 0x44, 0x00, 0x3c, 0x00, 0x53, 0xff, 0x68, 0x00, 0x3c, 0x00, 0x54,
- 0xff, 0x44, 0x00, 0x3c, 0x00, 0x58, 0xff, 0x8f, 0x00, 0x3c, 0x00, 0x59,
- 0xff, 0x8f, 0x00, 0x49, 0x00, 0x49, 0xff, 0xdb, 0x00, 0x55, 0x00, 0x0f,
- 0xff, 0x8f, 0x00, 0x55, 0x00, 0x11, 0xff, 0x8f, 0x00, 0x59, 0x00, 0x0f,
- 0xff, 0x68, 0x00, 0x59, 0x00, 0x11, 0xff, 0x68, 0x00, 0x5a, 0x00, 0x0f,
- 0xff, 0x8f, 0x00, 0x5a, 0x00, 0x11, 0xff, 0x8f, 0x00, 0x5c, 0x00, 0x0f,
- 0xff, 0x68, 0x00, 0x5c, 0x00, 0x11, 0xff, 0x68, 0x00, 0x01, 0x00, 0x00,
- 0x00, 0x62, 0x00, 0x58, 0x00, 0x05, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02,
- 0x00, 0x10, 0x00, 0x16, 0x00, 0x42, 0x00, 0x00, 0x02, 0xb1, 0x08, 0x0f,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x4e, 0x00, 0x01,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x00, 0x00, 0x00, 0x01,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x07, 0x00, 0x05, 0x00, 0x01,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x05, 0x00, 0x0c, 0x00, 0x03,
- 0x00, 0x01, 0x04, 0x09, 0x00, 0x01, 0x00, 0x0a, 0x00, 0x12, 0x00, 0x03,
- 0x00, 0x01, 0x04, 0x09, 0x00, 0x02, 0x00, 0x0e, 0x00, 0x1c, 0x00, 0x03,
- 0x00, 0x01, 0x04, 0x09, 0x00, 0x04, 0x00, 0x0a, 0x00, 0x2a, 0x41, 0x72,
- 0x69, 0x61, 0x6c, 0x52, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x41, 0x72,
- 0x69, 0x61, 0x6c, 0x00, 0x00, 0x41, 0x00, 0x72, 0x00, 0x69, 0x00, 0x61,
- 0x00, 0x6c, 0x00, 0x52, 0x00, 0x65, 0x00, 0x67, 0x00, 0x75, 0x00, 0x6c,
- 0x00, 0x61, 0x00, 0x72, 0x00, 0x41, 0x00, 0x72, 0x00, 0x69, 0x00, 0x61,
- 0x00, 0x6c, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0xff, 0x27, 0x00, 0x96, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x00, 0x62, 0x00, 0x00, 0x01, 0x02, 0x01, 0x03, 0x00, 0x03, 0x00, 0x04,
- 0x00, 0x05, 0x00, 0x06, 0x00, 0x07, 0x00, 0x08, 0x00, 0x09, 0x00, 0x0a,
- 0x00, 0x0b, 0x00, 0x0c, 0x00, 0x0d, 0x00, 0x0e, 0x00, 0x0f, 0x00, 0x10,
- 0x00, 0x11, 0x00, 0x12, 0x00, 0x13, 0x00, 0x14, 0x00, 0x15, 0x00, 0x16,
- 0x00, 0x17, 0x00, 0x18, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1b, 0x00, 0x1c,
- 0x00, 0x1d, 0x00, 0x1e, 0x00, 0x1f, 0x00, 0x20, 0x00, 0x21, 0x00, 0x22,
- 0x00, 0x23, 0x00, 0x24, 0x00, 0x25, 0x00, 0x26, 0x00, 0x27, 0x00, 0x28,
- 0x00, 0x29, 0x00, 0x2a, 0x00, 0x2b, 0x00, 0x2c, 0x00, 0x2d, 0x00, 0x2e,
- 0x00, 0x2f, 0x00, 0x30, 0x00, 0x31, 0x00, 0x32, 0x00, 0x33, 0x00, 0x34,
- 0x00, 0x35, 0x00, 0x36, 0x00, 0x37, 0x00, 0x38, 0x00, 0x39, 0x00, 0x3a,
- 0x00, 0x3b, 0x00, 0x3c, 0x00, 0x3d, 0x00, 0x3e, 0x00, 0x3f, 0x00, 0x40,
- 0x00, 0x41, 0x00, 0x42, 0x00, 0x43, 0x00, 0x44, 0x00, 0x45, 0x00, 0x46,
- 0x00, 0x47, 0x00, 0x48, 0x00, 0x49, 0x00, 0x4a, 0x00, 0x4b, 0x00, 0x4c,
- 0x00, 0x4d, 0x00, 0x4e, 0x00, 0x4f, 0x00, 0x50, 0x00, 0x51, 0x00, 0x52,
- 0x00, 0x53, 0x00, 0x54, 0x00, 0x55, 0x00, 0x56, 0x00, 0x57, 0x00, 0x58,
- 0x00, 0x59, 0x00, 0x5a, 0x00, 0x5b, 0x00, 0x5c, 0x00, 0x5d, 0x00, 0x5e,
- 0x00, 0x5f, 0x00, 0x60, 0x00, 0x61, 0x05, 0x2e, 0x6e, 0x75, 0x6c, 0x6c,
- 0x10, 0x6e, 0x6f, 0x6e, 0x6d, 0x61, 0x72, 0x6b, 0x69, 0x6e, 0x67, 0x72,
- 0x65, 0x74, 0x75, 0x72, 0x6e, 0x00, 0x00, 0x00, 0x05, 0xba, 0x00, 0x19,
- 0x05, 0xba, 0x00, 0x1a, 0x05, 0xa7, 0x00, 0x19, 0x04, 0x26, 0x00, 0x18,
- 0x00, 0x00, 0xff, 0xe7, 0x00, 0x00, 0xff, 0xe8, 0x00, 0x00, 0xff, 0xe7,
- 0xfe, 0x69, 0xff, 0xe8, 0x05, 0xba, 0x00, 0x19, 0xfe, 0x69, 0xff, 0xe8,
- 0x02, 0xea, 0x00, 0x00, 0x00, 0xb8, 0x00, 0x00, 0x00, 0xb8, 0xff, 0xff,
- 0xff, 0xff, 0x00, 0xa8, 0x00, 0xad, 0x01, 0x69, 0x00, 0xad, 0x00, 0xbf,
- 0x00, 0xc2, 0x01, 0xf0, 0x00, 0x18, 0x00, 0xaf, 0x00, 0xb9, 0x00, 0xb4,
- 0x00, 0xc8, 0x00, 0x17, 0x00, 0x44, 0x00, 0x9c, 0x00, 0x7c, 0x00, 0x94,
- 0x00, 0x87, 0x00, 0x06, 0x00, 0x5a, 0x00, 0xc8, 0x00, 0x89, 0x00, 0x52,
- 0x00, 0x52, 0x00, 0x05, 0x00, 0x44, 0x00, 0x94, 0x01, 0x19, 0xff, 0xb4,
- 0x00, 0x2f, 0x00, 0xa1, 0x00, 0x03, 0x00, 0xa1, 0x00, 0xcd, 0x00, 0x17,
- 0x00, 0x57, 0x00, 0x7e, 0x00, 0xba, 0x00, 0x16, 0x01, 0x18, 0xff, 0xe9,
- 0x00, 0x7f, 0x00, 0x85, 0x03, 0xd3, 0x00, 0x87, 0x00, 0x85, 0x00, 0x0d,
- 0x00, 0x22, 0x00, 0x41, 0x00, 0x50, 0x00, 0x6f, 0x00, 0x8d, 0x01, 0x4c,
- 0xff, 0x75, 0x00, 0x5c, 0x00, 0xdf, 0x04, 0x83, 0x00, 0x37, 0x00, 0x4c,
- 0x00, 0x6e, 0x00, 0x70, 0x01, 0x80, 0xff, 0x58, 0xff, 0x8e, 0xff, 0x92,
- 0xff, 0xa4, 0x00, 0xa5, 0x00, 0xb9, 0x03, 0xc8, 0xff, 0xfd, 0x00, 0x0b,
- 0x00, 0x1a, 0x00, 0x63, 0x00, 0x63, 0x00, 0xcd, 0xff, 0xee, 0x05, 0xd8,
- 0xff, 0xdc, 0x00, 0x2d, 0x00, 0x5c, 0x00, 0x95, 0x00, 0x99, 0x00, 0xdf,
- 0x01, 0x92, 0x09, 0xb5, 0x00, 0x40, 0x00, 0x57, 0x00, 0x80, 0x00, 0xb9,
- 0x03, 0x9d, 0x00, 0x72, 0x00, 0x9a, 0x03, 0x5d, 0x04, 0x01, 0xff, 0x67,
- 0xff, 0xfa, 0x00, 0x03, 0x00, 0x21, 0x00, 0x77, 0x00, 0xcd, 0x00, 0x04,
- 0x00, 0x4d, 0x00, 0xcd, 0x01, 0xc0, 0x02, 0x2b, 0x00, 0x4c, 0x00, 0x65,
- 0x00, 0xe7, 0x01, 0x18, 0x01, 0x7c, 0x03, 0x43, 0x05, 0xd8, 0xff, 0xa3,
- 0xff, 0xb0, 0xff, 0xc4, 0x00, 0x03, 0x00, 0x1c, 0x00, 0x5d, 0x00, 0x68,
- 0x00, 0x9a, 0x00, 0xba, 0x01, 0x35, 0x01, 0x47, 0x02, 0x21, 0x05, 0x5c,
- 0xff, 0x4d, 0xff, 0xcd, 0x00, 0x16, 0x00, 0x2d, 0x00, 0x78, 0x00, 0x80,
- 0x00, 0x99, 0x00, 0xb2, 0x00, 0xb6, 0x00, 0xb6, 0x00, 0xb8, 0x00, 0xbd,
- 0x00, 0xda, 0x01, 0x0c, 0x05, 0xf0, 0xff, 0xa4, 0xff, 0xf0, 0x00, 0x19,
- 0x00, 0x2c, 0x00, 0x49, 0x00, 0x7f, 0x00, 0xb4, 0x00, 0xce, 0x01, 0xc0,
- 0x03, 0xfe, 0xfd, 0x81, 0xfe, 0x3f, 0x00, 0x00, 0x00, 0x05, 0x00, 0x18,
- 0x00, 0x29, 0x00, 0x39, 0x00, 0x49, 0x00, 0x6f, 0x00, 0xbe, 0x00, 0xc7,
- 0x00, 0xd0, 0x01, 0x23, 0x01, 0xc1, 0x02, 0x6f, 0x05, 0x0c, 0x05, 0x32,
- 0x05, 0x40, 0x05, 0x7a, 0xff, 0xd4, 0x00, 0x14, 0x00, 0x31, 0x00, 0x55,
- 0x00, 0x57, 0x00, 0xa7, 0x00, 0xb4, 0x00, 0xe6, 0x01, 0xf7, 0x02, 0x7e,
- 0x02, 0x7e, 0x02, 0x7f, 0x03, 0xc6, 0x04, 0x46, 0xff, 0x42, 0x00, 0x0e,
- 0x00, 0x85, 0x00, 0x91, 0x00, 0xbf, 0x00, 0xc2, 0x00, 0xc5, 0x00, 0xe1,
- 0x01, 0x1a, 0x01, 0x2f, 0x01, 0x4f, 0x01, 0x56, 0x02, 0x29, 0x02, 0x6f,
- 0x02, 0x9e, 0x03, 0x72, 0x00, 0x08, 0x00, 0x2c, 0x00, 0x31, 0x00, 0x31,
- 0x00, 0x64, 0x00, 0x69, 0x00, 0x89, 0x00, 0x98, 0x00, 0xc7, 0x00, 0xde,
- 0x01, 0x2b, 0x01, 0xb6, 0x02, 0x0c, 0x02, 0xcf, 0x03, 0xa3, 0x04, 0xab,
- 0x04, 0xfb, 0x06, 0x1d, 0xfe, 0xe0, 0xff, 0x0e, 0x00, 0x06, 0x00, 0x26,
- 0x00, 0x9b, 0x00, 0x9d, 0x00, 0xc1, 0x01, 0x0d, 0x01, 0x18, 0x01, 0x20,
- 0x01, 0x73, 0x01, 0x82, 0x01, 0xd6, 0x01, 0xe3, 0x02, 0x43, 0x02, 0x5f,
- 0x02, 0x9b, 0x02, 0xe2, 0x03, 0x94, 0x04, 0xa9, 0x04, 0xd2, 0x07, 0x61,
- 0x00, 0x1c, 0x00, 0x5e, 0x00, 0x6d, 0x00, 0x8d, 0x00, 0xab, 0x00, 0xf7,
- 0x01, 0x12, 0x01, 0x38, 0x01, 0x51, 0x01, 0x5b, 0x01, 0x68, 0x01, 0x7c,
- 0x01, 0x87, 0x01, 0x91, 0x01, 0x99, 0x01, 0xcd, 0x01, 0xd0, 0x01, 0xe8,
- 0x02, 0x41, 0x02, 0x54, 0x02, 0x6b, 0x02, 0xef, 0x03, 0x68, 0x03, 0x71,
- 0x03, 0xbd, 0x04, 0x42, 0x04, 0x42, 0x04, 0x53, 0x04, 0x73, 0x04, 0x83,
- 0x05, 0x86, 0x05, 0x8b, 0x06, 0xe8, 0xfe, 0x58, 0xfe, 0xc4, 0xfe, 0xd1,
- 0xfe, 0xf7, 0xff, 0x32, 0xff, 0x86, 0x00, 0x51, 0x00, 0x7c, 0x00, 0x81,
- 0x00, 0x91, 0x00, 0x95, 0x00, 0x9e, 0x00, 0xb4, 0x00, 0xb9, 0x00, 0xcf,
- 0x00, 0xd9, 0x00, 0xd9, 0x00, 0xdf, 0x00, 0xe2, 0x01, 0x05, 0x01, 0x0b,
- 0x01, 0x0e, 0x01, 0x0e, 0x01, 0x20, 0x01, 0x21, 0x01, 0x55, 0x01, 0x7b,
- 0x01, 0x7b, 0x01, 0x7e, 0x01, 0x8d, 0x01, 0xa2, 0x01, 0xa8, 0x01, 0xa9,
- 0x01, 0xb4, 0x01, 0xd0, 0x01, 0xd0, 0x01, 0xe2, 0x01, 0xe9, 0x01, 0xf2,
- 0x01, 0xf5, 0x01, 0xfb, 0x02, 0x00, 0x02, 0x00, 0x02, 0x06, 0x02, 0x1b,
- 0x02, 0x21, 0x02, 0x22, 0x02, 0x22, 0x02, 0x23, 0x02, 0x72, 0x02, 0x77,
- 0x02, 0x94, 0x02, 0x9c, 0x02, 0xcf, 0x02, 0xcf, 0x02, 0xd0, 0x02, 0xec,
- 0x02, 0xf9, 0x03, 0x17, 0x03, 0x22, 0x03, 0x2b, 0x03, 0x35, 0x03, 0x3c,
- 0x03, 0x59, 0x03, 0x6f, 0x03, 0x71, 0x03, 0x87, 0x03, 0x90, 0x03, 0x90,
- 0x03, 0xb5, 0x03, 0xe1, 0x04, 0x1a, 0x04, 0xcf, 0x04, 0xff, 0x05, 0x32,
- 0x05, 0x32, 0x05, 0x96, 0x05, 0x9f, 0x05, 0xa8, 0x05, 0xab, 0x05, 0xc2,
- 0x05, 0xf0, 0x06, 0x0c, 0x07, 0x82, 0x08, 0x00, 0x08, 0xcc, 0xfc, 0xa3,
- 0xfd, 0x2a, 0xfd, 0xde, 0xfe, 0x00, 0xfe, 0x88, 0xfe, 0x96, 0xfe, 0xb2,
- 0xfe, 0xb4, 0xff, 0xe1, 0x00, 0x15, 0x00, 0x19, 0x00, 0x1a, 0x00, 0x1c,
- 0x00, 0x1f, 0x00, 0x3c, 0x00, 0x51, 0x00, 0x61, 0x00, 0x61, 0x00, 0x6a,
- 0x00, 0x78, 0x00, 0x96, 0x00, 0xa5, 0x00, 0xaf, 0x00, 0xd3, 0x01, 0x0c,
- 0x01, 0x18, 0x01, 0x1a, 0x01, 0x2a, 0x01, 0x3e, 0x01, 0x4c, 0x01, 0x51,
- 0x01, 0x5f, 0x01, 0x6a, 0x01, 0x71, 0x01, 0x78, 0x01, 0x82, 0x01, 0x84,
- 0x01, 0x9a, 0x01, 0xa5, 0x01, 0xa8, 0x01, 0xa9, 0x01, 0xae, 0x01, 0xbc,
- 0x01, 0xcd, 0x01, 0xd7, 0x01, 0xef, 0x02, 0x00, 0x02, 0x0d, 0x02, 0x1c,
- 0x02, 0x21, 0x02, 0x22, 0x02, 0x2e, 0x02, 0x35, 0x02, 0x42, 0x02, 0x4f,
- 0x02, 0x4f, 0x02, 0x5e, 0x02, 0x65, 0x02, 0x71, 0x02, 0x90, 0x02, 0x92,
- 0x02, 0xb4, 0x02, 0xd6, 0x02, 0xfa, 0x03, 0x07, 0x03, 0x0b, 0x03, 0x0f,
- 0x03, 0x15, 0x03, 0x2a, 0x03, 0x47, 0x03, 0x5d, 0x03, 0x65, 0x03, 0x74,
- 0x03, 0x79, 0x03, 0x96, 0x03, 0xb0, 0x03, 0xcc, 0x03, 0xdd, 0x03, 0xe2,
- 0x03, 0xf6, 0x03, 0xfc, 0x03, 0xfc, 0x03, 0xff, 0x04, 0x0a, 0x04, 0x1f,
- 0x04, 0x22, 0x04, 0x26, 0x04, 0x2b, 0x04, 0x47, 0x04, 0x5f, 0x04, 0x75,
- 0x04, 0x9e, 0x04, 0xe7, 0x04, 0xe7, 0x05, 0x5c, 0x05, 0xcb, 0x05, 0xe5,
- 0x06, 0x0a, 0x06, 0x6d, 0x06, 0x86, 0x06, 0xb8, 0x06, 0xf1, 0x07, 0x36,
- 0x07, 0x3e, 0x07, 0x50, 0x07, 0x51, 0x07, 0x5d, 0x07, 0x8f, 0x07, 0xb6,
- 0x07, 0xd4, 0x08, 0x60, 0x00, 0xb6, 0x00, 0xc3, 0x00, 0xb5, 0x00, 0xb7,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
- 0x01, 0xe0, 0x03, 0x81, 0x03, 0x45, 0x03, 0xb5, 0x00, 0x8e, 0x02, 0x33,
- 0x04, 0x19, 0x02, 0xce, 0x02, 0xce, 0x00, 0x2d, 0x00, 0x5f, 0x00, 0x64,
- 0x03, 0x4d, 0x02, 0x3f, 0x00, 0x00, 0x02, 0xa8, 0x01, 0x88, 0x02, 0x7d,
- 0x01, 0xb4, 0x02, 0x24, 0x05, 0x78, 0x06, 0x3b, 0x02, 0x3b, 0x01, 0x4e,
- 0x00, 0xf0, 0x04, 0x26, 0x02, 0x94, 0x02, 0xc6, 0x02, 0x9f, 0x02, 0xf6,
- 0x02, 0x3b, 0x03, 0x4d, 0x01, 0x4b, 0x01, 0x53, 0x00, 0x6a, 0x02, 0x31,
- 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x14, 0x04, 0xaa, 0x00, 0x00,
- 0x00, 0x3c, 0x04, 0xc3, 0x00, 0xed, 0x04, 0xbc, 0x02, 0x65, 0x02, 0xce,
- 0x03, 0xb5, 0x00, 0x78, 0x06, 0x0c, 0x01, 0x7e, 0x02, 0xef, 0x06, 0x0c,
- 0x00, 0xb2, 0x01, 0x00, 0x02, 0x39, 0x00, 0x00, 0x01, 0xc5, 0x03, 0x30,
- 0x04, 0x2b, 0x03, 0xcb, 0x00, 0xda, 0x03, 0xdf, 0x01, 0x07, 0x04, 0xa1,
- 0x00, 0xdb, 0x04, 0x0a, 0x01, 0x17, 0x01, 0xed, 0x02, 0xa7, 0x03, 0x50,
- 0x01, 0x0b, 0x01, 0xbd, 0x04, 0x3e, 0x05, 0x58, 0x00, 0x21, 0x03, 0x9c,
- 0x00, 0xae, 0x03, 0x71, 0x01, 0x7d, 0x00, 0xb5, 0x02, 0x45, 0x00, 0x00,
- 0x0a, 0xfb, 0x08, 0x8c, 0x01, 0x2b, 0x01, 0x4e, 0x01, 0xaa, 0x00, 0x87,
- 0x00, 0x54, 0x01, 0x32, 0x01, 0xf8, 0x03, 0xff, 0x00, 0x03, 0x02, 0x4e,
- 0x00, 0xb4, 0x00, 0x37, 0x03, 0xe3, 0x00, 0x83, 0x00, 0x6b, 0x02, 0xd8,
- 0x00, 0xed, 0x00, 0x77, 0x00, 0x88, 0x00, 0x97, 0x01, 0x64, 0x04, 0x67,
- 0x00, 0x8e, 0x00, 0x33, 0x01, 0x7c, 0x00, 0xe7, 0x00, 0xa6, 0x02, 0x9e,
- 0x03, 0x29, 0x05, 0x6e, 0x06, 0x2a, 0x06, 0x15, 0x01, 0xc9, 0x02, 0x69,
- 0x04, 0x8a, 0x02, 0x13, 0x01, 0xb4, 0x00, 0x02, 0x04, 0xa9, 0x00, 0x00,
- 0x02, 0x39, 0x01, 0x24, 0x01, 0x03, 0x05, 0x14, 0x00, 0x84, 0x01, 0x5d,
- 0x03, 0x9a, 0x06, 0xef, 0x02, 0xd9, 0x00, 0x75, 0x00, 0xcf, 0x04, 0x0a,
- 0x00, 0xde, 0x03, 0xac, 0x04, 0xbc, 0x02, 0xcf, 0x02, 0xae, 0x03, 0x4d,
- 0x04, 0xf0, 0x05, 0x52, 0x01, 0x68, 0x00, 0x6d, 0x00, 0x7d, 0x00, 0x86,
- 0x00, 0x71, 0xff, 0x81, 0x00, 0x79, 0x05, 0x58, 0x04, 0xd2, 0x01, 0x67,
- 0x00, 0x03, 0x01, 0x56, 0x00, 0x25, 0x04, 0xe0, 0x00, 0x94, 0x00, 0x7c,
- 0x03, 0x32, 0x04, 0x21, 0x00, 0x94, 0x00, 0x7f, 0x00, 0x72, 0x00, 0x5c,
- 0x00, 0x2f, 0x00, 0xb6, 0x00, 0x18, 0x00, 0xba, 0x00, 0xb8, 0x00, 0x41,
- 0x03, 0x4d, 0x00, 0x72, 0x00, 0x18, 0x00, 0x1f, 0x00, 0x4c, 0x01, 0x6a,
- 0x01, 0x55, 0x00, 0x99, 0x00, 0x9a, 0x00, 0x9a, 0x00, 0x98, 0x00, 0xb2,
- 0x00, 0x04, 0x00, 0x78, 0x00, 0x69, 0x00, 0x14, 0x00, 0x57, 0x00, 0x6e,
- 0x00, 0xce, 0x00, 0xb4, 0x06, 0x54, 0x02, 0xb8, 0x00, 0x67, 0x05, 0x0e,
- 0x01, 0x65, 0x00, 0xe7, 0x00, 0x00, 0x04, 0xcb, 0x40, 0x41, 0x41, 0x40,
- 0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x3a, 0x39, 0x38, 0x37, 0x35, 0x34, 0x33,
- 0x32, 0x31, 0x30, 0x2f, 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28, 0x27,
- 0x26, 0x25, 0x24, 0x23, 0x22, 0x21, 0x20, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b,
- 0x1a, 0x19, 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f,
- 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03,
- 0x02, 0x01, 0x00, 0x2c, 0x45, 0x23, 0x46, 0x60, 0x20, 0xb0, 0x26, 0x60,
- 0xb0, 0x04, 0x26, 0x23, 0x48, 0x48, 0x2d, 0x2c, 0x45, 0x23, 0x46, 0x23,
- 0x61, 0x20, 0xb0, 0x26, 0x61, 0xb0, 0x04, 0x26, 0x23, 0x48, 0x48, 0x2d,
- 0x2c, 0x45, 0x23, 0x46, 0x60, 0xb0, 0x20, 0x61, 0x20, 0xb0, 0x46, 0x60,
- 0xb0, 0x04, 0x26, 0x23, 0x48, 0x48, 0x2d, 0x2c, 0x45, 0x23, 0x46, 0x23,
- 0x61, 0xb0, 0x20, 0x60, 0x20, 0xb0, 0x26, 0x61, 0xb0, 0x20, 0x61, 0xb0,
- 0x04, 0x26, 0x23, 0x48, 0x48, 0x2d, 0x2c, 0x45, 0x23, 0x46, 0x60, 0xb0,
- 0x40, 0x61, 0x20, 0xb0, 0x66, 0x60, 0xb0, 0x04, 0x26, 0x23, 0x48, 0x48,
- 0x2d, 0x2c, 0x45, 0x23, 0x46, 0x23, 0x61, 0xb0, 0x40, 0x60, 0x20, 0xb0,
- 0x26, 0x61, 0xb0, 0x40, 0x61, 0xb0, 0x04, 0x26, 0x23, 0x48, 0x48, 0x2d,
- 0x2c, 0x01, 0x10, 0x20, 0x3c, 0x00, 0x3c, 0x2d, 0x2c, 0x20, 0x45, 0x23,
- 0x20, 0xb0, 0xcd, 0x44, 0x23, 0x20, 0xb8, 0x01, 0x5a, 0x51, 0x58, 0x23,
- 0x20, 0xb0, 0x8d, 0x44, 0x23, 0x59, 0x20, 0xb0, 0xed, 0x51, 0x58, 0x23,
- 0x20, 0xb0, 0x4d, 0x44, 0x23, 0x59, 0x20, 0xb0, 0x90, 0x51, 0x58, 0x23,
- 0x20, 0xb0, 0x0d, 0x44, 0x23, 0x59, 0x21, 0x21, 0x2d, 0x2c, 0x20, 0x20,
- 0x45, 0x18, 0x68, 0x44, 0x20, 0xb0, 0x01, 0x60, 0x20, 0x45, 0xb0, 0x46,
- 0x76, 0x68, 0x8a, 0x45, 0x60, 0x44, 0x2d, 0x2c, 0x01, 0xb1, 0x0b, 0x0a,
- 0x43, 0x23, 0x43, 0x65, 0x0a, 0x2d, 0x2c, 0x00, 0xb1, 0x0a, 0x0b, 0x43,
- 0x23, 0x43, 0x0b, 0x2d, 0x2c, 0x00, 0xb0, 0x17, 0x23, 0x70, 0xb1, 0x01,
- 0x17, 0x3e, 0x01, 0xb0, 0x17, 0x23, 0x70, 0xb1, 0x02, 0x17, 0x45, 0x3a,
- 0xb1, 0x02, 0x00, 0x08, 0x0d, 0x2d, 0x2c, 0x45, 0xb0, 0x1a, 0x23, 0x44,
- 0x45, 0xb0, 0x19, 0x23, 0x44, 0x2d, 0x2c, 0x20, 0x45, 0xb0, 0x03, 0x25,
- 0x45, 0x61, 0x64, 0xb0, 0x50, 0x51, 0x58, 0x45, 0x44, 0x1b, 0x21, 0x21,
- 0x59, 0x2d, 0x2c, 0xb0, 0x01, 0x43, 0x63, 0x23, 0x62, 0xb0, 0x00, 0x23,
- 0x42, 0xb0, 0x0f, 0x2b, 0x2d, 0x2c, 0x20, 0x45, 0xb0, 0x00, 0x43, 0x60,
- 0x44, 0x2d, 0x2c, 0x01, 0xb0, 0x06, 0x43, 0xb0, 0x07, 0x43, 0x65, 0x0a,
- 0x2d, 0x2c, 0x20, 0x69, 0xb0, 0x40, 0x61, 0xb0, 0x00, 0x8b, 0x20, 0xb1,
- 0x2c, 0xc0, 0x8a, 0x8c, 0xb8, 0x10, 0x00, 0x62, 0x60, 0x2b, 0x0c, 0x64,
- 0x23, 0x64, 0x61, 0x5c, 0x58, 0xb0, 0x03, 0x61, 0x59, 0x2d, 0x2c, 0x45,
- 0xb0, 0x11, 0x2b, 0xb0, 0x17, 0x23, 0x44, 0xb0, 0x17, 0x7a, 0xe4, 0x18,
- 0x2d, 0x2c, 0x45, 0xb0, 0x11, 0x2b, 0xb0, 0x17, 0x23, 0x44, 0x2d, 0x2c,
- 0xb0, 0x12, 0x43, 0x58, 0x87, 0x45, 0xb0, 0x11, 0x2b, 0xb0, 0x17, 0x23,
- 0x44, 0xb0, 0x17, 0x7a, 0xe4, 0x1b, 0x03, 0x8a, 0x45, 0x18, 0x69, 0x20,
- 0xb0, 0x17, 0x23, 0x44, 0x8a, 0x8a, 0x87, 0x20, 0xb0, 0xa0, 0x51, 0x58,
- 0xb0, 0x11, 0x2b, 0xb0, 0x17, 0x23, 0x44, 0xb0, 0x17, 0x7a, 0xe4, 0x1b,
- 0x21, 0xb0, 0x17, 0x7a, 0xe4, 0x59, 0x59, 0x18, 0x2d, 0x2c, 0x2d, 0x2c,
- 0xb0, 0x02, 0x25, 0x46, 0x60, 0x8a, 0x46, 0xb0, 0x40, 0x61, 0x8c, 0x48,
- 0x2d, 0x2c, 0x4b, 0x53, 0x20, 0x5c, 0x58, 0xb0, 0x02, 0x85, 0x59, 0x58,
- 0xb0, 0x01, 0x85, 0x59, 0x2d, 0x2c, 0x20, 0xb0, 0x03, 0x25, 0x45, 0xb0,
- 0x19, 0x23, 0x44, 0x45, 0xb0, 0x1a, 0x23, 0x44, 0x45, 0x65, 0x23, 0x45,
- 0x20, 0xb0, 0x03, 0x25, 0x60, 0x6a, 0x20, 0xb0, 0x09, 0x23, 0x42, 0x23,
- 0x68, 0x8a, 0x6a, 0x60, 0x61, 0x20, 0xb0, 0x1a, 0x8a, 0xb0, 0x00, 0x52,
- 0x79, 0x21, 0xb2, 0x1a, 0x1a, 0x40, 0xb9, 0xff, 0xe0, 0x00, 0x1a, 0x45,
- 0x20, 0x8a, 0x54, 0x58, 0x23, 0x21, 0xb0, 0x3f, 0x1b, 0x23, 0x59, 0x61,
- 0x44, 0x1c, 0xb1, 0x14, 0x00, 0x8a, 0x52, 0x79, 0xb3, 0x19, 0x40, 0x20,
- 0x19, 0x45, 0x20, 0x8a, 0x54, 0x58, 0x23, 0x21, 0xb0, 0x3f, 0x1b, 0x23,
- 0x59, 0x61, 0x44, 0x2d, 0x2c, 0xb1, 0x10, 0x11, 0x43, 0x23, 0x43, 0x0b,
- 0x2d, 0x2c, 0xb1, 0x0e, 0x0f, 0x43, 0x23, 0x43, 0x0b, 0x2d, 0x2c, 0xb1,
- 0x0c, 0x0d, 0x43, 0x23, 0x43, 0x0b, 0x2d, 0x2c, 0xb1, 0x0c, 0x0d, 0x43,
- 0x23, 0x43, 0x65, 0x0b, 0x2d, 0x2c, 0xb1, 0x0e, 0x0f, 0x43, 0x23, 0x43,
- 0x65, 0x0b, 0x2d, 0x2c, 0xb1, 0x10, 0x11, 0x43, 0x23, 0x43, 0x65, 0x0b,
- 0x2d, 0x2c, 0x4b, 0x52, 0x58, 0x45, 0x44, 0x1b, 0x21, 0x21, 0x59, 0x2d,
- 0x2c, 0x01, 0x20, 0xb0, 0x03, 0x25, 0x23, 0x49, 0xb0, 0x40, 0x60, 0xb0,
- 0x20, 0x63, 0x20, 0xb0, 0x00, 0x52, 0x58, 0x23, 0xb0, 0x02, 0x25, 0x38,
- 0x23, 0xb0, 0x02, 0x25, 0x65, 0x38, 0x00, 0x8a, 0x63, 0x38, 0x1b, 0x21,
- 0x21, 0x21, 0x21, 0x21, 0x59, 0x01, 0x2d, 0x2c, 0x4b, 0xb0, 0x64, 0x51,
- 0x58, 0x45, 0x69, 0xb0, 0x09, 0x43, 0x60, 0x8a, 0x10, 0x3a, 0x1b, 0x21,
- 0x21, 0x21, 0x59, 0x2d, 0x2c, 0x01, 0xb0, 0x05, 0x25, 0x10, 0x23, 0x20,
- 0x8a, 0xf5, 0x00, 0xb0, 0x01, 0x60, 0x23, 0xed, 0xec, 0x2d, 0x2c, 0x01,
- 0xb0, 0x05, 0x25, 0x10, 0x23, 0x20, 0x8a, 0xf5, 0x00, 0xb0, 0x01, 0x61,
- 0x23, 0xed, 0xec, 0x2d, 0x2c, 0x01, 0xb0, 0x06, 0x25, 0x10, 0xf5, 0x00,
- 0xed, 0xec, 0x2d, 0x2c, 0x20, 0xb0, 0x01, 0x60, 0x01, 0x10, 0x20, 0x3c,
- 0x00, 0x3c, 0x2d, 0x2c, 0x20, 0xb0, 0x01, 0x61, 0x01, 0x10, 0x20, 0x3c,
- 0x00, 0x3c, 0x2d, 0x2c, 0xb0, 0x2b, 0x2b, 0xb0, 0x2a, 0x2a, 0x2d, 0x2c,
- 0x00, 0xb0, 0x07, 0x43, 0xb0, 0x06, 0x43, 0x0b, 0x2d, 0x2c, 0x3e, 0xb0,
- 0x2a, 0x2a, 0x2d, 0x2c, 0x35, 0x2d, 0x2c, 0x76, 0xb8, 0x02, 0x23, 0x23,
- 0x70, 0x10, 0x20, 0xb8, 0x02, 0x23, 0x45, 0x20, 0xb0, 0x00, 0x50, 0x58,
- 0xb0, 0x01, 0x61, 0x59, 0x3a, 0x2f, 0x18, 0x2d, 0x2c, 0x21, 0x21, 0x0c,
- 0x64, 0x23, 0x64, 0x8b, 0xb8, 0x40, 0x00, 0x62, 0x2d, 0x2c, 0x21, 0xb0,
- 0x80, 0x51, 0x58, 0x0c, 0x64, 0x23, 0x64, 0x8b, 0xb8, 0x20, 0x00, 0x62,
- 0x1b, 0xb2, 0x00, 0x40, 0x2f, 0x2b, 0x59, 0xb0, 0x02, 0x60, 0x2d, 0x2c,
- 0x21, 0xb0, 0xc0, 0x51, 0x58, 0x0c, 0x64, 0x23, 0x64, 0x8b, 0xb8, 0x15,
- 0x55, 0x62, 0x1b, 0xb2, 0x00, 0x80, 0x2f, 0x2b, 0x59, 0xb0, 0x02, 0x60,
- 0x2d, 0x2c, 0x0c, 0x64, 0x23, 0x64, 0x8b, 0xb8, 0x40, 0x00, 0x62, 0x60,
- 0x23, 0x21, 0x2d, 0x2c, 0xb4, 0x00, 0x01, 0x00, 0x00, 0x00, 0x15, 0xb0,
- 0x08, 0x26, 0xb0, 0x08, 0x26, 0xb0, 0x08, 0x26, 0xb0, 0x08, 0x26, 0x0f,
- 0x10, 0x16, 0x13, 0x45, 0x68, 0x3a, 0xb0, 0x01, 0x16, 0x2d, 0x2c, 0xb4,
- 0x00, 0x01, 0x00, 0x00, 0x00, 0x15, 0xb0, 0x08, 0x26, 0xb0, 0x08, 0x26,
- 0xb0, 0x08, 0x26, 0xb0, 0x08, 0x26, 0x0f, 0x10, 0x16, 0x13, 0x45, 0x68,
- 0x65, 0x3a, 0xb0, 0x01, 0x16, 0x2d, 0x2c, 0x4b, 0x53, 0x23, 0x4b, 0x51,
- 0x5a, 0x58, 0x20, 0x45, 0x8a, 0x60, 0x44, 0x1b, 0x21, 0x21, 0x59, 0x2d,
- 0x2c, 0x4b, 0x54, 0x58, 0x20, 0x45, 0x8a, 0x60, 0x44, 0x1b, 0x21, 0x21,
- 0x59, 0x2d, 0x2c, 0x4b, 0x53, 0x23, 0x4b, 0x51, 0x5a, 0x58, 0x38, 0x1b,
- 0x21, 0x21, 0x59, 0x2d, 0x2c, 0x4b, 0x54, 0x58, 0x38, 0x1b, 0x21, 0x21,
- 0x59, 0x2d, 0x2c, 0xb0, 0x13, 0x43, 0x58, 0x03, 0x1b, 0x02, 0x59, 0x2d,
- 0x2c, 0xb0, 0x13, 0x43, 0x58, 0x02, 0x1b, 0x03, 0x59, 0x2d, 0x2c, 0x4b,
- 0x54, 0xb0, 0x12, 0x43, 0x5c, 0x5a, 0x58, 0x38, 0x1b, 0x21, 0x21, 0x59,
- 0x2d, 0x2c, 0xb0, 0x12, 0x43, 0x5c, 0x58, 0x0c, 0xb0, 0x04, 0x25, 0xb0,
- 0x04, 0x25, 0x06, 0x0c, 0x64, 0x23, 0x64, 0x61, 0x64, 0xb8, 0x07, 0x08,
- 0x51, 0x58, 0xb0, 0x04, 0x25, 0xb0, 0x04, 0x25, 0x01, 0x20, 0x46, 0xb0,
- 0x10, 0x60, 0x48, 0x20, 0x46, 0xb0, 0x10, 0x60, 0x48, 0x59, 0x0a, 0x21,
- 0x21, 0x1b, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0xb0, 0x12, 0x43, 0x5c, 0x58,
- 0x0c, 0xb0, 0x04, 0x25, 0xb0, 0x04, 0x25, 0x06, 0x0c, 0x64, 0x23, 0x64,
- 0x61, 0x64, 0xb8, 0x07, 0x08, 0x51, 0x58, 0xb0, 0x04, 0x25, 0xb0, 0x04,
- 0x25, 0x01, 0x20, 0x46, 0xb8, 0xff, 0xf0, 0x60, 0x48, 0x20, 0x46, 0xb8,
- 0xff, 0xf0, 0x60, 0x48, 0x59, 0x0a, 0x21, 0x21, 0x1b, 0x21, 0x21, 0x59,
- 0x2d, 0x2c, 0x4b, 0x53, 0x23, 0x4b, 0x51, 0x5a, 0x58, 0xb0, 0x3a, 0x2b,
- 0x1b, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0x4b, 0x53, 0x23, 0x4b, 0x51, 0x5a,
- 0x58, 0xb0, 0x3b, 0x2b, 0x1b, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0x4b, 0x53,
- 0x23, 0x4b, 0x51, 0x5a, 0xb0, 0x12, 0x43, 0x5c, 0x5a, 0x58, 0x38, 0x1b,
- 0x21, 0x21, 0x59, 0x2d, 0x2c, 0x0c, 0x8a, 0x03, 0x4b, 0x54, 0xb0, 0x04,
- 0x26, 0x02, 0x4b, 0x54, 0x5a, 0x8a, 0x8a, 0x0a, 0xb0, 0x12, 0x43, 0x5c,
- 0x5a, 0x58, 0x38, 0x1b, 0x21, 0x21, 0x59, 0x2d, 0x2c, 0x4b, 0x52, 0x58,
- 0xb0, 0x04, 0x25, 0xb0, 0x04, 0x25, 0x49, 0xb0, 0x04, 0x25, 0xb0, 0x04,
- 0x25, 0x49, 0x61, 0x20, 0xb0, 0x00, 0x54, 0x58, 0x21, 0x20, 0x43, 0xb0,
- 0x00, 0x55, 0x58, 0xb0, 0x03, 0x25, 0xb0, 0x03, 0x25, 0xb8, 0xff, 0xc0,
- 0x38, 0xb8, 0xff, 0xc0, 0x38, 0x59, 0x1b, 0xb0, 0x40, 0x54, 0x58, 0x20,
- 0x43, 0xb0, 0x00, 0x54, 0x58, 0xb0, 0x02, 0x25, 0xb8, 0xff, 0xc0, 0x38,
- 0x59, 0x1b, 0x20, 0x43, 0xb0, 0x00, 0x54, 0x58, 0xb0, 0x03, 0x25, 0xb0,
- 0x03, 0x25, 0xb8, 0xff, 0xc0, 0x38, 0xb8, 0xff, 0xc0, 0x38, 0x1b, 0xb0,
- 0x03, 0x25, 0xb8, 0xff, 0xc0, 0x38, 0x59, 0x59, 0x59, 0x59, 0x21, 0x21,
- 0x21, 0x21, 0x2d, 0x2c, 0x46, 0x23, 0x46, 0x60, 0x8a, 0x8a, 0x46, 0x23,
- 0x20, 0x46, 0x8a, 0x60, 0x8a, 0x61, 0xb8, 0xff, 0x80, 0x62, 0x23, 0x20,
- 0x10, 0x23, 0x8a, 0xb9, 0x02, 0xc2, 0x02, 0xc2, 0x8a, 0x70, 0x45, 0x60,
- 0x20, 0xb0, 0x00, 0x50, 0x58, 0xb0, 0x01, 0x61, 0xb8, 0xff, 0xba, 0x8b,
- 0x1b, 0xb0, 0x46, 0x8c, 0x59, 0xb0, 0x10, 0x60, 0x68, 0x01, 0x3a, 0x2d,
- 0xb8, 0x02, 0xc1, 0xb3, 0x24, 0x12, 0x1f, 0xff, 0x41, 0x11, 0x02, 0xbf,
- 0x00, 0x01, 0x00, 0x1f, 0x02, 0xbf, 0x00, 0x2f, 0x02, 0xbf, 0x00, 0x3f,
- 0x02, 0xbf, 0x00, 0x4f, 0x02, 0xbf, 0x00, 0x5f, 0x02, 0xbf, 0x00, 0x8f,
- 0x02, 0xbf, 0x00, 0x06, 0x02, 0xbf, 0x02, 0x22, 0xb2, 0x64, 0x1f, 0x12,
- 0x41, 0x0b, 0x02, 0xbb, 0x00, 0xca, 0x08, 0x00, 0x00, 0x1f, 0x02, 0xb2,
- 0x00, 0xe9, 0x08, 0x00, 0x00, 0x1f, 0x02, 0xa6, 0x00, 0xa2, 0x08, 0x00,
- 0x40, 0x6a, 0x1f, 0x40, 0x26, 0x43, 0x49, 0x32, 0x40, 0x20, 0x43, 0x49,
- 0x32, 0x40, 0x26, 0x3a, 0x3d, 0x32, 0x40, 0x20, 0x3a, 0x3d, 0x32, 0x9f,
- 0x20, 0x9f, 0x26, 0x02, 0x40, 0x26, 0x96, 0x99, 0x32, 0x40, 0x20, 0x96,
- 0x99, 0x32, 0x40, 0x26, 0x8e, 0x92, 0x32, 0x40, 0x20, 0x8e, 0x92, 0x32,
- 0x40, 0x26, 0x84, 0x8c, 0x32, 0x40, 0x20, 0x84, 0x8c, 0x32, 0x40, 0x26,
- 0x7a, 0x81, 0x32, 0x40, 0x20, 0x7a, 0x81, 0x32, 0x40, 0x26, 0x6c, 0x76,
- 0x32, 0x40, 0x20, 0x6c, 0x76, 0x32, 0x40, 0x26, 0x64, 0x6a, 0x32, 0x40,
- 0x20, 0x64, 0x6a, 0x32, 0x40, 0x26, 0x5a, 0x5f, 0x32, 0x40, 0x20, 0x5a,
- 0x5f, 0x32, 0x40, 0x26, 0x4f, 0x54, 0x32, 0x40, 0x20, 0x4f, 0x54, 0x32,
- 0xb8, 0x02, 0x9e, 0xb7, 0x24, 0x27, 0x1f, 0x37, 0x4f, 0x6b, 0x01, 0x20,
- 0x41, 0x0f, 0x02, 0x77, 0x00, 0x30, 0x02, 0x77, 0x00, 0x40, 0x02, 0x77,
- 0x00, 0x50, 0x02, 0x77, 0x00, 0x04, 0x02, 0x77, 0x02, 0x77, 0x02, 0x77,
- 0x00, 0xf9, 0x04, 0x00, 0x00, 0x1f, 0x02, 0x9b, 0xb2, 0x2a, 0x2a, 0x1f,
- 0xb8, 0x02, 0x9a, 0x40, 0x2b, 0x29, 0x2a, 0x1f, 0x80, 0xba, 0x01, 0x80,
- 0xbc, 0x01, 0x80, 0x52, 0x01, 0x80, 0xa2, 0x01, 0x80, 0x65, 0x01, 0x80,
- 0x7e, 0x01, 0x80, 0x81, 0x01, 0x80, 0x3c, 0x01, 0x80, 0x5e, 0x01, 0x80,
- 0x2b, 0x01, 0x80, 0x1c, 0x01, 0x80, 0x1e, 0x01, 0x80, 0x40, 0x01, 0x80,
- 0xbb, 0x01, 0x38, 0x00, 0x01, 0x00, 0x80, 0x01, 0x40, 0xb4, 0x01, 0x80,
- 0x40, 0x01, 0x80, 0xbb, 0x01, 0x38, 0x00, 0x01, 0x00, 0x80, 0x01, 0x39,
- 0x40, 0x18, 0x01, 0x80, 0xca, 0x01, 0x80, 0xad, 0x01, 0x80, 0x73, 0x01,
- 0x80, 0x26, 0x01, 0x80, 0x25, 0x01, 0x80, 0x24, 0x01, 0x80, 0x20, 0x01,
- 0x37, 0x40, 0xb8, 0x02, 0x21, 0xb2, 0x49, 0x33, 0x40, 0xb8, 0x02, 0x21,
- 0xb2, 0x45, 0x33, 0x40, 0xb8, 0x02, 0x21, 0xb3, 0x41, 0x42, 0x32, 0x40,
- 0xb8, 0x02, 0x21, 0xb3, 0x3d, 0x3e, 0x32, 0x0f, 0x41, 0x0f, 0x02, 0x21,
- 0x00, 0x3f, 0x02, 0x21, 0x00, 0x7f, 0x02, 0x21, 0x00, 0x03, 0x00, 0xbf,
- 0x02, 0x21, 0x00, 0xcf, 0x02, 0x21, 0x00, 0xff, 0x02, 0x21, 0x00, 0x03,
- 0x00, 0x40, 0x02, 0x21, 0xb3, 0x20, 0x22, 0x32, 0x40, 0xb8, 0x02, 0x21,
- 0xb3, 0x19, 0x1e, 0x32, 0x40, 0xb8, 0x02, 0x22, 0xb3, 0x2a, 0x3f, 0x32,
- 0x40, 0xb8, 0x02, 0x21, 0xb3, 0x2e, 0x3a, 0x32, 0x6f, 0x41, 0x48, 0x02,
- 0xc3, 0x00, 0x7f, 0x02, 0xc3, 0x00, 0x8f, 0x02, 0xc3, 0x00, 0xdf, 0x02,
- 0xc3, 0x00, 0x04, 0x00, 0x2f, 0x02, 0xc3, 0x00, 0x60, 0x02, 0xc3, 0x00,
- 0xcf, 0x02, 0xc3, 0x00, 0x03, 0x00, 0x0f, 0x02, 0xc3, 0x00, 0x3f, 0x02,
- 0xc3, 0x00, 0x5f, 0x02, 0xc3, 0x00, 0xc0, 0x02, 0xc3, 0x00, 0xef, 0x02,
- 0xc3, 0x00, 0xff, 0x02, 0xc3, 0x00, 0x06, 0x00, 0xdf, 0x02, 0x22, 0x00,
- 0x01, 0x00, 0x8f, 0x02, 0x22, 0x00, 0x01, 0x00, 0x0f, 0x02, 0x22, 0x00,
- 0x2f, 0x02, 0x22, 0x00, 0x3f, 0x02, 0x22, 0x00, 0x5f, 0x02, 0x22, 0x00,
- 0x7f, 0x02, 0x22, 0x00, 0xef, 0x02, 0x22, 0x00, 0x06, 0x00, 0xbf, 0x02,
- 0x21, 0x00, 0xef, 0x02, 0x21, 0x00, 0x02, 0x00, 0x6f, 0x02, 0x21, 0x00,
- 0x7f, 0x02, 0x21, 0x00, 0xaf, 0x02, 0x21, 0x00, 0x03, 0x00, 0x2f, 0x02,
- 0x21, 0x00, 0x3f, 0x02, 0x21, 0x00, 0x4f, 0x02, 0x21, 0x00, 0x03, 0x02,
- 0xc3, 0x02, 0xc3, 0x02, 0x22, 0x02, 0x22, 0x02, 0x21, 0x02, 0x21, 0x40,
- 0x1d, 0x10, 0x1c, 0x10, 0x2b, 0x10, 0x48, 0x03, 0x8f, 0x1c, 0x01, 0x0f,
- 0x1e, 0x01, 0x4f, 0x1e, 0xff, 0x1e, 0x02, 0x37, 0x00, 0x16, 0x16, 0x00,
- 0x00, 0x00, 0x12, 0x11, 0x08, 0x11, 0xb8, 0x01, 0x0d, 0xb6, 0xf7, 0x0d,
- 0xf8, 0xf7, 0x0d, 0x00, 0x09, 0x41, 0x09, 0x02, 0x8e, 0x02, 0x8f, 0x00,
- 0x1d, 0x00, 0x1f, 0x02, 0x90, 0x02, 0x8f, 0x00, 0x1d, 0x00, 0x1f, 0x02,
- 0x8f, 0xb2, 0xf9, 0x1d, 0x1f, 0xb8, 0x01, 0x98, 0xb2, 0x26, 0xbb, 0x1f,
- 0x41, 0x15, 0x01, 0x97, 0x00, 0x1e, 0x04, 0x01, 0x00, 0x1f, 0x01, 0x39,
- 0x00, 0x26, 0x01, 0x25, 0x00, 0x1f, 0x01, 0x38, 0x00, 0x73, 0x04, 0x01,
- 0x00, 0x1f, 0x01, 0x35, 0x00, 0x1c, 0x08, 0x01, 0x00, 0x1f, 0x01, 0x34,
- 0x00, 0x1c, 0x02, 0xab, 0x00, 0x1f, 0x01, 0x32, 0xb2, 0x1c, 0x56, 0x1f,
- 0xb8, 0x01, 0x0f, 0xb2, 0x26, 0x2c, 0x1f, 0xba, 0x01, 0x0e, 0x00, 0x1e,
- 0x04, 0x01, 0xb6, 0x1f, 0xf9, 0x1c, 0xe4, 0x1f, 0xe9, 0x1c, 0xb8, 0x02,
- 0x01, 0xb6, 0x1f, 0xe8, 0x1c, 0xbb, 0x1f, 0xd7, 0x20, 0xb8, 0x04, 0x01,
- 0xb2, 0x1f, 0xd5, 0x1c, 0xb8, 0x02, 0xab, 0xb6, 0x1f, 0xd4, 0x1c, 0x89,
- 0x1f, 0xc9, 0x2f, 0xb8, 0x08, 0x01, 0xb2, 0x1f, 0xbc, 0x26, 0xb8, 0x01,
- 0x01, 0xb2, 0x1f, 0xba, 0x20, 0xb8, 0x02, 0x01, 0xb6, 0x1f, 0xb9, 0x1c,
- 0x38, 0x1f, 0xad, 0xca, 0xb8, 0x04, 0x01, 0xb2, 0x1f, 0x81, 0x26, 0xb8,
- 0x01, 0x9a, 0xb2, 0x1f, 0x7e, 0x26, 0xb8, 0x01, 0x9a, 0xb6, 0x1f, 0x7d,
- 0x1c, 0x47, 0x1f, 0x6b, 0x1c, 0xb8, 0x04, 0x01, 0xb2, 0x1f, 0x65, 0x26,
- 0xb8, 0x01, 0x9a, 0xb2, 0x1f, 0x5e, 0x73, 0xb8, 0x04, 0x01, 0x40, 0x0f,
- 0x1f, 0x52, 0x26, 0x5a, 0x1f, 0x48, 0x1c, 0x89, 0x1f, 0x44, 0x1c, 0x62,
- 0x1f, 0x40, 0x73, 0xb8, 0x08, 0x01, 0xb6, 0x1f, 0x3f, 0x1c, 0x5e, 0x1f,
- 0x3c, 0x26, 0xb8, 0x01, 0x9a, 0xb2, 0x1f, 0x35, 0x1c, 0xb8, 0x04, 0x01,
- 0xb6, 0x1f, 0x30, 0x1c, 0xbb, 0x1f, 0x2b, 0x1c, 0xb8, 0x04, 0x01, 0xb6,
- 0x1f, 0x2a, 0x1c, 0x56, 0x1f, 0x29, 0x1c, 0xb8, 0x01, 0x01, 0xb2, 0x1f,
- 0x23, 0x1e, 0xb8, 0x04, 0x01, 0xb2, 0x1f, 0x55, 0x37, 0xb8, 0x01, 0x68,
- 0x40, 0x2c, 0x07, 0x96, 0x07, 0x58, 0x07, 0x4f, 0x07, 0x36, 0x07, 0x32,
- 0x07, 0x2c, 0x07, 0x21, 0x07, 0x1f, 0x07, 0x1d, 0x07, 0x1b, 0x07, 0x14,
- 0x08, 0x12, 0x08, 0x10, 0x08, 0x0e, 0x08, 0x0c, 0x08, 0x0a, 0x08, 0x08,
- 0x08, 0x06, 0x08, 0x04, 0x08, 0x02, 0x08, 0x00, 0x08, 0x14, 0xb8, 0xff,
- 0xe0, 0x40, 0x2b, 0x00, 0x00, 0x01, 0x00, 0x14, 0x06, 0x10, 0x00, 0x00,
- 0x01, 0x00, 0x06, 0x04, 0x00, 0x00, 0x01, 0x00, 0x04, 0x10, 0x00, 0x00,
- 0x01, 0x00, 0x10, 0x02, 0x00, 0x00, 0x01, 0x00, 0x02, 0x00, 0x00, 0x00,
- 0x01, 0x00, 0x00, 0x02, 0x01, 0x08, 0x02, 0x00, 0x4a, 0x00, 0xb0, 0x13,
- 0x03, 0x4b, 0x02, 0x4b, 0x53, 0x42, 0x01, 0x4b, 0xb0, 0xc0, 0x63, 0x00,
- 0x4b, 0x62, 0x20, 0xb0, 0xf6, 0x53, 0x23, 0xb8, 0x01, 0x0a, 0x51, 0x5a,
- 0xb0, 0x05, 0x23, 0x42, 0x01, 0xb0, 0x12, 0x4b, 0x00, 0x4b, 0x54, 0x42,
- 0xb0, 0x38, 0x2b, 0x4b, 0xb8, 0x07, 0xff, 0x52, 0xb0, 0x37, 0x2b, 0x4b,
- 0xb0, 0x07, 0x50, 0x5b, 0x58, 0xb1, 0x01, 0x01, 0x8e, 0x59, 0xb0, 0x38,
- 0x2b, 0xb0, 0x02, 0x88, 0xb8, 0x01, 0x00, 0x54, 0x58, 0xb8, 0x01, 0xff,
- 0xb1, 0x01, 0x01, 0x8e, 0x85, 0x1b, 0xb0, 0x12, 0x43, 0x58, 0xb9, 0x00,
- 0x01, 0x01, 0x11, 0x85, 0x8d, 0x1b, 0xb9, 0x00, 0x01, 0x01, 0x28, 0x85,
- 0x8d, 0x59, 0x59, 0x00, 0x18, 0x16, 0x76, 0x3f, 0x18, 0x3f, 0x12, 0x3e,
- 0x11, 0x39, 0x46, 0x44, 0x3e, 0x11, 0x39, 0x46, 0x44, 0x3e, 0x11, 0x39,
- 0x46, 0x44, 0x3e, 0x11, 0x39, 0x46, 0x44, 0x3e, 0x11, 0x39, 0x46, 0x60,
- 0x44, 0x3e, 0x11, 0x39, 0x46, 0x60, 0x44, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b,
- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x18, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b,
- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x18, 0x2b, 0x1d, 0xb0, 0x96, 0x4b,
- 0x53, 0x58, 0xb0, 0xaa, 0x1d, 0x59, 0xb0, 0x32, 0x4b, 0x53, 0x58, 0xb0,
- 0xff, 0x1d, 0x59, 0x4b, 0xb0, 0x93, 0x53, 0x20, 0x5c, 0x58, 0xb9, 0x01,
- 0xf2, 0x01, 0xf0, 0x45, 0x44, 0xb9, 0x01, 0xf1, 0x01, 0xf0, 0x45, 0x44,
- 0x59, 0x58, 0xb9, 0x03, 0x3e, 0x01, 0xf2, 0x45, 0x52, 0x58, 0xb9, 0x01,
- 0xf2, 0x03, 0x3e, 0x44, 0x59, 0x59, 0x4b, 0xb8, 0x01, 0x56, 0x53, 0x20,
- 0x5c, 0x58, 0xb9, 0x00, 0x20, 0x01, 0xf1, 0x45, 0x44, 0xb9, 0x00, 0x26,
- 0x01, 0xf1, 0x45, 0x44, 0x59, 0x58, 0xb9, 0x08, 0x1e, 0x00, 0x20, 0x45,
- 0x52, 0x58, 0xb9, 0x00, 0x20, 0x08, 0x1e, 0x44, 0x59, 0x59, 0x4b, 0xb8,
- 0x01, 0x9a, 0x53, 0x20, 0x5c, 0x58, 0xb9, 0x00, 0x25, 0x01, 0xf2, 0x45,
- 0x44, 0xb9, 0x00, 0x24, 0x01, 0xf2, 0x45, 0x44, 0x59, 0x58, 0xb9, 0x09,
- 0x09, 0x00, 0x25, 0x45, 0x52, 0x58, 0xb9, 0x00, 0x25, 0x09, 0x09, 0x44,
- 0x59, 0x59, 0x4b, 0xb8, 0x04, 0x01, 0x53, 0x20, 0x5c, 0x58, 0xb1, 0x73,
- 0x24, 0x45, 0x44, 0xb1, 0x24, 0x24, 0x45, 0x44, 0x59, 0x58, 0xb9, 0x17,
- 0x20, 0x00, 0x73, 0x45, 0x52, 0x58, 0xb9, 0x00, 0x73, 0x17, 0x20, 0x44,
- 0x59, 0x59, 0x4b, 0xb8, 0x04, 0x01, 0x53, 0x20, 0x5c, 0x58, 0xb1, 0xca,
- 0x25, 0x45, 0x44, 0xb1, 0x25, 0x25, 0x45, 0x44, 0x59, 0x58, 0xb9, 0x16,
- 0x80, 0x00, 0xca, 0x45, 0x52, 0x58, 0xb9, 0x00, 0xca, 0x16, 0x80, 0x44,
- 0x59, 0x59, 0x4b, 0xb0, 0x3e, 0x53, 0x20, 0x5c, 0x58, 0xb1, 0x1c, 0x1c,
- 0x45, 0x44, 0xb1, 0x1e, 0x1c, 0x45, 0x44, 0x59, 0x58, 0xb9, 0x01, 0x1a,
- 0x00, 0x1c, 0x45, 0x52, 0x58, 0xb9, 0x00, 0x1c, 0x01, 0x1a, 0x44, 0x59,
- 0x59, 0x4b, 0xb0, 0x56, 0x53, 0x20, 0x5c, 0x58, 0xb1, 0x1c, 0x1c, 0x45,
- 0x44, 0xb1, 0x2f, 0x1c, 0x45, 0x44, 0x59, 0x58, 0xb9, 0x01, 0x89, 0x00,
- 0x1c, 0x45, 0x52, 0x58, 0xb9, 0x00, 0x1c, 0x01, 0x89, 0x44, 0x59, 0x59,
- 0x4b, 0xb8, 0x03, 0x01, 0x53, 0x20, 0x5c, 0x58, 0xb1, 0x1c, 0x1c, 0x45,
- 0x44, 0xb1, 0x1c, 0x1c, 0x45, 0x44, 0x59, 0x58, 0xb9, 0x0d, 0xe0, 0x00,
- 0x1c, 0x45, 0x52, 0x58, 0xb9, 0x00, 0x1c, 0x0d, 0xe0, 0x44, 0x59, 0x59,
- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b,
- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b,
- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b,
- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x65, 0x42, 0x2b, 0x2b, 0x01, 0xb3, 0x3b,
- 0x59, 0x63, 0x5c, 0x45, 0x65, 0x23, 0x45, 0x60, 0x23, 0x45, 0x65, 0x60,
- 0x23, 0x45, 0x60, 0xb0, 0x8b, 0x76, 0x68, 0x18, 0xb0, 0x80, 0x62, 0x20,
- 0x20, 0xb1, 0x63, 0x59, 0x45, 0x65, 0x23, 0x45, 0x20, 0xb0, 0x03, 0x26,
- 0x60, 0x62, 0x63, 0x68, 0x20, 0xb0, 0x03, 0x26, 0x61, 0x65, 0xb0, 0x59,
- 0x23, 0x65, 0x44, 0xb0, 0x63, 0x23, 0x44, 0x20, 0xb1, 0x3b, 0x5c, 0x45,
- 0x65, 0x23, 0x45, 0x20, 0xb0, 0x03, 0x26, 0x60, 0x62, 0x63, 0x68, 0x20,
- 0xb0, 0x03, 0x26, 0x61, 0x65, 0xb0, 0x5c, 0x23, 0x65, 0x44, 0xb0, 0x3b,
- 0x23, 0x44, 0xb1, 0x00, 0x5c, 0x45, 0x54, 0x58, 0xb1, 0x5c, 0x40, 0x65,
- 0x44, 0xb2, 0x3b, 0x40, 0x3b, 0x45, 0x23, 0x61, 0x44, 0x59, 0xb3, 0x47,
- 0x50, 0x34, 0x37, 0x45, 0x65, 0x23, 0x45, 0x60, 0x23, 0x45, 0x65, 0x60,
- 0x23, 0x45, 0x60, 0xb0, 0x89, 0x76, 0x68, 0x18, 0xb0, 0x80, 0x62, 0x20,
- 0x20, 0xb1, 0x34, 0x50, 0x45, 0x65, 0x23, 0x45, 0x20, 0xb0, 0x03, 0x26,
- 0x60, 0x62, 0x63, 0x68, 0x20, 0xb0, 0x03, 0x26, 0x61, 0x65, 0xb0, 0x50,
- 0x23, 0x65, 0x44, 0xb0, 0x34, 0x23, 0x44, 0x20, 0xb1, 0x47, 0x37, 0x45,
- 0x65, 0x23, 0x45, 0x20, 0xb0, 0x03, 0x26, 0x60, 0x62, 0x63, 0x68, 0x20,
- 0xb0, 0x03, 0x26, 0x61, 0x65, 0xb0, 0x37, 0x23, 0x65, 0x44, 0xb0, 0x47,
- 0x23, 0x44, 0xb1, 0x00, 0x37, 0x45, 0x54, 0x58, 0xb1, 0x37, 0x40, 0x65,
- 0x44, 0xb2, 0x47, 0x40, 0x47, 0x45, 0x23, 0x61, 0x44, 0x59, 0x00, 0x4b,
- 0x53, 0x42, 0x01, 0x4b, 0x50, 0x58, 0xb1, 0x08, 0x00, 0x42, 0x59, 0x43,
- 0x5c, 0x58, 0xb1, 0x08, 0x00, 0x42, 0x59, 0xb3, 0x02, 0x0b, 0x0a, 0x12,
- 0x43, 0x58, 0x60, 0x1b, 0x21, 0x59, 0x42, 0x16, 0x10, 0x70, 0x3e, 0xb0,
- 0x12, 0x43, 0x58, 0xb9, 0x3b, 0x21, 0x18, 0x7e, 0x1b, 0xba, 0x04, 0x00,
- 0x01, 0xa8, 0x00, 0x0b, 0x2b, 0x59, 0xb0, 0x0c, 0x23, 0x42, 0xb0, 0x0d,
- 0x23, 0x42, 0xb0, 0x12, 0x43, 0x58, 0xb9, 0x2d, 0x41, 0x2d, 0x41, 0x1b,
- 0xba, 0x04, 0x00, 0x04, 0x00, 0x00, 0x0b, 0x2b, 0x59, 0xb0, 0x0e, 0x23,
- 0x42, 0xb0, 0x0f, 0x23, 0x42, 0xb0, 0x12, 0x43, 0x58, 0xb9, 0x18, 0x7e,
- 0x3b, 0x21, 0x1b, 0xba, 0x01, 0xa8, 0x04, 0x00, 0x00, 0x0b, 0x2b, 0x59,
- 0xb0, 0x10, 0x23, 0x42, 0xb0, 0x11, 0x23, 0x42, 0x00, 0x2b, 0x74, 0x75,
- 0x73, 0x75, 0x00, 0x18, 0x45, 0x69, 0x44, 0x45, 0x69, 0x44, 0x45, 0x69,
- 0x44, 0x73, 0x73, 0x73, 0x73, 0x74, 0x75, 0x73, 0x74, 0x75, 0x2b, 0x2b,
- 0x2b, 0x2b, 0x74, 0x75, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x73, 0x73, 0x73,
- 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73,
- 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, 0x2b, 0x2b,
- 0x2b, 0x45, 0xb0, 0x40, 0x61, 0x44, 0x73, 0x74, 0x00, 0x00, 0x4b, 0xb0,
- 0x2a, 0x53, 0x4b, 0xb0, 0x3f, 0x51, 0x5a, 0x58, 0xb1, 0x07, 0x07, 0x45,
- 0xb0, 0x40, 0x60, 0x44, 0x59, 0x00, 0x4b, 0xb0, 0x3a, 0x53, 0x4b, 0xb0,
- 0x3f, 0x51, 0x5a, 0x58, 0xb1, 0x0b, 0x0b, 0x45, 0xb8, 0xff, 0xc0, 0x60,
- 0x44, 0x59, 0x00, 0x4b, 0xb0, 0x2e, 0x53, 0x4b, 0xb0, 0x3a, 0x51, 0x5a,
- 0x58, 0xb1, 0x03, 0x03, 0x45, 0xb0, 0x40, 0x60, 0x44, 0x59, 0x00, 0x4b,
- 0xb0, 0x2e, 0x53, 0x4b, 0xb0, 0x3c, 0x51, 0x5a, 0x58, 0xb1, 0x09, 0x09,
- 0x45, 0xb8, 0xff, 0xc0, 0x60, 0x44, 0x59, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b,
- 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b,
- 0x2b, 0x75, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x2b, 0x43, 0x5c, 0x58,
- 0xb9, 0x00, 0x80, 0x02, 0xbb, 0xb3, 0x01, 0x40, 0x1e, 0x01, 0x74, 0x00,
- 0x73, 0x59, 0x03, 0xb0, 0x1e, 0x4b, 0x54, 0x02, 0xb0, 0x12, 0x4b, 0x54,
- 0x5a, 0xb0, 0x12, 0x43, 0x5c, 0x5a, 0x58, 0xba, 0x00, 0x9f, 0x02, 0x22,
- 0x00, 0x01, 0x00, 0x73, 0x59, 0x00, 0x2b, 0x74, 0x73, 0x01, 0x2b, 0x00
-};
-unsigned int doxfont_len = 32760;
-
-void writeLogo(const char *dir)
-{
- QCString fileName=(QCString)dir+"/doxygen.png";
- QFile f(fileName);
- if (f.open(IO_WriteOnly))
- f.writeBlock((char *)doxygen_png_data,doxygen_png_len);
- else
- {
- fprintf(stderr,"Warning: Cannot open file %s for writing\n",fileName.data());
- }
- f.close();
-}
-
-void writeSearchButton(const char *dir)
-{
- QCString fileName=(QCString)dir+"/search.png";
- QFile f(fileName);
- if (f.open(IO_WriteOnly))
- f.writeBlock((char *)search_png,search_png_len);
- else
- {
- fprintf(stderr,"Warning: Cannot open file %s for writing\n",fileName.data());
- }
- f.close();
-}
-
-void writeDoxFont(const char *dir)
-{
- QCString fileName=(QCString)dir+"/Helvetica.ttf";
- QFile f(fileName);
- if (f.open(IO_WriteOnly))
- f.writeBlock((char *)doxfont_data,doxfont_len);
- else
- {
- fprintf(stderr,"Warning: Cannot open file %s for writing\n",fileName.data());
- }
- f.close();
-}
-
-void removeDoxFont(const char *dir)
-{
- QDir d(dir);
- d.remove("Helvetica.ttf");
-}
diff --git a/src/logos.h b/src/logos.h
deleted file mode 100644
index a2d6356..0000000
--- a/src/logos.h
+++ /dev/null
@@ -1,27 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 LOGOS_H
-#define LOGOS_H
-
-extern void writeLogo(const char *dir);
-//extern void writeNullImage(const char *dir);
-extern void writeSearchButton(const char *dir);
-extern void writeDoxFont(const char *dir);
-extern void removeDoxFont(const char *dir);
-
-#endif
diff --git a/src/main.cpp b/src/main.cpp
deleted file mode 100644
index 15887a8..0000000
--- a/src/main.cpp
+++ /dev/null
@@ -1,40 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 "doxygen.h"
-
-/*! \file
- * \brief main entry point for doxygen
- *
- * This file contains main()
- */
-
-/*! Default main. The idea of separating this from the rest of doxygen,
- * is to make it possible to write your own main, with a different
- * generateOutput() function for instance.
- */
-int main(int argc,char **argv)
-{
- initDoxygen();
-
- readConfiguration(argc,argv);
- parseInput();
- generateOutput();
- return 0;
-}
-
diff --git a/src/mandocvisitor.cpp b/src/mandocvisitor.cpp
deleted file mode 100644
index 706a4eb..0000000
--- a/src/mandocvisitor.cpp
+++ /dev/null
@@ -1,934 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 "mandocvisitor.h"
-#include "docparser.h"
-#include "language.h"
-#include "doxygen.h"
-#include "outputgen.h"
-#include "code.h"
-#include "dot.h"
-#include "util.h"
-#include "message.h"
-#include <qfileinfo.h>
-#include "parserintf.h"
-
-ManDocVisitor::ManDocVisitor(QTextStream &t,CodeOutputInterface &ci,
- const char *langExt)
- : DocVisitor(DocVisitor_Man), m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE), m_firstCol(TRUE),
- m_indent(0), m_langExt(langExt)
-{
-}
-
- //--------------------------------------
- // visitor functions for leaf nodes
- //--------------------------------------
-
-void ManDocVisitor::visit(DocWord *w)
-{
- if (m_hide) return;
- filter(w->word());
- m_firstCol=FALSE;
-}
-
-void ManDocVisitor::visit(DocLinkedWord *w)
-{
- if (m_hide) return;
- m_t << "\\fB";
- filter(w->word());
- m_t << "\\fP";
- m_firstCol=FALSE;
-}
-
-void ManDocVisitor::visit(DocWhiteSpace *w)
-{
- if (m_hide) return;
- if (m_insidePre)
- {
- m_t << w->chars();
- m_firstCol=w->chars().at(w->chars().length()-1)=='\n';
- }
- else
- {
- m_t << " ";
- m_firstCol=FALSE;
- }
-}
-
-void ManDocVisitor::visit(DocSymbol *s)
-{
- if (m_hide) return;
- switch(s->symbol())
- {
- case DocSymbol::BSlash: m_t << "\\\\"; break;
- case DocSymbol::At: m_t << "@"; break;
- case DocSymbol::Less: m_t << "<"; break;
- case DocSymbol::Greater: m_t << ">"; break;
- case DocSymbol::Amp: m_t << "&"; break;
- case DocSymbol::Dollar: m_t << "$"; break;
- case DocSymbol::Hash: m_t << "#"; break;
- case DocSymbol::Percent: m_t << "%"; break;
- case DocSymbol::Copy: m_t << "(C)"; break;
- case DocSymbol::Tm: m_t << "(TM)"; break;
- case DocSymbol::Reg: m_t << "(R)"; break;
- case DocSymbol::Apos: m_t << "'"; break;
- case DocSymbol::Quot: m_t << "''"; break;
- case DocSymbol::Uml: m_t << s->letter() << "\\*(4"; break;
- case DocSymbol::Acute: m_t << s->letter() << "\\*(`"; break;
- case DocSymbol::Grave: m_t << s->letter() << "\\*:"; break;
- case DocSymbol::Circ: m_t << s->letter() << "\\*^"; break;
- case DocSymbol::Slash: m_t << s->letter(); break; /* todo: implement this */
- case DocSymbol::Tilde: m_t << s->letter() << "\\*~"; break;
- case DocSymbol::Szlig: m_t << "s\\*:"; break;
- case DocSymbol::Cedil: m_t << s->letter() << "\\*,"; break;
- case DocSymbol::Ring: m_t << s->letter() << "\\*o"; break;
- case DocSymbol::Nbsp: m_t << " "; break;
- default:
- err("Error: unknown symbol found\n");
- }
- m_firstCol=FALSE;
-}
-
-void ManDocVisitor::visit(DocURL *u)
-{
- if (m_hide) return;
- m_t << u->url();
- m_firstCol=FALSE;
-}
-
-void ManDocVisitor::visit(DocLineBreak *)
-{
- if (m_hide) return;
- m_t << endl << ".br" << endl;
- m_firstCol=TRUE;
-}
-
-void ManDocVisitor::visit(DocHorRuler *)
-{
- if (m_hide) return;
- if (!m_firstCol) m_t << endl;
- m_t << ".PP" << endl;
- m_firstCol=TRUE;
-}
-
-void ManDocVisitor::visit(DocStyleChange *s)
-{
- if (m_hide) return;
- switch (s->style())
- {
- case DocStyleChange::Bold:
- if (s->enable()) m_t << "\\fB"; else m_t << "\\fP";
- m_firstCol=FALSE;
- break;
- case DocStyleChange::Italic:
- if (s->enable()) m_t << "\\fI"; else m_t << "\\fP";
- m_firstCol=FALSE;
- break;
- case DocStyleChange::Code:
- if (s->enable()) m_t << "\\fC"; else m_t << "\\fP";
- m_firstCol=FALSE;
- break;
- case DocStyleChange::Subscript:
- if (s->enable()) m_t << "\\*<"; else m_t << "\\*> ";
- m_firstCol=FALSE;
- break;
- case DocStyleChange::Superscript:
- if (s->enable()) m_t << "\\*{"; else m_t << "\\*} ";
- m_firstCol=FALSE;
- break;
- case DocStyleChange::Center:
- /* not supported */
- break;
- case DocStyleChange::Small:
- /* not supported */
- break;
- case DocStyleChange::Preformatted:
- if (s->enable())
- {
- if (!m_firstCol) m_t << endl;
- m_t << ".PP" << endl;
- m_t << ".nf" << endl;
- m_insidePre=TRUE;
- }
- else
- {
- m_insidePre=FALSE;
- if (!m_firstCol) m_t << endl;
- m_t << ".fi" << endl;
- m_t << ".PP" << endl;
- m_firstCol=TRUE;
- }
- break;
- case DocStyleChange::Div: /* HTML only */ break;
- case DocStyleChange::Span: /* HTML only */ break;
- }
-}
-
-void ManDocVisitor::visit(DocVerbatim *s)
-{
- if (m_hide) return;
- switch(s->type())
- {
- case DocVerbatim::Code: // fall though
- if (!m_firstCol) m_t << endl;
- m_t << ".PP" << endl;
- m_t << ".nf" << endl;
- Doxygen::parserManager->getParser(0/*TODO*/)
- ->parseCode(m_ci,s->context(),s->text().latin1(),
- s->isExample(),s->exampleFile());
- if (!m_firstCol) m_t << endl;
- m_t << ".fi" << endl;
- m_t << ".PP" << endl;
- m_firstCol=TRUE;
- break;
- case DocVerbatim::Verbatim:
- if (!m_firstCol) m_t << endl;
- m_t << ".PP" << endl;
- m_t << ".nf" << endl;
- m_t << s->text();
- if (!m_firstCol) m_t << endl;
- m_t << ".fi" << endl;
- m_t << ".PP" << endl;
- m_firstCol=TRUE;
- break;
- case DocVerbatim::ManOnly:
- m_t << s->text();
- break;
- case DocVerbatim::HtmlOnly:
- case DocVerbatim::XmlOnly:
- case DocVerbatim::LatexOnly:
- case DocVerbatim::Dot:
- /* nothing */
- break;
- }
-}
-
-void ManDocVisitor::visit(DocAnchor *)
-{
- /* no support for anchors in man pages */
-}
-
-void ManDocVisitor::visit(DocInclude *inc)
-{
- if (m_hide) return;
- 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( cfi.dirPath(), cfi.fileName() );
- Doxygen::parserManager->getParser(inc->extension())
- ->parseCode(m_ci,inc->context(),
- inc->text().latin1(),
- inc->isExample(),
- inc->exampleFile(), &fd);
- if (!m_firstCol) m_t << endl;
- m_t << ".fi" << endl;
- m_t << ".PP" << endl;
- m_firstCol=TRUE;
- }
- break;
- case DocInclude::Include:
- if (!m_firstCol) m_t << endl;
- m_t << ".PP" << endl;
- m_t << ".nf" << endl;
- Doxygen::parserManager->getParser(inc->extension())
- ->parseCode(m_ci,inc->context(),
- inc->text().latin1(),inc->isExample(),
- inc->exampleFile());
- if (!m_firstCol) m_t << endl;
- m_t << ".fi" << endl;
- m_t << ".PP" << endl;
- m_firstCol=TRUE;
- break;
- case DocInclude::DontInclude:
- break;
- case DocInclude::HtmlInclude:
- break;
- case DocInclude::VerbInclude:
- if (!m_firstCol) m_t << endl;
- m_t << ".PP" << endl;
- m_t << ".nf" << endl;
- m_t << inc->text();
- if (!m_firstCol) m_t << endl;
- m_t << ".fi" << endl;
- m_t << ".PP" << endl;
- m_firstCol=TRUE;
- break;
- }
-}
-
-void ManDocVisitor::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 (!m_hide)
- {
- if (!m_firstCol) m_t << endl;
- m_t << ".PP" << endl;
- m_t << ".nf" << endl;
- }
- pushEnabled();
- m_hide = TRUE;
- }
- if (op->type()!=DocIncOperator::Skip)
- {
- popEnabled();
- if (!m_hide)
- {
- Doxygen::parserManager->getParser(0/*TODO*/)
- ->parseCode(m_ci,op->context(),op->text().latin1(),
- op->isExample(),op->exampleFile());
- }
- pushEnabled();
- m_hide=TRUE;
- }
- if (op->isLast())
- {
- popEnabled();
- if (!m_hide)
- {
- if (!m_firstCol) m_t << endl;
- m_t << ".fi" << endl;
- m_t << ".PP" << endl;
- m_firstCol=TRUE;
- }
- }
- else
- {
- if (!m_hide) m_t << endl;
- }
-}
-
-void ManDocVisitor::visit(DocFormula *f)
-{
- if (m_hide) return;
- m_t << f->text();
-}
-
-void ManDocVisitor::visit(DocIndexEntry *)
-{
-}
-
-//--------------------------------------
-// visitor functions for compound nodes
-//--------------------------------------
-
-void ManDocVisitor::visitPre(DocAutoList *)
-{
- if (m_hide) return;
- m_indent+=2;
-}
-
-void ManDocVisitor::visitPost(DocAutoList *)
-{
- if (m_hide) return;
- m_indent-=2;
- m_t << ".PP" << endl;
-}
-
-void ManDocVisitor::visitPre(DocAutoListItem *li)
-{
- if (m_hide) return;
- QCString ws;
- ws.fill(' ',m_indent-2);
- if (!m_firstCol) m_t << endl;
- m_t << ".IP \"" << ws;
- if (((DocAutoList *)li->parent())->isEnumList())
- {
- m_t << li->itemNumber() << ".\" " << m_indent+2;
- }
- else // bullet list
- {
- m_t << "\\(bu\" " << m_indent;
- }
- m_t << endl;
- m_firstCol=TRUE;
-}
-
-void ManDocVisitor::visitPost(DocAutoListItem *)
-{
- if (m_hide) return;
- m_t << endl;
- m_firstCol=TRUE;
-}
-
-void ManDocVisitor::visitPre(DocPara *)
-{
-}
-
-void ManDocVisitor::visitPost(DocPara *p)
-{
- if (m_hide) return;
- if (!p->isLast() && // omit <p> for last paragraph
- !(p->parent() && // and for parameter sections
- p->parent()->kind()==DocNode::Kind_ParamSect
- )
- )
- {
- if (!m_firstCol) m_t << endl;
- m_t << ".PP" << endl;
- m_firstCol=TRUE;
- }
-}
-
-void ManDocVisitor::visitPre(DocRoot *)
-{
-}
-
-void ManDocVisitor::visitPost(DocRoot *)
-{
-}
-
-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:
- m_t << theTranslator->trSeeAlso(); break;
- case DocSimpleSect::Return:
- m_t << theTranslator->trReturns(); break;
- case DocSimpleSect::Author:
- m_t << theTranslator->trAuthor(TRUE,TRUE); break;
- case DocSimpleSect::Authors:
- m_t << theTranslator->trAuthor(TRUE,FALSE); break;
- case DocSimpleSect::Version:
- m_t << theTranslator->trVersion(); break;
- case DocSimpleSect::Since:
- m_t << theTranslator->trSince(); break;
- case DocSimpleSect::Date:
- m_t << theTranslator->trDate(); break;
- case DocSimpleSect::Note:
- m_t << theTranslator->trNote(); break;
- case DocSimpleSect::Warning:
- m_t << theTranslator->trWarning(); break;
- case DocSimpleSect::Pre:
- m_t << theTranslator->trPrecondition(); break;
- case DocSimpleSect::Post:
- m_t << theTranslator->trPostcondition(); break;
- case DocSimpleSect::Invar:
- m_t << theTranslator->trInvariant(); break;
- case DocSimpleSect::Remark:
- m_t << theTranslator->trRemarks(); break;
- case DocSimpleSect::Attention:
- m_t << theTranslator->trAttention(); break;
- case DocSimpleSect::User: break;
- case DocSimpleSect::Rcs: break;
- case DocSimpleSect::Unknown: break;
- }
-
- // special case 1: user defined title
- if (s->type()!=DocSimpleSect::User && s->type()!=DocSimpleSect::Rcs)
- {
- m_t << ":\\fP" << endl;
- m_t << ".RS 4" << endl;
- }
-}
-
-void ManDocVisitor::visitPost(DocSimpleSect *)
-{
- if (m_hide) return;
- if (!m_firstCol) m_t << endl;
- m_t << ".RE" << endl;
- m_t << ".PP" << endl;
- m_firstCol=TRUE;
-}
-
-void ManDocVisitor::visitPre(DocTitle *)
-{
-}
-
-void ManDocVisitor::visitPost(DocTitle *)
-{
- if (m_hide) return;
- m_t << "\\fP";
- m_t << ".RS 4" << endl;
-}
-
-void ManDocVisitor::visitPre(DocSimpleList *)
-{
- if (m_hide) return;
- m_indent+=2;
- if (!m_firstCol) m_t << endl;
- m_t << ".PD 0" << endl;
-}
-
-void ManDocVisitor::visitPost(DocSimpleList *)
-{
- if (m_hide) return;
- m_indent-=2;
- m_t << ".PP" << endl;
-}
-
-void ManDocVisitor::visitPre(DocSimpleListItem *)
-{
- if (m_hide) return;
- QCString ws;
- ws.fill(' ',m_indent-2);
- if (!m_firstCol) m_t << endl;
- m_t << ".IP \"" << ws << "\\(bu\" " << m_indent << endl;
- m_firstCol=TRUE;
-}
-
-void ManDocVisitor::visitPost(DocSimpleListItem *)
-{
- if (m_hide) return;
- m_t << endl;
- m_firstCol=TRUE;
-}
-
-void ManDocVisitor::visitPre(DocSection *s)
-{
- if (m_hide) return;
- if (!m_firstCol) m_t << endl;
- if (s->level()==1) m_t << ".SH"; else m_t << ".SS";
- m_t << " \"";
- filter(s->title());
- m_t << "\"" << endl;
- if (s->level()==1) m_t << ".PP" << endl;
- m_firstCol=TRUE;
-}
-
-void ManDocVisitor::visitPost(DocSection *)
-{
-}
-
-void ManDocVisitor::visitPre(DocHtmlList *)
-{
- if (m_hide) return;
- m_indent+=2;
- if (!m_firstCol) m_t << endl;
- m_t << ".PD 0" << endl;
-}
-
-void ManDocVisitor::visitPost(DocHtmlList *)
-{
- if (m_hide) return;
- m_indent-=2;
- if (!m_firstCol) m_t << endl;
- m_t << ".PP" << endl;
-}
-
-void ManDocVisitor::visitPre(DocHtmlListItem *li)
-{
- if (m_hide) return;
- QCString ws;
- ws.fill(' ',m_indent-2);
- if (!m_firstCol) m_t << endl;
- m_t << ".IP \"" << ws;
- if (((DocHtmlList *)li->parent())->type()==DocHtmlList::Ordered)
- {
- m_t << li->itemNumber() << ".\" " << m_indent+2;
- }
- else // bullet list
- {
- m_t << "\\(bu\" " << m_indent;
- }
- m_t << endl;
- m_firstCol=TRUE;
-}
-
-void ManDocVisitor::visitPost(DocHtmlListItem *)
-{
- if (m_hide) return;
- m_t << endl;
- m_firstCol=TRUE;
-}
-
-//void ManDocVisitor::visitPre(DocHtmlPre *)
-//{
-// if (!m_firstCol) m_t << endl;
-// m_t << ".PP" << endl;
-// m_t << ".nf" << endl;
-// m_insidePre=TRUE;
-//}
-//
-//void ManDocVisitor::visitPost(DocHtmlPre *)
-//{
-// m_insidePre=FALSE;
-// if (!m_firstCol) m_t << endl;
-// m_t << ".fi" << endl;
-// m_t << ".PP" << endl;
-// m_firstCol=TRUE;
-//}
-
-void ManDocVisitor::visitPre(DocHtmlDescList *)
-{
-}
-
-void ManDocVisitor::visitPost(DocHtmlDescList *)
-{
- if (m_hide) return;
- if (!m_firstCol) m_t << endl;
- m_t << ".PP" << endl;
- m_firstCol=TRUE;
-}
-
-void ManDocVisitor::visitPre(DocHtmlDescTitle *)
-{
- if (m_hide) return;
- if (!m_firstCol) m_t << endl;
- m_t << ".IP \"\\fB";
- m_firstCol=FALSE;
-}
-
-void ManDocVisitor::visitPost(DocHtmlDescTitle *)
-{
- if (m_hide) return;
- m_t << "\\fP\" 1c" << endl;
- m_firstCol=TRUE;
-}
-
-void ManDocVisitor::visitPre(DocHtmlDescData *)
-{
-}
-
-void ManDocVisitor::visitPost(DocHtmlDescData *)
-{
-}
-
-void ManDocVisitor::visitPre(DocHtmlTable *)
-{
-}
-
-void ManDocVisitor::visitPost(DocHtmlTable *)
-{
-}
-
-void ManDocVisitor::visitPre(DocHtmlCaption *)
-{
-}
-
-void ManDocVisitor::visitPost(DocHtmlCaption *)
-{
-}
-
-void ManDocVisitor::visitPre(DocHtmlRow *)
-{
-}
-
-void ManDocVisitor::visitPost(DocHtmlRow *)
-{
-}
-
-void ManDocVisitor::visitPre(DocHtmlCell *)
-{
-}
-
-void ManDocVisitor::visitPost(DocHtmlCell *)
-{
-}
-
-void ManDocVisitor::visitPre(DocInternal *)
-{
- if (m_hide) return;
- if (!m_firstCol) m_t << endl;
- m_t << ".PP" << endl;
- m_t << "\\fB" << theTranslator->trForInternalUseOnly() << "\\fP" << endl;
- m_t << ".RS 4" << endl;
-}
-
-void ManDocVisitor::visitPost(DocInternal *)
-{
- if (m_hide) return;
- if (!m_firstCol) m_t << endl;
- m_t << ".RE" << endl;
- m_t << ".PP" << endl;
- m_firstCol=TRUE;
-}
-
-void ManDocVisitor::visitPre(DocHRef *)
-{
- if (m_hide) return;
- m_t << "\\fC";
-}
-
-void ManDocVisitor::visitPost(DocHRef *)
-{
- if (m_hide) return;
- m_t << "\\fP";
-}
-
-void ManDocVisitor::visitPre(DocHtmlHeader *header)
-{
- if (m_hide) return;
- if (!m_firstCol) m_t << endl;
- if (header->level()==1) m_t << ".SH"; else m_t << ".SS";
- m_t << " \"";
-}
-
-void ManDocVisitor::visitPost(DocHtmlHeader *header)
-{
- if (m_hide) return;
- m_t << "\"" << endl;
- if (header->level()==1) m_t << ".PP" << endl;
- m_firstCol=TRUE;
-}
-
-void ManDocVisitor::visitPre(DocImage *)
-{
-}
-
-void ManDocVisitor::visitPost(DocImage *)
-{
-}
-
-void ManDocVisitor::visitPre(DocDotFile *)
-{
-}
-
-void ManDocVisitor::visitPost(DocDotFile *)
-{
-}
-
-void ManDocVisitor::visitPre(DocLink *)
-{
- if (m_hide) return;
- m_t << "\\fB";
-}
-
-void ManDocVisitor::visitPost(DocLink *)
-{
- if (m_hide) return;
- m_t << "\\fP";
-}
-
-void ManDocVisitor::visitPre(DocRef *ref)
-{
- if (m_hide) return;
- m_t << "\\fB";
- if (!ref->hasLinkText()) filter(ref->targetTitle());
-}
-
-void ManDocVisitor::visitPost(DocRef *)
-{
- if (m_hide) return;
- m_t << "\\fP";
-}
-
-void ManDocVisitor::visitPre(DocSecRefItem *)
-{
- if (m_hide) return;
- QCString ws;
- ws.fill(' ',m_indent-2);
- if (!m_firstCol) m_t << endl;
- m_t << ".IP \"" << ws << "\\(bu\" " << m_indent << endl;
- m_firstCol=TRUE;
-}
-
-void ManDocVisitor::visitPost(DocSecRefItem *)
-{
- if (m_hide) return;
- m_t << endl;
- m_firstCol=TRUE;
-}
-
-void ManDocVisitor::visitPre(DocSecRefList *)
-{
- if (m_hide) return;
- m_indent+=2;
-}
-
-void ManDocVisitor::visitPost(DocSecRefList *)
-{
- if (m_hide) return;
- m_indent-=2;
- if (!m_firstCol) m_t << endl;
- m_t << ".PP" << endl;
-}
-
-//void ManDocVisitor::visitPre(DocLanguage *l)
-//{
-// QString langId = Config_getEnum("OUTPUT_LANGUAGE");
-// if (l->id().lower()!=langId.lower())
-// {
-// pushEnabled();
-// m_hide = TRUE;
-// }
-//}
-//
-//void ManDocVisitor::visitPost(DocLanguage *l)
-//{
-// QString langId = Config_getEnum("OUTPUT_LANGUAGE");
-// if (l->id().lower()!=langId.lower())
-// {
-// popEnabled();
-// }
-//}
-
-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:
- m_t << theTranslator->trParameters(); break;
- case DocParamSect::RetVal:
- m_t << theTranslator->trReturnValues(); break;
- case DocParamSect::Exception:
- m_t << theTranslator->trExceptions(); break;
- default:
- ASSERT(0);
- }
- m_t << ":\\fP" << endl;
- m_t << ".RS 4" << endl;
-}
-
-void ManDocVisitor::visitPost(DocParamSect *)
-{
- if (m_hide) return;
- if (!m_firstCol) m_t << endl;
- m_t << ".RE" << endl;
- m_t << ".PP" << endl;
- m_firstCol=TRUE;
-}
-
-void ManDocVisitor::visitPre(DocParamList *pl)
-{
- if (m_hide) return;
- m_t << "\\fI";
- //QStrListIterator li(pl->parameters());
- //const char *s;
- QListIterator<DocNode> li(pl->parameters());
- DocNode *param;
- bool first=TRUE;
- for (li.toFirst();(param=li.current());++li)
- {
- if (!first) m_t << ","; else first=FALSE;
- if (param->kind()==DocNode::Kind_Word)
- {
- visit((DocWord*)param);
- }
- else if (param->kind()==DocNode::Kind_LinkedWord)
- {
- visit((DocLinkedWord*)param);
- }
- }
- m_t << "\\fP ";
-}
-
-void ManDocVisitor::visitPost(DocParamList *pl)
-{
- if (m_hide) return;
- if (!pl->isLast())
- {
- if (!m_firstCol) m_t << endl;
- m_t << ".br" << endl;
- }
-}
-
-void ManDocVisitor::visitPre(DocXRefItem *x)
-{
- if (m_hide) return;
- if (!m_firstCol)
- {
- m_t << endl;
- m_t << ".PP" << endl;
- }
- m_t << "\\fB";
- filter(x->title());
- m_t << "\\fP" << endl;
- m_t << ".RS 4" << endl;
-}
-
-void ManDocVisitor::visitPost(DocXRefItem *)
-{
- if (m_hide) return;
- if (!m_firstCol) m_t << endl;
- m_t << ".RE" << endl;
- m_t << ".PP" << endl;
- m_firstCol=TRUE;
-}
-
-void ManDocVisitor::visitPre(DocInternalRef *)
-{
- if (m_hide) return;
- m_t << "\\fB";
-}
-
-void ManDocVisitor::visitPost(DocInternalRef *)
-{
- if (m_hide) return;
- m_t << "\\fP";
-}
-
-void ManDocVisitor::visitPre(DocCopy *)
-{
-}
-
-void ManDocVisitor::visitPost(DocCopy *)
-{
-}
-
-void ManDocVisitor::visitPre(DocText *)
-{
-}
-
-void ManDocVisitor::visitPost(DocText *)
-{
-}
-
-void ManDocVisitor::filter(const char *str)
-{
- if (str)
- {
- const char *p=str;
- char c=0;
- while ((c=*p++))
- {
- switch(c)
- {
- case '\\': m_t << "\\\\"; break;
- case '"': c = '\''; // fall through
- default: m_t << c; break;
- }
- }
- }
-}
-
-void ManDocVisitor::pushEnabled()
-{
- m_enabled.push(new bool(m_hide));
-}
-
-void ManDocVisitor::popEnabled()
-{
- bool *v=m_enabled.pop();
- ASSERT(v!=0);
- m_hide = *v;
- delete v;
-}
-
diff --git a/src/mandocvisitor.h b/src/mandocvisitor.h
deleted file mode 100644
index aa1c54b..0000000
--- a/src/mandocvisitor.h
+++ /dev/null
@@ -1,155 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 _MANDOCVISITOR_H
-#define _MANDOCVISITOR_H
-
-#include "docvisitor.h"
-#include <qstack.h>
-#include <qcstring.h>
-
-class QTextStream;
-class CodeOutputInterface;
-class QString;
-
-/*! @brief Concrete visitor implementation for LaTeX output. */
-class ManDocVisitor : public DocVisitor
-{
- public:
- ManDocVisitor(QTextStream &t,CodeOutputInterface &ci,const char *langExt);
-
- //--------------------------------------
- // visitor functions for leaf nodes
- //--------------------------------------
-
- void visit(DocWord *);
- void visit(DocLinkedWord *);
- void visit(DocWhiteSpace *);
- void visit(DocSymbol *);
- void visit(DocURL *);
- void visit(DocLineBreak *);
- void visit(DocHorRuler *);
- void visit(DocStyleChange *);
- void visit(DocVerbatim *);
- void visit(DocAnchor *);
- void visit(DocInclude *);
- void visit(DocIncOperator *);
- void visit(DocFormula *);
- void visit(DocIndexEntry *);
-
- //--------------------------------------
- // visitor functions for compound nodes
- //--------------------------------------
-
- void visitPre(DocAutoList *);
- void visitPost(DocAutoList *);
- void visitPre(DocAutoListItem *);
- void visitPost(DocAutoListItem *);
- void visitPre(DocPara *);
- void visitPost(DocPara *);
- void visitPre(DocRoot *);
- void visitPost(DocRoot *);
- void visitPre(DocSimpleSect *);
- void visitPost(DocSimpleSect *);
- void visitPre(DocTitle *);
- void visitPost(DocTitle *);
- void visitPre(DocSimpleList *);
- void visitPost(DocSimpleList *);
- void visitPre(DocSimpleListItem *);
- void visitPost(DocSimpleListItem *);
- void visitPre(DocSection *s);
- void visitPost(DocSection *);
- void visitPre(DocHtmlList *s);
- void visitPost(DocHtmlList *s);
- void visitPre(DocHtmlListItem *);
- void visitPost(DocHtmlListItem *);
- //void visitPre(DocHtmlPre *);
- //void visitPost(DocHtmlPre *);
- void visitPre(DocHtmlDescList *);
- void visitPost(DocHtmlDescList *);
- void visitPre(DocHtmlDescTitle *);
- void visitPost(DocHtmlDescTitle *);
- void visitPre(DocHtmlDescData *);
- void visitPost(DocHtmlDescData *);
- void visitPre(DocHtmlTable *t);
- void visitPost(DocHtmlTable *t);
- void visitPre(DocHtmlCaption *);
- void visitPost(DocHtmlCaption *);
- void visitPre(DocHtmlRow *);
- void visitPost(DocHtmlRow *) ;
- void visitPre(DocHtmlCell *);
- void visitPost(DocHtmlCell *);
- void visitPre(DocInternal *);
- void visitPost(DocInternal *);
- void visitPre(DocHRef *);
- void visitPost(DocHRef *);
- void visitPre(DocHtmlHeader *);
- void visitPost(DocHtmlHeader *) ;
- void visitPre(DocImage *);
- void visitPost(DocImage *);
- void visitPre(DocDotFile *);
- void visitPost(DocDotFile *);
- void visitPre(DocLink *lnk);
- void visitPost(DocLink *);
- void visitPre(DocRef *ref);
- void visitPost(DocRef *);
- void visitPre(DocSecRefItem *);
- void visitPost(DocSecRefItem *);
- void visitPre(DocSecRefList *);
- void visitPost(DocSecRefList *);
- //void visitPre(DocLanguage *);
- //void visitPost(DocLanguage *);
- void visitPre(DocParamSect *);
- void visitPost(DocParamSect *);
- void visitPre(DocParamList *);
- void visitPost(DocParamList *);
- void visitPre(DocXRefItem *);
- void visitPost(DocXRefItem *);
- void visitPre(DocInternalRef *);
- void visitPost(DocInternalRef *);
- void visitPre(DocCopy *);
- void visitPost(DocCopy *);
- void visitPre(DocText *);
- void visitPost(DocText *);
-
- private:
-
- //--------------------------------------
- // helper functions
- //--------------------------------------
-
- void filter(const char *str);
-
- void pushEnabled();
- void popEnabled();
-
- //--------------------------------------
- // state variables
- //--------------------------------------
-
- QTextStream &m_t;
- CodeOutputInterface &m_ci;
- bool m_insidePre;
- bool m_hide;
- bool m_firstCol;
- int m_indent;
- QStack<bool> m_enabled;
- QCString m_langExt;
-};
-
-#endif
diff --git a/src/mangen.cpp b/src/mangen.cpp
deleted file mode 100644
index 4ef5c13..0000000
--- a/src/mangen.cpp
+++ /dev/null
@@ -1,638 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-
-/* http://www.cubic.org/source/archive/fileform/txt/man/ has some
- nice introductions to groff and man pages. */
-
-#include <stdlib.h>
-
-#include "qtbc.h"
-#include <qdir.h>
-#include "message.h"
-#include "mangen.h"
-#include "config.h"
-#include "util.h"
-#include "doxygen.h"
-#include <string.h>
-#include "docparser.h"
-#include "mandocvisitor.h"
-
-static QCString getExtension()
-{
- QCString ext = Config_getString("MAN_EXTENSION");
- if( ext.length() >= 2 &&
- ext.data()[0] == '.')
- {
- ext = ext.mid(1, ext.length()-1);
- }
- else
- {
- ext = "3";
- }
- return ext;
-}
-
-ManGenerator::ManGenerator() : OutputGenerator()
-{
- dir=Config_getString("MAN_OUTPUT")+"/man" + getExtension();
- firstCol=TRUE;
- paragraph=FALSE;
- col=0;
- upperCase=FALSE;
- insideTabbing=FALSE;
- inHeader=FALSE;
-}
-
-ManGenerator::~ManGenerator()
-{
-}
-
-//void ManGenerator::append(const OutputGenerator *g)
-//{
-// QCString r=g->getContents();
-// if (upperCase)
-// t << r.upper();
-// else
-// t << r;
-// if (!r.isEmpty())
-// firstCol = r.at(r.length()-1)=='\n';
-// else
-// firstCol = ((ManGenerator *)g)->firstCol;
-// col+=((ManGenerator *)g)->col;
-// inHeader=((ManGenerator *)g)->inHeader;
-// paragraph=FALSE;
-//}
-
-void ManGenerator::init()
-{
- QCString ext = getExtension();
- QCString &manOutput = Config_getString("MAN_OUTPUT");
-
- QDir d(manOutput);
- if (!d.exists() && !d.mkdir(manOutput))
- {
- err("Could not create output directory %s\n",manOutput.data());
- exit(1);
- }
- d.setPath(manOutput+"/man"+ext);
- if (!d.exists() && !d.mkdir(manOutput+"/man"+ext))
- {
- err("Could not create output directory %s/man%s\n",manOutput.data(),ext.data());
- exit(1);
- }
- createSubDirs(d);
-}
-
-static QCString buildFileName(const char *name)
-{
- QCString fileName;
-
- const char *p=name;
- char c;
- while ((c=*p++))
- {
- switch (c)
- {
- case ':':
- fileName+="_";
- if (*p==':') p++;
- break;
- case '<':
- case '>':
- case '&':
- case '*':
- case '!':
- case '^':
- case '~':
- case '%':
- case '+':
- case '/':
- fileName+="_";
- break;
- default:
- fileName+=c;
- }
- }
-
- QCString &manExtension = Config_getString("MAN_EXTENSION");
- if (convertToQCString(fileName.right(2))!=manExtension)
- {
- fileName+=manExtension;
- }
-
- return fileName;
-}
-
-void ManGenerator::startFile(const char *,const char *manName,const char *)
-{
- startPlainFile( buildFileName( manName ) );
- firstCol=TRUE;
-}
-
-void ManGenerator::endFile()
-{
- t << endl;
- endPlainFile();
-}
-
-void ManGenerator::endTitleHead(const char *,const char *name)
-{
- t << ".TH \"" << name << "\" " << getExtension() << " \""
- << dateToString(FALSE) << "\" \"";
- if (!Config_getString("PROJECT_NUMBER").isEmpty())
- t << "Version " << Config_getString("PROJECT_NUMBER") << "\" \"";
- if (Config_getString("PROJECT_NAME").isEmpty())
- t << "Doxygen";
- else
- t << Config_getString("PROJECT_NAME");
- t << "\" \\\" -*- nroff -*-" << endl;
- t << ".ad l" << endl;
- t << ".nh" << endl;
- t << ".SH NAME" << endl;
- t << name << " \\- ";
- firstCol=FALSE;
- inHeader=TRUE;
-}
-
-void ManGenerator::newParagraph()
-{
- if (!paragraph)
- {
- if (!firstCol) t << endl;
- t << ".PP" << endl;
- firstCol=TRUE;
- }
- paragraph=TRUE;
-}
-
-void ManGenerator::writeString(const char *text)
-{
- docify(text);
-}
-
-void ManGenerator::writeIndexItem(const char *,const char *,
- const char *)
-{
-}
-
-void ManGenerator::writeStartAnnoItem(const char *,const char *,
- const char *,const char *)
-{
-}
-
-void ManGenerator::writeObjectLink(const char *,const char *,
- const char *, const char *name)
-{
- startBold(); docify(name); endBold();
-}
-
-void ManGenerator::writeCodeLink(const char *,const char *,
- const char *, const char *name)
-{
- docify(name);
-}
-
-void ManGenerator::startHtmlLink(const char *)
-{
-}
-
-void ManGenerator::endHtmlLink()
-{
-}
-
-//void ManGenerator::writeMailLink(const char *url)
-//{
-// docify(url);
-//}
-
-void ManGenerator::startGroupHeader()
-{
- if (!firstCol) t << endl;
- t << ".SH \"";
- upperCase=TRUE;
- firstCol=FALSE;
-}
-
-void ManGenerator::endGroupHeader()
-{
- t << "\"\n.PP " << endl;
- firstCol=TRUE;
- paragraph=TRUE;
- upperCase=FALSE;
-}
-
-void ManGenerator::startMemberHeader()
-{
- if (!firstCol) t << endl;
- t << ".SS \"";
-}
-
-void ManGenerator::endMemberHeader()
-{
- t << "\"\n";
- firstCol=TRUE;
- paragraph=FALSE;
-}
-
-void ManGenerator::docify(const char *str)
-{
- if (str)
- {
- const char *p=str;
- char c=0;
- while ((c=*p++))
- {
- switch(c)
- {
- case '\\': t << "\\\\"; col++; break;
- case '\n': t << "\n"; col=0; break;
- case '\"': c = '\''; // no break!
- default: t << c; col++; break;
- }
- }
- firstCol=(c=='\n');
- //printf("%s",str);fflush(stdout);
- }
- paragraph=FALSE;
-}
-
-void ManGenerator::codify(const char *str)
-{
- //static char spaces[]=" ";
- if (str)
- {
- const char *p=str;
- char c;
- int spacesToNextTabStop;
- while (*p)
- {
- c=*p++;
- switch(c)
- {
- case '\t': spacesToNextTabStop =
- Config_getInt("TAB_SIZE") - (col%Config_getInt("TAB_SIZE"));
- t << spaces.left(spacesToNextTabStop);
- col+=spacesToNextTabStop;
- break;
- case '\n': t << "\n"; firstCol=TRUE; col=0; break;
- case '\\': t << "\\"; col++; break;
- case '\"': c = '\''; // no break!
- default: t << c; firstCol=FALSE; col++; break;
- }
- }
- //printf("%s",str);fflush(stdout);
- }
- paragraph=FALSE;
-}
-
-void ManGenerator::writeChar(char c)
-{
- firstCol=(c=='\n');
- if (firstCol) col=0; else col++;
- switch (c)
- {
- case '\\': t << "\\\\"; break;
- case '\"': c = '\''; // no break!
- default: t << c; break;
- }
- //printf("%c",c);fflush(stdout);
- paragraph=FALSE;
-}
-
-void ManGenerator::startDescList(SectionTypes)
-{
- if (!firstCol)
- { t << endl << ".PP" << endl;
- firstCol=TRUE; paragraph=TRUE;
- col=0;
- }
- paragraph=FALSE;
- startBold();
-}
-
-void ManGenerator::startTitle()
-{
- if (!firstCol) t << endl;
- t << ".SH \"";
- firstCol=FALSE;
- paragraph=FALSE;
-}
-
-void ManGenerator::endTitle()
-{
- t << "\"";
-}
-
-void ManGenerator::writeListItem()
-{
- if (!firstCol) t << endl;
- t << ".TP" << endl;
- firstCol=TRUE;
- paragraph=FALSE;
- col=0;
-}
-
-void ManGenerator::startCodeFragment()
-{
- newParagraph();
- t << ".nf" << endl;
- firstCol=TRUE;
- paragraph=FALSE;
-}
-
-void ManGenerator::endCodeFragment()
-{
- if (!firstCol) t << endl;
- t << ".fi" << endl;
- firstCol=TRUE;
- paragraph=FALSE;
- col=0;
-}
-
-void ManGenerator::startMemberDoc(const char *,const char *,const char *,const char *)
-{
- if (!firstCol) t << endl;
- t << ".SS \"";
- firstCol=FALSE;
- paragraph=FALSE;
-}
-
-void ManGenerator::startDoxyAnchor(const char *,const char *manName,
- const char *, const char *name,
- const char *)
-{
- // something to be done?
- if( !Config_getBool("MAN_LINKS") )
- {
- return; // no
- }
-
- // the name of the link file is derived from the name of the anchor:
- // - truncate after an (optional) ::
- QCString baseName = name;
- int i=baseName.findRev(':');
- if (i!=-1) baseName=baseName.right(baseName.length()-i-1);
-
- // - remove dangerous characters and append suffix, then add dir prefix
- 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_WriteOnly ) )
- {
- QTextStream linkstream;
- linkstream.setDevice(&linkfile);
-#if QT_VERSION >= 200
- linkstream.setEncoding(QTextStream::Latin1);
-#endif
- linkstream << ".so man" << getExtension() << "/" << buildFileName( manName ) << endl;
- }
- }
- linkfile.close();
-}
-
-void ManGenerator::endMemberDoc(bool)
-{
- t << "\"";
-}
-
-void ManGenerator::startSubsection()
-{
- if (!firstCol) t << endl;
- t << ".SS \"";
- firstCol=FALSE;
- paragraph=FALSE;
-}
-
-void ManGenerator::endSubsection()
-{
- t << "\"";
-}
-
-
-void ManGenerator::startSubsubsection()
-{
- if (!firstCol) t << endl;
- t << "\n.SS \"";
- firstCol=FALSE;
- paragraph=FALSE;
-}
-
-void ManGenerator::endSubsubsection()
-{
- t << "\"";
-}
-
-void ManGenerator::writeSynopsis()
-{
- if (!firstCol) t << endl;
- t << ".SH SYNOPSIS\n.br\n.PP\n";
- firstCol=TRUE;
- paragraph=FALSE;
-}
-
-void ManGenerator::startDescItem()
-{
- if (!firstCol) t << endl;
- t << ".IP \"";
- firstCol=FALSE;
-}
-
-//void ManGenerator::endDescTitle()
-//{
-// endBold();
-// paragraph=TRUE;
-//}
-
-void ManGenerator::writeDescItem()
-{
- if (!firstCol) t << endl;
- if (!paragraph) t << ".in -1c" << endl;
- t << ".in +1c" << endl;
- firstCol=TRUE;
- paragraph=FALSE;
- col=0;
-}
-
-void ManGenerator::endDescItem()
-{
- t << "\" 1c" << endl;
- firstCol=TRUE;
-}
-
-void ManGenerator::startAnonTypeScope(int indentLevel)
-{
- if (indentLevel==0)
- {
- insideTabbing=TRUE;
- }
-}
-
-void ManGenerator::endAnonTypeScope(int indentLevel)
-{
- if (indentLevel==0)
- {
- insideTabbing=FALSE;
- }
-}
-
-
-void ManGenerator::startMemberItem(int)
-{
- if (firstCol && !insideTabbing) t << ".in +1c\n";
- t << "\n.ti -1c\n.RI \"";
- firstCol=FALSE;
-}
-
-void ManGenerator::endMemberItem()
-{
- t << "\"\n.br";
-}
-
-void ManGenerator::startMemberList()
-{
- if (!insideTabbing)
- {
- t << "\n.in +1c"; firstCol=FALSE;
- }
-}
-
-void ManGenerator::endMemberList()
-{
- if (!insideTabbing)
- {
- t << "\n.in -1c"; firstCol=FALSE;
- }
-}
-
-void ManGenerator::startMemberGroupHeader(bool)
-{
- t << "\n.PP\n.RI \"\\fB";
-}
-
-void ManGenerator::endMemberGroupHeader()
-{
- t << "\\fP\"\n.br\n";
- firstCol=TRUE;
-}
-
-void ManGenerator::startMemberGroupDocs()
-{
-}
-
-void ManGenerator::endMemberGroupDocs()
-{
- t << "\n.PP";
-}
-
-void ManGenerator::startMemberGroup()
-{
- t << "\n.in +1c";
-}
-
-void ManGenerator::endMemberGroup(bool)
-{
- t << "\n.in -1c";
- firstCol=FALSE;
-}
-
-void ManGenerator::startSection(const char *,const char *,SectionInfo::SectionType type)
-{
- if( !inHeader )
- {
- switch(type)
- {
- case SectionInfo::Page: startGroupHeader(); break;
- case SectionInfo::Section: startGroupHeader(); break;
- case SectionInfo::Subsection: startMemberHeader(); break;
- case SectionInfo::Subsubsection: startMemberHeader(); break;
- case SectionInfo::Paragraph: startMemberHeader(); break;
- default: ASSERT(0); break;
- }
- }
-}
-
-void ManGenerator::endSection(const char *,SectionInfo::SectionType type)
-{
- if( !inHeader )
- {
- switch(type)
- {
- case SectionInfo::Page: endGroupHeader(); break;
- case SectionInfo::Section: endGroupHeader(); break;
- case SectionInfo::Subsection: endMemberHeader(); break;
- case SectionInfo::Subsubsection: endMemberHeader(); break;
- case SectionInfo::Paragraph: endMemberHeader(); break;
- default: ASSERT(0); break;
- }
- }
- else
- {
- t << "\n";
- firstCol=TRUE;
- paragraph=FALSE;
- inHeader=FALSE;
- }
-}
-
-void ManGenerator::startSimpleSect(SectionTypes,const char *,
- const char *,const char *title)
-{
- if (!firstCol)
- { t << endl << ".PP" << endl;
- firstCol=TRUE; paragraph=TRUE;
- col=0;
- }
- paragraph=FALSE;
- startBold();
- docify(title);
- endBold();
- paragraph=TRUE;
-}
-
-void ManGenerator::endSimpleSect()
-{
-}
-
-void ManGenerator::startParamList(ParamListTypes,const char *title)
-{
- if (!firstCol)
- { t << endl << ".PP" << endl;
- firstCol=TRUE; paragraph=TRUE;
- col=0;
- }
- paragraph=FALSE;
- startBold();
- docify(title);
- endBold();
- paragraph=TRUE;
-}
-
-void ManGenerator::endParamList()
-{
-}
-
-void ManGenerator::printDoc(DocNode *n,const char *langExt)
-{
- ManDocVisitor *visitor = new ManDocVisitor(t,*this,langExt);
- n->accept(visitor);
- delete visitor;
- firstCol=FALSE;
- paragraph = FALSE;
-}
-
diff --git a/src/mangen.h b/src/mangen.h
deleted file mode 100644
index 8d4d981..0000000
--- a/src/mangen.h
+++ /dev/null
@@ -1,281 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 MANGEN_H
-#define MANGEN_H
-
-#include "outputgen.h"
-
-class QFile;
-
-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 (genStack->top()) active=*genStack->top(); else active=TRUE; }
- void disable() { active=FALSE; }
- void enableIf(OutputType o) { if (o==Man) active=TRUE; }
- void disableIf(OutputType o) { if (o==Man) active=FALSE; }
- void disableIfNot(OutputType o) { if (o!=Man) active=FALSE; }
- bool isEnabled(OutputType o) { return (o==Man && active); }
- OutputGenerator *get(OutputType o) { return (o==Man) ? this : 0; }
-
- void printDoc(DocNode *,const char *);
-
- static void init();
- void startFile(const char *name,const char *manName,const char *title);
- void writeFooter() {}
- void endFile();
- void clearBuffer();
-
- //void writeIndex();
- void startIndexSection(IndexSections) {}
- void endIndexSection(IndexSections) {}
- void startProjectNumber() {}
- void endProjectNumber() {}
- void writeStyleInfo(int) {}
- void startTitleHead(const char *) {}
- void endTitleHead(const char *,const char *);
- void startTitle();
- void endTitle();
-
- void newParagraph();
- void writeString(const char *text);
- void startIndexList() {}
- void endIndexList() { newParagraph(); }
- void startIndexKey() {}
- void endIndexKey() {}
- void startIndexValue(bool) {}
- void endIndexValue(const char *,bool) {}
- void startItemList() {}
- void endItemList() { newParagraph(); }
- //void startEnumList() {}
- //void endEnumList() { newParagraph(); }
- //void startAlphabeticalIndexList() {}
- //void endAlphabeticalIndexList() {}
- //void writeIndexHeading(const char *) {}
- void writeIndexItem(const char *ref,const char *file,const char *name);
- void docify(const char *text);
- void codify(const char *text);
- void writeObjectLink(const char *ref,const char *file,
- const char *anchor,const char *name);
- void writeCodeLink(const char *ref,const char *file,
- const char *anchor,const char *name);
- void startTextLink(const char *,const char *) {}
- void endTextLink() {}
- void startHtmlLink(const char *url);
- void endHtmlLink();
- //void writeMailLink(const char *url);
- void startTypewriter() { t << "\\fC"; firstCol=FALSE; }
- void endTypewriter() { t << "\\fP"; firstCol=FALSE; }
- void startGroupHeader();
- void endGroupHeader();
- void startMemberSections() {}
- void endMemberSections() {}
- void startMemberHeader();
- void endMemberHeader();
- void insertMemberAlign(bool) {}
- void startMemberSubtitle() {}
- void endMemberSubtitle() {}
- void writeListItem();
- void startMemberList();
- void endMemberList();
- void startAnonTypeScope(int);
- void endAnonTypeScope(int);
- void startMemberItem(int);
- void endMemberItem();
- void startMemberTemplateParams() {}
- void endMemberTemplateParams() {}
-
- void startMemberGroupHeader(bool);
- void endMemberGroupHeader();
- void startMemberGroupDocs();
- void endMemberGroupDocs();
- void startMemberGroup();
- void endMemberGroup(bool);
-
- void writeRuler() {}
- void writeAnchor(const char *,const char *) {}
- void startCodeFragment();
- void endCodeFragment();
- //void startPreFragment() { startCodeFragment(); }
- //void endPreFragment() { endCodeFragment(); }
- //void startVerbatimFragment() { startCodeFragment(); }
- //void endVerbatimFragment() { endCodeFragment(); }
- void writeLineNumber(const char *,const char *,const char *,int l) { t << l << " "; }
- void startCodeLine() {}
- void endCodeLine() { codify("\n"); col=0; }
- //void writeBoldString(const char *text)
- // { t << "\\fB"; docify(text); t << "\\fP"; firstCol=FALSE; }
- void startEmphasis() { t << "\\fI"; firstCol=FALSE; }
- void endEmphasis() { t << "\\fP"; firstCol=FALSE; }
- void startBold() { t << "\\fB"; firstCol=FALSE; }
- void endBold() { t << "\\fP"; firstCol=FALSE; }
- void startDescription() {}
- void endDescription() {}
- void startDescItem();
- void endDescItem();
- void lineBreak() { t << "\n.br" << endl; }
- void writeChar(char c);
- void startMemberDoc(const char *,const char *,const char *,const char *);
- void endMemberDoc(bool);
- void startDoxyAnchor(const char *,const char *,const char *,const char *,const char *);
- void endDoxyAnchor(const char *,const char *) {}
- void startCodeAnchor(const char *) {}
- void endCodeAnchor() {}
- void writeLatexSpacing() {}
- //void writeLatexLabel(const char *,const char *) {}
- void writeStartAnnoItem(const char *type,const char *file,
- const char *path,const char *name);
- void writeEndAnnoItem(const char *) { t << endl; firstCol=TRUE; }
- void startSubsection();
- void endSubsection();
- void startSubsubsection();
- void endSubsubsection();
- void startCenter() {}
- void endCenter() {}
- void startSmall() {}
- void endSmall() {}
- //void startSubscript() { t << "\\*<"; firstCol=FALSE; }
- //void endSubscript() { t << "\\*>"; firstCol=FALSE; }
- //void startSuperscript() { t << "\\*{"; firstCol=FALSE; }
- //void endSuperscript() { t << "\\*}"; firstCol=FALSE; }
- //void startTable(bool,int) {}
- //void endTable(bool) {}
- //void startCaption() {}
- //void endCaption() {}
- //void nextTableRow() {}
- //void endTableRow() {}
- //void nextTableColumn() {}
- //void endTableColumn() {}
- //void writeCopyright() { t << "(c)"; firstCol=FALSE; }
- //void writeQuote() { t << "`"; firstCol=FALSE; }
- //void writeUmlaut(char c) { t << c << "\\*'"; firstCol=FALSE; }
- //void writeAcute(char c) { t << c << "\\*`"; firstCol=FALSE; }
- //void writeGrave(char c) { t << c << "\\*:"; firstCol=FALSE; }
- //void writeCirc(char c) { t << c << "\\*^"; firstCol=FALSE; }
- //void writeTilde(char c) { t << c << "\\*~"; firstCol=FALSE; }
- //void writeRing(char c) { t << c << "\\*0"; /* just a wild guess,
- // need to check! */
- // firstCol=FALSE; }
- //void writeSharpS() { t << "s\\*:"; /* just a wild guess,
- // need to check! */
- // firstCol=FALSE; }
- //void writeCCedil(char c) { t << c; /* TODO: fix this */
- // firstCol=FALSE; }
- void startMemberDescription() { t << "\n.RI \"\\fI"; firstCol=FALSE; }
- void endMemberDescription() { t << "\\fP\""; firstCol=FALSE; }
- void startDescList(SectionTypes);
- void endDescList() {}
- void startSimpleSect(SectionTypes,const char *,const char *,const char *);
- void endSimpleSect();
- void startParamList(ParamListTypes,const char *title);
- void endParamList();
- //void endDescTitle();
- void writeDescItem();
- void startSection(const char *,const char *,SectionInfo::SectionType);
- void endSection(const char *,SectionInfo::SectionType);
- //void writeSectionRef(const char *,const char *,const char *,const char *) {}
- //void writeSectionRefItem(const char *,const char *,const char *) {}
- //void writeSectionRefAnchor(const char *,const char *,const char *) {}
- void addIndexItem(const char *,const char *) {}
- void startIndent() {}
- void endIndent() {}
- void writeSynopsis();
- //void generateExternalIndex() {}
- void startClassDiagram() {}
- void endClassDiagram(ClassDiagram &,const char *,const char *) {}
- //void startColorFont(uchar,uchar,uchar) {}
- //void endColorFont() {}
- void startPageRef() {}
- void endPageRef(const char *,const char *) {}
- //void startQuickIndexItem(const char *,const char *) {}
- //void endQuickIndexItem() {}
- void writeQuickLinks(bool,HighlightedItem) {}
- //void writeFormula(const char *,const char *) {}
- void writeNonBreakableSpace(int n) { int i; for (i=0;i<n;i++) t << " "; }
- //void startImage(const char *,const char *,bool) {}
- //void endImage(bool) {}
- //void startDotFile(const char *,bool) {}
- //void endDotFile(bool) {}
-
- void startDescTable() {}
- void endDescTable() {}
- void startDescTableTitle() { writeListItem(); startBold(); startEmphasis(); }
- void endDescTableTitle() { endEmphasis(); endBold(); }
- void startDescTableData() { t << endl; firstCol=TRUE; }
- void endDescTableData() {}
-
- void startDotGraph() {}
- void endDotGraph(DotClassGraph &) {}
- void startInclDepGraph() {}
- void endInclDepGraph(DotInclDepGraph &) {}
- void startGroupCollaboration() {}
- void endGroupCollaboration(DotGroupCollaboration &) {}
- void startCallGraph() {}
- void endCallGraph(DotCallGraph &) {}
- void startDirDepGraph() {}
- void endDirDepGraph(DotDirDeps &) {}
- void writeGraphicalHierarchy(DotGfxHierarchyTable &) {}
-
- void startTextBlock(bool) {}
- void endTextBlock(bool) {}
- void lastIndexPage() {}
-
- void startMemberDocPrefixItem() {}
- void endMemberDocPrefixItem() {}
- void startMemberDocName(bool) {}
- void endMemberDocName() {}
- void startParameterType(bool,const char *) {}
- void endParameterType() {}
- void startParameterName(bool) {}
- void endParameterName(bool,bool,bool) {}
- void startParameterList(bool) {}
- void endParameterList() {}
-
- void startFontClass(const char *) {}
- void endFontClass() {}
-
- //void startHtmlOnly() {}
- //void endHtmlOnly() {}
- //void startLatexOnly() {}
- //void endLatexOnly() {}
-
- //void startSectionRefList() {}
- //void endSectionRefList() {}
-
- void writeCodeAnchor(const char *) {}
-
- private:
- bool firstCol;
- bool paragraph;
- int col;
- bool upperCase;
- bool insideTabbing;
- bool inHeader;
-
- ManGenerator(const ManGenerator &g);
- ManGenerator &operator=(const ManGenerator &g);
-};
-
-#endif
diff --git a/src/memberdef.cpp b/src/memberdef.cpp
deleted file mode 100644
index 3bfb93d..0000000
--- a/src/memberdef.cpp
+++ /dev/null
@@ -1,2471 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 <qregexp.h>
-#include "memberdef.h"
-#include "membername.h"
-#include "doxygen.h"
-#include "util.h"
-#include "code.h"
-#include "message.h"
-#include "htmlhelp.h"
-#include "language.h"
-#include "outputlist.h"
-#include "example.h"
-#include "membergroup.h"
-#include "groupdef.h"
-#include "defargs.h"
-#include "docparser.h"
-#include "dot.h"
-#include "searchindex.h"
-#include "parserintf.h"
-
-//-----------------------------------------------------------------------------
-
-int MemberDef::s_indentLevel = 0;
-
-//-----------------------------------------------------------------------------
-
-static QCString addTemplateNames(const QCString &s,const QCString &n,const QCString &t)
-{
- QCString result;
- QCString clRealName=n;
- int p=0,i;
- if ((i=clRealName.find('<'))!=-1)
- {
- clRealName=clRealName.left(i); // strip template specialization
- }
- if ((i=clRealName.findRev("::"))!=-1)
- {
- clRealName=clRealName.right(clRealName.length()-i-2);
- }
- while ((i=s.find(clRealName,p))!=-1)
- {
- result+=s.mid(p,i-p);
- uint j=clRealName.length()+i;
- if (s.length()==j || (s.at(j)!='<' && !isId(s.at(j))))
- { // add template names
- //printf("Adding %s+%s\n",clRealName.data(),t.data());
- result+=clRealName+t;
- }
- else
- { // template names already present
- //printf("Adding %s\n",clRealName.data());
- result+=clRealName;
- }
- p=i+clRealName.length();
- }
- result+=s.right(s.length()-p);
- //printf("addTemplateNames(%s,%s,%s)=%s\n",s.data(),n.data(),t.data(),result.data());
- return result;
-}
-
-static bool writeDefArgumentList(OutputList &ol,ClassDef *cd,
- const QCString & /*scopeName*/,MemberDef *md)
-{
- ArgumentList *defArgList=md->isDocsForDefinition() ?
- md->argumentList() : md->declArgumentList();
- //printf("writeDefArgumentList `%s' isDocsForDefinition()=%d\n",md->name().data(),md->isDocsForDefinition());
- if (defArgList==0)
- {
- return FALSE; // member has no function like argument list
- }
- if (!md->isDefine()) ol.docify(" ");
-
- //printf("writeDefArgList(%d)\n",defArgList->count());
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
- {
- // html
- ol.endMemberDocName();
- ol.startParameterList(!md->isObjCMethod());
- }
- ol.enableAll();
- ol.disable(OutputGenerator::Html);
- {
- // other formats
- if (!md->isObjCMethod()) ol.docify("("); // start argument list
- ol.endMemberDocName();
- }
- ol.popGeneratorState();
- //printf("===> name=%s isDefine=%d\n",md->name().data(),md->isDefine());
-
- Argument *a=defArgList->first();
- QCString cName;
- if (cd)
- {
- cName=cd->name();
- int il=cName.find('<');
- int ir=cName.findRev('>');
- if (il!=-1 && ir!=-1 && ir>il)
- {
- cName=cName.mid(il,ir-il+1);
- //printf("1. cName=%s\n",cName.data());
- }
- else if (cd->templateArguments())
- {
- cName=tempArgListToString(cd->templateArguments());
- //printf("2. cName=%s\n",cName.data());
- }
- else // no template specifier
- {
- cName.resize(0);
- }
- }
- //printf("~~~ %s cName=%s\n",md->name().data(),cName.data());
-
- //if (!md->isDefine()) ol.startParameter(TRUE); else ol.docify(" ");
- bool first=TRUE;
- while (a)
- {
- if (md->isDefine() || first) ol.startParameterType(first,md->isObjCMethod()?"dummy":0);
- QRegExp re(")("),res("(.*\\*");
- int vp=a->type.find(re);
- int wp=a->type.find(res);
-
- // use the following to put the function pointer type before the name
- bool hasFuncPtrType=FALSE;
-
- // or use the following to put the function pointer as it appears in
- // the prototype.
- // bool hasFuncPtrType=vp!=-1 && wp!=-1 && wp<vp;
-
- if (!a->attrib.isEmpty() && !md->isObjCMethod()) // argument has an IDL attribute
- {
- ol.docify(a->attrib+" ");
- }
- if (hasFuncPtrType) // argument type is a function pointer
- {
- //printf("a->type=`%s' a->name=`%s'\n",a->type.data(),a->name.data());
- QCString n=a->type.left(vp);
- if (hasFuncPtrType) n=a->type.left(wp);
- if (md->isObjCMethod()) { n.prepend("("); n.append(")"); }
- if (!cName.isEmpty()) n=addTemplateNames(n,cd->name(),cName);
- linkifyText(TextGeneratorOLImpl(ol),cd,md->getBodyDef(),md->name(),n);
- }
- else // non-function pointer type
- {
- QCString n=a->type;
- if (md->isObjCMethod()) { n.prepend("("); n.append(")"); }
- if (a->type!="...")
- {
- if (!cName.isEmpty()) n=addTemplateNames(n,cd->name(),cName);
- linkifyText(TextGeneratorOLImpl(ol),cd,md->getBodyDef(),md->name(),n);
- }
- }
- if (!md->isDefine())
- {
- ol.endParameterType();
- ol.startParameterName(defArgList->count()<2);
- }
- if (hasFuncPtrType)
- {
- ol.docify(a->type.mid(wp,vp-wp));
- }
- if (!a->name.isEmpty() || (a->name.isEmpty() && a->type=="...")) // argument has a name
- {
- if (!hasFuncPtrType)
- {
- ol.docify(" ");
- }
- ol.disable(OutputGenerator::Man);
- ol.startEmphasis();
- ol.enable(OutputGenerator::Man);
- if (a->name.isEmpty()) ol.docify(a->type); else ol.docify(a->name);
- ol.disable(OutputGenerator::Man);
- ol.endEmphasis();
- ol.enable(OutputGenerator::Man);
- }
- if (!a->array.isEmpty())
- {
- ol.docify(a->array);
- }
- if (hasFuncPtrType) // write the part of the argument type
- // that comes after the name
- {
- linkifyText(TextGeneratorOLImpl(ol),cd,md->getBodyDef(),
- md->name(),a->type.right(a->type.length()-vp));
- }
- if (!a->defval.isEmpty()) // write the default value
- {
- QCString n=a->defval;
- if (!cName.isEmpty()) n=addTemplateNames(n,cd->name(),cName);
- ol.docify(" = ");
-
- ol.startTypewriter();
- linkifyText(TextGeneratorOLImpl(ol),cd,md->getBodyDef(),md->name(),n,FALSE,TRUE,TRUE);
- ol.endTypewriter();
-
- }
- a=defArgList->next();
- if (a)
- {
- if (!md->isObjCMethod()) ol.docify(", "); // there are more arguments
- if (!md->isDefine())
- {
- QCString key;
- if (md->isObjCMethod() && a->attrib.length()>=2)
- {
- //printf("Found parameter keyword %s\n",a->attrib.data());
- // strip [ and ]
- key=a->attrib.mid(1,a->attrib.length()-2);
- if (key!=",") key+=":"; // for normal keywords add colon
- }
- ol.endParameterName(FALSE,FALSE,!md->isObjCMethod());
- ol.startParameterType(FALSE,key);
- }
- }
- first=FALSE;
- }
- ol.pushGeneratorState();
- bool htmlOn = ol.isEnabled(OutputGenerator::Html);
- ol.disable(OutputGenerator::Html);
- //if (!first) ol.writeString("&nbsp;");
- if (!md->isObjCMethod()) ol.docify(")"); // end argument list
- ol.enableAll();
- ol.disableAllBut(OutputGenerator::Html);
- if (!htmlOn) ol.disable(OutputGenerator::Html);
- if (!md->isDefine())
- {
- if (first) ol.startParameterName(defArgList->count()<2);
- ol.endParameterName(TRUE,defArgList->count()<2,!md->isObjCMethod());
- }
- else
- {
- ol.endParameterType();
- ol.startParameterName(TRUE);
- ol.endParameterName(TRUE,TRUE,!md->isObjCMethod());
- }
- ol.popGeneratorState();
- if (defArgList->constSpecifier)
- {
- ol.docify(" const");
- }
- if (defArgList->volatileSpecifier)
- {
- ol.docify(" volatile");
- }
- return TRUE;
-}
-
-static void writeTemplatePrefix(OutputList &ol,ArgumentList *al)
-{
- ol.docify("template<");
- Argument *a=al->first();
- while (a)
- {
- ol.docify(a->type);
- ol.docify(" ");
- ol.docify(a->name);
- if (a->defval.length()!=0)
- {
- ol.docify(" = ");
- ol.docify(a->defval);
- }
- a=al->next();
- if (a) ol.docify(", ");
- }
- ol.docify("> ");
-}
-
-//-----------------------------------------------------------------------------
-
-/*! Creates a new member definition.
- *
- * \param df File containing the definition of this member.
- * \param dl Line at which the member definition was found.
- * \param t A string representing the type of the member.
- * \param na A string representing the name of the member.
- * \param a A string representing the arguments of the member.
- * \param e A string representing the throw clause of the members.
- * \param p The protection context of the member, possible values are:
- * \c Public, \c Protected, \c Private.
- * \param v The degree of `virtualness' of the member, possible values are:
- * \c Normal, \c Virtual, \c Pure.
- * \param s A boolean that is true iff the member is static.
- * \param r A boolean that is true iff the member is only related.
- * \param mt The kind of member. See #MemberDef::MemberType for a list of
- * all types.
- * \param tal The template arguments of this member.
- * \param al The arguments of this member. This is a structured form of
- * the string past as argument \a a.
- */
-
-MemberDef::MemberDef(const char *df,int dl,
- const char *t,const char *na,const char *a,const char *e,
- Protection p,Specifier v,bool s,bool r,MemberType mt,
- const ArgumentList *tal,const ArgumentList *al
- ) : Definition(df,dl,na)
-{
- //printf("++++++ MemberDef(%s file=%s,line=%d static=%d) ++++++ \n",
- // na,df,dl,s);
- classDef=0;
- fileDef=0;
- redefines=0;
- m_relatedAlso=0;
- redefinedBy=0;
- nspace=0;
- memDef=0;
- memDec=0;
- group=0;
- grpId=-1;
- exampleSDict=0;
- enumFields=0;
- enumScope=0;
- enumDeclList=0;
- //scopeTAL=0;
- //membTAL=0;
- m_defTmpArgLists=0;
- m_hasCallGraph = FALSE;
- initLines=0;
- type=t;
- if (mt==Typedef) type.stripPrefix("typedef ");
- type.stripPrefix("struct ");
- type.stripPrefix("class " );
- type.stripPrefix("union " );
- type=removeRedundantWhiteSpace(type);
-
- args=a;
- args=removeRedundantWhiteSpace(args);
- if (type.isEmpty()) decl=name()+args; else decl=type+" "+name()+args;
-
- //declLine=0;
- memberGroup=0;
- virt=v;
- prot=p;
- related=r;
- stat=s;
- mtype=mt;
- exception=e;
- proto=FALSE;
- annScope=FALSE;
- memSpec=0;
- annMemb=0;
- annUsed=FALSE;
- annShown=FALSE;
- annEnumType=0;
- //indDepth=0;
- section=0;
- groupAlias=0;
- explExt=FALSE;
- tspec=FALSE;
- cachedAnonymousType=0;
- maxInitLines=Config_getInt("MAX_INITIALIZER_LINES");
- userInitLines=-1;
- docEnumValues=FALSE;
- // copy function template arguments (if any)
- if (tal)
- {
- tArgList = new ArgumentList;
- tArgList->setAutoDelete(TRUE);
- ArgumentListIterator ali(*tal);
- Argument *a;
- for (;(a=ali.current());++ali)
- {
- tArgList->append(new Argument(*a));
- }
- }
- else
- {
- tArgList=0;
- }
- //printf("new member al=%p\n",al);
- // copy function definition arguments (if any)
- if (al)
- {
- defArgList = new ArgumentList;
- defArgList->setAutoDelete(TRUE);
- ArgumentListIterator ali(*al);
- Argument *a;
- for (;(a=ali.current());++ali)
- {
- //printf("copy argument %s (doc=%s)\n",a->name.data(),a->docs.data());
- defArgList->append(new Argument(*a));
- }
- defArgList->constSpecifier = al->constSpecifier;
- defArgList->volatileSpecifier = al->volatileSpecifier;
- defArgList->pureSpecifier = al->pureSpecifier;
- //printf("defArgList(%p)->constSpecifier=%d\n",defArgList,defArgList->constSpecifier);
- }
- else
- {
- defArgList=0;
- }
- // convert function declaration arguments (if any)
- if (!args.isEmpty())
- {
- declArgList = new ArgumentList;
- stringToArgumentList(args,declArgList);
- //printf("setDeclArgList %s to %p const=%d\n",args.data(),
- // declArgList,declArgList->constSpecifier);
- }
- else
- {
- declArgList = 0;
- }
- m_templateMaster = 0;
- classSectionSDict = 0;
- docsForDefinition = TRUE;
- m_isTypedefValCached = FALSE;
- m_cachedTypedefValue = 0;
- m_inbodyLine = -1;
- m_implOnly=FALSE;
- groupMember = 0;
- m_hasDocumentedParams = FALSE;
- m_hasDocumentedReturnType = FALSE;
- m_docProvider = 0;
- m_isDMember = m_defFileName.right(2).lower()==".d";
-}
-
-/*! Destroys the member definition. */
-MemberDef::~MemberDef()
-{
- delete redefinedBy;
- delete exampleSDict;
- delete enumFields;
- delete defArgList;
- delete tArgList;
- delete m_defTmpArgLists;
- delete classSectionSDict;
- delete declArgList;
-}
-
-void MemberDef::setReimplements(MemberDef *md)
-{
- //if (redefines==0) redefines = new MemberList;
- //if (redefines->find(md)==-1) redefines->inSort(md);
-
- redefines = md;
-}
-
-void MemberDef::insertReimplementedBy(MemberDef *md)
-{
- if (m_templateMaster)
- {
- m_templateMaster->insertReimplementedBy(md);
- }
- if (redefinedBy==0) redefinedBy = new MemberList;
- if (redefinedBy->findRef(md)==-1)
- {
- redefinedBy->inSort(md);
- }
-}
-
-MemberDef *MemberDef::reimplements() const
-{
- return redefines;
-}
-
-MemberList *MemberDef::reimplementedBy() const
-{
- return redefinedBy;
-}
-
-void MemberDef::insertEnumField(MemberDef *md)
-{
- if (enumFields==0) enumFields=new MemberList;
- enumFields->append(md);
-}
-
-bool MemberDef::addExample(const char *anchor,const char *nameStr,
- const char *file)
-{
- //printf("%s::addExample(%s,%s,%s)\n",name().data(),anchor,nameStr,file);
- if (exampleSDict==0) exampleSDict = new ExampleSDict;
- if (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;
- exampleSDict->inSort(nameStr,e);
- return TRUE;
- }
- return FALSE;
-}
-
-bool MemberDef::hasExamples()
-{
- if (exampleSDict==0)
- return FALSE;
- else
- return exampleSDict->count()>0;
-}
-
-QCString MemberDef::getOutputFileBase() const
-{
- static bool separateMemberPages = Config_getBool("SEPARATE_MEMBER_PAGES");
- QCString baseName;
- if (explicitOutputFileBase)
- {
- return explicitOutputFileBase;
- }
- else if (m_templateMaster)
- {
- return m_templateMaster->getOutputFileBase();
- }
- else if (group)
- {
- baseName=group->getOutputFileBase();
- }
- else if (classDef)
- {
- baseName=classDef->getOutputFileBase();
- }
- else if (nspace)
- {
- baseName=nspace->getOutputFileBase();
- }
- else if (fileDef)
- {
- baseName=fileDef->getOutputFileBase();
- }
-
- if (baseName.isEmpty())
- {
- warn(m_defFileName,m_defLine,
- "Warning: Internal inconsistency: member %s does not belong to any"
- " container!",name().data()
- );
- return "dummy";
- }
- else if (separateMemberPages)
- {
- if (getEnumScope()) // enum value, which is part of enum's documentation
- {
- baseName+="_"+getEnumScope()->anchor();
- }
- else
- {
- baseName+="_"+anchor();
- }
- }
- return baseName;
-}
-
-QCString MemberDef::getReference() const
-{
- if (m_templateMaster)
- {
- return m_templateMaster->getReference();
- }
- else if (group)
- {
- return group->getReference();
- }
- else if (classDef)
- {
- return classDef->getReference();
- }
- else if (nspace)
- {
- return nspace->getReference();
- }
- else if (fileDef)
- {
- return fileDef->getReference();
- }
- return "";
-}
-
-QCString MemberDef::anchor() const
-{
- QCString result=anc;
- if (groupAlias) return groupAlias->anchor();
- if (m_templateMaster) return m_templateMaster->anchor();
- if (enumScope) result.prepend(enumScope->anchor());
- if (group)
- {
- if (groupMember)
- {
- result=groupMember->anchor();
- }
- else
- {
- result.prepend("g");
- }
- }
- return result;
-}
-
-bool MemberDef::isLinkableInProject() const
-{
- static bool extractPrivate = Config_getBool("EXTRACT_PRIVATE");
- static bool extractStatic = Config_getBool("EXTRACT_STATIC");
- //printf("MemberDef::isLinkableInProject(name=%s)\n",name().data());
- if (m_templateMaster)
- {
- return m_templateMaster->isLinkableInProject();
- }
- if (name().isEmpty() || name().at(0)=='@')
- {
- //printf("name invalid\n");
- return FALSE; // not a valid or a dummy name
- }
- if (!hasDocumentation() && !isReference())
- {
- //printf("no docs or reference\n");
- return FALSE; // no documentation
- }
- if (group && !group->isLinkableInProject())
- {
- //printf("group but group not linkable!\n");
- return FALSE; // group but group not linkable
- }
- if (!group && classDef && !classDef->isLinkableInProject())
- {
- //printf("in a class but class not linkable!\n");
- return FALSE; // in class but class not linkable
- }
- if (!group && nspace && !related && !nspace->isLinkableInProject())
- {
- //printf("in a namespace but namespace not linkable!\n");
- return FALSE; // in namespace but namespace not linkable
- }
- if (!group && !nspace && !related && !classDef && fileDef && !fileDef->isLinkableInProject())
- {
- //printf("in a file but file not linkable!\n");
- return FALSE; // in file (and not in namespace) but file not linkable
- }
- if (prot==Private && !extractPrivate && mtype!=Friend)
- {
- //printf("private and invisible!\n");
- return FALSE; // hidden due to protection
- }
- if (isStatic() && classDef==0 && !extractStatic)
- {
- //printf("static and invisible!\n");
- return FALSE; // hidden due to staticness
- }
- //printf("linkable!\n");
- return TRUE; // linkable!
-}
-
-bool MemberDef::isLinkable() const
-{
- if (m_templateMaster)
- {
- return m_templateMaster->isLinkable();
- }
- else
- {
- return isLinkableInProject() || isReference();
- }
-}
-
-
-void MemberDef::setDefinitionTemplateParameterLists(QList<ArgumentList> *lists)
-{
- if (lists)
- {
- if (m_defTmpArgLists) delete m_defTmpArgLists;
- m_defTmpArgLists = copyArgumentLists(lists);
- }
-}
-
-void MemberDef::writeLink(OutputList &ol,ClassDef *,NamespaceDef *,
- FileDef *fd,GroupDef *gd,bool onlyText)
-{
- QCString sep = Config_getBool("OPTIMIZE_OUTPUT_JAVA") ? "." : "::";
- QCString n = name();
- if (classDef && gd) n.prepend(classDef->name()+sep);
- else if (nspace && (gd || fd)) n.prepend(nspace->name()+sep);
- if (isObjCMethod())
- {
- if (isStatic()) ol.docify("+ "); else ol.docify("- ");
- }
- if (!onlyText) // write link
- {
- ol.writeObjectLink(getReference(),getOutputFileBase(),anchor(),n);
- }
- else // write only text
- {
- ol.startBold();
- ol.docify(n);
- ol.endBold();
- }
-}
-
-/*! If this member has an anonymous class/struct/union as its type, then
- * this method will return the ClassDef that describes this return type.
- */
-ClassDef *MemberDef::getClassDefOfAnonymousType()
-{
- if (cachedAnonymousType) return cachedAnonymousType;
-
- QCString cname;
- if (getClassDef()!=0)
- {
- cname=getClassDef()->name().copy();
- }
- else if (getNamespaceDef()!=0)
- {
- cname=getNamespaceDef()->name().copy();
- }
- QCString ltype(type);
- // strip `static' keyword from ltype
- //if (ltype.left(7)=="static ") ltype=ltype.right(ltype.length()-7);
- // strip `friend' keyword from ltype
- ltype.stripPrefix("friend ");
- static QRegExp r("@[0-9]+");
- int l,i=r.match(ltype,0,&l);
- //printf("ltype=`%s' i=%d\n",ltype.data(),i);
- // search for the last anonymous scope in the member type
- ClassDef *annoClassDef=0;
- if (i!=-1) // found anonymous scope in type
- {
- int il=i-1,ir=i+l;
- // extract anonymous scope
- while (il>=0 && (isId(ltype.at(il)) || ltype.at(il)==':' || ltype.at(il)=='@')) il--;
- if (il>0) il++; else if (il<0) il=0;
- while (ir<(int)ltype.length() && (isId(ltype.at(ir)) || ltype.at(ir)==':' || ltype.at(ir)=='@')) ir++;
-
- QCString annName = ltype.mid(il,ir-il);
-
- // if inside a class or namespace try to prepend the scope name
- if (!cname.isEmpty() && annName.left(cname.length()+2)!=cname+"::")
- {
- QCString ts=stripAnonymousNamespaceScope(cname+"::"+annName);
- //printf("Member::writeDeclaration: Trying %s\n",ts.data());
- annoClassDef=getClass(ts);
- }
- // if not found yet, try without scope name
- if (annoClassDef==0)
- {
- QCString ts=stripAnonymousNamespaceScope(annName);
- //printf("Member::writeDeclaration: Trying %s\n",ts.data());
- annoClassDef=getClass(ts);
- }
- }
- cachedAnonymousType = annoClassDef;
- return annoClassDef;
-}
-
-/*! This methods returns TRUE iff the brief section (also known as
- * declaration section) is visible in the documentation.
- */
-bool MemberDef::isBriefSectionVisible() const
-{
- static bool extractStatic = Config_getBool("EXTRACT_STATIC");
- static bool hideUndocMembers = Config_getBool("HIDE_UNDOC_MEMBERS");
- static bool briefMemberDesc = Config_getBool("BRIEF_MEMBER_DESC");
- static bool repeatBrief = Config_getBool("REPEAT_BRIEF");
- static bool hideFriendCompounds = Config_getBool("HIDE_FRIEND_COMPOUNDS");
- static bool extractPrivate = Config_getBool("EXTRACT_PRIVATE");
-
- //printf("Member %s grpId=%d docs=%s file=%s args=%s\n",
- // name().data(),
- // 0,"", //grpId,grpId==-1?"<none>":Doxygen::memberDocDict[grpId]->data(),
- // "", //getFileDef()->name().data(),
- // argsString());
-
- MemberGroupInfo *info = Doxygen::memGrpInfoDict[grpId];
- //QCString *pMemGrp = Doxygen::memberDocDict[grpId];
- bool hasDocs = hasDocumentation() ||
- // part of a documented member group
- (grpId!=-1 && info && !info->doc.isEmpty());
-
- // only include static members with file/namespace scope if
- // explicitly enabled in the config file
- bool visibleIfStatic = !(getClassDef()==0 &&
- isStatic() &&
- !extractStatic
- );
-
- // only include members is the are documented or
- // HIDE_UNDOC_MEMBERS is NO in the config file
- bool visibleIfDocumented = (!hideUndocMembers ||
- hasDocs ||
- isDocumentedFriendClass()
- );
-
- // hide members with no detailed description and brief descriptions
- // explicitly disabled.
- bool visibleIfEnabled = !(hideUndocMembers &&
- documentation().isEmpty() &&
- !briefMemberDesc &&
- !repeatBrief
- );
-
- // Hide friend (class|struct|union) declarations if HIDE_FRIEND_COMPOUNDS is true
- bool visibleIfFriendCompound = !(hideFriendCompounds &&
- isFriend() &&
- (type=="friend class" ||
- type=="friend struct" ||
- type=="friend union"
- )
- );
-
- // only include members that are non-private unless EXTRACT_PRIVATE is
- // set to YES or the member is part of a group
- bool visibleIfPrivate = (protection()!=Private ||
- extractPrivate ||
- mtype==Friend
- );
-
- // hide member if it overrides a member in a superclass and has no
- // documentation of its own
- //bool visibleIfDocVirtual = !reimplements() ||
- // !Config_getBool("INHERIT_DOCS") ||
- // hasDocs;
-
- // true if this member is a constructor or destructor
- bool cOrDTor = isConstructor() || isDestructor();
-
- // hide default constructors or destructors (no args) without
- // documentation
- bool visibleIfNotDefaultCDTor = !(cOrDTor &&
- defArgList &&
- (defArgList->isEmpty() ||
- defArgList->first()->type == "void"
- ) &&
- !hasDocs
- );
-
- //printf("visibleIfStatic=%d visibleIfDocumented=%d visibleIfEnabled=%d"
- // "visibleIfPrivate=%d visibleIfDocVirtual=%d visibltIfNotDefaultCDTor=%d "
- // "visibleIfFriendCompound=%d\n",visibleIfStatic,visibleIfDocumented,
- // visibleIfEnabled,visibleIfPrivate,visibleIfDocVirtual,visibleIfNotDefaultCDTor,
- // visibleIfFriendCompound);
-
- bool visible = visibleIfStatic && visibleIfDocumented &&
- visibleIfEnabled && visibleIfPrivate &&
- /*visibleIfDocVirtual &&*/ visibleIfNotDefaultCDTor &&
- visibleIfFriendCompound &&
- !annScope;
- //printf("MemberDef::isBriefSectionVisible() %d\n",visible);
- return visible;
-}
-
-
-void MemberDef::writeDeclaration(OutputList &ol,
- ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
- bool inGroup
- )
-{
- //printf("%s MemberDef::writeDeclaration() inGroup=%d\n",name().data(),inGroup);
-
- // hide members whose brief section should not be visible
- //if (!isBriefSectionVisible()) return;
-
- Definition *d=0;
- ASSERT (cd!=0 || nd!=0 || fd!=0 || gd!=0); // member should belong to something
- if (cd) d=cd; else if (nd) d=nd; else if (fd) d=fd; else d=gd;
-
- // write tag file information of this member
- if (!Config_getString("GENERATE_TAGFILE").isEmpty())
- {
- Doxygen::tagFile << " <member kind=\"";
- switch (mtype)
- {
- case Define: Doxygen::tagFile << "define"; break;
- case EnumValue: Doxygen::tagFile << "enumvalue"; break;
- case Property: Doxygen::tagFile << "property"; break;
- case Event: Doxygen::tagFile << "event"; break;
- case Variable: Doxygen::tagFile << "variable"; break;
- case Typedef: Doxygen::tagFile << "typedef"; break;
- case Enumeration: Doxygen::tagFile << "enumeration"; break;
- case Function: Doxygen::tagFile << "function"; break;
- case Signal: Doxygen::tagFile << "signal"; break;
- case Prototype: Doxygen::tagFile << "prototype"; break;
- case Friend: Doxygen::tagFile << "friend"; break;
- case DCOP: Doxygen::tagFile << "dcop"; break;
- case Slot: Doxygen::tagFile << "slot"; break;
- }
- if (prot!=Public)
- {
- Doxygen::tagFile << "\" protection=\"";
- if (prot==Protected) Doxygen::tagFile << "protected";
- else if (prot==Package) Doxygen::tagFile << "package";
- else /* Private */ Doxygen::tagFile << "private";
- }
- if (virt!=Normal)
- {
- Doxygen::tagFile << "\" virtualness=\"";
- if (virt==Virtual) Doxygen::tagFile << "virtual";
- else /* Pure */ Doxygen::tagFile << "pure";
- }
- if (isStatic())
- {
- Doxygen::tagFile << "\" static=\"yes";
- }
- Doxygen::tagFile << "\">" << endl;
- Doxygen::tagFile << " <type>" << convertToXML(typeString()) << "</type>" << endl;
- Doxygen::tagFile << " <name>" << convertToXML(name()) << "</name>" << endl;
- Doxygen::tagFile << " <anchorfile>" << convertToXML(getOutputFileBase()+Doxygen::htmlFileExtension) << "</anchorfile>" << endl;
- Doxygen::tagFile << " <anchor>" << convertToXML(anchor()) << "</anchor>" << endl;
- Doxygen::tagFile << " <arglist>" << convertToXML(argsString()) << "</arglist>" << endl;
- writeDocAnchorsToTagFile();
- Doxygen::tagFile << " </member>" << endl;
- }
-
- // write search index info
- if (Config_getBool("SEARCHENGINE"))
- {
- Doxygen::searchIndex->setCurrentDoc(qualifiedName(),getOutputFileBase(),anchor());
- Doxygen::searchIndex->addWord(localName(),TRUE);
- Doxygen::searchIndex->addWord(qualifiedName(),FALSE);
- }
-
- QCString cname = d->name();
- QCString cfname = getOutputFileBase();
- //QCString osname = cname;
- // in case of class members that are put in a group the name of the outerscope
- // differs from the cname.
- //if (getOuterScope()) osname=getOuterScope()->name();
-
- HtmlHelp *htmlHelp=0;
- bool hasHtmlHelp = Config_getBool("GENERATE_HTML") && Config_getBool("GENERATE_HTMLHELP");
- if (hasHtmlHelp) htmlHelp = HtmlHelp::getInstance();
-
- // search for the last anonymous scope in the member type
- ClassDef *annoClassDef=getClassDefOfAnonymousType();
-
- // start a new member declaration
- bool isAnonymous = annoClassDef || annMemb || annEnumType;
- ///printf("startMemberItem for %s\n",name().data());
- ol.startMemberItem( isAnonymous ? 1 : tArgList ? 3 : 0);
-
- // If there is no detailed description we need to write the anchor here.
- bool detailsVisible = isDetailedSectionLinkable();
- if (!detailsVisible && !annMemb)
- {
- QCString doxyName=name().copy();
- if (!cname.isEmpty()) doxyName.prepend(cname+"::");
- QCString doxyArgs=argsString();
- ol.startDoxyAnchor(cfname,cname,anchor(),doxyName,doxyArgs);
-
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
- ol.disable(OutputGenerator::Latex);
- ol.docify("\n");
- ol.popGeneratorState();
- }
-
- if (annoClassDef || annMemb)
- {
- int j;
- for (j=0;j<s_indentLevel;j++)
- {
- ol.writeNonBreakableSpace(3);
- }
- }
-
- // *** write template lists
- if (tArgList)
- {
- if (!isAnonymous) ol.startMemberTemplateParams();
- writeTemplatePrefix(ol,tArgList);
- if (!isAnonymous) ol.endMemberTemplateParams();
- }
-
- // *** write type
- QCString ltype(type);
- if (mtype==Typedef) ltype.prepend("typedef ");
- // strip `friend' keyword from ltype
- ltype.stripPrefix("friend ");
- static QRegExp r("@[0-9]+");
-
- bool endAnonScopeNeeded=FALSE;
- int l,i=r.match(ltype,0,&l);
- if (i!=-1) // member has an anonymous type
- {
- //printf("annoClassDef=%p annMemb=%p scopeName=`%s' anonymous=`%s'\n",
- // annoClassDef,annMemb,cname.data(),ltype.mid(i,l).data());
-
- if (annoClassDef) // type is an anonymous compound
- {
- int ir=i+l;
- //printf("<<<<<<<<<<<<<<\n");
- ol.startAnonTypeScope(s_indentLevel++);
- annoClassDef->writeDeclaration(ol,annMemb,inGroup);
- //printf(">>>>>>>>>>>>>> startMemberItem(2)\n");
- ol.startMemberItem(2);
- int j;
- for (j=0;j< s_indentLevel-1;j++)
- {
- ol.writeNonBreakableSpace(3);
- }
- QCString varName=ltype.right(ltype.length()-ir).stripWhiteSpace();
- //printf(">>>>>> indDepth=%d ltype=`%s' varName=`%s'\n",indDepth,ltype.data(),varName.data());
- ol.docify("}");
- if (varName.isEmpty() && (name().isEmpty() || name().at(0)=='@'))
- {
- ol.docify(";");
- }
- endAnonScopeNeeded=TRUE;
- }
- else
- {
- if (getAnonymousEnumType()) // type is an anonymous enum
- {
- linkifyText(TextGeneratorOLImpl(ol),d,getBodyDef(),name(),ltype.left(i),TRUE);
- getAnonymousEnumType()->writeEnumDeclaration(ol,cd,nd,fd,gd);
- //ol+=*getAnonymousEnumType()->enumDecl();
- linkifyText(TextGeneratorOLImpl(ol),d,fileDef,name(),ltype.right(ltype.length()-i-l),TRUE);
- }
- else
- {
- ltype = ltype.left(i) + " { ... } " + ltype.right(ltype.length()-i-l);
- linkifyText(TextGeneratorOLImpl(ol),d,getBodyDef(),name(),ltype,TRUE);
- }
- }
- }
- else
- {
- if (isObjCMethod())
- {
- ltype.prepend("(");
- ltype.append(")");
- }
- linkifyText(TextGeneratorOLImpl(ol),d,getBodyDef(),name(),ltype,TRUE);
- }
- bool htmlOn = ol.isEnabled(OutputGenerator::Html);
- if (htmlOn && Config_getBool("HTML_ALIGN_MEMBERS") && !ltype.isEmpty())
- {
- ol.disable(OutputGenerator::Html);
- }
- if (!ltype.isEmpty()) ol.docify(" ");
- if (htmlOn)
- {
- ol.enable(OutputGenerator::Html);
- }
-
- if (annMemb)
- {
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
- ol.writeNonBreakableSpace(3);
- ol.popGeneratorState();
- }
- else
- {
- ol.insertMemberAlign(tArgList!=0);
- }
-
- // *** write name
- if (!name().isEmpty() && name().at(0)!='@') // hide annonymous stuff
- {
- //printf("Member name=`%s gd=%p md->groupDef=%p inGroup=%d isLinkable()=%d\n",name().data(),gd,getGroupDef(),inGroup,isLinkable());
- if (!(name().isEmpty() || name().at(0)=='@') && // name valid
- (hasDocumentation() || isReference()) && // has docs
- !(prot==Private && !Config_getBool("EXTRACT_PRIVATE") && mtype!=Friend) && // hidden due to protection
- !(isStatic() && classDef==0 && !Config_getBool("EXTRACT_STATIC")) // hidden due to static-ness
- )
- {
- if (annMemb)
- {
- //printf("anchor=%s ann_anchor=%s\n",anchor(),annMemb->anchor());
- annMemb->writeLink(ol,
- annMemb->getClassDef(),
- annMemb->getNamespaceDef(),
- annMemb->getFileDef(),
- annMemb->getGroupDef()
- );
- annMemb->annUsed=annUsed=TRUE;
- }
- else
- {
- //printf("writeLink %s->%d\n",name.data(),hasDocumentation());
- ClassDef *rcd = cd;
- if (isReference() && classDef) rcd = classDef;
- writeLink(ol,rcd,nd,fd,gd);
- }
- }
- else if (isDocumentedFriendClass())
- // if the member is an undocumented friend declaration for some class,
- // then maybe we can link to the class
- {
- writeLink(ol,getClass(name()),0,0,0);
- }
- else
- // there is a brief member description and brief member
- // descriptions are enabled or there is no detailed description.
- {
- if (annMemb) annMemb->annUsed=annUsed=TRUE;
- ClassDef *rcd = cd;
- if (isReference() && classDef) rcd = classDef;
- writeLink(ol,rcd,nd,fd,gd,TRUE);
- }
- }
-
- // *** write arguments
- if (argsString() && !isObjCMethod())
- {
- if (!isDefine()) ol.writeString(" ");
- //ol.docify(argsString());
- linkifyText(TextGeneratorOLImpl(ol),d,getBodyDef(),name(),argsString());
- }
-
- // *** write exceptions
- if (excpString())
- {
- ol.writeString(" ");
- ol.docify(excpString());
- }
-
- // *** write bitfields
- if (!bitfields.isEmpty()) // add bitfields
- {
- linkifyText(TextGeneratorOLImpl(ol),d,getBodyDef(),name(),bitfields.simplifyWhiteSpace());
- }
- else if (hasOneLineInitializer()
- //!init.isEmpty() && initLines==0 && // one line initializer
- //((maxInitLines>0 && userInitLines==-1) || userInitLines>0) // enabled by default or explicitly
- ) // add initializer
- {
- if (!isDefine())
- {
- ol.writeString(" = ");
- linkifyText(TextGeneratorOLImpl(ol),d,getBodyDef(),name(),init.simplifyWhiteSpace());
- }
- else
- {
- ol.writeNonBreakableSpace(3);
- linkifyText(TextGeneratorOLImpl(ol),d,getBodyDef(),name(),init);
- }
- }
-
- if (isObjCMethod() && isImplementation())
- {
- ol.startTypewriter();
- ol.docify(" [implementation]");
- ol.endTypewriter();
- }
-
- if (!detailsVisible && !annMemb)
- {
- ol.endDoxyAnchor(cfname,anchor());
- }
-
- //printf("endMember %s annoClassDef=%p annEnumType=%p\n",
- // name().data(),annoClassDef,annEnumType);
- ol.endMemberItem();
- if (endAnonScopeNeeded) ol.endAnonTypeScope(--s_indentLevel);
-
- // write brief description
- if (!briefDescription().isEmpty() &&
- Config_getBool("BRIEF_MEMBER_DESC")
- /* && !annMemb */
- )
- {
- ol.startMemberDescription();
- ol.parseDoc(briefFile(),briefLine(),getOuterScope()?getOuterScope():d,this,briefDescription(),TRUE,FALSE);
- if (detailsVisible)
- {
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
- //ol.endEmphasis();
- ol.docify(" ");
- if (group!=0 && gd==0) // forward link to the group
- {
- ol.startTextLink(getOutputFileBase(),anchor());
- }
- else // local link
- {
- ol.startTextLink(0,anchor());
- }
- ol.endTextLink();
- //ol.startEmphasis();
- ol.popGeneratorState();
- }
- //ol.newParagraph();
- ol.endMemberDescription();
- }
- warnIfUndocumented();
-}
-
-bool MemberDef::isDetailedSectionLinkable() const
-{
- static bool extractAll = Config_getBool("EXTRACT_ALL");
- static bool alwaysDetailedSec = Config_getBool("ALWAYS_DETAILED_SEC");
- static bool repeatBrief = Config_getBool("REPEAT_BRIEF");
- static bool briefMemberDesc = Config_getBool("BRIEF_MEMBER_DESC");
- static bool hideUndocMembers = Config_getBool("HIDE_UNDOC_MEMBERS");
- static bool extractStatic = Config_getBool("EXTRACT_STATIC");
- static bool extractPrivate = Config_getBool("EXTRACT_PRIVATE");
-
- // the member has details documentation for any of the following reasons
- bool docFilter =
- // treat everything as documented
- extractAll ||
- // has detailed docs
- !documentation().isEmpty() ||
- // has inbody docs
- !inbodyDocumentation().isEmpty() ||
- // is an enum with values that are documented
- (mtype==Enumeration && docEnumValues) ||
- // is documented enum value
- (mtype==EnumValue && !briefDescription().isEmpty()) ||
- // has brief description that is part of the detailed description
- (!briefDescription().isEmpty() && // has brief docs
- (alwaysDetailedSec && // they or visible in
- repeatBrief || // detailed section or
- !briefMemberDesc // they are explicitly not
- ) // shown in brief section
- ) ||
- // has a multi-line initialization block
- //(initLines>0 && initLines<maxInitLines) ||
- (hasMultiLineInitializer() && !hideUndocMembers) ||
- // has one or more documented arguments
- (defArgList!=0 && defArgList->hasDocumentation());
-
- // this is not a global static or global statics should be extracted
- bool staticFilter = getClassDef()!=0 || !isStatic() || extractStatic;
-
- // only include members that are non-private unless EXTRACT_PRIVATE is
- // set to YES or the member is part of a group
- bool privateFilter = (protection()!=Private || extractPrivate ||
- mtype==Friend
- );
-
- // member is part of an anonymous scope that is the type of
- // another member in the list.
- //
- //bool inAnonymousScope = !briefDescription().isEmpty() && annUsed;
-
- // hide friend (class|struct|union) member if HIDE_FRIEND_COMPOUNDS
- // is true
- bool friendCompoundFilter = !(Config_getBool("HIDE_FRIEND_COMPOUNDS") &&
- isFriend() &&
- (type=="friend class" ||
- type=="friend struct" ||
- type=="friend union"
- )
- );
-
- return ((docFilter && staticFilter && privateFilter && friendCompoundFilter) /*|| inAnonymousScope*/);
-}
-
-bool MemberDef::isDetailedSectionVisible(bool inGroup,bool inFile) const
-{
- bool groupFilter = getGroupDef()==0 || inGroup;
- bool fileFilter = getNamespaceDef()==0 || !inFile;
-
- bool visible = isDetailedSectionLinkable() && groupFilter && fileFilter &&
- !isReference();
- //printf("MemberDef::isDetailedSectionVisible() %d\n",visible);
- return visible;
-}
-
-/*! Writes the "detailed documentation" section of this member to
- * all active output formats.
- */
-void MemberDef::writeDocumentation(MemberList *ml,OutputList &ol,
- const char *scName,
- Definition *container,
- bool inGroup
- )
-{
- // 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("MemberDef::writeDocumentation(): name=`%s' hasDocs=`%d' containerType=%d inGroup=%d\n",
- // name().data(),hasDocs,container->definitionType(),inGroup);
- if ( !hasDocs ) return;
- if (isEnumValue()) return;
-
- QCString scopeName = scName;
- QCString memAnchor = anchor();
- QCString ciname = container->name();
- if (container->definitionType()==TypeGroup)
- {
- if (getClassDef()) scopeName=getClassDef()->name();
- else if (getNamespaceDef()) scopeName=getNamespaceDef()->name();
- else if (getFileDef()) scopeName=getFileDef()->name();
- ciname = ((GroupDef *)container)->groupTitle();
- }
- else if (container->definitionType()==TypeFile && getNamespaceDef())
- { // member is in a namespace, but is written as part of the file documentation
- // as well, so we need to make sure its label is unique.
- memAnchor.prepend("file_");
- }
-
- QCString cname = container->name();
- QCString cfname = getOutputFileBase();
- QCString cfiname = container->getOutputFileBase();
-
- bool hasHtmlHelp = Config_getBool("GENERATE_HTML") && Config_getBool("GENERATE_HTMLHELP");
- HtmlHelp *htmlHelp = 0;
- if (hasHtmlHelp)
- {
- htmlHelp = HtmlHelp::getInstance();
- htmlHelp->addIndexItem(ciname,name(),cfiname,cfname,memAnchor);
- }
-
- // get member name
- QCString doxyName=name().copy();
- // prepend scope if there is any. TODO: make this optional for C only docs
- if (scopeName) doxyName.prepend((QCString)scopeName+"::");
- QCString doxyArgs=argsString();
-
- QCString ldef = definition();
- //printf("member `%s' def=`%s'\n",name().data(),ldef.data());
- if (isEnumerate())
- {
- if (name().at(0)=='@')
- {
- ldef = "anonymous enum";
- }
- else
- {
- ldef.prepend("enum ");
- }
- }
- int i=0,l;
- static QRegExp r("@[0-9]+");
-
- //----------------------------------------
-
- ol.pushGeneratorState();
-
-
- if ((isVariable() || isTypedef()) && (i=r.match(ldef,0,&l))!=-1)
- {
- // find enum type and insert it in the definition
- MemberListIterator vmli(*ml);
- MemberDef *vmd;
- bool found=FALSE;
- for ( ; (vmd=vmli.current()) && !found ; ++vmli)
- {
- if (vmd->isEnumerate() && ldef.mid(i,l)==vmd->name())
- {
- ol.startDoxyAnchor(cfname,cname,memAnchor,doxyName,doxyArgs);
- ol.startMemberDoc(cname,name(),memAnchor,name());
- linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),ldef.left(i));
- vmd->writeEnumDeclaration(ol,getClassDef(),getNamespaceDef(),getFileDef(),getGroupDef());
- linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),ldef.right(ldef.length()-i-l));
-
- found=TRUE;
- }
- }
- if (!found) // anonymous compound
- {
- //printf("Anonymous compound `%s'\n",cname.data());
- ol.startDoxyAnchor(cfname,cname,memAnchor,doxyName,doxyArgs);
- ol.startMemberDoc(cname,name(),memAnchor,name());
- // strip anonymous compound names from definition
- int si=ldef.find(' '),pi,ei=i+l;
- if (si==-1) si=0;
- while ((pi=r.match(ldef,i+l,&l))!=-1) ei=i=pi+l;
- // first si characters of ldef contain compound type name
- ol.startMemberDocName(isObjCMethod());
- ol.docify(ldef.left(si));
- ol.docify(" { ... } ");
- // last ei characters of ldef contain pointer/reference specifiers
- int ni=ldef.find("::",si);
- if (ni>=ei) ei=ni+2;
- linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),ldef.right(ldef.length()-ei));
- }
- }
- else // not an enum value
- {
- ol.startDoxyAnchor(cfname,cname,memAnchor,doxyName,doxyArgs);
- ol.startMemberDoc(cname,name(),memAnchor,name());
-
- ClassDef *cd=getClassDef();
- if (!Config_getBool("HIDE_SCOPE_NAMES"))
- {
- bool first=TRUE;
- if (m_defTmpArgLists)
- // definition has explicit template parameter declarations
- {
- QListIterator<ArgumentList> ali(*m_defTmpArgLists);
- ArgumentList *tal;
- for (ali.toFirst();(tal=ali.current());++ali)
- {
- if (tal->count()>0)
- {
- if (!first) ol.docify(" ");
- ol.startMemberDocPrefixItem();
- writeTemplatePrefix(ol,tal);
- ol.endMemberDocPrefixItem();
- }
- }
- }
- else // definition gets it template parameters from its class
- // (since no definition was found)
- {
- if (cd && !isTemplateSpecialization())
- {
- QList<ArgumentList> tempParamLists;
- cd->getTemplateParameterLists(tempParamLists);
- //printf("#tempParamLists=%d\n",tempParamLists.count());
- QListIterator<ArgumentList> ali(tempParamLists);
- ArgumentList *tal;
- for (ali.toFirst();(tal=ali.current());++ali)
- {
- if (tal->count()>0)
- {
- if (!first) ol.docify(" ");
- ol.startMemberDocPrefixItem();
- writeTemplatePrefix(ol,tal);
- ol.endMemberDocPrefixItem();
- }
- }
- }
- if (tArgList) // function template prefix
- {
- ol.startMemberDocPrefixItem();
- writeTemplatePrefix(ol,tArgList);
- ol.endMemberDocPrefixItem();
- }
- }
- }
-
- ol.startMemberDocName(isObjCMethod());
- if (cd && cd->isObjectiveC())
- {
- // strip scope name
- int ep = ldef.find("::");
- if (ep!=-1)
- {
- int sp=ldef.findRev(' ',ep);
- if (sp!=-1)
- {
- ldef=ldef.left(sp+1)+ldef.mid(ep+2);
- }
- }
- // strip keywords
- int dp = ldef.find(':');
- if (dp!=-1)
- {
- ldef=ldef.left(dp+1);
- }
- int l=ldef.length();
- //printf("start >%s<\n",ldef.data());
- int i=l-1;
- while (i>=0 && (isId(ldef.at(i)) || ldef.at(i)==':')) i--;
- while (i>=0 && isspace((uchar)ldef.at(i))) i--;
- if (i>0)
- {
- // insert braches around the type
- QCString tmp("("+ldef.left(i+1)+")"+ldef.mid(i+1));
- ldef=tmp;
- }
- //printf("end >%s< i=%d\n",ldef.data(),i);
- if (isStatic()) ldef.prepend("+ "); else ldef.prepend("- ");
- }
-
- linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),ldef);
-
- hasParameterList=writeDefArgumentList(ol,cd,scopeName,this);
- if (hasOneLineInitializer()) // add initializer
- {
- if (!isDefine())
- {
- ol.docify(" = ");
- linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),init.simplifyWhiteSpace());
- }
- else
- {
- ol.writeNonBreakableSpace(3);
- linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),init);
- }
- }
- if (excpString()) // add exception list
- {
- ol.docify(" ");
- linkifyText(TextGeneratorOLImpl(ol),container,getBodyDef(),name(),excpString());
- }
- }
-
- Specifier lvirt=virtualness();
-
- if (!isObjCMethod() &&
- (protection()!=Public || lvirt!=Normal ||
- isFriend() || isRelated() || isExplicit() ||
- isMutable() || (isInline() && Config_getBool("INLINE_INFO")) ||
- isSignal() || isSlot() ||
- isStatic() || (classDef && classDef!=container) ||
- isSettable() || isGettable() || isReadable() || isWritable() ||
- isFinal() || isAbstract()
- )
- )
- {
- // write the member specifier list
- ol.writeLatexSpacing();
- ol.startTypewriter();
- ol.docify(" [");
- QStrList sl;
- if (isFriend()) sl.append("friend");
- else if (isRelated()) sl.append("related");
- else
- {
- if (Config_getBool("INLINE_INFO") && isInline())
- sl.append("inline");
- if (isExplicit()) sl.append("explicit");
- if (isMutable()) sl.append("mutable");
- if (isStatic()) sl.append("static");
- if (isGettable()) sl.append("get");
- if (isSettable()) sl.append("set");
- if (isReadable()) sl.append("read");
- if (isWritable()) sl.append("write");
- if (isFinal()) sl.append("final");
- if (isAbstract()) sl.append("abstract");
- if (protection()==Protected) sl.append("protected");
- else if (protection()==Private) sl.append("private");
- else if (protection()==Package) sl.append("package");
- if (lvirt==Virtual) sl.append("virtual");
- else if (lvirt==Pure) sl.append("pure virtual");
- if (isSignal()) sl.append("signal");
- if (isSlot()) sl.append("slot");
- }
- if (classDef && classDef!=container) sl.append("inherited");
- const char *s=sl.first();
- while (s)
- {
- ol.docify(s);
- s=sl.next();
- if (s) ol.docify(", ");
- }
- ol.docify("]");
- ol.endTypewriter();
- }
- else if (isObjCMethod() && isImplementation())
- {
- ol.writeLatexSpacing();
- ol.startTypewriter();
- ol.docify(" [implementation]");
- ol.endTypewriter();
- }
- if (hasParameterList)
- {
- ol.endParameterList();
- ol.endMemberDoc(TRUE);
- }
- else
- {
- ol.endMemberDocName();
- ol.endMemberDoc(FALSE);
- }
- ol.endDoxyAnchor(cfname,memAnchor);
- ol.startIndent();
-
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::RTF);
- ol.newParagraph();
- ol.popGeneratorState();
-
- /* write multi-line initializer (if any) */
- if (hasMultiLineInitializer()
- //initLines>0 && ((initLines<maxInitLines && userInitLines==-1) // implicitly enabled
- // || initLines<userInitLines // explicitly enabled
- // )
- )
- {
- //printf("md=%s initLines=%d init=`%s'\n",name().data(),initLines,init.data());
- ol.startBold();
- if (mtype==Define)
- ol.parseText(theTranslator->trDefineValue());
- else
- ol.parseText(theTranslator->trInitialValue());
- ol.endBold();
- ParserInterface *pIntf = Doxygen::parserManager->getParser(getDefFileExtension());
- pIntf->resetCodeParserState();
- ol.startCodeFragment();
- pIntf->parseCode(ol,scopeName,init,FALSE,0);
- ol.endCodeFragment();
- }
-
- QCString brief = m_templateMaster ?
- m_templateMaster->briefDescription() : briefDescription();
- QCString detailed = m_templateMaster ?
- m_templateMaster->documentation() : documentation();
- ArgumentList *docArgList = m_templateMaster ?
- m_templateMaster->defArgList : defArgList;
-
- /* write brief description */
- if (!brief.isEmpty() &&
- (Config_getBool("REPEAT_BRIEF") ||
- !Config_getBool("BRIEF_MEMBER_DESC")
- )
- )
- {
- ol.parseDoc(briefFile(),briefLine(),getOuterScope()?getOuterScope():container,this,brief,FALSE,FALSE);
- ol.newParagraph();
- }
-
- /* write detailed description */
- if (!detailed.isEmpty())
- {
- ol.parseDoc(docFile(),docLine(),getOuterScope()?getOuterScope():container,this,detailed+"\n",TRUE,FALSE);
- if (!m_inbodyDocs.isEmpty())
- {
- ol.newParagraph();
- ol.parseDoc(inbodyFile(),inbodyLine(),getOuterScope()?getOuterScope():container,this,m_inbodyDocs+"\n",TRUE,FALSE);
- }
- }
- else if (!brief.isEmpty() && (Config_getBool("REPEAT_BRIEF") ||
- !Config_getBool("BRIEF_MEMBER_DESC")))
- {
- if (!m_inbodyDocs.isEmpty())
- {
- ol.newParagraph();
- ol.parseDoc(inbodyFile(),inbodyLine(),getOuterScope()?getOuterScope():container,this,m_inbodyDocs+"\n",TRUE,FALSE);
- }
- }
-
-
- //printf("***** defArgList=%p name=%s docs=%s hasDocs=%d\n",
- // defArgList,
- // defArgList?defArgList->hasDocumentation():-1);
- if (docArgList && docArgList->hasDocumentation())
- {
- //printf("***** argumentList is documented\n");
- ol.startParamList(BaseOutputDocInterface::Param,theTranslator->trParameters()+": ");
- ol.writeDescItem();
- ol.startDescTable();
- ArgumentListIterator ali(*docArgList);
- Argument *a;
- for (ali.toFirst();(a=ali.current());++ali)
- {
- if (a->hasDocumentation())
- {
- ol.startDescTableTitle();
- ol.docify(a->name);
- ol.endDescTableTitle();
- ol.startDescTableData();
- ol.parseDoc(docFile(),docLine(),
- getOuterScope()?getOuterScope():container,
- this, // memberDef
- a->docs+"\n", // docStr
- TRUE, // indexWords
- FALSE // isExample
- );
- ol.endDescTableData();
- }
- }
- ol.endDescTable();
- ol.endParamList();
- }
-
- // For enum, we also write the documented enum values
- if (isEnumerate())
- {
- bool first=TRUE;
- MemberList *fmdl=enumFieldList();
- if (fmdl)
- {
- MemberDef *fmd=fmdl->first();
- while (fmd)
- {
- if (fmd->isLinkable())
- {
- if (first)
- {
- //ol.newParagraph();
- ol.startSimpleSect(BaseOutputDocInterface::EnumValues,0,0,theTranslator->trEnumerationValues()+": ");
- ol.writeDescItem();
- ol.startDescTable();
- }
-
- ol.addIndexItem(fmd->name(),cname);
- ol.addIndexItem(cname,fmd->name());
-
- if (hasHtmlHelp)
- {
- HtmlHelp::getInstance()->addIndexItem(cname,fmd->name(),cfiname,cfname,fmd->anchor());
- }
- //ol.writeListItem();
- ol.startDescTableTitle(); // this enables emphasis!
- ol.startDoxyAnchor(cfname,cname,fmd->anchor(),fmd->name(),fmd->argsString());
- first=FALSE;
- //ol.startEmphasis();
- ol.docify(fmd->name());
- //ol.endEmphasis();
- ol.disableAllBut(OutputGenerator::Man);
- ol.writeString(" ");
- ol.enableAll();
- ol.endDoxyAnchor(cfname,fmd->anchor());
- ol.endDescTableTitle();
- //ol.newParagraph();
- ol.startDescTableData();
-
- if (!fmd->briefDescription().isEmpty())
- {
- ol.parseDoc(fmd->briefFile(),fmd->briefLine(),getOuterScope()?getOuterScope():container,fmd,fmd->briefDescription(),TRUE,FALSE);
- //ol.newParagraph();
- }
- if (!fmd->briefDescription().isEmpty() &&
- !fmd->documentation().isEmpty())
- {
- ol.newParagraph();
- }
- if (!fmd->documentation().isEmpty())
- {
- ol.parseDoc(fmd->docFile(),fmd->docLine(),getOuterScope()?getOuterScope():container,fmd,fmd->documentation()+"\n",TRUE,FALSE);
- }
- ol.endDescTableData();
- }
- fmd=fmdl->next();
- }
- }
- if (!first)
- {
- //ol.endItemList();
- ol.endDescTable();
- ol.endSimpleSect();
- ol.writeChar('\n');
- }
- }
-
- MemberDef *bmd=reimplements();
- ClassDef *bcd=0;
- if (bmd && (bcd=bmd->getClassDef()))
- {
- // write class that contains a member that is reimplemented by this one
- if (bcd->isLinkable())
- {
- ol.disable(OutputGenerator::RTF);
- ol.newParagraph();
- ol.enableAll();
-
- QCString reimplFromLine;
- if (bmd->virtualness()!=Pure && bcd->compoundType()!=ClassDef::Interface)
- {
- reimplFromLine = theTranslator->trReimplementedFromList(1);
- }
- else
- {
- reimplFromLine = theTranslator->trImplementedFromList(1);
- }
- int markerPos = reimplFromLine.find("@0");
- if (markerPos!=-1) // should always pass this.
- {
- ol.parseText(reimplFromLine.left(markerPos)); //text left from marker
- if (bmd->isLinkable()) // replace marker with link
- {
- //Definition *bd=bmd->group;
- //if (bd==0) bd=bcd;
- ol.writeObjectLink(bmd->getReference(),bmd->getOutputFileBase(),
- bmd->anchor(),bcd->displayName());
-
- //ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
- // bmd->anchor(),bcd->name());
- if ( bmd->isLinkableInProject() )
- {
- writePageRef(ol,bmd->getOutputFileBase(),bmd->anchor());
- }
- }
- else
- {
- ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
- 0,bcd->displayName());
- if (bcd->isLinkableInProject()/* && !Config_getBool("PDF_HYPERLINKS")*/ )
- {
- writePageRef(ol,bcd->getOutputFileBase(),0);
- }
- }
- ol.parseText(reimplFromLine.right(
- reimplFromLine.length()-markerPos-2)); // text right from marker
-
- }
- else
- {
- err("Error: translation error: no marker in trReimplementsFromList()\n");
- }
- }
-
- //ol.writeString(".");
- }
-
- MemberList *bml=reimplementedBy();
- if (bml)
- {
- MemberListIterator mli(*bml);
- MemberDef *bmd=0;
- uint count=0;
- ClassDef *bcd=0;
- for (mli.toFirst();(bmd=mli.current()) && (bcd=bmd->getClassDef());++mli)
- {
- // count the members that directly inherit from md and for
- // which the member and class are visible in the docs.
- if ( bmd->isLinkable() && bcd->isLinkable() )
- {
- count++;
- }
- }
- if (count>0)
- {
- mli.toFirst();
- // write the list of classes that overwrite this member
- ol.disable(OutputGenerator::RTF);
- ol.newParagraph();
- ol.enable(OutputGenerator::RTF);
-
- QCString reimplInLine;
- if (virt==Pure || (classDef && classDef->compoundType()==ClassDef::Interface))
- {
- reimplInLine = theTranslator->trImplementedInList(count);
- }
- else
- {
- reimplInLine = theTranslator->trReimplementedInList(count);
- }
- static QRegExp marker("@[0-9]+");
- int index=0,newIndex,matchLen;
- // now replace all markers in reimplInLine with links to the classes
- while ((newIndex=marker.match(reimplInLine,index,&matchLen))!=-1)
- {
- ol.parseText(reimplInLine.mid(index,newIndex-index));
- bool ok;
- uint entryIndex = reimplInLine.mid(newIndex+1,matchLen-1).toUInt(&ok);
- //bmd=bml->at(entryIndex);
-
- count=0;
- // find the entryIndex-th documented entry in the inheritance list.
- for (mli.toLast();(bmd=mli.current()) && (bcd=bmd->getClassDef());--mli)
- {
- if ( bmd->isLinkable() && bcd->isLinkable())
- {
- if (count==entryIndex) break;
- count++;
- }
- }
-
- if (ok && bcd && bmd) // write link for marker
- {
- //ol.writeObjectLink(bcd->getReference(),bcd->getOutputFileBase(),
- // bmd->anchor(),bcd->name());
- ol.writeObjectLink(bmd->getReference(),bmd->getOutputFileBase(),
- bmd->anchor(),bcd->displayName());
-
- if (bmd->isLinkableInProject() )
- {
- writePageRef(ol,bmd->getOutputFileBase(),bmd->anchor());
- }
- }
- ++mli;
- index=newIndex+matchLen;
- }
- ol.parseText(reimplInLine.right(reimplInLine.length()-index));
- }
- }
-
- // write the list of examples that use this member
- if (hasExamples())
- {
- ol.startSimpleSect(BaseOutputDocInterface::Examples,0,0,theTranslator->trExamples()+": ");
- ol.writeDescItem();
- writeExample(ol,getExamples());
- //ol.endDescItem();
- ol.endSimpleSect();
- }
-
- // write reference to the source
- writeSourceDef(ol,cname);
- writeSourceRefs(ol,cname);
- writeSourceReffedBy(ol,cname);
- writeInlineCode(ol,cname);
-
- // write call graph
- if ((m_hasCallGraph || Config_getBool("CALL_GRAPH"))
- && isFunction() && Config_getBool("HAVE_DOT")
- )
- {
- DotCallGraph callGraph(this,Config_getInt("MAX_DOT_GRAPH_DEPTH"));
- if (!callGraph.isTrivial())
- {
- msg("Generating call graph for function %s\n",qualifiedName().data());
- ol.disable(OutputGenerator::Man);
- ol.newParagraph();
- ol.startCallGraph();
- ol.parseText(theTranslator->trCallGraph());
- ol.endCallGraph(callGraph);
- ol.enableAll();
- }
- }
-
- ol.endIndent();
-
- // enable LaTeX again
- //if (Config_getBool("EXTRACT_ALL") && !hasDocs) ol.enable(OutputGenerator::Latex);
- ol.popGeneratorState();
-
- //------------------------------------------------
-
- if (!Config_getBool("EXTRACT_ALL") &&
- Config_getBool("WARN_IF_UNDOCUMENTED") &&
- Config_getBool("WARN_NO_PARAMDOC"))
- {
- if (!hasDocumentedParams())
- {
- warn_doc_error(docFile(),docLine(),
- "Warning: parameters of member %s are not (all) documented",
- qualifiedName().data());
- }
- if (!hasDocumentedReturnType())
- {
- warn_doc_error(docFile(),docLine(),
- "Warning: return type of member %s is not documented",
- qualifiedName().data());
- }
- }
-
-}
-
-void MemberDef::warnIfUndocumented()
-{
- if (memberGroup) return;
- ClassDef *cd = getClassDef();
- NamespaceDef *nd = getNamespaceDef();
- FileDef *fd = getFileDef();
- GroupDef *gd = getGroupDef();
- Definition *d=0;
- const char *t=0;
- if (cd)
- t="class", d=cd;
- else if (nd)
- t="namespace", d=nd;
- else if (gd)
- t="group", d=gd;
- else
- t="file", d=fd;
-
- //printf("warnIfUndoc: d->isLinkable()=%d isLinkable()=%d "
- // "isDocumentedFriendClass()=%d name()=%s prot=%d\n",
- // d->isLinkable(),isLinkable(),isDocumentedFriendClass(),
- // name().data(),prot);
- if (!isLinkable() &&
- !isFriendClass() &&
- name().find('@')==-1 && d->name().find('@')==-1 &&
- (prot!=Private || Config_getBool("EXTRACT_PRIVATE"))
- )
- {
- warn_undoc(m_defFileName,m_defLine,"Warning: Member %s%s of %s %s is not documented.",
- name().data(),argsString()?argsString():"",t,d->name().data());
- }
-}
-
-
-//void MemberDef::setEnumDecl(OutputList &ed)
-//{
-// enumDeclList=new OutputList(&ed);
-// *enumDeclList+=ed;
-//}
-
-bool MemberDef::isFriendClass() const
-{
- return (isFriend() &&
- (type=="friend class" || type=="friend struct" ||
- type=="friend union"));
-}
-
-bool MemberDef::isDocumentedFriendClass() const
-{
- ClassDef *fcd=0;
- QCString baseName=name();
- int i=baseName.find('<');
- if (i!=-1) baseName=baseName.left(i);
- return (isFriendClass() &&
- (fcd=getClass(baseName)) && fcd->isLinkable());
-}
-
-bool MemberDef::hasDocumentation() const
-{
- return Definition::hasDocumentation() ||
- !m_inbodyDocs.isEmpty() ||
- (mtype==Enumeration && docEnumValues) || // has enum values
- (defArgList!=0 && defArgList->hasDocumentation()); // has doc arguments
-}
-
-void MemberDef::setMemberGroup(MemberGroup *grp)
-{
- memberGroup = grp;
-}
-
-bool MemberDef::visibleMemberGroup(bool hideNoHeader)
-{
- return memberGroup!=0 &&
- (!hideNoHeader || memberGroup->header()!="[NOHEADER]");
-}
-
-QCString MemberDef::getScopeString() const
-{
- QCString result;
- if (getClassDef()) result=getClassDef()->displayName();
- else if (getNamespaceDef()) result=getNamespaceDef()->displayName();
- return result;
-}
-
-static QCString escapeAnchor(const QCString &anchor)
-{
- QCString result;
- int l = anchor.length(),i;
- for (i=0;i<l;i++)
- {
- char c = anchor.at(i);
- if ((c>='a' && c<='z') || (c>='A' && c<='Z'))
- {
- result+=c;
- }
- else
- {
- static char hexStr[]="0123456789ABCDEF";
- char escChar[]={ '_', 0, 0, 0 };
- escChar[1]=hexStr[c>>4];
- escChar[2]=hexStr[c&0xf];
- result+=escChar;
- }
- }
- return result;
-}
-
-void MemberDef::setAnchor(const char *a)
-{
- //anc=a;
- a=a;
- QCString memAnchor = name();
- if (!args.isEmpty()) memAnchor+=args;
- anc = escapeAnchor(memAnchor);
-}
-
-void MemberDef::setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri,
- const QCString &fileName,int startLine,
- bool hasDocs,MemberDef *member)
-{
- //printf("%s MemberDef::setGroupDef(%s)\n",name().data(),gd->name().data());
- group=gd;
- grouppri=pri;
- groupFileName=fileName;
- groupStartLine=startLine;
- groupHasDocs=hasDocs;
- groupMember=member;
-}
-
-void MemberDef::setEnumScope(MemberDef *md)
-{
- enumScope=md;
- if (md->group)
- {
- group=md->group;
- grouppri=md->grouppri;
- groupFileName=md->groupFileName;
- groupStartLine=md->groupStartLine;
- groupHasDocs=md->groupHasDocs;
- }
-}
-
-void MemberDef::setMemberClass(ClassDef *cd)
-{
- classDef=cd;
- setOuterScope(cd);
-}
-
-void MemberDef::setNamespace(NamespaceDef *nd)
-{
- nspace=nd;
- setOuterScope(nd);
-}
-
-MemberDef *MemberDef::createTemplateInstanceMember(
- ArgumentList *formalArgs,ArgumentList *actualArgs)
-{
- //printf(" Member %s %s %s\n",typeString(),name().data(),argsString());
- ArgumentList *actualArgList = 0;
- if (defArgList)
- {
- actualArgList = new ArgumentList;
- ArgumentListIterator ali(*defArgList);
- Argument *arg;
- for (;(arg=ali.current());++ali)
- {
- Argument *actArg = new Argument(*arg);
- actArg->type = substituteTemplateArgumentsInString(actArg->type,formalArgs,actualArgs);
- actualArgList->append(actArg);
- }
- actualArgList->constSpecifier = defArgList->constSpecifier;
- actualArgList->volatileSpecifier = defArgList->volatileSpecifier;
- actualArgList->pureSpecifier = defArgList->pureSpecifier;
- }
-
- QCString methodName=name();
- if (methodName.left(9)=="operator ") // conversion operator
- {
- methodName=substituteTemplateArgumentsInString(methodName,formalArgs,actualArgs);
- }
-
- MemberDef *imd = new MemberDef(
- getDefFileName(),getDefLine(),
- substituteTemplateArgumentsInString(type,formalArgs,actualArgs),
- methodName,
- substituteTemplateArgumentsInString(args,formalArgs,actualArgs),
- exception, prot,
- virt, stat, related, mtype, 0, 0
- );
- imd->defArgList = actualArgList;
- imd->def = substituteTemplateArgumentsInString(def,formalArgs,actualArgs);
- imd->setBodyDef(getBodyDef());
- imd->setBodySegment(getStartBodyLine(),getEndBodyLine());
- //imd->setBodyMember(this);
-
- // TODO: init other member variables (if needed).
- // TODO: reimplemented info
- return imd;
-}
-
-bool MemberDef::hasOneLineInitializer() const
-{
- //printf("%s: init=%s, initLines=%d maxInitLines=%d userInitLines=%d\n",
- // name().data(),init.data(),initLines,maxInitLines,userInitLines);
- return !init.isEmpty() && initLines==0 && // one line initializer
- ((maxInitLines>0 && userInitLines==-1) || userInitLines>0); // enabled by default or explicitly
-}
-
-bool MemberDef::hasMultiLineInitializer() const
-{
- //printf("initLines=%d userInitLines=%d maxInitLines=%d\n",
- // initLines,userInitLines,maxInitLines);
- return initLines>0 &&
- ((initLines<maxInitLines && userInitLines==-1) // implicitly enabled
- || initLines<userInitLines // explicitly enabled
- );
-}
-
-void MemberDef::setInitializer(const char *initializer)
-{
- //printf("setInitializer(%s)\n",initializer);
- init=initializer;
- int p=init.length()-1;
- while (p>=0 && isspace((uchar)init.at(p))) p--;
- init=init.left(p+1);
- initLines=init.contains('\n');
-}
-
-void MemberDef::addListReference(Definition *)
-{
- static bool optimizeOutputForC = Config_getBool("OPTIMIZE_OUTPUT_FOR_C");
- static bool hideScopeNames = Config_getBool("HIDE_SCOPE_NAMES");
- static bool optimizeOutputJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
- visited=TRUE;
- if (!isLinkableInProject()) return;
- QCString memLabel;
- if (optimizeOutputForC)
- {
- memLabel=theTranslator->trGlobal(TRUE,TRUE);
- }
- else
- {
- memLabel=theTranslator->trMember(TRUE,TRUE);
- }
- QCString memName = name();
- Definition *pd=getOuterScope();
- QCString memArgs;
- if (!isRelated() &&
- (
- (!hideScopeNames && // there is a scope
- pd && pd!=Doxygen::globalScope) // and we can show it
- ||
- (pd=getClassDef()) // it's a class so we
- // show the scope anyway
- )
- )
- {
- if (isObjCMethod())
- {
- memName = "[" + pd->name() + " " + name() + "]";
- }
- else if (optimizeOutputJava)
- {
- memName.prepend(pd->name()+".");
- memArgs = argsString();
- }
- else
- {
- memName.prepend(pd->name()+"::");
- memArgs = argsString();
- }
- }
- if (xrefListItems())
- {
- addRefItem(xrefListItems(),memLabel,
- getOutputFileBase()+"#"+anchor(),memName,memArgs);
- }
- else
- {
- }
-}
-
-MemberList *MemberDef::getSectionList(Definition *d) const
-{
- return (d!=0 && classSectionSDict) ? classSectionSDict->find((char *)d) : 0;
-}
-
-void MemberDef::setSectionList(Definition *d, MemberList *sl)
-{
- if (classSectionSDict==0) classSectionSDict = new SDict<MemberList>(7);
- classSectionSDict->append((char *)d,sl);
-}
-
-Specifier MemberDef::virtualness() const
-{
- Specifier v = virt;
- MemberDef *rmd = reimplements();
- while (rmd && v==Normal)
- {
- v = rmd->virtualness()==Normal ? Normal : Virtual;
- rmd = rmd->reimplements();
- }
- return v;
-}
-
-bool MemberDef::isConstructor() const
-{
- if (classDef)
- {
- if (m_isDMember) // for D
- {
- return name()=="this";
- }
- else // for other languages
- {
- return name()==classDef->localName();
- }
- }
- else
- return FALSE;
-}
-
-bool MemberDef::isDestructor() const
-{
- if (m_isDMember) // for D
- {
- return name()=="~this";
- }
- else // other languages
- {
- return name().find('~')!=-1 && name().find("operator")==-1;
- }
-}
-
-void MemberDef::writeEnumDeclaration(OutputList &typeDecl,
- ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd)
-{
- int enumMemCount=0;
-
- QList<MemberDef> *fmdl=enumFieldList();
- uint numVisibleEnumValues=0;
- if (fmdl)
- {
- MemberDef *fmd=fmdl->first();
- while (fmd)
- {
- if (fmd->isBriefSectionVisible()) numVisibleEnumValues++;
- fmd=fmdl->next();
- }
- }
- if (numVisibleEnumValues==0 && !isBriefSectionVisible()) return;
-
- QCString n = name();
- int i=n.findRev("::");
- if (i!=-1) n=n.right(n.length()-i-2); // strip scope (TODO: is this needed?)
- if (n[0]!='@') // not an anonymous enum
- {
- if (isLinkableInProject() || hasDocumentedEnumValues())
- {
- if (!Config_getString("GENERATE_TAGFILE").isEmpty())
- {
- Doxygen::tagFile << " <member kind=\"enumeration\">" << endl;
- Doxygen::tagFile << " <name>" << convertToXML(name()) << "</name>" << endl;
- Doxygen::tagFile << " <anchor>" << convertToXML(anchor()) << "</anchor>" << endl;
- Doxygen::tagFile << " <arglist>" << convertToXML(argsString()) << "</arglist>" << endl;
- Doxygen::tagFile << " </member>" << endl;
- }
- writeLink(typeDecl,cd,nd,fd,gd);
- }
- else
- {
- typeDecl.startBold();
- typeDecl.docify(n);
- typeDecl.endBold();
- }
- typeDecl.writeChar(' ');
- }
-
- if (numVisibleEnumValues>0)
- {
- uint enumValuesPerLine = (uint)Config_getInt("ENUM_VALUES_PER_LINE");
- if (enumValuesPerLine==0) enumValuesPerLine=1;
- typeDecl.docify("{ ");
- if (fmdl)
- {
- MemberDef *fmd=fmdl->first();
- bool fmdVisible = fmd->isBriefSectionVisible();
- while (fmd)
- {
- if (fmdVisible)
- {
- /* in html we start a new line after a number of items */
- if (numVisibleEnumValues>enumValuesPerLine
- && (enumMemCount%enumValuesPerLine)==0
- )
- {
- typeDecl.pushGeneratorState();
- typeDecl.disableAllBut(OutputGenerator::Html);
- typeDecl.enable(OutputGenerator::Latex);
- typeDecl.lineBreak();
- typeDecl.disable(OutputGenerator::Latex);
- typeDecl.writeString("&nbsp;&nbsp;");
- typeDecl.popGeneratorState();
- }
-
- if (fmd->hasDocumentation()) // enum value has docs
- {
- if (!Config_getString("GENERATE_TAGFILE").isEmpty())
- {
- Doxygen::tagFile << " <member kind=\"enumvalue\">" << endl;
- Doxygen::tagFile << " <name>" << convertToXML(fmd->name()) << "</name>" << endl;
- Doxygen::tagFile << " <anchor>" << convertToXML(fmd->anchor()) << "</anchor>" << endl;
- Doxygen::tagFile << " <arglist>" << convertToXML(fmd->argsString()) << "</arglist>" << endl;
- Doxygen::tagFile << " </member>" << endl;
- }
- fmd->writeLink(typeDecl,cd,nd,fd,gd);
- }
- else // no docs for this enum value
- {
- typeDecl.startBold();
- typeDecl.docify(fmd->name());
- typeDecl.endBold();
- }
- if (fmd->hasOneLineInitializer()) // enum value has initializer
- {
- typeDecl.writeString(" = ");
- typeDecl.parseText(fmd->initializer());
- }
- }
-
- bool prevVisible = fmdVisible;
- fmd=fmdl->next();
- if (fmd && (fmdVisible=fmd->isBriefSectionVisible()))
- {
- typeDecl.writeString(", ");
- }
- if (prevVisible)
- {
- typeDecl.disable(OutputGenerator::Man);
- typeDecl.writeString("\n"); // to prevent too long lines in LaTeX
- typeDecl.enable(OutputGenerator::Man);
- enumMemCount++;
- }
- }
- if (numVisibleEnumValues>enumValuesPerLine)
- {
- typeDecl.pushGeneratorState();
- typeDecl.disableAllBut(OutputGenerator::Html);
- typeDecl.lineBreak();
- typeDecl.popGeneratorState();
- }
- }
- typeDecl.docify(" }");
- }
-}
-
-void MemberDef::setArgumentList(ArgumentList *al)
-{
- if (defArgList) delete defArgList;
- defArgList = al;
-}
-
-void MemberDef::setDeclArgumentList(ArgumentList *al)
-{
- if (declArgList) delete declArgList;
- declArgList = al;
-}
-
-void MemberDef::findSectionsInDocumentation()
-{
- docFindSections(documentation(),this,0,docFile());
-}
-
-void MemberDef::enableCallGraph(bool e)
-{
- m_hasCallGraph=e;
- if (e) Doxygen::parseSourcesNeeded = TRUE;
-}
-
-bool MemberDef::protectionVisible() const
-{
- return prot==Public ||
- (prot==Private && Config_getBool("EXTRACT_PRIVATE")) ||
- (prot==Protected && Config_getBool("EXTRACT_PROTECTED")) ||
- (prot==Package && Config_getBool("EXTRACT_PACKAGE"));
-}
-
-void MemberDef::setInbodyDocumentation(const char *docs,
- const char *docFile,int docLine)
-{
- m_inbodyDocs = docs;
- m_inbodyDocs = m_inbodyDocs.stripWhiteSpace();
- m_inbodyLine = docLine;
- m_inbodyFile = docFile;
-}
-
-bool MemberDef::isObjCMethod() const
-{
- if (classDef && classDef->isObjectiveC() && isFunction()) return TRUE;
- return FALSE;
-}
-
-QCString MemberDef::qualifiedName()
-{
- if (isObjCMethod())
- {
- QCString qm;
- if (isStatic()) qm="+"; else qm="-";
- qm+="[";
- qm+=classDef->name()+" ";
- qm+=name();
- qm+="]";
- return qm;
- }
- else
- {
- return Definition::qualifiedName();
- }
-}
-
-void MemberDef::setTagInfo(TagInfo *ti)
-{
- if (ti)
- {
- setAnchor(ti->anchor);
- setReference(ti->tagName);
- explicitOutputFileBase = stripExtension(ti->fileName);
- }
-}
-
-QCString MemberDef::objCMethodName(bool localLink,bool showStatic) const
-{
- QCString qm;
- if (showStatic)
- {
- if (isStatic()) qm="+ "; else qm="- ";
- }
- qm+=name();
- if (!localLink) // link to method of same class
- {
- qm+=" (";
- qm+=classDef->name();
- qm+=")";
- }
- return qm;
-}
-
diff --git a/src/memberdef.h b/src/memberdef.h
deleted file mode 100644
index 9f69892..0000000
--- a/src/memberdef.h
+++ /dev/null
@@ -1,416 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 MEMBERDEF_H
-#define MEMBERDEF_H
-
-#include "qtbc.h"
-#include <qlist.h>
-#include <qdict.h>
-#include <qstack.h>
-
-#include "entry.h"
-#include "definition.h"
-#include "sortdict.h"
-
-class ClassDef;
-class NamespaceDef;
-class GroupDef;
-class FileDef;
-class MemberList;
-class MemberGroup;
-class ExampleSDict;
-class OutputList;
-class GroupDef;
-class QTextStream;
-class ArgumentList;
-
-struct SourceReference
-{
- FileDef *fd;
- QCString anchor;
-};
-
-class MemberDef : public Definition
-{
- public:
-
- enum MemberType {
- Define,
- Function,
- Variable,
- Typedef,
- Enumeration,
- EnumValue,
- Prototype,
- Signal,
- Slot,
- Friend,
- DCOP,
- Property,
- Event
- };
-
- MemberDef(const char *defFileName,int defLine,
- const char *type,const char *name,const char *args,
- const char *excp,Protection prot,Specifier virt,bool stat,
- bool related,MemberType t,const ArgumentList *tal,
- const ArgumentList *al);
- ~MemberDef();
- DefType definitionType() const { return TypeMember; }
-
- // link id
- QCString getOutputFileBase() const;
- QCString getReference() const;
- QCString anchor() const;
-
- const char *declaration() const { return decl; }
- const char *definition() const { return def; }
- const char *typeString() const { return type; }
- const char *argsString() const { return args; }
- const char *excpString() const { return exception; }
- const char *bitfieldString() const { return bitfields; }
- const QCString &initializer() const { return init; }
- int initializerLines() const { return initLines; }
- int getMemberSpecifiers() const { return memSpec; }
- MemberList *getSectionList(Definition *d) const;
-
- // scope query members
- ClassDef *getClassDef() const { return classDef; }
- FileDef *getFileDef() const { return fileDef; }
- NamespaceDef* getNamespaceDef() const { return nspace; }
- //Definition *getCompoundDef() const;
-
- // grabbing the property read/write accessor names
- const char *getReadAccessor() const { return read; }
- const char *getWriteAccessor() const { return write; }
-
- // querying the grouping definition
- GroupDef *getGroupDef() const { return group; }
- Grouping::GroupPri_t getGroupPri() const { return grouppri; }
- const char *getGroupFileName() const { return groupFileName; }
- int getGroupStartLine() const { return groupStartLine; }
- bool getGroupHasDocs() const { return groupHasDocs; }
- QCString qualifiedName();
- QCString objCMethodName(bool localLink,bool showStatic) const;
-
- // direct kind info
- Protection protection() const { return prot; }
- Specifier virtualness() const;
- MemberType memberType() const { return mtype; }
-
- // getter methods
- bool isSignal() const { return mtype==Signal; }
- bool isSlot() const { return mtype==Slot; }
- bool isVariable() const { return mtype==Variable; }
- bool isEnumerate() const { return mtype==Enumeration; }
- bool isEnumValue() const { return mtype==EnumValue; }
- bool isTypedef() const { return mtype==Typedef; }
- bool isFunction() const { return mtype==Function; }
- bool isDefine() const { return mtype==Define; }
- bool isFriend() const { return mtype==Friend; }
- bool isDCOP() const { return mtype==DCOP; }
- bool isProperty() const { return mtype==Property; }
- bool isEvent() const { return mtype==Event; }
- bool isRelated() const { return related; }
- bool isStatic() const { return stat; }
- bool isInline() const { return (memSpec&Entry::Inline)!=0; }
- bool isExplicit() const { return (memSpec&Entry::Explicit)!=0; }
- bool isMutable() const { return (memSpec&Entry::Mutable)!=0; }
- bool isGettable() const { return (memSpec&Entry::Gettable)!=0; }
- bool isSettable() const { return (memSpec&Entry::Settable)!=0; }
- bool isReadable() const { return (memSpec&Entry::Readable)!=0; }
- bool isWritable() const { return (memSpec&Entry::Writable)!=0; }
- bool isFinal() const { return (memSpec&Entry::Final)!=0; }
- bool isAbstract() const { return (memSpec&Entry::Abstract)!=0; }
- bool isImplementation() const { return m_implOnly; }
- bool isExternal() const { return explExt; }
- bool isTemplateSpecialization() const { return tspec; }
- bool hasDocumentedParams() const { return m_hasDocumentedParams; }
- bool hasDocumentedReturnType() const { return m_hasDocumentedReturnType; }
- bool isObjCMethod() const;
- bool isConstructor() const;
- bool isDestructor() const;
- bool hasOneLineInitializer() const;
- bool hasMultiLineInitializer() const;
- bool protectionVisible() const;
-
- // output info
- bool isLinkableInProject() const;
- bool isLinkable() const;
- bool hasDocumentation() const; // overrides hasDocumentation in definition.h
- bool isBriefSectionVisible() const;
- bool isDetailedSectionVisible(bool inGroup,bool inFile) const;
- bool isDetailedSectionLinkable() const;
- bool isFriendClass() const;
- bool isDocumentedFriendClass() const;
-
- // set functions
- void setMemberType(MemberType t) { mtype=t; }
- void setDefinition(const char *d) { def=d; }
- void setFileDef(FileDef *fd) { fileDef=fd; }
- void setAnchor(const char *a);
- void setProtection(Protection p) { prot=p; }
- void setMemberSpecifiers(int s) { memSpec=s; }
- void mergeMemberSpecifiers(int s) { memSpec|=s; }
- void setInitializer(const char *i);
- void setBitfields(const char *s) { bitfields = s; }
- void setMaxInitLines(int lines) { userInitLines=lines; }
- void setMemberClass(ClassDef *cd);
- void setSectionList(Definition *d,MemberList *sl);
- void setGroupDef(GroupDef *gd,Grouping::GroupPri_t pri,
- const QCString &fileName,int startLine,bool hasDocs,
- MemberDef *member=0);
- void setExplicitExternal(bool b) { explExt=b; }
- void setReadAccessor(const char *r) { read=r; }
- void setWriteAccessor(const char *w) { write=w; }
- void setTemplateSpecialization(bool b) { tspec=b; }
-
- void makeRelated() { related=TRUE; }
- void setHasDocumentedParams(bool b) { m_hasDocumentedParams = b; }
- void setHasDocumentedReturnType(bool b) { m_hasDocumentedReturnType = b; }
- void setInheritsDocsFrom(MemberDef *md) { m_docProvider = md; }
- void setTagInfo(TagInfo *i);
- void setArgsString(const char *as) { args = as; }
-
- // output generation
- void writeDeclaration(OutputList &ol,
- ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
- bool inGroup);
- void writeDocumentation(MemberList *ml,OutputList &ol,
- const char *scopeName,Definition *container,
- bool inGroup);
- void warnIfUndocumented();
-
- // relation to other members
- void setReimplements(MemberDef *md);
- void insertReimplementedBy(MemberDef *md);
- MemberDef *reimplements() const;
- MemberList *reimplementedBy() const;
-
- // in-body documentation
- void setInbodyDocumentation(const char *docs,const char *file,int line);
- int inbodyLine() const { return m_inbodyLine; }
- QCString inbodyFile() const { return m_inbodyFile; }
- const QCString &inbodyDocumentation() const { return m_inbodyDocs; }
-
- // For function documentation that can also be found in a class's related func section.
- void setRelatedAlso(ClassDef *cd) { m_relatedAlso=cd; }
- ClassDef *relatedAlso() const { return m_relatedAlso; }
-
- // enumeration specific members
- void insertEnumField(MemberDef *md);
- void setEnumScope(MemberDef *md);
- void setEnumClassScope(ClassDef *cd) { classDef = cd; }
- MemberDef *getEnumScope() const { return enumScope; }
- MemberList *enumFieldList() const { return enumFields; }
- void setDocumentedEnumValues(bool value) { docEnumValues=value; }
- bool hasDocumentedEnumValues() const { return docEnumValues; }
- void setAnonymousEnumType(MemberDef *md) { annEnumType = md; }
- MemberDef *getAnonymousEnumType() const { return annEnumType; }
- bool isDocsForDefinition() const { return docsForDefinition; }
-
- // example related members
- bool addExample(const char *anchor,const char *name,const char *file);
- bool hasExamples();
- ExampleSDict *getExamples() const { return exampleSDict; }
-
- // prototype related members
- void setPrototype(bool p) { proto=p; }
- bool isPrototype() const { return proto; }
-
- // argument related members
- ArgumentList *argumentList() const { return defArgList; }
- ArgumentList *declArgumentList() const { return declArgList; }
- void setArgumentList(ArgumentList *al);
- void setDeclArgumentList(ArgumentList *al);
- ArgumentList *templateArguments() const { return tArgList; }
- void setDefinitionTemplateParameterLists(QList<ArgumentList> *lists);
- QList<ArgumentList> *definitionTemplateParameterLists() const
- { return m_defTmpArgLists; }
-
- // namespace related members
- void setNamespace(NamespaceDef *nd);
-
- // member group related members
- void setMemberGroup(MemberGroup *grp);
- MemberGroup *getMemberGroup() const { return memberGroup; }
- void setMemberGroupId(int id) { grpId=id; }
- int getMemberGroupId() const { return grpId; }
- void makeImplementationDetail() { m_implOnly=TRUE; }
-
- // anonymous scope members
- void setFromAnonymousScope(bool b) { annScope=b; }
- void setFromAnonymousMember(MemberDef *m) { annMemb=m; }
- bool fromAnonymousScope() const { return annScope; }
- bool anonymousDeclShown() const { return annUsed; }
- //void setIndentDepth( int i) { indDepth=i; }
- //int indentDepth() { return indDepth; }
-
- // callgraph related members
- bool hasCallGraph() const { return m_hasCallGraph; }
- void enableCallGraph(bool e);
-
- bool visibleMemberGroup(bool hideNoHeader);
- MemberDef *templateMaster() const { return m_templateMaster; }
-
- QCString getScopeString() const;
-
- ClassDef *getClassDefOfAnonymousType();
- MemberDef *createTemplateInstanceMember(ArgumentList *formalArgs,
- ArgumentList *actualArgs);
- void setTemplateMaster(MemberDef *mt) { m_templateMaster=mt; }
- void addListReference(Definition *d);
-
- MemberDef *inheritsDocsFrom() const { return m_docProvider; }
-
- //QCString getBodyAnchor() const
- //{
- // return bodyMemb ? bodyMemb->anchor() : anchor();
- //}
- //void setBodyMember(MemberDef *md) { bodyMemb = md; }
- void setDocsForDefinition(bool b) { docsForDefinition = b; }
- void setGroupAlias(MemberDef *md) { groupAlias = md; }
- MemberDef *getGroupAlias() const { return groupAlias; }
-
- // cached typedef functions
- bool isTypedefValCached() const { return m_isTypedefValCached; }
- ClassDef *getCachedTypedefVal() const { return m_cachedTypedefValue; }
- QCString getCachedTypedefTemplSpec() const { return m_cachedTypedefTemplSpec; }
- void cacheTypedefVal(ClassDef *val,const QCString &templSpec)
- { m_isTypedefValCached=TRUE; m_cachedTypedefValue=val; m_cachedTypedefTemplSpec=templSpec; }
- void invalidateTypedefValCache() { m_isTypedefValCached=FALSE; }
-
- // declaration <-> definition relation
- void setMemberDefinition(MemberDef *md) { memDef=md; }
- void setMemberDeclaration(MemberDef *md) { memDec=md; }
- MemberDef *memberDefinition() const { return memDef; }
- MemberDef *memberDeclaration() const { return memDec; }
-
- void writeEnumDeclaration(OutputList &typeDecl,
- ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd);
-
- void findSectionsInDocumentation();
-
- bool visited;
-
- private:
- void writeLink(OutputList &ol,
- ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
- bool onlyText=FALSE);
-
- ClassDef *classDef; // member of or related to
- FileDef *fileDef; // member of file definition
- MemberDef *enumScope; // the enclosing scope, if this is an enum field
- MemberDef *annEnumType; // the annonymous enum that is the type of this member
- MemberDef *redefines; // the members that this member redefines
- MemberList *redefinedBy; // the list of members that redefine this one
- MemberDef *memDef; // member definition for this declaration
- MemberDef *memDec; // member declaration for this definition
- ClassDef *m_relatedAlso; // points to class marked by relatedAlso
-
- ExampleSDict *exampleSDict; // a dictionary of all examples for quick access
-
- MemberList *enumFields; // enumeration fields
- OutputList *enumDeclList; // stored piece of documentation for enumeration.
- NamespaceDef *nspace; // the namespace this member is in.
- QCString type; // return type
- QCString args; // function arguments/variable array specifiers
- QCString bitfields; // struct member bitfields
- QCString read; // property read accessor
- QCString write; // property write accessor
- QCString exception; // exceptions that can be thrown
- QCString init; // initializer
- int initLines; // number of lines in the initializer
- QCString decl; // member declaration in class
- QCString def; // member definition in code (fully qualified name)
- QCString anc; // HTML anchor name
- MemberDef *groupAlias; // Member containing the definition
- Specifier virt; // normal/virtual/pure virtual
- Protection prot; // protection type [Public/Protected/Private]
- int memSpec; // The specifiers present for this member
- MemberType mtype; // returns the kind of member
- bool related; // is this a member that is only related to a class
- bool stat; // is it a static function?
- bool proto; // is it a prototype;
- bool docEnumValues; // is an enum with documented enum values.
- bool annScope; // member is part of an annoymous scope
- bool annUsed;
- bool annShown;
- bool m_hasCallGraph;
- int maxInitLines; // when the initializer will be displayed
- int userInitLines; // result of explicit \hideinitializer or \showinitializer
- MemberList *section; // declation list containing this member
- MemberDef *annMemb;
- ArgumentList *defArgList; // argument list of this member definition
- ArgumentList *declArgList; // argument list of this member declaration
- ArgumentList *tArgList; // template argument list of function template
- QList<ArgumentList> *m_defTmpArgLists;
- int grpId; // group id
- MemberGroup *memberGroup; // group's member definition
-
- GroupDef *group; // group in which this member is in
- bool explExt; // member was explicitly declared external
- bool tspec; // member is a template specialization
-
- ClassDef *cachedAnonymousType; // if the member has an anonymous compound
- // as its type then this is computed by
- // getClassDefOfAnonymousType() and
- // cached here.
- Grouping::GroupPri_t grouppri; // priority of this definition
- QCString groupFileName; // file where this grouping was defined
- int groupStartLine; // line " " " " "
- bool groupHasDocs; // true if the entry that caused the grouping was documented
- MemberDef *groupMember;
- MemberDef *m_templateMaster;
- SDict<MemberList> *classSectionSDict;
- bool docsForDefinition; // TRUE => documentation block is put before
- // definition.
- // FALSE => block is put before declaration.
-
-
- // disable copying of member defs
- MemberDef(const MemberDef &);
- MemberDef &operator=(const MemberDef &);
- static int s_indentLevel;
-
- bool m_isTypedefValCached;
- ClassDef *m_cachedTypedefValue;
- QCString m_cachedTypedefTemplSpec;
-
- // inbody documentation
- int m_inbodyLine;
- QCString m_inbodyFile;
- QCString m_inbodyDocs;
-
- // objective-c
- bool m_implOnly; // function found in implementation but not
- // in the interface
-
- bool m_hasDocumentedParams;
- bool m_hasDocumentedReturnType;
-
- // documentation inheritance
- MemberDef *m_docProvider;
-
- // to store the output file base from tag files
- QCString explicitOutputFileBase;
-
- bool m_isDMember;
-};
-
-#endif
diff --git a/src/membergroup.cpp b/src/membergroup.cpp
deleted file mode 100644
index aa9e8bc..0000000
--- a/src/membergroup.cpp
+++ /dev/null
@@ -1,235 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 "qtbc.h"
-#include "membergroup.h"
-#include "memberlist.h"
-#include "outputlist.h"
-#include "util.h"
-#include "classdef.h"
-#include "namespacedef.h"
-#include "filedef.h"
-#include "language.h"
-#include "groupdef.h"
-#include "doxygen.h"
-#include "docparser.h"
-
-//static QCString idToName(int id)
-//{
-// QCString result;
-// result.sprintf("mgroup_%d",id);
-// return result;
-//}
-
-MemberGroup::MemberGroup(Definition *parent,
- int id,const char *hdr,const char *d,const char *docFile)
-{
- //printf("New member group id=%d header=%s desc=%s\n",id,hdr,d);
- memberList = new MemberList;
- grpId = id;
- grpHeader = hdr;
- doc = d;
- scope = 0;
- inSameSection = TRUE;
- inDeclSection = 0;
- m_numDecMembers = -1;
- m_parent = parent;
- m_docFile = docFile;
- //printf("Member group docs=`%s'\n",doc.data());
-}
-
-MemberGroup::~MemberGroup()
-{
- delete memberList;
-}
-
-void MemberGroup::insertMember(MemberDef *md)
-{
- //printf("MemberGroup::insertMember memberList=%p count=%d"
- // " member section list: %p\n",
- // memberList->first() ? memberList->first()->getSectionList() : 0,
- // memberList->count(),
- // md->getSectionList());
- MemberDef *firstMd = memberList->first();
- if (inSameSection && memberList->count()>0 &&
- firstMd->getSectionList(m_parent)!=md->getSectionList(m_parent))
- {
- inSameSection=FALSE;
- }
- else if (inDeclSection==0)
- {
- inDeclSection = md->getSectionList(m_parent);
- }
- memberList->append(md);
-
- // copy the group of the first member in the memberGroup
- GroupDef *gd;
- if (firstMd && (gd=firstMd->getGroupDef()))
- {
- md->setGroupDef(gd, firstMd->getGroupPri(),
- firstMd->getGroupFileName(), firstMd->getGroupStartLine(),
- firstMd->getGroupHasDocs());
- gd->insertMember(md);
- }
-}
-
-
-void MemberGroup::setAnchors(ClassDef *context)
-{
- ::setAnchors(context,'z',memberList,grpId);
-}
-
-void MemberGroup::writeDeclarations(OutputList &ol,
- ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd)
-{
- //printf("MemberGroup::writeDeclarations() memberList->count()=%d\n",memberList->count());
- memberList->writeDeclarations(ol,cd,nd,fd,gd,grpHeader,doc/*,TRUE,TRUE*/);
-}
-
-void MemberGroup::writePlainDeclarations(OutputList &ol,
- ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd
- )
-{
- //printf("MemberGroup::writePlainDeclarations() memberList->count()=%d\n",memberList->count());
- memberList->writePlainDeclarations(ol,cd,nd,fd,gd);
-}
-
-void MemberGroup::writeDocumentation(OutputList &ol,const char *scopeName,
- Definition *container)
-{
- memberList->writeDocumentation(ol,scopeName,container,0);
-}
-
-void MemberGroup::writeDocumentationPage(OutputList &ol,const char *scopeName,
- Definition *container)
-{
- memberList->writeDocumentationPage(ol,scopeName,container);
-}
-
-/*! Add this group as a subsection of the declaration section, instead
- * of rendering it in its own section
- */
-void MemberGroup::addToDeclarationSection()
-{
- if (inDeclSection)
- {
- inDeclSection->addMemberGroup(this);
- }
-}
-
-int MemberGroup::countDecMembers(/*bool sectionPerType*/)
-{
- if (m_numDecMembers==-1) /* number of member not cached */
- {
- memberList->countDecMembers(/*TRUE,TRUE,sectionPerType*/);
- m_numDecMembers = memberList->numDecMembers();
- }
- return m_numDecMembers;
-}
-
-void MemberGroup::distributeMemberGroupDocumentation()
-{
- //printf("MemberGroup::distributeMemberGroupDocumentation() %s\n",grpHeader.data());
- MemberDef *md=memberList->first();
- if (md && !(md->documentation().isEmpty() &&
- md->briefDescription().isEmpty() &&
- md->inbodyDocumentation().isEmpty()
- )
- )
- {
- //printf("First member %s has documentation!\n",md->name().data());
- MemberDef *omd=memberList->next();
- while (omd)
- {
- if (omd->documentation().isEmpty() && omd->briefDescription().isEmpty() && omd->inbodyDocumentation().isEmpty())
- {
- //printf("Copying documentation to member %s\n",omd->name().data());
- omd->setBriefDescription(md->briefDescription(),md->briefFile(),md->briefLine());
- omd->setDocumentation(md->documentation(),md->docFile(),md->docLine());
- omd->setInbodyDocumentation(md->inbodyDocumentation(),md->inbodyFile(),md->inbodyLine());
- }
- omd=memberList->next();
- }
- }
-}
-
-int MemberGroup::varCount() const
-{
- return memberList->varCount();
-}
-
-int MemberGroup::funcCount() const
-{
- return memberList->funcCount();
-}
-
-int MemberGroup::enumCount() const
-{
- return memberList->enumCount();
-}
-
-int MemberGroup::enumValueCount() const
-{
- return memberList->enumValueCount();
-}
-
-int MemberGroup::typedefCount() const
-{
- return memberList->typedefCount();
-}
-
-int MemberGroup::protoCount() const
-{
- return memberList->protoCount();
-}
-
-int MemberGroup::defineCount() const
-{
- return memberList->defineCount();
-}
-
-int MemberGroup::friendCount() const
-{
- return memberList->friendCount();
-}
-
-int MemberGroup::numDecMembers() const
-{
- return memberList->numDecMembers();
-}
-
-int MemberGroup::numDocMembers() const
-{
- return memberList->numDocMembers();
-}
-
-void MemberGroup::setInGroup(bool b)
-{
- memberList->setInGroup(b);
-}
-
-void MemberGroup::addListReferences(Definition *def)
-{
- memberList->addListReferences(def);
-}
-
-void MemberGroup::findSectionsInDocumentation()
-{
- docFindSections(doc,0,this,m_docFile);
- memberList->findSectionsInDocumentation();
-}
-
diff --git a/src/membergroup.h b/src/membergroup.h
deleted file mode 100644
index 7552e38..0000000
--- a/src/membergroup.h
+++ /dev/null
@@ -1,130 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 MEMBERGROUP_H
-#define MEMBERGROUP_H
-
-#include "qtbc.h"
-#include <qlist.h>
-#include "sortdict.h"
-
-#define DOX_NOGROUP -1
-
-class MemberDef;
-class ClassDef;
-class NamespaceDef;
-class FileDef;
-class MemberList;
-class GroupDef;
-class OutputList;
-class Definition;
-
-class MemberGroup
-{
- public:
- MemberGroup(Definition *parent,int id,const char *header,
- const char *docs,const char *docFile);
- ~MemberGroup();
- QCString header() const { return grpHeader; }
- int groupId() const { return grpId; }
- void insertMember(MemberDef *md);
- void setAnchors(ClassDef *);
- void writePlainDeclarations(OutputList &ol,
- ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd);
- void writeDeclarations(OutputList &ol,
- ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd);
-
- void writeDocumentation(OutputList &ol,const char *scopeName,
- Definition *container);
- void writeDocumentationPage(OutputList &ol,const char *scopeName,
- Definition *container);
- QCString documentation() { return doc; }
- bool allMembersInSameSection() { return inSameSection; }
- void addToDeclarationSection();
- int countDecMembers(/*bool sectionPerType*/);
- void distributeMemberGroupDocumentation();
- void findSectionsInDocumentation();
- int varCount() const;
- int funcCount() const;
- int enumCount() const;
- int enumValueCount() const;
- int typedefCount() const;
- int protoCount() const;
- int defineCount() const;
- int friendCount() const;
- int numDecMembers() const;
- int numDocMembers() const;
- void setInGroup(bool b);
- void addListReferences(Definition *d);
- MemberList *members() const { return memberList; }
- Definition *parent() const { return m_parent; }
-
- private:
- MemberList *memberList; // list of all members in the group
- int grpId;
- QCString grpHeader;
- QCString fileName; // base name of the generated file
- Definition *scope;
- QCString doc;
- MemberList *inDeclSection;
- bool inSameSection;
- int m_numDecMembers;
- Definition *m_parent;
- QCString m_docFile;
-};
-
-class MemberGroupList : public QList<MemberGroup>
-{
-};
-
-class MemberGroupListIterator : public QListIterator<MemberGroup>
-{
- public:
- MemberGroupListIterator(const MemberGroupList &l) :
- QListIterator<MemberGroup>(l) {}
-};
-
-class MemberGroupSDict : public SIntDict<MemberGroup>
-{
- public:
- MemberGroupSDict(int size=17) : SIntDict<MemberGroup>(size) {}
- ~MemberGroupSDict() {}
-};
-
-struct MemberGroupInfo
-{
- QCString header;
- QCString doc;
- QCString docFile;
-};
-
-//class MemberGroupDict : public QIntDict<MemberGroup>
-//{
-// public:
-// MemberGroupDict(int size) : QIntDict<MemberGroup>(size) {}
-// ~MemberGroupDict() {}
-//};
-
-//class MemberGroupDictIterator : public QIntDictIterator<MemberGroup>
-//{
-// public:
-// MemberGroupDictIterator(const MemberGroupDict &d) :
-// QIntDictIterator<MemberGroup>(d) {}
-// ~MemberGroupDictIterator() {}
-//};
-
-#endif
diff --git a/src/memberlist.cpp b/src/memberlist.cpp
deleted file mode 100644
index 3c27bb3..0000000
--- a/src/memberlist.cpp
+++ /dev/null
@@ -1,499 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 <qregexp.h>
-
-#include "memberlist.h"
-#include "classdef.h"
-#include "message.h"
-#include "util.h"
-#include "language.h"
-#include "doxygen.h"
-#include "outputlist.h"
-#include "groupdef.h"
-
-MemberList::MemberList() : QList<MemberDef>()
-{
- memberGroupList=0;
- m_numDecMembers=-1; // special value indicating that computation is needed
- m_numDocMembers=-1; // special value indicating that computation is needed
- m_inGroup=FALSE;
- m_inFile=FALSE;
-}
-
-MemberList::~MemberList()
-{
- delete memberGroupList;
-}
-
-int MemberList::compareItems(GCI item1, GCI item2)
-{
- MemberDef *c1=(MemberDef *)item1;
- MemberDef *c2=(MemberDef *)item2;
- return stricmp(c1->name(),c2->name());
-}
-
-/*! Count the number of members in this list that are visible in
- * the declaration part of a compound's documentation page.
- */
-void MemberList::countDecMembers()
-{
- if (m_numDecMembers!=-1) return;
-
- //printf("----- countDecMembers count=%d ----\n",count());
- m_varCnt=m_funcCnt=m_enumCnt=m_enumValCnt=0;
- m_typeCnt=m_protoCnt=m_defCnt=m_friendCnt=0;
- m_numDecMembers=0;
- QListIterator<MemberDef> mli(*this);
- MemberDef *md;
- for (mli.toFirst();(md=mli.current());++mli)
- {
- if (md->isBriefSectionVisible())
- {
- switch(md->memberType())
- {
- case MemberDef::Variable: // fall through
- case MemberDef::Event: // fall through
- case MemberDef::Property: m_varCnt++,m_numDecMembers++;
- break;
- case MemberDef::Function: // fall through
- case MemberDef::Signal: // fall through
- case MemberDef::DCOP: // fall through
- case MemberDef::Slot: if (!md->isRelated() || md->getClassDef())
- m_funcCnt++,m_numDecMembers++;
- break;
- case MemberDef::Enumeration: m_enumCnt++,m_numDecMembers++; break;
- case MemberDef::EnumValue: //m_enumValCnt++,m_numDecMembers++;
- break;
- case MemberDef::Typedef: m_typeCnt++,m_numDecMembers++; break;
- case MemberDef::Prototype: m_protoCnt++,m_numDecMembers++; break;
- case MemberDef::Define: if (Config_getBool("EXTRACT_ALL") ||
- md->argsString() ||
- !md->initializer().isEmpty() ||
- md->hasDocumentation()
- ) m_defCnt++,m_numDecMembers++;
- break;
- case MemberDef::Friend: m_friendCnt++,m_numDecMembers++;
- break;
- default:
- err("Error: Unknown member type found for member `%s'\n!",md->name().data());
- }
- }
- }
- if (memberGroupList)
- {
- 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_protoCnt+=mg->protoCount();
- m_defCnt+=mg->defineCount();
- m_friendCnt+=mg->friendCount();
- m_numDecMembers+=mg->numDecMembers();
- }
- }
- //printf("----- end countDecMembers ----\n");
-
- //printf("MemberList::countDecMembers()=%d\n",m_numDecMembers);
-}
-
-void MemberList::countDocMembers()
-{
- if (m_numDocMembers!=-1) return; // used cached value
- m_numDocMembers=0;
- QListIterator<MemberDef> mli(*this);
- MemberDef *md;
- for (mli.toFirst();(md=mli.current());++mli)
- {
- if (md->isDetailedSectionVisible(m_inGroup,m_inFile))
- {
- // do not count enum values, since they do not produce entries of their own
- if (md->memberType()!=MemberDef::EnumValue) m_numDocMembers++;
- }
- }
- if (memberGroupList)
- {
- MemberGroupListIterator mgli(*memberGroupList);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->countDecMembers();
- m_numDocMembers+=mg->numDocMembers();
- }
- }
- //printf("MemberList::countDocMembers()=%d memberGroupList=%p\n",m_numDocMembers,memberGroupList);
-}
-
-bool MemberList::insert(uint index,const MemberDef *md)
-{
- return QList<MemberDef>::insert(index,md);
-}
-
-void MemberList::inSort(const MemberDef *md)
-{
- QList<MemberDef>::inSort(md);
-}
-
-void MemberList::append(const MemberDef *md)
-{
- QList<MemberDef>::append(md);
-}
-
-MemberListIterator::MemberListIterator(const QList<MemberDef> &l) :
- QListIterator<MemberDef>(l)
-{
-}
-
-void MemberList::writePlainDeclarations(OutputList &ol,
- ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd
- )
-{
- //printf("----- writePlainDeclaration() ----\n");
- countDecMembers();
- if (numDecMembers()==0) return; // no members in this list
- //printf("----> writePlainDeclaration() numDecMembers()=%d\n",
- // numDecMembers());
-
- ol.pushGeneratorState();
-
- bool first=TRUE;
- MemberDef *md;
- MemberListIterator mli(*this);
- for ( ; (md=mli.current()); ++mli )
- {
- if (md->isBriefSectionVisible())
- {
- //printf(">>> Member `%s' type=%d\n",md->name().data(),md->memberType());
- switch(md->memberType())
- {
- case MemberDef::Define: // fall through
- case MemberDef::Prototype: // fall through
- case MemberDef::Typedef: // fall through
- case MemberDef::Variable: // fall through
- case MemberDef::Function: // fall through
- case MemberDef::Signal: // fall through
- case MemberDef::Slot: // fall through
- case MemberDef::DCOP: // fall through
- case MemberDef::Property: // fall through
- case MemberDef::Event:
- {
- if (first) ol.startMemberList(),first=FALSE;
- md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup);
- break;
- }
- case MemberDef::Enumeration:
- {
- if (first) ol.startMemberList(),first=FALSE;
- int enumVars=0;
- MemberListIterator vmli(*this);
- MemberDef *vmd;
- QCString name(md->name());
- int i=name.findRev("::");
- if (i!=-1) name=name.right(name.length()-i-2); // strip scope (TODO: is this needed?)
- if (name[0]=='@') // anonymous enum => append variables
- {
- for ( ; (vmd=vmli.current()) ; ++vmli)
- {
- QCString vtype=vmd->typeString();
- if ((vtype.find(name))!=-1)
- {
- enumVars++;
- vmd->setAnonymousEnumType(md);
- }
- }
- }
- // if this is an anoymous enum and there are variables of this
- // enum type (i.e. enumVars>0), then we do not show the enum here.
- if (enumVars==0) // show enum here
- {
- ol.startMemberItem(0);
- ol.writeString("enum ");
- ol.insertMemberAlign();
- md->writeEnumDeclaration(ol,cd,nd,fd,gd);
- ol.endMemberItem();
- if (!md->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
- {
- ol.startMemberDescription();
- ol.parseDoc(
- md->briefFile(),md->briefLine(),
- cd,md,
- md->briefDescription(),
- TRUE,
- FALSE
- );
- if (md->isDetailedSectionLinkable())
- {
- ol.disableAllBut(OutputGenerator::Html);
- ol.docify(" ");
- ol.startTextLink(md->getOutputFileBase(),
- md->anchor());
- ol.parseText(theTranslator->trMore());
- ol.endTextLink();
- ol.enableAll();
- }
- ol.endMemberDescription();
- }
- }
- md->warnIfUndocumented();
- break;
- }
- case MemberDef::Friend:
- {
- if (first) ol.startMemberList(),first=FALSE;
- md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup);
- break;
- }
- case MemberDef::EnumValue:
- break;
- }
- }
- }
-
- // handle members that are inside anonymous compounds and for which
- // no variables of the anonymous compound type exist.
- if (cd)
- {
- MemberListIterator mli(*this);
- for ( ; (md=mli.current()) ; ++mli )
- {
- if (md->fromAnonymousScope() && !md->anonymousDeclShown())
- {
- md->setFromAnonymousScope(FALSE);
- //printf("anonymous compound members\n");
- if (md->isBriefSectionVisible())
- {
- if (first) ol.startMemberList(),first=FALSE;
- md->writeDeclaration(ol,cd,nd,fd,gd,m_inGroup);
- }
- md->setFromAnonymousScope(TRUE);
- }
- }
- }
-
- if (!first) ol.endMemberList();
-
- ol.popGeneratorState();
- //printf("----- end writePlainDeclaration() ----\n");
-}
-
-void MemberList::writeDeclarations(OutputList &ol,
- ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
- const char *title,const char *subtitle
- /*, bool inGroup,bool countSubGroups*/)
-{
- //printf("----- writeDeclaration() ----\n");
- countDecMembers(); // count member not in group
- if (numDecMembers()==0) return;
- //printf("MemberList::writeDeclaration(title=`%s',subtitle=`%s')=%d\n",title,subtitle,numDecMembers());
- if (title)
- {
- ol.startMemberHeader();
- ol.parseText(title);
- ol.endMemberHeader();
- }
- if (subtitle && subtitle[0]!=0)
- {
- //printf("subtitle=`%s'\n",subtitle);
- ol.startMemberSubtitle();
- ol.parseDoc("[generated]",-1,0,0,subtitle,FALSE,FALSE);
- ol.endMemberSubtitle();
- }
-
- writePlainDeclarations(ol,cd,nd,fd,gd);
-
- //printf("memberGroupList=%p\n",memberGroupList);
- if (memberGroupList)
- {
- MemberGroupListIterator mgli(*memberGroupList);
- MemberGroup *mg;
- while ((mg=mgli.current()))
- {
- 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.parseDoc("[generated]",-1,0,0,mg->documentation()+"\n",FALSE,FALSE);
- ol.endMemberGroupDocs();
- }
- ol.startMemberGroup();
- //printf("--- mg->writePlainDeclarations ---\n");
- mg->writePlainDeclarations(ol,cd,nd,fd,gd);
- ol.endMemberGroup(hasHeader);
- ++mgli;
- }
- }
- //printf("----- end writeDeclaration() ----\n");
-
-}
-
-void MemberList::writeDocumentation(OutputList &ol,
- const char *scopeName, Definition *container,
- const char *title)
-{
- //printf("MemberList::writeDocumentation()\n");
-
- countDocMembers();
- if (numDocMembers()==0) return;
-
- if (title)
- {
- ol.writeRuler();
- ol.startGroupHeader();
- ol.parseText(title);
- ol.endGroupHeader();
- }
-
- MemberListIterator mli(*this);
- MemberDef *md;
- for ( ; (md=mli.current()) ; ++mli)
- {
- md->writeDocumentation(this,ol,scopeName,container,m_inGroup);
- }
- if (memberGroupList)
- {
- //printf("MemberList::writeDocumentation() -- member groups\n");
- MemberGroupListIterator mgli(*memberGroupList);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->writeDocumentation(ol,scopeName,container);
- }
- }
-}
-
-void MemberList::writeDocumentationPage(OutputList &ol,
- const char *scopeName, Definition *container)
-{
- MemberListIterator mli(*this);
- MemberDef *md;
- for ( ; (md=mli.current()) ; ++mli)
- {
- QCString diskName=md->getOutputFileBase();
- QCString title=md->qualifiedName();
- startFile(ol,diskName,md->name(),title);
- container->writeNavigationPath(ol);
-
- ol.writeString("<table cellspacing=\"0\" cellpadding=\"0\" border=\"0\">\n"
- " <tr>\n"
- " <td valign=\"top\">\n");
-
- container->writeQuickMemberLinks(ol,md);
-
- ol.writeString(" </td>\n");
- ol.writeString(" <td valign=\"top\">\n");
-
- md->writeDocumentation(this,ol,scopeName,container,m_inGroup);
-
- ol.writeString(" </td>\n");
- ol.writeString(" </tr>\n");
- ol.writeString("</table>\n");
-
- endFile(ol);
- }
- if (memberGroupList)
- {
- //printf("MemberList::writeDocumentation() -- member groups\n");
- MemberGroupListIterator mgli(*memberGroupList);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->writeDocumentationPage(ol,scopeName,container);
- }
- }
-}
-
-void MemberList::addMemberGroup(MemberGroup *mg)
-{
- if (memberGroupList==0)
- {
- memberGroupList=new MemberGroupList;
- }
- memberGroupList->append(mg);
-}
-
-void MemberList::addListReferences(Definition *def)
-{
- MemberListIterator mli(*this);
- MemberDef *md;
- for ( ; (md=mli.current()) ; ++mli)
- {
- if (md->getGroupDef()==0 || def->definitionType()==Definition::TypeGroup)
- {
- md->addListReference(def);
- if (md->memberType()==MemberDef::Enumeration && md->enumFieldList())
- {
- MemberListIterator vmli(*md->enumFieldList());
- MemberDef *vmd;
- for ( ; (vmd=vmli.current()) ; ++vmli)
- {
- vmd->addListReference(def);
- }
- }
- }
- }
- if (memberGroupList)
- {
- MemberGroupListIterator mgli(*memberGroupList);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->addListReferences(def);
- }
- }
-}
-
-void MemberList::findSectionsInDocumentation()
-{
- MemberListIterator mli(*this);
- MemberDef *md;
- for ( ; (md=mli.current()) ; ++mli)
- {
- md->findSectionsInDocumentation();
- }
- if (memberGroupList)
- {
- MemberGroupListIterator mgli(*memberGroupList);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->findSectionsInDocumentation();
- }
- }
-}
-
-//--------------------------------------------------------------------------
-
-int MemberSDict::compareItems(GCI item1, GCI item2)
-{
- MemberDef *c1=(MemberDef *)item1;
- MemberDef *c2=(MemberDef *)item2;
- return stricmp(c1->name(),c2->name());
-}
-
diff --git a/src/memberlist.h b/src/memberlist.h
deleted file mode 100644
index 1089224..0000000
--- a/src/memberlist.h
+++ /dev/null
@@ -1,99 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 MEMBERLIST_H
-#define MEMBERLIST_H
-
-#include <qlist.h>
-#include "memberdef.h"
-#include "sortdict.h"
-
-class GroupDef;
-class MemberGroup;
-class MemberGroupList;
-
-class MemberList : public QList<MemberDef>
-{
- public:
- MemberList();
- ~MemberList();
- bool insert(uint index,const MemberDef *md);
- void inSort(const MemberDef *md);
- void append(const MemberDef *md);
- int compareItems(GCI item1,GCI item2);
- int varCount() const { ASSERT(m_numDecMembers!=-1); return m_varCnt; }
- int funcCount() const { ASSERT(m_numDecMembers!=-1); return m_funcCnt; }
- int enumCount() const { ASSERT(m_numDecMembers!=-1); return m_enumCnt; }
- int enumValueCount() const { ASSERT(m_numDecMembers!=-1); return m_enumValCnt; }
- int typedefCount() const { ASSERT(m_numDecMembers!=-1); return m_typeCnt; }
- int protoCount() const { ASSERT(m_numDecMembers!=-1); return m_protoCnt; }
- int defineCount() const { ASSERT(m_numDecMembers!=-1); return m_defCnt; }
- int friendCount() const { ASSERT(m_numDecMembers!=-1); return m_friendCnt; }
- int numDecMembers() const { ASSERT(m_numDecMembers!=-1); return m_numDecMembers; }
- int numDocMembers() const { ASSERT(m_numDocMembers!=-1); return m_numDocMembers; }
- void countDecMembers(/*bool inGroup,bool countSubGroups,bool sectionPerType*/);
- void countDocMembers();
- void writePlainDeclarations(OutputList &ol,
- ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd);
- void writeDeclarations(OutputList &ol,
- ClassDef *cd,NamespaceDef *nd,FileDef *fd,GroupDef *gd,
- const char *title,const char *subtitle);
- void writeDocumentation(OutputList &ol,const char *scopeName,
- Definition *container,const char *title);
- void writeDocumentationPage(OutputList &ol,
- const char *scopeName, Definition *container);
- void addMemberGroup(MemberGroup *mg);
- void setInGroup(bool inGroup) { m_inGroup=inGroup; }
- void setInFile(bool inFile) { m_inFile=inFile; }
- void addListReferences(Definition *def);
- void findSectionsInDocumentation();
- MemberGroupList *getMemberGroupList() const { return memberGroupList; }
-
- private:
- int m_varCnt,m_funcCnt,m_enumCnt,m_enumValCnt,m_typeCnt;
- int m_protoCnt,m_defCnt,m_friendCnt;
- int m_numDecMembers; // number of members in the brief part of the memberlist
- int m_numDocMembers; // number of members in the detailed part of the memberlist
- MemberGroupList *memberGroupList;
- bool m_inGroup; // is this list part of a group definition
- bool m_inFile; // is this list part of a file definition
-};
-
-class MemberListIterator : public QListIterator<MemberDef>
-{
- public:
- MemberListIterator(const QList<MemberDef> &list);
- virtual ~MemberListIterator() {}
-};
-
-class MemberDict : public QDict<MemberDef>
-{
- public:
- MemberDict(int size) : QDict<MemberDef>(size) {}
- virtual ~MemberDict() {}
-};
-
-class MemberSDict : public SDict<MemberDef>
-{
- public:
- MemberSDict(int size=17) : SDict<MemberDef>(size) {}
- virtual ~MemberSDict() {}
- int compareItems(GCI item1,GCI item2);
-};
-
-
-#endif
diff --git a/src/membername.cpp b/src/membername.cpp
deleted file mode 100644
index f7b4790..0000000
--- a/src/membername.cpp
+++ /dev/null
@@ -1,105 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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::compareItems(GCI item1, GCI item2)
-{
- MemberDef *m1=(MemberDef *)item1;
- MemberDef *m2=(MemberDef *)item2;
- ClassDef *c1=m1->getClassDef();
- ClassDef *c2=m2->getClassDef();
- FileDef *f1=m1->getFileDef();
- FileDef *f2=m2->getFileDef();
- if (c1 && c2)
- return strcmp(c1->name(),c2->name());
- else if (f1 && f2)
- return strcmp(f1->name(),f2->name());
- else
- return 0;
-}
-
-MemberNameInfo::MemberNameInfo(const char *n) : QList<MemberInfo>()
-{
- name=n;
- setAutoDelete(TRUE);
-}
-
-int MemberNameInfo::compareItems(GCI item1, GCI item2)
-{
- MemberInfo *m1=(MemberInfo *)item1;
- MemberInfo *m2=(MemberInfo *)item2;
- ClassDef *c1=m1->memberDef->getClassDef();
- ClassDef *c2=m2->memberDef->getClassDef();
- FileDef *f1=m1->memberDef->getFileDef();
- FileDef *f2=m2->memberDef->getFileDef();
- if (c1 && c2)
- return strcmp(c1->name(),c2->name());
- else if (f1 && f2)
- return strcmp(f1->name(),f2->name());
- else
- return 0;
-}
-MemberNameIterator::MemberNameIterator(const MemberName &mnlist) :
- QListIterator<MemberDef>(mnlist)
-{
-}
-
-#if 0
-
-MemberNameList::MemberNameList() : QList<MemberName>()
-{
-}
-
-MemberNameList::~MemberNameList()
-{
-}
-
-int MemberNameList::compareItems(GCI item1, GCI item2)
-{
- MemberName *n1=(MemberName *)item1;
- MemberName *n2=(MemberName *)item2;
- return stricmp(n1->memberName(),n2->memberName());
-}
-
-MemberNameListIterator::MemberNameListIterator(const MemberNameList &mnlist) :
- QListIterator<MemberName>(mnlist)
-{
-}
-
-#endif
-
-int MemberNameSDict::compareItems(GCI item1, GCI item2)
-{
- MemberName *n1=(MemberName *)item1;
- MemberName *n2=(MemberName *)item2;
- return stricmp(n1->memberName(),n2->memberName());
-}
-
diff --git a/src/membername.h b/src/membername.h
deleted file mode 100644
index 0b96d80..0000000
--- a/src/membername.h
+++ /dev/null
@@ -1,98 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 MEMBERNAME_H
-#define MEMBERNAME_H
-
-#include <qlist.h>
-#include "memberdef.h"
-#include "sortdict.h"
-
-class MemberName : public QList<MemberDef>
-{
- public:
- MemberName(const char *name);
- ~MemberName();
- const char *memberName() const { return name; }
-
- int compareItems(GCI item1,GCI item2);
- private:
- QCString name;
-};
-
-class MemberNameIterator : public QListIterator<MemberDef>
-{
- public:
- MemberNameIterator( const MemberName &list);
-};
-
-class MemberNameSDict : public SDict<MemberName>
-{
- public:
- MemberNameSDict(int size) : SDict<MemberName>(size) {}
- ~MemberNameSDict() {}
-
- int compareItems(GCI item1,GCI item2);
-};
-
-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;
-};
-
-class MemberNameInfo : public QList<MemberInfo>
-{
- public:
- MemberNameInfo(const char *name);
- ~MemberNameInfo() {}
- const char *memberName() const { return name; }
- int compareItems(GCI item1,GCI item2);
- private:
- QCString name;
-};
-
-class MemberNameInfoIterator : public QListIterator<MemberInfo>
-{
- public:
- MemberNameInfoIterator(const MemberNameInfo &mnii)
- : QListIterator<MemberInfo>(mnii) {}
-};
-
-
-class MemberNameInfoSDict : public SDict<MemberNameInfo>
-{
- public:
- MemberNameInfoSDict(int size) : SDict<MemberNameInfo>(size) {}
- ~MemberNameInfoSDict() {}
- int compareItems(GCI item1,GCI item2)
- { return stricmp(
- ((MemberNameInfo *)item1)->memberName(),
- ((MemberNameInfo *)item2)->memberName()
- );
- }
-};
-
-#endif
diff --git a/src/message.cpp b/src/message.cpp
deleted file mode 100644
index a946877..0000000
--- a/src/message.cpp
+++ /dev/null
@@ -1,204 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 <stdarg.h>
-#include <stdio.h>
-#include <qdatetime.h>
-#include "config.h"
-#include "util.h"
-#include "debug.h"
-#include "doxygen.h"
-
-static QCString outputFormat;
-//static int warnFormatOrder; // 1 = $file,$line,$text
-// // 2 = $text,$line,$file
-// // 3 = $line,$text,$file
-// // 4 = $file,$text,$line
-// // 5 = $text,$file,$line
-// // 6 = $line,$file,$text
-
-static FILE *warnFile = stderr;
-
-void initWarningFormat()
-{
-// int filePos = Config_getString("WARN_FORMAT").find("$file");
-// int linePos = Config_getString("WARN_FORMAT").find("$line");
-// int textPos = Config_getString("WARN_FORMAT").find("$text");
-//
-// // sort items on position (there are 6 cases)
-// warnFormatOrder = 1;
-// if (filePos>linePos && filePos>textPos)
-// {
-// if (linePos>textPos) // $text,$line,$file
-// {
-// warnFormatOrder = 2;
-// }
-// else // $line,$text,$file
-// {
-// warnFormatOrder = 3;
-// }
-// }
-// else if (filePos<linePos && filePos<textPos)
-// {
-// if (linePos>textPos) // $file,$text,$line
-// {
-// warnFormatOrder = 4;
-// }
-// }
-// else if (filePos<linePos && filePos>textPos) // $text,$file,$line
-// {
-// warnFormatOrder = 5;
-// }
-// else // $line,$file,$text
-// {
-// warnFormatOrder = 6;
-// }
-// outputFormat =
-// substitute(
-// substitute(
-// substitute(
-// Config_getString("WARN_FORMAT"),
-// "$file","%s"
-// ),
-// "$text","%s"
-// ),
-// "$line","%d"
-// )+'\n';
-
- // replace(QRegExp("\\$file"),"%s").
- // replace(QRegExp("\\$text"),"%s").
- // replace(QRegExp("\\$line"),"%d")+
- // '\n';
-
- outputFormat = Config_getString("WARN_FORMAT");
-
- if (!Config_getString("WARN_LOGFILE").isEmpty())
- {
- warnFile = fopen(Config_getString("WARN_LOGFILE"),"w");
- }
- if (!warnFile) // point it to something valid, because warn() relies on it
- {
- warnFile = stderr;
- }
-}
-
-
-void msg(const char *fmt, ...)
-{
- if (!Config_getBool("QUIET"))
- {
- if (Debug::isFlagSet(Debug::Time))
- {
- printf("%.3f sec: ",((double)Doxygen::runningTime.elapsed())/1000.0);
- }
- va_list args;
- va_start(args, fmt);
- vfprintf(stdout, fmt, args);
- va_end(args);
- }
-}
-
-static void do_warn(const char *tag, const char *file, int line, const char *fmt, va_list args)
-{
- if (!Config_getBool(tag)) return; // warning type disabled
- char text[40960];
- vsprintf(text, fmt, args);
- QCString fileSubst = file==0 ? "<unknown>" : file;
- 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
- QCString msgText =
- substitute(
- substitute(
- substitute(
- substitute(
- outputFormat,
- "$file",fileSubst
- ),
- "$text",textSubst
- ),
- "$line",lineSubst
- ),
- "$version",versionSubst
- )+'\n';
-
- // print resulting message
- fprintf(warnFile,msgText);
-// switch(warnFormatOrder)
-// {
-// case 1: fprintf(warnFile,outputFormat,file,line,text); break;
-// case 2: fprintf(warnFile,outputFormat,text,line,file); break;
-// case 3: fprintf(warnFile,outputFormat,line,text,file); break;
-// case 4: fprintf(warnFile,outputFormat,file,text,line); break;
-// case 5: fprintf(warnFile,outputFormat,text,file,line); break;
-// case 6: fprintf(warnFile,outputFormat,line,file,text); break;
-// default:
-// printf("Error: warning format has not been initialized!\n");
-// }
-}
-
-void warn(const char *file,int line,const char *fmt, ...)
-{
- va_list args;
- va_start(args, fmt);
- do_warn("WARNINGS", file, line, fmt, args);
- va_end(args);
-}
-
-void warn_cont(const char *fmt, ...)
-{
- if (!Config_getBool("WARNINGS"))
- return;
- va_list args;
- va_start(args, fmt);
- vfprintf(warnFile, fmt, args);
- va_end(args);
-}
-
-void warn_undoc(const char *file,int line,const char *fmt, ...)
-{
- va_list args;
- va_start(args, fmt);
- do_warn("WARN_IF_UNDOCUMENTED", file, line, fmt, args);
- va_end(args);
-}
-
-void warn_doc_error(const char *file,int line,const char *fmt, ...)
-{
- va_list args;
- va_start(args, fmt);
- do_warn("WARN_IF_DOC_ERROR", file, line, fmt, args);
- va_end(args);
-}
-
-void err(const char *fmt, ...)
-{
- va_list args;
- va_start(args, fmt);
- vfprintf(warnFile, fmt, args);
- va_end(args);
-}
diff --git a/src/message.h b/src/message.h
deleted file mode 100644
index 7dc1e6c..0000000
--- a/src/message.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 MESSAGE_H
-#define MESSAGE_H
-
-#include <stdio.h>
-
-extern void msg(const char *fmt, ...);
-extern void warn(const char *file,int line,const char *fmt, ...);
-extern void warn_cont(const char *fmt, ...);
-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 err(const char *fmt, ...);
-void initWarningFormat();
-
-#endif
diff --git a/src/namespacedef.cpp b/src/namespacedef.cpp
deleted file mode 100644
index 6735d4e..0000000
--- a/src/namespacedef.cpp
+++ /dev/null
@@ -1,658 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 "qtbc.h"
-#include "namespacedef.h"
-#include "outputlist.h"
-#include "util.h"
-#include "language.h"
-#include "classdef.h"
-#include "classlist.h"
-#include "memberlist.h"
-#include "doxygen.h"
-#include "message.h"
-#include "docparser.h"
-#include "searchindex.h"
-
-NamespaceDef::NamespaceDef(const char *df,int dl,
- const char *name,const char *lref,
- const char *fName) :
- Definition(df,dl,name)
-{
- if (fName)
- {
- fileName = stripExtension(fName);
- }
- else
- {
- fileName="namespace";
- fileName+=name;
- }
- classSDict = new ClassSDict(17);
- namespaceSDict = new NamespaceSDict(17);
- m_innerCompounds = new SDict<Definition>(17);
- usingDirList = 0;
- usingDeclList = 0;
- setReference(lref);
- memberGroupSDict = new MemberGroupSDict;
- memberGroupSDict->setAutoDelete(TRUE);
- visited=FALSE;
-}
-
-NamespaceDef::~NamespaceDef()
-{
- delete classSDict;
- delete namespaceSDict;
- delete m_innerCompounds;
- delete usingDirList;
- delete usingDeclList;
- delete memberGroupSDict;
-}
-
-void NamespaceDef::distributeMemberGroupDocumentation()
-{
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->distributeMemberGroupDocumentation();
- }
-}
-
-void NamespaceDef::findSectionsInDocumentation()
-{
- docFindSections(documentation(),this,0,docFile());
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->findSectionsInDocumentation();
- }
- decDefineMembers.findSectionsInDocumentation();
- decProtoMembers.findSectionsInDocumentation();
- decTypedefMembers.findSectionsInDocumentation();
- decEnumMembers.findSectionsInDocumentation();
- decFuncMembers.findSectionsInDocumentation();
- decVarMembers.findSectionsInDocumentation();
-}
-
-void NamespaceDef::insertUsedFile(const char *f)
-{
- if (files.find(f)==-1)
- {
- if (Config_getBool("SORT_MEMBER_DOCS"))
- files.inSort(f);
- else
- files.append(f);
- }
-}
-
-void NamespaceDef::addInnerCompound(Definition *d)
-{
- m_innerCompounds->append(d->localName(),d);
- if (d->definitionType()==Definition::TypeNamespace)
- {
- insertNamespace((NamespaceDef *)d);
- }
- else if (d->definitionType()==Definition::TypeClass)
- {
- insertClass((ClassDef *)d);
- }
-}
-
-void NamespaceDef::insertClass(ClassDef *cd)
-{
- if (classSDict->find(cd->name())==0)
- {
- if (Config_getBool("SORT_BRIEF_DOCS"))
- classSDict->inSort(cd->name(),cd);
- else
- classSDict->append(cd->name(),cd);
- }
-}
-
-void NamespaceDef::insertNamespace(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);
- }
-}
-
-
-void NamespaceDef::addMembersToMemberGroup()
-{
- ::addMembersToMemberGroup(&decDefineMembers,memberGroupSDict,this);
- ::addMembersToMemberGroup(&decProtoMembers,memberGroupSDict,this);
- ::addMembersToMemberGroup(&decTypedefMembers,memberGroupSDict,this);
- ::addMembersToMemberGroup(&decEnumMembers,memberGroupSDict,this);
- ::addMembersToMemberGroup(&decFuncMembers,memberGroupSDict,this);
- ::addMembersToMemberGroup(&decVarMembers,memberGroupSDict,this);
-}
-
-void NamespaceDef::insertMember(MemberDef *md)
-{
- //memList->append(md);
- allMemberList.append(md);
- switch(md->memberType())
- {
- case MemberDef::Variable:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- decVarMembers.inSort(md);
- else
- decVarMembers.append(md);
- if (Config_getBool("SORT_MEMBER_DOCS"))
- docVarMembers.inSort(md);
- else
- docVarMembers.append(md);
- break;
- case MemberDef::Function:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- decFuncMembers.inSort(md);
- else
- decFuncMembers.append(md);
- if (Config_getBool("SORT_MEMBER_DOCS"))
- docFuncMembers.inSort(md);
- else
- docFuncMembers.append(md);
- break;
- case MemberDef::Typedef:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- decTypedefMembers.inSort(md);
- else
- decTypedefMembers.append(md);
- if (Config_getBool("SORT_MEMBER_DOCS"))
- docTypedefMembers.inSort(md);
- else
- docTypedefMembers.append(md);
- break;
- case MemberDef::Enumeration:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- decEnumMembers.inSort(md);
- else
- decEnumMembers.append(md);
- if (Config_getBool("SORT_MEMBER_DOCS"))
- docEnumMembers.inSort(md);
- else
- docEnumMembers.append(md);
- break;
- case MemberDef::EnumValue:
- break;
- case MemberDef::Prototype:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- decProtoMembers.inSort(md);
- else
- decProtoMembers.append(md);
- if (Config_getBool("SORT_MEMBER_DOCS"))
- docProtoMembers.inSort(md);
- else
- docProtoMembers.append(md);
- break;
- case MemberDef::Define:
- if (Config_getBool("SORT_BRIEF_DOCS"))
- decDefineMembers.inSort(md);
- else
- decDefineMembers.append(md);
- if (Config_getBool("SORT_MEMBER_DOCS"))
- docDefineMembers.inSort(md);
- else
- docDefineMembers.append(md);
- break;
- default:
- err("NamespaceDef::insertMembers(): "
- "member `%s' with class scope `%s' inserted in namespace scope `%s'!\n",
- md->name().data(),
- md->getClassDef() ? md->getClassDef()->name().data() : "",
- name().data());
- }
- //addMemberToGroup(md,groupId);
-}
-
-void NamespaceDef::computeAnchors()
-{
- setAnchors(0,'a',&allMemberList);
-}
-
-void NamespaceDef::writeDetailedDocumentation(OutputList &ol)
-{
- if ((!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF")) ||
- !documentation().isEmpty())
- {
- ol.writeRuler();
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
- //bool latexOn = ol.isEnabled(OutputGenerator::Latex);
- //if (latexOn) ol.disable(OutputGenerator::Latex);
- ol.writeAnchor(0,"_details");
- //if (latexOn) ol.enable(OutputGenerator::Latex);
- ol.popGeneratorState();
- ol.startGroupHeader();
- ol.parseText(theTranslator->trDetailedDescription());
- ol.endGroupHeader();
- ol.startTextBlock();
- if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF"))
- {
- ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),FALSE,FALSE);
- }
- if (!briefDescription().isEmpty() && Config_getBool("REPEAT_BRIEF") &&
- !documentation().isEmpty())
- {
- ol.pushGeneratorState();
- ol.disable(OutputGenerator::Man);
- ol.newParagraph();
- ol.enableAll();
- ol.disableAllBut(OutputGenerator::Man);
- ol.writeString("\n\n");
- ol.popGeneratorState();
- }
- if (!documentation().isEmpty())
- {
- ol.parseDoc(docFile(),docLine(),this,0,documentation()+"\n",TRUE,FALSE);
- ol.newParagraph();
- }
- ol.endTextBlock();
- }
-}
-
-void NamespaceDef::writeDocumentation(OutputList &ol)
-{
- QCString pageTitle;
- if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
- {
- pageTitle = theTranslator->trPackage(displayName());
- }
- else
- {
- pageTitle = theTranslator->trNamespaceReference(displayName());
- }
- startFile(ol,getOutputFileBase(),name(),pageTitle);
- if (getOuterScope()!=Doxygen::globalScope)
- {
- writeNavigationPath(ol);
- }
- startTitle(ol,getOutputFileBase());
- ol.parseText(pageTitle);
- addGroupListToTitle(ol,this);
- endTitle(ol,getOutputFileBase(),displayName());
-
- if (Config_getBool("SEARCHENGINE"))
- {
- Doxygen::searchIndex->setCurrentDoc(pageTitle,getOutputFileBase());
- Doxygen::searchIndex->addWord(localName(),TRUE);
- }
-
- if (!Config_getString("GENERATE_TAGFILE").isEmpty())
- {
- Doxygen::tagFile << " <compound kind=\"namespace\">" << endl;
- Doxygen::tagFile << " <name>" << convertToXML(name()) << "</name>" << endl;
- Doxygen::tagFile << " <filename>" << convertToXML(getOutputFileBase()) << Doxygen::htmlFileExtension << "</filename>" << endl;
- }
-
- ol.startTextBlock();
-
- if (Config_getBool("DETAILS_AT_TOP"))
- {
- writeDetailedDocumentation(ol);
- ol.newParagraph();
- }
- else if (!briefDescription().isEmpty())
- {
- ol.parseDoc(briefFile(),briefLine(),this,0,briefDescription(),TRUE,FALSE);
- ol.writeString(" \n");
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
- ol.startTextLink(0,"_details");
- ol.parseText(theTranslator->trMore());
- ol.endTextLink();
- ol.enableAll();
- ol.disableAllBut(OutputGenerator::Man);
- ol.newParagraph();
- ol.popGeneratorState();
- }
- ol.disable(OutputGenerator::Man);
- ol.newParagraph();
- ol.enable(OutputGenerator::Man);
- ol.writeSynopsis();
-
- ol.endTextBlock();
-
- ol.startMemberSections();
- classSDict->writeDeclaration(ol,0,0,TRUE);
-
- namespaceSDict->writeDeclaration(ol,TRUE);
-
- /* write user defined member groups */
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->writeDeclarations(ol,0,this,0,0);
- }
-
- //allMemberList.writeDeclarations(ol,0,this,0,0,0,0);
- decDefineMembers.writeDeclarations(ol,0,this,0,0,theTranslator->trDefines(),0);
- decProtoMembers.writeDeclarations(ol,0,this,0,0,theTranslator->trFuncProtos(),0);
- decTypedefMembers.writeDeclarations(ol,0,this,0,0,theTranslator->trTypedefs(),0);
- decEnumMembers.writeDeclarations(ol,0,this,0,0,theTranslator->trEnumerations(),0);
- decFuncMembers.writeDeclarations(ol,0,this,0,0,theTranslator->trFunctions(),0);
- decVarMembers.writeDeclarations(ol,0,this,0,0,theTranslator->trVariables(),0);
- ol.endMemberSections();
-
- if (!Config_getBool("DETAILS_AT_TOP"))
- {
- writeDetailedDocumentation(ol);
- }
-
- writeMemberDocumentation(ol);
-
- // write Author section (Man only)
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Man);
- ol.startGroupHeader();
- ol.parseText(theTranslator->trAuthor(TRUE,TRUE));
- ol.endGroupHeader();
- ol.parseText(theTranslator->trGeneratedAutomatically(Config_getString("PROJECT_NAME")));
-
- if (!Config_getString("GENERATE_TAGFILE").isEmpty())
- {
- writeDocAnchorsToTagFile();
- Doxygen::tagFile << " </compound>" << endl;
- }
-
- ol.popGeneratorState();
- endFile(ol);
-
- if (Config_getBool("SEPARATE_MEMBER_PAGES"))
- {
- allMemberList.sort();
- writeMemberPages(ol);
- }
-}
-
-void NamespaceDef::writeMemberDocumentation(OutputList &ol)
-{
- if (Config_getBool("SEPARATE_MEMBER_PAGES"))
- {
- ol.disable(OutputGenerator::Html);
- }
-
- docDefineMembers.writeDocumentation(ol,name(),this,
- theTranslator->trDefineDocumentation());
-
- docProtoMembers.writeDocumentation(ol,name(),this,
- theTranslator->trFunctionPrototypeDocumentation());
-
- docTypedefMembers.writeDocumentation(ol,name(),this,
- theTranslator->trTypedefDocumentation());
-
- docEnumMembers.writeDocumentation(ol,name(),this,
- theTranslator->trEnumerationTypeDocumentation());
-
- docFuncMembers.writeDocumentation(ol,name(),this,
- theTranslator->trFunctionDocumentation());
-
- docVarMembers.writeDocumentation(ol,name(),this,
- theTranslator->trVariableDocumentation());
-
- if (Config_getBool("SEPARATE_MEMBER_PAGES"))
- {
- ol.enable(OutputGenerator::Html);
- }
-}
-
-void NamespaceDef::writeMemberPages(OutputList &ol)
-{
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
-
- docDefineMembers.writeDocumentationPage(ol,name(),this);
- docProtoMembers.writeDocumentationPage(ol,name(),this);
- docTypedefMembers.writeDocumentationPage(ol,name(),this);
- docEnumMembers.writeDocumentationPage(ol,name(),this);
- docFuncMembers.writeDocumentationPage(ol,name(),this);
- docVarMembers.writeDocumentationPage(ol,name(),this);
-
- ol.popGeneratorState();
-}
-
-void NamespaceDef::writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const
-{
- static bool createSubDirs=Config_getBool("CREATE_SUBDIRS");
-
- ol.writeString(" <div class=\"navtab\">\n");
- ol.writeString(" <table>\n");
-
- MemberListIterator mli(allMemberList);
- MemberDef *md;
- for (mli.toFirst();(md=mli.current());++mli)
- {
- if (md->getNamespaceDef()==this && md->isLinkable())
- {
- ol.writeString(" <tr><td class=\"navtab\">");
- if (md->isLinkableInProject())
- {
- 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(md->localName());
- ol.writeString("</a>");
- }
- ol.writeString("</td></tr>\n");
- }
- }
-
- ol.writeString(" </table>\n");
- ol.writeString(" </div>\n");
-}
-
-int NamespaceDef::countMembers()
-{
- allMemberList.countDocMembers();
- return allMemberList.numDocMembers()+classSDict->count();
-}
-
-void NamespaceDef::addUsingDirective(NamespaceDef *nd)
-{
- if (usingDirList==0)
- {
- usingDirList = new NamespaceSDict;
- }
- if (usingDirList->find(nd->qualifiedName())==0)
- {
- usingDirList->append(nd->qualifiedName(),nd);
- }
-}
-
-void NamespaceDef::addUsingDeclaration(Definition *d)
-{
- if (usingDeclList==0)
- {
- usingDeclList = new SDict<Definition>(17);
- }
- if (usingDeclList->find(d->qualifiedName())==0)
- {
- usingDeclList->append(d->qualifiedName(),d);
- }
-}
-
-QCString NamespaceDef::getOutputFileBase() const
-{
- if (isReference())
- {
- return fileName;
- }
- else
- {
- return convertNameToFile(fileName);
- }
-}
-
-Definition *NamespaceDef::findInnerCompound(const char *n)
-{
- if (n==0) return 0;
- return m_innerCompounds->find(n);
-}
-
-void NamespaceDef::addListReferences()
-{
- addRefItem(xrefListItems(),
- theTranslator->trNamespace(TRUE,TRUE),
- getOutputFileBase(),displayName()
- );
- MemberGroupSDict::Iterator mgli(*memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- mg->addListReferences(this);
- }
- docDefineMembers.addListReferences(this);
- docProtoMembers.addListReferences(this);
- docTypedefMembers.addListReferences(this);
- docEnumMembers.addListReferences(this);
- docFuncMembers.addListReferences(this);
- docVarMembers.addListReferences(this);
-}
-
-QCString NamespaceDef::displayName() const
-{
- QCString result=name();
- if (Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
- {
- result = substitute(result,"::",".");
- }
- return result;
-}
-
-void NamespaceDef::combineUsingRelations()
-{
- if (visited) return; // already done
- visited=TRUE;
- if (usingDirList)
- {
- NamespaceSDict::Iterator nli(*usingDirList);
- NamespaceDef *nd;
- for (nli.toFirst();(nd=nli.current());++nli)
- {
- nd->combineUsingRelations();
- }
- for (nli.toFirst();(nd=nli.current());++nli)
- {
- // 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);
- }
- }
- }
- }
-}
-
-void NamespaceSDict::writeDeclaration(OutputList &ol,bool localName)
-{
- if (count()==0) return; // no namespaces in the list
-
- SDict<NamespaceDef>::Iterator ni(*this);
- NamespaceDef *nd;
- bool found=FALSE;
- for (ni.toFirst();(nd=ni.current()) && !found;++ni)
- {
- if (nd->isLinkable()) found=TRUE;
- }
- if (!found) return; // no linkable namespaces in the list
-
- // write list of namespaces
- ol.startMemberHeader();
- bool javaOpt = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
- if (javaOpt)
- {
- ol.parseText(theTranslator->trPackages());
- }
- else
- {
- ol.parseText(theTranslator->trNamespaces());
- }
- ol.endMemberHeader();
- ol.startMemberList();
- for (ni.toFirst();(nd=ni.current());++ni)
- {
- if (nd->isLinkable())
- {
- ol.startMemberItem(0);
- if (javaOpt)
- {
- ol.docify("package ");
- }
- else
- {
- ol.docify("namespace ");
- }
- ol.insertMemberAlign();
- QCString name;
- if (localName)
- {
- name = nd->localName();
- }
- else
- {
- name = nd->displayName();
- }
- ol.writeObjectLink(nd->getReference(),nd->getOutputFileBase(),0,name);
- if (!Config_getString("GENERATE_TAGFILE").isEmpty())
- {
- Doxygen::tagFile << " <namespace>" << convertToXML(nd->name()) << "</namespace>" << endl;
- }
- ol.endMemberItem();
- if (!nd->briefDescription().isEmpty() && Config_getBool("BRIEF_MEMBER_DESC"))
- {
- ol.startMemberDescription();
- ol.parseDoc(nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription(),FALSE,FALSE);
- ol.endMemberDescription();
- ol.newParagraph();
- }
- }
- }
- ol.endMemberList();
-}
-
diff --git a/src/namespacedef.h b/src/namespacedef.h
deleted file mode 100644
index caedfde..0000000
--- a/src/namespacedef.h
+++ /dev/null
@@ -1,174 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 NAMESPACEDEF_H
-#define NAMESPACEDEF_H
-
-#include "qtbc.h"
-#include <qstrlist.h>
-#include <qdict.h>
-#include "sortdict.h"
-#include "definition.h"
-#include "memberlist.h"
-
-class ClassDef;
-class ClassList;
-class OutputList;
-class ClassSDict;
-class MemberDef;
-class NamespaceList;
-class MemberGroupSDict;
-class NamespaceSDict;
-
-class NamespaceDef : public Definition
-{
- public:
- NamespaceDef(const char *defFileName,int defLine,
- const char *name,const char *ref=0,
- const char *refFile=0);
- ~NamespaceDef();
- DefType definitionType() const { return TypeNamespace; }
- QCString getOutputFileBase() const;
- void insertUsedFile(const char *fname);
-
- void writeDetailedDocumentation(OutputList &ol);
- void writeDocumentation(OutputList &ol);
- void writeMemberDocumentation(OutputList &ol);
- void writeMemberPages(OutputList &ol);
- void writeQuickMemberLinks(OutputList &ol,MemberDef *currentMd) const;
-
- void insertClass(ClassDef *cd);
- void insertNamespace(NamespaceDef *nd);
- void insertMember(MemberDef *md);
-
- void computeAnchors();
- int countMembers();
- void addUsingDirective(NamespaceDef *nd);
- NamespaceSDict *getUsedNamespaces() const { return usingDirList; }
- void addUsingDeclaration(Definition *def);
- SDict<Definition> *getUsedClasses() const { return usingDeclList; }
- void combineUsingRelations();
- QCString displayName() const;
-
- bool isLinkableInProject() const
- {
- int i = name().findRev("::");
- if (i==-1) i=0; else i+=2;
- return !name().isEmpty() && name().at(i)!='@' &&
- hasDocumentation() && !isReference();
- }
- bool isLinkable() const
- {
- return isLinkableInProject() || isReference();
- }
- void addMembersToMemberGroup();
- void distributeMemberGroupDocumentation();
- void findSectionsInDocumentation();
-
- virtual Definition *findInnerCompound(const char *name);
- void addInnerCompound(Definition *d);
- void addListReferences();
-
- //protected:
- // void addMemberListToGroup(MemberList *,bool (MemberDef::*)() const);
-
- public:
-
- // members in the declaration part of the documentation
- MemberList decDefineMembers;
- MemberList decProtoMembers;
- MemberList decTypedefMembers;
- MemberList decEnumMembers;
- MemberList decFuncMembers;
- MemberList decVarMembers;
-
- // members in the documentation part of the documentation
- MemberList docAllMemberList;
- MemberList docDefineMembers;
- MemberList docProtoMembers;
- MemberList docTypedefMembers;
- MemberList docEnumMembers;
- MemberList docFuncMembers;
- MemberList docVarMembers;
-
- /* user defined member groups */
- MemberGroupSDict *memberGroupSDict;
-
- /*! Classes inside this namespace */
- ClassSDict *classSDict;
- /*! Namespaces inside this namespace */
- NamespaceSDict *namespaceSDict;
-
- bool visited;
-
- private:
- //QCString reference;
- QCString fileName;
- QStrList files;
-
-
- NamespaceSDict *usingDirList;
- SDict<Definition> *usingDeclList;
- SDict<Definition> *m_innerCompounds;
-
- MemberList allMemberList;
-
-};
-
-class NamespaceList : public QList<NamespaceDef>
-{
- public:
- ~NamespaceList() {}
- int compareItems(GCI item1,GCI item2)
- {
- return stricmp(((NamespaceDef *)item1)->name(),
- ((NamespaceDef *)item2)->name()
- );
- }
-};
-
-class NamespaceListIterator : public QListIterator<NamespaceDef>
-{
- public:
- NamespaceListIterator(const NamespaceList &l) :
- QListIterator<NamespaceDef>(l) {}
-};
-
-class NamespaceDict : public QDict<NamespaceDef>
-{
- public:
- NamespaceDict(int size) : QDict<NamespaceDef>(size) {}
- ~NamespaceDict() {}
-};
-
-class NamespaceSDict : public SDict<NamespaceDef>
-{
- public:
- NamespaceSDict(int size=17) : SDict<NamespaceDef>(size) {}
- ~NamespaceSDict() {}
- int compareItems(GCI item1,GCI item2)
- {
- return stricmp(((NamespaceDef *)item1)->name(),
- ((NamespaceDef *)item2)->name()
- );
- }
- void writeDeclaration(OutputList &ol,bool localName=FALSE);
-};
-
-
-
-#endif
diff --git a/src/outputgen.cpp b/src/outputgen.cpp
deleted file mode 100644
index d54be19..0000000
--- a/src/outputgen.cpp
+++ /dev/null
@@ -1,99 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-
-#include <stdlib.h>
-
-#include "qtbc.h"
-#include "outputgen.h"
-#include "message.h"
-
-OutputGenerator::OutputGenerator()
-{
- //printf("OutputGenerator::OutputGenerator()\n");
- file=0;
- b.setBuffer(a);
- b.open( IO_WriteOnly );
- t.setDevice(&b);
-#if QT_VERSION >= 200
- t.setEncoding(QTextStream::Latin1);
-#endif
- active=TRUE;
- genStack = new QStack<bool>;
- genStack->setAutoDelete(TRUE);
-}
-
-OutputGenerator::~OutputGenerator()
-{
- //printf("OutputGenerator::~OutputGenerator()\n");
- delete file;
- delete genStack;
-}
-
-void OutputGenerator::startPlainFile(const char *name)
-{
- //printf("startPlainFile(%s)\n",name);
- QCString fileName=dir+"/"+name;
- file = new QFile(fileName);
- if (!file)
- {
- err("Could not create file object for %s\n",fileName.data());
- exit(1);
- }
- if (!file->open(IO_WriteOnly))
- {
- err("Could not open file %s for writing\n",fileName.data());
- exit(1);
- }
- fs.setDevice(file);
-}
-
-void OutputGenerator::endPlainFile()
-{
- //printf("endPlainFile(%s)\n",file->name());
- fs.writeRawBytes(a.data(),a.size()) ; // write string buffer to file
- delete file;
- file=0;
- b.close();
- a.resize(0);
- b.setBuffer(a);
- b.open(IO_WriteOnly);
- t.setDevice(&b);
-}
-
-QCString OutputGenerator::getContents() const
-{
- QCString s;
- s.resize(a.size()+1);
- memcpy(s.data(),a.data(),a.size());
- s.at(a.size())='\0';
- return s;
-}
-
-void OutputGenerator::pushGeneratorState()
-{
- genStack->push(new bool(isEnabled()));
-}
-
-void OutputGenerator::popGeneratorState()
-{
- bool *lb = genStack->pop();
- ASSERT(lb!=0);
- if (lb==0) return; // for some robustness against superfluous \endhtmlonly commands.
- if (*lb) enable(); else disable();
- delete lb;
-}
-
diff --git a/src/outputgen.h b/src/outputgen.h
deleted file mode 100644
index e92d633..0000000
--- a/src/outputgen.h
+++ /dev/null
@@ -1,444 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 OUTPUTGEN_H
-#define OUTPUTGEN_H
-
-#include "qtbc.h"
-#include <qtextstream.h>
-#include <qbuffer.h>
-#include <qfile.h>
-#include <qstack.h>
-#include "index.h"
-#include "section.h"
-
-class ClassDiagram;
-class DotClassGraph;
-class DotInclDepGraph;
-class DotCallGraph;
-class DotDirDeps;
-class DotGfxHierarchyTable;
-class DotGroupCollaboration;
-class DocNode;
-class MemberDef;
-class GroupDef;
-
-/*! \brief Output interface for code parser.
- */
-class CodeOutputInterface
-{
- public:
- virtual ~CodeOutputInterface() {}
- /*! Writes an ASCII string 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;
-
- /*! Writes a link to an object in a code fragment.
- * \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 name The text to display as a placeholder for the link.
- */
- virtual void writeCodeLink(const char *ref,const char *file,
- const char *anchor,const char *name) = 0;
-
- virtual void writeLineNumber(const char *ref,const char *file,
- const char *anchor,int lineNumber) = 0;
- virtual void startCodeLine() = 0;
- virtual void endCodeLine() = 0;
- virtual void startCodeAnchor(const char *label) = 0;
- virtual void endCodeAnchor() = 0;
- virtual void startFontClass(const char *) = 0;
- virtual void endFontClass() = 0;
- virtual void writeCodeAnchor(const char *name) = 0;
-};
-
-/*! \brief Base Interface used for generating output outside of the
- * comment blocks.
- *
- * This abstract class is used by output generation functions
- * to generate the output for a specific format,
- * or a list of formats (see OutputList). This interface
- * contains functions that generate fragments of the output.
- */
-class BaseOutputDocInterface : public CodeOutputInterface
-{
- public:
- virtual ~BaseOutputDocInterface() {}
- enum ParamListTypes { Param, RetVal, Exception };
- enum SectionTypes { /*See, Return, Author, Version,
- Since, Date, Bug, Note,
- Warning, Par, Deprecated, Pre,
- Post, Invar, Remark, Attention,
- Todo, Test, RCS, */ EnumValues,
- Examples
- };
-
- virtual void parseDoc(const char *,int, const char *,MemberDef *,
- const QCString &,bool) {}
- virtual void parseText(const QCString &) {}
-
- /*! Start of a bullet list: e.g. \c \<ul\> in html. writeListItem() 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
- */
- virtual void writeListItem() = 0;
-
- /*! Ends a bullet list: e.g. \c \</ul\> in html */
- virtual void endItemList() = 0;
-
- /*! Writes an ASCII string to the output. Converts characters that have
- * A special meaning, like \c & in html.
- */
- virtual void docify(const char *s) = 0;
-
- /*! Writes a single ASCII character to the output. Converts characters
- * that have a special meaning.
- */
- virtual void writeChar(char c) = 0;
-
- /*! Writes an ASCII string to the output, \e without converting
- * special characters.
- */
- virtual void writeString(const char *text) = 0;
-
- /*! Starts a new paragraph */
- virtual void newParagraph() = 0;
-
- /*! Writes a link to an object in the documentation.
- * \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 name The text to display as a placeholder for the link.
- */
- virtual void writeObjectLink(const char *ref,const char *file,
- const char *anchor, const char *name) = 0;
-
-
- /*! Starts a (link to an) URL found in the documentation.
- * \param url The URL to link to.
- */
- virtual void startHtmlLink(const char *url) = 0;
-
- /*! Ends a link started by startHtmlLink().
- */
- virtual void endHtmlLink() = 0;
-
-
- /*! Changes the text font to bold face. The bold section ends with
- * endBold()
- */
- virtual void startBold() = 0;
-
- /*! End a section of text displayed in bold face. */
- virtual void endBold() = 0;
-
- /*! Changes the text font to fixed size. The section ends with
- * endTypewriter()
- */
- virtual void startTypewriter() = 0;
-
- /*! End a section of text displayed in typewriter style. */
- virtual void endTypewriter() = 0;
-
- /*! Changes the text font to italic. The italic section ends with
- * endEmphasis()
- */
- virtual void startEmphasis() = 0;
-
- /*! 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
- * Items are surrounded by startDescItem() and endDescItem()
- */
- virtual void startDescription() = 0;
-
- /*! Ends a description list: e.g. \c \</dl\> in HTML */
- virtual void endDescription() = 0;
-
- /*! Starts an item of a description list: e.g. \c \<dt\> in HTML. */
- virtual void startDescItem() = 0;
-
- /*! Ends an item of a description list and starts the
- * description itself: e.g. \c \<dd\> in HTML.
- */
- virtual void endDescItem() = 0;
-
- virtual void startCenter() = 0;
- virtual void endCenter() = 0;
- virtual void startSmall() = 0;
- virtual void endSmall() = 0;
-
- virtual void startSimpleSect(SectionTypes t,const char *file,
- const char *anchor,const char *title) = 0;
- virtual void endSimpleSect() = 0;
- virtual void startParamList(ParamListTypes t,const char *title) = 0;
- virtual void endParamList() = 0;
-
- virtual void writeDescItem() = 0;
- virtual void startTitle() = 0;
- 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 lineBreak() = 0;
- virtual void addIndexItem(const char *s1,const char *s2) = 0;
-
- virtual void writeNonBreakableSpace(int) = 0;
- virtual void startDescTable() = 0;
- virtual void endDescTable() = 0;
- virtual void startDescTableTitle() = 0;
- virtual void endDescTableTitle() = 0;
- virtual void startDescTableData() = 0;
- virtual void endDescTableData() = 0;
- virtual void startTextLink(const char *file,const char *anchor) = 0;
- virtual void endTextLink() = 0;
- virtual void startPageRef() = 0;
- virtual void endPageRef(const char *,const char *) = 0;
- virtual void startSubsection() = 0;
- virtual void endSubsection() = 0;
- virtual void startSubsubsection() = 0;
- virtual void endSubsubsection() = 0;
-};
-
-/*! \brief Abstract output generator.
- *
- * Subclass this class to add support for a new output format
- */
-class OutputGenerator : public BaseOutputDocInterface
-{
- public:
- enum OutputType { Html, Latex, Man, RTF, XML, DEF, Perl };
-
- OutputGenerator();
- virtual ~OutputGenerator();
-
- ///////////////////////////////////////////////////////////////
- // 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 startPlainFile(const char *name);
- void endPlainFile();
- QCString getContents() const;
- bool isEnabled() const { return active; }
- void pushGeneratorState();
- void popGeneratorState();
-
- virtual void printDoc(DocNode *,const char *langExt) = 0;
-
- ///////////////////////////////////////////////////////////////
- // structural output interface
- ///////////////////////////////////////////////////////////////
- virtual void startFile(const char *name,const char *manName,
- const char *title) = 0;
- virtual void writeFooter() = 0;
- virtual void endFile() = 0;
- virtual void startIndexSection(IndexSections) = 0;
- virtual void endIndexSection(IndexSections) = 0;
- virtual void startProjectNumber() = 0;
- virtual void endProjectNumber() = 0;
- virtual void writeStyleInfo(int part) = 0;
- virtual void startTitleHead(const char *) = 0;
- virtual void endTitleHead(const char *fileName,const char *name) = 0;
- virtual void startIndexList() = 0;
- virtual void endIndexList() = 0;
- virtual void startIndexKey() = 0;
- virtual void endIndexKey() = 0;
- virtual void startIndexValue(bool) = 0;
- virtual void endIndexValue(const char *,bool) = 0;
- virtual void writeIndexItem(const char *ref,const char *file,
- const char *text) = 0;
- virtual void startGroupHeader() = 0;
- virtual void endGroupHeader() = 0;
- virtual void startMemberSections() = 0;
- virtual void endMemberSections() = 0;
- virtual void startMemberHeader() = 0;
- virtual void endMemberHeader() = 0;
- virtual void startMemberSubtitle() = 0;
- virtual void endMemberSubtitle() = 0;
- virtual void startMemberList() = 0;
- virtual void endMemberList() = 0;
- virtual void startAnonTypeScope(int) = 0;
- virtual void endAnonTypeScope(int) = 0;
- virtual void startMemberItem(int) = 0;
- virtual void endMemberItem() = 0;
- virtual void startMemberTemplateParams() = 0;
- virtual void endMemberTemplateParams() = 0;
- virtual void startMemberGroupHeader(bool) = 0;
- virtual void endMemberGroupHeader() = 0;
- virtual void startMemberGroupDocs() = 0;
- virtual void endMemberGroupDocs() = 0;
- virtual void startMemberGroup() = 0;
- virtual void endMemberGroup(bool) = 0;
- virtual void insertMemberAlign(bool) = 0;
- virtual void startMemberDoc(const char *,const char *,
- const char *,const char *) = 0;
- virtual void endMemberDoc(bool) = 0;
- virtual void startDoxyAnchor(const char *fName,const char *manName,
- const char *anchor,const char *name,
- const char *args) = 0;
- virtual void endDoxyAnchor(const char *fileName,const char *anchor) = 0;
- virtual void writeLatexSpacing() = 0;
- virtual void writeStartAnnoItem(const char *type,const char *file,
- const char *path,const char *name) = 0;
- virtual void writeEndAnnoItem(const char *name) = 0;
- virtual void startMemberDescription() = 0;
- virtual void endMemberDescription() = 0;
- virtual void startIndent() = 0;
- virtual void endIndent() = 0;
- virtual void writeSynopsis() = 0;
- virtual void startClassDiagram() = 0;
- virtual void endClassDiagram(ClassDiagram &,const char *,const char *) = 0;
- virtual void startDotGraph() = 0;
- virtual void endDotGraph(DotClassGraph &g) = 0;
- virtual void startInclDepGraph() = 0;
- virtual void endInclDepGraph(DotInclDepGraph &g) = 0;
- virtual void startGroupCollaboration() = 0;
- virtual void endGroupCollaboration(DotGroupCollaboration &g) = 0;
- virtual void startCallGraph() = 0;
- virtual void endCallGraph(DotCallGraph &g) = 0;
- virtual void startDirDepGraph() = 0;
- virtual void endDirDepGraph(DotDirDeps &g) = 0;
- virtual void writeGraphicalHierarchy(DotGfxHierarchyTable &g) = 0;
- //virtual void startQuickIndexItem(const char *s,const char *l) = 0;
- //virtual void endQuickIndexItem() = 0;
- virtual void writeQuickLinks(bool compact,HighlightedItem hli) = 0;
- virtual void startTextBlock(bool) = 0;
- virtual void endTextBlock(bool) = 0;
- virtual void lastIndexPage() = 0;
- virtual void startMemberDocPrefixItem() = 0;
- virtual void endMemberDocPrefixItem() = 0;
- virtual void startMemberDocName(bool) = 0;
- virtual void endMemberDocName() = 0;
- virtual void startParameterType(bool,const char *) = 0;
- virtual void endParameterType() = 0;
- virtual void startParameterName(bool) = 0;
- virtual void endParameterName(bool,bool,bool) = 0;
- virtual void startParameterList(bool) = 0;
- virtual void endParameterList() = 0;
-
- protected:
- QTextStream fs;
- QByteArray a;
- QBuffer b;
- QTextStream t;
- QFile *file;
- QCString dir;
- bool active;
- QStack<bool> *genStack;
-
- private:
- OutputGenerator(const OutputGenerator &o);
- OutputGenerator &operator=(const OutputGenerator &o);
-};
-
-/*! \brief Interface used for generating documentation.
- *
- * This abstract class is used by several functions
- * to generate the output for a specific format.
- * This interface contains some state saving and changing
- * functions for dealing with format specific output.
- */
-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)
- */
- 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)
- */
- virtual void enableAll() = 0;
-
- /*! Disables all output formats (useful for OutputList only) */
- virtual void disableAll()= 0;
-
- /*! Disables a specific output format (useful for OutputList only) */
- virtual void disable(OutputGenerator::OutputType o) = 0;
-
- /*! Enables a specific output format (useful for OutputList only) */
- virtual void enable(OutputGenerator::OutputType o) = 0;
-
- /*! Check whether a specific output format is currenly 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
- * generators) on a stack.
- */
- virtual void pushGeneratorState() = 0;
-
- /*! 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
deleted file mode 100644
index 297ddca..0000000
--- a/src/outputlist.cpp
+++ /dev/null
@@ -1,314 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-
-/*! \file
- * This class represents a list of output generators that work in "parallel".
- * The class only knows about the abstract base class OutputGenerators.
- * All output is produced by calling a method of this class, which forwards
- * the call to all output generators.
- */
-
-#include "outputlist.h"
-#include "outputgen.h"
-#include "config.h"
-#include "message.h"
-#include "definition.h"
-
-#include "docparser.h"
-
-OutputList::OutputList(bool)
-{
- //printf("OutputList::OutputList()\n");
- outputs = new QList<OutputGenerator>;
- outputs->setAutoDelete(TRUE);
-}
-
-OutputList::~OutputList()
-{
- //printf("OutputList::~OutputList()\n");
- delete outputs;
-}
-
-void OutputList::add(const OutputGenerator *og)
-{
- if (og) outputs->append(og);
-}
-
-void OutputList::disableAllBut(OutputGenerator::OutputType o)
-{
- OutputGenerator *og=outputs->first();
- while (og)
- {
- og->disableIfNot(o);
- og=outputs->next();
- }
-}
-
-void OutputList::enableAll()
-{
- OutputGenerator *og=outputs->first();
- while (og)
- {
- og->enable();
- og=outputs->next();
- }
-}
-
-void OutputList::disableAll()
-{
- OutputGenerator *og=outputs->first();
- while (og)
- {
- og->disable();
- og=outputs->next();
- }
-}
-
-void OutputList::disable(OutputGenerator::OutputType o)
-{
- OutputGenerator *og=outputs->first();
- while (og)
- {
- og->disableIf(o);
- og=outputs->next();
- }
-}
-
-void OutputList::enable(OutputGenerator::OutputType o)
-{
- OutputGenerator *og=outputs->first();
- while (og)
- {
- og->enableIf(o);
- og=outputs->next();
- }
-}
-
-bool OutputList::isEnabled(OutputGenerator::OutputType o)
-{
- bool result=FALSE;
- OutputGenerator *og=outputs->first();
- while (og)
- {
- result=result || og->isEnabled(o);
- og=outputs->next();
- }
- return result;
-}
-
-void OutputList::pushGeneratorState()
-{
- OutputGenerator *og=outputs->first();
- while (og)
- {
- og->pushGeneratorState();
- og=outputs->next();
- }
-}
-
-void OutputList::popGeneratorState()
-{
- OutputGenerator *og=outputs->first();
- while (og)
- {
- og->popGeneratorState();
- og=outputs->next();
- }
-}
-
-void OutputList::parseDoc(const char *fileName,int startLine,
- Definition *ctx,MemberDef * md,
- const QCString &docStr,bool indexWords,
- bool isExample,const char *exampleName,
- bool singleLine,bool linkFromIndex)
-{
- int count=0;
- if (docStr.isEmpty()) return;
-
- OutputGenerator *og=outputs->first();
- while (og)
- {
- if (og->isEnabled()) count++;
- og=outputs->next();
- }
- if (count==0) return; // no output formats enabled.
-
- DocNode *root=0;
- if (docStr.at(docStr.length()-1)=='\n')
- {
- root = validatingParseDoc(fileName,startLine,
- ctx,md,docStr,indexWords,isExample,exampleName,
- singleLine,linkFromIndex);
- }
- else
- {
- root = validatingParseDoc(fileName,startLine,
- ctx,md,docStr+"\n",indexWords,isExample,exampleName,
- singleLine,linkFromIndex);
- }
-
- og=outputs->first();
- while (og)
- {
- //printf("og->printDoc(extension=%s)\n",
- // ctx?ctx->getDefFileExtension().data():"<null>");
- if (og->isEnabled()) og->printDoc(root,ctx?ctx->getDefFileExtension():QCString(""));
- og=outputs->next();
- }
-
- delete root;
-}
-
-void OutputList::parseText(const QCString &textStr)
-{
- int count=0;
- OutputGenerator *og=outputs->first();
- while (og)
- {
- if (og->isEnabled()) count++;
- og=outputs->next();
- }
- if (count==0) return; // no output formats enabled.
-
- DocNode *root = validatingParseText(textStr);
-
- og=outputs->first();
- while (og)
- {
- if (og->isEnabled()) og->printDoc(root,0);
- og=outputs->next();
- }
-
- delete root;
-}
-
-
-//--------------------------------------------------------------------------
-// Create some overloaded definitions of the forall function.
-// Using template functions here would have made it a little less
-// portable (I guess).
-
-// zero arguments
-void OutputList::forall(void (OutputGenerator::*func)())
-{
- OutputGenerator *og=outputs->first();
- while (og)
- {
- if (og->isEnabled()) (og->*func)();
- og=outputs->next();
- }
-}
-
-// one argument
-#define FORALL1(a1,p1) \
-void OutputList::forall(void (OutputGenerator::*func)(a1),a1) \
-{ \
- OutputGenerator *og=outputs->first(); \
- while (og) \
- { \
- if (og->isEnabled()) (og->*func)(p1); \
- og=outputs->next(); \
- } \
-}
-
-// two arguments
-#define FORALL2(a1,a2,p1,p2) \
-void OutputList::forall(void (OutputGenerator::*func)(a1,a2),a1,a2) \
-{ \
- OutputGenerator *og=outputs->first(); \
- while (og) \
- { \
- if (og->isEnabled()) (og->*func)(p1,p2); \
- og=outputs->next(); \
- } \
-}
-
-// three arguments
-#define FORALL3(a1,a2,a3,p1,p2,p3) \
-void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3),a1,a2,a3) \
-{ \
- OutputGenerator *og=outputs->first(); \
- while (og) \
- { \
- if (og->isEnabled()) (og->*func)(p1,p2,p3); \
- og=outputs->next(); \
- } \
-}
-
-// four arguments
-#define FORALL4(a1,a2,a3,a4,p1,p2,p3,p4) \
-void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3,a4),a1,a2,a3,a4) \
-{ \
- OutputGenerator *og=outputs->first(); \
- while (og) \
- { \
- if (og->isEnabled()) (og->*func)(p1,p2,p3,p4); \
- og=outputs->next(); \
- } \
-}
-
-// five arguments
-#define FORALL5(a1,a2,a3,a4,a5,p1,p2,p3,p4,p5) \
-void OutputList::forall(void (OutputGenerator::*func)(a1,a2,a3,a4,a5),a1,a2,a3,a4,a5) \
-{ \
- OutputGenerator *og=outputs->first(); \
- while (og) \
- { \
- if (og->isEnabled()) (og->*func)(p1,p2,p3,p4,p5); \
- og=outputs->next(); \
- } \
-}
-
-// now instantiate only the ones we need.
-
-FORALL1(const char *a1,a1)
-FORALL1(char a1,a1)
-FORALL1(int a1,a1)
-FORALL1(DotClassGraph &a1,a1)
-FORALL1(DotInclDepGraph &a1,a1)
-FORALL1(DotCallGraph &a1,a1)
-FORALL1(DotDirDeps &a1,a1)
-FORALL1(DotGfxHierarchyTable &a1,a1)
-FORALL1(DotGroupCollaboration &a1,a1)
-FORALL1(SectionTypes a1,a1)
-#if defined(HAS_BOOL_TYPE) || defined(Q_HAS_BOOL_TYPE)
-FORALL1(bool a1,a1)
-FORALL2(bool a1,int a2,a1,a2)
-FORALL2(bool a1,bool a2,a1,a2)
-FORALL4(const char *a1,const char *a2,const char *a3,bool a4,a1,a2,a3,a4)
-#endif
-FORALL2(int a1,bool a2,a1,a2)
-FORALL2(bool a1,HighlightedItem a2,a1,a2)
-FORALL2(bool a1,const char *a2,a1,a2)
-FORALL2(ParamListTypes a1,const char *a2,a1,a2)
-FORALL1(IndexSections a1,a1)
-FORALL2(const char *a1,const char *a2,a1,a2)
-FORALL2(const char *a1,bool a2,a1,a2)
-FORALL2(const char *a1,SectionInfo::SectionType a2,a1,a2)
-FORALL3(bool a1,bool a2,bool a3,a1,a2,a3)
-FORALL3(ClassDiagram &a1,const char *a2,const char *a3,a1,a2,a3)
-FORALL3(const char *a1,const char *a2,const char *a3,a1,a2,a3)
-FORALL3(const char *a1,const char *a2,bool a3,a1,a2,a3)
-FORALL3(const char *a1,const char *a2,SectionInfo::SectionType a3,a1,a2,a3)
-FORALL3(uchar a1,uchar a2,uchar a3,a1,a2,a3)
-FORALL4(SectionTypes a1,const char *a2,const char *a3,const char *a4,a1,a2,a3,a4)
-FORALL4(const char *a1,const char *a2,const char *a3,const char *a4,a1,a2,a3,a4)
-FORALL4(const char *a1,const char *a2,const char *a3,int a4,a1,a2,a3,a4)
-FORALL5(const char *a1,const char *a2,const char *a3,const char *a4,const char *a5,a1,a2,a3,a4,a5)
-
-
-//--------------------------------------------------------------------------
diff --git a/src/outputlist.h b/src/outputlist.h
deleted file mode 100644
index 3e4b5c0..0000000
--- a/src/outputlist.h
+++ /dev/null
@@ -1,435 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 OUTPUTLIST_H
-#define OUTPUTLIST_H
-
-#include "qtbc.h"
-#include <qlist.h>
-#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)
-
-class ClassDiagram;
-class DotClassGraph;
-class DotDirDeps;
-class DotInclDepGraph;
-class DotGfxHierarchyTable;
-class SectionDict;
-class DotGroupCollaboration;
-
-class OutputList : public OutputDocInterface
-{
- public:
- OutputList(bool);
- virtual ~OutputList();
-
- void add(const OutputGenerator *);
-
- void disableAllBut(OutputGenerator::OutputType o);
- void enableAll();
- void disableAll();
- void disable(OutputGenerator::OutputType o);
- void enable(OutputGenerator::OutputType o);
- bool isEnabled(OutputGenerator::OutputType o);
- void pushGeneratorState();
- void popGeneratorState();
-
-
- //////////////////////////////////////////////////
- // OutputDocInterface implementation
- //////////////////////////////////////////////////
-
- void parseDoc(const char *fileName,int startLine,
- Definition *ctx,MemberDef *md,const QCString &docStr,
- bool indexWords,bool isExample,const char *exampleName=0,
- bool singleLine=FALSE,bool linkFromIndex=FALSE);
- void parseText(const QCString &textStr);
-
-
- void startIndexSection(IndexSections is)
- { forall(&OutputGenerator::startIndexSection,is); }
- void endIndexSection(IndexSections is)
- { forall(&OutputGenerator::endIndexSection,is); }
- void startProjectNumber()
- { forall(&OutputGenerator::startProjectNumber); }
- void endProjectNumber()
- { forall(&OutputGenerator::endProjectNumber); }
- 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); }
- void writeFooter()
- { forall(&OutputGenerator::writeFooter); }
- void endFile()
- { forall(&OutputGenerator::endFile); }
- void startTitleHead(const char *fileName)
- { forall(&OutputGenerator::startTitleHead,fileName); }
- void endTitleHead(const char *fileName,const char *name)
- { forall(&OutputGenerator::endTitleHead,fileName,name); }
- void startTitle()
- { forall(&OutputGenerator::startTitle); }
- void endTitle()
- { forall(&OutputGenerator::endTitle); }
- void newParagraph()
- { forall(&OutputGenerator::newParagraph); }
- void writeString(const char *text)
- { forall(&OutputGenerator::writeString,text); }
- void startIndexList()
- { forall(&OutputGenerator::startIndexList); }
- void endIndexList()
- { forall(&OutputGenerator::endIndexList); }
- void startIndexKey()
- { forall(&OutputGenerator::startIndexKey); }
- void endIndexKey()
- { forall(&OutputGenerator::endIndexKey); }
- void startIndexValue(bool b)
- { forall(&OutputGenerator::startIndexValue,b); }
- void endIndexValue(const char *name,bool b)
- { forall(&OutputGenerator::endIndexValue,name,b); }
- void startItemList()
- { forall(&OutputGenerator::startItemList); }
- void endItemList()
- { forall(&OutputGenerator::endItemList); }
- void writeIndexItem(const char *ref,const char *file,const char *text)
- { forall(&OutputGenerator::writeIndexItem,ref,file,text); }
- void docify(const char *s)
- { forall(&OutputGenerator::docify,s); }
- void codify(const char *s)
- { forall(&OutputGenerator::codify,s); }
- void writeObjectLink(const char *ref,const char *file,
- const char *anchor, const char *name)
- { forall(&OutputGenerator::writeObjectLink,ref,file,anchor,name); }
- void writeCodeLink(const char *ref,const char *file,
- const char *anchor,const char *name)
- { forall(&OutputGenerator::writeCodeLink,ref,file,anchor,name); }
- void startTextLink(const char *file,const char *anchor)
- { forall(&OutputGenerator::startTextLink,file,anchor); }
- void endTextLink()
- { forall(&OutputGenerator::endTextLink); }
- void startHtmlLink(const char *url)
- { forall(&OutputGenerator::startHtmlLink,url); }
- void endHtmlLink()
- { forall(&OutputGenerator::endHtmlLink); }
- 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()
- { forall(&OutputGenerator::startTypewriter); }
- void endTypewriter()
- { forall(&OutputGenerator::endTypewriter); }
- void startGroupHeader()
- { forall(&OutputGenerator::startGroupHeader); }
- void endGroupHeader()
- { forall(&OutputGenerator::endGroupHeader); }
- void writeListItem()
- { forall(&OutputGenerator::writeListItem); }
- void startMemberSections()
- { forall(&OutputGenerator::startMemberSections); }
- void endMemberSections()
- { forall(&OutputGenerator::endMemberSections); }
- void startMemberHeader()
- { forall(&OutputGenerator::startMemberHeader); }
- void endMemberHeader()
- { forall(&OutputGenerator::endMemberHeader); }
- void startMemberSubtitle()
- { forall(&OutputGenerator::startMemberSubtitle); }
- void endMemberSubtitle()
- { forall(&OutputGenerator::endMemberSubtitle); }
- void startMemberList()
- { forall(&OutputGenerator::startMemberList); }
- void endMemberList()
- { forall(&OutputGenerator::endMemberList); }
- void startAnonTypeScope(int i1)
- { forall(&OutputGenerator::startAnonTypeScope,i1); }
- void endAnonTypeScope(int i1)
- { forall(&OutputGenerator::endAnonTypeScope,i1); }
- void startMemberItem(int i1)
- { forall(&OutputGenerator::startMemberItem,i1); }
- void endMemberItem()
- { forall(&OutputGenerator::endMemberItem); }
- void startMemberTemplateParams()
- { forall(&OutputGenerator::startMemberTemplateParams); }
- void endMemberTemplateParams()
- { forall(&OutputGenerator::endMemberTemplateParams); }
- void startMemberGroupHeader(bool b)
- { forall(&OutputGenerator::startMemberGroupHeader,b); }
- void endMemberGroupHeader()
- { forall(&OutputGenerator::endMemberGroupHeader); }
- void startMemberGroupDocs()
- { forall(&OutputGenerator::startMemberGroupDocs); }
- void endMemberGroupDocs()
- { forall(&OutputGenerator::endMemberGroupDocs); }
- void startMemberGroup()
- { forall(&OutputGenerator::startMemberGroup); }
- void endMemberGroup(bool last)
- { forall(&OutputGenerator::endMemberGroup,last); }
- void insertMemberAlign(bool templ=FALSE)
- { forall(&OutputGenerator::insertMemberAlign,templ); }
- 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()
- { forall(&OutputGenerator::startCodeLine); }
- void endCodeLine()
- { forall(&OutputGenerator::endCodeLine); }
- void writeLineNumber(const char *ref,const char *file,const char *anchor,
- int lineNumber)
- { forall(&OutputGenerator::writeLineNumber,ref,file,anchor,lineNumber); }
- void startEmphasis()
- { forall(&OutputGenerator::startEmphasis); }
- void endEmphasis()
- { forall(&OutputGenerator::endEmphasis); }
- void writeChar(char c)
- { forall(&OutputGenerator::writeChar,c); }
- void startMemberDoc(const char *clName,const char *memName,
- const char *anchor,const char *title)
- { forall(&OutputGenerator::startMemberDoc,clName,memName,anchor,title); }
- void endMemberDoc(bool hasArgs)
- { forall(&OutputGenerator::endMemberDoc,hasArgs); }
- void startDoxyAnchor(const char *fName,const char *manName,
- const char *anchor, const char *name,
- const char *args)
- { forall(&OutputGenerator::startDoxyAnchor,fName,manName,anchor,name,args); }
- void endDoxyAnchor(const char *fn,const char *anchor)
- { forall(&OutputGenerator::endDoxyAnchor,fn,anchor); }
- void startCodeAnchor(const char *label)
- { forall(&OutputGenerator::startCodeAnchor,label); }
- void endCodeAnchor()
- { forall(&OutputGenerator::endCodeAnchor); }
- void writeLatexSpacing()
- { forall(&OutputGenerator::writeLatexSpacing); }
- void startDescription()
- { forall(&OutputGenerator::startDescription); }
- void endDescription()
- { forall(&OutputGenerator::endDescription); }
- void startDescItem()
- { forall(&OutputGenerator::startDescItem); }
- void endDescItem()
- { forall(&OutputGenerator::endDescItem); }
- void startSubsection()
- { forall(&OutputGenerator::startSubsection); }
- void endSubsection()
- { forall(&OutputGenerator::endSubsection); }
- void startSubsubsection()
- { forall(&OutputGenerator::startSubsubsection); }
- void endSubsubsection()
- { forall(&OutputGenerator::endSubsubsection); }
- void startCenter()
- { forall(&OutputGenerator::startCenter); }
- void endCenter()
- { forall(&OutputGenerator::endCenter); }
- void startSmall()
- { forall(&OutputGenerator::startSmall); }
- void endSmall()
- { forall(&OutputGenerator::endSmall); }
- void lineBreak()
- { forall(&OutputGenerator::lineBreak); }
- void startBold()
- { forall(&OutputGenerator::startBold); }
- void endBold()
- { forall(&OutputGenerator::endBold); }
- void startMemberDescription()
- { forall(&OutputGenerator::startMemberDescription); }
- void endMemberDescription()
- { forall(&OutputGenerator::endMemberDescription); }
- void startSimpleSect(SectionTypes t,const char *file,const char *anchor,
- const char *title)
- { forall(&OutputGenerator::startSimpleSect,t,file,anchor,title); }
- void endSimpleSect()
- { forall(&OutputGenerator::endSimpleSect); }
- void startParamList(ParamListTypes t,const char *title)
- { forall(&OutputGenerator::startParamList,t,title); }
- void endParamList()
- { forall(&OutputGenerator::endParamList); }
- void writeDescItem()
- { forall(&OutputGenerator::writeDescItem); }
- void startIndent()
- { forall(&OutputGenerator::startIndent); }
- void endIndent()
- { forall(&OutputGenerator::endIndent); }
- void startSection(const char *lab,const char *title,SectionInfo::SectionType t)
- { forall(&OutputGenerator::startSection,lab,title,t); }
- void endSection(const char *lab,SectionInfo::SectionType t)
- { forall(&OutputGenerator::endSection,lab,t); }
- void addIndexItem(const char *s1,const char *s2)
- { forall(&OutputGenerator::addIndexItem,s1,s2); }
- void writeSynopsis()
- { forall(&OutputGenerator::writeSynopsis); }
- void startClassDiagram()
- { forall(&OutputGenerator::startClassDiagram); }
- void endClassDiagram(ClassDiagram &d,const char *f,const char *n)
- { forall(&OutputGenerator::endClassDiagram,d,f,n); }
- void startPageRef()
- { forall(&OutputGenerator::startPageRef); }
- void endPageRef(const char *c,const char *a)
- { forall(&OutputGenerator::endPageRef,c,a); }
- //void startQuickIndexItem(const char *s,const char *l)
- //{ forall(&OutputGenerator::startQuickIndexItem,s,l); }
- //void endQuickIndexItem()
- //{ forall(&OutputGenerator::endQuickIndexItem); }
- void writeQuickLinks(bool compact,HighlightedItem hli)
- { forall(&OutputGenerator::writeQuickLinks,compact,hli); }
- void writeNonBreakableSpace(int num)
- { forall(&OutputGenerator::writeNonBreakableSpace,num); }
- void startDescTable()
- { forall(&OutputGenerator::startDescTable); }
- void endDescTable()
- { forall(&OutputGenerator::endDescTable); }
- void startDescTableTitle()
- { forall(&OutputGenerator::startDescTableTitle); }
- void endDescTableTitle()
- { forall(&OutputGenerator::endDescTableTitle); }
- void startDescTableData()
- { forall(&OutputGenerator::startDescTableData); }
- void endDescTableData()
- { forall(&OutputGenerator::endDescTableData); }
- void startDotGraph()
- { forall(&OutputGenerator::startDotGraph); }
- void endDotGraph(DotClassGraph &g)
- { forall(&OutputGenerator::endDotGraph,g); }
- void startInclDepGraph()
- { forall(&OutputGenerator::startInclDepGraph); }
- void endInclDepGraph(DotInclDepGraph &g)
- { forall(&OutputGenerator::endInclDepGraph,g); }
- void startCallGraph()
- { forall(&OutputGenerator::startCallGraph); }
- void endCallGraph(DotCallGraph &g)
- { forall(&OutputGenerator::endCallGraph,g); }
- void startDirDepGraph()
- { forall(&OutputGenerator::startDirDepGraph); }
- void endDirDepGraph(DotDirDeps &g)
- { forall(&OutputGenerator::endDirDepGraph,g); }
- void startGroupCollaboration()
- { forall(&OutputGenerator::startGroupCollaboration); }
- void endGroupCollaboration(DotGroupCollaboration &g)
- { forall(&OutputGenerator::endGroupCollaboration,g); }
- void writeGraphicalHierarchy(DotGfxHierarchyTable &g)
- { forall(&OutputGenerator::writeGraphicalHierarchy,g); }
- void startTextBlock(bool dense=FALSE)
- { forall(&OutputGenerator::startTextBlock,dense); }
- void endTextBlock(bool paraBreak=FALSE)
- { forall(&OutputGenerator::endTextBlock,paraBreak); }
- void lastIndexPage()
- { forall(&OutputGenerator::lastIndexPage); }
- void startMemberDocPrefixItem()
- { forall(&OutputGenerator::startMemberDocPrefixItem); }
- void endMemberDocPrefixItem()
- { forall(&OutputGenerator::endMemberDocPrefixItem); }
- void startMemberDocName(bool align)
- { forall(&OutputGenerator::startMemberDocName,align); }
- void endMemberDocName()
- { forall(&OutputGenerator::endMemberDocName); }
- void startParameterType(bool first,const char *key)
- { forall(&OutputGenerator::startParameterType,first,key); }
- void endParameterType()
- { forall(&OutputGenerator::endParameterType); }
- void startParameterName(bool one)
- { forall(&OutputGenerator::startParameterName,one); }
- void endParameterName(bool last,bool one,bool bracket)
- { forall(&OutputGenerator::endParameterName,last,one,bracket); }
- void startParameterList(bool openBracket)
- { forall(&OutputGenerator::startParameterList,openBracket); }
- void endParameterList()
- { forall(&OutputGenerator::endParameterList); }
- void startFontClass(const char *c)
- { forall(&OutputGenerator::startFontClass,c); }
- void endFontClass()
- { forall(&OutputGenerator::endFontClass); }
- void writeCodeAnchor(const char *name)
- { forall(&OutputGenerator::writeCodeAnchor,name); }
- void startPlainFile(const char *name)
- {
- OutputGenerator *og=outputs->first();
- while (og)
- {
- if (og->isEnabled()) (og->startPlainFile)(name);
- og=outputs->next();
- }
- }
- void endPlainFile()
- {
- OutputGenerator *og=outputs->first();
- while (og)
- {
- if (og->isEnabled()) (og->endPlainFile)();
- og=outputs->next();
- }
- }
-
- private:
- void debug();
- void clear();
-
- void forall(void (OutputGenerator::*func)());
- FORALLPROTO1(const char *);
- FORALLPROTO1(char);
- FORALLPROTO1(IndexSections);
- FORALLPROTO1(int);
- FORALLPROTO1(DotClassGraph &);
- FORALLPROTO1(DotInclDepGraph &);
- FORALLPROTO1(DotCallGraph &);
- FORALLPROTO1(DotGroupCollaboration &);
- FORALLPROTO1(DotDirDeps &);
- FORALLPROTO1(DotGfxHierarchyTable &);
- FORALLPROTO1(SectionTypes);
-#if defined(HAS_BOOL_TYPE) || defined(Q_HAS_BOOL_TYPE)
- FORALLPROTO1(bool);
- FORALLPROTO2(bool,int);
- FORALLPROTO2(bool,bool);
- FORALLPROTO4(const char *,const char *,const char *,int);
-#endif
- FORALLPROTO2(int,bool);
- FORALLPROTO2(bool,HighlightedItem);
- FORALLPROTO2(bool,const char *);
- FORALLPROTO2(ParamListTypes,const char *);
- FORALLPROTO2(const char *,const char *);
- FORALLPROTO2(const char *,bool);
- FORALLPROTO2(const char *,SectionInfo::SectionType);
- FORALLPROTO3(bool,bool,bool);
- FORALLPROTO3(const char *,const char *,bool);
- FORALLPROTO3(const char *,const char *,SectionInfo::SectionType);
- FORALLPROTO3(uchar,uchar,uchar);
- FORALLPROTO3(const char *,const char *,const char *);
- FORALLPROTO3(ClassDiagram &,const char *,const char *);
- FORALLPROTO4(SectionTypes,const char *,const char *,const char *);
- FORALLPROTO4(const char *,const char *,const char *,const char *);
- FORALLPROTO4(const char *,const char *,const char *,bool);
- FORALLPROTO5(const char *,const char *,const char *,const char *,const char *);
-
- OutputList(const OutputList &ol);
- QList<OutputGenerator> *outputs;
-};
-
-#endif
diff --git a/src/pagedef.cpp b/src/pagedef.cpp
deleted file mode 100644
index e820273..0000000
--- a/src/pagedef.cpp
+++ /dev/null
@@ -1,149 +0,0 @@
-#include "pagedef.h"
-#include "groupdef.h"
-#include "docparser.h"
-#include "config.h"
-#include "util.h"
-#include "outputlist.h"
-#include "doxygen.h"
-#include "language.h"
-
-
-PageDef::PageDef(const char *f,int l,const char *n,
- const char *d,const char *t)
- : Definition(f,l,n), m_title(t)
-{
- setDocumentation(d,f,l);
- subPageDict = new PageSDict(7);
-}
-
-PageDef::~PageDef()
-{
- delete subPageDict;
-}
-
-void PageDef::findSectionsInDocumentation()
-{
- docFindSections(documentation(),this,0,docFile());
-}
-
-GroupDef *PageDef::getGroupDef() const
-{
- return partOfGroups() ? partOfGroups()->getFirst() : 0;
-}
-
-QCString PageDef::getOutputFileBase() const
-{
- if (getGroupDef())
- return getGroupDef()->getOutputFileBase();
- else
- return m_fileName;
-}
-
-void PageDef::addInnerCompound(Definition *def)
-{
- if (def->definitionType()==Definition::TypePage)
- {
- PageDef *pd = (PageDef*)def;
- subPageDict->append(pd->name(),pd);
- def->setOuterScope(this);
- }
-}
-
-void PageDef::writeDocumentation(OutputList &ol)
-{
- //outputList->disable(OutputGenerator::Man);
- QCString pageName;
- if (Config_getBool("CASE_SENSE_NAMES"))
- pageName=name();
- else
- pageName=name().lower();
-
- startFile(ol,pageName,pageName,title());
-
- if (getOuterScope()!=Doxygen::globalScope && !Config_getBool("DISABLE_INDEX"))
- {
- getOuterScope()->writeNavigationPath(ol);
- }
-
- // save old generator state and write title only to Man generator
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Man);
- ol.startTitleHead(pageName);
- ol.endTitleHead(pageName, pageName);
- ol.popGeneratorState();
-
- SectionInfo *si=0;
- if (!title().isEmpty() && !name().isEmpty() &&
- (si=Doxygen::sectionDict.find(pageName))!=0)
- {
- ol.startSection(si->label,si->title,si->type);
- ol.docify(si->title);
- stringToSearchIndex(getOutputFileBase(),
- theTranslator->trPage(TRUE,TRUE)+" "+si->title,
- si->title);
- ol.endSection(si->label,si->type);
- }
- ol.startTextBlock();
- ol.parseDoc(docFile(), // fileName
- docLine(), // startLine
- this, // context
- 0, // memberdef
- documentation(), // docStr
- TRUE, // index words
- FALSE // not an example
- );
- ol.endTextBlock();
- endFile(ol);
- //outputList->enable(OutputGenerator::Man);
-
- if (!Config_getString("GENERATE_TAGFILE").isEmpty())
- {
- bool found=FALSE;
- QDictIterator<RefList> rli(*Doxygen::xrefLists);
- RefList *rl;
- for (rli.toFirst();(rl=rli.current());++rli)
- {
- if (rl->listName()==name())
- {
- found=TRUE;
- break;
- }
- }
- if (!found) // not one of the generated related pages
- {
- Doxygen::tagFile << " <compound kind=\"page\">" << endl;
- Doxygen::tagFile << " <name>" << name() << "</name>" << endl;
- Doxygen::tagFile << " <title>" << convertToXML(title()) << "</title>" << endl;
- Doxygen::tagFile << " <filename>" << getOutputFileBase() << "</filename>" << endl;
- writeDocAnchorsToTagFile();
- Doxygen::tagFile << " </compound>" << endl;
- }
- }
-}
-
-bool PageDef::visibleInIndex() const
-{
- return // not part of a group
- !getGroupDef() &&
- // not an externally defined page
- (!isReference() || Config_getBool("ALLEXTERNALS")) &&
- // not a subpage
- (getOuterScope()==0 ||
- getOuterScope()->definitionType()!=Definition::TypePage
- );
-}
-
-bool PageDef::documentedPage() const
-{
- return // not part of a group
- !getGroupDef() &&
- // not an externally defined page
- !isReference();
-}
-
-bool PageDef::hasSubPages() const
-{
- return subPageDict->count()>0;
-}
-
-
diff --git a/src/pagedef.h b/src/pagedef.h
deleted file mode 100644
index d63eb33..0000000
--- a/src/pagedef.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 "definition.h"
-#include "sortdict.h"
-
-class PageSDict;
-class OutputList;
-
-class PageDef : public Definition
-{
- public:
- PageDef(const char *f,int l,const char *n,const char *d,const char *t);
- ~PageDef();
- DefType definitionType() const { return TypePage; }
- bool isLinkableInProject() const
- {
- return hasDocumentation() && !isReference();
- }
- bool isLinkable() const
- {
- return isLinkableInProject() || isReference();
- }
- void addSubPage(PageDef *def);
- void writeDocumentation(OutputList &ol);
-
- // functions to get a uniform interface with Definitions
- QCString getOutputFileBase() const;
- void findSectionsInDocumentation();
- QCString title() const { return m_title; }
- GroupDef * getGroupDef() const;
- PageSDict * getSubPages() const { return subPageDict; }
- void setFileName(const char *name) { m_fileName = name; }
- void addInnerCompound(Definition *d);
- bool visibleInIndex() const;
- bool documentedPage() const;
- bool hasSubPages() const;
-
- private:
- QCString m_fileName;
- QCString m_title;
- GroupDef *m_inGroup;
- PageSDict *subPageDict; // list of pages in the group
-};
-
-class PageSDict : public SDict<PageDef>
-{
- public:
- PageSDict(int size) : SDict<PageDef>(size) {}
- virtual ~PageSDict() {}
- int compareItems(GCI i1,GCI i2)
- {
- return stricmp(((PageDef *)i1)->name(),((PageDef *)i2)->name());
- }
-};
-
diff --git a/src/parserintf.h b/src/parserintf.h
deleted file mode 100644
index ce1f649..0000000
--- a/src/parserintf.h
+++ /dev/null
@@ -1,145 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 PARSERINTF_H
-#define PARSERINTF_H
-
-#include <qdict.h>
-
-class Entry;
-class FileDef;
-class CodeOutputInterface;
-class MemberDef;
-
-/** \brief Abstract interface for programming language parsers.
- *
- * By implementing the methods of this interface one can add
- * a new language parser to doxygen. The parser can make use of the
- * comment block parser to parse the contents of special comment blocks.
- */
-class ParserInterface
-{
- public:
- /** 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
- * representing the information extracted from the file.
- */
- virtual void parseInput(const char *fileName,
- const char *fileBuf,
- Entry *root) = 0;
-
- /** Returns TRUE if the language identified by \a extension needs
- * the C preprocessor to be run before feed the result to the input
- * parser.
- * @see parseInput()
- */
- virtual bool needsPreprocessing(const QCString &extension) = 0;
-
- /** Parses a source file or fragment with the goal to produce
- * highlighted and cross-referenced output.
- * @param[in] codeOutIntf Abstract interface for writing the result.
- * @param[in] scopeName Name of scope to which the code belongs.
- * @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
- * is associated.
- * @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
- * as part of the documentation.
- * @param[in] memberDef Member definition to which the code
- * is associated (non null in case of an inline fragment
- * for a member).
- */
- virtual void parseCode(CodeOutputInterface &codeOutIntf,
- const char *scopeName,
- const QCString &input,
- bool isExampleBlock,
- const char *exampleName=0,
- FileDef *fileDef=0,
- int startLine=-1,
- int endLine=-1,
- bool inlineFragment=FALSE,
- MemberDef *memberDef=0
- ) = 0;
-
- /** Resets the state of the code parser.
- * Since multiple code fragments can together form a single example, an
- * explicit function is used to reset the code parser state.
- * @see parseCode()
- */
- virtual void resetCodeParserState() = 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
- * in the Entry node that corresponds with the node for which the
- * comment block parser was invoked.
- */
- virtual void parsePrototype(const char *text) = 0;
-
-};
-
-//-----------------------------------------------------------------------------
-
-/** \brief Manages programming language parsers.
- *
- * This class manages the language parsers in the system. One can
- * register parsers, and obtain a parser given a file extension.
- */
-class ParserManager
-{
- public:
- /** Creates the parser manager object.
- * @param defaultParser The default parser that is used when
- * no explicit extension has been registered for
- * a given input file.
- */
- ParserManager(ParserInterface *defaultParser)
- : m_defaultParser(defaultParser) {}
-
- /** Registers an additional parser.
- * @param[in] extension The file extension that will trigger
- * the use of this parser (e.g. ".py", or ".bas").
- * @param[in] parser The parser that is to be used for the
- * given extension.
- */
- void registerParser(const char *extension,ParserInterface *parser)
- {
- m_parsers.insert(extension,parser);
- }
-
- /** Gets the interface to the parser associated with given \a extension.
- * If there is no parser explicitly registered for the supplied extension,
- * the interface to the default parser will be returned.
- */
- ParserInterface *getParser(const char *extension)
- {
- if (extension==0) return m_defaultParser;
- ParserInterface *intf = m_parsers.find(extension);
- return intf ? intf : m_defaultParser;
- }
-
- private:
- QDict<ParserInterface> m_parsers;
- ParserInterface *m_defaultParser;
-};
-
-#endif
diff --git a/src/perlmodgen.cpp b/src/perlmodgen.cpp
deleted file mode 100644
index e501428..0000000
--- a/src/perlmodgen.cpp
+++ /dev/null
@@ -1,2784 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- * Authors: Dimitri van Heesch, Miguel Lobo.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-
-#include <stdlib.h>
-
-#include "perlmodgen.h"
-#include "docparser.h"
-#include "message.h"
-#include "doxygen.h"
-#include "pagedef.h"
-
-#include <qdir.h>
-#include <qstack.h>
-#include <qdict.h>
-#include <qfile.h>
-#include <qtextstream.h>
-
-#define PERLOUTPUT_MAX_INDENTATION 40
-
-class PerlModOutputStream
-{
-public:
-
- QString m_s;
- QTextStream *m_t;
-
- PerlModOutputStream(QTextStream *t = 0) : m_t(t) { }
-
- void add(char c);
- void add(const char *s);
- void add(QCString &s);
- void add(QString &s);
- void add(int n);
- void add(unsigned int n);
-};
-
-void PerlModOutputStream::add(char c)
-{
- if (m_t != 0)
- (*m_t) << c;
- else
- m_s += c;
-}
-
-void PerlModOutputStream::add(const char *s)
-{
- if (m_t != 0)
- (*m_t) << s;
- else
- m_s += s;
-}
-
-void PerlModOutputStream::add(QCString &s)
-{
- if (m_t != 0)
- (*m_t) << s;
- else
- m_s += s;
-}
-
-void PerlModOutputStream::add(QString &s)
-{
- if (m_t != 0)
- (*m_t) << s;
- else
- m_s += s;
-}
-
-void PerlModOutputStream::add(int n)
-{
- if (m_t != 0)
- (*m_t) << n;
- else
- m_s += n;
-}
-
-void PerlModOutputStream::add(unsigned int n)
-{
- if (m_t != 0)
- (*m_t) << n;
- else
- m_s += n;
-}
-
-class PerlModOutput
-{
-public:
-
- bool m_pretty;
-
- inline PerlModOutput(bool pretty)
- : m_pretty(pretty), m_stream(0), m_indentation(false), m_blockstart(true)
- {
- m_spaces[0] = 0;
- }
-
- virtual ~PerlModOutput() { }
-
- inline void setPerlModOutputStream(PerlModOutputStream *os) { m_stream = os; }
-
- inline PerlModOutput &openSave() { iopenSave(); return *this; }
- inline PerlModOutput &closeSave(QString &s) { icloseSave(s); return *this; }
-
- inline PerlModOutput &continueBlock()
- {
- if (m_blockstart)
- m_blockstart = false;
- else
- m_stream->add(',');
- indent();
- return *this;
- }
-
- inline PerlModOutput &add(char c) { m_stream->add(c); return *this; }
- inline PerlModOutput &add(const char *s) { m_stream->add(s); return *this; }
- inline PerlModOutput &add(QCString &s) { m_stream->add(s); return *this; }
- inline PerlModOutput &add(QString &s) { m_stream->add(s); return *this; }
- inline PerlModOutput &add(int n) { m_stream->add(n); return *this; }
- inline PerlModOutput &add(unsigned int n) { m_stream->add(n); return *this; }
-
- PerlModOutput &addQuoted(const char *s) { iaddQuoted(s); return *this; }
-
- inline PerlModOutput &indent()
- {
- if (m_pretty) {
- m_stream->add('\n');
- m_stream->add(m_spaces);
- }
- return *this;
- }
-
- inline PerlModOutput &open(char c, const char *s = 0) { iopen(c, s); return *this; }
- inline PerlModOutput &close(char c = 0) { iclose(c); return *this; }
-
- inline PerlModOutput &addField(const char *s) { iaddField(s); return *this; }
- inline PerlModOutput &addFieldQuotedChar(const char *field, char content)
- {
- iaddFieldQuotedChar(field, content); return *this;
- }
- inline PerlModOutput &addFieldQuotedString(const char *field, const char *content)
- {
- iaddFieldQuotedString(field, content); return *this;
- }
- inline PerlModOutput &addFieldBoolean(const char *field, bool content)
- {
- return addFieldQuotedString(field, content ? "yes" : "no");
- }
- inline PerlModOutput &openList(const char *s = 0) { open('[', s); return *this; }
- inline PerlModOutput &closeList() { close(']'); return *this; }
- inline PerlModOutput &openHash(const char *s = 0 ) { open('{', s); return *this; }
- inline PerlModOutput &closeHash() { close('}'); return *this; }
-
-protected:
-
- void iopenSave();
- void icloseSave(QString &);
-
- void incIndent();
- void decIndent();
-
- void iaddQuoted(const char *);
- void iaddFieldQuotedChar(const char *, char);
- void iaddFieldQuotedString(const char *, const char *);
- void iaddField(const char *);
-
- void iopen(char, const char *);
- void iclose(char);
-
-private:
-
- PerlModOutputStream *m_stream;
- int m_indentation;
- bool m_blockstart;
-
- QStack<PerlModOutputStream> m_saved;
- char m_spaces[PERLOUTPUT_MAX_INDENTATION * 2 + 2];
-};
-
-void PerlModOutput::iopenSave()
-{
- m_saved.push(m_stream);
- m_stream = new PerlModOutputStream();
-}
-
-void PerlModOutput::icloseSave(QString &s)
-{
- s = m_stream->m_s;
- delete m_stream;
- m_stream = m_saved.pop();
-}
-
-void PerlModOutput::incIndent()
-{
- if (m_indentation < PERLOUTPUT_MAX_INDENTATION)
- {
- char *s = &m_spaces[m_indentation * 2];
- *s++ = ' '; *s++ = ' '; *s = 0;
- }
- m_indentation++;
-}
-
-void PerlModOutput::decIndent()
-{
- m_indentation--;
- if (m_indentation < PERLOUTPUT_MAX_INDENTATION)
- m_spaces[m_indentation * 2] = 0;
-}
-
-void PerlModOutput::iaddQuoted(const char *s)
-{
- char c;
- while ((c = *s++) != 0) {
- if ((c == '\'') || (c == '\\'))
- m_stream->add('\\');
- m_stream->add(c);
- }
-}
-
-void PerlModOutput::iaddField(const char *s)
-{
- continueBlock();
- m_stream->add(s);
- m_stream->add(m_pretty ? " => " : "=>");
-}
-
-void PerlModOutput::iaddFieldQuotedChar(const char *field, char content)
-{
- iaddField(field);
- m_stream->add('\'');
- if ((content == '\'') || (content == '\\'))
- m_stream->add('\\');
- m_stream->add(content);
- m_stream->add('\'');
-}
-
-void PerlModOutput::iaddFieldQuotedString(const char *field, const char *content)
-{
- if (content == 0)
- return;
- iaddField(field);
- m_stream->add('\'');
- iaddQuoted(content);
- m_stream->add('\'');
-}
-
-void PerlModOutput::iopen(char c, const char *s)
-{
- if (s != 0)
- iaddField(s);
- else
- continueBlock();
- m_stream->add(c);
- incIndent();
- m_blockstart = true;
-}
-
-void PerlModOutput::iclose(char c)
-{
- decIndent();
- indent();
- if (c != 0)
- m_stream->add(c);
- m_blockstart = false;
-}
-
-/*! @brief Concrete visitor implementation for PerlMod output. */
-class PerlModDocVisitor : public DocVisitor
-{
-public:
- PerlModDocVisitor(PerlModOutput &);
- virtual ~PerlModDocVisitor() { }
-
- void finish();
-
- //--------------------------------------
- // visitor functions for leaf nodes
- //--------------------------------------
-
- void visit(DocWord *);
- void visit(DocLinkedWord *);
- void visit(DocWhiteSpace *);
- void visit(DocSymbol *);
- void visit(DocURL *);
- void visit(DocLineBreak *);
- void visit(DocHorRuler *);
- void visit(DocStyleChange *);
- void visit(DocVerbatim *);
- void visit(DocAnchor *);
- void visit(DocInclude *);
- void visit(DocIncOperator *);
- void visit(DocFormula *);
- void visit(DocIndexEntry *);
-
- //--------------------------------------
- // visitor functions for compound nodes
- //--------------------------------------
-
- void visitPre(DocAutoList *);
- void visitPost(DocAutoList *);
- void visitPre(DocAutoListItem *);
- void visitPost(DocAutoListItem *);
- void visitPre(DocPara *) ;
- void visitPost(DocPara *);
- void visitPre(DocRoot *);
- void visitPost(DocRoot *);
- void visitPre(DocSimpleSect *);
- void visitPost(DocSimpleSect *);
- void visitPre(DocTitle *);
- void visitPost(DocTitle *);
- void visitPre(DocSimpleList *);
- void visitPost(DocSimpleList *);
- void visitPre(DocSimpleListItem *);
- void visitPost(DocSimpleListItem *);
- void visitPre(DocSection *);
- void visitPost(DocSection *);
- void visitPre(DocHtmlList *);
- void visitPost(DocHtmlList *) ;
- void visitPre(DocHtmlListItem *);
- void visitPost(DocHtmlListItem *);
- //void visitPre(DocHtmlPre *);
- //void visitPost(DocHtmlPre *);
- void visitPre(DocHtmlDescList *);
- void visitPost(DocHtmlDescList *);
- void visitPre(DocHtmlDescTitle *);
- void visitPost(DocHtmlDescTitle *);
- void visitPre(DocHtmlDescData *);
- void visitPost(DocHtmlDescData *);
- void visitPre(DocHtmlTable *);
- void visitPost(DocHtmlTable *);
- void visitPre(DocHtmlRow *);
- void visitPost(DocHtmlRow *) ;
- void visitPre(DocHtmlCell *);
- void visitPost(DocHtmlCell *);
- void visitPre(DocHtmlCaption *);
- void visitPost(DocHtmlCaption *);
- void visitPre(DocInternal *);
- void visitPost(DocInternal *);
- void visitPre(DocHRef *);
- void visitPost(DocHRef *);
- void visitPre(DocHtmlHeader *);
- void visitPost(DocHtmlHeader *);
- void visitPre(DocImage *);
- void visitPost(DocImage *);
- void visitPre(DocDotFile *);
- void visitPost(DocDotFile *);
- void visitPre(DocLink *);
- void visitPost(DocLink *);
- void visitPre(DocRef *);
- void visitPost(DocRef *);
- void visitPre(DocSecRefItem *);
- void visitPost(DocSecRefItem *);
- void visitPre(DocSecRefList *);
- void visitPost(DocSecRefList *);
- //void visitPre(DocLanguage *);
- //void visitPost(DocLanguage *);
- void visitPre(DocParamSect *);
- void visitPost(DocParamSect *);
- void visitPre(DocParamList *);
- void visitPost(DocParamList *);
- void visitPre(DocXRefItem *);
- void visitPost(DocXRefItem *);
- void visitPre(DocInternalRef *);
- void visitPost(DocInternalRef *);
- void visitPre(DocCopy *);
- void visitPost(DocCopy *);
- void visitPre(DocText *);
- void visitPost(DocText *);
-
-private:
-
- //--------------------------------------
- // helper functions
- //--------------------------------------
-
- void addLink(const QString &ref, const QString &file,
- const QString &anchor);
-
- void enterText();
- void leaveText();
-
- void openItem(const char *);
- void closeItem();
- void singleItem(const char *);
- void openSubBlock(const char * = 0);
- void closeSubBlock();
- void openOther();
- void closeOther();
-
- //--------------------------------------
- // state variables
- //--------------------------------------
-
- PerlModOutput &m_output;
- bool m_textmode;
- bool m_textblockstart;
- QString m_other;
-};
-
-PerlModDocVisitor::PerlModDocVisitor(PerlModOutput &output)
- : DocVisitor(DocVisitor_Other), m_output(output), m_textmode(false)
-{
- m_output.openList("doc");
-}
-
-void PerlModDocVisitor::finish()
-{
- leaveText();
- m_output.closeList()
- .add(m_other);
-}
-
-void PerlModDocVisitor::addLink(const QString &,const QString &file,const QString &anchor)
-{
- QString link = file;
- if (!anchor.isEmpty())
- (link += "_1") += anchor;
- m_output.addFieldQuotedString("link", link);
-}
-
-void PerlModDocVisitor::openItem(const char *name)
-{
- leaveText();
- m_output.openHash().addFieldQuotedString("type", name);
-}
-
-void PerlModDocVisitor::closeItem()
-{
- leaveText();
- m_output.closeHash();
-}
-
-void PerlModDocVisitor::enterText()
-{
- if (m_textmode)
- return;
- openItem("text");
- m_output.addField("content").add('\'');
- m_textmode = true;
-}
-
-void PerlModDocVisitor::leaveText()
-{
- if (!m_textmode)
- return;
- m_textmode = false;
- m_output
- .add('\'')
- .closeHash();
-}
-
-void PerlModDocVisitor::singleItem(const char *name)
-{
- openItem(name);
- closeItem();
-}
-
-void PerlModDocVisitor::openSubBlock(const char *s)
-{
- m_output.openList(s);
- m_textblockstart = true;
-}
-
-void PerlModDocVisitor::closeSubBlock()
-{
- leaveText();
- m_output.closeList();
-}
-
-void PerlModDocVisitor::openOther()
-{
- leaveText();
- m_output.openSave();
-}
-
-void PerlModDocVisitor::closeOther()
-{
- QString other;
- leaveText();
- m_output.closeSave(other);
- m_other += other;
-}
-
-void PerlModDocVisitor::visit(DocWord *w)
-{
- enterText();
- m_output.addQuoted(w->word());
-}
-
-void PerlModDocVisitor::visit(DocLinkedWord *w)
-{
- openItem("url");
- addLink(w->ref(), w->file(), w->anchor());
- m_output.addFieldQuotedString("content", w->word());
- closeItem();
-}
-
-void PerlModDocVisitor::visit(DocWhiteSpace *)
-{
- enterText();
- m_output.add(' ');
-}
-
-void PerlModDocVisitor::visit(DocSymbol *sy)
-{
- char c = 0;
- const char *s = 0;
- const char *accent = 0;
- const char *symbol = 0;
- switch(sy->symbol())
- {
- case DocSymbol::At: c = '@'; break;
- case DocSymbol::Less: c = '<'; break;
- case DocSymbol::Greater: c = '>'; break;
- case DocSymbol::Amp: c = '&'; break;
- case DocSymbol::Dollar: c = '$'; break;
- case DocSymbol::Hash: c = '#'; break;
- case DocSymbol::Percent: c = '%'; break;
- case DocSymbol::Quot: c = '"'; break;
- case DocSymbol::Nbsp: c = ' '; break;
- case DocSymbol::Uml: accent = "umlaut"; break;
- case DocSymbol::Acute: accent = "acute"; break;
- case DocSymbol::Grave: accent = "grave"; break;
- case DocSymbol::Circ: accent = "circ"; break;
- case DocSymbol::Slash: accent = "slash"; break;
- case DocSymbol::Tilde: accent = "tilde"; break;
- case DocSymbol::Cedil: accent = "cedilla"; break;
- case DocSymbol::Ring: accent = "ring"; break;
- case DocSymbol::BSlash: s = "\\\\"; break;
- case DocSymbol::Copy: symbol = "copyright"; break;
- case DocSymbol::Tm: symbol = "trademark"; break;
- case DocSymbol::Reg: symbol = "registered"; break;
- case DocSymbol::Szlig: symbol = "szlig"; break;
- case DocSymbol::Apos: s = "\\\'"; break;
- case DocSymbol::Unknown:
- err("Error: unknown symbol found\n");
- break;
- }
- if (c != 0) {
- enterText();
- m_output.add(c);
- } else if (s != 0) {
- enterText();
- m_output.add(s);
- } else if (symbol != 0) {
- leaveText();
- openItem("symbol");
- m_output.addFieldQuotedString("symbol", symbol);
- closeItem();
- } else if (accent != 0) {
- leaveText();
- openItem("accent");
- m_output
- .addFieldQuotedString("accent", accent)
- .addFieldQuotedChar("letter", sy->letter());
- closeItem();
- }
-}
-
-void PerlModDocVisitor::visit(DocURL *u)
-{
- openItem("url");
- m_output.addFieldQuotedString("content", u->url());
- closeItem();
-}
-
-void PerlModDocVisitor::visit(DocLineBreak *) { singleItem("linebreak"); }
-void PerlModDocVisitor::visit(DocHorRuler *) { singleItem("hruler"); }
-
-void PerlModDocVisitor::visit(DocStyleChange *s)
-{
- const char *style = 0;
- switch (s->style())
- {
- case DocStyleChange::Bold: style = "bold"; break;
- case DocStyleChange::Italic: style = "italic"; break;
- case DocStyleChange::Code: style = "code"; break;
- case DocStyleChange::Subscript: style = "subscript"; break;
- case DocStyleChange::Superscript: style = "superscript"; break;
- case DocStyleChange::Center: style = "center"; break;
- case DocStyleChange::Small: style = "small"; break;
- 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)
- .addFieldBoolean("enable", s->enable());
- closeItem();
-}
-
-void PerlModDocVisitor::visit(DocVerbatim *s)
-{
- const char *type = 0;
- switch(s->type())
- {
- case DocVerbatim::Code:
-#if 0
- m_output.add("<programlisting>");
- parseCode(m_ci,s->context(),s->text(),FALSE,0);
- m_output.add("</programlisting>");
-#endif
- return;
- case DocVerbatim::Verbatim: type = "preformatted"; break;
- case DocVerbatim::HtmlOnly: type = "htmlonly"; break;
- case DocVerbatim::ManOnly: type = "manonly"; break;
- case DocVerbatim::LatexOnly: type = "latexonly"; break;
- case DocVerbatim::XmlOnly: type = "xmlonly"; break;
- case DocVerbatim::Dot: type = "dot"; break;
- }
- openItem(type);
- m_output.addFieldQuotedString("content", s->text());
- closeItem();
-}
-
-void PerlModDocVisitor::visit(DocAnchor *anc)
-{
- QString anchor = anc->file() + "_1" + anc->anchor();
- openItem("anchor");
- m_output.addFieldQuotedString("id", anchor);
- closeItem();
-}
-
-void PerlModDocVisitor::visit(DocInclude *inc)
-{
- const char *type = 0;
- switch(inc->type())
- {
- 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>";
- }
- break;
- #endif
- return;
- case DocInclude::Include:
-#if 0
- m_output.add("<programlisting>");
- parseCode(m_ci,inc->context(),inc->text(),FALSE,0);
- m_output.add("</programlisting>");
-#endif
- return;
- case DocInclude::DontInclude: return;
- case DocInclude::HtmlInclude: type = "htmlonly"; break;
- case DocInclude::VerbInclude: type = "preformatted"; break;
- }
- openItem(type);
- m_output.addFieldQuotedString("content", inc->text());
- closeItem();
-}
-
-void PerlModDocVisitor::visit(DocIncOperator *)
-{
-#if 0
- //printf("DocIncOperator: type=%d first=%d, last=%d text=`%s'\n",
- // op->type(),op->isFirst(),op->isLast(),op->text().data());
- if (op->isFirst())
- {
- m_output.add("<programlisting>");
- }
- if (op->type()!=DocIncOperator::Skip)
- {
- parseCode(m_ci,op->context(),op->text(),FALSE,0);
- }
- if (op->isLast())
- {
- m_output.add("</programlisting>");
- }
- else
- {
- m_output.add('\n');
- }
-#endif
-}
-
-void PerlModDocVisitor::visit(DocFormula *f)
-{
- openItem("formula");
- QString id;
- id += f->id();
- m_output.addFieldQuotedString("id", id).addFieldQuotedString("content", f->text());
- closeItem();
-}
-
-void PerlModDocVisitor::visit(DocIndexEntry *)
-{
-#if 0
- m_output.add("<indexentry>"
- "<primaryie>");
- m_output.addQuoted(ie->entry());
- m_output.add("</primaryie>"
- "<secondaryie></secondaryie>"
- "</indexentry>");
-#endif
-}
-
-//--------------------------------------
-// visitor functions for compound nodes
-//--------------------------------------
-
-void PerlModDocVisitor::visitPre(DocAutoList *l)
-{
- openItem("list");
- m_output.addFieldQuotedString("style", l->isEnumList() ? "ordered" : "itemized");
- openSubBlock("content");
-}
-
-void PerlModDocVisitor::visitPost(DocAutoList *)
-{
- closeSubBlock();
- closeItem();
-}
-
-void PerlModDocVisitor::visitPre(DocAutoListItem *)
-{
- openSubBlock();
-}
-
-void PerlModDocVisitor::visitPost(DocAutoListItem *)
-{
- closeSubBlock();
-}
-
-void PerlModDocVisitor::visitPre(DocPara *)
-{
- if (m_textblockstart)
- m_textblockstart = false;
- else
- singleItem("parbreak");
- /*
- openItem("para");
- openSubBlock("content");
- */
-}
-
-void PerlModDocVisitor::visitPost(DocPara *)
-{
- /*
- closeSubBlock();
- closeItem();
- */
-}
-
-void PerlModDocVisitor::visitPre(DocRoot *)
-{
-}
-
-void PerlModDocVisitor::visitPost(DocRoot *)
-{
-}
-
-void PerlModDocVisitor::visitPre(DocSimpleSect *s)
-{
- const char *type = 0;
- switch (s->type())
- {
- case DocSimpleSect::See: type = "see"; break;
- case DocSimpleSect::Return: type = "return"; break;
- case DocSimpleSect::Author: type = "author"; break;
- case DocSimpleSect::Authors: type = "authors"; break;
- case DocSimpleSect::Version: type = "version"; break;
- case DocSimpleSect::Since: type = "since"; break;
- case DocSimpleSect::Date: type = "date"; break;
- case DocSimpleSect::Note: type = "bug"; break;
- case DocSimpleSect::Warning: type = "warning"; break;
- case DocSimpleSect::Pre: type = "pre"; break;
- case DocSimpleSect::Post: type = "post"; break;
- case DocSimpleSect::Invar: type = "invariant"; break;
- case DocSimpleSect::Remark: type = "remark"; break;
- case DocSimpleSect::Attention: type = "attention"; break;
- case DocSimpleSect::User: type = "par"; break;
- case DocSimpleSect::Rcs: type = "rcs"; break;
- case DocSimpleSect::Unknown:
- err("Error: unknown simple section found\n");
- break;
- }
- openOther();
- openSubBlock(type);
-}
-
-void PerlModDocVisitor::visitPost(DocSimpleSect *)
-{
- closeSubBlock();
- closeOther();
-}
-
-void PerlModDocVisitor::visitPre(DocTitle *)
-{
- openItem("title");
- openSubBlock("content");
-}
-
-void PerlModDocVisitor::visitPost(DocTitle *)
-{
- closeSubBlock();
- closeItem();
-}
-
-void PerlModDocVisitor::visitPre(DocSimpleList *)
-{
- openItem("list");
- m_output.addFieldQuotedString("style", "itemized");
- openSubBlock("content");
-}
-
-void PerlModDocVisitor::visitPost(DocSimpleList *)
-{
- closeSubBlock();
- closeItem();
-}
-
-void PerlModDocVisitor::visitPre(DocSimpleListItem *) { openSubBlock(); }
-void PerlModDocVisitor::visitPost(DocSimpleListItem *) { closeSubBlock(); }
-
-void PerlModDocVisitor::visitPre(DocSection *s)
-{
- QString sect = QString("sect%1").arg(s->level());
- openItem(sect);
- openSubBlock("content");
-}
-
-void PerlModDocVisitor::visitPost(DocSection *)
-{
- closeSubBlock();
- closeItem();
-}
-
-void PerlModDocVisitor::visitPre(DocHtmlList *l)
-{
- openItem("list");
- m_output.addFieldQuotedString("style", (l->type() == DocHtmlList::Ordered) ? "ordered" : "itemized");
- openSubBlock("content");
-}
-
-void PerlModDocVisitor::visitPost(DocHtmlList *)
-{
- closeSubBlock();
- closeItem();
-}
-
-void PerlModDocVisitor::visitPre(DocHtmlListItem *) { openSubBlock(); }
-void PerlModDocVisitor::visitPost(DocHtmlListItem *) { closeSubBlock(); }
-
-//void PerlModDocVisitor::visitPre(DocHtmlPre *)
-//{
-// openItem("preformatted");
-// openSubBlock("content");
-// //m_insidePre=TRUE;
-//}
-
-//void PerlModDocVisitor::visitPost(DocHtmlPre *)
-//{
-// //m_insidePre=FALSE;
-// closeSubBlock();
-// closeItem();
-//}
-
-void PerlModDocVisitor::visitPre(DocHtmlDescList *)
-{
-#if 0
- m_output.add("<variablelist>\n");
-#endif
-}
-
-void PerlModDocVisitor::visitPost(DocHtmlDescList *)
-{
-#if 0
- m_output.add("</variablelist>\n");
-#endif
-}
-
-void PerlModDocVisitor::visitPre(DocHtmlDescTitle *)
-{
-#if 0
- m_output.add("<varlistentry><term>");
-#endif
-}
-
-void PerlModDocVisitor::visitPost(DocHtmlDescTitle *)
-{
-#if 0
- m_output.add("</term></varlistentry>\n");
-#endif
-}
-
-void PerlModDocVisitor::visitPre(DocHtmlDescData *)
-{
-#if 0
- m_output.add("<listitem>");
-#endif
-}
-
-void PerlModDocVisitor::visitPost(DocHtmlDescData *)
-{
-#if 0
- m_output.add("</listitem>\n");
-#endif
-}
-
-void PerlModDocVisitor::visitPre(DocHtmlTable *)
-{
-#if 0
- m_output.add("<table rows=\""); m_output.add(t->numRows());
- m_output.add("\" cols=\""); m_output.add(t->numCols()); m_output.add("\">");
-#endif
-}
-
-void PerlModDocVisitor::visitPost(DocHtmlTable *)
-{
-#if 0
- m_output.add("</table>\n");
-#endif
-}
-
-void PerlModDocVisitor::visitPre(DocHtmlRow *)
-{
-#if 0
- m_output.add("<row>\n");
-#endif
-}
-
-void PerlModDocVisitor::visitPost(DocHtmlRow *)
-{
-#if 0
- m_output.add("</row>\n");
-#endif
-}
-
-void PerlModDocVisitor::visitPre(DocHtmlCell *)
-{
-#if 0
- if (c->isHeading()) m_output.add("<entry thead=\"yes\">"); else m_output.add("<entry thead=\"no\">");
-#endif
-}
-
-void PerlModDocVisitor::visitPost(DocHtmlCell *)
-{
-#if 0
- m_output.add("</entry>");
-#endif
-}
-
-void PerlModDocVisitor::visitPre(DocHtmlCaption *)
-{
-#if 0
- m_output.add("<caption>");
-#endif
-}
-
-void PerlModDocVisitor::visitPost(DocHtmlCaption *)
-{
-#if 0
- m_output.add("</caption>\n");
-#endif
-}
-
-void PerlModDocVisitor::visitPre(DocInternal *)
-{
-#if 0
- m_output.add("<internal>");
-#endif
-}
-
-void PerlModDocVisitor::visitPost(DocInternal *)
-{
-#if 0
- m_output.add("</internal>");
-#endif
-}
-
-void PerlModDocVisitor::visitPre(DocHRef *)
-{
-#if 0
- m_output.add("<ulink url=\""); m_output.add(href->url()); m_output.add("\">");
-#endif
-}
-
-void PerlModDocVisitor::visitPost(DocHRef *)
-{
-#if 0
- m_output.add("</ulink>");
-#endif
-}
-
-void PerlModDocVisitor::visitPre(DocHtmlHeader *)
-{
-#if 0
- m_output.add("<sect"); m_output.add(header->level()); m_output.add(">");
-#endif
-}
-
-void PerlModDocVisitor::visitPost(DocHtmlHeader *)
-{
-#if 0
- m_output.add("</sect"); m_output.add(header->level()); m_output.add(">\n");
-#endif
-}
-
-void PerlModDocVisitor::visitPre(DocImage *)
-{
-#if 0
- m_output.add("<image type=\"");
- switch(img->type())
- {
- case DocImage::Html: m_output.add("html"); break;
- case DocImage::Latex: m_output.add("latex"); break;
- 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)
- {
- baseName=baseName.right(baseName.length()-i-1);
- }
- m_output.add(" name=\""); m_output.add(baseName); m_output.add("\"");
- if (!img->width().isEmpty())
- {
- m_output.add(" width=\"");
- m_output.addQuoted(img->width());
- m_output.add("\"");
- }
- else if (!img->height().isEmpty())
- {
- m_output.add(" height=\"");
- m_output.addQuoted(img->height());
- m_output.add("\"");
- }
- m_output.add(">");
-#endif
-}
-
-void PerlModDocVisitor::visitPost(DocImage *)
-{
-#if 0
- m_output.add("</image>");
-#endif
-}
-
-void PerlModDocVisitor::visitPre(DocDotFile *)
-{
-#if 0
- m_output.add("<dotfile name=\""); m_output.add(df->file()); m_output.add("\">");
-#endif
-}
-
-void PerlModDocVisitor::visitPost(DocDotFile *)
-{
-#if 0
- m_output.add("</dotfile>");
-#endif
-}
-
-void PerlModDocVisitor::visitPre(DocLink *lnk)
-{
- openItem("link");
- addLink(lnk->ref(), lnk->file(), lnk->anchor());
-}
-
-void PerlModDocVisitor::visitPost(DocLink *)
-{
- closeItem();
-}
-
-void PerlModDocVisitor::visitPre(DocRef *ref)
-{
- openItem("ref");
- if (!ref->hasLinkText())
- m_output.addFieldQuotedString("text", ref->targetTitle());
- openSubBlock("content");
-}
-
-void PerlModDocVisitor::visitPost(DocRef *)
-{
- closeSubBlock();
- closeItem();
-}
-
-void PerlModDocVisitor::visitPre(DocSecRefItem *)
-{
-#if 0
- m_output.add("<tocitem id=\""); m_output.add(ref->file()); m_output.add("_1"); m_output.add(ref->anchor()); m_output.add("\">");
-#endif
-}
-
-void PerlModDocVisitor::visitPost(DocSecRefItem *)
-{
-#if 0
- m_output.add("</tocitem>");
-#endif
-}
-
-void PerlModDocVisitor::visitPre(DocSecRefList *)
-{
-#if 0
- m_output.add("<toclist>");
-#endif
-}
-
-void PerlModDocVisitor::visitPost(DocSecRefList *)
-{
-#if 0
- m_output.add("</toclist>");
-#endif
-}
-
-//void PerlModDocVisitor::visitPre(DocLanguage *l)
-//{
-// openItem("language");
-// m_output.addFieldQuotedString("id", l->id());
-//}
-//
-//void PerlModDocVisitor::visitPost(DocLanguage *)
-//{
-// closeItem();
-//}
-
-void PerlModDocVisitor::visitPre(DocParamSect *s)
-{
- leaveText();
- const char *type = 0;
- switch(s->type())
- {
- case DocParamSect::Param: type = "params"; break;
- case DocParamSect::RetVal: type = "retvals"; break;
- case DocParamSect::Exception: type = "exceptions"; break;
- case DocParamSect::Unknown:
- err("Error: unknown parameter section found\n");
- break;
- }
- openOther();
- openSubBlock(type);
-}
-
-void PerlModDocVisitor::visitPost(DocParamSect *)
-{
- closeSubBlock();
- closeOther();
-}
-
-void PerlModDocVisitor::visitPre(DocParamList *pl)
-{
- leaveText();
- m_output.openHash()
- .openList("parameters");
- //QStrListIterator li(pl->parameters());
- //const char *s;
- QListIterator<DocNode> li(pl->parameters());
- DocNode *param;
- for (li.toFirst();(param=li.current());++li)
- {
- QCString s;
- if (param->kind()==DocNode::Kind_Word)
- {
- s = ((DocWord*)param)->word();
- }
- else if (param->kind()==DocNode::Kind_LinkedWord)
- {
- s = ((DocLinkedWord*)param)->word();
- }
- m_output.openHash()
- .addFieldQuotedString("name", s)
- .closeHash();
- }
- m_output.closeList()
- .openList("doc");
-}
-
-void PerlModDocVisitor::visitPost(DocParamList *)
-{
- leaveText();
- m_output.closeList()
- .closeHash();
-}
-
-void PerlModDocVisitor::visitPre(DocXRefItem *)
-{
-#if 0
- m_output.add("<xrefsect id=\"");
- m_output.add(x->file()); m_output.add("_1"); m_output.add(x->anchor());
- m_output.add("\">");
- m_output.add("<xreftitle>");
- m_output.addQuoted(x->title());
- m_output.add("</xreftitle>");
- m_output.add("<xrefdescription>");
-#endif
- openItem("xrefitem");
- openSubBlock("content");
-}
-
-void PerlModDocVisitor::visitPost(DocXRefItem *)
-{
- closeSubBlock();
- closeItem();
-#if 0
- m_output.add("</xrefdescription>");
- m_output.add("</xrefsect>");
-#endif
-}
-
-void PerlModDocVisitor::visitPre(DocInternalRef *ref)
-{
- openItem("ref");
- addLink(0,ref->file(),ref->anchor());
- openSubBlock("content");
-}
-
-void PerlModDocVisitor::visitPost(DocInternalRef *)
-{
- closeSubBlock();
- closeItem();
-}
-
-void PerlModDocVisitor::visitPre(DocCopy *)
-{
-}
-
-void PerlModDocVisitor::visitPost(DocCopy *)
-{
-}
-
-void PerlModDocVisitor::visitPre(DocText *)
-{
-}
-
-void PerlModDocVisitor::visitPost(DocText *)
-{
-}
-
-static void addTemplateArgumentList(ArgumentList *al,PerlModOutput &output,const char *)
-{
- QCString indentStr;
- if (!al)
- return;
- output.openList("template_parameters");
- ArgumentListIterator ali(*al);
- Argument *a;
- for (ali.toFirst();(a=ali.current());++ali)
- {
- output.openHash();
- if (!a->type.isEmpty())
- output.addFieldQuotedString("type", a->type);
- if (!a->name.isEmpty())
- output.addFieldQuotedString("declaration_name", a->name)
- .addFieldQuotedString("definition_name", a->name);
- if (!a->defval.isEmpty())
- output.addFieldQuotedString("default", a->defval);
- output.closeHash();
- }
- 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(ClassDef *cd,PerlModOutput &output)
-{
- addTemplateArgumentList(cd->templateArguments(),output,cd->name());
-}
-
-static void addPerlModDocBlock(PerlModOutput &output,
- const char *name,
- const QCString &fileName,
- int lineNr,
- Definition *scope,
- MemberDef *md,
- const QCString &text)
-{
- QCString stext = text.stripWhiteSpace();
- if (stext.isEmpty())
- output.addField(name).add("{}");
- else {
- DocNode *root = validatingParseDoc(fileName,lineNr,scope,md,stext,FALSE,0);
- output.openHash(name);
- PerlModDocVisitor *visitor = new PerlModDocVisitor(output);
- root->accept(visitor);
- visitor->finish();
- output.closeHash();
- delete visitor;
- delete root;
- }
-}
-
-static const char *getProtectionName(Protection prot)
-{
- switch (prot)
- {
- case Public: return "public";
- case Protected: return "protected";
- case Private: return "private";
- case Package: return "package";
- }
- return 0;
-}
-
-static const char *getVirtualnessName(Specifier virt)
-{
- switch(virt)
- {
- case Normal: return "non_virtual";
- case Virtual: return "virtual";
- case Pure: return "pure_virtual";
- }
- return 0;
-}
-
-static QString pathDoxyfile;
-static QString pathDoxyExec;
-
-void setPerlModDoxyfile(const QString &qs)
-{
- pathDoxyfile = qs;
- pathDoxyExec = QDir::currentDirPath();
-}
-
-class PerlModGenerator
-{
-public:
-
- PerlModOutput m_output;
-
- QString pathDoxyStructurePM;
- QString pathDoxyDocsTex;
- QString pathDoxyFormatTex;
- QString pathDoxyLatexTex;
- QString pathDoxyLatexDVI;
- QString pathDoxyLatexPDF;
- QString pathDoxyStructureTex;
- QString pathDoxyDocsPM;
- QString pathDoxyLatexPL;
- QString pathDoxyLatexStructurePL;
- QString pathDoxyRules;
- QString pathMakefile;
-
- inline PerlModGenerator(bool pretty) : m_output(pretty) { }
-
- void generatePerlModForMember(MemberDef *md, Definition *);
- void generatePerlModSection(Definition *d, MemberList *ml,
- const char *name, const char *header=0);
- void addListOfAllMembers(ClassDef *cd);
- void generatePerlModForClass(ClassDef *cd);
- void generatePerlModForNamespace(NamespaceDef *nd);
- void generatePerlModForFile(FileDef *fd);
- void generatePerlModForGroup(GroupDef *gd);
- void generatePerlModForPage(PageDef *pi);
-
- bool createOutputFile(QFile &f, const char *s);
- bool createOutputDir(QDir &perlModDir);
- bool generateDoxyLatexTex();
- bool generateDoxyFormatTex();
- bool generateDoxyStructurePM();
- bool generateDoxyLatexPL();
- bool generateDoxyLatexStructurePL();
- bool generateDoxyRules();
- bool generateMakefile();
- bool generatePerlModOutput();
-
- void generate();
-};
-
-void PerlModGenerator::generatePerlModForMember(MemberDef *md,Definition *)
-{
- // + declaration/definition arg lists
- // + reimplements
- // + reimplementedBy
- // + exceptions
- // + const/volatile specifiers
- // - examples
- // - source definition
- // - source references
- // - source referenced by
- // - body code
- // - template arguments
- // (templateArguments(), definitionTemplateParameterLists())
-
- QCString memType;
- bool isFunc=FALSE;
- switch (md->memberType())
- {
- case MemberDef::Define: memType="define"; break;
- case MemberDef::EnumValue: ASSERT(0); break;
- case MemberDef::Property: memType="property"; break;
- case MemberDef::Variable: memType="variable"; break;
- case MemberDef::Typedef: memType="typedef"; break;
- case MemberDef::Enumeration: memType="enum"; break;
- case MemberDef::Function: memType="function"; isFunc=TRUE; break;
- case MemberDef::Signal: memType="signal"; isFunc=TRUE; break;
- case MemberDef::Prototype: memType="prototype"; isFunc=TRUE; break;
- case MemberDef::Friend: memType="friend"; isFunc=TRUE; break;
- case MemberDef::DCOP: memType="dcop"; isFunc=TRUE; break;
- case MemberDef::Slot: memType="slot"; isFunc=TRUE; break;
- case MemberDef::Event: memType="event"; break;
- }
-
- m_output.openHash()
- .addFieldQuotedString("kind", memType)
- .addFieldQuotedString("name", md->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()!=MemberDef::Define &&
- md->memberType()!=MemberDef::Enumeration)
- m_output.addFieldQuotedString("type", md->typeString());
-
- if (isFunc) //function
- {
- ArgumentList *al = md->argumentList();
- m_output.addFieldBoolean("const", al && al->constSpecifier)
- .addFieldBoolean("volatile", al && al->volatileSpecifier);
-
- m_output.openList("parameters");
- ArgumentList *declAl = md->declArgumentList();
- ArgumentList *defAl = md->argumentList();
- if (declAl && declAl->count()>0)
- {
- ArgumentListIterator declAli(*declAl);
- ArgumentListIterator defAli(*defAl);
- Argument *a;
- for (declAli.toFirst();(a=declAli.current());++declAli)
- {
- Argument *defArg = defAli.current();
- m_output.openHash();
-
- if (!a->name.isEmpty())
- m_output.addFieldQuotedString("declaration_name", a->name);
-
- if (defArg && !defArg->name.isEmpty() && defArg->name!=a->name)
- m_output.addFieldQuotedString("definition_name", defArg->name);
-
- if (!a->type.isEmpty())
- m_output.addFieldQuotedString("type", a->type);
-
- if (!a->array.isEmpty())
- m_output.addFieldQuotedString("array", a->array);
-
- if (!a->defval.isEmpty())
- m_output.addFieldQuotedString("default_value", a->defval);
-
- if (!a->attrib.isEmpty())
- m_output.addFieldQuotedString("attributes", a->attrib);
-
- m_output.closeHash();
- if (defArg) ++defAli;
- }
- }
- m_output.closeList();
- }
- else if (md->memberType()==MemberDef::Define &&
- md->argsString()!=0) // define
- {
- m_output.openList("parameters");
- ArgumentListIterator ali(*md->argumentList());
- Argument *a;
- for (ali.toFirst();(a=ali.current());++ali)
- {
- m_output.openHash()
- .addFieldQuotedString("name", a->type)
- .closeHash();
- }
- m_output.closeList();
- }
- if (!md->initializer().isEmpty())
- m_output.addFieldQuotedString("initializer", md->initializer());
-
- if (md->excpString())
- m_output.addFieldQuotedString("exceptions", md->excpString());
-
- if (md->memberType()==MemberDef::Enumeration) // enum
- {
- if (md->enumFieldList())
- {
- m_output.openList("values");
- MemberListIterator emli(*md->enumFieldList());
- MemberDef *emd;
- for (emli.toFirst();(emd=emli.current());++emli)
- {
- m_output.openHash()
- .addFieldQuotedString("name", emd->name());
-
- if (!emd->initializer().isEmpty())
- m_output.addFieldQuotedString("initializer", emd->initializer());
-
- addPerlModDocBlock(m_output,"brief",emd->getDefFileName(),emd->getDefLine(),emd->getOuterScope(),emd,emd->briefDescription());
-
- addPerlModDocBlock(m_output,"detailed",emd->getDefFileName(),emd->getDefLine(),emd->getOuterScope(),emd,emd->documentation());
-
- m_output.closeHash();
- }
- m_output.closeList();
- }
- }
-
- MemberDef *rmd = md->reimplements();
- if (rmd)
- m_output.openHash("reimplements")
- .addFieldQuotedString("name", rmd->name())
- .closeHash();
-
- MemberList *rbml = md->reimplementedBy();
- if (rbml)
- {
- MemberListIterator mli(*rbml);
- m_output.openList("reimplemented_by");
- for (mli.toFirst();(rmd=mli.current());++mli)
- m_output.openHash()
- .addFieldQuotedString("name", rmd->name())
- .closeHash();
- m_output.closeList();
- }
-
- m_output.closeHash();
-}
-
-void PerlModGenerator::generatePerlModSection(Definition *d,
- MemberList *ml,const char *name,const char *header)
-{
- if (ml->count()==0) return; // empty list
-
- m_output.openHash(name);
-
- if (header)
- m_output.addFieldQuotedString("header", header);
-
- m_output.openList("members");
- MemberListIterator mli(*ml);
- MemberDef *md;
- for (mli.toFirst();(md=mli.current());++mli)
- {
- generatePerlModForMember(md,d);
- }
- m_output.closeList()
- .closeHash();
-}
-
-void PerlModGenerator::addListOfAllMembers(ClassDef *cd)
-{
- m_output.openList("all_members");
- MemberNameInfoSDict::Iterator mnii(*cd->memberNameInfoSDict());
- MemberNameInfo *mni;
- for (mnii.toFirst();(mni=mnii.current());++mnii)
- {
- MemberNameInfoIterator mii(*mni);
- MemberInfo *mi;
- for (mii.toFirst();(mi=mii.current());++mii)
- {
- MemberDef *md=mi->memberDef;
- ClassDef *cd=md->getClassDef();
- Definition *d=md->getGroupDef();
- if (d==0) d = cd;
-
- 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);
-
- m_output.addFieldQuotedString("scope", cd->name())
- .closeHash();
- }
- }
- m_output.closeList();
-}
-
-void PerlModGenerator::generatePerlModForClass(ClassDef *cd)
-{
- // + brief description
- // + detailed description
- // + template argument list(s)
- // - include file
- // + member groups
- // + inheritance diagram
- // + list of direct super classes
- // + list of direct sub classes
- // + list of inner classes
- // + collaboration diagram
- // + list of all members
- // + user defined member sections
- // + standard member sections
- // + detailed member documentation
- // - examples using the class
-
- if (cd->isReference()) return; // skip external references.
- if (cd->name().find('@')!=-1) return; // skip anonymous compounds.
- if (cd->templateMaster()!=0) return; // skip generated template instances.
-
- m_output.openHash()
- .addFieldQuotedString("name", cd->name());
-
- if (cd->baseClasses()->count()>0)
- {
- m_output.openList("base");
- BaseClassListIterator bcli(*cd->baseClasses());
- BaseClassDef *bcd;
- for (bcli.toFirst();(bcd=bcli.current());++bcli)
- m_output.openHash()
- .addFieldQuotedString("name", bcd->classDef->displayName())
- .addFieldQuotedString("virtualness", getVirtualnessName(bcd->virt))
- .addFieldQuotedString("protection", getProtectionName(bcd->prot))
- .closeHash();
- m_output.closeList();
- }
-
- if (cd->subClasses()->count()>0)
- {
- m_output.openList("derived");
- BaseClassListIterator bcli(*cd->baseClasses());
- BaseClassDef *bcd;
- for (bcli.toFirst();(bcd=bcli.current());++bcli)
- m_output.openHash()
- .addFieldQuotedString("name", bcd->classDef->displayName())
- .addFieldQuotedString("virtualness", getVirtualnessName(bcd->virt))
- .addFieldQuotedString("protection", getProtectionName(bcd->prot))
- .closeHash();
- m_output.closeList();
- }
-
- ClassSDict *cl = cd->getInnerClasses();
- if (cl)
- {
- m_output.openList("inner");
- ClassSDict::Iterator cli(*cl);
- ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
- m_output.openHash()
- .addFieldQuotedString("name", cd->name())
- .closeHash();
- m_output.closeList();
- }
-
- IncludeInfo *ii=cd->includeInfo();
- if (ii)
- {
- QCString nm = ii->includeName;
- if (nm.isEmpty() && ii->fileDef) nm = ii->fileDef->docName();
- if (!nm.isEmpty())
- {
- m_output.openHash("includes");
-#if 0
- if (ii->fileDef && !ii->fileDef->isReference()) // TODO: support external references
- t << " id=\"" << ii->fileDef->getOutputFileBase() << "\"";
-#endif
- m_output.addFieldBoolean("local", ii->local)
- .addFieldQuotedString("name", nm)
- .closeHash();
- }
- }
-
- addTemplateList(cd,m_output);
- addListOfAllMembers(cd);
- MemberGroupSDict::Iterator mgli(*cd->memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- generatePerlModSection(cd,mg->members(),"user_defined",mg->header());
-
- generatePerlModSection(cd,&cd->pubTypes,"public_typedefs");
- generatePerlModSection(cd,&cd->pubMethods,"public_methods");
- generatePerlModSection(cd,&cd->pubAttribs,"public_members");
- generatePerlModSection(cd,&cd->pubSlots,"public_slots");
- generatePerlModSection(cd,&cd->signals,"signals");
- generatePerlModSection(cd,&cd->dcopMethods,"dcop_methods");
- generatePerlModSection(cd,&cd->properties,"properties");
- generatePerlModSection(cd,&cd->pubStaticMethods,"public_static_methods");
- generatePerlModSection(cd,&cd->pubStaticAttribs,"public_static_members");
- generatePerlModSection(cd,&cd->proTypes,"protected_typedefs");
- generatePerlModSection(cd,&cd->proMethods,"protected_methods");
- generatePerlModSection(cd,&cd->proAttribs,"protected_members");
- generatePerlModSection(cd,&cd->proSlots,"protected_slots");
- generatePerlModSection(cd,&cd->proStaticMethods,"protected_static_methods");
- generatePerlModSection(cd,&cd->proStaticAttribs,"protected_static_members");
- generatePerlModSection(cd,&cd->priTypes,"private_typedefs");
- generatePerlModSection(cd,&cd->priMethods,"private_methods");
- generatePerlModSection(cd,&cd->priAttribs,"private_members");
- generatePerlModSection(cd,&cd->priSlots,"private_slots");
- generatePerlModSection(cd,&cd->priStaticMethods,"private_static_methods");
- generatePerlModSection(cd,&cd->priStaticAttribs,"private_static_members");
- generatePerlModSection(cd,&cd->friends,"friend_methods");
- generatePerlModSection(cd,&cd->related,"related_methods");
-
- addPerlModDocBlock(m_output,"brief",cd->getDefFileName(),cd->getDefLine(),cd,0,cd->briefDescription());
- addPerlModDocBlock(m_output,"detailed",cd->getDefFileName(),cd->getDefLine(),cd,0,cd->documentation());
-
-#if 0
- DotClassGraph inheritanceGraph(cd,DotClassGraph::Inheritance);
- if (!inheritanceGraph.isTrivial())
- {
- t << " <inheritancegraph>" << endl;
- inheritanceGraph.writePerlMod(t);
- t << " </inheritancegraph>" << endl;
- }
- DotClassGraph collaborationGraph(cd,DotClassGraph::Implementation);
- if (!collaborationGraph.isTrivial())
- {
- t << " <collaborationgraph>" << endl;
- collaborationGraph.writePerlMod(t);
- t << " </collaborationgraph>" << endl;
- }
- t << " <location file=\""
- << cd->getDefFileName() << "\" line=\""
- << cd->getDefLine() << "\"";
- if (cd->getStartBodyLine()!=-1)
- {
- t << " bodystart=\"" << cd->getStartBodyLine() << "\" bodyend=\""
- << cd->getEndBodyLine() << "\"";
- }
- t << "/>" << endl;
-#endif
-
- m_output.closeHash();
-}
-
-void PerlModGenerator::generatePerlModForNamespace(NamespaceDef *nd)
-{
- // + contained class definitions
- // + contained namespace definitions
- // + member groups
- // + normal members
- // + brief desc
- // + detailed desc
- // + location
- // - files containing (parts of) the namespace definition
-
- if (nd->isReference()) return; // skip external references
-
- m_output.openHash()
- .addFieldQuotedString("name", nd->name());
-
- ClassSDict *cl = nd->classSDict;
- if (cl)
- {
- m_output.openList("classes");
- ClassSDict::Iterator cli(*cl);
- ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
- m_output.openHash()
- .addFieldQuotedString("name", cd->name())
- .closeHash();
- m_output.closeList();
- }
-
- NamespaceSDict *nl = nd->namespaceSDict;
- if (nl)
- {
- m_output.openList("namespaces");
- NamespaceSDict::Iterator nli(*nl);
- NamespaceDef *nd;
- for (nli.toFirst();(nd=nli.current());++nli)
- m_output.openHash()
- .addFieldQuotedString("name", nd->name())
- .closeHash();
- m_output.closeList();
- }
-
- MemberGroupSDict::Iterator mgli(*nd->memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- generatePerlModSection(nd,mg->members(),"user-defined",mg->header());
-
- generatePerlModSection(nd,&nd->decDefineMembers,"defines");
- generatePerlModSection(nd,&nd->decProtoMembers,"prototypes");
- generatePerlModSection(nd,&nd->decTypedefMembers,"typedefs");
- generatePerlModSection(nd,&nd->decEnumMembers,"enums");
- generatePerlModSection(nd,&nd->decFuncMembers,"functions");
- generatePerlModSection(nd,&nd->decVarMembers,"variables");
-
- addPerlModDocBlock(m_output,"brief",nd->getDefFileName(),nd->getDefLine(),0,0,nd->briefDescription());
- addPerlModDocBlock(m_output,"detailed",nd->getDefFileName(),nd->getDefLine(),0,0,nd->documentation());
-
- m_output.closeHash();
-}
-
-void PerlModGenerator::generatePerlModForFile(FileDef *fd)
-{
- // + includes files
- // + includedby files
- // - include graph
- // - included by graph
- // - contained class definitions
- // - contained namespace definitions
- // - member groups
- // + normal members
- // + brief desc
- // + detailed desc
- // - source code
- // - location
- // - number of lines
-
- if (fd->isReference()) return;
-
- m_output.openHash()
- .addFieldQuotedString("name", fd->name());
-
- QListIterator<IncludeInfo> ili1(*fd->includeFileList());
- IncludeInfo *inc;
- m_output.openList("includes");
- for (ili1.toFirst();(inc=ili1.current());++ili1)
- {
- m_output.openHash()
- .addFieldQuotedString("name", inc->includeName);
- if (inc->fileDef && !inc->fileDef->isReference())
- {
- m_output.addFieldQuotedString("ref", inc->fileDef->getOutputFileBase());
- }
- m_output.closeHash();
- }
- m_output.closeList();
-
- QListIterator<IncludeInfo> ili2(*fd->includedByFileList());
- m_output.openList("included_by");
- for (ili2.toFirst();(inc=ili2.current());++ili2)
- {
- m_output.openHash()
- .addFieldQuotedString("name", inc->includeName);
- if (inc->fileDef && !inc->fileDef->isReference())
- {
- m_output.addFieldQuotedString("ref", inc->fileDef->getOutputFileBase());
- }
- m_output.closeHash();
- }
- m_output.closeList();
-
- generatePerlModSection(fd,&fd->decDefineMembers,"defines");
- generatePerlModSection(fd,&fd->decProtoMembers,"prototypes");
- generatePerlModSection(fd,&fd->decTypedefMembers,"typedefs");
- generatePerlModSection(fd,&fd->decEnumMembers,"enums");
- generatePerlModSection(fd,&fd->decFuncMembers,"functions");
- generatePerlModSection(fd,&fd->decVarMembers,"variables");
-
- addPerlModDocBlock(m_output,"brief",fd->getDefFileName(),fd->getDefLine(),0,0,fd->briefDescription());
- addPerlModDocBlock(m_output,"detailed",fd->getDefFileName(),fd->getDefLine(),0,0,fd->documentation());
-
- m_output.closeHash();
-}
-
-void PerlModGenerator::generatePerlModForGroup(GroupDef *gd)
-{
- // + members
- // + member groups
- // + files
- // + classes
- // + namespaces
- // - packages
- // + pages
- // + child groups
- // - examples
- // + brief description
- // + detailed description
-
- if (gd->isReference()) return; // skip external references
-
- m_output.openHash()
- .addFieldQuotedString("name", gd->name())
- .addFieldQuotedString("title", gd->groupTitle());
-
- FileList *fl = gd->getFiles();
- if (fl)
- {
- m_output.openList("files");
- QListIterator<FileDef> fli(*fl);
- FileDef *fd = fl->first();
- for (fli.toFirst();(fd=fli.current());++fli)
- m_output.openHash()
- .addFieldQuotedString("name", fd->name())
- .closeHash();
- m_output.closeList();
- }
-
- ClassSDict *cl = gd->getClasses();
- if (cl)
- {
- m_output.openList("classes");
- ClassSDict::Iterator cli(*cl);
- ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
- m_output.openHash()
- .addFieldQuotedString("name", cd->name())
- .closeHash();
- m_output.closeList();
- }
-
- NamespaceSDict *nl = gd->getNamespaces();
- if (nl)
- {
- m_output.openList("namespaces");
- NamespaceSDict::Iterator nli(*nl);
- NamespaceDef *nd;
- for (nli.toFirst();(nd=nli.current());++nli)
- m_output.openHash()
- .addFieldQuotedString("name", nd->name())
- .closeHash();
- m_output.closeList();
- }
-
- PageSDict *pl = gd->getPages();
- if (pl)
- {
- m_output.openList("pages");
- PageSDict::Iterator pli(*pl);
- PageDef *pd;
- for (pli.toFirst();(pd=pli.current());++pli)
- m_output.openHash()
- .addFieldQuotedString("title", pd->title())
- .closeHash();
- m_output.closeList();
- }
-
- GroupList *gl = gd->getSubGroups();
- if (gl)
- {
- m_output.openList("groups");
- GroupListIterator gli(*gl);
- GroupDef *sgd;
- for (gli.toFirst();(sgd=gli.current());++gli)
- m_output.openHash()
- .addFieldQuotedString("title", sgd->groupTitle())
- .closeHash();
- m_output.closeList();
- }
-
- MemberGroupSDict::Iterator mgli(*gd->memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- generatePerlModSection(gd,mg->members(),"user-defined",mg->header());
-
- generatePerlModSection(gd,&gd->decDefineMembers,"defines");
- generatePerlModSection(gd,&gd->decProtoMembers,"prototypes");
- generatePerlModSection(gd,&gd->decTypedefMembers,"typedefs");
- generatePerlModSection(gd,&gd->decEnumMembers,"enums");
- generatePerlModSection(gd,&gd->decFuncMembers,"functions");
- generatePerlModSection(gd,&gd->decVarMembers,"variables");
-
- addPerlModDocBlock(m_output,"brief",gd->getDefFileName(),gd->getDefLine(),0,0,gd->briefDescription());
- addPerlModDocBlock(m_output,"detailed",gd->getDefFileName(),gd->getDefLine(),0,0,gd->documentation());
-
- m_output.closeHash();
-}
-
-void PerlModGenerator::generatePerlModForPage(PageDef *pd)
-{
- // + name
- // + title
- // + documentation
-
- if (pd->isReference()) return;
-
- m_output.openHash()
- .addFieldQuotedString("name", pd->name());
-
- SectionInfo *si = Doxygen::sectionDict.find(pd->name());
- if (si)
- m_output.addFieldQuotedString("title", si->title);
-
- addPerlModDocBlock(m_output,"detailed",pd->docFile(),pd->docLine(),0,0,pd->documentation());
- m_output.closeHash();
-}
-
-bool PerlModGenerator::generatePerlModOutput()
-{
- QFile outputFile;
- if (!createOutputFile(outputFile, pathDoxyDocsPM))
- return false;
-
- QTextStream outputTextStream(&outputFile);
- PerlModOutputStream outputStream(&outputTextStream);
- m_output.setPerlModOutputStream(&outputStream);
- m_output.add("$doxydocs=").openHash();
-
- m_output.openList("classes");
- ClassSDict::Iterator cli(Doxygen::classSDict);
- ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
- generatePerlModForClass(cd);
- m_output.closeList();
-
- m_output.openList("namespaces");
- NamespaceSDict::Iterator nli(Doxygen::namespaceSDict);
- NamespaceDef *nd;
- for (nli.toFirst();(nd=nli.current());++nli)
- generatePerlModForNamespace(nd);
- m_output.closeList();
-
- m_output.openList("files");
- FileNameListIterator fnli(Doxygen::inputNameList);
- FileName *fn;
- for (;(fn=fnli.current());++fnli)
- {
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
- generatePerlModForFile(fd);
- }
- m_output.closeList();
-
- m_output.openList("groups");
- GroupSDict::Iterator gli(Doxygen::groupSDict);
- GroupDef *gd;
- for (;(gd=gli.current());++gli)
- {
- generatePerlModForGroup(gd);
- }
- m_output.closeList();
-
- m_output.openList("pages");
- PageSDict::Iterator pdi(*Doxygen::pageSDict);
- PageDef *pd=0;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
- {
- generatePerlModForPage(pd);
- }
- if (Doxygen::mainPage)
- {
- generatePerlModForPage(Doxygen::mainPage);
- }
- m_output.closeList();
-
- m_output.closeHash().add(";\n1;\n");
- return true;
-}
-
-bool PerlModGenerator::createOutputFile(QFile &f, const char *s)
-{
- f.setName(s);
- if (!f.open(IO_WriteOnly))
- {
- err("Cannot open file %s for writing!\n", s);
- return false;
- }
- return true;
-}
-
-bool PerlModGenerator::createOutputDir(QDir &perlModDir)
-{
- QCString outputDirectory = Config_getString("OUTPUT_DIRECTORY");
- if (outputDirectory.isEmpty())
- {
- outputDirectory=QDir::currentDirPath();
- }
- else
- {
- QDir dir(outputDirectory);
- if (!dir.exists())
- {
- dir.setPath(QDir::currentDirPath());
- if (!dir.mkdir(outputDirectory))
- {
- err("Error: tag OUTPUT_DIRECTORY: Output directory `%s' does not "
- "exist and cannot be created\n",outputDirectory.data());
- exit(1);
- }
- else if (!Config_getBool("QUIET"))
- {
- err("Notice: Output directory `%s' does not exist. "
- "I have created it for you.\n", outputDirectory.data());
- }
- dir.cd(outputDirectory);
- }
- outputDirectory=dir.absPath();
- }
-
- QDir dir(outputDirectory);
- if (!dir.exists())
- {
- dir.setPath(QDir::currentDirPath());
- if (!dir.mkdir(outputDirectory))
- {
- err("Cannot create directory %s\n",outputDirectory.data());
- return false;
- }
- }
-
- perlModDir.setPath(outputDirectory+"/perlmod");
- if (!perlModDir.exists() && !perlModDir.mkdir(outputDirectory+"/perlmod"))
- {
- err("Could not create perlmod directory in %s\n",outputDirectory.data());
- return false;
- }
- return true;
-}
-
-bool PerlModGenerator::generateDoxyStructurePM()
-{
- QFile doxyModelPM;
- if (!createOutputFile(doxyModelPM, pathDoxyStructurePM))
- return false;
-
- QTextStream doxyModelPMStream(&doxyModelPM);
- doxyModelPMStream <<
- "sub memberlist($) {\n"
- " my $prefix = $_[0];\n"
- " return\n"
- "\t[ \"hash\", $prefix . \"s\",\n"
- "\t {\n"
- "\t members =>\n"
- "\t [ \"list\", $prefix . \"List\",\n"
- "\t\t[ \"hash\", $prefix,\n"
- "\t\t {\n"
- "\t\t kind => [ \"string\", $prefix . \"Kind\" ],\n"
- "\t\t name => [ \"string\", $prefix . \"Name\" ],\n"
- "\t\t static => [ \"string\", $prefix . \"Static\" ],\n"
- "\t\t virtualness => [ \"string\", $prefix . \"Virtualness\" ],\n"
- "\t\t protection => [ \"string\", $prefix . \"Protection\" ],\n"
- "\t\t type => [ \"string\", $prefix . \"Type\" ],\n"
- "\t\t parameters =>\n"
- "\t\t [ \"list\", $prefix . \"Params\",\n"
- "\t\t\t[ \"hash\", $prefix . \"Param\",\n"
- "\t\t\t {\n"
- "\t\t\t declaration_name => [ \"string\", $prefix . \"ParamName\" ],\n"
- "\t\t\t type => [ \"string\", $prefix . \"ParamType\" ],\n"
- "\t\t\t },\n"
- "\t\t\t],\n"
- "\t\t ],\n"
- "\t\t detailed =>\n"
- "\t\t [ \"hash\", $prefix . \"Detailed\",\n"
- "\t\t\t{\n"
- "\t\t\t doc => [ \"doc\", $prefix . \"DetailedDoc\" ],\n"
- "\t\t\t return => [ \"doc\", $prefix . \"Return\" ],\n"
- "\t\t\t see => [ \"doc\", $prefix . \"See\" ],\n"
- "\t\t\t params =>\n"
- "\t\t\t [ \"list\", $prefix . \"PDBlocks\",\n"
- "\t\t\t [ \"hash\", $prefix . \"PDBlock\",\n"
- "\t\t\t\t{\n"
- "\t\t\t\t parameters =>\n"
- "\t\t\t\t [ \"list\", $prefix . \"PDParams\",\n"
- "\t\t\t\t [ \"hash\", $prefix . \"PDParam\",\n"
- "\t\t\t\t\t{\n"
- "\t\t\t\t\t name => [ \"string\", $prefix . \"PDParamName\" ],\n"
- "\t\t\t\t\t},\n"
- "\t\t\t\t ],\n"
- "\t\t\t\t ],\n"
- "\t\t\t\t doc => [ \"doc\", $prefix . \"PDDoc\" ],\n"
- "\t\t\t\t},\n"
- "\t\t\t ],\n"
- "\t\t\t ],\n"
- "\t\t\t},\n"
- "\t\t ],\n"
- "\t\t },\n"
- "\t\t],\n"
- "\t ],\n"
- "\t },\n"
- "\t];\n"
- "}\n"
- "\n"
- "$doxystructure =\n"
- " [ \"hash\", \"Root\",\n"
- " {\n"
- "\tfiles =>\n"
- "\t [ \"list\", \"Files\",\n"
- "\t [ \"hash\", \"File\",\n"
- "\t {\n"
- "\t\tname => [ \"string\", \"FileName\" ],\n"
- "\t\ttypedefs => memberlist(\"FileTypedef\"),\n"
- "\t\tvariables => memberlist(\"FileVariable\"),\n"
- "\t\tfunctions => memberlist(\"FileFunction\"),\n"
- "\t\tdetailed =>\n"
- "\t\t [ \"hash\", \"FileDetailed\",\n"
- "\t\t {\n"
- "\t\t doc => [ \"doc\", \"FileDetailedDoc\" ],\n"
- "\t\t },\n"
- "\t\t ],\n"
- "\t },\n"
- "\t ],\n"
- "\t ],\n"
- "\tpages =>\n"
- "\t [ \"list\", \"Pages\",\n"
- "\t [ \"hash\", \"Page\",\n"
- "\t {\n"
- "\t\tname => [ \"string\", \"PageName\" ],\n"
- "\t\tdetailed =>\n"
- "\t\t [ \"hash\", \"PageDetailed\",\n"
- "\t\t {\n"
- "\t\t doc => [ \"doc\", \"PageDetailedDoc\" ],\n"
- "\t\t },\n"
- "\t\t ],\n"
- "\t },\n"
- "\t ],\n"
- "\t ],\n"
- "\tclasses =>\n"
- "\t [ \"list\", \"Classes\",\n"
- "\t [ \"hash\", \"Class\",\n"
- "\t {\n"
- "\t\tname => [ \"string\", \"ClassName\" ],\n"
- "\t\tpublic_typedefs => memberlist(\"ClassPublicTypedef\"),\n"
- "\t\tpublic_methods => memberlist(\"ClassPublicMethod\"),\n"
- "\t\tpublic_members => memberlist(\"ClassPublicMember\"),\n"
- "\t\tprotected_typedefs => memberlist(\"ClassProtectedTypedef\"),\n"
- "\t\tprotected_methods => memberlist(\"ClassProtectedMethod\"),\n"
- "\t\tprotected_members => memberlist(\"ClassProtectedMember\"),\n"
- "\t\tprivate_typedefs => memberlist(\"ClassPrivateTypedef\"),\n"
- "\t\tprivate_methods => memberlist(\"ClassPrivateMethod\"),\n"
- "\t\tprivate_members => memberlist(\"ClassPrivateMember\"),\n"
- "\t\tdetailed =>\n"
- "\t\t [ \"hash\", \"ClassDetailed\",\n"
- "\t\t {\n"
- "\t\t doc => [ \"doc\", \"ClassDetailedDoc\" ],\n"
- " \t\t },\n"
- "\t\t ],\n"
- "\t },\n"
- "\t ],\n"
- "\t ],\n"
- " },\n"
- " ];\n"
- "\n"
- "1;\n";
-
- return true;
-}
-
-bool PerlModGenerator::generateDoxyRules()
-{
- QFile doxyRules;
- if (!createOutputFile(doxyRules, pathDoxyRules))
- return false;
-
- bool perlmodLatex = Config_getBool("PERLMOD_LATEX");
- QString prefix = Config_getString("PERLMOD_MAKEVAR_PREFIX");
-
- QTextStream doxyRulesStream(&doxyRules);
- doxyRulesStream <<
- prefix << "DOXY_EXEC_PATH = " << pathDoxyExec << "\n" <<
- prefix << "DOXYFILE = " << pathDoxyfile << "\n" <<
- prefix << "DOXYDOCS_PM = " << pathDoxyDocsPM << "\n" <<
- prefix << "DOXYSTRUCTURE_PM = " << pathDoxyStructurePM << "\n" <<
- prefix << "DOXYRULES = " << pathDoxyRules << "\n";
- if (perlmodLatex)
- doxyRulesStream <<
- prefix << "DOXYLATEX_PL = " << pathDoxyLatexPL << "\n" <<
- prefix << "DOXYLATEXSTRUCTURE_PL = " << pathDoxyLatexStructurePL << "\n" <<
- prefix << "DOXYSTRUCTURE_TEX = " << pathDoxyStructureTex << "\n" <<
- prefix << "DOXYDOCS_TEX = " << pathDoxyDocsTex << "\n" <<
- prefix << "DOXYFORMAT_TEX = " << pathDoxyFormatTex << "\n" <<
- prefix << "DOXYLATEX_TEX = " << pathDoxyLatexTex << "\n" <<
- prefix << "DOXYLATEX_DVI = " << pathDoxyLatexDVI << "\n" <<
- prefix << "DOXYLATEX_PDF = " << pathDoxyLatexPDF << "\n";
-
- doxyRulesStream <<
- "\n"
- ".PHONY: clean-perlmod\n"
- "clean-perlmod::\n"
- "\trm -f $(" << prefix << "DOXYSTRUCTURE_PM) \\\n"
- "\t$(" << prefix << "DOXYDOCS_PM)";
- if (perlmodLatex)
- doxyRulesStream <<
- " \\\n"
- "\t$(" << prefix << "DOXYLATEX_PL) \\\n"
- "\t$(" << prefix << "DOXYLATEXSTRUCTURE_PL) \\\n"
- "\t$(" << prefix << "DOXYDOCS_TEX) \\\n"
- "\t$(" << prefix << "DOXYSTRUCTURE_TEX) \\\n"
- "\t$(" << prefix << "DOXYFORMAT_TEX) \\\n"
- "\t$(" << prefix << "DOXYLATEX_TEX) \\\n"
- "\t$(" << prefix << "DOXYLATEX_PDF) \\\n"
- "\t$(" << prefix << "DOXYLATEX_DVI) \\\n"
- "\t$(addprefix $(" << prefix << "DOXYLATEX_TEX:tex=),out aux log)";
- doxyRulesStream << "\n\n";
-
- doxyRulesStream <<
- "$(" << prefix << "DOXYRULES) \\\n"
- "$(" << prefix << "DOXYMAKEFILE) \\\n"
- "$(" << prefix << "DOXYSTRUCTURE_PM) \\\n"
- "$(" << prefix << "DOXYDOCS_PM)";
- if (perlmodLatex) {
- doxyRulesStream <<
- " \\\n"
- "$(" << prefix << "DOXYLATEX_PL) \\\n"
- "$(" << prefix << "DOXYLATEXSTRUCTURE_PL) \\\n"
- "$(" << prefix << "DOXYFORMAT_TEX) \\\n"
- "$(" << prefix << "DOXYLATEX_TEX)";
- }
- doxyRulesStream <<
- ": \\\n"
- "\t$(" << prefix << "DOXYFILE)\n"
- "\tcd $(" << prefix << "DOXY_EXEC_PATH) ; doxygen \"$<\"\n";
-
- if (perlmodLatex) {
- doxyRulesStream <<
- "\n"
- "$(" << prefix << "DOXYDOCS_TEX): \\\n"
- "$(" << prefix << "DOXYLATEX_PL) \\\n"
- "$(" << prefix << "DOXYDOCS_PM)\n"
- "\tperl -I\"$(<D)\" \"$<\" >\"$@\"\n"
- "\n"
- "$(" << prefix << "DOXYSTRUCTURE_TEX): \\\n"
- "$(" << prefix << "DOXYLATEXSTRUCTURE_PL) \\\n"
- "$(" << prefix << "DOXYSTRUCTURE_PM)\n"
- "\tperl -I\"$(<D)\" \"$<\" >\"$@\"\n"
- "\n"
- "$(" << prefix << "DOXYLATEX_PDF) \\\n"
- "$(" << prefix << "DOXYLATEX_DVI): \\\n"
- "$(" << prefix << "DOXYLATEX_TEX) \\\n"
- "$(" << prefix << "DOXYFORMAT_TEX) \\\n"
- "$(" << prefix << "DOXYSTRUCTURE_TEX) \\\n"
- "$(" << prefix << "DOXYDOCS_TEX)\n"
- "\n"
- "$(" << prefix << "DOXYLATEX_PDF): \\\n"
- "$(" << prefix << "DOXYLATEX_TEX)\n"
- "\tpdflatex -interaction=nonstopmode \"$<\"\n"
- "\n"
- "$(" << prefix << "DOXYLATEX_DVI): \\\n"
- "$(" << prefix << "DOXYLATEX_TEX)\n"
- "\tlatex -interaction=nonstopmode \"$<\"\n";
- }
-
- return true;
-}
-
-bool PerlModGenerator::generateMakefile()
-{
- QFile makefile;
- if (!createOutputFile(makefile, pathMakefile))
- return false;
-
- bool perlmodLatex = Config_getBool("PERLMOD_LATEX");
- QString prefix = Config_getString("PERLMOD_MAKEVAR_PREFIX");
-
- QTextStream makefileStream(&makefile);
- makefileStream <<
- ".PHONY: default clean" << (perlmodLatex ? " pdf" : "") << "\n"
- "default: " << (perlmodLatex ? "pdf" : "clean") << "\n"
- "\n"
- "include " << pathDoxyRules << "\n"
- "\n"
- "clean: clean-perlmod\n";
-
- if (perlmodLatex) {
- makefileStream <<
- "pdf: $(" << prefix << "DOXYLATEX_PDF)\n"
- "dvi: $(" << prefix << "DOXYLATEX_DVI)\n";
- }
-
- return true;
-}
-
-bool PerlModGenerator::generateDoxyLatexStructurePL()
-{
- QFile doxyLatexStructurePL;
- if (!createOutputFile(doxyLatexStructurePL, pathDoxyLatexStructurePL))
- return false;
-
- QTextStream doxyLatexStructurePLStream(&doxyLatexStructurePL);
- doxyLatexStructurePLStream <<
- "use DoxyStructure;\n"
- "\n"
- "sub process($) {\n"
- "\tmy $node = $_[0];\n"
- "\tmy ($type, $name) = @$node[0, 1];\n"
- "\tmy $command;\n"
- "\tif ($type eq \"string\") { $command = \"String\" }\n"
- "\telsif ($type eq \"doc\") { $command = \"Doc\" }\n"
- "\telsif ($type eq \"hash\") {\n"
- "\t\t$command = \"Hash\";\n"
- "\t\tfor my $subnode (values %{$$node[2]}) {\n"
- "\t\t\tprocess($subnode);\n"
- "\t\t}\n"
- "\t}\n"
- "\telsif ($type eq \"list\") {\n"
- "\t\t$command = \"List\";\n"
- "\t\tprocess($$node[2]);\n"
- "\t}\n"
- "\tprint \"\\\\\" . $command . \"Node{\" . $name . \"}%\\n\";\n"
- "}\n"
- "\n"
- "process($doxystructure);\n";
-
- return true;
-}
-
-bool PerlModGenerator::generateDoxyLatexPL()
-{
- QFile doxyLatexPL;
- if (!createOutputFile(doxyLatexPL, pathDoxyLatexPL))
- return false;
-
- QTextStream doxyLatexPLStream(&doxyLatexPL);
- doxyLatexPLStream <<
- "use DoxyStructure;\n"
- "use DoxyDocs;\n"
- "\n"
- "sub latex_quote($) {\n"
- "\tmy $text = $_[0];\n"
- "\t$text =~ s/\\\\/\\\\textbackslash /g;\n"
- "\t$text =~ s/\\|/\\\\textbar /g;\n"
- "\t$text =~ s/</\\\\textless /g;\n"
- "\t$text =~ s/>/\\\\textgreater /g;\n"
- "\t$text =~ s/~/\\\\textasciitilde /g;\n"
- "\t$text =~ s/\\^/\\\\textasciicircum /g;\n"
- "\t$text =~ s/[\\$&%#_{}]/\\\\$&/g;\n"
- "\tprint $text;\n"
- "}\n"
- "\n"
- "sub generate_doc($) {\n"
- "\tmy $doc = $_[0];\n"
- "\tfor my $item (@$doc) {\n"
- "\t\tmy $type = $$item{type};\n"
- "\t\tif ($type eq \"text\") {\n"
- "\t\t\tlatex_quote($$item{content});\n"
- "\t\t} elsif ($type eq \"parbreak\") {\n"
- "\t\t\tprint \"\\n\\n\";\n"
- "\t\t} elsif ($type eq \"style\") {\n"
- "\t\t\tmy $style = $$item{style};\n"
- "\t\t\tif ($$item{enable} eq \"yes\") {\n"
- "\t\t\t\tif ($style eq \"bold\") { print '\\bfseries'; }\n"
- "\t\t\t\tif ($style eq \"italic\") { print '\\itshape'; }\n"
- "\t\t\t\tif ($style eq \"code\") { print '\\ttfamily'; }\n"
- "\t\t\t} else {\n"
- "\t\t\t\tif ($style eq \"bold\") { print '\\mdseries'; }\n"
- "\t\t\t\tif ($style eq \"italic\") { print '\\upshape'; }\n"
- "\t\t\t\tif ($style eq \"code\") { print '\\rmfamily'; }\n"
- "\t\t\t}\n"
- "\t\t\tprint '{}';\n"
- "\t\t} elsif ($type eq \"symbol\") {\n"
- "\t\t\tmy $symbol = $$item{symbol};\n"
- "\t\t\tif ($symbol eq \"copyright\") { print '\\copyright'; }\n"
- "\t\t\telsif ($symbol eq \"szlig\") { print '\\ss'; }\n"
- "\t\t\tprint '{}';\n"
- "\t\t} elsif ($type eq \"accent\") {\n"
- "\t\t\tmy ($accent) = $$item{accent};\n"
- "\t\t\tif ($accent eq \"umlaut\") { print '\\\"'; }\n"
- "\t\t\telsif ($accent eq \"acute\") { print '\\\\\\''; }\n"
- "\t\t\telsif ($accent eq \"grave\") { print '\\`'; }\n"
- "\t\t\telsif ($accent eq \"circ\") { print '\\^'; }\n"
- "\t\t\telsif ($accent eq \"tilde\") { print '\\~'; }\n"
- "\t\t\telsif ($accent eq \"cedilla\") { print '\\c'; }\n"
- "\t\t\telsif ($accent eq \"ring\") { print '\\r'; }\n"
- "\t\t\tprint \"{\" . $$item{letter} . \"}\"; \n"
- "\t\t} elsif ($type eq \"list\") {\n"
- "\t\t\tmy $env = ($$item{style} eq \"ordered\") ? \"enumerate\" : \"itemize\";\n"
- "\t\t\tprint \"\\n\\\\begin{\" . $env .\"}\";\n"
- "\t\t \tfor my $subitem (@{$$item{content}}) {\n"
- "\t\t\t\tprint \"\\n\\\\item \";\n"
- "\t\t\t\tgenerate_doc($subitem);\n"
- "\t\t \t}\n"
- "\t\t\tprint \"\\n\\\\end{\" . $env .\"}\";\n"
- "\t\t} elsif ($type eq \"url\") {\n"
- "\t\t\tlatex_quote($$item{content});\n"
- "\t\t}\n"
- "\t}\n"
- "}\n"
- "\n"
- "sub generate($$) {\n"
- "\tmy ($item, $node) = @_;\n"
- "\tmy ($type, $name) = @$node[0, 1];\n"
- "\tif ($type eq \"string\") {\n"
- "\t\tprint \"\\\\\" . $name . \"{\";\n"
- "\t\tlatex_quote($item);\n"
- "\t\tprint \"}\";\n"
- "\t} elsif ($type eq \"doc\") {\n"
- "\t\tif (@$item) {\n"
- "\t\t\tprint \"\\\\\" . $name . \"{\";\n"
- "\t\t\tgenerate_doc($item);\n"
- "\t\t\tprint \"}%\\n\";\n"
- "\t\t} else {\n"
- "#\t\t\tprint \"\\\\\" . $name . \"Empty%\\n\";\n"
- "\t\t}\n"
- "\t} elsif ($type eq \"hash\") {\n"
- "\t\tmy ($key, $value);\n"
- "\t\twhile (($key, $subnode) = each %{$$node[2]}) {\n"
- "\t\t\tmy $subname = $$subnode[1];\n"
- "\t\t\tprint \"\\\\Defcs{field\" . $subname . \"}{\";\n"
- "\t\t\tif ($$item{$key}) {\n"
- "\t\t\t\tgenerate($$item{$key}, $subnode);\n"
- "\t\t\t} else {\n"
- "#\t\t\t\t\tprint \"\\\\\" . $subname . \"Empty%\\n\";\n"
- "\t\t\t}\n"
- "\t\t\tprint \"}%\\n\";\n"
- "\t\t}\n"
- "\t\tprint \"\\\\\" . $name . \"%\\n\";\n"
- "\t} elsif ($type eq \"list\") {\n"
- "\t\tmy $index = 0;\n"
- "\t\tif (@$item) {\n"
- "\t\t\tprint \"\\\\\" . $name . \"{%\\n\";\n"
- "\t\t\tfor my $subitem (@$item) {\n"
- "\t\t\t\tif ($index) {\n"
- "\t\t\t\t\tprint \"\\\\\" . $name . \"Sep%\\n\";\n"
- "\t\t\t\t}\n"
- "\t\t\t\tgenerate($subitem, $$node[2]);\n"
- "\t\t\t\t$index++;\n"
- "\t\t\t}\n"
- "\t\t\tprint \"}%\\n\";\n"
- "\t\t} else {\n"
- "#\t\t\tprint \"\\\\\" . $name . \"Empty%\\n\";\n"
- "\t\t}\n"
- "\t}\n"
- "}\n"
- "\n"
- "generate($doxydocs, $doxystructure);\n";
-
- return true;
-}
-
-bool PerlModGenerator::generateDoxyFormatTex()
-{
- QFile doxyFormatTex;
- if (!createOutputFile(doxyFormatTex, pathDoxyFormatTex))
- return false;
-
- QTextStream doxyFormatTexStream(&doxyFormatTex);
- doxyFormatTexStream <<
- "\\def\\Defcs#1{\\long\\expandafter\\def\\csname#1\\endcsname}\n"
- "\\Defcs{Empty}{}\n"
- "\\def\\IfEmpty#1{\\expandafter\\ifx\\csname#1\\endcsname\\Empty}\n"
- "\n"
- "\\def\\StringNode#1{\\Defcs{#1}##1{##1}}\n"
- "\\def\\DocNode#1{\\Defcs{#1}##1{##1}}\n"
- "\\def\\ListNode#1{\\Defcs{#1}##1{##1}\\Defcs{#1Sep}{}}\n"
- "\\def\\HashNode#1{\\Defcs{#1}{}}\n"
- "\n"
- "\\input{" << pathDoxyStructureTex << "}\n"
- "\n"
- "\\newbox\\BoxA\n"
- "\\dimendef\\DimenA=151\\relax\n"
- "\\dimendef\\DimenB=152\\relax\n"
- "\\countdef\\ZoneDepth=151\\relax\n"
- "\n"
- "\\def\\Cs#1{\\csname#1\\endcsname}\n"
- "\\def\\Letcs#1{\\expandafter\\let\\csname#1\\endcsname}\n"
- "\\def\\Heading#1{\\vskip 4mm\\relax\\textbf{#1}}\n"
- "\\def\\See#1{\\begin{flushleft}\\Heading{See also: }#1\\end{flushleft}}\n"
- "\n"
- "\\def\\Frame#1{\\vskip 3mm\\relax\\fbox{ \\vbox{\\hsize0.95\\hsize\\vskip 1mm\\relax\n"
- "\\raggedright#1\\vskip 0.5mm\\relax} }}\n"
- "\n"
- "\\def\\Zone#1#2#3{%\n"
- "\\Defcs{Test#1}{#2}%\n"
- "\\Defcs{Emit#1}{#3}%\n"
- "\\Defcs{#1}{%\n"
- "\\advance\\ZoneDepth1\\relax\n"
- "\\Letcs{Mode\\number\\ZoneDepth}0\\relax\n"
- "\\Letcs{Present\\number\\ZoneDepth}0\\relax\n"
- "\\Cs{Test#1}\n"
- "\\expandafter\\if\\Cs{Present\\number\\ZoneDepth}1%\n"
- "\\advance\\ZoneDepth-1\\relax\n"
- "\\Letcs{Present\\number\\ZoneDepth}1\\relax\n"
- "\\expandafter\\if\\Cs{Mode\\number\\ZoneDepth}1%\n"
- "\\advance\\ZoneDepth1\\relax\n"
- "\\Letcs{Mode\\number\\ZoneDepth}1\\relax\n"
- "\\Cs{Emit#1}\n"
- "\\advance\\ZoneDepth-1\\relax\\fi\n"
- "\\advance\\ZoneDepth1\\relax\\fi\n"
- "\\advance\\ZoneDepth-1\\relax}}\n"
- "\n"
- "\\def\\Member#1#2{%\n"
- "\\Defcs{Test#1}{\\Cs{field#1Detailed}\n"
- "\\IfEmpty{field#1DetailedDoc}\\else\\Letcs{Present#1}1\\fi}\n"
- "\\Defcs{#1}{\\Letcs{Present#1}0\\relax\n"
- "\\Cs{Test#1}\\if1\\Cs{Present#1}\\Letcs{Present\\number\\ZoneDepth}1\\relax\n"
- "\\if1\\Cs{Mode\\number\\ZoneDepth}#2\\fi\\fi}}\n"
- "\n"
- "\\def\\TypedefMemberList#1#2{%\n"
- "\\Defcs{#1DetailedDoc}##1{\\vskip 5.5mm\\relax##1}%\n"
- "\\Defcs{#1Name}##1{\\textbf{##1}}%\n"
- "\\Defcs{#1See}##1{\\See{##1}}%\n"
- "%\n"
- "\\Zone{#1s}{\\Cs{field#1List}}{\\subsubsection{#2}\\Cs{field#1List}}%\n"
- "\\Member{#1}{\\Frame{typedef \\Cs{field#1Type} \\Cs{field#1Name}}%\n"
- "\\Cs{field#1DetailedDoc}\\Cs{field#1See}\\vskip 5mm\\relax}}%\n"
- "\n"
- "\\def\\VariableMemberList#1#2{%\n"
- "\\Defcs{#1DetailedDoc}##1{\\vskip 5.5mm\\relax##1}%\n"
- "\\Defcs{#1Name}##1{\\textbf{##1}}%\n"
- "\\Defcs{#1See}##1{\\See{##1}}%\n"
- "%\n"
- "\\Zone{#1s}{\\Cs{field#1List}}{\\subsubsection{#2}\\Cs{field#1List}}%\n"
- "\\Member{#1}{\\Frame{\\Cs{field#1Type}{} \\Cs{field#1Name}}%\n"
- "\\Cs{field#1DetailedDoc}\\Cs{field#1See}\\vskip 5mm\\relax}}%\n"
- "\n"
- "\\def\\FunctionMemberList#1#2{%\n"
- "\\Defcs{#1PDParamName}##1{\\textit{##1}}%\n"
- "\\Defcs{#1PDParam}{\\Cs{field#1PDParamName}}%\n"
- "\\Defcs{#1PDParamsSep}{, }%\n"
- "\\Defcs{#1PDBlocksSep}{\\vskip 2mm\\relax}%\n"
- "%\n"
- "\\Defcs{#1PDBlocks}##1{%\n"
- "\\Heading{Parameters:}\\vskip 1.5mm\\relax\n"
- "\\DimenA0pt\\relax\n"
- "\\Defcs{#1PDBlock}{\\setbox\\BoxA\\hbox{\\Cs{field#1PDParams}}%\n"
- "\\ifdim\\DimenA<\\wd\\BoxA\\DimenA\\wd\\BoxA\\fi}%\n"
- "##1%\n"
- "\\advance\\DimenA3mm\\relax\n"
- "\\DimenB\\hsize\\advance\\DimenB-\\DimenA\\relax\n"
- "\\Defcs{#1PDBlock}{\\hbox to\\hsize{\\vtop{\\hsize\\DimenA\\relax\n"
- "\\Cs{field#1PDParams}}\\hfill\n"
- "\\vtop{\\hsize\\DimenB\\relax\\Cs{field#1PDDoc}}}}%\n"
- "##1}\n"
- "\n"
- "\\Defcs{#1ParamName}##1{\\textit{##1}}\n"
- "\\Defcs{#1Param}{\\Cs{field#1ParamType}{} \\Cs{field#1ParamName}}\n"
- "\\Defcs{#1ParamsSep}{, }\n"
- "\n"
- "\\Defcs{#1Name}##1{\\textbf{##1}}\n"
- "\\Defcs{#1See}##1{\\See{##1}}\n"
- "\\Defcs{#1Return}##1{\\Heading{Returns: }##1}\n"
- "\\Defcs{field#1Title}{\\Frame{\\Cs{field#1Type}{} \\Cs{field#1Name}(\\Cs{field#1Params})}}%\n"
- "%\n"
- "\\Zone{#1s}{\\Cs{field#1List}}{\\subsubsection{#2}\\Cs{field#1List}}%\n"
- "\\Member{#1}{%\n"
- "\\Cs{field#1Title}\\vskip 6mm\\relax\\Cs{field#1DetailedDoc}\n"
- "\\Cs{field#1Return}\\Cs{field#1PDBlocks}\\Cs{field#1See}\\vskip 5mm\\relax}}\n"
- "\n"
- "\\def\\FileDetailed{\\fieldFileDetailedDoc\\par}\n"
- "\\def\\ClassDetailed{\\fieldClassDetailedDoc\\par}\n"
- "\n"
- "\\def\\FileSubzones{\\fieldFileTypedefs\\fieldFileVariables\\fieldFileFunctions}\n"
- "\n"
- "\\def\\ClassSubzones{%\n"
- "\\fieldClassPublicTypedefs\\fieldClassPublicMembers\\fieldClassPublicMethods\n"
- "\\fieldClassProtectedTypedefs\\fieldClassProtectedMembers\\fieldClassProtectedMethods\n"
- "\\fieldClassPrivateTypedefs\\fieldClassPrivateMembers\\fieldClassPrivateMethods}\n"
- "\n"
- "\\Member{Page}{\\subsection{\\fieldPageName}\\fieldPageDetailedDoc}\n"
- "\n"
- "\\TypedefMemberList{FileTypedef}{Typedefs}\n"
- "\\VariableMemberList{FileVariable}{Variables}\n"
- "\\FunctionMemberList{FileFunction}{Functions}\n"
- "\\Zone{File}{\\FileSubzones}{\\subsection{\\fieldFileName}\\fieldFileDetailed\\FileSubzones}\n"
- "\n"
- "\\TypedefMemberList{ClassPublicTypedef}{Public Typedefs}\n"
- "\\TypedefMemberList{ClassProtectedTypedef}{Protected Typedefs}\n"
- "\\TypedefMemberList{ClassPrivateTypedef}{Private Typedefs}\n"
- "\\VariableMemberList{ClassPublicMember}{Public Members}\n"
- "\\VariableMemberList{ClassProtectedMember}{Protected Members}\n"
- "\\VariableMemberList{ClassPrivateMember}{Private Members}\n"
- "\\FunctionMemberList{ClassPublicMethod}{Public Methods}\n"
- "\\FunctionMemberList{ClassProtectedMethod}{Protected Methods}\n"
- "\\FunctionMemberList{ClassPrivateMethod}{Private Methods}\n"
- "\\Zone{Class}{\\ClassSubzones}{\\subsection{\\fieldClassName}\\fieldClassDetailed\\ClassSubzones}\n"
- "\n"
- "\\Zone{AllPages}{\\fieldPages}{\\section{Pages}\\fieldPages}\n"
- "\\Zone{AllFiles}{\\fieldFiles}{\\section{Files}\\fieldFiles}\n"
- "\\Zone{AllClasses}{\\fieldClasses}{\\section{Classes}\\fieldClasses}\n"
- "\n"
- "\\newlength{\\oldparskip}\n"
- "\\newlength{\\oldparindent}\n"
- "\\newlength{\\oldfboxrule}\n"
- "\n"
- "\\ZoneDepth0\\relax\n"
- "\\Letcs{Mode0}1\\relax\n"
- "\n"
- "\\def\\EmitDoxyDocs{%\n"
- "\\setlength{\\oldparskip}{\\parskip}\n"
- "\\setlength{\\oldparindent}{\\parindent}\n"
- "\\setlength{\\oldfboxrule}{\\fboxrule}\n"
- "\\setlength{\\parskip}{0cm}\n"
- "\\setlength{\\parindent}{0cm}\n"
- "\\setlength{\\fboxrule}{1pt}\n"
- "\\AllPages\\AllFiles\\AllClasses\n"
- "\\setlength{\\parskip}{\\oldparskip}\n"
- "\\setlength{\\parindent}{\\oldparindent}\n"
- "\\setlength{\\fboxrule}{\\oldfboxrule}}\n";
-
- return true;
-}
-
-bool PerlModGenerator::generateDoxyLatexTex()
-{
- QFile doxyLatexTex;
- if (!createOutputFile(doxyLatexTex, pathDoxyLatexTex))
- return false;
-
- QTextStream doxyLatexTexStream(&doxyLatexTex);
- doxyLatexTexStream <<
- "\\documentclass[a4paper,12pt]{article}\n"
- "\\usepackage[latin1]{inputenc}\n"
- "\\usepackage[none]{hyphenat}\n"
- "\\usepackage[T1]{fontenc}\n"
- "\\usepackage{hyperref}\n"
- "\\usepackage{times}\n"
- "\n"
- "\\input{doxyformat}\n"
- "\n"
- "\\begin{document}\n"
- "\\input{" << pathDoxyDocsTex << "}\n"
- "\\sloppy\n"
- "\\EmitDoxyDocs\n"
- "\\end{document}\n";
-
- return true;
-}
-
-void PerlModGenerator::generate()
-{
- // + classes
- // + namespaces
- // + files
- // - packages
- // + groups
- // + related pages
- // - examples
-
- QDir perlModDir;
- if (!createOutputDir(perlModDir))
- return;
-
- bool perlmodLatex = Config_getBool("PERLMOD_LATEX");
-
- pathDoxyDocsPM = perlModDir.absPath() + "/DoxyDocs.pm";
- pathDoxyStructurePM = perlModDir.absPath() + "/DoxyStructure.pm";
- pathMakefile = perlModDir.absPath() + "/Makefile";
- pathDoxyRules = perlModDir.absPath() + "/doxyrules.make";
-
- if (perlmodLatex) {
- pathDoxyStructureTex = perlModDir.absPath() + "/doxystructure.tex";
- pathDoxyFormatTex = perlModDir.absPath() + "/doxyformat.tex";
- pathDoxyLatexTex = perlModDir.absPath() + "/doxylatex.tex";
- pathDoxyLatexDVI = perlModDir.absPath() + "/doxylatex.dvi";
- pathDoxyLatexPDF = perlModDir.absPath() + "/doxylatex.pdf";
- pathDoxyDocsTex = perlModDir.absPath() + "/doxydocs.tex";
- pathDoxyLatexPL = perlModDir.absPath() + "/doxylatex.pl";
- pathDoxyLatexStructurePL = perlModDir.absPath() + "/doxylatex-structure.pl";
- }
-
- if (!(generatePerlModOutput()
- && generateDoxyStructurePM()
- && generateMakefile()
- && generateDoxyRules()))
- return;
-
- if (perlmodLatex) {
- if (!(generateDoxyLatexStructurePL()
- && generateDoxyLatexPL()
- && generateDoxyLatexTex()
- && generateDoxyFormatTex()))
- return;
- }
-}
-
-void generatePerlMod()
-{
- PerlModGenerator pmg(Config_getBool("PERLMOD_PRETTY"));
- pmg.generate();
-}
-
-// Local Variables:
-// c-basic-offset: 2
-// End:
-
-/* This elisp function for XEmacs makes Control-Z transform
- the text in the region into a valid C string.
-
- (global-set-key '(control z) (lambda () (interactive)
- (save-excursion
- (if (< (mark) (point)) (exchange-point-and-mark))
- (let ((start (point)) (replacers
- '(("\\\\" "\\\\\\\\")
- ("\"" "\\\\\"")
- ("\t" "\\\\t")
- ("^.*$" "\"\\&\\\\n\""))))
- (while replacers
- (while (re-search-forward (caar replacers) (mark) t)
- (replace-match (cadar replacers) t))
- (goto-char start)
- (setq replacers (cdr replacers)))))))
-*/
diff --git a/src/perlmodgen.h b/src/perlmodgen.h
deleted file mode 100644
index a467db5..0000000
--- a/src/perlmodgen.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#ifndef PERLMODGEN_H
-#define PERLMODGEN_H
-
-class QString;
-
-extern void setPerlModDoxyfile(const QString &);
-extern void generatePerlMod();
-
-#endif
diff --git a/src/pngenc.cpp b/src/pngenc.cpp
deleted file mode 100644
index 601519b..0000000
--- a/src/pngenc.cpp
+++ /dev/null
@@ -1,170 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- * ---------------------------------------------------------------------------
- *
- * The Portable Network Graphic format is an ISO Standard.
- * Most of the code below was donated by Bernhard Ristow.
- */
-
-#ifndef png_jmpbuf
-# define png_jmpbuf(png_ptr) ((png_ptr)->jmpbuf)
-#endif
-
-#define ALL_STATIC
-#include <../libpng/png.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-#include "pngenc.h"
-#include "message.h"
-
-#undef jmpbuf
-
-static void user_error_fn(png_structp, png_const_charp error_msg)
-{
- err("%s\n", error_msg);
-}
-
-static void user_warning_fn(png_structp, png_const_charp warning_msg)
-{
- err("%s\n", warning_msg);
-}
-
-PngEncoder::PngEncoder(Byte *rawBytes, Color *p, int w, int h, Byte d, int t) :
- data(rawBytes), palette(p), width(w), height(h), depth(d), transIndex(t)
-{
- numPixels = w*h;
- dataPtr = data;
-}
-
-PngEncoder::~PngEncoder()
-{
-}
-
-void PngEncoder::write(const char *name)
-{
- FILE * file = NULL;
- unsigned char ** rows = 0;
- unsigned char * cmap = 0;
- short numOfColors = (1<<depth);
- short bit_depth = 4;
- long i = 0;
- long j = 0;
- png_structp png_ptr;
- png_infop info_ptr;
- char user_error_ptr[] = "PngEncoder";
- png_colorp png_palette;
- png_byte ti[1];
-
- png_ptr = png_create_write_struct
- ( PNG_LIBPNG_VER_STRING, (png_voidp)user_error_ptr,
- user_error_fn, user_warning_fn);
- if (!png_ptr)
- {
- err("Can not allocate writing structure!\n");
- return;
- }
-
- info_ptr = png_create_info_struct(png_ptr);
- if (!info_ptr)
- {
- png_destroy_write_struct(&png_ptr, (png_infopp)NULL);
- err("Can not allocate writing structure!\n");
- return;
- }
-
- if (setjmp(png_jmpbuf(png_ptr)))
- {
- png_destroy_write_struct(&png_ptr, &info_ptr);
- return;
- }
- else
- {
- png_palette = (png_colorp) png_malloc(png_ptr,
- PNG_MAX_PALETTE_LENGTH*sizeof(png_color));
- memset(png_palette,0,PNG_MAX_PALETTE_LENGTH*sizeof(png_color));
- for (i=0; i<numOfColors; i++)
- {
- png_palette[i].red = palette[i].red;
- png_palette[i].green = palette[i].green;
- png_palette[i].blue = palette[i].blue;
- }
- png_set_PLTE(png_ptr, info_ptr, png_palette, numOfColors);
- png_set_IHDR( png_ptr, info_ptr, width, height, bit_depth,
- PNG_COLOR_TYPE_PALETTE, PNG_INTERLACE_NONE,
- PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE
- );
- free(png_palette);
- ti[0] = transIndex;
- png_set_tRNS(png_ptr,info_ptr,ti,1,NULL);
- rows = (unsigned char **) calloc(sizeof(unsigned char*),height);
- rows[0] = (unsigned char *) calloc(sizeof(unsigned char),height*width);
- for (i=1; i<height; i++)
- {
- rows[i] = rows[i-1] + width;
- }
- for (i=0, dataPtr=data; i<height; i++)
- {
- for (j=0; j<width; j++)
- {
- if (j%2)
- {
- rows[i][j/2] = ( rows[i][j/2] | *dataPtr );
- }
- else
- {
- rows[i][j/2] = (*dataPtr) << 4;
- }
- dataPtr++;
- }
- }
- png_set_rows(png_ptr,info_ptr,rows);
-
- file = fopen(name,"wb");
- if (file==0)
- {
- err("Error opening png file %s for writing: %s!\n",name,strerror(errno));
- }
- else
- {
- png_init_io(png_ptr,file);
- png_write_png(png_ptr,info_ptr,PNG_TRANSFORM_IDENTITY,NULL);
- }
- }
-
- png_destroy_write_struct(&png_ptr, &info_ptr);
-
- if (file)
- {
- fclose (file);
- }
- if (cmap)
- {
- free(cmap);
- }
- if (rows)
- {
- if (rows[0])
- {
- free(rows[0]);
- }
- free(rows);
- }
- return;
-}
-
diff --git a/src/pngenc.h b/src/pngenc.h
deleted file mode 100644
index 817a2a3..0000000
--- a/src/pngenc.h
+++ /dev/null
@@ -1,58 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 _PNGENC_H
-#define _PNGENC_H
-#include <qfile.h>
-
-typedef unsigned char Byte;
-
-/*! \brief Entry in the color palette of a PNG image */
-struct Color
-{
- Byte red;
- Byte green;
- Byte blue;
-};
-
-/*! \brief PNG image encoder
- *
- * This class allows to encode a raw image to a compressed PNG.
- * Use write() to save the result to disk.
- */
-class PngEncoder
-{
- public:
- PngEncoder(Byte *rawBytes,Color *p,int w,int h,Byte d,int t);
- ~PngEncoder();
- void write(const char *fileName);
-
- private:
- // image variables
- Byte *data; // pointer to the image data (one byte per pixel)
- Color *palette; // pointer to the color palette
- int width; // image width
- int height; // image height
- Byte depth; // bits per CLUT entry
- int transIndex; // index of the transparant color; -1 = none
- int numPixels; // total number of pixel (i.e. width * height)
- Byte *dataPtr; // pointer located at the current pixel.
-
-};
-
-#endif
diff --git a/src/pre.h b/src/pre.h
deleted file mode 100644
index efcd394..0000000
--- a/src/pre.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 PRE_H
-#define PRE_H
-
-#include "qtbc.h"
-#include <stdio.h>
-//#include <qfile.h>
-
-class BufStr;
-
-void initPreprocessor();
-void cleanUpPreprocessor();
-void addSearchDir(const char *dir);
-void preprocessFile(const char *fileName,BufStr &output);
-
-#endif
diff --git a/src/pre.l b/src/pre.l
deleted file mode 100644
index 117949f..0000000
--- a/src/pre.l
+++ /dev/null
@@ -1,2343 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-
-%{
-
-/*
- * includes
- */
-
-#include <stdio.h>
-#include <assert.h>
-#include <ctype.h>
-
-#include "qtbc.h"
-#include <qarray.h>
-#include <qstack.h>
-#include <qfile.h>
-#include <qstrlist.h>
-#include <qdict.h>
-#include <qregexp.h>
-#include <qfileinfo.h>
-#include <qdir.h>
-
-#include "pre.h"
-#include "constexp.h"
-#include "define.h"
-#include "doxygen.h"
-#include "message.h"
-#include "util.h"
-#include "defargs.h"
-#include "debug.h"
-#include "bufstr.h"
-
-#if defined(_MSC_VER) || defined(__BORLANDC__)
-#define popen _popen
-#define pclose _pclose
-#endif
-
-#define YY_NEVER_INTERACTIVE 1
-
-
-struct FileState
-{
- int lineNr;
- FILE *filePtr;
- YY_BUFFER_STATE bufState;
- QCString fileName;
-};
-
-/* -----------------------------------------------------------------
- *
- * scanner's state
- */
-
-static int g_yyLineNr = 1;
-static QCString g_yyFileName;
-static FileDef *g_yyFileDef;
-static int g_ifcount = 0;
-static QStrList *g_pathList = 0;
-static QStack<FileState> g_includeStack;
-static QDict<int> *g_argDict;
-static int g_defArgs = -1;
-static QCString g_defName;
-static QCString g_defText;
-static QCString g_defLitText;
-static QCString g_defArgsStr;
-static bool g_defVarArgs;
-static int g_level;
-static int g_lastCContext;
-static int g_lastCPPContext;
-static QArray<int> g_levelGuard;
-static BufStr *g_outputBuf;
-static int g_roundCount;
-static bool g_quoteArg;
-static DefineDict *g_fileDefineDict;
-static DefineDict *g_expandedDict;
-static int g_findDefArgContext;
-static QCString g_lastGuardName;
-static QCString g_incName;
-static QCString g_guardExpr;
-static int g_curlyCount;
-static bool g_nospaces; // add extra spaces during macro expansion
-
-static bool g_macroExpansion; // from the configuration
-static bool g_expandOnlyPredef; // from the configuration
-static int g_commentCount;
-static bool g_insideComment;
-static bool g_isImported;
-static QCString g_blockName;
-static int g_condCtx;
-static bool g_skip;
-static QStack<bool> g_condStack;
-
-
-
-static void setFileName(const char *name)
-{
- bool ambig;
- g_yyFileName=name;
- g_yyFileDef=findFileDef(Doxygen::inputNameDict,g_yyFileName,ambig);
- if (g_yyFileDef && g_yyFileDef->isReference()) g_yyFileDef=0;
-}
-
-static void incrLevel()
-{
- g_level++;
- g_levelGuard.resize(g_level);
- g_levelGuard[g_level-1]=FALSE;
- //printf("%s line %d: incrLevel %d\n",g_yyFileName.data(),g_yyLineNr,g_level);
-}
-
-static void decrLevel()
-{
- //printf("%s line %d: decrLevel %d\n",g_yyFileName.data(),g_yyLineNr,g_level);
- if (g_level > 0)
- {
- g_level--;
- g_levelGuard.resize(g_level);
- }
- else
- {
- err("%s:%d: Error: More #endif's than #if's found.\n",
- g_yyFileName.data(),g_yyLineNr);
- }
-}
-
-static bool otherCaseDone()
-{
- if (g_level==0)
- {
- err("%s:%d: Error: Found an #else without a preceding #if.\n",
- g_yyFileName.data(),g_yyLineNr);
- return TRUE;
- }
- else
- {
- return g_levelGuard[g_level-1];
- }
-}
-
-static void setCaseDone(bool value)
-{
- g_levelGuard[g_level-1]=value;
-}
-
-static Define *isDefined(const char *name)
-{
- if (name)
- {
- Define *def;
- //if ((def=fileDefineCache->findDefine(g_yyFileName,name)) && !def->undef)
- // return def;
- if ((def=g_fileDefineDict->find(name)) && !def->undef) return def;
- }
- return 0;
-}
-
-static FILE *checkAndOpenFile(const QCString &absName)
-{
- FILE *f = 0;
- //printf("checkAndOpenFile(%s)\n",absName.data());
- QFileInfo fi(absName);
- if (fi.exists() && fi.isFile())
- {
- // check include stack for absFileName
-
- QStack<FileState> tmpStack;
- g_includeStack.setAutoDelete(FALSE);
- FileState *fs;
- bool alreadyIncluded=FALSE;
- while ((fs=g_includeStack.pop()))
- {
- if (fs->fileName==absName) alreadyIncluded=TRUE;
- tmpStack.push(fs);
- }
- while ((fs=tmpStack.pop()))
- {
- g_includeStack.push(fs);
- }
- g_includeStack.setAutoDelete(TRUE);
-
- if (alreadyIncluded) return 0;
-
-
- QCString filterName = getFileFilter(absName);
- if (!filterName.isEmpty())
- {
- QCString cmd = filterName+" \""+absName+"\"";
- f=popen(cmd,"r");
- if (!f) err("Error: could not execute filter %s\n",cmd.data());
- }
- else
- {
- f=fopen(absName,"r");
- if (!f) err("Error: could not open file %s for reading\n",absName.data());
- }
- }
- return f;
-}
-
-static FILE *findFile(const char *fileName,bool localInclude)
-{
- if (localInclude && g_yyFileDef)
- {
- QCString absName = g_yyFileDef->getPath()+"/"+fileName;
- FILE *f = checkAndOpenFile(absName);
- if (f)
- {
- setFileName(absName);
- g_yyLineNr=1;
- return f;
- }
- }
- if (g_pathList==0)
- {
- return 0;
- }
- char *s=g_pathList->first();
- while (s)
- {
- QCString absName = (QCString)s+"/"+fileName;
- FILE *f = checkAndOpenFile(absName);
- if (f)
- {
- setFileName(absName);
- g_yyLineNr=1;
- return f;
- }
-
- s=g_pathList->next();
- }
- return 0;
-}
-
-static QCString extractTrailingComment(const char *s)
-{
- if (s==0) return "";
- int i=strlen(s)-1;
- while (i>=0)
- {
- char c=s[i];
- switch (c)
- {
- case '/':
- {
- i--;
- if (i>=0 && s[i]=='*') // end of a comment block
- {
- i--;
- while (i>0 && !(s[i-1]=='/' && s[i]=='*')) i--;
- if (i==0) return s; else return &s[i-1];
- }
- else
- {
- return "";
- }
- }
- break;
- // whitespace or line-continuation
- case ' ':
- case '\t':
- case '\r':
- case '\n':
- case '\\':
- break;
- default:
- return "";
- }
- i--;
- }
- return "";
-}
-
-static int getNextChar(const QCString &expr,QCString *rest,uint &pos);
-static int getCurrentChar(const QCString &expr,QCString *rest,uint pos);
-static void unputChar(const QCString &expr,QCString *rest,uint &pos,char c);
-static void expandExpression(QCString &expr,QCString *rest,int pos);
-
-static QCString stringize(const QCString &s)
-{
- QCString result;
- uint i=0;
- bool inString=FALSE;
- bool inChar=FALSE;
- char c,pc;
- while (i<s.length())
- {
- if (!inString && !inChar)
- {
- while (i<s.length() && !inString && !inChar)
- {
- c=s.at(i++);
- if (c=='"')
- {
- result+="\\\"";
- inString=TRUE;
- }
- else if (c=='\'')
- {
- result+=c;
- inChar=TRUE;
- }
- else
- {
- result+=c;
- }
- }
- }
- else if (inChar)
- {
- while (i<s.length() && inChar)
- {
- c=s.at(i++);
- if (c=='\'')
- {
- result+='\'';
- inChar=FALSE;
- }
- else if (c=='\\')
- {
- result+="\\\\";
- }
- else
- {
- result+=c;
- }
- }
- }
- else
- {
- pc=0;
- while (i<s.length() && inString)
- {
- char c=s.at(i++);
- if (c=='"')
- {
- result+="\\\"";
- inString= pc=='\\';
- }
- else if (c=='\\')
- result+="\\\\";
- else
- result+=c;
- pc=c;
- }
- }
- }
- //printf("stringize `%s'->`%s'\n",s.data(),result.data());
- return result;
-}
-
-/*! Execute all ## operators in expr.
- * If the macro name before or after the operator contains a no-rescan
- * marker (@-) then this is removed (before the concatenated macro name
- * may be expanded again.
- */
-static void processConcatOperators(QCString &expr)
-{
- //printf("processConcatOperators: in=`%s'\n",expr.data());
- QRegExp r("[ \\t\\n]*##[ \\t\\n]*");
- int l,n,i=0;
- if (expr.isEmpty()) return;
- while ((n=r.match(expr,i,&l))!=-1)
- {
- //printf("Match: `%s'\n",expr.data()+i);
- if (n+l+1<(int)expr.length() && expr.at(n+l)=='@' && expr.at(n+l+1)=='-')
- {
- // remove no-rescan marker after ID
- l+=2;
- }
- //printf("found `%s'\n",expr.mid(n,l).data());
- // remove the ## operator and the surrounding whitespace
- expr=expr.left(n)+expr.right(expr.length()-n-l);
- int k=n-1;
- while (k>=0 && isId(expr.at(k))) k--;
- if (k>0 && expr.at(k)=='-' && expr.at(k-1)=='@')
- {
- // remove no-rescan marker before ID
- expr=expr.left(k-1)+expr.right(expr.length()-k-1);
- n-=2;
- }
- i=n;
- }
- //printf("processConcatOperators: out=`%s'\n",expr.data());
-}
-
-static void yyunput (int c,char *buf_ptr );
-static void returnCharToStream(char c)
-{
- unput(c);
-}
-
-static inline void addTillEndOfString(const QCString &expr,QCString *rest,
- uint &pos,char term,QCString &arg)
-{
- int cc;
- while ((cc=getNextChar(expr,rest,pos))!=EOF)
- {
- if (cc=='\\') arg+=(char)cc,cc=getNextChar(expr,rest,pos);
- else if (cc==term) return;
- arg+=(char)cc;
- }
-}
-
-/*! replaces the function macro \a def whose argument list starts at
- * \a pos in expression \a expr.
- * Notice that this routine may scan beyond the \a expr string if needed.
- * In that case the characters will be read from the input file.
- * The replacement string will be returned in \a result and the
- * length of the (unexpanded) argument list is stored in \a len.
- */
-static bool replaceFunctionMacro(const QCString &expr,QCString *rest,int pos,int &len,const Define *def,QCString &result)
-{
- //printf("replaceFunctionMacro(expr=%s,rest=%s,pos=%d,def=%s) level=%d\n",expr.data(),rest ? rest->data() : 0,pos,def->name.data(),g_level);
- uint j=pos;
- len=0;
- result.resize(0);
- int cc;
- while ((cc=getCurrentChar(expr,rest,j))!=EOF && cc==' ')
- {
- len++;
- getNextChar(expr,rest,j);
- }
- if (cc!='(')
- {
- unputChar(expr,rest,j,' ');
- return FALSE;
- }
- getNextChar(expr,rest,j); // eat the `(' character
-
- QDict<QCString> argTable; // list of arguments
- argTable.setAutoDelete(TRUE);
- QCString arg;
- int argCount=0;
- bool done=FALSE;
-
- // PHASE 1: read the macro arguments
- if (def->nargs==0)
- {
- while ((cc=getNextChar(expr,rest,j))!=EOF)
- {
- char c = (char)cc;
- if (c==')') break;
- }
- }
- else
- {
- while (!done && (argCount<def->nargs || def->varArgs) &&
- ((cc=getNextChar(expr,rest,j))!=EOF)
- )
- {
- char c=(char)cc;
- if (c=='(') // argument is a function => search for matching )
- {
- int level=1;
- arg+=c;
- //char term='\0';
- while ((cc=getNextChar(expr,rest,j))!=EOF)
- {
- char c=(char)cc;
- //printf("processing %c: term=%c (%d)\n",c,term,term);
- if (c=='\'' || c=='\"') // skip ('s and )'s inside strings
- {
- arg+=c;
- addTillEndOfString(expr,rest,j,c,arg);
- }
- if (c==')')
- {
- level--;
- arg+=c;
- if (level==0) break;
- }
- else if (c=='(')
- {
- level++;
- arg+=c;
- }
- else
- arg+=c;
- }
- }
- else if (c==')' || c==',') // last or next argument found
- {
- if (c==',' && argCount==def->nargs-1 && def->varArgs)
- {
- arg=arg.stripWhiteSpace();
- arg+=',';
- }
- else
- {
- QCString argKey;
- argKey.sprintf("@%d",argCount++); // key name
- arg=arg.stripWhiteSpace();
- // add argument to the lookup table
- argTable.insert(argKey, new QCString(arg));
- arg.resize(0);
- if (c==')') // end of the argument list
- {
- done=TRUE;
- }
- }
- }
- else if (c=='\"') // append literal strings
- {
- arg+=c;
- bool found=FALSE;
- while (!found && (cc=getNextChar(expr,rest,j))!=EOF)
- {
- found = cc=='"';
- if (cc=='\\')
- {
- c=(char)cc;
- arg+=c;
- if ((cc=getNextChar(expr,rest,j))==EOF) break;
- }
- c=(char)cc;
- arg+=c;
- }
- }
- else if (c=='\'') // append literal characters
- {
- arg+=c;
- bool found=FALSE;
- while (!found && (cc=getNextChar(expr,rest,j))!=EOF)
- {
- found = cc=='\'';
- if (cc=='\\')
- {
- c=(char)cc;
- arg+=c;
- if ((cc=getNextChar(expr,rest,j))==EOF) break;
- }
- c=(char)cc;
- arg+=c;
- }
- }
- else // append other characters
- {
- arg+=c;
- }
- }
- }
-
- // PHASE 2: apply the macro function
- if (argCount==def->nargs ||
- (argCount>def->nargs && def->varArgs)) // matching parameters lists
- {
- uint k=0;
- // substitution of all formal arguments
- QCString resExpr;
- const QCString d=def->definition.stripWhiteSpace();
- bool inString=FALSE;
- while (k<d.length())
- {
- if (d.at(k)=='@') // maybe a marker, otherwise an escaped @
- {
- if (d.at(k+1)=='@') // escaped @ => copy it (is unescaped later)
- {
- k+=2;
- resExpr+="@@"; // we unescape these later
- }
- else if (d.at(k+1)=='-') // no-rescan marker
- {
- k+=2;
- resExpr+="@-";
- }
- else // argument marker => read the argument number
- {
- QCString key="@";
- QCString *subst=0;
- bool hash=FALSE;
- int l=k-1;
- // search for ## backward
- if (l>=0 && d.at(l)=='"') l--;
- while (l>=0 && d.at(l)==' ') l--;
- if (l>0 && d.at(l)=='#' && d.at(l-1)=='#') hash=TRUE;
- k++;
- // scan the number
- while (k<d.length() && d.at(k)>='0' && d.at(k)<='9') key+=d.at(k++);
- if (!hash)
- {
- // search for ## forward
- l=k;
- if (l<(int)d.length() && d.at(l)=='"') l++;
- while (l<(int)d.length() && d.at(l)==' ') l++;
- 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]))
- {
- QCString substArg=*subst;
- //printf("substArg=`%s'\n",substArg.data());
- // only if no ## operator is before or after the argument
- // marker we do macro expansion.
- if (!hash) expandExpression(substArg,0,0);
- if (inString)
- {
- //printf("`%s'=stringize(`%s')\n",stringize(*subst).data(),subst->data());
-
- // if the marker is inside a string (because a # was put
- // before the macro name) we must escape " and \ characters
- resExpr+=stringize(substArg);
- }
- else
- {
- if (hash && substArg.isEmpty())
- {
- resExpr+="@E"; // empty argument will be remove later on
- }
- else if (g_nospaces)
- {
- resExpr+=substArg;
- }
- else
- {
- resExpr+=" "+substArg+" ";
- }
- }
- }
- }
- }
- else // no marker, just copy
- {
- if (!inString && d.at(k)=='\"')
- {
- inString=TRUE; // entering a literal string
- }
- else if (inString && d.at(k)=='\"' && (d.at(k-1)!='\\' || d.at(k-2)=='\\'))
- {
- inString=FALSE; // leaving a literal string
- }
- resExpr+=d.at(k++);
- }
- }
- len=j-pos;
- result=resExpr;
- //printf("result after substitution `%s' expr=`%s'\n",
- // result.data(),expr.mid(pos,len).data());
- return TRUE;
- }
- return FALSE;
-}
-
-
-/*! returns the next identifier in string \a expr by starting at position \a p.
- * The position of the identifier is returned (or -1 if nothing is found)
- * and \a l is its length. Any quoted strings are skipping during the search.
- */
-static int getNextId(const QCString &expr,int p,int *l)
-{
- int n;
- while (p<(int)expr.length())
- {
- char c=expr.at(p++);
- if (isalpha(c) || c=='_') // read id
- {
- n=p-1;
- while (p<(int)expr.length() && isId(expr.at(p))
- ) p++;
- *l=p-n;
- return n;
- }
- else if (c=='"') // skip string
- {
- char ppc=0,pc=c;
- if (p<(int)expr.length()) c=expr.at(p);
- while (p<(int)expr.length() && (c!='"' || (pc=='\\' && ppc!='\\')))
- // continue as long as no " is found, but ignoring \", but not \\"
- {
- ppc=pc;
- pc=c;
- c=expr.at(p);
- p++;
- }
- }
- else if (c=='/') // skip C Comment
- {
- char pc=c;
- if (p<(int)expr.length())
- {
- c=expr.at(++p);
- if (c=='*') // Start of C comment
- {
- while (p<(int)expr.length() && !(pc=='*' && c=='/'))
- {
- pc=c;
- c=expr.at(++p);
- }
- p++;
- }
- }
- }
- }
- return -1;
-}
-
-/*! preforms recursive macro expansion on the string \a expr
- * starting at position \a pos.
- * May read additional characters from the input while re-scanning!
- * If \a expandAll is \c TRUE then all macros in the expression are
- * expanded, otherwise only the first is expanded.
- */
-static void expandExpression(QCString &expr,QCString *rest,int pos)
-{
- //printf("expandExpression(%s,%s)\n",expr.data(),rest ? rest->data() : 0);
- QCString macroName;
- QCString expMacro;
- int i=pos,l,p,len;
- while ((p=getNextId(expr,i,&l))!=-1) // search for an macro name
- {
- bool replaced=FALSE;
- macroName=expr.mid(p,l);
- //printf("macroName %s found\n",macroName.data());
- if (p<2 || !(expr.at(p-2)=='@' && expr.at(p-1)=='-')) // no-rescan marker?
- {
- if (g_expandedDict->find(macroName)==0) // expand macro
- {
- Define *def=isDefined(macroName);
- if (def && def->nargs==-1) // simple macro
- {
- // substitute the definition of the macro
- //printf("macro `%s'->`%s'\n",macroName.data(),def->definition.data());
- if (g_nospaces)
- {
- expMacro=def->definition.stripWhiteSpace();
- }
- else
- {
- expMacro=" "+def->definition.stripWhiteSpace()+" ";
- }
- //expMacro=def->definition.stripWhiteSpace();
- replaced=TRUE;
- len=l;
- //printf("simple macro expansion=`%s'->`%s'\n",macroName.data(),expMacro.data());
- }
- else if (def && def->nargs>=0) // function macro
- {
- replaced=replaceFunctionMacro(expr,rest,p+l,len,def,expMacro);
- len+=l;
- }
-
- if (replaced) // expand the macro and rescan the expression
- {
-
- //printf("replacing `%s'->`%s'\n",expr.mid(p,len).data(),expMacro.data());
- QCString resultExpr=expMacro;
- QCString restExpr=expr.right(expr.length()-len-p);
- processConcatOperators(resultExpr);
- if (!def->nonRecursive)
- {
- g_expandedDict->insert(macroName,def);
- expandExpression(resultExpr,&restExpr,0);
- g_expandedDict->remove(macroName);
- }
- expr=expr.left(p)+resultExpr+restExpr;
- i=p;
- //printf("new expression: %s\n",expr.data());
- }
- else // move to the next macro name
- {
- //printf("moving to the next macro old=%d new=%d\n",i,p+l);
- i=p+l;
- }
- }
- else // move to the next macro name
- {
- expr=expr.left(p)+"@-"+expr.right(expr.length()-p);
- //printf("macro already expanded, moving to the next macro expr=%s\n",expr.data());
- i=p+l+2;
- //i=p+l;
- }
- }
- else // no re-scan marker found, skip the macro name
- {
- //printf("skipping marked macro\n");
- i=p+l;
- }
- }
-}
-
-/*! replaces all occurrences of @@@@ in \a s by @@
- * and removes all occurrences of @@E.
- * All identifiers found are replaced by 0L
- */
-QCString removeIdsAndMarkers(const char *s)
-{
- //printf("removeIdsAndMarkers(%s)\n",s);
- const char *p=s;
- char c;
- bool inNum=FALSE;
- QCString result;
- if (p)
- {
- while ((c=*p))
- {
- if (c=='@') // replace @@ with @ and remove @E
- {
- if (*(p+1)=='@')
- {
- result+=c;
- }
- else if (*(p+1)=='E')
- {
- // skip
- }
- p+=2;
- }
- else if (isdigit(c)) // number
- {
- result+=c;
- p++;
- inNum=TRUE;
- }
- else if (c=='d' && !inNum) // identifier starting with a `d'
- {
- if (strncmp(p,"defined ",8)==0 || strncmp(p,"defined(",8)==0)
- // defined keyword
- {
- p+=7; // skip defined
- }
- else
- {
- result+="0L";
- p++;
- while ((c=*p) && isId(c)) p++;
- }
- }
- else if ((isalpha(c) || c=='_') && !inNum) // replace identifier with 0L
- {
- result+="0L";
- p++;
- while ((c=*p) && isId(c)) p++;
- }
- else if (c=='/') // skip C comments
- {
- char pc=c;
- c=*++p;
- if (c=='*') // start of C comment
- {
- while (*p && !(pc=='*' && c=='/')) // search end of comment
- {
- pc=c;
- c=*++p;
- }
- p++;
- }
- else // oops, not comment but division
- {
- result+=pc;
- goto nextChar;
- }
- }
- else
- {
-nextChar:
- result+=c;
- char lc=tolower(c);
- if (!isId(lc) && lc!='.' && lc!='-' && lc!='+') inNum=FALSE;
- p++;
- }
- }
- }
- //printf("removeIdsAndMarkers(%s)=%s\n",s,result.data());
- return result;
-}
-
-/*! replaces all occurrences of @@ in \a s by @
- * \par assumption:
- * \a s only contains pairs of @@'s
- */
-QCString removeMarkers(const char *s)
-{
- const char *p=s;
- char c;
- QCString result;
- if (p)
- {
- while ((c=*p))
- {
- if (c=='@') // replace @@ with @
- {
- if (*(p+1)=='@')
- {
- result+=c;
- }
- p+=2;
- }
- else if (c=='/') // skip C comments
- {
- result+=c;
- char pc=c;
- c=*++p;
- if (c=='*') // start of C comment
- {
- while (*p && !(pc=='*' && c=='/')) // search end of comment
- {
- result+=c;
- pc=c;
- c=*++p;
- }
- result+=c;
- p++;
- }
- }
- else
- {
- result+=c;
- p++;
- }
- }
- }
- //printf("RemoveMarkers(%s)=%s\n",s,result.data());
- return result;
-}
-
-/*! compute the value of the expression in string \a expr.
- * If needed the function may read additional characters from the input.
- */
-
-bool computeExpression(const QCString &expr)
-{
- QCString e=expr;
- expandExpression(e,0,0);
- //printf("after expansion `%s'\n",e.data());
- e = removeIdsAndMarkers(e);
- if (e.isEmpty()) return FALSE;
- //printf("parsing `%s'\n",e.data());
- return parseCppExpression(g_yyFileName,g_yyLineNr,e);
-}
-
-/*! expands the macro definition in \a name
- * If needed the function may read additional characters from the input
- */
-
-QCString expandMacro(const QCString &name)
-{
- QCString n=name;
- expandExpression(n,0,0);
- n=removeMarkers(n);
- //printf("expandMacro `%s'->`%s'\n",name.data(),n.data());
- return n;
-}
-
-Define *newDefine()
-{
- Define *def=new Define;
- def->name = g_defName;
- def->definition = g_defText.stripWhiteSpace();
- def->nargs = g_defArgs;
- def->fileName = g_yyFileName;
- def->lineNr = g_yyLineNr;
- def->varArgs = g_defVarArgs;
- //printf("newDefine: `%s'->`%s'\n",def->name.data(),def->definition.data());
- if (!def->name.isEmpty() && Doxygen::expandAsDefinedDict[def->name])
- {
- def->isPredefined=TRUE;
- }
- return def;
-}
-
-void addDefine()
-{
- if (g_skip) return; // do not add this define as it is inside a
- // conditional section (@cond command) that is disabled.
-
- //printf("addDefine %s %s\n",g_defName.data(),g_defArgsStr.data());
- //ArgumentList *al = new ArgumentList;
- //stringToArgumentList(g_defArgsStr,al);
- MemberDef *md=new MemberDef(
- g_yyFileName,g_yyLineNr,
- "#define",g_defName,g_defArgsStr,0,
- Public,Normal,FALSE,FALSE,MemberDef::Define,0,0);
- if (!g_defArgsStr.isEmpty())
- {
- ArgumentList *argList = new ArgumentList;
- //printf("addDefine() g_defName=`%s' g_defArgsStr=`%s'\n",g_defName.data(),g_defArgsStr.data());
- stringToArgumentList(g_defArgsStr,argList);
- md->setArgumentList(argList);
- }
- //printf("Setting initializer for `%s' to `%s'\n",g_defName.data(),g_defText.data());
- int l=g_defLitText.find('\n');
- if (l>0 && g_defLitText.left(l).stripWhiteSpace()=="\\")
- {
- // strip first line if it only contains a slash
- g_defLitText = g_defLitText.right(g_defLitText.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=g_defLitText.data()+k;
- char c;
- while ((c=*p++) && (c==' ' || c=='\t')) k++;
- g_defLitText=g_defLitText.mid(l+1,k-l-1)+g_defLitText.stripWhiteSpace();
- }
- md->setInitializer(g_defLitText.stripWhiteSpace());
-
- //md->setDefFile(g_yyFileName);
- //md->setDefLine(g_yyLineNr);
- md->setFileDef(g_yyFileDef);
- md->setDefinition("#define "+g_defName);
-
- MemberName *mn=Doxygen::functionNameSDict[g_defName];
- if (mn==0)
- {
- mn = new MemberName(g_defName);
- //Doxygen::functionNameList.append(mn);
- //Doxygen::functionNameDict.insert(g_defName,mn);
- Doxygen::functionNameSDict.append(g_defName,mn);
- }
- mn->append(md);
- if (g_yyFileDef) g_yyFileDef->insertMember(md);
-
- //Define *d;
- //if ((d=defineDict[g_defName])==0) defineDict.insert(g_defName,newDefine());
-}
-
-static inline void outputChar(char c)
-{
- if (g_includeStack.isEmpty() || g_curlyCount>0) g_outputBuf->addChar(c);
-}
-
-static inline void outputArray(const char *a,int len)
-{
- if (g_includeStack.isEmpty() || g_curlyCount>0) g_outputBuf->addArray(a,len);
-}
-
-static void readIncludeFile(const QCString &inc)
-{
- if (!Config_getBool("SEARCH_INCLUDES")) return; // do not read include files
- uint i=0;
-
- // find the start of the include file name
- while (i<inc.length() &&
- (inc.at(i)==' ' || inc.at(i)=='"' || inc.at(i)=='<')
- ) i++;
- uint s=i;
-
- // was it a local include?
- bool localInclude = s>0 && inc.at(s-1)=='"';
-
- // find the end of the include file name
- while (i<inc.length() && inc.at(i)!='"' && inc.at(i)!='>') i++;
-
- if (s<inc.length() && i>s) // valid include file name found
- {
- // extract include path+name
- QCString incFileName=inc.mid(s,i-s).stripWhiteSpace();
-
- FILE *f;
- QCString oldFileName = g_yyFileName.copy();
- FileDef *oldFileDef = g_yyFileDef;
- int oldLineNr = g_yyLineNr;
- //printf("Searching for `%s'\n",incFileName.data());
-
- // findFile will overwrite g_yyFileDef if found
- if ((f=findFile(incFileName,localInclude))) // see if the include file can be found
- {
- //printf("Found include file!\n");
- if (Debug::isFlagSet(Debug::Preprocessor))
- {
- for (i=0;i<g_includeStack.count();i++) msg(" ");
- msg("#include %s: parsing...\n",incFileName.data());
- }
- if (oldFileDef)
- {
- // add include dependency to the file in which the #include was found
- oldFileDef->addIncludeDependency(g_yyFileDef,incFileName,localInclude,g_isImported);
- // add included by dependency
- if (g_yyFileDef)
- {
- //printf("Adding include dependency %s->%s\n",oldFileDef->name().data(),incFileName.data());
- g_yyFileDef->addIncludedByDependency(oldFileDef,oldFileDef->docName(),localInclude,g_isImported);
- }
- }
- FileState *fs=new FileState;
- fs->bufState=YY_CURRENT_BUFFER;
- fs->lineNr=oldLineNr;
- fs->fileName=oldFileName;
- fs->filePtr=f;
- // push the state on the stack
- g_includeStack.push(fs);
- // set the scanner to the include file
-
- // Deal with file changes due to
- // #include's within { .. } blocks
- QCString lineStr;
- lineStr.sprintf("# 1 \"%s\" 1\n",g_yyFileName.data());
- outputArray(lineStr.data(),lineStr.length());
-
- //fprintf(stderr,"Switching to include file %s\n",incFileName.data());
- preYYin=f;
- yy_switch_to_buffer(yy_create_buffer(preYYin, YY_BUF_SIZE));
- }
- else
- {
- if (oldFileDef)
- {
- bool ambig;
- FileDef *fd = findFileDef(Doxygen::inputNameDict,incFileName,ambig);
- //printf("findFileDef(%s)=%p\n",incFileName.data(),fd);
- // add include dependency to the file in which the #include was found
- oldFileDef->addIncludeDependency(fd,incFileName,localInclude,g_isImported);
- // 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,g_isImported);
- }
- }
- if (Debug::isFlagSet(Debug::Preprocessor))
- {
- msg("#include %s: not found or already included! skipping...\n",incFileName.data());
- //printf("Error: include file %s not found\n",yytext);
- }
- }
- }
-}
-
-/* ----------------------------------------------------------------- */
-
-static void startCondSection(const char *sectId)
-{
- g_condStack.push(new bool(g_skip));
- if (Config_getList("ENABLED_SECTIONS").find(sectId)==-1)
- {
- g_skip=TRUE;
- }
-}
-
-static void endCondSection()
-{
- if (g_condStack.isEmpty())
- {
- g_skip=FALSE;
- }
- else
- {
- bool *ctx = g_condStack.pop();
- g_skip=*ctx;
- }
-}
-
-
-/* ----------------------------------------------------------------- */
-
-#undef YY_INPUT
-#define YY_INPUT(buf,result,max_size) result=yyread(buf,max_size);
-
-static int yyread(char *buf,int max_size)
-{
- int len = fread( buf, 1, max_size, yyin );
- if (len==0 && ferror( yyin ))
- {
- yy_fatal_error( "input in flex scanner failed" );
- return len;
- }
- return filterCRLF(buf,len);
-}
-
-/* ----------------------------------------------------------------- */
-
-%}
-
-ID [a-z_A-Z][a-z_A-Z0-9]*
-B [ \t]
-BN [ \t\r\n]
-CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^'\\\n]{1,4}"'"))
-
-%option noyywrap
-
-%x Start
-%x Command
-%x SkipCommand
-%x SkipLine
-%x CopyLine
-%x CopyString
-%x Include
-%x IncludeID
-%x DefName
-%x DefineArg
-%x DefineText
-%x SkipCPPBlock
-%x Ifdef
-%x Ifndef
-%x SkipCComment
-%x CopyCComment
-%x SkipVerbatim
-%x SkipCPPComment
-%x RemoveCComment
-%x RemoveCPPComment
-%x Guard
-%x DefinedExpr1
-%x DefinedExpr2
-%x SkipDoubleQuote
-%x SkipSingleQuote
-%x UndefName
-%x IgnoreLine
-%x FindDefineArgs
-%x ReadString
-%x CondLine
-
-%%
-
-<*>\x06
-<*>\x00
-<*>\r
-<Start>^{B}*"#" { BEGIN(Command); }
-<Start>^{B}*/[^#] {
- outputArray(yytext,yyleng);
- BEGIN(CopyLine);
- }
-<Start>^{B}*[_A-Z][_A-Z0-9]*"("[^\)\n]*")"/{BN}{1,10}*[:{] { // constructors?
- int i;
- for (i=yyleng-1;i>=0;i--)
- {
- unput(yytext[i]);
- }
- BEGIN(CopyLine);
- }
-<Start>^{B}*[_A-Z][_A-Z0-9]*{B}*"("[^\)\n]*")"{B}*\n { // function like macro
- static bool skipFuncMacros = Config_getBool("SKIP_FUNCTION_MACROS");
- QCString name(yytext);
- name=name.left(name.find('(')).stripWhiteSpace();
-
- Define *def=0;
- if (skipFuncMacros &&
- name!="Q_PROPERTY" &&
- !(
- (g_includeStack.isEmpty() || g_curlyCount>0) &&
- g_macroExpansion &&
- (def=g_fileDefineDict->find(name)) &&
- (!g_expandOnlyPredef || def->isPredefined)
- )
- )
- {
- outputChar('\n');
- g_yyLineNr++;
- }
- else // don't skip
- {
- int i;
- for (i=yyleng-1;i>=0;i--)
- {
- unput(yytext[i]);
- }
- BEGIN(CopyLine);
- }
- }
-<CopyLine>"extern"{BN}{0,80}"\"C\""*{BN}{0,80}"{" {
- QCString text=yytext;
- g_yyLineNr+=text.contains('\n');
- outputArray(yytext,yyleng);
- }
-<CopyLine>"{" { // count brackets inside the main file
- if (g_includeStack.isEmpty())
- {
- g_curlyCount++;
- }
- outputChar(*yytext);
- }
-<CopyLine>"}" { // count brackets inside the main file
- if (g_includeStack.isEmpty() && g_curlyCount>0)
- {
- g_curlyCount--;
- }
- outputChar(*yytext);
- }
-<CopyLine>"'"\\[0-7]{1,3}"'" {
- outputArray(yytext,yyleng);
- }
-<CopyLine>"'"\\."'" {
- outputArray(yytext,yyleng);
- }
-<CopyLine>"'"."'" {
- outputArray(yytext,yyleng);
- }
-<CopyLine>\" {
- outputChar(*yytext);
- BEGIN( CopyString );
- }
-<CopyString>[^\"\\\r\n]+ {
- outputArray(yytext,yyleng);
- }
-<CopyString>\\. {
- outputArray(yytext,yyleng);
- }
-<CopyString>\" {
- outputChar(*yytext);
- BEGIN( CopyLine );
- }
-<CopyLine>{ID}/{BN}{0,80}"(" {
- Define *def=0;
- //def=g_fileDefineDict->find(yytext);
- //printf("Search for define %s found=%d g_includeStack.isEmpty()=%d "
- // "g_curlyCount=%d g_macroExpansion=%d g_expandOnlyPredef=%d "
- // "isPreDefined=%d\n",yytext,def ? 1 : 0,
- // g_includeStack.isEmpty(),g_curlyCount,g_macroExpansion,g_expandOnlyPredef,
- // def ? def->isPredefined : -1
- // );
- if ((g_includeStack.isEmpty() || g_curlyCount>0) &&
- g_macroExpansion &&
- (def=g_fileDefineDict->find(yytext)) &&
- (!g_expandOnlyPredef || def->isPredefined)
- )
- {
- //printf("Found it!\n");
- g_roundCount=0;
- g_defArgsStr=yytext;
- if (def->nargs==-1) // no function macro
- {
- QCString result = expandMacro(g_defArgsStr);
- //printf("result=`%s'\n",result.data());
- outputArray(result,result.length());
- }
- else // zero or more arguments
- {
- g_findDefArgContext = CopyLine;
- BEGIN(FindDefineArgs);
- }
- }
- else
- {
- outputArray(yytext,yyleng);
- }
- }
-<CopyLine>{ID} {
- Define *def=0;
- //printf("Search for define %s\n",yytext);
- if ((g_includeStack.isEmpty() || g_curlyCount>0) &&
- g_macroExpansion &&
- (def=g_fileDefineDict->find(yytext)) &&
- def->nargs==-1 &&
- (!g_expandOnlyPredef || def->isPredefined)
- )
- {
- //printf("Found it!\n");
- QCString name=yytext;
- QCString result=expandMacro(name);
- //printf("result=`%s'\n",result.data());
- outputArray(result,result.length());
- }
- else
- {
- outputArray(yytext,yyleng);
- }
- }
-<CopyLine>. {
- outputChar(*yytext);
- }
-<CopyLine>\n {
- outputChar('\n');
- BEGIN(Start);
- g_yyLineNr++;
- }
-<FindDefineArgs>"(" {
- g_defArgsStr+='(';
- g_roundCount++;
- }
-<FindDefineArgs>")" {
- g_defArgsStr+=')';
- g_roundCount--;
- if (g_roundCount==0)
- {
- QCString result=expandMacro(g_defArgsStr);
- //printf("g_defArgsStr=`%s'->`%s'\n",g_defArgsStr.data(),result.data());
- if (g_findDefArgContext==CopyLine)
- {
- outputArray(result,result.length());
- BEGIN(g_findDefArgContext);
- }
- else // g_findDefArgContext==IncludeID
- {
- readIncludeFile(result);
- g_nospaces=FALSE;
- BEGIN(Start);
- }
- }
- }
- /*
-<FindDefineArgs>")"{B}*"(" {
- g_defArgsStr+=yytext;
- }
- */
-<FindDefineArgs>{CHARLIT} {
- g_defArgsStr+=yytext;
- }
-<FindDefineArgs>\" {
- g_defArgsStr+=*yytext;
- BEGIN(ReadString);
- }
-<FindDefineArgs>\n {
- g_yyLineNr++;
- outputChar('\n');
- }
-<FindDefineArgs>"@" {
- g_defArgsStr+="@@";
- }
-<FindDefineArgs>. {
- g_defArgsStr+=*yytext;
- }
-<ReadString>"\"" {
- g_defArgsStr+=*yytext;
- BEGIN(FindDefineArgs);
- }
-<ReadString>"//"|"/*" {
- g_defArgsStr+=yytext;
- }
-<ReadString>\\. {
- g_defArgsStr+=yytext;
- }
-<ReadString>. {
- g_defArgsStr+=*yytext;
- }
-<Command>("include"|"import"){B}+/{ID} {
- g_isImported = yytext[1]=='m';
- if (g_macroExpansion)
- BEGIN(IncludeID);
- }
-<Command>("include"|"import"){B}*[<"] {
- g_isImported = yytext[1]=='m';
- char c[2];
- c[0]=yytext[yyleng-1];c[1]='\0';
- g_incName=c;
- BEGIN(Include);
- }
-<Command>"define"{B}+ {
- //printf("!!!DefName\n");
- BEGIN(DefName);
- }
-<Command>"ifdef"/{B}*"(" {
- incrLevel();
- g_guardExpr.resize(0);
- BEGIN(DefinedExpr2);
- }
-<Command>"ifdef"/{B}+ {
- //printf("Pre.l: ifdef\n");
- incrLevel();
- g_guardExpr.resize(0);
- BEGIN(DefinedExpr1);
- }
-<Command>"ifndef"/{B}*"(" {
- incrLevel();
- g_guardExpr="! ";
- BEGIN(DefinedExpr2);
- }
-<Command>"ifndef"/{B}+ {
- incrLevel();
- g_guardExpr="! ";
- BEGIN(DefinedExpr1);
- }
-<Command>"if"/[ \t(!] {
- incrLevel();
- g_guardExpr.resize(0);
- BEGIN(Guard);
- }
-<Command>("elif"|"else"{B}*"if")/[ \t(!] {
- if (!otherCaseDone())
- {
- g_guardExpr.resize(0);
- BEGIN(Guard);
- }
- else
- {
- g_ifcount=0;
- BEGIN(SkipCPPBlock);
- }
- }
-<Command>"else"/[^a-z_A-Z0-9] {
- //printf("else g_levelGuard[%d]=%d\n",g_level-1,g_levelGuard[g_level-1]);
- if (otherCaseDone())
- {
- g_ifcount=0;
- BEGIN(SkipCPPBlock);
- }
- else
- {
- setCaseDone(TRUE);
- //g_levelGuard[g_level-1]=TRUE;
- }
- }
-<Command>"undef"{B}+ {
- BEGIN(UndefName);
- }
-<Command>("elif"|"else"{B}*"if")/[ \t(!] {
- if (!otherCaseDone())
- {
- g_guardExpr.resize(0);
- BEGIN(Guard);
- }
- }
-<Command>"endif"/[^a-z_A-Z0-9] {
- //printf("Pre.l: #endif\n");
- decrLevel();
- }
-<Command,IgnoreLine>\n {
- outputChar('\n');
- BEGIN(Start);
- g_yyLineNr++;
- }
-<Command>{ID} { // unknown directive
- BEGIN(IgnoreLine);
- }
-<IgnoreLine>\\[\r]?\n {
- outputChar('\n');
- g_yyLineNr++;
- }
-<IgnoreLine>.
-<Command>.
-<UndefName>{ID} {
- Define *def;
- if ((def=isDefined(yytext))
- /*&& !def->isPredefined*/
- && !def->nonRecursive
- )
- {
- //printf("undefining %s\n",yytext);
- def->undef=TRUE;
- }
- BEGIN(Start);
- }
-<Guard>\\[\r]?\n {
- outputChar('\n');
- g_guardExpr+=' ';
- g_yyLineNr++;
- }
-<Guard>"defined"/{B}*"(" {
- BEGIN(DefinedExpr2);
- }
-<Guard>"defined"/{B}+ {
- BEGIN(DefinedExpr1);
- }
-<Guard>{ID} { g_guardExpr+=yytext; }
-<Guard>. { g_guardExpr+=*yytext; }
-<Guard>\n {
- outputChar('\n');
- g_yyLineNr++;
- //printf("Guard: `%s'\n",
- // g_guardExpr.data());
- bool guard=computeExpression(g_guardExpr);
- setCaseDone(guard);
- //printf("if g_levelGuard[%d]=%d\n",g_level-1,g_levelGuard[g_level-1]);
- if (guard)
- {
- BEGIN(Start);
- }
- else
- {
- g_ifcount=0;
- BEGIN(SkipCPPBlock);
- }
- }
-<DefinedExpr1,DefinedExpr2>\\\n { g_yyLineNr++; outputChar('\n'); }
-<DefinedExpr1>{ID} {
- if (isDefined(yytext))
- g_guardExpr+=" 1L ";
- else
- g_guardExpr+=" 0L ";
- g_lastGuardName=yytext;
- BEGIN(Guard);
- }
-<DefinedExpr2>{ID} {
- if (isDefined(yytext))
- g_guardExpr+=" 1L ";
- else
- g_guardExpr+=" 0L ";
- g_lastGuardName.resize(0);
- }
-<DefinedExpr1,DefinedExpr2>\n { // should not happen, handle anyway
- g_ifcount=0;
- BEGIN(SkipCPPBlock);
- }
-<DefinedExpr2>")" {
- BEGIN(Guard);
- }
-<DefinedExpr1,DefinedExpr2>.
-<SkipCPPBlock>^{B}*"#" { BEGIN(SkipCommand); }
-<SkipCPPBlock>^{B}*/[^#] { BEGIN(SkipLine); }
-<SkipCPPBlock>.
-<SkipCommand>"if"(("n")?("def"))?/[ \t(!] {
- incrLevel();
- g_ifcount++;
- //printf("#if... depth=%d\n",g_ifcount);
- }
-<SkipCommand>"else" {
- //printf("Else! g_ifcount=%d otherCaseDone=%d\n",g_ifcount,otherCaseDone());
- if (g_ifcount==0 && !otherCaseDone())
- {
- setCaseDone(TRUE);
- //outputChar('\n');
- BEGIN(Start);
- }
- }
-<SkipCommand>("elif"|"else"{B}*"if")/[ \t(!] {
- if (g_ifcount==0)
- {
- if (!otherCaseDone())
- {
- g_guardExpr.resize(0);
- g_lastGuardName.resize(0);
- BEGIN(Guard);
- }
- else
- {
- BEGIN(SkipCPPBlock);
- }
- }
- }
-<SkipCommand>"endif" {
- decrLevel();
- if (--g_ifcount<0)
- {
- //outputChar('\n');
- BEGIN(Start);
- }
- }
-<SkipCommand>\n {
- outputChar('\n');
- g_yyLineNr++;
- BEGIN(SkipCPPBlock);
- }
-<SkipCommand>{ID} { // unknown directive
- BEGIN(SkipLine);
- }
-<SkipCommand>.
-<SkipLine>[^/\n]+
-<SkipLine>.
-<SkipLine,SkipCommand,SkipCPPBlock>"//" {
- g_lastCPPContext=YY_START;
- BEGIN(RemoveCPPComment);
- }
-<SkipLine,SkipCommand,SkipCPPBlock>"/*" {
- g_lastCContext=YY_START;
- BEGIN(RemoveCComment);
- }
-<SkipLine>\n {
- outputChar('\n');
- g_yyLineNr++;
- BEGIN(SkipCPPBlock);
- }
-<IncludeID>{ID}{B}*/"(" {
- g_nospaces=TRUE;
- g_roundCount=0;
- g_defArgsStr=yytext;
- g_findDefArgContext = IncludeID;
- BEGIN(FindDefineArgs);
- }
-<IncludeID>{ID} {
- g_nospaces=TRUE;
- readIncludeFile(expandMacro(yytext));
- BEGIN(Start);
- }
-<Include>[^\">\n]+[\">] {
- g_incName+=yytext;
- readIncludeFile(g_incName);
- BEGIN(Start);
- }
-<DefName>{ID}/"(" {
- //printf("Define() `%s'\n",yytext);
- g_argDict = new QDict<int>(31);
- g_argDict->setAutoDelete(TRUE);
- g_defArgs = 0;
- g_defArgsStr.resize(0);
- g_defText.resize(0);
- g_defLitText.resize(0);
- g_defName = yytext;
- g_defVarArgs = FALSE;
- BEGIN(DefineArg);
- }
-<DefName>{ID}/{B}* {
- //printf("Define `%s'\n",yytext);
- g_argDict = 0;
- g_defArgs = -1;
- g_defArgsStr.resize(0);
- g_defText.resize(0);
- g_defLitText.resize(0);
- g_defName = yytext;
- g_defVarArgs = FALSE;
- QCString tmp=(QCString)"#define "+g_defName+g_defArgsStr;
- outputArray(tmp.data(),tmp.length());
- g_quoteArg=FALSE;
- g_insideComment=FALSE;
- BEGIN(DefineText);
- }
-<DefName>{ID}/{B}*"\n" {
- g_argDict = 0;
- g_defArgs = -1;
- g_defName = yytext;
- g_defArgsStr.resize(0);
- g_defText.resize(0);
- g_defLitText.resize(0);
- g_defVarArgs = FALSE;
- if ( g_defName!=g_lastGuardName )
- { // define may appear in the output
- QCString tmp=(QCString)"#define "+g_defName;
- outputArray(tmp.data(),tmp.length());
- g_quoteArg=FALSE;
- g_insideComment=FALSE;
- BEGIN(DefineText);
- }
- else // define is a guard => hide
- {
- //printf("Found a guard %s\n",yytext);
- Define *def=g_fileDefineDict->find(g_defName);
- //if (g_includeStack.isEmpty())
- //{
- // addDefine();
- //}
- if (def==0) // new define name for this file
- {
- g_fileDefineDict->insert(g_defName,newDefine());
- }
- else // name already exists
- {
- if (def->undef) // undefined name
- {
- def->undef = FALSE;
- def->name = g_defName;
- def->definition = g_defText.stripWhiteSpace();
- def->nargs = g_defArgs;
- def->fileName = g_yyFileName.copy();
- def->lineNr = g_yyLineNr;
- }
- else
- {
- //printf("Error: define %s is defined more than once!\n",g_defName.data());
- }
- }
- g_lastGuardName.resize(0);
- BEGIN(Start);
- }
- }
-<DefineArg>","{B}* { g_defArgsStr+=yytext; }
-<DefineArg>"("{B}* { g_defArgsStr+=yytext; }
-<DefineArg>{B}*")"{B}* {
- g_defArgsStr+=yytext;
- QCString tmp=(QCString)"#define "+g_defName+g_defArgsStr;
- outputArray(tmp.data(),tmp.length());
- g_quoteArg=FALSE;
- g_insideComment=FALSE;
- BEGIN(DefineText);
- }
-<DefineArg>{ID}{B}*("..."?) {
- //printf("Define addArg(%s)\n",yytext);
- QCString argName=yytext;
- g_defVarArgs = yytext[yyleng-1]=='.';
- if (g_defVarArgs) // strip ellipsis
- {
- argName=argName.left(argName.length()-3);
- }
- argName = argName.stripWhiteSpace();
- g_defArgsStr+=yytext;
- g_argDict->insert(argName,new int(g_defArgs));
- g_defArgs++;
- }
- /*
-<DefineText>"/ **"|"/ *!" {
- g_defText+=yytext;
- g_defLitText+=yytext;
- g_insideComment=TRUE;
- }
-<DefineText>"* /" {
- g_defText+=yytext;
- g_defLitText+=yytext;
- g_insideComment=FALSE;
- }
- */
-<DefineText>"/*" {
- g_defText+=yytext;
- g_defLitText+=yytext;
- g_lastCContext=YY_START;
- g_commentCount=1;
- BEGIN(CopyCComment);
- }
-<DefineText>"//" {
- outputChar('/');outputChar('/');
- g_lastCPPContext=YY_START;
- g_defLitText+=' ';
- BEGIN(SkipCPPComment);
- }
-<SkipCComment>[/]?"*/" {
- if (yytext[0]=='/') outputChar('/');
- outputChar('*');outputChar('/');
- if (--g_commentCount<=0)
- {
- BEGIN(g_lastCContext);
- }
- }
-<SkipCComment>"//" {
- outputChar('/');outputChar('/');
- }
-<SkipCComment>"/*" {
- outputChar('/');outputChar('*');
- //g_commentCount++;
- }
-<SkipCComment>[\\@][\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"rtfonly"|"manonly"|"dot"|"code"){BN}+ {
- outputArray(yytext,yyleng);
- }
-<SkipCComment>[\\@]("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"rtfonly"|"manonly"|"dot"|"code"){BN}+ {
- outputArray(yytext,yyleng);
- g_blockName=QCString(&yytext[1]).stripWhiteSpace();
- BEGIN(SkipVerbatim);
- }
-<SkipCComment,SkipCPPComment>[\\@]"cond"[ \t]+ { // conditional section
- g_condCtx = YY_START;
- outputArray(yytext,yyleng);
- BEGIN(CondLine);
- }
-<CondLine>[a-z_A-Z][a-z_A-Z0-9.\-]* {
- startCondSection(yytext);
- outputArray(yytext,yyleng);
- BEGIN(g_condCtx);
- }
-<SkipCComment,SkipCPPComment>[\\@]"cond"[ \t]+\n |
-<CondLine>. {
- outputArray(yytext,yyleng);
- startCondSection(" ");
- if (YY_START==CondLine) BEGIN(g_condCtx);
- }
-<SkipCComment,SkipCPPComment>[\\@]"endcond"/[^a-z_A-Z0-9] {
- outputArray(yytext,yyleng);
- endCondSection();
- }
-<SkipVerbatim>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"endrtfonly"|"endmanonly"|"enddot"|"endcode") { /* end of verbatim block */
- outputArray(yytext,yyleng);
- if (&yytext[4]==g_blockName)
- {
- BEGIN(SkipCComment);
- }
- }
-<SkipCComment,SkipVerbatim>[^*\\@\x06\n\/]+ {
- outputArray(yytext,yyleng);
- }
-<SkipCComment,SkipVerbatim>\n {
- g_yyLineNr++;
- outputChar('\n');
- }
-<SkipCComment,SkipVerbatim>. {
- outputChar(*yytext);
- }
-<CopyCComment>[^*]+ {
- g_defLitText+=yytext;
- g_defText+=yytext;
- }
-<CopyCComment>"*/" {
- g_defLitText+=yytext;
- g_defText+=yytext;
- BEGIN(g_lastCContext);
- }
-<CopyCComment>\n {
- g_yyLineNr++;
- g_defLitText+=yytext;
- g_defText+=yytext;
- }
-<CopyCComment>. {
- g_defLitText+=yytext;
- g_defText+=yytext;
- }
-<RemoveCComment>"*/" { BEGIN(g_lastCContext); }
-<RemoveCComment>"//"
-<RemoveCComment>"/*"
-<RemoveCComment>[^*\x06\n]+
-<RemoveCComment>\n { g_yyLineNr++; outputChar('\n'); }
-<RemoveCComment>.
-<SkipCPPComment>[^\n\/\\@]+ {
- outputArray(yytext,yyleng);
- }
-<SkipCPPComment,RemoveCPPComment>\n {
- unput(*yytext);
- BEGIN(g_lastCPPContext);
- }
-<SkipCPPComment>"/*" {
- outputChar('/');outputChar('*');
- }
-<SkipCPPComment>"//" {
- outputChar('/');outputChar('/');
- }
-<SkipCPPComment>[^\x06\n]+ {
- outputArray(yytext,yyleng);
- }
-<SkipCPPComment>. {
- outputChar(*yytext);
- }
-<RemoveCPPComment>"/*"
-<RemoveCPPComment>"//"
-<RemoveCPPComment>[^\x06\n]+
-<RemoveCPPComment>.
-<DefineText>"#" {
- g_quoteArg=TRUE;
- g_defLitText+=yytext;
- }
-<DefineText>{ID} {
- g_defLitText+=yytext;
- if (g_quoteArg)
- {
- g_defText+="\"";
- }
- if (g_defArgs>0)
- {
- int *n;
- if ((n=(*g_argDict)[yytext]))
- {
- //if (!g_quoteArg) g_defText+=' ';
- g_defText+='@';
- QCString numStr;
- numStr.sprintf("%d",*n);
- g_defText+=numStr;
- //if (!g_quoteArg) g_defText+=' ';
- }
- else
- {
- g_defText+=yytext;
- }
- }
- else
- {
- g_defText+=yytext;
- }
- if (g_quoteArg)
- {
- g_defText+="\"";
- }
- g_quoteArg=FALSE;
- }
-<DefineText>\\[\r]?\n {
- g_defLitText+=yytext;
- outputChar('\n');
- g_defText += ' '; g_yyLineNr++;
- }
-<DefineText>\n {
- QCString comment=extractTrailingComment(g_defLitText);
- g_defLitText+=yytext;
- if (!comment.isEmpty())
- {
- outputArray(comment,comment.length());
- g_defLitText=g_defLitText.left(g_defLitText.length()-comment.length()-1);
- }
- outputChar('\n');
- Define *def=0;
- //printf("Define name=`%s' text=`%s' litTexti=`%s'\n",g_defName.data(),g_defText.data(),g_defLitText.data());
- if (g_includeStack.isEmpty() || g_curlyCount>0)
- {
- addDefine();
- }
- def=g_fileDefineDict->find(g_defName);
- if (def==0) // new define
- {
- //printf("new define!\n");
- g_fileDefineDict->insert(g_defName,newDefine());
- }
- else if (def)// name already exists
- {
- //printf("existing define!\n");
- //printf("define found\n");
- if (def->undef) // undefined name
- {
- def->undef = FALSE;
- def->name = g_defName;
- def->definition = g_defText.stripWhiteSpace();
- def->nargs = g_defArgs;
- def->fileName = g_yyFileName.copy();
- def->lineNr = g_yyLineNr;
- }
- else
- {
- //printf("Error: define %s is defined more than once!\n",g_defName.data());
- }
- }
- delete g_argDict; g_argDict=0;
- g_yyLineNr++;
- g_lastGuardName.resize(0);
- BEGIN(Start);
- }
-<DefineText>{B}* { g_defText += ' '; g_defLitText+=yytext; }
-<DefineText>{B}*"##"{B}* { g_defText += "##"; g_defLitText+=yytext; }
-<DefineText>"@" { g_defText += "@@"; g_defLitText+=yytext; }
-<DefineText>\" {
- g_defText += *yytext;
- g_defLitText+=yytext;
- if (!g_insideComment)
- {
- BEGIN(SkipDoubleQuote);
- }
- }
-<DefineText>\' { g_defText += *yytext;
- g_defLitText+=yytext;
- if (!g_insideComment)
- {
- BEGIN(SkipSingleQuote);
- }
- }
-<SkipDoubleQuote>"//" { g_defText += yytext; g_defLitText+=yytext; }
-<SkipDoubleQuote>"/*" { g_defText += yytext; g_defLitText+=yytext; }
-<SkipDoubleQuote>\" {
- g_defText += *yytext; g_defLitText+=yytext;
- BEGIN(DefineText);
- }
-<SkipSingleQuote,SkipDoubleQuote>\\. {
- g_defText += yytext; g_defLitText+=yytext;
- }
-<SkipSingleQuote>\' {
- g_defText += *yytext; g_defLitText+=yytext;
- BEGIN(DefineText);
- }
-<SkipDoubleQuote>. { g_defText += *yytext; g_defLitText+=yytext; }
-<SkipSingleQuote>. { g_defText += *yytext; g_defLitText+=yytext; }
-<DefineText>. { g_defText += *yytext; g_defLitText+=yytext; }
-<<EOF>> {
- //fprintf(stderr,"End of include file\n");
- //printf("Include stack depth=%d\n",g_includeStack.count());
- if (g_includeStack.isEmpty())
- {
- //fprintf(stderr,"Terminating scanner!\n");
- yyterminate();
- }
- else
- {
- FileState *fs=g_includeStack.pop();
- //fileDefineCache->merge(g_yyFileName,fs->fileName);
- if (getFileFilter(fs->fileName.data()).isEmpty())
- fclose(fs->filePtr);
- else
- pclose(fs->filePtr);
- YY_BUFFER_STATE oldBuf = YY_CURRENT_BUFFER;
- yy_switch_to_buffer( fs->bufState );
- yy_delete_buffer( oldBuf );
- g_yyLineNr=fs->lineNr;
- setFileName(fs->fileName.copy());
- //fprintf(stderr,"######## FileName %s\n",g_yyFileName.data());
-
- // Deal with file changes due to
- // #include's within { .. } blocks
- QCString lineStr;
- lineStr.sprintf("# %d \"%s\" 2",g_yyLineNr,g_yyFileName.data());
- outputArray(lineStr.data(),lineStr.length());
-
- delete fs; fs=0;
- }
- }
-<*>"/*" {
- outputChar('/');outputChar('*');
- g_lastCContext=YY_START;
- g_commentCount=1;
- BEGIN(SkipCComment);
- }
-<*>"//" {
- outputChar('/');outputChar('/');
- g_lastCPPContext=YY_START;
- BEGIN(SkipCPPComment);
- }
-<*>\n {
- outputChar('\n');
- g_yyLineNr++;
- }
-<*>. {
- outputChar(*yytext);
- }
-
-%%
-
-/*@ ----------------------------------------------------------------------------
- */
-
-static int getNextChar(const QCString &expr,QCString *rest,uint &pos)
-{
- //printf("getNextChar(%s,%s,%d)\n",expr.data(),rest ? rest->data() : 0,pos);
- if (pos<expr.length())
- {
- //printf("%c=expr()\n",expr.at(pos));
- return expr.at(pos++);
- }
- else if (rest && !rest->isEmpty())
- {
- int cc=rest->at(0);
- *rest=rest->right(rest->length()-1);
- //printf("%c=rest\n",cc);
- return cc;
- }
- else
- {
- int cc=yyinput();
- //printf("%c=yyinput()\n",cc);
- return cc;
- }
-}
-
-static int getCurrentChar(const QCString &expr,QCString *rest,uint pos)
-{
- //printf("getCurrentChar(%s,%s,%d)\n",expr.data(),rest ? rest->data() : 0,pos);
- if (pos<expr.length())
- {
- //printf("%c=expr()\n",expr.at(pos));
- return expr.at(pos);
- }
- else if (rest && !rest->isEmpty())
- {
- int cc=rest->at(0);
- //printf("%c=rest\n",cc);
- return cc;
- }
- else
- {
- int cc=yyinput();
- returnCharToStream(cc);
- //unput((char)cc);
- //printf("%c=yyinput()\n",cc);
- return cc;
- }
-}
-
-static void unputChar(const QCString &expr,QCString *rest,uint &pos,char c)
-{
- //printf("unputChar(%s,%s,%d,%c)\n",expr.data(),rest ? rest->data() : 0,pos,c);
- if (pos<expr.length())
- {
- pos++;
- }
- else if (rest)
- {
- //printf("Prepending to rest!\n");
- char cs[2];cs[0]=c;cs[1]='\0';
- rest->prepend(cs);
- }
- else
- {
- //unput(c);
- returnCharToStream(c);
- }
- //printf("result: unputChar(%s,%s,%d,%c)\n",expr.data(),rest ? rest->data() : 0,pos,c);
-}
-
-void addSearchDir(const char *dir)
-{
- QFileInfo fi(dir);
- if (fi.isDir()) g_pathList->append(fi.absFilePath());
-}
-
-void initPreprocessor()
-{
- g_pathList = new QStrList;
- addSearchDir(".");
- //defineNameList.setAutoDelete(TRUE);
- //defineNameList.clear();
- //defineDict.clear();
- //fileDefineCache = new DefineCache(1009);
- g_expandedDict = new DefineDict(17);
- g_fileDefineDict = new DefineDict(1009);
-}
-
-void cleanUpPreprocessor()
-{
- //delete fileDefineCache;
- delete g_fileDefineDict; g_fileDefineDict=0;
- delete g_expandedDict; g_expandedDict=0;
- delete g_pathList; g_pathList=0;
-}
-
-
-void preprocessFile(const char *fileName,BufStr &output)
-{
- uint orgOffset=output.curPos();
-
- g_macroExpansion = Config_getBool("MACRO_EXPANSION");
- g_expandOnlyPredef = Config_getBool("EXPAND_ONLY_PREDEF");
- g_curlyCount=0;
- g_nospaces=FALSE;
- g_outputBuf=&output;
- g_includeStack.setAutoDelete(TRUE);
- g_includeStack.clear();
- g_fileDefineDict->setAutoDelete(TRUE);
- g_fileDefineDict->clear();
- g_expandedDict->setAutoDelete(FALSE);
- g_expandedDict->clear();
- g_condStack.clear();
- g_condStack.setAutoDelete(TRUE);
-
- // 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) 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
- {
- QRegExp reId("[a-z_A-Z][a-z_A-Z0-9]*"); // 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)))
- {
- argDict.insert(ds.mid(p,l),new int(count++));
- i=p+l;
- }
- // 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
- Define *def = new Define;
- def->name = ds.left(i_obrace);
- def->definition = definition;
- def->nargs = count;
- def->isPredefined = TRUE;
- def->nonRecursive = nonRecursive;
- g_fileDefineDict->insert(def->name,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
- {
- 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);
- }
- def->nargs = -1;
- def->isPredefined = TRUE;
- def->nonRecursive = nonRecursive;
- g_fileDefineDict->insert(def->name,def);
-
- //printf("#define `%s' `%s' #nargs=%d\n",
- // def->name.data(),def->definition.data(),def->nargs);
- }
-
- }
-
- QCString inputFilter = getFileFilter(fileName);
- if (inputFilter.isEmpty())
- {
- preYYin = fopen(fileName,"r");
- if (!preYYin)
- {
- err("Error: could not open file %s\n",fileName);
- return;
- }
- }
- else
- {
- QCString cmd = inputFilter+" \""+fileName+"\"";
- Debug::print(Debug::ExtCmd,0,"Executing popen(`%s`)\n",cmd.data());
- preYYin = popen(cmd,"r");
- if (!preYYin)
- {
- err("Error: could not execute filter %s\n",cmd.data());
- return;
- }
- }
- g_yyLineNr = 1;
- g_level = 0;
- g_ifcount = 0;
- setFileName(fileName);
- BEGIN( Start );
-
- g_lastGuardName.resize(0);
- g_guardExpr.resize(0);
-
- preYYlex();
- if (inputFilter.isEmpty())
- fclose(preYYin);
- else
- pclose(preYYin);
-
- if (Debug::isFlagSet(Debug::Preprocessor))
- {
- char *orgPos=output.data()+orgOffset;
- char *newPos=output.data()+output.curPos();
- msg("Preprocessor output (size: %d bytes):\n",newPos-orgPos);
- int line=1;
- msg("---------\n00001 ");
- while (orgPos<newPos)
- {
- putchar(*orgPos);
- if (*orgPos=='\n') printf("%05d ",++line);
- orgPos++;
- }
- msg("\n---------\n");
- }
-}
-
-#if !defined(YY_FLEX_SUBMINOR_VERSION)
-extern "C" { // some bogus code to keep the compiler happy
-// int preYYwrap() { return 1 ; }
- void preYYdummy() { yy_flex_realloc(0,0); }
-}
-#endif
-
diff --git a/src/printdocvisitor.h b/src/printdocvisitor.h
deleted file mode 100644
index 2cdd390..0000000
--- a/src/printdocvisitor.h
+++ /dev/null
@@ -1,665 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 _PRINTDOCVISITOR_H
-#define _PRINTDOCVISITOR_H
-
-#include "docvisitor.h"
-
-/*! Concrete visitor implementation for pretty printing */
-class PrintDocVisitor : public DocVisitor
-{
- public:
- PrintDocVisitor() : DocVisitor(DocVisitor_Other), m_indent(0),
- m_needsEnter(FALSE), m_insidePre(FALSE) {}
-
- //--------------------------------------
-
- void visit(DocWord *w)
- {
- indent_leaf();
- printf("%s",w->word().data());
- }
- void visit(DocLinkedWord *w)
- {
- indent_leaf();
- printf("%s",w->word().data());
- }
- void visit(DocWhiteSpace *w)
- {
- indent_leaf();
- if (m_insidePre)
- {
- printf("%s",w->chars().data());
- }
- else
- {
- printf(" ");
- }
- }
- void visit(DocSymbol *s)
- {
- indent_leaf();
- switch(s->symbol())
- {
- case DocSymbol::BSlash: printf("\\"); break;
- case DocSymbol::At: printf("@"); break;
- case DocSymbol::Less: printf("<"); break;
- case DocSymbol::Greater: printf(">"); break;
- case DocSymbol::Amp: printf("&"); break;
- case DocSymbol::Dollar: printf("$"); break;
- case DocSymbol::Hash: printf("#"); break;
- case DocSymbol::Percent: printf("%%"); break;
- case DocSymbol::Copy: printf("&copy;"); break;
- case DocSymbol::Apos: printf("'"); break;
- case DocSymbol::Quot: printf("\""); break;
- case DocSymbol::Uml: printf("&%cuml;",s->letter()); break;
- case DocSymbol::Acute: printf("&%cacute;",s->letter()); break;
- case DocSymbol::Grave: printf("&%cgrave;",s->letter()); break;
- case DocSymbol::Circ: printf("&%ccirc;",s->letter()); break;
- case DocSymbol::Tilde: printf("&%ctilde;",s->letter()); break;
- case DocSymbol::Szlig: printf("&szlig;"); break;
- case DocSymbol::Cedil: printf("&%ccedul;",s->letter()); break;
- case DocSymbol::Ring: printf("&%cring;",s->letter()); break;
- case DocSymbol::Nbsp: printf("&nbsp;"); break;
- default:
- printf("Error: unknown symbol found\n");
- }
- }
- void visit(DocURL *u)
- {
- indent_leaf();
- printf("%s",u->url().data());
- }
- void visit(DocLineBreak *)
- {
- indent_leaf();
- printf("<br/>");
- }
- void visit(DocHorRuler *)
- {
- indent_leaf();
- printf("<hr>");
- }
- void visit(DocStyleChange *s)
- {
- indent_leaf();
- switch (s->style())
- {
- case DocStyleChange::Bold:
- if (s->enable()) printf("<bold>"); else printf("</bold>");
- break;
- case DocStyleChange::Italic:
- if (s->enable()) printf("<italic>"); else printf("</italic>");
- break;
- case DocStyleChange::Code:
- if (s->enable()) printf("<code>"); else printf("</code>");
- break;
- case DocStyleChange::Subscript:
- if (s->enable()) printf("<sub>"); else printf("</sub>");
- break;
- case DocStyleChange::Superscript:
- if (s->enable()) printf("<sup>"); else printf("</sup>");
- break;
- case DocStyleChange::Center:
- if (s->enable()) printf("<center>"); else printf("</center>");
- break;
- case DocStyleChange::Small:
- if (s->enable()) printf("<small>"); else printf("</small>");
- break;
- case DocStyleChange::Preformatted:
- if (s->enable()) printf("<pre>"); else printf("</pre>");
- break;
- case DocStyleChange::Div:
- if (s->enable()) printf("<div>"); else printf("</div>");
- break;
- case DocStyleChange::Span:
- if (s->enable()) printf("<span>"); else printf("</span>");
- break;
- }
- }
- void visit(DocVerbatim *s)
- {
- indent_leaf();
- switch(s->type())
- {
- case DocVerbatim::Code: printf("<code>"); break;
- case DocVerbatim::Verbatim: printf("<verbatim>"); break;
- case DocVerbatim::HtmlOnly: printf("<htmlonly>"); break;
- case DocVerbatim::ManOnly: printf("<manonly>"); break;
- case DocVerbatim::LatexOnly: printf("<latexonly>"); break;
- case DocVerbatim::XmlOnly: printf("<xmlonly>"); break;
- case DocVerbatim::Dot: printf("<dot>"); break;
- }
- printf("%s",s->text().data());
- switch(s->type())
- {
- case DocVerbatim::Code: printf("</code>"); break;
- case DocVerbatim::Verbatim: printf("</verbatim>"); break;
- case DocVerbatim::HtmlOnly: printf("</htmlonly>"); break;
- case DocVerbatim::ManOnly: printf("</manonly>"); break;
- case DocVerbatim::LatexOnly: printf("</latexonly>"); break;
- case DocVerbatim::XmlOnly: printf("</xmlonly>"); break;
- case DocVerbatim::Dot: printf("</dot>"); break;
- }
- }
- void visit(DocAnchor *a)
- {
- indent_leaf();
- printf("<anchor name=\"%s\"/>",a->anchor().data());
- }
- void visit(DocInclude *inc)
- {
- indent_leaf();
- printf("<include file=\"%s\" type=\"",inc->file().data());
- switch(inc->type())
- {
- case DocInclude::Include: printf("include"); break;
- case DocInclude::IncWithLines: printf("incwithlines"); break;
- case DocInclude::DontInclude: printf("dontinclude"); break;
- case DocInclude::HtmlInclude: printf("htmlinclude"); break;
- case DocInclude::VerbInclude: printf("verbinclude"); break;
- }
- printf("\"/>");
- }
- void visit(DocIncOperator *op)
- {
- indent_leaf();
- printf("<incoperator pattern=\"%s\" type=\"",op->pattern().data());
- switch(op->type())
- {
- case DocIncOperator::Line: printf("line"); break;
- case DocIncOperator::Skip: printf("skip"); break;
- case DocIncOperator::SkipLine: printf("skipline"); break;
- case DocIncOperator::Until: printf("until"); break;
- }
- printf("\"/>");
- }
- void visit(DocFormula *f)
- {
- indent_leaf();
- printf("<formula name=%s test=%s/>",f->name().data(),f->text().data());
- }
- void visit(DocIndexEntry *i)
- {
- indent_leaf();
- printf("<indexentry>%s</indexentry\n",i->entry().data());
- }
-
- //--------------------------------------
-
- void visitPre(DocAutoList *l)
- {
- indent_pre();
- if (l->isEnumList())
- {
- printf("<ol>\n");
- }
- else
- {
- printf("<ul>\n");
- }
- }
- void visitPost(DocAutoList *l)
- {
- indent_post();
- if (l->isEnumList())
- {
- printf("</ol>\n");
- }
- else
- {
- printf("</ul>\n");
- }
- }
- void visitPre(DocAutoListItem *)
- {
- indent_pre();
- printf("<li>\n");
- }
- void visitPost(DocAutoListItem *)
- {
- indent_post();
- printf("</li>\n");
- }
- void visitPre(DocPara *)
- {
- indent_pre();
- printf("<para>\n");
- }
- void visitPost(DocPara *)
- {
- indent_post();
- printf("</para>\n");
- }
- void visitPre(DocRoot *)
- {
- indent_pre();
- printf("<root>\n");
- }
- void visitPost(DocRoot *)
- {
- indent_post();
- printf("</root>\n");
- }
- void visitPre(DocSimpleSect *s)
- {
- indent_pre();
- printf("<simplesect type=");
- switch(s->type())
- {
- case DocSimpleSect::See: printf("see"); break;
- case DocSimpleSect::Return: printf("return"); break;
- case DocSimpleSect::Author: printf("author"); break;
- case DocSimpleSect::Authors: printf("authors"); break;
- case DocSimpleSect::Version: printf("version"); break;
- case DocSimpleSect::Since: printf("since"); break;
- case DocSimpleSect::Date: printf("date"); break;
- case DocSimpleSect::Note: printf("note"); break;
- case DocSimpleSect::Warning: printf("warning"); break;
- case DocSimpleSect::Pre: printf("pre"); break;
- case DocSimpleSect::Post: printf("post"); break;
- case DocSimpleSect::Invar: printf("invar"); break;
- case DocSimpleSect::Remark: printf("remark"); break;
- case DocSimpleSect::Attention: printf("attention"); break;
- case DocSimpleSect::User: printf("user"); break;
- case DocSimpleSect::Rcs: printf("rcs"); break;
- case DocSimpleSect::Unknown: printf("unknown"); break;
- }
- printf(">\n");
- }
- void visitPost(DocSimpleSect *)
- {
- indent_post();
- printf("</simplesect>\n");
- }
- void visitPre(DocTitle *)
- {
- indent_pre();
- printf("<title>\n");
- }
- void visitPost(DocTitle *)
- {
- indent_post();
- printf("</title>\n");
- }
- void visitPre(DocSimpleList *)
- {
- indent_pre();
- printf("<ul>\n");
- }
- void visitPost(DocSimpleList *)
- {
- indent_post();
- printf("</ul>\n");
- }
- void visitPre(DocSimpleListItem *)
- {
- indent_pre();
- printf("<li>\n");
- }
- void visitPost(DocSimpleListItem *)
- {
- indent_post();
- printf("</li>\n");
- }
- void visitPre(DocSection *s)
- {
- indent_pre();
- printf("<sect%d>\n",s->level());
- }
- void visitPost(DocSection *s)
- {
- indent_post();
- printf("</sect%d>\n",s->level());
- }
- void visitPre(DocHtmlList *s)
- {
- indent_pre();
- if (s->type()==DocHtmlList::Ordered) printf("<ol>\n"); else printf("<ul>\n");
- }
- void visitPost(DocHtmlList *s)
- {
- indent_post();
- if (s->type()==DocHtmlList::Ordered) printf("</ol>\n"); else printf("</ul>\n");
- }
- void visitPre(DocHtmlListItem *)
- {
- indent_pre();
- printf("<li>\n");
- }
- void visitPost(DocHtmlListItem *)
- {
- indent_post();
- printf("</li>\n");
- }
- //void visitPre(DocHtmlPre *)
- //{
- // indent_pre();
- // printf("<pre>\n");
- // m_insidePre=TRUE;
- //}
- //void visitPost(DocHtmlPre *)
- //{
- // m_insidePre=FALSE;
- // indent_post();
- // printf("</pre>\n");
- //}
- void visitPre(DocHtmlDescList *)
- {
- indent_pre();
- printf("<dl>\n");
- }
- void visitPost(DocHtmlDescList *)
- {
- indent_post();
- printf("</dl>\n");
- }
- void visitPre(DocHtmlDescTitle *)
- {
- indent_pre();
- printf("<dt>\n");
- }
- void visitPost(DocHtmlDescTitle *)
- {
- indent_post();
- printf("</dt>\n");
- }
- void visitPre(DocHtmlDescData *)
- {
- indent_pre();
- printf("<dd>\n");
- }
- void visitPost(DocHtmlDescData *)
- {
- indent_post();
- printf("</dd>\n");
- }
- void visitPre(DocHtmlTable *t)
- {
- indent_pre();
- printf("<table rows=\"%d\" cols=\"%d\">\n",
- t->numRows(),t->numCols());
- }
- void visitPost(DocHtmlTable *)
- {
- indent_post();
- printf("</table>\n");
- }
- void visitPre(DocHtmlRow *)
- {
- indent_pre();
- printf("<tr>\n");
- }
- void visitPost(DocHtmlRow *)
- {
- indent_post();
- printf("</tr>\n");
- }
- void visitPre(DocHtmlCell *c)
- {
- indent_pre();
- printf("<t%c>\n",c->isHeading()?'h':'d');
- }
- void visitPost(DocHtmlCell *c)
- {
- indent_post();
- printf("</t%c>\n",c->isHeading()?'h':'d');
- }
- void visitPre(DocHtmlCaption *)
- {
- indent_pre();
- printf("<caption>\n");
- }
- void visitPost(DocHtmlCaption *)
- {
- indent_post();
- printf("</caption>\n");
- }
- void visitPre(DocInternal *)
- {
- indent_pre();
- printf("<internal>\n");
- }
- void visitPost(DocInternal *)
- {
- indent_post();
- printf("</internal>\n");
- }
- void visitPre(DocHRef *href)
- {
- indent_pre();
- printf("<a url=\"%s\">\n",href->url().data());
- }
- void visitPost(DocHRef *)
- {
- indent_post();
- printf("</a>\n");
- }
- void visitPre(DocHtmlHeader *header)
- {
- indent_pre();
- printf("<h%d>\n",header->level());
- }
- void visitPost(DocHtmlHeader *header)
- {
- indent_post();
- printf("</h%d>\n",header->level());
- }
- void visitPre(DocImage *img)
- {
- indent_pre();
- printf("<image src=\"%s\" type=\"",img->name().data());
- switch(img->type())
- {
- case DocImage::Html: printf("html"); break;
- case DocImage::Latex: printf("latex"); break;
- case DocImage::Rtf: printf("rtf"); break;
- }
- printf("\" width=%s height=%s>\n",img->width().data(),img->height().data());
- }
- void visitPost(DocImage *)
- {
- indent_post();
- printf("</image>\n");
- }
- void visitPre(DocDotFile *df)
- {
- indent_pre();
- printf("<dotfile src=\"%s\">\n",df->name().data());
- }
- void visitPost(DocDotFile *)
- {
- indent_post();
- printf("</dotfile>\n");
- }
- void visitPre(DocLink *lnk)
- {
- indent_pre();
- printf("<link ref=\"%s\" file=\"%s\" anchor=\"%s\">\n",
- lnk->ref().data(),lnk->file().data(),lnk->anchor().data());
- }
- void visitPost(DocLink *)
- {
- indent_post();
- printf("</link>\n");
- }
- void visitPre(DocRef *ref)
- {
- indent_pre();
- printf("<ref ref=\"%s\" file=\"%s\" "
- "anchor=\"%s\" targetTitle=\"%s\""
- " hasLinkText=\"%s\" refToAnchor=\"%s\" refToSection=\"%s\">\n",
- ref->ref().data(),ref->file().data(),ref->anchor().data(),
- ref->targetTitle().data(),ref->hasLinkText()?"yes":"no",
- ref->refToAnchor()?"yes":"no", ref->refToSection()?"yes":"no");
- }
- void visitPost(DocRef *)
- {
- indent_post();
- printf("</ref>\n");
- }
- void visitPre(DocSecRefItem *ref)
- {
- indent_pre();
- printf("<secrefitem target=\"%s\">\n",ref->target().data());
- }
- void visitPost(DocSecRefItem *)
- {
- indent_post();
- printf("</secrefitem>\n");
- }
- void visitPre(DocSecRefList *)
- {
- indent_pre();
- printf("<secreflist>\n");
- }
- void visitPost(DocSecRefList *)
- {
- indent_post();
- printf("</secreflist>\n");
- }
- //void visitPre(DocLanguage *l)
- //{
- // indent_pre();
- // printf("<language id=%s>\n",l->id().data());
- //}
- //void visitPost(DocLanguage *)
- //{
- // indent_post();
- // printf("</language>\n");
- //}
- void visitPre(DocParamList *pl)
- {
- indent_pre();
- //QStrListIterator sli(pl->parameters());
- QListIterator<DocNode> sli(pl->parameters());
- //const char *s;
- DocNode *param;
- printf("<parameters>");
- for (sli.toFirst();(param=sli.current());++sli)
- {
- printf("<param>");
- if (param->kind()==DocNode::Kind_Word)
- {
- visit((DocWord*)param);
- }
- else if (param->kind()==DocNode::Kind_LinkedWord)
- {
- visit((DocLinkedWord*)param);
- }
- printf("</param>");
- }
- printf("\n");
- }
- void visitPost(DocParamList *)
- {
- indent_post();
- printf("</parameters>\n");
- }
- void visitPre(DocParamSect *ps)
- {
- indent_pre();
- printf("<paramsect type=");
- switch (ps->type())
- {
- case DocParamSect::Param: printf("param"); break;
- case DocParamSect::RetVal: printf("retval"); break;
- case DocParamSect::Exception: printf("exception"); break;
- case DocParamSect::Unknown: printf("unknown"); break;
- }
- printf(">\n");
- }
- void visitPost(DocParamSect *)
- {
- indent_post();
- printf("</paramsect>\n");
- }
- void visitPre(DocXRefItem *x)
- {
- indent_pre();
- printf("<xrefitem file=\"%s\" anchor=\"%s\" title=\"%s\"/>\n",
- x->file().data(),x->anchor().data(),x->title().data());
- }
- void visitPost(DocXRefItem *)
- {
- indent_post();
- printf("<xrefitem/>\n");
- }
- void visitPre(DocInternalRef *r)
- {
- indent_pre();
- printf("<internalref file=%s anchor=%s>\n",r->file().data(),r->anchor().data());
- }
- void visitPost(DocInternalRef *)
- {
- indent_post();
- printf("</internalref>\n");
- }
- void visitPre(DocCopy *c)
- {
- indent_pre();
- printf("<copy link=\"%s\">\n",c->link().data());
- }
- void visitPost(DocCopy *)
- {
- indent_post();
- printf("</copy>\n");
- }
- void visitPre(DocText *)
- {
- indent_pre();
- printf("<text>\n");
- }
- void visitPost(DocText *)
- {
- indent_post();
- printf("</text>\n");
- }
-
- private:
- // helper functions
- void indent()
- {
- if (m_needsEnter) printf("\n");
- for (int i=0;i<m_indent;i++) printf(".");
- m_needsEnter=FALSE;
- }
- void indent_leaf()
- {
- if (!m_needsEnter) indent();
- m_needsEnter=TRUE;
- }
- void indent_pre()
- {
- indent();
- m_indent++;
- }
- void indent_post()
- {
- m_indent--;
- indent();
- }
-
- // member variables
- int m_indent;
- bool m_needsEnter;
- bool m_insidePre;
-};
-
-#endif
diff --git a/src/pycode.h b/src/pycode.h
deleted file mode 100644
index 5f2b614..0000000
--- a/src/pycode.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-/* This code is based on the work done by the MoxyPyDoxy team
- * (Linda Leong, Mike Rivera, Kim Truong, and Gabriel Estrada), executed
- * as part of CS179e (Compiler design project) at the UC Riverside,
- * under supervision of Peter H. Fröhlic.
- */
-
-#ifndef PYCODE_H
-#define PYCODE_H
-
-#include "qtbc.h"
-#include <stdio.h>
-
-class CodeOutputInterface;
-class FileDef;
-class MemberDef;
-
-extern void parsePythonCode(CodeOutputInterface &,const char *,const QCString &,
- bool ,const char *,FileDef *fd=0,
- int startLine=-1,int endLine=-1,bool inlineFragment=FALSE,
- MemberDef *memberDef=0);
-extern void resetPythonCodeParserState();
-
-#endif
diff --git a/src/pycode.l b/src/pycode.l
deleted file mode 100644
index 5e66693..0000000
--- a/src/pycode.l
+++ /dev/null
@@ -1,1435 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-/* This code is based on the work done by the MoxyPyDoxy team
- * (Linda Leong, Mike Rivera, Kim Truong, and Gabriel Estrada), executed
- * as part of CS179e (Compiler design project) at the UC Riverside,
- * under supervision of Peter H. Fröhlic
- */
-
-%{
-
-#include <stdio.h>
-#include <qvaluestack.h>
-
-#include "pycode.h"
-#include "message.h"
-
-#include "scanner.h"
-#include "entry.h"
-#include "doxygen.h"
-#include "outputlist.h"
-#include "util.h"
-#include "membername.h"
-#include "searchindex.h"
-
-#define YY_NEVER_INTERACTIVE 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 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_exampleFile;
-
-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 void endFontClass();
-static void adjustScopesAndSuites(unsigned indentLength);
-
-
-/*! 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
-{
- public:
- static const ClassDef *dummyContext;
- class Scope : public SDict<ClassDef>
- {
- public:
- Scope() : SDict<ClassDef>(17) {}
- };
-
- PyVariableContext()
- {
- m_scopes.setAutoDelete(TRUE);
- }
-
- virtual ~PyVariableContext()
- {
- }
-
- void pushScope()
- {
- m_scopes.append(new Scope);
- }
-
- void popScope()
- {
- if (m_scopes.count()>0)
- {
- m_scopes.remove(m_scopes.count()-1);
- }
- }
-
- void clear()
- {
- m_scopes.clear();
- m_globalScope.clear();
- }
-
- 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)
-{
- //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();
- 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
- )
- {
- scope->append(lname,varType); // add it to a list
- }
- 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!
- {
- scope->append(lname,dummyContext);
- }
- }
-}
-
-ClassDef *PyVariableContext::findVariable(const QCString &name)
-{
- 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)
- {
- result = scope->find(name);
- if (result)
- {
- return result;
- }
- }
- // nothing found -> also try the global scope
- result=m_globalScope.find(name);
- return result;
-}
-
-static PyVariableContext g_theVarContext;
-const ClassDef *PyVariableContext::dummyContext = (ClassDef*)0x8;
-
-class PyCallContext
-{
- public:
- struct Ctx
- {
- Ctx() : name(g_name), type(g_type), cd(0) {}
- QCString name;
- QCString type;
- ClassDef *cd;
- };
-
- PyCallContext()
- {
- m_classList.append(new Ctx);
- m_classList.setAutoDelete(TRUE);
- }
-
- virtual ~PyCallContext() {}
-
- void setClass(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);
- }
-
- ClassDef *getClass() const
- {
- Ctx *ctx = m_classList.getLast();
-
- if (ctx)
- return ctx->cd;
- else
- return 0;
- }
-
- private:
- QList<Ctx> m_classList;
-};
-
-static PyCallContext g_theCallContext;
-
-
-/*! counts the number of lines in the input */
-static int countLines()
-{
- const char *p=g_inputString;
- char c;
- int count=1;
- while ((c=*p))
- {
- p++ ;
- if (c=='\n') count++;
- }
- if (p>g_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;
- }
- return count;
-}
-
-static void setCurrentDoc(const QCString &name,const QCString &base,const QCString &anchor="")
-{
- static bool searchEngineEnabled=Config_getBool("SEARCHENGINE");
- if (searchEngineEnabled)
- {
- Doxygen::searchIndex->setCurrentDoc(name,base,anchor);
- }
-}
-
-static void addToSearchIndex(const char *text)
-{
- static bool searchEngineEnabled=Config_getBool("SEARCHENGINE");
- if (searchEngineEnabled)
- {
- Doxygen::searchIndex->addWord(text,FALSE);
- }
-}
-
-
-static ClassDef *stripClassName(const char *s)
-{
- int pos=0;
- QCString type = s;
- QCString className;
- QCString templSpec;
- while (extractClassNameFromType(type,pos,className,templSpec))
- {
- QCString clName=className+templSpec;
- ClassDef *cd=0;
- if (!g_classScope.isEmpty())
- {
- cd=getResolvedClass(g_currentDefinition,g_sourceFileDef,g_classScope+"::"+clName);
- }
- if (cd==0)
- {
- cd=getResolvedClass(g_currentDefinition,g_sourceFileDef,clName);
- }
- //printf("stripClass trying `%s' = %p\n",clName.data(),cd);
- if (cd)
- {
- return cd;
- }
- }
-
- return 0;
-}
-
-
-
-/*! 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
- * number is linked to the documentation of that definition.
- */
-static void startCodeLine()
-{
- //if (g_currentFontClass) { g_code->endFontClass(); }
- if (g_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())
- {
- g_currentDefinition = d;
- g_currentMemberDef = g_sourceFileDef->getSourceMember(g_yyLineNr);
- g_insideBody = 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;
- QCString lineAnchor;
- lineAnchor.sprintf("l%05d",g_yyLineNr);
- if (g_currentMemberDef)
- {
- g_code->writeLineNumber(g_currentMemberDef->getReference(),
- g_currentMemberDef->getOutputFileBase(),
- g_currentMemberDef->anchor(),g_yyLineNr);
- setCurrentDoc(
- g_currentMemberDef->qualifiedName(),
- g_sourceFileDef->getSourceFileBase(),
- lineAnchor);
- }
- else
- {
- g_code->writeLineNumber(d->getReference(),
- d->getOutputFileBase(),
- 0,g_yyLineNr);
- setCurrentDoc(
- d->qualifiedName(),
- g_sourceFileDef->getSourceFileBase(),
- lineAnchor);
- }
- }
- else
- {
- //g_code->codify(lineNumber);
- g_code->writeLineNumber(0,0,0,g_yyLineNr);
- }
- //g_code->endLineNumber();
- }
- g_code->startCodeLine();
- if (g_currentFontClass)
- {
- g_code->startFontClass(g_currentFontClass);
- }
-}
-
-static void codify(char* text)
-{
- g_code->codify(text);
-}
-
-static void endCodeLine()
-{
- if (g_currentFontClass) { g_code->endFontClass(); }
- g_code->endCodeLine();
-}
-
-/*! 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
- * split into multiple links with the same destination, one for each line.
- */
-static void writeMultiLineCodeLink(CodeOutputInterface &ol,
- const char *ref,const char *file,
- const char *anchor,const char *text)
-{
- bool done=FALSE;
- char *p=(char *)text;
- while (!done)
- {
- char *sp=p;
- char c;
- while ((c=*p++) && c!='\n');
- if (c=='\n')
- {
- g_yyLineNr++;
- *(p-1)='\0';
- //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
- ol.writeCodeLink(ref,file,anchor,sp);
- endCodeLine();
- if (g_yyLineNr<g_inputLines)
- {
- startCodeLine();
- }
- }
- else
- {
- //printf("writeCodeLink(%s,%s,%s,%s)\n",ref,file,anchor,sp);
- ol.writeCodeLink(ref,file,anchor,sp);
- done=TRUE;
- }
- }
-}
-
-
-static void codifyLines(char *text)
-{
- //printf("codifyLines(%d,\"%s\")\n",g_yyLineNr,text);
- char *p=text,*sp=p;
- char c;
- bool done=FALSE;
- 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)
- {
- // Re-enable sometime
- startCodeLine();
- }
- }
- else
- {
- g_code->codify(sp);
- done=TRUE;
- }
- }
-}
-
-static void addDocCrossReference(MemberDef *src,MemberDef *dst)
-{
- if (dst->isTypedef() || dst->isEnumerate()) return; // don't add types
- //printf("addDocCrossReference src=%s,dst=%s\n",src->name().data(),dst->name().data());
- if (Config_getBool("REFERENCED_BY_RELATION") &&
- (src->isFunction() || src->isSlot())
- )
- {
- dst->addSourceReferencedBy(src);
- }
- if ((Config_getBool("REFERENCES_RELATION") || Config_getBool("CALL_GRAPH")) &&
- (src->isFunction() || src->isSlot())
- )
- {
- src->addSourceReferences(dst);
- }
-
-}
-
-
-
-static bool getLinkInScope(const QCString &c, // scope
- const QCString &m, // member
- const char *memberText, // exact text
- CodeOutputInterface &ol,
- const char *text
- )
-{
- MemberDef *md;
- ClassDef *cd;
- FileDef *fd;
- NamespaceDef *nd;
- GroupDef *gd;
- //printf("Trying `%s'::`%s'\n",c.data(),m.data());
- if (getDefs(c,m,"()",md,cd,fd,nd,gd,FALSE,g_sourceFileDef) &&
- md->isLinkable())
- {
- //printf("Found!\n");
- //Definition *d=0;
- //if (cd) d=cd; else if (nd) d=nd; else if (fd) d=fd; else d=gd;
-
- Definition *d = md->getOuterScope()==Doxygen::globalScope ?
- md->getBodyDef() : md->getOuterScope();
- if (md->getGroupDef()) d = md->getGroupDef();
- if (d && d->isLinkable())
- {
- g_theCallContext.setClass(stripClassName(md->typeString()));
- //printf("g_currentDefinition=%p g_currentMemberDef=%p g_insideBody=%d\n",
- // g_currentDefinition,g_currentMemberDef,g_insideBody);
-
- if (g_currentDefinition && g_currentMemberDef &&
- md!=g_currentMemberDef && g_insideBody)
- {
- addDocCrossReference(g_currentMemberDef,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->getReference(),
- md->getOutputFileBase(),
- md->anchor(),
- text ? text : memberText);
- addToSearchIndex(text ? text : memberText);
- return TRUE;
- }
- }
- return FALSE;
-}
-
-static bool getLink(const char *className,
- const char *memberName,
- CodeOutputInterface &ol,
- const char *text=0)
-{
- QCString m=removeRedundantWhiteSpace(memberName);
- QCString c=className;
- if (!getLinkInScope(c,m,memberName,ol,text))
- {
- if (!g_curClassName.isEmpty())
- {
- if (!c.isEmpty()) c.prepend("::");
- c.prepend(g_curClassName);
- return getLinkInScope(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.
-
- As of June 1, '05, this ONLY finds classes
-*/
-static void generateClassOrGlobalLink(CodeOutputInterface &ol,char *clName,
- bool /*typeOnly*/=FALSE)
-{
- QCString className=clName;
-
- // Don't do anything for empty text
- if (className.isEmpty()) return;
-
- ClassDef *cd=0,*lcd=0; /** Class def that we may find */
- MemberDef *md=0; /** Member def that we may find */
- bool isLocal=FALSE;
-
- // printf("generateClassOrGlobalLink(className=%s)\n",className.data());
-
- if ((lcd=g_theVarContext.findVariable(className))==0) // not a local variable
- {
- Definition *d = g_currentDefinition;
-
- cd = getResolvedClass(d,g_sourceFileDef,className,&md);
-
- //printf("d=%p g_sourceFileDef=%p\n",d,g_currentDefinition);
- //printf("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
- {
- if (getLink(g_classScope,clName,ol,clName))
- {
- return;
- }
- }
- }
- else
- {
- if (lcd!=PyVariableContext::dummyContext)
- {
- g_theCallContext.setClass(lcd);
- }
- isLocal=TRUE;
- //fprintf(stderr,"is a local variable cd=%p!\n",cd);
- }
-
- if (cd && cd->isLinkable()) // is it a linkable class
- {
- writeMultiLineCodeLink(ol,cd->getReference(),cd->getOutputFileBase(),0,clName);
- addToSearchIndex(className);
- if (md)
- {
- Definition *d = md->getOuterScope()==Doxygen::globalScope ?
- md->getBodyDef() : md->getOuterScope();
- if (md->getGroupDef()) d = md->getGroupDef();
- if (d && d->isLinkable() && md->isLinkable() && g_currentMemberDef)
- {
- addDocCrossReference(g_currentMemberDef,md);
- }
- }
- }
- else // not a class, maybe a global member
- {
-
- /*
- This code requires a going-over in order to
- make it work for Python
-
- //printf("class %s not linkable! cd=%p md=%p typeOnly=%d\n",clName,cd,md,typeOnly);
- if (!isLocal && (md!=0 || (cd==0 && !typeOnly))) // not a class, see if it is a global enum/variable/typedef.
- {
- if (md==0) // not found as a typedef
- {
- md = setCallContextForVar(clName);
- //printf("setCallContextForVar(%s) md=%p g_currentDefinition=%p\n",clName,md,g_currentDefinition);
- if (md && g_currentDefinition)
- {
- //fprintf(stderr,"%s accessible from %s? %d md->getOuterScope=%s\n",
- // md->name().data(),g_currentDefinition->name().data(),
- // isAccessibleFrom(g_currentDefinition,g_sourceFileDef,md),
- // md->getOuterScope()->name().data());
- }
-
- if (md && g_currentDefinition &&
- isAccessibleFrom(g_currentDefinition,g_sourceFileDef,md)==-1)
- {
- md=0; // variable not accessible
- }
- }
- if (md)
- {
- //printf("is a global md=%p g_currentDefinition=%s\n",md,g_currentDefinition?g_currentDefinition->name().data():"<none>");
- if (md->isLinkable())
- {
- writeMultiLineCodeLink(ol,md->getReference(),md->getOutputFileBase(),md->anchor(),clName);
- addToSearchIndex(clName);
- if (g_currentMemberDef)
- {
- addDocCrossReference(g_currentMemberDef,md);
- }
- return;
- }
- }
- }
-
- */
-
- // nothing found, just write out the word
- codifyLines(clName);
- addToSearchIndex(clName);
- }
-}
-
-/*
- As of June 1, this function seems to work
- for file members, but scopes are not
- being correctly tracked for classes
- so it doesn't work for classes yet.
-
-*/
-static void generateFunctionLink(CodeOutputInterface &ol,char *funcName)
-{
- //CodeClassDef *ccd=0;
- ClassDef *ccd=0;
- QCString locScope=g_classScope.copy();
- QCString locFunc=removeRedundantWhiteSpace(funcName);
- //fprintf(stdout,"*** locScope=%s locFunc=%s\n",locScope.data(),locFunc.data());
- int i=locFunc.findRev("::");
- if (i>0)
- {
- locScope=locFunc.left(i);
- 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]))
- {
- //printf("using classScope %s\n",g_classScope.data());
- BaseClassListIterator bcli(*ccd->baseClasses());
- for ( ; bcli.current() ; ++bcli)
- {
- if (getLink(bcli.current()->classDef->name(),locFunc,ol,funcName))
- {
- return;
- }
- }
- }
- if (!getLink(locScope,locFunc,ol,funcName))
- {
- generateClassOrGlobalLink(ol,funcName);
- }
- return;
-}
-
-static void findMemberLink(CodeOutputInterface &ol,char *symName)
-{
- //printf("Member reference: %s scope=%s member=%s\n",
- // yytext,
- // g_currentDefinition?g_currentDefinition->name().data():"<none>",
- // g_currentMemberDef?g_currentMemberDef->name().data():"<none>"
- // );
- if (g_currentDefinition)
- {
- DefinitionList *dl = Doxygen::symbolMap->find(symName);
- if (dl)
- {
- DefinitionListIterator dli(*dl);
- Definition *sym;
- for (dli.toFirst();(sym=dli.current());++dli)
- {
- //printf("sym %s outerScope=%s equal=%d\n",
- // sym->name().data(),sym->getOuterScope()->name().data(),
- // sym->getOuterScope()==g_currentDefinition);
-
- if (sym->getOuterScope() &&
- sym->getOuterScope()->definitionType()==Definition::TypeClass &&
- g_currentDefinition->definitionType()==Definition::TypeClass)
- {
- ClassDef *cd = (ClassDef*)sym->getOuterScope();
- ClassDef *thisCd = (ClassDef *)g_currentDefinition;
- QCString anchor;
- if (sym->definitionType()==Definition::TypeMember)
- {
- anchor=((MemberDef *)sym)->anchor();
- }
-
- // TODO: find the nearest base class in case cd is a base class of
- // thisCd
- if (cd==thisCd)
- {
- writeMultiLineCodeLink(ol,sym->getReference(),
- sym->getOutputFileBase(),
- anchor,
- symName);
- return;
- }
- }
- }
- }
- }
- //printf("sym %s not found\n",&yytext[5]);
- codify(symName);
-}
-
-static void startFontClass(const char *s)
-{
- endFontClass();
- g_code->startFontClass(s);
- g_currentFontClass=s;
-}
-
-static void endFontClass()
-{
- if (g_currentFontClass)
- {
- g_code->endFontClass();
- g_currentFontClass=0;
- }
-}
-
-#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;
-}
-
-%}
-
-
-BB [ \t]+
-B [ \t]*
-NEWLINE \n
-
-DIGIT [0-9]
-LETTER [A-Za-z]
-NONEMPTY [A-Za-z0-9_]
-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"|"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 nounput
-
-%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
-
-%%
-
-<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} {
- codify("self.");
- findMemberLink(*g_code,&yytext[5]);
- }
-}
-
-<ClassDec>{IDENTIFIER} {
-
- generateClassOrGlobalLink(*g_code,yytext);
- // codify(yytext);
- g_curClassName = yytext;
- g_curClassBases.clear();
- BEGIN( ClassInheritance );
- }
-
-<ClassInheritance>{
- ({BB}|[(,)]) {
- codify(yytext);
- }
-
- {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 = new ClassDef("<code>",1,g_curClassName,ClassDef::Class,0,0,FALSE);
- g_codeClassSDict.append(g_curClassName,classDefToAdd);
- char *s=g_curClassBases.first();
- while (s)
- {
- ClassDef *baseDefToAdd;
- 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(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);
- }
-
- ":" {
- 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} {
- startFontClass("keywordflow");
- codify(yytext);
- endFontClass();
- }
-
- {IDENTIFIER} {
- codify(yytext);
- }
-}
-
-
-
-<SuiteStart>{
-
- {BB} {
- codify(yytext);
- }
- {KEYWORD} {
- startFontClass("keyword");
- codifyLines(yytext);
- endFontClass();
-
- // No indentation necesary
- g_noSuiteFound = FALSE;
- }
-
- {FLOWKW} {
- startFontClass("keywordflow");
- codifyLines(yytext);
- endFontClass();
-
- // No indentation necesary
- g_noSuiteFound = FALSE;
- }
- {IDENTIFIER} {
- codify(yytext);
- }
-
-
- {POUNDCOMMENT} {
- // This eats EVERYTHING
- // except the newline
- startFontClass("comment");
- codifyLines(yytext);
- endFontClass();
- }
-
- {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
- // indendation-tracking;
- // should be improved.
- // (translate tabs to space, etc)
- codifyLines(yytext);
- adjustScopesAndSuites(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);
- }
- \\. { // espaced char
- codify(yytext);
- }
- {STRINGPREFIX}?{TRIDOUBLEQUOTE} { // tripple 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);
- }
- \\. { // espaced char
- codify(yytext);
- }
- {STRINGPREFIX}?{TRISINGLEQUOTE} { // tripple single quotes
- codify(yytext);
- }
- "\"" { // end of the string
- codify(yytext);
- endFontClass();
- BEGIN(g_stringContext);
- }
- [^"'\n\\]+ { // normal chars
- codify(yytext);
- }
- . { // normal char
- codify(yytext);
- }
-}
-
-<TripleString>{
- {TRIDOUBLEQUOTE} |
- {TRISINGLEQUOTE} {
- codify(yytext);
- if (g_doubleQuote==(yytext[0]=='"'))
- {
- endFontClass();
- BEGIN(g_stringContext);
- }
- }
- {LONGSTRINGBLOCK} {
- codifyLines(yytext);
- }
- \n {
- codifyLines(yytext);
- }
- . {
- codify(yytext);
- }
-}
-
- /*
-<*>({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} |
-<*>{STRINGPREFIX}?{TRIDOUBLEQUOTE} {
- startFontClass("stringliteral");
- g_stringContext=YY_START;
- g_doubleQuote=yytext[yyleng-1]=='"';
- codify(yytext);
- BEGIN(TripleString);
- }
-<*>{STRINGPREFIX}?"'" { // single quoted string
- startFontClass("stringliteral");
- g_stringContext=YY_START;
- codify(yytext);
- BEGIN(SingleQuoteString);
- }
-<*>{STRINGPREFIX}?"\"" { // double quoted string
- startFontClass("stringliteral");
- g_stringContext=YY_START;
- codify(yytext);
- BEGIN(DoubleQuoteString);
- }
-<*>{POUNDCOMMENT} {
- if (YY_START==SingleQuoteString ||
- YY_START==DoubleQuoteString ||
- YY_START==TripleString
- )
- {
- REJECT;
- }
- // This eats EVERYTHING
- // except the newline
- startFontClass("comment");
- codifyLines(yytext);
- endFontClass();
- }
-<*>{NEWLINE} {
- codifyLines(yytext);
- //printf("[pycode] %d NEWLINE [line %d] no match\n",
- // YY_START, g_yyLineNr);
-
- //endFontClass();
- BEGIN(Body);
- }
-
-<*>. {
- codify(yytext);
- // printf("[pycode] '%s' [ state %d ] [line %d] no match\n",
- // yytext, YY_START, g_yyLineNr);
-
- //endFontClass();
- BEGIN(Body);
- }
-
-%%
-
-/*@ ----------------------------------------------------------------------------
- */
-
-void resetPythonCodeParserState()
-{
- g_currentDefinition = 0;
- g_currentMemberDef = 0;
- g_doubleStringIsDoc = FALSE;
- g_paramParens = 0;
- g_indents.clear();
- BEGIN( Body );
-}
-
-/*!
- Examines current stack of white-space indentations;
- re-syncs the parser with the correct scope.
-*/
-static void adjustScopesAndSuites(unsigned indentLength)
-{
- // 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 );
- }
-}
-
-void parsePythonCode(CodeOutputInterface &od,const char *className,
- const QCString &s,bool exBlock, const char *exName,
- FileDef *fd,int startLine,int endLine,bool inlineFragment,
- MemberDef *)
-{
-
- //printf("***parseCode()\n");
-
- //--- some code to eliminate warnings---
- className = "";
- exBlock = FALSE;
- exName = "";
- inlineFragment = "";
- //--------------------------------------
- if (s.isEmpty()) return;
- g_code = &od;
- g_inputString = s;
- g_inputPosition = 0;
- g_currentFontClass = 0;
- g_needsTermination = FALSE;
- if (endLine!=-1)
- g_inputLines = endLine+1;
- else
- g_inputLines = countLines();
-
- if (startLine!=-1)
- g_yyLineNr = startLine;
- else
- g_yyLineNr = 1;
-
- g_exampleBlock = exBlock;
- g_exampleName = exName;
- g_sourceFileDef = fd;
-
-
- // Starts line 1 on the output
- startCodeLine();
-
- pycodeYYrestart( pycodeYYin );
-
- pycodeYYlex();
-
- if (!g_indents.isEmpty())
- {
- // printf("Exited pysourceparser in inconsistent state!\n");
- }
-
- if (g_needsTermination)
- {
- endFontClass();
- g_code->endCodeLine();
- }
- return;
-}
-
-
-#if !defined(YY_FLEX_SUBMINOR_VERSION)
-extern "C" { // some bogus code to keep the compiler happy
- void pycodeYYdummy() { yy_flex_realloc(0,0); }
-}
-#else
-#error "You seem to be using a version of flex newer than 2.5.4. These are currently incompatible with 2.5.4, and do NOT work with doxygen! Please use version 2.5.4 or expect things to be parsed wrongly! A bug report has been submitted (#732132)."
-#endif
-
diff --git a/src/pyscanner.h b/src/pyscanner.h
deleted file mode 100644
index 7ec7e40..0000000
--- a/src/pyscanner.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-/* This code is based on the work done by the MoxyPyDoxy team
- * (Linda Leong, Mike Rivera, Kim Truong, and Gabriel Estrada), executed
- * as part of CS179e (Compiler design project) at the UC Riverside,
- * under supervision of Peter H. Fröhlic.
- */
-
-#ifndef PYSCANNER_H
-#define PYSCANNER_H
-
-#include "parserintf.h"
-
-/** \brief Python Language parser using state-based lexical scanning.
- *
- * This is the Python language parser for doxygen.
- */
-class PythonLanguageScanner : public ParserInterface
-{
- public:
- void parseInput(const char * fileName,
- const char *fileBuf,
- Entry *root);
- bool needsPreprocessing(const QCString &extension);
- void parseCode(CodeOutputInterface &codeOutIntf,
- const char *scopeName,
- const QCString &input,
- bool isExampleBlock,
- const char *exampleName=0,
- FileDef *fileDef=0,
- int startLine=-1,
- int endLine=-1,
- bool inlineFragment=FALSE,
- MemberDef *memberDef=0
- );
- void resetCodeParserState();
- void parsePrototype(const char *text);
-};
-
-#endif
diff --git a/src/pyscanner.l b/src/pyscanner.l
deleted file mode 100644
index 64d7585..0000000
--- a/src/pyscanner.l
+++ /dev/null
@@ -1,1438 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-/* This code is based on the work done by the MoxyPyDoxy team
- * (Linda Leong, Mike Rivera, Kim Truong, and Gabriel Estrada), executed
- * as part of CS179e (Compiler design project) at the UC Riverside,
- * under supervision of Peter H. Fröhlic.
- */
-
-%{
-
-/*
- * includes
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <assert.h>
-#include <ctype.h>
-
-#include "qtbc.h"
-#include <qarray.h>
-#include <qstack.h>
-#include <qregexp.h>
-#include <unistd.h>
-#include <qfile.h>
-#include <qfileinfo.h>
-
-#include "pyscanner.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 "pycode.h"
-
-#define YY_NEVER_INTERACTIVE 1
-
-/* -----------------------------------------------------------------
- *
- * statics
- */
-
-
-static ParserInterface *g_thisParser;
-static const char * inputString;
-static int inputPosition;
-static QFile inputFile;
-
-static Protection protection;
-
-static Entry* current_root = 0 ;
-static Entry* current = 0 ;
-static Entry* previous = 0 ;
-static Entry* bodyEntry = 0 ;
-static int yyLineNr = 1 ;
-static QCString yyFileName;
-static MethodTypes mtype;
-static bool gstat;
-static Specifier virt;
-
-static int docBlockContext;
-static QCString docBlock;
-static QCString docBlockName;
-static bool docBlockInBody;
-static bool docBlockJavaStyle;
-static bool docBrief;
-
-static bool g_doubleQuote;
-static bool g_specialBlock;
-static bool g_expectModuleDocs;
-static int g_stringContext;
-static QCString * g_copyString;
-static int g_indent = 0;
-static int g_curIndent = 0;
-
-static QDict<QCString> g_packageNameCache(257);
-static QCString g_packageScope;
-
-static char g_atomStart;
-static char g_atomEnd;
-static int g_atomCount;
-
-static bool g_insideConstructor;
-
-static QCString g_moduleScope;
-
-//-----------------------------------------------------------------------------
-
-
-static void initParser()
-{
- protection = Public;
- mtype = Method;
- gstat = FALSE;
- virt = Normal;
- previous = 0;
- g_packageNameCache.setAutoDelete(TRUE);
-}
-
-static void initEntry()
-{
- //current->python = TRUE;
- current->protection = protection ;
- current->mtype = mtype;
- current->virt = virt;
- current->stat = gstat;
- current->objc = FALSE; //insideObjC;
- current->parent = current_root;
- initGroupInfo(current);
-}
-
-static void newEntry()
-{
- previous = current;
- current_root->addSubEntry(current);
- current = new Entry ;
- initEntry();
-}
-
-static void newVariable()
-{
- if (!current->name.isEmpty() && current->name.at(0)=='_') // mark as private
- {
- current->protection=Private;
- }
- if (current_root->section&Entry::SCOPE_MASK) // mark as class variable
- {
- current->stat = TRUE;
- }
- newEntry();
-}
-
-static inline int computeIndent(const char *s)
-{
- int col=0;
- static int tabSize=Config_getInt("TAB_SIZE");
- const char *p=s;
- char c;
- while ((c=*p++))
- {
- if (c==' ') col++;
- else if (c=='\t') col+=tabSize-(col%tabSize);
- else break;
- }
- return col;
-}
-
-static QCString findPackageScopeFromPath(const QCString &path)
-{
- QCString *pScope = g_packageNameCache.find(path);
- if (pScope)
- {
- return *pScope;
- }
- QFileInfo pf(path+"/__init__.py"); // found package initialization file
- if (pf.exists())
- {
- int i=path.findRev('/');
- if (i!=-1)
- {
- QCString scope = findPackageScopeFromPath(path.left(i));
- if (!scope.isEmpty())
- {
- scope+="::";
- }
- scope+=path.mid(i+1);
- g_packageNameCache.insert(path,new QCString(scope));
- return scope;
- }
- }
- return "";
-}
-
-static QCString findPackageScope(const char *fileName)
-{
- if (fileName==0) return "";
- QFileInfo fi(fileName);
- return findPackageScopeFromPath(fi.dirPath(TRUE).data());
-}
-
-//-----------------------------------------------------------------------------
-
-static void lineCount()
-{
- for( const char* c = yytext ; *c ; ++c )
- yyLineNr += (*c == '\n') ;
-}
-
-#if 0
-// Appends the current-name to current-type;
-// Destroys current-name.
-// Destroys current->args and current->argList
-static void addType( Entry* current )
-{
- uint tl=current->type.length();
- if ( tl>0 && !current->name.isEmpty() && current->type.at(tl-1)!='.')
- {
- current->type += ' ' ;
- }
- current->type += current->name ;
- current->name.resize(0) ;
- tl=current->type.length();
- if ( tl>0 && !current->args.isEmpty() && current->type.at(tl-1)!='.')
- {
- current->type += ' ' ;
- }
- current->type += current->args ;
- current->args.resize(0) ;
- current->argList->clear();
-}
-
-static QCString stripQuotes(const char *s)
-{
- QCString name;
- if (s==0 || *s==0) return name;
- name=s;
- if (name.at(0)=='"' && name.at(name.length()-1)=='"')
- {
- name=name.mid(1,name.length()-2);
- }
- return name;
-}
-#endif
-//-----------------------------------------------------------------
-
-//-----------------------------------------------------------------
-static void startCommentBlock(bool brief)
-{
- if (brief)
- {
- current->briefFile = yyFileName;
- current->briefLine = yyLineNr;
- }
- else
- {
- current->docFile = yyFileName;
- current->docLine = yyLineNr;
- }
-}
-
-/*
-static void appendDocBlock() {
- previous = current;
- current_root->addSubEntry(current);
- current = new Entry;
- initEntry();
-}
-*/
-
-static void handleCommentBlock(const QCString &doc,bool brief)
-{
- //printf("handleCommentBlock(doc=[%s] brief=%d docBlockInBody=%d\n",
- // doc.data(),brief,docBlockInBody);
-
- // TODO: Fix me
- docBlockInBody=FALSE;
-
- if (docBlockInBody && previous && !previous->doc.isEmpty())
- {
- previous->doc=previous->doc.stripWhiteSpace()+"\n\n";
- }
-
- int position = 0;
- bool needsEntry;
- while (parseCommentBlock(
- g_thisParser,
- (docBlockInBody && previous) ? previous : current,
- doc, // text
- yyFileName, // file
- brief ? current->briefLine : current->docLine, // line of block start
- docBlockInBody ? FALSE : brief,
- docBlockJavaStyle, // javadoc style
- protection,
- position,
- needsEntry)
- ) // need to start a new entry
- {
- if (needsEntry)
- {
- newEntry();
- }
- }
- if (needsEntry)
- {
- newEntry();
- }
-
-}
-
-static void endOfDef()
-{
- current = bodyEntry;
- bodyEntry->endBodyLine = yyLineNr;
- bodyEntry = 0;
- newEntry();
- g_insideConstructor = FALSE;
-}
-
-static inline void addToString(const char *s)
-{
- if (g_copyString) (*g_copyString)+=s;
-}
-
-static void initTriDoubleQuoteBlock()
-{
- docBlockContext = YY_START;
- docBlockInBody = FALSE;
- docBlockJavaStyle = TRUE;
- docBlock.resize(0);
- g_doubleQuote = TRUE;
- startCommentBlock(FALSE);
-}
-
-static void initTriSingleQuoteBlock()
-{
- docBlockContext = YY_START;
- docBlockInBody = FALSE;
- docBlockJavaStyle = TRUE;
- docBlock.resize(0);
- g_doubleQuote = FALSE;
- startCommentBlock(FALSE);
-}
-
-static void initSpecialBlock()
-{
- docBlockContext = YY_START;
- docBlockInBody = FALSE;
- docBlockJavaStyle = TRUE;
- docBrief = TRUE;
- docBlock.resize(0);
- startCommentBlock(TRUE);
-}
-
-//-----------------------------------------------------------------------------
-/* ----------------------------------------------------------------- */
-#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 && inputString[inputPosition] )
- {
- *buf = inputString[inputPosition++] ;
- //printf("%d (%c)\n",*buf,*buf);
- c++; buf++;
- }
- return c;
-}
-
-%}
-
- /* start command character */
-
-
-
-BB [ \t]+
-B [ \t]*
-NEWLINE \n
-BN [ \t\n]
-
-DIGIT [0-9]
-
-HEXNUMBER "0"[xX][0-9a-fA-F]+[lL]?
-OCTNUMBER "0"[0-7]+[lL]?
-NUMBER {DIGIT}+[lLjJ]?
-INTNUMBER {HEXNUMBER}|{OCTNUMBER}|{NUMBER}
-FLOATNUMBER {DIGIT}+"."{DIGIT}+([eE][+\-]?{DIGIT}+)?[jJ]?
-LETTER [A-Za-z]
-NONEMPTY [A-Za-z0-9_]
-EXPCHAR [#(){}\[\],:.%/\\=`*~|&<>!;+-]
-NONEMPTYEXP [^ \t\n:]
-PARAMNONEMPTY [^ \t\n():]
-IDENTIFIER ({LETTER}|"_")({LETTER}|{DIGIT}|"_")*
-BORDER ([^A-Za-z0-9])
-
-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"|"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")
-POUNDCOMMENT {B}"#"[^#\n][^\n]*
-
-STARTDOCSYMS ^{B}"##"/[^#]
-
-%option noyywrap
-
- /* Main start state */
-
-%x Search
-%x SearchMemVars
-
- /* Mid-comment states */
-
- /* %x FuncDoubleComment */
- /* %x ClassDoubleComment */
-%x TryClassDocString
-%x TripleComment
-%x SpecialComment
-
- /* Function states */
-
-%x FunctionDec
-%x FunctionParams
-%x FunctionBody
-
- /* Class states */
-
-%x ClassDec
-%x ClassInheritance
-%x ClassCaptureIndent
-%x ClassBody
-
- /* Variable states */
-%x VariableDec
-%x VariableEnd
-%x VariableAtom
-
- /* String states */
-
-%x SingleQuoteString
-%x DoubleQuoteString
-%x TripleString
-
-%%
-
- /* ------------ Function recognition rules -------------- */
-
-<Search>{
-
- ^{B}"def"{BB} |
- "def"{BB} { // start of a function/method definition
- g_indent=computeIndent(yytext);
- g_expectModuleDocs = FALSE;
- current->fileName = yyFileName;
- current->startLine = yyLineNr;
- current->bodyLine = yyLineNr;
- current->section = Entry::FUNCTION_SEC;
- current->protection = protection = Public;
- current->objc = FALSE;
- current->virt = Normal;
- current->stat = FALSE;
- current->mtype = mtype = Method;
- current->type.resize(0);
- current->name.resize(0);
- current->args.resize(0);
- current->argList->clear();
- BEGIN( FunctionDec );
- }
-
- ^{B}"class"{BB} |
- "class"{BB} { // start of a class definition
- g_indent=computeIndent(yytext);
- g_expectModuleDocs = FALSE;
- current->section = Entry::CLASS_SEC;
- current->argList->clear();
- current->type += "class" ;
- current->fileName = yyFileName;
- current->bodyLine = yyLineNr;
-
- BEGIN( ClassDec ) ;
- }
-
- ^{B}{IDENTIFIER}/{B}"="[^=] { // variable
- g_indent=computeIndent(yytext);
- current->section = Entry::VARIABLE_SEC;
- current->name = QCString(yytext).stripWhiteSpace();
- current->fileName = yyFileName;
- current->startLine = yyLineNr;
- current->bodyLine = yyLineNr;
- BEGIN(VariableDec);
- }
- "'" { // start of a single quoted string
- g_stringContext=YY_START;
- g_copyString=0;
- BEGIN( SingleQuoteString );
- }
- "\"" { // start of a double quoted string
- g_stringContext=YY_START;
- g_copyString=0;
- BEGIN( DoubleQuoteString );
- }
-
- {POUNDCOMMENT} { // normal comment
- }
- {IDENTIFIER} { // some other identifier
- }
- ^{BB} {
- g_curIndent=computeIndent(yytext);
- }
- [^\n] { // any other character...
- // This is the major default
- // that should catch everything
- // else in Body.
- }
-
- {NEWLINE}+ { // new line
- lineCount();
- }
-
- {TRIDOUBLEQUOTE} { // start of a comment block
- initTriDoubleQuoteBlock();
- BEGIN(TripleComment);
- }
-
- {TRISINGLEQUOTE} { // start of a comment block
- initTriSingleQuoteBlock();
- BEGIN(TripleComment);
- }
-
- {STARTDOCSYMS} { // start of a special comment
- initSpecialBlock();
- BEGIN(SpecialComment);
- }
-}
-
-<SearchMemVars>{
- "self."{IDENTIFIER}/{B}"=" {
- //printf("Found member variable %s\n",&yytext[5]);
- current->name=&yytext[5];
- current->section=Entry::VARIABLE_SEC;
- current->fileName = yyFileName;
- current->startLine = yyLineNr;
- current->bodyLine = yyLineNr;
- current->type.resize(0);
- if (current->name.at(0)=='_') // mark as private
- {
- current->protection=Private;
- }
- else
- {
- current->protection=Public;
- }
- newEntry();
- }
- {TRIDOUBLEQUOTE} { // start of a comment block
- initTriDoubleQuoteBlock();
- BEGIN(TripleComment);
- }
-
- {TRISINGLEQUOTE} { // start of a comment block
- initTriSingleQuoteBlock();
- BEGIN(TripleComment);
- }
-
- {STARTDOCSYMS} { // start of a special comment
- initSpecialBlock();
- BEGIN(SpecialComment);
- }
- "'" { // start of a single quoted string
- g_stringContext=YY_START;
- g_copyString=0;
- BEGIN( SingleQuoteString );
- }
- "\"" { // start of a double quoted string
- g_stringContext=YY_START;
- g_copyString=0;
- BEGIN( DoubleQuoteString );
- }
- .
- \n { yyLineNr++; }
-}
-
-<FunctionBody>{
- \n{B}/{IDENTIFIER}{BB} {
- //fprintf(stderr,"indent %d<=%d\n",computeIndent(&yytext[1]),g_indent);
- if (computeIndent(&yytext[1])<=g_indent)
- {
- int i;
- for (i=yyleng-1;i>=0;i--)
- {
- unput(yytext[i]);
- }
- endOfDef();
- YY_CURRENT_BUFFER->yy_at_bol=TRUE;
- BEGIN(Search);
- }
- else
- {
- yyLineNr++;
- current->program+=yytext;
- }
- }
- \n{B}/"##" {
- if (computeIndent(&yytext[1])<=g_indent)
- {
- int i;
- for (i=yyleng-1;i>=0;i--)
- {
- unput(yytext[i]);
- }
- endOfDef();
- YY_CURRENT_BUFFER->yy_at_bol=TRUE;
- BEGIN(Search);
- }
- else
- {
- yyLineNr++;
- current->program+=yytext;
- }
- }
- <<EOF>> {
- endOfDef();
- yyterminate();
- }
- ^{BB}\n { // skip empty line
- current->program+=yytext;
- yyLineNr++;
- }
- ^{BB} { // something at indent >0
- current->program+=yytext;
- g_curIndent = computeIndent(yytext);
- if (g_curIndent<=g_indent)
- // jumped out of the function
- {
- endOfDef();
- BEGIN(Search);
- }
- }
- "'" { // start of a single quoted string
- current->program+=yytext;
- g_stringContext=YY_START;
- g_specialBlock = FALSE;
- g_copyString=&current->program;
- BEGIN( SingleQuoteString );
- }
- "\"" { // start of a double quoted string
- current->program+=yytext;
- g_stringContext=YY_START;
- g_specialBlock = FALSE;
- g_copyString=&current->program;
- BEGIN( DoubleQuoteString );
- }
- [^ \t\n#'".]+ { // non-special stuff
- current->program+=yytext;
- g_specialBlock = FALSE;
- }
- ^{POUNDCOMMENT} { // normal comment
- current->program+=yytext;
- }
- "#".* { // comment half way
- current->program+=yytext;
- }
- {NEWLINE} { yyLineNr++;
- current->program+=yytext;
- }
- . { // any character
- current->program+=*yytext;
- g_specialBlock = FALSE;
- }
-
- {TRIDOUBLEQUOTE} { // start of a comment block
- initTriDoubleQuoteBlock();
- BEGIN(TripleComment);
- }
-
- {TRISINGLEQUOTE} { // start of a comment block
- initTriSingleQuoteBlock();
- BEGIN(TripleComment);
- }
-
- {STARTDOCSYMS} { // start of a special comment
- initSpecialBlock();
- BEGIN(SpecialComment);
- }
-
-}
-
-<FunctionDec>{
-
- {IDENTIFIER} {
- //found function name
- if (current->type.isEmpty())
- {
- current->type = "def";
- }
- current->name = yytext;
- current->name = current->name.stripWhiteSpace();
- if (!current->name.isEmpty() && current->name.at(0)=='_')
- {
- current->protection = Private;
- }
- //if ((current_root->section&Entry::SCOPE_MASK) &&
- // current->name=="__init__") // constructor
- //{
- g_insideConstructor = TRUE;
- // g_constructorEntry = current;
- // newEntry();
- //}
- }
-
- {B}"(" {
- BEGIN( FunctionParams );
- }
-}
-
-<FunctionParams>{
- ({BB}|",") {
- }
-
- {IDENTIFIER} { // Name of parameter
- lineCount();
- Argument *a = new Argument;
- current->argList->append(a);
- current->argList->getLast()->name = QCString(yytext).stripWhiteSpace();
- current->argList->getLast()->type = "";
- }
- "="[^,)\n]+ { // default value
- // TODO: this rule is too simple, need to be able to
- // match things like =")" as well!
- QCString defVal=&yytext[1];
- if (current->argList->getLast())
- {
- current->argList->getLast()->defval=defVal.stripWhiteSpace();
- }
- }
-
- ")" { // end of parameter list
- }
-
- ":" {
- lineCount();
- g_specialBlock = TRUE; // expecting a docstring
- bodyEntry = current;
- BEGIN( FunctionBody );
- }
-
- {PARAMNONEMPTY} { // Default rule inside arguments.
- }
-
-}
-
-
-<ClassBody>{
- \n/{IDENTIFIER}{BB} { // new def at indent 0
- yyLineNr++;
- endOfDef();
- BEGIN(Search);
- }
- ^{BB}\n { // skip empty line
- current->program+=yytext;
- yyLineNr++;
- }
- <<EOF>> {
- endOfDef();
- yyterminate();
- }
- ^{BB} { // something at indent >0
- g_curIndent=computeIndent(yytext);
- //fprintf(stderr,"g_curIndent=%d g_indent=%d\n",g_curIndent,g_indent);
- if (g_curIndent<=g_indent)
- // jumped out of the class
- {
- endOfDef();
- g_indent=g_curIndent;
- // make sure the next rule matches ^...
- YY_CURRENT_BUFFER->yy_at_bol=TRUE;
- BEGIN(Search);
- }
- else
- {
- current->program+=yytext;
- }
- }
- "'" { // start of a single quoted string
- current->program+=*yytext;
- g_stringContext=YY_START;
- g_specialBlock = FALSE;
- g_copyString=&current->program;
- BEGIN( SingleQuoteString );
- }
- "\"" { // start of a double quoted string
- current->program+=*yytext;
- g_stringContext=YY_START;
- g_specialBlock = FALSE;
- g_copyString=&current->program;
- BEGIN( DoubleQuoteString );
- }
- [^ \t\n#'"]+ { // non-special stuff
- current->program+=yytext;
- g_specialBlock = FALSE;
- }
- ^{POUNDCOMMENT} { // normal comment
- current->program+=yytext;
- }
- {NEWLINE} {
- current->program+=*yytext;
- yyLineNr++;
- }
- . { // any character
- g_specialBlock = FALSE;
- current->program+=*yytext;
- }
- {TRIDOUBLEQUOTE} { // start of a comment block
- current->program+=yytext;
- initTriDoubleQuoteBlock();
- BEGIN(TripleComment);
- }
-
- {TRISINGLEQUOTE} { // start of a comment block
- current->program+=yytext;
- initTriSingleQuoteBlock();
- BEGIN(TripleComment);
- }
-
-}
-
-<ClassDec>{IDENTIFIER} {
- if (current->type.isEmpty())
- {
- current->type = "class";
- }
-
- current->section = Entry::CLASS_SEC;
- current->name = yytext;
-
- // prepend scope in case of nested classes
- if (current_root->section&Entry::SCOPE_MASK)
- {
- current->name.prepend(current_root->name+"::");
- }
-
- current->name = current->name.stripWhiteSpace();
- current->fileName = yyFileName;
- docBlockContext = YY_START;
- docBlockInBody = FALSE;
- docBlockJavaStyle = FALSE;
- docBlock.resize(0);
-
- BEGIN(ClassInheritance);
- }
-
-<ClassInheritance>{
- ({BB}|[(,)]) { // syntactic sugar for the list
- }
-
- ":" { // begin of the class definition
- g_specialBlock = TRUE; // expecting a docstring
- BEGIN(ClassCaptureIndent);
- }
-
- {IDENTIFIER} {
- current->extends->append(
- new BaseInfo(yytext,Public,Normal)
- );
- //Has base class-do stuff
- }
-}
-
-
-<ClassCaptureIndent>{
- "\n"|({BB}"\n") {
- // Blankline - ignore, keep looking for indentation.
- lineCount();
- }
-
- {TRIDOUBLEQUOTE} { // start of a comment block
- initTriDoubleQuoteBlock();
- BEGIN(TripleComment);
- }
-
- {TRISINGLEQUOTE} { // start of a comment block
- initTriSingleQuoteBlock();
- BEGIN(TripleComment);
- }
-
- ^{BB} {
- current->program=yytext;
- current->startLine = yyLineNr;
- g_curIndent=computeIndent(yytext);
- bodyEntry = current;
- //fprintf(stderr,"setting indent %d\n",g_curIndent);
- //printf("current->program=[%s]\n",current->program.data());
- BEGIN( ClassBody );
- }
-
- ""/({NONEMPTY}|{EXPCHAR}) {
-
- // Just pushback an empty class, and
- // resume parsing the body.
- newEntry();
-
- // printf("Failed to find indent - skipping!");
- BEGIN( Search );
- }
-}
-
-
-<VariableDec>{
- "=" { // the assignment operator
- }
- {B} { // spaces
- }
- {INTNUMBER} { // integer value
- current->type = "int";
- current->initializer = yytext;
- BEGIN(VariableEnd);
- }
- {FLOATNUMBER} { // floating point value
- current->type = "float";
- current->initializer = yytext;
- BEGIN(VariableEnd);
- }
- {STRINGPREFIX}?"'" { // string
- current->type = "string";
- current->initializer = yytext;
- g_copyString=&current->initializer;
- g_stringContext=VariableEnd;
- BEGIN( SingleQuoteString );
- }
- {STRINGPREFIX}?"\"" { // string
- current->type = "string";
- current->initializer = yytext;
- g_copyString=&current->initializer;
- g_stringContext=VariableEnd;
- BEGIN( DoubleQuoteString );
- }
- {TRIDOUBLEQUOTE} { // start of a comment block
- current->type = "string";
- g_doubleQuote=TRUE;
- g_copyString=&current->initializer;
- g_stringContext=VariableEnd;
- BEGIN(TripleString);
- }
-
- {TRISINGLEQUOTE} { // start of a comment block
- current->type = "string";
- g_doubleQuote=FALSE;
- g_copyString=&current->initializer;
- g_stringContext=VariableEnd;
- BEGIN(TripleString);
- }
- "(" { // typle
- current->type = "tuple";
- current->initializer+=*yytext;
- g_atomStart='(';
- g_atomEnd=')';
- g_atomCount=1;
- BEGIN( VariableAtom );
- }
- "[" { // list
- current->type = "list";
- current->initializer+=*yytext;
- g_atomStart='[';
- g_atomEnd=']';
- g_atomCount=1;
- BEGIN( VariableAtom );
- }
- "{" { // dictionary
- current->type = "dictionary";
- current->initializer+=*yytext;
- g_atomStart='{';
- g_atomEnd='}';
- g_atomCount=1;
- BEGIN( VariableAtom );
- }
- "#".* { // comment
- BEGIN( VariableEnd );
- }
- . {
- current->initializer+=*yytext;
- }
- \n {
- unput('\n');
- BEGIN( VariableEnd );
- }
-}
-
-<VariableAtom>{
- [\(\[\{] {
- current->initializer+=*yytext;
- if (g_atomStart==*yytext)
- {
- g_atomCount++;
- }
- }
- [\)\]\}] {
- current->initializer+=*yytext;
- if (g_atomEnd==*yytext)
- {
- g_atomCount--;
- }
- if (g_atomCount==0)
- {
- BEGIN(VariableEnd);
- }
- }
- {IDENTIFIER} {
- current->initializer+=yytext;
- }
- . {
- current->initializer+=*yytext;
- }
- \n {
- current->initializer+=*yytext;
- yyLineNr++;
- }
-
-}
-
-<VariableEnd>{
- \n {
- yyLineNr++;
- newVariable();
- BEGIN(Search);
- }
- . {
- unput(*yytext);
- newVariable();
- BEGIN(Search);
- }
- <<EOF>> { yyterminate();
- newEntry();
- }
-}
-
-<TripleComment>{
- {TRIDOUBLEQUOTE} |
- {TRISINGLEQUOTE} {
- // printf("Expected module block %d special=%d\n",g_expectModuleDocs,g_specialBlock);
- if (g_doubleQuote==(yytext[0]=='"'))
- {
- if (g_specialBlock || g_expectModuleDocs)
- {
- QCString actualDoc=docBlock;
- actualDoc.prepend("\\verbatim ");
- actualDoc.append("\\endverbatim ");
- if (g_expectModuleDocs)
- {
- actualDoc.prepend("\\namespace "+g_moduleScope+"\\_linebr ");
- }
- handleCommentBlock(actualDoc, FALSE);
- }
- g_expectModuleDocs=FALSE;
- if (docBlockContext==ClassBody ||
- docBlockContext==FunctionBody)
- {
- current->program+=docBlock;
- current->program+=yytext;
- }
- BEGIN(docBlockContext);
- }
- else
- {
- docBlock += yytext;
- }
- }
-
-
- ^{BB} { // leading whitespace
- int indent = computeIndent(yytext);
- if (indent>=g_curIndent)
- { // strip g_curIndent amount of whitespace
- int i;
- for (i=0;i<indent-g_curIndent;i++) docBlock+=' ';
- //fprintf(stderr,"stripping indent %d\n",g_curIndent);
- }
- else
- {
- //fprintf(stderr,"not stripping: %d<%d\n",indent,g_curIndent);
- docBlock += yytext;
- }
- }
- [^"\n \t]+ {
- docBlock += yytext;
- }
- \n {
- yyLineNr++;
- docBlock += yytext;
- }
- . {
- docBlock += yytext;
- }
-}
-
-<SpecialComment>{
- ^{B}"#"("#")* { // skip leading hashes
- }
- \n/{B}"#" { // continuation of the comment on the next line
- docBlock+='\n';
- docBrief = FALSE;
- startCommentBlock(FALSE);
- yyLineNr++;
- }
- [^#\n]+ { // any other stuff
- docBlock+=yytext;
- }
- \n { // new line that ends the comment
- if (g_expectModuleDocs)
- {
- docBlock.prepend("\\namespace "+g_moduleScope+"\\_linebr ");
- }
- g_expectModuleDocs=FALSE;
- handleCommentBlock(docBlock, docBrief);
- yyLineNr++;
- BEGIN(docBlockContext);
- }
- . { // anything we missed
- docBlock+=*yytext;
- }
-}
-
-<SingleQuoteString>{
- \\{B}\n { // line continuation
- addToString(yytext);
- yyLineNr++;
- }
- \\. { // espaced char
- addToString(yytext);
- }
- "\"\"\"" { // tripple double quotes
- addToString(yytext);
- }
- "'" { // end of the string
- addToString(yytext);
- BEGIN(g_stringContext);
- }
- [^"'\n\\]+ { // normal chars
- addToString(yytext);
- }
- . { // normal char
- addToString(yytext);
- }
-}
-
-<DoubleQuoteString>{
- \\{B}\n { // line continuation
- addToString(yytext);
- yyLineNr++;
- }
- \\. { // espaced char
- addToString(yytext);
- }
- "'''" { // tripple single quotes
- addToString(yytext);
- }
- "\"" { // end of the string
- addToString(yytext);
- BEGIN(g_stringContext);
- }
- [^"'\n\\]+ { // normal chars
- addToString(yytext);
- }
- . { // normal char
- addToString(yytext);
- }
-}
-
-<TripleString>{
- {TRIDOUBLEQUOTE} |
- {TRISINGLEQUOTE} {
- *g_copyString += yytext;
- //printf("Expected module block %d special=%d\n",g_expectModuleDocs,g_specialBlock);
- if (g_doubleQuote==(yytext[0]=='"'))
- {
- BEGIN(docBlockContext);
- }
- }
-
-
- ({LONGSTRINGBLOCK}) {
- lineCount();
- *g_copyString += yytext;
- }
- \n {
- yyLineNr++;
- *g_copyString += yytext;
- }
- . {
- *g_copyString += *yytext;
- }
-}
-
- /* ------------ End rules -------------- */
-
- /*
-<*>({NONEMPTY}|{EXPCHAR}|{BB}) { // This should go one character at a time.
- // printf("[pyscanner] '%s' [ state %d ] [line %d] no match\n",
- // yytext, YY_START, yyLineNr);
-
- }
- */
-
-<*>{NEWLINE} {
- //printf("[pyscanner] %d NEWLINE [line %d] no match\n",
- // YY_START, yyLineNr);
-
- lineCount();
- }
-
-<*>. {
- //printf("[pyscanner] '%s' [ state %d ] [line %d] no match\n",
- // yytext, YY_START, yyLineNr);
-
- }
-
-
-%%
-
-//----------------------------------------------------------------------------
-
-static void parseCompounds(Entry *rt)
-{
- //printf("parseCompounds(%s)\n",rt->name.data());
- EntryListIterator eli(*rt->sublist);
- Entry *ce;
- for (;(ce=eli.current());++eli)
- {
- if (!ce->program.isEmpty())
- {
- //printf("-- %s ---------\n%s\n---------------\n",
- // ce->name.data(),ce->program.data());
- // init scanner state
- inputString = ce->program;
- inputPosition = 0;
- pyscanYYrestart( pyscanYYin ) ;
- if (ce->section&Entry::COMPOUND_MASK)
- {
- current_root = ce ;
- BEGIN( Search );
- }
- else if (ce->parent)
- {
- current_root = ce->parent;
- //printf("Searching for member variables in %s parent=%s\n",
- // ce->name.data(),ce->parent->name.data());
- BEGIN( SearchMemVars );
- }
- yyFileName = ce->fileName;
- yyLineNr = ce->startLine ;
- if (current) delete current;
- current = new Entry;
-
- groupEnterCompound(yyFileName,yyLineNr,ce->name);
-
- pyscanYYlex() ;
- delete current; current=0;
- ce->program.resize(0);
-
- groupLeaveCompound(yyFileName,yyLineNr,ce->name);
-
- }
- parseCompounds(ce);
- }
-}
-
-//----------------------------------------------------------------------------
-
-
-static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
-{
- initParser();
-
- inputString = fileBuf;
- inputPosition = 0;
-
- protection = Public;
- mtype = Method;
- gstat = FALSE;
- virt = Normal;
- current_root = rt;
- g_expectModuleDocs = TRUE;
- g_specialBlock = FALSE;
- g_insideConstructor = FALSE;
-
-
- inputFile.setName(fileName);
- if (inputFile.open(IO_ReadOnly))
- {
- yyLineNr= 1 ;
- yyFileName = fileName;
- //setContext();
- msg("Parsing file %s...\n",yyFileName.data());
-
- QFileInfo fi(fileName);
- g_moduleScope = findPackageScope(fileName);
- if (!g_moduleScope.isEmpty())
- {
- g_moduleScope+="::";
- }
- g_moduleScope+=fi.baseName();
-
- current = new Entry;
- current->name = g_moduleScope;
- current->section = Entry::NAMESPACE_SEC;
- current->type = "namespace";
- current->fileName = yyFileName;
- current->startLine = yyLineNr;
- current->bodyLine = yyLineNr;
-
- rt->addSubEntry(current);
-
- current_root = current ;
- initParser();
- current = new Entry;
-
- // Set the python flags
- //current_root->python = TRUE;
- //current->python = TRUE;
-
- groupEnterFile(yyFileName,yyLineNr);
-
- current->reset();
- pyscanYYrestart( pyscanYYin );
- BEGIN( Search );
- pyscanYYlex();
-
- groupLeaveFile(yyFileName,yyLineNr);
-
- current_root->program.resize(0);
- delete current; current=0;
-
- parseCompounds(current_root);
-
- inputFile.close();
- }
-
-}
-
-//----------------------------------------------------------------------------
-
-static void parsePrototype(const QCString &text)
-{
- //printf("**** parsePrototype(%s) begin\n",text.data());
-
- g_expectModuleDocs = FALSE;
- g_specialBlock = FALSE;
- g_insideConstructor = FALSE;
-
- const char *orgInputString;
- int orgInputPosition;
- YY_BUFFER_STATE orgState;
-
- // save scanner state
- orgState = YY_CURRENT_BUFFER;
- yy_switch_to_buffer(yy_create_buffer(pyscanYYin, YY_BUF_SIZE));
- orgInputString = inputString;
- orgInputPosition = inputPosition;
-
- // set new string
- inputString = text;
- inputPosition = 0;
- pyscanYYrestart( pyscanYYin );
-
- BEGIN( FunctionDec );
-
- pyscanYYlex();
-
- current->name = current->name.stripWhiteSpace();
- if (current->section == Entry::MEMBERDOC_SEC && current->args.isEmpty())
- current->section = Entry::VARIABLEDOC_SEC;
-
- // restore original scanner state
- yy_switch_to_buffer(orgState);
- inputString = orgInputString;
- inputPosition = orgInputPosition;
-
- //printf("**** parsePrototype end\n");
-}
-
-//----------------------------------------------------------------------------
-
-void PythonLanguageScanner::parseInput(const char *fileName,const char *fileBuf,Entry *root)
-{
- g_thisParser = this;
- ::parseMain(fileName,fileBuf,root);
-
- // May print the AST for debugging purposes
- // printAST(global_root);
-}
-
-bool PythonLanguageScanner::needsPreprocessing(const QCString &)
-{
- return FALSE;
-}
-
-void PythonLanguageScanner::parseCode(CodeOutputInterface &codeOutIntf,
- const char *scopeName,
- const QCString &input,
- bool isExampleBlock,
- const char *exampleName,
- FileDef *fileDef,
- int startLine,
- int endLine,
- bool inlineFragment,
- MemberDef *memberDef
- )
-{
- ::parsePythonCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName,
- fileDef,startLine,endLine,inlineFragment,memberDef);
-}
-
-void PythonLanguageScanner::parsePrototype(const char *text)
-{
- ::parsePrototype(text);
-
-}
-
-void PythonLanguageScanner::resetCodeParserState()
-{
- ::resetPythonCodeParserState();
-}
-
-//----------------------------------------------------------------------------
-
-#if !defined(YY_FLEX_SUBMINOR_VERSION)
-//----------------------------------------------------------------------------
-extern "C" { // some bogus code to keep the compiler happy
- void pyscannerYYdummy() { yy_flex_realloc(0,0); }
-}
-#endif
-
diff --git a/src/qtbc.h b/src/qtbc.h
deleted file mode 100644
index 452974c..0000000
--- a/src/qtbc.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 QTBC_H
-#define QTBC_H
-
-/*! This file contains some hacks to make Doxygen work with
- * Qt version 2.00 and Qt version 1.xx
- */
-
-#include <qglobal.h>
-
-#if QT_VERSION >= 200
-
-#include <locale.h>
-
-#define GCI QCollection::Item
-
-#include <qcstring.h>
-#include <qstring.h>
-inline QCString convertToQCString(const QString &s) { return s.latin1(); }
-
-#else /* QT_VERSION < 200 */
-
-#include <qstring.h>
-#define QCString QString
-inline QCString convertToQCString(const QCString &s) { return s; }
-
-#endif
-
-#endif
diff --git a/src/reflist.cpp b/src/reflist.cpp
deleted file mode 100644
index 98e8b9a..0000000
--- a/src/reflist.cpp
+++ /dev/null
@@ -1,105 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 "reflist.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_dict = 0;
- m_dictIterator = 0;
- m_id = 0;
- m_listName = listName;
- m_pageTitle = pageTitle;
- m_secTitle = secTitle;
-}
-
-/*! Destroy the todo list. Currently not called! */
-RefList::~RefList()
-{
- delete m_dictIterator;
- delete m_dict;
-}
-
-/*! Adds a new item to the list.
- * \returns A unique id for this item.
- */
-int RefList::addRefItem()
-{
- 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::pageTitle() const
-{
- return m_pageTitle;
-}
-
-QCString RefList::sectionTitle() const
-{
- return m_secTitle;
-}
-
diff --git a/src/reflist.h b/src/reflist.h
deleted file mode 100644
index e3a5674..0000000
--- a/src/reflist.h
+++ /dev/null
@@ -1,70 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 _REFLIST_H
-#define _REFLIST_H
-
-#include "qtbc.h"
-#include <qintdict.h>
-//#include "outputgen.h"
-
-/*! This struct represents an item in the list of references. */
-struct RefItem
-{
- RefItem() : written(FALSE) {}
- QCString text; //!< text of the item.
- QCString listAnchor; //!< anchor in the list
- bool written;
-};
-
-/*! @brief 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
- * documentation and the list.
- *
- * Examples are the todo list, the test list and the bug list,
- * introduced by the \\todo, \\test, and \\bug commands respectively.
- */
-class RefList
-{
- public:
- int addRefItem();
- RefItem *getRefItem(int todoItemId);
- RefItem *getFirstRefItem();
- RefItem *getNextRefItem();
- QCString listName() const;
- QCString pageTitle() const;
- QCString sectionTitle() const;
-
- RefList(const char *listName,
- const char *pageTitle,const char *secTitle
- );
- ~RefList();
-
- private:
- int m_id;
- QCString m_listName;
- QCString m_pageTitle;
- QCString m_secTitle;
- QIntDict<RefItem> *m_dict;
- QIntDictIterator<RefItem> *m_dictIterator;
-};
-
-#endif
diff --git a/src/rtfdocvisitor.cpp b/src/rtfdocvisitor.cpp
deleted file mode 100644
index 1989800..0000000
--- a/src/rtfdocvisitor.cpp
+++ /dev/null
@@ -1,1416 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 "rtfdocvisitor.h"
-#include "docparser.h"
-#include "language.h"
-#include "doxygen.h"
-#include "outputgen.h"
-#include "dot.h"
-#include "util.h"
-#include "rtfstyle.h"
-#include "message.h"
-#include <qfileinfo.h>
-#include "parserintf.h"
-
-
-#define DBG_RTF(x) m_t << x
-//#define DBG_RTF(x) do {} while(0)
-
-RTFDocVisitor::RTFDocVisitor(QTextStream &t,CodeOutputInterface &ci,
- 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)
-{
-}
-
-QString RTFDocVisitor::getStyle(const char *name)
-{
- QString n;
- n.sprintf("%s%d",name,m_indentLevel);
- StyleData *sd = rtf_Style[n];
- ASSERT(sd!=0);
- return sd->reference;
-}
-
-void RTFDocVisitor::incIndentLevel()
-{
- if (m_indentLevel<rtf_maxIndentLevels-1) m_indentLevel++;
-}
-
-void RTFDocVisitor::decIndentLevel()
-{
- if (m_indentLevel>0) m_indentLevel--;
-}
-
- //--------------------------------------
- // visitor functions for leaf nodes
- //--------------------------------------
-
-void RTFDocVisitor::visit(DocWord *w)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visit(DocWord)}\n");
- filter(w->word());
- m_lastIsPara=FALSE;
-}
-
-void RTFDocVisitor::visit(DocLinkedWord *w)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visit(DocLinkedWord)}\n");
- startLink(w->ref(),w->file(),w->anchor());
- filter(w->word());
- endLink(w->ref());
- m_lastIsPara=FALSE;
-}
-
-void RTFDocVisitor::visit(DocWhiteSpace *w)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visit(DocWhiteSpace)}\n");
- if (m_insidePre)
- {
- m_t << w->chars();
- }
- else
- {
- m_t << " ";
- }
- m_lastIsPara=FALSE;
-}
-
-void RTFDocVisitor::visit(DocSymbol *s)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visit(DocSymbol)}\n");
- switch(s->symbol())
- {
- case DocSymbol::BSlash: m_t << "\\\\"; break;
- case DocSymbol::At: m_t << "@"; break;
- case DocSymbol::Less: m_t << "<"; break;
- case DocSymbol::Greater: m_t << ">"; break;
- case DocSymbol::Amp: m_t << "&"; break;
- case DocSymbol::Dollar: m_t << "$"; break;
- case DocSymbol::Hash: m_t << "#"; break;
- case DocSymbol::Percent: m_t << "%"; break;
- case DocSymbol::Copy: m_t << "(C)"; break;
- case DocSymbol::Tm: m_t << "(TM)"; break;
- case DocSymbol::Reg: m_t << "(R)"; break;
- case DocSymbol::Apos: m_t << "'"; break;
- case DocSymbol::Quot: m_t << "\""; break;
- case DocSymbol::Uml: switch(s->letter())
- {
- case 'A' : m_t << '\304'; break;
- case 'E' : m_t << '\313'; break;
- case 'I' : m_t << '\317'; break;
- case 'O' : m_t << '\326'; break;
- case 'U' : m_t << '\334'; break;
- case 'Y' : m_t << 'Y'; break;
- case 'a' : m_t << '\344'; break;
- case 'e' : m_t << '\353'; break;
- case 'i' : m_t << '\357'; break;
- case 'o' : m_t << '\366'; break;
- case 'u' : m_t << '\374'; break;
- case 'y' : m_t << '\377'; break;
- default: m_t << '?'; break;
- }
- break;
- case DocSymbol::Acute: switch(s->letter())
- {
- case 'A' : m_t << '\301'; break;
- case 'E' : m_t << '\311'; break;
- case 'I' : m_t << '\315'; break;
- case 'O' : m_t << '\323'; break;
- case 'U' : m_t << '\332'; break;
- case 'Y' : m_t << '\335'; break;
- case 'a' : m_t << '\341'; break;
- case 'e' : m_t << '\351'; break;
- case 'i' : m_t << '\355'; break;
- case 'o' : m_t << '\363'; break;
- case 'u' : m_t << '\372'; break;
- case 'y' : m_t << '\375'; break;
- default: m_t << '?'; break;
- }
- break;
- case DocSymbol::Grave: switch(s->letter())
- {
- case 'A' : m_t << '\300'; break;
- case 'E' : m_t << '\310'; break;
- case 'I' : m_t << '\314'; break;
- case 'O' : m_t << '\322'; break;
- case 'U' : m_t << '\331'; break;
- case 'a' : m_t << '\340'; break;
- case 'e' : m_t << '\350'; break;
- case 'i' : m_t << '\354'; break;
- case 'o' : m_t << '\362'; break;
- case 'u' : m_t << '\371'; break;
- default: m_t << '?'; break;
- }
- break;
- case DocSymbol::Circ: switch(s->letter())
- {
- case 'A' : m_t << '\302'; break;
- case 'E' : m_t << '\312'; break;
- case 'I' : m_t << '\316'; break;
- case 'O' : m_t << '\324'; break;
- case 'U' : m_t << '\333'; break;
- case 'a' : m_t << '\342'; break;
- case 'e' : m_t << '\352'; break;
- case 'i' : m_t << '\356'; break;
- case 'o' : m_t << '\364'; break;
- case 'u' : m_t << '\373'; break;
- default: m_t << '?'; break;
- }
- break;
- case DocSymbol::Tilde: switch(s->letter())
- {
- case 'A' : m_t << '\303'; break;
- case 'N' : m_t << '\321'; break;
- case 'O' : m_t << '\325'; break;
- case 'a' : m_t << '\343'; break;
- case 'n' : m_t << '\361'; break;
- case 'o' : m_t << '\365'; break;
- default: m_t << '?'; break;
- }
- break;
- case DocSymbol::Cedil: switch(s->letter())
- {
- case 'C' : m_t << '\307'; break;
- case 'c' : m_t << '\347'; break;
- default: m_t << '?'; break;
- }
- break;
- case DocSymbol::Slash: switch(s->letter())
- {
- case 'O' : m_t << '\330'; break;
- case 'o' : m_t << '\370'; break;
- default: m_t << '?'; break;
- }
- break;
- case DocSymbol::Ring: switch(s->letter())
- {
- case 'A' : m_t << '\305'; break;
- case 'a' : m_t << '\345'; break;
- default: m_t << '?'; break;
- }
- break;
- case DocSymbol::Szlig: m_t << "\337"; break;
- case DocSymbol::Nbsp: m_t << "\\~ "; break;
- default:
- err("Error: unknown symbol found\n");
- }
- m_lastIsPara=FALSE;
-}
-
-void RTFDocVisitor::visit(DocURL *u)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visit(DocURL)}\n");
- if (Config_getBool("RTF_HYPERLINKS"))
- {
- m_t << "{\\field "
- "{\\*\\fldinst "
- "{ HYPERLINK \\\\l \"";
- if (u->isEmail()) m_t << "mailto:";
- m_t << u->url();
- m_t << "\" }"
- "{}";
- m_t << "}"
- "{\\fldrslt "
- "{\\cs37\\ul\\cf2 ";
- filter(u->url());
- m_t << "}"
- "}"
- "}" << endl;
- }
- else
- {
- m_t << "{\\f2 ";
- filter(u->url());
- m_t << "}";
- }
- m_lastIsPara=FALSE;
-}
-
-void RTFDocVisitor::visit(DocLineBreak *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visit(DocLineBreak)}\n");
- m_t << "\\par\n";
- m_lastIsPara=TRUE;
-}
-
-void RTFDocVisitor::visit(DocHorRuler *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visit(DocHorRuler)}\n");
- m_t << "{\\pard\\widctlpar\\brdrb\\brdrs\\brdrw5\\brsp20 \\adjustright \\par}" << endl;
- m_lastIsPara=TRUE;
-}
-
-void RTFDocVisitor::visit(DocStyleChange *s)
-{
- if (m_hide) return;
- m_lastIsPara=FALSE;
- DBG_RTF("{\\comment RTFDocVisitor::visit(DocStyleChange)}\n");
- switch (s->style())
- {
- case DocStyleChange::Bold:
- if (s->enable()) m_t << "{\\b "; else m_t << "} ";
- break;
- case DocStyleChange::Italic:
- if (s->enable()) m_t << "{\\i "; else m_t << "} ";
- break;
- case DocStyleChange::Code:
- if (s->enable()) m_t << "{\\f2 "; else m_t << "} ";
- break;
- case DocStyleChange::Subscript:
- if (s->enable()) m_t << "{\\sub "; else m_t << "} ";
- break;
- case DocStyleChange::Superscript:
- if (s->enable()) m_t << "{\\super "; else m_t << "} ";
- break;
- case DocStyleChange::Center:
- if (s->enable()) m_t << "{\\qc "; else m_t << "} ";
- break;
- case DocStyleChange::Small:
- if (s->enable()) m_t << "{\\sub "; else m_t << "} ";
- break;
- case DocStyleChange::Preformatted:
- if (s->enable())
- {
- m_t << "{" << endl;
- m_t << "\\par" << endl;
- m_t << rtf_Style_Reset << getStyle("CodeExample");
- m_insidePre=TRUE;
- }
- else
- {
- m_insidePre=FALSE;
- m_t << "\\par" << endl;
- m_t << "}" << endl;
- }
- m_lastIsPara=TRUE;
- break;
- case DocStyleChange::Div: /* HTML only */ break;
- case DocStyleChange::Span: /* HTML only */ break;
- }
-}
-
-void RTFDocVisitor::visit(DocVerbatim *s)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visit(DocVerbatim)}\n");
- switch(s->type())
- {
- case DocVerbatim::Code: // fall though
- m_t << "{" << endl;
- m_t << "\\par" << endl;
- m_t << rtf_Style_Reset << getStyle("CodeExample");
- Doxygen::parserManager->getParser(m_langExt)
- ->parseCode(m_ci,s->context(),s->text().latin1(),
- s->isExample(),s->exampleFile());
- //m_t << "\\par" << endl;
- m_t << "}" << endl;
- break;
- 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 << "}" << endl;
- break;
- case DocVerbatim::HtmlOnly:
- case DocVerbatim::LatexOnly:
- case DocVerbatim::XmlOnly:
- case DocVerbatim::ManOnly:
- /* nothing */
- break;
- case DocVerbatim::Dot:
- {
- static int dotindex = 1;
- QCString fileName(4096);
-
- fileName.sprintf("%s%d",
- (Config_getString("RTF_OUTPUT")+"/inline_dotgraph_").data(),
- dotindex++
- );
- QFile file(fileName);
- if (!file.open(IO_WriteOnly))
- {
- err("Could not open file %s for writing\n",fileName.data());
- }
- file.writeBlock( s->text(), s->text().length() );
- file.close();
- m_t << "\\par{\\qc "; // center picture
- writeDotFile(fileName);
- m_t << "} ";
- file.remove();
- }
- break;
- }
- m_lastIsPara=FALSE;
-}
-
-void RTFDocVisitor::visit(DocAnchor *anc)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visit(DocAnchor)}\n");
- QString anchor;
- if (!anc->file().isEmpty())
- {
- anchor+=anc->file();
- }
- if (!anc->file().isEmpty() && !anc->anchor().isEmpty())
- {
- anchor+="_";
- }
- if (!anc->anchor().isEmpty())
- {
- anchor+=anc->anchor();
- }
- m_t << "{\\bkmkstart " << rtfFormatBmkStr(anchor) << "}" << endl;
- m_t << "{\\bkmkend " << rtfFormatBmkStr(anchor) << "}" << endl;
- m_lastIsPara=FALSE;
-}
-
-void RTFDocVisitor::visit(DocInclude *inc)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visit(DocInclude)}\n");
- 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( cfi.dirPath(), cfi.fileName() );
- Doxygen::parserManager->getParser(inc->extension())
- ->parseCode(m_ci,inc->context(),
- inc->text().latin1(),
- inc->isExample(),
- inc->exampleFile(), &fd);
- m_t << "\\par" << endl;
- m_t << "}" << endl;
- }
- break;
- case DocInclude::Include:
- m_t << "{" << endl;
- m_t << "\\par" << endl;
- m_t << rtf_Style_Reset << getStyle("CodeExample");
- Doxygen::parserManager->getParser(inc->extension())
- ->parseCode(m_ci,inc->context(),
- inc->text().latin1(),inc->isExample(),
- inc->exampleFile());
- m_t << "\\par" << endl;
- m_t << "}" << endl;
- break;
- case DocInclude::DontInclude:
- break;
- case DocInclude::HtmlInclude:
- break;
- case DocInclude::VerbInclude:
- m_t << "{" << endl;
- m_t << "\\par" << endl;
- m_t << rtf_Style_Reset << getStyle("CodeExample");
- filter(inc->text());
- m_t << "\\par" << endl;
- m_t << "}" << endl;
- break;
- }
- m_lastIsPara=TRUE;
-}
-
-void RTFDocVisitor::visit(DocIncOperator *op)
-{
- //printf("DocIncOperator: type=%d first=%d, last=%d text=`%s'\n",
- // op->type(),op->isFirst(),op->isLast(),op->text().data());
- DBG_RTF("{\\comment RTFDocVisitor::visit(DocIncOperator)}\n");
- if (op->isFirst())
- {
- if (!m_hide)
- {
- m_t << "{" << endl;
- m_t << "\\par" << endl;
- m_t << rtf_Style_Reset << getStyle("CodeExample");
- }
- pushEnabled();
- m_hide = TRUE;
- }
- if (op->type()!=DocIncOperator::Skip)
- {
- popEnabled();
- if (!m_hide)
- {
- Doxygen::parserManager->getParser(m_langExt)
- ->parseCode(m_ci,op->context(),op->text().latin1(),
- op->isExample(),op->exampleFile());
- }
- pushEnabled();
- m_hide=TRUE;
- }
- if (op->isLast())
- {
- popEnabled();
- if (!m_hide)
- {
- m_t << "\\par" << endl;
- m_t << "}" << endl;
- }
- m_lastIsPara=TRUE;
- }
- else
- {
- if (!m_hide) m_t << endl;
- m_lastIsPara=FALSE;
- }
-}
-
-void RTFDocVisitor::visit(DocFormula *f)
-{
- if (m_hide) return;
- // TODO: do something sensible here, like including a bitmap
- DBG_RTF("{\\comment RTFDocVisitor::visit(DocFormula)}\n");
- m_t << f->text();
- m_lastIsPara=FALSE;
-}
-
-void RTFDocVisitor::visit(DocIndexEntry *i)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visit(DocIndexEntry)}\n");
- m_t << "{\\xe \\v " << i->entry() << "}" << endl;
- m_lastIsPara=FALSE;
-}
-
-//--------------------------------------
-// visitor functions for compound nodes
-//--------------------------------------
-
-void RTFDocVisitor::visitPre(DocAutoList *l)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocAutoList)}\n");
- m_t << "{" << endl;
- rtf_listItemInfo[m_indentLevel].isEnum = l->isEnumList();
- rtf_listItemInfo[m_indentLevel].number = 1;
- m_lastIsPara=FALSE;
-}
-
-void RTFDocVisitor::visitPost(DocAutoList *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocAutoList)}\n");
- m_t << "\\par" << endl;
- m_t << "}" << endl;
- m_lastIsPara=TRUE;
-}
-
-void RTFDocVisitor::visitPre(DocAutoListItem *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocAutoListItem)}\n");
- if (!m_lastIsPara) m_t << "\\par" << endl;
- m_t << rtf_Style_Reset;
- if (rtf_listItemInfo[m_indentLevel].isEnum)
- {
- m_t << getStyle("ListEnum") << endl;
- m_t << rtf_listItemInfo[m_indentLevel].number << ".\\tab ";
- rtf_listItemInfo[m_indentLevel].number++;
- }
- else
- {
- m_t << getStyle("ListBullet") << endl;
- }
- incIndentLevel();
- m_lastIsPara=FALSE;
-}
-
-void RTFDocVisitor::visitPost(DocAutoListItem *)
-{
- decIndentLevel();
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocAutoListItem)}\n");
-}
-
-void RTFDocVisitor::visitPre(DocPara *)
-{
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocPara)}\n");
-}
-
-void RTFDocVisitor::visitPost(DocPara *p)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocPara)}\n");
- if (!p->isLast() && // omit <p> for last paragraph
- !(p->parent() && // and for parameters & sections
- p->parent()->kind()==DocNode::Kind_ParamSect
- )
- )
- {
- m_t << "\\par" << endl;
- m_lastIsPara=TRUE;
- }
-}
-
-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;
-}
-
-void RTFDocVisitor::visitPost(DocRoot *r)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocRoot)}\n");
- if (!m_lastIsPara && !r->singleLine()) m_t << "\\par" << endl;
- m_t << "}";
- m_lastIsPara=TRUE;
- if (r->indent()) decIndentLevel();
-}
-
-void RTFDocVisitor::visitPre(DocSimpleSect *s)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocSimpleSect)}\n");
- if (!m_lastIsPara) m_t << "\\par" << endl;
- m_t << "{"; // start desc
- //m_t << "{\\b "; // start bold
- m_t << "{" << rtf_Style["Heading5"]->reference << endl;
- switch(s->type())
- {
- case DocSimpleSect::See:
- m_t << theTranslator->trSeeAlso(); break;
- case DocSimpleSect::Return:
- m_t << theTranslator->trReturns(); break;
- case DocSimpleSect::Author:
- m_t << theTranslator->trAuthor(TRUE,TRUE); break;
- case DocSimpleSect::Authors:
- m_t << theTranslator->trAuthor(TRUE,FALSE); break;
- case DocSimpleSect::Version:
- m_t << theTranslator->trVersion(); break;
- case DocSimpleSect::Since:
- m_t << theTranslator->trSince(); break;
- case DocSimpleSect::Date:
- m_t << theTranslator->trDate(); break;
- case DocSimpleSect::Note:
- m_t << theTranslator->trNote(); break;
- case DocSimpleSect::Warning:
- m_t << theTranslator->trWarning(); break;
- case DocSimpleSect::Pre:
- m_t << theTranslator->trPrecondition(); break;
- case DocSimpleSect::Post:
- m_t << theTranslator->trPostcondition(); break;
- case DocSimpleSect::Invar:
- m_t << theTranslator->trInvariant(); break;
- case DocSimpleSect::Remark:
- m_t << theTranslator->trRemarks(); break;
- case DocSimpleSect::Attention:
- m_t << theTranslator->trAttention(); break;
- case DocSimpleSect::User: break;
- case DocSimpleSect::Rcs: break;
- case DocSimpleSect::Unknown: break;
- }
-
- // special case 1: user defined title
- if (s->type()!=DocSimpleSect::User && s->type()!=DocSimpleSect::Rcs)
- {
- m_t << ":";
- m_t << "\\par" << endl;
- m_t << "}"; // end bold
- incIndentLevel();
- m_t << rtf_Style_Reset << getStyle("DescContinue");
- }
- m_lastIsPara=FALSE;
-}
-
-void RTFDocVisitor::visitPost(DocSimpleSect *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocSimpleSect)}\n");
- if (!m_lastIsPara) m_t << "\\par" << endl;
- decIndentLevel();
- m_t << "}"; // end desc
- m_lastIsPara=TRUE;
-}
-
-void RTFDocVisitor::visitPre(DocTitle *)
-{
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocTitle)}\n");
-}
-
-void RTFDocVisitor::visitPost(DocTitle *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocTitle)}\n");
- m_t << "\\par" << endl;
- m_t << "}"; // end bold
- incIndentLevel();
- m_t << rtf_Style_Reset << getStyle("DescContinue");
- m_lastIsPara=FALSE;
-}
-
-void RTFDocVisitor::visitPre(DocSimpleList *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocSimpleSect)}\n");
- m_t << "{" << endl;
- rtf_listItemInfo[m_indentLevel].isEnum = FALSE;
- m_lastIsPara=FALSE;
-}
-
-void RTFDocVisitor::visitPost(DocSimpleList *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocSimpleSect)}\n");
- if (!m_lastIsPara) m_t << "\\par" << endl;
- m_t << "}" << endl;
- m_lastIsPara=TRUE;
-}
-
-void RTFDocVisitor::visitPre(DocSimpleListItem *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocSimpleListItem)}\n");
- m_t << "\\par" << rtf_Style_Reset << getStyle("ListBullet") << endl;
- m_lastIsPara=FALSE;
- incIndentLevel();
-}
-
-void RTFDocVisitor::visitPost(DocSimpleListItem *)
-{
- decIndentLevel();
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocSimpleListItem)}\n");
-}
-
-void RTFDocVisitor::visitPre(DocSection *s)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocSection)}\n");
- if (!m_lastIsPara) m_t << "\\par" << endl;
- m_t << "{{" // start section
- << rtf_Style_Reset;
- QString heading;
- int level = QMIN(s->level()+1,4);
- heading.sprintf("Heading%d",level);
- // set style
- m_t << rtf_Style[heading]->reference << endl;
- // make table of contents entry
- filter(s->title());
- m_t << endl << "\\par" << "}" << endl;
- m_t << "{\\tc\\tcl" << level << " \\v ";
- filter(s->title());
- m_t << "}" << endl;
- m_lastIsPara=TRUE;
-}
-
-void RTFDocVisitor::visitPost(DocSection *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocSection)}\n");
- m_t << "\\par}" << endl; // end section
- m_lastIsPara=TRUE;
-}
-
-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].number = 1;
- m_lastIsPara=FALSE;
-}
-
-void RTFDocVisitor::visitPost(DocHtmlList *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlList)}\n");
- m_t << "\\par" << endl << "}" << endl;
- m_lastIsPara=TRUE;
-}
-
-void RTFDocVisitor::visitPre(DocHtmlListItem *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlListItem)}\n");
- m_t << "\\par" << endl;
- m_t << rtf_Style_Reset;
- if (rtf_listItemInfo[m_indentLevel].isEnum)
- {
- m_t << getStyle("ListEnum") << endl;
- m_t << rtf_listItemInfo[m_indentLevel].number << ".\\tab ";
- rtf_listItemInfo[m_indentLevel].number++;
- }
- else
- {
- m_t << getStyle("ListBullet") << endl;
- }
- incIndentLevel();
- m_lastIsPara=FALSE;
-}
-
-void RTFDocVisitor::visitPost(DocHtmlListItem *)
-{
- decIndentLevel();
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlListItem)}\n");
-}
-
-void RTFDocVisitor::visitPre(DocHtmlDescList *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlDescList)}\n");
- //m_t << "{" << endl;
- //m_t << rtf_Style_Reset << getStyle("ListContinue");
- //m_lastIsPara=FALSE;
-}
-
-void RTFDocVisitor::visitPost(DocHtmlDescList *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlDescList)}\n");
- //m_t << "}" << endl;
- //m_t << "\\par" << endl;
- //m_lastIsPara=TRUE;
-}
-
-void RTFDocVisitor::visitPre(DocHtmlDescTitle *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlDescTitle)}\n");
- //m_t << "\\par" << endl;
- //m_t << "{\\b ";
- m_t << "{" << rtf_Style["Heading5"]->reference << endl;
- m_lastIsPara=FALSE;
-}
-
-void RTFDocVisitor::visitPost(DocHtmlDescTitle *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlDescTitle)}\n");
- m_t << "\\par" << endl;
- m_t << "}" << endl;
- m_lastIsPara=TRUE;
-}
-
-void RTFDocVisitor::visitPre(DocHtmlDescData *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlDescData)}\n");
- incIndentLevel();
- m_t << "{" << rtf_Style_Reset << getStyle("DescContinue");
-}
-
-void RTFDocVisitor::visitPost(DocHtmlDescData *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlDescData)}\n");
- m_t << "\\par" << endl;
- m_t << "}" << endl;
- decIndentLevel();
- m_lastIsPara=TRUE;
-}
-
-void RTFDocVisitor::visitPre(DocHtmlTable *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlTable)}\n");
- if (!m_lastIsPara) m_t << "\\par" << endl;
- m_lastIsPara=TRUE;
-}
-
-void RTFDocVisitor::visitPost(DocHtmlTable *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlTable)}\n");
- m_t << "\\pard" << endl;
- m_lastIsPara=TRUE;
-}
-
-void RTFDocVisitor::visitPre(DocHtmlCaption *)
-{
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlCaption)}\n");
-}
-
-void RTFDocVisitor::visitPost(DocHtmlCaption *)
-{
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlCaption)}\n");
-}
-
-void RTFDocVisitor::visitPre(DocHtmlRow *r)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlRow)}\n");
- uint i,columnWidth=rtf_pageWidth/r->numCells();
- m_t << "\\trowd \\trgaph108\\trleft-108"
- "\\trbrdrt\\brdrs\\brdrw10 "
- "\\trbrdrl\\brdrs\\brdrw10 "
- "\\trbrdrb\\brdrs\\brdrw10 "
- "\\trbrdrr\\brdrs\\brdrw10 "
- "\\trbrdrh\\brdrs\\brdrw10 "
- "\\trbrdrv\\brdrs\\brdrw10 "<< endl;
- for (i=0;i<r->numCells();i++)
- {
- m_t << "\\clvertalt\\clbrdrt\\brdrs\\brdrw10 "
- "\\clbrdrl\\brdrs\\brdrw10 "
- "\\clbrdrb\\brdrs\\brdrw10 "
- "\\clbrdrr \\brdrs\\brdrw10 "
- "\\cltxlrtb "
- "\\cellx" << ((i+1)*columnWidth) << endl;
- }
- m_t << "\\pard \\widctlpar\\intbl\\adjustright" << endl;
- m_lastIsPara=FALSE;
-}
-
-void RTFDocVisitor::visitPost(DocHtmlRow *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlRow)}\n");
- m_t << endl;
- m_t << "\\pard \\widctlpar\\intbl\\adjustright" << endl;
- m_t << "{\\row }" << endl;
- m_lastIsPara=FALSE;
-}
-
-void RTFDocVisitor::visitPre(DocHtmlCell *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlCell)}\n");
- m_t << "{";
- m_lastIsPara=FALSE;
-}
-
-void RTFDocVisitor::visitPost(DocHtmlCell *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlCell)}\n");
- m_t << "\\cell }";
- m_lastIsPara=FALSE;
-}
-
-void RTFDocVisitor::visitPre(DocInternal *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocInternal)}\n");
- m_t << "{"; // start desc
- m_t << "{\\b "; // start bold
- m_t << theTranslator->trForInternalUseOnly();
- m_t << "}"; // end bold
- m_t << "\\par" << endl;
- incIndentLevel();
- m_t << rtf_Style_Reset << getStyle("DescContinue");
- m_lastIsPara=FALSE;
-}
-
-void RTFDocVisitor::visitPost(DocInternal *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocInternal)}\n");
- m_t << "\\par" << endl;
- decIndentLevel();
- m_t << "}"; // end desc
- m_lastIsPara=TRUE;
-}
-
-void RTFDocVisitor::visitPre(DocHRef *href)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHRef)}\n");
- if (Config_getBool("RTF_HYPERLINKS"))
- {
- m_t << "{\\field "
- "{\\*\\fldinst "
- "{ HYPERLINK \\\\l \"" << href->url() << "\" "
- "}{}"
- "}"
- "{\\fldrslt "
- "{\\cs37\\ul\\cf2 ";
-
- }
- else
- {
- m_t << "{\\f2 ";
- }
- m_lastIsPara=FALSE;
-}
-
-void RTFDocVisitor::visitPost(DocHRef *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHRef)}\n");
- if (Config_getBool("RTF_HYPERLINKS"))
- {
- m_t << "}"
- "}"
- "}";
- }
- else
- {
- m_t << "}";
- }
- m_lastIsPara=FALSE;
-}
-
-void RTFDocVisitor::visitPre(DocHtmlHeader *header)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocHtmlHeader)}\n");
- m_t << "{" // start section
- << rtf_Style_Reset;
- QString heading;
- int level = QMIN(header->level()+2,4);
- heading.sprintf("Heading%d",level);
- // set style
- m_t << rtf_Style[heading]->reference;
- // make table of contents entry
- m_t << "{\\tc\\tcl \\v " << level << "}";
- m_lastIsPara=FALSE;
-
-}
-
-void RTFDocVisitor::visitPost(DocHtmlHeader *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocHtmlHeader)}\n");
- m_t << "\\par" << endl;
- m_t << "}" << endl; // end section
- m_lastIsPara=TRUE;
-}
-
-void RTFDocVisitor::visitPre(DocImage *img)
-{
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocImage)}\n");
- if (img->type()==DocImage::Rtf)
- {
- m_t << "\\par" << endl;
- m_t << "{" << endl;
- m_t << rtf_Style_Reset << endl;
- m_t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
- m_t << img->name();
- m_t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
- m_t << "}" << endl;
- m_lastIsPara=TRUE;
- }
- else // other format -> skip
- {
- }
- // hide caption since it is not supported at the moment
- pushEnabled();
- m_hide=TRUE;
-}
-
-void RTFDocVisitor::visitPost(DocImage *)
-{
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocImage)}\n");
- popEnabled();
-}
-
-void RTFDocVisitor::visitPre(DocDotFile *df)
-{
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocDotFile)}\n");
- writeDotFile(df->file());
-
- // hide caption since it is not supported at the moment
- pushEnabled();
- m_hide=TRUE;
-}
-
-void RTFDocVisitor::visitPost(DocDotFile *)
-{
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocDotFile)}\n");
- popEnabled();
-}
-
-void RTFDocVisitor::visitPre(DocLink *lnk)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocLink)}\n");
- startLink(lnk->ref(),lnk->file(),lnk->anchor());
-}
-
-void RTFDocVisitor::visitPost(DocLink *lnk)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocLink)}\n");
- endLink(lnk->ref());
-}
-
-void RTFDocVisitor::visitPre(DocRef *ref)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocRef)}\n");
- if (!ref->file().isEmpty()) startLink(ref->ref(),ref->file(),ref->anchor());
- if (!ref->hasLinkText()) filter(ref->targetTitle());
-}
-
-void RTFDocVisitor::visitPost(DocRef *ref)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocRef)}\n");
- if (!ref->file().isEmpty()) endLink(ref->ref());
- m_t << " ";
-}
-
-
-void RTFDocVisitor::visitPre(DocSecRefItem *)
-{
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocSecRefItem)}\n");
-}
-
-void RTFDocVisitor::visitPost(DocSecRefItem *)
-{
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocSecRefItem)}\n");
-}
-
-void RTFDocVisitor::visitPre(DocSecRefList *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocSecRefList)}\n");
- m_t << "{" << endl;
- incIndentLevel();
- m_t << rtf_Style_Reset << getStyle("LatexTOC") << endl;
- m_t << "\\par" << endl;
- m_lastIsPara=TRUE;
-}
-
-void RTFDocVisitor::visitPost(DocSecRefList *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocSecRefList)}\n");
- decIndentLevel();
- m_t << "\\par" << endl;
- m_t << "}";
- m_lastIsPara=TRUE;
-}
-
-//void RTFDocVisitor::visitPre(DocLanguage *l)
-//{
-// DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocLanguage)}\n");
-// QString langId = Config_getEnum("OUTPUT_LANGUAGE");
-// if (l->id().lower()!=langId.lower())
-// {
-// pushEnabled();
-// m_hide = TRUE;
-// }
-//}
-//
-//void RTFDocVisitor::visitPost(DocLanguage *l)
-//{
-// DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocLanguage)}\n");
-// QString langId = Config_getEnum("OUTPUT_LANGUAGE");
-// if (l->id().lower()!=langId.lower())
-// {
-// popEnabled();
-// }
-//}
-
-void RTFDocVisitor::visitPre(DocParamSect *s)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocParamSect)}\n");
- m_t << "{"; // start param list
- if (!m_lastIsPara) m_t << "\\par" << endl;
- //m_t << "{\\b "; // start bold
- m_t << "{" << rtf_Style["Heading5"]->reference << endl;
- switch(s->type())
- {
- case DocParamSect::Param:
- m_t << theTranslator->trParameters(); break;
- case DocParamSect::RetVal:
- m_t << theTranslator->trReturnValues(); break;
- case DocParamSect::Exception:
- m_t << theTranslator->trExceptions(); break;
- default:
- ASSERT(0);
- }
- m_t << ":";
- m_t << "\\par" << endl;
- m_t << "}" << endl;
- incIndentLevel();
- m_t << rtf_Style_Reset << getStyle("DescContinue");
- m_lastIsPara=TRUE;
-}
-
-void RTFDocVisitor::visitPost(DocParamSect *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocParamSect)}\n");
- //m_t << "\\par" << endl;
- decIndentLevel();
- m_t << "}" << endl;
-}
-
-void RTFDocVisitor::visitPre(DocParamList *pl)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocParamList)}\n");
- m_t << "{\\i ";
- //QStrListIterator li(pl->parameters());
- //const char *s;
- QListIterator<DocNode> li(pl->parameters());
- DocNode *param;
- bool first=TRUE;
- for (li.toFirst();(param=li.current());++li)
- {
- if (!first) m_t << ","; else first=FALSE;
- if (param->kind()==DocNode::Kind_Word)
- {
- visit((DocWord*)param);
- }
- else if (param->kind()==DocNode::Kind_LinkedWord)
- {
- visit((DocLinkedWord*)param);
- }
- }
- m_t << "} ";
- m_lastIsPara=TRUE;
-}
-
-void RTFDocVisitor::visitPost(DocParamList *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocParamList)}\n");
- m_t << "\\par" << endl;
- m_lastIsPara=TRUE;
-}
-
-void RTFDocVisitor::visitPre(DocXRefItem *x)
-{
- if (m_hide) return;
- bool anonymousEnum = x->file()=="@";
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocXRefItem)}\n");
- m_t << "{"; // start param list
- //m_t << "{\\b "; // start bold
- m_t << "{" << rtf_Style["Heading5"]->reference << endl;
- if (Config_getBool("RTF_HYPERLINKS") && !anonymousEnum)
- {
- QString refName;
- if (!x->file().isEmpty())
- {
- refName+=x->file();
- }
- if (!x->file().isEmpty() && !x->anchor().isEmpty())
- {
- refName+="_";
- }
- if (!x->anchor().isEmpty())
- {
- refName+=x->anchor();
- }
-
- m_t << "{\\field "
- "{\\*\\fldinst "
- "{ HYPERLINK \\\\l \"" << refName << "\" "
- "}{}"
- "}"
- "{\\fldrslt "
- "{\\cs37\\ul\\cf2 ";
- filter(x->title());
- m_t << "}"
- "}"
- "}";
- }
- else
- {
- filter(x->title());
- }
- m_t << ":";
- m_t << "\\par" << endl;
- m_t << "}"; // end bold
- incIndentLevel();
- m_t << rtf_Style_Reset << getStyle("DescContinue");
- m_lastIsPara=FALSE;
-}
-
-void RTFDocVisitor::visitPost(DocXRefItem *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocXRefItem)}\n");
- m_t << "\\par" << endl;
- decIndentLevel();
- m_t << "}" << endl; // end xref item
- m_lastIsPara=TRUE;
-}
-
-void RTFDocVisitor::visitPre(DocInternalRef *ref)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocInternalRef)}\n");
- startLink("",ref->file(),ref->anchor());
-}
-
-void RTFDocVisitor::visitPost(DocInternalRef *)
-{
- if (m_hide) return;
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocInternalRef)}\n");
- endLink("");
- m_t << " ";
-}
-
-void RTFDocVisitor::visitPre(DocCopy *)
-{
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocCopy)}\n");
-}
-
-void RTFDocVisitor::visitPost(DocCopy *)
-{
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocCopy)}\n");
-}
-
-void RTFDocVisitor::visitPre(DocText *)
-{
- DBG_RTF("{\\comment RTFDocVisitor::visitPre(DocText)}\n");
-}
-
-void RTFDocVisitor::visitPost(DocText *)
-{
- DBG_RTF("{\\comment RTFDocVisitor::visitPost(DocText)}\n");
-}
-
-static char* getMultiByte(int c)
-{
- static char s[10];
- sprintf(s,"\\'%X",c);
- return s;
-}
-
-void RTFDocVisitor::filter(const char *str,bool verbatim)
-{
- if (str)
- {
- const unsigned char *p=(const unsigned char *)str;
- unsigned char c;
- unsigned char pc='\0';
- while (*p)
- {
- static bool MultiByte = FALSE;
- c=*p++;
-
- if ( MultiByte )
- {
- m_t << getMultiByte( c );
- MultiByte = FALSE;
- continue;
- }
- if ( c >= 0x80 )
- {
- MultiByte = TRUE;
- m_t << getMultiByte( c );
- continue;
- }
-
- switch (c)
- {
- case '{': m_t << "\\{"; break;
- case '}': m_t << "\\}"; break;
- case '\\': m_t << "\\\\"; break;
- case '\n': if (verbatim)
- {
- m_t << "\\par" << endl;
- }
- else
- {
- m_t << '\n';
- }
- break;
- default: m_t << (char)c;
- }
- pc = c;
- }
- }
-}
-
-void RTFDocVisitor::startLink(const QString &ref,const QString &file,const QString &anchor)
-{
- if (ref.isEmpty() && Config_getBool("RTF_HYPERLINKS"))
- {
- QString refName;
- if (!file.isEmpty())
- {
- refName+=file;
- }
- if (anchor)
- {
- refName+='_';
- refName+=anchor;
- }
-
- m_t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
- m_t << rtfFormatBmkStr(refName);
- m_t << "\" }{}";
- m_t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
- }
- else
- {
- m_t << "{\\b ";
- }
- m_lastIsPara=FALSE;
-}
-
-void RTFDocVisitor::endLink(const QString &ref)
-{
- if (ref.isEmpty() && Config_getBool("RTF_HYPERLINKS"))
- {
- m_t << "}}}";
- }
- else
- {
- m_t << "}";
- }
- m_lastIsPara=FALSE;
-}
-
-void RTFDocVisitor::pushEnabled()
-{
- m_enabled.push(new bool(m_hide));
-}
-
-void RTFDocVisitor::popEnabled()
-{
- bool *v=m_enabled.pop();
- ASSERT(v!=0);
- m_hide = *v;
- delete v;
-}
-
-void RTFDocVisitor::writeDotFile(const QString &fileName)
-{
- QString baseName=fileName;
- int i;
- if ((i=baseName.findRev('/'))!=-1)
- {
- baseName=baseName.right(baseName.length()-i-1);
- }
- QString outDir = Config_getString("RTF_OUTPUT");
- writeDotGraphFromFile(fileName,outDir,baseName,BITMAP);
- if (!m_lastIsPara) m_t << "\\par" << endl;
- m_t << "{" << endl;
- m_t << rtf_Style_Reset;
- m_t << "\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
- m_t << baseName << "." << Config_getEnum("DOT_IMAGE_FORMAT");
- m_t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
- m_t << "}" << endl;
- m_lastIsPara=TRUE;
-}
-
-
diff --git a/src/rtfdocvisitor.h b/src/rtfdocvisitor.h
deleted file mode 100644
index 90175e3..0000000
--- a/src/rtfdocvisitor.h
+++ /dev/null
@@ -1,162 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 _RTFDOCVISITOR_H
-#define _RTFDOCVISITOR_H
-
-#include "docvisitor.h"
-#include <qstack.h>
-#include <qcstring.h>
-
-class QTextStream;
-class CodeOutputInterface;
-class QString;
-
-/*! @brief Concrete visitor implementation for RTF output. */
-class RTFDocVisitor : public DocVisitor
-{
- public:
- RTFDocVisitor(QTextStream &t,CodeOutputInterface &ci,const char *langExt);
-
- //--------------------------------------
- // visitor functions for leaf nodes
- //--------------------------------------
-
- void visit(DocWord *);
- void visit(DocLinkedWord *);
- void visit(DocWhiteSpace *);
- void visit(DocSymbol *);
- void visit(DocURL *);
- void visit(DocLineBreak *);
- void visit(DocHorRuler *);
- void visit(DocStyleChange *);
- void visit(DocVerbatim *);
- void visit(DocAnchor *);
- void visit(DocInclude *);
- void visit(DocIncOperator *);
- void visit(DocFormula *);
- void visit(DocIndexEntry *);
-
- //--------------------------------------
- // visitor functions for compound nodes
- //--------------------------------------
-
- void visitPre(DocAutoList *);
- void visitPost(DocAutoList *);
- void visitPre(DocAutoListItem *);
- void visitPost(DocAutoListItem *);
- void visitPre(DocPara *);
- void visitPost(DocPara *);
- void visitPre(DocRoot *);
- void visitPost(DocRoot *);
- void visitPre(DocSimpleSect *);
- void visitPost(DocSimpleSect *);
- void visitPre(DocTitle *);
- void visitPost(DocTitle *);
- void visitPre(DocSimpleList *);
- void visitPost(DocSimpleList *);
- void visitPre(DocSimpleListItem *);
- void visitPost(DocSimpleListItem *);
- void visitPre(DocSection *s);
- void visitPost(DocSection *);
- void visitPre(DocHtmlList *s);
- void visitPost(DocHtmlList *s);
- void visitPre(DocHtmlListItem *);
- void visitPost(DocHtmlListItem *);
- //void visitPre(DocHtmlPre *);
- //void visitPost(DocHtmlPre *);
- void visitPre(DocHtmlDescList *);
- void visitPost(DocHtmlDescList *);
- void visitPre(DocHtmlDescTitle *);
- void visitPost(DocHtmlDescTitle *);
- void visitPre(DocHtmlDescData *);
- void visitPost(DocHtmlDescData *);
- void visitPre(DocHtmlTable *t);
- void visitPost(DocHtmlTable *t);
- void visitPre(DocHtmlCaption *);
- void visitPost(DocHtmlCaption *);
- void visitPre(DocHtmlRow *);
- void visitPost(DocHtmlRow *) ;
- void visitPre(DocHtmlCell *);
- void visitPost(DocHtmlCell *);
- void visitPre(DocInternal *);
- void visitPost(DocInternal *);
- void visitPre(DocHRef *);
- void visitPost(DocHRef *);
- void visitPre(DocHtmlHeader *);
- void visitPost(DocHtmlHeader *) ;
- void visitPre(DocImage *);
- void visitPost(DocImage *);
- void visitPre(DocDotFile *);
- void visitPost(DocDotFile *);
- void visitPre(DocLink *lnk);
- void visitPost(DocLink *);
- void visitPre(DocRef *ref);
- void visitPost(DocRef *);
- void visitPre(DocSecRefItem *);
- void visitPost(DocSecRefItem *);
- void visitPre(DocSecRefList *);
- void visitPost(DocSecRefList *);
- //void visitPre(DocLanguage *);
- //void visitPost(DocLanguage *);
- void visitPre(DocParamSect *);
- void visitPost(DocParamSect *);
- void visitPre(DocParamList *);
- void visitPost(DocParamList *);
- void visitPre(DocXRefItem *);
- void visitPost(DocXRefItem *);
- void visitPre(DocInternalRef *);
- void visitPost(DocInternalRef *);
- void visitPre(DocCopy *);
- void visitPost(DocCopy *);
- void visitPre(DocText *);
- void visitPost(DocText *);
-
- private:
-
- //--------------------------------------
- // helper functions
- //--------------------------------------
-
- void filter(const char *str,bool verbatim=FALSE);
- void startLink(const QString &ref,const QString &file,
- const QString &anchor);
- void endLink(const QString &ref);
- QString getStyle(const char *name);
- void incIndentLevel();
- void decIndentLevel();
-
- void pushEnabled();
- void popEnabled();
- void writeDotFile(const QString &fileName);
-
- //--------------------------------------
- // state variables
- //--------------------------------------
-
- QTextStream &m_t;
- CodeOutputInterface &m_ci;
- bool m_insidePre;
- bool m_hide;
- int m_indentLevel;
- QStack<bool> m_enabled;
- bool m_lastIsPara;
- QCString m_langExt;
-};
-
-#endif
diff --git a/src/rtfgen.cpp b/src/rtfgen.cpp
deleted file mode 100644
index 2f768ad..0000000
--- a/src/rtfgen.cpp
+++ /dev/null
@@ -1,2516 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Parker Waechter & Dimitri van Heesch.
- *
- * Style sheet additions by Alexander Bartolich
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-
-#include <stdlib.h>
-
-#include "qtbc.h"
-#include <qdir.h>
-#include <qregexp.h>
-
-#include "rtfgen.h"
-#include "config.h"
-#include "message.h"
-#include "doxygen.h"
-#include "util.h"
-#include "diagram.h"
-#include "language.h"
-#include "dot.h"
-#include "version.h"
-#include "pagedef.h"
-#include "rtfstyle.h"
-#include "rtfdocvisitor.h"
-#include "docparser.h"
-#include "dirdef.h"
-
-//#define DBG_RTF(x) x;
-#define DBG_RTF(x)
-
-static QCString dateToRTFDateString()
-{
- const QDateTime &d = QDateTime::currentDateTime();
- QCString result;
- result.sprintf("\\yr%d\\mo%d\\dy%d\\hr%d\\min%d\\sec%d",
- d.date().year(), d.date().month(), d.date().day(),
- d.time().hour(),d.time().minute(),d.time().second());
- return result;
-}
-
-RTFGenerator::RTFGenerator() : OutputGenerator()
-{
- dir=Config_getString("RTF_OUTPUT");
- col=0;
- //insideTabbing=FALSE;
- m_listLevel = 0;
- m_bstartedBody = FALSE;
- m_omitParagraph = FALSE;
- m_numCols = 0;
-}
-
-RTFGenerator::~RTFGenerator()
-{
-}
-
-//void RTFGenerator::append(const OutputGenerator *g)
-//{
-// t << g->getContents();
-// col+=((RTFGenerator *)g)->col;
-// //insideTabbing=insideTabbing || ((RTFGenerator *)g)->insideTabbing;
-// m_listLevel=((RTFGenerator *)g)->m_listLevel;
-// m_omitParagraph=((RTFGenerator *)g)->m_omitParagraph;
-// //printf("RTFGenerator::append(%s) insideTabbing=%s\n", g->getContents().data(),
-// // insideTabbing ? "TRUE" : "FALSE" );
-//}
-
-//OutputGenerator *RTFGenerator::copy()
-//{
-// RTFGenerator *result = new RTFGenerator;
-// //result->insideTabbing=insideTabbing;
-// result->m_listLevel=m_listLevel;
-// result->m_omitParagraph=m_omitParagraph;
-// return result;
-//}
-
-void RTFGenerator::writeStyleSheetFile(QFile &file)
-{
- QTextStream t(&file);
- t << "# Generated by doxygen " << versionString << "\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";
-
- int i;
- for ( i=0 ; rtf_Style_Default[i].reference!=0 ; i++ )
- {
- t << "# " << rtf_Style_Default[i].name << " = "
- << rtf_Style_Default[i].reference
- << rtf_Style_Default[i].definition << endl;
- }
-}
-
-void RTFGenerator::writeExtensionsFile(QFile &file)
-{
- QTextStream t(&file);
- t << "# Generated by doxygen " << versionString << "\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";
-
- t << "# Overrides the project title.\n";
-
- t << "#Title = \n\n";
-
- t << "# Name of the company that produced this document.\n";
- t << "#Company = \n\n";
-
- t << "# Filename of a company or project logo.\n";
- t << "#LogoFilename = \n\n";
-
- t << "# Author of the document.\n";
- t << "#Author = \n\n";
-
- t << "# Type of document (e.g. Design Specification, User Manual, etc.).\n";
- t << "#DocumentType = \n\n";
-
- t << "# Document tracking number.\n";
- t << "#DocumentId = \n\n";
-
- t << "# Name of the author's manager.\n";
- t << "# This field is not displayed in the document itself, but it is \n";
- t << "# available in the information block of the rtf file. In Microsoft \n";
- t << "# Word, it is available under File:Properties.\n";
- t << "#Manager = \n\n";
-
- t << "# Subject of the document.\n";
- t << "# This field is not displayed in the document itself, but it is \n";
- t << "# available in the information block of the rtf file. In Microsoft \n";
- t << "# Word, it is available under File:Properties.\n";
- t << "#Subject = \n\n";
-
- t << "# Comments regarding the document.\n";
- t << "# This field is not displayed in the document itself, but it is \n";
- t << "# available in the information block of the rtf file. In Microsoft \n";
- t << "# Word, it is available under File:Properties.\n";
- t << "#Comments = \n\n";
-
- t << "# Keywords associated with the document.\n";
- t << "# This field is not displayed in the document itself, but it is \n";
- t << "# available in the information block of the rtf file. In Microsoft \n";
- t << "# Word, it is available under File:Properties.\n";
- t << "#Keywords = \n\n";
-}
-
-
-void RTFGenerator::init()
-{
- QCString dir=Config_getString("RTF_OUTPUT");
- QDir d(dir);
- if (!d.exists() && !d.mkdir(dir))
- {
- err("Could not create output directory %s\n",dir.data());
- exit(1);
- }
- rtf_Style.setAutoDelete(TRUE);
-
- // first duplicate strings of rtf_Style_Default
- const struct Rtf_Style_Default* def = rtf_Style_Default;
- while(def->reference != 0)
- {
- if (def->definition == 0)
- err("Internal error: rtf_Style_Default[%s] has no definition.\n", def->name);
- 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");
- if (!rtfStyleSheetFile.isEmpty())
- {
- loadStylesheet(rtfStyleSheetFile, rtf_Style);
- }
-
- // If user has defined an extension file, load its contents.
- QCString &rtfExtensionsFile = Config_getString("RTF_EXTENSIONS_FILE");
- if (!rtfExtensionsFile.isEmpty())
- {
- loadExtensions(rtfExtensionsFile);
- }
-
- createSubDirs(d);
-}
-
-static QCString makeIndexName(const char *s,int i)
-{
- QCString result=s;
- result+=(char)(i+'0');
- return result;
-}
-
-void RTFGenerator::beginRTFDocument()
-{
- /* all the included RTF files should begin with the
- * same header
- */
- t <<"{\\rtf1\\ansi\\ansicpg" << theTranslator->trRTFansicp();
- t <<"\\uc1 \\deff0\\deflang1033\\deflangfe1033\n";
-
- DBG_RTF(t <<"{\\comment Begining font list}\n")
- t <<"{\\fonttbl ";
- t <<"{\\f0\\froman\\fcharset" << theTranslator->trRTFCharSet();
- t <<"\\fprq2{\\*\\panose 02020603050405020304}Times New Roman;}\n";
- t <<"{\\f1\\fswiss\\fcharset" << theTranslator->trRTFCharSet();
- t <<"\\fprq2{\\*\\panose 020b0604020202020204}Arial;}\n";
- t <<"{\\f2\\fmodern\\fcharset" << theTranslator->trRTFCharSet();
- t <<"\\fprq1{\\*\\panose 02070309020205020404}Courier New;}\n";
- t <<"{\\f3\\froman\\fcharset2\\fprq2{\\*\\panose 05050102010706020507}Symbol;}\n";
- t <<"}\n";
- DBG_RTF(t <<"{\\comment begin colors}\n")
- t <<"{\\colortbl;";
- t <<"\\red0\\green0\\blue0;";
- t <<"\\red0\\green0\\blue255;";
- t <<"\\red0\\green255\\blue255;";
- t <<"\\red0\\green255\\blue0;";
- t <<"\\red255\\green0\\blue255;";
- t <<"\\red255\\green0\\blue0;";
- t <<"\\red255\\green255\\blue0;";
- t <<"\\red255\\green255\\blue255;";
- t <<"\\red0\\green0\\blue128;";
- t <<"\\red0\\green128\\blue128;";
- t <<"\\red0\\green128\\blue0;";
- t <<"\\red128\\green0\\blue128;";
- t <<"\\red128\\green0\\blue0;";
- t <<"\\red128\\green128\\blue0;";
- t <<"\\red128\\green128\\blue128;";
- t <<"\\red192\\green192\\blue192;}" << endl;
-
- DBG_RTF(t <<"{\\comment Beginning style list}\n")
- t <<"{\\stylesheet\n";
- t <<"{\\widctlpar\\adjustright \\fs20\\cgrid \\snext0 Normal;}\n";
-
- // sort styles ascending by \s-number via an intermediate QArray
- QArray<const StyleData*> array(128);
- array.fill(0);
- QDictIterator<StyleData> iter(rtf_Style);
- const StyleData* style;
- for(; (style = iter.current()); ++iter)
- {
- unsigned index = style->index;
- unsigned size = array.size();
- if (index >= size)
- {
- // +1 to add at least one element, then align up to multiple of 8
- array.resize((index + 1 + 7) & ~7);
- array.fill(0, size);
- ASSERT(index < array.size());
- }
- if (array.at(index) != 0)
- {
- QCString key(convertToQCString(iter.currentKey()));
- msg("Style '%s' redefines \\s%d.\n", key.data(), index);
- }
- array.at(index) = style;
- }
-
- // write array elements
- unsigned size = array.size();
- for(unsigned i = 0; i < size; i++)
- {
- const StyleData* style = array.at(i);
- if (style != 0)
- t <<"{" << style->reference << style->definition << ";}\n";
- }
-
- t <<"}" << endl;
- // this comment is needed for postprocessing!
- t <<"{\\comment begin body}" << endl;
-
-}
-
-void RTFGenerator::beginRTFChapter()
-{
- t <<"\n";
- DBG_RTF(t << "{\\comment BeginRTFChapter}\n")
- t << rtf_Style_Reset;
-
- // if we are compact, no extra page breaks...
- if (Config_getBool("COMPACT_RTF"))
- {
- // t <<"\\sect\\sectd\\sbknone\n";
- t <<"\\sect\\sbknone\n";
- rtfwriteRuler_thick();
- }
- else
- t <<"\\sect\\sbkpage\n";
- //t <<"\\sect\\sectd\\sbkpage\n";
-
- t << rtf_Style["Heading1"]->reference << "\n";
-}
-
-void RTFGenerator::beginRTFSection()
-{
- t <<"\n";
- DBG_RTF(t << "{\\comment BeginRTFSection}\n")
- t << rtf_Style_Reset;
-
- // 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";
-}
-
-void RTFGenerator::startFile(const char *name,const char *,const char *)
-{
- QCString fileName=name;
- relPath = relativePathToRoot(fileName);
-
- if (fileName.right(4)!=".rtf" ) fileName+=".rtf";
- startPlainFile(fileName);
- beginRTFDocument();
-}
-
-void RTFGenerator::endFile()
-{
- DBG_RTF(t << "{\\comment endFile}\n")
- t << "}";
-
- endPlainFile();
-}
-
-void RTFGenerator::startProjectNumber()
-{
- DBG_RTF(t <<"{\\comment startProjectNumber }" << endl)
- t << " ";
-}
-
-void RTFGenerator::endProjectNumber()
-{
- DBG_RTF(t <<"{\\comment endProjectNumber }" << endl)
-}
-
-void RTFGenerator::startIndexSection(IndexSections is)
-{
- //QCString paperName;
-
- m_listLevel = 0;
-
- switch (is)
- {
- case isTitlePageStart:
- // basic RTFstart
- // get readyfor author etc
-
- t << "{\\info \n";
- t << "{\\title {\\comment ";
- break;
- case isTitlePageAuthor:
- t << "}\n";
- if (rtf_subject) t << "{\\subject " << rtf_subject << "}\n";
- if (rtf_comments) t << "{\\comment " << rtf_comments << "}\n";
- if (rtf_company) t << "{\\company " << rtf_company << "}\n";
- if (rtf_author) t << "{\\author " << rtf_author << "}\n";
- if (rtf_manager) t << "{\\manager " << rtf_manager << "}\n";
- if (rtf_documentType) t << "{\\category " << rtf_documentType << "}\n";
- if (rtf_keywords) t << "{\\keywords " << rtf_keywords << "}\n";
- t << "{\\comment ";
- break;
- case isMainPage:
- //Introduction
- beginRTFChapter();
- break;
- //case isPackageIndex:
- // //Package Index
- // beginRTFChapter();
- // break;
- case isModuleIndex:
- //Module Index
- beginRTFChapter();
- break;
- case isDirIndex:
- //Directory Index
- beginRTFChapter();
- break;
- case isNamespaceIndex:
- //Namespace Index
- beginRTFChapter();
- break;
- case isClassHierarchyIndex:
- //Hierarchical Index
- DBG_RTF(t << "{\\comment start classhierarchy}\n")
- beginRTFChapter();
- break;
- case isCompoundIndex:
- //Annotated Compound Index
- beginRTFChapter();
- break;
- case isFileIndex:
- //Annotated File Index
- beginRTFChapter();
- break;
- case isPageIndex:
- //Related Page Index
- beginRTFChapter();
- break;
- case isModuleDocumentation:
- {
- //Module Documentation
- GroupSDict::Iterator gli(Doxygen::groupSDict);
- GroupDef *gd;
- bool found=FALSE;
- for (gli.toFirst();(gd=gli.current()) && !found;++gli)
- {
- if (!gd->isReference())
- {
- beginRTFChapter();
- found=TRUE;
- }
- }
- }
- break;
- case isDirDocumentation:
- {
- //Directory Documentation
- SDict<DirDef>::Iterator dli(Doxygen::directories);
- DirDef *dd;
- bool found=FALSE;
- for (dli.toFirst();(dd=dli.current()) && !found;++dli)
- {
- if (dd->isLinkableInProject())
- {
- beginRTFChapter();
- found=TRUE;
- }
- }
- }
- break;
- case isNamespaceDocumentation:
- {
- // Namespace Documentation
- NamespaceSDict::Iterator nli(Doxygen::namespaceSDict);
- NamespaceDef *nd;
- bool found=FALSE;
- for (nli.toFirst();(nd=nli.current()) && !found;++nli)
- {
- if (nd->isLinkableInProject())
- {
- beginRTFChapter();
- found=TRUE;
- }
- }
- }
- break;
- case isClassDocumentation:
- {
- //Compound Documentation
- ClassSDict::Iterator cli(Doxygen::classSDict);
- ClassDef *cd=0;
- bool found=FALSE;
- for (cli.toFirst();(cd=cli.current()) && !found;++cli)
- {
- if (cd->isLinkableInProject() && cd->templateMaster()==0)
- {
- beginRTFChapter();
- found=TRUE;
- }
- }
- }
- break;
- case isFileDocumentation:
- {
- //File Documentation
- bool isFirst=TRUE;
- FileName *fn=Doxygen::inputNameList.first();
- while (fn)
- {
- FileDef *fd=fn->first();
- while (fd)
- {
- if (fd->isLinkableInProject())
- {
- if (isFirst)
- {
- beginRTFChapter();
- isFirst=FALSE;
- break;
- }
- }
- fd=fn->next();
- }
- fn=Doxygen::inputNameList.next();
- }
- }
- break;
- case isExampleDocumentation:
- {
- //Example Documentation
- beginRTFChapter();
- }
- break;
- case isPageDocumentation:
- {
- //Page Documentation
- beginRTFChapter();
- }
- break;
- case isEndIndex:
- break;
- }
-}
-
-void RTFGenerator::endIndexSection(IndexSections is)
-{
- switch (is)
- {
- case isTitlePageStart:
- if (rtf_title)
- // User has overridden document title in extensions file
- t << "}" << rtf_title;
- else
- t << "}" << Config_getString("PROJECT_NAME");
- break;
- case isTitlePageAuthor:
- {
- t << "Doxgyen. }\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";
- // 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 << "\\vertalc\\qc\\par\\par\\par\\par\\par\\par\\par\n";
- if (rtf_logoFilename)
- {
- t << "{\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"" << rtf_logoFilename;
- t << "\" \\\\d \\\\*MERGEFORMAT} {\\fldrslt IMAGE }}\\par\\par\n";
- }
- if (rtf_company)
- {
- t << rtf_company << "\\par\\par\n";
- }
-
- t << rtf_Style_Reset << rtf_Style["Title"]->reference << endl; // set to title style
- t << "{\\field\\fldedit {\\*\\fldinst TITLE \\\\*MERGEFORMAT}{\\fldrslt TITLE}}\\par" << endl;
-
- t << rtf_Style_Reset << rtf_Style["SubTitle"]->reference << endl; // set to title style
- t << "\\par\n";
- if (rtf_documentType)
- {
- t << rtf_documentType << "\\par\n";
- }
- if (rtf_documentId)
- {
- t << rtf_documentId << "\\par\n";
- }
- 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 << "{\\field\\fldedit {\\*\\fldinst AUTHOR \\\\*MERGEFORMAT}{\\fldrslt AUTHOR}}\\par" << endl;
- t << "Version " << Config_getString("PROJECT_NUMBER") << "\\par";
- t << "{\\field\\fldedit {\\*\\fldinst CREATEDATE \\\\*MERGEFORMAT}"
- "{\\fldrslt CREATEDATE}}\\par"<<endl;
- t << "\\page\\page";
- DBG_RTF(t << "{\\comment End title page}" << endl)
-
- // table of contents section
- DBG_RTF(t << "{\\comment Table of contents}\n")
- t << "\\vertalt\n";
- t << rtf_Style_Reset << endl;
- 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";
- t << rtf_Style_Reset << endl;
- }
- break;
- case isMainPage:
- t << "\\par " << rtf_Style_Reset << endl;
- if (!Doxygen::mainPage || Doxygen::mainPage->title().isEmpty())
- {
- t << "{\\tc \\v " << theTranslator->trMainPage() << "}"<< endl;
- }
- else
- {
- t << "{\\tc \\v " << substitute(Doxygen::mainPage->title(),"%","") << "}"<< endl;
- }
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
- if (Config_getBool("GENERATE_TREEVIEW")) t << "main"; else t << "index";
- t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- break;
- //case isPackageIndex:
- // t << "\\par " << rtf_Style_Reset << endl;
- // t << "{\\tc \\v " << theTranslator->trPackageList() << "}"<< endl;
- // t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"packages.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- // break;
- case isModuleIndex:
- t << "\\par " << rtf_Style_Reset << endl;
- t << "{\\tc \\v " << theTranslator->trModuleIndex() << "}"<< endl;
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"modules.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- break;
- case isDirIndex:
- t << "\\par " << rtf_Style_Reset << endl;
- t << "{\\tc \\v " << theTranslator->trDirIndex() << "}"<< endl;
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"dirs.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- break;
- case isNamespaceIndex:
- t << "\\par " << rtf_Style_Reset << endl;
- t << "{\\tc \\v " << theTranslator->trNamespaceIndex() << "}"<< endl;
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"namespaces.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- break;
- case isClassHierarchyIndex:
- t << "\\par " << rtf_Style_Reset << endl;
- t << "{\\tc \\v " << theTranslator->trHierarchicalIndex() << "}"<< endl;
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"hierarchy.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- break;
- case isCompoundIndex:
- t << "\\par " << rtf_Style_Reset << endl;
- t << "{\\tc \\v " << theTranslator->trCompoundIndex() << "}"<< endl;
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"annotated.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- break;
- case isFileIndex:
- t << "\\par " << rtf_Style_Reset << endl;
- t << "{\\tc \\v " << theTranslator->trFileIndex() << "}"<< endl;
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"files.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- break;
- case isPageIndex:
- t << "\\par " << rtf_Style_Reset << endl;
- t << "{\\tc \\v " << theTranslator->trPageIndex() << "}"<< endl;
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"pages.rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- break;
- case isModuleDocumentation:
- {
- GroupSDict::Iterator gli(Doxygen::groupSDict);
- GroupDef *gd;
- t << "{\\tc \\v " << theTranslator->trModuleDocumentation() << "}"<< endl;
- for (gli.toFirst();(gd=gli.current());++gli)
- {
- if (!gd->isReference())
- {
- t << "\\par " << rtf_Style_Reset << endl;
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
- t << gd->getOutputFileBase();
- t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- }
- }
- }
- break;
- case isDirDocumentation:
- {
- SDict<DirDef>::Iterator dli(Doxygen::directories);
- DirDef *dd;
- t << "{\\tc \\v " << theTranslator->trDirDocumentation() << "}"<< endl;
- for (dli.toFirst();(dd=dli.current());++dli)
- {
- if (dd->isLinkableInProject())
- {
- t << "\\par " << rtf_Style_Reset << endl;
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
- t << dd->getOutputFileBase();
- t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- }
- }
- }
- 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()))
- {
- if (nd->isLinkableInProject())
- {
- t << "\\par " << rtf_Style_Reset << endl;
- beginRTFSection();
- 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;
-
- t << "{\\tc \\v " << theTranslator->trClassDocumentation() << "}"<< endl;
- for (cli.toFirst();(cd=cli.current()) && !found;++cli)
- {
- if (cd->isLinkableInProject() && cd->templateMaster()==0)
- {
- 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)
- {
- t << "\\par " << rtf_Style_Reset << endl;
- beginRTFSection();
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
- t << cd->getOutputFileBase();
- t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- }
- }
- }
- break;
- case isFileDocumentation:
- {
- bool isFirst=TRUE;
- FileName *fn=Doxygen::inputNameList.first();
-
- t << "{\\tc \\v " << theTranslator->trFileDocumentation() << "}"<< endl;
- while (fn)
- {
- FileDef *fd=fn->first();
- while (fd)
- {
- if (fd->isLinkableInProject())
- {
- if (isFirst)
- {
- t << "\\par " << rtf_Style_Reset << endl;
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
- t << fd->getOutputFileBase();
- t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- isFirst=FALSE;
- }
- else
- {
- t << "\\par " << rtf_Style_Reset << endl;
- beginRTFSection();
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
- t << fd->getOutputFileBase();
- t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- }
- }
- fd=fn->next();
- }
- fn=Doxygen::inputNameList.next();
- }
- }
- break;
- case isExampleDocumentation:
- {
- //t << "}\n";
- 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)
- {
- t << "\\par " << rtf_Style_Reset << endl;
- beginRTFSection();
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
- t << pd->getOutputFileBase();
- t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- }
- }
- break;
- case isPageDocumentation:
- {
- t << "{\\tc \\v " << theTranslator->trPageDocumentation() << "}"<< endl;
- PageSDict::Iterator pdi(*Doxygen::pageSDict);
- PageDef *pd=pdi.toFirst();
- bool first=TRUE;
- for (pdi.toFirst();(pd=pdi.current());++pdi)
- {
- if (!pd->getGroupDef() && !pd->isReference())
- {
- if (first) t << "\\par " << rtf_Style_Reset << endl;
- t << "{\\field\\fldedit{\\*\\fldinst INCLUDETEXT \"";
- t << pd->getOutputFileBase();
- t << ".rtf\" \\\\*MERGEFORMAT}{\\fldrslt includedstuff}}\n";
- first=FALSE;
- }
- }
- }
- break;
- case isEndIndex:
- beginRTFChapter();
- t << rtf_Style["Heading1"]->reference;
- t << theTranslator->trRTFGeneralIndex() << "\\par "<< endl;
- t << rtf_Style_Reset << endl;
- t << "{\\tc \\v " << theTranslator->trRTFGeneralIndex() << "}" << endl;
- t << "{\\field\\fldedit {\\*\\fldinst INDEX \\\\c2 \\\\*MERGEFORMAT}{\\fldrslt INDEX}}\n";
-
- break;
- }
-}
-
-void RTFGenerator::lastIndexPage()
-{
- DBG_RTF(t <<"{\\comment Beginning Body of RTF Document}\n")
- // end page and setup for rest of document
- t <<"\\sect \\sbkpage \\pgndec \\pgnrestart\n";
- 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";
-
-}
-
-void RTFGenerator::writeStyleInfo(int)
-{
-}
-
-void RTFGenerator::lineBreak()
-{
- DBG_RTF(t << "{\\comment (lineBreak)}" << endl)
- t << "\\par" << endl;
-}
-
-void RTFGenerator::writeString(const char *text)
-{
- t << text;
-}
-
-void RTFGenerator::startIndexList()
-{
- DBG_RTF(t << "{\\comment (startIndexList)}" << endl)
- t << "{" << endl;
- incrementIndentLevel();
- t << rtf_Style_Reset << rtf_LCList_DepthStyle() << endl;
- newParagraph();
- m_omitParagraph = TRUE;
-}
-
-void RTFGenerator::endIndexList()
-{
- DBG_RTF(t << "{\\comment (endIndexList)}" << endl)
- newParagraph();
- t << "}";
- decrementIndentLevel();
- m_omitParagraph = TRUE;
-}
-
-/*! start bullet list */
-void RTFGenerator::startItemList()
-{
- DBG_RTF(t << "{\\comment (startItemList level=" << m_listLevel << ") }" << endl)
- t << "{";
- incrementIndentLevel();
- rtf_listItemInfo[m_listLevel].isEnum = FALSE;
-}
-
-/*! end bullet list */
-void RTFGenerator::endItemList()
-{
- newParagraph();
- DBG_RTF(t << "{\\comment (endItemList level=" << m_listLevel << ")}" << endl)
- t << "}";
- decrementIndentLevel();
- m_omitParagraph = TRUE;
-}
-
-///*! start enumeration list */
-//void RTFGenerator::startEnumList() // starts an enumeration list
-//{
-// DBG_RTF(t << "{\\comment (startEnumList)}" << endl)
-// t << "{" << endl;
-// incrementIndentLevel();
-// rtf_listItemInfo[m_listLevel].isEnum = TRUE;
-// rtf_listItemInfo[m_listLevel].number = 1;
-//}
-//
-///*! end enumeration list */
-//void RTFGenerator::endEnumList()
-//{
-// newParagraph();
-// DBG_RTF(t << "{\\comment (endEnumList)}" << endl)
-// t << "}";
-// decrementIndentLevel();
-// m_omitParagraph = TRUE;
-//}
-
-/*! write bullet or enum item */
-void RTFGenerator::writeListItem()
-{
- DBG_RTF(t << "{\\comment (writeListItem)}" << endl)
- newParagraph();
- t << rtf_Style_Reset;
- if (rtf_listItemInfo[m_listLevel].isEnum)
- {
- t << rtf_EList_DepthStyle() << endl;
- t << rtf_listItemInfo[m_listLevel].number << ".\\tab ";
- rtf_listItemInfo[m_listLevel].number++;
- }
- else
- {
- t << rtf_BList_DepthStyle() << endl;
- }
- m_omitParagraph = TRUE;
-}
-
-void RTFGenerator::writeIndexItem(const char *ref,const char *fn,
- const char *name)
-{
- DBG_RTF(t << "{\\comment (writeIndexItem)}" << endl)
- //t << rtf_LCList_DepthStyle() << endl;
- docify(name);
- if (!ref && fn)
- {
- t << "\\tab ";
- writeRTFReference(fn);
- t << endl;
- }
- else
- {
- t << endl;
- }
- newParagraph();
- m_omitParagraph = TRUE;
-}
-
-//void RTFGenerator::writeIndexFileItem(const char *,const char *text)
-//{
-// t << "\\item\\contentsline{section}{";
-// docify(text);
-// t << "}{\\pageref{" << text << "}}" << endl;
-//}
-
-void RTFGenerator::startHtmlLink(const char *url)
-{
-
- if (Config_getBool("RTF_HYPERLINKS"))
- {
- t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
- t << url;
- t << "\" }{}";
- t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
- }
- else
- {
- startTypewriter();
- }
-}
-
-void RTFGenerator::endHtmlLink()
-{
- if (Config_getBool("RTF_HYPERLINKS"))
- {
- t << "}}}" << endl;
- }
- else
- {
- endTypewriter();
- }
-}
-
-//void RTFGenerator::writeMailLink(const char *url)
-//{
-// startTypewriter();
-// docify(url);
-// endTypewriter();
-//}
-
-void RTFGenerator::writeStartAnnoItem(const char *,const char *f,
- const char *path,const char *name)
-{
- DBG_RTF(t << "{\\comment (writeStartAnnoItem)}" << endl)
- t << "{\\b ";
- if (path) docify(path);
- if (f && Config_getBool("RTF_HYPERLINKS"))
- {
- t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
- t << rtfFormatBmkStr(f);
- t << "\" }{}";
- t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
-
- docify(name);
-
- t << "}}}" << endl;
- }
- else
- {
- docify(name);
- }
- t << "} ";
-}
-
-void RTFGenerator::writeEndAnnoItem(const char *name)
-{
- DBG_RTF(t << "{\\comment (writeEndAnnoItem)}" << endl)
- if (name)
- {
- t << "\\tab ";
- writeRTFReference(name);
- t << endl;
- }
- else
- {
- t << endl;
- }
- newParagraph();
-}
-
-void RTFGenerator::startIndexKey()
-{
- DBG_RTF(t << "{\\comment (startIndexKey)}" << endl)
- t << "{\\b ";
-}
-
-void RTFGenerator::endIndexKey()
-{
-}
-
-void RTFGenerator::startIndexValue(bool hasBrief)
-{
- t << " ";
- if (hasBrief) t << "(";
-}
-
-void RTFGenerator::endIndexValue(const char *name,bool hasBrief)
-{
- DBG_RTF(t << "{\\comment (endIndexKey)}" << endl)
- if (hasBrief) t << ")";
- t << "} ";
- if (name)
- {
- t << "\\tab ";
- writeRTFReference(name);
- t << endl;
- }
- else
- {
- t << endl;
- }
- newParagraph();
-}
-
-void RTFGenerator::startSubsection()
-{
- //beginRTFSubSection();
- t <<"\n";
- DBG_RTF(t << "{\\comment Begin SubSection}\n")
- t << rtf_Style_Reset;
- t << rtf_Style["Heading3"]->reference << "\n";
-}
-
-void RTFGenerator::endSubsection()
-{
- newParagraph();
- t << rtf_Style_Reset << endl;
-}
-
-void RTFGenerator::startSubsubsection()
-{
- //beginRTFSubSubSection();
- t << "\n";
- DBG_RTF(t << "{\\comment Begin SubSubSection}\n")
- t << "{" << endl;
- t << rtf_Style_Reset << rtf_Style["Heading4"]->reference << "\n";
-}
-
-void RTFGenerator::endSubsubsection()
-{
- newParagraph();
- t << "}" << endl;
-}
-
-
-//void RTFGenerator::writeClassLink(const char *,const char *,
-// const char *,const char *name)
-//{
-// t << "{\\bf ";
-// docify(name);
-// t << "}";
-//}
-
-//void RTFGenerator::startTable(bool,int colNumbers)
-//{
-// DBG_RTF(t << "{\\comment startTable}\n";)
-// m_numCols=colNumbers;
-// t << "\\par\n";
-//}
-//
-//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;
-//}
-//
-//void RTFGenerator::startCaption()
-//{
-// DBG_RTF(t << "{\\comment startCaption}\n";)
-// endTableRow();
-// t << "\\trowd \\trgaph108\\trleft-108\\trbrdrt\\brdrs\\brdrw10 \\trbrdrl\\brdrs\\brdrw10 \\trbrdrb\\brdrs\\brdrw10 \\trbrdrr\\brdrs\\brdrw10 \\trbrdrh\\brdrs\\brdrw10 \\trbrdrv\\brdrs\\brdrw10" << endl;
-// t << "\\clvertalt\\clbrdrt\\brdrs\\brdrw10 \\clbrdrl\\brdrs\\brdrw10 \\clbrdrb\\brdrs\\brdrw10 \\clbrdrr \\brdrs\\brdrw10 \\cltxlrtb \\cellx"<<rtf_pageWidth<<"\\pard \\qc\\nowidctlpar\\widctlpar\\intbl\\adjustright " << endl;
-// nextTableColumn();
-//}
-//
-//void RTFGenerator::endCaption()
-//{
-// DBG_RTF(t << "{\\comment endCaption}\n";)
-// endTableColumn();
-// endTableRow();
-//}
-//
-//void RTFGenerator::nextTableRow()
-//{
-// DBG_RTF(t << "{\\comment nextTableRow}\n";)
-// ASSERT(m_numCols>0 && m_numCols<25);
-// uint columnWidth=rtf_pageWidth/m_numCols;
-// t << "\\trowd \\trgaph108\\trleft-108\\trbrdrt\\brdrs\\brdrw10 "
-// "\\trbrdrl\\brdrs\\brdrw10 \\trbrdrb\\brdrs\\brdrw10 "
-// "\\trbrdrr\\brdrs\\brdrw10 \\trbrdrh\\brdrs\\brdrw10 "
-// "\\trbrdrv\\brdrs\\brdrw10 "<<endl;
-// for (int i=0;i<m_numCols;i++)
-// {
-// t << "\\clvertalt\\clbrdrt\\brdrs\\brdrw10 \\clbrdrl\\brdrs\\brdrw10 "
-// "\\clbrdrb\\brdrs\\brdrw10 \\clbrdrr \\brdrs\\brdrw10 \\cltxlrtb "
-// "\\cellx" << (i*columnWidth) << endl;
-// }
-// t << "\\pard \\widctlpar\\intbl\\adjustright\n{";
-//}
-//
-//void RTFGenerator::endTableRow()
-//{
-// DBG_RTF(t << "{\\comment endTableRow}\n";)
-// t << "\n\\pard \\widctlpar\\intbl\\adjustright\n{\\row }\n";
-//}
-//
-//void RTFGenerator::nextTableColumn()
-//{
-// DBG_RTF(t << "{\\comment nextTableColumn}\n";)
-// t << "{ ";
-//}
-//
-//void RTFGenerator::endTableColumn()
-//{
-// DBG_RTF(t << "{\\comment endTableColumn}\n";)
-// t << " \\cell }";
-//}
-//
-void RTFGenerator::startTextLink(const char *f,const char *anchor)
-{
- if (Config_getBool("RTF_HYPERLINKS"))
- {
- QCString ref;
- if (f)
- {
- ref+=f;
- }
- if (anchor)
- {
- ref+='_';
- ref+=anchor;
- }
-
- t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
- t << rtfFormatBmkStr(ref);
- t << "\" }{}";
- t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
- }
-}
-
-void RTFGenerator::endTextLink()
-{
- if (Config_getBool("RTF_HYPERLINKS"))
- {
- t << "}}}" << endl;
- }
-}
-
-void RTFGenerator::writeObjectLink(const char *ref, const char *f,
- const char *anchor, const char *text)
-{
- if (!ref && Config_getBool("RTF_HYPERLINKS"))
- {
- QCString refName;
- if (f)
- {
- refName+=f;
- }
- if (anchor)
- {
- refName+='_';
- refName+=anchor;
- }
-
- t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
- t << rtfFormatBmkStr(refName);
- t << "\" }{}";
- t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
-
- docify(text);
-
- t << "}}}" << endl;
- }
- else
- {
- startBold();
- docify(text);
- endBold();
- }
-}
-
-void RTFGenerator::startPageRef()
-{
- t << " (";
- startEmphasis();
-}
-
-void RTFGenerator::endPageRef(const char *clname, const char *anchor)
-{
- QCString ref;
- if (clname)
- {
- ref+=clname;
- }
- if (anchor)
- {
- ref+='_';
- ref+=anchor;
- }
- writeRTFReference(ref);
- endEmphasis();
- t << ")";
-}
-
-void RTFGenerator::writeCodeLink(const char *ref,const char *f,
- const char *anchor,const char *name)
-{
- if (!ref && Config_getBool("RTF_HYPERLINKS"))
- {
- QCString refName;
- if (f)
- {
- refName+=f;
- }
- if (anchor)
- {
- refName+='_';
- refName+=anchor;
- }
-
- t << "{\\field {\\*\\fldinst { HYPERLINK \\\\l \"";
- t << rtfFormatBmkStr(refName);
- t << "\" }{}";
- t << "}{\\fldrslt {\\cs37\\ul\\cf2 ";
-
- codify(name);
-
- t << "}}}" << endl;
- }
- else
- {
- codify(name);
- }
-}
-
-void RTFGenerator::startTitleHead(const char *)
-{
- DBG_RTF(t <<"{\\comment startTitleHead}" << endl)
-
- // beginRTFSection();
- t << rtf_Style_Reset << rtf_Style["Heading2"]->reference << endl;
-}
-
-void RTFGenerator::endTitleHead(const char *fileName,const char *name)
-{
- DBG_RTF(t <<"{\\comment endTitleHead}" << endl)
- t << "\\par " << rtf_Style_Reset << endl;
- if (name)
- {
- // make table of contents entry
- t << "{\\tc\\tcl2 \\v ";
- docify(name);
- t << "}" << endl;
-
- // make an index entry
- addIndexItem(name,0);
-
- //if (name)
- //{
- // writeAnchor(0,name);
- //}
- //
- //if (Config_getBool("RTF_HYPERLINKS") && fileName)
- //{
- writeAnchor(fileName,0);
- //}
- }
-}
-
-void RTFGenerator::startTitle()
-{
- DBG_RTF(t <<"{\\comment startTitle}" << endl)
- if (Config_getBool("COMPACT_RTF"))
- beginRTFSection();
- else
- beginRTFChapter();
-}
-
-void RTFGenerator::startGroupHeader()
-{
- DBG_RTF(t <<"{\\comment startGroupHeader}" << endl)
- //newParagraph();
- t << rtf_Style_Reset;
- t << rtf_Style["Heading3"]->reference;
- t << endl;
-}
-
-void RTFGenerator::endGroupHeader()
-{
- DBG_RTF(t <<"{\\comment endGroupHeader}" << endl)
- newParagraph();
- t << rtf_Style_Reset << endl;
-}
-
-void RTFGenerator::startMemberDoc(const char *clname,
- const char *memname,
- const char *,
- const char *)
-{
- DBG_RTF(t << "{\\comment startMemberDoc}" << endl)
- if (memname && memname[0]!='@')
- {
- addIndexItem(memname,clname);
- addIndexItem(clname,memname);
- }
- t << rtf_Style_Reset << rtf_Style["Heading4"]->reference;
- //styleStack.push(rtf_Style_Heading4);
- t << "{" << endl;
- //printf("RTFGenerator::startMemberDoc() `%s'\n",rtf_Style["Heading4"]->reference);
- startBold();
- t << endl;
-}
-
-void RTFGenerator::endMemberDoc(bool)
-{
- DBG_RTF(t << "{\\comment endMemberDoc}" << endl)
- t << "}" << endl;
- //const char *style = styleStack.pop();
- //printf("RTFGenerator::endMemberDoc() `%s'\n",style);
- //ASSERT(style==rtf_Style["Heading4"]->reference);
- endBold();
- newParagraph();
-}
-
-void RTFGenerator::startDoxyAnchor(const char *,const char *,
- const char *,const char *,
- const char *
- )
-{
- DBG_RTF(t << "{\\comment startDoxyAnchor}" << endl)
-}
-
-void RTFGenerator::endDoxyAnchor(const char *fName,const char *anchor)
-{
- QCString ref;
- if (fName)
- {
- ref+=fName;
- }
- if (anchor)
- {
- ref+='_';
- ref+=anchor;
- }
-
- DBG_RTF(t << "{\\comment endDoxyAnchor}" << endl)
- t << "{\\bkmkstart ";
- t << rtfFormatBmkStr(ref);
- t << "}" << endl;
- t << "{\\bkmkend ";
- t << rtfFormatBmkStr(ref);
- t << "}" << endl;
-}
-
-
-//void RTFGenerator::writeLatexLabel(const char *clName,const char *anchor)
-//{
-// writeDoxyAnchor(0,clName,anchor,0);
-//}
-
-void RTFGenerator::addIndexItem(const char *s1,const char *s2)
-{
- if (s1)
- {
- t << "{\\xe \\v ";
- docify(s1);
- if (s2)
- {
- t << "\\:";
- docify(s2);
- }
- t << "}" << endl;
- }
-}
-
-void RTFGenerator::startIndent()
-{
- incrementIndentLevel();
- DBG_RTF(t << "{\\comment (startIndent) }" << endl)
- t << "{" << endl;
- t << rtf_Style_Reset << rtf_CList_DepthStyle() << endl;
-}
-
-void RTFGenerator::endIndent()
-{
- t << "}" << endl;
- decrementIndentLevel();
-}
-
-
-void RTFGenerator::startDescription()
-{
- DBG_RTF(t << "{\\comment (startDescription)}" << endl)
- t << "{" << endl;
- t << rtf_Style_Reset << rtf_DList_DepthStyle();
-}
-
-void RTFGenerator::endDescription()
-{
- DBG_RTF(t << "{\\comment (endDescription)}" << endl)
- newParagraph();
- t << "}";
-}
-
-void RTFGenerator::startDescItem()
-{
- newParagraph();
- DBG_RTF(t << "{\\comment (startDescItem)}" << endl)
- t << "{\\b ";
-}
-
-void RTFGenerator::endDescItem()
-{
- DBG_RTF(t << "{\\comment (endDescItem)}" << endl)
- t << "}" << endl;
- newParagraph();
-}
-
-void RTFGenerator::startMemberDescription()
-{
- DBG_RTF(t << "{\\comment (startMemberDescription)}" << endl)
- t << "{" << endl;
- incrementIndentLevel();
- t << rtf_Style_Reset << rtf_CList_DepthStyle();
- startEmphasis();
-}
-
-void RTFGenerator::endMemberDescription()
-{
- DBG_RTF(t << "{\\comment (endMemberDescription)}" << endl)
- endEmphasis();
- newParagraph();
- decrementIndentLevel();
- t << "\\par}" << endl;
-}
-
-void RTFGenerator::startDescList(SectionTypes)
-{
- DBG_RTF(t << "{\\comment (startDescList)}" << endl)
- t << "{"; // ends at endDescList
- t << "{"; // ends at endDescTitle
- startBold();
- newParagraph();
-}
-
-//void RTFGenerator::endDescTitle()
-//{
-// DBG_RTF(t << "{\\comment (endDescTitle) }" << endl)
-// endBold();
-// t << "}";
-// newParagraph();
-// incrementIndentLevel();
-// t << rtf_Style_Reset << rtf_DList_DepthStyle();
-//}
-
-void RTFGenerator::writeDescItem()
-{
- DBG_RTF(t << "{\\comment (writeDescItem) }" << endl)
-}
-
-//void RTFGenerator::endDescList()
-//{
-// DBG_RTF(t << "{\\comment (endDescList)}" << endl)
-// newParagraph();
-// decrementIndentLevel();
-// m_omitParagraph = TRUE;
-// t << "}";
-//}
-
-
-void RTFGenerator::startSection(const char *,const char *title,SectionInfo::SectionType type)
-{
- DBG_RTF(t << "{\\comment (startSection)}" << endl)
- t << "{";
- t<< rtf_Style_Reset;
- 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;
- default: ASSERT(0); break;
- }
- QCString heading;
- heading.sprintf("Heading%d",num);
- // set style
- 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)
-{
- DBG_RTF(t << "{\\comment (endSection)}" << endl)
- newParagraph();
- // make bookmark
- writeAnchor(0,lab);
- t << "}";
-}
-
-//void RTFGenerator::writeSectionRef(const char *ref,const char *,
-// const char *lab,const char *title)
-//{
-// if (ref)
-// {
-// docify(title);
-// }
-// else
-// {
-// startBold();
-// docify(title);
-// endBold();
-// t << " (";
-// docify(theTranslator->trPageAbbreviation());
-// writeRTFReference(lab);
-// t << ")" << endl;
-// }
-//}
-//
-//void RTFGenerator::writeSectionRefItem(const char *,const char *lab,
-// const char *title)
-//{
-// docify(title);
-// t << "\\tab";
-// writeRTFReference(lab);
-// t << endl;
-//}
-//
-//void RTFGenerator::writeSectionRefAnchor(const char *name,const char *lab,
-// const char *title)
-//{
-// writeSectionRef(name,lab,title);
-//}
-
-char* RTFGenerator::getMultiByte(int c)
-{
- static char s[10];
-
- sprintf(s,"\\'%X",c);
- return s;
-}
-
-void RTFGenerator::docify(const char *str)
-{
- if (str)
- {
- const unsigned char *p=(const unsigned char *)str;
- unsigned char c;
- unsigned char pc='\0';
- while (*p)
- {
- static bool MultiByte = FALSE;
- c=*p++;
-
- if ( MultiByte )
- {
- t << getMultiByte( c );
- MultiByte = FALSE;
- continue;
- }
- if ( c >= 0x80 )
- {
- MultiByte = TRUE;
- t << getMultiByte( c );
- continue;
- }
-
- switch (c)
- {
- case '{': t << "\\{"; break;
- case '}': t << "\\}"; break;
- case '\\': t << "\\\\"; break;
- default:
- {
- // see if we can insert an hyphenation hint
- //if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-";
- t << (char)c;
- }
- }
- pc = c;
- m_omitParagraph = FALSE;
- }
- }
-}
-
-void RTFGenerator::codify(const char *str)
-{
- // note that RTF does not have a "verbatim", so "\n" means
- // nothing... add a "newParagraph()";
- //static char spaces[]=" ";
- if (str)
- {
- const unsigned char *p=(const unsigned char *)str;
- unsigned char c;
- int spacesToNextTabStop;
-
- while (*p)
- {
- static bool MultiByte = FALSE;
-
- c=*p++;
-
- if( MultiByte )
- {
- t << getMultiByte( c );
- MultiByte = FALSE;
- continue;
- }
- if( c >= 0x80 )
- {
- MultiByte = TRUE;
- t << getMultiByte( c );
- continue;
- }
-
- switch(c)
- {
- case '\t': spacesToNextTabStop = Config_getInt("TAB_SIZE") - (col%Config_getInt("TAB_SIZE"));
- t << spaces.left(spacesToNextTabStop);
- col+=spacesToNextTabStop;
- break;
- case '\n': newParagraph();
- t << '\n'; col=0;
- break;
- case '{': t << "\\{"; col++; break;
- case '}': t << "\\}"; col++; break;
- case '\\': t << "\\\\"; col++; break;
- default: t << (char)c; col++; break;
- }
- }
- }
-}
-
-void RTFGenerator::writeChar(char c)
-{
- char cs[2];
- cs[0]=c;
- cs[1]=0;
- docify(cs);
-}
-
-void RTFGenerator::startClassDiagram()
-{
-}
-
-void RTFGenerator::endClassDiagram(ClassDiagram &d,
- const char *fileName,const char *)
-{
- newParagraph();
-
- // create a png file
- d.writeImage(t,dir,relPath,fileName,FALSE);
-
- // display the file
- t << "{" << endl;
- t << rtf_Style_Reset << endl;
- t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
- t << fileName << ".png\"";
- t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
- t << "}" << endl;
-}
-
-//void RTFGenerator::writeFormula(const char *,const char *text)
-//{
-// t << text;
-//}
-
-void RTFGenerator::startMemberItem(int)
-{
- DBG_RTF(t <<"{\\comment startMemberItem }" << endl)
- t << rtf_Style_Reset << rtf_BList_DepthStyle() << endl; // set style to apropriate depth
-}
-
-void RTFGenerator::endMemberItem()
-{
- DBG_RTF(t <<"{\\comment endMemberItem }" << endl)
- newParagraph();
-}
-
-void RTFGenerator::writeAnchor(const char *fileName,const char *name)
-{
- QCString anchor;
- if (fileName)
- {
- anchor+=fileName;
- }
- if (fileName && name)
- {
- anchor+='_';
- }
- if (name)
- {
- anchor+=name;
- }
-
- DBG_RTF(t <<"{\\comment writeAncheor (" << anchor << ")}" << endl)
- t << "{\\bkmkstart " << rtfFormatBmkStr(anchor) << "}" << endl;
- t << "{\\bkmkend " << rtfFormatBmkStr(anchor) << "}" << endl;
-}
-
-void RTFGenerator::writeRTFReference(const char *label)
-{
- t << "{\\field\\fldedit {\\*\\fldinst PAGEREF ";
- t << rtfFormatBmkStr(label);
- t << " \\\\*MERGEFORMAT}{\\fldrslt pagenum}}";
-}
-
-void RTFGenerator::startCodeFragment()
-{
- DBG_RTF(t << "{\\comment (startCodeFragment) }" << endl)
- t << "{" << endl;
- //newParagraph();
- t << rtf_Style_Reset << rtf_Code_DepthStyle();
- //styleStack.push(rtf_Style_CodeExample);
-}
-
-void RTFGenerator::endCodeFragment()
-{
- //newParagraph();
- //styleStack.pop();
- //printf("RTFGenerator::endCodeFrament() top=%s\n",styleStack.top());
- //t << rtf_Style_Reset << styleStack.top() << endl;
- DBG_RTF(t << "{\\comment (endCodeFragment) }" << endl)
- t << "}" << endl;
- m_omitParagraph = TRUE;
-}
-
-void RTFGenerator::writeNonBreakableSpace(int)
-{
- t << "\\~ ";
-}
-
-
-void RTFGenerator::startMemberList()
-{
- t << endl;
- DBG_RTF(t << "{\\comment (startMemberList) }" << endl)
- t << "{" << endl;
-#ifdef DELETEDCODE
- if (!insideTabbing)
- t << "\\begin{CompactItemize}" << endl;
-#endif
-}
-
-void RTFGenerator::endMemberList()
-{
- DBG_RTF(t << "{\\comment (endMemberList) }" << endl)
- t << "}" << endl;
-#ifdef DELETEDCODE
- if (!insideTabbing)
- t << "\\end{CompactItemize}" << endl;
-#endif
-}
-
-//void RTFGenerator::startImage(const char *name,const char *,bool)
-//{
-// newParagraph();
-// t << "{" << endl;
-// t << rtf_Style_Reset << endl;
-// t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE ";
-// t << name;
-// t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
-// t << "}" << endl;
-//}
-//
-//void RTFGenerator::endImage(bool)
-//{
-// // not yet implemented
-//}
-//
-//void RTFGenerator::startDotFile(const char *name,bool)
-//{
-// QCString baseName=name;
-// int i;
-// if ((i=baseName.findRev('/'))!=-1 || (i=baseName.findRev('\\'))!=-1)
-// {
-// baseName=baseName.right(baseName.length()-i-1);
-// }
-// QCString outDir = Config_getString("RTF_OUTPUT");
-// writeDotGraphFromFile(name,outDir,baseName,BITMAP);
-// newParagraph();
-// t << "{" << endl;
-// t << rtf_Style_Reset << endl;
-// t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE ";
-// t << outDir << "\\" << baseName;
-// t << " \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
-// t << "}" << endl;
-//}
-//
-//void RTFGenerator::endDotFile(bool)
-//{
-// // not yet implemented
-//}
-//
-void RTFGenerator::startDescTable()
-{
- DBG_RTF(t << "{\\comment (startDescTable) }" << endl)
- //t << "{" << endl;
- //incrementIndentLevel();
- //t << rtf_Style_Reset << rtf_CList_DepthStyle();
-}
-
-void RTFGenerator::endDescTable()
-{
- //decrementIndentLevel();
- DBG_RTF(t << "{\\comment (endDescTable)}" << endl)
- //t << "}" << endl;
- //t << rtf_Style_Reset << styleStack.top();
-}
-
-void RTFGenerator::startDescTableTitle()
-{
- //t << rtf_BList_DepthStyle() << endl;
- DBG_RTF(t << "{\\comment (startDescTableTitle) }" << endl)
- startBold();
- startEmphasis();
-}
-
-void RTFGenerator::endDescTableTitle()
-{
- DBG_RTF(t << "{\\comment (endDescTableTitle) }" << endl)
- endEmphasis();
- endBold();
- t << " ";
-}
-
-void RTFGenerator::startDescTableData()
-{
- DBG_RTF(t << "{\\comment (startDescTableData) }" << endl)
- m_omitParagraph = FALSE;
-}
-
-void RTFGenerator::endDescTableData()
-{
- DBG_RTF(t << "{\\comment (endDescTableData) }" << endl)
- newParagraph();
- m_omitParagraph = TRUE;
-}
-
-// a style for list formatted as a "bulleted list"
-
-void RTFGenerator::incrementIndentLevel()
-{
- m_listLevel++;
- if (m_listLevel>rtf_maxIndentLevels-1)
- {
- warn_cont("Warning: Maximum indent level (%d) exceeded while generating RTF output!\n",rtf_maxIndentLevels);
- m_listLevel=rtf_maxIndentLevels-1;
- }
-}
-
-void RTFGenerator::decrementIndentLevel()
-{
- m_listLevel--;
- if (m_listLevel<0)
- {
- warn_cont("Warning: Negative indent level while generating RTF output!\n");
- m_listLevel=0;
- }
-}
-
-// a style for list formatted with "list continue" style
-const char * RTFGenerator::rtf_CList_DepthStyle()
-{
- QCString n=makeIndexName("ListContinue",m_listLevel);
- 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;
-}
-
-// 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;
-}
-
-// 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;
-}
-
-const char * RTFGenerator::rtf_DList_DepthStyle()
-{
- QCString n=makeIndexName("DescContinue",m_listLevel);
- return rtf_Style[n]->reference;
-}
-
-const char * RTFGenerator::rtf_Code_DepthStyle()
-{
- QCString n=makeIndexName("CodeExample",m_listLevel);
- return rtf_Style[n]->reference;
-}
-
-void RTFGenerator::startTextBlock(bool dense)
-{
- DBG_RTF(t << "{\\comment startTextBlock}" << endl)
- t << "{" << endl;
- t << rtf_Style_Reset;
- if (dense) // no spacing between "paragraphs"
- {
- t << rtf_Style["DenseText"]->reference;
- }
- else // some spacing
- {
- t << rtf_Style["BodyText"]->reference;
- }
-}
-
-void RTFGenerator::endTextBlock(bool paraBreak)
-{
- if (paraBreak) newParagraph();
- DBG_RTF(t << "{\\comment endTextBlock}" << endl)
- t << "}" << endl;
- //m_omitParagraph = TRUE;
-}
-
-void RTFGenerator::newParagraph()
-{
- if (!m_omitParagraph)
- {
- DBG_RTF(t << "{\\comment (newParagraph)}" << endl)
- t << "\\par" << endl;
- }
- m_omitParagraph = FALSE;
-}
-
-void RTFGenerator::startMemberSubtitle()
-{
- DBG_RTF(t << "{\\comment startMemberSubtitle}" << endl)
- t << "{" << endl;
- t << rtf_Style_Reset << rtf_CList_DepthStyle() << endl;
-}
-
-void RTFGenerator::endMemberSubtitle()
-{
- DBG_RTF(t << "{\\comment endMemberSubtitle}" << endl)
- newParagraph();
- t << "}" << endl;
-}
-
-//void RTFGenerator::writeUmlaut(char c)
-//{
-// switch(c)
-// {
-// case 'A' : t << '\304'; break;
-// case 'E' : t << '\313'; break;
-// case 'I' : t << '\317'; break;
-// case 'O' : t << '\326'; break;
-// case 'U' : t << '\334'; break;
-// case 'Y' : t << 'Y'; break;
-// case 'a' : t << '\344'; break;
-// case 'e' : t << '\353'; break;
-// case 'i' : t << '\357'; break;
-// case 'o' : t << '\366'; break;
-// case 'u' : t << '\374'; break;
-// case 'y' : t << '\377'; break;
-// default: t << '?'; break;
-// }
-//}
-//
-//void RTFGenerator::writeAcute(char c)
-//{
-// switch(c)
-// {
-// case 'A' : t << '\301'; break;
-// case 'E' : t << '\311'; break;
-// case 'I' : t << '\315'; break;
-// case 'O' : t << '\323'; break;
-// case 'U' : t << '\332'; break;
-// case 'Y' : t << '\335'; break;
-// case 'a' : t << '\341'; break;
-// case 'e' : t << '\351'; break;
-// case 'i' : t << '\355'; break;
-// case 'o' : t << '\363'; break;
-// case 'u' : t << '\372'; break;
-// case 'y' : t << '\375'; break;
-// default: t << '?'; break;
-// }
-//}
-//
-//void RTFGenerator::writeGrave(char c)
-//{
-// switch(c)
-// {
-// case 'A' : t << '\300'; break;
-// case 'E' : t << '\310'; break;
-// case 'I' : t << '\314'; break;
-// case 'O' : t << '\322'; break;
-// case 'U' : t << '\331'; break;
-// case 'a' : t << '\340'; break;
-// case 'e' : t << '\350'; break;
-// case 'i' : t << '\354'; break;
-// case 'o' : t << '\362'; break;
-// case 'u' : t << '\371'; break;
-// default: t << '?'; break;
-// }
-//}
-//
-//void RTFGenerator::writeCirc(char c)
-//{
-// switch(c)
-// {
-// case 'A' : t << '\302'; break;
-// case 'E' : t << '\312'; break;
-// case 'I' : t << '\316'; break;
-// case 'O' : t << '\324'; break;
-// case 'U' : t << '\333'; break;
-// case 'a' : t << '\342'; break;
-// case 'e' : t << '\352'; break;
-// case 'i' : t << '\356'; break;
-// case 'o' : t << '\364'; break;
-// case 'u' : t << '\373'; break;
-// default: t << '?'; break;
-// }
-//}
-//
-//void RTFGenerator::writeTilde(char c)
-//{
-// switch(c)
-// {
-// case 'A' : t << '\303'; break;
-// case 'N' : t << '\321'; break;
-// case 'O' : t << '\325'; break;
-// case 'a' : t << '\343'; break;
-// case 'n' : t << '\361'; break;
-// case 'o' : t << '\365'; break;
-// default: t << '?'; break;
-// }
-//}
-//
-//void RTFGenerator::writeRing(char c)
-//{
-// switch(c)
-// {
-// case 'A' : t << '\305'; break;
-// case 'a' : t << '\345'; break;
-// default: t << '?'; break;
-// }
-//}
-//
-//void RTFGenerator::writeCCedil(char c)
-//{
-// switch(c)
-// {
-// case 'C' : t << '\307'; break;
-// case 'c' : t << '\347'; break;
-// default: t << '?'; break;
-// }
-//}
-//
-/**
- * VERY brittle routine inline RTF's included by other RTF's.
- * it is recursive and ugly.
- */
-static bool PreProcessFile(QDir &d,QCString &infName, QTextStream &t, bool bIncludeHeader=TRUE)
-{
- QFile f(infName);
- if (!f.open(IO_ReadOnly))
- {
- err("Error opening rtf file %s for reading\n",infName.data());
- return FALSE;
- }
-
- const int maxLineLength = 10240;
- static QCString lineBuf(maxLineLength);
-
- // scan until find end of header
- // this is EXTREEEEEEEMLY brittle. It works on OUR rtf
- // files because the first line before the body
- // ALWAYS contains "{\comment begin body}"
- do
- {
- if (f.readLine(lineBuf.data(),maxLineLength)==-1)
- {
- err("ERROR - read error in %s before end of RTF header!\n",infName.data());
- return FALSE;
- }
- if (bIncludeHeader) t << lineBuf;
- } while (lineBuf.find("\\comment begin body")==-1);
-
-
- //while (fgets(buffer,sizeof(buffer),infp) != NULL)
- while (f.readLine(lineBuf.data(),maxLineLength)!=-1)
- {
- int pos;
- if ((pos=lineBuf.find("INCLUDETEXT"))!=-1)
- {
- int startNamePos = lineBuf.find('"',pos)+1;
- int endNamePos = lineBuf.find('"',startNamePos);
- QCString fileName = lineBuf.mid(startNamePos,endNamePos-startNamePos);
- DBG_RTF(t << "{\\comment begin include " << fileName << "}" << endl)
- if (!PreProcessFile(d,fileName,t,FALSE)) return FALSE;
- DBG_RTF(t << "{\\comment end include " << fileName << "}" << endl)
- }
- else
- {
- // elaborate hoopla to skip the final "}" if we didn't include the
- // headers
- if (!f.atEnd() || bIncludeHeader)
- {
- t << lineBuf;
- }
- else
- {
- // null terminate at the last '}'
- //char *str = strrchr(buffer,'}');
- int pos = lineBuf.findRev('}');
-
- if (pos != -1)
- lineBuf.at(pos) = '\0';
- else
- err("Strange, the last char was not a '}'\n");
- t << lineBuf;
- }
- }
- }
- f.close();
- // remove temporary file
- d.remove(infName);
- return TRUE;
-}
-
-void RTFGenerator::startDotGraph()
-{
- DBG_RTF(t << "{\\comment (startDotGraph)}" << endl)
-}
-
-void RTFGenerator::endDotGraph(DotClassGraph &g)
-{
- newParagraph();
-
- QCString fileName =
- g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),relPath,TRUE,FALSE);
-
- // display the file
- t << "{" << endl;
- t << rtf_Style_Reset << endl;
- t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
- t << fileName << "." << Config_getEnum("DOT_IMAGE_FORMAT");
- t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
- t << "}" << endl;
- newParagraph();
- DBG_RTF(t << "{\\comment (endDotGraph)}" << endl)
-}
-
-void RTFGenerator::startInclDepGraph()
-{
- DBG_RTF(t << "{\\comment (startInclDepGraph)}" << endl)
-}
-
-void RTFGenerator::endInclDepGraph(DotInclDepGraph &g)
-{
- newParagraph();
-
- QCString fileName = g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),
- relPath,FALSE);
-
- // display the file
- t << "{" << endl;
- t << rtf_Style_Reset << endl;
- t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
- t << fileName << "." << Config_getEnum("DOT_IMAGE_FORMAT");
- t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
- t << "}" << endl;
- DBG_RTF(t << "{\\comment (endInclDepGraph)}" << endl)
-}
-
-void RTFGenerator::startGroupCollaboration()
-{
-}
-
-void RTFGenerator::endGroupCollaboration(DotGroupCollaboration &)
-{
-}
-
-void RTFGenerator::startCallGraph()
-{
- DBG_RTF(t << "{\\comment (startCallGraph)}" << endl)
-}
-
-void RTFGenerator::endCallGraph(DotCallGraph &g)
-{
- newParagraph();
-
- QCString fileName = g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),
- relPath,FALSE);
-
- // display the file
- t << "{" << endl;
- t << rtf_Style_Reset << endl;
- t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
- t << fileName << "." << Config_getEnum("DOT_IMAGE_FORMAT");
- t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
- t << "}" << endl;
- DBG_RTF(t << "{\\comment (endCallGraph)}" << endl)
-}
-
-void RTFGenerator::startDirDepGraph()
-{
- DBG_RTF(t << "{\\comment (startDirDepGraph)}" << endl)
-}
-
-void RTFGenerator::endDirDepGraph(DotDirDeps &g)
-{
- newParagraph();
-
- QCString fileName = g.writeGraph(t,BITMAP,Config_getString("RTF_OUTPUT"),
- relPath,FALSE);
-
- // display the file
- t << "{" << endl;
- t << rtf_Style_Reset << endl;
- t << "\\par\\pard \\qc {\\field\\flddirty {\\*\\fldinst INCLUDEPICTURE \"";
- t << fileName << "." << Config_getEnum("DOT_IMAGE_FORMAT");
- t << "\" \\\\d \\\\*MERGEFORMAT}{\\fldrslt IMAGE}}\\par" << endl;
- t << "}" << endl;
- DBG_RTF(t << "{\\comment (endDirDepGraph)}" << endl)
-}
-
-/** Tests the integrity of the result by counting brackets.
- *
- */
-void testRTFOutput(const char *name)
-{
- int bcount=0;
- int line=1;
- int c;
- QFile f(name);
- if (f.open(IO_ReadOnly))
- {
- while ((c=f.getch())!=-1)
- {
- if (c=='\\') // escape char
- {
- c=f.getch();
- if (c==-1) break;
- }
- else if (c=='{') // open bracket
- {
- bcount++;
- }
- else if (c=='}') // close bracket
- {
- bcount--;
- if (bcount<0)
- {
- goto err;
- break;
- }
- }
- else if (c=='\n') // newline
- {
- line++;
- }
- }
- }
- if (bcount==0) return; // file is OK.
-err:
- err("Error: RTF integrity test failed at line %d of %s due to a bracket mismatch.\n",line,name);
- err(" Please try to create a small code example that produces this error \n"
- " and send that to dimitri@stack.nl.\n");
-}
-
-/**
- * This is an API to a VERY brittle RTF preprocessor that combines nested
- * RTF files. This version replaces the infile with the new file
- */
-bool RTFGenerator::preProcessFileInplace(const char *path,const char *name)
-{
- QDir d(path);
- // store the original directory
- if (!d.exists())
- {
- err("Error: Output dir %s does not exist!\n",path);
- return FALSE;
- }
- QCString oldDir = convertToQCString(QDir::currentDirPath());
-
- // go to the html output directory (i.e. path)
- QDir::setCurrent(d.absPath());
- QDir thisDir;
-
- QCString combinedName = (QCString)path+"/combined.rtf";
- QCString mainRTFName = (QCString)path+"/"+name;
-
- QFile outf(combinedName);
- if (!outf.open(IO_WriteOnly))
- {
- err("Failed to open %s for writing!\n",combinedName.data());
- return FALSE;
- }
- QTextStream outt(&outf);
-#if QT_VERSION >= 200
- outt.setEncoding(QTextStream::Latin1);
-#endif
-
- if (!PreProcessFile(thisDir,mainRTFName,outt))
- {
- // it failed, remove the temp file
- outf.close();
- thisDir.remove(combinedName);
- QDir::setCurrent(oldDir);
- return FALSE;
- }
-
- // everything worked, move the files
- outf.close();
- thisDir.remove(mainRTFName);
- thisDir.rename(combinedName,mainRTFName);
-
- testRTFOutput(mainRTFName);
-
- QDir::setCurrent(oldDir);
- return TRUE;
-}
-
-void RTFGenerator::startMemberGroupHeader(bool hasHeader)
-{
- DBG_RTF(t << "{\\comment startMemberGroupHeader}" << endl)
- t << "{" << endl;
- if (hasHeader) incrementIndentLevel();
- t << rtf_Style_Reset << rtf_Style["GroupHeader"]->reference;
-}
-
-void RTFGenerator::endMemberGroupHeader()
-{
- DBG_RTF(t << "{\\comment endMemberGroupHeader}" << endl)
- newParagraph();
- t << rtf_Style_Reset << rtf_CList_DepthStyle();
-}
-
-void RTFGenerator::startMemberGroupDocs()
-{
- DBG_RTF(t << "{\\comment startMemberGroupDocs}" << endl)
- startEmphasis();
-}
-
-void RTFGenerator::endMemberGroupDocs()
-{
- DBG_RTF(t << "{\\comment endMemberGroupDocs}" << endl)
- endEmphasis();
- newParagraph();
-}
-
-void RTFGenerator::startMemberGroup()
-{
- DBG_RTF(t << "{\\comment startMemberGroup}" << endl)
- t << rtf_Style_Reset << rtf_BList_DepthStyle() << endl;
-}
-
-void RTFGenerator::endMemberGroup(bool hasHeader)
-{
- DBG_RTF(t << "{\\comment endMemberGroup}" << endl)
- if (hasHeader) decrementIndentLevel();
- t << "}";
-}
-
-void RTFGenerator::startSimpleSect(SectionTypes,const char *file,const char *anchor,const char *title)
-{
- DBG_RTF(t << "{\\comment (startSimpleSect)}" << endl)
- t << "{"; // ends at endDescList
- t << "{"; // ends at endDescTitle
- startBold();
- newParagraph();
- if (file)
- {
- writeObjectLink(0,file,anchor,title);
- }
- else
- {
- docify(title);
- }
- endBold();
- t << "}";
- newParagraph();
- incrementIndentLevel();
- t << rtf_Style_Reset << rtf_DList_DepthStyle();
-}
-
-void RTFGenerator::endSimpleSect()
-{
- DBG_RTF(t << "{\\comment (endSimpleSect)}" << endl)
- newParagraph();
- decrementIndentLevel();
- m_omitParagraph = TRUE;
- t << "}";
-}
-
-void RTFGenerator::startParamList(ParamListTypes,const char *title)
-{
- DBG_RTF(t << "{\\comment (startParamList)}" << endl)
- t << "{"; // ends at endParamList
- t << "{"; // ends at endDescTitle
- startBold();
- newParagraph();
- docify(title);
- endBold();
- t << "}";
- newParagraph();
- incrementIndentLevel();
- t << rtf_Style_Reset << rtf_DList_DepthStyle();
-}
-
-void RTFGenerator::endParamList()
-{
- DBG_RTF(t << "{\\comment (endParamList)}" << endl)
- newParagraph();
- decrementIndentLevel();
- m_omitParagraph = TRUE;
- t << "}";
-}
-
-void RTFGenerator::printDoc(DocNode *n,const char *langExt)
-{
- RTFDocVisitor *visitor = new RTFDocVisitor(t,*this,langExt);
- n->accept(visitor);
- delete visitor;
-}
-
-void RTFGenerator::rtfwriteRuler_doubleline()
-{
- DBG_RTF(t << "{\\comment (rtfwriteRuler_doubleline)}" << endl)
- t << "{\\pard\\widctlpar\\brdrb\\brdrdb\\brdrw15\\brsp20 \\adjustright \\par}" << endl;
-}
-
-void RTFGenerator::rtfwriteRuler_emboss()
-{
- DBG_RTF(t << "{\\comment (rtfwriteRuler_emboss)}" << endl)
- t << "{\\pard\\widctlpar\\brdrb\\brdremboss\\brdrw15\\brsp20 \\adjustright \\par}" << endl;
-}
-
-void RTFGenerator::rtfwriteRuler_thick()
-{
- DBG_RTF(t << "{\\comment (rtfwriteRuler_thick)}" << endl)
- t << "{\\pard\\widctlpar\\brdrb\\brdrs\\brdrw75\\brsp20 \\adjustright \\par}" << endl;
-}
-
-void RTFGenerator::rtfwriteRuler_thin()
-{
- DBG_RTF(t << "{\\comment (rtfwriteRuler_thin)}" << endl)
- t << "{\\pard\\widctlpar\\brdrb\\brdrs\\brdrw5\\brsp20 \\adjustright \\par}" << endl;
-}
-
diff --git a/src/rtfgen.h b/src/rtfgen.h
deleted file mode 100644
index d17cad8..0000000
--- a/src/rtfgen.h
+++ /dev/null
@@ -1,305 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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
- * 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 RTFGEN_H
-#define RTFGEN_H
-
-#include "outputgen.h"
-
-class QFile;
-
-class RTFGenerator : public OutputGenerator
-{
- public:
- RTFGenerator();
- ~RTFGenerator();
- static void init();
- static void writeStyleSheetFile(QFile &f);
- static void writeExtensionsFile(QFile &file);
-
- //OutputGenerator *copy();
- //OutputGenerator *clone() { return new RTFGenerator(*this); }
- //void append(const OutputGenerator *o);
- void enable()
- { if (genStack->top()) active=*genStack->top(); else active=TRUE; }
- void disable() { active=FALSE; }
- void enableIf(OutputType o) { if (o==RTF) active=TRUE; }
- void disableIf(OutputType o) { if (o==RTF) active=FALSE; }
- void disableIfNot(OutputType o) { if (o!=RTF) active=FALSE; }
- bool isEnabled(OutputType o) { return (o==RTF && active); }
- OutputGenerator *get(OutputType o) { return (o==RTF) ? this : 0; }
-
- void printDoc(DocNode *,const char *);
-
- void startFile(const char *name,const char *manName,const char *title);
- void writeFooter() {}
- void endFile();
- void clearBuffer();
-
- //void writeIndex();
-
- void startIndexSection(IndexSections);
- void endIndexSection(IndexSections);
- void startProjectNumber();
- void endProjectNumber();
- void writeStyleInfo(int part);
- void startTitleHead(const char *);
- void startTitle();
- void endTitleHead(const char *,const char *name);
- void endTitle() {}
-
- void newParagraph();
- void writeString(const char *text);
- void startIndexList();
- void endIndexList();
- void startIndexKey();
- void endIndexKey();
- void startIndexValue(bool);
- void endIndexValue(const char *,bool);
- void startItemList();
- void endItemList();
- //void startEnumList();
- //void endEnumList();
- //void startAlphabeticalIndexList() {}
- //void endAlphabeticalIndexList() {}
- //void writeIndexHeading(const char *) {}
- void writeIndexItem(const char *ref,const char *file,const char *name);
- void docify(const char *text);
- void codify(const char *text);
- void writeObjectLink(const char *ref,const char *file,
- const char *anchor,const char *name);
- void writeCodeLink(const char *ref, const char *file,
- const char *anchor,const char *name);
- void startTextLink(const char *f,const char *anchor);
- void endTextLink();
- void startHtmlLink(const char *url);
- void endHtmlLink();
- //void writeMailLink(const char *url);
- void startTypewriter() { t << "{\\f2 "; }
- void endTypewriter() { t << "}"; }
- void startGroupHeader();
- void endGroupHeader();
- void writeListItem();
-
- void startMemberSections() {}
- void endMemberSections() {}
- void startMemberHeader() { startGroupHeader(); }
- void endMemberHeader() { endGroupHeader(); }
- void startMemberSubtitle();
- void endMemberSubtitle();
- void startMemberList();
- void endMemberList();
- void startAnonTypeScope(int) {}
- void endAnonTypeScope(int) {}
- void startMemberItem(int);
- void endMemberItem();
- void startMemberTemplateParams() {}
- void endMemberTemplateParams() {}
- //void memberGroupSpacing(bool) {}
- //void memberGroupSeparator() {}
- void insertMemberAlign(bool) {}
-
- void writeRuler() { rtfwriteRuler_thin(); }
-
- void writeAnchor(const char *fileName,const char *name);
- void startCodeFragment();
- void endCodeFragment();
- //void startPreFragment() { startCodeFragment(); }
- //void endPreFragment() { endCodeFragment(); }
- //void startVerbatimFragment() { startCodeFragment(); }
- //void endVerbatimFragment() { endCodeFragment(); }
- void writeLineNumber(const char *,const char *,const char *,int l) { t << l << " "; }
- void startCodeLine() { col=0; }
- void endCodeLine() { lineBreak(); }
- //void writeBoldString(const char *text)
- // { t << "{\\b "; docify(text); t << "}"; }
- void startEmphasis() { t << "{\\i "; }
- void endEmphasis() { t << "}"; }
- void startBold() { t << "{\\b "; }
- void endBold() { t << "}"; }
- void startDescription();
- void endDescription();
- void startDescItem();
- void endDescItem();
- void lineBreak();
- void startMemberDoc(const char *,const char *,const char *,const char *);
- void endMemberDoc(bool);
- void startDoxyAnchor(const char *,const char *,const char *,const char *,const char *);
- void endDoxyAnchor(const char *,const char *);
- void startCodeAnchor(const char *) {};
- void endCodeAnchor() {};
- void writeChar(char c);
- void writeLatexSpacing() {};//{ t << "\\hspace{0.3cm}"; }
- //void writeLatexLabel(const char *scope,const char *anchor);
- void writeStartAnnoItem(const char *type,const char *file,
- const char *path,const char *name);
- void writeEndAnnoItem(const char *name);
- void startSubsection();
- void endSubsection();
- void startSubsubsection();
- void endSubsubsection();
- void startCenter() { t << "{\\qc" << endl; }
- void endCenter() { t << "}"; }
- void startSmall() { t << "{\\sub "; }
- void endSmall() { t << "}"; }
- //void startSubscript() { t << "{\\sub " << endl;}
- //void endSubscript() { t << "}"; }
- //void startSuperscript() { t << "{\\super " << endl;}
- //void endSuperscript() { t << "}"; }
- //void startTable(bool,int);
- //void endTable(bool);
- //void startCaption();
- //void endCaption();
- //void nextTableRow();
- //void endTableRow();
- //void nextTableColumn();
- //void endTableColumn();
- //void writeCopyright() { t << "\251"; }
- //void writeQuote() { t << "\""; }
- //void writeUmlaut(char c);
- //void writeAcute(char c);
- //void writeGrave(char c);
- //void writeCirc(char c);
- //void writeTilde(char c);
- //void writeRing(char c);
- //void writeSharpS() { t << "\337"; }
- //void writeCCedil(char c);
-
- void startMemberDescription();
- void endMemberDescription();
- void startDescList(SectionTypes);
- //void endDescList();
- void startSimpleSect(SectionTypes,const char *,const char *,const char *);
- void endSimpleSect();
- void startParamList(ParamListTypes,const char *);
- void endParamList();
- //void endDescTitle();
- void writeDescItem();
- void startSection(const char *,const char *,SectionInfo::SectionType);
- void endSection(const char *,SectionInfo::SectionType);
- //void writeSectionRef(const char *,const char *,const char *,const char *);
- //void writeSectionRefItem(const char *,const char *,const char *);
- //void writeSectionRefAnchor(const char *,const char *,const char *);
- void addIndexItem(const char *,const char *);
- void startIndent();
- void endIndent();
- void writeSynopsis() {}
- //void generateExternalIndex() {}
- void startClassDiagram();
- void endClassDiagram(ClassDiagram &,const char *filename,const char *name);
- //void startColorFont(uchar,uchar,uchar) {}
- //void endColorFont() {}
- void startPageRef();
- void endPageRef(const char *,const char *);
- //void startQuickIndexItem(const char *,const char *) {}
- //void endQuickIndexItem() {}
- void writeQuickLinks(bool,HighlightedItem) {}
- //void writeFormula(const char *,const char *);
- void writeNonBreakableSpace(int);
- //void startImage(const char *,const char *,bool);
- //void endImage(bool);
- //void startDotFile(const char *,bool);
- //void endDotFile(bool);
-
- void startDescTable();
- void endDescTable();
- void startDescTableTitle();
- void endDescTableTitle();
- void startDescTableData();
- void endDescTableData();
-
- void startDotGraph();
- void endDotGraph(DotClassGraph &);
- void startInclDepGraph();
- void endInclDepGraph(DotInclDepGraph &);
- void startGroupCollaboration();
- void endGroupCollaboration(DotGroupCollaboration &g);
- void startCallGraph();
- void endCallGraph(DotCallGraph &);
- void startDirDepGraph();
- void endDirDepGraph(DotDirDeps &g);
- void writeGraphicalHierarchy(DotGfxHierarchyTable &) {}
-
- void startMemberGroupHeader(bool);
- void endMemberGroupHeader();
- void startMemberGroupDocs();
- void endMemberGroupDocs();
- void startMemberGroup();
- void endMemberGroup(bool);
-
- void startTextBlock(bool dense);
- void endTextBlock(bool);
- void lastIndexPage();
-
- void startMemberDocPrefixItem() {}
- void endMemberDocPrefixItem() {}
- void startMemberDocName(bool) {}
- void endMemberDocName() {}
- void startParameterType(bool,const char *) {}
- void endParameterType() {}
- void startParameterName(bool) {}
- void endParameterName(bool,bool,bool) {}
- void startParameterList(bool) {}
- void endParameterList() {}
-
- void startFontClass(const char *) {}
- void endFontClass() {}
-
- //void startHtmlOnly() {}
- //void endHtmlOnly() {}
- //void startLatexOnly() {}
- //void endLatexOnly() {}
-
- //void startSectionRefList() {}
- //void endSectionRefList() {}
-
- void writeCodeAnchor(const char *) {}
-
- static bool preProcessFileInplace(const char *path,const char *name);
-
- private:
- RTFGenerator(const RTFGenerator &);
- RTFGenerator &operator=(const RTFGenerator &);
-
- const char *rtf_BList_DepthStyle();
- const char *rtf_CList_DepthStyle();
- const char *rtf_EList_DepthStyle();
- const char *rtf_LCList_DepthStyle();
- const char *rtf_DList_DepthStyle();
- const char *rtf_Code_DepthStyle();
- void incrementIndentLevel();
- void decrementIndentLevel();
- int col;
-
- bool m_bstartedBody; // has startbody been called yet?
- int m_listLevel; // // RTF does not really have a addative 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 relPath;
-
- void beginRTFDocument();
- void beginRTFChapter();
- void beginRTFSection();
- void rtfwriteRuler_doubleline();
- void rtfwriteRuler_emboss();
- void rtfwriteRuler_thick();
- void rtfwriteRuler_thin();
- void writeRTFReference(const char *label);
- char *getMultiByte(int c);
-};
-
-#endif
diff --git a/src/rtfstyle.cpp b/src/rtfstyle.cpp
deleted file mode 100644
index a4b7e0b..0000000
--- a/src/rtfstyle.cpp
+++ /dev/null
@@ -1,522 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 "rtfstyle.h"
-
-#include <qfile.h>
-#include <qtextstream.h>
-#include <stdlib.h>
-
-#include "message.h"
-
-
-RTFListItemInfo rtf_listItemInfo[rtf_maxIndentLevels];
-
-QCString rtf_title;
-QCString rtf_subject;
-QCString rtf_comments;
-QCString rtf_company;
-QCString rtf_logoFilename;
-QCString rtf_author;
-QCString rtf_manager;
-QCString rtf_documentType;
-QCString rtf_documentId;
-QCString rtf_keywords;
-
-char rtf_Style_Reset[] = "\\pard\\plain ";
-
-Rtf_Style_Default rtf_Style_Default[] =
-{
- { "Heading1",
- "\\s1\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs36\\kerning36\\cgrid ",
- "\\sbasedon0 \\snext0 heading 1"
- },
- { "Heading2",
- "\\s2\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs28\\kerning28\\cgrid ",
- "\\sbasedon0 \\snext0 heading 2"
- },
- { "Heading3",
- "\\s3\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\cgrid ",
- "\\sbasedon0 \\snext0 heading 3"
- },
- { "Heading4",
- "\\s4\\sb240\\sa60\\keepn\\widctlpar\\adjustright \\b\\f1\\fs20\\cgrid ",
- "\\sbasedon0 \\snext0 heading 4;}{\\*\\cs10 \\additive Default Paragraph Font"
- },
- { "Heading5",
- "\\s5\\sb90\\sa30\\keepn\\widctlpar\\adjustright \\b\\f1\\fs20\\cgrid ",
- "\\sbasedon0 \\snext0 heading 5;}{\\*\\cs10 \\additive Default Paragraph Font"
- },
- { "Title",
- "\\s15\\qc\\sb240\\sa60\\widctlpar\\outlinelevel0\\adjustright \\b\\f1\\fs32\\kerning28\\cgrid ",
- "\\sbasedon0 \\snext15 Title"
- },
- { "SubTitle",
- "\\s16\\qc\\sa60\\widctlpar\\outlinelevel1\\adjustright \\f1\\cgrid ",
- "\\sbasedon0 \\snext16 Subtitle"
- },
- { "BodyText",
- "\\s17\\sa60\\sb30\\widctlpar\\qj \\fs22\\cgrid ",
- "\\sbasedon0 \\snext17 BodyText"
- },
- { "DenseText",
- "\\s18\\widctlpar\\fs22\\cgrid ",
- "\\sbasedon0 \\snext18 DenseText"
- },
- { "Header",
- "\\s28\\widctlpar\\tqc\\tx4320\\tqr\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext28 header"
- },
- { "Footer",
- "\\s29\\widctlpar\\tqc\\tx4320\\tqr\\tx8640\\qr\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext29 footer"
- },
- { "GroupHeader",
- "\\s30\\li360\\sa60\\sb120\\keepn\\widctlpar\\adjustright \\b\\f1\\fs20\\cgrid ",
- "\\sbasedon0 \\snext30 GroupHeader"
- },
- { "CodeExample0",
- "\\s40\\li0\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext41 Code Example 0"
- },
- { "CodeExample1",
- "\\s41\\li360\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext42 Code Example 1"
- },
- { "CodeExample2",
- "\\s42\\li720\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext43 Code Example 2"
- },
- { "CodeExample3",
- "\\s43\\li1080\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext44 Code Example 3"
- },
- { "CodeExample4",
- "\\s44\\li1440\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext45 Code Example 4"
- },
- { "CodeExample5",
- "\\s45\\li1800\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext46 Code Example 5"
- },
- { "CodeExample6",
- "\\s46\\li2160\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext47 Code Example 6"
- },
- { "CodeExample7",
- "\\s47\\li2520\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext48 Code Example 7"
- },
- { "CodeExample8",
- "\\s48\\li2880\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext49 Code Example 8"
- },
- { "CodeExample9",
- "\\s49\\li3240\\widctlpar\\adjustright \\shading1000\\cbpat8 \\f2\\fs16\\cgrid ",
- "\\sbasedon0 \\snext49 Code Example 9"
- },
- { "ListContinue0",
- "\\s50\\li0\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext51 List Continue 0"
- },
- { "ListContinue1",
- "\\s51\\li360\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext52 List Continue 1"
- },
- { "ListContinue2",
- "\\s52\\li720\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext53 List Continue 2"
- },
- { "ListContinue3",
- "\\s53\\li1080\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext54 List Continue 3"
- },
- { "ListContinue4",
- "\\s54\\li1440\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext55 List Continue 4"
- },
- { "ListContinue5",
- "\\s55\\li1800\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext56 List Continue 5"
- },
- { "ListContinue6",
- "\\s56\\li2160\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext57 List Continue 6"
- },
- { "ListContinue7",
- "\\s57\\li2520\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext58 List Continue 7"
- },
- { "ListContinue8",
- "\\s58\\li2880\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext59 List Continue 8"
- },
- { "ListContinue9",
- "\\s59\\li3240\\sa60\\sb30\\qj\\widctlpar\\qj\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext59 List Continue 9"
- },
- { "DescContinue0",
- "\\s60\\li0\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext61 DescContinue 0"
- },
- { "DescContinue1",
- "\\s61\\li360\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext62 DescContinue 1"
- },
- { "DescContinue2",
- "\\s62\\li720\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext63 DescContinue 2"
- },
- { "DescContinue3",
- "\\s63\\li1080\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext64 DescContinue 3"
- },
- { "DescContinue4",
- "\\s64\\li1440\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext65 DescContinue 4"
- },
- { "DescContinue5",
- "\\s65\\li1800\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext66 DescContinue 5"
- },
- { "DescContinue6",
- "\\s66\\li2160\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext67 DescContinue 6"
- },
- { "DescContinue7",
- "\\s67\\li2520\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext68 DescContinue 7"
- },
- { "DescContinue8",
- "\\s68\\li2880\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext69 DescContinue 8"
- },
- { "DescContinue9",
- "\\s69\\li3240\\widctlpar\\ql\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext69 DescContinue 9"
- },
- { "LatexTOC0",
- "\\s70\\li0\\sa30\\sb30\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext81 LatexTOC 0"
- },
- { "LatexTOC1",
- "\\s71\\li360\\sa27\\sb27\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext82 LatexTOC 1"
- },
- { "LatexTOC2",
- "\\s72\\li720\\sa24\\sb24\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext83 LatexTOC 2"
- },
- { "LatexTOC3",
- "\\s73\\li1080\\sa21\\sb21\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext84 LatexTOC 3"
- },
- { "LatexTOC4",
- "\\s74\\li1440\\sa18\\sb18\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext85 LatexTOC 4"
- },
- { "LatexTOC5",
- "\\s75\\li1800\\sa15\\sb15\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext86 LatexTOC 5"
- },
- { "LatexTOC6",
- "\\s76\\li2160\\sa12\\sb12\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext87 LatexTOC 6"
- },
- { "LatexTOC7",
- "\\s77\\li2520\\sa9\\sb9\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext88 LatexTOC 7"
- },
- { "LatexTOC8",
- "\\s78\\li2880\\sa6\\sb6\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext89 LatexTOC 8"
- },
- { "LatexTOC9",
- "\\s79\\li3240\\sa3\\sb3\\widctlpar\\tqr\\tldot\\tx8640\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext89 LatexTOC 9"
- },
- { "ListBullet0",
- "\\s80\\fi-360\\li360\\widctlpar\\jclisttab\\tx360{\\*\\pn \\pnlvlbody\\ilvl0\\ls1\\pnrnot0\\pndec }\\ls1\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext81 \\sautoupd List Bullet 0"
- },
- { "ListBullet1",
- "\\s81\\fi-360\\li720\\widctlpar\\jclisttab\\tx720{\\*\\pn \\pnlvlbody\\ilvl0\\ls2\\pnrnot0\\pndec }\\ls2\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext82 \\sautoupd List Bullet 1"
- },
- { "ListBullet2",
- "\\s82\\fi-360\\li1080\\widctlpar\\jclisttab\\tx1080{\\*\\pn \\pnlvlbody\\ilvl0\\ls3\\pnrnot0\\pndec }\\ls3\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext83 \\sautoupd List Bullet 2"
- },
- { "ListBullet3",
- "\\s83\\fi-360\\li1440\\widctlpar\\jclisttab\\tx1440{\\*\\pn \\pnlvlbody\\ilvl0\\ls4\\pnrnot0\\pndec }\\ls4\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext84 \\sautoupd List Bullet 3"
- },
- { "ListBullet4",
- "\\s84\\fi-360\\li1800\\widctlpar\\jclisttab\\tx1800{\\*\\pn \\pnlvlbody\\ilvl0\\ls5\\pnrnot0\\pndec }\\ls5\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext85 \\sautoupd List Bullet 4"
- },
- { "ListBullet5",
- "\\s85\\fi-360\\li2160\\widctlpar\\jclisttab\\tx2160{\\*\\pn \\pnlvlbody\\ilvl0\\ls6\\pnrnot0\\pndec }\\ls6\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext86 \\sautoupd List Bullet 5"
- },
- { "ListBullet6",
- "\\s86\\fi-360\\li2520\\widctlpar\\jclisttab\\tx2520{\\*\\pn \\pnlvlbody\\ilvl0\\ls7\\pnrnot0\\pndec }\\ls7\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext87 \\sautoupd List Bullet 6"
- },
- { "ListBullet7",
- "\\s87\\fi-360\\li2880\\widctlpar\\jclisttab\\tx2880{\\*\\pn \\pnlvlbody\\ilvl0\\ls8\\pnrnot0\\pndec }\\ls8\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext88 \\sautoupd List Bullet 7"
- },
- { "ListBullet8",
- "\\s88\\fi-360\\li3240\\widctlpar\\jclisttab\\tx3240{\\*\\pn \\pnlvlbody\\ilvl0\\ls9\\pnrnot0\\pndec }\\ls9\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext89 \\sautoupd List Bullet 8"
- },
- { "ListBullet9",
- "\\s89\\fi-360\\li3600\\widctlpar\\jclisttab\\tx3600{\\*\\pn \\pnlvlbody\\ilvl0\\ls10\\pnrnot0\\pndec }\\ls10\\adjustright \\fs20\\cgrid ",
- "\\sbasedon0 \\snext89 \\sautoupd List Bullet 9"
- },
- { "ListEnum0",
- "\\s90\\fi-360\\li360\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext91 \\sautoupd List Enum 0"
- },
- { "ListEnum1",
- "\\s91\\fi-360\\li720\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext92 \\sautoupd List Enum 1"
- },
- { "ListEnum2",
- "\\s92\\fi-360\\li1080\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext93 \\sautoupd List Enum 2"
- },
- { "ListEnum3",
- "\\s93\\fi-360\\li1440\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext94 \\sautoupd List Enum 3"
- },
- { "ListEnum4",
- "\\s94\\fi-360\\li1800\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext95 \\sautoupd List Enum 4"
- },
- { "ListEnum5",
- "\\s95\\fi-360\\li2160\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext96 \\sautoupd List Enum 5"
- },
- { "ListEnum6",
- "\\s96\\fi-360\\li2520\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext96 \\sautoupd List Enum 5"
- },
- { "ListEnum7",
- "\\s97\\fi-360\\li2880\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext98 \\sautoupd List Enum 7"
- },
- { "ListEnum8",
- "\\s98\\fi-360\\li3240\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext99 \\sautoupd List Enum 8"
- },
- { "ListEnum9",
- "\\s99\\fi-360\\li3600\\widctlpar\\fs20\\cgrid ",
- "\\sbasedon0 \\snext99 \\sautoupd List Enum 9"
- },
- { 0,
- 0,
- 0
- }
-};
-
-const QRegExp StyleData::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);
-
- ASSERT(reference != 0);
- size_t size = 1 + strlen(reference);
- memcpy(this->reference = new char[size], reference, size);
-
- ASSERT(definition != 0);
- size = 1 + strlen(definition);
- memcpy(this->definition = new char[size], definition, size);
-}
-
-StyleData::~StyleData()
-{
- delete[] reference;
- delete[] definition;
-}
-
-bool StyleData::setStyle(const char* s, const char* styleName)
-{
- static const QRegExp subgroup("^{[^}]*}\\s*");
- static const QRegExp any_clause("^\\\\[a-z][a-z0-9-]*\\s*");
-
- int len = 0; // length of a particular RTF formatting control
- int ref_len = 0; // length of the whole formatting section of a style
- int start = s_clause.match(s, 0, &len);
- if (start < 0)
- {
- err("Style sheet '%s' contains no '\\s' clause.\n{%s}\n", styleName, s);
- return FALSE;
- }
- s += start;
- index = (int)atol(s + 2); ASSERT(index > 0);
-
- // search for the end of pure formatting codes
- const char* end = s + len;
- ref_len = len;
- bool haveNewDefinition = TRUE;
- for(;;)
- {
- if (*end == '{')
- {
- // subgroups are used for \\additive
- if (0 != subgroup.match(end, 0, &len))
- break;
- else
- {
- end += len;
- ref_len += len;
- }
- }
- else if (*end == '\\')
- {
- if (0 == strncmp(end, "\\snext", 6))
- break;
- if (0 == strncmp(end, "\\sbasedon", 9))
- break;
- if (0 != any_clause.match(end, 0, &len))
- break;
- end += len;
- ref_len += len;
- }
- else if (*end == 0)
- { // no style-definition part, keep default value
- haveNewDefinition = FALSE;
- break;
- }
- else // plain name without leading \\snext
- break;
- }
- delete[] reference;
- reference = new char[ref_len + 1];
- memcpy(reference, s, ref_len);
- reference[ref_len] = 0;
- if (haveNewDefinition)
- {
- delete[] definition;
- size_t size = 1 + strlen(end);
- definition = new char[size];
- memcpy(definition, end, size);
- }
- return TRUE;
-}
-
-void loadStylesheet(const char *name, QDict<StyleData>& dict)
-{
- QFile file(name);
- if (!file.open(IO_ReadOnly))
- {
- err("Can't open RTF style sheet file %s. Using defaults.\n",name);
- return;
- }
- msg("Loading RTF style sheet %s...\n",name);
-
- static const QRegExp separator("[ \t]*=[ \t]*");
- uint lineNr=1;
- QTextStream t(&file);
-#if QT_VERSION >= 200
- t.setEncoding(QTextStream::Latin1);
-#endif
-
- while (!t.eof())
- {
- QCString s(4096); // string buffer of max line length
- s = t.readLine().stripWhiteSpace();
- if (s.isEmpty() || s.at(0)=='#') continue; // skip blanks & comments
- int sepLength;
- int sepStart = separator.match(s,0,&sepLength);
- if (sepStart<=0) // no valid assignment statement
- {
- warn(name,lineNr,"Assignment of style sheet name expected!\n");
- continue;
- }
- QCString key=s.left(sepStart);
- if (dict[key]==0) // not a valid style sheet name
- {
- warn(name,lineNr,"Invalid style sheet name %s ignored.\n",key.data());
- continue;
- }
- StyleData* styleData = dict.find(key);
- if (styleData == 0)
- {
- warn(name,lineNr,"Unknown style sheet name %s ignored.\n",key.data());
- continue;
- }
- s+=" "; // add command separator
- styleData->setStyle(s.data() + sepStart + sepLength, key.data());
- lineNr++;
- }
-}
-
-QDict<StyleData> rtf_Style(257);
-
-void loadExtensions(const char *name)
-{
- QFile file(name);
- if (!file.open(IO_ReadOnly))
- {
- err("Can't open RTF extensions file %s. Using defaults.\n",name);
- return;
- }
- msg("Loading RTF extensions %s...\n",name);
-
- static const QRegExp separator("[ \t]*=[ \t]*");
- uint lineNr=1;
- QTextStream t(&file);
-#if QT_VERSION >= 200
- t.setEncoding(QTextStream::Latin1);
-#endif
-
- while (!t.eof())
- {
- QCString s(4096); // string buffer of max line length
- s = t.readLine().stripWhiteSpace();
- if (s.length()==0 || s.at(0)=='#') continue; // skip blanks & comments
- int sepLength;
- int sepStart = separator.match(s,0,&sepLength);
- if (sepStart<=0) // no valid assignment statement
- {
- warn(name,lineNr,"Assignment of extension field expected!\n");
- continue;
- }
- QCString key=s.left(sepStart);
- QCString data=s.data() + sepStart + sepLength;
-
- if (key == "Title") rtf_title = data.data();
- if (key == "Subject") rtf_subject = data.data();
- if (key == "Comments") rtf_comments = data.data();
- if (key == "Company") rtf_company = data.data();
- if (key == "LogoFilename") rtf_logoFilename = data.data();
- if (key == "Author") rtf_author = data.data();
- if (key == "Manager") rtf_manager = data.data();
- if (key == "DocumentType") rtf_documentType = data.data();
- if (key == "DocumentId") rtf_documentId = data.data();
- if (key == "Keywords") rtf_keywords = data.data();
- lineNr++;
- }
-}
-
diff --git a/src/rtfstyle.h b/src/rtfstyle.h
deleted file mode 100644
index 11882ef..0000000
--- a/src/rtfstyle.h
+++ /dev/null
@@ -1,83 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 RTFSTYLE_H
-#define RTFSTYLE_H
-
-#include "qtbc.h"
-#include <qregexp.h>
-#include <qdict.h>
-
-// used for table column width calculation
-const int rtf_pageWidth = 8748;
-
-extern QCString rtf_title;
-extern QCString rtf_subject;
-extern QCString rtf_comments;
-extern QCString rtf_company;
-extern QCString rtf_logoFilename;
-extern QCString rtf_author;
-extern QCString rtf_manager;
-extern QCString rtf_documentType;
-extern QCString rtf_documentId;
-extern QCString rtf_keywords;
-
-struct RTFListItemInfo
-{
- bool isEnum;
- int number;
-};
-
-const int rtf_maxIndentLevels = 10;
-
-extern RTFListItemInfo rtf_listItemInfo[rtf_maxIndentLevels];
-
-struct Rtf_Style_Default
-{
- const char *name;
- const char *reference;
- const char *definition;
-};
-
-extern char rtf_Style_Reset[];
-extern Rtf_Style_Default rtf_Style_Default[];
-
-struct StyleData
-{
- // elements of this type are stored in dictionary Rtf_Style
- //
- // 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; // aditional 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;
-};
-
-extern QDict<StyleData> rtf_Style;
-
-void loadExtensions(const char *name);
-void loadStylesheet(const char *name, QDict<StyleData>& dict);
-
-#endif
diff --git a/src/scanner.h b/src/scanner.h
deleted file mode 100644
index 2c3ac6a..0000000
--- a/src/scanner.h
+++ /dev/null
@@ -1,51 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 SCANNER_H
-#define SCANNER_H
-
-#include "parserintf.h"
-
-/** \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++,
- * such as C, C#, Objective-C, Java, PHP, and IDL.
- */
-class CLanguageScanner : public ParserInterface
-{
- public:
- void parseInput(const char *fileName,
- const char *fileBuf,
- Entry *root);
- bool needsPreprocessing(const QCString &extension);
- void parseCode(CodeOutputInterface &codeOutIntf,
- const char *scopeName,
- const QCString &input,
- bool isExampleBlock,
- const char *exampleName=0,
- FileDef *fileDef=0,
- int startLine=-1,
- int endLine=-1,
- bool inlineFragment=FALSE,
- MemberDef *memberDef=0
- );
- void resetCodeParserState();
- void parsePrototype(const char *text);
-};
-
-#endif
diff --git a/src/scanner.l b/src/scanner.l
deleted file mode 100644
index edb1253..0000000
--- a/src/scanner.l
+++ /dev/null
@@ -1,4653 +0,0 @@
-/*****************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-
-%{
-
-/*
- * includes
- */
-#include <stdio.h>
-#include <stdlib.h>
-#include <assert.h>
-#include <ctype.h>
-
-#include "qtbc.h"
-#include <qarray.h>
-#include <qstack.h>
-#include <qregexp.h>
-#include <unistd.h>
-#include <qfile.h>
-
-#include "scanner.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 "code.h"
-
-#define YY_NEVER_INTERACTIVE 1
-
-/* -----------------------------------------------------------------
- *
- * statics
- */
-static ParserInterface *g_thisParser;
-static const char * inputString;
-static int inputPosition;
-static QFile inputFile;
-static int lastContext;
-static int lastCContext;
-static int lastDocContext;
-static int lastCPPContext;
-static int lastSkipSharpContext;
-static int lastSkipRoundContext;
-static int lastStringContext;
-static int lastCurlyContext;
-static int lastRoundContext;
-static int lastSquareContext;
-//static int lastAfterDocContext;
-static int lastInitializerContext;
-static int lastClassTemplSpecContext;
-static int lastPreLineCtrlContext;
-static int lastSkipVerbStringContext;
-static int lastCommentInArgContext;
-static Protection protection;
-static Protection baseProt;
-static int sharpCount = 0 ;
-static int roundCount = 0 ;
-static int curlyCount = 0 ;
-static int squareCount = 0 ;
-static int padCount = 0 ;
-static QCString slString;
-static Entry* current_root = 0 ;
-static Entry* global_root = 0 ;
-static Entry* current = 0 ;
-static Entry* previous = 0 ;
-static Entry* tempEntry = 0 ;
-static int yyLineNr = 1 ;
-static int anonCount = 0 ;
-static QCString yyFileName;
-static MethodTypes mtype;
-static bool gstat;
-static bool removeSlashes;
-static Specifier virt;
-static Specifier baseVirt;
-static QCString msType,msName,msArgs;
-//static int memberGroupId = DOX_NOGROUP;
-//static QCString memberGroupHeader;
-//static QCString memberGroupDocs;
-static bool isTypedef;
-static int tmpDocType;
-static QCString sectionLabel;
-static QCString sectionTitle;
-static QCString funcPtrType;
-static QCString templateStr;
-static QCString aliasName;
-static QCString baseName;
-static QCString* specName;
-static QCString formulaText;
-static QCString formulaEnd;
-static bool useOverrideCommands = FALSE;
-static bool insideIDL = FALSE; //!< processing IDL code?
-static bool insideJava = FALSE; //!< processing Java code?
-static bool insideCS = FALSE; //!< processing C# code?
-static bool insideD = FALSE; //!< processing D code?
-static bool insidePHP = FALSE; //!< processing PHP code?
-static bool insideCppQuote = FALSE;
-static bool insideObjC = FALSE; //!< processing Objective C code?
-static bool insideProtocolList = FALSE;
-
-static int argRoundCount;
-static int argSharpCount;
-static int currentArgumentContext;
-static int lastCopyArgStringContext;
-static int lastCopyArgContext;
-static QCString *copyArgString;
-static QCString fullArgString;
-
-static ArgumentList *currentArgumentList;
-static char lastCopyArgChar;
-static QCString *pCopyRoundString;
-static QCString *pCopyCurlyString;
-static QCString *pCopyQuotedString;
-static QCString *pSkipVerbString;
-static QStack<Grouping> autoGroupStack;
-
-static bool insideFormula;
-static bool insideTryBlock=FALSE;
-static bool insideCode;
-static bool needsSemi;
-
-static int depthIf;
-static int initBracketCount;
-static QCString memberGroupRelates;
-static QCString memberGroupInside;
-static QCString xrefItemKey;
-static QCString xrefItemTitle;
-static QCString xrefListTitle;
-
-static QCString g_skipBlockName;
-static QCString oldStyleArgType;
-static QCString docBackup;
-static QCString briefBackup;
-static bool g_inputFromFile;
-
-static int docBlockContext;
-static QCString docBlock;
-static QCString docBlockName;
-static bool docBlockInBody;
-static bool docBlockJavaStyle;
-static char docBlockTerm;
-
-
-//-----------------------------------------------------------------------------
-
-// forward declarations
-//static void handleGroupStartCommand(const char *header);
-//static void handleGroupEndCommand();
-
-//-----------------------------------------------------------------------------
-
-static void initParser()
-{
- sectionLabel.resize(0);
- sectionTitle.resize(0);
- baseName.resize(0);
- formulaText.resize(0);
- protection = Public;
- baseProt = Public;
- sharpCount = 0;
- roundCount = 0;
- curlyCount = 0;
- //memberGroupId = DOX_NOGROUP;
- //memberGroupRelates.resize(0);
- //memberGroupInside.resize(0);
- mtype = Method;
- gstat = FALSE;
- virt = Normal;
- baseVirt = Normal;
- isTypedef = FALSE;
- autoGroupStack.clear();
- insideTryBlock = FALSE;
- autoGroupStack.setAutoDelete(TRUE);
- insideFormula = FALSE;
- insideCode=FALSE;
- previous = 0;
-}
-
-static void initEntry()
-{
- if (insideJava)
- {
- protection = current_root->section==Entry::INTERFACE_SEC ? Public : Package;
- }
- current->protection = protection ;
- current->mtype = mtype;
- current->virt = virt;
- current->stat = gstat;
- //current->mGrpId = memberGroupId;
- //current->relates = memberGroupRelates;
- //current->inside = memberGroupInside;
- current->objc = insideObjC;
- //if (!autoGroupStack.isEmpty())
- //{
- // //printf("Appending group %s\n",autoGroupStack.top()->groupname.data());
- // current->groups->append(new Grouping(*autoGroupStack.top()));
- //}
- initGroupInfo(current);
-}
-
-
-//-----------------------------------------------------------------------------
-
-///// remove any automatic grouping and add new one (if given)
-//static void setCurrentGroup( QCString *newgroup, Grouping::GroupPri_t pri )
-//{
-// /* remove auto group name from current entry and discard it */
-// Grouping *g = current->groups->first();
-// int i=0;
-// while (g)
-// {
-// if (g->pri <= Grouping::GROUPING_AUTO_DEF)
-// {
-// current->groups->remove(i);
-// i--;
-// }
-// g=current->groups->next();
-// i++;
-// }
-//
-// /* use new group name instead? */
-// if ( newgroup )
-// {
-// current->groups->append(new Grouping(*newgroup, pri));
-// }
-//}
-//
-//static int newMemberGroupId()
-//{
-// static int curGroupId=0;
-// return curGroupId++;
-//}
-//
-// forward declarations
-//static void startGroupInDoc();
-//static void endGroup();
-
-//-----------------------------------------------------------------------------
-
-static void lineCount()
-{
- for( const char* c = yytext ; *c ; ++c )
- yyLineNr += (*c == '\n') ;
-}
-
-static void addType( Entry* current )
-{
- uint tl=current->type.length();
- if( tl>0 && !current->name.isEmpty() && current->type.at(tl-1)!='.')
- {
- current->type += ' ' ;
- }
- current->type += current->name ;
- current->name.resize(0) ;
- tl=current->type.length();
- if( tl>0 && !current->args.isEmpty() && current->type.at(tl-1)!='.')
- {
- current->type += ' ' ;
- }
- current->type += current->args ;
- current->args.resize(0) ;
- current->argList->clear();
-}
-
-
-static QCString stripQuotes(const char *s)
-{
- QCString name;
- if (s==0 || *s==0) return name;
- name=s;
- if (name.at(0)=='"' && name.at(name.length()-1)=='"')
- {
- name=name.mid(1,name.length()-2);
- }
- return name;
-}
-
-//-----------------------------------------------------------------
-
-static void startCommentBlock(bool);
-static void handleCommentBlock(const QCString &doc,bool brief);
-//-----------------------------------------------------------------
-
-static bool nameIsOperator(QCString &name)
-{
- int i=name.find("operator");
- if (i==-1) return FALSE;
- if (i==0 && !isId(name.at(8))) return TRUE; // case operator ::X
- if (i>0 && !isId(name.at(i-1)) && !isId(name.at(i+8))) return TRUE; // case X::operator
- return FALSE; // case TEXToperatorTEXT
-}
-
-//-----------------------------------------------------------------------------
-
-static void setContext()
-{
- QCString fileName = yyFileName;
- insideIDL = fileName.right(4)==".idl" || fileName.right(5)==".pidl" ||
- fileName.right(4)==".odl";
- insideJava = fileName.right(5)==".java" || fileName.right(3)==".as";
- insideCS = fileName.right(3)==".cs"; // for normal keywords add colon
- insideD = fileName.right(2)==".d"; // for normal keywords add colon
- insidePHP = fileName.right(4)==".php" || fileName.right(5)==".php4" ||
- fileName.right(4)==".inc" || fileName.right(6)==".phtml";
- insideObjC = fileName.right(2)==".m" || fileName.right(2)==".M" ||
- fileName.right(3)==".mm";
- if ( insidePHP )
- {
- useOverrideCommands = TRUE;
- }
- //printf("setContext(%s) insideIDL=%d insideJava=%d insideCS=%d "
- // "insideD=%d insidePHP=%d insideObjC=%d\n",
- // yyFileName.data(),insideIDL,insideJava,insideCS,insideD,insidePHP,insideObjC
- // );
-}
-
-//-----------------------------------------------------------------------------
-
-static void prependScope()
-{
- if (current_root->section & Entry::SCOPE_MASK)
- {
- //printf("--- prependScope %s to %s\n",current_root->name.data(),current->name.data());
- current->name.prepend(current_root->name+"::");
- if (current_root->tArgLists)
- {
- if (current->tArgLists==0)
- {
- current->tArgLists = new QList<ArgumentList>;
- current->tArgLists->setAutoDelete(TRUE);
- }
- //printf("prependScope #=%d #current=%d\n",current_root->tArgLists->count(),current->tArgLists->count());
- QListIterator<ArgumentList> talsi(*current_root->tArgLists);
- ArgumentList *srcAl=0;
- for (talsi.toLast();(srcAl=talsi.current());--talsi)
- {
- ArgumentList *dstAl = new ArgumentList;
- dstAl->setAutoDelete(TRUE);
- QListIterator<Argument> tali(*srcAl);
- Argument *a;
- for (;(a=tali.current());++tali)
- {
- dstAl->append(new Argument(*a));
- //printf("appending argument %s %s\n",a->type.data(),a->name.data());
- }
- current->tArgLists->insert(0,dstAl);
- }
- }
- }
-}
-
-//-----------------------------------------------------------------------------
-
-/*! Returns TRUE iff the current entry could be a K&R style C function */
-static bool checkForKnRstyleC()
-{
- if (((QCString)yyFileName).right(2).lower()!=".c") return FALSE; // must be a C file
- if (!current->argList) return FALSE;
- ArgumentListIterator ali(*current->argList);
- Argument *a;
- for (ali.toFirst();(a=ali.current());++ali)
- {
- // in K&R style argument do not have a type, but doxygen expects a type
- // so it will think the argument has no name
- if (a->type.isEmpty() || !a->name.isEmpty()) return FALSE;
- }
- return TRUE;
-}
-
-//-----------------------------------------------------------------------------
-
-static void splitKnRArg(QCString &oldStyleArgPtr,QCString &oldStyleArgName)
-{
- int si = current->args.length();
- if (oldStyleArgType.isEmpty()) // new argument
- {
- static QRegExp re("([^)]*)");
- int bi1 = current->args.findRev(re);
- int bi2 = bi1!=-1 ? current->args.findRev(re,bi1-1) : -1;
- char c;
- if (bi1!=-1 && bi2!=-1) // found something like "int (*func)(int arg)"
- {
- int s=bi2+1;
- oldStyleArgType = current->args.left(s);
- int i=s;
- while (i<si && ((c=current->args.at(i))=='*' || isspace((uchar)c))) i++;
- oldStyleArgType += current->args.mid(s,i-s);
- s=i;
- while (i<si && isId(current->args.at(i))) i++;
- oldStyleArgName = current->args.mid(s,i-s);
- oldStyleArgType+=current->args.mid(i);
- }
- else if (bi1!=-1) // redundant braces like in "int (*var)"
- {
- int s=bi1;
- oldStyleArgType = current->args.left(s);
- s++;
- int i=s+1;
- while (i<si && ((c=current->args.at(i))=='*' || isspace((uchar)c))) i++;
- oldStyleArgType += current->args.mid(s,i-s);
- s=i;
- while (i<si && isId(current->args.at(i))) i++;
- oldStyleArgName = current->args.mid(s,i-s);
- }
- 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(current->args.at(i))) i--;
- j=i+1;
- // look for start of *'s
- while (i>=0 && ((c=current->args.at(i))=='*' || isspace((uchar)c))) i--;
- i++;
- if (i!=l)
- {
- oldStyleArgType=current->args.left(i);
- oldStyleArgPtr=current->args.mid(i,j-i);
- oldStyleArgName=current->args.mid(j).stripWhiteSpace();
- }
- else
- {
- oldStyleArgName=current->args.copy().stripWhiteSpace();
- }
- }
- }
- else // continuation like *arg2 in "int *args,*arg2"
- {
- int l=si,j=0;
- char c;
- while (j<l && ((c=current->args.at(j))=='*' || isspace((uchar)c))) j++;
- if (j>0)
- {
- oldStyleArgPtr=current->args.left(j);
- oldStyleArgName=current->args.mid(j).stripWhiteSpace();
- }
- else
- {
- oldStyleArgName=current->args.copy().stripWhiteSpace();
- }
- }
- //fprintf(stderr,"type=%s ptr=%s name=%s\n",oldStyleArgType.data(),oldStyleArgPtr.data(),oldStyleArgName.data());
-}
-
-//-----------------------------------------------------------------------------
-
-/*! Update the argument \a name with additional \a type info. For K&R style
- * function the type is found \e after the argument list, so this routine
- * in needed to fix up.
- */
-static void addKnRArgInfo(const QCString &type,const QCString &name,
- const QCString &brief,const QCString &docs)
-{
- if (current->argList==0) return;
- ArgumentListIterator ali(*current->argList);
- Argument *a;
- for (ali.toFirst();(a=ali.current());++ali)
- {
- if (a->type==name)
- {
- a->type=type.stripWhiteSpace();
- if (a->type.left(9)=="register ") // strip keyword
- {
- a->type=a->type.mid(9);
- }
- a->name=name.stripWhiteSpace();
- if (!brief.isEmpty() && !docs.isEmpty())
- {
- a->docs=brief+"\n\n"+docs;
- }
- else if (!brief.isEmpty())
- {
- a->docs=brief;
- }
- else
- {
- a->docs=docs;
- }
- }
- }
-}
-
-//-----------------------------------------------------------------------------
-/* ----------------------------------------------------------------- */
-#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;
- if (g_inputFromFile)
- {
- c = inputFile.readBlock(buf,max_size);
- if (c==-1) yy_fatal_error("input in flex scanner failed");
- }
- else
- {
- while( c < max_size && inputString[inputPosition] )
- {
- *buf = inputString[inputPosition++] ;
- //printf("%d (%c)\n",*buf,*buf);
- c++; buf++;
- }
- }
- return c;
-}
-
-%}
-
- /* start command character */
-CMD ("\\"|"@")
-SECTIONCMD {CMD}("image"|"author"|"internal"|"version"|"date"|"deprecated"|"param"|"exception"|"return"[s]?|"retval"|"bug"|"warning"|"par"|"sa"|"see"|"pre"|"post"|"invariant"|"note"|"remark"[s]?|"todo"|"test"|"xrefitem"|"ingroup"|"callgraph"|"latexonly"|"htmlonly"|"xmlonly"|"{"|"verbatim"|"dotfile"|"dot"|"defgroup"|"addtogroup"|"weakgroup"|"class"|"namespace"|"union"|"struct"|"fn"|"var"|"details"|"typedef"|"def"|"overload")|("<"{PRE}">")
-BN [ \t\n\r]
-BL [ \t\r]*"\n"
-B [ \t]
-BS ^(({B}*"//")?)(({B}*"*"+)?){B}*
-FILESCHAR [a-z_A-Z0-9\\:\\\/\-\+]
-FILEECHAR [a-z_A-Z0-9\-\+]
-FILE ({FILESCHAR}*{FILEECHAR}+("."{FILESCHAR}*{FILEECHAR}+)*)|("\""[^\n\"]+"\"")
-ID "$"?[a-z_A-Z][a-z_A-Z0-9]*
-LABELID [a-z_A-Z][a-z_A-Z0-9\-]*
-SCOPEID {ID}({ID}*{BN}*"::"{BN}*)*({ID}?)
-SCOPENAME "$"?(({ID}?{BN}*"::"{BN}*)*)((~{BN}*)?{ID})
-TSCOPE {ID}("<"[a-z_A-Z0-9 \t\*\&]*">")?
-CSSCOPENAME (({ID}?{BN}*"."{BN}*)*)((~{BN}*)?{ID})
-ATTR ({B}+[^>\n]*)?
-A [aA]
-BR [bB][rR]
-PRE [pP][rR][eE]
-TABLE [tT][aA][bB][lL][eE]
-P [pP]
-UL [uU][lL]
-OL [oO][lL]
-DL [dD][lL]
-TITLE [tT][iI][tT][lL][eE]
-CHARLIT (("'"\\[0-7]{1,3}"'")|("'"\\."'")|("'"[^' \\\n]{1,4}"'"))
-PHPKW ("require"|"require_once"|"include"|"include_once"|"echo")[^a-zA-Z0-9_;]
-IDLATTR ("["[^\]]*"]"){BN}*
-
-%option noyywrap
-
- /* language parsing states */
-
-%x Define
-%x DefineEnd
-%x CompoundName
-%x ClassVar
-%x ClassCategory
-%x ClassTemplSpec
-%x Bases
-%x BasesProt
-%x NextSemi
-%x BitFields
-%x FindMembers
-%x FindMembersPHP
-%x FindMemberName
-%x FindFields
-%x FindFieldArg
-%x Function
-%x FuncRound
-%x ExcpRound
-%x ExcpList
-%x FuncQual
-%x Operator
-%x Array
-%x ReadBody
-%x ReadNSBody
-%x ReadBodyIntf
-%x Using
-%x UsingDirective
-%x SkipCurly
-%x SkipCurlyCpp
-%x SkipCurlyEndDoc
-%x SkipString
-%x SkipPHPString
-%x SkipInits
-%x SkipCPP
-%x SkipCPPBlock
-%x SkipComment
-%x SkipCxxComment
-%x SkipCurlyBlock
-%x SkipRoundBlock
-%x Sharp
-%x SkipSharp
-%x SkipRound
-%x SkipSquare
-%x TypedefName
-%x TryFunctionBlock
-%x TryFunctionBlockEnd
-%x Comment
-%x PackageName
-%x JavaImport
-%x CSAccessorDecl
-%x PreLineCtrl
-%x DefinePHP
-%x DefinePHPEnd
-%x OldStyleArgs
-%x SkipVerbString
-%x ObjCMethod
-%x ObjCReturnType
-%x ObjCParams
-%x ObjCParamType
-%x ObjCProtocolList
-%x QtPropType
-%x QtPropName
-%x QtPropAttr
-%x QtPropRead
-%x QtPropWrite
-%x ReadInitializer
-%x GetCallType
-%x CppQuote
-%x EndCppQuote
-%x MemberSpec
-%x MemberSpecSkip
-%x EndTemplate
-%x FuncPtr
-%x EndFuncPtr
-%x ReadFuncArgType
-%x ReadTempArgs
-%x IDLUnionCase
-%x NSAliasName
-%x NSAliasArg
-%x CopyString
-%x CopyPHPString
-%x CopyRound
-%x CopyCurly
-%x SkipUnionSwitch
-%x Specialization
-%x FuncPtrInit
-%x FuncFunc
-%x FuncFuncEnd
-%x FuncFuncType
-%x CopyArgString
-%x CopyArgPHPString
-%x CopyArgRound
-%x CopyArgSharp
-%x CopyArgComment
-%x CopyArgCommentLine
-
- /** Prototype scanner states */
-
-%x Prototype
-%x PrototypePtr
-%x PrototypeQual
-%x PrototypeExc
-%x PrototypeSkipLine
-
- /** comment parsing states */
-
-%x DocLine
-%x DocBlock
-%x DocCopyBlock
-
-%%
-
-<NextSemi>"{" {
- curlyCount=0;
- needsSemi = TRUE;
- BEGIN(SkipCurlyBlock);
- }
-<NextSemi>"(" {
- roundCount=0;
- BEGIN(SkipRoundBlock);
- }
-<SkipRoundBlock>"(" {
- ++roundCount;
- }
-<SkipRoundBlock>")" {
- if (roundCount )
- --roundCount ;
- else
- BEGIN( NextSemi ) ;
- }
-<SkipCurlyBlock>"{" {
- ++curlyCount ;
- }
-<SkipCurlyBlock>"}" {
- if( curlyCount )
- {
- --curlyCount ;
- }
- else if (needsSemi)
- {
- BEGIN( NextSemi );
- }
- else
- {
- BEGIN( FindMembers );
- }
- }
-<NextSemi>\' {
- if (insidePHP)
- {
- lastStringContext=NextSemi;
- BEGIN(SkipPHPString);
- }
- }
-<NextSemi>{CHARLIT} { if (insidePHP) REJECT; }
-<NextSemi>\" {
- lastStringContext=NextSemi;
- BEGIN(SkipString);
- }
-<NextSemi>[;,] {
- unput(*yytext);
- BEGIN( FindMembers );
- }
-<BitFields>[;,] {
- unput(*yytext);
- BEGIN( FindMembers );
- }
-<FindMembersPHP>"<?"("php"?) { // PHP code start
- BEGIN( FindMembers );
- }
-<FindMembersPHP>[^\n<]+ { // Non-PHP code text, ignore
- }
-<FindMembersPHP>\n { // Non-PHP code text, ignore
- yyLineNr++;
- }
-<FindMembersPHP>. { // Non-PHP code text, ignore
- }
-<FindMembers>"?>" { // PHP code end
- if (insidePHP)
- BEGIN( FindMembersPHP );
- else
- REJECT;
- }
-
-<FindMembers>{PHPKW} { if (insidePHP)
- BEGIN( NextSemi );
- else
- REJECT;
- }
-<FindMembers>{B}*("properties"){BN}*":"{BN}* { // IDL or Borland C++ builder property
- current->mtype = mtype = Property;
- current->protection = protection = Public ;
- current->type.resize(0);
- current->name.resize(0);
- current->args.resize(0);
- current->argList->clear();
- lineCount() ;
- }
-
-<FindMembers>{B}*"k_dcop"{BN}*":"{BN}* { current->mtype = mtype = DCOP;
- current->protection = protection = Public ;
- current->type.resize(0);
- current->name.resize(0);
- current->args.resize(0);
- current->argList->clear();
- lineCount() ;
- }
-
-<FindMembers>{B}*"signals"{BN}*":"{BN}* { current->mtype = mtype = Signal;
- current->protection = protection = Public ;
- current->type.resize(0);
- current->name.resize(0);
- current->args.resize(0);
- current->argList->clear();
- lineCount() ;
- }
-
-<FindMembers>{B}*"public"{BN}*"slots"{BN}*":"{BN}* {
- current->protection = protection = Public ;
- current->mtype = mtype = Slot;
- current->type.resize(0);
- current->name.resize(0);
- current->args.resize(0);
- current->argList->clear();
- lineCount();
- }
-
-<FindMembers>{B}*"protected"{BN}*"slots"{BN}*":"{BN}* {
- current->protection = protection = Protected ;
- current->mtype = mtype = Slot;
- current->type.resize(0);
- current->name.resize(0);
- current->args.resize(0);
- current->argList->clear();
- lineCount();
- }
-
-<FindMembers>{B}*"private"{BN}*"slots"{BN}*":"{BN}* {
- current->protection = protection = Private ;
- current->mtype = mtype = Slot;
- current->type.resize(0);
- current->name.resize(0);
- current->args.resize(0);
- current->argList->clear();
- lineCount();
- }
-<FindMembers>{B}*("public"|"methods"|"__published"){BN}*":"{BN}* {
- current->protection = protection = Public ;
- current->mtype = mtype = Method;
- current->type.resize(0);
- current->name.resize(0);
- current->args.resize(0);
- current->argList->clear();
- lineCount() ;
- }
-<FindMembers>{B}*"protected"{BN}*":"{BN}* {
- current->protection = protection = Protected ;
- current->mtype = mtype = Method;
- current->type.resize(0);
- current->name.resize(0);
- current->args.resize(0);
- current->argList->clear();
- lineCount() ;
- }
-<FindMembers>{B}*"private"{BN}*":"{BN}* {
- current->protection = protection = Private ;
- current->mtype = mtype = Method;
- current->type.resize(0);
- current->name.resize(0);
- current->args.resize(0);
- current->argList->clear();
- lineCount() ;
- }
-<FindMembers>{B}*"@private"{BN}+ {
- current->protection = protection = Private ;
- current->mtype = mtype = Method;
- current->type.resize(0);
- current->name.resize(0);
- current->args.resize(0);
- current->argList->clear();
- lineCount() ;
- }
-<FindMembers>{B}*"@protected"{BN}+ {
- current->protection = protection = Protected ;
- current->mtype = mtype = Method;
- current->type.resize(0);
- current->name.resize(0);
- current->args.resize(0);
- current->argList->clear();
- lineCount() ;
- }
-<FindMembers>{B}*"@public"{BN}+ {
- current->protection = protection = Public ;
- current->mtype = mtype = Method;
- current->type.resize(0);
- current->name.resize(0);
- current->args.resize(0);
- current->argList->clear();
- lineCount() ;
- }
-<FindMembers>[\-+]{BN}* {
- if (!insideObjC)
- {
- REJECT;
- }
- else
- {
- lineCount();
- current->fileName = yyFileName;
- current->startLine = yyLineNr;
- current->bodyLine = yyLineNr;
- current->section = Entry::FUNCTION_SEC;
- current->protection = protection = Public ;
- current->objc = TRUE;
- current->virt = Virtual;
- current->stat=yytext[0]=='+';
- current->mtype = mtype = Method;
- current->type.resize(0);
- current->name.resize(0);
- current->args.resize(0);
- current->argList->clear();
- BEGIN( ObjCMethod );
- }
- }
-<ObjCMethod>"(" { // start of method's return type
- BEGIN( ObjCReturnType );
- }
-<ObjCMethod>{ID} { // found method name
- if (current->type.isEmpty())
- {
- current->type = "id";
- }
- current->name = yytext;
- }
-<ObjCMethod>":"{B}* { // start of parameter list
- current->name += ':';
- Argument *a = new Argument;
- current->argList->append(a);
- BEGIN( ObjCParams );
- }
-<ObjCReturnType>[^)]* { // TODO: check if nested braches are possible.
- current->type = yytext;
- }
-<ObjCReturnType>")" {
- BEGIN( ObjCMethod );
- }
-<ObjCParams>({ID})?":" { // Keyword of parameter
- QCString keyw = yytext;
- keyw=keyw.left(keyw.length()-1); // strip :
- if (keyw.isEmpty())
- {
- current->name += " :";
- }
- else
- {
- current->name += keyw+":";
- }
- if (current->argList->getLast()->type.isEmpty())
- {
- current->argList->getLast()->type="id";
- }
- Argument *a = new Argument;
- a->attrib=(QCString)"["+keyw+"]";
- current->argList->append(a);
- }
-<ObjCParams>{ID}{BN}* { // name of parameter
- lineCount();
- current->argList->getLast()->name=QCString(yytext).stripWhiteSpace();
- }
-<ObjCParams>","{BN}*"..." { // name of parameter
- lineCount();
- // do we want the comma as part of the name?
- //current->name += ",";
- Argument *a = new Argument;
- a->attrib="[,]";
- a->type="...";
- current->argList->append(a);
- }
- /*
-<ObjCParams>":" {
- current->name += ':';
- }
- */
-<ObjCParams>"(" {
- BEGIN( ObjCParamType );
- }
-<ObjCParamType>[^)]* {
- current->argList->getLast()->type=QCString(yytext).stripWhiteSpace();
- }
-<ObjCParamType>")"/{B}* {
- BEGIN( ObjCParams );
- }
-<ObjCMethod,ObjCParams>";" { // end of method declaration
- if (current->argList->getLast() && current->argList->getLast()->type.isEmpty())
- {
- current->argList->getLast()->type="id";
- }
- current->args = argListToString(current->argList);
- //printf("argList=%s\n",current->args.data());
- unput(';');
- BEGIN( Function );
- }
-<ObjCMethod,ObjCParams>(";"{BN}+)?"{" { // start of a method body
- lineCount();
- //printf("Type=%s Name=%s args=%s\n",
- // current->type.data(),current->name.data(),argListToString(current->argList).data()
- // );
- if (current->argList->getLast() && current->argList->getLast()->type.isEmpty())
- {
- current->argList->getLast()->type="id";
- }
- current->args = argListToString(current->argList);
- unput('{');
- BEGIN( Function );
- }
-<FindMembers>{BN}{1,80} {
- lineCount();
- }
-<PackageName>{ID}("."{ID})* {
- isTypedef=FALSE;
- current->name = yytext;
- current->name = substitute(current->name,".","::");
- current->section = Entry::NAMESPACE_SEC;
- current->type = "namespace" ;
- current->fileName = yyFileName;
- current->startLine = yyLineNr;
- current->bodyLine = yyLineNr;
- lineCount();
- curlyCount=0;
- current_root->addSubEntry(current);
- current_root = current ;
- current = new Entry ;
- initEntry();
- BEGIN( FindMembers ) ;
- }
-<PackageName>";" {
- BEGIN(FindMembers);
- }
-<FindMembers>{B}*"static"{BN}+ { current->type += " static ";
- current->stat = TRUE;
- lineCount();
- }
-<FindMembers>{B}*"extern"{BN}+ {
- current->stat = FALSE;
- current->explicitExternal = TRUE;
- lineCount();
- }
-<FindMembers>{B}*"virtual"{BN}+ { current->type += " virtual ";
- current->virt = Virtual;
- lineCount();
- }
-<FindMembers>{B}*"abstract"{BN}+ {
- if (!insidePHP)
- {
- current->type += " abstract ";
- current->virt = Pure;
- }
- else
- {
- current->memSpec|=Entry::Abstract;
- }
- lineCount();
- }
-<FindMembers>{B}*"inline"{BN}+ { current->memSpec|=Entry::Inline;
- lineCount();
- }
-<FindMembers>{B}*"mutable"{BN}+ { current->memSpec|=Entry::Mutable;
- lineCount();
- }
-<FindMembers>{B}*"explicit"{BN}+ { current->memSpec|=Entry::Explicit;
- lineCount();
- }
- /*
-<FindMembers>{B}*"import"{BN}+ { // IDL import keyword
- BEGIN( NextSemi );
- }
- */
-<FindMembers>{B}*"typename"{BN}+ { lineCount(); }
-<FindMembers>{B}*"namespace"{BN}*/[^a-z_A-Z0-9] {
- isTypedef=FALSE;
- current->section = Entry::NAMESPACE_SEC;
- current->type = "namespace" ;
- current->fileName = yyFileName;
- current->startLine = yyLineNr;
- current->bodyLine = yyLineNr;
- lineCount();
- BEGIN( CompoundName );
- }
-<FindMembers>{B}*"module"{BN}+ {
- lineCount();
- if (insideIDL)
- {
- isTypedef=FALSE;
- current->section = Entry::NAMESPACE_SEC;
- current->type = "module" ;
- current->fileName = yyFileName;
- current->startLine = yyLineNr;
- current->bodyLine = yyLineNr;
- BEGIN( CompoundName );
- }
- else if (insideD)
- {
- lineCount();
- BEGIN(PackageName);
- }
- else
- {
- addType( current ) ;
- current->name = QCString(yytext).stripWhiteSpace();
- }
- }
-<FindMembers>{B}*"library"{BN}+ {
- lineCount();
- if (insideIDL)
- {
- isTypedef=FALSE;
- current->section = Entry::NAMESPACE_SEC;
- current->type = "library" ;
- current->fileName = yyFileName;
- current->startLine = yyLineNr;
- current->bodyLine = yyLineNr;
- BEGIN( CompoundName );
- }
- else
- {
- addType( current ) ;
- current->name = QCString(yytext).stripWhiteSpace();
- }
- }
-<FindMembers>{B}*((("disp")?"interface")|"valuetype"){BN}+ { // M$/Corba IDL interface
- lineCount();
- if (insideIDL || insideJava || insideCS || insideD || insidePHP)
- {
- isTypedef=FALSE;
- current->section = Entry::INTERFACE_SEC;
- addType( current ) ;
- current->type += " interface" ;
- current->fileName = yyFileName;
- current->startLine = yyLineNr;
- current->bodyLine = yyLineNr;
- BEGIN( CompoundName );
- }
- else
- {
- addType( current ) ;
- current->name = QCString(yytext).stripWhiteSpace();
- }
- }
-<FindMembers>{B}*"@implementation"{BN}+ { // Objective-C class implementation
- lineCount();
- isTypedef=FALSE;
- current->section = Entry::OBJCIMPL_SEC;
- current->objc = insideObjC = TRUE;
- current->protection = protection = Public ;
- addType( current ) ;
- current->type += " implementation" ;
- current->fileName = yyFileName;
- current->startLine = yyLineNr;
- current->bodyLine = yyLineNr;
- BEGIN( CompoundName );
- }
-<FindMembers>{B}*"@interface"{BN}+ { // Objective-C class interface
- lineCount();
- isTypedef=FALSE;
- current->section = Entry::INTERFACE_SEC;
- current->objc = insideObjC = TRUE;
- current->protection = protection = Public ;
- addType( current ) ;
- current->type += " interface" ;
- current->fileName = yyFileName;
- current->startLine = yyLineNr;
- current->bodyLine = yyLineNr;
- BEGIN( CompoundName );
- }
-<FindMembers>{B}*"@protocol"{BN}+ { // Objective-C protocol definition
- lineCount();
- isTypedef=FALSE;
- current->section = Entry::PROTOCOL_SEC;
- current->objc = insideObjC = TRUE;
- current->protection = protection = Public ;
- addType( current ) ;
- current->type += " protocol" ;
- current->fileName = yyFileName;
- current->startLine = yyLineNr;
- current->bodyLine = yyLineNr;
- BEGIN( CompoundName );
- }
-<FindMembers>{B}*"exception"{BN}+ { // Corba IDL exception
- isTypedef=FALSE;
- current->section = Entry::EXCEPTION_SEC;
- addType( current ) ;
- current->type += " exception" ;
- current->fileName = yyFileName;
- current->startLine = yyLineNr;
- current->bodyLine = yyLineNr;
- lineCount();
- BEGIN( CompoundName );
- }
-<FindMembers>"@class" | // for Objective C class declarations
-<FindMembers>{B}*(("typedef"{BN}+)?)("volatile"{BN}+)?"class{" |
-<FindMembers>{B}*(("typedef"{BN}+)?)("volatile"{BN}+)?"class"{BN}+ {
- isTypedef=((QCString)yytext).find("typedef")!=-1;
- current->section = Entry::CLASS_SEC;
- addType( current ) ;
- current->type += " class" ;
- current->fileName = yyFileName;
- current->startLine = yyLineNr;
- current->bodyLine = yyLineNr;
- lineCount() ;
- if (yytext[yyleng-1]=='{') unput('{');
- BEGIN( CompoundName ) ;
- }
-<FindMembers>{B}*"coclass"{BN}+ {
- if (insideIDL)
- {
- isTypedef=FALSE;
- current->section = Entry::CLASS_SEC;
- addType( current ) ;
- current->type += " coclass" ;
- current->fileName = yyFileName;
- current->startLine = yyLineNr;
- current->bodyLine = yyLineNr;
- lineCount() ;
- BEGIN( CompoundName ) ;
- }
- else
- {
- addType(current);
- current->name = yytext;
- current->name = current->name.stripWhiteSpace();
- lineCount();
- }
- }
-<FindMembers>{B}*(("typedef"{BN}+)?)("volatile"{BN}+)?"struct{" |
-<FindMembers>{B}*(("typedef"{BN}+)?)("volatile"{BN}+)?"struct"/{BN}+ {
- isTypedef=((QCString)yytext).find("typedef")!=-1;
- current->section = Entry::STRUCT_SEC ;
- addType( current ) ;
- current->type += " struct" ;
- current->fileName = yyFileName;
- current->startLine = yyLineNr;
- current->bodyLine = yyLineNr;
- lineCount() ;
- if (yytext[yyleng-1]=='{') unput('{');
- BEGIN( CompoundName ) ;
- }
-<FindMembers>{B}*(("typedef"{BN}+)?)("volatile"{BN}+)?"union{" |
-<FindMembers>{B}*(("typedef"{BN}+)?)("volatile"{BN}+)?"union"{BN}+ {
- isTypedef=((QCString)yytext).find("typedef")!=-1;
- current->section = Entry::UNION_SEC ;
- addType( current ) ;
- current->type += " union" ;
- current->fileName = yyFileName;
- current->startLine = yyLineNr;
- current->bodyLine = yyLineNr;
- lineCount() ;
- if (yytext[yyleng-1]=='{') unput('{');
- BEGIN( CompoundName ) ;
- }
-<FindMembers>{B}*(("typedef"{BN}+)?){IDLATTR}?"enum{" |
-<FindMembers>{B}*(("typedef"{BN}+)?){IDLATTR}?"enum"{BN}+ { // for IDL: typedef [something] enum
- isTypedef=((QCString)yytext).find("typedef")!=-1;
- current->section = Entry::ENUM_SEC ;
- addType( current ) ;
- current->type += " enum" ;
- current->fileName = yyFileName;
- current->startLine = yyLineNr;
- current->bodyLine = yyLineNr;
- lineCount() ;
- if (yytext[yyleng-1]=='{') unput('{');
- BEGIN( CompoundName ) ;
- }
-<Operator>"("{BN}*")"({BN}*"<"[^>]*">"){BN}*/"(" { // A::operator()<int>(int arg)
- lineCount();
- current->name += "()";
- BEGIN( FindMembers );
- }
-<Operator>"("{BN}*")"{BN}*/"(" {
- lineCount();
- current->name += yytext ;
- current->name = current->name.simplifyWhiteSpace();
- BEGIN( FindMembers ) ;
- }
-<Operator>";" { // can occur when importing members
- unput(';');
- BEGIN( FindMembers ) ;
- }
-<Operator>[^(] {
- lineCount();
- current->name += *yytext ;
- }
-<Operator>"<>" { /* skip guided templ specifiers */ }
-<Operator>"(" {
- current->name = current->name.simplifyWhiteSpace();
- unput(*yytext);
- BEGIN( FindMembers ) ;
- }
-<FindMembers>"template"({BN}*)"<"/[>]? {
- lineCount();
- if (current->tArgLists==0)
- {
- current->tArgLists = new QList<ArgumentList>;
- current->tArgLists->setAutoDelete(TRUE);
- }
- ArgumentList *al = new ArgumentList;
- al->setAutoDelete(TRUE);
- current->tArgLists->append(al);
- currentArgumentList = al;
- templateStr="<";
- fullArgString = templateStr.copy();
- copyArgString = &templateStr;
- currentArgumentContext = FindMembers;
- BEGIN( ReadTempArgs );
- }
-<FindMembers>"namespace"{BN}+/{ID}{BN}*"=" { // namespace alias
- lineCount();
- BEGIN( NSAliasName );
- }
-<NSAliasName>{ID} {
- aliasName = yytext;
- BEGIN( NSAliasArg );
- }
-<NSAliasArg>({ID}"::")*{ID} {
- //printf("Inserting namespace alias %s::%s->%s\n",current_root->name.data(),aliasName.data(),yytext);
- //if (current_root->name.isEmpty())
- //{
- // TODO: namespace aliases are now treated as global entities
- // while they should be aware of the scope they are in
- Doxygen::namespaceAliasDict.insert(aliasName,new QCString(yytext));
- //}
- //else
- //{
- // Doxygen::namespaceAliasDict.insert(current_root->name+"::"+aliasName,
- // new QCString(current_root->name+"::"+yytext));
- //}
- }
-<NSAliasArg>";" {
- BEGIN( FindMembers );
- }
-<JavaImport>({ID}{BN}*"."{BN}*)+"*" { // package import => add as a using directive
- lineCount();
- QCString scope=yytext;
- current->name=removeRedundantWhiteSpace(substitute(scope.left(scope.length()-2),".","::"));
- current->fileName = yyFileName;
- current->section=Entry::USINGDIR_SEC;
- current_root->addSubEntry(current);
- current = new Entry ;
- initEntry();
- BEGIN(Using);
- }
-<JavaImport>({ID}{BN}*"."{BN}*)+{ID} { // class import => add as a using declaration
- lineCount();
- QCString scope=yytext;
- current->name=removeRedundantWhiteSpace(substitute(scope,".","::"));
- current->fileName = yyFileName;
- if (insideD)
- {
- current->section=Entry::USINGDIR_SEC;
- }
- else
- {
- //printf("import name = %s -> %s\n",yytext,current->name.data());
- current->section=Entry::USINGDECL_SEC;
- }
- current_root->addSubEntry(current);
- current = new Entry ;
- initEntry();
- BEGIN(Using);
- }
-<FindMembers>"using"{BN}+ {
- current->startLine=yyLineNr;
- lineCount();
- BEGIN(Using);
- }
-<Using>"namespace"{BN}+ { lineCount(); BEGIN(UsingDirective); }
-<Using>{ID}{BN}*({BN}*("::"|"."){BN}*{ID})* {
- lineCount();
- current->name=yytext;
- current->fileName = yyFileName;
- current->section=Entry::USINGDECL_SEC;
- current_root->addSubEntry(current);
- current = new Entry ;
- if (insideCS) /* Hack: in C# a using declaration and
- directive have the same syntax, so we
- also add it as a using directive here
- */
- {
- current->name=yytext;
- current->fileName = yyFileName;
- current->startLine = yyLineNr;
- current->section=Entry::USINGDIR_SEC;
- current_root->addSubEntry(current);
- current = new Entry ;
- }
- initEntry();
- BEGIN(Using);
- }
-<UsingDirective>{SCOPENAME} { current->name=removeRedundantWhiteSpace(yytext);
- current->fileName = yyFileName;
- current->section=Entry::USINGDIR_SEC;
- current_root->addSubEntry(current);
- current = new Entry ;
- initEntry();
- BEGIN(Using);
- }
-<Using>";" { BEGIN(FindMembers); }
-<FindMembers>{SCOPENAME}{BN}*"<>" { // guided template decl
- QCString n=yytext;
- addType( current );
- current->name=n.left(n.length()-2);
- }
-<FindMembers>{SCOPENAME}{BN}*/"<" { // Note: this could be a return type!
- sharpCount=0;
- lineCount();
- addType( current );
- current->name=yytext;
- current->name=current->name.stripWhiteSpace();
- //current->scopeSpec.resize(0);
- // currentTemplateSpec = &current->scopeSpec;
- if (nameIsOperator(current->name))
- BEGIN( Operator );
- else
- BEGIN( EndTemplate );
- }
-<FindMemberName>{SCOPENAME}{BN}*/"<" {
- sharpCount=0;
- lineCount();
- current->name+=((QCString)yytext).stripWhiteSpace();
- //current->memberSpec.resize(0);
- // currentTemplateSpec = &current->memberSpec;
- if (nameIsOperator(current->name))
- BEGIN( Operator );
- else
- BEGIN( EndTemplate );
- }
-<EndTemplate>"<<" {
- current->name+=yytext;
- // *currentTemplateSpec+=yytext;
- }
-<EndTemplate>"<" {
- current->name+='<';
- // *currentTemplateSpec+='<';
- sharpCount++;
- }
-<EndTemplate>">>" {
- current->name+=yytext;
- // *currentTemplateSpec+=yytext;
- }
-<EndTemplate>">" {
- current->name+='>';
- // *currentTemplateSpec+='>';
- if (--sharpCount<=0)
- {
- //printf("Found %s\n",current->name.data());
- BEGIN(FindMembers);
- }
- }
-<EndTemplate>">"{BN}*"(" {
- lineCount();
- current->name+='>';
- // *currentTemplateSpec+='>';
- if (--sharpCount<=0)
- {
- current->args = "(";
- currentArgumentContext = FuncQual;
- fullArgString = current->args.copy();
- copyArgString = &current->args;
- //printf("Found %s\n",current->name.data());
- BEGIN( ReadFuncArgType ) ;
- }
- }
-<EndTemplate>">"{BN}*/"("({BN}*{ID}{BN}*"::")*({BN}*"*"{BN}*)+ { // function pointer returning a template instance
- lineCount();
- current->name+='>';
- BEGIN(FindMembers);
- }
-<EndTemplate>">"{BN}*/"::" {
- lineCount();
- current->name+='>';
- // *currentTemplateSpec+='>';
- if (--sharpCount<=0)
- {
- BEGIN(FindMemberName);
- }
- }
-<EndTemplate>. {
- current->name+=*yytext;
- // *currentTemplateSpec+=*yytext;
- }
-<FindMembers>"define"{BN}*"("{BN}*["'] {
- if (insidePHP)
- {
- current->bodyLine = yyLineNr;
- BEGIN( DefinePHP );
- }
- else
- REJECT;
- }
-<FindMembers>"Q_OBJECT" { // Qt object macro
- }
-<FindMembers>"Q_PROPERTY" { // Qt property declaration
- current->protection = protection = Public ;
- current->mtype = mtype = Property;
- current->type.resize(0);
- BEGIN(QtPropType);
- }
-<QtPropType>"(" { // start of property arguments
- }
-<QtPropAttr>")" { // end of property arguments
- unput(';');
- BEGIN(FindMembers);
- }
-<QtPropType>"const"|"volatile" {
- current->type+=yytext;
- }
-<QtPropType>{B}+ {
- current->type+=yytext;
- }
-<QtPropType>{ID} {
- current->type+=yytext;
- BEGIN(QtPropName);
- }
-<QtPropName>{ID} {
- current->name=yytext;
- BEGIN(QtPropAttr);
- }
-<QtPropAttr>"READ" {
- current->memSpec |= Entry::Readable;
- BEGIN(QtPropRead);
- }
-<QtPropAttr>"WRITE" {
- current->memSpec |= 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} {
- current->read = yytext;
- BEGIN(QtPropAttr);
- }
-<QtPropWrite>{ID} {
- current->write = yytext;
- BEGIN(QtPropAttr);
- }
-<FindMembers>"friend"{BN}+("class"|"union"|"struct"){BN}+ {
- current->name=yytext;
- BEGIN(FindMembers);
- }
-<FindMembers,FindMemberName>{SCOPENAME} {
- lineCount();
- if (insideIDL && yyleng==9 && strcmp(yytext,"cpp_quote")==0)
- {
- BEGIN(CppQuote);
- }
- else if ((insideIDL || insideJava || insideD) && yyleng==6 && strcmp(yytext,"import")==0)
- {
- if (insideIDL)
- BEGIN(NextSemi);
- else // insideJava or insideD
- BEGIN(JavaImport);
- }
- else if (insideJava && strcmp(yytext,"package")==0)
- {
- lineCount();
- BEGIN(PackageName);
- }
- else if (insideIDL && strcmp(yytext,"case")==0)
- {
- BEGIN(IDLUnionCase);
- }
- else if (insideTryBlock && strcmp(yytext,"catch")==0)
- {
- insideTryBlock=FALSE;
- BEGIN(TryFunctionBlock);
- }
- else
- {
- if (YY_START==FindMembers)
- {
- addType( current ) ;
- }
- bool javaLike = insideJava || insideCS || insideD || insidePHP;
- if (javaLike && strcmp(yytext,"public")==0)
- {
- current->protection = Public;
- }
- else if (javaLike && strcmp(yytext,"protected")==0)
- {
- current->protection = Protected;
- }
- else if (javaLike && strcmp(yytext,"private")==0)
- {
- current->protection = Private;
- }
- else
- {
- if (YY_START==FindMembers)
- current->name = yytext;
- else
- current->name += yytext;
- if (current->name.left(7)=="static ")
- {
- current->stat = TRUE;
- current->name= current->name.mid(7);
- }
- else if (current->name.left(7)=="inline ")
- {
- if (current->type.isEmpty())
- {
- current->type="inline";
- }
- else
- {
- current->type+="inline ";
- }
- current->name= current->name.mid(7);
- }
- else if (current->name.left(6)=="const ")
- {
- if (current->type.isEmpty())
- {
- current->type="const";
- }
- else
- {
- current->type+="const ";
- }
- current->name=current->name.mid(6);
- }
- }
- QCString tmp=yytext;
- if (nameIsOperator(tmp))
- {
- BEGIN( Operator );
- }
- else
- {
- BEGIN(FindMembers);
- }
- }
- }
-<FindMembers>"." {
- if (insideJava || insideCS || insideD)
- {
- current->name+=".";
- }
- }
-<FindMembers>"::" {
- current->name+=yytext;
- }
-<CppQuote>"("{B}*"\"" {
- insideCppQuote=TRUE;
- BEGIN(FindMembers);
- }
-<IDLUnionCase>"::"
-<IDLUnionCase>":" { BEGIN(FindMembers); }
-<IDLUnionCase>\n { yyLineNr++; }
-<IDLUnionCase>.
-<TryFunctionBlock>\n { yyLineNr++; }
-<TryFunctionBlock>"{" {
- curlyCount=0;
- lastCurlyContext = TryFunctionBlockEnd ;
- BEGIN( SkipCurly );
- }
-<TryFunctionBlock>.
-<TryFunctionBlockEnd>"catch" { BEGIN(TryFunctionBlock); }
-<TryFunctionBlockEnd>. { unput(*yytext);
- BEGIN( FindMembers );
- }
-<EndCppQuote>")" {
- insideCppQuote=FALSE;
- BEGIN(FindMembers);
- }
-<FindMembers>{B}*"#" { if (insidePHP)
- REJECT;
- lastCPPContext = YY_START;
- BEGIN( SkipCPP ) ;
- }
-<FindMembers>{B}*"#"{B}*"define" { if (insidePHP)
- REJECT;
- current->bodyLine = yyLineNr;
- BEGIN( Define );
- }
-<FindMembers,ReadBody,ReadNSBody,ReadBodyIntf,SkipCurly,SkipCurlyCpp>{B}*"#"{B}+[0-9]+{B}+/"\"" { /* line control directive */
- yyLineNr = atoi(&yytext[1]);
- //printf("setting line number to %d\n",yyLineNr);
- lastPreLineCtrlContext = YY_START;
- BEGIN( PreLineCtrl );
- }
-<PreLineCtrl>"\""[^\n\"]*"\"" {
- yyFileName = stripQuotes(yytext);
- }
-<PreLineCtrl>. {}
-<PreLineCtrl>\n {
- yyLineNr++;
- BEGIN( lastPreLineCtrlContext );
- }
-<SkipCPP>.
-<SkipCPP>\\[\r]*"\n"[\r]* { yyLineNr++ ; }
-<SkipCPP>[\r]*\n[\r]* { yyLineNr++ ;
- BEGIN( lastCPPContext) ;
- }
-<Define>{ID}{B}*"(" {
- current->name = yytext;
- current->name = current->name.left(current->name.length()-1).stripWhiteSpace();
- current->args = "(";
- current->bodyLine = yyLineNr;
- currentArgumentContext = DefineEnd;
- fullArgString=current->args.copy();
- copyArgString=&current->args;
- BEGIN( ReadFuncArgType ) ;
- }
- /*
-<DefineArg>")" {
- //printf("Define with args\n");
- current->args += ')';
- BEGIN( DefineEnd );
- }
-<DefineArg>. {
- current->args += *yytext;
- }
- */
-<Define>{ID} {
- //printf("Define `%s' without args\n",yytext);
- current->bodyLine = yyLineNr;
- current->name = yytext;
- BEGIN(DefineEnd);
- }
-<DefineEnd>\n {
- //printf("End define\n");
- yyLineNr++;
- current->fileName = yyFileName;
- current->startLine = yyLineNr;
- current->type.resize(0);
- current->args = current->args.simplifyWhiteSpace();
- current->name = current->name.stripWhiteSpace();
- current->section = Entry::DEFINE_SEC;
- current_root->addSubEntry(current);
- current = new Entry ;
- initEntry();
- BEGIN(FindMembers);
- }
-<DefinePHPEnd>";" {
- //printf("End define\n");
- current->fileName = yyFileName;
- current->startLine = yyLineNr;
- current->type.resize(0);
- current->args = current->args.simplifyWhiteSpace();
- current->name = current->name.stripWhiteSpace();
- current->section = Entry::ENUM_SEC; //HACK!
- current_root->addSubEntry(current);
- current = new Entry ;
- initEntry();
- BEGIN(FindMembers);
- }
-<DefinePHPEnd>.
-<DefineEnd>\\[\r]?\n {
- yyLineNr++;
- }
-<DefineEnd>\" {
- if (insideIDL && insideCppQuote)
- {
- BEGIN(EndCppQuote);
- }
- else
- {
- lastStringContext=DefineEnd;
- BEGIN(SkipString);
- }
- }
-<DefineEnd>.
-<DefinePHP>{ID}["']{BN}*","{BN}* {
- current->name = yytext;
- current->name = current->name.stripWhiteSpace();
- current->name = current->name.left(current->name.length()-1).stripWhiteSpace();
- current->name = current->name.left(current->name.length()-1);
- current->args = "(";
- current->bodyLine = yyLineNr;
- lastRoundContext = DefinePHPEnd;
- pCopyRoundString = &current->args;
- roundCount = 0;
- BEGIN( CopyRound );
- }
-
-<FindMembers>[*&]+ { current->name += yytext ;
- addType( current );
- }
-<FindMembers,MemberSpec,Function,NextSemi,BitFields,ReadInitializer,OldStyleArgs>";"{BN}*("/**"|"//!"|"/*!"|"///")"<" {
- lineCount();
- if (current->bodyLine==-1)
- {
- current->bodyLine=yyLineNr;
- }
- docBlockContext = YY_START;
- docBlockInBody = FALSE;
- docBlockJavaStyle = yytext[yyleng-2]=='*' && Config_getBool("JAVADOC_AUTOBRIEF");
- docBlock.resize(0);
- docBlockTerm = ';';
- if (yytext[yyleng-3]=='/')
- {
- startCommentBlock(TRUE);
- BEGIN( DocLine );
- }
- else
- {
- startCommentBlock(FALSE);
- BEGIN( DocBlock );
- }
- }
-<MemberSpec,FindFields,FindMembers,NextSemi,BitFields,ReadInitializer,OldStyleArgs>","{BN}*("/**"|"//!"|"/*!"|"///")"<" {
- lineCount();
- docBlockContext = YY_START;
- docBlockInBody = FALSE;
- docBlockJavaStyle = yytext[yyleng-2]=='*' && Config_getBool("JAVADOC_AUTOBRIEF");
- docBlock.resize(0);
- docBlockTerm = ',';
- if (yytext[yyleng-3]=='/')
- {
- startCommentBlock(TRUE);
- BEGIN( DocLine );
- }
- else
- {
- startCommentBlock(FALSE);
- BEGIN( DocBlock );
- }
- }
-<DefineEnd,FindFields,FindFieldArg,ReadInitializer,OldStyleArgs>{BN}*("/**"|"//!"|"/*!"|"///")"<" {
- lineCount();
- if (current->bodyLine==-1)
- {
- current->bodyLine=yyLineNr;
- }
- docBlockContext = YY_START;
- docBlockInBody = FALSE;
- docBlockJavaStyle = yytext[yyleng-2]=='*' && Config_getBool("JAVADOC_AUTOBRIEF");
- docBlock.resize(0);
- docBlockTerm = 0;
- if (yytext[yyleng-3]=='/')
- {
- startCommentBlock(TRUE);
- BEGIN( DocLine );
- }
- else
- {
- startCommentBlock(FALSE);
- BEGIN( DocBlock );
- }
- }
-
-<FindMembers,FindFields>("//"([!/]?){B}*{CMD}"{")|("/*"([!*]?){B}*{CMD}"{") {
- //Entry *tmp = current;
- //if (previous)
- //{
- // current = previous;
- //}
- //handleGroupStartCommand(current->name);
- if (previous && previous->section==Entry::GROUPDOC_SEC)
- {
- // link open command to the group defined in the previous entry
- openGroup(previous,yyFileName,yyLineNr);
- }
- else
- {
- // link open command to the current entry
- openGroup(current,yyFileName,yyLineNr);
- }
- //current = tmp;
- initEntry();
- if (yytext[1]=='/')
- {
- if (yytext[2]=='!' || yytext[2]=='/')
- {
- docBlockContext = YY_START;
- docBlockInBody = FALSE;
- docBlockJavaStyle = FALSE;
- docBlock.resize(0);
- docBlockTerm = 0;
- startCommentBlock(TRUE);
- BEGIN(DocLine);
- }
- else
- {
- lastCContext=YY_START;
- BEGIN(SkipCxxComment);
- }
- }
- else
- {
- if (yytext[2]=='!' || yytext[2]=='*')
- {
- docBlockContext = YY_START;
- docBlockInBody = FALSE;
- docBlock.resize(0);
- docBlockJavaStyle = yytext[2]=='*' && Config_getBool("JAVADOC_AUTOBRIEF");
- docBlockTerm = 0;
- startCommentBlock(FALSE);
- BEGIN(DocBlock);
- }
- else
- {
- lastCContext=YY_START;
- BEGIN(SkipComment);
- }
- }
- }
-<FindMembers,FindFields,ReadInitializer>"//"([!/]?){B}*{CMD}"}".*|"/*"([!*]?){B}*{CMD}"}".*"*/" {
- closeGroup(current,yyFileName,yyLineNr);
- }
-<FindMembers>"=" {
- current->bodyLine = yyLineNr;
- lastInitializerContext = YY_START;
- initBracketCount=0;
- BEGIN(ReadInitializer);
- }
- /* Read initializer rules */
-<ReadInitializer>"(" {
- lastRoundContext=YY_START;
- pCopyRoundString=&current->initializer;
- roundCount=0;
- current->initializer+=*yytext;
- BEGIN(CopyRound);
- }
-<ReadInitializer>"{" {
- lastCurlyContext=YY_START;
- pCopyCurlyString=&current->initializer;
- curlyCount=0;
- current->initializer+=*yytext;
- BEGIN(CopyCurly);
- }
-<ReadInitializer>[;,] {
- //printf(">> initializer `%s' <<\n",current->initializer.data());
- if (*yytext==';' || lastInitializerContext==FindFields)
- {
- unput(*yytext);
- BEGIN(lastInitializerContext);
- }
- else if (*yytext==',' && initBracketCount==0) // for "int a=0,b=0"
- {
- unput(*yytext);
- BEGIN(lastInitializerContext);
- }
- else
- {
- current->initializer+=*yytext;
- }
- }
-<ReadInitializer>\" {
- if (insideIDL && insideCppQuote)
- {
- BEGIN(EndCppQuote);
- }
- else
- {
- lastStringContext=YY_START;
- current->initializer+=*yytext;
- pCopyQuotedString=&current->initializer;
- BEGIN(CopyString);
- }
- }
-<ReadInitializer>"->" {
- current->initializer+=yytext;
- }
-<ReadInitializer>"<<" {
- current->initializer+=yytext;
- }
-<ReadInitializer>">>" {
- current->initializer+=yytext;
- }
-<ReadInitializer>[<\[{(] {
- initBracketCount++;
- current->initializer+=*yytext;
- }
-<ReadInitializer>[>\]})] {
- initBracketCount--;
- current->initializer+=*yytext;
- }
-<ReadInitializer>\' {
- if (insidePHP)
- {
- current->initializer+=yytext;
- pCopyQuotedString = &current->initializer;
- lastStringContext=YY_START;
- BEGIN(CopyPHPString);
- }
- else
- {
- current->initializer+=yytext;
- }
- }
-<ReadInitializer>{CHARLIT} {
- if (insidePHP)
- {
- REJECT;
- }
- else
- {
- current->initializer+=yytext;
- }
- }
-<ReadInitializer>\n {
- current->initializer+=*yytext;
- yyLineNr++;
- }
-<ReadInitializer>"@\"" {
- //printf("insideCS=%d\n",insideCS);
- current->initializer+=yytext;
- if (!insideCS && !insideObjC)
- {
- REJECT;
- }
- else
- {
- // C#/ObjC verbatim string
- lastSkipVerbStringContext=YY_START;
- pSkipVerbString=&current->initializer;
- BEGIN(SkipVerbString);
- }
- }
-<SkipVerbString>[^\n"]+ {
- *pSkipVerbString+=yytext;
- }
-<SkipVerbString>"\"\"" { // quote escape
- *pSkipVerbString+=yytext;
- }
-<SkipVerbString>"\"" {
- *pSkipVerbString+=*yytext;
- BEGIN(lastSkipVerbStringContext);
- }
-<SkipVerbString>\n {
- *pSkipVerbString+=*yytext;
- yyLineNr++;
- }
-<SkipVerbString>. {
- *pSkipVerbString+=*yytext;
- }
-<ReadInitializer>. {
- current->initializer+=*yytext;
- }
-
- /* generic quoted string copy rules */
-<CopyString,CopyPHPString>\\. {
- *pCopyQuotedString+=yytext;
- }
-<CopyString>\" {
- *pCopyQuotedString+=*yytext;
- BEGIN( lastStringContext );
- }
-<CopyPHPString>\' {
- *pCopyQuotedString+=*yytext;
- BEGIN( lastStringContext );
- }
-<CopyString,CopyPHPString>"/*"|"*/"|"//" {
- *pCopyQuotedString+=yytext;
- }
-<CopyString,CopyPHPString>\n {
- *pCopyQuotedString+=*yytext;
- yyLineNr++;
- }
-<CopyString,CopyPHPString>. {
- *pCopyQuotedString+=*yytext;
- }
-
- /* generic round bracket list copy rules */
-<CopyRound>\" {
- *pCopyRoundString+=*yytext;
- pCopyQuotedString=pCopyRoundString;
- lastStringContext=YY_START;
- BEGIN(CopyString);
- }
-<CopyRound>"(" {
- *pCopyRoundString+=*yytext;
- roundCount++;
- }
-<CopyRound>")" {
- *pCopyRoundString+=*yytext;
- if (--roundCount<0)
- BEGIN(lastRoundContext);
- }
-<CopyRound>\n {
- yyLineNr++;
- *pCopyRoundString+=*yytext;
- }
-<CopyRound>\' {
- if (insidePHP)
- {
- current->initializer+=yytext;
- pCopyQuotedString = pCopyRoundString;
- lastStringContext=YY_START;
- BEGIN(CopyPHPString);
- }
- else
- {
- *pCopyRoundString+=yytext;
- }
- }
-<CopyRound>{CHARLIT} {
- if (insidePHP)
- {
- REJECT;
- }
- else
- {
- *pCopyRoundString+=yytext;
- }
- }
-<CopyRound>[^"'()\n]+ {
- *pCopyRoundString+=yytext;
- }
-<CopyRound>. {
- *pCopyRoundString+=*yytext;
- }
-
- /* generic curly bracket list copy rules */
-<CopyCurly>\" {
- *pCopyCurlyString+=*yytext;
- pCopyQuotedString=pCopyCurlyString;
- lastStringContext=YY_START;
- BEGIN(CopyString);
- }
-<CopyCurly>\' {
- *pCopyCurlyString+=*yytext;
- if (insidePHP)
- {
- pCopyQuotedString=pCopyCurlyString;
- lastStringContext=YY_START;
- BEGIN(CopyPHPString);
- }
- }
-<CopyCurly>"{" {
- *pCopyCurlyString+=*yytext;
- curlyCount++;
- }
-<CopyCurly>"}" {
- *pCopyCurlyString+=*yytext;
- if (--curlyCount<0)
- BEGIN(lastCurlyContext);
- }
-<CopyCurly>{CHARLIT} { if (insidePHP)
- {
- REJECT;
- }
- else
- {
- *pCopyCurlyString+=yytext;
- }
- }
-<CopyCurly>[^"'{}\/\n]+ {
- *pCopyCurlyString+=yytext;
- }
-<CopyCurly>"/" { *pCopyCurlyString+=yytext; }
-<CopyCurly>\n {
- yyLineNr++;
- *pCopyCurlyString+=*yytext;
- }
-<CopyCurly>. {
- *pCopyCurlyString+=*yytext;
- }
-<FindMembers>":" {
- if (current->type.isEmpty()) // bit pad field
- {
- addType(current);
- current->name.sprintf("__pad%d__",padCount++);
- }
- BEGIN(BitFields);
- current->bitfields+=":";
- }
-<BitFields>. {
- current->bitfields+=*yytext;
- }
-<FindMembers>[;,] {
- QCString oldType = current->type.copy();
- if (current->bodyLine==-1)
- {
- current->bodyLine = yyLineNr;
- }
- if ( insidePHP && current->type.left(3) == "var" )
- {
- current->type = current->type.mid(3);
- }
- bool needNewCurrent=FALSE;
- if (!current->name.isEmpty() && current->section!=Entry::ENUM_SEC)
- {
- current->type=current->type.simplifyWhiteSpace();
- current->args=removeRedundantWhiteSpace(current->args);
- current->name=current->name.stripWhiteSpace();
- current->section = Entry::VARIABLE_SEC ;
- current->fileName = yyFileName;
- current->startLine = yyLineNr;
- current_root->addSubEntry( current ) ;
- needNewCurrent=TRUE;
- }
- if ( *yytext == ',')
- {
- if (needNewCurrent)
- {
- current = new Entry(*current);
- }
- current->name.resize(0);
- current->args.resize(0);
- current->brief.resize(0);
- current->doc.resize(0);
- current->initializer.resize(0);
- current->bitfields.resize(0);
- int i=oldType.length();
- while (i>0 && (oldType[i-1]=='*' || oldType[i-1]=='&' || oldType[i-1]==' ')) i--;
- current->type = oldType.left(i);
- }
- else
- {
- if (needNewCurrent)
- {
- current = new Entry ;
- }
- initEntry();
- }
- BEGIN( FindMembers ) ;
- }
-
-<FindMembers>"[" {
- if (current->name.isEmpty() || current->name=="typedef") // IDL function property
- {
- squareCount=1;
- lastSquareContext = YY_START;
- BEGIN(SkipSquare);
- }
- else
- {
- current->args += yytext ;
- squareCount=1;
- BEGIN( Array ) ;
- }
- }
-<Array>"]" { current->args += *yytext ;
- if (--squareCount<=0)
- BEGIN( FindMembers ) ;
- }
-<Array>"[" { current->args += *yytext ;
- squareCount++;
- }
-<Array>. { current->args += *yytext ; }
-<SkipSquare>"[" { squareCount++; }
-<SkipSquare>"]" {
- if (--squareCount<=0)
- BEGIN( lastSquareContext );
- }
-<SkipSquare>\" {
- lastStringContext=YY_START;
- BEGIN( SkipString );
- }
-<SkipSquare>[^\n\[\]\"]+
-<FindMembers>"<" { addType( current ) ;
- current->type += yytext ;
- BEGIN( Sharp ) ;
- }
-<Sharp>">" { current->type += *yytext ;
- if (--sharpCount<=0)
- BEGIN( FindMembers ) ;
- }
-<Sharp>"<" { current->type += *yytext ;
- sharpCount++;
- }
-<Sharp>{BN}+ {
- lineCount();
- }
-<Sharp>. { current->type += *yytext ; }
-<FindFields>{ID} {
- current->name = yytext;
- }
-<FindFields>"=" {
- lastInitializerContext = YY_START;
- initBracketCount=0;
- BEGIN(ReadInitializer);
- }
-<FindFields>"," {
- //printf("adding `%s' `%s' `%s' to enum `%s' (mGrpId=%d)\n",
- // current->type.data(), current->name.data(),
- // current->args.data(), current_root->name.data(),current->mGrpId);
- if (!current->name.isEmpty())
- {
- current->fileName = yyFileName;
- current->startLine = yyLineNr;
- current->type = "@"; // enum marker
- current->args = current->args.simplifyWhiteSpace();
- current->name = current->name.stripWhiteSpace();
- current->section = Entry::VARIABLE_SEC;
- // add to the scope of the enum
- current_root->addSubEntry(current);
- current = new Entry(*current);
- // add to the scope surrounding the enum (copy!)
- current_root->parent->addSubEntry(current);
- current = new Entry ;
- initEntry();
- }
- else // probably a redundant ,
- {
- current->reset();
- }
- }
-<FindFields>"[" { // attribute list in IDL
- squareCount=1;
- lastSquareContext = YY_START;
- BEGIN(SkipSquare);
- }
- /*
-<FindFieldArg>"," { unput(*yytext); BEGIN(FindFields); }
- */
-<ReadBody,ReadNSBody,ReadBodyIntf>[^\r\n\#{}"@'/]* { current->program += yytext ; }
-<ReadBody,ReadNSBody,ReadBodyIntf>"//".* { current->program += yytext ; }
-<ReadBody,ReadNSBody,ReadBodyIntf>"#".* { if (!insidePHP)
- REJECT;
- // append PHP comment.
- current->program += yytext ;
- }
-<ReadBody,ReadNSBody,ReadBodyIntf>@\" { current->program += yytext ;
- pSkipVerbString = &current->program;
- lastSkipVerbStringContext=YY_START;
- BEGIN( SkipVerbString );
- }
-<ReadBody,ReadNSBody,ReadBodyIntf>\" { current->program += yytext ;
- pCopyQuotedString = &current->program;
- lastStringContext=YY_START;
- BEGIN( CopyString );
- }
-<ReadBody,ReadNSBody,ReadBodyIntf>"/*"{B}* { current->program += yytext ;
- lastContext = YY_START ;
- BEGIN( Comment ) ;
- }
-<ReadBody,ReadNSBody,ReadBodyIntf>"/*"{BL} { current->program += yytext ;
- ++yyLineNr ;
- lastContext = YY_START ;
- BEGIN( Comment ) ;
- }
-<ReadBody,ReadNSBody,ReadBodyIntf>"'" {
- if (!insidePHP)
- {
- current->program += yytext;
- }
- else
- { // begin of single quoted string
- current->program += yytext;
- pCopyQuotedString = &current->program;
- lastStringContext=YY_START;
- BEGIN(CopyPHPString);
- }
- }
-<ReadBody,ReadNSBody,ReadBodyIntf>{CHARLIT} {
- if (insidePHP)
- {
- REJECT; // for PHP code single quotes
- // are used for strings of arbitrary length
- }
- else
- {
- current->program += yytext;
- }
- }
-<ReadBody,ReadNSBody,ReadBodyIntf>"{" { current->program += yytext ;
- ++curlyCount ;
- }
-<ReadBody,ReadNSBody>"}" { //err("ReadBody count=%d\n",curlyCount);
- if ( curlyCount>0 )
- {
- current->program += yytext ;
- --curlyCount ;
- }
- else
- {
- current->endBodyLine = yyLineNr;
- QCString &cn = current->name;
- QCString rn = current_root->name.copy();
- //printf("cn=`%s' rn=`%s'\n",cn.data(),rn.data());
- if (!cn.isEmpty() && !rn.isEmpty())
- {
- prependScope();
- //cn.prepend(rn+"::");
- }
- if (isTypedef && cn.isEmpty())
- {
- //printf("Typedef Name\n");
- BEGIN( TypedefName );
- }
- else
- {
- if (current->section == Entry::ENUM_SEC)
- {
- current->program+=','; // add field terminator
- }
- // add compound definition to the tree
- current->args=removeRedundantWhiteSpace(current->args);
- // was: current->args.simplifyWhiteSpace();
- current->type = current->type.simplifyWhiteSpace();
- current->name = current->name.stripWhiteSpace();
- //printf("adding `%s' `%s' `%s' brief=%s insideObjC=%d %x\n",current->type.data(),current->name.data(),current->args.data(),current->brief.data(),insideObjC,current->section);
- if (insideObjC &&
- (current->section==Entry::INTERFACE_SEC || current->section==Entry::CATEGORY_SEC)
- ) // method definition follows
- {
- BEGIN( ReadBodyIntf ) ;
- }
- else
- {
- current_root->addSubEntry( current ) ;
- current = new Entry(*current);
- if (current->section==Entry::NAMESPACE_SEC ||
- current->section==Entry::INTERFACE_SEC ||
- insideJava || insidePHP || insideCS || insideD
- )
- { // namespaces and interfaces and java classes ends with a closing bracket without semicolon
- current->reset();
- initEntry();
- BEGIN( FindMembers ) ;
- }
- else
- {
- BEGIN( MemberSpec ) ;
- }
- }
- }
- }
- }
-<ReadBody>"}"{BN}+"typedef"{BN}+ { //err("ReadBody count=%d\n",curlyCount);
- lineCount();
- if ( curlyCount>0 )
- {
- current->program += yytext ;
- --curlyCount ;
- }
- else
- {
- isTypedef = TRUE;
- current->endBodyLine = yyLineNr;
- QCString &cn = current->name;
- QCString rn = current_root->name.copy();
- if (!cn.isEmpty() && !rn.isEmpty())
- {
- prependScope();
- }
- BEGIN( TypedefName );
- }
- }
-<TypedefName>{ID} {
- if (current->section == Entry::ENUM_SEC)
- {
- current->program+=","; // add field terminator
- }
- current->name=yytext;
- prependScope();
- current->args = current->args.simplifyWhiteSpace();
- current->type = current->type.simplifyWhiteSpace();
- //printf("Adding compound %s %s %s\n",current->type.data(),current->name.data(),current->args.data());
- current_root->addSubEntry( current ) ;
- current = new Entry;
- initEntry();
- BEGIN(MemberSpecSkip);
- }
-<TypedefName>";" { /* typedef of anonymous type */
- current->name.sprintf("@%d",anonCount++);
- if (current->section == Entry::ENUM_SEC)
- {
- current->program+=','; // add field terminator
- }
- // add compound definition to the tree
- current->args = current->args.simplifyWhiteSpace();
- current->type = current->type.simplifyWhiteSpace();
- current_root->addSubEntry( current ) ;
- current = new Entry(*current);
- unput(';');
- BEGIN( MemberSpec ) ;
- }
-<MemberSpec>([*&]*{BN}*)*{ID}("["[^\]\n]*"]")* { // the [] part could be improved.
- lineCount();
- int i=0,l=yyleng,j;
- while (i<l && (!isId(yytext[i]))) i++;
- msName = yytext;
- msName = msName.right(msName.length()-i);
- j=msName.find("[");
- if (j!=-1)
- {
- msArgs=msName.right(msName.length()-j);
- msName=msName.left(j);
- }
- msType = yytext; msType=msType.left(i);
- }
-<MemberSpec>[,;] {
- //printf("current->name=`%s' msName=`%s'\n",current->name.data(),msName.data());
- if (msName.isEmpty() && !current->name.isEmpty())
- /* && (current->section & Entry::COMPOUND_MASK)) */
- {
- // see if the compound does not have a name or is inside another
- // annonymous compound. If so we insert a
- // special `annonymous' variable.
- Entry *p=current_root;
- 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)=='@')
- {
- // annonymous compound inside -> insert dummy variable name
- //printf("Adding annonymous variable for scope %s\n",p->name.data());
- msName.sprintf("@%d",anonCount++);
- break;
- }
- }
- p=p->parent;
- }
- }
- if (!msName.isEmpty())
- {
- Entry *varEntry=new Entry;
- varEntry->protection = current->protection ;
- varEntry->mtype = current->mtype;
- varEntry->virt = current->virt;
- varEntry->stat = current->stat;
- varEntry->section = Entry::VARIABLE_SEC;
- varEntry->name = msName.stripWhiteSpace();
- varEntry->type = current->type.simplifyWhiteSpace()+" ";
- varEntry->args = msArgs; //current->args.simplifyWhiteSpace();
- //if (!current->name.isEmpty() && current->name[0]!='@' &&
- // current->parent->section & Entry::COMPOUND_MASK)
- // varEntry->type+=current->parent->name+"::";
- if (isTypedef)
- {
- varEntry->type.prepend("typedef ");
- // //printf("current->name = %s %s\n",current->name.data(),msName.data());
- // if (!current->name.isEmpty() && current->name.at(0)!='@')
- // {
- // //printf("2>>>>>>>>>> adding %s->%s\n",msName.data(),current->name.data());
- // QCString scope;
- // if (current_root->section & Entry::SCOPE_MASK) scope=current_root->name;
- // Doxygen::typedefDict.insert(msName,new TypedefInfo(current->name,scope));
- // }
- }
- varEntry->type+=current->name+msType;
- varEntry->fileName = yyFileName;
- varEntry->startLine = yyLineNr;
- varEntry->doc = current->doc.copy();
- varEntry->brief = current->brief.copy();
- varEntry->mGrpId = current->mGrpId;
-
- // deep copy group list
- QListIterator<Grouping> gli(*current->groups);
- Grouping *g;
- for (;(g=gli.current());++gli)
- {
- varEntry->groups->append(new Grouping(*g));
- }
- if (current->sli) // copy special list items
- {
- QListIterator<ListItemInfo> li(*current->sli);
- ListItemInfo *lii;
- for (li.toFirst();(lii=li.current());++li)
- {
- varEntry->addSpecialListItem(lii->type,lii->itemId);
- }
- //delete current->sli;
- //current->sli = 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());
- current_root->addSubEntry(varEntry);
- }
- if (*yytext==';')
- {
- msType.resize(0);
- msName.resize(0);
- msArgs.resize(0);
- isTypedef=FALSE;
- current->reset();
- initEntry();
- BEGIN( FindMembers );
- }
- }
-<MemberSpec>"=" {
- lastInitializerContext=YY_START;
- initBracketCount=0;
- BEGIN(ReadInitializer);
- /* BEGIN(MemberSpecSkip); */
- }
- /*
-<MemberSpecSkip>"{" {
- curlyCount=0;
- lastCurlyContext = MemberSpecSkip;
- previous = current;
- BEGIN(SkipCurly);
- }
- */
-<MemberSpecSkip>"," { BEGIN(MemberSpec); }
-<MemberSpecSkip>";" { unput(';'); BEGIN(MemberSpec); }
-<ReadBody,ReadNSBody,ReadBodyIntf>{BN}+ { current->program += yytext ;
- lineCount() ;
- }
-<ReadBodyIntf>"@end"/[^a-z_A-Z0-9] { // end of Objective C block
- current_root->addSubEntry( current ) ;
- current=new Entry;
- initEntry();
- insideObjC=FALSE;
- BEGIN( FindMembers );
- }
-<ReadBody,ReadNSBody,ReadBodyIntf>. { current->program += yytext ; }
-
-<FindMembers>"("/({BN}*{TSCOPE}{BN}*"::")*{TSCOPE}{BN}*")"{BN}*"(" | /* typedef void (A<int>::func_t)(args...) */
-<FindMembers>("("({BN}*{TSCOPE}{BN}*"::")*({BN}*"*"{BN}*)+)+ { /* typedef void (A::*ptr_t)(args...) */
- current->bodyLine = yyLineNr;
- lineCount();
- addType(current);
- funcPtrType=yytext;
- roundCount=0;
- //current->type += yytext;
- BEGIN( FuncPtr );
- }
-<FuncPtr>{SCOPENAME} {
- current->name = yytext;
- if (current->name=="const" || current->name=="volatile")
- {
- funcPtrType += current->name;
- }
- else
- {
- BEGIN( EndFuncPtr );
- }
- }
-<FuncPtr>. {
- //printf("Error: FuncPtr `%c' unexpected at line %d of %s\n",*yytext,yyLineNr,yyFileName);
- }
-<EndFuncPtr>")"{BN}*/";" { // a variable with extra braces
- lineCount();
- current->type+=funcPtrType.data()+1;
- BEGIN(FindMembers);
- }
-<EndFuncPtr>")"{BN}*/"(" { // a function pointer
- lineCount();
- current->type+=funcPtrType+")";
- BEGIN(FindMembers);
- }
-<EndFuncPtr>")"{BN}*/"[" { // an array of variables
- lineCount();
- current->type+=funcPtrType.data();
- current->args += ")";
- BEGIN(FindMembers);
- }
-<EndFuncPtr>"(" { // a function returning a function
- current->args += *yytext ;
- roundCount=0;
- BEGIN( FuncFunc );
- }
-<EndFuncPtr>"["[^\n\]]*"]" {
- funcPtrType+=yytext;
- }
-<EndFuncPtr>")" {
- BEGIN(FindMembers);
- }
-<FuncFunc>"(" {
- current->args += *yytext ;
- ++roundCount;
- }
-<FuncFunc>")" {
- current->args += *yytext ;
- if ( roundCount )
- --roundCount;
- else
- {
- BEGIN(FuncFuncEnd);
- }
- }
-<FuncFuncEnd>")"{BN}*"(" {
- lineCount();
- current->type+=funcPtrType+")(";
- BEGIN(FuncFuncType);
- }
-<FuncFuncEnd>")"{BN}*/[;{] {
- lineCount();
- current->type+=funcPtrType.data()+1;
- BEGIN(Function);
- }
-<FuncFuncEnd>. {
- current->args += *yytext;
- }
-<FuncFuncType>"(" {
- current->type += *yytext;
- roundCount++;
- }
-<FuncFuncType>")" {
- current->type += *yytext;
- if (roundCount)
- --roundCount;
- else
- BEGIN(Function);
- }
-<FuncFuncType>{BN}*","{BN}* { lineCount() ; current->type += ", " ; }
-<FuncFuncType>{BN}+ { lineCount() ; current->type += ' ' ; }
-<FuncFuncType>. {
- current->type += *yytext;
- }
-<FindMembers>"("/{BN}*{ID}{BN}*"*"{BN}*{ID}*")(" { // for catching typedef void (__stdcall *f)() like definitions
- if (current->type.left(7)=="typedef" && current->bodyLine==-1)
- // the bodyLine check is to prevent this guard to be true more than once
- {
- current->bodyLine = yyLineNr;
- BEGIN( GetCallType );
- }
- else if (!current->name.isEmpty()) // normal function
- {
- current->args = yytext;
- current->bodyLine = yyLineNr;
- currentArgumentContext = FuncQual;
- fullArgString=current->args.copy();
- copyArgString=&current->args;
- BEGIN( ReadFuncArgType ) ;
- //printf(">>> Read function arguments!\n");
- }
- }
-<GetCallType>{BN}*{ID}{BN}*"*" {
- lineCount();
- addType(current);
- funcPtrType="(";
- funcPtrType+=yytext;
- roundCount=0;
- BEGIN( FuncPtr );
- }
-<FindMembers>"(" {
- if (!current->name.isEmpty())
- {
- current->args = yytext;
- current->bodyLine = yyLineNr;
- currentArgumentContext = FuncQual;
- fullArgString=current->args.copy();
- copyArgString=&current->args;
- BEGIN( ReadFuncArgType ) ;
- //printf(">>> Read function arguments current->argList->count()=%d\n",current->argList->count());
- }
- }
- /*
-<FindMembers>"("{BN}*("void"{BN}*)?")" {
- lineCount();
- current->args = "()";
- BEGIN( FuncQual );
- }
- */
-
- /*- Function argument reading rules ---------------------------------------*/
-
-<ReadFuncArgType>[^ \/\r\t\n\)\(\"\'#]+ { *copyArgString+=yytext;
- fullArgString+=yytext;
- }
-<CopyArgString,CopyArgPHPString>[^\n\\\"\']+ { *copyArgString+=yytext;
- fullArgString+=yytext;
- }
-<CopyArgRound>[^\/\n\)\(\"\']+ {
- *copyArgString+=yytext;
- fullArgString+=yytext;
- }
-<ReadFuncArgType,ReadTempArgs>{BN}* {
- *copyArgString+=" ";
- fullArgString+=" ";
- lineCount();
- }
-<ReadFuncArgType,CopyArgRound,CopyArgSharp,ReadTempArgs>\" {
- *copyArgString+=*yytext;
- fullArgString+=*yytext;
- lastCopyArgStringContext = YY_START;
- BEGIN( CopyArgString );
- }
-<ReadFuncArgType,ReadTempArgs>"(" {
- *copyArgString+=*yytext;
- fullArgString+=*yytext;
- argRoundCount=0;
- lastCopyArgContext = YY_START;
- BEGIN( CopyArgRound );
- }
-<ReadFuncArgType>")" {
- *copyArgString+=*yytext;
- fullArgString+=*yytext;
- stringToArgumentList(fullArgString,current->argList);
-
- /* remember the current documentation block, since
- we could overwrite it with the documentation of
- a function argument, which we then have to correct later
- on
- */
- docBackup = current->doc.copy();
- briefBackup = current->brief.copy();
-
- BEGIN( currentArgumentContext );
- }
- /* a special comment */
-<ReadFuncArgType,ReadTempArgs>("/*"[*!]|"//"[/!])("<"?) {
- if (currentArgumentContext==DefineEnd)
- {
- // for defines we interpret a comment
- // as documentation for the define
- int i;for (i=yyleng-1;i>=0;i--)
- {
- unput(yytext[i]);
- }
- stringToArgumentList(fullArgString,current->argList);
- BEGIN( currentArgumentContext );
- }
- else
- {
- // for functions we interpret a comment
- // as documentation for the argument
- fullArgString+=yytext;
- lastCopyArgChar=0;
- lastCommentInArgContext=YY_START;
- if (yytext[1]=='/')
- BEGIN( CopyArgCommentLine );
- else
- BEGIN( CopyArgComment );
- }
- }
- /* a non-special comment */
-<ReadFuncArgType,ReadTempArgs>"/*" {
- lastCContext = YY_START;
- BEGIN( SkipComment );
- }
-<ReadFuncArgType,ReadTempArgs>"//" {
- lastCContext = YY_START;
- BEGIN( SkipCxxComment );
- }
- /*
-<ReadFuncArgType,ReadTempArgs>"'#" { if (insidePHP)
- REJECT;
- *copyArgString+=yytext;
- fullArgString+=yytext;
- }
-<ReadFuncArgType,ReadTempArgs>"#" {
- if (!insidePHP)
- REJECT;
- lastCContext = YY_START;
- BEGIN( SkipCxxComment );
- }
- */
- /* `)' followed by a special comment */
-<ReadFuncArgType>")"{BN}*("/*"[*!]|"//"[/!])"<" {
- lineCount();
- if (currentArgumentContext==DefineEnd)
- {
- // for defines we interpret a comment
- // as documentation for the define
- int i;for (i=yyleng-1;i>0;i--)
- {
- unput(yytext[i]);
- }
- *copyArgString+=*yytext;
- fullArgString+=*yytext;
- stringToArgumentList(fullArgString,current->argList);
- BEGIN( currentArgumentContext );
- }
- else
- {
- // for functions we interpret a comment
- // as documentation for the last argument
- lastCopyArgChar=*yytext;
- QCString text=&yytext[1];
- text=text.stripWhiteSpace();
- lastCommentInArgContext=YY_START;
- fullArgString+=text;
- if (text.find("//")!=-1)
- BEGIN( CopyArgCommentLine );
- else
- BEGIN( CopyArgComment );
- }
- }
-<CopyArgComment>^{B}*"*"+/{BN}+
-<CopyArgComment>[^\n\\\@\*]+ { fullArgString+=yytext; }
-<CopyArgComment>"*/" { fullArgString+=yytext;
- if (lastCopyArgChar!=0)
- unput(lastCopyArgChar);
- BEGIN( lastCommentInArgContext );
- }
-<CopyArgCommentLine>\n { fullArgString+=yytext;
- yyLineNr++;
- if (lastCopyArgChar!=0)
- unput(lastCopyArgChar);
- BEGIN( lastCommentInArgContext );
- }
-<CopyArgCommentLine>[^\\\@\n]+ { fullArgString+=yytext; }
-<CopyArgCommentLine>. { fullArgString+=*yytext; }
-<CopyArgComment>\n { fullArgString+=*yytext; yyLineNr++; }
-<CopyArgComment>. { fullArgString+=*yytext; }
-<CopyArgComment>{CMD}("brief"|"short"){B}+ {
- warn(yyFileName,yyLineNr,
- "Warning: Ignoring %cbrief command inside argument documentation",*yytext
- );
- fullArgString+=' ';
- }
-<ReadTempArgs>"<" {
- *copyArgString+=*yytext;
- fullArgString+=*yytext;
- argSharpCount=1;
- BEGIN( CopyArgSharp );
- }
-<ReadTempArgs>">" {
- *copyArgString+=*yytext;
- fullArgString+=*yytext;
- //printf("end template list %s\n",copyArgString->data());
- stringToArgumentList(fullArgString,currentArgumentList);
- BEGIN( currentArgumentContext );
- }
-<CopyArgRound>"(" {
- argRoundCount++;
- *copyArgString+=*yytext;
- fullArgString+=*yytext;
- }
-<CopyArgRound>")" {
- *copyArgString+=*yytext;
- fullArgString+=*yytext;
- if (argRoundCount>0)
- argRoundCount--;
- else
- BEGIN( lastCopyArgContext );
- }
-<CopyArgSharp>"<" {
- argSharpCount++;
- //printf("argSharpCount++=%d copy\n",argSharpCount);
- *copyArgString+=*yytext;
- fullArgString+=*yytext;
- }
-<CopyArgSharp>">" {
- *copyArgString+=*yytext;
- fullArgString+=*yytext;
- argSharpCount--;
- if (argSharpCount>0)
- {
- //printf("argSharpCount--=%d copy\n",argSharpCount);
- }
- else
- {
- BEGIN( ReadTempArgs );
- //printf("end of argSharpCount\n");
- }
- }
-<CopyArgString,CopyArgPHPString>\\. {
- *copyArgString+=yytext;
- fullArgString+=yytext;
- }
-<CopyArgString>\" {
- *copyArgString+=*yytext;
- fullArgString+=*yytext;
- BEGIN( lastCopyArgStringContext );
- }
-<CopyArgPHPString>\' {
- *copyArgString+=*yytext;
- fullArgString+=*yytext;
- BEGIN( lastCopyArgStringContext );
- }
-<ReadFuncArgType,ReadTempArgs,CopyArgRound,CopyArgSharp>{CHARLIT} {
- if (insidePHP)
- {
- REJECT;
- }
- else
- {
- *copyArgString+=yytext;
- fullArgString+=yytext;
- }
- }
-<ReadFuncArgType,ReadTempArgs,CopyArgRound,CopyArgSharp>\' {
- *copyArgString+=yytext;
- fullArgString+=yytext;
- if (insidePHP)
- {
- lastCopyArgStringContext=YY_START;
- BEGIN(CopyArgPHPString);
- }
- }
-<ReadFuncArgType,ReadTempArgs,CopyArgString,CopyArgPHPString,CopyArgRound,CopyArgSharp>\n {
- yyLineNr++;
- *copyArgString+=*yytext;
- fullArgString+=*yytext;
- }
-<ReadFuncArgType,ReadTempArgs,CopyArgString,CopyArgPHPString,CopyArgRound,CopyArgSharp>. {
- *copyArgString+=*yytext;
- fullArgString+=*yytext;
- }
-
-
-
- /*------------------------------------------------------------------------*/
-
-
-<FuncRound>"(" { current->args += *yytext ;
- ++roundCount ;
- }
-<FuncRound>")" { current->args += *yytext ;
- if ( roundCount )
- --roundCount ;
- else
- BEGIN( FuncQual ) ;
- }
- /*
-<FuncQual>"#" { if (insidePHP)
- REJECT;
- lastCPPContext = YY_START;
- BEGIN(SkipCPP);
- }
- */
-<FuncQual>[{:;,] {
- if ( strcmp(yytext,";")==0 &&
- insidePHP &&
- !containsWord(current->type,"function") )
- {
- current->reset();
- initEntry();
- BEGIN( FindMembers );
- }
- else
- {
- unput(*yytext); BEGIN( Function );
- }
- }
-<FuncQual>{BN}*"const"{BN}* { // const member function
- lineCount() ;
- current->args += " const ";
- current->argList->constSpecifier=TRUE;
- }
-<FuncQual>{BN}*"volatile"{BN}* { // volatile member function
- lineCount() ;
- current->args += " volatile ";
- current->argList->volatileSpecifier=TRUE;
- }
-<FuncQual>{BN}*"="{BN}*"0"{BN}* { // pure virtual member function
- lineCount() ;
- current->args += " = 0";
- current->virt = Pure;
- current->argList->pureSpecifier=TRUE;
- }
-<FuncRound,FuncFunc>{BN}*","{BN}* {
- lineCount() ;
- current->args += ", " ;
- }
-<FuncQual,FuncRound,FuncFunc>{BN}+ {
- lineCount() ;
- current->args += ' ' ;
- }
-<Function,FuncQual,FuncRound,FuncFunc>"#" { if (insidePHP)
- REJECT;
- lastCPPContext = YY_START;
- BEGIN(SkipCPP);
- }
-<FuncQual>"=" { // typically an initialized function pointer
- //current->args += *yytext;
- //BEGIN(FuncPtrInit);
- lastInitializerContext=YY_START;
- initBracketCount=0;
- BEGIN(ReadInitializer);
- }
-<FuncPtrInit>[{;] {
- unput(*yytext);
- BEGIN(FuncQual);
- }
-<FuncPtrInit>\" {
- current->args += *yytext;
- pCopyQuotedString=&current->args;
- lastStringContext=FuncPtrInit;
- BEGIN(CopyString);
- }
-<FuncPtrInit>\' {
- current->args += *yytext;
- if (insidePHP)
- {
- pCopyQuotedString=&current->args;
- lastStringContext=FuncPtrInit;
- BEGIN(CopyPHPString);
- }
- }
-<FuncPtrInit>{CHARLIT} {
- if (insidePHP)
- {
- REJECT;
- }
- else
- {
- current->args += yytext;
- }
- }
-<FuncPtrInit>{ID} {
- current->args += yytext;
- }
-<FuncPtrInit>. {
- current->args += *yytext;
- }
-<FuncPtrInit>\n {
- current->args += *yytext;
- yyLineNr++;
- }
-<FuncQual>{ID} { // typically a K&R style C function
- if (checkForKnRstyleC())
- {
- //fprintf(stderr,"===> got a K&R style function\n");
- current->args = yytext;
- oldStyleArgType.resize(0);
- BEGIN(OldStyleArgs);
- }
- else
- {
- current->args += yytext;
- }
- }
-<OldStyleArgs>[,;] {
- QCString oldStyleArgPtr;
- QCString oldStyleArgName;
- splitKnRArg(oldStyleArgPtr,oldStyleArgName);
- QCString doc,brief;
- if (current->doc!=docBackup)
- {
- doc=current->doc.copy();
- current->doc=docBackup;
- }
- if (current->brief!=briefBackup)
- {
- brief=current->brief.copy();
- current->brief=briefBackup;
- }
- addKnRArgInfo(oldStyleArgType+oldStyleArgPtr,
- oldStyleArgName,brief,doc);
- current->args.resize(0);
- if (*yytext==';') oldStyleArgType.resize(0);
- }
-<OldStyleArgs>{ID} { current->args += yytext; }
-<OldStyleArgs>"{" {
- current->args = argListToString(current->argList);
- unput('{');
- BEGIN(FuncQual);
- }
-<OldStyleArgs>. { current->args += *yytext; }
-<FuncQual,FuncRound,FuncFunc>. { current->args += *yytext; }
-<FuncQual>{BN}*"try"{BN}+ { /* try-function-block */
- insideTryBlock=TRUE;
- lineCount();
- }
-<FuncQual>{BN}*"throw"{BN}*"(" { // C++ style throw clause
- current->exception = " throw (" ;
- roundCount=0;
- lineCount() ;
- BEGIN( ExcpRound ) ;
- }
-<FuncQual>{BN}*"raises"{BN}*"(" {
- current->exception = " raises (" ;
- lineCount() ;
- roundCount=0;
- BEGIN( ExcpRound ) ;
- }
-<FuncQual>{BN}*"throws"{BN}+ { // Java style throw clause
- current->exception = " throws " ;
- lineCount() ;
- BEGIN( ExcpList );
- }
-<ExcpRound>"(" { current->exception += *yytext ;
- ++roundCount ;
- }
-<ExcpRound>")" { current->exception += *yytext ;
- if ( roundCount )
- --roundCount ;
- else
- BEGIN( FuncQual ) ;
- }
-<ExcpRound>. {
- current->exception += *yytext;
- }
-<ExcpList>"{" {
- unput('{'); BEGIN( FuncQual );
- }
-<ExcpList>";" {
- unput(';'); BEGIN( FuncQual );
- }
-<ExcpList>"\n" {
- current->exception += ' ';
- yyLineNr++;
- }
-<ExcpList>. {
- current->exception += *yytext;
- }
-<Function>"(" { current->type += current->name ;
- current->name = current->args ;
- current->args = yytext ;
- roundCount=0;
- BEGIN( FuncRound ) ;
- }
-<Function>":" {
- if (!insidePHP) BEGIN(SkipInits);
- }
-<Function>[;{,] {
- current->name=current->name.simplifyWhiteSpace();
- current->type=current->type.simplifyWhiteSpace();
- current->args=removeRedundantWhiteSpace(current->args);
- // was: current->args.simplifyWhiteSpace();
- current->fileName = yyFileName;
- current->startLine = yyLineNr;
- if (*yytext!=';' || (current_root->section&Entry::COMPOUND_MASK) )
- {
- int tempArg=current->name.find('<');
- QCString tempName;
- static QRegExp re("operator[^a-z_A-Z0-9]");
- if (tempArg==-1) tempName=current->name; else tempName=current->name.left(tempArg);
- if (/*(current->type.isEmpty() && tempName.find(re)==-1) || */
- current->type.left(8)=="typedef "
- )
- {
- //printf("Scanner.l: found in class variable: `%s' `%s' `%s'\n",
- // current->type.data(),current->name.data(),current->args.data());
- current->section = Entry::VARIABLE_SEC ;
- }
- else
- {
- //printf("Scanner.l: found in class function: `%s' `%s' `%s'\n",
- // current->type.data(),current->name.data(),current->args.data());
- current->section = Entry::FUNCTION_SEC ;
- current->proto = *yytext==';';
- }
- }
- else // a global function prototype or function variable
- {
- static QRegExp re("([^)]*)");
- //printf("Scanner.l: prototype? type=`%s' name=`%s' args=`%s'\n",current->type.data(),current->name.data(),current->args.data());
- if (!current->type.isEmpty() &&
- (current->type.find(re,0)!=-1 || current->type.left(8)=="typedef "))
- {
- //printf("Scanner.l: found function variable!\n");
- current->section = Entry::VARIABLE_SEC;
- }
- else
- {
- //printf("Scanner.l: found prototype\n");
- current->section = Entry::FUNCTION_SEC;
- current->proto = TRUE;
- }
- }
- //printf("Adding entry `%s'\n",current->name.data());
- if ( insidePHP)
- {
- if (findAndRemoveWord(current->type,"final"))
- {
- current->memSpec |= Entry::Final;
- }
- if (findAndRemoveWord(current->type,"abstract"))
- {
- current->memSpec |= Entry::Abstract;
- }
- }
- if ( insidePHP && !containsWord(current->type,"function"))
- {
- initEntry();
- }
- else
- {
- if ( insidePHP)
- {
- findAndRemoveWord(current->type,"function");
- }
- previous = current;
- current_root->addSubEntry(current);
- current = new Entry ;
- initEntry();
- lastCurlyContext = FindMembers;
- if ( *yytext == ',' )
- {
- current->type = previous->type.data();
- }
- if ( *yytext == '{' )
- {
- if ( !insidePHP && (current_root->section & Entry::COMPOUND_MASK) )
- {
- previous->memSpec |= Entry::Inline;
- }
- //addToBody(yytext);
- curlyCount=0;
- BEGIN( SkipCurly ) ;
- }
- else
- {
- if (previous->section!=Entry::VARIABLE_SEC)
- previous->bodyLine=-1; // a function/member declaration
- BEGIN( FindMembers ) ;
- }
- }
- }
-<SkipInits>"{" {
- //addToBody(yytext);
- //lastCurlyContext = FindMembers;
- //curlyCount=0;
- //BEGIN( SkipCurly ) ;
- unput('{');
- BEGIN( Function );
- }
-<SkipCurly>"{" {
- //addToBody(yytext);
- ++curlyCount ;
- }
-<SkipCurly>"}" {
- //addToBody(yytext);
- if( curlyCount )
- {
- --curlyCount ;
- }
- else
- {
- if (!Config_getBool("HIDE_IN_BODY_DOCS") &&
- !current->doc.isEmpty())
- {
- // copy documentation found inside the body
- // to the previous item
- if (previous->inbodyLine==-1)
- {
- previous->inbodyLine = current->docLine;
- previous->inbodyFile = current->docFile;
- }
- previous->inbodyDocs += current->doc;
- current->doc.resize(0);
- }
- if (current->sli) // copy special list items
- {
- QListIterator<ListItemInfo> li(*current->sli);
- ListItemInfo *lii;
- for (li.toFirst();(lii=li.current());++li)
- {
- previous->addSpecialListItem(lii->type,lii->itemId);
- }
- delete current->sli;
- current->sli = 0;
- }
- previous->endBodyLine=yyLineNr;
- BEGIN( lastCurlyContext ) ;
- }
- }
-<SkipCurly>"}"{BN}*("/*!"|"/**"|"//!"|"///")"<" {
- if ( curlyCount )
- {
- //addToBody(yytext);
- --curlyCount ;
- }
- else
- {
- current->endBodyLine=yyLineNr;
- lineCount();
-
- tempEntry = current; // temporarily switch to the previous entry
- current = previous;
-
- docBlockContext = SkipCurlyEndDoc;
- docBlockInBody = FALSE;
- docBlockJavaStyle = yytext[yyleng-2]=='*' && Config_getBool("JAVADOC_AUTOBRIEF");
- docBlock.resize(0);
- docBlockTerm = '}';
- if (yytext[yyleng-3]=='/')
- {
- startCommentBlock(TRUE);
- BEGIN( DocLine );
- }
- else
- {
- startCommentBlock(FALSE);
- BEGIN( DocBlock );
- }
- }
- }
-<SkipCurlyEndDoc>"}" {
- //addToBody("}");
- current = tempEntry;
- BEGIN( lastCurlyContext );
- }
-<SkipCurly>\" {
- //addToBody(yytext);
- lastStringContext=SkipCurly;
- BEGIN( SkipString );
- }
-<SkipCurly>^{B}*"#" {
- if (insidePHP)
- REJECT;
- //addToBody(yytext);
- BEGIN( SkipCurlyCpp );
- }
-<SkipCurly,SkipInits>\n {
- yyLineNr++;
- //addToBody(yytext);
- }
-<SkipCurly,SkipCurlyCpp>[^\n"'@\\/{}]+ {
- //addToBody(yytext);
- }
-<SkipCurlyCpp>\n {
- //addToBody(yytext);
- yyLineNr++;
- lastCurlyContext = FindMembers;
- BEGIN( SkipCurly );
- }
-<SkipCurlyCpp>\\[\r]*"\n"[\r]* {
- //addToBody(yytext);
- yyLineNr++;
- }
-<SkipInits,SkipCurly,SkipCurlyCpp>"/*" {
- //addToBody(yytext);
- lastCContext = YY_START;
- BEGIN(SkipComment);
- }
-<SkipInits,SkipCurly,SkipCurlyCpp>"//" {
- //addToBody(yytext);
- lastCContext = YY_START;
- BEGIN(SkipCxxComment);
- }
-<SkipInits>\" {
- lastStringContext=YY_START;
- BEGIN( SkipString );
- }
-<SkipInits>; {
- warn(yyFileName,yyLineNr,
- "Warning: Found ';' while parsing initializer list! "
- "(doxygen could be confused by a macro call without semicolon)"
- );
- BEGIN( FindMembers );
- }
-<SkipInits,SkipCurly,SkipCurlyCpp>"#" {
- if (!insidePHP)
- REJECT;
- //addToBody(yytext);
- lastCContext = YY_START;
- BEGIN(SkipCxxComment);
- }
-<SkipInits,SkipCurly,SkipCurlyCpp>@\" {
- if (!insideCS) REJECT;
- // C# verbatim string
- lastSkipVerbStringContext=YY_START;
- pSkipVerbString=&current->initializer;
- BEGIN(SkipVerbString);
- }
-<SkipInits,SkipCurly,SkipCurlyCpp>{CHARLIT} {
- if (insidePHP) REJECT;
- }
-<SkipInits,SkipCurly,SkipCurlyCpp>\' {
- if (insidePHP)
- {
- lastStringContext=YY_START;
- BEGIN(SkipPHPString);
- }
- }
-<SkipInits,SkipCurly,SkipCurlyCpp>. { }
-<SkipString,SkipPHPString>\\. { }
-<SkipString>\" {
- BEGIN( lastStringContext );
- }
-<SkipPHPString>\' {
- BEGIN( lastStringContext );
- }
-<SkipString,SkipPHPString>"/*"|"*/"|"//" { }
-<SkipString,SkipPHPString>\n {
- yyLineNr++;
- }
-<SkipString,SkipPHPString>. { }
-<Bases,CompoundName>";" {
- current->section = Entry::EMPTY_SEC ;
- current->type.resize(0) ;
- current->name.resize(0) ;
- current->args.resize(0) ;
- current->argList->clear();
- BEGIN( FindMembers ) ;
- }
-<CompoundName>{SCOPENAME}{BN}*/"<" {
- sharpCount = 0;
- current->name = yytext ;
- if (current->section==Entry::PROTOCOL_SEC)
- {
- current->name+="-p";
- }
- lineCount();
- lastClassTemplSpecContext = ClassVar;
- if (insideObjC) // protocol list
- {
- BEGIN( ObjCProtocolList );
- }
- else // C++ template specialization
- {
- BEGIN( ClassTemplSpec );
- }
- }
-<ObjCProtocolList>"<" {
- insideProtocolList=TRUE;
- BEGIN( Bases );
- }
-<ClassTemplSpec>">"({BN}*"::"{BN}*{SCOPENAME})? {
- current->name += yytext;
- lineCount();
- if (--sharpCount<=0)
- {
- current->name = removeRedundantWhiteSpace(current->name);
- if (current->section == Entry::PROTOCOL_SEC)
- { // Objective-C protocol
- unput('{'); // fake start of body
- BEGIN( ClassVar );
- }
- else
- {
- BEGIN( lastClassTemplSpecContext );
- }
- }
- }
-<ClassTemplSpec>"<" {
- current->name += yytext;
- sharpCount++;
- }
-<ClassTemplSpec>. {
- current->name += yytext;
- }
-<CompoundName>{SCOPENAME}{BN}*";" { // forward declaration
- unput(';');
- current->reset();
- if (isTypedef) // typedef of a class, put typedef keyword back
- {
- current->type.prepend("typedef");
- }
- BEGIN( FindMembers );
- }
-<CompoundName>{SCOPENAME} {
- current->name = yytext ;
- lineCount();
- if (current->section == Entry::PROTOCOL_SEC)
- {
- current->name += "-p";
- }
- if (current->section == Entry::PROTOCOL_SEC /*||
- current->section == Entry::OBJCIMPL_SEC*/)
- {
- unput('{'); // fake start of body
- }
- BEGIN( ClassVar );
- }
-<CompoundName>{CSSCOPENAME} { // C# style scope
- current->name = substitute(yytext,".","::");
- lineCount();
- BEGIN( ClassVar );
- }
-<ClassVar>{SCOPENAME}{BN}*/"(" {
- if (insideIDL && strncmp(yytext,"switch",6)==0 && !isId(yytext[6]))
- {
- // Corba IDL style union
- roundCount=0;
- BEGIN(SkipUnionSwitch);
- }
- else
- {
- addType(current);
- current->name = yytext;
- current->name = current->name.stripWhiteSpace();
- lineCount();
- BEGIN( FindMembers );
- }
- }
-<ClassVar>"," {
- if (isTypedef)
- {
- // multiple types in one typedef
- unput(',');
- current->type.prepend("typedef ");
- BEGIN(FindMembers);
- }
- else
- {
- // Multiple class forward declaration
- }
- }
-<ClassVar>{ID} {
- if (insideIDL && strcmp(yytext,"switch")==0)
- {
- // Corba IDL style union
- roundCount=0;
- BEGIN(SkipUnionSwitch);
- }
- else if ((insideJava || insidePHP) && (strcmp(yytext,"implements")==0 || strcmp(yytext,"extends")==0))
- {
- current->type.resize(0);
- baseProt=Public;
- baseVirt=Normal;
- baseName.resize(0);
- BEGIN( BasesProt ) ;
- }
- else
- {
- if (current->section == Entry::ENUM_SEC)
- { // found "enum a b" -> variable
- current->section = Entry::VARIABLE_SEC ;
- }
- current->type += ' ' ;
- current->type += current->name ;
- current->name = yytext ;
- }
- }
-<ClassVar>[(\[] {
- if (insideObjC && *yytext=='(') // class category
- {
- current->name+='(';
- if (current->section!=Entry::OBJCIMPL_SEC)
- {
- current->section=Entry::CATEGORY_SEC;
- }
- BEGIN( ClassCategory );
- }
- else
- {
- // probably a function anyway
- unput(*yytext);
- BEGIN( FindMembers );
- }
- }
-<ClassCategory>{ID} {
- current->name+=yytext;
- }
-<ClassCategory>")" {
- current->name+=')';
- // category has no variables so push back an empty body
- unput('}');
- unput('{');
- BEGIN( ClassVar );
- }
-<ClassVar>":" {
- current->type.resize(0);
- if (current->section == Entry::INTERFACE_SEC ||
- current->section == Entry::STRUCT_SEC ||
- insidePHP || insideCS || insideD || insideObjC
- )
- baseProt=Public;
- else
- baseProt=Private;
- baseVirt=Normal;
- baseName.resize(0);
- BEGIN( BasesProt ) ;
- }
-<ClassVar>[;=*&] {
- unput(*yytext);
- if (isTypedef) // typedef of a class, put typedef keyword back
- {
- current->type.prepend("typedef");
- }
- BEGIN( FindMembers );
- }
-<Bases,ClassVar>"///"/[^/] {
- if (!insideObjC)
- {
- REJECT;
- }
- else
- {
- lineCount();
- current->program+=yytext;
- current->fileName = yyFileName ;
- current->startLine = yyLineNr ;
- curlyCount=0;
- BEGIN( ReadBodyIntf );
- }
- }
-<Bases,ClassVar>("//"{B}*)?"/**"/[^/*] |
-<Bases,ClassVar>("//"{B}*)?"/*!" |
-<Bases,ClassVar>"//!" |
-<Bases,ClassVar>[\-+]{BN}+ {
- if (!insideObjC)
- {
- REJECT;
- }
- else
- {
- lineCount();
- current->program+=yytext;
- current->fileName = yyFileName ;
- current->startLine = yyLineNr ;
- curlyCount=0;
- BEGIN( ReadBodyIntf );
- }
- }
-<CompoundName,ClassVar>{B}*"{"{B}* {
- current->fileName = yyFileName ;
- current->startLine = yyLineNr ;
- current->name = removeRedundantWhiteSpace(current->name);
- if (current->name.isEmpty() && !isTypedef) // anonymous compound
- {
- current->name.sprintf("@%d",anonCount++);
- }
- curlyCount=0;
- if (/*current->section==Entry::PROTOCOL_SEC ||
- current->section==Entry::OBJCIMPL_SEC*/
- insideObjC
- )
- { // ObjC body that ends with @end
- BEGIN( ReadBodyIntf );
- }
- else if (current->section==Entry::NAMESPACE_SEC)
- { // namespace body
- BEGIN( ReadNSBody );
- }
- else
- { // class body
- BEGIN( ReadBody ) ;
- }
- }
-<BasesProt>"virtual"{BN}+ { lineCount(); baseVirt = Virtual; }
-<BasesProt>"public"{BN}+ { lineCount(); baseProt = Public; }
-<BasesProt>"protected"{BN}+ { lineCount(); baseProt = Protected; }
-<BasesProt>"private"{BN}+ { lineCount(); baseProt = Private; }
-<BasesProt>{BN} { lineCount(); }
-<BasesProt>. { unput(*yytext); BEGIN(Bases); }
-<Bases>("::")?{BN}*({ID}{BN}*"::"{BN}*)*{ID} {
- baseName+=yytext;
- current->args += ' ';
- current->args += yytext;
- }
-<Bases>{BN}*{ID}("."{ID})* { // Java style class
- QCString name = substitute(yytext,".","::");
- baseName += name;
- current->args += ' ';
- current->args += name;
- }
-<ClassVar,Bases>\n/{BN}* {
- if (!insideObjC)
- {
- REJECT;
- }
- else
- {
- yyLineNr++;
- //unput('{');
- }
- }
-<ClassVar,Bases>"@end" { // empty ObjC interface
- unput('d'); // insert fake body: {}@end
- unput('n');
- unput('e');
- unput('@');
- unput('}');
- unput('{');
- }
-<ClassVar>"<" { current->name += *yytext;
- sharpCount=1;
- roundCount=0;
- lastSkipSharpContext = YY_START;
- specName = &current->name;
- BEGIN ( Specialization );
- }
-<Bases>"<" {
- sharpCount=1;
- roundCount=0;
- lastSkipSharpContext = YY_START;
- if (insideObjC) // start of protocol list
- {
- unput(',');
- }
- else // template specialization
- {
- baseName += *yytext;
- specName = &baseName;
- BEGIN ( Specialization );
- }
- }
-<Specialization>"<" { *specName += *yytext;
- if (roundCount==0) sharpCount++;
- }
-<Specialization>">" {
- *specName += *yytext;
- if (roundCount==0 && --sharpCount<=0)
- BEGIN(lastSkipSharpContext);
- }
-<Specialization>{BN}+ { lineCount(); *specName +=' '; }
-<Specialization>"<<" { *specName += yytext; }
-<Specialization>">>" { *specName += yytext; }
-<Specialization>"typename"{BN}+ { lineCount(); }
-<Specialization>"(" { *specName += *yytext; roundCount++; }
-<Specialization>")" { *specName += *yytext; roundCount--; }
-<Specialization>. {
- *specName += *yytext;
- }
-<SkipSharp>"<" { ++sharpCount; }
-<SkipSharp>">" { if (--sharpCount<=0)
- BEGIN ( lastSkipSharpContext );
- }
-<SkipRound>"(" { ++roundCount; }
-<SkipRound>")" { if (--roundCount<=0)
- BEGIN ( lastSkipRoundContext );
- }
-<Bases>","|">"|({BN}+"implements"{BN}*) { lineCount();
- if (insideProtocolList)
- {
- baseName+="-p";
- }
- else
- {
- current->args += ',' ;
- }
- current->name = removeRedundantWhiteSpace(current->name);
- if (!baseName.isEmpty())
- {
- current->extends->append(
- new BaseInfo(baseName,baseProt,baseVirt)
- );
- }
- if (current->section==Entry::INTERFACE_SEC ||
- insideJava || insidePHP || insideCS ||
- insideD || insideObjC)
- {
- baseProt=Public;
- }
- else
- {
- baseProt=Private;
- }
- baseVirt=Normal;
- baseName.resize(0);
- if (*yytext=='>')
- { // end of a ObjC protocol list
- insideProtocolList=FALSE;
- }
- else
- {
- if (*yytext==',' && insideObjC) // Begin of protocol list
- {
- insideProtocolList=TRUE;
- }
- BEGIN(BasesProt);
- }
- }
-<Bases>{B}*"{"{B}* { current->fileName = yyFileName ;
- current->startLine = yyLineNr ;
- current->name = removeRedundantWhiteSpace(current->name);
- if (!baseName.isEmpty())
- current->extends->append(
- new BaseInfo(baseName,baseProt,baseVirt)
- );
- curlyCount=0;
- if (insideObjC)
- {
- BEGIN( ReadBodyIntf );
- }
- else
- {
- BEGIN( ReadBody ) ;
- }
- }
-<SkipUnionSwitch>{B}*"(" {
- roundCount++;
- }
-<SkipUnionSwitch>")" {
- if (--roundCount==0)
- {
- BEGIN(ClassVar);
- }
- }
-<SkipUnionSwitch>\n { yyLineNr++; }
-<SkipUnionSwitch>.
-<Comment>{BN}+ { current->program += yytext ;
- lineCount() ;
- }
-<Comment>"/*" { current->program += yytext ; }
-<Comment>"//" { current->program += yytext ; }
-<Comment>{CMD}("code"|"verbatim") {
- insideCode=TRUE;
- current->program += yytext ;
- }
-<Comment>{CMD}("endcode"|"endverbatim") {
- insideCode=FALSE;
- current->program += yytext ;
- }
-<Comment>[^ \.\n\/\*]+ { current->program += yytext ; }
-<Comment>"*/" { current->program += yytext ;
- if (!insideCode) BEGIN( lastContext ) ;
- }
-<Comment>. { current->program += *yytext ; }
-
-<FindMembers,FindFields,MemberSpec,FuncQual,SkipCurly,Operator,ClassVar,SkipInits,Bases,OldStyleArgs>("//"{B}*)?"/*!" {
- //printf("Start doc block at %d\n",yyLineNr);
- removeSlashes=(yytext[1]=='/');
- tmpDocType=-1;
- if (YY_START!=SkipCurly)
- {
- current->doc.resize(0);
- current->docLine = yyLineNr;
- current->docFile = yyFileName;
- }
- lastDocContext = YY_START;
- if (current_root->section & Entry::SCOPE_MASK)
- {
- current->inside = current_root->name+"::";
- //if (current->mGrpId!=DOX_NOGROUP)
- //{
- // memberGroupInside = current->inside.copy();
- //}
- }
- docBlockContext = YY_START;
- docBlockInBody = YY_START==SkipCurly;
- docBlockJavaStyle = FALSE;
- docBlock.resize(0);
- startCommentBlock(FALSE);
- BEGIN( DocBlock );
- }
-<FindMembers,FindFields,MemberSpec,FuncQual,SkipCurly,Operator,ClassVar,SkipInits,Bases,OldStyleArgs>("//"{B}*)?"/**"/[^/*] {
- removeSlashes=(yytext[1]=='/');
- lastDocContext = YY_START;
- //printf("Found comment block at %s:%d\n",yyFileName,yyLineNr);
- if (current_root->section & Entry::SCOPE_MASK)
- {
- current->inside = current_root->name+"::";
- //if (current->mGrpId!=DOX_NOGROUP)
- //{
- // memberGroupInside = current->inside.copy();
- //}
- }
- current->docLine = yyLineNr;
- current->docFile = yyFileName;
- docBlockContext = YY_START;
- docBlockInBody = YY_START==SkipCurly;
- docBlockJavaStyle = Config_getBool("JAVADOC_AUTOBRIEF");
- docBlock.resize(0);
- if (docBlockJavaStyle)
- {
- current->briefLine = yyLineNr;
- current->briefFile = yyFileName;
- }
- if (!docBlockInBody)
- {
- current->doc.resize(0);
- if (docBlockJavaStyle)
- {
- current->brief.resize(0);
- }
- }
- startCommentBlock(FALSE);
- BEGIN( DocBlock );
- }
-<FindMembers,FindFields,MemberSpec,SkipCurly,FuncQual,Operator,ClassVar,Bases,OldStyleArgs>"//!" {
- if (YY_START!=SkipCurly)
- {
- current->brief.resize(0);
- current->briefFile=yyFileName;
- current->briefLine=yyLineNr;
- }
- tmpDocType=-1;
- lastDocContext = YY_START;
- if (current_root->section & Entry::SCOPE_MASK)
- {
- current->inside = current_root->name+"::";
- //if (current->mGrpId!=DOX_NOGROUP)
- //{
- // memberGroupInside = current->inside.copy();
- //}
- }
- docBlockContext = YY_START;
- docBlockInBody = YY_START==SkipCurly;
- docBlockJavaStyle = FALSE;
- docBlock.resize(0);
- startCommentBlock(TRUE);
- BEGIN( DocLine );
- }
-<FindMembers,FindFields,MemberSpec,SkipCurly,FuncQual,Operator,ClassVar,Bases,OldStyleArgs>"///"/[^/] {
- if (YY_START!=SkipCurly)
- {
- current->brief.resize(0);
- current->briefFile=yyFileName;
- current->briefLine=yyLineNr;
- }
- tmpDocType=-1;
- lastDocContext = YY_START;
- if (current_root->section & Entry::SCOPE_MASK)
- {
- current->inside = current_root->name+"::";
- //if (current->mGrpId!=DOX_NOGROUP)
- //{
- // memberGroupInside = current->inside.copy();
- //}
- }
- docBlockContext = YY_START;
- docBlockInBody = YY_START==SkipCurly;
- docBlockJavaStyle = FALSE;
- docBlock.resize(0);
- startCommentBlock(TRUE);
- BEGIN( DocLine );
- }
-<FindMembers>"extern"{BN}*"\"C"("++")?"\""{BN}*("{")? {
- lineCount();
- }
-<FindMembers>"{" {
- if (insideCS && !current->name.isEmpty() && !current->type.isEmpty())
- {
- if (containsWord(current->type,"event")) // event
- {
- current->mtype = mtype = Event;
- }
- else // property
- {
- current->mtype = mtype = Property;
- }
- current->bodyLine = yyLineNr;
- curlyCount=0;
- BEGIN(CSAccessorDecl);
- }
- else
- {
- if ((insideJava || insideCS || insideD) &&
- current->name.isEmpty()
- )
- {
- // static Java initializer
- needsSemi = FALSE;
- if (current->stat)
- {
- current->name="[static initializer]";
- current->type.resize(0);
- }
- else
- {
- current->name="[instance initializer]";
- }
- unput(*yytext);
- BEGIN( Function );
- }
- else
- {
- needsSemi = TRUE;
- current->type.resize(0);
- current->name.resize(0);
- current->args.resize(0);
- current->argList->clear();
- curlyCount=0;
- BEGIN( SkipCurlyBlock );
- }
- }
- }
-<CSAccessorDecl>"{" { curlyCount++; }
-<CSAccessorDecl>"}" {
- if (curlyCount)
- {
- curlyCount--;
- }
- else
- {
- unput(';');
- BEGIN(FindMembers);
- }
- }
-<CSAccessorDecl>"set" { if (curlyCount==0) current->memSpec |= Entry::Settable; }
-<CSAccessorDecl>"get" { if (curlyCount==0) current->memSpec |= Entry::Gettable; }
-<CSAccessorDecl>. {}
-<CSAccessorDecl>\n { yyLineNr++; }
-
-
-
-
- /**********************************************************************************/
- /******************** Documentation block related rules ***************************/
- /**********************************************************************************/
-
- /* ---- Single line comments ------ */
-
-<DocLine>[^\n]*/"\n" { // whole line
- handleCommentBlock(yytext,TRUE);
- BEGIN( docBlockContext );
- }
-
- /* ---- Comments blocks ------ */
-
-<DocBlock>"*"*"*/" { // end of comment block
- handleCommentBlock(docBlock,FALSE);
- BEGIN(docBlockContext);
- }
-<DocBlock>^{B}*("//")?{B}*"*"+/[^//] { // start of a comment line
- }
-<DocBlock>^{B}*("//"){B}* { // strip embedded C++ comments if at the start of a line
- }
-<DocBlock>"//" { // slashes in the middle of a comment block
- docBlock+=yytext;
- }
-<DocBlock>"/*" { // start of a new comment in the
- // middle of a comment block
- docBlock+=yytext;
- }
-<DocBlock>("@@"|"\\\\"){ID}/[^a-z_A-Z0-9] { // escaped command
- docBlock+=yytext;
- }
-<DocBlock>{CMD}("verbatim"|"latexonly"|"htmlonly"|"xmlonly"|"manonly"|"dot"|"code"|"f$"|"f["|"f{")/[^a-z_A-Z0-9] { // verbatim command (which could contain nested comments!)
- docBlock+=yytext;
- if (yytext[2]=='[')
- {
- docBlockName="f]";
- }
- else if (yytext[2]=='}')
- {
- docBlockName="f}";
- }
- else
- {
- docBlockName=&yytext[1];
- }
- BEGIN(DocCopyBlock);
- }
-<DocBlock>[^@*\/\\\n]+ { // any character that isn't special
- docBlock+=yytext;
- }
-<DocBlock>\n { // newline
- yyLineNr++;
- docBlock+=*yytext;
- }
-<DocBlock>. { // command block
- docBlock+=*yytext;
- }
-
- /* ---- Copy verbatim sections ------ */
-
-<DocCopyBlock>[\\@]("endverbatim"|"endlatexonly"|"endhtmlonly"|"endxmlonly"|"enddot"|"endcode"|"f$"|"f]"|"f}")/[^a-z_A-Z0-9] { // end of verbatim block
- docBlock+=yytext;
- if (yytext[1]=='f') // end of formula
- {
- BEGIN(DocBlock);
- }
- if (&yytext[4]==docBlockName)
- {
- BEGIN(DocBlock);
- }
- }
-<DocCopyBlock>^{B}*"*"+/{BN}+ { // start of a comment line
- if (docBlockName=="verbatim")
- {
- REJECT;
- }
- }
-<DocCopyBlock>[^@/*\\\n]+ { // any character that is not special
- docBlock+=yytext;
- }
-<DocCopyBlock>"/*"|"*/"|"//" {
- docBlock+=yytext;
- }
-<DocCopyBlock>\n { // newline
- docBlock+=*yytext;
- yyLineNr++;
- }
-<DocCopyBlock>. { // any other character
- docBlock+=*yytext;
- }
-<DocCopyBlock><<EOF>> {
- warn(yyFileName,yyLineNr,
- "Warning: reached end of file while inside a %s block!\n",
- docBlockName.data());
- yyterminate();
- }
-
-
- /* ------------- Prototype parser -------------- */
-
-<Prototype>"operator"{B}*"("{B}*")" {
- current->name+=yytext;
- }
-<Prototype>"(" {
- current->args+=*yytext;
- currentArgumentContext = PrototypeQual;
- fullArgString = current->args.copy();
- copyArgString = &current->args;
- BEGIN( ReadFuncArgType ) ;
- }
-<Prototype>"("({ID}"::")*({B}*"*")+ {
- current->type+=current->name+yytext;
- current->name.resize(0);
- BEGIN( PrototypePtr );
- }
-<PrototypePtr>{SCOPENAME} {
- current->name+=yytext;
- }
-<PrototypePtr>")" {
- current->type+=')';
- BEGIN( Prototype );
- }
-<PrototypeQual>"{" {
- BEGIN( PrototypeSkipLine);
- }
-<PrototypeQual>{B}*"const"{B}* {
- current->args += " const ";
- current->argList->constSpecifier=TRUE;
- }
-<PrototypeQual>{B}*"volatile"{B}* {
- current->args += " volatile ";
- current->argList->volatileSpecifier=TRUE;
- }
-<PrototypeQual>{B}*"="{B}*"0"{B}* {
- current->args += " = 0";
- current->virt = Pure;
- current->argList->pureSpecifier=TRUE;
- }
-<PrototypeQual>"throw"{B}*"(" {
- current->exception = "throw(";
- BEGIN(PrototypeExc);
- }
-<PrototypeExc>")" {
- current->exception += ')';
- BEGIN(PrototypeQual);
- }
-<PrototypeExc>. {
- current->exception += *yytext;
- }
-<Prototype,PrototypeQual>. {
- current->name += *yytext;
- }
-<PrototypeSkipLine>. {
- }
-
-
- /* ------------ Generic rules -------------- */
-
-
-<SkipCxxComment>.*/\n {
- BEGIN( lastCContext ) ;
- }
-<SkipComment>[^\*\n]+
-<*>\n { yyLineNr++ ; }
-<*>\" {
- if (insideIDL && insideCppQuote)
- {
- BEGIN(EndCppQuote);
- }
- }
-<*>"#" {
- if (!insidePHP)
- REJECT;
- lastCContext = YY_START ;
- BEGIN( SkipCxxComment ) ;
- }
-<*>\' {
- if (insidePHP)
- {
- lastStringContext=YY_START;
- BEGIN(SkipPHPString);
- }
- }
-<*>\" {
- if (insidePHP)
- {
- lastStringContext=YY_START;
- BEGIN(SkipString);
- }
- }
-<*>.
-<SkipComment>"//"|"/*"
-<*>"/*" { lastCContext = YY_START ;
- BEGIN( SkipComment ) ;
- }
-<SkipComment>{B}*"*/" { BEGIN( lastCContext ) ; }
-<*>"//" {
- lastCContext = YY_START ;
- BEGIN( SkipCxxComment ) ;
- }
-%%
-
-//----------------------------------------------------------------------------
-
-static void startCommentBlock(bool brief)
-{
- if (brief)
- {
- current->briefFile = yyFileName;
- current->briefLine = yyLineNr;
- }
- else
- {
- current->docFile = yyFileName;
- current->docLine = yyLineNr;
- }
-}
-
-//----------------------------------------------------------------------------
-
-static void newEntry()
-{
- current_root->addSubEntry(current);
- previous = current;
- current = new Entry ;
- initEntry();
-}
-
-static void handleCommentBlock(const QCString &doc,bool brief)
-{
- int position=0;
- bool needsEntry;
- if (docBlockInBody)
- {
- if (previous==0)
- {
- ASSERT(previous!=0); // shouldn't happen
- goto exit;
- }
- if (!previous->doc.isEmpty())
- { // start a new paragraph for the next piece of text found in the body
- previous->doc=previous->doc.stripWhiteSpace()+"\n\n";
- }
- }
- //printf("parseCommentBlock [%s]\n",doc.data());
- while (parseCommentBlock(
- g_thisParser,
- docBlockInBody ? previous : current,
- doc, // text
- yyFileName, // file
- brief ? current->briefLine : current->docLine, // line of block start
- docBlockInBody ? FALSE : brief,
- docBlockInBody ? FALSE : docBlockJavaStyle,
- protection,
- position,
- needsEntry
- )
- )
- {
- //printf("parseCommentBlock position=%d [%s]\n",position,doc.data()+position);
- if (needsEntry) newEntry();
- }
- if (needsEntry)
- {
- newEntry();
- }
-
-exit:
- if (docBlockTerm)
- {
- unput(docBlockTerm);
- docBlockTerm=0;
- }
-}
-
-//----------------------------------------------------------------------------
-
-//static void startGroupInDoc()
-//{
-// if (current->section==Entry::GROUPDOC_SEC ) /* scope for a non-member group: @defgroup */
-// {
-// autoGroupStack.push(new Grouping(current->name,
-// current->groupingPri()
-// ));
-// }
-// else /* if (current->section == Entry::MEMBERGRP_SEC) scope for a member group: @name */
-// {
-// if (memberGroupId!=DOX_NOGROUP)
-// {
-// warn(yyFileName,yyLineNr,"Warning: member groups cannot be nested. Ending current group!\n");
-// endGroup();
-// }
-// memberGroupId = newMemberGroupId();
-// MemberGroupInfo *info = new MemberGroupInfo;
-// if (current->section == Entry::MEMBERGRP_SEC)
-// {
-// info->header = memberGroupHeader.stripWhiteSpace();
-// }
-// Doxygen::memGrpInfoDict.insert(memberGroupId,info);
-// memberGroupRelates = current->relates;
-// memberGroupInside = current->inside;
-// current->mGrpId = memberGroupId;
-// }
-//}
-//
-////----------------------------------------------------------------------------
-//
-//static void endGroup()
-//{
-// if (memberGroupId!=DOX_NOGROUP) // end of member group
-// {
-// //Doxygen::memberDocDict.insert(memberGroupId,
-// // new QCString(memberGroupDocs)
-// // );
-// MemberGroupInfo *info=Doxygen::memGrpInfoDict.find(memberGroupId);
-// if (info)
-// {
-// info->doc = memberGroupDocs;
-// info->docFile = yyFileName;
-// }
-// memberGroupId=DOX_NOGROUP;
-// memberGroupRelates.resize(0);
-// memberGroupInside.resize(0);
-// if (YY_START!=ReadInitializer)
-// {
-// current->mGrpId=DOX_NOGROUP;
-// current->relates.resize(0);
-// }
-// memberGroupDocs.resize(0);
-// }
-// else if (!autoGroupStack.isEmpty()) // end of group
-// {
-// Grouping *current = autoGroupStack.pop();
-// Grouping *parent = autoGroupStack.top();
-// if( parent ) {
-// setCurrentGroup( &parent->groupname, parent->pri );
-// } else {
-// setCurrentGroup( 0, Grouping::GROUPING_LOWEST );
-// }
-// delete current;
-// }
-//}
-//
-////----------------------------------------------------------------------------
-//
-//static void forceEndGroup()
-//{
-// while (memberGroupId!=DOX_NOGROUP || !autoGroupStack.isEmpty())
-// {
-// //printf("forceEndGroup ends group %d\n",memberGroupId);
-// endGroup();
-// }
-//}
-
-//----------------------------------------------------------------------------
-
-static void parseCompounds(Entry *rt)
-{
- //printf("parseCompounds(%s)\n",rt->name.data());
- g_inputFromFile = FALSE;
- EntryListIterator eli(*rt->sublist);
- Entry *ce;
- for (;(ce=eli.current());++eli)
- {
- if (!ce->program.isEmpty())
- {
- //printf("-- %s ---------\n%s\n---------------\n",
- // ce->name.data(),ce->program.data());
- // init scanner state
- padCount=0;
- depthIf = 0;
- inputString = ce->program;
- inputPosition = 0;
- scanYYrestart( scanYYin ) ;
- if (ce->section==Entry::ENUM_SEC)
- BEGIN( FindFields ) ;
- else
- BEGIN( FindMembers ) ;
- current_root = ce ;
- yyFileName = ce->fileName;
- setContext();
- yyLineNr = ce->startLine ;
- insideObjC = ce->objc;
- //printf("---> Inner block starts at line %d objC=%d\n",yyLineNr,insideObjC);
- //current->reset();
- if (current) delete current;
- current = new Entry;
- gstat = FALSE;
- int ni=ce->name.findRev("::"); if (ni==-1) ni=0; else ni+=2;
- // set default protection based on the compound type
- if( ce->section==Entry::CLASS_SEC ) // class
- {
- if (
- ce->fileName.right(4)==".php" ||
- ce->fileName.right(4)==".inc" ||
- ce->fileName.right(2)==".d"
- )
- current->protection = protection = Public ;
- else if (ce->fileName.right(5)==".java")
- current->protection = protection = Package ;
- else
- current->protection = protection = Private ;
- }
- else if (ce->section == Entry::ENUM_SEC ) // enum
- {
- current->protection = protection = ce->protection;
- }
- else if (!ce->name.isEmpty() && ce->name.at(ni)=='@') // unnamed union or namespace
- {
- if (ce->section == Entry::NAMESPACE_SEC ) // unnamed namespace
- {
- current->stat = gstat = TRUE;
- }
- current->protection = protection = ce->protection;
- }
- else if (ce->section==Entry::INTERFACE_SEC)
- {
- if (ce->objc)
- {
- current->protection = protection = Protected ;
- }
- else
- {
- current->protection = protection = Public ;
- }
- }
- else // named struct, union, protocol, category
- {
- current->protection = protection = Public ;
- }
- mtype = Method;
- virt = Normal;
- //printf("name=%s current->stat=%d gstat=%d\n",ce->name.data(),current->stat,gstat);
-
- //memberGroupId = DOX_NOGROUP;
- //memberGroupRelates.resize(0);
- //memberGroupInside.resize(0);
- groupEnterCompound(yyFileName,yyLineNr,ce->name);
-
- scanYYlex() ;
- //forceEndGroup();
-
- groupLeaveCompound(yyFileName,yyLineNr,ce->name);
-
- delete current; current=0;
- ce->program.resize(0);
-
-
- if (depthIf>0)
- {
- warn(yyFileName,yyLineNr,"Documentation block ended in the middle of a conditional section!");
- }
- }
- parseCompounds(ce);
- }
-}
-
-//----------------------------------------------------------------------------
-
-static void parseMain(const char *fileName,const char *fileBuf,Entry *rt)
-{
- initParser();
- //g_inputFromFile = TRUE;
-
- inputString = fileBuf;
- inputPosition = 0;
- g_inputFromFile = FALSE;
-
- anonCount = 0;
- depthIf = 0;
- protection = Public;
- mtype = Method;
- gstat = FALSE;
- virt = Normal;
- current_root = rt;
- global_root = rt;
- inputFile.setName(fileName);
- if (inputFile.open(IO_ReadOnly))
- {
- yyLineNr= 1 ;
- yyFileName = fileName;
- setContext();
- msg("Parsing file %s...\n",yyFileName.data());
-
- current_root = rt ;
- initParser();
- groupEnterFile(yyFileName,yyLineNr);
- current = new Entry;
- int sec=guessSection(yyFileName);
- if (sec)
- {
- current->name = yyFileName;
- current->section = sec;
- current_root->addSubEntry(current);
- current = new Entry;
- }
- current->reset();
- scanYYrestart( scanYYin );
- if ( insidePHP )
- {
- BEGIN( FindMembersPHP );
- }
- else
- {
- BEGIN( FindMembers );
- }
-
- scanYYlex();
-
- if (YY_START==Comment)
- {
- warn(yyFileName,yyLineNr,"File ended in the middle of a comment block! Perhaps a missing \\endcode?");
- }
-
- //forceEndGroup();
- groupLeaveFile(yyFileName,yyLineNr);
-
- if (depthIf>0)
- {
- warn(yyFileName,yyLineNr,"Documentation block ended in the middle of a conditional section!");
- }
-
- rt->program.resize(0);
- delete current; current=0;
-
- parseCompounds(rt);
-
- inputFile.close();
- }
-}
-
-//----------------------------------------------------------------------------
-
-static void parsePrototype(const QCString &text)
-{
- //printf("**** parsePrototype(%s) begin\n",text.data());
- if (text.isEmpty())
- {
- warn(yyFileName,yyLineNr,"Empty prototype found!");
- return;
- }
-
- const char *orgInputString;
- int orgInputPosition;
- YY_BUFFER_STATE orgState;
- bool orgInputFromFile;
-
- // save scanner state
- orgState = YY_CURRENT_BUFFER;
- yy_switch_to_buffer(yy_create_buffer(scanYYin, YY_BUF_SIZE));
- orgInputString = inputString;
- orgInputPosition = inputPosition;
- orgInputFromFile = g_inputFromFile;
-
- // set new string
- inputString = text;
- inputPosition = 0;
- g_inputFromFile = FALSE;
- scanYYrestart( scanYYin );
- BEGIN(Prototype);
- scanYYlex();
-
- current->name = current->name.stripWhiteSpace();
- if (current->section == Entry::MEMBERDOC_SEC && current->args.isEmpty())
- current->section = Entry::VARIABLEDOC_SEC;
-
- // restore original scanner state
- YY_BUFFER_STATE tmpState = YY_CURRENT_BUFFER;
- yy_switch_to_buffer(orgState);
- yy_delete_buffer(tmpState);
- inputString = orgInputString;
- inputPosition = orgInputPosition;
- g_inputFromFile = orgInputFromFile;
-
- //printf("**** parsePrototype end\n");
-}
-
-//static void handleGroupStartCommand(const char *header)
-//{
-// memberGroupHeader=header;
-// startGroupInDoc();
-//}
-//
-//static void handleGroupEndCommand()
-//{
-// endGroup();
-// previous=0;
-//}
-
-//----------------------------------------------------------------------------
-
-void CLanguageScanner::parseInput(const char *fileName,const char *fileBuf,Entry *root)
-{
- g_thisParser = this;
- ::parseMain(fileName,fileBuf,root);
-}
-
-void CLanguageScanner::parseCode(CodeOutputInterface & codeOutIntf,
- const char * scopeName,
- const QCString & input,
- bool isExampleBlock,
- const char * exampleName,
- FileDef * fileDef,
- int startLine,
- int endLine,
- bool inlineFragment,
- MemberDef *memberDef
- )
-{
- ::parseCCode(codeOutIntf,scopeName,input,isExampleBlock,exampleName,
- fileDef,startLine,endLine,inlineFragment,memberDef);
-}
-
-bool CLanguageScanner::needsPreprocessing(const QCString &extension)
-{
- QCString fe=extension.lower();
- return
- !( fe==".java" || fe==".as" || fe==".cs" || fe==".d" || fe==".php" ||
- fe==".php4" || fe==".inc" || fe==".phtml" || fe==".m" || fe==".mm"
- );
-}
-
-void CLanguageScanner::resetCodeParserState()
-{
- ::resetCCodeParserState();
-}
-
-void CLanguageScanner::parsePrototype(const char *text)
-{
- ::parsePrototype(text);
-}
-
-
-//----------------------------------------------------------------------------
-
-#if !defined(YY_FLEX_SUBMINOR_VERSION)
-//----------------------------------------------------------------------------
-extern "C" { // some bogus code to keep the compiler happy
- void scannerYYdummy() { yy_flex_realloc(0,0); }
-}
-#endif
-
diff --git a/src/search.php b/src/search.php
deleted file mode 100644
index b908125..0000000
--- a/src/search.php
+++ /dev/null
@@ -1,327 +0,0 @@
-function readInt($file)
-{
- $b1 = ord(fgetc($file)); $b2 = ord(fgetc($file));
- $b3 = ord(fgetc($file)); $b4 = ord(fgetc($file));
- return ($b1<<24)|($b2<<16)|($b3<<8)|$b4;
-}
-
-function readString($file)
-{
- $result="";
- while (ord($c=fgetc($file))) $result.=$c;
- return $result;
-}
-
-function readHeader($file)
-{
- $header =fgetc($file); $header.=fgetc($file);
- $header.=fgetc($file); $header.=fgetc($file);
- return $header;
-}
-
-function computeIndex($word)
-{
- // Fast string hashing
- //$lword = strtolower($word);
- //$l = strlen($lword);
- //for ($i=0;$i<$l;$i++)
- //{
- // $c = ord($lword{$i});
- // $v = (($v & 0xfc00) ^ ($v << 6) ^ $c) & 0xffff;
- //}
- //return $v;
-
- // Simple hashing that allows for substring search
- if (strlen($word)<2) return -1;
- // high char of the index
- $hi = ord($word{0});
- if ($hi==0) return -1;
- // low char of the index
- $lo = ord($word{1});
- if ($lo==0) return -1;
- // return index
- return $hi*256+$lo;
-}
-
-function search($file,$word,&$statsList)
-{
- $index = computeIndex($word);
- if ($index!=-1) // found a valid index
- {
- fseek($file,$index*4+4); // 4 bytes per entry, skip header
- $index = readInt($file);
- if ($index) // found words matching the hash key
- {
- $start=sizeof($statsList);
- $count=$start;
- fseek($file,$index);
- $w = readString($file);
- while ($w)
- {
- $statIdx = readInt($file);
- if ($word==substr($w,0,strlen($word)))
- { // found word that matches (as substring)
- $statsList[$count++]=array(
- "word"=>$word,
- "match"=>$w,
- "index"=>$statIdx,
- "full"=>strlen($w)==strlen($word),
- "docs"=>array()
- );
- }
- $w = readString($file);
- }
- $totalHi=0;
- $totalFreqHi=0;
- $totalFreqLo=0;
- for ($count=$start;$count<sizeof($statsList);$count++)
- {
- $statInfo = &$statsList[$count];
- $multiplier = 1;
- // whole word matches have a double weight
- if ($statInfo["full"]) $multiplier=2;
- fseek($file,$statInfo["index"]);
- $numDocs = readInt($file);
- $docInfo = array();
- // read docs info + occurrence frequency of the word
- for ($i=0;$i<$numDocs;$i++)
- {
- $idx=readInt($file);
- $freq=readInt($file);
- $docInfo[$i]=array("idx" => $idx,
- "freq" => $freq>>1,
- "rank" => 0.0,
- "hi" => $freq&1
- );
- if ($freq&1) // word occurs in high priority doc
- {
- $totalHi++;
- $totalFreqHi+=$freq*$multiplier;
- }
- else // word occurs in low priority doc
- {
- $totalFreqLo+=$freq*$multiplier;
- }
- }
- // read name and url info for the doc
- for ($i=0;$i<$numDocs;$i++)
- {
- fseek($file,$docInfo[$i]["idx"]);
- $docInfo[$i]["name"]=readString($file);
- $docInfo[$i]["url"]=readString($file);
- }
- $statInfo["docs"]=$docInfo;
- }
- $totalFreq=($totalHi+1)*$totalFreqLo + $totalFreqHi;
- for ($count=$start;$count<sizeof($statsList);$count++)
- {
- $statInfo = &$statsList[$count];
- $multiplier = 1;
- // whole word matches have a double weight
- if ($statInfo["full"]) $multiplier=2;
- for ($i=0;$i<sizeof($statInfo["docs"]);$i++)
- {
- $docInfo = &$statInfo["docs"];
- // compute frequency rank of the word in each doc
- $freq=$docInfo[$i]["freq"];
- if ($docInfo[$i]["hi"])
- {
- $statInfo["docs"][$i]["rank"]=
- (float)($freq*$multiplier+$totalFreqLo)/$totalFreq;
- }
- else
- {
- $statInfo["docs"][$i]["rank"]=
- (float)($freq*$multiplier)/$totalFreq;
- }
- }
- }
- }
- }
- return $statsList;
-}
-
-function combine_results($results,&$docs)
-{
- foreach ($results as $wordInfo)
- {
- $docsList = &$wordInfo["docs"];
- foreach ($docsList as $di)
- {
- $key=$di["url"];
- $rank=$di["rank"];
- if (in_array($key, array_keys($docs)))
- {
- $docs[$key]["rank"]+=$rank;
- }
- else
- {
- $docs[$key] = array("url"=>$key,
- "name"=>$di["name"],
- "rank"=>$rank
- );
- }
- $docs[$key]["words"][] = array(
- "word"=>$wordInfo["word"],
- "match"=>$wordInfo["match"],
- "freq"=>$di["freq"]
- );
- }
- }
- return $docs;
-}
-
-function filter_results($docs,&$requiredWords,&$forbiddenWords)
-{
- $filteredDocs=array();
- while (list ($key, $val) = each ($docs))
- {
- $words = &$docs[$key]["words"];
- $copy=1; // copy entry by default
- if (sizeof($requiredWords)>0)
- {
- foreach ($requiredWords as $reqWord)
- {
- $found=0;
- foreach ($words as $wordInfo)
- {
- $found = $wordInfo["word"]==$reqWord;
- if ($found) break;
- }
- if (!$found)
- {
- $copy=0; // document contains none of the required words
- break;
- }
- }
- }
- if (sizeof($forbiddenWords)>0)
- {
- foreach ($words as $wordInfo)
- {
- if (in_array($wordInfo["word"],$forbiddenWords))
- {
- $copy=0; // document contains a forbidden word
- break;
- }
- }
- }
- if ($copy) $filteredDocs[$key]=$docs[$key];
- }
- return $filteredDocs;
-}
-
-function compare_rank($a,$b)
-{
- if ($a["rank"] == $b["rank"])
- {
- return 0;
- }
- return ($a["rank"]>$b["rank"]) ? -1 : 1;
-}
-
-function sort_results($docs,&$sorted)
-{
- $sorted = $docs;
- usort($sorted,"compare_rank");
- return $sorted;
-}
-
-function report_results(&$docs)
-{
- echo "<table cellspacing=\"2\">\n";
- echo " <tr>\n";
- echo " <td colspan=\"2\"><h2>".search_results()."</h2></td>\n";
- echo " </tr>\n";
- $numDocs = sizeof($docs);
- if ($numDocs==0)
- {
- echo " <tr>\n";
- echo " <td colspan=\"2\">".matches_text(0)."</td>\n";
- echo " </tr>\n";
- }
- else
- {
- echo " <tr>\n";
- echo " <td colspan=\"2\">".matches_text($numDocs);
- echo "\n";
- echo " </td>\n";
- echo " </tr>\n";
- $num=1;
- foreach ($docs as $doc)
- {
- echo " <tr>\n";
- echo " <td align=\"right\">$num.</td>";
- echo "<td><a class=\"el\" href=\"".$doc["url"]."\">".$doc["name"]."</a></td>\n";
- echo " <tr>\n";
- echo " <td></td><td class=\"tiny\">".report_matches()." ";
- foreach ($doc["words"] as $wordInfo)
- {
- $word = $wordInfo["word"];
- $matchRight = substr($wordInfo["match"],strlen($word));
- echo "<b>$word</b>$matchRight(".$wordInfo["freq"].") ";
- }
- echo " </td>\n";
- echo " </tr>\n";
- $num++;
- }
- }
- echo "</table>\n";
-}
-
-function main()
-{
- if(strcmp('4.1.0', phpversion()) > 0)
- {
- die("Error: PHP version 4.1.0 or above required!");
- }
- if (!($file=fopen("search.idx","rb")))
- {
- die("Error: Search index file could NOT be opened!");
- }
- if (readHeader($file)!="DOXS")
- {
- die("Error: Header of index file is invalid!");
- }
- $query="";
- if (array_key_exists("query", $_GET))
- {
- $query=$_GET["query"];
- }
- echo "<input class=\"search\" type=\"text\" name=\"query\" value=\"$query\" size=\"20\" accesskey=\"s\"/>\n";
- echo "</span>\n";
- echo "</form>\n";
- echo "</div>\n";
- echo "<div class=\"searchresults\">\n";
- $results = array();
- $requiredWords = array();
- $forbiddenWords = array();
- $foundWords = array();
- $word=strtok($query," ");
- while ($word) // for each word in the search query
- {
- if (($word{0}=='+')) { $word=substr($word,1); $requiredWords[]=$word; }
- if (($word{0}=='-')) { $word=substr($word,1); $forbiddenWords[]=$word; }
- if (!in_array($word,$foundWords))
- {
- $foundWords[]=$word;
- search($file,$word,$results);
- }
- $word=strtok(" ");
- }
- $docs = array();
- combine_results($results,$docs);
- // filter out documents with forbidden word or that do not contain
- // required words
- $filteredDocs = filter_results($docs,$requiredWords,$forbiddenWords);
- // sort the results based on rank
- $sorted = array();
- sort_results($filteredDocs,$sorted);
- // report results to the user
- report_results($sorted);
- echo "</div>\n";
- fclose($file);
-}
-
-main();
-
diff --git a/src/search_php.h b/src/search_php.h
deleted file mode 100644
index a31aed9..0000000
--- a/src/search_php.h
+++ /dev/null
@@ -1,327 +0,0 @@
-"function readInt($file)\n"
-"{\n"
-" $b1 = ord(fgetc($file)); $b2 = ord(fgetc($file));\n"
-" $b3 = ord(fgetc($file)); $b4 = ord(fgetc($file));\n"
-" return ($b1<<24)|($b2<<16)|($b3<<8)|$b4;\n"
-"}\n"
-"\n"
-"function readString($file)\n"
-"{\n"
-" $result=\"\";\n"
-" while (ord($c=fgetc($file))) $result.=$c;\n"
-" return $result;\n"
-"}\n"
-"\n"
-"function readHeader($file)\n"
-"{\n"
-" $header =fgetc($file); $header.=fgetc($file);\n"
-" $header.=fgetc($file); $header.=fgetc($file);\n"
-" return $header;\n"
-"}\n"
-"\n"
-"function computeIndex($word)\n"
-"{\n"
-" // Fast string hashing\n"
-" //$lword = strtolower($word);\n"
-" //$l = strlen($lword);\n"
-" //for ($i=0;$i<$l;$i++)\n"
-" //{\n"
-" // $c = ord($lword{$i});\n"
-" // $v = (($v & 0xfc00) ^ ($v << 6) ^ $c) & 0xffff;\n"
-" //}\n"
-" //return $v;\n"
-"\n"
-" // Simple hashing that allows for substring search\n"
-" if (strlen($word)<2) return -1;\n"
-" // high char of the index\n"
-" $hi = ord($word{0});\n"
-" if ($hi==0) return -1;\n"
-" // low char of the index\n"
-" $lo = ord($word{1});\n"
-" if ($lo==0) return -1;\n"
-" // return index\n"
-" return $hi*256+$lo;\n"
-"}\n"
-"\n"
-"function search($file,$word,&$statsList)\n"
-"{\n"
-" $index = computeIndex($word);\n"
-" if ($index!=-1) // found a valid index\n"
-" {\n"
-" fseek($file,$index*4+4); // 4 bytes per entry, skip header\n"
-" $index = readInt($file);\n"
-" if ($index) // found words matching the hash key\n"
-" {\n"
-" $start=sizeof($statsList);\n"
-" $count=$start;\n"
-" fseek($file,$index);\n"
-" $w = readString($file);\n"
-" while ($w)\n"
-" {\n"
-" $statIdx = readInt($file);\n"
-" if ($word==substr($w,0,strlen($word)))\n"
-" { // found word that matches (as substring)\n"
-" $statsList[$count++]=array(\n"
-" \"word\"=>$word,\n"
-" \"match\"=>$w,\n"
-" \"index\"=>$statIdx,\n"
-" \"full\"=>strlen($w)==strlen($word),\n"
-" \"docs\"=>array()\n"
-" );\n"
-" }\n"
-" $w = readString($file);\n"
-" }\n"
-" $totalHi=0;\n"
-" $totalFreqHi=0;\n"
-" $totalFreqLo=0;\n"
-" for ($count=$start;$count<sizeof($statsList);$count++)\n"
-" {\n"
-" $statInfo = &$statsList[$count];\n"
-" $multiplier = 1;\n"
-" // whole word matches have a double weight\n"
-" if ($statInfo[\"full\"]) $multiplier=2;\n"
-" fseek($file,$statInfo[\"index\"]); \n"
-" $numDocs = readInt($file);\n"
-" $docInfo = array();\n"
-" // read docs info + occurrence frequency of the word\n"
-" for ($i=0;$i<$numDocs;$i++)\n"
-" {\n"
-" $idx=readInt($file); \n"
-" $freq=readInt($file); \n"
-" $docInfo[$i]=array(\"idx\" => $idx,\n"
-" \"freq\" => $freq>>1,\n"
-" \"rank\" => 0.0,\n"
-" \"hi\" => $freq&1\n"
-" );\n"
-" if ($freq&1) // word occurs in high priority doc\n"
-" {\n"
-" $totalHi++;\n"
-" $totalFreqHi+=$freq*$multiplier;\n"
-" }\n"
-" else // word occurs in low priority doc\n"
-" {\n"
-" $totalFreqLo+=$freq*$multiplier;\n"
-" }\n"
-" }\n"
-" // read name and url info for the doc\n"
-" for ($i=0;$i<$numDocs;$i++)\n"
-" {\n"
-" fseek($file,$docInfo[$i][\"idx\"]);\n"
-" $docInfo[$i][\"name\"]=readString($file);\n"
-" $docInfo[$i][\"url\"]=readString($file);\n"
-" }\n"
-" $statInfo[\"docs\"]=$docInfo;\n"
-" }\n"
-" $totalFreq=($totalHi+1)*$totalFreqLo + $totalFreqHi;\n"
-" for ($count=$start;$count<sizeof($statsList);$count++)\n"
-" {\n"
-" $statInfo = &$statsList[$count];\n"
-" $multiplier = 1;\n"
-" // whole word matches have a double weight\n"
-" if ($statInfo[\"full\"]) $multiplier=2;\n"
-" for ($i=0;$i<sizeof($statInfo[\"docs\"]);$i++)\n"
-" {\n"
-" $docInfo = &$statInfo[\"docs\"];\n"
-" // compute frequency rank of the word in each doc\n"
-" $freq=$docInfo[$i][\"freq\"];\n"
-" if ($docInfo[$i][\"hi\"])\n"
-" {\n"
-" $statInfo[\"docs\"][$i][\"rank\"]=\n"
-" (float)($freq*$multiplier+$totalFreqLo)/$totalFreq;\n"
-" }\n"
-" else\n"
-" {\n"
-" $statInfo[\"docs\"][$i][\"rank\"]=\n"
-" (float)($freq*$multiplier)/$totalFreq;\n"
-" }\n"
-" }\n"
-" }\n"
-" }\n"
-" }\n"
-" return $statsList;\n"
-"}\n"
-"\n"
-"function combine_results($results,&$docs)\n"
-"{\n"
-" foreach ($results as $wordInfo)\n"
-" {\n"
-" $docsList = &$wordInfo[\"docs\"];\n"
-" foreach ($docsList as $di)\n"
-" {\n"
-" $key=$di[\"url\"];\n"
-" $rank=$di[\"rank\"];\n"
-" if (in_array($key, array_keys($docs)))\n"
-" {\n"
-" $docs[$key][\"rank\"]+=$rank;\n"
-" }\n"
-" else\n"
-" {\n"
-" $docs[$key] = array(\"url\"=>$key,\n"
-" \"name\"=>$di[\"name\"],\n"
-" \"rank\"=>$rank\n"
-" );\n"
-" }\n"
-" $docs[$key][\"words\"][] = array(\n"
-" \"word\"=>$wordInfo[\"word\"],\n"
-" \"match\"=>$wordInfo[\"match\"],\n"
-" \"freq\"=>$di[\"freq\"]\n"
-" );\n"
-" }\n"
-" }\n"
-" return $docs;\n"
-"}\n"
-"\n"
-"function filter_results($docs,&$requiredWords,&$forbiddenWords)\n"
-"{\n"
-" $filteredDocs=array();\n"
-" while (list ($key, $val) = each ($docs)) \n"
-" {\n"
-" $words = &$docs[$key][\"words\"];\n"
-" $copy=1; // copy entry by default\n"
-" if (sizeof($requiredWords)>0)\n"
-" {\n"
-" foreach ($requiredWords as $reqWord)\n"
-" {\n"
-" $found=0;\n"
-" foreach ($words as $wordInfo)\n"
-" { \n"
-" $found = $wordInfo[\"word\"]==$reqWord;\n"
-" if ($found) break;\n"
-" }\n"
-" if (!$found) \n"
-" {\n"
-" $copy=0; // document contains none of the required words\n"
-" break;\n"
-" }\n"
-" }\n"
-" }\n"
-" if (sizeof($forbiddenWords)>0)\n"
-" {\n"
-" foreach ($words as $wordInfo)\n"
-" {\n"
-" if (in_array($wordInfo[\"word\"],$forbiddenWords))\n"
-" {\n"
-" $copy=0; // document contains a forbidden word\n"
-" break;\n"
-" }\n"
-" }\n"
-" }\n"
-" if ($copy) $filteredDocs[$key]=$docs[$key];\n"
-" }\n"
-" return $filteredDocs;\n"
-"}\n"
-"\n"
-"function compare_rank($a,$b)\n"
-"{\n"
-" if ($a[\"rank\"] == $b[\"rank\"]) \n"
-" {\n"
-" return 0;\n"
-" }\n"
-" return ($a[\"rank\"]>$b[\"rank\"]) ? -1 : 1; \n"
-"}\n"
-"\n"
-"function sort_results($docs,&$sorted)\n"
-"{\n"
-" $sorted = $docs;\n"
-" usort($sorted,\"compare_rank\");\n"
-" return $sorted;\n"
-"}\n"
-"\n"
-"function report_results(&$docs)\n"
-"{\n"
-" echo \"<table cellspacing=\\\"2\\\">\\n\";\n"
-" echo \" <tr>\\n\";\n"
-" echo \" <td colspan=\\\"2\\\"><h2>\".search_results().\"</h2></td>\\n\";\n"
-" echo \" </tr>\\n\";\n"
-" $numDocs = sizeof($docs);\n"
-" if ($numDocs==0)\n"
-" {\n"
-" echo \" <tr>\\n\";\n"
-" echo \" <td colspan=\\\"2\\\">\".matches_text(0).\"</td>\\n\";\n"
-" echo \" </tr>\\n\";\n"
-" }\n"
-" else\n"
-" {\n"
-" echo \" <tr>\\n\";\n"
-" echo \" <td colspan=\\\"2\\\">\".matches_text($numDocs);\n"
-" echo \"\\n\";\n"
-" echo \" </td>\\n\";\n"
-" echo \" </tr>\\n\";\n"
-" $num=1;\n"
-" foreach ($docs as $doc)\n"
-" {\n"
-" echo \" <tr>\\n\";\n"
-" echo \" <td align=\\\"right\\\">$num.</td>\";\n"
-" echo \"<td><a class=\\\"el\\\" href=\\\"\".$doc[\"url\"].\"\\\">\".$doc[\"name\"].\"</a></td>\\n\";\n"
-" echo \" <tr>\\n\";\n"
-" echo \" <td></td><td class=\\\"tiny\\\">\".report_matches().\" \";\n"
-" foreach ($doc[\"words\"] as $wordInfo)\n"
-" {\n"
-" $word = $wordInfo[\"word\"];\n"
-" $matchRight = substr($wordInfo[\"match\"],strlen($word));\n"
-" echo \"<b>$word</b>$matchRight(\".$wordInfo[\"freq\"].\") \";\n"
-" }\n"
-" echo \" </td>\\n\";\n"
-" echo \" </tr>\\n\";\n"
-" $num++;\n"
-" }\n"
-" }\n"
-" echo \"</table>\\n\";\n"
-"}\n"
-"\n"
-"function main()\n"
-"{\n"
-" if(strcmp('4.1.0', phpversion()) > 0) \n"
-" {\n"
-" die(\"Error: PHP version 4.1.0 or above required!\");\n"
-" }\n"
-" if (!($file=fopen(\"search.idx\",\"rb\"))) \n"
-" {\n"
-" die(\"Error: Search index file could NOT be opened!\");\n"
-" }\n"
-" if (readHeader($file)!=\"DOXS\")\n"
-" {\n"
-" die(\"Error: Header of index file is invalid!\");\n"
-" }\n"
-" $query=\"\";\n"
-" if (array_key_exists(\"query\", $_GET))\n"
-" {\n"
-" $query=$_GET[\"query\"];\n"
-" }\n"
-" echo \"<input class=\\\"search\\\" type=\\\"text\\\" name=\\\"query\\\" value=\\\"$query\\\" size=\\\"20\\\" accesskey=\\\"s\\\"/>\\n\";\n"
-" echo \"</span>\\n\";\n"
-" echo \"</form>\\n\";\n"
-" echo \"</div>\\n\";\n"
-" echo \"<div class=\\\"searchresults\\\">\\n\";\n"
-" $results = array();\n"
-" $requiredWords = array();\n"
-" $forbiddenWords = array();\n"
-" $foundWords = array();\n"
-" $word=strtok($query,\" \");\n"
-" while ($word) // for each word in the search query\n"
-" {\n"
-" if (($word{0}=='+')) { $word=substr($word,1); $requiredWords[]=$word; }\n"
-" if (($word{0}=='-')) { $word=substr($word,1); $forbiddenWords[]=$word; }\n"
-" if (!in_array($word,$foundWords))\n"
-" {\n"
-" $foundWords[]=$word;\n"
-" search($file,$word,$results);\n"
-" }\n"
-" $word=strtok(\" \");\n"
-" }\n"
-" $docs = array();\n"
-" combine_results($results,$docs);\n"
-" // filter out documents with forbidden word or that do not contain\n"
-" // required words\n"
-" $filteredDocs = filter_results($docs,$requiredWords,$forbiddenWords);\n"
-" // sort the results based on rank\n"
-" $sorted = array();\n"
-" sort_results($filteredDocs,$sorted);\n"
-" // report results to the user\n"
-" report_results($sorted);\n"
-" echo \"</div>\\n\";\n"
-" fclose($file);\n"
-"}\n"
-"\n"
-"main();\n"
-"\n"
diff --git a/src/searchindex.cpp b/src/searchindex.cpp
deleted file mode 100644
index 400702b..0000000
--- a/src/searchindex.cpp
+++ /dev/null
@@ -1,285 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 "qtbc.h"
-#include "searchindex.h"
-#include "config.h"
-#include <qfile.h>
-#include <ctype.h>
-
-
-// file format: (all multi-byte values are stored in big endian format)
-// 4 byte header
-// 256*256*4 byte index (4 bytes)
-// for each index entry: a zero terminated list of words
-// for each word: a \0 terminated string + 4 byte offset to the stats info
-// padding bytes to align at 4 byte boundary
-// for each word: the number of urls (4 bytes)
-// + for each url containing the word 8 bytes statistics
-// (4 bytes index to url string + 4 bytes frequency counter)
-// for each url: a \0 terminated string
-
-const int numIndexEntries = 256*256;
-
-//--------------------------------------------------------------------
-
-IndexWord::IndexWord(const char *word) : m_word(word), m_urls(17)
-{
- 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)
- {
- //printf("URLInfo::URLInfo(%d)\n",idx);
- ui=new URLInfo(idx,0);
- m_urls.insert(idx,ui);
- }
- ui->freq+=2;
- if (hiPriority) ui->freq|=1; // mark as high priority document
-}
-
-//--------------------------------------------------------------------
-
-SearchIndex::SearchIndex() : m_words(328829), m_index(numIndexEntries), m_urlIndex(-1)
-{
- int i;
- m_words.setAutoDelete(TRUE);
- m_urls.setAutoDelete(TRUE);
- for (i=0;i<numIndexEntries;i++) m_index.insert(i,new QList<IndexWord>);
-}
-
-void SearchIndex::setCurrentDoc(const char *name,const char *baseName,const char *anchor)
-{
- //printf("SearchIndex::setCurrentDoc(%s,%s,%s)\n",name,baseName,anchor);
- QCString url=baseName+Config_getString("HTML_FILE_EXTENSION");
- if (anchor) url+=(QCString)"#"+anchor;
- m_urlIndex++;
- m_urls.insert(m_urlIndex,new URL(name,url));
-}
-
-static int charsToIndex(const char *word)
-{
- if (word==0) return -1;
-
- // Fast string hashing algorithm
- //register ushort h=0;
- //const char *k = word;
- //ushort mask=0xfc00;
- //while ( *k )
- //{
- // h = (h&mask)^(h<<6)^(*k++);
- //}
- //return h;
-
- // Simple hashing that allows for substring searching
- uint c1=word[0];
- if (c1==0) return -1;
- uint c2=word[1];
- if (c2==0) return -1;
- return c1*256+c2;
-}
-
-void SearchIndex::addWord(const char *word,bool hiPriority)
-{
- //printf("SearchIndex::addWord(%s,%d)\n",word,hiPriority);
- //QString wStr=QString(word).lower();
- QString wStr(word);
- wStr=wStr.lower();
- if (wStr.isEmpty()) return;
- IndexWord *w = m_words[wStr];
- if (w==0)
- {
- int idx=charsToIndex(wStr);
- if (idx<0) return;
- w = new IndexWord(wStr);
- //fprintf(stderr,"addWord(%s) at index %d\n",word,idx);
- m_index[idx]->append(w);
- m_words.insert(wStr,w);
- }
- w->addUrlIndex(m_urlIndex,hiPriority);
-}
-
-
-static void writeInt(QFile &f,int index)
-{
- f.putch(((uint)index)>>24);
- f.putch((((uint)index)>>16)&0xff);
- f.putch((((uint)index)>>8)&0xff);
- f.putch(((uint)index)&0xff);
-}
-
-static void writeString(QFile &f,const char *s)
-{
- const char *p = s;
- while (*p) f.putch(*p++);
- f.putch(0);
-}
-
-void SearchIndex::write(const char *fileName)
-{
- int i;
- int size=4; // for the header
- size+=4*numIndexEntries; // for the index
- int 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())
- {
- QListIterator<IndexWord> iwi(*wlist);
- IndexWord *iw;
- for (iwi.toFirst();(iw=iwi.current());++iwi)
- {
- int ws = iw->word().length()+1;
- size+=ws+4; // word + url info list offset
- }
- size+=1; // zero list terminator
- }
- }
-
- // second pass: compute the offsets in the index
- int indexOffsets[numIndexEntries];
- int offset=wordsOffset;
- for (i=0;i<numIndexEntries;i++)
- {
- QList<IndexWord> *wlist = m_index[i];
- if (!wlist->isEmpty())
- {
- indexOffsets[i]=offset;
- QListIterator<IndexWord> iwi(*wlist);
- IndexWord *iw;
- for (iwi.toFirst();(iw=iwi.current());++iwi)
- {
- offset+= iw->word().length()+1;
- offset+=4; // word + offset to url info array
- }
- offset+=1; // zero list terminator
- }
- else
- {
- indexOffsets[i]=0;
- }
- }
- int padding = size;
- size = (size+3)&~3; // round up to 4 byte boundary
- padding = size - padding;
-
- //int statsOffset = size;
- QDictIterator<IndexWord> wdi(m_words);
- //IndexWord *iw;
- int *wordStatOffsets = new int[m_words.count()];
-
- 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())
- {
- QListIterator<IndexWord> iwi(*wlist);
- IndexWord *iw;
- for (iwi.toFirst();(iw=iwi.current());++iwi)
- {
- //printf("wordStatOffsets[%d]=%d\n",count,size);
- wordStatOffsets[count++] = size;
- size+=4+iw->urls().count()*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)
- {
- urlOffsets[udi.currentKey()]=size;
- size+=url->name.length()+1+
- url->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))
- {
- // write header
- f.putch('D'); f.putch('O'); f.putch('X'); f.putch('S');
- // write index
- for (i=0;i<numIndexEntries;i++)
- {
- writeInt(f,indexOffsets[i]);
- }
- // write word lists
- count=0;
- for (i=0;i<numIndexEntries;i++)
- {
- QList<IndexWord> *wlist = m_index[i];
- if (!wlist->isEmpty())
- {
- QListIterator<IndexWord> iwi(*wlist);
- IndexWord *iw;
- for (iwi.toFirst();(iw=iwi.current());++iwi)
- {
- writeString(f,iw->word());
- writeInt(f,wordStatOffsets[count++]);
- }
- f.putch(0);
- }
- }
- // write extra padding bytes
- for (i=0;i<padding;i++) f.putch(0);
- // write word statistics
- for (i=0;i<numIndexEntries;i++)
- {
- QList<IndexWord> *wlist = m_index[i];
- if (!wlist->isEmpty())
- {
- QListIterator<IndexWord> iwi(*wlist);
- IndexWord *iw;
- for (iwi.toFirst();(iw=iwi.current());++iwi)
- {
- int numUrls = iw->urls().count();
- writeInt(f,numUrls);
- QIntDictIterator<URLInfo> uli(iw->urls());
- URLInfo *ui;
- for (uli.toFirst();(ui=uli.current());++uli)
- {
- writeInt(f,urlOffsets[ui->urlIdx]);
- writeInt(f,ui->freq);
- }
- }
- }
- }
- // write urls
- QIntDictIterator<URL> udi(m_urls);
- URL *url;
- for (udi.toFirst();(url=udi.current());++udi)
- {
- writeString(f,url->name);
- writeString(f,url->url);
- }
- }
-
- delete urlOffsets;
- delete wordStatOffsets;
-}
-
diff --git a/src/searchindex.h b/src/searchindex.h
deleted file mode 100644
index 13f90d8..0000000
--- a/src/searchindex.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 _SEARCHINDEX_H
-#define _SEARCHINDEX_H
-
-#include "qtbc.h"
-#include <qintdict.h>
-#include <qlist.h>
-#include <qdict.h>
-#include <qintdict.h>
-#include <qvector.h>
-
-struct URL
-{
- URL(const char *n,const char *u) : name(n), url(u) {}
- QCString name;
- QCString url;
-};
-
-
-struct URLInfo
-{
- URLInfo(int idx,int f) : urlIdx(idx), freq(f) {}
- int urlIdx;
- int freq;
-};
-
-class IndexWord
-{
- public:
- IndexWord(const char *word);
- void addUrlIndex(int,bool);
- const QIntDict<URLInfo> &urls() const { return m_urls; }
- QCString word() const { return m_word; }
-
- private:
- QCString m_word;
- QIntDict<URLInfo> m_urls;
-};
-
-class SearchIndex
-{
- public:
- SearchIndex();
- void setCurrentDoc(const char *name,const char *baseName,const char *anchor=0);
- void addWord(const char *word,bool hiPriority);
- void write(const char *file);
- private:
- QDict<IndexWord> m_words;
- QVector< QList<IndexWord> > m_index;
- QIntDict<URL> m_urls;
- int m_urlIndex;
-};
-
-
-#endif
diff --git a/src/section.h b/src/section.h
deleted file mode 100644
index 91abe0a..0000000
--- a/src/section.h
+++ /dev/null
@@ -1,63 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 SECTION_H
-#define SECTION_H
-
-#include "qtbc.h"
-#include <qlist.h>
-#include <qdict.h>
-#include "sortdict.h"
-
-class Definition;
-
-struct SectionInfo
-{
- enum SectionType { Page, Section, Subsection,
- Subsubsection, Paragraph, Anchor
- };
- SectionInfo(const char *f,const char *l,const char *t,
- SectionType st,const char *r=0) :
- label(l), title(t), type(st), ref(r), definition(0),
- fileName(f), generated(FALSE)
- {
- }
- SectionInfo(const SectionInfo &s)
- {
- label=s.label.copy(); title=s.title.copy(); ref=s.ref.copy();
- type =s.type; definition=s.definition;
- fileName=s.fileName.copy(); generated=s.generated;
- }
- ~SectionInfo() {}
- QCString label;
- QCString title;
- SectionType type;
- QCString ref;
- Definition *definition;
- QCString fileName;
- bool generated;
-};
-
-class SectionDict : public QDict<SectionInfo>
-{
- public:
- SectionDict(int size) : QDict<SectionInfo>(size) {}
- ~SectionDict() {}
-};
-
-#endif
diff --git a/src/sortdict.h b/src/sortdict.h
deleted file mode 100644
index c1a553e..0000000
--- a/src/sortdict.h
+++ /dev/null
@@ -1,564 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 _SORTDICT_H
-#define _SORTDICT_H
-
-#include "qtbc.h"
-#include <qlist.h>
-#include <qdict.h>
-#include <qintdict.h>
-
-#define AUTORESIZE 1
-
-#if AUTORESIZE
-const uint SDict_primes[] =
-{
- 17,
- 29,
- 47,
- 71,
- 113,
- 179,
- 293,
- 457,
- 733,
- 1171,
- 1871,
- 2999,
- 4787,
- 7669,
- 12251,
- 19603,
- 31379,
- 50177,
- 80287,
- 128449,
- 205519,
- 328829,
- 526139,
- 841801,
- 1346881,
- 2155007,
- 3448033,
- 5516827,
- 8826919,
- 14123059,
- 23538433,
- 39230771,
- 65384537,
- 108974231,
- 181623707,
- 302706181,
- 504510283,
- 840850487,
- 0xffffffff
-};
-#endif
-
-template<class T> class SDict;
-template<class T> class SIntDict;
-
-/*! internal wrapper class that redirects compareItems() to the
- * dictionary
- */
-template<class T>
-class SList : public QList<T>
-{
- public:
- SList(SDict<T> *owner) : m_owner(owner) {}
- virtual ~SList() {}
- int compareItems(GCI item1,GCI item2)
- {
- return m_owner->compareItems(item1,item2);
- }
- private:
- SDict<T> *m_owner;
-};
-
-/*! Ordered dictionary of elements of type T.
- * Internally uses a QList<T> and a QDict<T>.
- */
-template<class T>
-class SDict
-{
- private:
- SList<T> *m_list;
- QDict<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.
- */
- SDict(int size) : m_sizeIndex(0)
- {
- m_list = new SList<T>(this);
-#if AUTORESIZE
- while ((uint)size>SDict_primes[m_sizeIndex]) m_sizeIndex++;
- m_dict = new QDict<T>(SDict_primes[m_sizeIndex]);
-#else
- m_dict = new QDict<T>(size);
-#endif
- }
-
- /*! Destroys the dictionary */
- virtual ~SDict()
- {
- delete m_list;
- delete m_dict;
- }
-
- /*! Appends an element to the dictionary. The element is owned by the
- * dictionary.
- * \param key The unique key to use to quicky find the item later on.
- * \param d The compound to add.
- * \sa find()
- */
- void append(const char *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
- }
-
- /*! Prepends an element to the dictionary. The element is owned by the
- * dictionary.
- * \param key The unique key to use to quicky find the item later on.
- * \param d The compound to add.
- * \sa find()
- */
- void prepend(const char *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(const char *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 quicky find the item later on.
- * \param d The compound to add.
- * \sa find()
- */
- void inSort(const char *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(const char *key)
- {
- return m_dict->find(key);
- }
- T *find(const QCString &key)
- {
- return m_dict->find(key);
- }
- T *find(const QString &key)
- {
- return m_dict->find(key);
- }
-
- /*! Equavalent to find(). */
- T *operator[](const char *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 compareItems(GCI item1,GCI item2)
- {
- 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 SDict<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;
- };
-
-};
-
-/*! internal wrapper class that redirects compareItems() to the
- * dictionary
- */
-template<class T>
-class SIntList : public QList<T>
-{
- public:
- SIntList(SIntDict<T> *owner) : m_owner(owner) {}
- virtual ~SIntList() {}
- int compareItems(GCI item1,GCI item2)
- {
- return m_owner->compareItems(item1,item2);
- }
- private:
- 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) : 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 quicky 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 quicky 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 quicky 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);
- }
-
- /*! Equavalent 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 compareItems(GCI item1,GCI item2)
- {
- 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()
- {
- 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;
- };
-
-};
-
-#endif
diff --git a/src/tagreader.cpp b/src/tagreader.cpp
deleted file mode 100644
index 9fd90d4..0000000
--- a/src/tagreader.cpp
+++ /dev/null
@@ -1,1399 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 "tagreader.h"
-
-#include <stdio.h>
-#include <stdarg.h>
-
-#include <qxml.h>
-#include <qstack.h>
-#include <qdict.h>
-#include <qfileinfo.h>
-#include <qlist.h>
-#include <qstring.h>
-#include <qstringlist.h>
-
-#include "entry.h"
-#include "classdef.h"
-#include "doxygen.h"
-#include "util.h"
-#include "message.h"
-#include "defargs.h"
-//#include "reflist.h"
-
-/*! Information about an linkable anchor */
-class TagAnchorInfo
-{
- public:
- TagAnchorInfo(const QString &f,const QString &l) : label(l), fileName(f) {}
- QString label;
- QString fileName;
-};
-
-class TagAnchorInfoList : public QList<TagAnchorInfo>
-{
- public:
- TagAnchorInfoList() : QList<TagAnchorInfo>() { setAutoDelete(TRUE); }
- virtual ~TagAnchorInfoList() {}
-};
-
-/*! Container for member specific info that can be read from a tagfile */
-class TagMemberInfo
-{
- public:
- TagMemberInfo() : prot(Public), virt(Normal), isStatic(FALSE) {}
- QString type;
- QString name;
- QString anchorFile;
- QString anchor;
- QString arglist;
- QString kind;
- TagAnchorInfoList docAnchors;
- Protection prot;
- Specifier virt;
- bool isStatic;
-};
-
-/*! Container for class specific info that can be read from a tagfile */
-class TagClassInfo
-{
- public:
- enum Kind { Class, Struct, Union, Interface, Exception, Protocol, Category };
- TagClassInfo() { bases=0, templateArguments=0; members.setAutoDelete(TRUE); isObjC=FALSE; }
- ~TagClassInfo() { delete bases; delete templateArguments; }
- QString name;
- QString filename;
- TagAnchorInfoList docAnchors;
- QList<BaseInfo> *bases;
- QList<TagMemberInfo> members;
- QList<QString> *templateArguments;
- QStringList classList;
- Kind kind;
- bool isObjC;
-};
-
-/*! Container for namespace specific info that can be read from a tagfile */
-class TagNamespaceInfo
-{
- public:
- TagNamespaceInfo() { members.setAutoDelete(TRUE); }
- QString name;
- QString filename;
- QStringList classList;
- QStringList namespaceList;
- TagAnchorInfoList docAnchors;
- QList<TagMemberInfo> members;
-};
-
-/*! Container for package specific info that can be read from a tagfile */
-class TagPackageInfo
-{
- public:
- TagPackageInfo() { members.setAutoDelete(TRUE); }
- QString name;
- QString filename;
- TagAnchorInfoList docAnchors;
- QList<TagMemberInfo> members;
- QStringList classList;
-};
-
-class TagIncludeInfo
-{
- public:
- QString id;
- QString name;
- QString text;
- bool isLocal;
- bool isImported;
-};
-
-/*! Container for file specific info that can be read from a tagfile */
-class TagFileInfo
-{
- public:
- TagFileInfo() { members.setAutoDelete(TRUE); includes.setAutoDelete(TRUE); }
- QString name;
- QString path;
- QString filename;
- TagAnchorInfoList docAnchors;
- QList<TagMemberInfo> members;
- QStringList classList;
- QStringList namespaceList;
- QList<TagIncludeInfo> includes;
-};
-
-/*! Container for group specific info that can be read from a tagfile */
-class TagGroupInfo
-{
- public:
- TagGroupInfo() { members.setAutoDelete(TRUE); }
- QString name;
- QString title;
- QString filename;
- TagAnchorInfoList docAnchors;
- QList<TagMemberInfo> members;
- QStringList subgroupList;
- QStringList classList;
- QStringList namespaceList;
- QStringList fileList;
- QStringList pageList;
- QStringList dirList;
-};
-
-/*! Container for page specific info that can be read from a tagfile */
-class TagPageInfo
-{
- public:
- QString name;
- QString title;
- QString filename;
- TagAnchorInfoList docAnchors;
-};
-
-/*! Container for directory specific info that can be read from a tagfile */
-class TagDirInfo
-{
- public:
- QString name;
- QString filename;
- QString path;
- QStringList subdirList;
- QStringList fileList;
- TagAnchorInfoList docAnchors;
-};
-
-/*! Tag file parser.
- * Reads an XML-structured tagfile and builds up the structure in
- * memory. The method buildLists() is used to transfer/translate
- * the structures to the doxygen engine.
- */
-class TagFileParser : public QXmlDefaultHandler
-{
- enum State { Invalid,
- InClass,
- InFile,
- InNamespace,
- InGroup,
- InPage,
- InMember,
- 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);
- }
-
- void setDocumentLocator ( QXmlLocator * locator )
- {
- m_locator = locator;
- }
-
- void setFileName( const QString &fileName )
- {
- m_inputFileName = fileName;
- }
-
- void warn(const char *fmt,...)
- {
- va_list args;
- va_start(args, fmt);
- ::warn(m_inputFileName,m_locator->lineNumber(),fmt,args);
- va_end(args);
- }
-
- 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=="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=="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("Warning: Unknown compound attribute `%s' found!\n",kind.data());
- }
- if (isObjC=="yes" && m_curClass)
- {
- m_curClass->isObjC = TRUE;
- }
- }
-
- 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;
- default:
- warn("Warning: tag `compound' was not expected!\n");
- }
- }
-
- void startMember( const QXmlAttributes& attrib)
- {
- m_curMember = new TagMemberInfo;
- m_curMember->kind = attrib.value("kind");
- QString protStr = attrib.value("protection");
- QString virtStr = attrib.value("virtualness");
- QString staticStr = attrib.value("static");
- if (protStr=="protected")
- {
- m_curMember->prot = Protected;
- }
- else if (protStr=="private")
- {
- m_curMember->prot = Private;
- }
- if (virtStr=="virtual")
- {
- m_curMember->virt = Virtual;
- }
- else if (virtStr=="pure")
- {
- m_curMember->virt = Pure;
- }
- if (staticStr=="yes")
- {
- m_curMember->isStatic = TRUE;
- }
- m_stateStack.push(new State(m_state));
- m_state = InMember;
- }
-
- void endMember()
- {
- m_state = *m_stateStack.top();
- m_stateStack.remove();
- 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("Warning: Unexpected tag `member' found\n"); break;
- }
- }
-
- void endDocAnchor()
- {
- switch(m_state)
- {
- case InClass: m_curClass->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
- case InFile: m_curFile->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
- case InNamespace: m_curNamespace->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
- case InGroup: m_curGroup->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
- case InPage: m_curPage->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
- case InMember: m_curMember->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
- case InPackage: m_curPackage->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
- case InDir: m_curDir->docAnchors.append(new TagAnchorInfo(m_fileName,m_curString)); break;
- default: warn("Warning: Unexpected tag `member' found\n"); break;
- }
- }
-
- void endClass()
- {
- 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("Warning: Unexpected tag `class' found\n"); break;
- }
- }
-
- void endNamespace()
- {
- 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("Warning: Unexpected tag `namespace' found\n"); break;
- }
- }
-
- void endFile()
- {
- switch(m_state)
- {
- case InGroup: m_curGroup->fileList.append(m_curString); break;
- case InDir: m_curDir->fileList.append(m_curString); break;
- default: warn("Warning: Unexpected tag `file' found\n"); break;
- }
- }
-
- void endPage()
- {
- switch(m_state)
- {
- case InGroup: m_curGroup->fileList.append(m_curString); break;
- default: warn("Warning: Unexpected tag `page' found\n"); break;
- }
- }
-
- void endDir()
- {
- switch(m_state)
- {
- case InDir: m_curDir->subdirList.append(m_curString); break;
- default: warn("Warning: Unexpected tag `page' found\n"); break;
- }
- }
-
- void startStringValue(const QXmlAttributes& )
- {
- m_curString = "";
- }
-
- void startDocAnchor(const QXmlAttributes& attrib )
- {
- m_fileName = attrib.value("file");
- m_curString = "";
- }
-
- void endType()
- {
- if (m_state==InMember)
- {
- m_curMember->type = m_curString;
- }
- else
- {
- warn("Warning: Unexpected tag `type' found\n");
- }
- }
-
- void endName()
- {
- 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("Warning: Unexpected tag `name' found\n"); break;
- }
- }
-
- void startBase(const QXmlAttributes& attrib )
- {
- m_curString="";
- if (m_state==InClass && m_curClass)
- {
- QString protStr = attrib.value("protection");
- QString virtStr = attrib.value("virtualness");
- Protection prot = Public;
- Specifier virt = Normal;
- if (protStr=="protected")
- {
- prot = Protected;
- }
- else if (protStr=="private")
- {
- prot = Private;
- }
- if (virtStr=="virtual")
- {
- virt = Virtual;
- }
- if (m_curClass->bases==0)
- {
- m_curClass->bases = new QList<BaseInfo>;
- m_curClass->bases->setAutoDelete(TRUE);
- }
- m_curClass->bases->append(new BaseInfo(m_curString,prot,virt));
- }
- else
- {
- warn("Warning: Unexpected tag `base' found\n");
- }
- }
-
- void endBase()
- {
- if (m_state==InClass && m_curClass)
- {
- m_curClass->bases->getLast()->name = m_curString;
- }
- else
- {
- warn("Warning: Unexpected tag `base' found\n");
- }
- }
-
- void startIncludes(const QXmlAttributes& attrib )
- {
- if (m_state==InFile && m_curFile)
- {
- m_curIncludes = new TagIncludeInfo;
- m_curIncludes->id = attrib.value("id");
- m_curIncludes->name = attrib.value("name");
- m_curIncludes->isLocal = attrib.value("local")=="yes" ? TRUE : FALSE;
- m_curIncludes->isImported = attrib.value("imported")=="yes" ? TRUE : FALSE;
- m_curFile->includes.append(m_curIncludes);
- }
- else
- {
- warn("Warning: Unexpected tag `includes' found\n");
- }
- m_curString="";
- }
-
- void endIncludes()
- {
- m_curIncludes->text = m_curString;
- }
-
- void endTemplateArg()
- {
- if (m_state==InClass && m_curClass)
- {
- if (m_curClass->templateArguments==0)
- {
- m_curClass->templateArguments = new QList<QString>;
- m_curClass->templateArguments->setAutoDelete(TRUE);
- }
- m_curClass->templateArguments->append(new QString(m_curString));
- }
- else
- {
- warn("Warning: Unexpected tag `templarg' found\n");
- }
- }
-
- void endFilename()
- {
- 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("Warning: Unexpected tag `filename' found\n"); break;
- }
- }
-
- void endPath()
- {
- switch (m_state)
- {
- case InFile: m_curFile->path = m_curString; break;
- case InDir: m_curDir->path = m_curString; break;
- default: warn("Warning: Unexpected tag `path' found\n"); break;
- }
- }
-
- void endAnchor()
- {
- if (m_state==InMember)
- {
- m_curMember->anchor = m_curString;
- }
- else
- {
- warn("Warning: Unexpected tag `anchor' found\n");
- }
- }
-
- void endAnchorFile()
- {
- if (m_state==InMember)
- {
- m_curMember->anchorFile = m_curString;
- }
- else
- {
- warn("Warning: Unexpected tag `anchorfile' found\n");
- }
- }
-
- void endArglist()
- {
- if (m_state==InMember)
- {
- m_curMember->arglist = m_curString;
- }
- else
- {
- warn("Warning: Unexpected tag `arglist' found\n");
- }
- }
- void endTitle()
- {
- switch (m_state)
- {
- case InGroup: m_curGroup->title = m_curString; break;
- case InPage: m_curPage->title = m_curString; break;
- default: warn("Warning: Unexpected tag `title' found\n"); break;
- }
- }
-
- void endSubgroup()
- {
- if (m_state==InGroup)
- {
- m_curGroup->subgroupList.append(m_curString);
- }
- else
- {
- warn("Warning: Unexpected tag `subgroup' found\n");
- }
- }
-
- void startIgnoreElement(const QXmlAttributes& )
- {
- }
-
- void endIgnoreElement()
- {
- }
-
- bool startDocument()
- {
- m_state = Invalid;
-
- 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("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("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("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("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];
- if (handler)
- {
- (*handler)(attrib);
- }
- else
- {
- warn("Warning: Unknown tag `%s' found!\n",name.data());
- }
- return TRUE;
- }
-
- bool endElement( const QString&, const QString&, const QString& name )
- {
- //printf("endElement `%s'\n",name.data());
- EndElementHandler *handler = m_endElementHandlers[name];
- if (handler)
- {
- (*handler)();
- }
- else
- {
- warn("Warning: Unknown tag `%s' found!\n",name.data());
- }
- return TRUE;
- }
-
- bool characters ( const QString & ch )
- {
- m_curString+=ch;
- return TRUE;
- }
-
- void dump();
- void buildLists(Entry *root);
- void addIncludes();
-
- private:
- void buildMemberList(Entry *ce,QList<TagMemberInfo> &members);
- void addDocAnchors(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;
- TagIncludeInfo *m_curIncludes;
- QCString m_curString;
- QString m_tagName;
- QString m_fileName;
- State m_state;
- QStack<State> m_stateStack;
- QXmlLocator *m_locator;
- QString 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 & )
- {
- return FALSE;
- }
- bool fatalError( const QXmlParseException &exception )
- {
- err("Fatal error at line %d column %d: %s\n",
- exception.lineNumber(),exception.columnNumber(),
- exception.message().data());
- return FALSE;
- }
- QString errorString() { return ""; }
-
- private:
- QString errorMsg;
-};
-
-/*! 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)
- {
- msg("class `%s'\n",cd->name.data());
- msg(" filename `%s'\n",cd->filename.data());
- if (cd->bases)
- {
- QListIterator<BaseInfo> bii(*cd->bases);
- BaseInfo *bi;
- for ( bii.toFirst() ; (bi=bii.current()) ; ++bii)
- {
- 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());
- }
- }
- //============== NAMESPACES
- QListIterator<TagNamespaceInfo> lni(m_tagFileNamespaces);
- TagNamespaceInfo *nd;
- for (;(nd=lni.current());++lni)
- {
- msg("namespace `%s'\n",nd->name.data());
- msg(" filename `%s'\n",nd->filename.data());
- QStringList::Iterator it;
- for ( it = nd->classList.begin();
- it != nd->classList.end(); ++it )
- {
- msg( " class: %s \n", (*it).latin1() );
- }
-
- 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());
- }
- }
- //============== FILES
- QListIterator<TagFileInfo> lfi(m_tagFileFiles);
- TagFileInfo *fd;
- for (;(fd=lfi.current());++lfi)
- {
- msg("file `%s'\n",fd->name.data());
- msg(" filename `%s'\n",fd->filename.data());
- QStringList::Iterator it;
- for ( it = fd->namespaceList.begin();
- it != fd->namespaceList.end(); ++it )
- {
- msg( " namespace: %s \n", (*it).latin1() );
- }
- for ( it = fd->classList.begin();
- it != fd->classList.end(); ++it )
- {
- msg( " class: %s \n", (*it).latin1() );
- }
-
- 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());
- }
-
- 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());
- }
- }
-
- //============== GROUPS
- QListIterator<TagGroupInfo> lgi(m_tagFileGroups);
- TagGroupInfo *gd;
- for (;(gd=lgi.current());++lgi)
- {
- msg("group `%s'\n",gd->name.data());
- msg(" filename `%s'\n",gd->filename.data());
- QStringList::Iterator it;
- for ( it = gd->namespaceList.begin();
- it != gd->namespaceList.end(); ++it )
- {
- msg( " namespace: %s \n", (*it).latin1() );
- }
- for ( it = gd->classList.begin();
- it != gd->classList.end(); ++it )
- {
- msg( " class: %s \n", (*it).latin1() );
- }
- for ( it = gd->fileList.begin();
- it != gd->fileList.end(); ++it )
- {
- msg( " file: %s \n", (*it).latin1() );
- }
- for ( it = gd->subgroupList.begin();
- it != gd->subgroupList.end(); ++it )
- {
- msg( " subgroup: %s \n", (*it).latin1() );
- }
- for ( it = gd->pageList.begin();
- it != gd->pageList.end(); ++it )
- {
- msg( " page: %s \n", (*it).latin1() );
- }
-
- 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());
- }
- }
- //============== PAGES
- QListIterator<TagPageInfo> lpi(m_tagFilePages);
- TagPageInfo *pd;
- for (;(pd=lpi.current());++lpi)
- {
- 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)
- {
- msg("dir `%s'\n",dd->name.data());
- msg(" path `%s'\n",dd->path.data());
- QStringList::Iterator it;
- for ( it = dd->fileList.begin();
- it != dd->fileList.end(); ++it )
- {
- msg( " file: %s \n", (*it).latin1() );
- }
- for ( it = dd->subdirList.begin();
- it != dd->subdirList.end(); ++it )
- {
- msg( " subdir: %s \n", (*it).latin1() );
- }
- }
-}
-
-void TagFileParser::addDocAnchors(Entry *e,const TagAnchorInfoList &l)
-{
- QListIterator<TagAnchorInfo> tli(l);
- TagAnchorInfo *ta;
- for (tli.toFirst();(ta=tli.current());++tli)
- {
- if (Doxygen::sectionDict.find(ta->label)==0)
- {
- //printf("New sectionInfo file=%s anchor=%s\n",
- // ta->fileName.data(),ta->label.data());
- SectionInfo *si=new SectionInfo(ta->fileName,ta->label,ta->label,
- SectionInfo::Anchor,m_tagName);
- Doxygen::sectionDict.insert(ta->label,si);
- e->anchors->append(si);
- }
- else
- {
- warn("Duplicate anchor %s found\n",ta->label.data());
- }
- }
-}
-
-void TagFileParser::buildMemberList(Entry *ce,QList<TagMemberInfo> &members)
-{
- QListIterator<TagMemberInfo> mii(members);
- TagMemberInfo *tmi;
- for (;(tmi=mii.current());++mii)
- {
- Entry *me = new Entry;
- me->type = tmi->type;
- me->name = tmi->name;
- me->args = tmi->arglist;
- if (!me->args.isEmpty())
- {
- delete me->argList;
- me->argList = new ArgumentList;
- stringToArgumentList(me->args,me->argList);
- }
- me->protection = tmi->prot;
- me->virt = tmi->virt;
- me->stat = tmi->isStatic;
- me->fileName = ce->fileName;
- if (ce->section == Entry::GROUPDOC_SEC)
- {
- me->groups->append(new Grouping(ce->name,Grouping::GROUPING_INGROUP));
- }
- addDocAnchors(me,tmi->docAnchors);
- TagInfo *ti = new TagInfo;
- ti->tagName = m_tagName;
- ti->anchor = tmi->anchor;
- ti->fileName = tmi->anchorFile;
- me->tagInfo = ti;
- if (tmi->kind=="define")
- {
- me->type="#define";
- me->section = Entry::DEFINE_SEC;
- }
- else if (tmi->kind=="enumvalue")
- {
- me->section = Entry::VARIABLE_SEC;
- me->mtype = Method;
- }
- else if (tmi->kind=="property")
- {
- me->section = Entry::VARIABLE_SEC;
- me->mtype = Property;
- }
- else if (tmi->kind=="event")
- {
- me->section = Entry::VARIABLE_SEC;
- me->mtype = Event;
- }
- else if (tmi->kind=="variable")
- {
- me->section = Entry::VARIABLE_SEC;
- me->mtype = Method;
- }
- 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")
- {
- me->section = Entry::ENUM_SEC;
- me->mtype = Method;
- }
- else if (tmi->kind=="function")
- {
- me->section = Entry::FUNCTION_SEC;
- me->mtype = Method;
- }
- else if (tmi->kind=="signal")
- {
- me->section = Entry::FUNCTION_SEC;
- me->mtype = Signal;
- }
- else if (tmi->kind=="prototype")
- {
- me->section = Entry::FUNCTION_SEC;
- me->mtype = Method;
- }
- else if (tmi->kind=="friend")
- {
- me->section = Entry::FUNCTION_SEC;
- me->type.prepend("friend ");
- me->mtype = Method;
- }
- else if (tmi->kind=="dcop")
- {
- me->section = Entry::FUNCTION_SEC;
- me->mtype = DCOP;
- }
- else if (tmi->kind=="slot")
- {
- me->section = Entry::FUNCTION_SEC;
- me->mtype = Slot;
- }
- ce->addSubEntry(me);
- }
-}
-
-static QString stripPath(const QString &s)
-{
- int i=s.findRev('/');
- if (i!=-1)
- {
- return s.right(s.length()-i-1);
- }
- else
- {
- return s;
- }
-}
-
-/*! Injects the info gathered by the XML parser into the Entry tree.
- * This tree contains the information extracted from the input in a
- * "unrelated" form.
- */
-void TagFileParser::buildLists(Entry *root)
-{
- // build class list
- TagClassInfo *tci = m_tagFileClasses.first();
- while (tci)
- {
- Entry *ce = new Entry;
- switch (tci->kind)
- {
- case TagClassInfo::Class: ce->section = Entry::CLASS_SEC; break;
- case TagClassInfo::Struct: ce->section = Entry::STRUCT_SEC; break;
- case TagClassInfo::Union: ce->section = Entry::UNION_SEC; break;
- case TagClassInfo::Interface: ce->section = Entry::INTERFACE_SEC; break;
- case TagClassInfo::Exception: ce->section = Entry::EXCEPTION_SEC; break;
- case TagClassInfo::Protocol: ce->section = Entry::PROTOCOL_SEC; break;
- case TagClassInfo::Category: ce->section = Entry::CATEGORY_SEC; break;
- }
- ce->name = tci->name;
- addDocAnchors(ce,tci->docAnchors);
- TagInfo *ti = new TagInfo;
- ti->tagName = m_tagName;
- ti->fileName = tci->filename;
- ce->tagInfo = ti;
- ce->objc = tci->isObjC;
- // transfer base class list
- if (tci->bases)
- {
- delete ce->extends;
- ce->extends = tci->bases; tci->bases = 0;
- }
- if (tci->templateArguments)
- {
- if (ce->tArgLists==0)
- {
- ce->tArgLists = new QList<ArgumentList>;
- ce->tArgLists->setAutoDelete(TRUE);
- }
- ArgumentList *al = new ArgumentList;
- ce->tArgLists->append(al);
-
- QListIterator<QString> sli(*tci->templateArguments);
- QString *argName;
- for (;(argName=sli.current());++sli)
- {
- Argument *a = new Argument;
- a->type = "class";
- a->name = *argName;
- al->append(a);
- }
- }
-
- buildMemberList(ce,tci->members);
- root->addSubEntry(ce);
- tci = m_tagFileClasses.next();
- }
-
- // build file list
- TagFileInfo *tfi = m_tagFileFiles.first();
- while (tfi)
- {
- Entry *fe = new Entry;
- fe->section = guessSection(tfi->name);
- fe->name = tfi->name;
- addDocAnchors(fe,tfi->docAnchors);
- TagInfo *ti = new TagInfo;
- ti->tagName = m_tagName;
- ti->fileName = tfi->filename;
- fe->tagInfo = ti;
-
- QString fullName = m_tagName+":"+tfi->path+stripPath(tfi->name);
- fe->fileName = fullName;
- //printf("new FileDef() filename=%s\n",tfi->filename.data());
- FileDef *fd = new FileDef(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);
- }
- buildMemberList(fe,tfi->members);
- root->addSubEntry(fe);
- tfi = m_tagFileFiles.next();
- }
-
- // build namespace list
- TagNamespaceInfo *tni = m_tagFileNamespaces.first();
- while (tni)
- {
- Entry *ne = new Entry;
- ne->section = Entry::NAMESPACE_SEC;
- ne->name = tni->name;
- addDocAnchors(ne,tni->docAnchors);
- TagInfo *ti = new TagInfo;
- ti->tagName = m_tagName;
- ti->fileName = tni->filename;
- ne->tagInfo = ti;
-
- buildMemberList(ne,tni->members);
- root->addSubEntry(ne);
- tni = m_tagFileNamespaces.next();
- }
-
- // build package list
- TagPackageInfo *tpgi = m_tagFilePackages.first();
- while (tpgi)
- {
- Entry *pe = new Entry;
- pe->section = Entry::PACKAGE_SEC;
- pe->name = tpgi->name;
- addDocAnchors(pe,tpgi->docAnchors);
- TagInfo *ti = new TagInfo;
- ti->tagName = m_tagName;
- ti->fileName = tpgi->filename;
- pe->tagInfo = ti;
-
- buildMemberList(pe,tpgi->members);
- root->addSubEntry(pe);
- tpgi = m_tagFilePackages.next();
- }
-
- // build group list, but only if config file says to include it
- //if (Config_getBool("EXTERNAL_GROUPS"))
- //{
- TagGroupInfo *tgi = m_tagFileGroups.first();
- while (tgi)
- {
- Entry *ge = new Entry;
- ge->section = Entry::GROUPDOC_SEC;
- ge->name = tgi->name;
- ge->type = tgi->title;
- addDocAnchors(ge,tgi->docAnchors);
- TagInfo *ti = new TagInfo;
- ti->tagName = m_tagName;
- ti->fileName = tgi->filename;
- ge->tagInfo = ti;
-
- buildMemberList(ge,tgi->members);
- root->addSubEntry(ge);
- tgi = m_tagFileGroups.next();
- }
- //}
-
- // build page list
- TagPageInfo *tpi = m_tagFilePages.first();
- while (tpi)
- {
- Entry *pe = new Entry;
- pe->section = Entry::PAGEDOC_SEC;
- pe->name = tpi->name;
- pe->args = tpi->title;
- addDocAnchors(pe,tpi->docAnchors);
- TagInfo *ti = new TagInfo;
- ti->tagName = m_tagName;
- ti->fileName = tpi->filename;
- pe->tagInfo = ti;
-
- root->addSubEntry(pe);
- tpi = m_tagFilePages.next();
- }
-}
-
-void TagFileParser::addIncludes()
-{
- TagFileInfo *tfi = m_tagFileFiles.first();
- while (tfi)
- {
- //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)
- {
- //printf("found\n");
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
- {
- //printf("input file path=%s name=%s\n",fd->getPath().data(),fd->name().data());
- if (fd->getPath()==QCString(m_tagName+":"+tfi->path))
- {
- //printf("found\n");
- QListIterator<TagIncludeInfo> mii(tfi->includes);
- TagIncludeInfo *ii;
- for (;(ii=mii.current());++mii)
- {
- //printf("ii->name=`%s'\n",ii->name.data());
- FileName *ifn = Doxygen::inputNameDict->find(ii->name);
- ASSERT(ifn!=0);
- if (ifn)
- {
- FileNameIterator ifni(*ifn);
- FileDef *ifd;
- for (;(ifd=ifni.current());++ifni)
- {
- //printf("ifd->getOutputFileBase()=%s ii->id=%s\n",
- // ifd->getOutputFileBase().data(),ii->id.data());
- if (ifd->getOutputFileBase()==QCString(ii->id))
- {
- fd->addIncludeDependency(ifd,ii->text,ii->isLocal,ii->isImported);
- }
- }
- }
- }
- }
- }
- }
- tfi = m_tagFileFiles.next();
- }
-}
-
-void parseTagFile(Entry *root,const char *fullName,const char *tagName)
-{
- QFileInfo fi(fullName);
- if (!fi.exists()) return;
- TagFileParser handler( 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();
-}
-
-
diff --git a/src/tagreader.h b/src/tagreader.h
deleted file mode 100644
index f9c75b6..0000000
--- a/src/tagreader.h
+++ /dev/null
@@ -1,28 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 TAGREADER_H
-#define TAGREADER_H
-
-#include "qtbc.h"
-
-class Entry;
-
-void parseTagFile(Entry *root,const char *fullPathName,const char *fileName);
-
-#endif
diff --git a/src/translator.cpp b/src/translator.cpp
deleted file mode 100644
index 10dfa9b..0000000
--- a/src/translator.cpp
+++ /dev/null
@@ -1,248 +0,0 @@
-/*! \file translator.cpp
- * \brief Implementation of generally used translator methods.
- *
- * This file contains implementation of the translator methods that
- * are not expected to be reimplemented by derived translator classes.
- * It also contains static data tables used by the methods.
- *
- */
-#include "translator.h"
-
-/*! The translation table used by Win1250ToISO88592() method. */
-const char Translator::Win1250ToISO88592Tab[] =
-{
- '\x80', '\x81', '\x82', '\x83', '\x84', '\x85', '\x86', '\x87',
- '\x88', '\x89', '\xA9', '\x8B', '\xA6', '\xAB', '\xAE', '\xAC',
- '\x90', '\x91', '\x92', '\x93', '\x94', '\x2E', '\x96', '\x97',
- '\x98', '\x99', '\xB9', '\x9B', '\xB6', '\xBB', '\xBE', '\xBC',
- '\xA0', '\x20', '\x20', '\xA3', '\xA4', '\xA1', '\xA6', '\xA7',
- '\x22', '\xA9', '\xAA', '\x3C', '\xAC', '\x2D', '\xAE', '\xAF',
- '\x2E', '\x2B', '\x20', '\xB3', '\x27', '\x75', '\xB6', '\xB7',
- '\x20', '\xB1', '\xBA', '\x3E', '\xA5', '\x22', '\xB5', '\xBF',
- '\xC0', '\xC1', '\xC2', '\xC3', '\xC4', '\xC5', '\xC6', '\xC7',
- '\xC8', '\xC9', '\xCA', '\xCB', '\xCC', '\xCD', '\xCE', '\xCF',
- '\xD0', '\xD1', '\xD2', '\xD3', '\xD4', '\xD5', '\xD6', '\xD7',
- '\xD8', '\xD9', '\xDA', '\xDB', '\xDC', '\xDD', '\xDE', '\xDF',
- '\xE0', '\xE1', '\xE2', '\xE3', '\xE4', '\xE5', '\xE6', '\xE7',
- '\xE8', '\xE9', '\xEA', '\xEB', '\xEC', '\xED', '\xEE', '\xEF',
- '\xF0', '\xF1', '\xF2', '\xF3', '\xF4', '\xF5', '\xF6', '\x2D',
- '\xF8', '\xF9', '\xFA', '\xFB', '\xFC', '\xFD', '\xFE', '\xFF',
- '\0'
-};
-
-
-/*! The translation table used by ISO88592ToWin1250() method. */
-const char Translator::ISO88592ToWin1250Tab[] = {
- '\x80', '\x81', '\x82', '\x83', '\x84', '\x85', '\x86', '\x87',
- '\x88', '\x89', '\x8A', '\x8B', '\x8C', '\x8D', '\x8E', '\x8F',
- '\x90', '\x91', '\x92', '\x93', '\x94', '\x95', '\x96', '\x97',
- '\x98', '\x99', '\x9A', '\x9B', '\x9C', '\x9D', '\x9E', '\x9F',
- '\xA0', '\xA5', '\xA2', '\xA3', '\xA4', '\xBC', '\x8C', '\xA7',
- '\xA8', '\x8A', '\xAA', '\x8D', '\x8F', '\xAD', '\x8E', '\xAF',
- '\xB0', '\xB9', '\xB2', '\xB3', '\xB4', '\xBE', '\x9C', '\xB7',
- '\xB8', '\x9A', '\xBA', '\x9D', '\x9F', '\xBD', '\x9E', '\xBF',
- '\xC0', '\xC1', '\xC2', '\xC3', '\xC4', '\xC5', '\xC6', '\xC7',
- '\xC8', '\xC9', '\xCA', '\xCB', '\xCC', '\xCD', '\xCE', '\xCF',
- '\xD0', '\xD1', '\xD2', '\xD3', '\xD4', '\xD5', '\xD6', '\xD7',
- '\xD8', '\xD9', '\xDA', '\xDB', '\xDC', '\xDD', '\xDE', '\xDF',
- '\xE0', '\xE1', '\xE2', '\xE3', '\xE4', '\xE5', '\xE6', '\xE7',
- '\xE8', '\xE9', '\xEA', '\xEB', '\xEC', '\xED', '\xEE', '\xEF',
- '\xF0', '\xF1', '\xF2', '\xF3', '\xF4', '\xF5', '\xF6', '\xF7',
- '\xF8', '\xF9', '\xFA', '\xFB', '\xFC', '\xFD', '\xFE', '\xFF',
- '\0'
-};
-
-
-/*! The translation table used by Koi8RToWindows1251() method. */
-const unsigned char Translator::Koi8RToWindows1251Tab[128] =
-{ 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
- 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
- 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
- 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
- 254,224,225,246,228,229,244,227,245,232,233,234,235,236,237,238,
- 239,255,240,241,242,243,230,226,252,251,231,248,253,249,247,250,
- 222,192,193,214,196,197,212,195,213,200,201,202,203,204,205,206,
- 207,223,208,209,210,211,198,194,220,219,199,216,221,217,215,218
-};
-
-
-/*! The translation table used by Windows1251ToKoi8R() method. */
-const unsigned char Translator::Windows1251ToKoi8RTab[128] =
-{ 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,
- 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,
- 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,
- 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,
- 225,226,247,231,228,229,246,250,233,234,235,236,237,238,239,240,
- 242,243,244,245,230,232,227,254,251,253,255,249,248,252,224,241,
- 193,194,215,199,196,197,214,218,201,202,203,204,205,206,207,208,
- 210,211,212,213,198,200,195,222,219,221,223,217,216,220,192,209
-};
-
-/*! Returns the string converted from windows-1250 to iso-8859-2. */
-/* The method was designed initially for translator_cz.h.
- * It is used for on-line encoding conversion related to
- * conditional compilation in Unix/MS Windows environments
- * (both use different encoding). Later, the translator_hr.h
- * (by Boris Bralo) used and improved the same style. As the
- * method with the translation table was the same, the
- * decision to move it to this base class was made. The same
- * holds for ISO88592ToWin1250() method.
- *
- * Alexandr Chelpanov used the same approach for
- * Koi8RToWindows1251() and Windows1251ToKoi8R() methods. Notice,
- * that he uses Unicode tables.
- *
- * It is recommended for possibly other similar methods in future.
- */
-QCString Translator::Win1250ToISO88592(const QCString & sInput)
-{
- // The conversion table for characters >127
- //
-
- QCString result;
- int len = sInput.length();
-
- for (int i = 0; i < len; ++i)
- {
- unsigned int c = sInput[i];
- result += (c > 127) ? Win1250ToISO88592Tab[c & 0x7F] : c;
- }
- return result;
-}
-
-
-/*! returns the string converted from iso-8859-2 to windows-1250 */
-/* See the comments of the Win1250ToISO88592() method for details. */
-QCString Translator::ISO88592ToWin1250(const QCString & sInput)
-{
- // The conversion table for characters >127
- //
- QCString result;
- int len = sInput.length();
-
- for (int i = 0; i < len; ++i)
- {
- unsigned int c = sInput[i];
- result += (c > 127) ? ISO88592ToWin1250Tab[c & 0x7F] : c;
- }
- return result;
-}
-
-
-/*! Returns the string converted from koi8-r to windows-1251. */
-/* The method was designed initially for translator_cz.h.
- It is used for on-line encoding conversion related to conditional
- compilation in Unix/MS Windows environments (both use different
- encoding). Encoding table got from QT:qtextcodec.cpp
- */
-QCString Translator::Koi8RToWindows1251( const QCString & sInput )
-{
-
- QCString result(sInput);
- int len = sInput.length();
-
- const unsigned char * c = (const unsigned char *)(const char*)sInput;
- unsigned char *dc = (unsigned char*)(const char*)result;
- for( int i=0; i<len; i++ ) {
- if ( c[i] > 127 )
- dc[i] = Koi8RToWindows1251Tab[c[i]-128];
- }
- return result;
-}
-
-
-/*! returns the string converted from Windows-1251 to koi8-r */
-/* See the comments of the Koi8RToWindows1251() method for details.
- Encoding table got from QT:qtextcodec.cpp */
-QCString Translator::Windows1251ToKoi8R( const QCString & sInput )
-{
- QCString result(sInput);
- int len = sInput.length();
-
- const unsigned char * c = (const unsigned char *)(const char*)sInput;
- unsigned char *dc = (unsigned char*)(const char*)result;
- for( int i=0; i<len; i++ ) {
- if ( c[i] > 127 )
- dc[i] = Windows1251ToKoi8RTab[c[i]-128];
- }
- return result;
-}
-
-/*! returns the caracter converted from hankaku-kana to zenkakukana.
- Thanks Yongmao Ni http://alfin.mine.utsunomiya-u.ac.jp/~niy/algo/ */
-unsigned int hankaku2zen(int hankaku)
-{
- static unsigned int z[64] = {
- 0x2121,0x2123,0x2156,0x2157,0x2122,0x2126,0x2572,0x2521,
- 0x2523,0x2525,0x2527,0x2529,0x2563,0x2565,0x2567,0x2543,
- 0x213c,0x2522,0x2524,0x2526,0x2528,0x252a,0x252b,0x252d,
- 0x252f,0x2531,0x2533,0x2535,0x2537,0x2539,0x253b,0x253d,
- 0x253f,0x2541,0x2544,0x2546,0x2548,0x254a,0x254b,0x254c,
- 0x254d,0x254e,0x254f,0x2552,0x2555,0x2558,0x255b,0x255e,
- 0x255f,0x2560,0x2561,0x2562,0x2564,0x2566,0x2568,0x2569,
- 0x256a,0x256b,0x256c,0x256d,0x256f,0x2573,0x212b,0x212c };
-
- if (hankaku < 0xa0 || hankaku > 0xdf) return 0;
- return z[hankaku - 0xa0];
-}
-
-/*! returns the character converted from japaneseEUC to SJIS
- Thanks Yongmao Ni http://alfin.mine.utsunomiya-u.ac.jp/~niy/algo/ */
-unsigned int euc2sjis(unsigned int euc)
-{
- unsigned int jis;
- unsigned int hib, lob;
-
- if ((euc & 0xff00) == 0x8e00)
- jis = hankaku2zen(euc & 0xff);
- else jis = euc & ~0x8080;
-
- hib = (jis >> 8) & 0xff;
- lob = jis & 0xff;
- lob += (hib & 1) ? 0x1f : 0x7d;
- if (lob >= 0x7f) lob++;
- hib = ((hib - 0x21) >> 1) + 0x81;
- if (hib > 0x9f) hib += 0x40;
-
- return (hib << 8) | lob;
-}
-
-
-/*! returns the string converted from Japanese-EUC to SJIS */
-
-QCString Translator::JapaneseEucToSjis( const QCString & sInput )
-{
- QString result;
- int len = sInput.length();
- int c1,c2,sj;
-
- result.setUnicode(0, len);
- QChar* uc = (QChar*)result.unicode(); // const_cast
- const unsigned char * c = (const unsigned char *)(const char*)sInput;
-
- for( int i=0; i<len;)
- {
- c1 = c[i];
-
- if( c1 == EOF ) break;
-
- /* if MSB=0 then the character is ascii */
- if(!( c1 & 0x80))
- {
- uc[i] = c[i];
- i=i+1;
- }
- else
- {
- c2 = c[i+1];
- if( c2 == EOF ) break;
- sj = euc2sjis( (c1 << 8) + c2 );
- uc[i] = sj >> 8;
- uc[i+1] = sj & 0xff;
- i+=2;
- }
- }
-
- return result.latin1();
-
-}
diff --git a/src/translator.h b/src/translator.h
deleted file mode 100644
index 9626996..0000000
--- a/src/translator.h
+++ /dev/null
@@ -1,444 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 TRANSLATOR_H
-#define TRANSLATOR_H
-
-#include "qtbc.h"
-#include "classdef.h"
-#include "util.h"
-#include "config.h"
-
-class Translator
-{
- private:
- /* Tables for encoding conversions. */
- static const char Win1250ToISO88592Tab[];
- static const char ISO88592ToWin1250Tab[];
- static const unsigned char Koi8RToWindows1251Tab[128];
- static const unsigned char Windows1251ToKoi8RTab[128];
-
- protected:
- /*! Returns the string converted from windows-1250 to iso-8859-2. */
- QCString Win1250ToISO88592(const QCString & sInput);
-
- /*! Returns the string converted from iso-8859-2 to windows-1250. */
- QCString ISO88592ToWin1250(const QCString & sInput);
-
- /*! Returns the string converted from koi8-r to windows-1251. */
- QCString Koi8RToWindows1251( const QCString & sInput );
-
- /*! Returns the string converted from windows-1251 to koi8-r. */
- QCString Windows1251ToKoi8R( const QCString & sInput );
-
- /*! Returns the string converted from Japanese-EUC to SJIS. */
- QCString JapaneseEucToSjis( const QCString & sInput );
-
- public:
-
- /*! This method is used to provide warning message that is displayed
- * if the user chooses a language whose translation is not up to date.
- * It is implemented by the adapter classes.
- */
- virtual QCString updateNeededMessage() { return ""; }
-
- // Please, have a look at comments inside the translator_en.h file
- // to learn the meaning of the following methods. The translator_en.h
- // file contains the TranslatorEnglish implementation, which is
- // always up-to-date (by definition).
-
- // --- Language control methods -------------------
-
- virtual QCString idLanguage() = 0;
- virtual QCString latexLanguageSupportCommand() = 0;
- virtual QCString idLanguageCharset() = 0;
-
- // --- Language translation methods -------------------
-
- virtual QCString trRelatedFunctions() = 0;
- virtual QCString trRelatedSubscript() = 0;
- virtual QCString trDetailedDescription() = 0;
- virtual QCString trMemberTypedefDocumentation() = 0;
- virtual QCString trMemberEnumerationDocumentation() = 0;
- virtual QCString trMemberFunctionDocumentation() = 0;
- virtual QCString trMemberDataDocumentation() = 0;
- virtual QCString trMore() = 0;
- virtual QCString trListOfAllMembers() = 0;
- virtual QCString trMemberList() = 0;
- virtual QCString trThisIsTheListOfAllMembers() = 0;
- virtual QCString trIncludingInheritedMembers() = 0;
- virtual QCString trGeneratedAutomatically(const char *s) = 0;
- virtual QCString trEnumName() = 0;
- virtual QCString trEnumValue() = 0;
- virtual QCString trDefinedIn() = 0;
-
- // quick reference sections
-
- virtual QCString trModules() = 0;
- virtual QCString trClassHierarchy() = 0;
- virtual QCString trCompoundList() = 0;
- virtual QCString trFileList() = 0;
- //virtual QCString trHeaderFiles() = 0;
- virtual QCString trCompoundMembers() = 0;
- virtual QCString trFileMembers() = 0;
- virtual QCString trRelatedPages() = 0;
- virtual QCString trExamples() = 0;
- virtual QCString trSearch() = 0;
- virtual QCString trClassHierarchyDescription() = 0;
- virtual QCString trFileListDescription(bool extractAll) = 0;
- virtual QCString trCompoundListDescription() = 0;
- virtual QCString trCompoundMembersDescription(bool extractAll) = 0;
- virtual QCString trFileMembersDescription(bool extractAll) = 0;
- //virtual QCString trHeaderFilesDescription() = 0;
- virtual QCString trExamplesDescription() = 0;
- virtual QCString trRelatedPagesDescription() = 0;
- virtual QCString trModulesDescription() = 0;
- //virtual QCString trNoDescriptionAvailable() = 0;
-
- // index titles (the project name is prepended for these)
-
- virtual QCString trDocumentation() = 0;
- virtual QCString trModuleIndex() = 0;
- virtual QCString trHierarchicalIndex() = 0;
- virtual QCString trCompoundIndex() = 0;
- virtual QCString trFileIndex() = 0;
- virtual QCString trModuleDocumentation() = 0;
- virtual QCString trClassDocumentation() = 0;
- virtual QCString trFileDocumentation() = 0;
- virtual QCString trExampleDocumentation() = 0;
- virtual QCString trPageDocumentation() = 0;
- virtual QCString trReferenceManual() = 0;
- virtual QCString trDefines() = 0;
- virtual QCString trFuncProtos() = 0;
- virtual QCString trTypedefs() = 0;
- virtual QCString trEnumerations() = 0;
- virtual QCString trFunctions() = 0;
- virtual QCString trVariables() = 0;
- virtual QCString trEnumerationValues() = 0;
- virtual QCString trDefineDocumentation() = 0;
- virtual QCString trFunctionPrototypeDocumentation() = 0;
- virtual QCString trTypedefDocumentation() = 0;
- virtual QCString trEnumerationTypeDocumentation() = 0;
- //virtual QCString trEnumerationValueDocumentation() = 0;
- virtual QCString trFunctionDocumentation() = 0;
- virtual QCString trVariableDocumentation() = 0;
- virtual QCString trCompounds() = 0;
- virtual QCString trGeneratedAt(const char *date,const char *projName) = 0;
- virtual QCString trWrittenBy() = 0;
- virtual QCString trClassDiagram(const char *clName) = 0;
- virtual QCString trForInternalUseOnly() = 0;
- //virtual QCString trReimplementedForInternalReasons() = 0;
- virtual QCString trWarning() = 0;
- //virtual QCString trBugsAndLimitations() = 0;
- virtual QCString trVersion() = 0;
- virtual QCString trDate() = 0;
- virtual QCString trReturns() = 0;
- virtual QCString trSeeAlso() = 0;
- virtual QCString trParameters() = 0;
- virtual QCString trExceptions() = 0;
- virtual QCString trGeneratedBy() = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trNamespaceList() = 0;
- virtual QCString trNamespaceListDescription(bool extractAll) = 0;
- virtual QCString trFriends() = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trRelatedFunctionDocumentation() = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool isTemplate) = 0;
-
- virtual QCString trFileReference(const char *fileName) = 0;
- virtual QCString trNamespaceReference(const char *namespaceName) = 0;
-
- virtual QCString trPublicMembers() = 0;
- virtual QCString trPublicSlots() = 0;
- virtual QCString trSignals() = 0;
- virtual QCString trStaticPublicMembers() = 0;
- virtual QCString trProtectedMembers() = 0;
- virtual QCString trProtectedSlots() = 0;
- virtual QCString trStaticProtectedMembers() = 0;
- virtual QCString trPrivateMembers() = 0;
- virtual QCString trPrivateSlots() = 0;
- virtual QCString trStaticPrivateMembers() = 0;
- virtual QCString trWriteList(int numEntries) = 0;
- virtual QCString trInheritsList(int numEntries) = 0;
- virtual QCString trInheritedByList(int numEntries) = 0;
- virtual QCString trReimplementedFromList(int numEntries) = 0;
- virtual QCString trReimplementedInList(int numEntries) = 0;
- virtual QCString trNamespaceMembers() = 0;
- virtual QCString trNamespaceMemberDescription(bool extractAll) = 0;
- virtual QCString trNamespaceIndex() = 0;
- virtual QCString trNamespaceDocumentation() = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trNamespaces() = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990728
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single) = 0;
- virtual QCString trAlphabeticalList() = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReturnValues() = 0;
- virtual QCString trMainPage() = 0;
- virtual QCString trPageAbbreviation() = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991003
-//////////////////////////////////////////////////////////////////////////
-
- //virtual QCString trSources() = 0;
- virtual QCString trDefinedAtLineInSourceFile() = 0;
- virtual QCString trDefinedInSourceFile() = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDeprecated() = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trCollaborationDiagram(const char *clName) = 0;
- virtual QCString trInclDepGraph(const char *fName) = 0;
- virtual QCString trConstructorDocumentation() = 0;
- virtual QCString trGotoSourceCode() = 0;
- virtual QCString trGotoDocumentation() = 0;
- virtual QCString trPrecondition() = 0;
- virtual QCString trPostcondition() = 0;
- virtual QCString trInvariant() = 0;
- virtual QCString trInitialValue() = 0;
- virtual QCString trCode() = 0;
-
- virtual QCString trGraphicalHierarchy() = 0;
- virtual QCString trGotoGraphicalHierarchy() = 0;
- virtual QCString trGotoTextualHierarchy() = 0;
- virtual QCString trPageIndex() = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trNote() = 0;
- virtual QCString trPublicTypes() = 0;
- virtual QCString trPublicAttribs() = 0;
- virtual QCString trStaticPublicAttribs() = 0;
- virtual QCString trProtectedTypes() = 0;
- virtual QCString trProtectedAttribs() = 0;
- virtual QCString trStaticProtectedAttribs() = 0;
- virtual QCString trPrivateTypes() = 0;
- virtual QCString trPrivateAttribs() = 0;
- virtual QCString trStaticPrivateAttribs() = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trTodo() = 0;
- virtual QCString trTodoList() = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy() = 0;
- virtual QCString trRemarks() = 0;
- virtual QCString trAttention() = 0;
- virtual QCString trInclByDepGraph() = 0;
- virtual QCString trSince() = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trLegendTitle() = 0;
- virtual QCString trLegendDocs() = 0;
- virtual QCString trLegend() = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trTest() = 0;
- virtual QCString trTestList() = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDCOPMethods() = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trProperties() = 0;
- virtual QCString trPropertyDocumentation() = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- //virtual QCString trInterfaces() = 0;
- virtual QCString trClasses() = 0;
- virtual QCString trPackage(const char *name) = 0;
- virtual QCString trPackageList() = 0;
- virtual QCString trPackageListDescription() = 0;
- virtual QCString trPackages() = 0;
- //virtual QCString trPackageDocumentation() = 0;
- virtual QCString trDefineValue() = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trBug() = 0;
- virtual QCString trBugList() = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trRTFansicp() = 0;
- virtual QCString trRTFCharSet() = 0;
- virtual QCString trRTFGeneralIndex() = 0;
-
- // Translation of the word
-
- virtual QCString trClass(bool first_capital, bool singular) = 0;
- virtual QCString trFile(bool first_capital, bool singular) = 0;
- virtual QCString trNamespace(bool first_capital, bool singular) = 0;
- virtual QCString trGroup(bool first_capital, bool singular) = 0;
- virtual QCString trPage(bool first_capital, bool singular) = 0;
- virtual QCString trMember(bool first_capital, bool singular) = 0;
- //virtual QCString trField(bool first_capital, bool singular) = 0;
- virtual QCString trGlobal(bool first_capital, bool singular) = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trAuthor(bool first_capital, bool singular) = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferences() = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.13
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trImplementedFromList(int numEntries) = 0;
- virtual QCString trImplementedInList(int numEntries) = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.16
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trRTFTableOfContents() = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.17
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDeprecatedList() = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.18
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trEvents() = 0;
- virtual QCString trEventDocumentation() = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trPackageTypes() = 0;
- virtual QCString trPackageMembers() = 0;
- virtual QCString trStaticPackageMembers() = 0;
- virtual QCString trPackageAttribs() = 0;
- virtual QCString trStaticPackageAttribs() = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.1
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trAll() = 0;
- virtual QCString trCallGraph() = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.3
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trSearchForIndex() = 0;
- virtual QCString trSearchResultsTitle() = 0;
- virtual QCString trSearchResults(int numDocuments) = 0;
- virtual QCString trSearchMatches() = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.8
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trSourceFile(QCString& filename) = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.9
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDirIndex() = 0;
- virtual QCString trDirDocumentation() = 0;
- virtual QCString trDirectories() = 0;
- virtual QCString trDirDescription() = 0;
- virtual QCString trDirReference(const char *dirName) = 0;
- virtual QCString trDir(bool first_capital, bool singular) = 0;
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.4.1
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trOverloadText() = 0;
-
-};
-
-#endif
diff --git a/src/translator_adapter.h b/src/translator_adapter.h
deleted file mode 100644
index 8962e84..0000000
--- a/src/translator_adapter.h
+++ /dev/null
@@ -1,187 +0,0 @@
-#ifndef TRANSLATOR_ADAPTER_H
-#define TRANSLATOR_ADAPTER_H
-
-#include "version.h"
-
-/*! \brief Base of the translator adapter tree
- *
-
- * This abstract class provides access to the english
- * translations, to be used as a substitute for not implemented
- * local translations.
- */
-class TranslatorAdapterBase : public Translator
-{
- protected:
- virtual ~TranslatorAdapterBase() {}
- TranslatorEnglish english;
-
- /*! An auxiliary inline method used by the updateNeededMessage()
- * for building a warning message.
- */
- inline QCString createUpdateNeededMessage(const QCString & languageName,
- const QCString & versionString)
- {
- return QCString("Warning: The selected output language \"")
- + languageName
- + "\" has not been updated\nsince "
- + versionString
- + ". As a result some sentences may appear in English.\n\n";
- }
-
- public:
- /*! This method is used to generate a warning message to signal
- * the user that the translation of his/her language of choice
- * needs updating. It must be implemented by the translator
- * adapter class (pure virtual).
- *
- * \sa createUpdateNeededMessage()
- */
- virtual QCString updateNeededMessage() = 0;
-
-};
-
-class TranslatorAdapter_1_4_1 : public TranslatorAdapterBase
-{
- public:
- virtual QCString updateNeededMessage()
- { return createUpdateNeededMessage(idLanguage(),"release 1.4.1"); }
-
- virtual QCString trOverloadText()
- { return english.trOverloadText(); }
-};
-
-class TranslatorAdapter_1_3_9 : public TranslatorAdapter_1_4_1
-{
- public:
- virtual QCString updateNeededMessage()
- { return createUpdateNeededMessage(idLanguage(),"release 1.3.9"); }
-
- virtual QCString trDirIndex()
- { return english.trDirIndex(); }
- virtual QCString trDirDocumentation()
- { return english.trDirDocumentation(); }
- virtual QCString trDirectories()
- { return english.trDirectories(); }
- virtual QCString trDirDescription()
- { return english.trDirDescription(); }
- virtual QCString trDirReference(const char *dirName)
- { return english.trDirReference(dirName); }
- virtual QCString trDir(bool first_capital, bool singular)
- { return english.trDir(first_capital,singular); }
-};
-
-class TranslatorAdapter_1_3_8 : public TranslatorAdapter_1_3_9
-{
- public:
- virtual QCString updateNeededMessage()
- { return createUpdateNeededMessage(idLanguage(),"release 1.3.8"); }
-
- virtual QCString trSourceFile(QCString& filename)
- { return english.trSourceFile(filename); }
-};
-
-class TranslatorAdapter_1_3_3 : public TranslatorAdapter_1_3_8
-{
- public:
- virtual QCString updateNeededMessage()
- { return createUpdateNeededMessage(idLanguage(),"release 1.3.3"); }
-
- virtual QCString trSearchForIndex()
- { return english.trSearchForIndex(); }
- virtual QCString trSearchResultsTitle()
- { return english.trSearchResultsTitle(); }
- virtual QCString trSearchResults(int numDocuments)
- { return english.trSearchResults(numDocuments); }
- virtual QCString trSearchMatches()
- { return english.trSearchMatches(); }
-
-};
-
-class TranslatorAdapter_1_3_1 : public TranslatorAdapter_1_3_3
-{
- public:
- virtual QCString updateNeededMessage()
- { return createUpdateNeededMessage(idLanguage(),"release 1.3.1"); }
- virtual QCString trAll()
- { return english.trAll(); }
- virtual QCString trCallGraph()
- { return english.trCallGraph(); }
-};
-
-class TranslatorAdapter_1_3 : public TranslatorAdapter_1_3_1
-{
- public:
- virtual QCString updateNeededMessage()
- { return createUpdateNeededMessage(idLanguage(),"release 1.3"); }
-
- virtual QCString trPackageTypes()
- { return english.trPackageTypes(); }
- virtual QCString trPackageMembers()
- { return english.trPackageMembers(); }
- virtual QCString trStaticPackageMembers()
- { return english.trStaticPackageMembers(); }
- virtual QCString trPackageAttribs()
- { return english.trPackageAttribs(); }
- virtual QCString trStaticPackageAttribs()
- { return english.trStaticPackageAttribs(); }
-};
-
-class TranslatorAdapter_1_2_18 : public TranslatorAdapter_1_3
-{
- public:
- virtual QCString updateNeededMessage()
- { return createUpdateNeededMessage(idLanguage(),"release 1.2.18"); }
-
- virtual QCString trEvents()
- { return english.trEvents(); }
- virtual QCString trEventDocumentation()
- { return english.trEventDocumentation(); }
-};
-
-class TranslatorAdapter_1_2_17 : public TranslatorAdapter_1_2_18
-{
- public:
- virtual QCString updateNeededMessage()
- { return createUpdateNeededMessage(idLanguage(),"release 1.2.17"); }
-
- virtual QCString trDeprecatedList()
- { return english.trDeprecatedList(); }
-};
-
-class TranslatorAdapter_1_2_16 : public TranslatorAdapter_1_2_17
-{
- public:
- virtual QCString updateNeededMessage()
- { return createUpdateNeededMessage(idLanguage(),"release 1.2.16"); }
-
- virtual QCString trRTFTableOfContents()
- { return english.trRTFTableOfContents(); }
-};
-
-class TranslatorAdapter_1_2_13 : public TranslatorAdapter_1_2_16
-{
- public:
- virtual QCString updateNeededMessage()
- { return createUpdateNeededMessage(idLanguage(),"release 1.2.13"); }
-
- virtual QCString trImplementedFromList(int numEntries)
- { return english.trImplementedFromList(numEntries); }
-
- virtual QCString trImplementedInList(int numEntries)
- { return english.trImplementedInList(numEntries); }
-};
-
-class TranslatorAdapter_1_2_11 : public TranslatorAdapter_1_2_13
-{
- public:
- virtual QCString updateNeededMessage()
- { return createUpdateNeededMessage(idLanguage(),"release 1.2.11"); }
-
- virtual QCString trReferences()
- { return english.trReferences(); }
-
-};
-
-#endif
-
diff --git a/src/translator_br.h b/src/translator_br.h
deleted file mode 100644
index 0cca480..0000000
--- a/src/translator_br.h
+++ /dev/null
@@ -1,1617 +0,0 @@
-/******************************************************************************
- * Copyright (C) 1997-2005 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.
- *
- * Brazilian Portuguese version by
- * Fabio "FJTC" Jun Takada Chino <jun-chino at uol.com.br>
- * Version: 1.4.1 (2005/03/20)
- *
- * History:
- * 1.4.1
- * - Method trOverloadText() added.
- * 1.3.9
- * - Updated to Doxygen 1.3.9
- * 1.3.8
- * - Updated to Doxygen 1.3.8
- * 1.3.3:
- * - Updated to Doxygen 1.3.3
- * 1.3.2:
- * - Updated to Doxygen 1.3.2
- * 1.3:
- * - Updated to Doxygen 1.3.x.
- * 1.2.19:
- * - Updated to Doxygen 1.2.19
- * - Translation Review (Thanks to Jorge Ramos and others)
- * - Small fixes in C output.
- * - Latex generation support fixed (invalid package name).
- */
-#ifndef TRANSLATOR_BR_H
-#define TRANSLATOR_BR_H
-
-class TranslatorBrazilian : public Translator
-{
- public:
-
- // --- Language control methods -------------------
-
- /*! Used for identification of the language. May resemble
- * the string returned by latexBabelPackage(), but it is not used
- * for the same purpose. The identification should not be translated.
- * It should be replaced by the name of the language in English
- * (e.g. Czech, Japanese, Russian, etc.). It should be equal to
- * the identification in language.h.
- */
- virtual QCString idLanguage()
- {
- return "brazil";
- }
-
- /*! Used to get the command(s) for the language support. This method
- * was designed for languages which do not prefer babel package.
- * If this methods returns empty string, then the latexBabelPackage()
- * method is used to generate the command for using the babel package.
- */
- virtual QCString latexLanguageSupportCommand()
- {
- return "";
- }
-
- /*! return the language charset. This will be used for the HTML output */
- virtual QCString idLanguageCharset()
- {
- return "iso-8859-1";
- }
-
- // --- Language translation methods -------------------
-
- /*! used in the compound documentation before a list of related functions. */
- virtual QCString trRelatedFunctions()
- { return "Funções Relacionadas"; }
-
- /*! subscript for the related functions. */
- virtual QCString trRelatedSubscript()
- { return "(Note que estas não são funções membros.)"; }
-
- /*! header that is put before the detailed description of files, classes and namespaces. */
- virtual QCString trDetailedDescription()
- { return "Descrição Detalhada"; }
-
- /*! header that is put before the list of typedefs. */
- virtual QCString trMemberTypedefDocumentation()
- { return "Definições de Tipos"; }
-
- /*! header that is put before the list of enumerations. */
- virtual QCString trMemberEnumerationDocumentation()
- { return "Enumerações"; }
-
- /*! header that is put before the list of member functions. */
- virtual QCString trMemberFunctionDocumentation()
- { return "Métodos"; }
-
- /*! header that is put before the list of member attributes. */
- virtual QCString trMemberDataDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Campos e Atributos";
- }
- else
- {
- return "Constantes";
- }
- }
-
- /*! this is the text of a link put after brief descriptions. */
- virtual QCString trMore()
- { return "Mais..."; }
-
- /*! put in the class documentation */
- virtual QCString trListOfAllMembers()
- { return "Lista de todos os Membros."; }
-
- /*! used as the title of the "list of all members" page of a class */
- virtual QCString trMemberList()
- { return "Lista dos Membros"; }
-
- /*! this is the first part of a sentence that is followed by a class name */
- virtual QCString trThisIsTheListOfAllMembers()
- { return "Esta é a lista de todos os membros de "; }
-
- /*! this is the remainder of the sentence after the class name */
- virtual QCString trIncludingInheritedMembers()
- { return ", incluindo os membros herdados."; }
-
- /*! 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="Gerado automaticamente por Doxygen";
- if (s) result+=(QCString)" para "+s;
- result+=" a partir de seu código-fonte.";
- return result;
- }
-
- /*! put after an enum name in the list of all members */
- virtual QCString trEnumName()
- { return "Nome da enumeração"; }
-
- /*! put after an enum value in the list of all members */
- virtual QCString trEnumValue()
- { return "Valor enumerado"; }
-
- /*! put after an undocumented member in the list of all members */
- virtual QCString trDefinedIn()
- { return "definido(a) em"; }
-
- // 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 "Módulos"; }
-
- /*! This is put above each page as a link to the class hierarchy */
- virtual QCString trClassHierarchy()
- { return "Hierarquia de Classes"; }
-
- /*! This is put above each page as a link to the list of annotated classes */
- virtual QCString trCompoundList()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Estruturas de Dados";
- }
- else
- {
- return "Lista de Componentes";
- }
- }
-
- /*! This is put above each page as a link to the list of documented files */
- virtual QCString trFileList()
- { return "Lista de Arquivos"; }
-
- /*! This is put above each page as a link to the list of all verbatim headers */
- virtual QCString trHeaderFiles()
- { return "Arquivos de Cabeçalho (Headers)"; }
-
- /*! This is put above each page as a link to all members of compounds. */
- virtual QCString trCompoundMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Campos de Dados";
- }
- else
- {
- return "Componentes Membros";
- }
- }
-
- /*! This is put above each page as a link to all members of files. */
- virtual QCString trFileMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Globais";
- }
- else
- {
- return "Arquivos Membros";
- }
- }
-
- /*! This is put above each page as a link to all related pages. */
- virtual QCString trRelatedPages()
- { return "Páginas relacionadas"; }
-
- /*! This is put above each page as a link to all examples. */
- virtual QCString trExamples()
- { return "Exemplos"; }
-
- /*! This is put above each page as a link to the search engine. */
- virtual QCString trSearch()
- { return "Busca"; }
-
- /*! This is an introduction to the class hierarchy. */
- virtual QCString trClassHierarchyDescription()
- { return "Esta lista de hierarquias está parcialmente ordenada (ordem alfabética):"; }
-
- /*! This is an introduction to the list with all files. */
- virtual QCString trFileListDescription(bool extractAll)
- {
- QCString result="Esta é a lista de todos os arquivos ";
- if (!extractAll) result+="documentados ";
- result+="e suas respectivas descrições:";
- return result;
- }
-
- /*! This is an introduction to the annotated compound list. */
- virtual QCString trCompoundListDescription()
- {
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Aqui estão as estruturas de dados e suas respectivas descrições:";
- }
- else
- {
- return "Aqui estão as classes, estruturas, uniões e interfaces e suas respectivas descrições:";
- }
- }
-
- /*! This is an introduction to the page with all class members. */
- virtual QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result="Esta é a lista de ";
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="todas as estruturas e campos de uniões ";
- if (!extractAll)
- {
- result+="documentas";
- }
- }
- else
- {
- result+="todos os membros de classes ";
- if (!extractAll)
- {
- result+="documentos";
- }
- }
- result+=" com referências para ";
- if (!extractAll)
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="a documentação da estrutura/união de cada campo:";
- }
- else
- {
- result+="a documentação da classe de cada membro:";
- }
- }
- else
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="a estrutura/união a que pertencem:";
- }
- else
- {
- result+="a classe a que pertencem:";
- }
- }
- return result;
- }
-
- /*! This is an introduction to the page with all file members. */
- virtual QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="Esta é a lista de ";
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="todas as funções, variáveis, definições, enumerações e definições de tipos ";
- if (!extractAll) result+="documentadas ";
- }
- else
- {
- result+="todos os membros dos arquivos ";
- if (!extractAll) result+="documentados ";
- }
- result+="com referências para ";
- if (extractAll)
- result+="seus respectivos arquivos:";
- else
- result+="suas respectivas documentações:";
- return result;
- }
-
- /*! This is an introduction to the page with the list of all header files. */
- virtual QCString trHeaderFilesDescription()
- { return "Estes são os arquivos de cabeçalho que compõe a API:"; }
-
- /*! This is an introduction to the page with the list of all examples */
- virtual QCString trExamplesDescription()
- { return "Esta é a lista com todos os exemplos:"; }
-
- /*! This is an introduction to the page with the list of related pages */
- virtual QCString trRelatedPagesDescription()
- { return "Esta é a lista com toda a documentação relacionadas:"; }
-
- /*! This is an introduction to the page with the list of class/file groups */
- virtual QCString trModulesDescription()
- { return "Esta é a lista com todos os módulos:"; }
-
- /*! This sentences is used in the annotated class/file lists if no brief
- * description is given.
- */
- virtual QCString trNoDescriptionAvailable()
- { return "Sem descrição disponível"; }
-
- // index titles (the project name is prepended for these)
-
-
- /*! This is used in HTML as the title of index.html. */
- virtual QCString trDocumentation()
- { return "\nDocumentação"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all groups.
- */
- virtual QCString trModuleIndex()
- { return "Índice dos Módulos"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * class hierarchy.
- */
- virtual QCString trHierarchicalIndex()
- { return "Índice Hierárquico"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * annotated compound index.
- */
- virtual QCString trCompoundIndex()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Índice das Estruturas de Dados";
- }
- else
- {
- return "Índice dos Componentes";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * list of all files.
- */
- virtual QCString trFileIndex()
- { return "Índice dos Arquivos"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all groups.
- */
- virtual QCString trModuleDocumentation()
- { return "Módulos"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all classes, structs and unions.
- */
- virtual QCString trClassDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Estruturas";
- }
- else
- {
- return "Classes";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all files.
- */
- virtual QCString trFileDocumentation()
- { return "Arquivos"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all examples.
- */
- virtual QCString trExampleDocumentation()
- { return "Exemplos"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all related pages.
- */
- virtual QCString trPageDocumentation()
- { return "Documentação Relacionada"; }
-
- /*! This is used in LaTeX as the title of the document */
- virtual QCString trReferenceManual()
- { return "Guia de Referência"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of defines
- */
- virtual QCString trDefines()
- { return "Definições e Macros"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of function prototypes
- */
- virtual QCString trFuncProtos()
- { return "Protótipos de Funções"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of typedefs
- */
- virtual QCString trTypedefs()
- { return "Definições de Tipos"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of enumerations
- */
- virtual QCString trEnumerations()
- { return "Enumerações"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) functions
- */
- virtual QCString trFunctions()
- { return "Funções"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trVariables()
- { return "Variáveis"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trEnumerationValues()
- { return "Valores enumerados"; }
-
- /*! This is used in the documentation of a file before the list of
- * documentation blocks for defines
- */
- virtual QCString trDefineDocumentation()
- { return "Deinições e macros"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for function prototypes
- */
- virtual QCString trFunctionPrototypeDocumentation()
- { return "Protótipos das funções"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for typedefs
- */
- virtual QCString trTypedefDocumentation()
- { return "Definições dos tipos"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration types
- */
- virtual QCString trEnumerationTypeDocumentation()
- { return "Enumerações"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration values
- */
- virtual QCString trEnumerationValueDocumentation()
- { return "Valores enumerados"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for functions
- */
- virtual QCString trFunctionDocumentation()
- { return "Funções"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for variables
- */
- virtual QCString trVariableDocumentation()
- { return "Variáveis"; }
-
- /*! This is used in the documentation of a file/namespace/group before
- * the list of links to documented compounds
- */
- virtual QCString trCompounds()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Estruturas de Dados";
- }
- else
- {
- return "Componentes";
- }
- }
-
- /*! 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)"Gerado em "+date;
- if (projName) result+=(QCString)" para "+projName;
- result+=(QCString)" por";
- return result;
- }
- /*! This is part of the sentence used in the standard footer of each page.
- */
- virtual QCString trWrittenBy()
- {
- return "escrito por";
- }
-
- /*! this text is put before a class diagram */
- virtual QCString trClassDiagram(const char *clName)
- {
- return (QCString)"Diagrama de Hierarquia para "+clName+":";
- }
-
- /*! this text is generated when the \\internal command is used. */
- virtual QCString trForInternalUseOnly()
- { return "Apenas para uso interno."; }
-
- /*! this text is generated when the \\reimp command is used. */
- virtual QCString trReimplementedForInternalReasons()
- { return "Reimplementado por razões internas. A API não foi modificada."; }
-
- /*! this text is generated when the \\warning command is used. */
- virtual QCString trWarning()
- { return "Aviso"; }
-
- /*! this text is generated when the \\bug command is used. */
- virtual QCString trBugsAndLimitations()
- { return "Problemas e Limitações"; }
-
- /*! this text is generated when the \\version command is used. */
- virtual QCString trVersion()
- { return "Versão"; }
-
- /*! this text is generated when the \\date command is used. */
- virtual QCString trDate()
- { return "Data"; }
-
- /*! this text is generated when the \\return command is used. */
- virtual QCString trReturns()
- { return "Retorna"; }
-
- /*! this text is generated when the \\sa command is used. */
- virtual QCString trSeeAlso()
- { return "Veja também"; }
-
- /*! this text is generated when the \\param command is used. */
- virtual QCString trParameters()
- { return "Parâmetros"; }
-
- /*! this text is generated when the \\exception command is used. */
- virtual QCString trExceptions()
- { return "Exceções"; }
-
- /*! this text is used in the title page of a LaTeX document. */
- virtual QCString trGeneratedBy()
- { return "Gerado por"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of page containing all the index of all namespaces. */
- virtual QCString trNamespaceList()
- { return "Lista de Namespaces"; }
-
- /*! used as an introduction to the namespace list */
- virtual QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="Esta é a lista de todos os Namespaces ";
- if (!extractAll) result+="documentados ";
- result+="com suas respectivas descrições:";
- return result;
- }
-
- /*! used in the class documentation as a header before the list of all
- * friends of a class
- */
- virtual QCString trFriends()
- { return "Amigas"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in the class documentation as a header before the list of all
- * related classes
- */
- virtual QCString trRelatedFunctionDocumentation()
- { return "Amigas e Funções Relacionadas"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of the HTML page of a class/struct/union */
- virtual QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- {
- QCString result="Referência da";
- if (isTemplate) result+=" Template de";
- switch(compType)
- {
- case ClassDef::Class: result+=" Classe "; break;
- case ClassDef::Struct: result+=" Estrutura "; break;
- case ClassDef::Union: result+=" União "; break;
- case ClassDef::Interface: result+=" Interface "; break;
- case ClassDef::Protocol: result+=" Protocol "; break; // translate me!
- case ClassDef::Category: result+=" Category "; break; // translate me!
- case ClassDef::Exception: result+=" Exceção "; 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 = "Referência do Arquivo ";
- result += fileName;
- return result;
- }
-
- /*! used as the title of the HTML page of a namespace */
- virtual QCString trNamespaceReference(const char *namespaceName)
- {
- QCString result ="Refência do Namespace ";
- result += namespaceName;
- return result;
- }
-
- virtual QCString trPublicMembers()
- { return "Métodos Públicos"; }
- virtual QCString trPublicSlots()
- { return "Slots Públicos"; }
- virtual QCString trSignals()
- { return "Sinais"; }
- virtual QCString trStaticPublicMembers()
- { return "Métodos Públicos Estáticos"; }
- virtual QCString trProtectedMembers()
- { return "Métodos Protegidos"; }
- virtual QCString trProtectedSlots()
- { return "Slots Protegidos"; }
- virtual QCString trStaticProtectedMembers()
- { return "Métodos Protegidos Estáticos"; }
- virtual QCString trPrivateMembers()
- { return "Métodos Privados"; }
- virtual QCString trPrivateSlots()
- { return "Slots Privados"; }
- virtual QCString trStaticPrivateMembers()
- { return "Métodos Privados Estáticos"; }
-
- /*! this function is used to produce a comma-separated list of items.
- * use generateMarker(i) to indicate where item i should be put.
- */
- virtual QCString trWriteList(int numEntries)
- {
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=" e ";
- }
- }
- return result;
- }
-
- /*! used in class documentation to produce a list of base classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritsList(int numEntries)
- {
- return "Herdeiro 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 "Superclasse de "+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 "Reimplementação de "+trWriteList(numEntries)+".";
- }
-
- /*! used in member documentation blocks to produce a list of
- * all member that overwrite the implementation of this member.
- */
- virtual QCString trReimplementedInList(int numEntries)
- {
- return "Reimplementado por "+trWriteList(numEntries)+".";
- }
-
- /*! This is put above each page as a link to all members of namespaces. */
- virtual QCString trNamespaceMembers()
- { return "Membros do Namespace"; }
-
- /*! This is an introduction to the page with all namespace members */
- virtual QCString trNamespaceMemberDescription(bool extractAll)
- {
- QCString result="Esta é a lista com todos os membros do Namespace ";
- if (!extractAll) result+="documentados ";
- result+="com referências para ";
- if (extractAll)
- result+="a documentação de seus respectivos Namespaces:";
- else
- result+="os seus respectivos namespaces:";
- return result;
- }
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all namespaces.
- */
- virtual QCString trNamespaceIndex()
- { return "Namespaces"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all namespaces.
- */
- virtual QCString trNamespaceDocumentation()
- { return "Namespaces"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- virtual QCString trNamespaces()
- { return "Namespaces"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990728
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is put at the bottom of a class documentation page and is
- * followed by a list of files that were used to generate the page.
- */
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)"A documentação para esta ";
- switch(compType)
- {
- case ClassDef::Class: result+="classe "; break;
- case ClassDef::Struct: result+="estrutura "; break;
- case ClassDef::Union: result+="união "; break;
- case ClassDef::Interface: result+="interface "; break;
- case ClassDef::Protocol: result+="protocol "; break; // translate me!
- case ClassDef::Category: result+="category "; break; // translate me!
- case ClassDef::Exception: result+="exceção "; break;
- }
- result+=" foi gerada a partir ";
- if (single) result+="do seguinte arquivo:"; else result+="dos seguintes arquivos:";
- return result;
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- virtual QCString trAlphabeticalList()
- { return "Lista Alfabética"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- virtual QCString trReturnValues()
- { return "Valores Retornados"; }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- virtual QCString trMainPage()
- { return "Página Principal"; }
-
- /*! This is used in references to page that are put in the LaTeX
- * documentation. It should be an abbreviation of the word page.
- */
- virtual QCString trPageAbbreviation()
- { return "pag."; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991003
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trSources()
- {
- return "Códigos-Fonte";
- }
- virtual QCString trDefinedAtLineInSourceFile()
- {
- return "Definição na linha @0 do arquivo @1.";
- }
- virtual QCString trDefinedInSourceFile()
- {
- return "Definição no arquivo @0.";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDeprecated()
- {
- /*
- * This note is for brazilians only.
- * Esta é uma boa tradução para "deprecated"?
- */
- return "Descontinuado(a)";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- virtual QCString trCollaborationDiagram(const char *clName)
- {
- return (QCString)"Diagrama de colaboração para "+clName+":";
- }
- /*! this text is put before an include dependency graph */
- virtual QCString trInclDepGraph(const char *fName)
- {
- return (QCString)"Gráfico de dependência de inclusões para "+fName+":";
- }
- /*! header that is put before the list of constructor/destructors. */
- virtual QCString trConstructorDocumentation()
- {
- return "Construtores & Destrutores";
- }
- /*! Used in the file documentation to point to the corresponding sources. */
- virtual QCString trGotoSourceCode()
- {
- return "Vá para o código-fonte deste arquivo.";
- }
- /*! Used in the file sources to point to the corresponding documentation. */
- virtual QCString trGotoDocumentation()
- {
- return "Vá para a documentação deste arquivo.";
- }
- /*! Text for the \\pre command */
- virtual QCString trPrecondition()
- {
- return "Pré-Condição";
- }
- /*! Text for the \\post command */
- virtual QCString trPostcondition()
- {
- return "Pós-Condição";
- }
- /*! Text for the \\invariant command */
- virtual QCString trInvariant()
- {
- return "Invariante";
- }
- /*! Text shown before a multi-line variable/enum initialization */
- virtual QCString trInitialValue()
- {
- return "Valor Inicial:";
- }
- /*! Text used the source code in the file index */
- virtual QCString trCode()
- {
- return "código";
- }
- virtual QCString trGraphicalHierarchy()
- {
- return "Gráfico de Hierarquia de Classes";
- }
- virtual QCString trGotoGraphicalHierarchy()
- {
- return "Vá para o Gráfico de Hierarquia de Classes";
- }
- virtual QCString trGotoTextualHierarchy()
- {
- return "Vá para a Hierarquia de Classes (texto)";
- }
- virtual QCString trPageIndex()
- {
- return "Índice da Página";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trNote()
- {
- return "Observação";
- }
- virtual QCString trPublicTypes()
- {
- return "Tipos Públicos";
- }
- virtual QCString trPublicAttribs()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Campos de Dados";
- }
- else
- {
- return "Atributos Públicos";
- }
- }
- virtual QCString trStaticPublicAttribs()
- {
- return "Atributos Estáticos Públicos";
- }
- virtual QCString trProtectedTypes()
- {
- return "Tipos Protegidos";
- }
- virtual QCString trProtectedAttribs()
- {
- return "Atributos Protegidos";
- }
- virtual QCString trStaticProtectedAttribs()
- {
- return "Atributos Estáticos Protegidos";
- }
- virtual QCString trPrivateTypes()
- {
- return "Tipos Privados";
- }
- virtual QCString trPrivateAttribs()
- {
- return "Atributos Privados";
- }
- virtual QCString trStaticPrivateAttribs()
- {
- return "Atributos Privados Estáticos";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a todo item */
- virtual QCString trTodo()
- {
- return "Futuras Atividades";
- }
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- {
- return "Lista de Futuras Atividades";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy()
- {
- return "Referenciado por";
- }
- virtual QCString trRemarks()
- {
- return "Anotações";
- }
- virtual QCString trAttention()
- {
- return "Atenção";
- }
- virtual QCString trInclByDepGraph()
- {
- return "Este grafo mostra quais arquivos estão direta ou indiretamente relacionados com este arquivo:";
- }
- virtual QCString trSince()
- {
- return "Desde";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- virtual QCString trLegendTitle()
- {
- return "Legenda do Grafo";
- }
- /*! page explaining how the dot graph's should be interpreted */
- virtual QCString trLegendDocs()
- {
- return
- "Esta página explica como interpretar os grafos gerados pelo doxygen.<p>\n"
- "Considere o seguinte exemplo:\n"
- "\\code\n"
- "/*! Invisible class because of truncation */\n"
- "class Invisible { };\n\n"
- "/*! Truncated class, inheritance relation is hidden */\n"
- "class Truncated : public Invisible { };\n\n"
- "/* Class not documented with doxygen comments */\n"
- "class Undocumented { };\n\n"
- "/*! Class that is inherited using public inheritance */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! Class that is inherited using protected inheritance */\n"
- "class ProtectedBase { };\n\n"
- "/*! Class that is inherited using private inheritance */\n"
- "class PrivateBase { };\n\n"
- "/*! Class that is used by the Inherited class */\n"
- "class Used { };\n\n"
- "/*! Super class that inherits a number of other classes */\n"
- "class Inherited : public PublicBase,\n"
- " protected ProtectedBase,\n"
- " private PrivateBase,\n"
- " public Undocumented\n"
- "{\n"
- " private:\n"
- " Used *m_usedClass;\n"
- "};\n"
- "\\endcode\n"
-
- "Se a tag \\c MAX_DOT_GRAPH_HEIGHT no arquivo de configuração tem o valor"
- "200, o seguinte gráfo será gerado:"
- "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
- "As caixas no grafo acima tem as seguintes interpretações:\n"
- "<ul>\n"
- "<li>Uma caixa inteiramente preta representa a estrutura ou a classe para qual "
- "o grafo foi gerado.\n"
- "<li>Uma caixa com bordas pretas denota uma estrutura ou classe documentada.\n"
- "<li>Uma caixa com bordas cinzas denota uma estrutura ou classe não documentada.\n"
-
- "<li>Uma caixa com bordas vermelhas denota uma estrutura ou classe documentada para\n"
- "a qual nem todas as heranças ou componentes são mostradas no grafo. Um grafo é "
- "truncado quando este é maior que o tamanho especificado."
- "</ul>\n"
- "As setas tem os seguintes significados:\n"
- "<ul>\n"
- "<li>Uma seta azul escura é utilizada para denotar uma relação de herança "
- "pública entre duas classes.\n"
- "<li>Uma seta verde escura é utilizada para denotar uma herança protegida.\n"
- "<li>Uma seta vermelho escura é utilizada para denotar uma herança privada.\n"
- "<li>Uma seta púrpura pontilhada é usada se uma classe está contida ou é utilizada"
- "por outra classe. A seta é marcada com a(s) variável(eis) "
- "através das quais a classe ou estrutura apontada está acessível. \n"
- "</ul>\n";
- }
- /*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return "legenda";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return "Teste";
- }
- /*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return "Lista de Testes";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return "Métodos DCOP";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return "Propriedades";
- }
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return "Propriedades";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java interfaces in the summary section of Java packages */
- virtual QCString trInterfaces()
- {
- return "Interfaces";
- }
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Estruturas de Dados";
- }
- else
- {
- return "Classes";
- }
- }
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
- {
- return (QCString)"Pacote "+name;
- }
- /*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return "Lista de Pacotes";
- }
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return "Esta é a lista com os pacotes e suas respectivas descrições (se disponíveis):";
- }
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return "Pacotes";
- }
- /*! Used as a chapter title for Latex & RTF output */
- virtual QCString trPackageDocumentation()
- {
- return "Pacotes";
- }
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return "Valor:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return "Problema";
- }
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return "Lista de Problemas";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as ansicpg for RTF file
- *
- * The following table shows the correlation of Charset name, Charset Value and
- * <pre>
- * Codepage number:
- * Charset Name Charset Value(hex) Codepage number
- * ------------------------------------------------------
- * DEFAULT_CHARSET 1 (x01)
- * SYMBOL_CHARSET 2 (x02)
- * OEM_CHARSET 255 (xFF)
- * ANSI_CHARSET 0 (x00) 1252
- * RUSSIAN_CHARSET 204 (xCC) 1251
- * EE_CHARSET 238 (xEE) 1250
- * GREEK_CHARSET 161 (xA1) 1253
- * TURKISH_CHARSET 162 (xA2) 1254
- * BALTIC_CHARSET 186 (xBA) 1257
- * HEBREW_CHARSET 177 (xB1) 1255
- * ARABIC _CHARSET 178 (xB2) 1256
- * SHIFTJIS_CHARSET 128 (x80) 932
- * HANGEUL_CHARSET 129 (x81) 949
- * GB2313_CHARSET 134 (x86) 936
- * CHINESEBIG5_CHARSET 136 (x88) 950
- * </pre>
- *
- */
- virtual QCString trRTFansicp()
- {
- return "1252";
- }
-
-
- /*! Used as ansicpg for RTF fcharset
- * \see trRTFansicp() for a table of possible values.
- */
- virtual QCString trRTFCharSet()
- {
- return "0";
- }
-
- /*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return "Índice";
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trClass(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Classe" : "classe"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trFile(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Arquivo": "arquivo"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trNamespace(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Namespace" : "namespace"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trGroup(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Grupo" : "grupo"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trPage(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Página" : "página"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trMember(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Membro" : "membro"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trField(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Campo" : "campo"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trGlobal(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Globa" : "globa"));
- if (!singular){
- result+="is";
- }else{
- result+="l";
- }
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is generated when the \\author command is used and
- * for the author section in man pages. */
- virtual QCString trAuthor(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Autor" : "autor"));
- if (!singular) result+="es";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return "Referências";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Implementa "+trWriteList(numEntries)+".";
- }
-
- /*! used in member documentation blocks to produce a list of
- * all members that implementation this member.
- */
- virtual QCString trImplementedInList(int numEntries)
- {
- return "Implementado por "+trWriteList(numEntries)+".";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.16
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in RTF documentation as a heading for the Table
- * of Contents.
- */
- virtual QCString trRTFTableOfContents()
- {
- return "Conteúdo";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.17
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as the header of the list of item that have been
- * flagged deprecated
- */
- virtual QCString trDeprecatedList()
- {
- return "Lista de Descontinuados(as)";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.18
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a header for declaration section of the events found in
- * a C# program
- */
- virtual QCString trEvents()
- {
- return "Eventos";
- }
- /*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- return "Eventos";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a heading for a list of Java class types with package scope.
- */
- virtual QCString trPackageTypes()
- {
- return "Tipos do Pacote";
- }
-
- /*! Used as a heading for a list of Java class functions with package
- * scope.
- */
- virtual QCString trPackageMembers()
- {
- return "Funções do Pacote";
- }
-
- /*! Used as a heading for a list of static Java class functions with
- * package scope.
- */
- virtual QCString trStaticPackageMembers()
- {
- return "Funções Estáticas do Pacote";
- }
-
- /*! Used as a heading for a list of Java class variables with package
- * scope.
- */
- virtual QCString trPackageAttribs()
- {
- return "Atributos do Pacote";
- }
-
- /*! Used as a heading for a list of static Java class variables with
- * package scope.
- */
- virtual QCString trStaticPackageAttribs()
- {
- return "Atributos Estáticos do Pacote";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Todos";
- }
- /*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- return "Este é o grafo de chamadas para esta função:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! When the search engine is enabled this text is put in the header
- * of each page before the field where one can enter the text to search
- * for.
- */
- virtual QCString trSearchForIndex()
- {
- return "Procurar por";
- }
- /*! This string is used as the title for the page listing the search
- * results.
- */
- virtual QCString trSearchResultsTitle()
- {
- return "Resultado da Busca";
- }
- /*! 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
- * the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
- * value 2 represents 2 or more matches. HTML markup is allowed inside
- * the returned string.
- */
- virtual QCString trSearchResults(int numDocuments)
- {
- if (numDocuments==0)
- {
- return "Nenhum documento foi encontrado.";
- }
- else if (numDocuments==1)
- {
- return "Apenas <b>1</b> documento foi encontrado.";
- }
- else
- {
- return "<b>$num</b> documentos encontrados. "
- "Os melhores resultados vem primeiro.";
- }
- }
- /*! 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 "Resultados:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Código-Fonte de " + filename;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.9
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the name of the chapter containing the directory
- * hierarchy.
- */
- virtual QCString trDirIndex()
- { return "Hierarquia de Diretórios"; }
-
- /*! This is used as the name of the chapter containing the documentation
- * of the directories.
- */
- virtual QCString trDirDocumentation()
- { return "Documentação do Directório"; }
-
- /*! 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 "Diretórios"; }
-
- /*! This returns a sentences that introduces the directory hierarchy.
- * and the fact that it is sorted alphabetically per level
- */
- virtual QCString trDirDescription()
- { return "Esta Hierarquia de Diretórios está parcialmente ordenada (ordem alfabética)"; }
-
- /*! 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 = "Referência do diretório ";
- result += dirName;
- return result;
- }
-
- /*! This returns the word directory with or without starting capital
- * (\a first_capital) and in sigular or plural form (\a singular).
- */
- virtual QCString trDir(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Diretório" : "diretório"));
- if (!singular) 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 "Este é um método provido por conveniência. "
- "Ele difere do método acima apenas na lista de "
- "argumentos que devem ser utilizados.";
- }
-
-};
-#endif
diff --git a/src/translator_ca.h b/src/translator_ca.h
deleted file mode 100644
index 4676a6c..0000000
--- a/src/translator_ca.h
+++ /dev/null
@@ -1,1562 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 TRANSLATOR_CA_H
-#define TRANSLATOR_CA_H
-
-// When defining a translator class for the new language, follow
-// the description in the documentation. One of the steps says
-// that you should copy the translator_en.h (this) file to your
-// translator_xx.h new file. Your new language should use the
-// Translator class as the base class. This means that you need to
-// implement exactly the same (pure virtual) methods as the
-// TranslatorEnglish does. Because of this, it is a good idea to
-// start with the copy of TranslatorEnglish and replace the strings
-// one by one.
-//
-// It is not necessary to include "translator.h" or
-// "translator_adapter.h" here. The files are included in the
-// language.cpp correctly. Not including any of the mentioned
-// files frees the maintainer from thinking about whether the
-// first, the second, or both files should be included or not, and
-// why. This holds namely for localized translators because their
-// base class is changed occasionaly to adapter classes when the
-// Translator class changes the interface, or back to the
-// Translator class (by the local maintainer) when the localized
-// translator is made up-to-date again.
-
-class TranslatorCatalan : public Translator
-{
- public:
-
- // --- Language control methods -------------------
-
- /*! Used for identification of the language. The identification
- * should not be translated. It should be replaced by the name
- * of the language in English using lower-case characters only
- * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
- * the identification used in language.cpp.
- */
- virtual QCString idLanguage()
- { return "catalan"; }
-
- /*! Used to get the LaTeX command(s) for the language support.
- * This method should return string with commands that switch
- * LaTeX to the desired language. For example
- * <pre>"\\usepackage[german]{babel}\n"
- * </pre>
- * or
- * <pre>"\\usepackage{polski}\n"
- * "\\usepackage[latin2]{inputenc}\n"
- * "\\usepackage[T1]{fontenc}\n"
- * </pre>
- *
- * The English LaTeX does not use such commands. Because of this
- * the empty string is returned in this implementation.
- */
- virtual QCString latexLanguageSupportCommand()
- {
- return "\\usepackage[catalan]{babel} \n\\usepackage[latin1]{inputenc}";
- }
-
- /*! return the language charset. This will be used for the HTML output */
- virtual QCString idLanguageCharset()
- {
- return "iso-8859-1";
- }
-
- // --- Language translation methods -------------------
-
- /*! used in the compound documentation before a list of related functions. */
- virtual QCString trRelatedFunctions()
- { return "Funcions Associades"; }
-
- /*! subscript for the related functions. */
- virtual QCString trRelatedSubscript()
- { return "(Remarcar que aquestes funcions no són funcions membre.)"; }
-
- /*! header that is put before the detailed description of files, classes and namespaces. */
- virtual QCString trDetailedDescription()
- { return "Descripció Detallada"; }
-
- /*! header that is put before the list of typedefs. */
- virtual QCString trMemberTypedefDocumentation()
- { return "Documentació de les Definicions de Tipus Membre"; }
-
- /*! header that is put before the list of enumerations. */
- virtual QCString trMemberEnumerationDocumentation()
- { return "Documentació de les Enumeracions Membre"; }
-
- /*! header that is put before the list of member functions. */
- virtual QCString trMemberFunctionDocumentation()
- { return "Documentació de les Funcions Membre"; }
-
- /*! header that is put before the list of member attributes. */
- virtual QCString trMemberDataDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Documentació dels Camps";
- }
- else
- {
- return "Documentació de les Dades Membre";
- }
- }
-
- /*! this is the text of a link put after brief descriptions. */
- virtual QCString trMore()
- { return "Més..."; }
-
- /*! put in the class documentation */
- virtual QCString trListOfAllMembers()
- { return "Llista de tots els membres."; }
-
- /*! used as the title of the "list of all members" page of a class */
- virtual QCString trMemberList()
- { return "Llista dels Membres"; }
-
- /*! this is the first part of a sentence that is followed by a class name */
- virtual QCString trThisIsTheListOfAllMembers()
- { return "Aquesta és la llista complerta dels membres de "; }
-
- /*! this is the remainder of the sentence after the class name */
- virtual QCString trIncludingInheritedMembers()
- { return ", incloent tots els membres heretats."; }
-
- /*! 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="Generat automàticament per Doxygen";
- if (s) result+=(QCString)" per a "+s;
- result+=" a partir del codi font.";
- return result;
- }
-
- /*! put after an enum name in the list of all members */
- virtual QCString trEnumName()
- { return "nom de la enum"; }
-
- /*! put after an enum value in the list of all members */
- virtual QCString trEnumValue()
- { return "valors de la enum"; }
-
- /*! put after an undocumented member in the list of all members */
- virtual QCString trDefinedIn()
- { return "definit a"; }
-
- // 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 "Mòduls"; }
-
- /*! This is put above each page as a link to the class hierarchy */
- virtual QCString trClassHierarchy()
- { return "Jerarquia de Classes"; }
-
- /*! This is put above each page as a link to the list of annotated classes */
- virtual QCString trCompoundList()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Estructures de Dades";
- }
- else
- {
- return "Llista de Classes";
- }
- }
-
- /*! This is put above each page as a link to the list of documented files */
- virtual QCString trFileList()
- { return "Llista dels Fitxers"; }
-
- /*! This is put above each page as a link to all members of compounds. */
- virtual QCString trCompoundMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Camps de Dades";
- }
- else
- {
- return "Membres de Classes";
- }
- }
-
- /*! This is put above each page as a link to all members of files. */
- virtual QCString trFileMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Globals";
- }
- else
- {
- return "Membres de Fitxers";
- }
- }
-
- /*! This is put above each page as a link to all related pages. */
- virtual QCString trRelatedPages()
- { return "Pàgines Relacionades"; }
-
- /*! This is put above each page as a link to all examples. */
- virtual QCString trExamples()
- { return "Exemples"; }
-
- /*! This is put above each page as a link to the search engine. */
- virtual QCString trSearch()
- { return "Cerca"; }
-
- /*! This is an introduction to the class hierarchy. */
- virtual QCString trClassHierarchyDescription()
- { return "Aquesta llista d'herència està ordenada toscament, "
- "però no completa, de forma alfabètica:";
- }
-
- /*! This is an introduction to the list with all files. */
- virtual QCString trFileListDescription(bool extractAll)
- {
- QCString result="Aquesta és la llista de tots els fitxers ";
- if (!extractAll) result+="documentats ";
- result+="acompanyats amb breus descripcions:";
- return result;
- }
-
- /*! This is an introduction to the annotated compound list. */
- virtual QCString trCompoundListDescription()
- {
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Aquestes són les estructures de dades acompanyades amb breus descripcions:";
- }
- else
- {
- return "Aquestes són les classes, estructures, "
- "unions i interfícies acompanyades amb breus descripcions:";
- }
- }
-
- /*! This is an introduction to the page with all class members. */
- virtual QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result="Aquesta és la llista de tots els ";
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="camps d'estructures i unions";
- }
- else
- {
- result+="membres de classe";
- }
- if (!extractAll)
- {
- result+=" documentats";
- }
- result+=" amb enllaços a ";
- if (!extractAll)
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="la documentació de l'estructura/unió per a cada camp:";
- }
- else
- {
- result+="la documentació de la classe per a cada membre:";
- }
- }
- else
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="les estructures/unions a que pertanyen:";
- }
- else
- {
- result+="les classes a que pertanyen:";
- }
- }
- return result;
- }
- /*! This is an introduction to the page with all file members. */
- virtual QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="Aquesta és la llista de ";
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="totes les funcions, variables, definicions, enumeracions, i definicions de tipus";
- if (!extractAll) result+=" documentades";
- }
- else
- {
- result+="tots els membres de fitxers";
- if (!extractAll) result+=" documentats";
- }
- result+=" amb enllaços ";
- if (extractAll)
- result+="als fitxers als quals corresponen:";
- else
- result+="a la documentació:";
- return result;
- }
-
- /*! This is an introduction to the page with the list of all examples */
- virtual QCString trExamplesDescription()
- { return "Aquesta és la llista de tots els exemples:"; }
-
- /*! This is an introduction to the page with the list of related pages */
- virtual QCString trRelatedPagesDescription()
- { return "Aquesta és la llista de totes les pàgines de documentació associades:"; }
-
- /*! This is an introduction to the page with the list of class/file groups */
- virtual QCString trModulesDescription()
- { return "Aquesta és la llista de mòduls:"; }
-
- // index titles (the project name is prepended for these)
-
-
- /*! This is used in HTML as the title of index.html. */
- virtual QCString trDocumentation()
- { return ": Documentació"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all groups.
- */
- virtual QCString trModuleIndex()
- { return "Índex de Mòduls"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * class hierarchy.
- */
- virtual QCString trHierarchicalIndex()
- { return "Índex Jeràrquic"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * annotated compound index.
- */
- virtual QCString trCompoundIndex()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Índex d'Estructures de Dades";
- }
- else
- {
- return "Índex de Classes";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * list of all files.
- */
- virtual QCString trFileIndex()
- { return "Índex de Fitxers"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all groups.
- */
- virtual QCString trModuleDocumentation()
- { return "Documentació dels Mòduls"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all classes, structs and unions.
- */
- virtual QCString trClassDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Documentació de les Estructures de Dades";
- }
- else
- {
- return "Documentació de les Classes";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all files.
- */
- virtual QCString trFileDocumentation()
- { return "Documentació dels Fitxers"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all examples.
- */
- virtual QCString trExampleDocumentation()
- { return "Documentació dels Exemples"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all related pages.
- */
- virtual QCString trPageDocumentation()
- { return "Documentació de les Pàgines"; }
-
- /*! This is used in LaTeX as the title of the document */
- virtual QCString trReferenceManual()
- { return "Manual de Referència"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of defines
- */
- virtual QCString trDefines()
- { return "Definicions"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of function prototypes
- */
- virtual QCString trFuncProtos()
- { return "Prototipus de Funcions"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of typedefs
- */
- virtual QCString trTypedefs()
- { return "Definicions de Tipus"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of enumerations
- */
- virtual QCString trEnumerations()
- { return "Enumeracions"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) functions
- */
- virtual QCString trFunctions()
- { return "Funcions"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) 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 "Valors de les Enumeracions"; }
-
- /*! This is used in the documentation of a file before the list of
- * documentation blocks for defines
- */
- virtual QCString trDefineDocumentation()
- { return "Documentació de les Definicions"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for function prototypes
- */
- virtual QCString trFunctionPrototypeDocumentation()
- { return "Documentació de les Funcions Prototipus"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for typedefs
- */
- virtual QCString trTypedefDocumentation()
- { return "Documentació de les Definicions de Tipus"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration types
- */
- virtual QCString trEnumerationTypeDocumentation()
- { return "Documentació dels Tipus de les Enumeracions"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for functions
- */
- virtual QCString trFunctionDocumentation()
- { return "Documentació de les Funcions"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for variables
- */
- virtual QCString trVariableDocumentation()
- { return "Documentació de les Variables"; }
-
- /*! This is used in the documentation of a file/namespace/group before
- * the list of links to documented compounds
- */
- virtual QCString trCompounds()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Estructures de Dades";
- }
- else
- {
- 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)"Generat a "+date;
- if (projName) result+=(QCString)" per a "+projName;
- result+=(QCString)" per";
- return result;
- }
- /*! This is part of the sentence used in the standard footer of each page.
- */
- virtual QCString trWrittenBy()
- {
- return "escrit per";
- }
-
- /*! this text is put before a class diagram */
- virtual QCString trClassDiagram(const char *clName)
- {
- return (QCString)"Diagrama d'Herència per a "+clName+":";
- }
-
- /*! this text is generated when the \\internal command is used. */
- virtual QCString trForInternalUseOnly()
- { return "Tan sols per a ús intern."; }
-
- /*! this text is generated when the \\warning command is used. */
- virtual QCString trWarning()
- { return "Atenció"; }
-
- /*! this text is generated when the \\version command is used. */
- virtual QCString trVersion()
- { return "Versió"; }
-
- /*! this text is generated when the \\date command is used. */
- virtual QCString trDate()
- { return "Data"; }
-
- /*! this text is generated when the \\return command is used. */
- virtual QCString trReturns()
- { return "Retorna"; }
-
- /*! this text is generated when the \\sa command is used. */
- virtual QCString trSeeAlso()
- { return "Mireu també"; }
-
- /*! this text is generated when the \\param command is used. */
- virtual QCString trParameters()
- { return "Paràmetres"; }
-
- /*! this text is generated when the \\exception command is used. */
- virtual QCString trExceptions()
- { return "Excepcions"; }
-
- /*! this text is used in the title page of a LaTeX document. */
- virtual QCString trGeneratedBy()
- { return "Generat per"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of page containing all the index of all namespaces. */
- virtual QCString trNamespaceList()
- { return "Llista dels Espais de Noms"; }
-
- /*! used as an introduction to the namespace list */
- virtual QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="Aquests són tots els espais de noms ";
- if (!extractAll) result+="documentats ";
- result+="amb breus descripcions:";
- return result;
- }
-
- /*! used in the class documentation as a header before the list of all
- * friends of a class
- */
- virtual QCString trFriends()
- { return "Classes Amigues"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in the class documentation as a header before the list of all
- * related classes
- */
- virtual QCString trRelatedFunctionDocumentation()
- { return "Documentació de funcions amigues i relacionades"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of the HTML page of a class/struct/union */
- virtual QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- {
- QCString result="Referència de";
- switch(compType)
- {
- case ClassDef::Class: result+=" la Classe "; break;
- case ClassDef::Struct: result+=" l'Estructura "; break;
- case ClassDef::Union: result+=" la Unió "; break;
- case ClassDef::Interface: result+=" la Interfície "; break;
- case ClassDef::Protocol: result+="l Protocol "; break;
- case ClassDef::Category: result+=" la Categoria "; break;
- case ClassDef::Exception: result+=" l'Excepció "; break;
- }
- if (isTemplate) result+="Template ";
- result+=(QCString)clName;
- return result;
- }
-
- /*! used as the title of the HTML page of a file */
- virtual QCString trFileReference(const char *fileName)
- {
- QCString result="Referència del Fitxer ";
- result+=fileName;
- return result;
- }
-
- /*! used as the title of the HTML page of a namespace */
- virtual QCString trNamespaceReference(const char *namespaceName)
- {
- QCString result="Referència de l'Espai de Noms ";
- result+=namespaceName;
- return result;
- }
-
- virtual QCString trPublicMembers()
- { return "Mètodes públics"; }
- virtual QCString trPublicSlots()
- { return "Slots públics"; }
- virtual QCString trSignals()
- { return "Senyals"; }
- virtual QCString trStaticPublicMembers()
- { return "Mètodes Públics Estàtics"; }
- virtual QCString trProtectedMembers()
- { return "Mètodes Protegits"; }
- virtual QCString trProtectedSlots()
- { return "Slots Protegits"; }
- virtual QCString trStaticProtectedMembers()
- { return "Mètodes Protegits Estàtics"; }
- virtual QCString trPrivateMembers()
- { return "Mètodes Privats"; }
- virtual QCString trPrivateSlots()
- { return "Slots Privats"; }
- virtual QCString trStaticPrivateMembers()
- { return "Mètodes Privats Estàtics"; }
-
- /*! this function is used to produce a comma-separated list of items.
- * use generateMarker(i) to indicate where item i should be put.
- */
- virtual QCString trWriteList(int numEntries)
- {
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=" i ";
- }
- }
- return result;
- }
-
- /*! used in class documentation to produce a list of base classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritsList(int numEntries)
- {
- return "Hereta 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 "Heretat per "+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 "Reimplementat 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 "Reimplementat a "+trWriteList(numEntries)+".";
- }
-
- /*! This is put above each page as a link to all members of namespaces. */
- virtual QCString trNamespaceMembers()
- { return "Membres de l'Espai de Noms"; }
-
- /*! This is an introduction to the page with all namespace members */
- virtual QCString trNamespaceMemberDescription(bool extractAll)
- {
- QCString result="Aquesta és la llista de tots els membres de l'espai de noms ";
- if (!extractAll) result+="documentats ";
- result+="amb enllaços a ";
- if (extractAll)
- result+="la documentació de l'espai de noms de cada membre:";
- else
- result+="l'espai de noms al qual corresponen:";
- return result;
- }
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all namespaces.
- */
- virtual QCString trNamespaceIndex()
- { return "Índex d'Espais de Noms"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all namespaces.
- */
- virtual QCString trNamespaceDocumentation()
- { return "Documentació de l'Espai de Noms"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- virtual QCString trNamespaces()
- { return "Espais de Noms"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990728
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is put at the bottom of a class documentation page and is
- * followed by a list of files that were used to generate the page.
- */
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)"La documentació d'aquest";
- switch(compType)
- {
- case ClassDef::Class: result+="a classe"; break;
- case ClassDef::Struct: result+="a estructura"; break;
- case ClassDef::Union: result+="a unió"; break;
- case ClassDef::Interface: result+="a interfície"; break;
- case ClassDef::Protocol: result+=" protocol"; break;
- case ClassDef::Category: result+="a categoria"; break;
- case ClassDef::Exception: result+="a excepció"; break;
- }
- result+=" es va generar a partir del";
- if (!single) result+="s";
- result+=" següent";
- if (!single) result+="s";
- result+=" fitxer";
- if (!single) result+="s:"; else result+=":";
- return result;
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- virtual QCString trAlphabeticalList()
- { return "Llista Alfabètica"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- virtual QCString trReturnValues()
- { return "Valors de retorn"; }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- virtual QCString trMainPage()
- { return "Pàgina principal"; }
-
- /*! This is used in references to page that are put in the LaTeX
- * documentation. It should be an abbreviation of the word page.
- */
- virtual QCString trPageAbbreviation()
- { return "p."; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991003
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDefinedAtLineInSourceFile()
- {
- return "Definició a la línia @0 del fitxer @1.";
- }
- virtual QCString trDefinedInSourceFile()
- {
- return "Definició al fitxer @0.";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDeprecated()
- {
- return "Antiquat";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- virtual QCString trCollaborationDiagram(const char *clName)
- {
- return (QCString)"Diagrama de col·laboració per a "+clName+":";
- }
- /*! this text is put before an include dependency graph */
- virtual QCString trInclDepGraph(const char *fName)
- {
- return (QCString)"Inclou el graf de dependències per a "+fName+":";
- }
- /*! header that is put before the list of constructor/destructors. */
- virtual QCString trConstructorDocumentation()
- {
- return "Documentació del Constructor i el Destructor";
- }
- /*! Used in the file documentation to point to the corresponding sources. */
- virtual QCString trGotoSourceCode()
- {
- return "Veure el codi d'aquest fitxer.";
- }
- /*! Used in the file sources to point to the corresponding documentation. */
- virtual QCString trGotoDocumentation()
- {
- return "Veure la documentació d'aquest fitxer.";
- }
- /*! Text for the \\pre command */
- virtual QCString trPrecondition()
- {
- return "Precondició";
- }
- /*! Text for the \\post command */
- virtual QCString trPostcondition()
- {
- return "Postcondició";
- }
- /*! Text for the \\invariant command */
- virtual QCString trInvariant()
- {
- return "Invariant";
- }
- /*! Text shown before a multi-line variable/enum initialization */
- virtual QCString trInitialValue()
- {
- return "Valor inicial:";
- }
- /*! Text used the source code in the file index */
- virtual QCString trCode()
- {
- return "codi";
- }
- virtual QCString trGraphicalHierarchy()
- {
- return "Jerarquia Gràfica de la Classe";
- }
- virtual QCString trGotoGraphicalHierarchy()
- {
- return "Veure la jerarquia gràfica de la classe";
- }
- virtual QCString trGotoTextualHierarchy()
- {
- return "Veure la jerarquia textual de la classe";
- }
- virtual QCString trPageIndex()
- {
- return "Índex de Pàgines";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trNote()
- {
- return "Nota";
- }
- virtual QCString trPublicTypes()
- {
- return "Tipus Públics";
- }
- virtual QCString trPublicAttribs()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Camps de Dades";
- }
- else
- {
- return "Atributs Públics";
- }
- }
- virtual QCString trStaticPublicAttribs()
- {
- return "Atributs Públics Estàtics";
- }
- virtual QCString trProtectedTypes()
- {
- return "Tipus Protegits";
- }
- virtual QCString trProtectedAttribs()
- {
- return "Atributs Protegits";
- }
- virtual QCString trStaticProtectedAttribs()
- {
- return "Atributs Protegits Estàtics";
- }
- virtual QCString trPrivateTypes()
- {
- return "Tipus Privats";
- }
- virtual QCString trPrivateAttribs()
- {
- return "Atributs Privats";
- }
- virtual QCString trStaticPrivateAttribs()
- {
- return "Atributs Privats Estàtics";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\todo item */
- virtual QCString trTodo()
- {
- return "Per fer";
- }
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- {
- return "Llista de coses per fer";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy()
- {
- return "Referenciat a";
- }
- virtual QCString trRemarks()
- {
- return "Remarca";
- }
- virtual QCString trAttention()
- {
- return "Atenció";
- }
- virtual QCString trInclByDepGraph()
- {
- return "Aquest gràfic mostra quins fitxers inclouen, "
- "de forma directa o indirecta, aquest fitxer:";
- }
- virtual QCString trSince()
- {
- return "Des de";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- virtual QCString trLegendTitle()
- {
- return "Llegenda del Gràfic";
- }
- /*! 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
- "Aquesta pàgina explica com s'interpreten els gràfics generats per doxygen.<p>\n"
- "Considera aquest exemple:\n"
- "\\code\n"
- "/*! Classe invisible per culpa del retall */\n"
- "class Invisible { };\n\n"
- "/*! Classe truncada, l'herència està amagada */\n"
- "class Truncated : public Invisible { };\n\n"
- "/* Classe no documentada amb comentaris doxygen */\n"
- "class Undocumented { };\n\n"
- "/*! Classe heredada amb herència pública */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! Una classe Template */\n"
- "template<class T> class Templ { };\n\n"
- "/*! Classe heredada utilitzant herència protegida */\n"
- "class ProtectedBase { };\n\n"
- "/*! Classe heredada utiltzant herència privada */\n"
- "class PrivateBase { };\n\n"
- "/*! Classe usada per la classe heretada */\n"
- "class Used { };\n\n"
- "/*! Super classe que hereda una quantitat de 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"
- "Si l'etiqueta \\c MAX_DOT_GRAPH_HEIGHT està igualada a 24a0 al fitxer de configuració, resultarà el gràfic següent:"
- "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
- "Les caixes del gràfic superior tenen aquesta interpretació:\n"
- "<ul>\n"
- "<li>Una caixa negra plena represent l'estructura o classe per la qual el gràfic s'ha generat.\n"
- "<li>Una caixa de vora negra representa una estructura o classe documentada.\n"
- "<li>Una caixa de vora verda representa una estructura o classe indocumentada.\n"
- "<li>Una caixa de vora vermalla representa una estructura o classe documentada de la qual "
- "no es mostren totes les relacions d'herència/inclusió. Un gràfic és truncat si no s'ajusta als límits.\n"
- "</ul>\n"
- "Les sagetes tenen aquest significat:\n"
- "<ul>\n"
- "<li>Una sageta blau fosc remarca una relació d'herència de tipus pública entre dues classes.\n"
- "<li>Una sageta verd fosc remarca una relació d'herència de tipus protegida entre dues classes.\n"
- "<li>Una sageta roig fosc remarca una relació d'herència de tipus privada entre dues classes.\n"
- "<li>Una sageta puntejada de color porpra indica que una classe és continguda o usada per una altra classe."
- " La sageta s'etiqueta amb la variable o variables a través de les quals la classe o estructura apuntada és accessible.\n"
- "<li>Una sageta puntejada de color groc indica la relació entre una instància template i la classe template de què ha set instanciada."
- " La sageta s'etiqueta amb els paràmetres template de la instància.\n"
- "</ul>\n";
- }
- /*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return "llegenda";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return "Prova";
- }
- /*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return "Llista de proves";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return "Mètodes DCOP";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return "Propietats";
- }
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return "Documentació de les Propietats";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Estructures de Dades";
- }
- else
- {
- return "Classes";
- }
- }
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
- {
- return (QCString)"Paquet "+name;
- }
- /*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return "Llista de Paquets";
- }
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return "Aquesta és la llista de paquets, amb una breu descripció (si se'n disposa):";
- }
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return "Paquets";
- }
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return "Valor:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return "Error";
- }
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return "Llista d'Errors";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as ansicpg for RTF file
- *
- * The following table shows the correlation of Charset name, Charset Value and
- * <pre>
- * Codepage number:
- * Charset Name Charset Value(hex) Codepage number
- * ------------------------------------------------------
- * DEFAULT_CHARSET 1 (x01)
- * SYMBOL_CHARSET 2 (x02)
- * OEM_CHARSET 255 (xFF)
- * ANSI_CHARSET 0 (x00) 1252
- * RUSSIAN_CHARSET 204 (xCC) 1251
- * EE_CHARSET 238 (xEE) 1250
- * GREEK_CHARSET 161 (xA1) 1253
- * TURKISH_CHARSET 162 (xA2) 1254
- * BALTIC_CHARSET 186 (xBA) 1257
- * HEBREW_CHARSET 177 (xB1) 1255
- * ARABIC _CHARSET 178 (xB2) 1256
- * SHIFTJIS_CHARSET 128 (x80) 932
- * HANGEUL_CHARSET 129 (x81) 949
- * GB2313_CHARSET 134 (x86) 936
- * CHINESEBIG5_CHARSET 136 (x88) 950
- * </pre>
- *
- */
- virtual QCString trRTFansicp()
- {
- return "1252";
- }
-
-
- /*! Used as ansicpg for RTF fcharset
- * \see trRTFansicp() for a table of possible values.
- */
- virtual QCString trRTFCharSet()
- {
- return "0";
- }
-
- /*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return "Índex";
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trClass(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Classe" : "classe"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trFile(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Fitxer" : "fitxer"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trNamespace(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Namespace" : "namespace"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trGroup(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Grup" : "grup"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trPage(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Pàgin" : "pàgin"));
- if (!singular) result+="es"; else result+="a";
- 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;
- }
-
- /*! 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 ? "Global" : "global"));
- if (!singular) result+="s";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is generated when the \\author command is used and
- * for the author section in man pages. */
- virtual QCString trAuthor(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Autor" : "autor"));
- if (!singular) result+="s";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return "Referències";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Implementa "+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 "Implementat a "+trWriteList(numEntries)+".";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.16
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in RTF documentation as a heading for the Table
- * of Contents.
- */
- virtual QCString trRTFTableOfContents()
- {
- return "Taula de Continguts";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.17
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as the header of the list of item that have been
- * flagged deprecated
- */
- virtual QCString trDeprecatedList()
- {
- return "Llista d'Antiquats";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.18
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a header for declaration section of the events found in
- * a C# program
- */
- virtual QCString trEvents()
- {
- return "Esdeveniments";
- }
- /*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- return "Documentació dels Esdeveniments";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a heading for a list of Java class types with package scope.
- */
- virtual QCString trPackageTypes()
- {
- return "Tipus de paquets";
- }
- /*! Used as a heading for a list of Java class functions with package
- * scope.
- */
- virtual QCString trPackageMembers()
- {
- return "Funcions de Paquet";
- }
- /*! Used as a heading for a list of static Java class functions with
- * package scope.
- */
- virtual QCString trStaticPackageMembers()
- {
- return "Funcions Estàtiques de Paquet";
- }
- /*! Used as a heading for a list of Java class variables with package
- * scope.
- */
- virtual QCString trPackageAttribs()
- {
- return "Atributs de Paquet";
- }
- /*! Used as a heading for a list of static Java class variables with
- * package scope.
- */
- virtual QCString trStaticPackageAttribs()
- {
- return "Atributs Estàtics de Paquet";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Tot";
- }
- /*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- return "Gràfic de crides d'aquesta funció:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! When the search engine is enabled this text is put in the header
- * of each page before the field where one can enter the text to search
- * for.
- */
- virtual QCString trSearchForIndex()
- {
- return "Buscar";
- }
- /*! This string is used as the title for the page listing the search
- * results.
- */
- virtual QCString trSearchResultsTitle()
- {
- return "Resultats de la Búsqueda";
- }
- /*! 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
- * the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
- * value 2 represents 2 or more matches. HTML markup is allowed inside
- * the returned string.
- */
- virtual QCString trSearchResults(int numDocuments)
- {
- if (numDocuments==0)
- {
- return "No s'ha trobat cap document.";
- }
- else if (numDocuments==1)
- {
- return "Trobat <b>1</b> document.";
- }
- else
- {
- return "Trobats <b>$num</b> documents. "
- "Mostrant els millors resultats primer.";
- }
- }
- /*! 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 "Resultats:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Fitxer de Codi " + filename;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.9
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the name of the chapter containing the directory
- * hierarchy.
- */
- virtual QCString trDirIndex()
- { return "Jerarquia de Directoris"; }
-
- /*! This is used as the name of the chapter containing the documentation
- * of the directories.
- */
- virtual QCString trDirDocumentation()
- { return "Documentació dels Directoris"; }
-
- /*! 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 "Directoris"; }
-
- /*! This returns a sentences that introduces the directory hierarchy.
- * and the fact that it is sorted alphabetically per level
- */
- virtual QCString trDirDescription()
- { return "Aquesta jerarquia de directoris està ordenada toscament, "
- "però no completa, de forma alfabètica:";
- }
-
- /*! 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="Referència del Directori "; result+=dirName; return result; }
-
- /*! This returns the word directory with or without starting capital
- * (\a first_capital) and in sigular or plural form (\a singular).
- */
- virtual QCString trDir(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Directori" : "directori"));
- if (!singular) 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 "Aquesta és una funció membre sobrecarregada, "
- "proveïda per conveniència. Es diferencia de la funció "
- "anterior només en els arguments que accepta.";
- }
-};
-
-#endif
diff --git a/src/translator_cn.h b/src/translator_cn.h
deleted file mode 100644
index b78bc8b..0000000
--- a/src/translator_cn.h
+++ /dev/null
@@ -1,1500 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 TRANSLATOR_CN_H
-#define TRANSLATOR_CN_H
-
-/*!
- If you want insert a space whenever Chinese meets English charactors, set
- CN_SPC to " ", else null.
-*/
-#define CN_SPC
-
-class TranslatorChinese : public TranslatorAdapter_1_4_1
-{
- public:
- /*! Used for identification of the language. The identification
- * should not be translated. It should be replaced by the name
- * of the language in English using lower-case characters only
- * (e.g. "czech", "japanese", "russian", etc.). It sould be equal to
- * the identification used in the language.cpp.
- */
- virtual QCString idLanguage()
- { return "chinese"; }
-
- /*! Used to get the LaTeX command(s) for the language support.
- * This method should return string with commands that switch
- * LaTeX to the desired language. For example
- * <pre>"\\usepackage[german]{babel}\n"
- * </pre>
- * or
- * <pre>"\\usepackage{polski}\n"
- * "\\usepackage[latin2]{inputenc}\n"
- * "\\usepackage[T1]{fontenc}\n"
- * </pre>
- *
- * The English LaTeX does not use such commands. Because of this
- * the empty string is returned in this implementation.
- */
- virtual QCString latexLanguageSupportCommand()
- {
- return "";
- }
-
-
- /*! return the language charset. This will be used for the HTML output */
- virtual QCString idLanguageCharset()
- { return "gb2312"; }
-
- /*! used in the compound documentation before a list of related functions.
- */
- virtual QCString trRelatedFunctions()
- { return "Ïà¹Øº¯Êý"; }
-
- /*! subscript for the related functions. */
- virtual QCString trRelatedSubscript()
- { return "£¨×¢Ò⣺ÕâЩ²»ÊdzÉÔ±º¯Êý¡££©"; }
-
- /*! header that is put before the detailed description of files,
- * classes and namespaces.
- */
- virtual QCString trDetailedDescription()
- { return "ÏêϸÃèÊö"; }
-
- /*! header that is put before the list of typedefs. */
- virtual QCString trMemberTypedefDocumentation()
- { return "³ÉÔ±ÀàÐͶ¨ÒåÎĵµ"; }
-
- /*! header that is put before the list of enumerations. */
- virtual QCString trMemberEnumerationDocumentation()
- { return "³ÉԱö¾ÙÀàÐÍÎĵµ"; }
-
- /*! header that is put before the list of member function. */
- virtual QCString trMemberFunctionDocumentation()
- { return "³ÉÔ±º¯ÊýÎĵµ"; }
-
- /*! header that is put before the list of member attributes. */
- virtual QCString trMemberDataDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "×Ö¶ÎÎĵµ";
- }
- else {
- return "³ÉÔ±Êý¾ÝÎĵµ";
- }
- }
-
- /*! this is the text of a link put after brief descriptions. */
- virtual QCString trMore()
- { return "¸ü¶à..."; }
-
- /*! put in the class documention */
- virtual QCString trListOfAllMembers()
- { return "ËùÓгÉÔ±µÄÁÐ±í¡£"; }
-
- /*! used as the title of the "list of all members" page of a class */
- virtual QCString trMemberList()
- { return "³ÉÔ±Áбí"; }
-
- /*! this is the first part of a sentence that is followed by a class name */
- virtual QCString trThisIsTheListOfAllMembers()
- { return "³ÉÔ±µÄÍêÕûÁÐ±í£¬ÕâЩ³ÉÔ±ÊôÓÚ"CN_SPC; }
-
- /*! this is the remainder of the sentence after the class name */
- virtual QCString trIncludingInheritedMembers()
- { return "£¬°üÀ¨ËùÓм̳жøÀ´µÄ³ÉÔ±"; }
-
- /*! 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;
- if (s) result=(QCString)"Ϊ"CN_SPC+s+"£¬";
- result+="ÓÉ"CN_SPC"Doyxgen"CN_SPC"ͨ¹ý·ÖÎöÔ´´úÂë×Ô¶¯Éú³É¡£";
- return result;
- }
-
- /*! put after an enum name in the list of all members */
- virtual QCString trEnumName()
- { return "ö¾ÙÃû³Æ"; }
-
- /*! put after an enum value in the list of all members */
- virtual QCString trEnumValue()
- { return "ö¾ÙÖµ"; }
-
- /*! put after an undocumented member in the list of all members */
- virtual QCString trDefinedIn()
- { return "¶¨ÒåÓÚ"CN_SPC; }
-
- // 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 "Ä£¿é"; }
-
- /*! This is put above each page as a link to the class hierarchy */
- virtual QCString trClassHierarchy()
- { return "Àà¼Ì³Ð¹Øϵ"; }
-
- /*! This is put above each page as a link to the list of annotated class */
- virtual QCString trCompoundList()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
- return "Êý¾Ý½á¹¹";
- }
- else {
- return "×éºÏÀàÐÍÁбí";
- }
- }
-
- /*! This is put above each page as a link to the list of documented files */
- virtual QCString trFileList()
- { return "ÎļþÁбí"; }
-
- /*! This is put above each page as a link to all members of compounds. */
- virtual QCString trCompoundMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
- return "Êý¾Ý×Ö¶Î";
- }
- else {
- return "×éºÏÀàÐͳÉÔ±";
- }
- }
-
- /*! This is put above each page as a link to all member of files. */
- virtual QCString trFileMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
- return "È«¾Ö¶¨Òå";
- } else {
- return "Îļþ³ÉÔ±";
- }
- }
-
- /*! This is put above each page as a link to all related pages. */
- virtual QCString trRelatedPages()
- { return "Ïà¹ØÒ³Ãæ"; }
-
- /*! This is put above each page as a link to all examples. */
- virtual QCString trExamples()
- { return "ʾÀý"; }
-
- virtual QCString trSearch()
- { return "ËÑË÷"; }
-
- virtual QCString trClassHierarchyDescription()
- { return "´ËÁбí»ù±¾°´×Öµä˳ÐòÅÅÐò£º"; }
-
- virtual QCString trFileListDescription(bool extractAll)
- {
- QCString result="ÕâÀïÁгöËùÓÐ";
- if (!extractAll) result+="Îĵµ»¯µÄ";
- result+="Îļþ£¬¸½´ø¼òҪ˵Ã÷£º";
- return result;
- }
-
- virtual QCString trCompoundListDescription()
- {
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "ÕâÀïÁгöËùÓÐÊý¾Ý½á¹¹£¬¸½´ø¼òҪ˵Ã÷£º";
- }
- else
- {
- return "ÕâÀïÁгöËùÓÐÀà¡¢½á¹¹¡¢ÁªºÏÒÔ¼°½Ó¿Ú¶¨Ò壬¸½´ø¼òҪ˵Ã÷£º";
- }
- }
-
- virtual QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result="ÕâÀïÁгöËùÓÐ";
- if (!extractAll) {
- result+="Îĵµ»¯µÄ";
- }
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
- result+="½á¹¹ºÍÁªºÏµÄ³ÉÔ±£¬¸½´ø";
- }
- else {
- result+="Àà³ÉÔ±£¬¸½´ø";
- }
-
- if (extractAll) {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
- result+="ËùÔڽṹ£¯ÁªºÏµÄÎĵµµÄÁ´½Ó£º";
- }
- else {
- result+="ËùÔÚÀàµÄÎĵµµÄÁ´½Ó£º";
- }
- }
- else {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
- result+="ËùÊô½á¹¹£¯ÁªºÏµÄÁ´½Ó£º";
- }
- else {
- result+="ËùÊôÀàµÄÁ´½Ó£º";
- }
- }
- return result;
- }
-
- virtual QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="ÕâÀïÁгöËùÓÐ";
- if (!extractAll)
- result +="Îĵµ»¯µÄ";
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
- result +="º¯Êý£¬±äÁ¿£¬ºê£¬Ã¶¾ÙºÍÀàÐͶ¨Ò壬¸½´ø";
- }
- else {
- result +="Îļþ³ÉÔ±£¬¸½´ø";
- }
-
- if (extractAll)
- result+="ËùÔÚÎļþµÄÎĵµµÄÁ´½Ó£º";
- else
- result+="ËùÔÚÎļþµÄÁ´½Ó£º";
- return result;
- }
-
- virtual QCString trExamplesDescription()
- { return "ÕâÀïÁгöËùÓÐʾÀý£º"; }
-
- virtual QCString trRelatedPagesDescription()
- { return "ÕâÀïÁгöËùÓÐÏà¹ØµÄÒ³Ã棺"; }
-
- virtual QCString trModulesDescription()
- { return "ÕâÀïÁгöËùÓÐÄ£¿é"; }
-
- virtual QCString trDocumentation()
- { return "Îĵµ"; }
-
- virtual QCString trModuleIndex()
- { return "Ä£¿éË÷Òý"; }
-
- virtual QCString trHierarchicalIndex()
- { return "¼Ì³Ð¹ØϵË÷Òý"; }
-
- virtual QCString trCompoundIndex()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Êý¾Ý½á¹¹Ë÷Òý";
- }
- else {
- return "×éºÏÀàÐÍË÷Òý";
- }
- }
-
- virtual QCString trFileIndex()
- { return "ÎļþË÷Òý"; }
-
- virtual QCString trModuleDocumentation()
- { return "Ä£¿éÎĵµ"; }
-
- virtual QCString trClassDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Êý¾Ý½á¹¹Îĵµ";
- }
- else {
- return "ÀàÎĵµ";
- }
- }
-
- virtual QCString trFileDocumentation()
- { return "ÎļþÎĵµ"; }
-
- virtual QCString trExampleDocumentation()
- { return "ʾÀýÎĵµ"; }
-
- virtual QCString trPageDocumentation()
- { return "Ò³ÃæÎĵµ"; }
-
- virtual QCString trReferenceManual()
- { return "²Î¿¼ÊÖ²á"; }
-
- virtual QCString trDefines()
- { return "ºê¶¨Òå"; }
-
- virtual QCString trFuncProtos()
- { return "º¯ÊýÔ­ÐÍ"; }
-
- virtual QCString trTypedefs()
- { return "ÀàÐͶ¨Òå"; }
-
- virtual QCString trEnumerations()
- { return "ö¾Ù"; }
-
- virtual QCString trFunctions()
- { return "º¯Êý"; }
-
- virtual QCString trVariables()
- { return "±äÁ¿"; }
-
- virtual QCString trEnumerationValues()
- { return "ö¾ÙÖµ"; }
-
-
- virtual QCString trDefineDocumentation()
- { return "ºê¶¨ÒåÎĵµ"; }
-
- virtual QCString trFunctionPrototypeDocumentation()
- { return "º¯ÊýÔ­ÐÍÎĵµ"; }
-
- virtual QCString trTypedefDocumentation()
- { return "ÀàÐͶ¨ÒåÎĵµ"; }
-
- virtual QCString trEnumerationTypeDocumentation()
- { return "ö¾ÙÀàÐÍÎĵµ"; }
-
- virtual QCString trFunctionDocumentation()
- { return "º¯ÊýÎĵµ"; }
-
- virtual QCString trVariableDocumentation()
- { return "±äÁ¿Îĵµ"; }
-
- virtual QCString trCompounds()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Êý¾Ý½á¹¹";
- }
- else {
- return "×éºÏÀàÐÍ";
- }
- }
-
- virtual QCString trGeneratedAt(const char *date,const char *projName)
- {
- QCString result=(QCString)"Generated at "+date;
- if (projName) result+=(QCString)" for "+projName;
- result+=(QCString)" by";
- return result;
- }
-
- virtual QCString trWrittenBy()
- {
- return "written by";
- }
-
- virtual QCString trClassDiagram(const char *clName)
- {
- return (QCString)"¼Ì³Ðͼ£¬Àà"CN_SPC+clName;
- }
-
- virtual QCString trForInternalUseOnly()
- { return "½öÏÞÄÚ²¿Ê¹Óá£"; }
-
- virtual QCString trWarning()
- { return "¾¯¸æ"; }
-
- virtual QCString trVersion()
- { return "°æ±¾"; }
-
- virtual QCString trDate()
- { return "ÈÕÆÚ"; }
-
- virtual QCString trReturns()
- { return "·µ»Ø"; }
-
- virtual QCString trSeeAlso()
- { return "²Î¼û"; }
-
- virtual QCString trParameters()
- { return "²ÎÊý"; }
-
- virtual QCString trExceptions()
- { return "Òì³£"; }
-
- virtual QCString trGeneratedBy()
- { return "ÖÆ×÷Õß"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trNamespaceList()
- { return "Ãû×Ö¿Õ¼äÁбí"; }
-
- virtual QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="ÕâÀïÁгöËùÓÐ";
- if (!extractAll) result+="Îĵµ»¯µÄ";
- result+="Ãû×ֿռ䶨Ò壬¸½´ø¼òҪ˵Ã÷£º";
- return result;
- }
-
- virtual QCString trFriends()
- { return "ÓÑÔª"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trRelatedFunctionDocumentation()
- { return "ÓÑÔª¼°Ïà¹Øº¯ÊýÎĵµ"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- // used as the title of the HTML page of a class/struct/union
- {
- QCString result=(QCString)clName;
- if (isTemplate) result+=CN_SPC"Ä£°å";
- switch(compType)
- {
- case ClassDef::Class: result+="Àà"; break;
- case ClassDef::Struct: result+="½á¹¹"; break;
- case ClassDef::Union: result+="ÁªºÏ"; break;
- case ClassDef::Interface: result+="½Ó¿Ú"; break;
- case ClassDef::Protocol: result+="ЭÒé"; break; // translate me!
- case ClassDef::Category: result+="·ÖÀà"; break; // translate me!
- case ClassDef::Exception: result+="Òì³£"; break;
- }
- result+="²Î¿¼";
- return result;
- }
-
- virtual QCString trFileReference(const char *fileName)
- // used as the title of the HTML page of a file
- {
- QCString result=fileName;
- result+=CN_SPC"Îļþ²Î¿¼";
- return result;
- }
-
- virtual QCString trNamespaceReference(const char *namespaceName)
- // used as the title of the HTML page of a namespace
- {
- QCString result=namespaceName;
- result+=CN_SPC"Ãû×Ö¿Õ¼ä²Î¿¼";
- return result;
- }
-
- // these are for the member sections of a class, struct or union
- virtual QCString trPublicMembers()
- { return "¹«ÓгÉÔ±"; }
-
- virtual QCString trPublicSlots()
- { return "¹«ÓвÛ"; }
-
- virtual QCString trSignals()
- { return "ÐźÅ"; }
-
- virtual QCString trStaticPublicMembers()
- { return "¾²Ì¬¹«ÓгÉÔ±"; }
-
- virtual QCString trProtectedMembers()
- { return "±£»¤³ÉÔ±"; }
-
- virtual QCString trProtectedSlots()
- { return "±£»¤²Û"; }
-
- virtual QCString trStaticProtectedMembers()
- { return "¾²Ì¬±£»¤³ÉÔ±"; }
-
- virtual QCString trPrivateMembers()
- { return "˽ÓгÉÔ±"; }
-
- virtual QCString trPrivateSlots()
- { return "˽ÓвÛ"; }
-
- virtual QCString trStaticPrivateMembers()
- { return "¾²Ì¬Ë½ÓгÉÔ±"; }
-
- // end of member sections
-
- virtual QCString trWriteList(int numEntries)
- {
- // this function is used to produce a comma-separated list of items.
- // use generateMarker(i) to indicate where item i should be put.
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+="¡¢";
- else // the fore last entry
- result+=CN_SPC"¼°"CN_SPC;
- }
- }
- return result;
- }
-
- virtual QCString trInheritsList(int numEntries)
- // used in class documentation to produce a list of base classes,
- // if class diagrams are disabled.
- {
- return "¼Ì³Ð×Ô"CN_SPC+trWriteList(numEntries)+"¡£";
- }
-
- virtual QCString trInheritedByList(int numEntries)
- // used in class documentation to produce a list of super classes,
- // if class diagrams are disabled.
- {
- return "±»"CN_SPC+trWriteList(numEntries)+CN_SPC"¼Ì³Ð.";
- }
-
- virtual QCString trReimplementedFromList(int numEntries)
- // used in member documentation blocks to produce a list of
- // members that are hidden by this one.
- {
- return "ÖØÔØ"CN_SPC+trWriteList(numEntries)+"¡£";
- }
-
- virtual QCString trReimplementedInList(int numEntries)
- {
- // used in member documentation blocks to produce a list of
- // all member that overwrite the implementation of this member.
- return "±»"CN_SPC+trWriteList(numEntries)+CN_SPC"ÖØÔØ¡£";
- }
-
- virtual QCString trNamespaceMembers()
- // This is put above each page as a link to all members of namespaces.
- { return "Ãû×Ö¿Õ¼ä³ÉÔ±"; }
-
- virtual QCString trNamespaceMemberDescription(bool extractAll)
- // This is an introduction to the page with all namespace members
- {
- QCString result="ÕâÀïÁгöÁËËùÓÐ";
- if (!extractAll) result+="Îĵµ»¯µÄ";
- result+="Ãû×Ö¿Õ¼ä³ÉÔ±£¬¸½´ø";
- if (extractAll)
- result+="ËùÔÚÀàµÄÎĵµµÄÁ´½Ó£º";
- else
- result+="ËùÔÚÀàµÄÁ´½Ó£º";
- return result;
- }
-
- virtual QCString trNamespaceIndex()
- // This is used in LaTeX as the title of the chapter with the
- // index of all namespaces.
- { return "Ãû×Ö¿Õ¼äË÷Òý"; }
-
- virtual QCString trNamespaceDocumentation()
- // This is used in LaTeX as the title of the chapter containing
- // the documentation of all namespaces.
- { return "Ãû×Ö¿Õ¼äÎĵµ"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- virtual QCString trNamespaces()
- {
- return "Namespaces";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990728
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is put at the bottom of a class documentation page and is
- * followed by a list of files that were used to generate the page.
- */
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)"¸Ã";
- switch(compType)
- {
- case ClassDef::Class: result+="Àà"; break;
- case ClassDef::Struct: result+="½á¹¹"; break;
- case ClassDef::Union: result+="ÁªºÏ"; break;
- case ClassDef::Interface: result+="½Ó¿Ú"; break;
- case ClassDef::Protocol: result+="ЭÒé"; break; // translate me!
- case ClassDef::Category: result+="·ÖÀà"; break; // translate me!
- case ClassDef::Exception: result+="Òì³£"; break;
- }
- result+="µÄÎĵµÓÉÒÔÏÂÎļþÉú³É£º";
- return result;
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- virtual QCString trAlphabeticalList()
- { return "°´×Öµä˳ÐòÅÅÐòµÄÁбí"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- virtual QCString trReturnValues()
- { return "·µ»ØÖµ"; }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- virtual QCString trMainPage()
- { return "Ê×Ò³"; }
-
- /*! This is used in references to page that are put in the LaTeX
- * documentation. It should be an abbreviation of the word page.
- */
- virtual QCString trPageAbbreviation()
- { return "p."; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991106
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDefinedAtLineInSourceFile()
- {
- return "ÔÚÎļþ"CN_SPC"@1"CN_SPC"µÚ"CN_SPC"@0"CN_SPC"Ðж¨Òå¡£";
- }
-
- virtual QCString trDefinedInSourceFile()
- {
- return "ÔÚÎļþ"CN_SPC"@0"CN_SPC"Öж¨Òå¡£";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDeprecated()
- {
- return "Deprecated";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- virtual QCString trCollaborationDiagram(const char *clName)
- {
- return (QCString)clName+CN_SPC"ºÏ×÷ͼ£º";
- }
-
- /*! this text is put before an include dependency graph */
- virtual QCString trInclDepGraph(const char *fName)
- {
- return (QCString)fName+CN_SPC"°üº¬/ÒÀÀµ¹Øϵͼ£º";
- }
-
- /*! header that is put before the list of constructor/destructors. */
- virtual QCString trConstructorDocumentation()
- {
- return "¹¹Ôì¼°Îö¹¹º¯ÊýÎĵµ";
- }
-
- /*! Used in the file documentation to point to the corresponding sources. */
- virtual QCString trGotoSourceCode()
- {
- return "ä¯ÀÀ¸ÃÎļþµÄÔ´´úÂë¡£";
- }
-
- /*! Used in the file sources to point to the corresponding documentation. */
- virtual QCString trGotoDocumentation()
- {
- return "ä¯ÀÀ¸ÃÎļþµÄÎĵµ¡£";
- }
-
- /*! Text for the \\pre command */
- virtual QCString trPrecondition()
- {
- return "Ç°ÖÃÌõ¼þ";
- }
-
- /*! Text for the \\post command */
- virtual QCString trPostcondition()
- {
- return "ºóÖÃÌõ¼þ";
- }
-
- /*! Text for the \\invariant command */
- virtual QCString trInvariant()
- {
- return "²»±äÐÔ";
- }
-
- /*! Text shown before a multi-line variable/enum initialization */
- virtual QCString trInitialValue()
- {
- return "³õʼ»¯ÐòÁУº";
- }
-
- /*! Text used the source code in the file index */
- virtual QCString trCode()
- {
- return "´úÂë";
- }
-
- virtual QCString trGraphicalHierarchy()
- {
- return "Àà¼Ì³Ð¹Øϵͼ";
- }
-
- virtual QCString trGotoGraphicalHierarchy()
- {
- return "ä¯ÀÀÀà¼Ì³Ð¹Øϵͼ";
- }
-
- virtual QCString trGotoTextualHierarchy()
- {
- return "ä¯ÀÀÀà¼Ì³Ð¹Øϵ±í";
- }
-
- virtual QCString trPageIndex()
- {
- return "Ò³ÃæË÷Òý";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trNote()
- {
- return "×¢½â";
- }
-
- virtual QCString trPublicTypes()
- {
- return "¹«ÓÐÀàÐÍ";
- }
-
- virtual QCString trPublicAttribs()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Êý¾Ý³ÉÔ±";
- }
- else {
- return "¹«ÓÐÊôÐÔ";
- }
- }
-
- virtual QCString trStaticPublicAttribs()
- {
- return "¾²Ì¬¹«ÓÐÊôÐÔ";
- }
-
- virtual QCString trProtectedTypes()
- {
- return "±£»¤ÀàÐÍ";
- }
-
- virtual QCString trProtectedAttribs()
- {
- return "±£»¤ÊôÐÔ";
- }
-
- virtual QCString trStaticProtectedAttribs()
- {
- return "¾²Ì¬±£»¤ÊôÐÔ";
- }
-
- virtual QCString trPrivateTypes()
- {
- return "˽ÓÐÀàÐÍ";
- }
-
- virtual QCString trPrivateAttribs()
- {
- return "˽ÓÐÊôÐÔ";
- }
-
- virtual QCString trStaticPrivateAttribs()
- {
- return "¾²Ì¬Ë½ÓÐÊôÐÔ";
- }
-
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a todo item */
- virtual QCString trTodo()
- {
- return "TODO";
- }
-
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- {
- return "TODO"CN_SPC"Áбí";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy()
- {
- return "²Î¿¼×Ô";
- }
-
- virtual QCString trRemarks()
- {
- return "ÆÀÂÛ";
- }
-
- virtual QCString trAttention()
- {
- return "×¢Òâ";
- }
-
- virtual QCString trInclByDepGraph()
- {
- return "´Ëͼչʾֱ½Ó»ò¼ä½Ó°üº¬¸ÃÎļþµÄÎļþ£º";
- }
-
- virtual QCString trSince()
- {
- return "×Ô´Ó";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- virtual QCString trLegendTitle()
- {
- return "ͼÀý";
- }
-
- /*! page explaining how the dot graph's should be interpreted */
- virtual QCString trLegendDocs()
- {
- return
- "±¾Ò³ÏòÄúչʾÈçºÎÀí½âÓÉ"CN_SPC"Doxygen"CN_SPC"Éú³ÉµÄͼÐΡ£<p>\n"
- "Ç뿼ÂÇÈçÏÂʾÀý£º\n"
- "\\code\n"
- "/*! ÓÉÓÚ½ØÈ¡¶øʹ¸ÃÀ಻¿É¼û */\n"
- "class Invisible { };\n\n"
- "/*! ±»½ØÈ¡µÄÀ࣬¼Ì³Ð¹Øϵ±»Òþ²ØÆðÀ´ÁË */\n"
- "class Truncated : public Invisible { };\n\n"
- "/* ûÓб»"CN_SPC"doxygen"CN_SPC"µÄ×¢ÊÍÎĵµ»¯µÄÀà */\n"
- "class Undocumented { };\n\n"
- "/*! ±»¹«Óм̳еÄÀà */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! ±»±£»¤¼Ì³ÐµÄÀà */\n"
- "class ProtectedBase { };\n\n"
- "/*! ±»Ë½Óм̳еÄÀà */\n"
- "class PrivateBase { };\n\n"
- "/*! ±»Ê¹ÓõÄÀà */\n"
- "class Used { };\n\n"
- "/*! ¼Ì³ÐÁËÈô¸ÉÆäËüÀàµÄÀà */\n"
- "class Inherited : public PublicBase,\n"
- " protected ProtectedBase,\n"
- " private PrivateBase,\n"
- " public Undocumented\n"
- "{\n"
- " private:\n"
- " Used *m_usedClass;\n"
- "};\n"
- "\\endcode\n"
- "Èç¹ûÔÚÅäÖÃÎļþÖÐÖ¸¶¨ÁË"CN_SPC"MAX_DOT_GRAPH_HEIGHT"CN_SPC"µÄֵΪ200£¬"
- "ÔòDoxygen½«Éú³ÉÈçϵÄͼÐΣº"
- "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
- "ÒÔÉÏͼÐÎÖеľØÐÎÓÐÈçϵĺ¬Ò壺\n"
- "<ul>\n"
- "<li>±»ºÚÉ«Ìî³äµÄ¾ØÐδú±íµ±Ç°µÄÀà»ò½á¹¹¡£\n"
- "<li>ºÚÉ«±ß¿òµÄ¾ØÐδú±í<i>Îĵµ»¯</i>µÄÀà»ò½á¹¹¡£\n"
- "<li>»ÒÉ«±ß¿òµÄ¾ØÐδú±íûÓÐ<i>Îĵµ»¯</i>µÄÀà»ò½á¹¹¡£\n"
- "<li>ºìÉ«±ß¿òµÄ¾ØÐδú±í¼Ì³Ð/°üº¬¹ØϵûÓб»ÍêÕûÏÔʾ³öµÄÀà»ò½á¹¹¡£Èç¹ûÒ»·ùͼÏñµÄ³ß"
- "´ç´óÓÚÖ¸¶¨³ß´ç£¬Ëü½«±»½ØÈ¡¡£"
- "</ul>\n"
- "¸÷¸ö¼ýÍ·ÓÐÈçϵĺ¬Ò壺\n"
- "<ul>\n"
- "<li>ÉîÀ¶É«µÄ¼ýÍ·ÓÃÓÚÏÔʾÁ½¸öÀàÖ®¼äµÄ¹«Óм̳йØϵ¡£\n"
- "<li>ÉîÂÌÉ«µÄ¼ýÍ·ÓÃÓÚÏÔʾ±£»¤¼Ì³Ð¹Øϵ¡£\n"
- "<li>ÉîºìÉ«µÄ¼ýÍ·ÓÃÓÚÏÔʾ˽Óм̳йØϵ¡£\n"
- "<li>×ÏÉ«µã×´ÏßÌõµÄ¼ýÍ·ÓÃÓÚÏÔʾÁ½¸öÀàÖ®¼ä°üº¬»òÕßʹÓõĹØϵ¡£Í¨¹ý¼ýÍ·ÅԱߵıäÁ¿¿ÉÒÔ"
- "·ÃÎʵ½¼ýÍ·ËùÖ¸µÄÀà»ò½á¹¹¡£\n"
- "</ul>\n";
- }
- /*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return "ͼÀý";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return "²âÊÔ";
- }
-
- /*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return "²âÊÔÁбí";
- }
-
-//////////////////////////////////////////////////////////////////////////
-//// new since 1.2.1
-////////////////////////////////////////////////////////////////////////////
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return "DCOP"CN_SPC"·½·¨";
- }
-
-//////////////////////////////////////////////////////////////////////////
-//// new since 1.2.2
-////////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return "ÊôÐÔ";
- }
-
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return "ÊôÐÔÎĵµ";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Êý¾Ý½á¹¹";
- }
- else
- {
- return "Àà";
- }
- }
-
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
- {
- return (QCString)"°ü "+name;
- }
-
- /*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return "°üÁбí";
- }
-
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return "ÕâÀïÁгöËùÓеİü£¬¸½´ø¼òҪ˵Ã÷(Èç¹ûÓеĻ°)£º";
- }
-
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return "°ü";
- }
-
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return "Öµ:";
- }
-
-////////////////////////////////////////////////////////////////////////////
-//// new since 1.2.6
-////////////////////////////////////////////////////////////////////////////
- virtual QCString trBug ()
- {
- return "ȱÏÝ";
- }
-
- virtual QCString trBugList ()
- {
- return "ȱÏÝÁбí";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as ansicpg for RTF file
- *
- * The following table shows the correlation of Charset name, Charset Value and
- * <pre>
- * Codepage number:
- * Charset Name Charset Value(hex) Codepage number
- * ------------------------------------------------------
- * DEFAULT_CHARSET 1 (x01)
- * SYMBOL_CHARSET 2 (x02)
- * OEM_CHARSET 255 (xFF)
- * ANSI_CHARSET 0 (x00) 1252
- * RUSSIAN_CHARSET 204 (xCC) 1251
- * EE_CHARSET 238 (xEE) 1250
- * GREEK_CHARSET 161 (xA1) 1253
- * TURKISH_CHARSET 162 (xA2) 1254
- * BALTIC_CHARSET 186 (xBA) 1257
- * HEBREW_CHARSET 177 (xB1) 1255
- * ARABIC _CHARSET 178 (xB2) 1256
- * SHIFTJIS_CHARSET 128 (x80) 932
- * HANGEUL_CHARSET 129 (x81) 949
- * GB2313_CHARSET 134 (x86) 936
- * CHINESEBIG5_CHARSET 136 (x88) 950
- * </pre>
- *
- */
- virtual QCString trRTFansicp()
- {
- return "936";
- }
-
- /*! Used as ansicpg for RTF fcharset
- * \see trRTFansicp() for a table of possible values.
- */
- virtual QCString trRTFCharSet()
- {
- return "134";
- }
-
-
- /*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return "Ë÷Òý";
- }
-
-
- /*! 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 ? "Class" : "class"));
- if (!singular) result+="es";
- return result;
- */
- return "Àà";
- }
-
- /*! 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 ? "File" : "file"));
- if (!singular) result+="s";
- return result;
- */
- return "Îļþ";
-
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trNamespace(bool /*first_capital*/, bool /*singular*/)
- {
- /*
- QCString result((first_capital ? "Namespace" : "namespace"));
- if (!singular) result+="s";
- return result;
- */
- return "Ãû×Ö¿Õ¼ä";
- }
-
- /*! 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 ? "Group" : "group"));
- if (!singular) result+="s";
- return result;
- */
- return "×é";
- }
-
- /*! 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;
- */
- return "Ò³";
- }
-
- /*! 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 ? "Member" : "member"));
- if (!singular) result+="s";
- return result;
- */
- return "³ÉÔ±";
- }
-
- /*! 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 ? "Global" : "global"));
- if (!singular) result+="s";
- return result;
- */
- return "È«¾Ö¶¨Òå";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 ? "Author" : "author"));
- if (!singular) result+="s";
- return result;
- */
- return "×÷Õß";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return "²Î¿¼";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Implements "+trWriteList(numEntries)+"."; */
- return "ʵÏÖÁË"CN_SPC+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 "Implemented in "+trWriteList(numEntries)+"."; */
- return "ÔÚ"CN_SPC+trWriteList(numEntries)+CN_SPC"ÄÚ±»ÊµÏÖ¡£";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.16
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in RTF documentation as a heading for the Table
- * of Contents.
- */
- virtual QCString trRTFTableOfContents()
- {
- /* return "Table of Contents"; */
- return "Ŀ¼";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.17
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as the header of the list of item that have been
- * flagged deprecated
- */
- virtual QCString trDeprecatedList()
- {
-/* return "Deprecated List"; */
- return "¹ýʱÁбí";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.18
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a header for declaration section of the events found in
- * a C# program
- */
- virtual QCString trEvents()
- {
- /* return "Events"; */
- return "ʼþ";
- }
- /*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- /* return "Event Documentation"; */
- return "ʼþÎĵµ";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a heading for a list of Java class types with package scope.
- */
- virtual QCString trPackageTypes()
- {
- /* return "Package Types"; */
- return "Ä£¿éÀàÐÍ";
- }
- /*! Used as a heading for a list of Java class functions with package
- * scope.
- */
- virtual QCString trPackageMembers()
- {
- /* return "Package Functions"; */
- return "Ä£¿éº¯Êý";
- }
- /*! Used as a heading for a list of static Java class functions with
- * package scope.
- */
- virtual QCString trStaticPackageMembers()
- {
- /* return "Static Package Functions"; */
- return "¾²Ì¬Ä£¿éº¯Êý";
- }
- /*! Used as a heading for a list of Java class variables with package
- * scope.
- */
- virtual QCString trPackageAttribs()
- {
- /* return "Package Attributes"; */
- return "Ä£¿éÊôÐÔ";
- }
- /*! Used as a heading for a list of static Java class variables with
- * package scope.
- */
- virtual QCString trStaticPackageAttribs()
- {
- /* return "Static Package Attributes"; */
- return "¾²Ì¬Ä£¿éÊôÐÔ";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "All"; */
- return "È«²¿";
- }
- /*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- /* return "Here is the call graph for this function:"; */
- return "º¯Êýµ÷ÓÃͼ:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! When the search engine is enabled this text is put in the header
- * of each page before the field where one can enter the text to search
- * for.
- */
- virtual QCString trSearchForIndex()
- {
- /* return "Search for"; */
- return "ËÑË÷";
- }
- /*! This string is used as the title for the page listing the search
- * results.
- */
- virtual QCString trSearchResultsTitle()
- {
- /* return "Search Results"; */
- return "ËÑË÷½á¹û";
- }
- /*! 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
- * the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
- * value 2 represents 2 or more matches. HTML markup is allowed inside
- * the returned string.
- */
- virtual QCString trSearchResults(int numDocuments)
- {
- if (numDocuments==0)
- {
- /* return "Sorry, no documents matching your query."; */
- return "¶Ô²»Æð£¬ÕÒ²»µ½ÓëÄãµÄ²éѯÏà·ûµÄÎĵµ¡£";
- }
- else if (numDocuments==1)
- {
- /* return "Found <b>1</b> document matching your query."; */
- return "ÕÒµ½<b>1</b>ƪÓëÄãµÄ²éѯÏà·ûµÄÎĵµ¡£";
- }
- else
- {
- /* return "Found <b>$num</b> documents matching your query. "
- "Showing best matches first."; */
- return "ÕÒµ½<b>$num</b>ƪÓëÄãµÄ²éѯÏà·ûµÄÎĵµ¡£"
- "ÏÈÏÔʾ×îÎǺϵÄÎĵµ¡£";
- }
- }
- /*! 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 "Matches:"; */
- return "·ûºÏµÄ½á¹û:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 filename + " Source File"; */
- return filename + CN_SPC"Ô´Îļþ";
- }
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.9
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the name of the chapter containing the directory
- * hierarchy.
- */
- virtual QCString trDirIndex()
- /* { return "Directory Hierarchy"; } */
- {
- return "Ŀ¼½á¹¹";
- }
-
- /*! This is used as the name of the chapter containing the documentation
- * of the directories.
- */
- virtual QCString trDirDocumentation()
- /* { return "Directory Documentation"; } */
- {
- return "Ŀ¼Îĵµ";
- }
-
- /*! 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 "Directories"; } */
- {
- return "Ŀ¼";
- }
-
- /*! This returns a sentences that introduces the directory hierarchy.
- * and the fact that it is sorted alphabetically per level
- */
- virtual QCString trDirDescription()
-/* { return "This directory hierarchy is sorted roughly, " */
-/* "but not completely, alphabetically:"; */
-/* } */
- {
- return "Ŀ¼½á¹¹½ö¾­¹ý´ÖÂÔµÄÅÅÐò";
- }
-
- /*! 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=dirName; result+=" Directory Reference"; return result; } */
- {
- QCString result=dirName;
- result+=CN_SPC"Ŀ¼²Î¿¼";
- return result;
- }
-
- /*! 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, bool)
- {
- /* QCString result((first_capital ? "Director" : "director")); */
- /* if (singular) result+="y"; else result+="ies"; */
- /* return result; */
- return "Ŀ¼";
- }
-
-};
-
-#endif
-
diff --git a/src/translator_cz.h b/src/translator_cz.h
deleted file mode 100644
index b22d63b..0000000
--- a/src/translator_cz.h
+++ /dev/null
@@ -1,1625 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 TRANSLATOR_CZ_H
-#define TRANSLATOR_CZ_H
-
-//
-//
-// The first translation from English to Czech was started by
-// Vlastimil Havran (1999--2000). The prototype version of Czech strings
-// with diacritics was implemented by Petr Prikryl (prikrylp@skil.cz),
-// 2000/06/20. Vlastimil agreed that Petr be the new maintainer.
-//
-// Updates:
-// --------
-// 2000/06/20 - Prototype: with diacritics; based on ver. 1.1.4 (from scratch).
-// 2000/07/10 - Update to 1.1.5; conditionally decoding to iso-8859-2 for UNIX.
-// 2000/07/19 - Updates for "new since 1.1.5"; encoding conversion separated.
-// 2000/08/02 - Updated for 1.2.0
-// 2000/08/24 - Corrections, updates.
-// 2000/08/30 - Macro DECODE replaced by the inline (thanks to Boris Bralo).
-// 2000/08/31 - ISOToWin() and WinToISO() moved to the base class.
-// 2000/09/06 - Reimplementation of trInheritsList().
-// 2000/09/11 - Update for "new since 1.2.1" version.
-// 2000/10/17 - Update for "new since 1.2.2" version.
-// 2001/01/09 - Update for "new since 1.2.4" version.
-// 2001/02/15 - trMore() now returns only "..." (ellipsis).
-// 2001/02/26 - Update for "new since 1.2.5" version (trBug(), trBugList()).
-// 2001/03/12 - Minor correction of comments (synchronous with translator.h).
-// 2001/04/10 - Updates (1.2.6-20010408), cleaning.
-// 2001/04/20 - Update for "new since 1.2.6-20010422". Experimental version
-// introducing TranslatorAdapter class and the abstract base
-// class Translator. The English translator is now on the same
-// level as other translators.
-// 2001/05/02 - Decode() inline changed to decode(); cleaning.
-// 2001/05/18 - Updates, corrections.
-// 2001/05/25 - Corrections.
-// 2001/07/16 - trClassDocumentation() updated as in the English translator.
-// 2001/11/06 - trReferences() implemented.
-// 2002/01/23 - Two new methods "since 1.2.13" implemented.
-// 2002/03/05 - ... forgot to replace TranslatorAdapter... by Translator.
-// 2002/07/08 - The new trRTFTableOfContents() implemented. (my birthday! ;)
-// 2002/07/29 - The new trDeprecatedList() implemented.
-// 2002/10/15 - The new trEvents() and trEventDocumentation() implemented.
-// 2003/04/28 - Five new methods "since 1.3" implemented.
-// 2003/06/10 - Two new methods "since 1.3.1" implemented.
-// 2003/08/13 - Four new methods "since 1.3.3" implemented.
-// 2004/02/26 - trLegendDocs() updated.
-// 2004/02/27 - Text inside the trCallGraph() corrected.
-// 2004/06/16 - The new method "since 1.3.8" implemented.
-// 2004/09/14 - The new methods "since 1.3.9" implemented.
-// 2005/02/11 - The "never used" methods removed.
-// 2005/03/08 - Update for "new since 1.4.1" (trOverloadText())
-
-// Todo
-// ----
-// - The trReimplementedFromList() should pass the kind of the
-// reimplemented element. It can be method, typedef or possibly
-// something else. It is difficult to find the general translation
-// for all kinds in the Czech language.
-//
-// Notices:
-// --------
-// The conditional compilation ensures or the neutral functionality
-// of the private inline decode(), or calling the WinToISO() method
-// for on-line encoding conversion. If you want to maintain the
-// source in the iso-8859-2, do convert the encoding of the source,
-// change the conditional definition of the inline decode() using the
-// method ISO88592ToWin1250() -- for conversion of strings for the
-// Windows version. The version which does not call the function is
-// probably slightly faster.
-
-class TranslatorCzech : public Translator
-{
- private:
- /*! The decode() inline assumes the source written in the
- Windows encoding (maintainer only dependent).
- */
- inline QCString decode(const QCString & sInput)
- {
- if (Config_getBool("USE_WINDOWS_ENCODING"))
- {
- return sInput;
- }
- else
- {
- return Win1250ToISO88592(sInput);
- }
- }
-
- public:
- // --- Language control methods -------------------
-
- virtual QCString idLanguage()
- { return "czech"; }
-
- virtual QCString latexLanguageSupportCommand()
- { return "\\usepackage{czech}\n"; }
-
- /*! return the language charset. This will be used for the HTML output */
- virtual QCString idLanguageCharset()
- {
- if (Config_getBool("USE_WINDOWS_ENCODING"))
- {
- return "windows-1250";
- }
- else
- {
- return "iso-8859-2";
- }
- }
-
- // --- Language translation methods -------------------
-
- /*! used in the compound documentation before a list of related functions. */
- virtual QCString trRelatedFunctions()
- { return decode("Související funkce"); }
-
- /*! subscript for the related functions. */
- virtual QCString trRelatedSubscript()
- { return decode("(Uvedené funkce nejsou èlenskými funkcemi.)"); }
-
- /*! header that is put before the detailed description of files, classes and namespaces. */
- virtual QCString trDetailedDescription()
- { return decode("Detailní popis"); }
-
- /*! header that is put before the list of typedefs. */
- virtual QCString trMemberTypedefDocumentation()
- { return decode("Dokumentace k èlenským typùm"); }
-
- /*! header that is put before the list of enumerations. */
- virtual QCString trMemberEnumerationDocumentation()
- { return decode("Dokumentace k èlenským výètùm"); }
-
- /*! header that is put before the list of member functions. */
- virtual QCString trMemberFunctionDocumentation()
- { return decode("Dokumentace k metodám"); }
-
- /*! header that is put before the list of member attributes. */
- virtual QCString trMemberDataDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode("Dokumentace k položkám");
- }
- else
- {
- return decode("Dokumentace k datovým èlenùm");
- }
- }
-
- /*! this is the text of a link put after brief descriptions. */
- virtual QCString trMore()
- { return decode("..."); }
-
- /*! put in the class documentation */
- virtual QCString trListOfAllMembers()
- { return decode("Seznam všech èlenù."); }
-
- /*! used as the title of the "list of all members" page of a class */
- virtual QCString trMemberList()
- { return decode("Seznam èlenù tøídy"); }
-
- /*! this is the first part of a sentence that is followed by a class name */
- virtual QCString trThisIsTheListOfAllMembers()
- { return decode("Zde naleznete úplný seznam èlenù tøídy "); }
-
- /*! this is the remainder of the sentence after the class name */
- virtual QCString trIncludingInheritedMembers()
- { return decode(", vèetnì všech zdìdìných èlenù."); }
-
- /*! 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="Generováno automaticky programem Doxygen "
- "ze zdrojových textù";
- if (s) result+=(QCString)" projektu "+s;
- result+=".";
- return decode(result);
- }
-
- /*! put after an enum name in the list of all members */
- virtual QCString trEnumName()
- { return decode("jméno výètu"); }
-
- /*! put after an enum value in the list of all members */
- virtual QCString trEnumValue()
- { return decode("hodnota výètu"); }
-
- /*! put after an undocumented member in the list of all members */
- virtual QCString trDefinedIn()
- { return decode("definován v"); }
-
- // quick reference sections
-
- /*! This is put above each page as a link to the list of all groups of
- * compounds or files (see the \\group command).
- */
- virtual QCString trModules()
- { return decode("Moduly"); }
-
- /*! This is put above each page as a link to the class hierarchy */
- virtual QCString trClassHierarchy()
- { return decode("Hierarchie tøíd"); }
-
- /*! This is put above each page as a link to the list of annotated classes */
- virtual QCString trCompoundList()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode("Datové struktury");
- }
- else
- {
- return decode("Seznam tøíd");
- }
- }
-
- /*! This is put above each page as a link to the list of documented files */
- virtual QCString trFileList()
- { return decode("Seznam souborù"); }
-
- /*! This is put above each page as a link to all members of compounds. */
- virtual QCString trCompoundMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode("Datové položky");
- }
- else
- {
- return decode("Seznam èlenù tøíd");
- }
- }
-
- /*! This is put above each page as a link to all members of files. */
- virtual QCString trFileMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode("Globální symboly");
- }
- else
- {
- return decode("Symboly v souborech");
- }
- }
-
- /*! This is put above each page as a link to all related pages. */
- virtual QCString trRelatedPages()
- { return decode("Ostatní stránky"); }
-
- /*! This is put above each page as a link to all examples. */
- virtual QCString trExamples()
- { return decode("Pøíklady"); }
-
- /*! This is put above each page as a link to the search engine. */
- virtual QCString trSearch()
- { return decode("Hledat"); }
-
- /*! This is an introduction to the class hierarchy. */
- virtual QCString trClassHierarchyDescription()
- { return decode("Zde naleznete seznam, vyjadøující vztah dìdiènosti tøíd. "
- "Je seøazen pøibližnì (ale ne úplnì) podle abecedy:");
- }
-
- /*! This is an introduction to the list with all files. */
- virtual QCString trFileListDescription(bool extractAll)
- {
- QCString result="Zde naleznete seznam všech ";
- if (!extractAll) result+="dokumentovaných ";
- result+="souborù se struènými popisy:";
- return decode(result);
- }
-
- /*! This is an introduction to the annotated compound list. */
- virtual QCString trCompoundListDescription()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode("Následující seznam obsahuje identifikace datových "
- "struktur a jejich struèné popisy:");
- }
- else
- {
- return decode("Následující seznam obsahuje pøedevším identifikace "
- "tøíd, ale nacházejí se zde i další netriviální prvky, "
- "jako jsou struktury (struct), unie (union) a rozhraní "
- "(interface). V seznamu jsou uvedeny jejich struèné "
- "popisy:");
- }
- }
-
- /*! This is an introduction to the page with all class members. */
- virtual QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result= "Zde naleznete seznam všech ";
- if (!extractAll)
- {
- result += "dokumentovaných ";
- }
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result += "položek struktur (struct) a unií (union) ";
- }
- else
- {
- result += "èlenù tøíd ";
- }
-
- result += "s odkazy na ";
-
- if (extractAll)
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result += "dokumentaci struktur/unií, ke kterým pøíslušejí:";
- }
- else
- {
- result += "dokumentaci tøíd, ke kterým pøíslušejí:";
- }
- }
- else
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="struktury/unie, ke kterým pøíslušejí:";
- }
- else
- {
- result+="tøídy, ke kterým pøíslušejí:";
- }
- }
-
- return decode(result);
- }
-
- /*! This is an introduction to the page with all file members. */
- virtual QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="Zde naleznete seznam všech ";
- if (!extractAll) result+="dokumentovaných ";
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="funkcí, promìnných, maker, výètù a definic typù (typedef) "
- "s odkazy na ";
- }
- else
- {
- result+="symbolù, které jsou definovány na úrovni svých souborù. "
- "Pro každý symbol je uveden odkaz na ";
- }
-
- if (extractAll)
- result+="soubory, ke kterým pøíslušejí:";
- else
- result+="dokumentaci:";
-
- return decode(result);
- }
-
- /*! This is an introduction to the page with the list of all examples */
- virtual QCString trExamplesDescription()
- { return decode("Zde naleznete seznam všech pøíkladù:"); }
-
- /*! This is an introduction to the page with the list of related pages */
- virtual QCString trRelatedPagesDescription()
- { return decode("Následující seznam odkazuje na další stránky projektu:"); }
-
- /*! This is an introduction to the page with the list of class/file groups */
- virtual QCString trModulesDescription()
- { return decode("Zde naleznete seznam všech modulù:"); }
-
- // index titles (the project name is prepended for these)
-
-
- /*! This is used in HTML as the title of index.html. */
- virtual QCString trDocumentation()
- { return decode("Dokumentace"); }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all groups.
- */
- virtual QCString trModuleIndex()
- { return decode("Rejstøík modulù"); }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * class hierarchy.
- */
- virtual QCString trHierarchicalIndex()
- { return decode("Rejstøík hierarchie tøíd"); }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * annotated compound index.
- */
- virtual QCString trCompoundIndex()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode("Rejstøík datových struktur");
- }
- else
- {
- return decode("Rejstøík tøíd");
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * list of all files.
- */
- virtual QCString trFileIndex()
- { return decode("Rejstøík souborù"); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all groups.
- */
- virtual QCString trModuleDocumentation()
- { return decode("Dokumentace modulù"); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all classes, structs and unions.
- */
- virtual QCString trClassDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode("Dokumentace datových struktur");
- }
- else
- {
- return decode("Dokumentace tøíd");
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all files.
- */
- virtual QCString trFileDocumentation()
- { return decode("Dokumentace souborù"); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all examples.
- */
- virtual QCString trExampleDocumentation()
- { return decode("Dokumentace pøíkladù"); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all related pages.
- */
- virtual QCString trPageDocumentation()
- { return decode("Dokumentace souvisejících stránek"); }
-
- /*! This is used in LaTeX as the title of the document */
- virtual QCString trReferenceManual()
- { return decode("Referenèní pøíruèka"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of defines
- */
- virtual QCString trDefines()
- { return decode("Definice maker"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of function prototypes
- */
- virtual QCString trFuncProtos()
- { return decode("Prototypy"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of typedefs
- */
- virtual QCString trTypedefs()
- { return decode("Definice typù"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of enumerations
- */
- virtual QCString trEnumerations()
- { return decode("Výèty"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) functions
- */
- virtual QCString trFunctions()
- { return decode("Funkce"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trVariables()
- { return decode("Promìnné"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trEnumerationValues()
- { return decode("Hodnoty výètu"); }
-
- /*! This is used in the documentation of a file before the list of
- * documentation blocks for defines
- */
- virtual QCString trDefineDocumentation()
- { return decode("Dokumentace k definicím maker"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for function prototypes
- */
- virtual QCString trFunctionPrototypeDocumentation()
- { return decode("Dokumentace prototypù"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for typedefs
- */
- virtual QCString trTypedefDocumentation()
- { return decode("Dokumentace definic typù"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration types
- */
- virtual QCString trEnumerationTypeDocumentation()
- { return decode("Dokumentace výètových typù"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for functions
- */
- virtual QCString trFunctionDocumentation()
- { return decode("Dokumentace funkcí"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for variables
- */
- virtual QCString trVariableDocumentation()
- { return decode("Dokumentace promìnných"); }
-
- /*! This is used in the documentation of a file/namespace/group before
- * the list of links to documented compounds
- */
- virtual QCString trCompounds()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode("Datové struktry");
- }
- else
- {
- return decode("Tøídy");
- }
- }
-
- /*! 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)"Generováno "+date;
- if (projName) result+=(QCString)" pro projekt "+projName;
- result+=(QCString)" programem";
- return decode(result);
- }
- /*! This is part of the sentence used in the standard footer of each page.
- */
- virtual QCString trWrittenBy()
- {
- return decode(" -- autor ");
- }
-
- /*! this text is put before a class diagram */
- virtual QCString trClassDiagram(const char *clName)
- {
- return decode((QCString)"Diagram dìdiènosti pro tøídu "+clName);
- }
-
- /*! this text is generated when the \\internal command is used. */
- virtual QCString trForInternalUseOnly()
- { return decode("Pouze pro vnitøní použití."); }
-
- /*! this text is generated when the \\warning command is used. */
- virtual QCString trWarning()
- { return decode("Pozor"); }
-
- /*! this text is generated when the \\version command is used. */
- virtual QCString trVersion()
- { return decode("Verze"); }
-
- /*! this text is generated when the \\date command is used. */
- virtual QCString trDate()
- { return decode("Datum"); }
-
- /*! this text is generated when the \\return command is used. */
- virtual QCString trReturns()
- { return decode("Návratová hodnota"); }
-
- /*! this text is generated when the \\sa command is used. */
- virtual QCString trSeeAlso()
- { return decode("Viz také"); }
-
- /*! this text is generated when the \\param command is used. */
- virtual QCString trParameters()
- { return decode("Parametry"); }
-
- /*! this text is generated when the \\exception command is used. */
- virtual QCString trExceptions()
- { return decode("Výjimky"); }
-
- /*! this text is used in the title page of a LaTeX document. */
- virtual QCString trGeneratedBy()
- { return decode("Generováno programem"); }
-
- // new since 0.49-990307
-
- /*! used as the title of page containing all the index of all namespaces. */
- virtual QCString trNamespaceList()
- { return decode("Seznam prostorù jmen"); }
-
- /*! used as an introduction to the namespace list */
- virtual QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="Zde naleznete seznam všech ";
- if (!extractAll) result+="dokumentovaných ";
- result+="prostorù jmen se struèným popisem:";
- return decode(result);
- }
-
- /*! used in the class documentation as a header before the list of all
- * friends of a class
- */
- virtual QCString trFriends()
- { return decode("Friends"); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in the class documentation as a header before the list of all
- * related classes
- */
- virtual QCString trRelatedFunctionDocumentation()
- { return decode("Dokumentace k friends"); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of the HTML page of a class/struct/union */
- virtual QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- {
- QCString result("Dokumentace ");
- if (isTemplate) result+="šablony ";
- switch(compType)
- {
- case ClassDef::Class: result+="tøídy "; break;
- case ClassDef::Struct: result+="struktury "; break;
- case ClassDef::Union: result+="unie "; break;
- case ClassDef::Interface: result+="rozhraní "; break;
- case ClassDef::Protocol: result+="protocol "; break; // translate me!
- case ClassDef::Category: result+="category "; break; // translate me!
- case ClassDef::Exception: result+="výjimky "; break;
- }
- result+=clName;
- return decode(result);
- }
-
- /*! used as the title of the HTML page of a file */
- virtual QCString trFileReference(const char *fileName)
- {
- QCString result("Dokumentace souboru ");
- result+=fileName;
- return decode(result);
- }
-
- /*! used as the title of the HTML page of a namespace */
- virtual QCString trNamespaceReference(const char *namespaceName)
- {
- QCString result("Dokumentace prostoru jmen ");
- result+=namespaceName;
- return decode(result);
- }
-
- /*
- * these are for the member sections of a class, struct or union
- */
- virtual QCString trPublicMembers()
- { return decode("Veøejné metody"); }
- virtual QCString trPublicSlots()
- { return decode("Veøejné sloty"); }
- virtual QCString trSignals()
- { return decode("Signály"); }
- virtual QCString trStaticPublicMembers()
- { return decode("Statické veøejné metody"); }
- virtual QCString trProtectedMembers()
- { return decode("Chránìné metody"); }
- virtual QCString trProtectedSlots()
- { return decode("Chránìné sloty"); }
- virtual QCString trStaticProtectedMembers()
- { return decode("Statické chránìné metody"); }
- virtual QCString trPrivateMembers()
- { return decode("Privátní metody"); }
- virtual QCString trPrivateSlots()
- { return decode("Privátní sloty"); }
- virtual QCString trStaticPrivateMembers()
- { return decode("Statické privátní metody"); }
-
- /*! this function is used to produce a comma-separated list of items.
- * use generateMarker(i) to indicate where item i should be put.
- */
- virtual QCString trWriteList(int numEntries)
- {
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=" a ";
- }
- }
- return decode(result);
- }
-
- /*! used in class documentation to produce a list of base classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritsList(int numEntries)
- {
- QCString result("Dìdí z ");
- result += (numEntries == 1) ? "bázové tøídy " : "bázových tøíd ";
- result += trWriteList(numEntries)+".";
- return decode(result);
- }
-
- /*! used in class documentation to produce a list of super classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritedByList(int numEntries)
- {
- QCString result("Zdìdìna ");
- result += (numEntries == 1) ? "tøídou " : "tøídami ";
- result += trWriteList(numEntries)+".";
- return decode(result);
- }
-
- /*! used in member documentation blocks to produce a list of
- * members that are hidden by this one.
- */
- virtual QCString trReimplementedFromList(int numEntries)
- {
- QCString result("Reimplementuje stejnojmenný prvek z ");
- result += trWriteList(numEntries)+".";
- return decode(result);
- }
-
- /*! used in member documentation blocks to produce a list of
- * all member that overwrite the implementation of this member.
- */
- virtual QCString trReimplementedInList(int numEntries)
- {
- QCString result("Reimplementováno v ");
- result += trWriteList(numEntries)+".";
- return decode(result);
- }
-
- /*! This is put above each page as a link to all members of namespaces. */
- virtual QCString trNamespaceMembers()
- { return decode("Symboly v prostorech jmen"); }
-
- /*! This is an introduction to the page with all namespace members */
- virtual QCString trNamespaceMemberDescription(bool extractAll)
- {
- QCString result="Zde naleznete seznam všech ";
- if (!extractAll) result+="dokumentovaných ";
- result+="symbolù, které jsou definovány ve svých prostorech jmen. "
- "U každého je uveden odkaz na ";
- if (extractAll)
- result+="dokumentaci pøíslušného prostoru jmen:";
- else
- result+="pøíslušný prostor jmen:";
- return decode(result);
- }
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all namespaces.
- */
- virtual QCString trNamespaceIndex()
- { return decode("Rejstøík prostorù jmen"); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all namespaces.
- */
- virtual QCString trNamespaceDocumentation()
- { return decode("Dokumentace prostorù jmen"); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- virtual QCString trNamespaces()
- { return decode("Prostory jmen"); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990728
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is put at the bottom of a class documentation page and is
- * followed by a list of files that were used to generate the page.
- */
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)"Dokumentace pro ";
- switch(compType)
- {
- case ClassDef::Class: result+="tuto tøídu"; break;
- case ClassDef::Struct: result+="tuto strukturu (struct)"; break;
- case ClassDef::Union: result+="tuto unii (union)"; break;
- case ClassDef::Interface: result+="toto rozhraní"; break;
- case ClassDef::Protocol: result+="protocol "; break; // translate me!
- case ClassDef::Category: result+="category "; break; // translate me!
- case ClassDef::Exception: result+="tuto výjimku"; break;
- }
- result+=" byla generována z ";
- if (single) result+="následujícího souboru:";
- else result+="následujících souborù:";
- return decode(result);
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- virtual QCString trAlphabeticalList()
- { return decode("Rejstøík tøíd"); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- virtual QCString trReturnValues()
- { return decode("Vracené hodnoty"); }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- virtual QCString trMainPage()
- { return decode("Hlavní stránka"); }
-
- /*! This is used in references to page that are put in the LaTeX
- * documentation. It should be an abbreviation of the word page.
- */
- virtual QCString trPageAbbreviation()
- { return decode("s."); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991003
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDefinedAtLineInSourceFile()
- {
- return decode("Definice je uvedena na øádku @0 v souboru @1.");
- }
- virtual QCString trDefinedInSourceFile()
- {
- return decode("Definice v souboru @0.");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDeprecated()
- {
- return decode("Zastaralé");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- virtual QCString trCollaborationDiagram(const char *clName)
- {
- return decode((QCString)"Diagram tøíd pro "+clName+":");
- }
- /*! this text is put before an include dependency graph */
- virtual QCString trInclDepGraph(const char *fName)
- {
- return decode((QCString)"Graf závislostí na vkládaných souborech "
- "pro "+fName+":");
- }
- /*! header that is put before the list of constructor/destructors. */
- virtual QCString trConstructorDocumentation()
- {
- return decode("Dokumentace konstruktoru a destruktoru");
- }
- /*! Used in the file documentation to point to the corresponding sources. */
- virtual QCString trGotoSourceCode()
- {
- return decode("Zobrazit zdrojový text tohoto souboru.");
- }
- /*! Used in the file sources to point to the corresponding documentation. */
- virtual QCString trGotoDocumentation()
- {
- return decode("Zobrazit dokumentaci tohoto souboru.");
- }
- /*! Text for the \\pre command */
- virtual QCString trPrecondition()
- {
- return decode("Precondition");
- }
- /*! Text for the \\post command */
- virtual QCString trPostcondition()
- {
- return decode("Postcondition");
- }
- /*! Text for the \\invariant command */
- virtual QCString trInvariant()
- {
- return decode("Invariant");
- }
- /*! Text shown before a multi-line variable/enum initialization */
- virtual QCString trInitialValue()
- {
- return decode("Initializer:");
- }
- /*! Text used the source code in the file index */
- virtual QCString trCode()
- {
- return decode("zdrojový text");
- }
- virtual QCString trGraphicalHierarchy()
- {
- return decode("Grafické zobrazení hierarchie tøíd");
- }
- virtual QCString trGotoGraphicalHierarchy()
- {
- return decode("Zobrazit grafickou podobu hierarchie tøíd");
- }
- virtual QCString trGotoTextualHierarchy()
- {
- return decode("Zobrazit textovou podobu hierarchie tøíd");
- }
- virtual QCString trPageIndex()
- {
- return decode("Rejstøík stránek");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trNote()
- {
- return decode("Poznámka");
- }
- virtual QCString trPublicTypes()
- {
- return decode("Veøejné typy");
- }
- virtual QCString trPublicAttribs()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode("Datové položky");
- }
- else
- {
- return decode("Veøejné atributy");
- }
- }
- virtual QCString trStaticPublicAttribs()
- {
- return decode("Statické veøejné atributy");
- }
- virtual QCString trProtectedTypes()
- {
- return decode("Chránìné typy");
- }
- virtual QCString trProtectedAttribs()
- {
- return decode("Chránìné atributy");
- }
- virtual QCString trStaticProtectedAttribs()
- {
- return decode("Statické chránìné atributy");
- }
- virtual QCString trPrivateTypes()
- {
- return decode("Privátní typy");
- }
- virtual QCString trPrivateAttribs()
- {
- return decode("Privátní atributy");
- }
- virtual QCString trStaticPrivateAttribs()
- {
- return decode("Statické privátní atributy");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a todo item */
- virtual QCString trTodo()
- {
- return decode("Plánované úpravy");
- }
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- {
- return decode("Seznam plánovaných úprav");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy()
- {
- return decode("Používá se v");
- }
- virtual QCString trRemarks()
- {
- return decode("Poznámky"); // ??? not checked in a context
- }
- virtual QCString trAttention()
- {
- return decode("Upozornìní"); // ??? not checked in a context
- }
- virtual QCString trInclByDepGraph()
- {
- return decode("Následující graf ukazuje, které soubory pøímo nebo "
- "nepøímo vkládají tento soubor:");
- }
- virtual QCString trSince()
- {
- return decode("Od"); // ??? not checked in a context
- }
-
-////////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- virtual QCString trLegendTitle()
- {
- return decode("Vysvìtlivky ke grafu");
- }
- /*! page explaining how the dot graph's should be interpreted */
- virtual QCString trLegendDocs()
- {
- QCString result(
- "Zde naleznete vysvìtlení, jak mají být interpretovány grafy, "
- "které byly generovány programem doxygen.<p>\n"
- "Uvažujte následující pøíklad:\n"
- "\\code\n"
- "/*! Neviditelná tøída, která se v grafu nezobrazuje, protože "
- "došlo k oøezání grafu. */\n"
- "class Invisible { };\n\n"
- "/*! Tøída, u které došlo k oøezání grafu. Vztah dìdiènosti "
- "je skryt. */\n"
- "class Truncated : public Invisible { };\n\n"
- "/*! Bázová tøída dìdìná veøejnì (public inheritance). */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! Bázová tøída, použitá pro chránìné dìdìní "
- "(protected inheritance). */\n"
- "class ProtectedBase { };\n\n"
- "/*! Bázová tøída, využitá pro privátní dìdìní "
- "(private inheritance). */\n"
- "class PrivateBase { };\n\n"
- "/* Tøída, která není dokumentována komentáøi programu doxygen. */\n"
- "class Undocumented { };\n\n"
- "/*! Šablona tøídy. */\n"
- "template<class T> class Templ { };\n\n"
- "/*! Tøída, která je využívána tøídou Inherited. */\n"
- "class Used { };\n\n"
- "/*! Odvozená tøída, která rùzným zpùsobem dìdí z více bázových "
- "tøíd. */\n"
- "class Inherited : public PublicBase,\n"
- " protected ProtectedBase,\n"
- " private PrivateBase,\n"
- " public Undocumented,\n"
- " public Templ<int>\n"
- "{\n"
- " private:\n"
- " Used *m_usedClass;\n"
- "};\n"
- "\\endcode\n"
- "Pokud je položka \\c MAX_DOT_GRAPH_HEIGHT konfiguraèního souboru "
- "nastavena na hodnotu 200, bude vygenerován následující graf:"
- "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
- "Bloky (tj. uzly) v uvedeném grafu mají následující význam:\n"
- "<ul>\n"
- "<li>Èernì vyplnìný obdélník reprezentuje strukturu nebo tøídu, "
- "pro kterou byl graf generován.\n"
- "<li>Obdélník s èerným obrysem oznaèuje dokumentovanou "
- "strukturu nebo tøídu.\n"
- "<li>Obdélník s šedým obrysem oznaèuje nedokumentovanou "
- "strukturu nebo tøídu.\n"
- "<li>Obdélník s èerveným obrysem oznaèuje dokumentovanou "
- "strukturu nebo tøídu, pro kterou\n"
- "nejsou zobrazeny všechny vztahy dìdiènosti nebo obsažení. "
- "Graf je oøezán v pøípadì, kdy jej\n"
- "není možné umístit do vymezeného prostoru.\n"
- "</ul>\n"
- "Šipky (tj. hrany grafu) mají následující význam:\n"
- "<ul>\n"
- "<li>Tmavì modrá šipka se používá pro oznaèení vztahu veøejné "
- "dìdiènosti (public) mezi dvìma tøídami.\n"
- "<li>Tmavì zelená šipka oznaèuje vztah chránìné dìdiènosti "
- "(protected).\n"
- "<li>Tmavì èervená šipka oznaèuje vztah privátní dìdiènosti "
- "(private).\n"
- "<li>Purpurová šipka kreslená èárkovanì se používá v pøípadì, "
- "kdy je tøída obsažena v jiné tøídì,\n"
- "nebo kdy je používána jinou tøídou. Je oznaèena identifikátorem "
- "jedné nebo více promìných, pøes které\n"
- "je tøída nebo struktura zpøístupnìna.\n"
- "<li>Žlutá šipka kreslená èárkovanì vyjadøuje vztah mezi instancí šablony "
- "a šablonou tøídy, na základì které byla\n"
- "instance šablony vytvoøena. V popisu šipky jsou uvedeny pøíslušné"
- " parametry šablony.\n"
- "</ul>\n");
-
- return decode(result);
- }
- /*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return decode("vysvìtlivky");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return decode("Test");
- }
-
- /*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return decode("Seznam testù");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return decode("Metody DCOP");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return decode("Vlastnosti");
- }
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return decode("Dokumentace k vlastnosti");
- }
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- return decode("Tøídy");
- }
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
- {
- return decode((QCString)"Balík "+name);
- }
- /*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return decode("Seznam balíkù");
- }
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return decode("Zde naleznete seznam balíkù se struèným popisem "
- "(pokud byl uveden):");
- }
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return decode("Balíky");
- }
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return decode("Hodnota:");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return decode("Chyba");
- }
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return decode("Seznam chyb");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6-20010422
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as ansicpg for RTF file */
- virtual QCString trRTFansicp()
- {
- return "1250";
- }
-
- /*! Used as ansicpg for RTF fcharset */
- virtual QCString trRTFCharSet()
- {
- return "238";
- }
-
- /*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return decode("Rejstøík");
- }
-
- /*! 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 ? "Tøíd" : "tøíd"));
- result+=(singular ? "a" : "y");
- return decode(result);
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trFile(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Soubor" : "soubor"));
- if (!singular) result+="y";
- return decode(result);
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trNamespace(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Prostor" : "prostor"));
- if (!singular) result+="y";
- result+=" jmen";
- return decode(result);
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trGroup(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Skupin" : "skupin"));
- result+=(singular ? "a" : "y");
- return decode(result);
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trPage(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Stránk" : "stránk"));
- result+=(singular ? "a" : "y");
- return decode(result);
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trMember(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Èlen" : "èlen"));
- if (!singular) result+="y";
- return decode(result);
- }
-
- /*! ??? Jak to prelozit? Bylo by dobre, kdyby se ozval nekdo,
- * kdo to pouziva.
- */
- virtual QCString trGlobal(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Global" : "global"));
- if (!singular) result+="s";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is generated when the \\author command is used and
- * for the author section in man pages. */
- virtual QCString trAuthor(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Auto" : "auto"));
- result += (singular) ? "r" : "øi";
- return decode(result);
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return decode("Odkazuje se na");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Implementuje "+trWriteList(numEntries)+".";
- }
-
- /*! used in member documentation blocks to produce a list of
- * all members that implement this member.
- */
- virtual QCString trImplementedInList(int numEntries)
- {
- return decode("Implementováno v "+trWriteList(numEntries)+".");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.16
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in RTF documentation as a heading for the Table
- * of Contents.
- */
- virtual QCString trRTFTableOfContents()
- {
- return decode("Obsah");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.17
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as the header of the list of item that have been
- * flagged deprecated
- */
- virtual QCString trDeprecatedList()
- {
- return decode("Seznam zastaralých prvkù");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.18
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a header for declaration section of the events found in
- * a C# program
- */
- virtual QCString trEvents()
- {
- return decode("Události");
- }
- /*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- return decode("Dokumentace událostí");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a heading for a list of Java class types with package scope.
- */
- virtual QCString trPackageTypes()
- {
- return decode("Typy v balíku");
- }
- /*! Used as a heading for a list of Java class functions with package
- * scope.
- */
- virtual QCString trPackageMembers()
- {
- return decode("Funkce v balíku");
- }
- /*! Used as a heading for a list of static Java class functions with
- * package scope.
- */
- virtual QCString trStaticPackageMembers()
- {
- return decode("Statické funkce v balíku");
- }
- /*! Used as a heading for a list of Java class variables with package
- * scope.
- */
- virtual QCString trPackageAttribs()
- {
- return decode("Atributy balíku");
- }
- /*! Used as a heading for a list of static Java class variables with
- * package scope.
- */
- virtual QCString trStaticPackageAttribs()
- {
- return decode("Statické atributy balíku");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 decode("Vše");
- }
- /*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- return decode("Graf volání pro tuto funkci:");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! When the search engine is enabled this text is put in the index
- * of each page before the search field.
- */
- virtual QCString trSearchForIndex()
- {
- return decode("Vyhledat");
- }
- /*! This string is used as the title for the page listing the search
- * results.
- */
- virtual QCString trSearchResultsTitle()
- {
- return decode("Výsledky vyhledávání");
- }
- /*! 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
- * the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
- * value 2 represents 2 or more matches. HTML markup is allowed inside
- * the returned string.
- */
- virtual QCString trSearchResults(int numDocuments)
- {
- if (numDocuments==0)
- {
- return decode("Lituji. Vašemu dotazu neodpovídá žádný dokument.");
- }
- else if (numDocuments==1)
- {
- return decode("Nalezen jediný dokument, který vyhovuje vašemu dotazu.");
- }
- else
- {
- return decode("Nalezeno <b>$num</b> dokumentù, které vyhovují vašemu "
- "dotazu. Nejlépe odpovídající dokumenty jsou zobrazeny "
- "jako první.");
- }
- }
- /*! 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 decode("Nalezená slova:");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 decode("Zdrojový soubor ") + filename;
- }
-
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.9
-//////////////////////////////////////////////////////////////////////////
-
-
- /*! This is used as the name of the chapter containing the directory
- * hierarchy.
- */
- virtual QCString trDirIndex()
- { return decode("Hierarchie adresáøù"); }
-
- /*! This is used as the name of the chapter containing the documentation
- * of the directories.
- */
- virtual QCString trDirDocumentation()
- { return decode("Dokumentace k adresáøùm"); }
-
- /*! 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 decode("Adresáøe"); }
-
- /*! This returns a sentences that introduces the directory hierarchy.
- * and the fact that it is sorted alphabetically per level
- */
- virtual QCString trDirDescription()
- {
- return decode("Následující hierarchie adresáøù je zhruba, "
- "ale ne úplnì, øazena podle abecedy:");
- }
-
- /*! 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 = "Reference k adresáøi ";
- result += dirName;
- return decode(result);
- }
-
- /*! 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 ? "Adresáø" : "adresáø"));
- if ( ! singular)
- result += "e";
- return decode(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 decode("Jde o pøetíženou (overloaded) metodu, "
- "která má usnadnit používání. Od výše uvedené metody se liší "
- "pouze jinak zadávanými argumenty.");
- }
-};
-
-#endif // TRANSLATOR_CZ_H
diff --git a/src/translator_de.h b/src/translator_de.h
deleted file mode 100644
index 7eccaf4..0000000
--- a/src/translator_de.h
+++ /dev/null
@@ -1,1648 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- * The translation into German was provided by
- * Jens Seidel (jensseidel@users.sf.net)
- * based on work from
- * Jens Breitenstein (Jens.Breitenstein@tlc.de)
- */
-
-// Updates:
-// --------
-// RK (who are you?)
-// - Update for "new since 1.1.3" version
-//
-// 2001/03/23 Jens Seidel (jensseidel@users.sourceforge.net)
-// - fixed typos
-// - changed trPageDocumentation() "Seitenbeschreibung" to
-// "Zusätzliche Informationen"
-// - removed old trGeneratedFrom()
-// - changed "/*!" to "/*" (documentation is inherited from translator_en.h
-// (INHERIT_DOCS = YES), there's no need to make changes twice)
-// - Update for "new since 1.2.4" version
-//
-// 2001/04/17 Jens Seidel (jensseidel@users.sourceforge.net)
-// - fixed typos ("Vererbunsbeziehung", "gesch&uumltzter")
-// - use umlauts instead of html code ("&auml;",...)
-// this makes it easier to read and fixes three problems (two in
-// \code segment)
-//
-// 2001/04/23 Jens Seidel (jensseidel@users.sourceforge.net)
-// - Update for "new since 1.2.6-20010422" version
-//
-// 2001/05/06 Jens Seidel (jensseidel@users.sourceforge.net)
-// - Update for "new since 1.2.7" version
-// - Removed implementation of latexBabelPackage(), trVerbatimText(),
-// trFiles(), added latexLanguageSupportCommand().
-//
-// 2001/05/25 Jens Seidel (jensseidel@users.sourceforge.net)
-// - Update for "new since 1.2.7-20010524" version:
-// removed trAuthors(), trAuthor(), added trAuthor(bool, bool)
-//
-// 2001/07/24 Jens Seidel (jensseidel@users.sourceforge.net)
-// - trClassDocumentation() updated as in the English translator.
-//
-// 2001/11/30 Oliver Brandt (o.brandt@tu-bs.de) and
-// Jens Seidel (jensseidel@users.sourceforge.net)
-// - trReferences() implemented.
-// - trCompoundReference(), trLegendDocs() updated
-// - Removed some TODO's
-//
-// 2001/02/13 Oliver Brandt (o.brandt@tu-bs.de)
-// - Updated for "new since 1.2.13" version
-// - Removed some TODO's
-//
-// 2002/07/08 Oliver Brandt (o.brandt@tu-bs.de)
-// - Updated for "new since 1.2.16" version
-//
-// 2002/11/25 Jens Seidel (jensseidel@users.sourceforge.net)
-// - sync with english version 1.3
-// - TranslatorGerman doesn't inherit from TranslatorEnglish anymore,
-// so I changed "/* " back to "/*! " as in the english file
-// - use ngerman instead of german package in LaTeX
-// - changed "Datenelemente" to "Methoden" in
-// tr{,Static}{Public,Protected,Private}Members
-//
-// 2003/04/28 Jens Seidel (jensseidel@users.sourceforge.net)
-// - Updated for "new since 1.3" version
-// - translated Java package to Paket
-//
-// 2003/09/11 Jens Seidel (jensseidel@users.sourceforge.net)
-// - Updated for "new since 1.3.1" version
-//
-// 2003/09/24 Jens Seidel (jensseidel@users.sourceforge.net)
-// - Updated a few strings which changed in CVS revision 1.22
-// ("compound" vs. "class")
-//
-// 2004/08/01 Jens Seidel (jensseidel@users.sourceforge.net)
-// - Updated for "new since 1.3.8" version
-//
-// 2004/09/19 Jens Seidel (jensseidel@users.sourceforge.net)
-// - Updated for "new since 1.3.9" version
-//
-// 2004/09/25 Jens Seidel (jensseidel@users.sourceforge.net)
-// - changed "Typendefinitionen" to "Typdefinitionen" in
-// trFileMembersDescription() and trTypedefs()
-// - added a dash after (file, ...) names and in front of description
-// - changed "Eigenschaften" to "Propertys" (yeah, not ..."ies")
-//
-// 2005/03/20 Jens Seidel (jensseidel@users.sourceforge.net)
-// - Updated for "new since 1.4.1" version
-//
-// 2005/04/09 Jens Seidel (jensseidel@users.sourceforge.net)
-// - Changed Todo list translation as suggested in
-// http://bugzilla.gnome.org/show_bug.cgi?id=172818
-//
-// 2005/05/09 Jens Seidel (jensseidel@users.sourceforge.net)
-// - Updated for "new since 1.4.3" version (removed unused methods)
-//
-// Todo:
-// - see FIXME
-
-#ifndef TRANSLATOR_DE_H
-#define TRANSLATOR_DE_H
-
-class TranslatorGerman : public Translator
-{
- public:
-
- // --- Language control methods -------------------
-
- /*! Used for identification of the language. The identification
- * should not be translated. It should be replaced by the name
- * of the language in English using lower-case characters only
- * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
- * the identification used in language.cpp.
- */
- virtual QCString idLanguage()
- { return "german"; }
-
- /*! Used to get the LaTeX command(s) for the language support. This method
- * was designed for languages which do wish to use a babel package.
- */
- virtual QCString latexLanguageSupportCommand()
- {
- QCString result="\\usepackage{ngerman}\n";
- result+="\\usepackage[latin1]{inputenc}\n";
- //result+="%\\usepackage[latin1]{inputenc}% Kodierung (cp850,latin1,ansinew)\n";
- return result;
- }
-
- /*! return the language charset. This will be used for the HTML output */
- virtual QCString idLanguageCharset()
- {
- return "iso-8859-1";
- }
-
- // --- Language translation methods -------------------
-
- /*! used in the compound documentation before a list of related functions. */
- virtual QCString trRelatedFunctions()
- { return "Verwandte Funktionen"; }
-
- /*! subscript for the related functions. */
- virtual QCString trRelatedSubscript()
- { return "(Es handelt sich hierbei nicht um Elementfunktionen.)"; }
-
- /*! header that is put before the detailed description of files, classes and namespaces. */
- virtual QCString trDetailedDescription()
- { return "Ausführliche Beschreibung"; }
-
- /*! header that is put before the list of typedefs. */
- virtual QCString trMemberTypedefDocumentation()
- { return "Dokumentation der benutzerdefinierten Datentypen"; }
-
- /*! header that is put before the list of enumerations. */
- virtual QCString trMemberEnumerationDocumentation()
- { return "Dokumentation der Aufzählungstypen"; }
-
- /*! header that is put before the list of member functions. */
- virtual QCString trMemberFunctionDocumentation()
- { return "Dokumentation der Elementfunktionen"; }
-
- /*! header that is put before the list of member attributes. */
- virtual QCString trMemberDataDocumentation()
- { /* No difference if "OPTIMIZE_OUTPUT_FOR_C" is set! */
- return "Dokumentation der Datenelemente";
- }
-
- /*! this is the text of a link put after brief descriptions. */
- virtual QCString trMore()
- { return "Mehr ..."; }
-
- /*! put in the class documentation */
- virtual QCString trListOfAllMembers()
- { return "Aufstellung aller Elemente"; }
-
- /*! used as the title of the "list of all members" page of a class */
- virtual QCString trMemberList()
- { return "Elementverzeichnis"; }
-
- /*! this is the first part of a sentence that is followed by a class name */
- virtual QCString trThisIsTheListOfAllMembers()
- { return "Vollständige Aufstellung aller Elemente für "; }
-
- /*! this is the remainder of the sentence after the class name */
- virtual QCString trIncludingInheritedMembers()
- { return " einschließlich aller geerbten Elemente."; }
-
- /*! 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="Automatisch erzeugt von Doxygen";
- if (s) result+=(QCString)" für "+s;
- result+=" aus dem Quellcode.";
- return result;
- }
-
- /*! put after an enum name in the list of all members */
- virtual QCString trEnumName()
- { return "enum Bezeichner"; }
-
- /*! put after an enum value in the list of all members */
- virtual QCString trEnumValue()
- { return "enum Wert"; }
-
- /*! put after an undocumented member in the list of all members */
- virtual QCString trDefinedIn()
- { return "Definiert in"; }
-
- // 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 "Module"; }
-
- /*! This is put above each page as a link to the class hierarchy */
- virtual QCString trClassHierarchy()
- { return "Klassenhierarchie"; }
-
- /*! This is put above each page as a link to the list of annotated classes */
- virtual QCString trCompoundList()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Datenstrukturen";
- }
- else
- {
- return "Auflistung der Klassen";
- }
- }
-
- /*! This is put above each page as a link to the list of documented files */
- virtual QCString trFileList()
- { return "Auflistung der Dateien"; }
-
- /*! This is put above each page as a link to all members of compounds. */
- virtual QCString trCompoundMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Datenstruktur-Elemente";
- }
- else
- {
- return "Klassen-Elemente";
- }
- }
-
- /*! This is put above each page as a link to all members of files. */
- virtual QCString trFileMembers()
- /* No difference if "OPTIMIZE_OUTPUT_FOR_C" is set! */
- { return "Datei-Elemente"; }
-
- /*! This is put above each page as a link to all related pages. */
- virtual QCString trRelatedPages()
- { return "Zusätzliche Informationen"; }
-
- /*! This is put above each page as a link to all examples. */
- virtual QCString trExamples()
- { return "Beispiele"; }
-
- /*! This is put above each page as a link to the search engine. */
- virtual QCString trSearch()
- { return "Suchen"; }
-
- /*! This is an introduction to the class hierarchy. */
- virtual QCString trClassHierarchyDescription()
- { return "Die Liste der Ableitungen ist -mit Einschränkungen- "
- "alphabetisch sortiert:";
- }
-
- /*! This is an introduction to the list with all files. */
- virtual QCString trFileListDescription(bool extractAll)
- {
- QCString result="Hier folgt die Aufzählung aller ";
- if (!extractAll) result+="dokumentierten ";
- result+="Dateien mit einer Kurzbeschreibung:";
- return result;
- }
-
- /*! This is an introduction to the annotated compound list. */
- virtual QCString trCompoundListDescription()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Hier folgt die Aufzählung aller Datenstrukturen "
- "mit einer Kurzbeschreibung:";
- }
- else
- {
- return "Hier folgt die Aufzählung aller Klassen, Strukturen, "
- "Varianten und Schnittstellen mit einer Kurzbeschreibung:";
- }
- }
-
- /*! This is an introduction to the page with all class members. */
- virtual QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result="Hier folgt die Aufzählung aller ";
- if (!extractAll)
- {
- result+="dokumentierten ";
- }
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="Strukturen und Varianten";
- }
- else
- {
- result+="Klassenelemente";
- }
- result+=" mit Verweisen auf ";
- if (!extractAll)
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="die Dokumentation zu jedem Element:";
- }
- else
- {
- result+="die Klassendokumentation zu jedem Element:";
- }
- }
- else
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="die zugehörigen Elemente:";
- }
- else
- {
- result+="die zugehörigen Klassen:";
- }
- }
- return result;
- }
-
- /*! This is an introduction to the page with all file members. */
- virtual QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="Hier folgt die Aufzählung aller ";
- if (!extractAll) result+="dokumentierten ";
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="Funktionen, Variablen, Makros, Aufzählungen und Typdefinitionen";
- }
- else
- {
- result+="Dateielemente";
- }
- result+=" mit Verweisen auf ";
- if (extractAll)
- result+="die Dokumentation zu jedem Element:";
- else
- result+="die zugehörigen Dateien:";
- return result;
- }
-
- /*! This is an introduction to the page with the list of all examples */
- virtual QCString trExamplesDescription()
- { return "Hier folgt eine Liste mit allen Beispielen:"; }
-
- /*! This is an introduction to the page with the list of related pages */
- virtual QCString trRelatedPagesDescription()
- { return "Hier folgt eine Liste mit zusammengehörigen Themengebieten:"; }
-
- /*! This is an introduction to the page with the list of class/file groups */
- virtual QCString trModulesDescription()
- { return "Hier folgt die Aufzählung aller Module:"; }
-
- // index titles (the project name is prepended for these)
-
- /*! This is used in HTML as the title of index.html. */
- virtual QCString trDocumentation()
- { return "Dokumentation"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all groups.
- */
- virtual QCString trModuleIndex()
- { return "Modul-Verzeichnis"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * class hierarchy.
- */
- virtual QCString trHierarchicalIndex()
- { return "Hierarchie-Verzeichnis"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * annotated compound index.
- */
- virtual QCString trCompoundIndex()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- return "Datenstruktur-Verzeichnis";
- else
- return "Klassen-Verzeichnis";
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * list of all files.
- */
- virtual QCString trFileIndex()
- { return "Datei-Verzeichnis"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all groups.
- */
- virtual QCString trModuleDocumentation()
- { return "Modul-Dokumentation"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all classes, structs and unions.
- */
- virtual QCString trClassDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Datenstruktur-Dokumentation";
- }
- else
- {
- return "Klassen-Dokumentation";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all files.
- */
- virtual QCString trFileDocumentation()
- { return "Datei-Dokumentation"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all examples.
- */
- virtual QCString trExampleDocumentation()
- { return "Dokumentation der Beispiele"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all related pages.
- */
- virtual QCString trPageDocumentation()
- { return "Zusätzliche Informationen"; }
-
- /*! This is used in LaTeX as the title of the document */
- virtual QCString trReferenceManual()
- { return "Nachschlagewerk"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of defines
- */
- virtual QCString trDefines()
- { return "Makrodefinitionen"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of function prototypes
- */
- virtual QCString trFuncProtos()
- { return "Funktionsprototypen"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of typedefs
- */
- virtual QCString trTypedefs()
- { return "Typdefinitionen"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of enumerations
- */
- virtual QCString trEnumerations()
- { return "Aufzählungen"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) functions
- */
- virtual QCString trFunctions()
- { return "Funktionen"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trVariables()
- { return "Variablen"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trEnumerationValues()
- { return "Aufzählungswerte"; }
-
- /*! This is used in the documentation of a file before the list of
- * documentation blocks for defines
- */
- virtual QCString trDefineDocumentation()
- { return "Makro-Dokumentation"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for function prototypes
- */
- virtual QCString trFunctionPrototypeDocumentation()
- { return "Funktionsprototypen Dokumentation"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for typedefs
- */
- virtual QCString trTypedefDocumentation()
- { return "Dokumentation der benutzerdefinierten Typen"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration types
- */
- virtual QCString trEnumerationTypeDocumentation()
- { return "Dokumentation der Aufzählungstypen"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for functions
- */
- virtual QCString trFunctionDocumentation()
- { return "Dokumentation der Funktionen"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for variables
- */
- virtual QCString trVariableDocumentation()
- { return "Variablen-Dokumentation"; }
-
- /*! This is used in the documentation of a file/namespace/group before
- * the list of links to documented compounds
- */
- virtual QCString trCompounds()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Datenstrukturen";
- }
- else
- {
- return "Klassen";
- }
- }
-
- /*! 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)"Erzeugt am "+date;
- if (projName) result+=(QCString)" für "+projName;
- result+=(QCString)" von";
- return result;
- }
-
- /*! This is part of the sentence used in the standard footer of each page.
- */
- virtual QCString trWrittenBy()
- {
- return "geschrieben von";
- }
-
- /*! this text is put before a class diagram */
- virtual QCString trClassDiagram(const char *clName)
- {
- return (QCString)"Klassendiagramm für "+clName+":";
- }
-
- /*! this text is generated when the \\internal command is used. */
- virtual QCString trForInternalUseOnly()
- { return "Nur für den internen Gebrauch."; }
-
- /*! this text is generated when the \\warning command is used. */
- virtual QCString trWarning()
- { return "Warnung"; }
-
- /*! this text is generated when the \\version command is used. */
- virtual QCString trVersion()
- { return "Version"; }
-
- /*! this text is generated when the \\date command is used. */
- virtual QCString trDate()
- { return "Datum"; }
-
- /*! this text is generated when the \\return command is used. */
- virtual QCString trReturns()
- { return "Rückgabe"; }
-
- /*! this text is generated when the \\sa command is used. */
- virtual QCString trSeeAlso()
- { return "Siehe auch"; }
-
- /*! this text is generated when the \\param command is used. */
- virtual QCString trParameters()
- { return "Parameter"; }
-
- /*! this text is generated when the \\exception command is used. */
- virtual QCString trExceptions()
- { return "Ausnahmebehandlung"; }
-
- /*! this text is used in the title page of a LaTeX document. */
- virtual QCString trGeneratedBy()
- { return "Erzeugt von"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of page containing all the index of all namespaces. */
- virtual QCString trNamespaceList()
- { return "Liste aller Namensbereiche"; }
-
- /*! used as an introduction to the namespace list */
- virtual QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="Liste aller ";
- if (!extractAll) result+="dokumentierten ";
- result+="Namensbereiche mit Kurzbeschreibung:";
- return result;
- }
-
- /*! used in the class documentation as a header before the list of all
- * friends of a class
- */
- virtual QCString trFriends()
- { return "Freundbeziehungen"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in the class documentation as a header before the list of all
- * related classes
- */
- virtual QCString trRelatedFunctionDocumentation()
- { return "Freundbeziehungen und Funktionsdokumentation"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of the HTML page of a class/struct/union */
- virtual QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- {
- QCString result=(QCString)clName+" ";
- if (isTemplate) result+="Template ";
- switch(compType)
- {
- case ClassDef::Class: result+="Klassen"; break;
- case ClassDef::Struct: result+="Struktur"; break;
- case ClassDef::Union: result+="Varianten"; break;
- case ClassDef::Interface: result+="Schnittstellen"; break;
- case ClassDef::Protocol: result+="Protocol"; break; // translate me!
- case ClassDef::Category: result+="Category"; break; // translate me!
- case ClassDef::Exception: result+="Ausnahmen"; break;
- }
- result+="referenz";
- return result;
- }
-
- /*! used as the title of the HTML page of a file */
- virtual QCString trFileReference(const char *fileName)
- {
- QCString result=fileName;
- result+="-Dateireferenz";
- return result;
- }
-
- /*! used as the title of the HTML page of a namespace */
- virtual QCString trNamespaceReference(const char *namespaceName)
- {
- QCString result=namespaceName;
- result+="-Namensbereichsreferenz";
- return result;
- }
-
- virtual QCString trPublicMembers()
- { return "Öffentliche Methoden"; }
-
- virtual QCString trPublicSlots()
- { return "Öffentliche Slots"; }
-
- virtual QCString trSignals()
- { return "Signale"; }
-
- virtual QCString trStaticPublicMembers()
- { return "Öffentliche, statische Methoden"; }
-
- virtual QCString trProtectedMembers()
- { return "Geschützte Methoden"; }
-
- virtual QCString trProtectedSlots()
- { return "Geschützte Slots"; }
-
- virtual QCString trStaticProtectedMembers()
- { return "Geschützte, statische Methoden"; }
-
- virtual QCString trPrivateMembers()
- { return "Private Methoden"; }
-
- virtual QCString trPrivateSlots()
- { return "Private Slots"; }
-
- virtual QCString trStaticPrivateMembers()
- { return "Private, statische Methoden"; }
-
- /*! this function is used to produce a comma-separated list of items.
- * use generateMarker(i) to indicate where item i should be put.
- */
- virtual QCString trWriteList(int numEntries)
- {
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=" und ";
- }
- }
- return result;
- }
-
- /*! used in class documentation to produce a list of base classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritsList(int numEntries)
- {
- return "Abgeleitet von "+trWriteList(numEntries)+".";
- }
-
- /*! used in class documentation to produce a list of super classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritedByList(int numEntries)
- {
- return "Basisklasse für "+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 "Erneute Implementation von "+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 "Erneute Implementation in "+trWriteList(numEntries)+".";
- }
-
- /*! This is put above each page as a link to all members of namespaces. */
- virtual QCString trNamespaceMembers()
- { return "Elemente eines Namensbereiches"; }
-
- /*! This is an introduction to the page with all namespace members */
- virtual QCString trNamespaceMemberDescription(bool extractAll)
- {
- QCString result="Hier folgt die Aufzählung aller ";
- if (!extractAll) result+="dokumentierten ";
- result+="Namensbereichselemente mit Verweisen auf ";
- if (extractAll)
- result+="die Namensbereichsdokumentation für jedes Element:";
- else
- result+="die zugehörigen Dateien:";
- return result;
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all namespaces.
- */
- virtual QCString trNamespaceIndex()
- { return "Verzeichnis der Namensbereiche"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all namespaces.
- */
- virtual QCString trNamespaceDocumentation()
- { return "Dokumentation der Namensbereiche"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- virtual QCString trNamespaces()
- { return "Namensbereiche"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990728
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is put at the bottom of a class documentation page and is
- * followed by a list of files that were used to generate the page.
- */
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)"Die Dokumentation für diese";
- switch(compType)
- {
- case ClassDef::Class: result+=" Klasse"; break;
- case ClassDef::Struct: result+=" Struktur"; break;
- case ClassDef::Union: result+=" Variante"; break;
- case ClassDef::Interface: result+=" Schnittstelle"; break;
- case ClassDef::Protocol: result+=" Protocol"; break; // translate me!
- case ClassDef::Category: result+=" Category"; break; // translate me!
- case ClassDef::Exception: result+=" Ausnahme"; break;
- }
- result+=" wurde erzeugt aufgrund der Datei";
- if (single) result+=":"; else result+="en:";
- return result;
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- virtual QCString trAlphabeticalList()
- { return "Alphabetische Liste"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- virtual QCString trReturnValues()
- { return "Rückgabewerte"; }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- virtual QCString trMainPage()
- { return "Hauptseite"; }
-
- /*! 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 "S."; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991003
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDefinedAtLineInSourceFile()
- {
- return "Definiert in Zeile @0 der Datei @1.";
- }
-
- virtual QCString trDefinedInSourceFile()
- {
- return "Definiert in Datei @0.";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDeprecated()
- {
- return "Veraltet";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- virtual QCString trCollaborationDiagram(const char *clName)
- {
- return (QCString)"Zusammengehörigkeiten von "+clName+":";
- }
-
- /*! this text is put before an include dependency graph */
- virtual QCString trInclDepGraph(const char *fName)
- {
- return (QCString)"Include-Abhängigkeitsdiagramm für "+fName+":";
- }
-
- /*! header that is put before the list of constructor/destructors. */
- virtual QCString trConstructorDocumentation()
- {
- return "Beschreibung der Konstruktoren und Destruktoren";
- }
-
- /*! Used in the file documentation to point to the corresponding sources. */
- virtual QCString trGotoSourceCode()
- {
- return "gehe zum Quellcode dieser Datei";
- }
-
- /*! Used in the file sources to point to the corresponding documentation. */
- virtual QCString trGotoDocumentation()
- {
- return "gehe zur Dokumentation dieser Datei";
- }
-
- /*! Text for the \\pre command */
- virtual QCString trPrecondition()
- {
- return "Vorbedingung";
- }
-
- /*! Text for the \\post command */
- virtual QCString trPostcondition()
- {
- return "Nachbedingung";
- }
-
- /*! Text for the \\invariant command */
- virtual QCString trInvariant()
- {
- return "Invariant";
- }
-
- /*! Text shown before a multi-line variable/enum initialization */
- virtual QCString trInitialValue()
- {
- return "Initialisierung:";
- }
-
- /*! Text used the source code in the file index */
- virtual QCString trCode()
- {
- return "code";
- }
-
- virtual QCString trGraphicalHierarchy()
- {
- return "Grafische Darstellung der Klassenhierarchie";
- }
-
- virtual QCString trGotoGraphicalHierarchy()
- {
- return "gehe zur grafischen Darstellung der Klassenhierarchie";
- }
-
- virtual QCString trGotoTextualHierarchy()
- {
- return "gehe zur textbasierten Darstellung der Klassenhierarchie";
- }
-
- virtual QCString trPageIndex()
- {
- return "Seitenindex";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- //RK: had to change here because of the new command \remark
- virtual QCString trNote()
- {
- return "Zu beachten";
- }
-
- virtual QCString trPublicTypes()
- {
- return "Öffentliche Typen";
- }
-
- virtual QCString trPublicAttribs()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Datenfelder";
- }
- else
- {
- return "Öffentliche Attribute";
- }
- }
-
- virtual QCString trStaticPublicAttribs()
- {
- return "Statische öffentliche Attribute";
- }
-
- virtual QCString trProtectedTypes()
- {
- return "Geschützte Typen";
- }
-
- virtual QCString trProtectedAttribs()
- {
- return "Geschützte Attribute";
- }
-
- virtual QCString trStaticProtectedAttribs()
- {
- return "Statische geschützte Attribute";
- }
-
- virtual QCString trPrivateTypes()
- {
- return "Private Typen";
- }
-
- virtual QCString trPrivateAttribs()
- {
- return "Private Attribute";
- }
-
- virtual QCString trStaticPrivateAttribs()
- {
- return "Statische private Attribute";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\todo item */
- virtual QCString trTodo()
- {
- return "Noch zu erledigen";
- }
-
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- {
- return "Ausstehende Aufgaben";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy()
- {
- return "Wird benutzt von";
- }
-
- virtual QCString trRemarks()
- {
- return "Bemerkungen";
- }
-
- virtual QCString trAttention()
- {
- return "Achtung";
- }
-
- virtual QCString trInclByDepGraph()
- {
- return "Dieser Graph zeigt, welche Datei direkt oder "
- "indirekt diese Datei enthält:";
- }
-
- virtual QCString trSince()
- {
- return "Seit";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- virtual QCString trLegendTitle()
- {
- return "Erklärung des Graphen";
- }
-
- /*! 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
- "Diese Seite erklärt die Interpretation der von doxygen "
- "erzeugten Graphen.<p>\n"
- "Beispiel:\n"
- "\\code\n"
- "/*! Wegen Verkürzung unsichtbare Klasse */\n"
- "class Invisible { };\n\n"
- "/*! Klasse verkürzt dargestellt, Vererbungsbeziehung ist versteckt */\n"
- "class Truncated : public Invisible { };\n\n"
- "/* Nicht mit doxygen-Kommentaren dokumentierte Klasse */\n"
- "class Undocumented { };\n\n"
- "/*! Mithilfe öffentlicher Vererbung vererbte Klasse */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! Eine Template Klasse */\n"
- "template<class T> class Templ { };\n\n"
- "/*! Mithilfe geschützter Vererbung vererbte Klasse */\n"
- "class ProtectedBase { };\n\n"
- "/*! Mithilfe privater Vererbung vererbte Klasse */\n"
- "class PrivateBase { };\n\n"
- "/*! Von der Klasse Inherited benutzte Klasse */\n"
- "class Used { };\n\n"
- "/*! Superklasse, die von mehreren anderen Klassen erbt */\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\n"
- "Setzen des Tags \\c MAX_DOT_GRAPH_HEIGHT in der Konfigurationsdatei "
- "auf 240 liefert den folgenden Graphen:"
- "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
- "Die Rechtecke in obigem Graphen bedeuten:\n"
- "<ul>\n"
- "<li>Ein schwarz gefülltes Rechteck stellt die Struktur oder "
- "Klasse dar, für die der Graph erzeugt wurde.\n"
- "<li>Ein Rechteck mit schwarzem Rahmen kennzeichnet eine dokumentierte "
- "Struktur oder Klasse.\n"
- "<li>Ein Rechteck mit grauem Rahmen kennzeichnet eine undokumentierte "
- "Struktur oder Klasse.\n"
- "<li>Ein Rechteck mit rotem Rahmen kennzeichnet eine dokumentierte "
- "Struktur oder Klasse, für die nicht alle Vererbungs-/"
- "Enthaltenseinsbeziehungen dargestellt werden. Ein Graph wird gekürzt, "
- "wenn er nicht in die angegebenen Schranken passt.\n"
- "</ul>\n"
- "Die Pfeile bedeuten:\n"
- "<ul>\n"
- "<li>Ein dunkelblauer Pfeil stellt eine öffentliche Vererbungsbeziehung "
- "zwischen zwei Klassen dar.\n"
- "<li>Ein dunkelgrüner Pfeil stellt geschützte Vererbung dar.\n"
- "<li>Ein dunkelroter Pfeil stellt private Vererbung dar.\n"
- "<li>Ein gestrichelter violetter Pfeil bedeutet, dass eine Klasse in "
- "einer anderen enthalten ist oder von einer anderen benutzt wird. Am "
- "Pfeil stehen die Variable(n), mit deren Hilfe auf die Struktur oder "
- "Klasse an der Pfeilspitze zugegriffen werden kann.\n"
- "<li>Ein gestrichelter gelber Pfeil kennzeichnet eine Verknüpfung "
- "zwischen einer Template Instanz und der Template Klasse von welcher "
- "es abstammt. Neben dem Pfeil sind die Template Parameter aufgeführt.\n"
- "</ul>\n";
- }
-
- /*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return "Legende";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return "Test";
- }
-
- /*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return "Test-Liste";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return "DCOP Methoden";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return "Propertys";
- }
-
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return "Dokumentation der Propertys";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- return "Datenstrukturen";
- else
- return "Klassen";
- }
-
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
- {
- return (QCString)"Paket "+name;
- }
-
- /*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return "Paketliste";
- }
-
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return "Hier folgen die Pakete mit einer Kurzbeschreibung (wenn verfügbar):";
- }
-
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return "Pakete";
- }
-
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return "Wert:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return "Fehler";
- }
-
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return "Liste der bekannten Fehler";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6-20010422
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as ansicpg for RTF file. See translator_en.h for details. */
- virtual QCString trRTFansicp()
- {
- return "1252";
- }
-
- /*! Used as ansicpg for RTF fcharset
- * \see trRTFansicp() for a table of possible values.
- */
- virtual QCString trRTFCharSet()
- {
- return "0";
- }
-
- /*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return "Index";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7
-//////////////////////////////////////////////////////////////////////////
-
- /*! 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, bool singular)
- {
- QCString result("Klasse");
- if (!singular) result+="n";
- 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, bool singular)
- {
- QCString result("Datei");
- if (!singular) result+="en";
- 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, bool singular)
- {
- QCString result("Namensbereich");
- if (!singular) result+="e";
- 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, bool singular)
- {
- QCString result("Gruppe");
- if (!singular) result+="n";
- 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, bool singular)
- {
- QCString result("Seite");
- if (!singular) result+="n";
- 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, bool singular)
- {
- QCString result("Element");
- if (!singular) result+="e";
- 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 ? "Global" : "global")); // FIXME
- if (!singular) result+="";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7-20010524
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is generated when the \\author command is used and
- * for the author section in man pages.
- */
- virtual QCString trAuthor(bool, bool singular)
- {
- QCString result("Autor");
- if (!singular) result+="en";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return "Benutzt";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Implementiert " + 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 "Implementiert in " + trWriteList(numEntries) + ".";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.16
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in RTF documentation as a heading for the Table
- * of Contents.
- */
- virtual QCString trRTFTableOfContents()
- {
- return "Inhaltsverzeichnis";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.17
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as the header of the list of item that have been
- * flagged deprecated
- */
- virtual QCString trDeprecatedList()
- {
- return "Veraltete Elemente";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.18
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a header for declaration section of the events found in
- * a C# program
- */
- virtual QCString trEvents()
- {
- return "Ereignisse";
- }
-
- /*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- return "Ereignisdokumentation";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a heading for a list of Java class types with package scope.
- */
- virtual QCString trPackageTypes()
- {
- return "Pakettypen";
- }
-
- /*! Used as a heading for a list of Java class functions with package
- * scope.
- */
- virtual QCString trPackageMembers()
- {
- return "Paketfunktionen";
- }
-
- /*! Used as a heading for a list of static Java class functions with
- * package scope.
- */
- virtual QCString trStaticPackageMembers()
- {
- return "Statische Paketfunktionen";
- }
-
- /*! Used as a heading for a list of Java class variables with package
- * scope.
- */
- virtual QCString trPackageAttribs()
- {
- return "Paketattribute";
- }
-
- /*! Used as a heading for a list of static Java class variables with
- * package scope.
- */
- virtual QCString trStaticPackageAttribs()
- {
- return "Statische Paketattribute";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Alle";
- }
- /*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- return "Hier ist der Graph aller Aufrufe für diese Funktion:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! When the search engine is enabled this text is put in the header
- * of each page before the field where one can enter the text to search
- * for.
- */
- virtual QCString trSearchForIndex()
- {
- return "Suchen nach";
- }
- /*! This string is used as the title for the page listing the search
- * results.
- */
- virtual QCString trSearchResultsTitle()
- {
- return "Suchergebnisse";
- }
- /*! 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
- * the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
- * value 2 represents 2 or more matches. HTML markup is allowed inside
- * the returned string.
- */
- virtual QCString trSearchResults(int numDocuments)
- {
- if (numDocuments==0)
- {
- return "Es wurden keine Dokumente zu Ihrer Suchanfrage gefunden.";
- }
- else if (numDocuments==1)
- {
- return "Es wurde <b>1</b> Dokument zu Ihrer Suchanfrage gefunden.";
- }
- else
- {
- return "Es wurden <b>$num</b> Dokumente zu Ihrer Suchanfrage "
- "gefunden. Die besten Treffer werden zuerst angezeigt.";
- }
- }
- /*! 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 "Treffer:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 filename + " Quellcode";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.9
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the name of the chapter containing the directory
- * hierarchy.
- */
- virtual QCString trDirIndex()
- { return "Verzeichnishierarchie"; }
-
- /*! This is used as the name of the chapter containing the documentation
- * of the directories.
- */
- virtual QCString trDirDocumentation()
- { return "Verzeichnisdokumentation"; }
-
- /*! 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 "Verzeichnisse"; }
-
- /*! This returns a sentences that introduces the directory hierarchy.
- * and the fact that it is sorted alphabetically per level
- */
- virtual QCString trDirDescription()
- { return "Diese Verzeichnishierarchie ist -mit Einschränkungen- "
- "alphabetisch sortiert:";
- }
-
- /*! 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=dirName; result+="-Verzeichnisreferenz"; return result; }
-
- /*! 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, bool singular)
- {
- QCString result("Verzeichnis");
- if (!singular) result+="se";
- 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 "Dies ist eine überladene Methode, die der Bequemlichkeit "
- "wegen bereitgestellt wird. Sie unterscheidet sich von der "
- "obigen Funktion nur in den Argumenten die sie unterstützt.";
- }
-
-};
-
-#endif
diff --git a/src/translator_dk.h b/src/translator_dk.h
deleted file mode 100644
index 0258c41..0000000
--- a/src/translator_dk.h
+++ /dev/null
@@ -1,1476 +0,0 @@
-/*-*- c-basic-offset: 2; tab-width: 8 -*-*/
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-
-/*
- * Danish translation by
- * Erik Søe Sørensen <eriksoe@daimi.au.dk>
- *
- * First version (not complete) for Doxygen 1.2.7
- * Extended and revised for Doxygen 1.3
- * Extended and revised for Doxygen 1.3.4
- */
-
-/* Translator's notes:
-
- Oversættelseskonventioner:
- (Konventioner for konventioner:
- '?' angiver oversættelser, jeg har været i tvivl om
- '??' angiver tvivlsomme oversættelser
- '..?' angiver ord, der endnu ikke er fundet en oversættelse til
- '(do.)' angiver ord, der med vilje ikke er oversat, idet jeg selv
- overvejende bruger det engelske udtryk
- '(-> _) angiver ord, der er fundet en oversættelse til, men som jeg
- vægrer mig ved at oversætte.
- )
- bug -> 'kendt fejl'
- class -> klasse
- compound -> 'sammensat type'
- constructor -> konstruktør ?
- destructor -> destruktør ?
- event -> begivenhed ?
- exception (-> undtagelse ?)
- friend ..?
- interface -> grænseflade ?
- member -> medlem (TODO)
- namespace -> (do.)
- private -> privat
- property -> egenskab?
- protected -> beskyttet ??
- public -> offentlig
- slot ..?
- source code -> kildekode
- struct -> datastruktur
- template (-> skabelon ?)
- typedef -> typedefinition (?)
- todo -> (do.)
- union ..?
-
- Specielle forbindelser:
- 'Inheritance diagram' -> Stamtræ (selvom Nedarvningsdiagram også gik an)
-
- -----
-
- (Konstruktivt) input modtages med glæde!
- -- Erik Søe Sørensen <eriksoe@daimi.au.dk>
- */
-
-#ifndef TRANSLATOR_DK_H
-#define TRANSLATOR_DK_H
-
-class TranslatorDanish : public TranslatorAdapter_1_3_9
-{
- public:
-
- // --- Language control methods -------------------
-
- /*! Used for identification of the language. The identification
- * should not be translated. It should be replaced by the name
- * of the language in English using lower-case characters only
- * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
- * the identification used in language.cpp.
- */
- virtual QCString idLanguage()
- { return "danish"; }
-
- /*! Used to get the LaTeX command(s) for the language support.
- * This method should return string with commands that switch
- * LaTeX to the desired language. For example
- * <pre>"\\usepackage[german]{babel}\n"
- * </pre>
- * or
- * <pre>"\\usepackage{polski}\n"
- * "\\usepackage[latin2]{inputenc}\n"
- * "\\usepackage[T1]{fontenc}\n"
- * </pre>
- */
- virtual QCString latexLanguageSupportCommand()
- {
- return
- "\\usepackage[danish]{babel}\n"
- "\\usepackage[latin1]{inputenc}\n"
- "\\usepackage[T1]{fontenc}\n";
- }
-
- /*! return the language charset. This will be used for the HTML output */
- virtual QCString idLanguageCharset()
- {
- return "iso-8859-1";
- }
-
- // --- Language translation methods -------------------
-
- /*! used in the compound documentation before a list of related functions. */
- virtual QCString trRelatedFunctions()
- { return "Relaterede funktioner"; }
-
- /*! subscript for the related functions. */
- virtual QCString trRelatedSubscript()
- { return "(Bemærk at disse ikke er medlems-funktioner.)"; }
-
- /*! header that is put before the detailed description of files,
- * classes and namespaces. */
- virtual QCString trDetailedDescription()
- { return "Detaljeret beskrivelse"; }
-
- /*! header that is put before the list of typedefs. */
- virtual QCString trMemberTypedefDocumentation()
- { return "Dokumentation af medlems-typedefinitioner"; }
-
- /*! header that is put before the list of enumerations. */
- virtual QCString trMemberEnumerationDocumentation()
- { return "Dokumentation af medlems-enumerationer"; }
- // medlems-enumerationer -> 'indeholdte enumerationer'
-
- /*! header that is put before the list of member functions. */
- virtual QCString trMemberFunctionDocumentation()
- { return "Dokumentation af medlemsfunktioner"; }
-
- /*! header that is put before the list of member attributes. */
- virtual QCString trMemberDataDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
- return "Felt-dokumentation";
- } else {
- return "Dokumentation af feltvariable";
- }
- }
-
- /*! this is the text of a link put after brief descriptions. */
- virtual QCString trMore()
- { return "Mere..."; }
-
- /*! put in the class documentation */
- virtual QCString trListOfAllMembers()
- { return "Liste over alle medlemmer."; }
-
- /*! used as the title of the "list of all members" page of a class */
- virtual QCString trMemberList()
- { return "Liste over medlemmer"; }
-
- /*! this is the first part of a sentence that is followed by a class name */
- virtual QCString trThisIsTheListOfAllMembers()
- { return "Dette er den komplette liste over medlemmer i "; }
-
- /*! this is the remainder of the sentence after the class name */
- virtual QCString trIncludingInheritedMembers()
- { return ", inklusive alle nedarvede medlemmer."; }
-
- /*! 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="Automatisk genereret af Doxygen";
- if (s) result+=(QCString)" for "+s;
- result+=" ud fra kildekoden.";
- return result;
- }
-
- /*! put after an enum name in the list of all members */
- virtual QCString trEnumName()
- { return "enumerationsnavn"; }
-
- /*! put after an enum value in the list of all members */
- virtual QCString trEnumValue()
- { return "enumerationsværdi"; }
-
- /*! put after an undocumented member in the list of all members */
- virtual QCString trDefinedIn()
- { return "defineret i"; }
-
- // 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 "Moduler"; }
-
- /*! This is put above each page as a link to the class hierarchy */
- virtual QCString trClassHierarchy()
- { return "Klassehierarki"; }
-
- /*! This is put above each page as a link to the list of annotated classes */
- virtual QCString trCompoundList()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
- return "Datastrukturer";
- } else {
- return "Oversigt over sammensatte typer";
- }
- }
-
- /*! This is put above each page as a link to the list of documented files */
- virtual QCString trFileList()
- { return "Filoversigt"; }
-
- /*! This is put above each page as a link to the list of all verbatim headers */
- virtual QCString trHeaderFiles()
- { return "Headerfiler"; }
-
- /*! This is put above each page as a link to all members of compounds. */
- virtual QCString trCompoundMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
- return "Data-felter";
- } else {
- return "Felter i sammensatte typer";
- }
- }
-
- /*! This is put above each page as a link to all members of files. */
- virtual QCString trFileMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
- return "Globale symboler";
- } else {
- return "Placering i filer"; // Fil-medlemmer"; //TODO
- //"Globale definitioner" ?
- }
- }
-
- /*! This is put above each page as a link to all related pages. */
- virtual QCString trRelatedPages()
- { return "Relaterede sider"; }
-
- /*! This is put above each page as a link to all examples. */
- virtual QCString trExamples()
- { return "Eksempler"; }
-
- /*! This is put above each page as a link to the search engine. */
- virtual QCString trSearch()
- { return "Søg"; }
-
- /*! This is an introduction to the class hierarchy. */
- virtual QCString trClassHierarchyDescription()
- { return "Denne nedarvningsliste er sorteret næsten - "
- "men ikke helt - alfabetisk:";
- }
-
- /*! This is an introduction to the list with all files. */
- virtual QCString trFileListDescription(bool extractAll)
- {
- QCString result="Her er en liste over alle ";
- if (!extractAll) result+="dokumenterede ";
- result+="filer med korte beskrivelser:";
- return result;
- }
-
- /*! This is an introduction to the annotated compound list. */
- virtual QCString trCompoundListDescription()
- {
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
- return "Her er datastrukturerne med korte beskrivelser:";
- } else {
- return "Her er klasserne, datastrukturerne, "
- "unionerne og grænsefladerne med korte beskrivelser:";
- }
- }
-
- /*! This is an introduction to the page with all class members. */
- virtual QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result="Her er en liste over alle ";
- if (!extractAll) {
- result+="dokumenterede ";
- }
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
- result+="felter i datastrukturer og unioner";
- } else {
- result+="klassemedlemmer";
- }
- result+=" med links til ";
- if (!extractAll) {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
- result+="datastruktur/unions-dokumentationen for hvert felt:";
- } else {
- result+="klassedokumentationen for hvert medlem:";
- }
- } else {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
- result+="de datastrukturer/unioner, de hører til:";
- } else {
- result+="de klasser, de hører til:";
- }
- }
- return result;
- }
-
- /*! This is an introduction to the page with all file members. */
- virtual QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="Her er en liste over alle ";
- if (!extractAll) result+="dokumenterede ";
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
- result+="funktioner, variable, #defines, enumerationer "
- "og typedefinitioner";
- } else {
- result+="fil-medlemmer";
- }
- result+=" med links til ";
- if (extractAll)
- result+="de filer, de tilhører:";
- else
- result+="deres dokumentation:";
- return result;
- }
-
- /*! This is an introduction to the page with the list of all header files. */
- virtual QCString trHeaderFilesDescription()
- { return "Her er de headerfiler, der udgør API'en:"; }
-
- /*! This is an introduction to the page with the list of all examples */
- virtual QCString trExamplesDescription()
- { return "Her er en liste over alle eksempler:"; }
-
- /*! This is an introduction to the page with the list of related pages */
- virtual QCString trRelatedPagesDescription()
- { return "Her er en liste over alle relaterede dokumentationssider:"; }
-
- /*! This is an introduction to the page with the list of class/file groups */
- virtual QCString trModulesDescription()
- { return "Her er en liste over alle moduler:"; }
-
- /*! This sentences is used in the annotated class/file lists if no brief
- * description is given.
- */
- virtual QCString trNoDescriptionAvailable()
- { return "Ikke beskrevet"; }
-
- // index titles (the project name is prepended for these)
-
-
- /*! This is used in HTML as the title of index.html. */
- virtual QCString trDocumentation()
- { return "Dokumentation"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all groups.
- */
- virtual QCString trModuleIndex()
- { return "Modul-indeks"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * class hierarchy.
- */
- virtual QCString trHierarchicalIndex()
- { return "Hierarkisk indeks"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * annotated compound index.
- */
- virtual QCString trCompoundIndex()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
- return "Indeks over datastrukturer";
- } else {
- return "Indeks over sammensatte typer";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * list of all files.
- */
- virtual QCString trFileIndex()
- { return "Fil-indeks"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all groups.
- */
- virtual QCString trModuleDocumentation()
- { return "Modul-dokumentation"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all classes, structs and unions.
- */
- virtual QCString trClassDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
- return "Datastruktur-documentation";
- } else {
- return "Klasse-dokumentation";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all files.
- */
- virtual QCString trFileDocumentation()
- { return "Fil-dokumentation"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all examples.
- */
- virtual QCString trExampleDocumentation()
- { return "Eksempel-dokumentation"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all related pages.
- */
- virtual QCString trPageDocumentation()
- { return "Side-dokumentation"; }
-
- /*! This is used in LaTeX as the title of the document */
- virtual QCString trReferenceManual()
- { return "Referencemanual"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of defines
- */
- virtual QCString trDefines()
- { return "#Defines"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of function prototypes
- */
- virtual QCString trFuncProtos()
- { return "Funktionsprototyper"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of typedefs
- */
- virtual QCString trTypedefs()
- { return "Typedefinitioner"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of enumerations
- */
- virtual QCString trEnumerations()
- { return "Enumerationer"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) functions
- */
- virtual QCString trFunctions()
- { return "Funktioner"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trVariables()
- { return "Variable"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trEnumerationValues()
- { return "Enumerationsværdier"; }
-
- /*! This is used in the documentation of a file before the list of
- * documentation blocks for defines
- */
- virtual QCString trDefineDocumentation()
- { return "#Define-dokumentation"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for function prototypes
- */
- virtual QCString trFunctionPrototypeDocumentation()
- { return "Dokumentation af funktionsprototyper"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for typedefs
- */
- virtual QCString trTypedefDocumentation()
- { return "Dokumentation af typedefinitioner"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration types
- */
- virtual QCString trEnumerationTypeDocumentation()
- { return "Dokumentation af enumerations-typer"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration values
- */
- virtual QCString trEnumerationValueDocumentation()
- { return "Dokumentation af enumerations-værdier"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for functions
- */
- virtual QCString trFunctionDocumentation()
- { return "Funktions-dokumentation"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for variables
- */
- virtual QCString trVariableDocumentation()
- { return "Variabel-dokumentation"; }
-
- /*! This is used in the documentation of a file/namespace/group before
- * the list of links to documented compounds
- */
- virtual QCString trCompounds()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
- return "Datastrukturer";
- } else {
- return "Sammensatte typer";
- }
- }
-
- /*! 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)"Genereret "+date;
- if (projName) result+=(QCString)" for "+projName;
- result+=(QCString)" af";
- return result;
- }
- /*! This is part of the sentence used in the standard footer of each page.
- */
- virtual QCString trWrittenBy()
- { return "skrevet af"; }
-
- /*! this text is put before a class diagram */
- virtual QCString trClassDiagram(const char *clName)
- {
- return (QCString)"Stamtræ for "+clName+":";
- }
-
- /*! this text is generated when the \\internal command is used. */
- virtual QCString trForInternalUseOnly()
- { return "Kun til intern brug."; }
-
- /*! this text is generated when the \\reimp command is used. */
- virtual QCString trReimplementedForInternalReasons()
- { return "Metoden er genimplementeret af interne grunde; "
- "API'en er ikke påvirket."; }
-
- /*! this text is generated when the \\warning command is used. */
- virtual QCString trWarning()
- { return "Advarsel"; }
-
- /*! this text is generated when the \\bug command is used. */
- virtual QCString trBugsAndLimitations()
- { return "Fejl og begrænsninger"; }
-
- /*! this text is generated when the \\version command is used. */
- virtual QCString trVersion()
- { return "Version"; }
-
- /*! this text is generated when the \\date command is used. */
- virtual QCString trDate()
- { return "Dato"; }
-
- /*! this text is generated when the \\return command is used. */
- virtual QCString trReturns()
- { return "Returnerer"; }
-
- /*! this text is generated when the \\sa command is used. */
- virtual QCString trSeeAlso()
- { return "Se også"; }
-
- /*! this text is generated when the \\param command is used. */
- virtual QCString trParameters()
- { return "Parametre"; }
-
- /*! this text is generated when the \\exception command is used. */
- virtual QCString trExceptions()
- { return "Exceptions"; }
-
- /*! this text is used in the title page of a LaTeX document. */
- virtual QCString trGeneratedBy()
- { return "Genereret af"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of page containing all the index of all namespaces. */
- virtual QCString trNamespaceList()
- { return "Oversigt over namespaces"; }
-
- /*! used as an introduction to the namespace list */
- virtual QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="Her er en liste over alle ";
- if (!extractAll) result+="dokumenterede ";
- result+="namespaces med korte beskrivelser:";
- return result;
- }
-
- /*! used in the class documentation as a header before the list of all
- * friends of a class
- */
- virtual QCString trFriends()
- { return "Friends"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in the class documentation as a header before the list of all
- * related classes
- */
- virtual QCString trRelatedFunctionDocumentation()
- { return "Dokumentation af friends og af relaterede funktioner"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of the HTML page of a class/struct/union */
- virtual QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- {
- QCString result=(QCString)clName+" ";
- switch(compType)
- {
- case ClassDef::Class: result+=" Klasse-"; break;
- case ClassDef::Struct: result+=" Datastruktur-"; break;
- case ClassDef::Union: result+=" Union-"; break;
- case ClassDef::Interface: result+=" Grænseflade-"; break;
- case ClassDef::Protocol: result+=" Protocol-"; break; // translate me!
- case ClassDef::Category: result+=" Category-"; break; // translate me!
- case ClassDef::Exception: result+=" Exception-"; break;
- }
- if (isTemplate) result+="template-";
- result+="reference";
- return result;
- }
-
- /*! used as the title of the HTML page of a file */
- virtual QCString trFileReference(const char *fileName)
- {
- QCString result=fileName;
- result+=" filreference";
- return result;
- }
-
- /*! used as the title of the HTML page of a namespace */
- virtual QCString trNamespaceReference(const char *namespaceName)
- {
- QCString result=namespaceName;
- result+=" namespace-reference";
- return result;
- }
-
- virtual QCString trPublicMembers()
- { return "Offentlige metoder"; }
- virtual QCString trPublicSlots()
- { return "Offentlige slots"; }
- virtual QCString trSignals()
- { return "Signaler"; }
- virtual QCString trStaticPublicMembers()
- { return "Statiske, offentlige metoder"; }
- virtual QCString trProtectedMembers()
- { return "Beskyttede metoder"; }
- virtual QCString trProtectedSlots()
- { return "Beskyttede slots"; }
- virtual QCString trStaticProtectedMembers()
- { return "Statiske, beskyttede metoder"; }
- virtual QCString trPrivateMembers()
- { return "Private metoder"; }
- virtual QCString trPrivateSlots()
- { return "Private slots"; }
- virtual QCString trStaticPrivateMembers()
- { return "Statiske, private metoder"; }
-
- /*! this function is used to produce a comma-separated list of items.
- * use generateMarker(i) to indicate where item i should be put.
- */
- virtual QCString trWriteList(int numEntries)
- {
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++) {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) { // not the last entry, so we need a separator
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=" og ";
- }
- }
- return result;
- }
-
- /*! used in class documentation to produce a list of base classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritsList(int numEntries)
- {
- return "Nedarver "+trWriteList(numEntries)+".";
- }
-
- /*! used in class documentation to produce a list of super classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritedByList(int numEntries)
- {
- return "Nedarvet af "+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 "Overskriver metode fra "+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 "Reimplementeret i "+trWriteList(numEntries)+".";
- }
-
- /*! This is put above each page as a link to all members of namespaces. */
- virtual QCString trNamespaceMembers()
- { return "Namespace-medlemmer"; }
-
- /*! This is an introduction to the page with all namespace members */
- virtual QCString trNamespaceMemberDescription(bool extractAll)
- {
- QCString result="Her er en liste over alle ";
- if (!extractAll) result+="dokumenterede ";
- result+="namespace-medlemmer med links til ";
- if (extractAll)
- result+="namespace-dokumentationen for hvert medlem:";
- else
- result+="det namespace, de hører til:";
- return result;
- }
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all namespaces.
- */
- virtual QCString trNamespaceIndex()
- { return "Namespace-indeks"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all namespaces.
- */
- virtual QCString trNamespaceDocumentation()
- { return "Namespace-dokumentation"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- virtual QCString trNamespaces()
- { return "Namespaces"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990728
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is put at the bottom of a class documentation page and is
- * followed by a list of files that were used to generate the page.
- */
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)"Dokumentationen for denne ";
- switch(compType)
- {
- case ClassDef::Class: result+="klasse"; break;
- case ClassDef::Struct: result+="datastruktur"; break;
- case ClassDef::Union: result+="union"; break;
- case ClassDef::Interface: result+="grænseflade"; break;
- case ClassDef::Protocol: result+="protocol"; break; // translate me!
- case ClassDef::Category: result+="category"; break; // translate me!
- case ClassDef::Exception: result+="exception"; break;
- }
- result+=" blev genereret ud fra fil";
- if (single) result+="en:"; else result+="erne:";
- return result;
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- virtual QCString trAlphabeticalList()
- { return "Alfabetisk oversigt"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- virtual QCString trReturnValues()
- { return "Returværdier"; }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- virtual QCString trMainPage()
- { return "Hovedside"; }
-
- /*! 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 "s."; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991003
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trSources()
- { return "Kilder"; /* Tranlation?? */ }
-
- virtual QCString trDefinedAtLineInSourceFile()
- {
- return "Defineret på linje @0 i filen @1.";
- }
-
- virtual QCString trDefinedInSourceFile()
- {
- return "Defineret i filen @0.";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDeprecated()
- {
- return "Frarådes - fortidslevn"; // ?? - What is the context?
- // "Ugleset" :)
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- virtual QCString trCollaborationDiagram(const char *clName)
- {
- return (QCString)"Samarbejdsdiagram for "+clName+":";
- }
- /*! this text is put before an include dependency graph */
- virtual QCString trInclDepGraph(const char *fName)
- {
- return (QCString)"Include-afhængighedsgraf for "+fName+":";
- }
- /*! header that is put before the list of constructor/destructors. */
- virtual QCString trConstructorDocumentation()
- {
- return "Dokumentation af konstruktører og destruktører";
- // "Constructor & Destructor dokumentation";
- }
-
- /*! Used in the file documentation to point to the corresponding sources. */
- virtual QCString trGotoSourceCode()
- { return "Hop til denne fils kildekode."; }
- /*! Used in the file sources to point to the corresponding documentation. */
- virtual QCString trGotoDocumentation()
- { return "Hop til denne fils dokumentation."; }
-
- /*! Text for the \\pre command */
- virtual QCString trPrecondition()
- { return "Forudsætninger (precondition)"; }
- /*! Text for the \\post command */
- virtual QCString trPostcondition()
- { return "Resultat (postcondition)"; }
- /*! Text for the \\invariant command */
- virtual QCString trInvariant()
- { return "Invariant"; }
-
- /*! Text shown before a multi-line variable/enum initialization */
- virtual QCString trInitialValue()
- { return "Startværdi:"; }
-
- /*! Text used the source code in the file index */
- virtual QCString trCode()
- { return "kildekode"; }
- virtual QCString trGraphicalHierarchy()
- { return "Grafisk klassehierarki"; }
- virtual QCString trGotoGraphicalHierarchy()
- { return "Hop til det grafiske klassehierarki"; }
- virtual QCString trGotoTextualHierarchy()
- { return "Hop til det tekstuelle klassehierarki"; }
- virtual QCString trPageIndex()
- { return "Sideindeks"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trNote()
- { return "Note"; }
- virtual QCString trPublicTypes()
- { return "Offentlige typer"; }
-
- virtual QCString trPublicAttribs()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
- return "Datafelter";
- } else {
- return "Offentlige attributter";
- }
- }
-
- virtual QCString trStaticPublicAttribs()
- { return "Statiske, offentlige attributter"; }
- virtual QCString trProtectedTypes()
- { return "Beskyttede typer"; }
- virtual QCString trProtectedAttribs()
- { return "Beskyttede attributter"; }
- virtual QCString trStaticProtectedAttribs()
- { return "Statiske, beskyttede attributter"; }
- virtual QCString trPrivateTypes()
- { return "Private typer"; }
- virtual QCString trPrivateAttribs()
- { return "Private attributter"; }
- virtual QCString trStaticPrivateAttribs()
- { return "Statiske, private attributter"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\todo item */
- virtual QCString trTodo()
- {
- return "Todo";
- }
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- {
- return "Todo-liste";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy()
- {
- return "Refereret til af";
- }
- virtual QCString trRemarks()
- {
- return "Bemærkninger";
- }
- virtual QCString trAttention()
- {
- return "OBS";
- }
- virtual QCString trInclByDepGraph()
- {
- return
- "Denne graf viser, hvilke filer der direkte eller "
- "indirekte inkluderer denne fil:";
- }
- virtual QCString trSince()
- {
- return "Siden";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- virtual QCString trLegendTitle()
- {
- return "Graf-forklaring";
- }
- /*! page explaining how the dot graph's should be interpreted */
- virtual QCString trLegendDocs() //TODO
- {
- return
- "Denne side forklarer, hvordan man skal fortolke de grafer, "
- "der genereres af doxygen.<p>\n"
- "Tag følgende eksempel:\n"
- "\\code\n"
- "/*! Klasse der er usynlig pg.a. beskæring */\n"
- "class Invisible { };\n\n"
- "/*! Beskåret klasse: nedarvningsrelation er skjult */\n"
- "class Truncated : public Invisible { };\n\n"
- "/* Klasse der ikke er dokumenteret med doxygen-kommentarer */\n"
- "class Undocumented { };\n\n"
- "/*! Klasse der nedarves fra offentligt */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! En template-klasse */\n"
- "template<class T> class Templ { };\n\n"
- "/*! Klasse der nedarves fra beskyttet */\n"
- "class ProtectedBase { };\n\n"
- "/*! Klasse der nedarves fra privat */\n"
- "class PrivateBase { };\n\n"
- "/*! Klasse der bruges af Inherited-klassen */\n"
- "class Used { };\n\n"
- "/*! Klasse der nedarver en masse andre klasser */\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"
- "Hvis \\c MAX_DOT_GRAPH_HEIGHT i konfigurationsfilen "
- "er sat til 240, vil dette resultere i følgende graf:"
- "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
- "De forskellige slags kasser i ovenstående graf har følgende "
- "betydninger:\n"
- "<ul>\n"
- "<li>%En udfyldt sort kasse repræsenterer den datastruktur eller "
- "klasse, grafen er genereret for.\n"
- "<li>%En kasse med sort kant betegner en dokumenteret datastruktur "
- " eller klasse.\n"
- "<li>%En kasse med grå kant betegner en udokumenteret datastruktur "
- " eller klasse.\n"
- "<li>%En kasse med rød kant betegner en dokumenteret datastruktur "
- " eller klasse, for hvilken ikke alle "
- "nedarvnings- og indeholdelses-relationer er vist. "
- "%Grafer beskæres, hvis de fylder mere end de specificerede dimensioner.\n "
- "</ul>\n"
- "Pilene har følgende betydninger:\n"
- "<ul>\n"
- "<li>%En mørkeblå pil viser en offentlig nedarvningsrelation "
- "mellem to klasser.\n"
- "<li>%En mørkegrøn pil viser en beskyttet nedarvningsrelation.\n"
- "<li>%En mørkerød pil viser en privat nedarvningsrelation.\n"
- "<li>%En lilla, stiplet pil bruges, når en klasse er indeholdt i "
- "eller benyttes af en anden klasse. "
- "Ved pilen står navnet på den eller de variable, gennem hvilke(n) "
- "den klasse, pilen peger på, er tilgængelig.\n"
- "<li>%En gul, stiplet pil viser forholdet mellem en template-instans "
- "og den template-klasse, den er instantieret fra."
- "Ved pilen står template-parametrene brugt ved instantieringen.\n"
- "</ul>\n";
- }
- /*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return "forklaring til graf";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return "Test";
- }
- /*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return "Testliste";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return "DCOP-metoder";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return "Egenskaber";
- }
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return "Egenskabsdokumentation";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java interfaces in the summary section of Java packages */
- virtual QCString trInterfaces()
- {
- return "Grænseflader";
- }
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
- return "Datastrukturer";
- } else {
- return "Klasser";
- }
- }
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
- {
- return (QCString)"Pakke "+name;
- }
- /*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return "Pakkeoversigt";
- }
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return
- "Her er en liste over pakkerne, med korte beskrivelser "
- "(hvor en sådan findes):";
- }
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return "Pakker";
- }
- /*! Used as a chapter title for Latex & RTF output */
- virtual QCString trPackageDocumentation()
- {
- return "Pakke-dokumentation";
- }
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return "Værdi:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return "Kendte fejl";
- }
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return "Liste over kendte fejl";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as ansicpg for RTF file
- * (used table extract:)
- * <pre>
- * Charset Name Charset Value(hex) Codepage number
- * ------------------------------------------------------
- * ANSI_CHARSET 0 (x00) 1252
- * </pre>
- */
- virtual QCString trRTFansicp()
- {
- return "1252";
- }
-
- /*! Used as ansicpg for RTF fcharset */
- virtual QCString trRTFCharSet()
- {
- return "0";
- }
-
- /*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return "Indeks";
- }
-
- /*! 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)
- {
- return createNoun(first_capital, singular, "klasse", "r");
- }
-
- /*! 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)
- {
- return createNoun(first_capital, singular, "fil", "er");
- }
-
- /*! 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)
- {
- return createNoun(first_capital, singular, "namespace", "s");
- }
-
- /*! 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)
- {
- return createNoun(first_capital, singular, "gruppe", "r");
- }
-
- /*! 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)
- {
- return createNoun(first_capital, singular, "side", "r");
- }
-
- /*! 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)
- {
- return createNoun(first_capital, singular, "medlem", "mer");
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trField(bool first_capital, bool singular)
- {
- return createNoun(first_capital, singular, "felt", "er");
- }
-
- /*! 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)
- {
- return createNoun(first_capital, singular, "global", "e");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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)
- {
- return createNoun(first_capital, singular, "forfatter", "e");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return "Referencer";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Implementerer "+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 "Implementeret i "+trWriteList(numEntries)+".";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.16
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in RTF documentation as a heading for the Table
- * of Contents.
- */
- virtual QCString trRTFTableOfContents()
- {
- return "Indholdsfortegnelse";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.17
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as the header of the list of item that have been
- * flagged deprecated
- */
- virtual QCString trDeprecatedList()
- {
- return "Liste over fortidslevn, hvis brug frarådes";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.18
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a header for declaration section of the events found in
- * a C# program
- */
- virtual QCString trEvents()
- {
- return "Begivenheder";
- }
- /*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- return "Begivenhedsdokumentation";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3
-//////////////////////////////////////////////////////////////////////////
-
- /* Java: Entities with package scope... */
- virtual QCString trPackageTypes()
- { return "Typer med pakke-scope"; }
- virtual QCString trPackageMembers()
- { return "Metoder med pakke-scope"; }
- virtual QCString trStaticPackageMembers()
- { return "Statiske metoder med pakke-scope"; }
- virtual QCString trPackageAttribs()
- { return "Attributter med pakke-scope"; }
- virtual QCString trStaticPackageAttribs()
- { return "Statiske attributter med pakke-scope"; }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Alle";
- }
-
- /*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- return "Her er kald-grafen for denne funktion:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! When the search engine is enabled this text is put in the header
- * of each page before the field where one can enter the text to search
- * for.
- */
- virtual QCString trSearchForIndex()
- {
- return "Søg efter";
- }
-
- /*! This string is used as the title for the page listing the search
- * results.
- */
- virtual QCString trSearchResultsTitle()
- {
- return "Søgeresultater";
- }
-
- /*! 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
- * the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
- * value 2 represents 2 or more matches. HTML markup is allowed inside
- * the returned string.
- */
- virtual QCString trSearchResults(int numDocuments)
- {
- if (numDocuments==0) {
- return "Beklager - ingen dokumenter passede til din forespørgsel.";
- } else if (numDocuments==1) {
- return "Fandt <b>1</b> dokument, der passer til din forespørgsel.";
- } else {
- return
- "Fandt <b>$num</b> dokumenter, der passer til din forespørgsel. "
- "De, der passer bedst, vises først.";
- }
- }
-
- /*! 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 "Fundne ord:"; //translation?
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Kildefilen " + filename;
- }
-
-
-/*---------- For internal use: ----------------------------------------*/
- protected:
- /*! For easy flexible-noun implementation.
- * \internal
- */
- QCString createNoun(bool first_capital, bool singular,
- const char* base, const char* plurSuffix)
- {
- QCString result(base);
- if (first_capital) result.at(0) = toupper(result.at(0));
- if (!singular) result+=plurSuffix;
- return result;
- }
-};
-
-#endif
diff --git a/src/translator_en.h b/src/translator_en.h
deleted file mode 100644
index 6f2c96c..0000000
--- a/src/translator_en.h
+++ /dev/null
@@ -1,1624 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 TRANSLATOR_EN_H
-#define TRANSLATOR_EN_H
-
-/*!
- When defining a translator class for the new language, follow
- the description in the documentation. One of the steps says
- that you should copy the translator_en.h (this) file to your
- translator_xx.h new file. Your new language should use the
- Translator class as the base class. This means that you need to
- implement exactly the same (pure virtual) methods as the
- TranslatorEnglish does. Because of this, it is a good idea to
- start with the copy of TranslatorEnglish and replace the strings
- one by one.
-
- It is not necessary to include "translator.h" or
- "translator_adapter.h" here. The files are included in the
- language.cpp correctly. Not including any of the mentioned
- files frees the maintainer from thinking about whether the
- first, the second, or both files should be included or not, and
- why. This holds namely for localized translators because their
- base class is changed occasionaly to adapter classes when the
- Translator class changes the interface, or back to the
- Translator class (by the local maintainer) when the localized
- translator is made up-to-date again.
-*/
-class TranslatorEnglish : public Translator
-{
- protected:
- friend class TranslatorAdapterBase;
- virtual ~TranslatorEnglish() {}
-
- public:
-
- // --- Language control methods -------------------
-
- /*! Used for identification of the language. The identification
- * should not be translated. It should be replaced by the name
- * of the language in English using lower-case characters only
- * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
- * the identification used in language.cpp.
- */
- virtual QCString idLanguage()
- { return "english"; }
-
- /*! Used to get the LaTeX command(s) for the language support.
- * This method should return string with commands that switch
- * LaTeX to the desired language. For example
- * <pre>"\\usepackage[german]{babel}\n"
- * </pre>
- * or
- * <pre>"\\usepackage{polski}\n"
- * "\\usepackage[latin2]{inputenc}\n"
- * "\\usepackage[T1]{fontenc}\n"
- * </pre>
- *
- * The English LaTeX does not use such commands. Because of this
- * the empty string is returned in this implementation.
- */
- virtual QCString latexLanguageSupportCommand()
- {
- return "";
- }
-
- /*! return the language charset. This will be used for the HTML output */
- virtual QCString idLanguageCharset()
- {
- return "iso-8859-1";
- }
-
- // --- Language translation methods -------------------
-
- /*! used in the compound documentation before a list of related functions. */
- virtual QCString trRelatedFunctions()
- { return "Related Functions"; }
-
- /*! subscript for the related functions. */
- virtual QCString trRelatedSubscript()
- { return "(Note that these are not member functions.)"; }
-
- /*! header that is put before the detailed description of files, classes and namespaces. */
- virtual QCString trDetailedDescription()
- { return "Detailed Description"; }
-
- /*! header that is put before the list of typedefs. */
- virtual QCString trMemberTypedefDocumentation()
- { return "Member Typedef Documentation"; }
-
- /*! header that is put before the list of enumerations. */
- virtual QCString trMemberEnumerationDocumentation()
- { return "Member Enumeration Documentation"; }
-
- /*! header that is put before the list of member functions. */
- virtual QCString trMemberFunctionDocumentation()
- { return "Member Function Documentation"; }
-
- /*! header that is put before the list of member attributes. */
- virtual QCString trMemberDataDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Field Documentation";
- }
- else
- {
- return "Member Data Documentation";
- }
- }
-
- /*! this is the text of a link put after brief descriptions. */
- virtual QCString trMore()
- { return "More..."; }
-
- /*! put in the class documentation */
- virtual QCString trListOfAllMembers()
- { return "List of all members."; }
-
- /*! used as the title of the "list of all members" page of a class */
- virtual QCString trMemberList()
- { return "Member List"; }
-
- /*! this is the first part of a sentence that is followed by a class name */
- virtual QCString trThisIsTheListOfAllMembers()
- { return "This is the complete list of members for "; }
-
- /*! this is the remainder of the sentence after the class name */
- virtual QCString trIncludingInheritedMembers()
- { return ", including all inherited members."; }
-
- /*! 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="Generated automatically by Doxygen";
- if (s) result+=(QCString)" for "+s;
- result+=" from the source code.";
- return result;
- }
-
- /*! put after an enum name in the list of all members */
- virtual QCString trEnumName()
- { return "enum name"; }
-
- /*! put after an enum value in the list of all members */
- virtual QCString trEnumValue()
- { return "enum value"; }
-
- /*! put after an undocumented member in the list of all members */
- virtual QCString trDefinedIn()
- { return "defined in"; }
-
- // 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"; }
-
- /*! This is put above each page as a link to the class hierarchy */
- virtual QCString trClassHierarchy()
- { return "Class Hierarchy"; }
-
- /*! This is put above each page as a link to the list of annotated classes */
- virtual QCString trCompoundList()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Data Structures";
- }
- else
- {
- return "Class List";
- }
- }
-
- /*! This is put above each page as a link to the list of documented files */
- virtual QCString trFileList()
- { return "File List"; }
-
- /*! This is put above each page as a link to the list of all verbatim headers */
- virtual QCString trHeaderFiles()
- { return "Header Files"; }
-
- /*! This is put above each page as a link to all members of compounds. */
- virtual QCString trCompoundMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Data Fields";
- }
- else
- {
- return "Class Members";
- }
- }
-
- /*! This is put above each page as a link to all members of files. */
- virtual QCString trFileMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Globals";
- }
- else
- {
- return "File Members";
- }
- }
-
- /*! This is put above each page as a link to all related pages. */
- virtual QCString trRelatedPages()
- { return "Related Pages"; }
-
- /*! This is put above each page as a link to all examples. */
- virtual QCString trExamples()
- { return "Examples"; }
-
- /*! This is put above each page as a link to the search engine. */
- virtual QCString trSearch()
- { return "Search"; }
-
- /*! This is an introduction to the class hierarchy. */
- virtual QCString trClassHierarchyDescription()
- { return "This inheritance list is sorted roughly, "
- "but not completely, alphabetically:";
- }
-
- /*! This is an introduction to the list with all files. */
- virtual QCString trFileListDescription(bool extractAll)
- {
- QCString result="Here is a list of all ";
- if (!extractAll) result+="documented ";
- result+="files with brief descriptions:";
- return result;
- }
-
- /*! This is an introduction to the annotated compound list. */
- virtual QCString trCompoundListDescription()
- {
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Here are the data structures with brief descriptions:";
- }
- else
- {
- return "Here are the classes, structs, "
- "unions and interfaces with brief descriptions:";
- }
- }
-
- /*! This is an introduction to the page with all class members. */
- virtual QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result="Here is a list of all ";
- if (!extractAll)
- {
- result+="documented ";
- }
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="struct and union fields";
- }
- else
- {
- result+="class members";
- }
- result+=" with links to ";
- if (!extractAll)
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="the struct/union documentation for each field:";
- }
- else
- {
- result+="the class documentation for each member:";
- }
- }
- else
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="the structures/unions they belong to:";
- }
- else
- {
- result+="the classes they belong to:";
- }
- }
- return result;
- }
-
- /*! This is an introduction to the page with all file members. */
- virtual QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="Here is a list of all ";
- if (!extractAll) result+="documented ";
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="functions, variables, defines, enums, and typedefs";
- }
- else
- {
- result+="file members";
- }
- result+=" with links to ";
- if (extractAll)
- result+="the files they belong to:";
- else
- result+="the documentation:";
- return result;
- }
-
- /*! This is an introduction to the page with the list of all header files. */
- virtual QCString trHeaderFilesDescription()
- { return "Here are the header files that make up the API:"; }
-
- /*! This is an introduction to the page with the list of all examples */
- virtual QCString trExamplesDescription()
- { return "Here is a list of all examples:"; }
-
- /*! This is an introduction to the page with the list of related pages */
- virtual QCString trRelatedPagesDescription()
- { return "Here is a list of all related documentation pages:"; }
-
- /*! This is an introduction to the page with the list of class/file groups */
- virtual QCString trModulesDescription()
- { return "Here is a list of all modules:"; }
-
- /*! This sentences is used in the annotated class/file lists if no brief
- * description is given.
- */
- virtual QCString trNoDescriptionAvailable()
- { return "No description available"; }
-
- // index titles (the project name is prepended for these)
-
-
- /*! This is used in HTML as the title of index.html. */
- 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 "Module Index"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * class hierarchy.
- */
- virtual QCString trHierarchicalIndex()
- { return "Hierarchical Index"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * annotated compound index.
- */
- virtual QCString trCompoundIndex()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Data Structure Index";
- }
- else
- {
- return "Class Index";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * list of all files.
- */
- virtual QCString trFileIndex()
- { return "File Index"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all groups.
- */
- virtual QCString trModuleDocumentation()
- { return "Module Documentation"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all classes, structs and unions.
- */
- virtual QCString trClassDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Data Structure Documentation";
- }
- else
- {
- return "Class Documentation";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all files.
- */
- virtual QCString trFileDocumentation()
- { return "File Documentation"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all examples.
- */
- virtual QCString trExampleDocumentation()
- { return "Example Documentation"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all related pages.
- */
- virtual QCString trPageDocumentation()
- { return "Page Documentation"; }
-
- /*! This is used in LaTeX as the title of the document */
- virtual QCString trReferenceManual()
- { return "Reference Manual"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of defines
- */
- virtual QCString trDefines()
- { return "Defines"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of function prototypes
- */
- virtual QCString trFuncProtos()
- { return "Function Prototypes"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of typedefs
- */
- virtual QCString trTypedefs()
- { return "Typedefs"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of enumerations
- */
- virtual QCString trEnumerations()
- { return "Enumerations"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) functions
- */
- virtual QCString trFunctions()
- { return "Functions"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) 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 "Enumerator"; }
-
- /*! This is used in the documentation of a file before the list of
- * documentation blocks for defines
- */
- virtual QCString trDefineDocumentation()
- { return "Define Documentation"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for function prototypes
- */
- virtual QCString trFunctionPrototypeDocumentation()
- { return "Function Prototype Documentation"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for typedefs
- */
- virtual QCString trTypedefDocumentation()
- { return "Typedef Documentation"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration types
- */
- virtual QCString trEnumerationTypeDocumentation()
- { return "Enumeration Type Documentation"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration values
- */
- virtual QCString trEnumerationValueDocumentation()
- { return "Enumerator Documentation"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for functions
- */
- virtual QCString trFunctionDocumentation()
- { return "Function Documentation"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for variables
- */
- virtual QCString trVariableDocumentation()
- { return "Variable Documentation"; }
-
- /*! This is used in the documentation of a file/namespace/group before
- * the list of links to documented compounds
- */
- virtual QCString trCompounds()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Data Structures";
- }
- else
- {
- 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)"Generated on "+date;
- if (projName) result+=(QCString)" for "+projName;
- result+=(QCString)" by";
- return result;
- }
- /*! This is part of the sentence used in the standard footer of each page.
- */
- virtual QCString trWrittenBy()
- {
- return "written by";
- }
-
- /*! this text is put before a class diagram */
- virtual QCString trClassDiagram(const char *clName)
- {
- return (QCString)"Inheritance diagram for "+clName+":";
- }
-
- /*! this text is generated when the \\internal command is used. */
- virtual QCString trForInternalUseOnly()
- { return "For internal use only."; }
-
- /*! this text is generated when the \\reimp command is used. */
- virtual QCString trReimplementedForInternalReasons()
- { return "Reimplemented for internal reasons; the API is not affected."; }
-
- /*! this text is generated when the \\warning command is used. */
- virtual QCString trWarning()
- { return "Warning"; }
-
- /*! this text is generated when the \\bug command is used. */
- virtual QCString trBugsAndLimitations()
- { return "Bugs and limitations"; }
-
- /*! this text is generated when the \\version command is used. */
- virtual QCString trVersion()
- { return "Version"; }
-
- /*! this text is generated when the \\date command is used. */
- virtual QCString trDate()
- { return "Date"; }
-
- /*! this text is generated when the \\return command is used. */
- virtual QCString trReturns()
- { return "Returns"; }
-
- /*! this text is generated when the \\sa command is used. */
- virtual QCString trSeeAlso()
- { return "See also"; }
-
- /*! this text is generated when the \\param command is used. */
- virtual QCString trParameters()
- { return "Parameters"; }
-
- /*! this text is generated when the \\exception command is used. */
- virtual QCString trExceptions()
- { return "Exceptions"; }
-
- /*! this text is used in the title page of a LaTeX document. */
- virtual QCString trGeneratedBy()
- { return "Generated by"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of page containing all the index of all namespaces. */
- virtual QCString trNamespaceList()
- { return "Namespace List"; }
-
- /*! used as an introduction to the namespace list */
- virtual QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="Here is a list of all ";
- if (!extractAll) result+="documented ";
- result+="namespaces with brief descriptions:";
- return result;
- }
-
- /*! used in the class documentation as a header before the list of all
- * friends of a class
- */
- virtual QCString trFriends()
- { return "Friends"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in the class documentation as a header before the list of all
- * related classes
- */
- virtual QCString trRelatedFunctionDocumentation()
- { return "Friends And Related Function Documentation"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of the HTML page of a class/struct/union */
- virtual QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- {
- QCString result=(QCString)clName;
- switch(compType)
- {
- case ClassDef::Class: result+=" Class"; break;
- case ClassDef::Struct: result+=" Struct"; break;
- case ClassDef::Union: result+=" Union"; break;
- case ClassDef::Interface: result+=" Interface"; break;
- case ClassDef::Protocol: result+=" Protocol"; break;
- case ClassDef::Category: result+=" Category"; break;
- case ClassDef::Exception: result+=" Exception"; break;
- }
- if (isTemplate) result+=" Template";
- result+=" Reference";
- return result;
- }
-
- /*! used as the title of the HTML page of a file */
- virtual QCString trFileReference(const char *fileName)
- {
- QCString result=fileName;
- result+=" File Reference";
- return result;
- }
-
- /*! used as the title of the HTML page of a namespace */
- virtual QCString trNamespaceReference(const char *namespaceName)
- {
- QCString result=namespaceName;
- result+=" Namespace Reference";
- return result;
- }
-
- virtual QCString trPublicMembers()
- { return "Public Member Functions"; }
- virtual QCString trPublicSlots()
- { return "Public Slots"; }
- virtual QCString trSignals()
- { return "Signals"; }
- virtual QCString trStaticPublicMembers()
- { return "Static Public Member Functions"; }
- virtual QCString trProtectedMembers()
- { return "Protected Member Functions"; }
- virtual QCString trProtectedSlots()
- { return "Protected Slots"; }
- virtual QCString trStaticProtectedMembers()
- { return "Static Protected Member Functions"; }
- virtual QCString trPrivateMembers()
- { return "Private Member Functions"; }
- virtual QCString trPrivateSlots()
- { return "Private Slots"; }
- virtual QCString trStaticPrivateMembers()
- { return "Static Private Member Functions"; }
-
- /*! this function is used to produce a comma-separated list of items.
- * use generateMarker(i) to indicate where item i should be put.
- */
- virtual QCString trWriteList(int numEntries)
- {
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=", and ";
- }
- }
- return result;
- }
-
- /*! used in class documentation to produce a list of base classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritsList(int numEntries)
- {
- return "Inherits "+trWriteList(numEntries)+".";
- }
-
- /*! used in class documentation to produce a list of super classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritedByList(int numEntries)
- {
- return "Inherited by "+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 "Reimplemented from "+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 "Reimplemented in "+trWriteList(numEntries)+".";
- }
-
- /*! This is put above each page as a link to all members of namespaces. */
- virtual QCString trNamespaceMembers()
- { return "Namespace Members"; }
-
- /*! This is an introduction to the page with all namespace members */
- virtual QCString trNamespaceMemberDescription(bool extractAll)
- {
- QCString result="Here is a list of all ";
- if (!extractAll) result+="documented ";
- result+="namespace members with links to ";
- if (extractAll)
- result+="the namespace documentation for each member:";
- else
- result+="the namespaces they belong to:";
- return result;
- }
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all namespaces.
- */
- virtual QCString trNamespaceIndex()
- { return "Namespace Index"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all namespaces.
- */
- virtual QCString trNamespaceDocumentation()
- { return "Namespace Documentation"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- virtual QCString trNamespaces()
- { return "Namespaces"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990728
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is put at the bottom of a class documentation page and is
- * followed by a list of files that were used to generate the page.
- */
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)"The documentation for this ";
- switch(compType)
- {
- case ClassDef::Class: result+="class"; break;
- case ClassDef::Struct: result+="struct"; break;
- case ClassDef::Union: result+="union"; break;
- case ClassDef::Interface: result+="interface"; break;
- case ClassDef::Protocol: result+="protocol"; break;
- case ClassDef::Category: result+="category"; break;
- case ClassDef::Exception: result+="exception"; break;
- }
- result+=" was generated from the following file";
- if (single) result+=":"; else result+="s:";
- return result;
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- virtual QCString trAlphabeticalList()
- { return "Alphabetical List"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- virtual QCString trReturnValues()
- { return "Return values"; }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- virtual QCString trMainPage()
- { return "Main Page"; }
-
- /*! This is used in references to page that are put in the LaTeX
- * documentation. It should be an abbreviation of the word page.
- */
- virtual QCString trPageAbbreviation()
- { return "p."; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991003
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trSources()
- {
- return "Sources";
- }
- virtual QCString trDefinedAtLineInSourceFile()
- {
- return "Definition at line @0 of file @1.";
- }
- virtual QCString trDefinedInSourceFile()
- {
- return "Definition in file @0.";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDeprecated()
- {
- return "Deprecated";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- virtual QCString trCollaborationDiagram(const char *clName)
- {
- return (QCString)"Collaboration diagram for "+clName+":";
- }
- /*! this text is put before an include dependency graph */
- virtual QCString trInclDepGraph(const char *fName)
- {
- return (QCString)"Include dependency graph for "+fName+":";
- }
- /*! header that is put before the list of constructor/destructors. */
- virtual QCString trConstructorDocumentation()
- {
- return "Constructor & Destructor Documentation";
- }
- /*! Used in the file documentation to point to the corresponding sources. */
- virtual QCString trGotoSourceCode()
- {
- return "Go to the source code of this file.";
- }
- /*! Used in the file sources to point to the corresponding documentation. */
- virtual QCString trGotoDocumentation()
- {
- return "Go to the documentation of this file.";
- }
- /*! Text for the \\pre command */
- virtual QCString trPrecondition()
- {
- return "Precondition";
- }
- /*! Text for the \\post command */
- virtual QCString trPostcondition()
- {
- return "Postcondition";
- }
- /*! Text for the \\invariant command */
- virtual QCString trInvariant()
- {
- return "Invariant";
- }
- /*! Text shown before a multi-line variable/enum initialization */
- virtual QCString trInitialValue()
- {
- return "Initial value:";
- }
- /*! Text used the source code in the file index */
- virtual QCString trCode()
- {
- return "code";
- }
- virtual QCString trGraphicalHierarchy()
- {
- return "Graphical Class Hierarchy";
- }
- virtual QCString trGotoGraphicalHierarchy()
- {
- return "Go to the graphical class hierarchy";
- }
- virtual QCString trGotoTextualHierarchy()
- {
- return "Go to the textual class hierarchy";
- }
- virtual QCString trPageIndex()
- {
- return "Page Index";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trNote()
- {
- return "Note";
- }
- virtual QCString trPublicTypes()
- {
- return "Public Types";
- }
- virtual QCString trPublicAttribs()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Data Fields";
- }
- else
- {
- return "Public Attributes";
- }
- }
- virtual QCString trStaticPublicAttribs()
- {
- return "Static Public Attributes";
- }
- virtual QCString trProtectedTypes()
- {
- return "Protected Types";
- }
- virtual QCString trProtectedAttribs()
- {
- return "Protected Attributes";
- }
- virtual QCString trStaticProtectedAttribs()
- {
- return "Static Protected Attributes";
- }
- virtual QCString trPrivateTypes()
- {
- return "Private Types";
- }
- virtual QCString trPrivateAttribs()
- {
- return "Private Attributes";
- }
- virtual QCString trStaticPrivateAttribs()
- {
- return "Static Private Attributes";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\todo item */
- virtual QCString trTodo()
- {
- return "Todo";
- }
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- {
- return "Todo List";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy()
- {
- return "Referenced by";
- }
- virtual QCString trRemarks()
- {
- return "Remarks";
- }
- virtual QCString trAttention()
- {
- return "Attention";
- }
- virtual QCString trInclByDepGraph()
- {
- return "This graph shows which files directly or "
- "indirectly include this file:";
- }
- virtual QCString trSince()
- {
- return "Since";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- virtual QCString trLegendTitle()
- {
- return "Graph Legend";
- }
- /*! 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
- "This page explains how to interpret the graphs that are generated "
- "by doxygen.<p>\n"
- "Consider the following example:\n"
- "\\code\n"
- "/*! Invisible class because of truncation */\n"
- "class Invisible { };\n\n"
- "/*! Truncated class, inheritance relation is hidden */\n"
- "class Truncated : public Invisible { };\n\n"
- "/* Class not documented with doxygen comments */\n"
- "class Undocumented { };\n\n"
- "/*! Class that is inherited using public inheritance */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! A template class */\n"
- "template<class T> class Templ { };\n\n"
- "/*! Class that is inherited using protected inheritance */\n"
- "class ProtectedBase { };\n\n"
- "/*! Class that is inherited using private inheritance */\n"
- "class PrivateBase { };\n\n"
- "/*! Class that is used by the Inherited class */\n"
- "class Used { };\n\n"
- "/*! Super class that inherits a number of other 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"
- "If the \\c MAX_DOT_GRAPH_HEIGHT tag in the configuration file "
- "is set to 240 this will result in the following graph:"
- "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
- "The boxes in the above graph have the following meaning:\n"
- "<ul>\n"
- "<li>%A filled black box represents the struct or class for which the "
- "graph is generated.\n"
- "<li>%A box with a black border denotes a documented struct or class.\n"
- "<li>%A box with a grey border denotes an undocumented struct or class.\n"
- "<li>%A box with a red border denotes a documented struct or class for"
- "which not all inheritance/containment relations are shown. %A graph is "
- "truncated if it does not fit within the specified boundaries.\n"
- "</ul>\n"
- "The arrows have the following meaning:\n"
- "<ul>\n"
- "<li>%A dark blue arrow is used to visualize a public inheritance "
- "relation between two classes.\n"
- "<li>%A dark green arrow is used for protected inheritance.\n"
- "<li>%A dark red arrow is used for private inheritance.\n"
- "<li>%A purple dashed arrow is used if a class is contained or used "
- "by another class. The arrow is labeled with the variable(s) "
- "through which the pointed class or struct is accessible.\n"
- "<li>%A yellow dashed arrow denotes a relation between a template instance and "
- "the template class it was instantiated from. The arrow is labeled with "
- "the template parameters of the instance.\n"
- "</ul>\n";
- }
- /*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return "legend";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return "Test";
- }
- /*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return "Test List";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return "DCOP Member Functions";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return "Properties";
- }
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return "Property Documentation";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java interfaces in the summary section of Java packages */
- virtual QCString trInterfaces()
- {
- return "Interfaces";
- }
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Data Structures";
- }
- else
- {
- return "Classes";
- }
- }
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
- {
- return (QCString)"Package "+name;
- }
- /*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return "Package List";
- }
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return "Here are the packages with brief descriptions (if available):";
- }
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return "Packages";
- }
- /*! Used as a chapter title for Latex & RTF output */
- virtual QCString trPackageDocumentation()
- {
- return "Package Documentation";
- }
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return "Value:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return "Bug";
- }
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return "Bug List";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as ansicpg for RTF file
- *
- * The following table shows the correlation of Charset name, Charset Value and
- * <pre>
- * Codepage number:
- * Charset Name Charset Value(hex) Codepage number
- * ------------------------------------------------------
- * DEFAULT_CHARSET 1 (x01)
- * SYMBOL_CHARSET 2 (x02)
- * OEM_CHARSET 255 (xFF)
- * ANSI_CHARSET 0 (x00) 1252
- * RUSSIAN_CHARSET 204 (xCC) 1251
- * EE_CHARSET 238 (xEE) 1250
- * GREEK_CHARSET 161 (xA1) 1253
- * TURKISH_CHARSET 162 (xA2) 1254
- * BALTIC_CHARSET 186 (xBA) 1257
- * HEBREW_CHARSET 177 (xB1) 1255
- * ARABIC _CHARSET 178 (xB2) 1256
- * SHIFTJIS_CHARSET 128 (x80) 932
- * HANGEUL_CHARSET 129 (x81) 949
- * GB2313_CHARSET 134 (x86) 936
- * CHINESEBIG5_CHARSET 136 (x88) 950
- * </pre>
- *
- */
- virtual QCString trRTFansicp()
- {
- return "1252";
- }
-
-
- /*! Used as ansicpg for RTF fcharset
- * \see trRTFansicp() for a table of possible values.
- */
- virtual QCString trRTFCharSet()
- {
- return "0";
- }
-
- /*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return "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 ? "Class" : "class"));
- if (!singular) result+="es";
- 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 ? "File" : "file"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trNamespace(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Namespace" : "namespace"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trGroup(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Group" : "group"));
- 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;
- }
-
- /*! 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 ? "Member" : "member"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trField(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Field" : "field"));
- 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 ? "Global" : "global"));
- if (!singular) result+="s";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is generated when the \\author command is used and
- * for the author section in man pages. */
- virtual QCString trAuthor(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Author" : "author"));
- if (!singular) result+="s";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return "References";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Implements "+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 "Implemented in "+trWriteList(numEntries)+".";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.16
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in RTF documentation as a heading for the Table
- * of Contents.
- */
- virtual QCString trRTFTableOfContents()
- {
- return "Table of Contents";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.17
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as the header of the list of item that have been
- * flagged deprecated
- */
- virtual QCString trDeprecatedList()
- {
- return "Deprecated List";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.18
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a header for declaration section of the events found in
- * a C# program
- */
- virtual QCString trEvents()
- {
- return "Events";
- }
- /*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- return "Event Documentation";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a heading for a list of Java class types with package scope.
- */
- virtual QCString trPackageTypes()
- {
- return "Package Types";
- }
- /*! Used as a heading for a list of Java class functions with package
- * scope.
- */
- virtual QCString trPackageMembers()
- {
- return "Package Functions";
- }
- /*! Used as a heading for a list of static Java class functions with
- * package scope.
- */
- virtual QCString trStaticPackageMembers()
- {
- return "Static Package Functions";
- }
- /*! Used as a heading for a list of Java class variables with package
- * scope.
- */
- virtual QCString trPackageAttribs()
- {
- return "Package Attributes";
- }
- /*! Used as a heading for a list of static Java class variables with
- * package scope.
- */
- virtual QCString trStaticPackageAttribs()
- {
- return "Static Package Attributes";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "All";
- }
- /*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- return "Here is the call graph for this function:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! When the search engine is enabled this text is put in the header
- * of each page before the field where one can enter the text to search
- * for.
- */
- virtual QCString trSearchForIndex()
- {
- return "Search for";
- }
- /*! This string is used as the title for the page listing the search
- * results.
- */
- virtual QCString trSearchResultsTitle()
- {
- return "Search Results";
- }
- /*! 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
- * the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
- * value 2 represents 2 or more matches. HTML markup is allowed inside
- * the returned string.
- */
- virtual QCString trSearchResults(int numDocuments)
- {
- if (numDocuments==0)
- {
- return "Sorry, no documents matching your query.";
- }
- else if (numDocuments==1)
- {
- return "Found <b>1</b> document matching your query.";
- }
- else
- {
- return "Found <b>$num</b> documents matching your query. "
- "Showing best matches first.";
- }
- }
- /*! 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 "Matches:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 filename + " Source File";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.9
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the name of the chapter containing the directory
- * hierarchy.
- */
- virtual QCString trDirIndex()
- { return "Directory Hierarchy"; }
-
- /*! This is used as the name of the chapter containing the documentation
- * of the directories.
- */
- virtual QCString trDirDocumentation()
- { return "Directory Documentation"; }
-
- /*! 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 "Directories"; }
-
- /*! This returns a sentences that introduces the directory hierarchy.
- * and the fact that it is sorted alphabetically per level
- */
- virtual QCString trDirDescription()
- { return "This directory hierarchy is sorted roughly, "
- "but not completely, alphabetically:";
- }
-
- /*! 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=dirName; result+=" Directory Reference"; return result; }
-
- /*! 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 ? "Director" : "director"));
- if (singular) result+="y"; else result+="ies";
- 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 "This is an overloaded member function, "
- "provided for convenience. It differs from the above "
- "function only in what argument(s) it accepts.";
- }
-};
-
-#endif
diff --git a/src/translator_es.h b/src/translator_es.h
deleted file mode 100644
index 09f27ac..0000000
--- a/src/translator_es.h
+++ /dev/null
@@ -1,1384 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-
-/*
- * translator_es.h modified by Lucas Cruz (7-julio-2000)
- * Some notes:
- * - It's posible that some sentences haven't got meaning because
- * some words haven't got translate in spanish.
- */
-
-#ifndef TRANSLATOR_ES_H
-#define TRANSLATOR_ES_H
-
-class TranslatorSpanish : public TranslatorAdapter_1_3_8
-{
- public:
- virtual QCString idLanguage()
- { return "spanish"; }
-
- /*! Used to get the LaTeX command(s) for the language support.
- * This method should return string with commands that switch
- * LaTeX to the desired language. For example
- * <pre>"\\usepackage[german]{babel}\n"
- * </pre>
- * or
- * <pre>"\\usepackage{polski}\n"
- * "\\usepackage[latin2]{inputenc}\n"
- * "\\usepackage[T1]{fontenc}\n"
- * </pre>
- *
- * The English LaTeX does not use such commands. Because of this
- * the empty string is returned in this implementation.
- */
- virtual QCString latexLanguageSupportCommand()
- {
- return "\\usepackage[spanish]{babel}";
- }
-
- /*! return the language charset. This will be used for the HTML output */
- virtual QCString idLanguageCharset()
- {
- return "iso-8859-1";
- }
-
- /*! used in the compound documentation before a list of related functions. */
- virtual QCString trRelatedFunctions()
- { return "Funciones relacionadas"; }
-
- /*! subscript for the related functions. */
- virtual QCString trRelatedSubscript()
- { return "(Observar que estas no son funciones miembro.)"; }
-
- /*! header that is put before the detailed description of files, classes and namespaces. */
- virtual QCString trDetailedDescription()
- { return "Descripción detallada"; }
-
- /*! header that is put before the list of typedefs. */
- virtual QCString trMemberTypedefDocumentation()
- { return "Documentación de los 'Tipos Definidos' miembros de la clase"; }
-
- /*! header that is put before the list of enumerations. */
- virtual QCString trMemberEnumerationDocumentation()
- { return "Documentación de las enumeraciones miembro de la clase"; }
-
- /*! header that is put before the list of member functions. */
- virtual QCString trMemberFunctionDocumentation()
- { return "Documentación de las funciones miembro"; }
-
- /*! header that is put before the list of member attributes. */
- virtual QCString trMemberDataDocumentation()
- { return "Documentación de los datos miembro"; }
-
- /*! this is the text of a link put after brief descriptions. */
- virtual QCString trMore()
- { return "Más..."; }
-
- /*! put in the class documentation */
- virtual QCString trListOfAllMembers()
- { return "Lista de todos los miembros."; }
-
- /*! used as the title of the "list of all members" page of a class */
- virtual QCString trMemberList()
- { return "Lista de los miembros"; }
-
- /*! this is the first part of a sentence that is followed by a class name */
- virtual QCString trThisIsTheListOfAllMembers()
- { return "Esta es la lista completa de miembros para "; }
-
- /*! this is the remainder of the sentence after the class name */
- virtual QCString trIncludingInheritedMembers()
- { return ", incluyendo todos los miembros heredados."; }
-
- /*! 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="Generado automáticamente por Doxygen";
- if (s) result+=(QCString)" para "+s;
- result+=" del código fuente.";
- return result;
- }
-
- /*! put after an enum name in the list of all members */
- virtual QCString trEnumName()
- { return "nombre de la enumeración"; }
-
- /*! put after an enum value in the list of all members */
- virtual QCString trEnumValue()
- { return "valor enumerado"; }
-
- /*! put after an undocumented member in the list of all members */
- virtual QCString trDefinedIn()
- { return "definido en"; }
-
- // 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 "Módulos"; }
-
- /*! This is put above each page as a link to the class hierarchy */
- virtual QCString trClassHierarchy()
- { return "Jerarquía de la clase"; }
-
- /*! This is put above each page as a link to the list of annotated classes */
- virtual QCString trCompoundList()
- { return "Lista de componentes"; }
-
- /*! This is put above each page as a link to the list of documented files */
- virtual QCString trFileList()
- { return "Lista de archivos"; }
-
- /*! This is put above each page as a link to the list of all verbatim headers */
- virtual QCString trHeaderFiles()
- { return "Archivos cabecera"; }
-
- /*! This is put above each page as a link to all members of compounds. */
- virtual QCString trCompoundMembers()
- { return "Miembros de las clases"; }
-
- /*! This is put above each page as a link to all members of files. */
- virtual QCString trFileMembers()
- { return "Archivos de los miembros"; }
-
- /*! This is put above each page as a link to all related pages. */
- virtual QCString trRelatedPages()
- { return "Páginas relacionadas"; }
-
- /*! This is put above each page as a link to all examples. */
- virtual QCString trExamples()
- { return "Ejemplos"; }
-
- /*! This is put above each page as a link to the search engine. */
- virtual QCString trSearch()
- { return "Buscar"; }
-
- /*! This is an introduction to the class hierarchy. */
- virtual QCString trClassHierarchyDescription()
- { return "Esta lista de herencias esta ordenada rigurosamente, "
- "pero no completa, por orden alfabético:";
- }
-
- /*! This is an introduction to the list with all files. */
- virtual QCString trFileListDescription(bool extractAll)
- {
- QCString result="Lista de todos los archivos ";
- if (!extractAll) result+="documentados y ";
- result+="con descripciones breves:";
- return result;
- }
-
- /*! This is an introduction to the annotated compound list. */
- virtual QCString trCompoundListDescription()
- { return "Lista de las clases, estructuras, "
- "uniones e interfaces con una breve descripción:";
- }
-
- /*! This is an introduction to the page with all class members. */
- virtual QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result="Lista de";
- if (!extractAll) result+=" toda la documentación de";
- result+=" los miembros de la clase con enlaces a ";
- if (!extractAll)
- result+=" la documentación de cada clase:";
- else
- result+=" la clase de la que forman parte:";
- return result;
- }
-
- /*! This is an introduction to the page with all file members. */
- virtual QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="Lista de ";
- if (!extractAll) result+="toda la documentación de ";
- result+="los miembros con enlaces a ";
- if (extractAll)
- result+="los documentos de cada archivo a los que pertenecen:";
- else
- result+="los archivos de los que forman parte:";
- return result;
- }
-
- /*! This is an introduction to the page with the list of all header files. */
- virtual QCString trHeaderFilesDescription()
- { return "Lista de los archivos cabecera que crean el API:"; }
-
- /*! This is an introduction to the page with the list of all examples */
- virtual QCString trExamplesDescription()
- { return "Lista de todos los ejemplos:"; }
-
- /*! This is an introduction to the page with the list of related pages */
- virtual QCString trRelatedPagesDescription()
- { return "Lista de toda la documentación relacionada:"; }
-
- /*! This is an introduction to the page with the list of class/file groups */
- virtual QCString trModulesDescription()
- { return "Lista de todos los módulos:"; }
-
- /*! This sentences is used in the annotated class/file lists if no brief
- * description is given.
- */
- virtual QCString trNoDescriptionAvailable()
- { return "Descripción no disponible"; }
-
- // index titles (the project name is prepended for these)
-
-
- /*! This is used in HTML as the title of index.html. */
- virtual QCString trDocumentation()
- { return "Documentación"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all groups.
- */
- virtual QCString trModuleIndex()
- { return "Indice de módulos"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * class hierarchy.
- */
- virtual QCString trHierarchicalIndex()
- { return "Indice jerárquico"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * annotated compound index.
- */
- virtual QCString trCompoundIndex()
- { return "Indice de clases"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * list of all files.
- */
- virtual QCString trFileIndex()
- { return "Indice de archivos"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all groups.
- */
- virtual QCString trModuleDocumentation()
- { return "Documentación de módulos"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all classes, structs and unions.
- */
- virtual QCString trClassDocumentation()
- { return "Documentación de clases"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all files.
- */
- virtual QCString trFileDocumentation()
- { return "Documentación de archivos"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all examples.
- */
- virtual QCString trExampleDocumentation()
- { return "Documentación de ejemplos"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all related pages.
- */
- virtual QCString trPageDocumentation()
- { return "Documentación de páginas"; }
-
- /*! This is used in LaTeX as the title of the document */
- virtual QCString trReferenceManual()
- { return "Manual de referencia"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of defines
- */
- virtual QCString trDefines()
- { return "Definiciones"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of function prototypes
- */
- virtual QCString trFuncProtos()
- { return "Funciones prototipo"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of typedefs
- */
- virtual QCString trTypedefs()
- { return "Tipos definidos"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of enumerations
- */
- virtual QCString trEnumerations()
- { return "Enumeraciones"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) functions
- */
- virtual QCString trFunctions()
- { return "Funciones"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) 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 "Valores de la enumeración"; }
-
- /*! This text is generated when the \\author command is used and
- * for the author section in man pages. */
- virtual QCString trAuthor(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Autor" : "autor"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used in the documentation of a file before the list of
- * documentation blocks for defines
- */
- virtual QCString trDefineDocumentation()
- { return "Documentación de las definiciones"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for function prototypes
- */
- virtual QCString trFunctionPrototypeDocumentation()
- { return "Documentación de las funciones prototipo"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for typedefs
- */
- virtual QCString trTypedefDocumentation()
- { return "Documentación de los tipos definidos"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration types
- */
- virtual QCString trEnumerationTypeDocumentation()
- { return "Documentación de las enumeraciones"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration values
- */
- virtual QCString trEnumerationValueDocumentation()
- { return "Documentación de los valores de la enumeración"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for functions
- */
- virtual QCString trFunctionDocumentation()
- { return "Documentación de las funciones"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for variables
- */
- virtual QCString trVariableDocumentation()
- { return "Documentación de las variables"; }
-
- /*! This is used in the documentation of a file/namespace/group before
- * the list of links to documented compounds
- */
- virtual QCString trCompounds()
- { return "Clases"; }
-
- /*! 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)"Generado el "+date;
- if (projName) result+=(QCString)" para "+projName;
- result+=(QCString)" por";
- return result;
- }
- /*! This is part of the sentence used in the standard footer of each page.
- */
- virtual QCString trWrittenBy()
- {
- return "escrito por";
- }
-
- /*! this text is put before a class diagram */
- virtual QCString trClassDiagram(const char *clName)
- {
- return (QCString)"Diagrama de herencias de "+clName;
- }
-
- /*! this text is generated when the \\internal command is used. */
- virtual QCString trForInternalUseOnly()
- { return "Para uso interno exclusivamente."; }
-
- /*! this text is generated when the \\reimp command is used. */
- virtual QCString trReimplementedForInternalReasons()
- { return "Reimplementado por razones internas; el API no se ve afectado."; }
-
- /*! this text is generated when the \\warning command is used. */
- virtual QCString trWarning()
- { return "Atención"; }
-
- /*! this text is generated when the \\bug command is used. */
- virtual QCString trBugsAndLimitations()
- { return "Bugs y limitaciones"; }
-
- /*! this text is generated when the \\version command is used. */
- virtual QCString trVersion()
- { return "Versión"; }
-
- /*! this text is generated when the \\date command is used. */
- virtual QCString trDate()
- { return "Fecha"; }
-
- /*! this text is generated when the \return command is used. */
- virtual QCString trReturns()
- { return "Devuelve"; }
-
- /*! this text is generated when the \\sa command is used. */
- virtual QCString trSeeAlso()
- { return "Ver también"; }
-
- /*! this text is generated when the \\param command is used. */
- virtual QCString trParameters()
- { return "Parámetros"; }
-
- /*! this text is generated when the \\exception command is used. */
- virtual QCString trExceptions()
- { return "Excepciones"; }
-
- /*! this text is used in the title page of a LaTeX document. */
- virtual QCString trGeneratedBy()
- { return "Generado por"; }
-
- // new since 0.49-990307
-
- /*! used as the title of page containing all the index of all namespaces. */
- virtual QCString trNamespaceList()
- { return "Lista de namespace"; }
-
- /*! used as an introduction to the namespace list */
- virtual QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="Lista de ";
- if (!extractAll) result+="toda la documentación de ";
- result+="los namespaces con una breve descripción:";
- return result;
- }
-
- /*! used in the class documentation as a header before the list of all
- * friends of a class
- */
- virtual QCString trFriends()
- { return "Amigas"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in the class documentation as a header before the list of all
- * related classes
- */
- virtual QCString trRelatedFunctionDocumentation()
- { return "Documentación de las funciones relacionadas y clases amigas"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of the HTML page of a class/struct/union */
- virtual QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool /*isTemplate*/)
- {
-
- QCString result="Referencia de ";
- switch(compType)
- {
- case ClassDef::Class: result+="la Clase "; break;
- case ClassDef::Struct: result+="la Estructura "; break;
- case ClassDef::Union: result+="la Unión "; break;
- case ClassDef::Interface: result+="la Interfaz "; break;
- case ClassDef::Protocol: result+="Protocol "; break; // translate me!
- case ClassDef::Category: result+="Category "; break; // translate me!
- case ClassDef::Exception: result+="la Excepción "; 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="Referencia del Archivo ";
- result+=fileName;
- return result;
- }
-
- /*! used as the title of the HTML page of a namespace */
- virtual QCString trNamespaceReference(const char *namespaceName)
- {
- QCString result="Referencia del Namespace ";
- result+=namespaceName;
- return result;
- }
-
- /* these are for the member sections of a class, struct or union */
- virtual QCString trPublicMembers()
- { return "Métodos públicos"; }
- virtual QCString trPublicSlots()
- { return "Slots públicos"; }
- virtual QCString trSignals()
- { return "Señales"; }
- virtual QCString trStaticPublicMembers()
- { return "Métodos públicos estáticos"; }
- virtual QCString trProtectedMembers()
- { return "Métodos protegidos"; }
- virtual QCString trProtectedSlots()
- { return "Slots protegidos"; }
- virtual QCString trStaticProtectedMembers()
- { return "Métodos protegidos estáticos"; }
- virtual QCString trPrivateMembers()
- { return "Métodos privados"; }
- virtual QCString trPrivateSlots()
- { return "Slots privados"; }
- virtual QCString trStaticPrivateMembers()
- { return "Métodos privados estáticos"; }
-
- /*! this function is used to produce a comma-separated list of items.
- * use generateMarker(i) to indicate where item i should be put.
- */
- virtual QCString trWriteList(int numEntries)
- {
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=", y ";
- }
- }
- return result;
- }
-
- /*! used in class documentation to produce a list of base classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritsList(int numEntries)
- {
- return "Herencias "+trWriteList(numEntries)+".";
- }
-
- /*! used in class documentation to produce a list of super classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritedByList(int numEntries)
- {
- return "Heredado por "+trWriteList(numEntries)+".";
- }
-
- /*! used in member documentation blocks to produce a list of
- * members that are hidden by this one.
- */
- virtual QCString trReimplementedFromList(int numEntries)
- {
- return "Reimplementado de "+trWriteList(numEntries)+".";
- }
-
- /*! used in member documentation blocks to produce a list of
- * all member that overwrite the implementation of this member.
- */
- virtual QCString trReimplementedInList(int numEntries)
- {
- return "Reimplementado en "+trWriteList(numEntries)+".";
- }
-
- /*! This is put above each page as a link to all members of namespaces. */
- virtual QCString trNamespaceMembers()
- { return "Miembros del Namespace "; }
-
- /*! This is an introduction to the page with all namespace members */
- virtual QCString trNamespaceMemberDescription(bool extractAll)
- {
- QCString result="Lista de ";
- if (!extractAll) result+="toda la documentación de ";
- result+="los miembros del namespace con enlace a ";
- if (extractAll)
- result+="los namespace de cada miembro:";
- else
- result+="la documentación de los namespaces pertenecientes a:";
- return result;
- }
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all namespaces.
- */
- virtual QCString trNamespaceIndex()
- { return "Indice de namespace"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all namespaces.
- */
- virtual QCString trNamespaceDocumentation()
- { return "Documentación de namespace"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- virtual QCString trNamespaces()
- { return "Namespaces"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990728
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is put at the bottom of a class documentation page and is
- * followed by a list of files that were used to generate the page.
- */
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)"La documentación para esta ";
- switch(compType)
- {
- case ClassDef::Class: result+="clase"; break;
- case ClassDef::Struct: result+="estructura"; break;
- case ClassDef::Union: result+="unión"; break;
- case ClassDef::Interface: result+="interfaz"; break;
- case ClassDef::Protocol: result+="protocol"; break; // translate me!
- case ClassDef::Category: result+="category"; break; // translate me!
- case ClassDef::Exception: result+="excepción"; break;
- }
- result+=" fué generada a partir ";
- if (single) result+="del siguiente archivo:";
- else result+="de los siguientes archivos:";
- return result;
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- virtual QCString trAlphabeticalList()
- { return "Lista alfabética"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- virtual QCString trReturnValues()
- { return "Valores devueltos"; }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- virtual QCString trMainPage()
- { return "Página principal"; }
-
- /*! This is used in references to page that are put in the LaTeX
- * documentation. It should be an abbreviation of the word page.
- */
- virtual QCString trPageAbbreviation()
- { return "p."; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991003
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trSources()
- {
- return "Fuentes";
- }
- virtual QCString trDefinedAtLineInSourceFile()
- {
- return "Definición en la línea @0 del archivo @1.";
- }
- virtual QCString trDefinedInSourceFile()
- {
- return "Definición en el archivo @0.";
- }
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
- virtual QCString trDeprecated()
- {
- return "Desaprobado";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
-
- /*! this text is put before a collaboration diagram */
- virtual QCString trCollaborationDiagram(const char *clName)
- {
- return (QCString)"Diagrama de colaboración para "+clName+":";
- }
- /*! this text is put before an include dependency graph */
- virtual QCString trInclDepGraph(const char *fName)
- {
- return (QCString)"Dependencia gráfica adjunta para "+fName+":";
- }
- /*! header that is put before the list of constructor/destructors. */
- virtual QCString trConstructorDocumentation()
- {
- return "Documentación del constructor y destructor";
- }
- /*! Used in the file documentation to point to the corresponding sources. */
- virtual QCString trGotoSourceCode()
- {
- return "Ir al código fuente de este archivo.";
- }
- /*! Used in the file sources to point to the corresponding documentation. */
- virtual QCString trGotoDocumentation()
- {
- return "Ir a la documentación de este archivo.";
- }
- /*! Text for the \\pre command */
- virtual QCString trPrecondition()
- {
- return "Precondición";
- }
- /*! Text for the \\post command */
- virtual QCString trPostcondition()
- {
- return "Postcondición";
- }
- /*! Text for the \\invariant command */
- virtual QCString trInvariant()
- {
- return "Invariante";
- }
- /*! Text shown before a multi-line variable/enum initialization */
- virtual QCString trInitialValue()
- {
- return "Valor inicial:";
- }
- /*! Text used the source code in the file index */
- virtual QCString trCode()
- {
- return "código";
- }
- virtual QCString trGraphicalHierarchy()
- {
- return "Representación gráfica de la clase";
- }
- virtual QCString trGotoGraphicalHierarchy()
- {
- return "Ir a la representación gráfica de la jerarquía de la clase";
- }
- virtual QCString trGotoTextualHierarchy()
- {
- return "Ir a la jerarquía textual de la clase";
- }
- virtual QCString trPageIndex()
- {
- return "Página indice";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trNote()
- {
- return "Nota";
- }
-
- virtual QCString trPublicTypes()
- {
- return "Tipos públicos";
- }
- virtual QCString trPublicAttribs()
- {
- return "Atributos públicos";
- }
- virtual QCString trStaticPublicAttribs()
- {
- return "Atributos públicos estáticos";
- }
- virtual QCString trProtectedTypes()
- {
- return "Tipos protegidos";
- }
- virtual QCString trProtectedAttribs()
- {
- return "Atributos protegidos";
- }
- virtual QCString trStaticProtectedAttribs()
- {
- return "Atributos protegidos estáticos";
- }
- virtual QCString trPrivateTypes()
- {
- return "Tipos privados";
- }
- virtual QCString trPrivateAttribs()
- {
- return "Atributos privados";
- }
- virtual QCString trStaticPrivateAttribs()
- {
- return "Atributos privados estáticos";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a todo item */
- virtual QCString trTodo()
- {
- return "Tareas Pendientes";
- }
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- {
- return "Listado de Tareas Pendientes";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy()
- {
- return "Referenciado por";
- }
- virtual QCString trRemarks()
- {
- return "Comentarios";
- }
- virtual QCString trAttention()
- {
- return "Atención";
- }
- virtual QCString trInclByDepGraph()
- {
- return "Este gráfico muestra que archivos directa o "
- "indirectamente incluyen a este archivo:";
- }
- virtual QCString trSince()
- {
- return "Desde";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- QCString trLegendTitle()
- {
- return "Leyenda del Gráfico";
- }
- /*! page explaining how the dot graph's should be interpreted */
- QCString trLegendDocs()
- {
- return
- "Esta página explica como interpretar los gráficos que son generados "
- "por doxygen.<p>\n"
- "Considere el siguiente ejemplo:\n"
- "/*! Clase invisible por truncamiento */\n"
- "class Invisible { };\n\n"
- "/*! Clase truncada, relación de herencia escondida */\n"
- "class Truncated : public Invisible { };\n\n"
- "/* Clase no documentada con comentarios de doxygen */\n"
- "class Undocumented { };\n\n"
- "/*! Clase que es heredera usando herencia publica */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! Clase que es heredera usando herencia protegida */\n"
- "class ProtectedBase { };\n\n"
- "/*! Clase que es heredera usando herencia privada */\n"
- "class PrivateBase { };\n\n"
- "/*! Clase que es usada por la clase hija */\n"
- "class Used { };\n\n"
- "/*! Super-Clase que hereda de varias otras clases */\n"
- "class Inherited : public PublicBase,\n"
- " protected ProtectedBase,\n"
- " private PrivateBase,\n"
- " public Undocumented\n"
- "{\n"
- " private:\n"
- " Used *m_usedClass;\n"
- "};\n"
- "\\endcode\n"
- "Si la etiqueta \\c MAX_DOT_GRAPH_HEIGHT en el archivo de configuración "
- "tiene valor 200 resultará en el siguiente gráfico:"
- "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
- "Las cajas en el gráfico arriba tienen el significado que sigue:\n"
- "<ul>\n"
- "<li>Una caja llena negra representa la estructura o clase para la cuál"
- "se generó el gráfico.\n"
- "<li>Una caja con borde negro señala una estructura o clase documentada.\n"
- "<li>Una caja con borde griz señala una estructura o clase no documentada.\n"
- "<li>una caja con borde rojo señala una estructura o clase documentada \n"
- " de la cuál no toda las relaciones de jerarquía/contenido son "
- "mostradas. El gráfico sera truncado si este no calza dentro de los "
- "límites especificados."
- "afgekapt als hij niet past binnen de gespecificeerde grenzen."
- "</ul>\n"
- "Las flechas tienen el siguiente significado:\n"
- "<ul>\n"
- "<li>Una flecha azul oscuro es usada para visualizar una relación "
- "herencia publica entre dos clases.\n"
- "<li>Una flecha verde oscura es usada para herencia protegida.\n"
- "<li>Una flecha rojo oscura es usada para herencia privada.\n"
- "<li>Una flecha segmentada púrpura se usa si la clase es contenida o "
- "usada por otra clase. La flecha está etiquetada por la variable "
- "con que se accede a la clase o estructura apuntada. \n"
- "</ul>\n";
- }
- /*! text for the link to the legend page */
- QCString trLegend()
- {
- return "leyenda";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- QCString trTest()
- {
- return "Prueba";
- }
- /*! Used as the header of the test list */
- QCString trTestList()
- {
- return "Lista de Pruebas";
- }
-
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return "Métodos DCOP";
- }
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return "Propiedades";
- }
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return "Documentación de Propiedades";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java interfaces in the summary section of Java packages */
- virtual QCString trInterfaces()
- {
- return "Interfaces";
- }
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Estructuras de Datos";
- }
- else
- {
- return "Clases";
- }
- }
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
- {
- return (QCString)"Paquetes "+name;
- }
- /*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return "Lista de Paquetes ";
- }
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return "Aquí van los paquetes con una breve descripción (si etá disponible):";
- }
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return "Paquetes";
- }
- /*! Used as a chapter title for Latex & RTF output */
- virtual QCString trPackageDocumentation()
- {
- return "Documentación del Paquete";
- }
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return "Valor:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return "Bug";
- }
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return "Lista de Bugs";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as ansicpg for RTF file
- *
- * The following table shows the correlation of Charset name, Charset Value and
- * <pre>
- * Codepage number:
- * Charset Name Charset Value(hex) Codepage number
- * ------------------------------------------------------
- * DEFAULT_CHARSET 1 (x01)
- * SYMBOL_CHARSET 2 (x02)
- * OEM_CHARSET 255 (xFF)
- * ANSI_CHARSET 0 (x00) 1252
- * RUSSIAN_CHARSET 204 (xCC) 1251
- * EE_CHARSET 238 (xEE) 1250
- * GREEK_CHARSET 161 (xA1) 1253
- * TURKISH_CHARSET 162 (xA2) 1254
- * BALTIC_CHARSET 186 (xBA) 1257
- * HEBREW_CHARSET 177 (xB1) 1255
- * ARABIC _CHARSET 178 (xB2) 1256
- * SHIFTJIS_CHARSET 128 (x80) 932
- * HANGEUL_CHARSET 129 (x81) 949
- * GB2313_CHARSET 134 (x86) 936
- * CHINESEBIG5_CHARSET 136 (x88) 950
- * </pre>
- *
- */
- virtual QCString trRTFansicp()
- {
- return "1252";
- }
-
- /*! Used as ansicpg for RTF fcharset
- * \see trRTFansicp() for a table of possible values.
- */
- virtual QCString trRTFCharSet()
- {
- return "0";
- }
-
- /*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return "Índice";
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trClass(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Clase" : "clase"));
- if (first_capital) toupper(result.at(0));
- 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 ? "Archivo" : "archivo"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trNamespace(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Namespace" : "namespace"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trGroup(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Grupo" : "grupo"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trPage(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Página" : "pagina"));
- 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 ? "Miembro" : "miembro"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trField(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Campo" : "campo"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trGlobal(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Global" : "global"));
- if (!singular) result+="es";
- return result;
- }
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return "Hace referencia a";
- }
-
- /*! used in member documentation blocks to produce a list of
- * members that are implemented by this one.
- */
- virtual QCString trImplementedFromList(int numEntries)
- {
- return "Implementa "+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 "Implementado en "+trWriteList(numEntries)+".";
- }
-
- /*! used in RTF documentation as a heading for the Table
- * of Contents.
- */
- virtual QCString trRTFTableOfContents()
- {
- return "Tabla de Contenidos";
- }
-
- /*! Used as the header of the list of item that have been
- * flagged deprecated
- */
- virtual QCString trDeprecatedList()
- {
- return "Lista de Desaprobados";
- }
-
- /*! Used as a header for declaration section of the events found in
- * a C# program
- */
- virtual QCString trEvents()
- {
- return "Eventos";
- }
-
- /*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- return "Documentación de los Eventos";
- }
-
- /*! Used as a heading for a list of Java class types with package scope.
- */
- virtual QCString trPackageTypes()
- {
- return "Tipos del Paquete";
- }
-
- /*! Used as a heading for a list of Java class functions with package
- * scope.
- */
- virtual QCString trPackageMembers()
- {
- return "Funciones del Paquete";
- }
-
- /*! Used as a heading for a list of static Java class functions with
- * package scope.
- */
- virtual QCString trStaticPackageMembers()
- {
- return "Funciones Estáticas del Paquete";
- }
-
- /*! Used as a heading for a list of Java class variables with package
- * scope.
- */
- virtual QCString trPackageAttribs()
- {
- return "Atributos del Paquete";
- }
-
- /*! Used as a heading for a list of static Java class variables with
- * package scope.
- */
- virtual QCString trStaticPackageAttribs()
- {
- return "Atributos Estáticos del Paquete";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Todo";
- }
-
- /*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- return "Gráfico de llamadas para esta función:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.3
-//////////////////////////////////////////////////////////////////////////
-
-
- /*! When the search engine is enabled this text is put in the index
- * of each page before the search field.
- */
- virtual QCString trSearchForIndex()
- {
- return "Buscar";
- }
-
- /*! This string is used as the title for the page listing the search
- * results.
- */
- virtual QCString trSearchResultsTitle()
- {
- return "Resultados de la Búsqueda";
- }
-
- /*! 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
- * the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
- * value 2 represents 2 or more matches. HTML markup is allowed inside
- * the returned string.
- */
- virtual QCString trSearchResults(int numDocuments)
- {
- if (numDocuments==0)
- {
- return "Disculpe, no se encontraron documentos que coincidan con su búsqueda.";
- }
- else if (numDocuments==1)
- {
- return "Se encontró <b>1</b> documento que coincide con su búsqueda.";
- }
- else
- {
- return "Se encontraron <b>$num</b> documentos que coinciden con su búsqueda. "
- "Se muestran los mejores resultados primero.";
- }
- }
-
- /*! 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 "Coincidencias:";
- }
-
-};
-
-
-#endif
-
-
diff --git a/src/translator_fi.h b/src/translator_fi.h
deleted file mode 100644
index 9844fc7..0000000
--- a/src/translator_fi.h
+++ /dev/null
@@ -1,584 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-/*
-==================================================================================
-Suomenkielinen käännös:
-Olli Korhonen <olli.korhonen@ccc.fi>
-==================================================================================
-1999/10/19
-* Alustava käännös valmis.
-
-* Huom: Kaikille termeille on keksitty käännösvastine, mikä ei ehkä ole
- kaikissa tapauksissa hyvä ratkaisu, ja parempikin termi voi
- olla vakiintuneessa käytössä.
-
-* Tehtävää:
- - Termien kokoaminen listaksi ja suomennosten järkevyyden tarkastelu. (lista on jo melko kattava)
- Author = Tekijä
- Class = Luokka
- Compound = Kooste ?
- Data = Data
- Documentation = Dokumentaatio
- Defines = Määrittelyt ?
- Description = Selite
- Detailed = Yksityiskohtainen
- diagram = kaavio
- Enum = Enumeraatio ?
- Exceptions = Poikkeukset
- File = Tiedosto
- Friends = Ystävät ?
- Functions = Funktiot
- Hierarchical = Hierarkinen
- Index = Indeksi
- Inherits = Perii
- Member = Jäsen
- Module = Moduli
- Namespace = Nimiavaruus ?
- Parameters = Parametrit
- Private = Yksityinen
- Protected = Suojattu
- Prototypes = Prototyypit
- Public = Julkinen
- Reference Manual= Käsikirja
- Reimplemented = Uudelleen toteutettu
- Related = Liittyvä
- Signals = Signaali
- Slots = ?
- Static = Staattinen
- Struct = ?
- Typedef = Tyyppimäärittely
- Union = ?
- Variables = Muuttujat
- - Taivutusmuotojen virheettömyyden tarkastelu prepositioiden korvauskohdissa.
- - Sanasta sanaan käännöskohtien mielekkyyden tarkastelu valmiista dokumentista.
- - umlaut vastineiden käyttö scandien kohdalla.
-
-positiiviset kommentit otetaan ilolla vastaan.
-===================================================================================
-*/
-
-#ifndef TRANSLATOR_FI_H
-#define TRANSLATOR_FI_H
-
-class TranslatorFinnish : public TranslatorEnglish
-{
- public:
- /*! This method is used to generate a warning message to signal
- * the user that the translation of his/her language of choice
- * needs updating.
- */
- virtual QCString updateNeededMessage()
- {
- return "Warning: The Finnish translator is really obsolete.\n"
- "It was not updated since version 1.0.0. As a result,\n"
- "some sentences may appear in English.\n\n";
- }
-
- QCString idLanguage()
- { return "finnish"; }
-
- QCString trRelatedFunctions()
- // used in the compound documentation before a list of related functions.
- { return "Liittyvät Funktiot"; } // "Related Functions";
-
- QCString trRelatedSubscript()
- // subscript for the related functions.
- { return "(Huomaa, että nämä eivät ole jäsenfunktioita.)"; } // "(Note that these are not member functions.)"
-
- QCString trDetailedDescription()
- // header that is put before the detailed description of files, classes and namespaces.
- { return "Yksityiskohtainen Selite"; } // "Detailed Description"
-
- QCString trMemberTypedefDocumentation()
- // header that is put before the list of typedefs.
- { return "Jäsen Tyyppimäärittelyiden Dokumentaatio"; } // "Member Typedef Documentation"
-
- QCString trMemberEnumerationDocumentation()
- // header that is put before the list of enumerations.
- { return "Jäsen Enumeraatioiden Dokumentaatio"; } // "Member Enumeration Documentation"
-
- QCString trEnumerationValueDocumentation()
- { return "Enumeraatioarvojen Dokumentaatio"; }
-
- QCString trMemberFunctionDocumentation()
- // header that is put before the list of member functions.
- { return "Jäsen Funktioiden Dokumentaatio"; } // "Member Function Documentation"
- QCString trMemberDataDocumentation()
- // header that is put before the list of member attributes.
- { return "Jäsen Datan Dokumentaatio"; } // "Member Data Documentation"
-
- QCString trMore()
- // this is the text of a link put after brief descriptions.
- { return "Lisää..."; } // "More..."
-
- QCString trListOfAllMembers()
- // put in the class documentation
- { return "Lista kaikista jäsenistä."; } // "List of all members."
- QCString trMemberList()
-
- // used as the title of the "list of all members" page of a class
- { return "Jäsen Lista"; } // "Member List"
-
- QCString trThisIsTheListOfAllMembers()
- // this is the first part of a sentence that is followed by a class name
- { return "Tämä on lista kaikista jäsenistä"; } // "This is the complete list of members for "
- QCString trIncludingInheritedMembers()
- // this is the remainder of the sentence after the class name
- { return ", sisältää kaikki perityt jäsenet."; } // ", including all inherited members."
-
- QCString trGeneratedAutomatically(const char *s)
- // this is put at the author sections at the bottom of man pages.
- // parameter s is name of the project name.
- { QCString result="Automaattisesti generoitu Doxygen:lla "; // "Generated automatically by Doxygen"
- //if (s) result+=(QCString)" voor "+s;
- // tässä on ongelma, kuinka taivuttaa parametria, esim. "Jcad"+"in"; "IFC2VRML konversio"+"n"
- // mutta ratkaistaan ongelma kätevästi kaksoispisteellä -> "Jcad:n" / "IFC2VRML konversio:n"
- // lopputulos on vähemmän kökkö ja täysin luettava, mutta ei kuitenkaan täydellinen.
- if (s) result+=(QCString)s+":n ";
- result+="lähdekoodista."; // " from the source code."
- return result;
- }
-
- QCString trEnumName()
- // put after an enum name in the list of all members
- { return "enumeraation nimi"; } // "enum name"
-
- QCString trEnumValue()
- // put after an enum value in the list of all members
- { return "enumeraation arvo"; } // "enum value"
-
- QCString trDefinedIn()
- // put after an undocumented member in the list of all members
- { return "määritelty"; } // "defined in"
-
- // quick reference sections
- QCString trModules()
- // This is put above each page as a link to the list of all groups of
- // compounds or files (see the \group command).
- { return "Modulit"; } // "Modules"
- QCString trClassHierarchy()
- // This is put above each page as a link to the class hierarchy
- { return "Luokka Hierarkia"; } // "Class Hierarchy"
- QCString trCompoundList()
- // This is put above each page as a link to the list of annotated classes
- { return "Kooste Lista"; } // "Compound List"
- QCString trFileList()
- // This is put above each page as a link to the list of documented files
- { return "Tiedosto Lista"; } // "File List"
- QCString trHeaderFiles()
- // This is put above each page as a link to the list of all verbatim headers
- { return "Header Tiedostot"; } // "Header Files"
- QCString trCompoundMembers()
- // This is put above each page as a link to all members of compounds.
- { return "Koosteen Jäsenet"; } // "Compound Members"
- QCString trFileMembers()
- // This is put above each page as a link to all members of files.
- { return "Tiedosto Jäsenet"; } // "File Members"
- QCString trRelatedPages()
- // This is put above each page as a link to all related pages.
- { return "Liittyvät Sivut"; } // "Related Pages"
- QCString trExamples()
- // This is put above each page as a link to all examples.
- { return "Esimerkit"; } // "Examples"
- QCString trSearch()
- // This is put above each page as a link to the search engine.
- { return "Etsi"; } // "Search"
- QCString trClassHierarchyDescription()
- // This is an introduction to the class hierarchy.
- { return "Tämä periytymislista on päätasoltaan aakkostettu " // "This inheritance list is sorted roughly, "
- "mutta alijäsenet on aakkostettu itsenäisesti:"; // "but not completely, alphabetically:";
- }
- QCString trFileListDescription(bool extractAll)
- // This is an introduction to the list with all files.
- {
- QCString result="Täällä on lista kaikista ";
- if (!extractAll) result+="dokumentoiduista "; // "documented "
- result+="tiedostoista lyhyen selitteen kera:"; // "files with brief descriptions:"
- return result;
- }
- QCString trCompoundListDescription()
- // This is an introduction to the annotated compound list
- { return "Täällä on luokat, struktuurit ja " // "Here are the classes, structs and "
- "unionit lyhyen selitteen kera:"; // "unions with brief descriptions:"
- }
- QCString trCompoundMembersDescription(bool extractAll)
- // This is an introduction to the page with all class members
- {
- QCString result="Täällä on lista kaikista "; // "Here is a list of all "
- if (!extractAll) result+="dokumentoiduista "; // "documented "
- result+="luokan jäsenistä linkitettynä "; // "class members with links to "
- if (!extractAll)
- result+="jokaisen jäsenen luokkadokumentaatioon:"; // "the class documentation for each member:"
- else
- result+="luokkaan johon ne kuuluvat:"; // "the classes they belong to:"
- return result;
- }
- QCString trFileMembersDescription(bool extractAll)
- // This is an introduction to the page with all file members
- {
- QCString result="Täällä on lista kaikista "; // "Here is a list of all "
- if (!extractAll) result+="dokumentoiduista "; // "documented ";
- result+="tiedosto jäsenistä linkitettynä "; // "file members with links to "
- if (extractAll)
- result+="kunkin jäsenen tiedosto dokumentaatioon:"; // "the file documentation for each member:"
- else
- result+="tiedostoon johon ne kuuluvat:"; // "the files they belong to:"
- return result;
- }
- QCString trHeaderFilesDescription()
- // This is an introduction to the page with the list of all header files
- { return "Täällä on kaikki header tiedostot jotka muodostavat API:n:"; } // "Here are the header files that make up the API:"
- QCString trExamplesDescription()
- // This is an introduction to the page with the list of all examples
- { return "Täällä on lista kaikista esimerkeistä:"; } // "Here is a list of all examples:"
- QCString trRelatedPagesDescription()
- // This is an introduction to the page with the list of related pages
- { return "Täällä on lista kaikista liittyvistä dokumentaatiosivuista:"; } // "Here is a list of all related documentation pages:"
- QCString trModulesDescription()
- // This is an introduction to the page with the list of class/file groups
- { return "Täällä on lista kaikista moduleista:"; } // "Here is a list of all modules:"
- QCString trNoDescriptionAvailable()
- // This sentences is used in the annotated class/file lists if no brief
- // description is given.
- { return "Selitettä ei ole saatavilla"; } // "No description available"
-
- // index titles (the project name is prepended for these)
- QCString trDocumentation()
- // This is used in HTML as the title of index.html.
- { return "Dokumentaatio"; } // "Documentation"
- QCString trModuleIndex()
- // This is used in LaTeX as the title of the chapter with the
- // index of all groups.
- { return "Moduli Indeksi"; } // "Module Index"
- QCString trHierarchicalIndex()
- // This is used in LaTeX as the title of the chapter with the
- // class hierarchy.
- { return "Hierarkinen Indeksi"; } // "Hierarchical Index"
- QCString trCompoundIndex()
- // This is used in LaTeX as the title of the chapter with the
- // annotated compound index
- { return "Koosteiden Indeksi"; } // "Compound Index"
- QCString trFileIndex()
- // This is used in LaTeX as the title of the chapter with the
- // list of all files.
- { return "Tiedosto Indeksi"; } // "File Index"
- QCString trModuleDocumentation()
- // This is used in LaTeX as the title of the chapter containing
- // the documentation of all groups.
- { return "Moduli Dokumentaatio"; } // "Module Documentation"
- QCString trClassDocumentation()
- // This is used in LaTeX as the title of the chapter containing
- // the documentation of all classes, structs and unions.
- { return "Luokka Dokumentaatio"; } // "Class Documentation"
- QCString trFileDocumentation()
- // This is used in LaTeX as the title of the chapter containing
- // the documentation of all files.
- { return "Tiedosto Dokumentaatio"; } // "File Documentation"
- QCString trExampleDocumentation()
- // This is used in LaTeX as the title of the chapter containing
- // the documentation of all examples.
- { return "Esimerkkien Dokumentaatio"; } // "Example Documentation"
- QCString trPageDocumentation()
- // This is used in LaTeX as the title of the chapter containing
- // the documentation of all related pages.
- { return "Sivujen Dokumentaatio"; } // "Page Documentation"
- QCString trReferenceManual()
- // This is used in LaTeX as the title of the document
- { return "Käsikirja"; } // "Reference Manual"
-
- QCString trDefines()
- // This is used in the documentation of a file as a header before the
- // list of defines
- { return "Määrittelyt"; } // "Defines"
- QCString trFuncProtos()
- // This is used in the documentation of a file as a header before the
- // list of function prototypes
- { return "Funktioiden Prototyypit"; } // "Function Prototypes"
- QCString trTypedefs()
- // This is used in the documentation of a file as a header before the
- // list of typedefs
- { return "Tyyppimäärittelyt"; } // "Typedefs"
- QCString trEnumerations()
- // This is used in the documentation of a file as a header before the
- // list of enumerations
- { return "Enumeraatiot"; } // "Enumerations"
- QCString trFunctions()
- // This is used in the documentation of a file as a header before the
- // list of (global) functions
- { return "Funktiot"; } // "Functions"
- QCString trVariables()
- // This is used in the documentation of a file as a header before the
- // list of (global) variables
- { return "Muuttujat"; } // "Variables"
- QCString trEnumerationValues()
- // This is used in the documentation of a file as a header before the
- // list of (global) variables
- { return "Enumeraation arvot"; } // "Enumeration values"
-
- QCString trDefineDocumentation()
- // This is used in the documentation of a file before the list of
- // documentation blocks for defines
- { return "Määritysten dokumentointi"; } // "Define Documentation"
- QCString trFunctionPrototypeDocumentation()
- // This is used in the documentation of a file/namespace before the list
- // of documentation blocks for function prototypes
- { return "Funktio Prototyyppien Dokumentaatio"; } // "Function Prototype Documentation"
- QCString trTypedefDocumentation()
- // This is used in the documentation of a file/namespace before the list
- // of documentation blocks for typedefs
- { return "Tyyppimääritysten Dokumentaatio"; } // "Typedef Documentation"
- QCString trEnumerationTypeDocumentation()
- // This is used in the documentation of a file/namespace before the list
- // of documentation blocks for enumeration types
- { return "Enumeraatio Tyyppien Dokumentaatio"; } // "Enumeration Type Documentation"
- QCString trFunctionDocumentation()
- // This is used in the documentation of a file/namespace before the list
- // of documentation blocks for functions
- { return "Funktioiden Dokumentaatio"; } // "Function Documentation"
- QCString trVariableDocumentation()
- // This is used in the documentation of a file/namespace before the list
- // of documentation blocks for variables
- { return "Muuttujien Dokumentaatio"; } // "Variable Documentation"
- QCString trCompounds()
- // This is used in the documentation of a file/namespace/group before
- // the list of links to documented compounds
- { return "Koosteet"; } // "Compounds"
- QCString trFiles()
- // This is used in the documentation of a group before the list of
- // links to documented files
- { return "Tiedostot"; } // "Files"
-
- QCString trGeneratedAt(const char *date,const char *projName)
- {
- // funktio on hiukan vaikea kääntää prepositioihin sidotun rakenteen vuoksi.
- QCString result=(QCString)"Generoitu "+date; // "Generated at "
- if (projName) result+=(QCString)" projektille "+projName; // " for "
- result+=(QCString)" tekijä: "; // " by"
- return result;
- }
- QCString trWrittenBy()
- {
- return "kirjoittanut"; // "written by"
- }
- QCString trClassDiagram(const char *clName)
- // this text is put before a class diagram
- {
- return (QCString)clName+":n Luokkakaavio"; // "Class diagram for "
- }
-
- QCString trForInternalUseOnly()
- // this text is generated when the \internal command is used.
- { return "Vain sisäiseen käyttöön."; } // "For internal use only."
- QCString trReimplementedForInternalReasons()
- // this text is generated when the \reimp command is used.
- { return "Uudelleen toteutettu sisäisistä syistä; API ei ole muuttunut."; } // "Reimplemented for internal reasons; the API is not affected."
- QCString trWarning()
- // this text is generated when the \warning command is used.
- { return "Varoitus"; } // "Warning"
- // this text is generated when the \bug command is used.
- QCString trBugsAndLimitations()
- { return "Virheet ja rajoitukset"; } // "Bugs and limitations"
- QCString trVersion()
- // this text is generated when the \version command is used.
- { return "Versio"; } // "Version"
- QCString trDate()
- // this text is generated when the \date command is used.
- { return "Päiväys"; } // "Date"
- QCString trAuthors()
- // this text is generated when the \author command is used.
- { return "Tekijä(t)"; } // "Author(s)"
- QCString trReturns()
- // this text is generated when the \return command is used.
- { return "Palauttaa"; } // "Returns"
- QCString trSeeAlso()
- // this text is generated when the \sa command is used.
- { return "Katso myös"; } // "See also"
- QCString trParameters()
- // this text is generated when the \param command is used.
- { return "Parametrit"; } // "Parameters"
- QCString trExceptions()
- // this text is generated when the \exception command is used.
- { return "Poikkeukset"; } // "Exceptions"
- QCString trGeneratedBy()
- // this text is used in the title page of a LaTeX document.
- { return "Generoinut"; } // "Generated by"
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307
-//////////////////////////////////////////////////////////////////////////
-
- QCString trNamespaceList()
- // used as the title of page containing all the index of all namespaces.
- { return "Nimiavaruus Lista"; } // "Namespace List"
- QCString trNamespaceListDescription(bool extractAll)
- // used as an introduction to the namespace list
- {
- QCString result="Täällä on lista kaikista "; // "Here is a list of all "
- if (!extractAll) result+="dokumentoiduista "; // "Here is a list of all "
- result+="nimiavaruuksista lyhyen selitteen kera:"; // "namespaces with brief descriptions:"
- return result;
- }
- QCString trFriends()
- // used in the class documentation as a header before the list of all
- // friends of a class
- { return "Ystävät"; } // "Friends"
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- QCString trRelatedFunctionDocumentation()
- // used in the class documentation as a header before the list of all
- // related classes
- { return "Ystävät ja niihin Liittyvien Funktioiden Dokumentaatio"; } // "Friends And Related Function Documentation"
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool /*isTemplate*/)
- // used as the title of the HTML page of a class/struct/union
- {
- QCString result=(QCString)clName+" ";
- switch(compType)
- {
- case ClassDef::Class: result+=" Luokka"; break; // "Class"
- case ClassDef::Struct: result+=" Struct"; break; // "Struct"
- case ClassDef::Union: result+=" Union"; break; // "Union"
- case ClassDef::Interface: result+=" Interface"; break; // "Interface"
- case ClassDef::Protocol: result+=" Protocol"; break; // translate me!
- case ClassDef::Category: result+=" Category"; break; // translate me!
- case ClassDef::Exception: result+=" Exception"; break; // "Interface"
- }
- result+=" Referenssi"; // " Reference"
- return result;
- }
- virtual QCString trFileReference(const char *fileName)
- // used as the title of the HTML page of a file
- {
- QCString result=fileName;
- result+=" Tiedosto Referenssi"; // " File Reference"
- return result;
- }
- virtual QCString trNamespaceReference(const char *namespaceName)
- // used as the title of the HTML page of a namespace
- {
- QCString result=namespaceName;
- result+=" Nimiavaruus Referenssi"; // " Namespace Reference"
- return result;
- }
-
- // these are for the member sections of a class, struct or union
- virtual QCString trPublicMembers()
- { return "Julkiset Jäsenet"; } // "Public Members"
- virtual QCString trPublicSlots()
- { return "Julkiset Slotit"; } // "Public Slots"
- virtual QCString trSignals()
- { return "Signaalit"; } // "Signals"
- virtual QCString trStaticPublicMembers()
- { return "Staattiset Julkiset Jäsenet"; } // "Static Public Members"
- virtual QCString trProtectedMembers()
- { return "Suojatut Jäsenet"; } // "Protected Members"
- virtual QCString trProtectedSlots()
- { return "Suojatut Slotit"; } // "Protected Slots"
- virtual QCString trStaticProtectedMembers()
- { return "Staattiset Suojatut Jäsenet"; } // "Static Protected Members"
- virtual QCString trPrivateMembers()
- { return "Yksityiset Jäsenet"; } // "Private Members"
- virtual QCString trPrivateSlots()
- { return "Yksityiset Slotit"; } // "Private Slots"
- virtual QCString trStaticPrivateMembers()
- { return "Staattiset Yksityiset Jäsenet"; } // "Static Private Members"
- // end of member sections
-
- virtual QCString trWriteList(int numEntries)
- {
- // this function is used to produce a comma-separated list of items.
- // use generateMarker(i) to indicate where item i should be put.
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=" ja "; // ", and "
- }
- }
- return result;
- }
-
- virtual QCString trInheritsList(int numEntries)
- // used in class documentation to produce a list of base classes,
- // if class diagrams are disabled.
- {
- return "Perijät "+trWriteList(numEntries)+"."; // "Inherits "
- }
- virtual QCString trInheritedByList(int numEntries)
- // used in class documentation to produce a list of super classes,
- // if class diagrams are disabled.
- {
- return "Periytyy "+trWriteList(numEntries)+"."; // "Inherited by "
- }
- virtual QCString trReimplementedFromList(int numEntries)
- // used in member documentation blocks to produce a list of
- // members that are hidden by this one.
- {
- return "Uudelleen toteutettu "+trWriteList(numEntries)+"."; // "Reimplemented from "
- }
- virtual QCString trReimplementedInList(int numEntries)
- {
- // used in member documentation blocks to produce a list of
- // all member that overwrite the implementation of this member.
- return "Uudelleen toteutettu "+trWriteList(numEntries)+"."; // "Reimplemented in "
- }
-
- virtual QCString trNamespaceMembers()
- // This is put above each page as a link to all members of namespaces.
- { return "Nimiavaruuden jäsenet"; } // "Namespace Members"
- virtual QCString trNamespaceMemberDescription(bool extractAll)
- // This is an introduction to the page with all namespace members
- {
- QCString result="Täällä on lista kaikista "; // "Here is a list of all "
- if (!extractAll) result+="dokumentoiduista "; // "documented "
- result+="nimiavaruuden jäsenistä linkitettynä "; // "namespace members with links to "
- if (extractAll)
- result+="nimiavaruuden dokumentaatioon johon ne kuuluvat:"; // "the namespace documentation for each member:";
- else
- result+="nimiavaruuteen johon ne kuuluvat:"; // "the namespaces they belong to:"
- return result;
- }
- virtual QCString trNamespaceIndex()
- // This is used in LaTeX as the title of the chapter with the
- // index of all namespaces.
- { return "Nimiavaruuden Indeksi"; } // "Namespace Index"
- virtual QCString trNamespaceDocumentation()
- // This is used in LaTeX as the title of the chapter containing
- // the documentation of all namespaces.
- { return "Nimiavaruuden Dokumentaatio"; } // "Namespace Documentation"
-};
-
-#endif
diff --git a/src/translator_fr.h b/src/translator_fr.h
deleted file mode 100644
index 0dc2ef6..0000000
--- a/src/translator_fr.h
+++ /dev/null
@@ -1,1671 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- * The translation into French was provided by
- * Christophe Bordeux (bordeux@lig.di.epfl.ch)
- * and after version 1.2.0 by Xavier Outhier (xouthier@yahoo.fr)
- * member of the non for profit association D2SET (http://d2set.free.fr)
- */
-
-/******************************************************************************
- * History of content
- *
- * Date | Description
- * ============+=============================================================
- * 2001-11-22 | Removed obsolet methods:
- * | QCString latexBabelPackage()
- * | QCString trAuthor()
- * | QCString trAuthors()
- * | QCString trFiles()
- * | QCString trIncludeFile()
- * | QCString trVerbatimText(const char *f)
- * -------------+------------------------------------------------------------
- * 2002-01-23 | Update for new since 1.2.13
- * -------------+------------------------------------------------------------
- * 2002-07-11 | Update for new since 1.2.16
- * -------------+------------------------------------------------------------
- * 2002-09-24 | Update for new since 1.2.17
- * -------------+------------------------------------------------------------
- * 2002-10-22 | Update for new since 1.2.18
- * -------------+------------------------------------------------------------
- * 2003-02-04 | Corrected typo. Thanks to Bertrand M. :)
- * -------------+------------------------------------------------------------
- * 2003-03-29 | Update for new since 1.3
- * -------------+------------------------------------------------------------
- * 2003-03-29 | Changed fonction into méthode.
- * -------------+------------------------------------------------------------
- * 2003-06-06 | Fixed code page problem appeared between 1.42 and 1.43 in CVS
- * -------------+------------------------------------------------------------
- * 2003-06-10 | Update for new since 1.3.1
- * -------------+------------------------------------------------------------
- * 2003-09-12 | Update for new since 1.3.3
- * -------------+------------------------------------------------------------
- * 2004-04-30 | Updates by Jacques Bouchard <jacques.bouchard@noos.fr>:
- * | - spaces between ':' removed (should be added by the renderer)
- * | - missing spaces added
- * | - missing tests for OPTIMIZE_OUTPUT_FOR_C added
- * | - translations corrected
- * | - translator_fr.h now conforms exactly to translator_en.h
- * | (try: gvim -d translator_en.h translator_fr.h)
- * -------------+------------------------------------------------------------
- * 2005-07-12 | Update for new since 1.4.1
- * -------------+------------------------------------------------------------
- */
-#ifndef TRANSLATOR_FR_H
-#define TRANSLATOR_FR_H
-
-// When defining a translator class for the new language, follow
-// the description in the documentation. One of the steps says
-// that you should copy the translator_en.h (this) file to your
-// translator_xx.h new file. Your new language should use the
-// Translator class as the base class. This means that you need to
-// implement exactly the same (pure virtual) methods as the
-// TranslatorEnglish does. Because of this, it is a good idea to
-// start with the copy of TranslatorEnglish and replace the strings
-// one by one.
-//
-// It is not necessary to include "translator.h" or
-// "translator_adapter.h" here. The files are included in the
-// language.cpp correctly. Not including any of the mentioned
-// files frees the maintainer from thinking about whether the
-// first, the second, or both files should be included or not, and
-// why. This holds namely for localized translators because their
-// base class is changed occasionaly to adapter classes when the
-// Translator class changes the interface, or back to the
-// Translator class (by the local maintainer) when the localized
-// translator is made up-to-date again.
-
-class TranslatorFrench : public Translator
-{
- public:
-
- // --- Language control methods -------------------
-
- /*! Used for identification of the language. The identification
- * should not be translated. It should be replaced by the name
- * of the language in English using lower-case characters only
- * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
- * the identification used in language.cpp.
- */
- virtual QCString idLanguage()
- { return "french"; }
-
- /*! Used to get the LaTeX command(s) for the language support.
- * This method should return string with commands that switch
- * LaTeX to the desired language. For example
- * <pre>"\\usepackage[german]{babel}\n"
- * </pre>
- * or
- * <pre>"\\usepackage{polski}\n"
- * "\\usepackage[latin2]{inputenc}\n"
- * "\\usepackage[T1]{fontenc}\n"
- * </pre>
- */
- virtual QCString latexLanguageSupportCommand()
- {
- return "\\usepackage[french]{babel}\n";
- }
-
- /*! return the language charset. This will be used for the HTML output */
- virtual QCString idLanguageCharset()
- {
- return "iso-8859-1";
- }
-
- // --- Language translation methods -------------------
-
- /*! used in the compound documentation before a list of related functions. */
- virtual QCString trRelatedFunctions()
- { return "Fonctions associées"; }
-
- /*! subscript for the related functions. */
- virtual QCString trRelatedSubscript()
- { return "(Noter 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"; }
-
- /*! header that is put before the list of typedefs. */
- virtual QCString trMemberTypedefDocumentation()
- { return "Documentation des typedef membres"; }
-
- /*! header that is put before the list of enumerations. */
- 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"; }
-
- /*! header that is put before the list of member attributes. */
- virtual QCString trMemberDataDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- 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..."; }
-
- /*! put in the class documentation */
- 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"; }
-
- /*! 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 "; }
-
- /*! this is the remainder of the sentence after the class name */
- 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;
- }
-
- /*! put after an enum name in the list of all members */
- 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"; }
-
- /*! put after an undocumented member in the list of all members */
- 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"; }
-
- /*! This is put above each page as a link to the class hierarchy */
- 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()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Structures de données";
- }
- else
- {
- 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"; }
-
- /*! This is put above each page as a link to the list of all verbatim headers */
- virtual QCString trHeaderFiles()
- { return "Fichiers d'en-tête"; }
-
- /*! This is put above each page as a link to all members of compounds. */
- virtual QCString trCompoundMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Champs de donnée";
- }
- else
- {
- return "Membres de classe";
- }
- }
-
- /*! This is put above each page as a link to all members of files. */
- virtual QCString trFileMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Portée globale";
- }
- else
- {
- return "Membres de fichier";
- }
- }
-
- /*! This is put above each page as a link to all related pages. */
- virtual QCString trRelatedPages()
- { return "Pages associées"; }
-
- /*! This is put above each page as a link to all examples. */
- virtual QCString trExamples()
- { return "Exemples"; }
-
- /*! This is put above each page as a link to the search engine. */
- 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:";
- }
-
- /*! 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()
- {
-
- 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, "
- "unions et interfaces avec une brève description:";
- }
- }
-
- /*! This is an introduction to the page with all class members. */
- virtual QCString trCompoundMembersDescription(bool extractAll)
- {
- 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 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)
- {
- QCString result="Liste ";
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="des fonctions, variables, macros, enumérations, et typedefs ";
- }
- else
- {
- result+="de tous les membres de fichier ";
- }
- if (!extractAll) result+="documentés ";
- result+="avec 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 header files. */
- virtual QCString trHeaderFilesDescription()
- { return "Liste des fichiers d'en-tête constituant l'interface de programmation:"; }
-
- /*! This is an introduction to the page with the list of all examples */
- 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:"; }
-
- /*! This is an introduction to the page with the list of class/file groups */
- virtual QCString trModulesDescription()
- { return "Liste de tous les modules:"; }
-
- /*! This sentences is used in the annotated class/file lists if no brief
- * description is given.
- */
- virtual QCString trNoDescriptionAvailable()
- { return "Aucune description disponible"; }
-
- // index titles (the project name is prepended for these)
-
-
- /*! This is used in HTML as the title of index.html. */
- 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"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * class hierarchy.
- */
- 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()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- 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"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all groups.
- */
- 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()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- 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"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all examples.
- */
- 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"; }
-
- /*! This is used in LaTeX as the title of the document */
- 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"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of function prototypes
- */
- virtual QCString trFuncProtos()
- { return "Prototypes de fonction"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of typedefs
- */
- virtual QCString trTypedefs()
- { return "Typedefs"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of enumerations
- */
- 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"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) 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"; }
-
- /*! This is used in the documentation of a file before the list of
- * documentation blocks for defines
- */
- virtual QCString trDefineDocumentation()
- { return "Documentation des macros"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for function prototypes
- */
- virtual QCString trFunctionPrototypeDocumentation()
- { return "Documentation des prototypes de fonction"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for typedefs
- */
- virtual QCString trTypedefDocumentation()
- { return "Documentation des typedef"; }
-
- /*! 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"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration values
- */
- virtual QCString trEnumerationValueDocumentation()
- { return "Documentation de la valeur énumérée"; }
-
- /*! 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"; }
-
- /*! 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"; }
-
- /*! This is used in the documentation of a file/namespace/group before
- * the list of links to documented compounds
- */
- virtual QCString trCompounds()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Structures de données";
- }
- else
- {
- 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;
- }
- /*! This is part of the sentence used in the standard footer of each page.
- */
- virtual QCString trWrittenBy()
- {
- return "écrit par";
- }
-
- /*! this text is put before a class diagram */
- 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 "À usage interne uniquement."; }
-
- /*! this text is generated when the \\reimp command is used. */
- virtual QCString trReimplementedForInternalReasons()
- { return "Réimplémenté pour des raisons internes; "
- "l'interface de programmation n'est pas modifiée.";
- }
-
- /*! this text is generated when the \\warning command is used. */
- virtual QCString trWarning()
- { return "Avertissement"; }
-
- /*! this text is generated when the \\bug command is used. */
- virtual QCString trBugsAndLimitations()
- { return "Bogues et limitations"; }
-
- /*! this text is generated when the \\version command is used. */
- virtual QCString trVersion()
- { return "Version"; }
-
- /*! this text is generated when the \\date command is used. */
- virtual QCString trDate()
- { return "Date"; }
-
- /*! this text is generated when the \\return command is used. */
- virtual QCString trReturns()
- { return "Renvoie"; }
-
- /*! this text is generated when the \\sa command is used. */
- virtual QCString trSeeAlso()
- { return "Voir également"; }
-
- /*! this text is generated when the \\param command is used. */
- virtual QCString trParameters()
- { return "Paramètres"; }
-
- /*! this text is generated when the \\exception command is used. */
- 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"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of page containing all the index of all namespaces. */
- virtual QCString trNamespaceList()
- { return "Liste des namespaces"; }
-
- /*! used as an introduction to the namespace list */
- virtual QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="Liste de tous les namespaces ";
- 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"; }
-
-//////////////////////////////////////////////////////////////////////////
-// 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"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of the HTML page of a class/struct/union */
- virtual QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- {
- QCString result="Référence 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;
- }
- result+=(QCString)clName;
- if (isTemplate) result+=" (modèle)";
- 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;
- }
-
- /*! used as the title of the HTML page of a namespace */
- virtual QCString trNamespaceReference(const char *namespaceName)
- {
- QCString result= "Référence du namespace ";
- 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"; }
-
- /*! this function is used to produce a comma-separated list of items.
- * use generateMarker(i) to indicate where item i should be put.
- */
- virtual QCString trWriteList(int numEntries)
- {
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=", 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)+".";
- }
-
- /*! 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)+".";
- }
-
- /*! 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)+".";
- }
-
- /*! 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)+".";
- }
-
- /*! This is put above each page as a link to all members of namespaces. */
- virtual QCString trNamespaceMembers()
- { return "Membres de namespace"; }
-
- /*! This is an introduction to the page with all namespace members */
- virtual QCString trNamespaceMemberDescription(bool extractAll)
- {
- QCString result="Liste de tous les membres de namespace ";
- if (!extractAll) result+="documentés ";
- result+="avec liens vers ";
- if (extractAll)
- result+="la documentation de namespace de chaque membre:";
- else
- result+="les namespaces 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 namespaces"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all namespaces.
- */
- virtual QCString trNamespaceDocumentation()
- { return "Documentation des namespaces"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- virtual QCString trNamespaces()
- { return "Namespaces"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990728
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is put at the bottom of a class documentation page and is
- * followed by a list of files that were used to generate the page.
- */
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)"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"; break;
- case ClassDef::Category: result+="cette catégorie"; break;
- case ClassDef::Exception: result+="cette exception"; break;
- }
- result+=" a été générée à partir ";
- if (single) result+="du fichier suivant:";
- else result+="des fichiers suivants:";
- return result;
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- virtual QCString trAlphabeticalList()
- { return "Liste alphabétique"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- 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"; }
-
- /*! This is used in references to page that are put in the LaTeX
- * documentation. It should be an abbreviation of the word page.
- */
- virtual QCString trPageAbbreviation()
- { return "p."; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991003
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trSources()
- {
- return "Sources";
- }
- 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
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDeprecated()
- {
- return "Obsolète";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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+":";
- }
- /*! 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+":";
- }
- /*! header that is put before the list of constructor/destructors. */
- virtual QCString trConstructorDocumentation()
- {
- return "Documentation des contructeurs et destructeur";
- }
- /*! Used in the file documentation to point to the corresponding sources. */
- 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.";
- }
- /*! Text for the \\pre command */
- virtual QCString trPrecondition()
- {
- return "Précondition";
- }
- /*! Text for the \\post command */
- virtual QCString trPostcondition()
- {
- return "Postcondition";
- }
- /*! Text for the \\invariant command */
- virtual QCString trInvariant()
- {
- return "Invariant";
- }
- /*! Text shown before a multi-line variable/enum initialization */
- 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";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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()
- {
- return "Attributs privés";
- }
- virtual QCString trStaticPrivateAttribs()
- {
- return "Attributs privés statiques";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\todo item */
- virtual QCString trTodo()
- {
- return "À faire";
- }
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- {
- return "Liste des choses à faire";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "
- "ou indirectement ce fichier:";
- }
- virtual QCString trSince()
- {
- return "Depuis";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- 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"
- "Si la valeur 240 est attribuée au tag \\c MAX_DOT_GRAPH_HEIGHT "
- "du fichier de configuration, cela génèrera le graphe suivant:"
- "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\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 public "
- "entre deux classes.\n"
- "<li>Une flèche vert foncé est utilisée pour une relation d'héritage protégé.\n"
- "<li>Une flèche rouge foncé est utilisée pour une relation d'héritage privé.\n"
- "<li>Une flèche violette en pointillés est utilisée si une classe est contenue ou "
- "utilisée par une autre classe. La flèche est étiquetée avec la ou les variable(s) "
- "qui permettent d'accéder à la classe ou structure pointée. \n"
- "<li>Une flèche verte en pointillés indique une relation entre une classe instanciée et "
- "le modèle de classe utilisé. La flèche est étiquetée avec "
- "les paramètres de modèle de la classe instanciée.\n"
- "</ul>\n";
- }
- /*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return "légende";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return "Test";
- }
- /*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return "Liste des tests";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return "Fonctions membres DCOP";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- 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";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java interfaces in the summary section of Java packages */
- virtual QCString trInterfaces()
- {
- return "Interfaces";
- }
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Structures de données";
- }
- else
- {
- 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";
- }
- /*! The description of the package index page */
- 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";
- }
- /*! Used as a chapter title for Latex & RTF output */
- virtual QCString trPackageDocumentation()
- {
- return "Documentation des paquetages";
- }
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return "Valeur:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return "Bogue";
- }
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return "Liste des bogues";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as ansicpg for RTF file
- *
- * The following table shows the correlation of Charset name, Charset Value and
- * <pre>
- * Codepage number:
- * Charset Name Charset Value(hex) Codepage number
- * ------------------------------------------------------
- * DEFAULT_CHARSET 1 (x01)
- * SYMBOL_CHARSET 2 (x02)
- * OEM_CHARSET 255 (xFF)
- * ANSI_CHARSET 0 (x00) 1252
- * RUSSIAN_CHARSET 204 (xCC) 1251
- * EE_CHARSET 238 (xEE) 1250
- * GREEK_CHARSET 161 (xA1) 1253
- * TURKISH_CHARSET 162 (xA2) 1254
- * BALTIC_CHARSET 186 (xBA) 1257
- * HEBREW_CHARSET 177 (xB1) 1255
- * ARABIC _CHARSET 178 (xB2) 1256
- * SHIFTJIS_CHARSET 128 (x80) 932
- * HANGEUL_CHARSET 129 (x81) 949
- * GB2313_CHARSET 134 (x86) 936
- * CHINESEBIG5_CHARSET 136 (x88) 950
- * </pre>
- *
- */
- virtual QCString trRTFansicp()
- {
- return "1252";
- }
-
-
- /*! Used as ansicpg for RTF fcharset
- * \see trRTFansicp() for a table of possible values.
- */
- virtual QCString trRTFCharSet()
- {
- return "0";
- }
-
- /*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return "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;
- }
-
- /*! 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;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trNamespace(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Namespace" : "namespace"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trGroup(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "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;
- }
-
- /*! 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;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trField(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Champ" : "champ"));
- 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 ? "Global(e)" : "global(e)"));
- if (!singular) result+="s";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is generated when the \\author command is used and
- * for the author section in man pages. */
- virtual QCString trAuthor(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Auteur" : "auteur"));
- if (!singular) result+="s";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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)+".";
- }
-
- /*! 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)+".";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.18
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a header for declaration section of the events found in
- * a C# program
- */
- virtual QCString trEvents()
- {
- return "Evénements";
- }
- /*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- return "Documentation des événements";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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";
- }
- /*! Used as a heading for a list of Java class functions with package
- * scope.
- */
- 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";
- }
- /*! Used as a heading for a list of Java class variables with package
- * scope.
- */
- 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";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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";
- }
- /*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- return "Voici le graphe d'appel pour cette fonction:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! When the search engine is enabled this text is put in the header
- * of each page before the field where one can enter the text to search
- * for.
- */
- virtual QCString trSearchForIndex()
- {
- return "Rechercher";
- }
- /*! This string is used as the title for the page listing the search
- * results.
- */
- 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
- * the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
- * value 2 represents 2 or more matches. HTML markup is allowed inside
- * the returned string.
- */
- virtual QCString trSearchResults(int numDocuments)
- {
- if (numDocuments==0)
- {
- return "Sorry, no documents matching your query.";
- }
- 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.. "
- "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:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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:";
- }
-
- /*! 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 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;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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, "
- "proposée par commodité. Elle diffère de la fonction "
- "çi-dessus uniquement par le(s) argument(s) qu'elle accepte.";
- }
-};
-
-#endif
-
diff --git a/src/translator_gr.h b/src/translator_gr.h
deleted file mode 100644
index 8a0af27..0000000
--- a/src/translator_gr.h
+++ /dev/null
@@ -1,1335 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-
-/*
- * 15 Dec 2001 : Translation to greek by
- * Harry Kalogirou <harkal@rainbow.cs.unipi.gr>
- */
-
-#ifndef TRANSLATOR_GR_H
-#define TRANSLATOR_GR_H
-
-class TranslatorGreek : public TranslatorAdapter_1_2_11
-{
- public:
-
- // --- Language control methods -------------------
-
- /*! Used for identification of the language. The identification
- * should not be translated. It should be replaced by the name
- * of the language in English using lower-case characters only
- * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
- * the identification used in language.cpp.
- */
- virtual QCString idLanguage()
- { return "greek"; }
-
- virtual QCString latexLanguageSupportCommand()
- {
- return "\\usepackage[greek,english]{babel}\n\\usepackage[iso-8859-7]{inputenc}\n";
- }
-
- /*! return the language charset. This will be used for the HTML output */
- virtual QCString idLanguageCharset()
- {
- return "iso-8859-7";
- }
-
- // --- Language translation methods -------------------
-
- /*! used in the compound documentation before a list of related functions. */
- virtual QCString trRelatedFunctions()
- { return "Ó÷åôéêÝò óõíáñôÞóåéò"; }
-
- /*! subscript for the related functions. */
- virtual QCString trRelatedSubscript()
- { return "(Óçìåéþóôå üôé áõôÝò äåí åßíáé óõíáñôÞóåéò ìÝëç.)"; }
-
- /*! header that is put before the detailed description of files, classes and namespaces. */
- virtual QCString trDetailedDescription()
- { return "ËåðôïìåñÞ ÐåñéãñáöÞ"; }
-
- /*! header that is put before the list of typedefs. */
- virtual QCString trMemberTypedefDocumentation()
- { return "Ôåêìçñßùóç Ìåëþí Typedef"; }
-
- /*! header that is put before the list of enumerations. */
- virtual QCString trMemberEnumerationDocumentation()
- { return "Ôåêìçñßùóç ÁðáñéèìÞóåùí Ìåëþí"; }
-
- /*! header that is put before the list of member functions. */
- virtual QCString trMemberFunctionDocumentation()
- { return "Ôåêìçñßùóç ÓõíáñôÞóåùí Ìåëþí"; }
-
- /*! header that is put before the list of member attributes. */
- virtual QCString trMemberDataDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Ôåêìçñßùóç Ðåäßùí";
- }
- else
- {
- return "Ôåêìçñßùóç ÄåäïìÝíùí Ìåëþí";
- }
- }
-
- /*! this is the text of a link put after brief descriptions. */
- virtual QCString trMore()
- { return "Ðåñéóóüôåñá..."; }
-
- /*! put in the class documentation */
- virtual QCString trListOfAllMembers()
- { return "Ëßóôá üëùí ôùí ìåëþí."; }
-
- /*! used as the title of the "list of all members" page of a class */
- virtual QCString trMemberList()
- { return "Ëßóôá ìåëþí"; }
-
- /*! this is the first part of a sentence that is followed by a class name */
- virtual QCString trThisIsTheListOfAllMembers()
- { return "Áêïëïõèåß ç ðëÞñçò ëßóôá ôùí ìåëþí ôçò"; }
-
- /*! this is the remainder of the sentence after the class name */
- virtual QCString trIncludingInheritedMembers()
- { return ", ðåñéëáìâáíïìÝíùí üëùí ôùí êëçñïíïìçìÝíùí ìåëþí."; }
-
- /*! 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="ÄçìéïõñãÞèçêå áõôüìáôá áðü ôï Doxygen";
- if (s) result+=(QCString)" ãéá "+s;
- result+=" áðü ôïí ðçãáßï êþäéêá.";
- return result;
- }
-
- /*! put after an enum name in the list of all members */
- virtual QCString trEnumName()
- { return "üíïìá áðáñýèìéóçò"; }
-
- /*! put after an enum value in the list of all members */
- virtual QCString trEnumValue()
- { return "ôéìÞ áðáñýèìéóçò"; }
-
- /*! put after an undocumented member in the list of all members */
- virtual QCString trDefinedIn()
- { return "ïñéóìÝíï óôï "; }
-
- // 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 "ÊïììÜôéá"; }
-
- /*! This is put above each page as a link to the class hierarchy */
- virtual QCString trClassHierarchy()
- { return "Éåñáñ÷ßá ÊëÜóåùí"; }
-
- /*! This is put above each page as a link to the list of annotated classes */
- virtual QCString trCompoundList()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "ÄïìÝò ÄåäïìÝíùí";
- }
- else
- {
- return "Ëßóôá ÓõóóùìáôùìÜôùí";
- }
- }
-
- /*! This is put above each page as a link to the list of documented files */
- virtual QCString trFileList()
- { return "Ëßóôá Áñ÷åßùí"; }
-
- /*! This is put above each page as a link to the list of all verbatim headers */
- virtual QCString trHeaderFiles()
- { return "Áñ÷åßá Êåöáëßäáò"; }
-
- /*! This is put above each page as a link to all members of compounds. */
- virtual QCString trCompoundMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Ðåäßá ÄåäïìÝíùí";
- }
- else
- {
- return "ÌÝëç Óõóóùìáôþìáôá";
- }
- }
-
- /*! This is put above each page as a link to all members of files. */
- virtual QCString trFileMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Êáèïëéêïß ïñéóìïß";
- }
- else
- {
- return "ÌÝëç Áñ÷åßùí";
- }
- }
-
- /*! This is put above each page as a link to all related pages. */
- virtual QCString trRelatedPages()
- { return "Ó÷åôéêÝò Óåëßäåò"; }
-
- /*! This is put above each page as a link to all examples. */
- virtual QCString trExamples()
- { return "Ðáñáäåßãìáôá"; }
-
- /*! This is put above each page as a link to the search engine. */
- virtual QCString trSearch()
- { return "ÁíáæÞôçóç"; }
-
- /*! This is an introduction to the class hierarchy. */
- virtual QCString trClassHierarchyDescription()
- { return "ÁõôÞ ç ëßóôá êëçñïíïìçêüôçôáò åßíáé ìåñéêþò ôáîéíïìçìÝíç, "
- "áëëÜ ü÷é ðëÞñùò, áëöáâçôéêÜ:";
- }
-
- /*! This is an introduction to the list with all files. */
- virtual QCString trFileListDescription(bool extractAll)
- {
- QCString result="Áêïëïõèåß ìéá ëßóôá üëùí ôùí ";
- if (!extractAll) result+="ôåêìçñéùìÝíùí ";
- result+="áñ÷åßùí ìå óýíôïìåò ðåñéãñáöÝò:";
- return result;
- }
-
- /*! This is an introduction to the annotated compound list. */
- virtual QCString trCompoundListDescription()
- {
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Áêïëïõèïýíå ïé äïìÝò äåäïìÝíùí ìå óýíôïìåò ðåñéãñáöÝò:";
- }
- else
- {
- return "Áêïëïõèïýíå ïé êëÜóåéò, ïé äïìÝò, "
- "ôá óþìáôá êáé ïé äéáðñïóùðßåò ìå óýíôïìåò ðåñéãñáöÝò:";
- }
- }
-
- /*! This is an introduction to the page with all class members. */
- virtual QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result="Áêïëïõèåß ç ëßóôá üëùí ôùí ";
- if (!extractAll)
- {
- result+="ôåêìçñéùìÝíùí ";
- }
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="ðåäßùí äïìþí êáé óùìÜôùí ";
- }
- else
- {
- result+="êëÜóåùí";
- }
- result+=" ìå óõíäÝóìïõò ";
- if (!extractAll)
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="óôçí ôåêìçñßùóç ôùí äïìþí/åíþóåùí ãéá êÜèå ðåäßï:";
- }
- else
- {
- result+="óôçí ôåêìçñßùóç ôùí êëÜóåùí ãéá êÜèå ðåäßï:";
- }
- }
- else
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="óôéò äïìÝò/åíþóåéò ðïõ áíÞêïõí:";
- }
- else
- {
- result+="óôéò êëÜóåéò ðïõ áíÞêïõí:";
- }
- }
- return result;
- }
-
- /*! This is an introduction to the page with all file members. */
- virtual QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="Áêïëïõèåß ç ëßóôá üëùí ôùí ";
- if (!extractAll) result+="ôåêìçñéùìÝíùí ";
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="óõíáñôÞóåùí, ìåôáâëçôþí, ïñéóìþí, áðáñéèìÞóåùí, êáé ïñéóìþí ôýðùí";
- }
- else
- {
- result+="ìåëþí áñ÷åßùí";
- }
- result+=" ìå óõíäÝóìïõò ";
- if (extractAll)
- result+="óôá áñ÷åßá ðïõ áíÞêïõí:";
- else
- result+="óôçí ôåêìçñßùóç:";
- return result;
- }
-
- /*! This is an introduction to the page with the list of all header files. */
- virtual QCString trHeaderFilesDescription()
- { return "Áêïëïõèïýíå ôá áñ÷åßá êåöáëßäáò ðïõ áðáñôßæïõí ôï API:"; }
-
- /*! This is an introduction to the page with the list of all examples */
- virtual QCString trExamplesDescription()
- { return "Áêïëïõèåß ç ëßóôá ìå ôá ðáñáäåßãìáôá:"; }
-
- /*! This is an introduction to the page with the list of related pages */
- virtual QCString trRelatedPagesDescription()
- { return "Áêïëïõèåß ç ëßóôá üëùí ôùí ó÷åôéêþí óåëßäùí ôåêìçñßùóçò:"; }
-
- /*! This is an introduction to the page with the list of class/file groups */
- virtual QCString trModulesDescription()
- { return "Áêïëïõèåß ç ëßóôá üëùí ôùí ìïíÜäùí:"; }
-
- /*! This sentences is used in the annotated class/file lists if no brief
- * description is given.
- */
- virtual QCString trNoDescriptionAvailable()
- { return "Äåí õðÜñ÷åé ðåñéãñáöÞ äéáèÝóéìç"; }
-
- // index titles (the project name is prepended for these)
-
-
- /*! This is used in HTML as the title of index.html. */
- virtual QCString trDocumentation()
- { return "Ôåêìçñßùóç"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all groups.
- */
- virtual QCString trModuleIndex()
- { return "ÅõñåôÞñéï ìïíÜäùí"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * class hierarchy.
- */
- virtual QCString trHierarchicalIndex()
- { return "Éåñáñ÷éêü ÅõñåôÞñéï"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * annotated compound index.
- */
- virtual QCString trCompoundIndex()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "ÅõñåôÞñéï äïìþí äåäïìÝíùí";
- }
- else
- {
- return "ÓõìðáãÝò ÅõñåôÞñéï";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * list of all files.
- */
- virtual QCString trFileIndex()
- { return "ÅõñåôÞôéï Áñ÷åßùí"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all groups.
- */
- virtual QCString trModuleDocumentation()
- { return "Ôåêìçñßùóç ÌïíÜäùí"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all classes, structs and unions.
- */
- virtual QCString trClassDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Ôåêìçñßùóç Äïìþí ÄåäïìÝíùí";
- }
- else
- {
- return "Ôåêìçñßùóç ÊëÜóåùí";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all files.
- */
- virtual QCString trFileDocumentation()
- { return "Ôåêìçñßùóç Áñ÷åßùí"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all examples.
- */
- virtual QCString trExampleDocumentation()
- { return "Ôåêìçñßùóç ÐáñáäåéãìÜôùí"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all related pages.
- */
- virtual QCString trPageDocumentation()
- { return "Ôåêìçñßùóç Óåëßäùí"; }
-
- /*! This is used in LaTeX as the title of the document */
- virtual QCString trReferenceManual()
- { return "Åí÷åéñßäéï ÁíáöïñÜò"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of defines
- */
- virtual QCString trDefines()
- { return "Ïñéóìïß"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of function prototypes
- */
- virtual QCString trFuncProtos()
- { return "ÐñùôïôõðÞóåéò ÓõíáñôÞóåùí"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of typedefs
- */
- virtual QCString trTypedefs()
- { return "Ïñéóìïß Ôýðùí"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of enumerations
- */
- virtual QCString trEnumerations()
- { return "ÁðáñéèìÞóåéò"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) functions
- */
- virtual QCString trFunctions()
- { return "ÓõíáñôÞóåéò"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trVariables()
- { return "ÌåôáâëçôÝò"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trEnumerationValues()
- { return "ÔéìÝò ÁðáñéèìÞóåùí"; }
-
- /*! This is used in the documentation of a file before the list of
- * documentation blocks for defines
- */
- virtual QCString trDefineDocumentation()
- { return "Ôåêìçñßùóç Ïñéóìþí"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for function prototypes
- */
- virtual QCString trFunctionPrototypeDocumentation()
- { return "Ôåêìçñßùóç ÐñùôïôõðÞóåùí ôùí ÓõíáñôÞóåùí"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for typedefs
- */
- virtual QCString trTypedefDocumentation()
- { return "Ôåêìçñßùóç Ïñéóìþí Ôýðùí"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration types
- */
- virtual QCString trEnumerationTypeDocumentation()
- { return "Ôåêìçñßùóç ÁðáñéèìÞóåùí"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration values
- */
- virtual QCString trEnumerationValueDocumentation()
- { return "Ôåêìçñßùóç Ôéìþí ôùí ÁðáñéèìÞóåùí"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for functions
- */
- virtual QCString trFunctionDocumentation()
- { return "Ôåêìçñßùóç ÓõíáñôÞóåùí"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for variables
- */
- virtual QCString trVariableDocumentation()
- { return "Ôåêìçñßùóç Ìåôáâëçôþí"; }
-
- /*! This is used in the documentation of a file/namespace/group before
- * the list of links to documented compounds
- */
- virtual QCString trCompounds()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "ÄïìÝò ÄåäïìÝíùí";
- }
- else
- {
- return "Óõóóùìáôþìáôá";
- }
- }
-
- /*! 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)"ÄçìéïõñãÞèçêå óôéò "+date;
- if (projName) result+=(QCString)" ãéá "+projName;
- result+=(QCString)" áðü";
- return result;
- }
- /*! This is part of the sentence used in the standard footer of each page.
- */
- virtual QCString trWrittenBy()
- {
- return "ãñáììÝíï áðü ôïí ";
- }
-
- /*! this text is put before a class diagram */
- virtual QCString trClassDiagram(const char *clName)
- {
- return (QCString)"ÄéÜãñáììá êëçñïíïìéêüôçôáò ãéá ôçí "+clName+":";
- }
-
- /*! this text is generated when the \\internal command is used. */
- virtual QCString trForInternalUseOnly()
- { return "Ìüíï ãéá åóùôåñéêÞ ÷ñÞóç."; }
-
- /*! this text is generated when the \\reimp command is used. */
- virtual QCString trReimplementedForInternalReasons()
- { return "ÅðáíáõëïðïéçìÝíç ãéá åóùôåñéêïýò ëüãïõò, ôï API äåí åðéñåÜæåôáé."; }
-
- /*! this text is generated when the \\warning command is used. */
- virtual QCString trWarning()
- { return "Ðñïåéäïðïßçóç"; }
-
- /*! this text is generated when the \\bug command is used. */
- virtual QCString trBugsAndLimitations()
- { return "ÐñïâëÞìáôá êáé ðåñéïñéóìïß"; }
-
- /*! this text is generated when the \\version command is used. */
- virtual QCString trVersion()
- { return "¸êäïóç"; }
-
- /*! this text is generated when the \\date command is used. */
- virtual QCString trDate()
- { return "Çì/íéá"; }
-
- /*! this text is generated when the \\return command is used. */
- virtual QCString trReturns()
- { return "ÅðéóôñÝöåé"; }
-
- /*! this text is generated when the \\sa command is used. */
- virtual QCString trSeeAlso()
- { return "ÊïéôÜîôå åðßóçò "; }
-
- /*! this text is generated when the \\param command is used. */
- virtual QCString trParameters()
- { return "ÐáñÜìåôñïé"; }
-
- /*! this text is generated when the \\exception command is used. */
- virtual QCString trExceptions()
- { return "Åîáßñåóç"; }
-
- /*! this text is used in the title page of a LaTeX document. */
- virtual QCString trGeneratedBy()
- { return "ÄçìéïõñãÞèçêå áðü "; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of page containing all the index of all namespaces. */
- virtual QCString trNamespaceList()
- { return "Ëßóôá ×þñùí ÏíïìÜôùí"; }
-
- /*! used as an introduction to the namespace list */
- virtual QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="ÁêïëïõèÝé ç ëßóôá üëùí ôùí ";
- if (!extractAll) result+="ôåêìçñéùìÝíùí ";
- result+="÷þñùí ïíïìÜôùí ìå óýíôïìåò ðåñéãñáöÝò:";
- return result;
- }
-
- /*! used in the class documentation as a header before the list of all
- * friends of a class
- */
- virtual QCString trFriends()
- { return "Ößëïé"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in the class documentation as a header before the list of all
- * related classes
- */
- virtual QCString trRelatedFunctionDocumentation()
- { return "Ôåêìçñßùóç Ößëéêþí êáé Óõó÷åôéæüìåíùí ÓõíáñôÞóåùí"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of the HTML page of a class/struct/union */
- virtual QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- {
- QCString result=(QCString)clName+" ";
- result+=" ÁíáöïñÜ";
- switch(compType)
- {
- case ClassDef::Class: result+=" ÊëÜóçò"; break;
- case ClassDef::Struct: result+=" ÄïìÞò"; break;
- case ClassDef::Union: result+=" ¸íùóçò"; break;
- case ClassDef::Interface: result+=" Äéáðñïóùðßáò"; break;
- case ClassDef::Protocol: result+=" Protocol"; break; // translate me!
- case ClassDef::Category: result+=" Category"; break; // translate me!
- case ClassDef::Exception: result+=" Åîáßñåóçò"; break;
- }
- if (isTemplate) result+=" Template";
-
- return result;
- }
-
- /*! used as the title of the HTML page of a file */
- virtual QCString trFileReference(const char *fileName)
- {
- QCString result=fileName;
- result+=" ÁíáöïñÜ Áñ÷åßïõ";
- return result;
- }
-
- /*! used as the title of the HTML page of a namespace */
- virtual QCString trNamespaceReference(const char *namespaceName)
- {
- QCString result=namespaceName;
- result+=" ÁíáöïñÜ ×þñïõ ÏíïìÜôùí";
- return result;
- }
-
- virtual QCString trPublicMembers()
- { return "Äçìüóéåò ÌÝèïäïé"; }
- virtual QCString trPublicSlots()
- { return "Äçìüóéá Slots"; }
- virtual QCString trSignals()
- { return "ÓÞìáôá"; }
- virtual QCString trStaticPublicMembers()
- { return "ÓôáôéêÝò Äçìüóéåò ÌÝäïäïé"; }
- virtual QCString trProtectedMembers()
- { return "ÐñïóôáôåõìÝíåò ÌÝäïäïé"; }
- virtual QCString trProtectedSlots()
- { return "ÐñïóôáôåõìÝíá Slots"; }
- virtual QCString trStaticProtectedMembers()
- { return "ÓôáôéêÝò ÐñïóôáôåõìÝíåò ÌÝäïäïé"; }
- virtual QCString trPrivateMembers()
- { return "ÉäéïôéêÝò ÌÝäïäïé"; }
- virtual QCString trPrivateSlots()
- { return "ÉäéïôéêÜ Slots"; }
- virtual QCString trStaticPrivateMembers()
- { return "ÓôáôéêÝò ÉäéïôéêÝò ÌÝäïäïé"; }
-
- /*! this function is used to produce a comma-separated list of items.
- * use generateMarker(i) to indicate where item i should be put.
- */
- virtual QCString trWriteList(int numEntries)
- {
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=", êáé ";
- }
- }
- return result;
- }
-
- /*! used in class documentation to produce a list of base classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritsList(int numEntries)
- {
- return "Êëçñïíïìåß "+trWriteList(numEntries)+".";
- }
-
- /*! used in class documentation to produce a list of super classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritedByList(int numEntries)
- {
- return "Êëçñïíïìåßôáé áðü "+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 "Åðáíáõëïðïéåßôáé áðü "+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 "Åðáíáõëïðïéåßôáé óôçí "+trWriteList(numEntries)+".";
- }
-
- /*! This is put above each page as a link to all members of namespaces. */
- virtual QCString trNamespaceMembers()
- { return "ÌÝëç Namespace"; }
-
- /*! This is an introduction to the page with all namespace members */
- virtual QCString trNamespaceMemberDescription(bool extractAll)
- {
- QCString result="Áêïëïõèåß ç ëßóôá üëùí ôùí ";
- if (!extractAll) result+="ôåêìçñéùìÝíùí ";
- result+="ìåëþí ÷þñùí ïíïìÜôùí ìå óõíäÝóìïõò ";
- if (extractAll)
- result+="óôçí ôåêìçñßùóç ôïõ ÷þñïõ ïíïìÜôùí ãéá êÜèå ìÝëïò:";
- else
- result+="óôïõò ÷þñïõò ïíïìÜôùí ðïõ áíÞêïõí:";
- return result;
- }
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all namespaces.
- */
- virtual QCString trNamespaceIndex()
- { return "ÅõñåôÞñéï ×þñùí ÏíïìÜôùí"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all namespaces.
- */
- virtual QCString trNamespaceDocumentation()
- { return "Ôåêìçñßùóç ×þñùí ÏíïìÜôùí"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- virtual QCString trNamespaces()
- { return "×þñïé ÏíïìÜôùí"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990728
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is put at the bottom of a class documentation page and is
- * followed by a list of files that were used to generate the page.
- */
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)"Ç ôåêìçñßùóç ãéá ";
- switch(compType)
- {
- case ClassDef::Class: result+="áõôÞ ôçí êëÜóç"; break;
- case ClassDef::Struct: result+="áõôÞ ç äïìÞ"; break;
- case ClassDef::Union: result+="áõôÞ ç Ýíùóç"; break;
- case ClassDef::Interface: result+="áõôÞ ç äéáðñïóùðßá"; break;
- case ClassDef::Protocol: result+="Protocol"; break; // translate me!
- case ClassDef::Category: result+="Category"; break; // translate me!
- case ClassDef::Exception: result+="áõôÞ ç åîáßñåóç"; break;
- }
- result+=" äçìéïõñãÞèçêå áðï ô";
- if (single) result+="ï áêüëïõèï áñ÷åßï:"; else result+="á áêüëïõèá áñ÷åßá:";
- return result;
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- virtual QCString trAlphabeticalList()
- { return "ÁëöáâçôéêÞ Ëßóôá"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- virtual QCString trReturnValues()
- { return "ÔéìÝò ÅðéóôñïöÞò"; }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- virtual QCString trMainPage()
- { return "Êýñéá Óåëßäá"; }
-
- /*! 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 "óåë."; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991003
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trSources()
- {
- return "Ðçãáßïò";
- }
- virtual QCString trDefinedAtLineInSourceFile()
- {
- return "Ïñéóìüò óôç ãñáììÞ @0 ôïõ áñ÷åßïõ @1.";
- }
- virtual QCString trDefinedInSourceFile()
- {
- return "Ïñéóìüò óôï áñ÷åßï @0.";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDeprecated()
- {
- return "ÁðïóõñìÝíï";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- virtual QCString trCollaborationDiagram(const char *clName)
- {
- return (QCString)"Äßáãñáììá Óõíåñãáóßáò ãéá ôçí êëÜóç "+clName+":";
- }
- /*! this text is put before an include dependency graph */
- virtual QCString trInclDepGraph(const char *fName)
- {
- return (QCString)"ÄéÜãñáììá åîÜñôçóçò Include ãéá ôï áñ÷åßï "+fName+":";
- }
- /*! header that is put before the list of constructor/destructors. */
- virtual QCString trConstructorDocumentation()
- {
- return "Ôåêìçñßùóç Constructor & Destructor";
- }
- /*! Used in the file documentation to point to the corresponding sources. */
- virtual QCString trGotoSourceCode()
- {
- return "ÐÞãáéíå óôïí ðçãáßï êþäéêá ôïõ áñ÷åßïõ.";
- }
- /*! Used in the file sources to point to the corresponding documentation. */
- virtual QCString trGotoDocumentation()
- {
- return "ÐÞãáéíå óôçí ôåêìçñßùóç ôïõ áñ÷åßïõ.";
- }
- /*! Text for the \\pre command */
- virtual QCString trPrecondition()
- {
- return "ÐñïûðïèÝóåéò";
- }
- /*! Text for the \\post command */
- virtual QCString trPostcondition()
- {
- return "ÌåôáûðïèÝóåéò";
- }
- /*! Text for the \\invariant command */
- virtual QCString trInvariant()
- {
- return "ÁìåôÜâëçôá";
- }
- /*! Text shown before a multi-line variable/enum initialization */
- virtual QCString trInitialValue()
- {
- return "Áñ÷éêÞ ôéìÞ:";
- }
- /*! Text used the source code in the file index */
- virtual QCString trCode()
- {
- return "êþäéêáò";
- }
- virtual QCString trGraphicalHierarchy()
- {
- return "ÃñáöéêÞ ÁíáðáñÜóôáóç Ôçò Éåñáñ÷ßáò Ôùí ÊëÜóåùí";
- }
- virtual QCString trGotoGraphicalHierarchy()
- {
- return "ÐÞãáéíå óôçí ãñáöéêÞ áíáðáñÜóôáóç ôçò éåñáñ÷ßáò ôùí êëÜóåùí";
- }
- virtual QCString trGotoTextualHierarchy()
- {
- return "ÐÞãáéíå óôçí ìå êåßìåíï áíáðáñÜóôáóç ôçò éåñáñ÷ßáò ôùí êëÜóåùí";
- }
- virtual QCString trPageIndex()
- {
- return "ÅõñåôÞñéï Óåëßäùí";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trNote()
- {
- return "Óçìåßùóç";
- }
- virtual QCString trPublicTypes()
- {
- return "Äçìüóéïé Ôõðïé";
- }
- virtual QCString trPublicAttribs()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Ðåäßá ÄåäïìÝíùí";
- }
- else
- {
- return "Äçìüóéá ×áñáêôçñéóôéêÜ";
- }
- }
- virtual QCString trStaticPublicAttribs()
- {
- return "ÓôáôéêÜ Äçìüóéá ×áñáêôçñéóôéêÜ";
- }
- virtual QCString trProtectedTypes()
- {
- return "ÐñïóôáôåõìÝíïé Ôýðïé";
- }
- virtual QCString trProtectedAttribs()
- {
- return "ÐñïóôáôåõìÝíá ×áñáêôçñéóôéêÜ";
- }
- virtual QCString trStaticProtectedAttribs()
- {
- return "ÓôáôéêÜ ÐñïóôáôåõìÝíá ×áñáêôçñéóôéêÜ";
- }
- virtual QCString trPrivateTypes()
- {
- return "Éäéùôéêïß Ôýðïé";
- }
- virtual QCString trPrivateAttribs()
- {
- return "Éäéùôéêá ×áñáêôçñéóôéêÜ";
- }
- virtual QCString trStaticPrivateAttribs()
- {
- return "ÓôáôéêÜ Éäéùôéêá ×áñáêôçñéóôéêÜ";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\todo item */
- virtual QCString trTodo()
- {
- return "Ðñïò Õëïðïßçóç";
- }
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- {
- return "Ëßóôá ôùí Ðñïò Õëïðïßçóç";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy()
- {
- return "ÁíáöïñÜ áðü";
- }
- virtual QCString trRemarks()
- {
- return "ÐáñáôÞñçóç";
- }
- virtual QCString trAttention()
- {
- return "Ðñïóï÷Þ";
- }
- virtual QCString trInclByDepGraph()
- {
- return "Ôï ãñÜöçìá áõôü ðáñïõóéÜæåé ðïéÜ áñ÷åßá Üìåóá Þ "
- "Ýìåóá ðåñéëáìâÜíïõí áõôü ôï áñ÷åßï:";
- }
- virtual QCString trSince()
- {
- return "Áðü";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- virtual QCString trLegendTitle()
- {
- return "Õðüìíçìá ÄéáãñáììÜôùí";
- }
- /*! 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
- "ÁõôÞ ç óåëßäá åîçãåß ôï ðùò åñìçíåýïíôáé ôá äéáãñÜììáôá ðïõ äçìéïõñãïýíôáé "
- "áðü ôï doxygen.<p>\n"
- "Èåùñåßóôå ôï ðáñáêÜôù ðáñÜäåéãìá:"
- "\\code\n"
- "/*! Invisible class because of truncation */\n"
- "class Invisible { };\n\n"
- "/*! Truncated class, inheritance relation is hidden */\n"
- "class Truncated : public Invisible { };\n\n"
- "/* Class not documented with doxygen comments */\n"
- "class Undocumented { };\n\n"
- "/*! Class that is inherited using public inheritance */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! Class that is inherited using protected inheritance */\n"
- "class ProtectedBase { };\n\n"
- "/*! Class that is inherited using private inheritance */\n"
- "class PrivateBase { };\n\n"
- "/*! Class that is used by the Inherited class */\n"
- "class Used { };\n\n"
- "/*! Super class that inherits a number of other classes */\n"
- "class Inherited : public PublicBase,\n"
- " protected ProtectedBase,\n"
- " private PrivateBase,\n"
- " public Undocumented\n"
- "{\n"
- " private:\n"
- " Used *m_usedClass;\n"
- "};\n"
- "\\endcode\n"
- "Áí ç åôéêÝôá \\c MAX_DOT_GRAPH_HEIGHT óôï áñ÷åßï ñõèìßóåùí "
- "ôåèåß óôï 200 èá Ý÷ïõìå óáí áðïôÝëåóìá ôï áêüëïõèï äéÜãñáììá:"
- "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
- "Ôá êïõôéÜ óôï ðáñáðÜíù äéÜãñáììá Ý÷ïõí ôçí áêüëïõèç óçìáóßá:\n"
- "<ul>\n"
- "<li>¸íá ãåìéóìÝíï ìáýñï êïõôß áíáðáñéóôÜ ôç äïìÞ Þ ôçí êëÜóç ãéá ôçí ïðïßá"
- "áöïñÜ ôï äéÜãñáììá.\n"
- "<li>¸íá êïõôß ìå ìáýñï ðåñßãñáììá áíáðáñéóôÜ ìßá ôåêìçñéùìÝíç äïìÞ Þ êëÜóç.\n"
- "<li>¸íá êïõôß ìå ãêñßæï ðåñßãñáììá áíáðáñéóôÜ ìßá ìç ôåêìçñéùìÝíç äïìÞ Þ êëÜóç.\n"
- "<li>¸íá êïõôß ìå êüêêéíï ðåñßãñáììá áíáðáñéóôÜ ìßá ôåêìçñéùìÝíç äïìÞ Þ êëÜóç ãéá "
- "ôçí ïðïßá äåí ðáñïõóéÜæïíôáé üëåò ïé ó÷Ýóåéò êëçñïíïìéêüôçôáò êáé ðåñéå÷ïìÝíïõ. %¸íá "
- "äéÜãñáììá ìåéþíåôáé áí äåí ÷ùñÜåé óôéò ïñéóìÝíåò äéáóôÜóåéò."
- "</ul>\n"
- "Ôá âÝëç Ý÷ïõí ôéò áêüëïõèåò óçìáóßåò:\n"
- "<ul>\n"
- "<li>¸íá âáèý ìðëå âÝëïò ÷ñçóéìïðïéåßôáé ãéá íá ðáñïõóéÜóåé ìßá äçìüóéá ó÷Ýóç êëçñïíïìéêüôçôáò "
- "ìåôáîý äýï êëÜóåùí.\n"
- "<li>¸íá âáèý ðñÜóéíï âÝëïò ÷ñçóéìïðïéåßôáé ãéá ðñïóôáôåõìÝíç êëçñïíïìéêüôçôá.\n"
- "<li>¸íá âáèý êüêêéíï âÝëïò ÷ñçóéìïðïéåßôáé ãéá éäéùôéêÞ êëçñïíïìéêüôçôá.\n"
- "<li>¸íá ìùâ äéáêåêïìÝíï âÝëïò ÷ñçóéìïðïéåßôáé áí ìßá êëÜóç ðåñéÝ÷åôáé Þ ÷ñçóéìïðïéåßôáé "
- "áðü ìßá Üëëç êëÜóç. Ôï âÝëïò ïíïìÜæåôáé áðü ôï üíïìá ôçò ìåôáâëçôÞò(ùí) "
- "ìÝóù ôçò ïðïßáò ç êëÜóç Þ äïìÞ åßíáé ðñïóâÜóéìç. \n"
- "</ul>\n";
- }
- /*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return "õðüìíçìá";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return "Äïêéìáóôéêü";
- }
- /*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return "Ëßóôá Äïêéìáóôéêþí";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return "ÌÝäïäïé DCOP";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return "Éäéüôçôåò";
- }
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return "Ôåêìçñßùóç ÉäéïôÞôùí";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java interfaces in the summary section of Java packages */
- virtual QCString trInterfaces()
- {
- return "Äéáðñïóùðßåò";
- }
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "ÄïìÝò ÄåäïìÝíùí";
- }
- else
- {
- return "ÊëÜóåéò";
- }
- }
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
- {
- return (QCString)"ÐáêÝôï "+name;
- }
- /*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return "Ëßóôá ÐáêÝôùí";
- }
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return "Áêïëïõèåß ç ëßóôá ôùí ðáêÝôùí ìå óýíôïìç ðåñéãñáöÞ (áí õðÜñ÷åé):";
- }
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return "ÐáêÝôá";
- }
- /*! Used as a chapter title for Latex & RTF output */
- virtual QCString trPackageDocumentation()
- {
- return "Ôåêìçñßùóç ÐáêÝôùí";
- }
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return "ÔéìÞ:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return "Ðñüâëçìá";
- }
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return "Ëßóôá ÐñïâëçìÜôùí";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as ansicpg for RTF file
- *
- * The following table shows the correlation of Charset name, Charset Value and
- * <pre>
- * Codepage number:
- * Charset Name Charset Value(hex) Codepage number
- * ------------------------------------------------------
- * DEFAULT_CHARSET 1 (x01)
- * SYMBOL_CHARSET 2 (x02)
- * OEM_CHARSET 255 (xFF)
- * ANSI_CHARSET 0 (x00) 1252
- * RUSSIAN_CHARSET 204 (xCC) 1251
- * EE_CHARSET 238 (xEE) 1250
- * GREEK_CHARSET 161 (xA1) 1253
- * TURKISH_CHARSET 162 (xA2) 1254
- * BALTIC_CHARSET 186 (xBA) 1257
- * HEBREW_CHARSET 177 (xB1) 1255
- * ARABIC _CHARSET 178 (xB2) 1256
- * SHIFTJIS_CHARSET 128 (x80) 932
- * HANGEUL_CHARSET 129 (x81) 949
- * GB2313_CHARSET 134 (x86) 936
- * CHINESEBIG5_CHARSET 136 (x88) 950
- * </pre>
- *
- */
- virtual QCString trRTFansicp()
- {
- return "1253";
- }
-
-
- /*! Used as ansicpg for RTF fcharset
- * \see trRTFansicp() for a table of possible values.
- */
- virtual QCString trRTFCharSet()
- {
- return "0";
- }
-
- /*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return "ÅõñåôÞñéï";
- }
-
- /*! 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 ? "ÊëÜóç" : "êëÜóç"));
- if (!singular) result+="";
- 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 ? "Áñ÷åß" : "áñ÷åß"));
- if (!singular) result+="á"; else result+="ï";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trNamespace(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Namespace" : "namespace"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trGroup(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "ÏìÜä" : "ïìÜä"));
- if (!singular) result+="åò"; else result+="á";
- 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 ? "Óåëßä" : "óåëßä"));
- if (!singular) result+="åò"; else result+="á";
- 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 ? "ÌÝë" : "ìÝë"));
- if (!singular) result+="ç"; else result+="ïò";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trField(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Ðåäß" : "ðåäß"));
- if (!singular) result+="á"; else result+="ï";
- 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 ? "Êáèïëéê" : "êáèïëéê"));
- if (!singular) result+="Ýò"; else result+="Þ";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is generated when the \\author command is used and
- * for the author section in man pages. */
- virtual QCString trAuthor(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Óõãñáö" : "óõãñáö"));
- if (!singular) result+=""; else result+="Ýáò";
- return result;
- }
-
-};
-
-#endif
diff --git a/src/translator_hr.h b/src/translator_hr.h
deleted file mode 100644
index 735f483..0000000
--- a/src/translator_hr.h
+++ /dev/null
@@ -1,1261 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
-*/
-// translation by Boris Bralo <boris.bralo@zg.htnet.hr>
-// Updates:
-// --------
-// 2000/08/20
-// - Better handling of ISO-8859-2/ WIN 1250 stuff based on (actualy stolen from :-)) Czech translations
-// implemented by Petr Prikryl (prikrylp@skil.cz).
-// As opposed to Czech translation this one assumes that Doxygen strings are written in Linux ( it's true,
-// I don't have QT pro licence ) , and uses ISOToWin function when built in WIN32
-//
-// 2000/09/18
-// - Added strings from 1.2.1
-// - Removed unneeeded decode() calls
-// - Changed some CS terminology
-//
-// 2001/01/22
-// - Added strings from 1.2.4
-//
-// 2001/05/25
-// - Added strings and up to and including 1.2.7_20010524
-// - Removed obsolete method trFiles()
-// - Removed obsolete method trAuthor()
-// - Removed obsolete method trAuthor()
-// - Removed obsolete method trVerbatimHeadert()
-// - Method latexBabelPackage() removed, ude latexLanguageSupportCommand
-//
-// 2001/11/13
-// - inherits from Translator
-// - Added strings for 1.2.11
-// - better output for C documentation (trCompoundMembersDescription(), trClassDocumentation())
-//
-// 2001/11/13
-// - Added strings for 1.2.13
-//
-// 2003/02/26
-// - Added strings for 1.2.18
-//
-// 2003/04/29
-// - Added strings for 1.3.0
-//
-// 2004/06/21
-// - Added strings for 1.3.8
-//
-// 2004/09/15
-// - Added strings for 1.3.9
-//
-// 2005/02/28
-// - Removed obsolete (unused) methods
-//
-// 2005/03/21
-// - Added strings for 1.4.1
-//
-
-#ifndef TRANSLATOR_HR_H
-#define TRANSLATOR_HR_H
-
-class TranslatorCroatian : public Translator
-{
- private:
- /*! to avoid macro redefinition from translator_cz.h */
- inline QCString decode(const QCString& sInput)
- {
- if (Config_getBool("USE_WINDOWS_ENCODING"))
- {
- return ISO88592ToWin1250(sInput);
- }
- else
- {
- return sInput;
- }
- }
-
- public:
- QCString idLanguage()
- { return "croatian"; }
- QCString idLanguageCharset()
- {
- if (Config_getBool("USE_WINDOWS_ENCODING"))
- {
- return "windows-1250";
- }
- else
- {
- return "iso-8859-2";
- }
- }
- QCString latexLanguageSupportCommand()
- { return "\\usepackage[croatian]{babel}\n"; }
- QCString trRelatedFunctions()
- { return "Povezane funkcije"; }
- QCString trRelatedSubscript()
- { return "(To nisu member funkcije.)"; }
- QCString trDetailedDescription()
- { return decode("Detaljno obja¹njenje"); }
- QCString trMemberTypedefDocumentation()
- { return decode("Dokumentacija typedef èlanova"); }
- QCString trMemberEnumerationDocumentation()
- { return decode("Dokumentacija enumeracijskih èlanova"); }
- QCString trMemberFunctionDocumentation()
- { return "Dokumentacija funkcija"; }
- QCString trMemberDataDocumentation()
- { return "Documentacija varijabli"; }
- QCString trMore()
- { return decode("Op¹irnije..."); }
- QCString trListOfAllMembers()
- { return decode("Popis svih èlanova."); }
- QCString trMemberList()
- { return decode("Popis èlanova."); }
- QCString trThisIsTheListOfAllMembers()
- { return decode("Ovo je popis svih èlanova"); }
- QCString trIncludingInheritedMembers()
- { return decode(", ukljuèujuæi naslijeðene èlanove."); }
- QCString trGeneratedAutomatically(const char *s)
- { QCString result=decode("generirano automatski Doxygen-om");
- if (s) result+=(QCString)" za "+s;
- result+=" iz programskog koda.";
- return decode(result);
- }
- QCString trEnumName()
- { return decode("enum ime"); }
- QCString trEnumValue()
- { return decode("enum vrijednost"); }
- QCString trDefinedIn()
- { return decode("definirano u"); }
- QCString trModules()
- { return "Moduli"; }
- QCString trClassHierarchy()
- { return "Stablo klasa"; }
- QCString trCompoundList()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Sve strukture";
- }
- else
- {
- return "Sve klase";
- }
- }
- QCString trFileList()
- { return "Popis datoteka"; }
- QCString trCompoundMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- return decode("Svi èlanovi struktura");
- else
- return decode("Svi èlanovi klasa");
- }
- QCString trFileMembers()
- { return decode("Èlanovi klasa u datoteci"); }
- QCString trRelatedPages()
- { return decode("Stranice povezane s ovom"); }
- QCString trExamples()
- { return "Primjeri"; }
- QCString trSearch()
- { return decode("Tra¾i"); }
- QCString trClassHierarchyDescription()
- { return decode("Stablo naslijeðivanja je slo¾eno "
- "pribli¾no po abecedi:");
- }
- QCString trFileListDescription(bool extractAll)
- {
- QCString result="Popis svih ";
- if (!extractAll) result+="dokumentiranih ";
- result+="datoteka, s kratkim opisom:";
- return decode(result);
- }
- QCString trCompoundListDescription()
- { return "Popis svih klasa, unija i struktura "
- "s kratkim opisom :";
- }
- QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result="Popis svih ";
- if (!extractAll)
- result+="dokumentiranih ";
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- result+="èlanova klasa s linkovima na ";
- else
- result+="èlanova struktura s linkovima na ";
-
- if (!extractAll)
- {
- result+="dokumentaciju svakog èlana:";
- }
- else
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- result+="dokumentaciju klase :";
- else
- result +="dokumentaciju strukture";
- }
- return decode(result);
- }
- QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="Popis svih ";
- if (!extractAll)
- result+="dokumentiranih ";
- result+="èlanova s linkovima na ";
- if (extractAll)
- result+="dokumentaciju datoteke u kojima se nalaze:";
- else
- result+="datoteke u kojima se nalaze:";
- return decode(result);
- }
- QCString trExamplesDescription()
- { return "Popis primjera :"; }
- QCString trRelatedPagesDescription()
- { return "Popis povezanih stranica:"; }
- QCString trModulesDescription()
- { return "Popis svih modula:"; }
-
- QCString trDocumentation()
- { return "Dokumentacija"; }
- QCString trModuleIndex()
- { return "Kazalo modula"; }
- QCString trHierarchicalIndex()
- { return "Hijerarhijsko kazalo"; }
- QCString trCompoundIndex()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Kazalo struktura podataka";
- }
- else
- {
- return "Skupno kazalo ";
- }
- }
- QCString trFileIndex()
- { return "Kazalo datoteka"; }
- QCString trModuleDocumentation()
- { return "Dokumentacija modula"; }
- QCString trClassDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Dokumentacija struktura podataka";
- }
- else
- {
- return "Dokumentacija klasa";
- }
- }
- QCString trFileDocumentation()
- { return "Dokumentacija datoteka"; }
- QCString trExampleDocumentation()
- { return "Dokumentacija primjera"; }
- QCString trPageDocumentation()
- { return "Dokumentacija vezane stranice"; }
- QCString trReferenceManual()
- { return decode("Priruènik"); }
-
- QCString trDefines()
- { return "Definicije"; }
- QCString trFuncProtos()
- { return "Prototipi funkcija"; }
- QCString trTypedefs()
- { return "Typedef-ovi"; }
- QCString trEnumerations()
- { return "Enumeracije"; }
- QCString trFunctions()
- { return "Funkcije"; }
- QCString trVariables()
- { return "Varijable"; }
- QCString trEnumerationValues()
- { return "Vrijednosti enumeracija"; }
- QCString trDefineDocumentation()
- { return "Dokumentacija definicija"; }
- QCString trFunctionPrototypeDocumentation()
- { return "Dokumentacija prototipa funkcije"; }
- QCString trTypedefDocumentation()
- { return "Dokumentacija typedef-a"; }
- QCString trEnumerationTypeDocumentation()
- { return "Dokumentacija enumeracijskog tipa"; }
- QCString trFunctionDocumentation()
- { return "Dokumentacije funkcija"; }
- QCString trVariableDocumentation()
- { return "Dokumentacija varijable"; }
- QCString trCompounds()
- { return "Strukture"; }
- QCString trGeneratedAt(const char *date,const char *projName)
- {
- QCString result=(QCString)"Generirano "+date;
- if (projName) result+=(QCString)" projekt: "+projName;
- result+=" generator: ";
- return decode(result);
- }
- QCString trWrittenBy()
- {
- return decode("napisao ");
- }
- QCString trClassDiagram(const char *clName)
- {
- return decode("Dijagram klasa za ")+clName;
- }
- QCString trForInternalUseOnly()
- { return decode("Iskljuèivo za internu uporabu."); }
- QCString trWarning()
- { return "Upozorenje"; }
- QCString trVersion()
- { return "Verzija"; }
- QCString trDate()
- { return "Datum"; }
- QCString trReturns()
- { return "Povratne vrijednosti"; }
- QCString trSeeAlso()
- { return decode("Vidi takoðer"); }
- QCString trParameters()
- { return "Parametri"; }
- QCString trExceptions()
- { return "Iznimke"; }
- QCString trGeneratedBy()
- { return "Generirao"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307
-//////////////////////////////////////////////////////////////////////////
-
- QCString trNamespaceList()
- { return "Popis imenika"; }
- QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="Popis svih ";
- if (!extractAll) result+="dokumentiranih ";
- result+="imenika s kratkim opisom:";
- return decode(result);
- }
- QCString trFriends()
- { return decode("Friend-ovi "); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- QCString trRelatedFunctionDocumentation()
- { return "Dokumentacija povezanih funkcija"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool /*isTemplate*/)
- // used as the title of the HTML page of a class/struct/union
- {
- QCString result="Opis ";
- switch(compType)
- {
- case ClassDef::Class: result+=" klase "; break;
- case ClassDef::Struct: result+=" strukture "; break;
- case ClassDef::Union: result+=" unije "; break;
- case ClassDef::Interface: result+=" suèelja (interface) "; break;
- case ClassDef::Protocol: result+=" protocol "; break; // translate me!
- case ClassDef::Category: result+=" category "; break; // translate me!
- case ClassDef::Exception: result+=" iznimke (exception) "; break;
- }
- result += clName;
-
- return decode(result);
- }
- QCString trFileReference(const char *fileName)
- // used as the title of the HTML page of a file
- {
- QCString result="Opis datoteke ";
- result+=fileName;
- return decode(result);
- }
- QCString trNamespaceReference(const char *namespaceName)
- // used as the title of the HTML page of a namespace
- {
- QCString result ="Opis imenika ";
- result+=namespaceName;
-
- return decode(result);
- }
-
- // these are for the member sections of a class, struct or union
- QCString trPublicMembers()
- { return decode("Public èlanovi"); }
- QCString trPublicSlots()
- { return "Public slotovi"; }
- QCString trSignals()
- { return "Signali"; }
- QCString trStaticPublicMembers()
- { return decode("Static public èlanovi"); }
- QCString trProtectedMembers()
- { return decode("Protected èlanovi"); }
- QCString trProtectedSlots()
- { return "Protected slotovi"; }
- QCString trStaticProtectedMembers()
- { return decode("Static protected èlanovi"); }
- QCString trPrivateMembers()
- { return decode("Private èlanovi"); }
- QCString trPrivateSlots()
- { return decode("Private slotovi"); }
- QCString trStaticPrivateMembers()
- { return decode("Static private èlanovi"); }
- // end of member sections
-
- QCString trWriteList(int numEntries)
- {
- // this function is used to produce a comma-separated list of items.
- // use generateMarker(i) to indicate where item i should be put.
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+="";
- }
- }
- return result;
- }
-
- QCString trInheritsList(int numEntries)
- // used in class documentation to produce a list of base classes,
- // if class diagrams are disabled.
- {
- return decode("Naslijeðuje od "+trWriteList(numEntries)+".");
- }
- QCString trInheritedByList(int numEntries)
- // used in class documentation to produce a list of super classes,
- // if class diagrams are disabled.
- {
- return decode("Naslijeðena u "+trWriteList(numEntries)+".");
- }
- QCString trReimplementedFromList(int numEntries)
- // used in member documentation blocks to produce a list of
- // members that are hidden by this one.
- {
- return decode("Reimplementirano od "+trWriteList(numEntries)+".");
- }
- QCString trReimplementedInList(int numEntries)
- {
- // used in member documentation blocks to produce a list of
- // all member that overwrite the implementation of this member.
- return decode("Reimplementacija u "+trWriteList(numEntries)+".");
- }
-
- QCString trNamespaceMembers()
- // This is put above each page as a link to all members of namespaces.
- { return decode("Èlanovi imenika"); }
- QCString trNamespaceMemberDescription(bool extractAll)
- // This is an introduction to the page with all namespace members
- {
- QCString result="Lista svih ";
- if (!extractAll) result+="dokumentiranih ";
- result+="èlanova imenika s linkovima na ";
- if (extractAll)
- result+="imenièku dokumentaciju svakog èlana:";
- else
- result+="imenike kojima pripadaju:";
- return decode(result);
- }
- QCString trNamespaceIndex()
- // This is used in LaTeX as the title of the chapter with the
- // index of all namespaces.
- { return "Kazalo imenika"; }
- QCString trNamespaceDocumentation()
- // This is used in LaTeX as the title of the chapter containing
- // the documentation of all namespaces.
- { return "Dokumentacija namespace-a"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- QCString trNamespaces()
- {
- return "Imenici";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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.
- */
- QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result="Dokumentacija ove ";
- switch(compType)
- {
- case ClassDef::Class: result+="klase"; break;
- case ClassDef::Struct: result+="strukture"; break;
- case ClassDef::Union: result+="unije"; break;
- case ClassDef::Interface: result+="suèelja (interface)"; break;
- case ClassDef::Protocol: result+="protocol"; break; // translate me!
- case ClassDef::Category: result+="category"; break; // translate me!
- case ClassDef::Exception: result+="iznimke (exception)"; break;
- }
- result+=" je generirana iz " + trFile(FALSE, single) + ": ";
- return decode(result);
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- QCString trAlphabeticalList()
- { return "Abecedni popis"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- QCString trReturnValues()
- { return "Povratna vrijednost"; }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- QCString trMainPage()
- { return "Glavna stranica"; }
-
- /*! This is used in references to page that are put in the LaTeX
- * documentation. It should be an abbreviation of the word page.
- */
- QCString trPageAbbreviation()
- { return "str."; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991106
-//////////////////////////////////////////////////////////////////////////
-
- QCString trDefinedAtLineInSourceFile()
- {
- return "Definirano u liniji @0 datoteke @1.";
- }
- QCString trDefinedInSourceFile()
- {
- return "Definirano u datoteci @0.";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
- QCString trDeprecated()
- {
- return "Zastarjelo";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- QCString trCollaborationDiagram(const char *clName)
- {
- return decode( (QCString)"Kolaboracijski dijagram za "+clName+ ":");
- }
- /*! this text is put before an include dependency graph */
- QCString trInclDepGraph(const char *fName)
- {
- return decode((QCString)"Graf include meðuovisnosti za "+fName+":");
- }
- /*! header that is put before the list of constructor/destructors. */
- QCString trConstructorDocumentation()
- {
- return "Dokumentacija konstruktora i destruktora ";
- }
- /*! Used in the file documentation to point to the corresponding sources. */
- QCString trGotoSourceCode()
- {
- return "Izvorni kod";
- }
- /*! Used in the file sources to point to the corresponding documentation. */
- QCString trGotoDocumentation()
- {
- return "Dokumenacija za ovu datoteku.";
- }
- /*! Text for the \\pre command */
- QCString trPrecondition()
- {
- return "Preduvjeti";
- }
- /*! Text for the \\post command */
- QCString trPostcondition()
- {
- return "Postuvjeti";
- }
- /*! Text for the \\invariant command */
- QCString trInvariant()
- {
- return "Invarijanta";
- }
- /*! Text shown before a multi-line variable/enum initialization */
- QCString trInitialValue()
- {
- return decode("Poèetna vrijednost:");
- }
- /*! Text used the source code in the file index */
- QCString trCode()
- {
- return "kod";
- }
- QCString trGraphicalHierarchy()
- {
- return decode("Grafièko stablo klasa");
- }
- QCString trGotoGraphicalHierarchy()
- {
- return decode("Grafièko stablo klasa");
- }
- QCString trGotoTextualHierarchy()
- {
- return "Tekstualno stablo klasa";
- }
- QCString trPageIndex()
- {
- return "Indeks stranice";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- QCString trNote()
- {
- return "Primjedba";
- }
- QCString trPublicTypes()
- {
- return "Public tipovi";
- }
- QCString trPublicAttribs()
- {
- return "Public atributi";
- }
- QCString trStaticPublicAttribs()
- {
- return "Static public atributi";
- }
- QCString trProtectedTypes()
- {
- return "Protected tipovi";
- }
- QCString trProtectedAttribs()
- {
- return "Protected atributi";
- }
- QCString trStaticProtectedAttribs()
- {
- return "Static protected atributi";
- }
- QCString trPrivateTypes()
- {
- return "Private tipovi";
- }
- QCString trPrivateAttribs()
- {
- return "Private atributi";
- }
- QCString trStaticPrivateAttribs()
- {
- return "Static private atributi";
- }
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a todo item */
- virtual QCString trTodo()
- {
- return "Za uraditi";
- }
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- {
- return "Ostalo za uraditi";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy()
- {
- return "Referencirano od";
- }
- virtual QCString trRemarks()
- {
- return "Napomene";
- }
- virtual QCString trAttention()
- {
- return decode("Pa¾nja");
- }
- virtual QCString trInclByDepGraph()
- {
- return decode("Ovaj graf pokazuje koje datoteke izravno "
- "ili neizravno ukljuèuju ovu datoteku:");
- }
- virtual QCString trSince()
- {
- return "Od";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- virtual QCString trLegendTitle()
- {
- return "Legenda";
- }
- /*! page explaining how the dot graph's should be interpreted */
- virtual QCString trLegendDocs()
- {
- return
- decode( "Ova stranica obja¹njava kako interpretirati grafikone koje je generirao "
- "doxygen.<p>\n"
- "Na primjer:\n"
- "\\code\n"
- "/*! Nevidljiva klasa (neæe stati na graf date visine) */\n"
- "class Invisible { };\n\n"
- "/*! Odrezana klasa, inheritance je skriven (klase se vidi na grafu, ali ne i sve bazne klase) */\n"
- "class Truncated : public Invisible { };\n\n"
- "/* Nedokumentirana klasa */\n"
- "class Undocumented { };\n\n"
- "/*! Klasa koja je naslijeðena public */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! Klasa koje je naslijeðena protected */\n"
- "class ProtectedBase { };\n\n"
- "/*! Klasa koje je naslijeðena private */\n"
- "class PrivateBase { };\n\n"
- "/*! Klasa koja se koristi agregacijom */\n"
- "class Used { };\n\n"
- "/*! Super klasa koja naslijeðuje/koristi ostale */\n"
- "class Inherited : public PublicBase,\n"
- " protected ProtectedBase,\n"
- " private PrivateBase,\n"
- " public Undocumented\n"
- "{\n"
- " private:\n"
- " Used *m_usedClass;\n"
- "};\n"
- "\\endcode\n"
- "Ako je \\c MAX_DOT_GRAPH_HEIGHT tag u konfiguracijskoj datoteci "
- "postavljen na 200 gornje veze æe rezultirati grafikonom:"
- "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
- "Pravokutnici imaju slijedeæe znaèenje:\n"
- "<ul>\n"
- "<li>Puni crni predstavlja klasu za koji je generiran graf.\n"
- "<li>Pravokutnik s crnim rubom predstavlja dokumentiranu klasu.\n"
- "<li>Pravokutnik s sivim rubom predstavlja nedokumentiranu klasu.\n"
- "<li>Pravokutnik s crvenim rubom predstavlja dokumentiranu klasu\n"
- "Za koju nije prikazan graf naslijeðivanja. Graf je odrezan "
- "ako ne stane unutar odreðenih granica."
- "</ul>\n"
- "Strelice imaju slijedeæe znaèenje:\n"
- "<ul>\n"
- "<li>Tamnoplava strelica oznaèava public naslijeðivanje.\n"
- "<li>Tamnozelena strelica oznaèava protected naslijeðivanje.\n"
- "<li>Tamnocrvena strelica oznaèava private naslijeðivanje.\n"
- "<li>Ljubièasta isprekidana strelica se koristi za agregate vezu. "
- "Strelica je oznaèena imenom varijable.\n"
- "</ul>\n");
- }
- /*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return "legenda";
- }
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return "Test";
- }
- /*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return "Test lista";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return "DCOP metode";
- }
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return "Svojstva (property)";
- }
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return "Dokumentacija svojstava";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- return "Klase";
- }
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
- {
- return decode((QCString)"Paket "+name);
- }
- /*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return "Lista paketa";
- }
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return "Paketi s kratkim opisom (ukoliko postoji):";
- }
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return "Paketi";
- }
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return "Vrijednost:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return decode("Greška");
- }
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return decode("Popis grešaka");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6
-//////////////////////////////////////////////////////////////////////////
- /*! Used as ansicpg for RTF file */
- virtual QCString trRTFansicp()
- {
- return "1252";
- }
- /*! Used as ansicpg for RTF fcharset */
- virtual QCString trRTFCharSet()
- {
- return "238";
- }
- /*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return decode("Sadr¾aj");
- }
-
- /*! 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 ? "Klas" : "klas"));
- result+= (singular ? "a" : "e");
- 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 ? "Datotek" : "datotek"));
- result+= (singular ? "a" : "e");
- 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;
- if (singular)
- result = ((first_capital ? "Imenik" : "imenik"));
- else
- result = ((first_capital ? "Imenici" : "imenici"));
- 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 ? "Grup" : "grup"));
- result+= (singular ? "a" : "e");
- 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 ? "Stranic" : "stranic"));
- result+= (singular ? "a" : "e");
- 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 ? "Èlan" : "èlan"));
- if (!singular) result+="ovi";
- return decode(result);
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trGlobal(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "G" : "g"));
- if( singular )
- result += "lobalna varijabla";
- else
- result += "lobalne varijable";
-
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is generated when the \\author command is used and
- * for the author section in man pages. */
- virtual QCString trAuthor(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Autor" : "autor"));
- if (!singular) result+="i";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return "Reference";
- }
-//////////////////////////////////////////////////////////////////////////
-// 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 "Implementira "+trWriteList(numEntries)+".";
- }
-
- /*! used in member documentation blocks to produce a list of
- * all members that implementation this member.
- */
- virtual QCString trImplementedInList(int numEntries)
- {
- return "Implementirano u "+trWriteList(numEntries)+".";
- }
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.16
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in RTF documentation as a heading for the Table
- * of Contents.
- */
- virtual QCString trRTFTableOfContents()
- {
- return decode("Sadr¾aj");
- }
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.17
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as the header of the list of item that have been
- * flagged deprecated
- */
- virtual QCString trDeprecatedList()
- {
- return "Popis zastarjelih metoda";
- }
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.18
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a header for declaration section of the events found in
- * a C# program
- */
- virtual QCString trEvents()
- {
- return decode("Dogaðaji");
- }
- /*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- return decode("Dokumentacija dogaðaja");
- }
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a heading for a list of Java class types with package scope.
- */
- virtual QCString trPackageTypes()
- {
- return "Tipovi u paketu";
- }
- /*! Used as a heading for a list of Java class functions with package
- * scope.
- */
- virtual QCString trPackageMembers()
- {
- return "Funkcije u paketu";
- }
- /*! Used as a heading for a list of static Java class functions with
- * package scope.
- */
- virtual QCString trStaticPackageMembers()
- {
- return decode("Statièke funkcije u paketu");
- }
- /*! Used as a heading for a list of Java class variables with package
- * scope.
- */
- virtual QCString trPackageAttribs()
- {
- return "Atributi u paketu";
- }
- /*! Used as a heading for a list of static Java class variables with
- * package scope.
- */
- virtual QCString trStaticPackageAttribs()
- {
- return decode("Statièki atributi u paketu");
- }
- //////////////////////////////////////////////////////////////////////////
- // 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 "Sve";
- }
- /*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- return "Ovo je dijagram poziva za ovu funkciju:";
- }
-
- //////////////////////////////////////////////////////////////////////////
- // new since 1.3.3
- //////////////////////////////////////////////////////////////////////////
-
- /*! When the search engine is enabled this text is put in the header
- * of each page before the field where one can enter the text to search
- * for.
- */
- virtual QCString trSearchForIndex()
- {
- return decode("Traži");
- }
- /*! This string is used as the title for the page listing the search
- * results.
- */
- virtual QCString trSearchResultsTitle()
- {
- return "Rezultati pretrage";
- }
- /*! 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
- * the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
- * value 2 represents 2 or more matches. HTML markup is allowed inside
- * the returned string.
- */
- virtual QCString trSearchResults(int numDocuments)
- {
- if (numDocuments==0)
- {
- return decode("Nema dokumenta koji odgovaraju vašem upitu");
- }
- else if (numDocuments==1)
- {
- return decode("Naðen <b>1</b> dokument koji odgovara vašem upitu.");
- }
- else if (numDocuments<5)
- {
- // croatian handle numbers up to 5 differently
- // For those of you who like to read comments :
- // There are only 4 men in the world in croatian.
- // We say 1 èovjek (man), 2 èovjeka, 3 èovjeka , 4 èovjeka , but 5, 6, 7 ... ljudi (people)
- // That's deep, isn't it :-)?
- return decode("Naðena <b>$num</b> dokumenta koji odgovaraju vašem upitu."
- "Najbolji su prikazani prvi.");
- }
- else
- {
- return decode("Naðeno <b>$num</b> dokumenata koji odgovaraju vašem upitu."
- "Najbolji su prikazani prvi.");
- }
- }
- /*! 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 decode("Pronaðeno:");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Izvorni kod datoteke " + filename;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.9
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the name of the chapter containing the directory
- * hierarchy.
- */
- virtual QCString trDirIndex()
- { return "Stablo direktorija"; }
-
- /*! This is used as the name of the chapter containing the documentation
- * of the directories.
- */
- virtual QCString trDirDocumentation()
- { return "Dokumentacija direktorija"; }
-
- /*! 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 "Direktoriji"; }
-
- /*! This returns a sentences that introduces the directory hierarchy.
- * and the fact that it is sorted alphabetically per level
- */
- virtual QCString trDirDescription()
- { return "Stablo direktorija sortirano abecednim redom:"; }
-
- /*! 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= "Opis direktorija "; result += dirName; return result; }
-
- /*! This returns the word directory with or without starting capital
- * (\a first_capital) and in sigular or plural form (\a singular).
- */
- virtual QCString trDir(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Direktorij" : "direktorij"));
- if (!singular) result+="i";
- 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 decode("Ovo je preoptereæena funkcija (overload). "
- "Razlikuje se od navedene metode "
- "samo po vrsti argumenata koje prihvata.");
- }
-
-};
-
-#endif
-
-
diff --git a/src/translator_hu.h b/src/translator_hu.h
deleted file mode 100644
index 2cb300d..0000000
--- a/src/translator_hu.h
+++ /dev/null
@@ -1,1545 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-
- /*
- * Original Hungarian translation by
- * György Földvári <foldvari@diatronltd.com>
- *
- * Extended, revised and updated by
- * Ákos Kiss <akiss@users.sourceforge.net>
- *
- * Further extended, revised and updated by
- * Tamási Ferenc <tf551@hszk.bme.hu>
- */
-
-#ifndef TRANSLATOR_HU_H
-#define TRANSLATOR_HU_H
-
-class TranslatorHungarian : public Translator
-{
- private:
- const char * zed(char c)
- {
- switch (c & ~('a' ^ 'A')) {
- case 'B': case 'C': case 'D': case 'F': case 'G':
- case 'H': case 'J': case 'K': case 'L': case 'M':
- case 'N': case 'P': case 'Q': case 'R': case 'S':
- case 'T': case 'V': case 'W': case 'X': case 'Z':
- return " ";
- default:
- return "z ";
- }
- }
- public:
-
- // --- Language control methods -------------------
- virtual QCString idLanguage()
- { return "hungarian"; }
- /*! Used to get the command(s) for the language support. This method
- * was designed for languages which do not prefer babel package.
- * If this methods returns empty string, then the latexBabelPackage()
- * method is used to generate the command for using the babel package.
- */
- virtual QCString latexLanguageSupportCommand()
- {
- return "\\usepackage{t1enc}\n\\usepackage[latin2]{inputenc}\n\\usepackage[magyar]{babel}\n";
- }
-
- /*! return the language charset. This will be used for the HTML output */
- virtual QCString idLanguageCharset()
- {
- return "iso-8859-2";
- }
-
- // --- Language translation methods -------------------
-
- /*! used in the compound documentation before a list of related functions. */
- virtual QCString trRelatedFunctions()
- { return "Kapcsolódó függvények"; }
-
- /*! subscript for the related functions. */
- virtual QCString trRelatedSubscript()
- { return "(Figyelem! Ezek a függvények nem tagjai az osztálynak!)"; }
-
- /*! header that is put before the detailed description of files, classes and namespaces. */
- virtual QCString trDetailedDescription()
- { return "Részletes leírás"; }
-
- /*! header that is put before the list of typedefs. */
- virtual QCString trMemberTypedefDocumentation()
- { return "Típusdefiníció-tagok dokumentációja"; }
-
- /*! header that is put before the list of enumerations. */
- virtual QCString trMemberEnumerationDocumentation()
- { return "Enumeráció-tagok dokumentációja"; }
-
- /*! header that is put before the list of member functions. */
- virtual QCString trMemberFunctionDocumentation()
- { return "Tagfüggvények dokumentációja"; }
-
- /*! header that is put before the list of member attributes. */
- virtual QCString trMemberDataDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Adatmezõk dokumentációja";
- }
- else
- {
- return "Adattagok dokumentációja";
- }
- }
-
- /*! this is the text of a link put after brief descriptions. */
- virtual QCString trMore()
- { return "Részletek..."; }
-
- /*! put in the class documentation */
- virtual QCString trListOfAllMembers()
- { return "A tagok teljes listája."; }
-
- /*! used as the title of the "list of all members" page of a class */
- virtual QCString trMemberList()
- { return "Taglista"; }
-
- /*! this is the first part of a sentence that is followed by a class name */
- virtual QCString trThisIsTheListOfAllMembers()
- { return "A(z) "; }
-
- /*! this is the remainder of the sentence after the class name */
- virtual QCString trIncludingInheritedMembers()
- { return " osztály tagjainak teljes listája, az örökölt tagokkal együtt."; }
-
- virtual QCString trGeneratedAutomatically(const char *s)
- { QCString result="Ezt a dokumentációt a Doxygen készítette ";
- if (s) result+=(QCString)" a" + zed(s[0])+s+(QCString)" projekthez";
- result+=" a forráskódból.";
- return result;
- }
-
- /*! put after an enum name in the list of all members */
- virtual QCString trEnumName()
- { return "enum"; }
-
- /*! put after an enum value in the list of all members */
- virtual QCString trEnumValue()
- { return "enum-érték"; }
-
- /*! put after an undocumented member in the list of all members */
- virtual QCString trDefinedIn()
- { return "definiálja:"; }
-
- // 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 "Modulok"; }
-
- /*! This is put above each page as a link to the class hierarchy */
- virtual QCString trClassHierarchy()
- { return "Osztályhierarchia"; }
-
- /*! This is put above each page as a link to the list of annotated classes */
- virtual QCString trCompoundList()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Adatszerkezetek";
- }
- else
- {
- return "Osztálylista";
- }
- }
-
- /*! This is put above each page as a link to the list of documented files */
- virtual QCString trFileList()
- { return "Fájllista"; }
-
- /*! This is put above each page as a link to all members of compounds. */
- virtual QCString trCompoundMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Adatmezõk";
- }
- else
- {
- return "Osztálytagok";
- }
- }
-
- /*! This is put above each page as a link to all members of files. */
- virtual QCString trFileMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Globális elemek";
- }
- else
- {
- return "Fájlelemek";
- }
- }
-
- /*! This is put above each page as a link to all related pages. */
- virtual QCString trRelatedPages()
- { return "Kapcsolódó lapok"; }
-
- /*! This is put above each page as a link to all examples. */
- virtual QCString trExamples()
- { return "Példák"; }
-
- /*! This is put above each page as a link to the search engine. */
- virtual QCString trSearch()
- { return "Keresés"; }
-
- /*! This is an introduction to the class hierarchy. */
- virtual QCString trClassHierarchyDescription()
- { return "Majdnem (de nem teljesen) betûrendbe szedett "
- "leszármazási lista:";
- }
-
- /*! This is an introduction to the list with all files. */
- virtual QCString trFileListDescription(bool extractAll)
- {
- QCString result="Az összes ";
- if (!extractAll) result+="dokumentált ";
- result+="fájl listája rövid leírásokkal:";
- return result;
- }
-
- /*! This is an introduction to the annotated compound list. */
- virtual QCString trCompoundListDescription()
- {
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Az összes adatszerkezet listája rövid leírásokkal:";
- }
- else
- {
- return "Az összes osztály, struktúra, unió és interfész "
- "listája rövid leírásokkal:";
- }
- }
-
- /*! This is an introduction to the page with all class members. */
- virtual QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result="Az összes ";
- if (!extractAll)
- {
- result+="dokumentált ";
- }
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="struktúra- és úniómezõ";
- }
- else
- {
- result+="osztálytag";
- }
- result+=" listája, valamint hivatkozás ";
- if (!extractAll)
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="a megfelelõ struktúra-/úniódokumentációra minden mezõnél:";
- }
- else
- {
- result+="a megfelelõ osztálydokumentációra minden tagnál:";
- }
- }
- else
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="a struktúrákra/úniókra, amikhez tartoznak:";
- }
- else
- {
- result+="az osztályokra, amikhez tartoznak:";
- }
- }
- return result;
- }
-
- /*! This is an introduction to the page with all file members. */
- virtual QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="Az összes ";
- if (!extractAll) result+="dokumentált ";
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="függvény, változó, makródefiníció, enumeráció és típusdefiníció";
- }
- else
- {
- result+="fájlelem";
- }
- result+=" listája, valamint hivatkozás ";
- if (extractAll)
- result+="a fájlokra, amikhez tartoznak:";
- else
- result+="a dokumentációra:";
- return result;
- }
-
- /*! This is an introduction to the page with the list of all examples */
- virtual QCString trExamplesDescription()
- { return "A példák listája:"; }
-
- /*! This is an introduction to the page with the list of related pages */
- virtual QCString trRelatedPagesDescription()
- { return "A kapcsolódó dokumentációk listája:"; }
-
- /*! This is an introduction to the page with the list of class/file groups */
- virtual QCString trModulesDescription()
- { return "A modulok listája:"; }
-
- // index titles (the project name is prepended for these)
-
-
- /*! This is used in HTML as the title of index.html. */
- virtual QCString trDocumentation()
- { return "Dokumentáció"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all groups.
- */
- virtual QCString trModuleIndex()
- { return "Modulmutató"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * class hierarchy.
- */
- virtual QCString trHierarchicalIndex()
- { return "Hierarchikus mutató"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * annotated compound index.
- */
- virtual QCString trCompoundIndex()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Adatszerkezet-mutató";
- }
- else
- {
- return "Osztálymutató";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * list of all files.
- */
- virtual QCString trFileIndex()
- { return "Fájlmutató"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all groups.
- */
- virtual QCString trModuleDocumentation()
- { return "Modulok dokumentációja"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all classes, structs and unions.
- */
- virtual QCString trClassDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Adatszerkezetek dokumentációja";
- }
- else
- {
- return "Osztályok dokumentációja";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all files.
- */
- virtual QCString trFileDocumentation()
- { return "Fájlok dokumentációja"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all examples.
- */
- virtual QCString trExampleDocumentation()
- { return "Példák dokumentációja"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all related pages.
- */
- virtual QCString trPageDocumentation()
- { return "Kapcsolódó dokumentációk"; }
-
- /*! This is used in LaTeX as the title of the document */
- virtual QCString trReferenceManual()
- { return "Referencia kézikönyv"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of defines
- */
- virtual QCString trDefines()
- { return "Makródefiníciók"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of function prototypes
- */
- virtual QCString trFuncProtos()
- { return "Függvény-prototípusok"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of typedefs
- */
- virtual QCString trTypedefs()
- { return "Típusdefiníciók"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of enumerations
- */
- virtual QCString trEnumerations()
- { return "Enumerációk"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) functions
- */
- virtual QCString trFunctions()
- { return "Függvények"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trVariables()
- { return "Változók"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trEnumerationValues()
- { return "Enumeráció-értékek"; }
-
- /*! This is used in the documentation of a file before the list of
- * documentation blocks for defines
- */
- virtual QCString trDefineDocumentation()
- { return "Makródefiníciók dokumentációja"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for function prototypes
- */
- virtual QCString trFunctionPrototypeDocumentation()
- { return "Függvény-prototípusok dokumentációja"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for typedefs
- */
- virtual QCString trTypedefDocumentation()
- { return "Típusdefiníciók dokumentációja"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration types
- */
- virtual QCString trEnumerationTypeDocumentation()
- { return "Enumerációk dokumentációja"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for functions
- */
- virtual QCString trFunctionDocumentation()
- { return "Függvények dokumentációja"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for variables
- */
- virtual QCString trVariableDocumentation()
- { return "Változók dokumentációja"; }
-
- /*! This is used in the documentation of a file/namespace/group before
- * the list of links to documented compounds
- */
- virtual QCString trCompounds()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Adatszerkezetek";
- }
- else
- {
- return "Osztályok";
- }
- }
-
- /*! 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)"";
- if (projName) result+=(QCString)"Projekt: "+projName;
- result+=(QCString)" Készült: "+date+" Készítette: ";
- return result;
- }
- /*! This is part of the sentence used in the standard footer of each page.
- */
- virtual QCString trWrittenBy()
- {
- return " melyet írt ";
- }
-
- /*! this text is put before a class diagram */
- virtual QCString trClassDiagram(const char *clName)
- {
- return (QCString)"A"+zed(clName[0])+clName+" osztály származási diagramja:";
- }
-
- /*! this text is generated when the \\internal command is used. */
- virtual QCString trForInternalUseOnly()
- { return "CSAK BELSÕ HASZNÁLATRA!"; }
-
- /*! this text is generated when the \\warning command is used. */
- virtual QCString trWarning()
- { return "Figyelmeztetés"; }
-
- /*! this text is generated when the \\version command is used. */
- virtual QCString trVersion()
- { return "Verzió"; }
-
- /*! this text is generated when the \\date command is used. */
- virtual QCString trDate()
- { return "Dátum"; }
-
- /*! this text is generated when the \\return command is used. */
- virtual QCString trReturns()
- { return "Visszatérési érték"; }
-
- /*! this text is generated when the \\sa command is used. */
- virtual QCString trSeeAlso()
- { return "Lásd még"; }
-
- /*! this text is generated when the \\param command is used. */
- virtual QCString trParameters()
- { return "Paraméterek"; }
-
- /*! this text is generated when the \\exception command is used. */
- virtual QCString trExceptions()
- { return "Kivételek"; }
-
- /*! this text is used in the title page of a LaTeX document. */
- virtual QCString trGeneratedBy()
- { return "Készítette"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of page containing all the index of all namespaces. */
- virtual QCString trNamespaceList()
- { return "Névtérlista"; }
-
- /*! used as an introduction to the namespace list */
- virtual QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="Az összes ";
- if (!extractAll) result+="dokumentált ";
- result+="névtér listája rövid leírásokkal:";
- return result;
- }
-
- /*! used in the class documentation as a header before the list of all
- * friends of a class
- */
- virtual QCString trFriends()
- { return "Barátok"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in the class documentation as a header before the list of all
- * related classes
- */
- virtual QCString trRelatedFunctionDocumentation()
- { return "Barát és kapcsolódó függvények dokumentációja"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of the HTML page of a class/struct/union */
- virtual QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- {
- QCString result=(QCString)clName;
- switch(compType)
- {
- case ClassDef::Class: result+=" osztály"; break;
- case ClassDef::Struct: result+=" struktúra"; break;
- case ClassDef::Union: result+=" unió"; break;
- case ClassDef::Interface: result+=" interfész"; break;
- case ClassDef::Protocol: result+=" protocol"; break; // translate me!
- case ClassDef::Category: result+=" category"; break; // translate me!
- case ClassDef::Exception: result+=" kivétel"; break;
- }
- if (isTemplate) result+="sablon-";
- result+="referencia";
- return result;
- }
-
- /*! used as the title of the HTML page of a file */
- virtual QCString trFileReference(const char *fileName)
- {
- QCString result=fileName;
- result+=" fájlreferencia";
- return result;
- }
-
- /*! used as the title of the HTML page of a namespace */
- virtual QCString trNamespaceReference(const char *namespaceName)
- {
- QCString result=namespaceName;
- result+=" névtér-referencia";
- return result;
- }
-
- virtual QCString trPublicMembers()
- { return "Publikus tagfüggvények"; }
- virtual QCString trPublicSlots()
- { return "Publikus rések"; }
- virtual QCString trSignals()
- { return "Szignálok"; }
- virtual QCString trStaticPublicMembers()
- { return "Statikus publikus tagfüggvények"; }
- virtual QCString trProtectedMembers()
- { return "Védett tagfüggvények"; }
- virtual QCString trProtectedSlots()
- { return "Védett rések"; }
- virtual QCString trStaticProtectedMembers()
- { return "Statikus védett tagfüggvények"; }
- virtual QCString trPrivateMembers()
- { return "Privát tagfüggvények"; }
- virtual QCString trPrivateSlots()
- { return "Privát rések"; }
- virtual QCString trStaticPrivateMembers()
- { return "Statikus privát tagfüggvények"; }
-
- /*! this function is used to produce a comma-separated list of items.
- * use generateMarker(i) to indicate where item i should be put.
- */
- virtual QCString trWriteList(int numEntries)
- {
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=" és ";
- }
- }
- return result;
- }
-
- /*! used in class documentation to produce a list of base classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritsList(int numEntries)
- {
- return "Õsök: "+trWriteList(numEntries)+".";
- }
-
- /*! used in class documentation to produce a list of super classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritedByList(int numEntries)
- {
- return "Leszármazottak: "+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 "Újraimplementált õsök: "+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 "Újraimplementáló leszármazottak: "+trWriteList(numEntries)+".";
- }
-
- /*! This is put above each page as a link to all members of namespaces. */
- virtual QCString trNamespaceMembers()
- { return "Névtértagok"; }
-
- /*! This is an introduction to the page with all namespace members */
- virtual QCString trNamespaceMemberDescription(bool extractAll)
- {
- QCString result="Az összes ";
- if (!extractAll) result+="dokumentált ";
- result+="névtér tagjainak listája, valamint hivatkozás ";
- if (extractAll)
- result+=" a megfelelõ névtér dokumentációra minden tagnál:";
- else
- result+=" a névterekre, amelynek tagjai:";
- return result;
- }
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all namespaces.
- */
- virtual QCString trNamespaceIndex()
- { return "Névtérmutató"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all namespaces.
- */
- virtual QCString trNamespaceDocumentation()
- { return "Névterek dokumentációja"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- virtual QCString trNamespaces()
- { return "Névterek"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990728
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is put at the bottom of a class documentation page and is
- * followed by a list of files that were used to generate the page.
- */
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)"Ez a dokumentáció ";
- switch(compType)
- {
- case ClassDef::Class: result+="az osztályról"; break;
- case ClassDef::Struct: result+="a struktúráról"; break;
- case ClassDef::Union: result+="az unióról"; break;
- case ClassDef::Interface: result+="az interfészrõl"; break;
- case ClassDef::Protocol: result+="protocol"; break; // translate me!
- case ClassDef::Category: result+="category"; break; // translate me!
- case ClassDef::Exception: result+="a kivételrõl"; break;
- }
- result+=" a következõ fájl";
- if (!single) result+="ok";
- result+=" alapján készült:";
- return result;
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- virtual QCString trAlphabeticalList()
- { return "Betûrendes lista"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- virtual QCString trReturnValues()
- { return "Visszatérési értékek"; }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- virtual QCString trMainPage()
- { return "Fõoldal"; }
-
- /*! 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 "o."; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991003
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDefinedAtLineInSourceFile()
- {
- return "Definíció a(z) @1 fájl @0. sorában.";
- }
- virtual QCString trDefinedInSourceFile()
- {
- return "Definíció a(z) @0 fájlban.";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDeprecated()
- {
- return "Ellenjavallt";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- virtual QCString trCollaborationDiagram(const char *clName)
- {
- return (QCString)"A"+zed(clName[0])+clName+" osztály együttmûködési diagramja:";
- }
- /*! this text is put before an include dependency graph */
- virtual QCString trInclDepGraph(const char *fName)
- {
- return (QCString)"A"+zed(fName[0])+fName+" definíciós fájl függési gráfja:";
- }
- /*! header that is put before the list of constructor/destructors. */
- virtual QCString trConstructorDocumentation()
- {
- return "Konstruktorok és destruktorok dokumentációja";
- }
- /*! Used in the file documentation to point to the corresponding sources. */
- virtual QCString trGotoSourceCode()
- {
- return "Ugrás a fájl forráskódjához.";
- }
- /*! Used in the file sources to point to the corresponding documentation. */
- virtual QCString trGotoDocumentation()
- {
- return "Ugrás a fájl dokumentációjához.";
- }
- /*! Text for the \\pre command */
- virtual QCString trPrecondition()
- {
- return "Elõfeltétel";
- }
- /*! Text for the \\post command */
- virtual QCString trPostcondition()
- {
- return "Utófeltétel";
- }
- /*! Text for the \\invariant command */
- virtual QCString trInvariant()
- {
- return "Invariáns";
- }
- /*! Text shown before a multi-line variable/enum initialization */
- virtual QCString trInitialValue()
- {
- return "Kezdõ érték:";
- }
- /*! Text used the source code in the file index */
- virtual QCString trCode()
- {
- return "forráskód";
- }
- virtual QCString trGraphicalHierarchy()
- {
- return "Osztályhierarchia-ábra";
- }
- virtual QCString trGotoGraphicalHierarchy()
- {
- return "Ugrás az osztályhierarchia-ábrához";
- }
- virtual QCString trGotoTextualHierarchy()
- {
- return "Ugrás az szöveges osztályhierarchiához";
- }
- virtual QCString trPageIndex()
- {
- return "Oldalmutató";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trNote()
- {
- return "Megjegyzés";
- }
- virtual QCString trPublicTypes()
- {
- return "Publikus típusok";
- }
- virtual QCString trPublicAttribs()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Adatmezõk";
- }
- else
- {
- return "Publikus attribútumok";
- }
- }
- virtual QCString trStaticPublicAttribs()
- {
- return "Statikus publikus attribútumok";
- }
- virtual QCString trProtectedTypes()
- {
- return "Védett típusok";
- }
- virtual QCString trProtectedAttribs()
- {
- return "Védett attribútumok";
- }
- virtual QCString trStaticProtectedAttribs()
- {
- return "Statikus védett attribútumok";
- }
- virtual QCString trPrivateTypes()
- {
- return "Privát típusok";
- }
- virtual QCString trPrivateAttribs()
- {
- return "Privát attribútumok";
- }
- virtual QCString trStaticPrivateAttribs()
- {
- return "Statikus privát attribútumok";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a todo item */
- virtual QCString trTodo()
- {
- return "Tennivaló";
- }
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- {
- return "Tennivalók listája";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy()
- {
- return "Hivatkozások:";
- }
- virtual QCString trRemarks()
- {
- return "Megjegyzések";
- }
- virtual QCString trAttention()
- {
- return "Figyelem";
- }
- virtual QCString trInclByDepGraph()
- {
- return "Ez az ábra azt mutatja, hogy mely fájlok ágyazzák be "
- "közvetve vagy közvetlenül ezt a fájlt:";
- }
- virtual QCString trSince()
- {
- return "Elõször bevezetve";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- virtual QCString trLegendTitle()
- {
- return "Jelmagyarázat";
- }
- /*! page explaining how the dot graph's should be interpreted */
- virtual QCString trLegendDocs()
- {
- return
- "Ez az oldal elmagyarázza hogyan kell értelmezni a "
- "doxygen által készített ábrákat.<p>\n"
- "Vegyük a következõ példát:\n"
- "\\code\n"
- "/*! Vágás miatt nem látható osztály */\n"
- "class Invisible { };\n\n"
- "/*! Levágott osztály, származása rejtett */\n"
- "class Truncated : public Invisible { };\n\n"
- "/* Doxygen kommentekkel nem dokumentált osztály */\n"
- "class Undocumented { };\n\n"
- "/*! Publikus származtatásal levezetett osztály */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! Egy sablonosztály */\n"
- "template<class T> class Templ { };\n\n"
- "/*! Védett származtatásal levezetett osztály */\n"
- "class ProtectedBase { };\n\n"
- "/*! Privát származtatásal levezetett osztály */\n"
- "class PrivateBase { };\n\n"
- "/*! Osztály, melyet a származtatott osztály használ */\n"
- "class Used { };\n\n"
- "/*! Osztály, mely több másiknak leszármazottja */\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"
- "Ha a konfigurációs fájl \\c MAX_DOT_GRAPH_HEIGHT elemének értékét "
- "240-re állítjuk, az eredmény a következõ ábra lesz:"
- "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
- "Az ábrán levõ dobozok jelentése:\n"
- "<ul>\n"
- "<li>Kitöltött fekete doboz jelzi azt az osztályt vagy struktúrát,"
- "amelyrõl az ábra szól.\n"
- "<li>Fekete keret jelzi a dokumentált osztályokat és struktúrákat.\n"
- "<li>Szürke keret jelzi a nem dokumentált osztályokat és struktúrákat.\n"
- "<li>Piros keret jelzi azokat az osztályokat és struktúrákat, amelyeknél vágás miatt nem látható "
- "az összes leszármaztatási kapcsolat. Egy ábra vágásra kerül, ha nem fér bele "
- "a megadott tartományba."
- "</ul>\n"
- "A nyilak jelentése:\n"
- "<ul>\n"
- "<li>Sötétkék nyíl jelzi a publikus származtatást.\n"
- "<li>Sötétzöld nyíl jelzi a védett származtatást.\n"
- "<li>Sötétvörös nyíl jelzi a privát származtatást.\n"
- "<li>Lila szaggatott nyíl jelzi, ha az osztály egy másikat használ vagy tartalmaz. "
- "A nyíl felirata jelzi a változó(k) nevét, amelyeken keresztül a másik osztály kapcsolódik.\n"
- "<li>Sárga szaggatott nyíl jelzi a kapcsolatot a sablonpéldány és a példányosított "
- "osztálysablon között. A nyíl felirata jelzi a pélány sablonparamétereit.\n"
- "</ul>\n";
-
- }
- /*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return "Jelmagyarázat";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return "Teszt";
- }
- /*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return "Tesztlista";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return "DCOP tagfüggvények";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return "Tulajdonságok";
- }
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return "Tulajdonságok dokumentációjka";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Adatszerkezetek";
- }
- else
- {
- return "Osztályok";
- }
- }
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
- {
- return name+(QCString)" csomag";
- }
- /*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return "Csomaglista";
- }
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return "A csomagok rövid leírásai (amennyiben léteznek):";
- }
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return "Csomagok";
- }
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return "Érték:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return "Hiba";
- }
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return "Hiba lista";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as ansicpg for RTF file
- *
- * The following table shows the correlation of Charset name, Charset Value and
- * <pre>
- * Codepage number:
- * Charset Name Charset Value(hex) Codepage number
- * ------------------------------------------------------
- * DEFAULT_CHARSET 1 (x01)
- * SYMBOL_CHARSET 2 (x02)
- * OEM_CHARSET 255 (xFF)
- * ANSI_CHARSET 0 (x00) 1252
- * RUSSIAN_CHARSET 204 (xCC) 1251
- * EE_CHARSET 238 (xEE) 1250
- * GREEK_CHARSET 161 (xA1) 1253
- * TURKISH_CHARSET 162 (xA2) 1254
- * BALTIC_CHARSET 186 (xBA) 1257
- * HEBREW_CHARSET 177 (xB1) 1255
- * ARABIC _CHARSET 178 (xB2) 1256
- * SHIFTJIS_CHARSET 128 (x80) 932
- * HANGEUL_CHARSET 129 (x81) 949
- * GB2313_CHARSET 134 (x86) 936
- * CHINESEBIG5_CHARSET 136 (x88) 950
- * </pre>
- *
- */
- virtual QCString trRTFansicp()
- {
- return "1252";
- }
-
-
- /*! Used as ansicpg for RTF fcharset
- * \see trRTFansicp() for a table of possible values.
- */
- virtual QCString trRTFCharSet()
- {
- return "0";
- }
-
- /*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return "Tárgymutató";
- }
-
- /*! 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 ? "Osztály" : "osztály"));
- //if (!singular) result+="es";
- 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 ? "Fájl" : "fájl"));
- //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 ? "Névtér" : "névtér"));
- //if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trGroup(bool first_capital, bool /*singular*/)
- {
- QCString result((first_capital ? "Csoport" : "csoport"));
- //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 ? "Oldal" : "oldal"));
- //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 ? "Tag" : "tag"));
- //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 ? "Globális elem" : "globális elem"));
- //if (!singular) result+="s";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is generated when the \\author command is used and
- * for the author section in man pages. */
- virtual QCString trAuthor(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Szerzõ" : "szerzõ"));
- if (!singular) result+="k";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return "Hivatkozások";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Megvalósítja a következõket: "+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 "Megvalósítják a következõk: "+trWriteList(numEntries)+".";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.16
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in RTF documentation as a heading for the Table
- * of Contents.
- */
- virtual QCString trRTFTableOfContents()
- {
- return "Tartalomjegyzék";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.17
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as the header of the list of item that have been
- * flagged deprecated
- */
- virtual QCString trDeprecatedList()
- {
- return "Ellenjavallt elemek listája";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.18
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a header for declaration section of the events found in
- * a C# program
- */
- virtual QCString trEvents()
- {
- return "Események";
- }
- /*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- return "Események dokumentációja";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a heading for a list of Java class types with package scope.
- */
- virtual QCString trPackageTypes()
- {
- return "Csomag típusok";
- }
- /*! Used as a heading for a list of Java class functions with package
- * scope.
- */
- virtual QCString trPackageMembers()
- {
- return "Csomag függvények";
- }
- /*! Used as a heading for a list of static Java class functions with
- * package scope.
- */
- virtual QCString trStaticPackageMembers()
- {
- return "Statikus csomag függvények";
- }
- /*! Used as a heading for a list of Java class variables with package
- * scope.
- */
- virtual QCString trPackageAttribs()
- {
- return "Csomag attribútumok";
- }
- /*! Used as a heading for a list of static Java class variables with
- * package scope.
- */
- virtual QCString trStaticPackageAttribs()
- {
- return "Statikus csomag attribútumok";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Összes";
- }
- /*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- return "A függvény hívási gráfja:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! When the search engine is enabled this text is put in the header
- * of each page before the field where one can enter the text to search
- * for.
- */
- virtual QCString trSearchForIndex()
- {
- return "Keresési kulcs";
- }
- /*! This string is used as the title for the page listing the search
- * results.
- */
- virtual QCString trSearchResultsTitle()
- {
- return "A keresés eredménye";
- }
- /*! 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
- * the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
- * value 2 represents 2 or more matches. HTML markup is allowed inside
- * the returned string.
- */
- virtual QCString trSearchResults(int numDocuments)
- {
- if (numDocuments==0)
- {
- return "Sajnos egy dokumentum sem felelt meg a keresési feltételeknek.";
- }
- else if (numDocuments==1)
- {
- return "<b>1</b> dokumentum felelt meg a keresési feltételeknek.";
- }
- else
- {
- return "<b>$num</b> dokumentum felelt meg a keresési feltételeknek."
- "Elsõnek a legjobb találatok vannak feltüntetve.";
- }
- }
- /*! 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 "Találatok:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 filename + " Forrásfájl";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.9
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the name of the chapter containing the directory
- * hierarchy.
- */
- virtual QCString trDirIndex()
- { return "Könyvtárhierarchia"; }
-
- /*! This is used as the name of the chapter containing the documentation
- * of the directories.
- */
- virtual QCString trDirDocumentation()
- { return "Könyvtárak dokumentációja"; }
-
- /*! 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 "Könyvtárak"; }
-
- /*! This returns a sentences that introduces the directory hierarchy.
- * and the fact that it is sorted alphabetically per level
- */
- virtual QCString trDirDescription()
- { return "Majdnem (de nem teljesen) betûrendbe szedett "
- "könyvtárhierarchia:";
- }
-
- /*! 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=dirName; result+=" könyvtárreferencia"; return result; }
-
- /*! 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 ? "Könyvtár" : "könyvtár"));
- //if (singular) result+="y"; else result+="ies";
- 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 "Ez egy túlterhelt tagfüggvény."
- "A fenti függvénytõl csak argumentumaiban különbözik.";
- }
-};
-
-#endif
diff --git a/src/translator_id.h b/src/translator_id.h
deleted file mode 100644
index bd292c2..0000000
--- a/src/translator_id.h
+++ /dev/null
@@ -1,1596 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 TRANSLATOR_ID_H
-#define TRANSLATOR_ID_H
-
-/*!
- Indonesian translator based on Doxygen 1.4.2.
-
- \author Hendy Irawan <ceefour@gauldong.net>
- */
-class TranslatorIndonesian : public Translator
-{
- public:
-
- // --- Language control methods -------------------
-
- /*! Used for identification of the language. The identification
- * should not be translated. It should be replaced by the name
- * of the language in English using lower-case characters only
- * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
- * the identification used in language.cpp.
- */
- virtual QCString idLanguage()
- { return "indonesian"; }
-
- /*! Used to get the LaTeX command(s) for the language support.
- * This method should return string with commands that switch
- * LaTeX to the desired language. For example
- * <pre>"\\usepackage[german]{babel}\n"
- * </pre>
- * or
- * <pre>"\\usepackage{polski}\n"
- * "\\usepackage[latin2]{inputenc}\n"
- * "\\usepackage[T1]{fontenc}\n"
- * </pre>
- *
- * The English LaTeX does not use such commands. Because of this
- * the empty string is returned in this implementation.
- */
- virtual QCString latexLanguageSupportCommand()
- {
- return "";
- }
-
- /*! return the language charset. This will be used for the HTML output */
- virtual QCString idLanguageCharset()
- {
- return "iso-8859-1";
- }
-
- // --- Language translation methods -------------------
-
- /*! used in the compound documentation before a list of related functions. */
- virtual QCString trRelatedFunctions()
- { return "Fungsi-fungsi Terkait"; }
-
- /*! subscript for the related functions. */
- virtual QCString trRelatedSubscript()
- { return "(Catatan: Fungsi-fungsi tersebut bukan fungsi anggota.)"; }
-
- /*! header that is put before the detailed description of files, classes and namespaces. */
- virtual QCString trDetailedDescription()
- { return "Keterangan Lengkap"; }
-
- /*! header that is put before the list of typedefs. */
- virtual QCString trMemberTypedefDocumentation()
- { return "Dokumentasi Anggota: Tipe"; }
-
- /*! header that is put before the list of enumerations. */
- virtual QCString trMemberEnumerationDocumentation()
- { return "Dokumentasi Anggota: Enumerasi"; }
-
- /*! header that is put before the list of member functions. */
- virtual QCString trMemberFunctionDocumentation()
- { return "Dokumentasi Anggota: Fungsi"; }
-
- /*! header that is put before the list of member attributes. */
- virtual QCString trMemberDataDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Dokumentasi Variabel";
- }
- else
- {
- return "Dokumentasi Anggota: Data";
- }
- }
-
- /*! this is the text of a link put after brief descriptions. */
- virtual QCString trMore()
- { return "Selengkapnya..."; }
-
- /*! put in the class documentation */
- virtual QCString trListOfAllMembers()
- { return "Daftar semua anggota."; }
-
- /*! used as the title of the "list of all members" page of a class */
- virtual QCString trMemberList()
- { return "Daftar anggota"; }
-
- /*! this is the first part of a sentence that is followed by a class name */
- virtual QCString trThisIsTheListOfAllMembers()
- { return "Berikut ini daftar lengkap anggota untuk "; }
-
- /*! this is the remainder of the sentence after the class name */
- virtual QCString trIncludingInheritedMembers()
- { return ", termasuk semua anggota yang diwariskan."; }
-
- /*! 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="Dihasilkan secara otomatis oleh Doxygen";
- if (s) result+=(QCString)" untuk "+s;
- result+=" dari kode sumber.";
- return result;
- }
-
- /*! put after an enum name in the list of all members */
- virtual QCString trEnumName()
- { return "nama enumerasi"; }
-
- /*! put after an enum value in the list of all members */
- virtual QCString trEnumValue()
- { return "nilai enumerasi"; }
-
- /*! put after an undocumented member in the list of all members */
- virtual QCString trDefinedIn()
- { return "didefinisikan di"; }
-
- // 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 "Modul"; }
-
- /*! This is put above each page as a link to the class hierarchy */
- virtual QCString trClassHierarchy()
- { return "Struktur Kelas"; }
-
- /*! This is put above each page as a link to the list of annotated classes */
- virtual QCString trCompoundList()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Struktur Data";
- }
- else
- {
- return "Daftar Kelas";
- }
- }
-
- /*! This is put above each page as a link to the list of documented files */
- virtual QCString trFileList()
- { return "Daftar File"; }
-
- /*! This is put above each page as a link to the list of all verbatim headers */
- virtual QCString trHeaderFiles()
- { return "File Header"; }
-
- /*! This is put above each page as a link to all members of compounds. */
- virtual QCString trCompoundMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Variabel Data";
- }
- else
- {
- return "Daftar Anggota: Kelas";
- }
- }
-
- /*! This is put above each page as a link to all members of files. */
- virtual QCString trFileMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Daftar Global";
- }
- else
- {
- return "Daftar File";
- }
- }
-
- /*! This is put above each page as a link to all related pages. */
- virtual QCString trRelatedPages()
- { return "Halaman Terkait"; }
-
- /*! This is put above each page as a link to all examples. */
- virtual QCString trExamples()
- { return "Contoh"; }
-
- /*! This is put above each page as a link to the search engine. */
- virtual QCString trSearch()
- { return "Cari"; }
-
- /*! This is an introduction to the class hierarchy. */
- virtual QCString trClassHierarchyDescription()
- { return "Struktur kelas ini diurutkan hampir sepenuhnya diurutkan berdasarkan abjad:";
- }
-
- /*! This is an introduction to the list with all files. */
- virtual QCString trFileListDescription(bool extractAll)
- {
- QCString result="Berikut ini daftar seluruh file dengan penjelasan singkat";
- if (!extractAll) result+=" yang didokumentasikan";
- result += ":";
- return result;
- }
-
- /*! This is an introduction to the annotated compound list. */
- virtual QCString trCompoundListDescription()
- {
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Berikut ini daftar struktur data beserta penjelasan singkat:";
- }
- else
- {
- return "Berikut ini daftar kelas, struktur, gabungan, dan interface beserta penjelasan singkat:";
- }
- }
-
- /*! This is an introduction to the page with all class members. */
- virtual QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result="Berikut ini daftar seluruh ";
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="variabel struktur dan gabungan";
- }
- else
- {
- result+="kelas";
- }
- if (!extractAll)
- {
- result+=" yang didokumentasikan";
- }
- result+=" dengan link ke ";
- if (!extractAll)
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="dokumentasi struktur/gabungan untuk tiap variabel:";
- }
- else
- {
- result+="dokumentasi kelas untuk tiap anggota:";
- }
- }
- else
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="struktur/gabungan induk:";
- }
- else
- {
- result+="kelas induk:";
- }
- }
- return result;
- }
-
- /*! This is an introduction to the page with all file members. */
- virtual QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="Berikut ini daftar ";
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="fungsi, variabel, konstanta, enumerasi, dan tipe";
- }
- else
- {
- result+="file";
- }
- if (!extractAll) result+=" yang didokumentasikan";
- result+=" dengan link ke ";
- if (extractAll)
- result+="file induk:";
- else
- result+="dokumentasi:";
- return result;
- }
-
- /*! This is an introduction to the page with the list of all header files. */
- virtual QCString trHeaderFilesDescription()
- { return "Berikut ini daftar file header yang melingkupi API (Application Programming Interface) ini:"; }
-
- /*! This is an introduction to the page with the list of all examples */
- virtual QCString trExamplesDescription()
- { return "Berikut ini daftar semua contoh:"; }
-
- /*! This is an introduction to the page with the list of related pages */
- virtual QCString trRelatedPagesDescription()
- { return "Berikut ini daftar semua halaman dokumentasi yang terkait:"; }
-
- /*! This is an introduction to the page with the list of class/file groups */
- virtual QCString trModulesDescription()
- { return "Berikut ini daftar semua modul:"; }
-
- /*! This sentences is used in the annotated class/file lists if no brief
- * description is given.
- */
- virtual QCString trNoDescriptionAvailable()
- { return "Tidak ada keterangan tersedia"; }
-
- // index titles (the project name is prepended for these)
-
-
- /*! This is used in HTML as the title of index.html. */
- virtual QCString trDocumentation()
- { return "Dokumentasi"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all groups.
- */
- virtual QCString trModuleIndex()
- { return "Indeks Modul"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * class hierarchy.
- */
- virtual QCString trHierarchicalIndex()
- { return "Indeks Struktur Kelas"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * annotated compound index.
- */
- virtual QCString trCompoundIndex()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Indeks Struktur Data";
- }
- else
- {
- return "Indeks Kelas";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * list of all files.
- */
- virtual QCString trFileIndex()
- { return "Indeks File"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all groups.
- */
- virtual QCString trModuleDocumentation()
- { return "Dokumentasi Modul"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all classes, structs and unions.
- */
- virtual QCString trClassDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Dokumentasi Struktur Data";
- }
- else
- {
- return "Dokumentasi Kelas";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all files.
- */
- virtual QCString trFileDocumentation()
- { return "Dokumentasi File"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all examples.
- */
- virtual QCString trExampleDocumentation()
- { return "Dokumentasi Contoh"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all related pages.
- */
- virtual QCString trPageDocumentation()
- { return "Dokumentasi Halaman"; }
-
- /*! This is used in LaTeX as the title of the document */
- virtual QCString trReferenceManual()
- { return "Dokumentasi Referensi"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of defines
- */
- virtual QCString trDefines()
- { return "Konstanta"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of function prototypes
- */
- virtual QCString trFuncProtos()
- { return "Prototipe Fungsi"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of typedefs
- */
- virtual QCString trTypedefs()
- { return "Definisi Tipe"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of enumerations
- */
- virtual QCString trEnumerations()
- { return "Enumerasi"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) functions
- */
- virtual QCString trFunctions()
- { return "Fungsi"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trVariables()
- { return "Variabel"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trEnumerationValues()
- { return "Nilai enumerasi"; }
-
- /*! This is used in the documentation of a file before the list of
- * documentation blocks for defines
- */
- virtual QCString trDefineDocumentation()
- { return "Dokumentasi Konstanta"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for function prototypes
- */
- virtual QCString trFunctionPrototypeDocumentation()
- { return "Dokumentasi Prototipe Fungsi"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for typedefs
- */
- virtual QCString trTypedefDocumentation()
- { return "Dokumentasi Definisi Tipe"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration types
- */
- virtual QCString trEnumerationTypeDocumentation()
- { return "Dokumentasi Tipe Enumerasi"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration values
- */
- virtual QCString trEnumerationValueDocumentation()
- { return "Dokumentasi Nilai Enumerasi"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for functions
- */
- virtual QCString trFunctionDocumentation()
- { return "Dokumentasi Fungsi"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for variables
- */
- virtual QCString trVariableDocumentation()
- { return "Dokumentasi Variabel"; }
-
- /*! This is used in the documentation of a file/namespace/group before
- * the list of links to documented compounds
- */
- virtual QCString trCompounds()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Struktur Data";
- }
- else
- {
- return "Kelas";
- }
- }
-
- /*! 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)"Dihasilkan pada tanggal "+date;
- if (projName) result+=(QCString)" untuk "+projName;
- result+=(QCString)" oleh";
- return result;
- }
- /*! This is part of the sentence used in the standard footer of each page.
- */
- virtual QCString trWrittenBy()
- {
- return "ditulis oleh";
- }
-
- /*! this text is put before a class diagram */
- virtual QCString trClassDiagram(const char *clName)
- {
- return (QCString)"Diagram struktur kelas untuk "+clName+":";
- }
-
- /*! this text is generated when the \\internal command is used. */
- virtual QCString trForInternalUseOnly()
- { return "Untuk kalangan sendiri."; }
-
- /*! this text is generated when the \\reimp command is used. */
- virtual QCString trReimplementedForInternalReasons()
- { return "Di-reimplementasikan karena alasan internal; API tidak berubah."; }
-
- /*! this text is generated when the \\warning command is used. */
- virtual QCString trWarning()
- { return "Peringatan"; }
-
- /*! this text is generated when the \\bug command is used. */
- virtual QCString trBugsAndLimitations()
- { return "Bug dan keterbatasan"; }
-
- /*! this text is generated when the \\version command is used. */
- virtual QCString trVersion()
- { return "Versi"; }
-
- /*! this text is generated when the \\date command is used. */
- virtual QCString trDate()
- { return "Tanggal"; }
-
- /*! this text is generated when the \\return command is used. */
- virtual QCString trReturns()
- { return "Mengembalikan"; }
-
- /*! this text is generated when the \\sa command is used. */
- virtual QCString trSeeAlso()
- { return "Lihat juga"; }
-
- /*! this text is generated when the \\param command is used. */
- virtual QCString trParameters()
- { return "Parameter"; }
-
- /*! this text is generated when the \\exception command is used. */
- virtual QCString trExceptions()
- { return "Exception"; }
-
- /*! this text is used in the title page of a LaTeX document. */
- virtual QCString trGeneratedBy()
- { return "Dihasilkan oleh"; }
-
- //////////////////////////////////////////////////////////////////////////
- // new since 0.49-990307
- //////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of page containing all the index of all namespaces. */
- virtual QCString trNamespaceList()
- { return "Daftar Namespace"; }
-
- /*! used as an introduction to the namespace list */
- virtual QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="Berikut ini daftar namespace beserta keterangan singkat";
- if (!extractAll) result+=" yang didokumentasikan";
- result+=":";
- return result;
- }
-
- /*! used in the class documentation as a header before the list of all
- * friends of a class
- */
- virtual QCString trFriends()
- { return "Friend"; }
-
- //////////////////////////////////////////////////////////////////////////
- // new since 0.49-990405
- //////////////////////////////////////////////////////////////////////////
-
- /*! used in the class documentation as a header before the list of all
- * related classes
- */
- virtual QCString trRelatedFunctionDocumentation()
- { return "Dokumentasi Friend Dan Fungsi Terkait"; }
-
- //////////////////////////////////////////////////////////////////////////
- // new since 0.49-990425
- //////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of the HTML page of a class/struct/union */
- virtual QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- {
- QCString result=(QCString)clName;
- switch(compType)
- {
- case ClassDef::Class: result+=" Kelas"; break;
- case ClassDef::Struct: result+=" Struktur"; break;
- case ClassDef::Union: result+=" Gabungan"; break;
- case ClassDef::Interface: result+=" Interface"; break;
- case ClassDef::Protocol: result+=" Protokol"; break;
- case ClassDef::Category: result+=" Kategori"; break;
- case ClassDef::Exception: result+=" Exception"; break;
- }
- if (isTemplate) result+=" Template";
- result+=" Referensi";
- return result;
- }
-
- /*! used as the title of the HTML page of a file */
- virtual QCString trFileReference(const char *fileName)
- {
- QCString result=fileName;
- result+=" Referensi File";
- return result;
- }
-
- /*! used as the title of the HTML page of a namespace */
- virtual QCString trNamespaceReference(const char *namespaceName)
- {
- QCString result=namespaceName;
- result+=" Referensi Namespace";
- return result;
- }
-
- virtual QCString trPublicMembers()
- { return "Fungsi Anggota Publik"; }
- virtual QCString trPublicSlots()
- { return "Slot Publik"; }
- virtual QCString trSignals()
- { return "Signal"; }
- virtual QCString trStaticPublicMembers()
- { return "Fungsi Anggota Publik Statis"; }
- virtual QCString trProtectedMembers()
- { return "Fungsi Anggota Diproteksi"; }
- virtual QCString trProtectedSlots()
- { return "Slot Diproteksi"; }
- virtual QCString trStaticProtectedMembers()
- { return "Fungsi Anggota Diproteksi Statis"; }
- virtual QCString trPrivateMembers()
- { return "Fungsi Anggota Privat"; }
- virtual QCString trPrivateSlots()
- { return "Slot Privat"; }
- virtual QCString trStaticPrivateMembers()
- { return "Fungsi Anggota Privat Statis"; }
-
- /*! this function is used to produce a comma-separated list of items.
- * use generateMarker(i) to indicate where item i should be put.
- */
- virtual QCString trWriteList(int numEntries)
- {
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=", dan ";
- }
- }
- return result;
- }
-
- /*! used in class documentation to produce a list of base classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritsList(int numEntries)
- {
- return "Mewarisi "+trWriteList(numEntries)+".";
- }
-
- /*! used in class documentation to produce a list of super classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritedByList(int numEntries)
- {
- return "Diwariskan ke "+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 "Di-reimplementasikan dari "+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 "Di-reimplementasikan di "+trWriteList(numEntries)+".";
- }
-
- /*! This is put above each page as a link to all members of namespaces. */
- virtual QCString trNamespaceMembers()
- { return "Anggota Namespace"; }
-
- /*! This is an introduction to the page with all namespace members */
- virtual QCString trNamespaceMemberDescription(bool extractAll)
- {
- QCString result="Berikut ini daftar anggota namespace ";
- if (!extractAll) result+="yang didokumentasikan ";
- result+="dengan link ke ";
- if (extractAll)
- result+="dokumentasi namespace untuk tiap anggota:";
- else
- result+="namespace induk:";
- return result;
- }
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all namespaces.
- */
- virtual QCString trNamespaceIndex()
- { return "Indeks Namespace"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all namespaces.
- */
- virtual QCString trNamespaceDocumentation()
- { return "Dokumentasi Namespace"; }
-
- //////////////////////////////////////////////////////////////////////////
- // new since 0.49-990522
- //////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- virtual QCString trNamespaces()
- { return "Daftar Namespace"; }
-
- //////////////////////////////////////////////////////////////////////////
- // new since 0.49-990728
- //////////////////////////////////////////////////////////////////////////
-
- /*! This is put at the bottom of a class documentation page and is
- * followed by a list of files that were used to generate the page.
- */
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)"Dokumentasi untuk ";
- switch(compType)
- {
- case ClassDef::Class: result+="kelas"; break;
- case ClassDef::Struct: result+="struktur"; break;
- case ClassDef::Union: result+="gabungan"; break;
- case ClassDef::Interface: result+="interface"; break;
- case ClassDef::Protocol: result+="protokol"; break;
- case ClassDef::Category: result+="kategori"; break;
- case ClassDef::Exception: result+="exception"; break;
- }
- result+=" ini dihasilkan dari file";
- result+=single ? "" : "-file";
- result+=" berikut:";
- return result;
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- virtual QCString trAlphabeticalList()
- { return "Daftar Berdasarkan Abjad"; }
-
- //////////////////////////////////////////////////////////////////////////
- // new since 0.49-990901
- //////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- virtual QCString trReturnValues()
- { return "Nilai kembali"; }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- virtual QCString trMainPage()
- { return "Halaman Utama"; }
-
- /*! 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 "hal."; }
-
- //////////////////////////////////////////////////////////////////////////
- // new since 0.49-991003
- //////////////////////////////////////////////////////////////////////////
-
- virtual QCString trSources()
- {
- return "Sumber";
- }
- virtual QCString trDefinedAtLineInSourceFile()
- {
- return "Definisi pada baris @0 di file @1.";
- }
- virtual QCString trDefinedInSourceFile()
- {
- return "Definisi pada baris @0.";
- }
-
- //////////////////////////////////////////////////////////////////////////
- // new since 0.49-991205
- //////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDeprecated()
- {
- return "Kadaluarsa";
- }
-
- //////////////////////////////////////////////////////////////////////////
- // new since 1.0.0
- //////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- virtual QCString trCollaborationDiagram(const char *clName)
- {
- return (QCString)"Diagram kolaborasi untuk "+clName+":";
- }
- /*! this text is put before an include dependency graph */
- virtual QCString trInclDepGraph(const char *fName)
- {
- return (QCString)"Diagram ketergantungan untuk "+fName+":";
- }
- /*! header that is put before the list of constructor/destructors. */
- virtual QCString trConstructorDocumentation()
- {
- return "Dokumentasi Konstruktor & Destruktor";
- }
- /*! Used in the file documentation to point to the corresponding sources. */
- virtual QCString trGotoSourceCode()
- {
- return "Ke kode sumber file ini.";
- }
- /*! Used in the file sources to point to the corresponding documentation. */
- virtual QCString trGotoDocumentation()
- {
- return "Ke dokumentasi file ini.";
- }
- /*! Text for the \\pre command */
- virtual QCString trPrecondition()
- {
- return "Kondisi Awal";
- }
- /*! Text for the \\post command */
- virtual QCString trPostcondition()
- {
- return "Kondisi Akhir";
- }
- /*! Text for the \\invariant command */
- virtual QCString trInvariant()
- {
- return "Invariant";
- }
- /*! Text shown before a multi-line variable/enum initialization */
- virtual QCString trInitialValue()
- {
- return "Nilai awal:";
- }
- /*! Text used the source code in the file index */
- virtual QCString trCode()
- {
- return "kode";
- }
- virtual QCString trGraphicalHierarchy()
- {
- return "Struktur Kelas Berbasis Grafis";
- }
- virtual QCString trGotoGraphicalHierarchy()
- {
- return "Ke struktur kelas berbasis grafis";
- }
- virtual QCString trGotoTextualHierarchy()
- {
- return "Ke struktur kelas berbasis teks";
- }
- virtual QCString trPageIndex()
- {
- return "Indeks Halaman";
- }
-
- //////////////////////////////////////////////////////////////////////////
- // new since 1.1.0
- //////////////////////////////////////////////////////////////////////////
-
- virtual QCString trNote()
- {
- return "Catatan";
- }
- virtual QCString trPublicTypes()
- {
- return "Tipe Publik";
- }
- virtual QCString trPublicAttribs()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Variabel Data";
- }
- else
- {
- return "Atribut Publik";
- }
- }
- virtual QCString trStaticPublicAttribs()
- {
- return "Atribut Publik Statis";
- }
- virtual QCString trProtectedTypes()
- {
- return "Tipe Diproteksi";
- }
- virtual QCString trProtectedAttribs()
- {
- return "Atribut Diproteksi";
- }
- virtual QCString trStaticProtectedAttribs()
- {
- return "Atribut Diproteksi Statis";
- }
- virtual QCString trPrivateTypes()
- {
- return "Tipe Privat";
- }
- virtual QCString trPrivateAttribs()
- {
- return "Atribut Privat";
- }
- virtual QCString trStaticPrivateAttribs()
- {
- return "Atribut Privat Statis";
- }
-
- //////////////////////////////////////////////////////////////////////////
- // new since 1.1.3
- //////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\todo item */
- virtual QCString trTodo()
- {
- return "Tugas";
- }
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- {
- return "Daftar Tugas";
- }
-
- //////////////////////////////////////////////////////////////////////////
- // new since 1.1.4
- //////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy()
- {
- return "Direferensikan oleh";
- }
- virtual QCString trRemarks()
- {
- return "Keterangan";
- }
- virtual QCString trAttention()
- {
- return "Perhatian";
- }
- virtual QCString trInclByDepGraph()
- {
- return "Diagram ini menampilkan file-file yang membutuhkan file ini baik secara langsung maupun tidak langsung:";
- }
- virtual QCString trSince()
- {
- return "Sejak";
- }
-
- //////////////////////////////////////////////////////////////////////////
- // new since 1.1.5
- //////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- virtual QCString trLegendTitle()
- {
- return "Legenda Diagram";
- }
- /*! 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
- "Halaman ini berisi keterangan cara membaca diagram yang dihasilkan "
- "oleh doxygen.<p>\n"
- "Contoh:\n"
- "\\code\n"
- "/*! Invisible class because of truncation */\n"
- "class Invisible { };\n\n"
- "/*! Truncated class, inheritance relation is hidden */\n"
- "class Truncated : public Invisible { };\n\n"
- "/* Class not documented with doxygen comments */\n"
- "class Undocumented { };\n\n"
- "/*! Class that is inherited using public inheritance */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! A template class */\n"
- "template<class T> class Templ { };\n\n"
- "/*! Class that is inherited using protected inheritance */\n"
- "class ProtectedBase { };\n\n"
- "/*! Class that is inherited using private inheritance */\n"
- "class PrivateBase { };\n\n"
- "/*! Class that is used by the Inherited class */\n"
- "class Used { };\n\n"
- "/*! Super class that inherits a number of other 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"
- "Apabila tag \\c MAX_DOT_GRAPH_HEIGHT di file konfigurasi "
- "diset ke 240 kode di atas akan menghasilkan diagram berikut:"
- "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
- "Kotak-kotak pada diagram di atas mempunyai arti sebagai berikut:\n"
- "<ul>\n"
- "<li>%Kotak hitam merupakan struktur atau kelas yang bersangkutan.\n"
- "<li>%Kotak berbingkai hitam adalah struktur atau kelas yang mempunyai dokumentasi.\n"
- "<li>%Kotak dengan bingkai abu-abu adalah struktur atau kelas tanpa dokumentasi.\n"
- "<li>%Kotak dengan bingkai merah merupakan struktur atau kelas yang didokumentasikan tetapi"
- "tidak semua relasinya ditampilkan. %Sebuah diagram "
- "akan terpotong apabila lebih besar daripada ukuran yang ditentukan.\n"
- "</ul>\n"
- "Arti dari tanda-tanda panah adalah sebagai berikut:\n"
- "<ul>\n"
- "<li>%Panah biru tua menandakan pewarisan publik.\n"
- "<li>%Panah hijau tua untuk pewarisan diproteksi.\n"
- "<li>%Panah merah tua untuk pewarisan privat.\n"
- "<li>%Panah ungu putus-putus menandakan kelas tersebut berhubungan dengan kelas lain. "
- "Panah tersebut diberi judul sesuai dengan kelas atau struktur tujuan.\n"
- "<li>%Panah kuning putus-putus menandakan hubungan antara sebuah template kelas dan "
- "instance dari template tersebut. Panah tersebut diberi judul sesuai dengan "
- "parameter template yang digunakan.\n"
- "</ul>\n";
- }
- /*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return "legenda";
- }
-
- //////////////////////////////////////////////////////////////////////////
- // new since 1.2.0
- //////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return "Tes";
- }
- /*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return "Daftar Tes";
- }
-
- //////////////////////////////////////////////////////////////////////////
- // new since 1.2.1
- //////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return "Fungsi Anggota: DCOP";
- }
-
- //////////////////////////////////////////////////////////////////////////
- // new since 1.2.2
- //////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return "Daftar Property";
- }
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return "Dokumentasi Property";
- }
-
- //////////////////////////////////////////////////////////////////////////
- // new since 1.2.4
- //////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java interfaces in the summary section of Java packages */
- virtual QCString trInterfaces()
- {
- return "Daftar Interface";
- }
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Struktur Data";
- }
- else
- {
- return "Daftar Kelas";
- }
- }
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
- {
- return (QCString)"Paket "+name;
- }
- /*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return "Daftar Paket";
- }
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return "Berikut ini daftar paket beserta keterangan singkat (apabila tersedia):";
- }
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return "Daftar Paket";
- }
- /*! Used as a chapter title for Latex & RTF output */
- virtual QCString trPackageDocumentation()
- {
- return "Dokumentasi Paket";
- }
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return "Nilai:";
- }
-
- //////////////////////////////////////////////////////////////////////////
- // new since 1.2.5
- //////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return "Bug";
- }
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return "Daftar Bug";
- }
-
- //////////////////////////////////////////////////////////////////////////
- // new since 1.2.6
- //////////////////////////////////////////////////////////////////////////
-
- /*! Used as ansicpg for RTF file
- *
- * The following table shows the correlation of Charset name, Charset Value and
- * <pre>
- * Codepage number:
- * Charset Name Charset Value(hex) Codepage number
- * ------------------------------------------------------
- * DEFAULT_CHARSET 1 (x01)
- * SYMBOL_CHARSET 2 (x02)
- * OEM_CHARSET 255 (xFF)
- * ANSI_CHARSET 0 (x00) 1252
- * RUSSIAN_CHARSET 204 (xCC) 1251
- * EE_CHARSET 238 (xEE) 1250
- * GREEK_CHARSET 161 (xA1) 1253
- * TURKISH_CHARSET 162 (xA2) 1254
- * BALTIC_CHARSET 186 (xBA) 1257
- * HEBREW_CHARSET 177 (xB1) 1255
- * ARABIC _CHARSET 178 (xB2) 1256
- * SHIFTJIS_CHARSET 128 (x80) 932
- * HANGEUL_CHARSET 129 (x81) 949
- * GB2313_CHARSET 134 (x86) 936
- * CHINESEBIG5_CHARSET 136 (x88) 950
- * </pre>
- *
- */
- virtual QCString trRTFansicp()
- {
- return "1252";
- }
-
-
- /*! Used as ansicpg for RTF fcharset
- * \see trRTFansicp() for a table of possible values.
- */
- virtual QCString trRTFCharSet()
- {
- return "0";
- }
-
- /*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return "Indeks";
- }
-
- /*! 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 ? "Kelas" : "kelas"));
- if (!singular) result+="-kelas";
- 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 ? "File" : "file"));
- if (!singular) result+="-file";
- 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)
- {
- QCString result((first_capital ? "Namespace" : "namespace"));
- //if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trGroup(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Kelompok" : "kelompok"));
- if (!singular) result+="-kelompok";
- 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 )
- {
- QCString result((first_capital ? "Halaman" : "halaman"));
- //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 )
- {
- QCString result((first_capital ? "Anggota" : "anggota"));
- //if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trField(bool first_capital, bool)
- {
- QCString result((first_capital ? "Variabel" : "variabel"));
- //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)
- {
- QCString result((first_capital ? "Global" : "global"));
- //if (!singular) result+="s";
- return result;
- }
-
- //////////////////////////////////////////////////////////////////////////
- // new since 1.2.7
- //////////////////////////////////////////////////////////////////////////
-
- /*! This text is generated when the \\author command is used and
- * for the author section in man pages. */
- virtual QCString trAuthor(bool first_capital, bool)
- {
- QCString result((first_capital ? "Penulis" : "penulis"));
- //if (!singular) result+="s";
- return result;
- }
-
- //////////////////////////////////////////////////////////////////////////
- // new since 1.2.11
- //////////////////////////////////////////////////////////////////////////
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return "Referensi";
- }
-
- //////////////////////////////////////////////////////////////////////////
- // 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 "Mengimplementasikan "+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 "Diimplementasikan di "+trWriteList(numEntries)+".";
- }
-
- //////////////////////////////////////////////////////////////////////////
- // new since 1.2.16
- //////////////////////////////////////////////////////////////////////////
-
- /*! used in RTF documentation as a heading for the Table
- * of Contents.
- */
- virtual QCString trRTFTableOfContents()
- {
- return "Daftar Isi";
- }
-
- //////////////////////////////////////////////////////////////////////////
- // new since 1.2.17
- //////////////////////////////////////////////////////////////////////////
-
- /*! Used as the header of the list of item that have been
- * flagged deprecated
- */
- virtual QCString trDeprecatedList()
- {
- return "Daftar Kadaluarsa";
- }
-
- //////////////////////////////////////////////////////////////////////////
- // new since 1.2.18
- //////////////////////////////////////////////////////////////////////////
-
- /*! Used as a header for declaration section of the events found in
- * a C# program
- */
- virtual QCString trEvents()
- {
- return "Event";
- }
- /*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- return "Dokumentasi Event";
- }
-
- //////////////////////////////////////////////////////////////////////////
- // new since 1.3
- //////////////////////////////////////////////////////////////////////////
-
- /*! Used as a heading for a list of Java class types with package scope.
- */
- virtual QCString trPackageTypes()
- {
- return "Jenis Paket";
- }
- /*! Used as a heading for a list of Java class functions with package
- * scope.
- */
- virtual QCString trPackageMembers()
- {
- return "Daftar Fungsi Paket";
- }
- /*! Used as a heading for a list of static Java class functions with
- * package scope.
- */
- virtual QCString trStaticPackageMembers()
- {
- return "Daftar Fungsi Statis Paket";
- }
- /*! Used as a heading for a list of Java class variables with package
- * scope.
- */
- virtual QCString trPackageAttribs()
- {
- return "Daftar Atribut Paket";
- }
- /*! Used as a heading for a list of static Java class variables with
- * package scope.
- */
- virtual QCString trStaticPackageAttribs()
- {
- return "Daftar Atribut Statis Paket";
- }
-
- //////////////////////////////////////////////////////////////////////////
- // 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 "Semua";
- }
- /*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- return "Berikut ini diagram pemanggilan untuk fungsi ini:";
- }
-
- //////////////////////////////////////////////////////////////////////////
- // new since 1.3.3
- //////////////////////////////////////////////////////////////////////////
-
- /*! When the search engine is enabled this text is put in the header
- * of each page before the field where one can enter the text to search
- * for.
- */
- virtual QCString trSearchForIndex()
- {
- return "Cari";
- }
- /*! This string is used as the title for the page listing the search
- * results.
- */
- virtual QCString trSearchResultsTitle()
- {
- return "Hasil Pencarian";
- }
- /*! 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
- * the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
- * value 2 represents 2 or more matches. HTML markup is allowed inside
- * the returned string.
- */
- virtual QCString trSearchResults(int numDocuments)
- {
- if (numDocuments==0)
- {
- return "Maaf, tidak ada dokumen yang cocok.";
- }
- else if (numDocuments==1)
- {
- return "Ditemukan <b>1</b> dokumen yang cocok.";
- }
- else
- {
- return "Ditemukan <b>$num</b> documents yang cocok. "
- "Menampilkan hasil terbaik lebih awal.";
- }
- }
- /*! 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 "Kecocokan:";
- }
-
- //////////////////////////////////////////////////////////////////////////
- // 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 "Kode Sumber:" + filename;
- }
-
- //////////////////////////////////////////////////////////////////////////
- // new since 1.3.9
- //////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the name of the chapter containing the directory
- * hierarchy.
- */
- virtual QCString trDirIndex()
- { return "Struktur Direktori"; }
-
- /*! This is used as the name of the chapter containing the documentation
- * of the directories.
- */
- virtual QCString trDirDocumentation()
- { return "Dokumentasi Direktori"; }
-
- /*! 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 "Daftar Direktori"; }
-
- /*! This returns a sentences that introduces the directory hierarchy.
- * and the fact that it is sorted alphabetically per level
- */
- virtual QCString trDirDescription()
- { return "Struktur direktori ini diurutkan hampir berdasarkan abjad:";
- }
-
- /*! 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="Referensi Direktori "; result+=dirName; return result; }
-
- /*! This returns the word directory with or without starting capital
- * (\a first_capital) and in sigular or plural form (\a singular).
- */
- virtual QCString trDir(bool first_capital, bool)
- {
- QCString result((first_capital ? "Direktori" : "direktori"));
- //if (singular) result+="y"; else result+="ies";
- 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 "Ini adalah fungsi yang di-overload. Perbedaannya dengan fungsi di atas hanya pada "
- "parameter-parameter yang diterima.";
- }
-};
-
-#endif
diff --git a/src/translator_it.h b/src/translator_it.h
deleted file mode 100644
index 73f8e95..0000000
--- a/src/translator_it.h
+++ /dev/null
@@ -1,1529 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-
-/******************************************************************************
- *
- * Revision history
- *
- * 2005/03: translated new items used since version 1.4.1
- * removed unused methods listed in Petr Prikryl February 28 translator report
- * 2004/09: translated new items used since version 1.3.9
- * 2004/06: translated new items used since version 1.3.8
- * 2003/11: translated new items used since version 1.3.3
- * 2003/06: translated new items used since version 1.3.1
- * 2003/04: translated new items used since version 1.3
- * 2002/11: translated new items used since version 1.2.18
- * 2002/08: translated new items used since version 1.2.17
- * 2002/07: translated new items used since version 1.2.16
- * 2002/06: modified trRelatedPagesDescription() method
- * corrected typo in trInclByDepGraph() method
- * 2002/01: translated new items used since version 1.2.13
- * updated e-mail address
- * 2001/11: corrected the translation fixing the issues reported by the translator.pl script
- * translated new items used since version 1.2.11
- * 2001/08: corrected the translation fixing the issues reported by the translator.pl script
- * translated new items used since version 1.2.7
- * 2001/05: adopted new translation mechanism (trough adapters),
- * translated new items used since version 1.2.5 and 1.2.6,
- * revised those function returning strings in OPTIMIZE_OTPUT_FOR_C case,
- * corrections regarding the plurals of some english terms mantained in the translation,
- * changed some terms to better suit the sense
- * 2001/02: translated new items used since version 1.2.4
- * 2000/11: modified slightly the translation in trLegendDocs() function,
- * translated new items used since version 1.2.1 and 1.2.2
- * 2000/08: translated new items used since version 1.1.3, 1.1.4, 1.1.5 and 1.2.0
- * 2000/03: translated new items used since version 1.0 and 1.1.0
- * 1999/19: entirely rewritten the translation to correct small variations due
- * to feature additions and to conform to the layout of the latest
- * commented translator.h for the english language
- * 1999/09: corrected some small typos in the "new since 0.49-990425" section
- * added the "new since 0.49-990728" section
- * 1999/06: revised and completed by Alessandro Falappa (actual mantainer)
- * 1999/??: initial italian translation by Ahmed Aldo Faisal
- */
-
-/******************************************************************************
- *
- * Note sui criteri adottati per la traduzione
- *
- * Nella traduzione non si sono tradotti alcuni termini inglesi ormai entrati
- * a far parte del "gergo" informatico (per es. file o namespace)
- *
- * Il plurale dei termini inglesi non tradotti è stato reso con il singolare
- * della parola inglese secondo una convenzione spesso ritrovata nella documentazione
- * tecnica (ad es. "lista dei file" e non "lista dei files")
- *
- * Se avete suggerimenti sulla traduzione di alcuni termini o volete segnalare
- * eventuali sviste potete scrivermi all'indirizzo: alessandro@falappa.net
- */
-
-#ifndef TRANSLATOR_IT_H
-#define TRANSLATOR_IT_H
-
-class TranslatorItalian : public Translator
-{
- public:
-
- // --- Language control methods -------------------
-
- /*! Used for identification of the language. The identification
- * should not be translated. It should be replaced by the name
- * of the language in English using lower-case characters only
- * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
- * the identification used in language.cpp.
- */
- virtual QCString idLanguage()
- { return "italian"; }
-
- /*! Used to get the LaTeX command(s) for the language support. This method
- * was designed for languages which do wish to use a babel package.
- */
- virtual QCString latexLanguageSupportCommand()
- {
- return "\\usepackage[italian]{babel}\n";
- }
-
- /*! return the language charset. This will be used for the HTML output */
- virtual QCString idLanguageCharset()
- {
- return "iso-8859-1";
- }
-
- // --- Language translation methods -------------------
-
- /*! used in the compound documentation before a list of related functions. */
- QCString trRelatedFunctions()
- { return "Funzioni collegate"; }
-
- /*! subscript for the related functions. */
- QCString trRelatedSubscript()
- { return "(Si noti che queste non sono funzioni membro.)"; }
-
- /*! header that is put before the detailed description of files, classes and namespaces. */
- QCString trDetailedDescription()
- { return "Descrizione Dettagliata"; }
-
- /*! header that is put before the list of typedefs. */
- QCString trMemberTypedefDocumentation()
- { return "Documentazione delle ridefinizioni dei tipi (typedef)"; }
-
- /*! header that is put before the list of enumerations. */
- QCString trMemberEnumerationDocumentation()
- { return "Documentazione dei tipi enumerati (enum)"; }
-
- /*! header that is put before the list of member functions. */
- QCString trMemberFunctionDocumentation()
- { return "Documentazione delle funzioni membro"; }
-
- /*! header that is put before the list of member attributes. */
- QCString trMemberDataDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Documentazione dei campi";
- }
- else
- {
- return "Documentazione dei dati membri";
- }
- }
-
- /*! this is the text of a link put after brief descriptions. */
- QCString trMore()
- { return "Continua..."; }
-
- /*! put in the class documentation */
- QCString trListOfAllMembers()
- { return "Lista di tutti i membri."; }
-
- /*! used as the title of the "list of all members" page of a class */
- QCString trMemberList()
- { return "Lista dei membri"; }
-
- /*! this is the first part of a sentence that is followed by a class name */
- QCString trThisIsTheListOfAllMembers()
- { return "Questa è la lista completa di tutti i membri di "; }
-
- /*! this is the remainder of the sentence after the class name */
- QCString trIncludingInheritedMembers()
- { return ", inclusi tutti i membri ereditati."; }
-
- /*! this is put at the author sections at the bottom of man pages.
- * parameter s is name of the project name.
- */
- QCString trGeneratedAutomatically(const char *s)
- {
- QCString result="Generato automaticamente da Doxygen";
- if (s) result+=(QCString)" per "+s;
- result+=" a partire dal codice sorgente.";
- return result;
- }
-
- /*! put after an enum name in the list of all members */
- QCString trEnumName()
- { return "nome di tipo enumerato"; }
-
- /*! put after an enum value in the list of all members */
- QCString trEnumValue()
- { return "valore di tipo enumerato"; }
-
- /*! put after an undocumented member in the list of all members */
- QCString trDefinedIn()
- { return "definito in"; }
-
- // quick reference sections
-
- /*! This is put above each page as a link to the list of all groups of
- * compounds or files (see the \\group command).
- */
- QCString trModules()
- { return "Moduli"; }
-
- /*! This is put above each page as a link to the class hierarchy */
- QCString trClassHierarchy()
- { return "Gerarchia delle classi"; }
-
- /*! This is put above each page as a link to the list of annotated classes */
- QCString trCompoundList()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Strutture dati";
- }
- else
- {
- return "Lista dei composti";
- }
- }
-
- /*! This is put above each page as a link to the list of documented files */
- QCString trFileList()
- { return "Lista dei file"; }
-
- /*! This is put above each page as a link to all members of compounds. */
- QCString trCompoundMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Campi dei dati";
- }
- else
- {
- return "Membri dei composti";
- }
- }
-
- /*! This is put above each page as a link to all members of files. */
- QCString trFileMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Elementi globali";
- }
- else
- {
- return "Membri dei file";
- }
- }
-
- /*! This is put above each page as a link to all related pages. */
- QCString trRelatedPages()
- { return "Pagine collegate"; }
-
- /*! This is put above each page as a link to all examples. */
- QCString trExamples()
- { return "Esempi"; }
-
- /*! This is put above each page as a link to the search engine. */
- QCString trSearch()
- { return "Cerca"; }
-
- /*! This is an introduction to the class hierarchy. */
- QCString trClassHierarchyDescription()
- {
- return "Questa lista di ereditarietà è ordinata "
- "approssimativamente, ma non completamente, in ordine alfabetico:";
- }
-
- /*! This is an introduction to the list with all files. */
- QCString trFileListDescription(bool extractAll)
- {
- QCString result="Questa è una lista ";
- if (!extractAll) result+="dei file documentati ";
- else result+="di tutti i file ";
- result+="con una loro breve descrizione:";
- return result;
- }
-
- /*! This is an introduction to the annotated compound list. */
- QCString trCompoundListDescription()
- {
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Queste sono le strutture dati con una loro breve descrizione:";
- }
- else
- {
- return "Queste sono le classi, structs, unions e interfacce con una loro breve descrizione:";
- }
- }
-
- /*! This is an introduction to the page with all class members. */
- QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result="Questa è una lista ";
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- if (!extractAll) result+="delle struct e delle union documentate ";
- else result+="di tutte le struct e le union ";
- }
- else
- {
- if (!extractAll) result+="dei membri documentati ";
- else result+="di tutti i membri ";
- }
- result+="con collegamenti alla documentazione ";
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- if (extractAll) result+="della struct/union per ciascun campo:";
- else result+="delle struct/union a cui appartengono:";
- }
- else
- {
- if (extractAll) result+="della classe di ciascun membro:";
- else result+="delle classi a cui appartengono:";
- }
- return result;
- }
-
- /*! This is an introduction to the page with all file members. */
- QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="Questa è una lista ";
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- if (!extractAll) result+="delle funczioni, variabili, define, tipi enumerati, e typedefs documentati ";
- else result+="di tutte le funczioni, variabili, define, tipi enumerati, e typedefs ";
- }
- else
- {
- if (!extractAll) result+="dei membri dei file documentati ";
- else result+="di tutti i membri dei file ";
- }
- result+="con collegamenti alla documentazione";
- if (extractAll) result+=" del file a cui appartengono:";
- else result+=":";
- return result;
- }
-
- /*! This is an introduction to the page with the list of all examples */
- QCString trExamplesDescription()
- { return "Questa è la lista di tutti gli esempi:"; }
-
- /*! This is an introduction to the page with the list of related pages */
- QCString trRelatedPagesDescription()
- { return "Questa è la lista di tutte le pagine di documentazione generale:"; }
-
- /*! This is an introduction to the page with the list of class/file groups */
- QCString trModulesDescription()
- { return "Questa è la lista di tutti i moduli:"; }
-
- // index titles (the project name is prepended for these)
-
- /*! This is used in HTML as the title of index.html. */
- QCString trDocumentation()
- { return "Documentazione"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all groups.
- */
- QCString trModuleIndex()
- { return "Indice dei moduli"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * class hierarchy.
- */
- QCString trHierarchicalIndex()
- { return "Indice della gerarchia"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * annotated compound index.
- */
- QCString trCompoundIndex()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Indice delle strutture dati";
- }
- else
- {
- return "Indice dei composti";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * list of all files.
- */
- QCString trFileIndex()
- { return "Indice dei file"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all groups.
- */
- QCString trModuleDocumentation()
- { return "Documentazione dei moduli"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all classes, structs and unions.
- */
- QCString trClassDocumentation()
- { return "Documentazione delle classi"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all files.
- */
- QCString trFileDocumentation()
- { return "Documentazione dei file"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all examples.
- */
- QCString trExampleDocumentation()
- { return "Documentazione degli esempi"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all related pages.
- */
- QCString trPageDocumentation()
- { return "Documentazione delle pagine collegate fra loro"; }
-
- /*! This is used in LaTeX as the title of the document */
- QCString trReferenceManual()
- { return "Manuale di riferimento"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of defines
- */
- QCString trDefines()
- { return "Definizioni"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of function prototypes
- */
- QCString trFuncProtos()
- { return "Prototipi delle funzioni"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of typedefs
- */
- QCString trTypedefs()
- { return "Ridefinizioni di tipo (typedefs)"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of enumerations
- */
- QCString trEnumerations()
- { return "Tipi enumerati (enum)"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) functions
- */
- QCString trFunctions()
- { return "Funzioni"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- QCString trVariables()
- { return "Variabili"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- QCString trEnumerationValues()
- { return "Valori dei tipi enumerati"; }
-
- /*! This is used in the documentation of a file before the list of
- * documentation blocks for defines
- */
- QCString trDefineDocumentation()
- { return "Documentazione delle definizioni"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for function prototypes
- */
- QCString trFunctionPrototypeDocumentation()
- { return "Documentazione dei prototipi delle funzioni"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for typedefs
- */
- QCString trTypedefDocumentation()
- { return "Documentazione delle ridefinizioni di tipo (typedefs)"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration types
- */
- QCString trEnumerationTypeDocumentation()
- { return "Documentazione dei tipi enumerati"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for functions
- */
- QCString trFunctionDocumentation()
- { return "Documentazione delle funzioni"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for variables
- */
- QCString trVariableDocumentation()
- { return "Documentazione delle variabili"; }
-
- /*! This is used in the documentation of a file/namespace/group before
- * the list of links to documented compounds
- */
- QCString trCompounds()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Strutture dati";
- }
- else
- {
- return "Composti";
- }
- }
-
- /*! This is used in the standard footer of each page and indicates when
- * the page was generated
- */
- QCString trGeneratedAt(const char *date,const char *projName)
- {
- QCString result=(QCString)"Generato il "+date;
- if (projName) result+=(QCString)" per "+projName;
- result+=(QCString)" da";
- return result;
- }
- /*! This is part of the sentence used in the standard footer of each page.
- */
- QCString trWrittenBy()
- {
- return "scritto da";
- }
-
- /*! this text is put before a class diagram */
- QCString trClassDiagram(const char *clName)
- {
- return (QCString)"Diagramma delle classi per "+clName;
- }
-
- /*! this text is generated when the \\internal command is used. */
- QCString trForInternalUseOnly()
- { return "Solo per uso interno."; }
-
- /*! this text is generated when the \\warning command is used. */
- QCString trWarning()
- { return "Avvertimento"; }
-
- /*! this text is generated when the \\version command is used. */
- QCString trVersion()
- { return "Versione"; }
-
- /*! this text is generated when the \\date command is used. */
- QCString trDate()
- { return "Data"; }
-
- /*! this text is generated when the \\return command is used. */
- QCString trReturns()
- { return "Restituisce"; }
-
- /*! this text is generated when the \\sa command is used. */
- QCString trSeeAlso()
- { return "Vedi anche"; }
-
- /*! this text is generated when the \\param command is used. */
- QCString trParameters()
- { return "Parametri"; }
-
- /*! this text is generated when the \\exception command is used. */
- QCString trExceptions()
- { return "Eccezioni"; }
-
- /*! this text is used in the title page of a LaTeX document. */
- QCString trGeneratedBy()
- { return "Generato da"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of page containing all the index of all namespaces. */
- QCString trNamespaceList()
- { return "Lista dei namespace"; }
-
- /*! used as an introduction to the namespace list */
- QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="Questa è la lista ";
- if (!extractAll) result+="dei namespace documentati, ";
- else result+="di tutti i namespace ";
- result+="con una loro breve descrizione:";
- return result;
- }
-
- /*! used in the class documentation as a header before the list of all
- * friends of a class
- */
- QCString trFriends()
- { return "Friend"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in the class documentation as a header before the list of all
- * related classes
- */
- QCString trRelatedFunctionDocumentation()
- { return "Documentazione dei friend e delle funzioni collegate"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of the HTML page of a class/struct/union */
- QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- {
- QCString result="Riferimenti per ";
- if (isTemplate) result="Template per ";
- switch(compType)
- {
- case ClassDef::Class: result+="la classe "; break;
- case ClassDef::Struct: result+="la struct "; break;
- case ClassDef::Union: result+="la union "; break;
- case ClassDef::Interface: result+="l'interfaccia "; break;
- case ClassDef::Protocol: result+="protocol "; break; // translate me!
- case ClassDef::Category: result+="category "; break; // translate me!
- case ClassDef::Exception: result+="exception "; break;
- }
- result+=(QCString)clName;
- return result;
-
- }
-
- /*! used as the title of the HTML page of a file */
- QCString trFileReference(const char *fileName)
- {
- QCString result="Riferimenti per il file ";
- result+=(QCString)fileName;
- return result;
- }
-
- /*! used as the title of the HTML page of a namespace */
- QCString trNamespaceReference(const char *namespaceName)
- {
- QCString result="Riferimenti per il namespace ";
- result+=(QCString)namespaceName;
- return result;
- }
-
- /* these are for the member sections of a class, struct or union */
- QCString trPublicMembers()
- { return "Membri pubblici"; }
- QCString trPublicSlots()
- { return "Slot pubblici"; }
- QCString trSignals()
- { return "Signal"; }
- QCString trStaticPublicMembers()
- { return "Membri pubblici statici"; }
- QCString trProtectedMembers()
- { return "Membri protetti"; }
- QCString trProtectedSlots()
- { return "Slot protetti"; }
- QCString trStaticProtectedMembers()
- { return "Membri protetti statici"; }
- QCString trPrivateMembers()
- { return "Membri privati"; }
- QCString trPrivateSlots()
- { return "Slot privati"; }
- QCString trStaticPrivateMembers()
- { return "Membri privati statici"; }
-
- /*! this function is used to produce a comma-separated list of items.
- * use generateMarker(i) to indicate where item i should be put.
- */
- QCString trWriteList(int numEntries)
- {
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=", e ";
- }
- }
- return result;
- }
-
- /*! used in class documentation to produce a list of base classes,
- * if class diagrams are disabled.
- */
- QCString trInheritsList(int numEntries)
- {
- return "Eredita da "+trWriteList(numEntries)+".";
- }
-
- /*! used in class documentation to produce a list of super classes,
- * if class diagrams are disabled.
- */
- QCString trInheritedByList(int numEntries)
- {
- return "Base per "+trWriteList(numEntries)+".";
- }
-
- /*! used in member documentation blocks to produce a list of
- * members that are hidden by this one.
- */
- QCString trReimplementedFromList(int numEntries)
- {
- return "Reimplementa "+trWriteList(numEntries)+".";
- }
-
- /*! used in member documentation blocks to produce a list of
- * all member that overwrite the implementation of this member.
- */
- QCString trReimplementedInList(int numEntries)
- {
- return "Reimplementata in "+trWriteList(numEntries)+".";
- }
-
- /*! This is put above each page as a link to all members of namespaces. */
- QCString trNamespaceMembers()
- { return "Membri dei namespace"; }
-
- /*! This is an introduction to the page with all namespace members */
- QCString trNamespaceMemberDescription(bool extractAll)
- {
- QCString result="Questa è la lista ";
- if (!extractAll) result+="dei membri dei namespace documentati, ";
- else result+="di tutti i membri dei namespace ";
- result+="con collegamenti ";
- if (extractAll)
- result+="alla documentazione del namespace per ciascun membro:";
- else
- result+="ai namespace a cui appartengono:";
- return result;
- }
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all namespaces.
- */
- QCString trNamespaceIndex()
- { return "Indice dei namespace"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all namespaces.
- */
- QCString trNamespaceDocumentation()
- { return "Documentazione dei namespace"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- QCString trNamespaces()
- { return "Namespace"; }
-
-//////////////////////////////////////////////////////////////////////////
-// 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.
- */
- QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)"La documentazione per questa ";
- switch(compType)
- {
- case ClassDef::Class: result+="classe"; break;
- case ClassDef::Struct: result+="struct"; break;
- case ClassDef::Union: result+="union"; break;
- case ClassDef::Interface: result+="interfaccia"; break;
- case ClassDef::Protocol: result+="protocol"; break; // translate me!
- case ClassDef::Category: result+="category"; break; // translate me!
- case ClassDef::Exception: result+="exception"; break;
- }
- result+=" è stata generata a partire ";
- if (single) result+="dal seguente file:";
- else result+="dai seguenti file:";
- return result;
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- QCString trAlphabeticalList()
- { return "Lista in ordine alfabetico";}
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- QCString trReturnValues()
- { return "Valori di ritorno"; }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- QCString trMainPage()
- { return "Pagina Principale"; }
-
- /*! This is used in references to page that are put in the LaTeX
- * documentation. It should be an abbreviation of the word page.
- */
- QCString trPageAbbreviation()
- { return "pag."; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991003
-//////////////////////////////////////////////////////////////////////////
-
- QCString trDefinedAtLineInSourceFile()
- {
- return "Definizione alla linea @0 del file @1.";
- }
- QCString trDefinedInSourceFile()
- {
- return "Definizione nel file @0.";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
- QCString trDeprecated()
- {
- return "Deprecato";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- QCString trCollaborationDiagram(const char *clName)
- {
- return (QCString)"Diagramma di collaborazione per "+clName+":";
- }
- /*! this text is put before an include dependency graph */
- QCString trInclDepGraph(const char *fName)
- {
- return (QCString)"Grafo delle dipendenze di inclusione per "+fName+":";
- }
- /*! header that is put before the list of constructor/destructors. */
- QCString trConstructorDocumentation()
- {
- return "Documentazione dei costruttori e dei distruttori";
- }
- /*! Used in the file documentation to point to the corresponding sources. */
- QCString trGotoSourceCode()
- {
- return "Vai al codice sorgente di questo file.";
- }
- /*! Used in the file sources to point to the corresponding documentation. */
- QCString trGotoDocumentation()
- {
- return "Vai alla documentazione di questo file.";
- }
- /*! Text for the \\pre command */
- QCString trPrecondition()
- {
- return "Precondizione";
- }
- /*! Text for the \\post command */
- QCString trPostcondition()
- {
- return "Postcondizione";
- }
- /*! Text for the \\invariant command */
- QCString trInvariant()
- {
- return "Invariante";
- }
- /*! Text shown before a multi-line variable/enum initialization */
- QCString trInitialValue()
- {
- return "Valore iniziale:";
- }
- /*! Text used the source code in the file index */
- QCString trCode()
- {
- return "codice";
- }
- QCString trGraphicalHierarchy()
- {
- return "Grafico della gerarchia delle classi";
- }
- QCString trGotoGraphicalHierarchy()
- {
- return "Vai al grafico della gerarchia delle classi";
- }
- QCString trGotoTextualHierarchy()
- {
- return "Vai alla gerarchia delle classi (testuale)";
- }
- QCString trPageIndex()
- {
- return "Indice delle pagine";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- QCString trNote()
- {
- return "Nota";
- }
- QCString trPublicTypes()
- {
- return "Tipi pubblici";
- }
- QCString trPublicAttribs()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Campi";
- }
- else
- {
- return "Attributi pubblici";
- }
- }
-
- QCString trStaticPublicAttribs()
- {
- return "Attributi pubblici statici";
- }
- QCString trProtectedTypes()
- {
- return "Tipi protetti";
- }
- QCString trProtectedAttribs()
- {
- return "Attributi protetti";
- }
- QCString trStaticProtectedAttribs()
- {
- return "Attributi protetti statici";
- }
- QCString trPrivateTypes()
- {
- return "Tipi privati";
- }
- QCString trPrivateAttribs()
- {
- return "Attributi privati";
- }
- QCString trStaticPrivateAttribs()
- {
- return "Attributi privati statici";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a todo item */
- virtual QCString trTodo()
- {
- return "Da fare";
- }
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- {
- return "Lista di cose da fare";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy()
- {
- return "Referenziato da";
- }
- virtual QCString trRemarks()
- {
- return "Osservazioni";
- }
- virtual QCString trAttention()
- {
- return "Attenzione";
- }
- virtual QCString trInclByDepGraph()
- {
- return "Questo grafo mostra quali altri file includono direttamente o indirettamente questo file:";
- }
- virtual QCString trSince()
- {
- return "A partire da";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- virtual QCString trLegendTitle()
- {
- return "Legenda del grafo";
- }
- /*! page explaining how the dot graph's should be interpreted */
- virtual QCString trLegendDocs()
- {
- return
- "Questa pagina spiega come interpretare i grafi generati da doxygen.<p>\n"
- "Considerate l'esempio seguente:\n"
- "\\code\n"
- "/*! Classe invisibile per troncamento */\n"
- "class Invisible { };\n\n"
- "/*! Classe troncata, la relazione di ereditarietà e nascosta */\n"
- "class Truncated : public Invisible { };\n\n"
- "/* Classe non documentata con i commenti speciali di doxygen*/\n"
- "class Undocumented { };\n\n"
- "/*! Classe che utilizza una ereditarietà pubblica */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! Classe che utilizza una ereditarietà protetta*/\n"
- "class ProtectedBase { };\n\n"
- "/*! Classe che utilizza una ereditarietà privata*/\n"
- "class PrivateBase { };\n\n"
- "/*! Classe utilizzata dalla classe Inherited */\n"
- "class Used { };\n\n"
- "/*! Classe che eredita da varie classi*/\n"
- "class Inherited : public PublicBase,\n"
- " protected ProtectedBase,\n"
- " private PrivateBase,\n"
- " public Undocumented\n"
- "{\n"
- " private:\n"
- " Used *m_usedClass;\n"
- "};\n"
- "\\endcode\n"
- "Se il tag \\c MAX_DOT_GRAPH_HEIGHT nel file di configurazione "
- "è impostato a 200 verrà prodotto il grafo seguente:"
- "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
- "I riquadri nel grafo qui sopra hanno il seguente significato:\n"
- "<ul>\n"
- "<li>Il riquadro nero pieno rappresenta la struct o la classe per la quale il grafo è stato generato.\n"
- "<li>Un riquadro con un bordo nero denota una struct o una classe documentata.\n"
- "<li>Un riquadro con un bordo grigio indica una struct o una classe non documentata.\n"
- "<li>Un riquadro con un bordo rosso indica una struct o una classe per la quale non sono mostrate tutte le relazioni di ereditarietà/contenimento (un grafo viene troncato se non rientra nei limiti prestabiliti)."
- "</ul>\n"
- "Le frecce hanno il seguente significato:\n"
- "<ul>\n"
- "<li>Una freccia blu scuro indica una relazione di ereditarietà pubblica tra due classi.\n"
- "<li>Una freccia verde indica un'ereditarietà protetta.\n"
- "<li>Una freccia rossa indica un'ereditarietà privata.\n"
- "<li>Una freccia viola tratteggiata indica che una classe è contenuta o usata da un'altra classe."
- " La freccia viene etichettata con la o le variabili attraverso cui la struct o la classe puntata dalla freccia è accessibile.\n"
- "</ul>\n";
- }
- /*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return "legenda";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return "Test";
- }
- /*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return "Lista dei test";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return "Metodi DCOP";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return "Proprietà";
- }
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return "Documentazione delle proprietà";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Strutture dati";
- }
- else
- {
- return "Classi";
- }
- }
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
- {
- return (QCString)"Package "+name;
- }
- /*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return "Lista dei package";
- }
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return "Questi sono i package e una loro breve descrizione (se disponibile):";
- }
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return "Package";
- }
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return "Valore:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return "Bug";
- }
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return "Lista dei bug";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as ansicpg for RTF file */
- virtual QCString trRTFansicp()
- {
- return "1252";
- }
-
- /*! Used as ansicpg for RTF fcharset */
- virtual QCString trRTFCharSet()
- {
- return "0";
- }
-
- /*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return "Indice";
- }
-
- /*! 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 ? "Class" : "class"));
- result+=(singular ? "e" : "i");
- 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)
- {
- QCString result((first_capital ? "File" : "file"));
- 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)
- {
- QCString result((first_capital ? "Namespace" : "namespace"));
- 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 ? "Grupp" : "grupp"));
- result+=(singular ? "o" : "i");
- 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 ? "Pagin" : "pagin"));
- result+=(singular ? "a" : "e");
- 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 ? "Membr" : "membr"));
- result+=(singular ? "o" : "i");
- 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 ? "Global" : "global"));
- result+=(singular ? "e" : "i");
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is generated when the \\author command is used and
- * for the author section in man pages. */
- virtual QCString trAuthor(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Autor" : "autor"));
- result+=(singular ? "e" : "i");
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return "Riferimenti";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Implementa "+trWriteList(numEntries)+".";
- }
-
- /*! used in member documentation blocks to produce a list of
- * all members that implementation this member.
- */
- virtual QCString trImplementedInList(int numEntries)
- {
- return "Implementato in "+trWriteList(numEntries)+".";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.16
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in RTF documentation as a heading for the Table
- * of Contents.
- */
- virtual QCString trRTFTableOfContents()
- {
- return "Sommario";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.17
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as the header of the list of item that have been
- * flagged deprecated
- */
- virtual QCString trDeprecatedList()
- {
- return "Lista degli elementi deprecati";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.18
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a header for declaration section of the events found in
- * a C# program
- */
- virtual QCString trEvents()
- {
- return "Eventi";
- }
- /*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- return "Documentazione degli eventi";
- }
-
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a heading for a list of Java class types with package scope.
- */
- virtual QCString trPackageTypes()
- {
- return "Tipi con visibilità di package";
- }
- /*! Used as a heading for a list of Java class functions with package
- * scope.
- */
- virtual QCString trPackageMembers()
- {
- return "Funczioni con visibilità di package";
- }
- /*! Used as a heading for a list of static Java class functions with
- * package scope.
- */
- virtual QCString trStaticPackageMembers()
- {
- return "Funzioni statiche con visibilità di package";
- }
- /*! Used as a heading for a list of Java class variables with package
- * scope.
- */
- virtual QCString trPackageAttribs()
- {
- return "Attributi con visibilità di package";
- }
- /*! Used as a heading for a list of static Java class variables with
- * package scope.
- */
- virtual QCString trStaticPackageAttribs()
- {
- return "Attributi statici con visibilità di package";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Tutto";
- }
- /*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- return "Questo è il grafo delle chiamate per questa funzione:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! When the search engine is enabled this text is put in the header
- * of each page before the field where one can enter the text to search
- * for.
- */
- virtual QCString trSearchForIndex()
- {
- return "Cerca";
- }
- /*! This string is used as the title for the page listing the search
- * results.
- */
- virtual QCString trSearchResultsTitle()
- {
- return "Risultati della ricerca";
- }
- /*! 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
- * the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
- * value 2 represents 2 or more matches. HTML markup is allowed inside
- * the returned string.
- */
- virtual QCString trSearchResults(int numDocuments)
- {
- if (numDocuments==0)
- {
- return "Nessun documento soddisfa la tua richiesta.";
- }
- else if (numDocuments==1)
- {
- return "Trovato <b>1</b> documento rispondente alla tua richiesta.";
- }
- else
- {
- return "Trovati <b>$num</b> documenti rispondenti alla tua richiesta. "
- "Le corrispondenze migliori sono in testa.";
- }
- }
- /*! 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 "Corrispondenze:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 " File sorgente " + filename ;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.9
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the name of the chapter containing the directory
- * hierarchy.
- */
- virtual QCString trDirIndex()
- { return "Gerarchia delle directory"; }
-
- /*! This is used as the name of the chapter containing the documentation
- * of the directories.
- */
- virtual QCString trDirDocumentation()
- { return "Documentazione delle directory"; }
-
- /*! 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 "Directory"; }
-
- /*! This returns a sentences that introduces the directory hierarchy.
- * and the fact that it is sorted alphabetically per level
- */
- virtual QCString trDirDescription()
- { return "Questa gerarchia di directory è ordinata "
- "approssimativamente, ma non completamente, in ordine alfabetico:";
- }
-
- /*! 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="Riferimenti per la directory "; result+=dirName; return result; }
-
- /*! This returns the word directory with or without starting capital
- * (\a first_capital) and in sigular or plural form (\a singular).
- */
- virtual QCString trDir(bool first_capital, bool)
- {
- QCString result((first_capital ? "Directory" : "directory"));
- 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 "Questa è una funzione membro sovraccaricata (overloaded), "
- "fornita per comodità. Differisce dalla funzione di cui sopra"
- "unicamente per gli argomenti passati.";
- }
-
-};
-
-#endif
diff --git a/src/translator_je.h b/src/translator_je.h
deleted file mode 100644
index 4fac6be..0000000
--- a/src/translator_je.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-
-/*
- * translator_jp.h
- *
- * 1.2.5)
- * First Translation
- * by Kenji Nagamatsu
- * 1.2.12)
- * Update and Shift-Jis(_WIN32)
- * by Ryunosuke Sato (30-Dec-2001)
- */
-
-#ifndef TRANSLATOR_JE_H
-#define TRANSLATOR_JE_H
-
-class TranslatorJapaneseEn : public TranslatorEnglish
-{
- public:
- virtual QCString idLanguage()
- { return "japanese-en"; }
- virtual QCString latexLanguageSupportCommand()
- {
- return "platex";
- }
- /*! returns the name of the package that is included by LaTeX */
- virtual QCString idLanguageCharset()
- {
- if (Config_getBool("USE_WINDOWS_ENCODING"))
- {
- return "Shift_JIS";
- }
- else
- {
- return "euc-jp";
- }
- }
- virtual QCString trRTFansicp()
- {
- return "932";
- }
-
- /*! Used as ansicpg for RTF fcharset
- * \see trRTFansicp() for a table of possible values.
- */
- virtual QCString trRTFCharSet()
- {
- return "128";
- }
-};
-
-#endif
diff --git a/src/translator_jp.h b/src/translator_jp.h
deleted file mode 100644
index 48a3c9e..0000000
--- a/src/translator_jp.h
+++ /dev/null
@@ -1,1513 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-
-/*
- * translator_jp.h
- *
- * 1.2.5)
- * First Translation
- * by Kenji Nagamatsu
- * 1.2.12)
- * Update and Shift-Jis(_WIN32)
- * by Ryunosuke Sato (30-Dec-2001)
- */
-
-#ifndef TRANSLATOR_JP_H
-#define TRANSLATOR_JP_H
-
-class TranslatorJapanese : public TranslatorAdapter_1_3_9
-{
- private:
- /*! The decode() can change euc into sjis */
- inline QCString decode(const QCString & sInput)
- {
- if (Config_getBool("USE_WINDOWS_ENCODING"))
- {
- return JapaneseEucToSjis(sInput);
- }
- else
- {
- return sInput;
- }
- }
- public:
- virtual QCString idLanguage()
- { return "japanese"; }
- virtual QCString latexLanguageSupportCommand()
- {
- return "";
- }
- /*! returns the name of the package that is included by LaTeX */
- virtual QCString idLanguageCharset()
- {
- if (Config_getBool("USE_WINDOWS_ENCODING"))
- {
- return "Shift_JIS";
- }
- else
- {
- return "euc-jp";
- }
- }
-
- /*! used in the compound documentation before a list of related functions. */
- virtual QCString trRelatedFunctions()
- { return decode("´ØÏ¢¤¹¤ë´Ø¿ô"); }
-
- /*! subscript for the related functions. */
- virtual QCString trRelatedSubscript()
- { return decode("¡Ê¤³¤ì¤é¤Ï¥á¥½¥Ã¥É¤Ç¤Ê¤¤¤³¤È¤ËÃí°Õ¡Ë"); }
-
- /*! header that is put before the detailed description of files, classes and namespaces. */
- virtual QCString trDetailedDescription()
- { return decode("ÀâÌÀ"); }
-
- /*! header that is put before the list of typedefs. */
- virtual QCString trMemberTypedefDocumentation()
- { return decode("·¿ÄêµÁ"); }
-
- /*! header that is put before the list of enumerations. */
- virtual QCString trMemberEnumerationDocumentation()
- { return decode("Îóµó·¿"); }
-
- /*! header that is put before the list of member functions. */
- virtual QCString trMemberFunctionDocumentation()
- {
- if( Config_getBool("OPTIMIZE_OUTPUT_JAVA"))
- {
- return decode("¥á¥½¥Ã¥É");
- }
- else
- {
- return decode("´Ø¿ô");
- }
- }
-
- /*! header that is put before the list of member attributes. */
- virtual QCString trMemberDataDocumentation()
- {
- if( Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode("¹½Â¤ÂÎ");
- }
- else
- {
- return decode("ÊÑ¿ô");
- }
- }
-
- /*! this is the text of a link put after brief descriptions. */
- virtual QCString trMore()
- { return decode("[¾ÜºÙ]"); }
-
- /*! put in the class documentation */
- virtual QCString trListOfAllMembers()
- { return decode("¤¹¤Ù¤Æ¤Î¥á¥ó¥Ð°ìÍ÷"); }
-
- /*! used as the title of the "list of all members" page of a class */
- virtual QCString trMemberList()
- { return decode("¥á¥ó¥Ð°ìÍ÷"); }
-
- /*! this is the first part of a sentence that is followed by a class name */
- virtual QCString trThisIsTheListOfAllMembers()
- { return decode("¤³¤ì¤ÏÁ´¥á¥ó¥Ð¤Î°ìÍ÷¤Ç¤¹¡£"); }
-
- /*! this is the remainder of the sentence after the class name */
- virtual QCString trIncludingInheritedMembers()
- { return decode("·Ñ¾µ¥á¥ó¥Ð¤â´Þ¤ó¤Ç¤¤¤Þ¤¹¡£"); }
-
- /*! this is put at the author sections at the bottom of man pages.
- * parameter s is name of the project name.
- */
- virtual QCString trGeneratedAutomatically(const char *s)
- { QCString result;
- if (s) result=(QCString)s+decode("¤Î");
- result+=decode("¥½¡¼¥¹¤«¤é Doxygen ¤Ë¤è¤êÀ¸À®¤·¤Þ¤·¤¿¡£");
- return result;
- }
-
- /*! put after an enum name in the list of all members */
- virtual QCString trEnumName()
- { return decode("Enum"); }
-
- /*! put after an enum value in the list of all members */
- virtual QCString trEnumValue()
- { return decode("Enum ÃÍ"); }
-
- /*! put after an undocumented member in the list of all members */
- virtual QCString trDefinedIn()
- { return decode("¼¡¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£"); }
-
- // quick reference sections
-
- /*! This is put above each page as a link to the list of all groups of
- * compounds or files (see the \\group command).
- */
- virtual QCString trModules()
- { return decode("¥â¥¸¥å¡¼¥ë"); }
-
- /*! This is put above each page as a link to the class hierarchy */
- virtual QCString trClassHierarchy()
- { return decode("¥¯¥é¥¹³¬ÁØ"); }
-
- /*! This is put above each page as a link to the list of annotated classes */
- virtual QCString trCompoundList()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode("¥Ç¡¼¥¿¹½Â¤");
- }
- else
- {
- return decode("¹½À®");
- }
- }
-
- /*! This is put above each page as a link to the list of documented files */
- virtual QCString trFileList()
- { return decode("¥Õ¥¡¥¤¥ë°ìÍ÷"); }
-
- /*! This is put above each page as a link to the list of all verbatim headers */
- virtual QCString trHeaderFiles()
- { return decode("¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë"); }
-
- /*! This is put above each page as a link to all members of compounds. */
- virtual QCString trCompoundMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode("¥Ç¡¼¥¿¥Õ¥£¡¼¥ë¥É");
- }
- else
- {
- return decode("¹½À®¥á¥ó¥Ð");
- }
- }
-
- /*! This is put above each page as a link to all members of files. */
- virtual QCString trFileMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode("¥°¥í¡¼¥Ð¥ë");
- }
- else
- {
- return decode("¥Õ¥¡¥¤¥ë¥á¥ó¥Ð");
- }
- }
- /*! This is put above each page as a link to all related pages. */
- virtual QCString trRelatedPages()
- { return decode("´ØÏ¢¥Ú¡¼¥¸"); }
-
- /*! This is put above each page as a link to all examples. */
- virtual QCString trExamples()
- { return decode("Îã"); }
-
- /*! This is put above each page as a link to the search engine. */
- virtual QCString trSearch()
- { return decode("¸¡º÷"); }
-
- /*! This is an introduction to the class hierarchy. */
- virtual QCString trClassHierarchyDescription()
- { return decode("¤³¤Î·Ñ¾µ°ìÍ÷¤Ï¤ª¤ª¤Þ¤«¤Ë¤Ï¥½¡¼¥È¤µ¤ì¤Æ¤¤¤Þ¤¹¤¬¡¢"
- "´°Á´¤Ë¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È½ç¤Ç¥½¡¼¥È¤µ¤ì¤Æ¤Ï¤¤¤Þ¤»¤ó¡£");
- }
-
- /*! This is an introduction to the list with all files. */
- virtual QCString trFileListDescription(bool /*extractAll*/)
- {
- QCString result=decode("¤³¤ì¤Ï");
- result+=decode("¥Õ¥¡¥¤¥ë°ìÍ÷¤Ç¤¹¡£");
- return result;
- }
-
- /*! This is an introduction to the annotated compound list. */
- virtual QCString trCompoundListDescription()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode("¥Ç¡¼¥¿¹½Â¤¤ÎÀâÌÀ¤Ç¤¹¡£");
- }
- else
- {
- return decode("¥¯¥é¥¹¡¢¹½Â¤ÂΡ¢¶¦ÍÑÂΡ¢¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤ÎÀâÌÀ¤Ç¤¹¡£");
- }
- }
-
- /*! This is an introduction to the page with all class members. */
- virtual QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result=decode("¤³¤ì¤Ï");
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+=decode("¥Õ¥£¡¼¥ë¥É¤Î°ìÍ÷¤Ç¤½¤ì¤¾¤ì");
- if (extractAll) result+=decode("¤¬Â°¤·¤Æ¤¤¤ë¹½Â¤ÂÎ/¶¦ÍÑÂÎ");
- }
- else
- {
- result+=decode("¥¯¥é¥¹¥á¥ó¥Ð¤Î°ìÍ÷¤Ç¡¢¤½¤ì¤¾¤ì");
- if (extractAll) result+=decode("¤¬Â°¤·¤Æ¤¤¤ë¥¯¥é¥¹");
- }
- result+=decode("¤ÎÀâÌÀ¤Ø¥ê¥ó¥¯¤·¤Æ¤¤¤Þ¤¹¡£");
- return result;
- }
-
- /*! This is an introduction to the page with all file members. */
- virtual QCString trFileMembersDescription(bool /*extractAll*/)
- {
- QCString result=decode("¤³¤ì¤Ï");
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+=decode("´Ø¿ô¡¢ÊÑ¿ô¡¢¥Þ¥¯¥í¡¢Enum¡¢Typedef ¤Î");
- }
- else
- {
- result+=decode("¥Õ¥¡¥¤¥ë¥á¥ó¥Ð¤Î");
- }
- result+=decode("°ìÍ÷¤Ç¤¹¡£¤½¤ì¤¾¤ì¤¬Â°¤·¤Æ¤¤¤ë¥Õ¥¡¥¤¥ë¤ÎÀâÌÀ¤Ø¥ê¥ó¥¯¤·¤Æ¤¤¤Þ¤¹¡£");
- return result;
- }
-
- /*! This is an introduction to the page with the list of all header files. */
- virtual QCString trHeaderFilesDescription()
- { return decode("API¤ò¹½À®¤¹¤ë¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤Ç¤¹¡£"); }
-
- /*! This is an introduction to the page with the list of all examples */
- virtual QCString trExamplesDescription()
- { return decode("¤¹¤Ù¤Æ¤ÎÎã¤Î°ìÍ÷¤Ç¤¹¡£"); }
-
- /*! This is an introduction to the page with the list of related pages */
- virtual QCString trRelatedPagesDescription()
- { return decode("´ØÏ¢¥Ú¡¼¥¸¤Î°ìÍ÷¤Ç¤¹¡£"); }
-
- /*! This is an introduction to the page with the list of class/file groups */
- virtual QCString trModulesDescription()
- { return decode("¤¹¤Ù¤Æ¤Î¥â¥¸¥å¡¼¥ë¤Î°ìÍ÷¤Ç¤¹¡£"); }
-
- /*! This sentences is used in the annotated class/file lists if no brief
- * description is given.
- */
- virtual QCString trNoDescriptionAvailable()
- { return decode("¥É¥­¥å¥á¥ó¥È¤¬µ­½Ò¤µ¤ì¤Æ¤¤¤Þ¤»¤ó¡£"); }
-
- // index titles (the project name is prepended for these)
-
-
- /*! This is used in HTML as the title of index.html. */
- virtual QCString trDocumentation()
- { return decode("¥É¥­¥å¥á¥ó¥È"); }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all groups.
- */
- virtual QCString trModuleIndex()
- { return decode("¥â¥¸¥å¡¼¥ëº÷°ú"); }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * class hierarchy.
- */
- virtual QCString trHierarchicalIndex()
- { return decode("³¬Áغ÷°ú"); }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * annotated compound index.
- */
- virtual QCString trCompoundIndex()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode("¥Ç¡¼¥¿¹½Â¤º÷°ú");
- }
- else
- {
- return decode("¹½À®º÷°ú");
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * list of all files.
- */
- virtual QCString trFileIndex()
- { return decode("¥Õ¥¡¥¤¥ëº÷°ú"); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all groups.
- */
- virtual QCString trModuleDocumentation()
- { return decode("¥â¥¸¥å¡¼¥ë"); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all classes, structs and unions.
- */
- virtual QCString trClassDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode("¥Ç¡¼¥¿¹½Â¤");
- }
- else
- {
- return decode("¥¯¥é¥¹");
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all files.
- */
- virtual QCString trFileDocumentation()
- { return decode("¥Õ¥¡¥¤¥ë"); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all examples.
- */
- virtual QCString trExampleDocumentation()
- { return decode("Îã"); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all related pages.
- */
- virtual QCString trPageDocumentation()
- { return decode("¥Ú¡¼¥¸"); }
-
- /*! This is used in LaTeX as the title of the document */
- virtual QCString trReferenceManual()
- { return decode("¥ê¥Õ¥¡¥ì¥ó¥¹¥Þ¥Ë¥å¥¢¥ë"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of defines
- */
- virtual QCString trDefines()
- { return decode("¥Þ¥¯¥íÄêµÁ"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of function prototypes
- */
- virtual QCString trFuncProtos()
- { return decode("´Ø¿ô¥×¥í¥È¥¿¥¤¥×"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of typedefs
- */
- virtual QCString trTypedefs()
- { return decode("·¿ÄêµÁ"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of enumerations
- */
- virtual QCString trEnumerations()
- { return decode("Îóµó·¿"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) functions
- */
- virtual QCString trFunctions()
- { return decode("´Ø¿ô"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trVariables()
- { return decode("ÊÑ¿ô"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trEnumerationValues()
- { return decode("Îóµó·¿¤ÎÃÍ"); }
- /*! This is used in the documentation of a file before the list of
- * documentation blocks for defines
- */
- virtual QCString trDefineDocumentation()
- { return decode("¥Þ¥¯¥íÄêµÁ"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for function prototypes
- */
- virtual QCString trFunctionPrototypeDocumentation()
- { return decode("´Ø¿ô¥×¥í¥È¥¿¥¤¥×"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for typedefs
- */
- virtual QCString trTypedefDocumentation()
- { return decode("·¿ÄêµÁ"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration types
- */
- virtual QCString trEnumerationTypeDocumentation()
- { return decode("Îóµó·¿"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration values
- */
- virtual QCString trEnumerationValueDocumentation()
- { return decode("Îóµó·¿¤ÎÃÍ"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for functions
- */
- virtual QCString trFunctionDocumentation()
- { return decode("´Ø¿ô"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for variables
- */
- virtual QCString trVariableDocumentation()
- { return decode("ÊÑ¿ô"); }
-
- /*! This is used in the documentation of a file/namespace/group before
- * the list of links to documented compounds
- */
- virtual QCString trCompounds()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode("¥Ç¡¼¥¿¹½Â¤");
- }
- else
- {
- return decode("¹½À®");
- }
- }
- /*! This is used in the standard footer of each page and indicates when
- * the page was generated
- */
- virtual QCString trGeneratedAt(const char *date,const char *projName)
- {
- QCString result;
- if (projName) result+=(QCString)projName+decode("¤ËÂФ·¤Æ");
- result+=(QCString)date+decode("¤ËÀ¸À®¤µ¤ì¤Þ¤·¤¿¡£");
- return result;
- }
- /*! This is part of the sentence used in the standard footer of each page.
- */
- virtual QCString trWrittenBy()
- {
- return decode("ºî¼Ô");
- }
-
- /*! this text is put before a class diagram */
- virtual QCString trClassDiagram(const char *clName)
- {
- return (QCString)clName+decode("¤ËÂФ¹¤ë·Ñ¾µ¥°¥é¥Õ");
- }
-
- /*! this text is generated when the \\internal command is used. */
- virtual QCString trForInternalUseOnly()
- { return decode("ÆâÉô»ÈÍѤΤߡ£"); }
-
- /*! this text is generated when the \\reimp command is used. */
- virtual QCString trReimplementedForInternalReasons()
- { return decode("ÆâÉôŪ¤ÊÍýͳ¤Ë¤è¤êºÆ¼ÂÁõ¤µ¤ì¤Þ¤·¤¿¤¬¡¢API¤Ë¤Ï±Æ¶Á¤·¤Þ¤»¤ó¡£");
- }
-
- /*! this text is generated when the \\warning command is used. */
- virtual QCString trWarning()
- { return decode("·Ù¹ð"); }
-
- /*! this text is generated when the \\bug command is used. */
- virtual QCString trBugsAndLimitations()
- { return decode("¥Ð¥°¤ÈÀ©¸Â"); }
-
- /*! this text is generated when the \\version command is used. */
- virtual QCString trVersion()
- { return decode("¥Ð¡¼¥¸¥ç¥ó"); }
-
- /*! this text is generated when the \\date command is used. */
- virtual QCString trDate()
- { return decode("ÆüÉÕ"); }
-
- /*! this text is generated when the \\return command is used. */
- virtual QCString trReturns()
- { return decode("Ìá¤êÃÍ"); }
-
- /*! this text is generated when the \\sa command is used. */
- virtual QCString trSeeAlso()
- { return decode("»²¾È"); }
-
- /*! this text is generated when the \\param command is used. */
- virtual QCString trParameters()
- { return decode("°ú¿ô"); }
-
- /*! this text is generated when the \\exception command is used. */
- virtual QCString trExceptions()
- { return decode("Îã³°"); }
-
- /*! this text is used in the title page of a LaTeX document. */
- virtual QCString trGeneratedBy()
- { return decode("ºîÀ®¡§"); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of page containing all the index of all namespaces. */
- virtual QCString trNamespaceList()
- { return decode("¥Í¡¼¥à¥¹¥Ú¡¼¥¹°ìÍ÷"); }
-
- /*! used as an introduction to the namespace list */
- virtual QCString trNamespaceListDescription(bool /*extractAll*/)
- {
- QCString result=decode("");
- result+=decode("¥Í¡¼¥à¥¹¥Ú¡¼¥¹¤Î°ìÍ÷¤Ç¤¹¡£");
- return result;
- }
-
- /*! used in the class documentation as a header before the list of all
- * friends of a class
- */
- virtual QCString trFriends()
- { return decode("¥Õ¥ì¥ó¥É"); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in the class documentation as a header before the list of all
- * related classes
- */
- virtual QCString trRelatedFunctionDocumentation()
- { return decode("¥Õ¥ì¥ó¥É¤È´ØÏ¢¤¹¤ë´Ø¿ô"); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of the HTML page of a class/struct/union */
- virtual QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- {
- QCString result="";
- switch(compType)
- {
- case ClassDef::Class: result+=decode("¥¯¥é¥¹ "); break;
- case ClassDef::Struct: result+=decode("¹½Â¤ÂÎ "); break;
- case ClassDef::Union: result+=decode("¶¦ÍÑÂÎ "); break;
- case ClassDef::Interface: result+=decode("¥¤¥ó¥¿¥Õ¥§¡¼¥¹ "); break;
- case ClassDef::Protocol: result+=decode("¥×¥í¥È¥³¥ë "); break;
- case ClassDef::Category: result+=decode("¥«¥Æ¥´¥ê "); break;
- case ClassDef::Exception: result+=decode("Îã³° "); break;
- }
- if (isTemplate) result+=decode("¥Æ¥ó¥×¥ì¡¼¥È ");
- result+=(QCString)clName;
- return result;
- }
-
- /*! used as the title of the HTML page of a file */
- virtual QCString trFileReference(const char *fileName)
- {
- QCString result=decode("")+(QCString)fileName;
- return result;
- }
-
- /*! used as the title of the HTML page of a namespace */
- virtual QCString trNamespaceReference(const char *namespaceName)
- {
- QCString result=decode("¥Í¡¼¥à¥¹¥Ú¡¼¥¹ ")+(QCString)namespaceName;
- return result;
- }
-
- /* these are for the member sections of a class, struct or union */
- virtual QCString trPublicMembers()
- { return decode("Public ¥á¥½¥Ã¥É"); }
- virtual QCString trPublicSlots()
- { return decode("Public ¥¹¥í¥Ã¥È"); }
- virtual QCString trSignals()
- { return decode("¥·¥°¥Ê¥ë"); }
- virtual QCString trStaticPublicMembers()
- { return decode("Static Public ¥á¥½¥Ã¥É"); }
- virtual QCString trProtectedMembers()
- { return decode("Protected ¥á¥½¥Ã¥É"); }
- virtual QCString trProtectedSlots()
- { return decode("Protected ¥¹¥í¥Ã¥È"); }
- virtual QCString trStaticProtectedMembers()
- { return decode("Static Protected ¥á¥½¥Ã¥É"); }
- virtual QCString trPrivateMembers()
- { return decode("Private ¥á¥½¥Ã¥É"); }
- virtual QCString trPrivateSlots()
- { return decode("Private ¥¹¥í¥Ã¥È"); }
- virtual QCString trStaticPrivateMembers()
- { return decode("Static Private ¥á¥½¥Ã¥É"); }
-
- /*! this function is used to produce a comma-separated list of items.
- * use generateMarker(i) to indicate where item i should be put.
- */
- virtual QCString trWriteList(int numEntries)
- {
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=decode(", ");
- else // the fore last entry
- result+=decode(", ¤È ");
- }
- }
- return result;
- }
-
- /*! used in class documentation to produce a list of base classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritsList(int numEntries)
- {
- return trWriteList(numEntries)+decode("¤ò·Ñ¾µ¤·¤Æ¤¤¤Þ¤¹¡£");
- }
-
- /*! used in class documentation to produce a list of super classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritedByList(int numEntries)
- {
- return trWriteList(numEntries)+decode("¤Ë·Ñ¾µ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£");
- }
-
- /*! used in member documentation blocks to produce a list of
- * members that are hidden by this one.
- */
- virtual QCString trReimplementedFromList(int numEntries)
- {
- return trWriteList(numEntries)+decode("¤òºÆÄêµÁ¤·¤Æ¤¤¤Þ¤¹¡£");
- }
-
- /*! 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 trWriteList(numEntries)+decode("¤ÇºÆÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£");
- }
-
- /*! This is put above each page as a link to all members of namespaces. */
- virtual QCString trNamespaceMembers()
- { return decode("¥Í¡¼¥à¥¹¥Ú¡¼¥¹¥á¥ó¥Ð"); }
-
- /*! This is an introduction to the page with all namespace members */
- virtual QCString trNamespaceMemberDescription(bool extractAll)
- {
- QCString result=decode("¤³¤ì¤Ï");
- result+=decode("¥Í¡¼¥à¥¹¥Ú¡¼¥¹¤Î°ìÍ÷¤Ç¤¹¡£¤½¤ì¤¾¤ì");
- if (extractAll)
- result+=decode("¤Î¥Í¡¼¥à¥¹¥Ú¡¼¥¹");
- else
- result+=decode("¤¬Â°¤·¤Æ¤¤¤ë¥Í¡¼¥à¥¹¥Ú¡¼¥¹");
- result+=decode("¤Ø¥ê¥ó¥¯¤·¤Æ¤¤¤Þ¤¹¡£");
- return result;
- }
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all namespaces.
- */
- virtual QCString trNamespaceIndex()
- { return decode("¥Í¡¼¥à¥¹¥Ú¡¼¥¹º÷°ú"); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all namespaces.
- */
- virtual QCString trNamespaceDocumentation()
- { return decode("¥Í¡¼¥à¥¹¥Ú¡¼¥¹"); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- virtual QCString trNamespaces()
- { return decode("¥Í¡¼¥à¥¹¥Ú¡¼¥¹"); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990728
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is put at the bottom of a class documentation page and is
- * followed by a list of files that were used to generate the page.
- */
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)decode("¤³¤Î");
- switch(compType)
- {
- case ClassDef::Class: result+=decode("¥¯¥é¥¹"); break;
- case ClassDef::Struct: result+=decode("¹½Â¤ÂÎ"); break;
- case ClassDef::Union: result+=decode("¶¦ÍÑÂÎ"); break;
- case ClassDef::Interface: result+=decode("¥¤¥ó¥¿¥Õ¥§¡¼¥¹"); break;
- case ClassDef::Protocol: result+=decode("¥×¥í¥È¥³¥ë"); break;
- case ClassDef::Category: result+=decode("¥«¥Æ¥´¥ê"); break;
- case ClassDef::Exception: result+=decode("Îã³°"); break;
- }
- result+=decode("¤ÎÀâÌÀ¤Ï¼¡¤Î¥Õ¥¡¥¤¥ë¤«¤éÀ¸À®¤µ¤ì¤Þ¤·¤¿:");
- return result;
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- virtual QCString trAlphabeticalList()
- { return decode("¥¢¥ë¥Õ¥¡¥Ù¥Ã¥È½ç°ìÍ÷"); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- virtual QCString trReturnValues()
- { return decode("Ìá¤êÃÍ"); }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- virtual QCString trMainPage()
- { return decode("¥á¥¤¥ó¥Ú¡¼¥¸"); }
-
- /*! This is used in references to page that are put in the LaTeX
- * documentation. It should be an abbreviation of the word page.
- */
- virtual QCString trPageAbbreviation()
- { return decode("p."); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991003
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trSources()
- {
- return decode("¥½¡¼¥¹");
- }
- virtual QCString trDefinedAtLineInSourceFile()
- {
- return decode(" @1 ¤Î @0 ¹Ô¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£");
- }
- virtual QCString trDefinedInSourceFile()
- {
- return decode(" @0 ¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤¹¡£");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDeprecated()
- {
- return decode("Èó¿ä¾©");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- virtual QCString trCollaborationDiagram(const char *clName)
- {
- return (QCString)clName+decode("¤Î¥³¥é¥Ü¥ì¡¼¥·¥ç¥ó¿Þ");
- }
- /*! this text is put before an include dependency graph */
- virtual QCString trInclDepGraph(const char *fName)
- {
- return (QCString)fName+decode("¤Î¥¤¥ó¥¯¥ë¡¼¥É°Í¸´Ø·¸¿Þ");
- }
- /*! header that is put before the list of constructor/destructors. */
- virtual QCString trConstructorDocumentation()
- {
- return decode("¥³¥ó¥¹¥È¥é¥¯¥¿¤È¥Ç¥¹¥È¥é¥¯¥¿");
- }
- /*! Used in the file documentation to point to the corresponding sources. */
- virtual QCString trGotoSourceCode()
- {
- return decode("¥½¡¼¥¹¥³¡¼¥É¤ò¸«¤ë¡£");
- }
- /*! Used in the file sources to point to the corresponding documentation. */
- virtual QCString trGotoDocumentation()
- {
- return decode("ÀâÌÀ¤ò¸«¤ë¡£");
- }
- /*! Text for the \\pre command */
- virtual QCString trPrecondition()
- {
- return decode("»öÁ°¾ò·ï");
- }
- /*! Text for the \\post command */
- virtual QCString trPostcondition()
- {
- return decode("»ö¸å¾ò·ï");
- }
- /*! Text for the \\invariant command */
- virtual QCString trInvariant()
- {
- return decode("ÉÔÊÑ");
- }
- /*! Text shown before a multi-line variable/enum initialization */
- virtual QCString trInitialValue()
- {
- return decode("½é´üÃÍ:");
- }
- /*! Text used the source code in the file index */
- virtual QCString trCode()
- {
- return decode("¥³¡¼¥É");
- }
- virtual QCString trGraphicalHierarchy()
- {
- return decode("¥¯¥é¥¹³¬ÁØ¿Þ");
- }
- virtual QCString trGotoGraphicalHierarchy()
- {
- return decode("¥¯¥é¥¹³¬ÁØ¿Þ¤ò¸«¤ë¡£");
- }
- virtual QCString trGotoTextualHierarchy()
- {
- return decode("¥¯¥é¥¹³¬ÁØ¿Þ¤ò¸«¤ë¡£");
- }
- virtual QCString trPageIndex()
- {
- return decode("¥Ú¡¼¥¸º÷°ú");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trNote()
- {
- return decode("³Ð¤¨½ñ¤­");
- }
- virtual QCString trPublicTypes()
- {
- return decode("Public ·¿");
- }
- virtual QCString trPublicAttribs()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode("ÊÑ¿ô");
- }
- else
- {
- return decode("Public ÊÑ¿ô");
- }
- }
- virtual QCString trStaticPublicAttribs()
- {
- return decode("Static Public ÊÑ¿ô");
- }
- virtual QCString trProtectedTypes()
- {
- return decode("Protected ·¿");
- }
- virtual QCString trProtectedAttribs()
- {
- return decode("Protected ÊÑ¿ô");
- }
- virtual QCString trStaticProtectedAttribs()
- {
- return decode("Static Protected ÊÑ¿ô");
- }
- virtual QCString trPrivateTypes()
- {
- return decode("Private ·¿");
- }
- virtual QCString trPrivateAttribs()
- {
- return decode("Private ÊÑ¿ô");
- }
- virtual QCString trStaticPrivateAttribs()
- {
- return decode("Static Private ÊÑ¿ô");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a todo item */
- virtual QCString trTodo()
- {
- return decode("TODO");
- }
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- {
- return decode("TODO°ìÍ÷");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy()
- {
- return decode("»²¾È¸µ");
- }
- virtual QCString trRemarks()
- {
- return decode("°Õ¸«");
- }
- virtual QCString trAttention()
- {
- return decode("Ãí°Õ");
- }
- virtual QCString trInclByDepGraph()
- {
- return decode("¤³¤Î¥°¥é¥Õ¤Ï¡¢¤É¤Î¥Õ¥¡¥¤¥ë¤«¤éľÀÜ¡¢´ÖÀÜŪ¤Ë"
- "¥¤¥ó¥¯¥ë¡¼¥É¤µ¤ì¤Æ¤¤¤ë¤«¤ò¼¨¤·¤Æ¤¤¤Þ¤¹¡£");
- }
- virtual QCString trSince()
- {
- return decode("¤«¤é");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- virtual QCString trLegendTitle()
- {
- return decode("¥°¥é¥Õ¤ÎËÞÎã");
- }
- /*! page explaining how the dot graph's should be interpreted */
- virtual QCString trLegendDocs()
- {
- return
- decode("¤³¤Î¥Ú¡¼¥¸¤Ç¤Ï¡¢doxygen ¤ÇÀ¸À®¤µ¤ì¤¿¥°¥é¥Õ¤ò¤É¤Î¤è¤¦¤Ë¤ß¤¿¤é¤è¤¤¤«¤ò"
- "ÀâÌÀ¤·¤Þ¤¹¡£<p>\n"
- "¼¡¤ÎÎã¤ò¹Í¤¨¤Æ¤ß¤Þ¤¹¡£\n"
- "\\code\n"
- "/*! ¾Êά¤µ¤ì¤Æ¸«¤¨¤Ê¤¤¥¯¥é¥¹ */\n"
- "class Invisible { };\n\n"
- "/*! ¾Êά¤µ¤ì¤¿¥¯¥é¥¹(·Ñ¾µ´Ø·¸¤Ï±£¤µ¤ì¤Æ¤¤¤ë) */\n"
- "class Truncated : public Invisible { };\n\n"
- "/* doxygen ¥³¥á¥ó¥È¤Ë¤è¤ë¥É¥­¥å¥á¥ó¥È¤¬¤Ê¤¤¥¯¥é¥¹ */\n"
- "class Undocumented { };\n\n"
- "/*! public ¤Ç·Ñ¾µ¤µ¤ì¤¿¥¯¥é¥¹ */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! protected ¤Ç·Ñ¾µ¤µ¤ì¤¿¥¯¥é¥¹ */\n"
- "class ProtectedBase { };\n\n"
- "/*! private ¤Ç·Ñ¾µ¤µ¤ì¤¿¥¯¥é¥¹ */\n"
- "class PrivateBase { };\n\n"
- "/*! ·Ñ¾µ¤µ¤ì¤¿¥¯¥é¥¹¤Ç»È¤ï¤ì¤Æ¤¤¤ë¥¯¥é¥¹ */\n"
- "class Used { };\n\n"
- "/*! Ê£¿ô¤Î¥¯¥é¥¹¤ò·Ñ¾µ¤·¤Æ¤¤¤ë¾å°Ì¥¯¥é¥¹ */\n"
- "class Inherited : public PublicBase,\n"
- " protected ProtectedBase,\n"
- " private PrivateBase,\n"
- " public Undocumented\n"
- "{\n"
- " private:\n"
- " Used *m_usedClass;\n"
- "};\n"
- "\\endcode\n"
- "ÀßÄê¥Õ¥¡¥¤¥ëÃæ¤Ç¡¢¥¿¥° \\c MAX_DOT_GRAPH_HEIGHT ¤¬ 200 ¤Ë¥»¥Ã¥È¤µ¤ì¤¿"
- "¾ì¹ç¡¢¼¡¤Î¤è¤¦¤Ê¥°¥é¥Õ¤È¤Ê¤ê¤Þ¤¹¡£"
- "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
- "¾å¤Î¥°¥é¥ÕÆâ¤Î¥Ü¥Ã¥¯¥¹¤Ë¤Ï¼¡¤Î¤è¤¦¤Ê°ÕÌ£¤¬¤¢¤ê¤Þ¤¹¡£\n"
- "<ul>\n"
- "<li>¹õ¤¯Åɤê¤Ä¤Ö¤µ¤ì¤¿¥Ü¥Ã¥¯¥¹¤Ï¡¢¤³¤Î¥°¥é¥Õ¤ËÂбþ¤¹¤ë¹½Â¤ÂΤ䥯¥é¥¹¤ò"
- "ɽ¤·¤Þ¤¹¡£\n"
- "<li>¹õÏȤΥܥ寥¹¤Ï¥É¥­¥å¥á¥ó¥È¤¬¤¢¤ë¹½Â¤ÂΤ䥯¥é¥¹¤òɽ¤·¤Þ¤¹¡£\n"
- "<li>³¥¿§¤ÎÏȤΥܥ寥¹¤Ï¥É¥­¥å¥á¥ó¥È¤¬¤Ê¤¤¹½Â¤ÂΤ䥯¥é¥¹¤òɽ¤·¤Þ¤¹¡£\n"
- "<li>ÀÖÏȤΥܥ寥¹¤Ï¥É¥­¥å¥á¥ó¥È¤¬¤¢¤ë¹½Â¤ÂΤ䥯¥é¥¹¤òɽ¤·¤Þ¤¹¤¬¡¢"
- "»ØÄꤵ¤ì¤¿¥µ¥¤¥º¤Ë¼ý¤Þ¤é¤Ê¤¤¤¿¤á¤Ë·Ñ¾µ¡¦Êñ´Þ´Ø·¸¤ò¤¹¤Ù¤Æ¿Þ¼¨¤¹¤ë"
- "¤³¤È¤¬¤Ç¤­¤Ê¤«¤Ã¤¿¤³¤È¤ò¼¨¤·¤Þ¤¹¡£"
- "</ul>\n"
- "Ìð°õ¤Ë¤Ï¼¡¤Î¤è¤¦¤Ê°ÕÌ£¤¬¤¢¤ê¤Þ¤¹¡£\n"
- "<ul>\n"
- "<li>ÀĤ¤Ìð°õ¤ÏÆó¤Ä¤Î¥¯¥é¥¹´Ö¤Î public ·Ñ¾µ´Ø·¸¤ò¼¨¤·¤Þ¤¹¡£\n"
- "<li>ÎФÎÌð°õ¤Ï protected ·Ñ¾µ´Ø·¸¤ò¼¨¤·¤Þ¤¹¡£\n"
- "<li>ÀÖ¤ÎÌð°õ¤Ï private ·Ñ¾µ´Ø·¸¤ò¼¨¤·¤Þ¤¹¡£\n"
- "<li>»ç¤ÎÇËÀþÌð°õ¤Ï¡¢¤½¤Î¥¯¥é¥¹¤¬Â¾¤Î¥¯¥é¥¹¤Ë´Þ¤Þ¤ì¤Æ¤¤¤¿¤ê¡¢"
- "ÍøÍѤµ¤ì¤Æ¤¤¤ë¤³¤È¤ò¼¨¤·¤Þ¤¹¡£¤Þ¤¿¡¢Ìð°õ¤¬»Ø¤·¤Æ¤¤¤ë¥¯¥é¥¹¤ä¹½Â¤ÂΤò"
- "¤É¤ÎÊÑ¿ô¤Ç¥¢¥¯¥»¥¹¤Ç¤­¤ë¤«¤òÌð°õ¤Î¥é¥Ù¥ë¤È¤·¤Æ¼¨¤·¤Æ¤¤¤Þ¤¹¡£\n"
- "</ul>\n");
- }
- /*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return decode("ËÞÎã");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return decode("¥Æ¥¹¥È");
- }
- /*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return decode("¥Æ¥¹¥È°ìÍ÷");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return decode("DCOP¥á¥½¥Ã¥É");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return decode("¥×¥í¥Ñ¥Æ¥£");
- }
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return decode("¥×¥í¥Ñ¥Æ¥£");
- }
-
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java interfaces in the summary section of Java packages */
- virtual QCString trInterfaces()
- {
- return decode("¥¤¥ó¥¿¡¼¥Õ¥§¡¼¥¹");
- }
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode("¥Ç¡¼¥¿¹½Â¤");
- }
- else
- {
- return decode("¥¯¥é¥¹");
- }
- }
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
- {
- return (QCString)decode("¥Ñ¥Ã¥±¡¼¥¸ ")+name;
- }
- /*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return decode("¥Ñ¥Ã¥±¡¼¥¸°ìÍ÷");
- }
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return decode("¤³¤ì¤Ï¥Ñ¥Ã¥±¡¼¥¸°ìÍ÷¤Ç¤¹¡£");
- }
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return decode("¥Ñ¥Ã¥±¡¼¥¸");
- }
- /*! Used as a chapter title for Latex & RTF output */
- virtual QCString trPackageDocumentation()
- {
- return decode("¥Ñ¥Ã¥±¡¼¥¸");
- }
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return decode("ÃÍ:");
- }
-
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return decode("¥Ð¥°");
- }
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return decode("¥Ð¥°°ìÍ÷");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as ansicpg for RTF file
- *
- * The following table shows the correlation of Charset name, Charset Value and
- * <pre>
- * Codepage number:
- * Charset Name Charset Value(hex) Codepage number
- * ------------------------------------------------------
- * DEFAULT_CHARSET 1 (x01)
- * SYMBOL_CHARSET 2 (x02)
- * OEM_CHARSET 255 (xFF)
- * ANSI_CHARSET 0 (x00) 1252
- * RUSSIAN_CHARSET 204 (xCC) 1251
- * EE_CHARSET 238 (xEE) 1250
- * GREEK_CHARSET 161 (xA1) 1253
- * TURKISH_CHARSET 162 (xA2) 1254
- * BALTIC_CHARSET 186 (xBA) 1257
- * HEBREW_CHARSET 177 (xB1) 1255
- * ARABIC _CHARSET 178 (xB2) 1256
- * SHIFTJIS_CHARSET 128 (x80) 932
- * HANGEUL_CHARSET 129 (x81) 949
- * GB2313_CHARSET 134 (x86) 936
- * CHINESEBIG5_CHARSET 136 (x88) 950
- * </pre>
- *
- */
- virtual QCString trRTFansicp()
- {
- return "932";
- }
-
-
- /*! Used as ansicpg for RTF fcharset
- * \see trRTFansicp() for a table of possible values.
- */
- virtual QCString trRTFCharSet()
- {
- return "128";
- }
-
- /*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return decode("º÷°ú");
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trClass(bool first_capital, bool singular)
- {
- first_capital = first_capital;
- singular = singular;
- QCString result(decode("¥¯¥é¥¹"));
- 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)
- {
- first_capital = first_capital;
- singular = singular;
- QCString result(decode("¥Õ¥¡¥¤¥ë"));
- 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)
- {
- first_capital = first_capital;
- singular = singular;
- QCString result(decode("¥Í¡¼¥à¥¹¥Ú¡¼¥¹"));
- 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)
- {
- first_capital = first_capital;
- singular = singular;
- QCString result(decode("¥°¥ë¡¼¥×"));
- 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)
- {
- first_capital = first_capital;
- singular = singular;
- QCString result(decode("¥Ú¡¼¥¸"));
- 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)
- {
- first_capital = first_capital;
- singular = singular;
- QCString result(decode("¥á¥ó¥Ð"));
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trField(bool first_capital, bool singular)
- {
- first_capital = first_capital;
- singular = singular;
- QCString result(decode("¥Õ¥£¡¼¥ë¥É"));
- 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)
- {
- first_capital = first_capital;
- singular = singular;
- QCString result(decode("¥°¥í¡¼¥Ð¥ë"));
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is generated when the \\author command is used and
- * for the author section in man pages. */
- virtual QCString trAuthor(bool first_capital, bool singular)
- {
- first_capital = first_capital;
- singular = singular;
- QCString result(decode("ºî¼Ô"));
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return decode("»²¾ÈÀè");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 trWriteList(numEntries)+decode("¤ò¼ÂÁõ¤·¤Æ¤¤¤Þ¤¹")+".";
- }
-
- /*! used in member documentation blocks to produce a list of
- * all members that implement this abstract member.
- */
- virtual QCString trImplementedInList(int numEntries)
- {
- return trWriteList(numEntries)+decode("¤Ç¼ÂÁõ¤µ¤ì¤Æ¤¤¤Þ¤¹")+".";
- }
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.16
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in RTF documentation as a heading for the Table
- * of Contents.
- */
- virtual QCString trRTFTableOfContents()
- {
- return decode("Ìܼ¡");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.17
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as the header of the list of item that have been
- * flagged deprecated
- */
- virtual QCString trDeprecatedList()
- {
- return decode("Èó¿ä¾©°ìÍ÷");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.18
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a header for declaration section of the events found in
- * a C# program
- */
- virtual QCString trEvents()
- {
- return decode("¥¤¥Ù¥ó¥È");
- }
- /*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- return decode("¥¤¥Ù¥ó¥È");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a heading for a list of Java class types with package scope.
- */
- virtual QCString trPackageTypes()
- {
- return decode("¥Ñ¥Ã¥±¡¼¥¸Æâ¤Î·¿ÄêµÁ");
- }
- /*! Used as a heading for a list of Java class functions with package
- * scope.
- */
- virtual QCString trPackageMembers()
- {
- return decode("´Ø¿ô");
- }
- /*! Used as a heading for a list of static Java class functions with
- * package scope.
- */
- virtual QCString trStaticPackageMembers()
- {
- return decode("¥¹¥¿¥Æ¥£¥Ã¥¯´Ø¿ô");
- }
- /*! Used as a heading for a list of Java class variables with package
- * scope.
- */
- virtual QCString trPackageAttribs()
- {
- return decode("ÊÑ¿ô");
- }
- /*! Used as a heading for a list of static Java class variables with
- * package scope.
- */
- virtual QCString trStaticPackageAttribs()
- {
- return decode("¥¹¥¿¥Æ¥£¥Ã¥¯ÊÑ¿ô");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 decode("Á´¤Æ");
- }
- /*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- return decode("´Ø¿ô¤Î¸Æ¤Ó½Ð¤·¥°¥é¥Õ:");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! When the search engine is enabled this text is put in the header
- * of each page before the field where one can enter the text to search
- * for.
- */
- virtual QCString trSearchForIndex()
- {
- return decode("¸¡º÷");
- }
- /*! This string is used as the title for the page listing the search
- * results.
- */
- virtual QCString trSearchResultsTitle()
- {
- return decode("¸¡º÷·ë²Ì");
- }
- /*! 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
- * the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
- * value 2 represents 2 or more matches. HTML markup is allowed inside
- * the returned string.
- */
- virtual QCString trSearchResults(int numDocuments)
- {
- if (numDocuments==0)
- {
- return decode("ÆþÎϤµ¤ì¤¿¾ò·ï¤Ë¥Þ¥Ã¥Á¤¹¤ë¥É¥­¥å¥á¥ó¥È¤¬¤¢¤ê¤Þ¤»¤ó¤Ç¤·¤¿.");
- }
- else if (numDocuments==1)
- {
- return decode("ÆþÎϤµ¤ì¤¿¾ò·ï¤Ë¥Þ¥Ã¥Á¤¹¤ë¥É¥­¥å¥á¥ó¥È¤¬ <b>1</b> ·ï¤ß¤Ä¤«¤ê¤Þ¤·¤¿.");
- }
- else
- {
- return decode("ÆþÎϤµ¤ì¤¿¾ò·ï¤Ë¥Þ¥Ã¥Á¤¹¤ë¥É¥­¥å¥á¥ó¥È¤¬ <b>$num</b> ·ï¤ß¤Ä¤«¤ê¤Þ¤·¤¿. "
- "ºÇ¤â°ìÃפ·¤Æ¤¤¤ë¤â¤Î¤«¤éɽ¼¨¤µ¤ì¤Þ¤¹.");
- }
- }
- /*! 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 decode("¥Þ¥Ã¥Á¤·¤¿Ã±¸ì:");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 filename + decode(" ¥½¡¼¥¹¥Õ¥¡¥¤¥ë");
- }
-};
-#endif
diff --git a/src/translator_ke.h b/src/translator_ke.h
deleted file mode 100644
index 0fa20a1..0000000
--- a/src/translator_ke.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-
-//
-// Update:
-//
-// 2004.12.22 (SooYoung Jung: jung5000@gmail.com)
-// - LaTex and RTF were not generated correctly.
-// Corrected trRTFansicp and trRTFCharSet.
-// It was wrong.
-//
-//
-
-#ifndef TRANSLATOR_KE_H
-#define TRANSLATOR_KE_H
-
-class TranslatorKoreanEn : public TranslatorEnglish
-{
- public:
- virtual QCString idLanguage()
- { return "korean-en"; }
- virtual QCString latexLanguageSupportCommand()
- {
- return "\\usepackage{hfont}\n";
- }
- /*! returns the name of the package that is included by LaTeX */
- virtual QCString idLanguageCharset()
- {
- return "euc-kr";
- }
- virtual QCString trRTFansicp()
- {
- return "949";
- }
-
- /*! Used as ansicpg for RTF fcharset
- * \see trRTFansicp() for a table of possible values.
- */
- virtual QCString trRTFCharSet()
- {
- return "129";
- }
-};
-
-#endif
diff --git a/src/translator_kr.h b/src/translator_kr.h
deleted file mode 100644
index 7c0ecb0..0000000
--- a/src/translator_kr.h
+++ /dev/null
@@ -1,1560 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 TRANSLATOR_KR_H
-#define TRANSLATOR_KR_H
-
-/*!
- When defining a translator class for the new language, follow
- the description in the documentation. One of the steps says
- that you should copy the translator_en.h (this) file to your
- translator_xx.h new file. Your new language should use the
- Translator class as the base class. This means that you need to
- implement exactly the same (pure virtual) methods as the
- TranslatorEnglish does. Because of this, it is a good idea to
- start with the copy of TranslatorEnglish and replace the strings
- one by one.
-
- It is not necessary to include "translator.h" or
- "translator_adapter.h" here. The files are included in the
- language.cpp correctly. Not including any of the mentioned
- files frees the maintainer from thinking about whether the
- first, the second, or both files should be included or not, and
- why. This holds namely for localized translators because their
- base class is changed occasionaly to adapter classes when the
- Translator class changes the interface, or back to the
- Translator class (by the local maintainer) when the localized
- translator is made up-to-date again.
-*/
-
-/*
- Ãʱâ ÀÛ¾÷ÀÚ: ryk
- TODO ÁÖ¼®À» º¸¸é 11/22/01, doxygen ¹öÀü 1.2.11±îÁö ¼ö°íÇØ ÁֽŠ°Í °°½À´Ï´Ù.
- ÃÖ±Ù °»½ÅÀÚ: Astromaker(http://ngps.net/)
- gpgiki(http://www.gpgstudy.com/gpgiki/)
- */
-
-//
-// Update:
-//
-// 2004.12.22 (SooYoung Jung: jung5000 at gmail.com)
-// - LaTex and RTF were not generated correctly.
-// Corrected trRTFansicp and trRTFCharSet.
-// It was wrong.
-// - Adapting 1.3.9 and added "new since 1.3.9"
-// - Çؼ®ÀÌ À߸øµÈ ºÎºÐÀÌ ²Ò³ª ÀÖ¾î º¸ÀÓ..
-//
-// 2005.02.11 (SooYoung Jung: jung5000 at gmail.com)
-// - ½Ç¼ö·Î Ãß°¡µÇ¾ú´ø decode ÇÔ¼ö »èÁ¦
-//
-// 2005.03.11 (SooYoung Jung: jung5000 at gmail.com)
-// - Adapting 1.4.1 and checked using translator.py
-// - ÀϺΠ¹ø¿ª¾ÈµÈ ºÎºÐ ¼öÁ¤ (Translated little bit of untranslated part)
-// - Removed following
-// Obsolete methods (should be removed, never used):
-// virtual QCString trHeaderFilesDescription()
-// virtual QCString trField(bool first_capital, bool singular)
-// virtual QCString trPackageDocumentation()
-// virtual QCString trSources()
-// virtual QCString trReimplementedForInternalReasons()
-// virtual QCString trInterfaces()
-// virtual QCString trHeaderFiles()
-// virtual QCString trBugsAndLimitations()
-// virtual QCString trEnumerationValueDocumentation()
-// virtual QCString trNoDescriptionAvailable()
-// - Changed the base class to Translator from Translator_1_4_1
-//
-
-
-class TranslatorKorean : public Translator
-{
- private:
-
- public:
-
- // --- Language control methods -------------------
-
- /*! Used for identification of the language. The identification
- * should not be translated. It should be replaced by the name
- * of the language in English using lower-case characters only
- * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
- * the identification used in language.cpp.
- */
- virtual QCString idLanguage()
- { return "korean"; }
-
- /*! Used to get the LaTeX command(s) for the language support.
- * This method should return string with commands that switch
- * LaTeX to the desired language. For example
- * <pre>"\\usepackage[german]{babel}\n"
- * </pre>
- * or
- * <pre>"\\usepackage{polski}\n"
- * "\\usepackage[latin2]{inputenc}\n"
- * "\\usepackage[T1]{fontenc}\n"
- * </pre>
- *
- * The English LaTeX does not use such commands. Because of this
- * the empty string is returned in this implementation.
- */
- virtual QCString latexLanguageSupportCommand()
- {
- // I'm not sure what this should be.
- // When I figure it out, I'll update this.
- //see http://www.ktug.or.kr/jsboard/read.php?table=operate&no=4422&page=1
- return "\\usepackage{hfont}\n";
- }
-
- /*! return the language charset. This will be used for the HTML output */
- virtual QCString idLanguageCharset()
- {
- return "euc-kr";
- }
-
- // --- Language translation methods -------------------
-
- /*! used in the compound documentation before a list of related functions. */
- virtual QCString trRelatedFunctions()
- { return "°ü·ÃµÈ ÇÔ¼ö"; }
-
- /*! subscript for the related functions. */
- virtual QCString trRelatedSubscript()
- { return "°ü·ÃÁÖ¼®"; }
-
- /*! header that is put before the detailed description of files, classes and namespaces. */
- virtual QCString trDetailedDescription()
- { return "¼¼ºÎ »çÇ×"; }
-
- /*! header that is put before the list of typedefs. */
- virtual QCString trMemberTypedefDocumentation()
- { return "¸â¹ö ŸÀÔÁ¤ÀÇ ¹®¼­È­"; }
-
- /*! header that is put before the list of enumerations. */
- virtual QCString trMemberEnumerationDocumentation()
- { return "¸â¹ö ¿­°ÅÇü ¹®¼­È­"; }
-
- /*! header that is put before the list of member functions. */
- virtual QCString trMemberFunctionDocumentation()
- { return "¸â¹ö ÇÔ¼ö ¹®¼­È­"; }
-
- /*! header that is put before the list of member attributes. */
- virtual QCString trMemberDataDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "¸â¹ö º¯¼ö ¹®¼­È­";
- }
- else
- {
- return "¸â¹ö º¯¼ö ¹®¼­È­";
- }
- }
-
- /*! this is the text of a link put after brief descriptions. */
- virtual QCString trMore()
- { return "¼¼ºÎ »çÇ× º¸±â"; }
-
- /*! put in the class documentation */
- virtual QCString trListOfAllMembers()
- { return "Àüü ¸â¹ö ¸ñ·Ï º¸±â"; }
-
- /*! used as the title of the "list of all members" page of a class */
- virtual QCString trMemberList()
- { return "¸â¹ö(¸â¹öÇÔ¼ö, ¸â¹öº¯¼ö µî) ¸ñ·Ï"; }
-
- /*! this is the first part of a sentence that is followed by a class name */
- virtual QCString trThisIsTheListOfAllMembers()
- { return "¸ðµç ¸â¹ö(¸â¹öÇÔ¼ö, ¸â¹öº¯¼ö µî) ¸ñ·Ï " ; }
-
- /*! this is the remainder of the sentence after the class name */
- virtual QCString trIncludingInheritedMembers()
- { return ", »ó¼Ó¹ÞÀº ¸ðµç ¸â¹öµµ Æ÷ÇÔ"; }
-
- /*! 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="";
- if (s) result+=(QCString)s+"¿¡ ";
- result += "¼Ò½º ÄÚµå·Î ºÎÅÍ Doxygen¿¡ ÀÇÇØ ÀÚµ¿À¸·Î »ý¼º";
- return result;
- }
-
- /*! put after an enum name in the list of all members */
- virtual QCString trEnumName()
- { return "¿­°ÅÇü À̸§"; }
-
- /*! put after an enum value in the list of all members */
- virtual QCString trEnumValue()
- { return "¿­°ÅÇü °ª"; }
-
- /*! put after an undocumented member in the list of all members */
- virtual QCString trDefinedIn()
- { return "¿¡¼­ Á¤ÀÇ"; }
-
- // 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 "¸ðµâ"; }
-
- /*! This is put above each page as a link to the class hierarchy */
- virtual QCString trClassHierarchy()
- { return "Ŭ·¡½º °èÅëµµ"; } // "Ŭ·¡½º Á¶Á÷" or "Ŭ·¡½º ºÐ·ùü°è"
-
- /*! This is put above each page as a link to the list of annotated classes */
- virtual QCString trCompoundList()
- {
- //Alternate text: "È¥ÇÕ ¸ñ·Ï", "ÇÕ¼º(ÁýÇÕ) ¸í´Ü(¸®½ºÆ®)"
- return "º¹ÇÕ±¸Á¶(Ŭ·¡½º, ±¸Á¶Ã¼, °ø¿ëü)";
- }
-
- /*! This is put above each page as a link to the list of documented files */
- virtual QCString trFileList()
- { return "ÆÄÀÏ ¸ñ·Ï"; } //"ÆÄÀÏ ¸ñ·Ï", "ÆÄÀÏ ¸®½ºÆ®"
-
- /*! This is put above each page as a link to all members of compounds. */
- virtual QCString trCompoundMembers()
- {
- // Alternate text: "ÇÕ¼º(ÁýÇÕ) ¸í´Ü(¸â¹öµé)"
- return "º¹ÇÕ±¸Á¶(Ŭ·¡½º, ±¸Á¶Ã¼, °ø¿ëü) ¸â¹ö";
- }
-
- /*! This is put above each page as a link to all members of files. */
- virtual QCString trFileMembers()
- {
- return "ÆÄÀÏ ¸â¹ö";
- }
-
- /*! This is put above each page as a link to all related pages. */
- virtual QCString trRelatedPages()
- { return "°ü·ÃµÈ ÆäÀÌÁö"; }
-
- /*! This is put above each page as a link to all examples. */
- virtual QCString trExamples()
- { return "¿¹Á¦"; }
-
- /*! This is put above each page as a link to the search engine. */
- virtual QCString trSearch()
- { return "°Ë»ö"; }
-
- /*! This is an introduction to the class hierarchy. */
- virtual QCString trClassHierarchyDescription()
- { return "ÀÌ »ó¼Ó ¸ñ·ÏÀº ¾ËÆĺª ¼øÀ¸·Î Á¤·ÄµÇ¾îÀÖ½À´Ï´Ù. (¿ÏÀüÇÏÁö´Â ¾ÊÀ½)";}
-
- /*! This is an introduction to the list with all files. */
- virtual QCString trFileListDescription(bool extractAll)
- {
- QCString result="´ÙÀ½Àº °£·«ÇÑ ¼³¸íÀ» °¡Áø ";
- if (!extractAll) result+="¹®¼­È­µÈ ";
- result+="¸ðµç ÆÄÀÏ¿¡ ´ëÇÑ ¸ñ·ÏÀÔ´Ï´Ù.";
- return result;
- }
-
- /*! This is an introduction to the annotated compound list. */
- virtual QCString trCompoundListDescription()
- {
- return "´ÙÀ½Àº °£·«ÇÑ ¼³¸íÀ» °¡Áø Ŭ·¡½º, "
- "±¸Á¶Ã¼, °ø¿ëü, ÀÎÅÍÆäÀ̽ºÀÇ ¸ñ·ÏÀÔ´Ï´Ù.";
- }
-
- /*! This is an introduction to the page with all class members. */
- virtual QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result="´ÙÀ½Àº ¹®¼­È­µÈ ¸ðµç Ŭ·¡½º, ±¸Á¶Ã¼, °ø¿ëü ¸â¹ö¿¡ ´ëÇÑ ¸ñ·ÏÀÔ´Ï´Ù. ";
- if (!extractAll)
- {
- result+="¹®¼­È­µÈ ";
- }
-
- result+="¸µÅ© µÈ Ŭ·¡½º ¸â¹ö´Â ";
-
- if (extractAll)
- result+="±× ¸â¹ö¿¡ ´ëÇÑ Å¬·¡½º ¹®¼­È­·Î °©´Ï´Ù.";
- else
- result+="ÀÌÇÏ·Î ¼ÓÇÑ Å¬·¡½º:";
- return result;
- }
-
- /*! This is an introduction to the page with all file members. */
- virtual QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="´ÙÀ½Àº ¹®¼­È­µÈ ¸ðµç ÆÄÀÏ¿¡ ´ëÇÑ ¸ñ·ÏÀÔ´Ï´Ù. ";
- if (!extractAll) result+="¹®¼­È­µÈ ";
- result+="¸µÅ© µÈ ÆÄÀÏ ¸â¹ö´Â ";
- if (extractAll)
- result+="±× ¸â¹ö¿¡ ´ëÇÑ ÆÄÀÏ ¹®¼­È­·Î °©´Ï´Ù.";
- else
- result+="±×µéÀÌ ¼ÓÇØÀÖ´Â ÆÄÀÏ·Î °©´Ï´Ù.";
- return result;
- }
-
- /*! This is an introduction to the page with the list of all examples */
- virtual QCString trExamplesDescription()
- { return "´ÙÀ½Àº ¸ðµç ¿¹Á¦ÀÇ ¸ñ·ÏÀÔ´Ï´Ù."; }
-
- /*! This is an introduction to the page with the list of related pages */
- virtual QCString trRelatedPagesDescription()
- { return "´ÙÀ½Àº ¸ðµç °ü·ÃµÈ ¹®¼­È­ ÆäÀÌÁöÀÇ ¸ñ·ÏÀÔ´Ï´Ù."; }
-
- /*! This is an introduction to the page with the list of class/file groups */
- virtual QCString trModulesDescription()
- { return "´ÙÀ½Àº ¸ðµç ¸ðµâÀÇ ¸ñ·ÏÀÔ´Ï´Ù."; }
-
- // index titles (the project name is prepended for these)
-
- /*! This is used in HTML as the title of index.html. */
- virtual QCString trDocumentation()
- { return "¹®¼­È­"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all groups.
- */
- virtual QCString trModuleIndex()
- { return "¸ðµâ »öÀÎ"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * class hierarchy.
- */
- virtual QCString trHierarchicalIndex()
- { return "ºÐ·ùü°è »öÀÎ"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * annotated compound index.
- */
- virtual QCString trCompoundIndex()
- { return "º¹ÇÕ±¸Á¶(Ŭ·¡½º, ±¸Á¶Ã¼, °ø¿ëü) »öÀÎ"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * list of all files.
- */
- virtual QCString trFileIndex()
- { return "ÆÄÀÏ »öÀÎ"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all groups.
- */
- virtual QCString trModuleDocumentation()
- { return "¸ðµâ ¹®¼­È­"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all classes, structs and unions.
- */
- virtual QCString trClassDocumentation()
- { return "Ŭ·¡½º ¹®¼­È­"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all files.
- */
- virtual QCString trFileDocumentation()
- { return "ÆÄÀÏ ¹®¼­È­"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all examples.
- */
- virtual QCString trExampleDocumentation()
- { return "¿¹Á¦ ¹®¼­È­"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all related pages.
- */
- virtual QCString trPageDocumentation()
- { return "ÆäÀÌÁö ¹®¼­È­"; }
-
- /*! This is used in LaTeX as the title of the document */
- virtual QCString trReferenceManual()
- { return "Âü°í¼­"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of defines
- */
- virtual QCString trDefines()
- { return "¸ÅÅ©·Î, #define"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of function prototypes
- */
- virtual QCString trFuncProtos()
- { return "ÇÔ¼ö ¿øÇü"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of typedefs
- */
- virtual QCString trTypedefs()
- { return "ŸÀÔ Á¤ÀÇ"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of enumerations
- */
- virtual QCString trEnumerations()
- { return "¿­°ÅÇü"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) functions
- */
- virtual QCString trFunctions()
- { return "ÇÔ¼ö"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trVariables()
- { return "º¯¼ö"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trEnumerationValues()
- { return "¿­°ÅÇü °ª"; }
-
- /*! This is used in the documentation of a file before the list of
- * documentation blocks for defines
- */
- virtual QCString trDefineDocumentation()
- { return "#define ¹®¼­È­"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for function prototypes
- */
- virtual QCString trFunctionPrototypeDocumentation()
- { return "ÇÔ¼ö ¿øÇü ¹®¼­È­"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for typedefs
- */
- virtual QCString trTypedefDocumentation()
- { return "ŸÀÔ Á¤ÀÇ ¹®¼­È­"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration types
- */
- virtual QCString trEnumerationTypeDocumentation()
- { return "¿­°ÅÇü ŸÀÔ ¹®¼­È­"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for functions
- */
- virtual QCString trFunctionDocumentation()
- { return "ÇÔ¼ö ¹®¼­È­"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for variables
- */
- virtual QCString trVariableDocumentation()
- { return "º¯¼ö ¹®¼­È­"; }
-
- /*! This is used in the documentation of a file/namespace/group before
- * the list of links to documented compounds
- */
- virtual QCString trCompounds()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "µ¥ÀÌÅÍ ±¸Á¶";
- }
- else
- {
- return "Ŭ·¡½º";
- }
- }
-
- /*! 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="";
- if (projName) result+=(QCString)projName+" ¹®¼­È­. ";
- result += "»ý¼ºÀϽà : " +(QCString)date;
- return result;
- }
- /*! This is part of the sentence used in the standard footer of each page.
- */
- virtual QCString trWrittenBy()
- {
- return "ÀÛ¼ºÀÚ: ";
- }
-
- /*! this text is put before a class diagram */
- virtual QCString trClassDiagram(const char *clName)
- {
- return (QCString)clName+"¿¡ ´ëÇÑ »ó¼Ó µµÇ¥";
- }
-
- /*! this text is generated when the \\internal command is used. */
- virtual QCString trForInternalUseOnly()
- { return "³»ºÎ »ç¿ë¸¸À» À§ÇØ"; }
-
- /*! this text is generated when the \\warning command is used. */
- virtual QCString trWarning()
- { return "°æ°í"; }
-
- /*! this text is generated when the \\version command is used. */
- virtual QCString trVersion()
- { return "¹öÀü"; }
-
- /*! this text is generated when the \\date command is used. */
- virtual QCString trDate()
- { return "³¯Â¥"; }
-
- /*! this text is generated when the \\return command is used. */
- virtual QCString trReturns()
- { return "¹Ýȯ°ª"; }
-
- /*! this text is generated when the \\sa command is used. */
- virtual QCString trSeeAlso()
- { return "ÂüÁ¶"; }
-
- /*! this text is generated when the \\param command is used. */
- virtual QCString trParameters()
- { return "¸Å°³º¯¼ö"; }
-
- /*! this text is generated when the \\exception command is used. */
- virtual QCString trExceptions()
- { return "¿¹¿Ü"; }
-
- /*! this text is used in the title page of a LaTeX document. */
- virtual QCString trGeneratedBy()
- { return "¿¡ ÀÇÇØ »ý¼ºµÈ"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of page containing all the index of all namespaces. */
- virtual QCString trNamespaceList()
- { return "namespace ¸ñ·Ï"; }
-
- /*! used as an introduction to the namespace list */
- virtual QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="´ÙÀ½Àº °£·«ÇÑ ¼³¸íÀ» °¡Áø ";
- if (!extractAll) result+="¹®¼­È­µÈ ";
- result+="namespaceÀÇ ¸ñ·ÏÀÔ´Ï´Ù.";
- return result;
- }
-
- /*! used in the class documentation as a header before the list of all
- * friends of a class
- */
- virtual QCString trFriends()
- { return "Friends"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in the class documentation as a header before the list of all
- * related classes
- */
- virtual QCString trRelatedFunctionDocumentation()
- { return "friend, ±×¸®°í °ü·ÃµÈ ÇÔ¼ö ¹®¼­È­"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of the HTML page of a class/struct/union */
- virtual QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- {
- QCString result=(QCString)clName+" ";
- if (isTemplate) result+=" ÅÛÇø´";
- switch(compType)
- {
- case ClassDef::Class: result+=" Ŭ·¡½º"; break;
- case ClassDef::Struct: result+=" ±¸Á¶Ã¼"; break;
- case ClassDef::Union: result+=" °ø¿ëü"; break;
- case ClassDef::Interface: result+=" ÀÎÅÍÆäÀ̽º"; break;
- case ClassDef::Protocol: result+=" ÇÁ·ÎÅäÄÝ"; break;
- case ClassDef::Category: result+=" Ä«Å×°í¸®"; break;
- case ClassDef::Exception: result+=" ¿¹¿Ü"; break;
- }
- if (isTemplate) result+=" ÅÛÇø´";
- result+=" ÂüÁ¶";
- return result;
- }
-
- /*! used as the title of the HTML page of a file */
- virtual QCString trFileReference(const char *fileName)
- {
- QCString result=fileName;
- result+=" ÆÄÀÏ ÂüÁ¶";
- return result;
- }
-
- /*! used as the title of the HTML page of a namespace */
- virtual QCString trNamespaceReference(const char *namespaceName)
- {
- QCString result=namespaceName;
- result+=" namespace ÂüÁ¶";
- return result;
- }
-
- virtual QCString trPublicMembers()
- { return "public ¸Þ¼Òµå"; }
- virtual QCString trPublicSlots()
- { return "public slots"; }
- virtual QCString trSignals()
- { return "½ÅÈ£"; }
- virtual QCString trStaticPublicMembers()
- { return "static public ¸Þ¼Òµå"; }
- virtual QCString trProtectedMembers()
- { return "protected ¸Þ¼Òµå"; }
- virtual QCString trProtectedSlots()
- { return "protected slots"; }
- virtual QCString trStaticProtectedMembers()
- { return "static protected ¸Þ¼Òµå"; }
- virtual QCString trPrivateMembers()
- { return "private ¸Þ¼Òµå"; }
- virtual QCString trPrivateSlots()
- { return "private slots"; }
- virtual QCString trStaticPrivateMembers()
- { return "static private ¸Þ¼Òµå"; }
-
- /*! this function is used to produce a comma-separated list of items.
- * use generateMarker(i) to indicate where item i should be put.
- */
- virtual QCString trWriteList(int numEntries)
- {
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=", °ú ";
- }
- }
- return result;
- }
-
- /*! used in class documentation to produce a list of base classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritsList(int numEntries)
- {
- return trWriteList(numEntries)+" µéÀ» »ó¼ÓÇÏ´Ù.";
- }
-
- /*! used in class documentation to produce a list of super classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritedByList(int numEntries)
- {
- return 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 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 trWriteList(numEntries)+"¿¡¼­ À籸ÇöµÇ¾ú½À´Ï´Ù.";
- }
-
- /*! This is put above each page as a link to all members of namespaces. */
- virtual QCString trNamespaceMembers()
- { return "namespace ¸â¹ö"; }
-
- /*! This is an introduction to the page with all namespace members */
- virtual QCString trNamespaceMemberDescription(bool extractAll)
- {
- QCString result="´ÙÀ½Àº ¸ðµç ";
- if (!extractAll) result+="¹®¼­È­µÈ ";
- result+="namespace ¸â¹öÀÇ ¸ñ·ÏÀÔ´Ï´Ù. ";
- if (extractAll)
- result+="°¢ ¸â¹ö¿¡ ´ëÇÑ ¹®¼­È­ÀÇ ";
- else
- result+="¼ÓÇØÀÖ´Â namespaceÀÇ ";
- result+="¸µÅ©µµ ÀÖ½À´Ï´Ù.";
- return result;
- }
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all namespaces.
- */
- virtual QCString trNamespaceIndex()
- { return "namespace »öÀÎ"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all namespaces.
- */
- virtual QCString trNamespaceDocumentation()
- { return "namespace ¹®¼­È­"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- virtual QCString trNamespaces()
- { return "Namespaces"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990728
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is put at the bottom of a class documentation page and is
- * followed by a list of files that were used to generate the page.
- */
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)"ÀÌ ";
- switch(compType)
- {
- case ClassDef::Class: result+="Ŭ·¡½º"; break;
- case ClassDef::Struct: result+="±¸Á¶Ã¼"; break;
- case ClassDef::Union: result+="°ø¿ëü"; break;
- case ClassDef::Interface: result+="ÀÎÅÍÆäÀ̽º"; break;
- case ClassDef::Protocol: result+="ÇÁ·ÎÅäÄÝ"; break;
- case ClassDef::Category: result+="Ä«Å×°í¸®"; break;
- case ClassDef::Exception: result+="¿¹¿Ü"; break;
- }
- result+="À» À§ÇÑ ¹®¼­È­´Â ´ÙÀ½ÀÇ ÆÄÀÏ";
- if (!single) result+="µé";
- result+="·ÎºÎÅÍ »ý¼ºµÇ¾ú½À´Ï´Ù.";
- return result;
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- virtual QCString trAlphabeticalList()
- { return "¾ËÆĺª¼ø ¸ñ·Ï"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- virtual QCString trReturnValues()
- { return "¹Ýȯ°ª"; }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- virtual QCString trMainPage()
- { return "¸ÞÀÎ ÆäÀÌÁö"; }
-
- /*! 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 "ÆäÀÌÁö"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991003
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDefinedAtLineInSourceFile()
- {
- return "@1 ÆÄÀÏÀÇ @0 ¹ø° ¶óÀο¡¼­ Á¤ÀÇ";
- }
- virtual QCString trDefinedInSourceFile()
- {
- return "@0 ÆÄÀÏ¿¡¼­ Á¤ÀÇ";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDeprecated()
- {
- return "Deprecated";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- virtual QCString trCollaborationDiagram(const char *clName)
- {
- return (QCString)clName+"¿¡ ´ëÇÑ Çù·Â µµÇ¥:";
- }
- /*! this text is put before an include dependency graph */
- virtual QCString trInclDepGraph(const char *fName)
- {
- return (QCString)fName+"¿¡ ´ëÇÑ include ÀÇÁ¸ ±×·¡ÇÁ";
- }
- /*! header that is put before the list of constructor/destructors. */
- virtual QCString trConstructorDocumentation()
- {
- return "»ý¼ºÀÚ & ¼Ò¸êÀÚ ¹®¼­È­";
- }
- /*! Used in the file documentation to point to the corresponding sources. */
- virtual QCString trGotoSourceCode()
- {
- return "ÀÌ ÆÄÀÏ¿¡ ´ëÇÑ ¼Ò½º ÄÚµå º¸±â";
- }
- /*! Used in the file sources to point to the corresponding documentation. */
- virtual QCString trGotoDocumentation()
- {
- return "ÀÌ ÆÄÀÏÀÇ ¹®¼­È­ º¸±â";
- }
- /*! Text for the \\pre command */
- virtual QCString trPrecondition()
- {
- return "ÀüÁ¦ Á¶°Ç";
- }
- /*! Text for the \\post command */
- virtual QCString trPostcondition()
- {
- return "ÈÄ¹Ì Á¶°Ç"; //Alternate: "ÈÄÄ¡Á¶°Ç"
- }
- /*! Text for the \\invariant command */
- virtual QCString trInvariant()
- {
- return "º¯ÇÏÁö ¾Ê´Â";
- }
- /*! Text shown before a multi-line variable/enum initialization */
- virtual QCString trInitialValue()
- {
- return "ÃʱⰪ";
- }
- /*! Text used the source code in the file index */
- virtual QCString trCode()
- {
- return "ÄÚµå";
- }
- virtual QCString trGraphicalHierarchy()
- {
- return "µµÇ¥·ÎµÈ Ŭ·¡½º ºÐ·ùü°è"; // "µµÇ¥ÀÇ Å¬·¡½º Á¶Á÷"
- }
- virtual QCString trGotoGraphicalHierarchy()
- {
- return "µµÇ¥·ÎµÈ Ŭ·¡½º ºÐ·ùü°è º¸±â"; // "µµÇ¥ÀÇ Å¬·¡½º Á¶Á÷À¸·Î °¡½Ã¿À"
- }
- virtual QCString trGotoTextualHierarchy()
- {
- return "¹®ÀÚ·ÎµÈ Å¬·¡½º ºÐ·ùü°è º¸±â"; // "¹®ÀÚÀÇ Å¬·¡½º Á¶Á÷À¸·Î °¡½Ã¿À"
- }
- virtual QCString trPageIndex()
- {
- return "ÆäÀÌÁö »öÀÎ";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trNote()
- {
- return "³ëÆ®";
- }
- virtual QCString trPublicTypes()
- {
- return "public ŸÀÔ";
- }
- virtual QCString trPublicAttribs()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "µ¥ÀÌŸ Çʵå";
- }
- else
- {
- return "public ¼Ó¼º";
- }
- }
- virtual QCString trStaticPublicAttribs()
- {
- return "static public ¼Ó¼º";
- }
- virtual QCString trProtectedTypes()
- {
- return "protected ŸÀÔ";
- }
- virtual QCString trProtectedAttribs()
- {
- return "protected ¼Ó¼º";
- }
- virtual QCString trStaticProtectedAttribs()
- {
- return "static protected ¼Ó¼º";
- }
- virtual QCString trPrivateTypes()
- {
- return "private ŸÀÔ";
- }
- virtual QCString trPrivateAttribs()
- {
- return "private ¼Ó¼º";
- }
- virtual QCString trStaticPrivateAttribs()
- {
- return "static private ¼Ó¼º";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\todo item */
- virtual QCString trTodo()
- {
- return "Todo";
- }
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- {
- return "Todo ¸ñ·Ï";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy()
- {
- return "ÂüÁ¶ÇÏ´Â °÷";
- }
- virtual QCString trRemarks()
- {
- return "¼³¸í";
- }
- virtual QCString trAttention()
- {
- return "ÁÖÀÇ";
- }
- virtual QCString trInclByDepGraph()
- {
- return " ÀÌ ±×·¡ÇÁ´Â ÀÌ ÆÄÀÏÀ» Á÷Á¢ ¶Ç´Â °£Á¢ÀûÀ¸·Î"
- "Æ÷ÇÔ(include)ÇÔÀ» ³ªÅ¸³½´Ù:";
- }
- virtual QCString trSince()
- {
- return "¾ðÁ¦ºÎÅÍ: "; // TODO: Need to be translated. -ryk11/22/01.
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- virtual QCString trLegendTitle()
- {
- return "¹ü·Ê";
- }
- /*! 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()
- {
- // TODO: Need to be translated. -ryk11/22/01.
- return
- "Doxygen¿¡ ÀÇÇØ »ý¼ºµÈ µµÇ¥¸¦ º¸±âÀ§ÇÑ ¼³¸íÀÔ´Ï´Ù.<p>\n"
- //"This page explains how to interpret the graphs that are generated "
- //"by doxygen.<p>\n"
- "´ÙÀ½ÀÇ ¿¹Á¦¸¦ Âü°íÇϼ¼¿ä.\n"
- //"Consider the following example:\n"
- "\\code\n"
- "/*! Invisible class because of truncation */\n"
- "class Invisible { };\n\n"
- "/*! Truncated class, inheritance relation is hidden */\n"
- "class Truncated : public Invisible { };\n\n"
- "/* Class not documented with doxygen comments */\n"
- "class Undocumented { };\n\n"
- "/*! Class that is inherited using public inheritance */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! A template class */\n"
- "template<class T> class Templ { };\n\n"
- "/*! Class that is inherited using protected inheritance */\n"
- "class ProtectedBase { };\n\n"
- "/*! Class that is inherited using private inheritance */\n"
- "class PrivateBase { };\n\n"
- "/*! Class that is used by the Inherited class */\n"
- "class Used { };\n\n"
- "/*! Super class that inherits a number of other 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"
- "¼³Á¤ ÆÄÀÏÀÇ MAX_DOT_GRAPH_HEIGHT Ç÷¡±×°¡ 240À¸·Î ¼³Á¤µÇ¾ú´Ù¸é ´ÙÀ½ÀÇ ±×·¡ÇÁ°¡ ³ª¿Ã °ÍÀÌ´Ù."
- //"If the \\c MAX_DOT_GRAPH_HEIGHT tag in the configuration file "
- //"is set to 240 this will result in the following graph:"
- "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
- "»óÀÚµéÀº ´ÙÀ½À» ¶æÇÑ´Ù.\n"
- //"The boxes in the above graph have the following meaning:\n"
- "<ul>\n"
- "<li>%°ËÀº »óÀÚ´Â ±×·¡ÇÁ¸¦ »êÃâÇÑ ±¸Á¶Ã¼³ª Ŭ·¡½º¸¦ ¸»ÇÑ´Ù.\n"
- //"<li>%A filled black box represents the struct or class for which the "
- //"graph is generated.\n"
- "<li>%°ËÀº¼±À¸·ÎµÈ »óÀÚ´Â ¹®¼­È­µÈ ±¸Á¶Ã¼³ª Ŭ·¡½º¸¦ Ç¥½ÃÇÑ´Ù.\n"
- //"<li>%A box with a black border denotes a documented struct or class.\n"
- "<li>%ȸ»ö¼±À¸·ÎµÈ »óÀÚ´Â ¹®¼­È­µÇÁö ¾ÊÀº ±¸Á¶Ã¼³ª Ŭ·¡½º¸¦ Ç¥½ÃÇÑ´Ù.\n"
- //"<li>%A box with a grey border denotes an undocumented struct or class.\n"
- "<li>%»¡°£¼±À¸·ÎµÈ »óÀÚ´Â ¸ðµç »ó¼Ó/containment °ü°è¸¦ º¸ÀÌÁö ¾ÊÀº ¹®¼­È­µÈ ±¸Á¶Ã¼³ª Ŭ·¡½º¸¦ ³ªÅ¸³½´Ù. "
- "ÁöÁ¤µÈ °æ°è¾È¿¡ µé¾î°¡Áö ¾ÊÀ¸¸é ±×·¡ÇÁ´Â ©·ÁÁø´Ù.\n"
- //"<li>%A box with a red border denotes a documented struct or class for"
- //"which not all inheritance/containment relations are shown. %A graph is "
- //"truncated if it does not fit within the specified boundaries.\n"
- "</ul>\n"
- "È­»ìÇ¥´Â ´ÙÀ½À» ¶æÇÑ´Ù.\n"
- //"The arrows have the following meaning:\n"
- "<ul>\n"
- "<li>%¾îµÎ¿î ÆĶõ È­»ìÇ¥´Â µÎ Ŭ·¡½º°£ÀÇ public »ó¼Ó°ü°è¸¦ ³ªÅ¸³½´Ù.\n"
- //"<li>%A dark blue arrow is used to visualize a public inheritance "
- //"relation between two classes.\n"
- "<li>%¾îµÎ¿î ³ì»ö È­»ìÇ¥´Â protected »ó¼Ó°ü°è¸¦ ³ªÅ¸³½´Ù.\n"
- //"<li>%A dark green arrow is used for protected inheritance.\n"
- "<li>%¾îµÎ¿î »¡°­ È­»ìÇ¥´Â private »ó¼Ó°ü°è¸¦ ³ªÅ¸³½´Ù.\n"
- //"<li>%A dark red arrow is used for private inheritance.\n"
- "<li>%¹àÀº ÀÚÁÖ»ö È­»ìÇ¥´Â Ŭ·¡½º¿¡ ÀÇÇØ Æ÷ÇԵǴõ³ª »ç¿ëµÈ Ŭ·¡½º¸¦ ³ªÅ¸³½´Ù. "
- "ÀÌ È­»ìÇ¥ÀÇ ¶óº§Àº Á¢±Ù °¡´ÉÇÑ º¯¼ö¸íÀ» ³ªÅ¸³½´Ù.\n"
- //"<li>%A purple dashed arrow is used if a class is contained or used "
- //"by another class. The arrow is labeled with the variable(s) "
- //"through which the pointed class or struct is accessible.\n"
- "<li>%¹àÀº ³ë¶û»ö È­»ìÇ¥´Â ÅÛÇø´ ÀνºÅϽº¿Í ÅÛÇø´ Ŭ·¡½º¸¦ ³ªÅ¸³½´Ù. "
- "ÀÌ È­»ìÇ¥ÀÇ ¶óº§Àº ±× ÀνºÅϽºÀÇ ÅÛÇø´ ¸Å°³º¯¼ö¸¦ ³ªÅ¸³½´Ù.\n"
- //"<li>%A yellow dashed arrow denotes a relation between a template instance and "
- //"the template class it was instantiated from. The arrow is labeled with "
- //"the template parameters of the instance.\n"
- "</ul>\n";
- }
- /*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return "¹ü·Ê";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return "Å×½ºÆ®";
- }
- /*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return "Å×½ºÆ® ¸ñ·Ï";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return "DCOP ¸Þ¼Òµå"; // TODO: Need to be translated. -ryk11/22/01.
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return "¼Ó¼º";
- }
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return "¼Ó¼º ¹®¼­È­";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "µ¥ÀÌÅÍ ±¸Á¶";
- }
- else
- {
- return "Ŭ·¡½º";
- }
- }
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
- {
- return (QCString)"ÆÐÅ°Áö "+name;
- }
- /*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return "ÆÐÅ°Áö ¸ñ·Ï";
- }
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return "´ÙÀ½Àº °£·«ÇÑ ¼³¸íÀ» °¡Áø ÆÐÅ°ÁöÀÌ´Ù.";
- }
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return "ÆÐÅ°Áö";
- }
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return "°ª:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return "¹ö±×";
- }
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return "¹ö±× ¸ñ·Ï";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as ansicpg for RTF file
- *
- * The following table shows the correlation of Charset name, Charset Value and
- * <pre>
- * Codepage number:
- * Charset Name Charset Value(hex) Codepage number
- * ------------------------------------------------------
- * DEFAULT_CHARSET 1 (x01)
- * SYMBOL_CHARSET 2 (x02)
- * OEM_CHARSET 255 (xFF)
- * ANSI_CHARSET 0 (x00) 1252
- * RUSSIAN_CHARSET 204 (xCC) 1251
- * EE_CHARSET 238 (xEE) 1250
- * GREEK_CHARSET 161 (xA1) 1253
- * TURKISH_CHARSET 162 (xA2) 1254
- * BALTIC_CHARSET 186 (xBA) 1257
- * HEBREW_CHARSET 177 (xB1) 1255
- * ARABIC _CHARSET 178 (xB2) 1256
- * SHIFTJIS_CHARSET 128 (x80) 932
- * HANGEUL_CHARSET 129 (x81) 949
- * GB2313_CHARSET 134 (x86) 936
- * CHINESEBIG5_CHARSET 136 (x88) 950
- * </pre>
- *
- */
- virtual QCString trRTFansicp()
- {
- return "949";
- }
-
-
- /*! Used as ansicpg for RTF fcharset
- * \see trRTFansicp() for a table of possible values.
- */
- virtual QCString trRTFCharSet()
- {
- return "129";
- }
-
- /*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return "À妽º";
- }
-
- /*! 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, bool singular)
- {
- QCString result("Ŭ·¡½º");
- if (!singular) result+="µé";
- 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, bool singular)
- {
- QCString result("ÆÄÀÏ");
- if (!singular) result+="µé";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trNamespace(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Namespace" : "namespace"));
- if (!singular) result+="s";
- return result; // TODO: Need to be translated. -ryk11/22/01.
- }
-
- /*! 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, bool singular)
- {
- QCString result("±×·ì");
- if (!singular) result+="µé";
- 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, bool singular)
- {
- QCString result("ÆäÀÌÁö");
- if (!singular) result+="µé";
- 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 ? "¸â¹ö" : "¸â¹ö"));
- if (!singular) result+="µé";
- 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 ? "Global" : "global"));
- if (!singular) result+="s";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is generated when the \\author command is used and
- * for the author section in man pages. */
- virtual QCString trAuthor(bool, bool singular)
- {
- QCString result("ÀÛ¼ºÀÚ");
- if (!singular) result+="µé";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return "ÂüÁ¶";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 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 trWriteList(numEntries)+"¿¡ ±¸ÇöµÇ¾ú´Ù.";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.16
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in RTF documentation as a heading for the Table
- * of Contents.
- */
- virtual QCString trRTFTableOfContents()
- {
- return "¸ñÂ÷";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.17
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as the header of the list of item that have been
- * flagged deprecated
- */
- virtual QCString trDeprecatedList()
- {
- return "Deprecated ¸ñ·Ï";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.18
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a header for declaration section of the events found in
- * a C# program
- */
- virtual QCString trEvents()
- {
- return "À̺¥Æ®";
- }
- /*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- return "À̺¥Æ® ¹®¼­È­";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a heading for a list of Java class types with package scope.
- */
- virtual QCString trPackageTypes()
- {
- return "ÆÐÅ°Áö ŸÀÔµé";
- }
- /*! Used as a heading for a list of Java class functions with package
- * scope.
- */
- virtual QCString trPackageMembers()
- {
- return "ÆÐÅ°Áö ÇÔ¼öµé";
- }
- /*! Used as a heading for a list of static Java class functions with
- * package scope.
- */
- virtual QCString trStaticPackageMembers()
- {
- return "Á¤Àû ÆÐÅ°Áö ÇÔ¼öµé";
- }
- /*! Used as a heading for a list of Java class variables with package
- * scope.
- */
- virtual QCString trPackageAttribs()
- {
- return "ÆÐÅ°Áö ¼Ó¼ºµé";
- }
- /*! Used as a heading for a list of static Java class variables with
- * package scope.
- */
- virtual QCString trStaticPackageAttribs()
- {
- return "Á¤Àû ÆÐÅ°Áö ¼Ó¼ºµé";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "¸ðµÎ";
- }
- /*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- return "´ÙÀ½Àº ÀÌ ÇÔ¼ö¿¡ ´ëÇÑ È£Ãâ ±×·¡ÇÁÀÔ´Ï´Ù:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! When the search engine is enabled this text is put in the header
- * of each page before the field where one can enter the text to search
- * for.
- */
- virtual QCString trSearchForIndex()
- {
- return "°Ë»ö: "; //"Search for";
- }
- /*! This string is used as the title for the page listing the search
- * results.
- */
- virtual QCString trSearchResultsTitle()
- {
- return "°Ë»ö °á°ú";//"Search Results";
- }
- /*! 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
- * the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
- * value 2 represents 2 or more matches. HTML markup is allowed inside
- * the returned string.
- */
- virtual QCString trSearchResults(int numDocuments)
- {
- if (numDocuments==0)
- {
- //return "Sorry, no documents matching your query.";
- return "Á˼ÛÇÕ´Ï´Ù. ÁúÀÇ¿Í ÀÏÄ¡ÇÏ´Â ¹®¼­°¡ ¾ø½À´Ï´Ù.";
- }
- else if (numDocuments==1)
- {
- //return "Found <b>1</b> document matching your query.";
- return "ÁúÀÇ¿Í ÀÏÄ¡ÇÏ´Â <b>1</b>°³ÀÇ ¹®¼­¸¦ ã¾Ò½À´Ï´Ù.";
- }
- else
- {
- //return "Found <b>$num</b> documents matching your query. "
- // "Showing best matches first.";
- return "ÁúÀÇ¿Í ÀÏÄ¡ÇÏ´Â <b>$num</b>°³ÀÇ ¹®¼­µéÀ» ã¾Ò½À´Ï´Ù. "
- "óÀ½¿¡ ³ª¿À´Â °ÍÀÌ °¡Àå ÀÏÄ¡ÇÏ´Â ¹®¼­ÀÔ´Ï´Ù.";
- }
- }
- /*! 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 "°á°ú:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 filename + " ¼Ò½º ÆÄÀÏ";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.9
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the name of the chapter containing the directory
- * hierarchy.
- */
- virtual QCString trDirIndex()
- { return "µð·ºÅ丮 °èÃþµµ"; }
-
- /*! This is used as the name of the chapter containing the documentation
- * of the directories.
- */
- virtual QCString trDirDocumentation()
- { return "µð·ºÅ丮 ¹®¼­"; }
-
- /*! 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 "µð·ºÅ丮"; }
-
- /*! This returns a sentences that introduces the directory hierarchy.
- * and the fact that it is sorted alphabetically per level
- */
- virtual QCString trDirDescription()
- { return "ÀÌ µð·ºÅ丮 °èÃþÀº ¾ËÆĺª ¼øÀ¸·Î Á¤·ÄµÇ¾îÀÖ½À´Ï´Ù. (¿ÏÀüÇÏÁö´Â ¾ÊÀ½)";
-
-
- }
-
- /*! 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=dirName; result+=" µð·ºÅ丮 ÂüÁ¶"; return result; }
-
- /*! 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*/)
- {
- return "µð·ºÅÍ";
- }
-
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "ÀÌ°ÍÀº Æí¸®¸¦ À§ÇØ Á¦°øµÇ´Â ¿À¹ö·Îµå ¸â¹ö ÇÔ¼öÀÌ´Ù, "
- "¾î¶² ¾Æ±Ô¸ÕÆ®(argument)°¡ ±×°ÍÀ» ¼ö¿ëÇÒ¶§ À§ ÇÔ¼ö´Â ´Ù¸£´Ù.";
-
- }
-
-
-};
-
-#endif
-
-
diff --git a/src/translator_lt.h b/src/translator_lt.h
deleted file mode 100644
index d9549d5..0000000
--- a/src/translator_lt.h
+++ /dev/null
@@ -1,1562 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2004 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.
- *
- */
-
-/* Translation from English to Lithanian by Tomas Simonaitis, Mindaugas Radzius and Aidas Berukstis
- * (haden@homelan.lt/mindaugasradzius@takas.lt/aidasber@takas.lt)
- * We tried to keep meaning close to original,
- * if you have any suggestions drop us an email
- * -------------------------------------------
- * Project start :13.May.2k4
- * Last Doxygen version covered : 1.4.3
- *
- * Revisions:
- * Updated to 1.3.9 25.Oct.2k4
- *
-*/
-
-#ifndef TRANSLATOR_LT_H
-#define TRANSLATOR_LT_H
-
-
-class TranslatorLithuanian : public Translator
-{
- public:
-
- // --- Language control methods -------------------
-
- /*! Used for identification of the language. The identification
- * should not be translated. It should be replaced by the name
- * of the language in English using lower-case characters only
- * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
- * the identification used in language.cpp.
- */
- virtual QCString idLanguage()
- { return "lithuanian"; }
-
- /*! Used to get the LaTeX command(s) for the language support.
- * This method should return string with commands that switch
- * LaTeX to the desired language. For example
- * <pre>"\\usepackage[german]{babel}\n"
- * </pre>
- * or
- * <pre>"\\usepackage{polski}\n"
- * "\\usepackage[latin2]{inputenc}\n"
- * "\\usepackage[T1]{fontenc}\n"
- * </pre>
- *
- * The English LaTeX does not use such commands. Because of this
- * the empty string is returned in this implementation.
- */
- virtual QCString latexLanguageSupportCommand()
- {
- return "";
- }
-
- /*! return the language charset. This will be used for the HTML output */
- virtual QCString idLanguageCharset()
- {
- return "iso-8859-13";
- }
-
- // --- Language translation methods -------------------
-
- /*! used in the compound documentation before a list of related functions. */
- virtual QCString trRelatedFunctions()
- { return "Susijæ Funkcijos"; }
-
- /*! subscript for the related functions. */
- virtual QCString trRelatedSubscript()
- { return "Atkreipkite dëmesá, èià ne metodai"; }
-
- /*! header that is put before the detailed description of files, classes and namespaces. */
- virtual QCString trDetailedDescription()
- { return "Smulkus apraðymas"; }
-
- /*! header that is put before the list of typedefs. */
- virtual QCString trMemberTypedefDocumentation()
- { return "Tipo Apraðymo Dokumentacija"; }
-
- /*! header that is put before the list of enumerations. */
- virtual QCString trMemberEnumerationDocumentation()
- { return "Iðvardinimo Dokumentacija"; }
-
- /*! header that is put before the list of member functions. */
- virtual QCString trMemberFunctionDocumentation()
- { return "Metodø Dokumentacija"; }
-
- /*! header that is put before the list of member attributes. */
- virtual QCString trMemberDataDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Lauko apraðymas";
- }
- else
- {
- return "Atributø Dokumentacija";
- }
- }
-
- /*! this is the text of a link put after brief descriptions. */
- virtual QCString trMore()
- { return "Daugiau..."; }
-
- /*! put in the class documentation */
- virtual QCString trListOfAllMembers()
- { return "Visø nariø sàraðas."; }
-
- /*! used as the title of the "list of all members" page of a class */
- virtual QCString trMemberList()
- { return "Nariø sàraðas"; }
-
- /*! this is the first part of a sentence that is followed by a class name */
- virtual QCString trThisIsTheListOfAllMembers()
- { return "Tai galutinis nariø sàraðas "; }
-
- /*! this is the remainder of the sentence after the class name */
- virtual QCString trIncludingInheritedMembers()
- { return ", átraukiant visus paveldëtus narius."; }
-
- /*! 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="Automatiðkai sugeneruota Doxygen árankiu";
- if (s) result+=(QCString)" "+s;
- result+=" ið programos kodo.";
- return result;
- }
-
- /*! put after an enum name in the list of all members */
- virtual QCString trEnumName()
- { return "iðvardinimo vardas"; }
-
- /*! put after an enum value in the list of all members */
- virtual QCString trEnumValue()
- { return "iðvardinimo reikðmë"; }
-
- /*! put after an undocumented member in the list of all members */
- virtual QCString trDefinedIn()
- { return "apibrëþta"; }
-
- // 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 "Moduliai"; }
-
- /*! This is put above each page as a link to the class hierarchy */
- virtual QCString trClassHierarchy()
- { return "Klasiø hierarchija"; }
-
- /*! This is put above each page as a link to the list of annotated classes */
- virtual QCString trCompoundList()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Duomenø Struktûros";
- }
- else
- {
- return "Klasës";
- }
- }
-
- /*! This is put above each page as a link to the list of documented files */
- virtual QCString trFileList()
- { return "Failai"; }
-
- /*! This is put above each page as a link to all members of compounds. */
- virtual QCString trCompoundMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Duomenø Laukai";
- }
- else
- {
- return "Klasiø Nariai";
- }
- }
-
- /*! This is put above each page as a link to all members of files. */
- virtual QCString trFileMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Globalûs Nariai";
- }
- else
- {
- return "Globalûs Nariai";
- }
- }
-
- /*! This is put above each page as a link to all related pages. */
- virtual QCString trRelatedPages()
- { return "Susijæ Puslapiai"; }
-
- /*! This is put above each page as a link to all examples. */
- virtual QCString trExamples()
- { return "Pavyzdþiai"; }
-
- /*! This is put above each page as a link to the search engine. */
- virtual QCString trSearch()
- { return "Paieðka"; }
-
- /*! This is an introduction to the class hierarchy. */
- virtual QCString trClassHierarchyDescription()
- { return "Ðis paveldëjimo sàraðas yra beveik surikiuotas "
- "abëcëlës tvarka:";
- }
-
- /*! This is an introduction to the list with all files. */
- virtual QCString trFileListDescription(bool extractAll)
- {
- QCString result="Visø ";
- if (!extractAll) result+="dokumentuotø ";
- result+="failø sàraðas su trumpais apraðymais:";
- return result;
- }
-
- /*! This is an introduction to the annotated compound list. */
- virtual QCString trCompoundListDescription()
- {
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Duomenø struktûros su trumpais apraðymais:";
- }
- else
- {
- return "Klasës, struktûros, "
- "sàjungos ir sàsajos su trumpais apraðymais:";
- }
- }
-
- /*! This is an introduction to the page with all class members. */
- virtual QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result="Visø ";
- if (!extractAll)
- {
- result+="dokumentuotø ";
- }
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="struktûrø ir sàjungø laukø sàraðas";
- }
- else
- {
- result+="klasiø nariai";
- }
- result+=" su ryðiais á ";
- if (!extractAll)
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="struktûrø/sàjungø kiekvieno lauko dokumentacijà:";
- }
- else
- {
- result+="klasës dokumentacija kiekvienam nariui:";
- }
- }
- else
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="struktûros/sàjungos, kurios priklauso:";
- }
- else
- {
- result+="klasës, kurios priklauso:";
- }
- }
- return result;
- }
-
- /*! This is an introduction to the page with all file members. */
- virtual QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="Sàraðas visø ";
- if (!extractAll) result+="dokumentuotø ";
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="funkcijø, kintamøjø, apibrëþimø, iðvardinimø, ir tipø apibrëþimø";
- }
- else
- {
- result+="globaliø nariø";
- }
- result+=" su ryðiais á ";
- if (extractAll)
- result+="failus, kuriems jie priklauso:";
- else
- result+="dokumentacija:";
- return result;
- }
-
- /*! This is an introduction to the page with the list of all examples */
- virtual QCString trExamplesDescription()
- { return "Visø pavyzdþiø sàraðas:"; }
-
- /*! This is an introduction to the page with the list of related pages */
- virtual QCString trRelatedPagesDescription()
- { return "Visø susijusiø dokumentacijos puslapiø sàraðas:"; }
-
- /*! This is an introduction to the page with the list of class/file groups */
- virtual QCString trModulesDescription()
- { return "Visø moduliø sàraðas:"; }
-
- // index titles (the project name is prepended for these)
-
- /*! This is used in HTML as the title of index.html. */
- virtual QCString trDocumentation()
- { return "Dokumentacija"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all groups.
- */
- virtual QCString trModuleIndex()
- { return "Modulio Indeksas"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * class hierarchy.
- */
- virtual QCString trHierarchicalIndex()
- { return "Hierarchijos Indeksas"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * annotated compound index.
- */
- virtual QCString trCompoundIndex()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Duomenø Struktûros Indeksas";
- }
- else
- {
- return "Klasës Indeksas";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * list of all files.
- */
- virtual QCString trFileIndex()
- { return "Failo Indeksas"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all groups.
- */
- virtual QCString trModuleDocumentation()
- { return "Modulio Dokumentacija"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all classes, structs and unions.
- */
- virtual QCString trClassDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Duomenø Struktûros Dokumentacija";
- }
- else
- {
- return "Klasës Dokumentacija";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all files.
- */
- virtual QCString trFileDocumentation()
- { return "Failo Dokumentacija"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all examples.
- */
- virtual QCString trExampleDocumentation()
- { return "Pavyzdþio Dokumentacija"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all related pages.
- */
- virtual QCString trPageDocumentation()
- { return "Puslapio Dokumentacija"; }
-
- /*! This is used in LaTeX as the title of the document */
- virtual QCString trReferenceManual()
- { return "Informacinis Vadovas"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of defines
- */
- virtual QCString trDefines()
- { return "Apibrëþimai"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of function prototypes
- */
- virtual QCString trFuncProtos()
- { return "Funkcijø Prototipai"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of typedefs
- */
- virtual QCString trTypedefs()
- { return "Tipø apibrëþimai"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of enumerations
- */
- virtual QCString trEnumerations()
- { return "Iðvardinimai"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) functions
- */
- virtual QCString trFunctions()
- { return "Funkcijos"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trVariables()
- { return "Kintamieji"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trEnumerationValues()
- { return "Iðvardinimø reikðmës"; }
-
- /*! This is used in the documentation of a file before the list of
- * documentation blocks for defines
- */
- virtual QCString trDefineDocumentation()
- { return "Apibrëþimø Dokumentacija"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for function prototypes
- */
- virtual QCString trFunctionPrototypeDocumentation()
- { return "Funkcijø Prototipø Dokumentacija"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for typedefs
- */
- virtual QCString trTypedefDocumentation()
- { return "Tipø apibrëþimø Dokumentacija"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration types
- */
- virtual QCString trEnumerationTypeDocumentation()
- { return "Iðvardinimo Tipo Dokumentacija"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for functions
- */
- virtual QCString trFunctionDocumentation()
- { return "Funkcijos Dokumentacija"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for variables
- */
- virtual QCString trVariableDocumentation()
- { return "Kintamojo Dokumentacija"; }
-
- /*! This is used in the documentation of a file/namespace/group before
- * the list of links to documented compounds
- */
- virtual QCString trCompounds()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Duomenø struktøros";
- }
- else
- {
- return "Klasës";
- }
- }
-
- /*! 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)"Sugeneruota "+date;/*FIXME*/
- if (projName) result+=(QCString)" "+projName;/*FIXME*/
- result+=(QCString)" ";/*FIXME*/
- return result;
- }
- /*! This is part of the sentence used in the standard footer of each page.
- */
- virtual QCString trWrittenBy()
- {
- return "paraðyta";
- }
-
- /*! this text is put before a class diagram */
- virtual QCString trClassDiagram(const char *clName)
- {
- return (QCString)"Paveldimumo diagrama "+clName+":"; /*FIXME*/
- }
-
- /*! this text is generated when the \\internal command is used. */
- virtual QCString trForInternalUseOnly()
- { return "Tiktai vidiniam naudojimui."; }
-
- /*! this text is generated when the \\warning command is used. */
- virtual QCString trWarning()
- { return "Áspëjimas"; }
-
- /*! this text is generated when the \\version command is used. */
- virtual QCString trVersion()
- { return "Versija"; }
-
- /*! this text is generated when the \\date command is used. */
- virtual QCString trDate()
- { return "Data"; }
-
- /*! this text is generated when the \\return command is used. */
- virtual QCString trReturns()
- { return "Graþina"; }
-
- /*! this text is generated when the \\sa command is used. */
- virtual QCString trSeeAlso()
- { return "Taip pat þiûrëti"; }
-
- /*! this text is generated when the \\param command is used. */
- virtual QCString trParameters()
- { return "Parametrai"; }
-
- /*! this text is generated when the \\exception command is used. */
- virtual QCString trExceptions()
- { return "Iðimtys"; }
-
- /*! this text is used in the title page of a LaTeX document. */
- virtual QCString trGeneratedBy()
- { return "Sugeneruota"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of page containing all the index of all namespaces. */
- virtual QCString trNamespaceList()
- { return "Varø Srities Sàraðas"; }
-
- /*! used as an introduction to the namespace list */
- virtual QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="Sàraðas visø ";
- if (!extractAll) result+="dokumentuotø ";
- result+="vardø srièiø su trumpais apraðymais:";
- return result;
- }
-
- /*! used in the class documentation as a header before the list of all
- * friends of a class
- */
- virtual QCString trFriends()
- { return "Draugai"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in the class documentation as a header before the list of all
- * related classes
- */
- virtual QCString trRelatedFunctionDocumentation()
- { return "Draugiðkø Ir Susijusiø Funkcijø Dokumentacija"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of the HTML page of a class/struct/union */
- virtual QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- {
- QCString result=(QCString)clName;
- switch(compType)
- {
- case ClassDef::Class: result+=" Klasë"; break;
- case ClassDef::Struct: result+=" Struktûra"; break;
- case ClassDef::Union: result+=" Sàjunga"; break;
- case ClassDef::Interface: result+=" Sàsaja"; break;
- case ClassDef::Protocol: result+=" Protokolas"; break;
- case ClassDef::Category: result+=" Kategorija"; break;
- case ClassDef::Exception: result+=" Iðimtis"; break;
- }
- if (isTemplate) result+=" Ðablonas";
- return result;
- }
-
- /*! used as the title of the HTML page of a file */
- virtual QCString trFileReference(const char *fileName)
- {
- QCString result=fileName;
- result+=" Failo Nuoroda";
- return result;
- }
-
- /*! used as the title of the HTML page of a namespace */
- virtual QCString trNamespaceReference(const char *namespaceName)
- {
- QCString result=namespaceName;
- result+=" Vardø Srities Nuoroda";
- return result;
- }
-
- virtual QCString trPublicMembers()
- { return "Vieði Metodai"; }
- virtual QCString trPublicSlots()
- { return "Vieði Slotai"; } /*FIXME*/
- virtual QCString trSignals()
- { return "Signalai"; }
- virtual QCString trStaticPublicMembers()
- { return "Statiniai Vieði Metodai"; }
- virtual QCString trProtectedMembers()
- { return "Apsaugoti Metodai"; }
- virtual QCString trProtectedSlots()
- { return "Apsaugoti Slotai"; }/*FIXME*/
- virtual QCString trStaticProtectedMembers()
- { return "Statiniai Apsaugoti Metodai"; }
- virtual QCString trPrivateMembers()
- { return "Privatatûs Metodai"; }
- virtual QCString trPrivateSlots()
- { return "Privatûs Slotai"; }/*FIXME*/
- virtual QCString trStaticPrivateMembers()
- { return "Statiniai Privatûs Metodai"; }
-
- /*! this function is used to produce a comma-separated list of items.
- * use generateMarker(i) to indicate where item i should be put.
- */
- virtual QCString trWriteList(int numEntries)
- {
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=", ir ";
- }
- }
- return result;
- }
-
- /*! used in class documentation to produce a list of base classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritsList(int numEntries)
- {
- return "Paveldi "+trWriteList(numEntries)+".";
- }
-
- /*! used in class documentation to produce a list of super classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritedByList(int numEntries)
- {
- return "Paveldëta "+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 "Perkrauna metodà ið "+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 "Metodas perkraunamas "+trWriteList(numEntries)+".";
- }
-
- /*! This is put above each page as a link to all members of namespaces. */
- virtual QCString trNamespaceMembers()
- { return "Vardø Srities Nariai"; }
-
- /*! This is an introduction to the page with all namespace members */
- virtual QCString trNamespaceMemberDescription(bool extractAll)
- {
- QCString result="Sàraðas visø ";
- if (!extractAll) result+="dokumentuotø ";
- result+="vardø srities nariø su nuorodomis á ";
- if (extractAll)
- result+="vardø srities dokumentacijà kiekvienam nariui:";
- else
- result+="vardø sritis, kurioms jos priklauso:";
- return result;
- }
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all namespaces.
- */
- virtual QCString trNamespaceIndex()
- { return "Vardø Srities Indeksas"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all namespaces.
- */
- virtual QCString trNamespaceDocumentation()
- { return "Vardø Srities Dokumentacija"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- virtual QCString trNamespaces()
- { return "Vardø Sritys"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990728
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is put at the bottom of a class documentation page and is
- * followed by a list of files that were used to generate the page.
- */
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)"Dokumentacija ";
- switch(compType)
- {
- case ClassDef::Class: result+="ðiai klasei"; break;
- case ClassDef::Struct: result+="ðiai struktûrai"; break;
- case ClassDef::Union: result+="ðiai sàjungai"; break;
- case ClassDef::Interface: result+="ðiai sàsajai"; break;
- case ClassDef::Protocol: result+="ðiam protocolui"; break;
- case ClassDef::Category: result+="ðiai kategorijai"; break;
- case ClassDef::Exception: result+="ðiai iðimèiai"; break;
- }
- result+=" sugeneruota ið ";
- if (single) result+="ðio failo:"; else result+="ðiø failø:";
- return result;
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- virtual QCString trAlphabeticalList()
- { return "Abëcëlinis Sàraðas"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- virtual QCString trReturnValues()
- { return "Graþinamos reikðmës"; }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- virtual QCString trMainPage()
- { return "Pagrindinis Puslapis"; }
-
- /*! 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 "psl."; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991003
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDefinedAtLineInSourceFile()
- {
- return "Apibrëþimas failo @1 eilutëje @0.";
- }
- virtual QCString trDefinedInSourceFile()
- {
- return "Apibrëþimas faile @0.";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDeprecated()
- {
- return "Smerktina";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- virtual QCString trCollaborationDiagram(const char *clName)
- {
- return (QCString)"Bendradarbiavimo diagrama "+clName+":";/*FIXME*/
- }
- /*! this text is put before an include dependency graph */
- virtual QCString trInclDepGraph(const char *fName)
- {
- return (QCString)"Átraukimo priklausomybiø diagrama "+fName+":";/*FIXME*/
- }
- /*! header that is put before the list of constructor/destructors. */
- virtual QCString trConstructorDocumentation()
- {
- return "Konstruktoriaus ir Destruktoriaus Dokumentacija";
- }
- /*! Used in the file documentation to point to the corresponding sources. */
- virtual QCString trGotoSourceCode()
- {
- return "Eiti á ðio failo programos kodà.";
- }
- /*! Used in the file sources to point to the corresponding documentation. */
- virtual QCString trGotoDocumentation()
- {
- return "Eiti á ðio failo dokumentacijà.";
- }
- /*! Text for the \\pre command */
- virtual QCString trPrecondition()
- {
- return "Iðakstinë sàlyga";
- }
- /*! Text for the \\post command */
- virtual QCString trPostcondition()
- {
- return "Postcondition";/*FIXME*/
- }
- /*! Text for the \\invariant command */
- virtual QCString trInvariant()
- {
- return "Pastovus";
- }
- /*! Text shown before a multi-line variable/enum initialization */
- virtual QCString trInitialValue()
- {
- return "Pradinë reikðmë:";
- }
- /*! Text used the source code in the file index */
- virtual QCString trCode()
- {
- return "tekstas";/*FIXME*/
- }
- virtual QCString trGraphicalHierarchy()
- {
- return "Grafinë Klasës Hierarchija";
- }
- virtual QCString trGotoGraphicalHierarchy()
- {
- return "Eiti á grafinæ klasës hierarchijà";
- }
- virtual QCString trGotoTextualHierarchy()
- {
- return "Eiti á tekstinæ klasës hierarchijà";
- }
- virtual QCString trPageIndex()
- {
- return "Puslapio Indeksas";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trNote()
- {
- return "Pastaba";
- }
- virtual QCString trPublicTypes()
- {
- return "Vieði Tipai";
- }
- virtual QCString trPublicAttribs()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Duomenø Laukai";
- }
- else
- {
- return "Vieði Atributai";
- }
- }
- virtual QCString trStaticPublicAttribs()
- {
- return "Statiniai Vieði Atributai";
- }
- virtual QCString trProtectedTypes()
- {
- return "Apsaugoti Tipai";
- }
- virtual QCString trProtectedAttribs()
- {
- return "Apsaugoti Atributai";
- }
- virtual QCString trStaticProtectedAttribs()
- {
- return "Statiniai Apsaugoti Atributai";
- }
- virtual QCString trPrivateTypes()
- {
- return "Privatûs Tipai";
- }
- virtual QCString trPrivateAttribs()
- {
- return "Privatûs Atributai";
- }
- virtual QCString trStaticPrivateAttribs()
- {
- return "Statiniai Privatûs Atributai";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\todo item */
- virtual QCString trTodo()
- {
- return "Daryti";
- }
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- {
- return "Tolimesni Darbai";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy()
- {
- return "Naudojamas";
- }
- virtual QCString trRemarks()
- {
- return "Pastabos";
- }
- virtual QCString trAttention()
- {
- return "Attention";
- }
- virtual QCString trInclByDepGraph()
- {
- return "Ðis grafas rodo, kuris failas tiesiogiai ar "
- "netiesiogiai átraukia ðá failà:";
- }
- virtual QCString trSince()
- {
- return "Nuo";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- virtual QCString trLegendTitle()
- {
- return "Grafo Legenda";
- }
- /*! 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
- "Ðis puslapis paaiðkina, kaip interpretuoti sugeneruotus grafus "
- "su Doxygen árankiu.<p>\n"
- "Panagrinëkite pavyzdá:\n"
- "\\kodo pradþia\n"
- "/*! Invisible class because of truncation */\n"
- "class Invisible { };\n\n"
- "/*! Truncated class, inheritance relation is hidden */\n"
- "class Truncated : public Invisible { };\n\n"
- "/* Class not documented with doxygen comments */\n"
- "class Undocumented { };\n\n"
- "/*! Class that is inherited using public inheritance */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! A template class */\n"
- "template<class T> class Templ { };\n\n"
- "/*! Class that is inherited using protected inheritance */\n"
- "class ProtectedBase { };\n\n"
- "/*! Class that is inherited using private inheritance */\n"
- "class PrivateBase { };\n\n"
- "/*! Class that is used by the Inherited class */\n"
- "class Used { };\n\n"
- "/*! Super class that inherits a number of other 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"
- "If the \\c MAX_DOT_GRAPH_HEIGHT tag in the configuration file "
- "is set to 240 this will result in the following graph:"
- "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
- "The boxes in the above graph have the following meaning:\n"
- "<ul>\n"
- "<li>%A filled black box represents the struct or class for which the "
- "graph is generated.\n"
- "<li>%A box with a black border denotes a documented struct or class.\n"
- "<li>%A box with a grey border denotes an undocumented struct or class.\n"
- "<li>%A box with a red border denotes a documented struct or class for"
- "which not all inheritance/containment relations are shown. %A graph is "
- "truncated if it does not fit within the specified boundaries.\n"
- "</ul>\n"
- "The arrows have the following meaning:\n"
- "<ul>\n"
- "<li>%A dark blue arrow is used to visualize a public inheritance "
- "relation between two classes.\n"
- "<li>%A dark green arrow is used for protected inheritance.\n"
- "<li>%A dark red arrow is used for private inheritance.\n"
- "<li>%A purple dashed arrow is used if a class is contained or used "
- "by another class. The arrow is labeled with the variable(s) "
- "through which the pointed class or struct is accessible.\n"
- "<li>%A yellow dashed arrow denotes a relation between a template instance and "
- "the template class it was instantiated from. The arrow is labeled with "
- "the template parameters of the instance.\n"
- "</ul>\n";
- }
- /*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return "legenda";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return "Testas";
- }
- /*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return "Testo Sàraðas";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return "DCOP Metodai";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return "Savybës";
- }
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return "Savybës Dokumentacija";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Duomenø Struktûros";
- }
- else
- {
- return "Klasës";
- }
- }
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
- {
- return (QCString)"Paketas "+name;
- }
- /*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return "Paketo Sàraðas";
- }
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return "Paketai su trumpu apraðymu:";
- }
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return "Paketai";
- }
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return "Reikðmë:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return "Klaida";
- }
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return "Klaidø Sàraðas";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as ansicpg for RTF file
- *
- * The following table shows the correlation of Charset name, Charset Value and
- * <pre>
- * Codepage number:
- * Charset Name Charset Value(hex) Codepage number
- * ------------------------------------------------------
- * DEFAULT_CHARSET 1 (x01)
- * SYMBOL_CHARSET 2 (x02)
- * OEM_CHARSET 255 (xFF)
- * ANSI_CHARSET 0 (x00) 1252
- * RUSSIAN_CHARSET 204 (xCC) 1251
- * EE_CHARSET 238 (xEE) 1250
- * GREEK_CHARSET 161 (xA1) 1253
- * TURKISH_CHARSET 162 (xA2) 1254
- * BALTIC_CHARSET 186 (xBA) 1257
- * HEBREW_CHARSET 177 (xB1) 1255
- * ARABIC _CHARSET 178 (xB2) 1256
- * SHIFTJIS_CHARSET 128 (x80) 932
- * HANGEUL_CHARSET 129 (x81) 949
- * GB2313_CHARSET 134 (x86) 936
- * CHINESEBIG5_CHARSET 136 (x88) 950
- * </pre>
- *
- */
- virtual QCString trRTFansicp()
- {
- return "1252";
- }
-
-
- /*! Used as ansicpg for RTF fcharset
- * \see trRTFansicp() for a table of possible values.
- */
- virtual QCString trRTFCharSet()
- {
- return "0";
- }
-
- /*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return "Indeksas";
- }
-
- /*! 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 ? "Klasë" : "klasë"));
- 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 ? "Faila" : "faila"));
- if (!singular) result+="i";
- else 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 ? "Vardø srit" : "vardø srit"));
- if (!singular) result+="ys";
- else result+="is";
- 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 ? "Grupë" : "grupë"));
- 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 ? "Puslapi" : "puslapi"));
- if (!singular) result+="ai";
- else 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 ? "Nar" : "nar"));
- if (!singular) result+="iai";
- else result+="ys";
- 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 ? "Global" : "global"));
- if (!singular) result+="ûs";
- else result+="us";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is generated when the \\author command is used and
- * for the author section in man pages. */
- virtual QCString trAuthor(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Autori" : "autori"));
- if (!singular) result+="ai";
- else result+="us";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return "Ryðiai";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Realizuoja "+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 "Realizuota "+trWriteList(numEntries)+".";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.16
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in RTF documentation as a heading for the Table
- * of Contents.
- */
- virtual QCString trRTFTableOfContents()
- {
- return "Turinys";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.17
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as the header of the list of item that have been
- * flagged deprecated
- */
- virtual QCString trDeprecatedList()
- {
- return "Smerktinumø Sàraðas";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.18
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a header for declaration section of the events found in
- * a C# program
- */
- virtual QCString trEvents()
- {
- return "Ávykiai";
- }
- /*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- return "Ávykio Dokumentacija";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a heading for a list of Java class types with package scope.
- */
- virtual QCString trPackageTypes()
- {
- return "Paketo Tipai";
- }
- /*! Used as a heading for a list of Java class functions with package
- * scope.
- */
- virtual QCString trPackageMembers()
- {
- return "Paketo Funkcijos";
- }
- /*! Used as a heading for a list of static Java class functions with
- * package scope.
- */
- virtual QCString trStaticPackageMembers()
- {
- return "Statinës Paketo Funkcijos";
- }
- /*! Used as a heading for a list of Java class variables with package
- * scope.
- */
- virtual QCString trPackageAttribs()
- {
- return "Paketo Atributai";
- }
- /*! Used as a heading for a list of static Java class variables with
- * package scope.
- */
- virtual QCString trStaticPackageAttribs()
- {
- return "Statiniai Paketo Atributai";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Visi";
- }
- /*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- return "Funkcijos kvietimo grafas:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! When the search engine is enabled this text is put in the header
- * of each page before the field where one can enter the text to search
- * for.
- */
- virtual QCString trSearchForIndex()
- {
- return "Ieðkoti";
- }
- /*! This string is used as the title for the page listing the search
- * results.
- */
- virtual QCString trSearchResultsTitle()
- {
- return "Paieðkos Rezultatai";
- }
- /*! 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
- * the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
- * value 2 represents 2 or more matches. HTML markup is allowed inside
- * the returned string.
- */
- virtual QCString trSearchResults(int numDocuments)
- {
- if (numDocuments==0)
- {
- return "Atsipraðome, jokiø dokumentø nerasta pagal Jûsø uþklausà.";
- }
- else if (numDocuments==1)
- {
- return "Surasta <b>1</b> dokumentas, atitinkantis Jûsø uþklausà.";
- }
- else
- {
- return "Surasta <b>$num</b> dokumentø, atitinkanèiø Jûsø uþklausà. "
- "Pirmiausiai rodomi labiausiai tenkinantys uþklausà.";
- }
- }
- /*! 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 "Atitikmenys:";
- }
-//////////////////////////////////////////////////////////////////////////
-// 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 filename + " iðeities tekstas";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.9
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the name of the chapter containing the directory
- * hierarchy.
- */
- virtual QCString trDirIndex()
- { return "Direktorijø hierarchija"; }
-
- /*! This is used as the name of the chapter containing the documentation
- * of the directories.
- */
- virtual QCString trDirDocumentation()
- { return "Direktorijø dokumentacija"; }
-
- /*! 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 "Direktorijos"; }
-
- /*! This returns a sentences that introduces the directory hierarchy.
- * and the fact that it is sorted alphabetically per level
- */
- virtual QCString trDirDescription()
- { return "Ði direktorjø strûktûra grubiai surikiuota abëcëlës tvarka:";
- }
-
- /*! 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=dirName; result+=" Directorijos apraðas"; return result; }
-
- /*! 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 ? "Direktorij" : "direktorij"));
- if (singular) result+="a"; else result+="os";
- 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 "Perkraunamas metodas sukurtas patogumui. "
- "Jis skiriasi nuo aukðèiau minëto tik argumetais.";
- }
-
-
-};
-
-#endif
diff --git a/src/translator_nl.h b/src/translator_nl.h
deleted file mode 100644
index 3d637e2..0000000
--- a/src/translator_nl.h
+++ /dev/null
@@ -1,1219 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 TRANSLATOR_NL_H
-#define TRANSLATOR_NL_H
-
-class TranslatorDutch : public Translator
-{
- public:
- QCString idLanguage()
- { return "dutch"; }
- /*! Used to get the LaTeX command(s) for the language support.
- * This method should return string with commands that switch
- * LaTeX to the desired language. For example
- * <pre>"\\usepackage[german]{babel}\n"
- * </pre>
- * or
- * <pre>"\\usepackage{polski}\n"
- * "\\usepackage[latin2]{inputenc}\n"
- * "\\usepackage[T1]{fontenc}\n"
- * </pre>
- *
- * The Dutch LaTeX does not use such commands. Because of this
- * the empty string is returned in this implementation.
- */
- QCString latexLanguageSupportCommand()
- {
- return "\\usepackage[dutch]{babel}\n";
- }
- /*! return the language charset. This will be used for the HTML output */
- QCString idLanguageCharset()
- {
- return "iso-8859-1";
- }
-
- QCString trRelatedFunctions()
- { return "Gerelateerde functies"; }
- QCString trRelatedSubscript()
- { return "(Merk op dat dit geen member functies zijn.)"; }
- QCString trDetailedDescription()
- { return "Gedetailleerde Beschrijving"; }
- QCString trMemberTypedefDocumentation()
- { return "Documentatie van type definitie members"; }
- QCString trMemberEnumerationDocumentation()
- { return "Documentatie van enumeratie members"; }
- QCString trMemberFunctionDocumentation()
- { return "Documentatie van functie members"; }
- QCString trMemberDataDocumentation()
- { return "Documentatie van data members"; }
- QCString trMore()
- { return "Meer..."; }
- QCString trListOfAllMembers()
- { return "Lijst van alle members."; }
- QCString trMemberList()
- { return "Member Lijst"; }
- QCString trThisIsTheListOfAllMembers()
- { return "Dit is de complete lijst van alle members voor"; }
- QCString trIncludingInheritedMembers()
- { return ", inclusief alle overge&euml;rfde members."; }
- QCString trGeneratedAutomatically(const char *s)
- { QCString result="Automatisch gegenereerd door Doxygen";
- if (s) result+=(QCString)" voor "+s;
- result+=" uit de programmacode.";
- return result;
- }
- QCString trEnumName()
- { return "enum naam"; }
- QCString trEnumValue()
- { return "enum waarde"; }
- QCString trDefinedIn()
- { return "gedefinieerd in"; }
- QCString trModules()
- { return "Modules"; }
- QCString trClassHierarchy()
- { return "Klasse Hi&euml;rarchie"; }
- QCString trCompoundList()
- { return "Klasse Lijst"; }
- QCString trFileList()
- { return "File Lijst"; }
- QCString trHeaderFiles()
- { return "Header Lijst"; }
- QCString trCompoundMembers()
- { return "Klasse Members"; }
- QCString trFileMembers()
- { return "File members"; }
- QCString trRelatedPages()
- { return "Gerelateerde pagina's"; }
- QCString trExamples()
- { return "Voorbeelden"; }
- QCString trSearch()
- { return "Zoeken"; }
- QCString trClassHierarchyDescription()
- { return "Deze inheritance lijst is min of meer alfabetisch "
- "gesorteerd:";
- }
- QCString trFileListDescription(bool extractAll)
- {
- QCString result="Hieronder volgt de lijst met alle ";
- if (!extractAll) result+="gedocumenteerde ";
- result+="files, elk met een korte beschrijving:";
- return result;
- }
- QCString trCompoundListDescription()
- { return "Hieronder volgen de klassen, structs en "
- "unions met voor elk een korte beschrijving:";
- }
- QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result="Hieronder volgt de lijst met alle ";
- if (!extractAll) result+="gedocumenteerde ";
- result+="klasse members met links naar ";
- if (!extractAll) result+="de klasse documentatie voor elke member:";
- else result+="de klassen waartoe ze behoren:";
- return result;
- }
- QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="Hieronder volgt de lijst met alle ";
- if (!extractAll) result+="gedocumenteerde ";
- result+="file members met links naar ";
- if (extractAll) result+="de file documentatie voor elke member:";
- else result+="de files waartoe ze behoren:";
- return result;
- }
- QCString trHeaderFilesDescription()
- { return "Hieronder volgen de header files die de API vormen:"; }
- QCString trExamplesDescription()
- { return "Hieronder volgt de lijst met alle voorbeelden:"; }
- QCString trRelatedPagesDescription()
- { return "Hieronder volgt de lijst met alle pagina's die gerelateerde documentatie bevatten:"; }
- QCString trModulesDescription()
- { return "Hieronder volgt de lijst met alle modules:"; }
- QCString trNoDescriptionAvailable()
- { return "Geen korte beschrijving beschikbaar"; }
-
- QCString trDocumentation()
- { return "Documentatie"; }
- QCString trModuleIndex()
- { return "Module Index"; }
- QCString trHierarchicalIndex()
- { return "Hi&euml;rarchische Index"; }
- QCString trCompoundIndex()
- { return "Klasse Index"; }
- QCString trFileIndex()
- { return "File Index"; }
- QCString trModuleDocumentation()
- { return "Module Documentatie"; }
- QCString trClassDocumentation()
- { return "Klassen Documentatie"; }
- QCString trFileDocumentation()
- { return "File Documentatie"; }
- QCString trExampleDocumentation()
- { return "Documentatie van voorbeelden"; }
- QCString trPageDocumentation()
- { return "Documentatie van gerelateerde pagina's"; }
- QCString trReferenceManual()
- { return "Naslagwerk"; }
-
- QCString trDefines()
- { return "Defines"; }
- QCString trFuncProtos()
- { return "Functie Prototypes"; }
- QCString trTypedefs()
- { return "Typedefs"; }
- QCString trEnumerations()
- { return "Enumeraties"; }
- QCString trFunctions()
- { return "Functies"; }
- QCString trVariables()
- { return "Variabelen"; }
- QCString trEnumerationValues()
- { return "Enumeratie waarden"; }
- QCString trDefineDocumentation()
- { return "Documentatie van defines"; }
- QCString trFunctionPrototypeDocumentation()
- { return "Documentatie van functie Prototypes"; }
- QCString trTypedefDocumentation()
- { return "Documentatie van typedefs"; }
- QCString trEnumerationTypeDocumentation()
- { return "Documentatie van enumeratie types"; }
- QCString trEnumerationValueDocumentation()
- { return "Documentatie van enumeratie waarden"; }
- QCString trFunctionDocumentation()
- { return "Documentatie van functies"; }
- QCString trVariableDocumentation()
- { return "Documentatie van variabelen"; }
- QCString trCompounds()
- { return "Klassen"; }
- QCString trGeneratedAt(const char *date,const char *projName)
- {
- QCString result=(QCString)"Gegenereerd op "+date;
- if (projName) result+=(QCString)" voor "+projName;
- result+=(QCString)" door";
- return result;
- }
- QCString trWrittenBy()
- {
- return "geschreven door";
- }
- QCString trClassDiagram(const char *clName)
- {
- return (QCString)"Klasse diagram voor "+clName;
- }
- QCString trForInternalUseOnly()
- { return "Alleen voor intern gebruik."; }
- QCString trReimplementedForInternalReasons()
- { return "Om interne redenen opnieuwd ge&iuml;mplemented; "
- "de API wordt er niet door be&iuml;nvloed.";
- }
- QCString trWarning()
- { return "Waarschuwing"; }
- QCString trBugsAndLimitations()
- { return "Fouten en beperkingen"; }
- QCString trVersion()
- { return "Versie"; }
- QCString trDate()
- { return "Datum"; }
- QCString trReturns()
- { return "Retourneert"; }
- QCString trSeeAlso()
- { return "Zie ook"; }
- QCString trParameters()
- { return "Parameters"; }
- QCString trExceptions()
- { return "Excepties"; }
- QCString trGeneratedBy()
- { return "Gegenereerd door"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307
-//////////////////////////////////////////////////////////////////////////
-
- QCString trNamespaceList()
- { return "Namespace Lijst"; }
- QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="Hier is een lijst met alle ";
- if (!extractAll) result+="gedocumenteerde ";
- result+="namespaces met voor elk een korte beschrijving:";
- return result;
- }
- QCString trFriends()
- { return "Friends"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- QCString trRelatedFunctionDocumentation()
- { return "Documentatie van friends en gerelateerde functies"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- // used as the title of the HTML page of a class/struct/union
- {
- QCString result=(QCString)clName;
- if (isTemplate) result+=" Template";
- switch(compType)
- {
- case ClassDef::Class: result+=" Class"; break;
- case ClassDef::Struct: result+=" Struct"; break;
- case ClassDef::Union: result+=" Union"; break;
- case ClassDef::Interface: result+=" Interface"; break;
- case ClassDef::Protocol: result+=" Protocol"; break;
- case ClassDef::Category: result+=" Category"; break;
- case ClassDef::Exception: result+=" Exception"; break;
- }
- result+=" Referentie";
- return result;
- }
- QCString trFileReference(const char *fileName)
- // used as the title of the HTML page of a file
- {
- QCString result=fileName;
- result+=" File Referentie";
- return result;
- }
- QCString trNamespaceReference(const char *namespaceName)
- // used as the title of the HTML page of a namespace
- {
- QCString result=namespaceName;
- result+=" Namespace Referentie";
- return result;
- }
-
- // these are for the member sections of a class, struct or union
- QCString trPublicMembers()
- { return "Public Members"; }
- QCString trPublicSlots()
- { return "Public Slots"; }
- QCString trSignals()
- { return "Signals"; }
- QCString trStaticPublicMembers()
- { return "Static Public Members"; }
- QCString trProtectedMembers()
- { return "Protected Members"; }
- QCString trProtectedSlots()
- { return "Protected Slots"; }
- QCString trStaticProtectedMembers()
- { return "Static Protected Members"; }
- QCString trPrivateMembers()
- { return "Private Members"; }
- QCString trPrivateSlots()
- { return "Private Slots"; }
- QCString trStaticPrivateMembers()
- { return "Static Private Members"; }
- // end of member sections
-
- QCString trWriteList(int numEntries)
- {
- // this function is used to produce a comma-separated list of items.
- // use generateMarker(i) to indicate where item i should be put.
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=" en ";
- }
- }
- return result;
- }
-
- QCString trInheritsList(int numEntries)
- // used in class documentation to produce a list of base classes,
- // if class diagrams are disabled.
- {
- return "Erft over van "+trWriteList(numEntries)+".";
- }
- QCString trInheritedByList(int numEntries)
- // used in class documentation to produce a list of super classes,
- // if class diagrams are disabled.
- {
- return "Wordt overge&euml;rfd door "+trWriteList(numEntries)+".";
- }
- QCString trReimplementedFromList(int numEntries)
- // used in member documentation blocks to produce a list of
- // members that are hidden by this one.
- {
- return "Nieuwe implementatie van "+trWriteList(numEntries)+".";
- }
- QCString trReimplementedInList(int numEntries)
- {
- // used in member documentation blocks to produce a list of
- // all member that overwrite the implementation of this member.
- return "Opnieuw ge&iuml;mplementeerd in "+trWriteList(numEntries)+".";
- }
-
- QCString trNamespaceMembers()
- // This is put above each page as a link to all members of namespaces.
- { return "Namespace Members"; }
- QCString trNamespaceMemberDescription(bool extractAll)
- // This is an introduction to the page with all namespace members
- {
- QCString result="Hier is een lijst van alle ";
- if (!extractAll) result+="gedocumenteerde ";
- result+="namespace members met links naar ";
- if (extractAll)
- result+="de namespace documentatie voor iedere member:";
- else
- result+="de namespaces waartoe ze behoren:";
- return result;
- }
- QCString trNamespaceIndex()
- // This is used in LaTeX as the title of the chapter with the
- // index of all namespaces.
- { return "Namespace Index"; }
- QCString trNamespaceDocumentation()
- // This is used in LaTeX as the title of the chapter containing
- // the documentation of all namespaces.
- { return "Namespace Documentatie"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- QCString trNamespaces()
- {
- return "Namespaces";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990728
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is put at the bottom of a class documentation page and is
- * followed by a list of files that were used to generate the page.
- */
- QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)"De documentatie voor deze ";
- switch(compType)
- {
- case ClassDef::Class: result+="class"; break;
- case ClassDef::Struct: result+="struct"; break;
- case ClassDef::Union: result+="union"; break;
- case ClassDef::Interface: result+="interface"; break;
- case ClassDef::Protocol: result+="protocol"; break;
- case ClassDef::Category: result+="category"; break;
- case ClassDef::Exception: result+="exception"; break;
- }
- result+=" is gegenereerd op grond van de volgende file";
- if (single) result+=":"; else result+="s:";
- return result;
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- QCString trAlphabeticalList()
- { return "Alphabetical List"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- QCString trReturnValues()
- { return "Retour waarden"; }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- QCString trMainPage()
- { return "Hoofd Pagina"; }
-
- /*! This is used in references to page that are put in the LaTeX
- * documentation. It should be an abbreviation of the word page.
- */
- QCString trPageAbbreviation()
- { return "p."; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991106
-//////////////////////////////////////////////////////////////////////////
-
- QCString trSources()
- {
- return "Broncode";
- }
- QCString trDefinedAtLineInSourceFile()
- {
- return "De definitie bevindt zich op regel @0 in de file @1.";
- }
- QCString trDefinedInSourceFile()
- {
- return "De definitie bevindt zich in de file @0.";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
- QCString trDeprecated()
- {
- return "Verouderd";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- QCString trCollaborationDiagram(const char *clName)
- {
- return (QCString)"Collaboratie diagram voor "+clName+":";
- }
- /*! this text is put before an include dependency graph */
- QCString trInclDepGraph(const char *fName)
- {
- return (QCString)"Include afhankelijkheidsgraaf voor "+fName+":";
- }
- /*! header that is put before the list of constructor/destructors. */
- QCString trConstructorDocumentation()
- {
- return "Constructor & Destructor Documentatie";
- }
- /*! Used in the file documentation to point to the corresponding sources. */
- QCString trGotoSourceCode()
- {
- return "Ga naar de bron code van deze file.";
- }
- /*! Used in the file sources to point to the corresponding documentation. */
- QCString trGotoDocumentation()
- {
- return "Ga naar de documentatie van deze file.";
- }
- /*! Text for the \\pre command */
- QCString trPrecondition()
- {
- return "Preconditie";
- }
- /*! Text for the \\post command */
- QCString trPostcondition()
- {
- return "Postconditie";
- }
- /*! Text for the \\invariant command */
- QCString trInvariant()
- {
- return "Invariant";
- }
- /*! Text shown before a multi-line variable/enum initialization */
- QCString trInitialValue()
- {
- return "Initi&euml;le waarde:";
- }
- /*! Text used the source code in the file index */
- QCString trCode()
- {
- return "code";
- }
- QCString trGraphicalHierarchy()
- {
- return "Grafische Klasse Hi&euml;rarchie";
- }
- QCString trGotoGraphicalHierarchy()
- {
- return "Ga naar de grafische klasse hi&euml;rarchie";
- }
- QCString trGotoTextualHierarchy()
- {
- return "Ga naar de tekstuele klasse hi&euml;rarchie";
- }
- QCString trPageIndex()
- {
- return "Pagina Index";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- QCString trNote()
- {
- return "Noot";
- }
- QCString trPublicTypes()
- {
- return "Public Typen";
- }
- QCString trPublicAttribs()
- {
- return "Public Attributen";
- }
- QCString trStaticPublicAttribs()
- {
- return "Static Public Attributen";
- }
- QCString trProtectedTypes()
- {
- return "Protected Typen";
- }
- QCString trProtectedAttribs()
- {
- return "Protected Attributen";
- }
- QCString trStaticProtectedAttribs()
- {
- return "Static Protected Attributen";
- }
- QCString trPrivateTypes()
- {
- return "Private Typen";
- }
- QCString trPrivateAttribs()
- {
- return "Private Attributen";
- }
- QCString trStaticPrivateAttribs()
- {
- return "Static Private Attributen";
- }
-
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a todo item */
- QCString trTodo()
- {
- return "Todo";
- }
- /*! Used as the header of the todo list */
- QCString trTodoList()
- {
- return "Todo Lijst";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- QCString trReferencedBy()
- {
- return "Wordt aangeroepen door";
- }
- QCString trRemarks()
- {
- return "Opmerkingen";
- }
- QCString trAttention()
- {
- return "Attentie";
- }
- QCString trInclByDepGraph()
- {
- return "Deze graaf geeft aan welke files direct of "
- "indirect afhankelijk zijn van deze file:";
- }
- QCString trSince()
- {
- return "Sinds";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- QCString trLegendTitle()
- {
- return "Graaf Legenda";
- }
- /*! page explaining how the dot graph's should be interpreted */
- QCString trLegendDocs()
- {
- return
- "Deze pagina legt uit hoe de grafen die gegenereerd worden door doxygen "
- "ge&iuml;nterpreteerd dienen te worden.<p>\n"
- "Beschouw het volgende voorbeeld:\n"
- "\\code\n"
- "/*! Onzichtbare klasse vanwege afkappen van de graaf */\n"
- "class Invisible { };\n\n"
- "/*! Afgekapte klasse, overervingsrelatie is verborgen */\n"
- "class Truncated : public Invisible { };\n\n"
- "/* Klasse is niet gedocumenteerd met doxygen commentaar */\n"
- "class Undocumented { };\n\n"
- "/*! Klasse met public inheritance */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! Klasse met protected inheritance */\n"
- "class ProtectedBase { };\n\n"
- "/*! Klasse met private inheritance */\n"
- "class PrivateBase { };\n\n"
- "/*! Klasse die wordt gebruikt door de klasse Inherited */\n"
- "class Used { };\n\n"
- "/*! Super klasse die overerft van een aantal andere klassen */\n"
- "class Inherited : public PublicBase,\n"
- " protected ProtectedBase,\n"
- " private PrivateBase,\n"
- " public Undocumented\n"
- "{\n"
- " private:\n"
- " Used *m_usedClass;\n"
- "};\n"
- "\\endcode\n"
- "Als de \\c MAX_DOT_GRAPH_HEIGHT tag in the configuratie file "
- "op 200 gezet is, zal het bestaande voorbeeld resulteren in de volgende graaf:"
- "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
- "De rechthoeken in the bovenstaande graaf hebben de volgende betekenis:\n"
- "<ul>\n"
- "<li>Een gevulde zwarte rechthoek representeert de structure of klasse waarvoor "
- "de graaf is gegeneerd.\n"
- "<li>Een rechthoek met een zwarte rand representeert een gedocumenteerde structure of klasse.\n"
- "<li>Een rechthoek met een grijze rand representeert een ongedocumenteerde structure of klasse.\n"
- "<li>Een rechthoek met een rode rand representeert een gedocumenteerde structure or klasse waarvoor\n"
- "niet alle overervings- of gebruiksrelaties konden worden getoond. Een graaf wordt "
- "afgekapt als hij niet past binnen de gespecificeerde grenzen."
- "</ul>\n"
- "De pijlen hebben de volgende betekenis:\n"
- "<ul>\n"
- "<li>Een donkerblauwe pijl visualizeert een public inheritance "
- "relatie tussen twee klassen.\n"
- "<li>Een donkergroene pijl wordt gebruikt voor protected inheritance.\n"
- "<li>Een donkerrode pijl wordt gebruikt voor private inheritance.\n"
- "<li>Een paars gestippelde pijl wordt gebruikt indien een klasse bevat is of gebruikt wordt "
- "door een andere klasse. De pijl is gelabeled met de variable(n) "
- "die toegang geven tot de aangewezen klasse of structure. \n"
- "<li>Een geel gestippelde pijl wordt gebruikt om een relatie tussen een \n"
- "template instantie en een template klasse aan te geven. De pijl is gelabeld met \n"
- "template parameters van de instantie.\n"
- "</ul>\n";
- }
- /*! text for the link to the legend page */
- QCString trLegend()
- {
- return "legenda";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- QCString trTest()
- {
- return "Test";
- }
- /*! Used as the header of the test list */
- QCString trTestList()
- {
- return "Test Lijst";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- QCString trDCOPMethods()
- {
- return "DCOP Methoden";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- QCString trProperties()
- {
- return "Properties";
- }
- /*! Used as a section header for IDL property documentation */
- QCString trPropertyDocumentation()
- {
- return "Property Documentatie";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java interfaces in the summary section of Java packages */
- QCString trInterfaces()
- {
- return "Interfaces";
- }
- /*! Used for Java classes in the summary section of Java packages */
- QCString trClasses()
- {
- return "Klassen";
- }
- /*! Used as the title of a Java package */
- QCString trPackage(const char *name)
- {
- return (QCString)"Package "+name;
- }
- /*! Title of the package index page */
- QCString trPackageList()
- {
- return "Package Lijst";
- }
- /*! The description of the package index page */
- QCString trPackageListDescription()
- {
- return "Hier volgen de packages, elk met een korte beschrijving (indien aanwezig):";
- }
- /*! The link name in the Quick links header for each page */
- QCString trPackages()
- {
- return "Packages";
- }
- /*! Used as a chapter title for Latex & RTF output */
- QCString trPackageDocumentation()
- {
- return "Package Documentatie";
- }
- /*! Text shown before a multi-line define */
- QCString trDefineValue()
- {
- return "Waarde:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- QCString trBug()
- {
- return "Bug";
- }
- /*! Used as the header of the bug list */
- QCString trBugList()
- {
- return "Bug Lijst";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as ansicpg for RTF file
- *
- * The following table shows the correlation of Charset name, Charset Value and
- * <pre>
- * Codepage number:
- * Charset Name Charset Value(hex) Codepage number
- * ------------------------------------------------------
- * DEFAULT_CHARSET 1 (x01)
- * SYMBOL_CHARSET 2 (x02)
- * OEM_CHARSET 255 (xFF)
- * ANSI_CHARSET 0 (x00) 1252
- * RUSSIAN_CHARSET 204 (xCC) 1251
- * EE_CHARSET 238 (xEE) 1250
- * GREEK_CHARSET 161 (xA1) 1253
- * TURKISH_CHARSET 162 (xA2) 1254
- * BALTIC_CHARSET 186 (xBA) 1257
- * HEBREW_CHARSET 177 (xB1) 1255
- * ARABIC _CHARSET 178 (xB2) 1256
- * SHIFTJIS_CHARSET 128 (x80) 932
- * HANGEUL_CHARSET 129 (x81) 949
- * GB2313_CHARSET 134 (x86) 936
- * CHINESEBIG5_CHARSET 136 (x88) 950
- * </pre>
- *
- */
- virtual QCString trRTFansicp()
- {
- return "1252";
- }
-
-
- /*! Used as ansicpg for RTF fcharset
- * \see trRTFansicp() for a table of possible values.
- */
- virtual QCString trRTFCharSet()
- {
- return "0";
- }
-
- /*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return "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 ? "Klasse" : "klass"));
- if (!singular) result+="n";
- 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 ? "File" : "file"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trNamespace(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Namespace" : "namespace"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trGroup(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Groep" : "groep"));
- if (!singular) result+="en";
- 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 ? "Pagina" : "pagina"));
- 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 ? "Member" : "member"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trField(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Veld" : "veld"));
- if (!singular) result+="en";
- 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 ? "Globale member" : "globale member"));
- if (!singular) result+="s";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is generated when the \\author command is used and
- * for the author section in man pages. */
- virtual QCString trAuthor(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Auteur" : "auteur"));
- if (!singular) result+="s";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return "Gebruikt";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Implementeert "+trWriteList(numEntries)+".";
- }
-
- /*! used in member documentation blocks to produce a list of
- * all members that implementation this member.
- */
- virtual QCString trImplementedInList(int numEntries)
- {
- return "Wordt ge&iuml;mplementeerd door "+trWriteList(numEntries)+".";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.16
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trRTFTableOfContents()
- { return "Inhoudsopgave"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.17
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as the header of the list of item that have been
- * flagged deprecated
- */
- virtual QCString trDeprecatedList()
- {
- return "Deprecated Lijst";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.18
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a header for a section of events found in a C# program
- */
- virtual QCString trEvents()
- {
- return "Events";
- }
- /*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- return "Event Documentatie";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a heading for a list of Java class types with package scope.
- */
- virtual QCString trPackageTypes()
- {
- return "Package Types";
- }
- /*! Used as a heading for a list of Java class functions with package
- * scope.
- */
- virtual QCString trPackageMembers()
- {
- return "Package Functies";
- }
- /*! Used as a heading for a list of static Java class functions with
- * package scope.
- */
- virtual QCString trStaticPackageMembers()
- {
- return "Statische Package Functies";
- }
- /*! Used as a heading for a list of Java class variables with package
- * scope.
- */
- virtual QCString trPackageAttribs()
- {
- return "Package Attributen";
- }
- /*! Used as a heading for a list of static Java class variables with
- * package scope.
- */
- virtual QCString trStaticPackageAttribs()
- {
- return "Statische Package Attributen";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Alle";
- }
- /*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- return "Hier is de call graaf voor deze functie:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! When the search engine is enabled this text is put in the index
- * of each page before the search field.
- */
- virtual QCString trSearchForIndex()
- {
- return "Zoek naar";
- }
- /*! This string is used as the title for the page listing the search
- * results.
- */
- virtual QCString trSearchResultsTitle()
- {
- return "Zoek Resultaten";
- }
- /*! 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
- * the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
- * value 2 represents 2 or more matches. HTML markup is allowed inside
- * the returned string.
- */
- virtual QCString trSearchResults(int numDocuments)
- {
- if (numDocuments==0)
- {
- return "Helaas, er zijn geen documenten gevonden die aan de zoekopdracht voldoen.";
- }
- else if (numDocuments==1)
- {
- return "Er is <b>1</b> document gevonden dat aan de zoekopdracht voldoet.";
- }
- else
- {
- return "Er zijn <b>$num</b> documenten gevonden die aan de zoekopdracht voldoen. "
- "De beste resultaten worden eerst getoond.";
- }
- }
- /*! 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 "Gevonden:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 filename + " Bron Bestand";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.9
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the name of the chapter containing the directory
- * hierarchy.
- */
- virtual QCString trDirIndex()
- { return "Directory Hi&euml;rarchie"; }
-
- /*! This is used as the name of the chapter containing the documentation
- * of the directories.
- */
- virtual QCString trDirDocumentation()
- { return "Directory Documentatie"; }
-
- /*! 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 "Directories"; }
-
- /*! This returns a sentences that introduces the directory hierarchy.
- * and the fact that it is sorted alphabetically per level
- */
- virtual QCString trDirDescription()
- { return "Deze directory hi&euml;rarchie is min of meer alfabetisch "
- "gesorteerd:";
- }
-
- /*! 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=dirName; result+=" Directory Referentie"; return result; }
-
- /*! 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 ? "Director" : "director"));
- if (singular) result+="y"; else result+="ies";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.4.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is added to the documentation when the \\overload command
- * is used for a function.
- */
- virtual QCString trOverloadText()
- {
- return "Deze functie is overloaded en is beschikbaar gemaakt om het "
- "gebruik te vergemakkelijken. Ze verschilt alleen van de "
- "bovenstaande functie wat betreft de parameterlijst.";
- }
-
-};
-
-#endif
diff --git a/src/translator_no.h b/src/translator_no.h
deleted file mode 100644
index 06c745e..0000000
--- a/src/translator_no.h
+++ /dev/null
@@ -1,1552 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-
-/******************************************************************************
- * Norwegian translation by Lars Erik Jordet <lejordet@gmail.com>
- *
- * This is a new translation made from scratch, not based on my older Norwegian translation (for 1.2.2)
- *
- * Translation notes (in Norwegian)
- *
- * Jeg har stort sett brukt ord som ligger ganske nær de engelske ekvivalentene,
- * for eksempel "enumeration" -> "enumerasjon", og i enkelte tilfeller det engelske
- * ordet direkte, der jeg finner det mer naturlig enn å prøve å stable en setning
- * på beina på norsk, eller jeg selv foretrekker det engelske ordet (eks: "Header-fil").
- * Om noen ikke skulle like disse valgene, kontakt meg på mailadressen over.
- *
- * Doxygen har mange strings som består av sammensatte ord ("Member function description", for eksempel),
- * som ikke alltid ser like ryddig ut på norsk. Jeg har brukt bindestrek for å få
- * det til å se presentabelt ut, men om noen har en bedre idé, send til mailadressen over.
- *
- * Changelog
- *
- * 2003-12-18: Initial translation
- * 2004-07-19: Fixup to prepare for 1.3.8 (I had forgotten some functions)
- */
-
-#ifndef TRANSLATOR_NO_H
-#define TRANSLATOR_NO_H
-
-class TranslatorNorwegian : public TranslatorAdapter_1_3_9
-{
- public:
-
- // --- Language control methods -------------------
-
- /*! Used for identification of the language. The identification
- * should not be translated. It should be replaced by the name
- * of the language in English using lower-case characters only
- * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
- * the identification used in language.cpp.
- */
- virtual QCString idLanguage()
- { return "norwegian"; }
-
- /*! Used to get the LaTeX command(s) for the language support.
- * This method should return string with commands that switch
- * LaTeX to the desired language. For example
- * <pre>"\\usepackage[german]{babel}\n"
- * </pre>
- * or
- * <pre>"\\usepackage{polski}\n"
- * "\\usepackage[latin2]{inputenc}\n"
- * "\\usepackage[T1]{fontenc}\n"
- * </pre>
- */
- virtual QCString latexLanguageSupportCommand()
- {
- return
- "\\usepackage[norwegian]{babel}\n"
- "\\usepackage[latin1]{inputenc}\n"
- "\\usepackage[T1]{fontenc}\n";
- }
-
- /*! return the language charset. This will be used for the HTML output */
- virtual QCString idLanguageCharset()
- {
- return "iso-8859-1";
- }
-
- // --- Language translation methods -------------------
-
- /*! used in the compound documentation before a list of related functions. */
- virtual QCString trRelatedFunctions()
- { return "Relaterte Funksjoner"; }
-
- /*! subscript for the related functions. */
- virtual QCString trRelatedSubscript()
- { return "(Merk at disse ikke er medlemsfunksjoner.)"; }
-
- /*! header that is put before the detailed description of files, classes and namespaces. */
- virtual QCString trDetailedDescription()
- { return "Detaijert Beskrivelse"; }
-
- /*! header that is put before the list of typedefs. */
- virtual QCString trMemberTypedefDocumentation()
- { return "Medlemstypedef-dokumentasjon"; }
-
- /*! header that is put before the list of enumerations. */
- virtual QCString trMemberEnumerationDocumentation()
- { return "Medlemsenumerasjons-dokumentasjon"; }
-
- /*! header that is put before the list of member functions. */
- virtual QCString trMemberFunctionDocumentation()
- { return "Medlemsfunksjons-dokumentasjon"; }
-
- /*! header that is put before the list of member attributes. */
- virtual QCString trMemberDataDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Feltdokumentasjon";
- }
- else
- {
- return "Medlemsdata-dokumentasjon";
- }
- }
-
- /*! this is the text of a link put after brief descriptions. */
- virtual QCString trMore()
- { return "Mer..."; }
-
- /*! put in the class documentation */
- virtual QCString trListOfAllMembers()
- { return "Liste over alle medlemmer."; }
-
- /*! used as the title of the "list of all members" page of a class */
- virtual QCString trMemberList()
- { return "Medlemsliste"; }
-
- /*! this is the first part of a sentence that is followed by a class name */
- virtual QCString trThisIsTheListOfAllMembers()
- { return "Dette er den fullstendige listen over medlemmer for "; }
-
- /*! this is the remainder of the sentence after the class name */
- virtual QCString trIncludingInheritedMembers()
- { return ", alle arvede medlemmer inkludert."; }
-
- /*! 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="Generert automatisk av Doxygen";
- if (s) result+=(QCString)" for "+s;
- result+=" fra kildekoden.";
- return result;
- }
-
- /*! put after an enum name in the list of all members */
- virtual QCString trEnumName()
- { return "enumnavn"; }
-
- /*! put after an enum value in the list of all members */
- virtual QCString trEnumValue()
- { return "enumverdi"; }
-
- /*! put after an undocumented member in the list of all members */
- virtual QCString trDefinedIn()
- { return "definert i"; }
-
- // 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 "Moduler"; }
-
- /*! This is put above each page as a link to the class hierarchy */
- virtual QCString trClassHierarchy()
- { return "Klassehierarki"; }
-
- /*! This is put above each page as a link to the list of annotated classes */
- virtual QCString trCompoundList()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Datastrukturer";
- }
- else
- {
- return "Klasseliste";
- }
- }
-
- /*! This is put above each page as a link to the list of documented files */
- virtual QCString trFileList()
- { return "Fil-liste"; }
-
- /*! This is put above each page as a link to the list of all verbatim headers */
- virtual QCString trHeaderFiles()
- { return "Header-filer"; }
-
- /*! This is put above each page as a link to all members of compounds. */
- virtual QCString trCompoundMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Datafelt";
- }
- else
- {
- return "Klassemedlemmer";
- }
- }
-
- /*! This is put above each page as a link to all members of files. */
- virtual QCString trFileMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Globale";
- }
- else
- {
- return "Filmedlemmer";
- }
- }
-
- /*! This is put above each page as a link to all related pages. */
- virtual QCString trRelatedPages()
- { return "Relaterte Sider"; }
-
- /*! This is put above each page as a link to all examples. */
- virtual QCString trExamples()
- { return "Eksempler"; }
-
- /*! This is put above each page as a link to the search engine. */
- virtual QCString trSearch()
- { return "Søk"; }
-
- /*! This is an introduction to the class hierarchy. */
- virtual QCString trClassHierarchyDescription()
- { return "Denne arvelisten er sortert grovt, "
- "men ikke fullstendig, alfabetisk:";
- }
-
- /*! This is an introduction to the list with all files. */
- virtual QCString trFileListDescription(bool extractAll)
- {
- QCString result="Her er en liste over alle ";
- if (!extractAll) result+="dokumenterte ";
- result+="filer med korte beskrivelser:";
- return result;
- }
-
- /*! This is an introduction to the annotated compound list. */
- virtual QCString trCompoundListDescription()
- {
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Her er datastrukturene med korte beskrivelser:";
- }
- else
- {
- return "Her er klasser, structer, "
- "unioner og interfacer med korte beskrivelser:";
- }
- }
-
- /*! This is an introduction to the page with all class members. */
- virtual QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result="Her er en liste over alle ";
- if (!extractAll)
- {
- result+="dokumenterte ";
- }
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="struct- og unionfelter";
- }
- else
- {
- result+="klassemedlemmer";
- }
- result+=" med koblinger til ";
- if (!extractAll)
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="struct-/union-dokumentasjon for hvert felt:";
- }
- else
- {
- result+="klassedokumentasjonen for hvert medlem:";
- }
- }
- else
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="structene/unionene de hører til:";
- }
- else
- {
- result+="klassene de hører til:";
- }
- }
- return result;
- }
- /*! This is an introduction to the page with all file members. */
- virtual QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="Her er en liste over alle ";
- if (!extractAll) result+="dokumenterte ";
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="funksjoner, variable, definerte, enumer, and typedefer";
- }
- else
- {
- result+="filmedlemmer";
- }
- result+=" med koblinger til ";
- if (extractAll)
- result+="filene de hører til:";
- else
- result+="dokumentasjonen:";
- return result;
- }
-
- /*! This is an introduction to the page with the list of all header files. */
- virtual QCString trHeaderFilesDescription()
- { return "Her er alle header-filene som utgjør API:"; }
-
- /*! This is an introduction to the page with the list of all examples */
- virtual QCString trExamplesDescription()
- { return "Her er en liste over alle eksemplene:"; }
-
- /*! This is an introduction to the page with the list of related pages */
- virtual QCString trRelatedPagesDescription()
- { return "Her er en liste over alle relaterte dokumentasjonssider:"; }
-
- /*! This is an introduction to the page with the list of class/file groups */
- virtual QCString trModulesDescription()
- { return "Her er en liste over alle moduler:"; }
-
- /*! This sentences is used in the annotated class/file lists if no brief
- * description is given.
- */
- virtual QCString trNoDescriptionAvailable()
- { return "Ingen beskrivelse tilgjengelig"; }
-
- // index titles (the project name is prepended for these)
-
-
- /*! This is used in HTML as the title of index.html. */
- virtual QCString trDocumentation()
- { return "Dokumentasjon"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all groups.
- */
- virtual QCString trModuleIndex()
- { return "Modulindeks"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * class hierarchy.
- */
- virtual QCString trHierarchicalIndex()
- { return "Hierarkisk indeks"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * annotated compound index.
- */
- virtual QCString trCompoundIndex()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Datastrukturindeks";
- }
- else
- {
- return "Klasse-indeks";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * list of all files.
- */
- virtual QCString trFileIndex()
- { return "Fil-indeks"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all groups.
- */
- virtual QCString trModuleDocumentation()
- { return "Moduldokumentasjon"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all classes, structs and unions.
- */
- virtual QCString trClassDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Datastruktur-dokumentasjon";
- }
- else
- {
- return "Klassedokumentasjon";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all files.
- */
- virtual QCString trFileDocumentation()
- { return "Fildokumentasjon"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all examples.
- */
- virtual QCString trExampleDocumentation()
- { return "Eksempeldokumentasjon"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all related pages.
- */
- virtual QCString trPageDocumentation()
- { return "Sidedokumentasjon"; }
-
- /*! This is used in LaTeX as the title of the document */
- virtual QCString trReferenceManual()
- { return "Referansemanual"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of defines
- */
- virtual QCString trDefines()
- { return "Definerte"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of function prototypes
- */
- virtual QCString trFuncProtos()
- { return "Funksjonprototyper"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of typedefs
- */
- virtual QCString trTypedefs()
- { return "Typedefer"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of enumerations
- */
- virtual QCString trEnumerations()
- { return "Enumerasjoner"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) functions
- */
- virtual QCString trFunctions()
- { return "Funksjoner"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trVariables()
- { return "Variable"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trEnumerationValues()
- { return "Enumerasjonsverdier"; }
-
- /*! This is used in the documentation of a file before the list of
- * documentation blocks for defines
- */
- virtual QCString trDefineDocumentation()
- { return "Define-dokumentasjon"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for function prototypes
- */
- virtual QCString trFunctionPrototypeDocumentation()
- { return "Funksjonsprototype-dokumentasjon"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for typedefs
- */
- virtual QCString trTypedefDocumentation()
- { return "Typedef-dokumentasjon"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration types
- */
- virtual QCString trEnumerationTypeDocumentation()
- { return "Enumerert type-dokumentasjon"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration values
- */
- virtual QCString trEnumerationValueDocumentation()
- { return "Enumerert verdi-dokumentasjon"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for functions
- */
- virtual QCString trFunctionDocumentation()
- { return "Funksjonsdokumentasjon"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for variables
- */
- virtual QCString trVariableDocumentation()
- { return "Variabeldokumentasjon"; }
-
- /*! This is used in the documentation of a file/namespace/group before
- * the list of links to documented compounds
- */
- virtual QCString trCompounds()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Datastrukturer";
- }
- else
- {
- return "Klasser";
- }
- }
-
- /*! 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)"Generert på "+date;
- if (projName) result+=(QCString)" for "+projName;
- result+=(QCString)" av";
- return result;
- }
- /*! This is part of the sentence used in the standard footer of each page.
- */
- virtual QCString trWrittenBy()
- {
- return "skrevet av";
- }
-
- /*! this text is put before a class diagram */
- virtual QCString trClassDiagram(const char *clName)
- {
- return (QCString)"Arvediagram for "+clName+":";
- }
-
- /*! this text is generated when the \\internal command is used. */
- virtual QCString trForInternalUseOnly()
- { return "Kun for intern bruk."; }
-
- /*! this text is generated when the \\reimp command is used. */
- virtual QCString trReimplementedForInternalReasons()
- { return "Reimplementert av interne grunner; API er ikke påvirket."; }
-
- /*! this text is generated when the \\warning command is used. */
- virtual QCString trWarning()
- { return "Advarsel"; }
-
- /*! this text is generated when the \\bug command is used. */
- virtual QCString trBugsAndLimitations()
- { return "Bugs og begrensninger"; }
-
- /*! this text is generated when the \\version command is used. */
- virtual QCString trVersion()
- { return "Versjon"; }
-
- /*! this text is generated when the \\date command is used. */
- virtual QCString trDate()
- { return "Dato"; }
-
- /*! this text is generated when the \\return command is used. */
- virtual QCString trReturns()
- { return "Returnerer"; }
-
- /*! this text is generated when the \\sa command is used. */
- virtual QCString trSeeAlso()
- { return "Se også"; }
-
- /*! this text is generated when the \\param command is used. */
- virtual QCString trParameters()
- { return "Parametre"; }
-
- /*! this text is generated when the \\exception command is used. */
- virtual QCString trExceptions()
- { return "Unntak"; }
-
- /*! this text is used in the title page of a LaTeX document. */
- virtual QCString trGeneratedBy()
- { return "Generert av"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of page containing all the index of all namespaces. */
- virtual QCString trNamespaceList()
- { return "Navneromliste"; }
-
- /*! used as an introduction to the namespace list */
- virtual QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="Her er en liste over alle ";
- if (!extractAll) result+="dokumenterte ";
- result+="navnerom med korte beskrivelser:";
- return result;
- }
-
- /*! used in the class documentation as a header before the list of all
- * friends of a class
- */
- virtual QCString trFriends()
- { return "Venner"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in the class documentation as a header before the list of all
- * related classes
- */
- virtual QCString trRelatedFunctionDocumentation()
- { return "Venner Og Relaterte Funksjoner-dokumentasjon"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of the HTML page of a class/struct/union */
- virtual QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- {
- QCString result=(QCString)clName;
- switch(compType)
- {
- case ClassDef::Class: result+=" Klasse"; break;
- case ClassDef::Struct: result+=" Struct"; break;
- case ClassDef::Union: result+=" Union"; break;
- case ClassDef::Interface: result+=" Grensesnitt"; break;
- case ClassDef::Exception: result+=" Unntak"; break;
- case ClassDef::Protocol: result+=" Protocol"; break;
- case ClassDef::Category: result+=" Category"; break;
- }
- if (isTemplate) result+=" Mal";
- result+=" Referanse";
- return result;
- }
-
- /*! used as the title of the HTML page of a file */
- virtual QCString trFileReference(const char *fileName)
- {
- QCString result=fileName;
- result+=" Filreferanse";
- return result;
- }
-
- /*! used as the title of the HTML page of a namespace */
- virtual QCString trNamespaceReference(const char *namespaceName)
- {
- QCString result=namespaceName;
- result+=" Navneromsreferanse";
- return result;
- }
-
- virtual QCString trPublicMembers()
- { return "Public Medlemsfunksjoner"; }
- virtual QCString trPublicSlots()
- { return "Public Slots"; }
- virtual QCString trSignals()
- { return "Signaler"; }
- virtual QCString trStaticPublicMembers()
- { return "Statiske Public Medlemsfunksjoner"; }
- virtual QCString trProtectedMembers()
- { return "Protected Memdlemsfunksjoner"; }
- virtual QCString trProtectedSlots()
- { return "Protected Slots"; }
- virtual QCString trStaticProtectedMembers()
- { return "Statiske Protected Medlemsfunksjoner"; }
- virtual QCString trPrivateMembers()
- { return "Private Medlemsfunksjoner"; }
- virtual QCString trPrivateSlots()
- { return "Private Slots"; }
- virtual QCString trStaticPrivateMembers()
- { return "Statiske Private Medlemsfunksjoner"; }
-
- /*! this function is used to produce a comma-separated list of items.
- * use generateMarker(i) to indicate where item i should be put.
- */
- virtual QCString trWriteList(int numEntries)
- {
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=", og ";
- }
- }
- return result;
- }
-
- /*! used in class documentation to produce a list of base classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritsList(int numEntries)
- {
- return "Arver "+trWriteList(numEntries)+".";
- }
-
- /*! used in class documentation to produce a list of super classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritedByList(int numEntries)
- {
- return "Arvet av "+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 "Reimplementert fra "+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 "Reimplementert i "+trWriteList(numEntries)+".";
- }
-
- /*! This is put above each page as a link to all members of namespaces. */
- virtual QCString trNamespaceMembers()
- { return "Navneromsmedlemmer"; }
-
- /*! This is an introduction to the page with all namespace members */
- virtual QCString trNamespaceMemberDescription(bool extractAll)
- {
- QCString result="Her er en liste over alle ";
- if (!extractAll) result+="dokumenterte ";
- result+="navneromsmedlemmer med koblinger til ";
- if (extractAll)
- result+="navneromsdokumentasjonen for hvert medlem:";
- else
- result+="navnerommet de hører til:";
- return result;
- }
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all namespaces.
- */
- virtual QCString trNamespaceIndex()
- { return "Navneromsindeks"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all namespaces.
- */
- virtual QCString trNamespaceDocumentation()
- { return "Navneromsdokumentasjon"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- virtual QCString trNamespaces()
- { return "Navnerom"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990728
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is put at the bottom of a class documentation page and is
- * followed by a list of files that were used to generate the page.
- */
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)"The documentation for this ";
- switch(compType)
- {
- case ClassDef::Class: result+="klasse"; break;
- case ClassDef::Struct: result+="struct"; break;
- case ClassDef::Union: result+="union"; break;
- case ClassDef::Interface: result+="interface"; break;
- case ClassDef::Exception: result+="unntak"; break;
- case ClassDef::Protocol: result+="protocol"; break;
- case ClassDef::Category: result+="category"; break;
- }
- result+=" ble generert fra følgende fil";
- if (single) result+=":"; else result+="er:";
- return result;
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- virtual QCString trAlphabeticalList()
- { return "Alfabetisk Liste"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- virtual QCString trReturnValues()
- { return "Returverdier"; }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- virtual QCString trMainPage()
- { return "Hovedside"; }
-
- /*! 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 "s."; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991003
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trSources()
- {
- return "Kilder";
- }
- virtual QCString trDefinedAtLineInSourceFile()
- {
- return "Definisjon på linje @0 i filen @1.";
- }
- virtual QCString trDefinedInSourceFile()
- {
- return "Definisjon i filen @0.";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDeprecated()
- {
- return "Foreldet";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- virtual QCString trCollaborationDiagram(const char *clName)
- {
- return (QCString)"Kollaborasjonsdiagram for "+clName+":";
- }
- /*! this text is put before an include dependency graph */
- virtual QCString trInclDepGraph(const char *fName)
- {
- return (QCString)"Inkluderingsavhengighetsgraf for "+fName+":";
- }
-
- /*! header that is put before the list of constructor/destructors. */
- virtual QCString trConstructorDocumentation()
- {
- return "Konstruktør- & Destruktør-dokumentasjon";
- }
- /*! Used in the file documentation to point to the corresponding sources. */
- virtual QCString trGotoSourceCode()
- {
- return "Gå til kildekoden til denne filen.";
- }
- /*! Used in the file sources to point to the corresponding documentation. */
- virtual QCString trGotoDocumentation()
- {
- return "Gå til dokumentasjonen til denne filen.";
- }
- /*! Text for the \\pre command */
- virtual QCString trPrecondition()
- {
- return "Førbetingelse";
- }
- /*! Text for the \\post command */
- virtual QCString trPostcondition()
- {
- return "Etterbetingelse";
- }
- /*! Text for the \\invariant command */
- virtual QCString trInvariant()
- {
- return "Invariant";
- }
- /*! Text shown before a multi-line variable/enum initialization */
- virtual QCString trInitialValue()
- {
- return "Startverdi:";
- }
- /*! Text used the source code in the file index */
- virtual QCString trCode()
- {
- return "kode";
- }
- virtual QCString trGraphicalHierarchy()
- {
- return "Grafisk klassehierarki";
- }
- virtual QCString trGotoGraphicalHierarchy()
- {
- return "Gå til det grafiske klasse hierarkiet";
- }
- virtual QCString trGotoTextualHierarchy()
- {
- return "Gå til tekst-klassehierarki";
- }
- virtual QCString trPageIndex()
- {
- return "Innhold";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trNote()
- {
- return "Notat";
- }
- virtual QCString trPublicTypes()
- {
- return "Public typer";
- }
- virtual QCString trPublicAttribs()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Datafelt";
- }
- else
- {
- return "Public attributter";
- }
- }
- virtual QCString trStaticPublicAttribs()
- {
- return "Statiske public attributter";
- }
- virtual QCString trProtectedTypes()
- {
- return "Protected typer";
- }
- virtual QCString trProtectedAttribs()
- {
- return "Protected attributter";
- }
- virtual QCString trStaticProtectedAttribs()
- {
- return "Statiske protected attributter";
- }
- virtual QCString trPrivateTypes()
- {
- return "Private typer";
- }
- virtual QCString trPrivateAttribs()
- {
- return "Private attributter";
- }
- virtual QCString trStaticPrivateAttribs()
- {
- return "Statiske private attributter";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a todo item */
- virtual QCString trTodo()
- {
- return "Todo";
- }
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- {
- return "Todo-liste";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy()
- {
- return "Referert av";
- }
- virtual QCString trRemarks()
- {
- return "Merknader";
- }
- virtual QCString trAttention()
- {
- return "Viktig";
- }
- virtual QCString trInclByDepGraph()
- {
- return "Denne grafen viser hvilke filer som direkte eller "
- "indirekte inkluderer denne filen:";
- }
- virtual QCString trSince()
- {
- return "Siden";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- virtual QCString trLegendTitle()
- {
- return "Symbolforklaring";
- }
- /*! page explaining how the dot graph's should be interpreted */
- virtual QCString trLegendDocs()
- {
- return
- "Denne siden forklarer hvordan man tolker grafene doxygen genererer.<p>\n"
- "Vi baserer oss på følgende eksempel:\n"
- "\\code\n"
- "/*! Usynlig klasse pga. trunkasjon */\n"
- "class Invisible { };\n\n"
- "/*! Trunkert klasse, arve-relasjon er skjult */\n"
- "class Truncated : public Invisible { };\n\n"
- "/* Klasse som ikke er dokumentert med doxygen-kommentarer */"
- "class Undocumented { };\n\n"
- "/*! Klasse med public-arv */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! Klasse med protected-arv */\n"
- "class ProtectedBase { };\n\n"
- "/*! Klasse med private-arv */\n"
- "class PrivateBase { };\n\n"
- "/*! Klasse som blir brukt av klassen Inherited */\n"
- "class Used { };\n\n"
- "/*! Super-klasse som arver flere andre klasser */\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"
- "Hvis \\c MAX_DOT_GRAPH_HEIGHT er satt til 200 i "
- "konfigurasjonsfila vil dette resultere i følgende graf:"
- "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
- "Boksene i grafen over betyr følgende:\n"
- "<ul>\n"
- "<li>En fylt svart boks representerer klassen grafen "
- "er generert for.\n"
- "<li>En boks med svart ramme angir en dokumentert struct eller klasse.\n"
- "<li>En boks med grå ramme angir en udokumentert struct eller klasse.\n"
- "<li>En boks med rød ramme angir en dokumentert struct eller klasse "
- "der ikke alle relasjoner er vist. En graf blir trunkert om den ikke "
- "passer innenfor de spesifiserte rammene.\n"
- "</ul>\n"
- "Pilene i grafen har følgende betydning:\n"
- "</ul>\n"
- "<li>En mørk blå pil brukes til å visualisere public-arv mellom to klasser.\n"
- "<li>En mørk grønn pil brukes for protected-arv.\n"
- "<li>En mørk rød pil angir private-arv.\n"
- "<li>En stiplet lilla pil angir at en klasse er inkludert eller brukt "
- "i en annen klasse. Pilen er merket med variablen(e) klassen "
- "er tilgjengelig gjennom.\n"
- "</ul>\n";
- }
- /*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return "symbolforklaring";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return "Test";
- }
- /*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return "Test-liste";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return "DCOP-metoder";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return "Egenskaper";
- }
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return "Egenskaps-dokumentasjon";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java interfaces in the summary section of Java packages */
- virtual QCString trInterfaces()
- {
- return "Grensesnitt";
- }
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Datastrukturer";
- }
- else
- {
- return "Klasser";
- }
- }
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
- {
- return (QCString)"Package "+name;
- }
- /*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return "Pakke-liste";
- }
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return "Her er pakkene med korte beskrivelser (om tilgjengelig):";
- }
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return "Pakker";
- }
- /*! Used as a chapter title for Latex & RTF output */
- virtual QCString trPackageDocumentation()
- {
- return "Pakke-dokumentasjon";
- }
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return "Verdi:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return "Bug";
- }
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return "Bug-liste";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as ansicpg for RTF file
- *
- * The following table shows the correlation of Charset name, Charset Value and
- * <pre>
- * Codepage number:
- * Charset Name Charset Value(hex) Codepage number
- * ------------------------------------------------------
- * DEFAULT_CHARSET 1 (x01)
- * SYMBOL_CHARSET 2 (x02)
- * OEM_CHARSET 255 (xFF)
- * ANSI_CHARSET 0 (x00) 1252
- * RUSSIAN_CHARSET 204 (xCC) 1251
- * EE_CHARSET 238 (xEE) 1250
- * GREEK_CHARSET 161 (xA1) 1253
- * TURKISH_CHARSET 162 (xA2) 1254
- * BALTIC_CHARSET 186 (xBA) 1257
- * HEBREW_CHARSET 177 (xB1) 1255
- * ARABIC _CHARSET 178 (xB2) 1256
- * SHIFTJIS_CHARSET 128 (x80) 932
- * HANGEUL_CHARSET 129 (x81) 949
- * GB2313_CHARSET 134 (x86) 936
- * CHINESEBIG5_CHARSET 136 (x88) 950
- * </pre>
- *
- */
- virtual QCString trRTFansicp()
- {
- return "1252";
- }
-
-
- /*! Used as ansicpg for RTF fcharset
- * \see trRTFansicp() for a table of possible values.
- */
- virtual QCString trRTFCharSet()
- {
- return "0";
- }
-
- /*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return "Indeks";
- }
-
- /*! 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 ? "Klasse" : "klasse"));
- if (!singular) result+="r";
- 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 ? "Fil" : "fil"));
- if (!singular) result+="er";
- 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 ? "Navnerom" : "navnerom"));
- if (!singular) result+="";
- 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 ? "Gruppe" : "gruppe"));
- if (!singular) result+="r";
- 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 ? "Side" : "side"));
- if (!singular) result+="r";
- 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 ? "Medlem" : "medlem"));
- if (!singular) result+="mer";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trField(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Felt" : "felt"));
- if (!singular) result+="";
- 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 ? "Global" : "global"));
- if (!singular) result+="e";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is generated when the \\author command is used and
- * for the author section in man pages. */
- virtual QCString trAuthor(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Forfatter" : "forfatter"));
- if (!singular) result+="e";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return "Referanser";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Implementerer "+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 "Implementert i "+trWriteList(numEntries)+".";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.16
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in RTF documentation as a heading for the Table
- * of Contents.
- */
- virtual QCString trRTFTableOfContents()
- {
- return "Innholdsfortegnelse";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.17
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as the header of the list of item that have been
- * flagged deprecated
- */
- virtual QCString trDeprecatedList()
- {
- return "Liste over foreldede enheter";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.18
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a header for declaration section of the events found in
- * a C# program
- */
- virtual QCString trEvents()
- {
- return "Hendelser";
- }
- /*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- return "Hendelsesdokumentasjon";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a heading for a list of Java class types with package scope.
- */
- virtual QCString trPackageTypes()
- {
- return "Pakketyper";
- }
- /*! Used as a heading for a list of Java class functions with package
- * scope.
- */
- virtual QCString trPackageMembers()
- {
- return "Pakkefunksjoner";
- }
- /*! Used as a heading for a list of static Java class functions with
- * package scope.
- */
- virtual QCString trStaticPackageMembers()
- {
- return "Statiske Pakkefunksjoner";
- }
- /*! Used as a heading for a list of Java class variables with package
- * scope.
- */
- virtual QCString trPackageAttribs()
- {
- return "Pakkeattributter";
- }
- /*! Used as a heading for a list of static Java class variables with
- * package scope.
- */
- virtual QCString trStaticPackageAttribs()
- {
- return "Statiske Pakkeattributter";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Alle";
- }
- /*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- return "Her er kall-grafen for denne funksjonen:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! When the search engine is enabled this text is put in the header
- * of each page before the field where one can enter the text to search
- * for.
- */
- virtual QCString trSearchForIndex()
- {
- return "Søk etter";
- }
- /*! This string is used as the title for the page listing the search
- * results.
- */
- virtual QCString trSearchResultsTitle()
- {
- return "Søkeresultater";
- }
- /*! 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
- * the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
- * value 2 represents 2 or more matches. HTML markup is allowed inside
- * the returned string.
- */
- virtual QCString trSearchResults(int numDocuments)
- {
- if (numDocuments==0)
- {
- return "Beklager, men ingen dokumenter ble funnet.";
- }
- else if (numDocuments==1)
- {
- return "Fant <b>ett</b> dokument som passet ditt søk.";
- }
- else
- {
- return "Fant <b>$num</b> dokumenter som passet ditt søk. "
- "Viser beste treff først.";
- }
- }
- /*! 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 "Treff:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Kildefil " + filename;
- }
-};
-
-#endif
diff --git a/src/translator_pl.h b/src/translator_pl.h
deleted file mode 100644
index 76a44ec..0000000
--- a/src/translator_pl.h
+++ /dev/null
@@ -1,1575 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- * Polish translation was updated to version 1.3.9 by
- * Piotr Kaminski (Piotr.Kaminski@ctm.gdynia.pl)
- */
-
-#ifndef TRANSLATOR_PL_H
-#define TRANSLATOR_PL_H
-
-class TranslatorPolish : public Translator
-{
- private:
- /*! to avoid macro redefinition from translator_pl.h */
- inline QCString decode(const QCString& sInput)
- {
- if (Config_getBool("USE_WINDOWS_ENCODING"))
- {
- return ISO88592ToWin1250(sInput);
- }
- else
- {
- return sInput;
- }
- }
- public:
-
- // --- Language control methods -------------------
-
- /*! Used for identification of the language. May resemble
- * the string returned by latexBabelPackage(), but it is not used
- * for the same purpose. The identification should not be translated.
- * It should be replaced by the name of the language in English
- * (e.g. Czech, Japanese, Russian, etc.). It should be equal to
- * the identification in language.h.
- */
- QCString idLanguage()
- { return "polish"; }
- /*! Used to get the command(s) for the language support. This method
- * was designed for languages which do not prefer babel package.
- * If this methods returns empty string, then the latexBabelPackage()
- * method is used to generate the command for using the babel package.
- */
- QCString latexLanguageSupportCommand()
- {
- return "\\usepackage{polski} \\usepackage[latin2]{inputenc} \\usepackage[T1]{fontenc}";
- }
-
- /*! return the language charset. This will be used for the HTML output */
- virtual QCString idLanguageCharset()
- {
- if (Config_getBool("USE_WINDOWS_ENCODING"))
- {
- return "windows-1250";
- }
- else
- {
- return "iso-8859-2";
- }
- }
-
- // --- Language translation methods -------------------
-
- /*! used in the compound documentation before a list of related functions. */
- QCString trRelatedFunctions()
- { return decode("Funkcje powi±zane"); }
-
- /*! subscript for the related functions. */
- QCString trRelatedSubscript()
- { return decode("(Zauwa¿, ¿e to nie s± metody klas.)"); }
-
- /*! header that is put before the detailed description of files, classes and namespaces. */
- QCString trDetailedDescription()
- { return decode("Opis szczegó³owy"); }
-
- /*! header that is put before the list of typedefs. */
- QCString trMemberTypedefDocumentation()
- { return decode("Dokumentacja sk³adowych definicji typu"); }
-
- /*! header that is put before the list of enumerations. */
- QCString trMemberEnumerationDocumentation()
- { return decode("Dokumentacja sk³adowych wyliczanych"); }
-
- /*! header that is put before the list of member functions. */
- QCString trMemberFunctionDocumentation()
- { return decode("Dokumentacja funkcji sk³adowych"); }
-
- /*! header that is put before the list of member attributes. */
- QCString trMemberDataDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode("Dokumentacja pól");
- }
- else
- {
- return decode("Dokumentacja atrybutów sk³adowych");
- }
- }
-
- /*! this is the text of a link put after brief descriptions. */
- QCString trMore()
- { return decode("Wiêcej..."); }
-
- /*! put in the class documentation */
- QCString trListOfAllMembers()
- { return decode("Lista wszystkich sk³adowych."); }
-
- /*! used as the title of the "list of all members" page of a class */
- QCString trMemberList()
- { return decode("Lista sk³adowych"); }
-
- /*! this is the first part of a sentence that is followed by a class name */
- QCString trThisIsTheListOfAllMembers()
- { return "To jest kompletna lista sk³adowych dla "; }
-
- /*! this is the remainder of the sentence after the class name */
- QCString trIncludingInheritedMembers()
- { return decode(", uwzglêdniaj±ca wszystkie dziedziczone sk³adowe."); }
-
- /*! this is put at the author sections at the bottom of man pages.
- * parameter s is name of the project name.
- */
- QCString trGeneratedAutomatically(const char *s)
- { QCString result=decode("Wygenerowano automatycznie z kodu ¼ród³owego programem Doxygen");
- if (s) result+=(QCString)" dla "+s;
- result+=".";
- return result;
- }
-
- /*! put after an enum name in the list of all members */
- QCString trEnumName()
- { return "nazwa wyliczenia"; }
-
- /*! put after an enum value in the list of all members */
- QCString trEnumValue()
- { return decode("warto¶æ wyliczenia"); }
-
- /*! put after an undocumented member in the list of all members */
- QCString trDefinedIn()
- { return "zdefiniowana w"; }
-
- // quick reference sections
-
- /*! This is put above each page as a link to the list of all groups of
- * compounds or files (see the \\group command).
- */
- QCString trModules()
- { return decode("Modu³y"); }
-
- /*! This is put above each page as a link to the class hierarchy */
- QCString trClassHierarchy()
- { return "Hierarchia klas"; }
-
- /*! This is put above each page as a link to the list of annotated classes */
- QCString trCompoundList()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Struktury danych";
- }
- else
- {
- return "Lista klas";
- }
- }
-
- /*! This is put above each page as a link to the list of documented files */
- QCString trFileList()
- { return decode("Lista plików"); }
-
- /*! This is put above each page as a link to the list of all verbatim headers */
- QCString trHeaderFiles()
- { return decode("Pliki nag³ówkowe"); }
-
- /*! This is put above each page as a link to all members of compounds. */
- QCString trCompoundMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Pola danych";
- }
- else
- {
- return decode("Sk³adowe klas");
- }
- }
-
- /*! This is put above each page as a link to all members of files. */
- QCString trFileMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Globalne";
- }
- else
- {
- return decode("Sk³adowe plików");
- }
- }
-
- /*! This is put above each page as a link to all related pages. */
- QCString trRelatedPages()
- { return "Dodatkowe strony"; }
-
- /*! This is put above each page as a link to all examples. */
- QCString trExamples()
- { return decode("Przyk³ady"); }
-
- /*! This is put above each page as a link to the search engine. */
- QCString trSearch()
- { return "Szukaj"; }
-
- /*! This is an introduction to the class hierarchy. */
- QCString trClassHierarchyDescription()
- { return decode("Ta lista dziedziczenia posortowana jest z grubsza, "
- "choæ nie ca³kowicie, alfabetycznie:");
- }
-
- /*! This is an introduction to the list with all files. */
- QCString trFileListDescription(bool extractAll)
- {
- QCString result="Tutaj znajduje siê lista wszystkich ";
- if (!extractAll) result+="udokumentowanych ";
- result+="plików z ich krótkimi opisami:";
- return decode(result);
- }
-
- /*! This is an introduction to the annotated compound list. */
- QCString trCompoundListDescription()
- {
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode("Tutaj znajduj± siê struktury danych wraz z ich krótkimi opisami:");
- }
- else
- {
- return decode("Tutaj znajduj± siê klasy, struktury, "
- "unie i interfejsy wraz z ich krótkimi opisami:");
- }
- }
-
- /*! This is an introduction to the page with all class members. */
- QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result="Tutaj znajduje siê lista wszystkich ";
- if (!extractAll)
- {
- result+="udokumentowanych ";
- }
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="pól struktur i unii";
- }
- else
- {
- result+="sk³adowych";
- }
- result+=" wraz z odno¶nikami do ";
- if (!extractAll)
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="dokumentacji struktur/unii dla ka¿dego pola:";
- }
- else
- {
- result+="dokumentacji klas dla ka¿dej sk³adowej:";
- }
- }
- else
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="struktur/unii, do których dane pole nale¿y:";
- }
- else
- {
- result+="klas, do których dana sk³adowa nale¿y:";
- }
- }
- return decode(result);
- }
-
- /*! This is an introduction to the page with all file members. */
- QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="Tutaj znajduje siê lista wszystkich ";
- if (!extractAll) result+="udokumentowanych ";
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="funkcji, zmiennych, makr, wyliczeñ i definicji typów";
- }
- else
- {
- result+="sk³adowych plików";
- }
- result+=" wraz z odno¶nikami do ";
- if (extractAll)
- result+="plików, do których one nale¿±:";
- else
- result+="dokumentacji:";
- return decode(result);
- }
-
- /*! This is an introduction to the page with the list of all header files. */
- QCString trHeaderFilesDescription()
- { return decode("Tutaj znajduj± siê pliki nag³ówkowe tworz±ce API:"); }
-
- /*! This is an introduction to the page with the list of all examples */
- QCString trExamplesDescription()
- { return decode("Tutaj znajduje siê lista wszystkich przyk³adów:"); }
-
- /*! This is an introduction to the page with the list of related pages */
- QCString trRelatedPagesDescription()
- { return decode("Tutaj znajduje siê lista wszystkich stron dokumentacji:"); }
-
- /*! This is an introduction to the page with the list of class/file groups */
- QCString trModulesDescription()
- { return decode("Tutaj znajduje siê lista wszystkich grup:"); }
-
- /*! This sentences is used in the annotated class/file lists if no brief
- * description is given.
- */
- QCString trNoDescriptionAvailable()
- { return "Brak opisu"; }
-
- // index titles (the project name is prepended for these)
-
-
- /*! This is used in HTML as the title of index.html. */
- QCString trDocumentation()
- { return "Dokumentacja"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all groups.
- */
- QCString trModuleIndex()
- { return "Indeks grup"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * class hierarchy.
- */
- QCString trHierarchicalIndex()
- { return "Indeks hierarchiczny"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * annotated compound index.
- */
- QCString trCompoundIndex()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Indeks struktur danych";
- }
- else
- {
- return "Indeks klas";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * list of all files.
- */
- QCString trFileIndex()
- { return decode("Indeks plików"); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all groups.
- */
- QCString trModuleDocumentation()
- { return "Dokumentacja grup"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all classes, structs and unions.
- */
- QCString trClassDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Dokumentacja struktur danych";
- }
- else
- {
- return "Dokumentacja klas";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all files.
- */
- QCString trFileDocumentation()
- { return decode("Dokumentacja plików"); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all examples.
- */
- QCString trExampleDocumentation()
- { return decode("Dokumentacja przyk³adów"); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all related pages.
- */
- QCString trPageDocumentation()
- { return "Dokumentacja stron"; }
-
- /*! This is used in LaTeX as the title of the document */
- QCString trReferenceManual()
- { return decode("Podrêcznik"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of defines
- */
- QCString trDefines()
- { return "Definicje"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of function prototypes
- */
- QCString trFuncProtos()
- { return "Prototypy funkcji"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of typedefs
- */
- QCString trTypedefs()
- { return decode("Definicje typów"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of enumerations
- */
- QCString trEnumerations()
- { return "Wyliczenia"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) functions
- */
- QCString trFunctions()
- { return "Funkcje"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- QCString trVariables()
- { return "Zmienne"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- QCString trEnumerationValues()
- { return decode("Warto¶ci wyliczeñ"); }
-
- /*! This is used in the documentation of a file before the list of
- * documentation blocks for defines
- */
- QCString trDefineDocumentation()
- { return "Dokumentacja definicji"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for function prototypes
- */
- QCString trFunctionPrototypeDocumentation()
- { return decode("Dokumentacja prototypów funkcji"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for typedefs
- */
- QCString trTypedefDocumentation()
- { return decode("Dokumentacja definicji typów"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration types
- */
- QCString trEnumerationTypeDocumentation()
- { return decode("Dokumentacja typów wyliczanych"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration values
- */
- QCString trEnumerationValueDocumentation()
- { return decode("Dokumentacja warto¶ci wyliczanych"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for functions
- */
- QCString trFunctionDocumentation()
- { return "Dokumentacja funkcji"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for variables
- */
- QCString trVariableDocumentation()
- { return "Dokumentacja zmiennych"; }
-
- /*! This is used in the documentation of a file/namespace/group before
- * the list of links to documented compounds
- */
- QCString trCompounds()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Struktury danych";
- }
- else
- {
- return "Komponenty";
- }
- }
-
- /*! This is used in the standard footer of each page and indicates when
- * the page was generated
- */
- QCString trGeneratedAt(const char *date,const char *projName)
- {
- QCString result=(QCString)"Wygenerowano "+date;
- if (projName) result+=(QCString)" dla "+projName;
- result+=(QCString)" programem";
- return result;
- }
- /*! This is part of the sentence used in the standard footer of each page.
- */
- QCString trWrittenBy()
- {
- return "napisanym przez";
- }
-
- /*! this text is put before a class diagram */
- QCString trClassDiagram(const char *clName)
- {
- return (QCString)"Diagram dziedziczenia dla "+clName;
- }
-
- /*! this text is generated when the \\internal command is used. */
- QCString trForInternalUseOnly()
- { return decode("Tylko do u¿ytku wewnêtrznego."); }
-
- /*! this text is generated when the \\reimp command is used. */
- QCString trReimplementedForInternalReasons()
- { return decode("Reimplementowana z wewnêtrzych przyczyn; nie dotyczy API."); }
-
- /*! this text is generated when the \\warning command is used. */
- QCString trWarning()
- { return decode("Ostrze¿enie"); }
-
- /*! this text is generated when the \\bug command is used. */
- QCString trBugsAndLimitations()
- { return decode("B³êdy i ograniczenia"); }
-
- /*! this text is generated when the \\version command is used. */
- QCString trVersion()
- { return "Wersja"; }
-
- /*! this text is generated when the \\date command is used. */
- QCString trDate()
- { return "Data"; }
-
- /*! this text is generated when the \\return command is used. */
- QCString trReturns()
- { return "Zwraca"; }
-
- /*! this text is generated when the \\sa command is used. */
- QCString trSeeAlso()
- { return decode("Zobacz równie¿"); }
-
- /*! this text is generated when the \\param command is used. */
- QCString trParameters()
- { return "Parametry"; }
-
- /*! this text is generated when the \\exception command is used. */
- QCString trExceptions()
- { return decode("Wyj±tki"); }
-
- /*! this text is used in the title page of a LaTeX document. */
- QCString trGeneratedBy()
- { return "Wygenerowano przez"; }
-
- // new since 0.49-990307
-
- /*! used as the title of page containing all the index of all namespaces. */
- QCString trNamespaceList()
- { return "Lista przestrzeni nazw"; }
-
- /*! used as an introduction to the namespace list */
- QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="Tutaj znajduj± siê wszystkie ";
- if (!extractAll) result+="udokumentowane ";
- result+="przestrzenie nazw wraz z ich krótkimi opisami:";
- return decode(result);
- }
-
- /*! used in the class documentation as a header before the list of all
- * friends of a class
- */
- QCString trFriends()
- { return "Przyjaciele"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in the class documentation as a header before the list of all
- * related classes
- */
- QCString trRelatedFunctionDocumentation()
- { return decode("Dokumentacja przyjació³ i funkcji zwi±zanych"); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of the HTML page of a class/struct/union */
- QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- {
- QCString result="Dokumentacja";
- if (isTemplate) result+=" szablonu";
- switch(compType)
- {
- case ClassDef::Class: result+=" klasy "; break;
- case ClassDef::Struct: result+=" struktury "; break;
- case ClassDef::Union: result+=" unii "; break;
- case ClassDef::Interface: result+=" interfejsu "; break;
- case ClassDef::Protocol: result+=decode(" protocol "); break; // translate me!
- case ClassDef::Category: result+=decode(" category "); break; // translate me!
- case ClassDef::Exception: result+=decode(" wyj±tku "); break;
- }
- result+=(QCString)clName;
- return result;
- }
-
- /*! used as the title of the HTML page of a file */
- QCString trFileReference(const char *fileName)
- {
- QCString result="Dokumentacja pliku ";
- result+=fileName;
- return result;
- }
-
- /*! used as the title of the HTML page of a namespace */
- QCString trNamespaceReference(const char *namespaceName)
- {
- QCString result="Dokumentacja przestrzeni nazw ";
- result+=namespaceName;
- return result;
- }
-
- /* these are for the member sections of a class, struct or union */
- QCString trPublicMembers()
- { return "Metody publiczne"; }
- QCString trPublicSlots()
- { return "Sloty publiczne"; }
- QCString trSignals()
- { return decode("Sygna³y"); }
- QCString trStaticPublicMembers()
- { return "Statyczne metody publiczne"; }
- QCString trProtectedMembers()
- { return "Metody chronione"; }
- QCString trProtectedSlots()
- { return "Sloty chronione"; }
- QCString trStaticProtectedMembers()
- { return "Statyczne metody chronione"; }
- QCString trPrivateMembers()
- { return "Metody prywatne"; }
- QCString trPrivateSlots()
- { return "Sloty prywatne"; }
- QCString trStaticPrivateMembers()
- { return "Statyczne metody prywatne"; }
-
- /*! this function is used to produce a comma-separated list of items.
- * use generateMarker(i) to indicate where item i should be put.
- */
- QCString trWriteList(int numEntries)
- {
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=" i ";
- }
- }
- return result;
- }
-
- /*! used in class documentation to produce a list of base classes,
- * if class diagrams are disabled.
- */
- QCString trInheritsList(int numEntries)
- {
- return "Dziedziczy "+trWriteList(numEntries)+".";
- }
-
- /*! used in class documentation to produce a list of super classes,
- * if class diagrams are disabled.
- */
- QCString trInheritedByList(int numEntries)
- {
- return "Dziedziczona przez "+trWriteList(numEntries)+".";
- }
-
- /*! used in member documentation blocks to produce a list of
- * members that are hidden by this one.
- */
- QCString trReimplementedFromList(int numEntries)
- {
- return "Reimplementowana z "+trWriteList(numEntries)+".";
- }
-
- /*! used in member documentation blocks to produce a list of
- * all member that overwrite the implementation of this member.
- */
- QCString trReimplementedInList(int numEntries)
- {
- return "Reimplementowana w "+trWriteList(numEntries)+".";
- }
-
- /*! This is put above each page as a link to all members of namespaces. */
- QCString trNamespaceMembers()
- { return decode("Sk³adowe przestrzeni nazw"); }
-
- /*! This is an introduction to the page with all namespace members */
- QCString trNamespaceMemberDescription(bool extractAll)
- {
- QCString result="Tutaj znajduje siê lista wszystkich ";
- if (!extractAll) result+="udokumentowanych ";
- result+="sk³adowych wraz z odno¶nikami do ";
- if (extractAll)
- result+="dokumentacji przestrzeni nazw dla ka¿dej sk³adowej:";
- else
- result+="przestrzeni nazw do których sk³adowe te nale¿±:";
- return decode(result);
- }
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all namespaces.
- */
- QCString trNamespaceIndex()
- { return "Indeks przestrzeni nazw"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all namespaces.
- */
- QCString trNamespaceDocumentation()
- { return "Dokumentacja przestrzeni nazw"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- QCString trNamespaces()
- { return "Przestrzenie nazw"; }
-
-//////////////////////////////////////////////////////////////////////////
-// 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.
- */
- QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)"Dokumentacja dla te";
- switch(compType)
- {
- case ClassDef::Class: result+="j klasy"; break;
- case ClassDef::Struct: result+="j struktury"; break;
- case ClassDef::Union: result+="j unii"; break;
- case ClassDef::Interface: result+="go interfejsu"; break;
- case ClassDef::Protocol: result+=decode("protocol"); break; // translate me!
- case ClassDef::Category: result+=decode("category"); break; // translate me!
- case ClassDef::Exception: result+="go wyj±tku"; break;
- }
- result+=" zosta³a wygenerowana z plik";
- if (single) result+="u:"; else result+="ów:";
- return decode(result);
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- QCString trAlphabeticalList()
- { return "Lista alfabetyczna"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- QCString trReturnValues()
- { return decode("Zwracane warto¶ci"); }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- QCString trMainPage()
- { return decode("Strona g³ówna"); }
-
- /*! This is used in references to page that are put in the LaTeX
- * documentation. It should be an abbreviation of the word page.
- */
- QCString trPageAbbreviation()
- { return "str."; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991003
-//////////////////////////////////////////////////////////////////////////
-
- QCString trSources()
- {
- return decode("¬ród³a");
- }
- QCString trDefinedAtLineInSourceFile()
- {
- return "Definicja w linii @0 pliku @1.";
- }
- QCString trDefinedInSourceFile()
- {
- return "Definicja w pliku @0.";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
- QCString trDeprecated()
- {
- return "Do wycofania";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- QCString trCollaborationDiagram(const char *clName)
- {
- return (QCString)decode("Diagram wspó³pracy dla ")+clName+":";
- }
- /*! this text is put before an include dependency graph */
- QCString trInclDepGraph(const char *fName)
- {
- return (QCString)decode("Wykres zale¿no¶ci za³±czania dla ")+fName+":";
- }
- /*! header that is put before the list of constructor/destructors. */
- QCString trConstructorDocumentation()
- {
- return "Dokumentacja konstruktora i destruktora";
- }
- /*! Used in the file documentation to point to the corresponding sources. */
- QCString trGotoSourceCode()
- {
- return decode("Id¼ do kodu ¼ród³owego tego pliku.");
- }
- /*! Used in the file sources to point to the corresponding documentation. */
- QCString trGotoDocumentation()
- {
- return decode("Id¼ do dokumentacji tego pliku.");
- }
- /*! Text for the \\pre command */
- QCString trPrecondition()
- {
- return decode("Warunek wstêpny");
- }
- /*! Text for the \\post command */
- QCString trPostcondition()
- {
- return decode("Warunek koñcowy");
- }
- /*! Text for the \\invariant command */
- QCString trInvariant()
- {
- return "Niezmiennik";
- }
- /*! Text shown before a multi-line variable/enum initialization */
- QCString trInitialValue()
- {
- return decode("Warto¶æ pocz±tkowa:");
- }
- /*! Text used the source code in the file index */
- QCString trCode()
- {
- return decode("kod ¼ród³owy");
- }
- QCString trGraphicalHierarchy()
- {
- return "Graficzna hierarchia klas";
- }
- QCString trGotoGraphicalHierarchy()
- {
- return decode("Id¼ do graficznej hierarchi klas");
- }
- QCString trGotoTextualHierarchy()
- {
- return decode("Id¼ do tekstowej hierarchi klas");
- }
- QCString trPageIndex()
- {
- return "Indeks stron";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- QCString trNote()
- {
- return "Nota";
- }
- QCString trPublicTypes()
- {
- return "Typy publiczne";
- }
- QCString trPublicAttribs()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Pola danych";
- }
- else
- {
- return "Atrybuty publiczne";
- }
- }
- QCString trStaticPublicAttribs()
- {
- return "Statyczne atrybuty publiczne";
- }
- QCString trProtectedTypes()
- {
- return "Typy chronione";
- }
- QCString trProtectedAttribs()
- {
- return "Atrybuty chronione";
- }
- QCString trStaticProtectedAttribs()
- {
- return "Statyczne atrybuty chronione";
- }
- QCString trPrivateTypes()
- {
- return "Typy prywatne";
- }
- QCString trPrivateAttribs()
- {
- return "Atrybuty prywatne";
- }
- QCString trStaticPrivateAttribs()
- {
- return "Statyczne atrybuty prywatne";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a todo item */
- QCString trTodo()
- {
- return "Do zrobienia";
- }
- /*! Used as the header of the todo list */
- QCString trTodoList()
- {
- return "Lista rzeczy do zrobienia";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- QCString trReferencedBy()
- {
- return decode("Odwo³ania w");
- }
- QCString trRemarks()
- {
- return decode("Spostrze¿enia");
- }
- QCString trAttention()
- {
- return "Uwaga";
- }
- QCString trInclByDepGraph()
- {
- return decode("Ten wykres pokazuje, które pliki bezpo¶rednio lub "
- "po¶rednio za³±czaj± ten plik:");
- }
- QCString trSince()
- {
- return "Od";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- QCString trLegendTitle()
- {
- return "Legenda wykresu";
- }
- /*! page explaining how the dot graph's should be interpreted */
- QCString trLegendDocs()
- {
- return decode(
- "Ta strona wyja¶nia jak interpretowaæ wykresy, które s± wygenerowane "
- "przez doxygen.<p>\n"
- "Rozwa¿ nastêpuj±cy przyk³ad:\n"
- "\\code\n"
- "/*! Klasa Niewidzialna z powodu okrojenia */\n"
- "class Niewidzialna { };\n\n"
- "/*! Klasa Okrojona, relacja dziedziczenia jest ukryta */\n"
- "class Okrojona : public Niewidzialna { };\n\n"
- "/* Klasa nie udokumentowana komentarzami doxygen */\n"
- "class Nieudokumentowana { };\n\n"
- "/*! Klasa, która jest dziedziczona publicznie */\n"
- "class PublicznaBaza : public Okrojona { };\n\n"
- "/*! Klasa, która jest dziedziczona przy u¿yciu dziedziczenia chronionego */\n"
- "class ChronionaBaza { };\n\n"
- "/*! Klasa, która jest dziedziczona prywatnie */\n"
- "class PrywatnaBaza { };\n\n"
- "/*! Klasa, która jest u¿yta przez klasê Dziedziczona */\n"
- "class Uzyta { };\n\n"
- "/*! Superklasa, która dziedziczy kilka innych klas */\n"
- "class Dziedziczona : public PublicznaBaza,\n"
- " protected ChronionaBaza,\n"
- " private PrywatnaBaza,\n"
- " public Nieudokumentowana\n"
- "{\n"
- " private:\n"
- " Uzyta *m_usedClass;\n"
- "};\n"
- "\\endcode\n"
- "Je¶li znacznik \\c MAX_DOT_GRAPH_HEIGHT w pliku konfiguracji "
- "jest ustawiony na 200, odniesie to rezultat w nastêpuj±cym wykresie:"
- "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
- "Prostok±ty w powy¿szym wykresie maj± nastêpuj±ce znaczenie:\n"
- "<ul>\n"
- "<li>Wype³niony czarny prostok±t reprezentuje strukturê lub klasê dla "
- "której zosta³ wygenerowany wykres.\n"
- "<li>Prostok±t z czarn± obwolut± oznacza udokumentowan± strukturê lub klasê.\n"
- "<li>Prostok±t z szar± obwolut± oznacza nieudokumentowan± strukturê lub klasê.\n"
- "<li>Prostok±t z czerwon± obwolut± oznacza udokumentowan± strukturê lub klasê dla\n"
- "której nie s± pokazane wszystkie relacje dziedziczenia/zawierania. Wykres jest "
- "okrojony, je¶li nie mie¶ci siê w okre¶lonych brzegach."
- "</ul>\n"
- "Strza³ki maj± nastêpuj±ce znaczenie:\n"
- "<ul>\n"
- "<li>Ciemno niebieska strza³ka jest u¿ywana do wizualizacji relacji "
- "dziedziczenia publicznego pomiêdzy dwiema klasami.\n"
- "<li>Ciemno zielona strza³ka jest u¿ywana dla dziedziczenia chronionego.\n"
- "<li>Ciemno czerwona strza³ka jest u¿ywana dla dziedziczenia prywatnego.\n"
- "<li>Fioletowa przerywana strza³ka jest u¿ywana je¶li klasa jest zawarta "
- "lub u¿yta przez inn± klasê. Strza³ka jest podpisana zmienn±(ymi) "
- "przez które wskazywana klasa lub struktura jest dostêpna. \n"
- "</ul>\n");
- }
- /*! text for the link to the legend page */
- QCString trLegend()
- {
- return "legenda";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- QCString trTest()
- {
- return "Test";
- }
- /*! Used as the header of the test list */
- QCString trTestList()
- {
- return "Lista testu";
- }
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return "Metody DCOP";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return decode("W³a¶ciwo¶ci");
- }
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return decode("Dokumentacja w³a¶ciwo¶ci");
- }
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java interfaces in the summary section of Java packages */
- virtual QCString trInterfaces()
- {
- return "Interfejsy";
- }
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Struktury Danych";
- }
- else
- {
- return "Klasy";
- }
- }
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
- {
- return (QCString)"Pakiet "+name;
- }
- /*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return decode("Lista Pakietów");
- }
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return decode("Oto lista pakietów wraz z krótkim opisem (o ile jest dostêpny):");
- }
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return decode("Pakiety");
- }
- /*! Used as a chapter title for Latex & RTF output */
- virtual QCString trPackageDocumentation()
- {
- return decode("Dokumentacja Pakietu");
- }
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return decode("Warto¶æ:");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return decode("B³±d");
- }
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return decode("Lista b³êdów");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6-20010422
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as ansicpg for RTF file */
- virtual QCString trRTFansicp()
- {
- return "1250";
- }
-
- /*! Used as ansicpg for RTF fcharset */
- virtual QCString trRTFCharSet()
- {
- return "238";
- }
-
- /*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return decode("Indeks");
- }
-
- /*! 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 ? "Klas" : "klas"));
- result+=(singular ? "a" : "y");
- 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 ? "Plik" : "plik"));
- if (!singular) result+="i";
- 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 ? "Przestrze" : "przestrze"));
- result+=(singular ? "ñ" : "nie");
- result+=" nazw";
- return decode(result);
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trGroup(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Grupa" : "grupa"));
- result+=(singular ? "a" : "y");
- 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 ? "Stron" : "stron"));
- result+=(singular ? "a" : "y");
- 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 ? "Sk³adow" : "sk³adow"));
- result+=(singular ? "a" : "e");
- return decode(result);
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trField(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Pol" : "pol"));
- result+=(singular ? "e" : "a");
- 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 ? "Global" : "global"));
- result+=(singular ? "ny" : "ne");
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is generated when the \\author command is used and
- * for the author section in man pages. */
- virtual QCString trAuthor(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Auto" : "auto"));
- result += (singular) ? "r" : "rzy";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return decode("Odwo³uje siê do");
- }
-
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.13
-//////////////////////////////////////////////////////////////////////////
-
-
- virtual QCString trImplementedFromList(int numEntries)
- {
- return "Implementuje "+trWriteList(numEntries)+".";
- }
-
- virtual QCString trImplementedInList(int numEntries)
- {
- return "Implementowany w "+trWriteList(numEntries)+".";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.16
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in RTF documentation as a heading for the Table
- * of Contents.
- */
- virtual QCString trRTFTableOfContents()
- {
- return decode("Spis tre¶ci");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.17
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as the header of the list of item that have been
- * flagged deprecated
- */
- virtual QCString trDeprecatedList()
- {
- return decode("Lista elementów do wycofania");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.18
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a header for declaration section of the events found in
- * a C# program
- */
- virtual QCString trEvents()
- {
- return "Zdarzenia";
- }
- /*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- return decode("Dokumentacja zdarzeñ");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a heading for a list of Java class types with package scope.
- */
- virtual QCString trPackageTypes()
- {
- return "Typy pakietu";
- }
- /*! Used as a heading for a list of Java class functions with package
- * scope.
- */
- virtual QCString trPackageMembers()
- {
- return "Funkcje pakietu";
- }
- /*! Used as a heading for a list of static Java class functions with
- * package scope.
- */
- virtual QCString trStaticPackageMembers()
- {
- return "Statyczne funkcje pakietu";
- }
- /*! Used as a heading for a list of Java class variables with package
- * scope.
- */
- virtual QCString trPackageAttribs()
- {
- return "Atrybuty pakietu";
- }
- /*! Used as a heading for a list of static Java class variables with
- * package scope.
- */
- virtual QCString trStaticPackageAttribs()
- {
- return "Statyczne atrybuty pakietu";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "All";
- }
- /*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- return "Oto graf wywo³añ dla tej funkcji:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! When the search engine is enabled this text is put in the header
- * of each page before the field where one can enter the text to search
- * for.
- */
- virtual QCString trSearchForIndex()
- {
- return "Szukaj";
- }
- /*! This string is used as the title for the page listing the search
- * results.
- */
- virtual QCString trSearchResultsTitle()
- {
- return "Wyniki szukania";
- }
- /*! 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
- * the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
- * value 2 represents 2 or more matches. HTML markup is allowed inside
- * the returned string.
- */
- virtual QCString trSearchResults(int numDocuments)
- {
- if (numDocuments==0)
- {
- return "Niestety ¿aden dokument nie pasuje do twojego zapytania.";
- }
- else if (numDocuments==1)
- {
- return "Znaleziono <b>1</b> dokument pasuj±cy do twojego zapytania.";
- }
- int count = numDocuments % 10;
- if ((count>=2) && (count<=4))
- {
- return "Znaleziono <b>$num</b> dokumenty pasuj±ce do twojego zapytania. "
- "Najlepiej pasuj±ce dokumenty wy¶wietlane s± na pocz±tku listy.";
- }
- else
- {
- return "Znaleziono <b>$num</b> dokumentów pasuj±cych do twojego zapytania. "
- "Najlepiej pasuj±ce dokumenty wy¶wietlane s± na pocz±tku listy.";
- }
- }
- /*! 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 "Pasuj±ce s³owa:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Plik ¼ród³owy " + filename;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.9
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the name of the chapter containing the directory
- * hierarchy.
- */
- virtual QCString trDirIndex()
- { return "Struktura katalogów"; }
-
- /*! This is used as the name of the chapter containing the documentation
- * of the directories.
- */
- virtual QCString trDirDocumentation()
- { return "Dokumentacja katalogów"; }
-
- /*! 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 "Katalogi"; }
-
- /*! This returns a sentences that introduces the directory hierarchy.
- * and the fact that it is sorted alphabetically per level
- */
- virtual QCString trDirDescription()
- {
- return "Ta struktura katalogów jest posortowana jest z grubsza, "
- "choæ nie ca³kowicie, alfabetycznie:";
- }
-
- /*! 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="Dokumentacja katalogu "; result+=dirName; return result; }
-
- /*! This returns the word directory with or without starting capital
- * (\a first_capital) and in sigular or plural form (\a singular).
- */
- virtual QCString trDir(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Katalog" : "katalog"));
- if (! singular) result+="i";
- 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 "To jest metoda przeci±¿ona, udostêpniona dla wygody. "
- "Ró¿ni siê od powy¿szej metody tylko zestawem akceptowanych argumentów.";
- }
-};
-
-#endif
diff --git a/src/translator_pt.h b/src/translator_pt.h
deleted file mode 100644
index 375c6c4..0000000
--- a/src/translator_pt.h
+++ /dev/null
@@ -1,1480 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- * The translation into Portuguese was provided by
- * Rui Godinho Lopes <rui@ruilopes.com>
- * http://www.ruilopes.com
- *
- * VERSION HISTORY
- * ---------------
- * 007 09 june 2003
- * ! Updated for doxygen v1.3.1
- * 006 30 july 2002
- * ! Updated for doxygen v1.2.17
- * 005 10 july 2002
- * ! Updated for doxygen v1.2.16
- * 004 03 march 2002
- * ! Updated for doxygen v1.2.14
- * 003 23 november 2001
- * - Removed some obsolete methods (latexBabelPackage, trAuthor, trAuthors and trFiles)
- * 002 19 november 2001
- * ! Updated for doxygen v1.2.12
- * 001 20 july 2001
- * ! Updated for doxygen v1.2.8.1
- * 000 ?
- * + Initial translation for doxygen v1.1.5
- */
-
-#ifndef TRANSLATOR_PT_H
-#define TRANSLATOR_PT_H
-
-class TranslatorPortuguese : public TranslatorAdapter_1_3_3
-{
- public:
-
- // --- Language control methods -------------------
-
- /*! Used for identification of the language. The identification
- * should not be translated. It should be replaced by the name
- * of the language in English using lower-case characters only
- * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
- * the identification used in language.cpp.
- */
- QCString idLanguage()
- { return "portuguese"; }
-
- /*! Used to get the LaTeX command(s) for the language support.
- * This method should return string with commands that switch
- * LaTeX to the desired language. For example
- * <pre>"\\usepackage[german]{babel}\n"
- * </pre>
- * or
- * <pre>"\\usepackage{polski}\n"
- * "\\usepackage[latin2]{inputenc}\n"
- * "\\usepackage[T1]{fontenc}\n"
- * </pre>
- *
- * The English LaTeX does not use such commands. Because of this
- * the empty string is returned in this implementation.
- */
- virtual QCString latexLanguageSupportCommand()
- { return "Portuguese"; }
-
- /*! return the language charset. This will be used for the HTML output */
- virtual QCString idLanguageCharset()
- { return "iso-8859-1"; }
-
- // --- Language translation methods -------------------
-
- /*! used in the compound documentation before a list of related functions. */
- QCString trRelatedFunctions()
- { return "Funções associadas"; }
-
- /*! subscript for the related functions. */
- QCString trRelatedSubscript()
- { return "(Note que não são funções membro)"; }
-
- /*! header that is put before the detailed description of files, classes and namespaces. */
- QCString trDetailedDescription()
- { return "Descrição detalhada"; }
-
- /*! header that is put before the list of typedefs. */
- QCString trMemberTypedefDocumentation()
- { return "Documentação das definições de tipo"; }
-
- /*! header that is put before the list of enumerations. */
- QCString trMemberEnumerationDocumentation()
- { return "Documentação das enumerações"; }
-
- /*! header that is put before the list of member functions. */
- QCString trMemberFunctionDocumentation()
- { return "Documentação dos métodos"; }
-
- /*! header that is put before the list of member attributes. */
- QCString trMemberDataDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Documentação dos campos e atributos";
- }
- else
- {
- return "Documentação dos dados membro";
- }
- }
-
- /*! this is the text of a link put after brief descriptions. */
- QCString trMore()
- { return "Mais..."; }
-
- /*! put in the class documentation */
- QCString trListOfAllMembers()
- { return "Mostrar lista completa dos membros"; }
-
- /*! used as the title of the "list of all members" page of a class */
- QCString trMemberList()
- { return "Lista dos membros"; }
-
- /*! this is the first part of a sentence that is followed by a class name */
- QCString trThisIsTheListOfAllMembers()
- { return "Lista completa de todos os membros de "; }
-
- /*! this is the remainder of the sentence after the class name */
- QCString trIncludingInheritedMembers()
- { return ", incluindo todos os membros herdados."; }
-
- /*! this is put at the author sections at the bottom of man pages.
- * parameter s is name of the project name.
- */
- QCString trGeneratedAutomatically(const char *s)
- { QCString result="Gerado automaticamente por Doxygen";
- if (s) result+=(QCString)" para "+s;
- result+=" a partir do código fonte.";
- return result;
- }
-
- /*! put after an enum name in the list of all members */
- QCString trEnumName()
- { return "enumeração"; }
-
- /*! put after an enum value in the list of all members */
- QCString trEnumValue()
- { return "valor enumerado"; }
-
- /*! put after an undocumented member in the list of all members */
- QCString trDefinedIn()
- { return "definido em"; }
-
- // quick reference sections
-
- /*! This is put above each page as a link to the list of all groups of
- * compounds or files (see the \\group command).
- */
- QCString trModules()
- { return "Módulos"; }
-
- /*! This is put above each page as a link to the class hierarchy */
- QCString trClassHierarchy()
- { return "Hierarquia de classes"; }
-
- /*! This is put above each page as a link to the list of annotated classes */
- QCString trCompoundList()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Estruturas de dados";
- }
- else
- {
- return "Lista de componentes";
- }
- }
-
- /*! This is put above each page as a link to the list of documented files */
- QCString trFileList()
- { return "Lista de ficheiros"; }
-
- /*! This is put above each page as a link to the list of all verbatim headers */
- QCString trHeaderFiles()
- { return "Ficheiros incluídos"; }
-
- /*! This is put above each page as a link to all members of compounds. */
- QCString trCompoundMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Campos de dados";
- }
- else
- {
- return "Componentes membro";
- }
- }
-
- /*! This is put above each page as a link to all members of files. */
- QCString trFileMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Globais";
- }
- else
- {
- return "Ficheiros membro";
- }
- }
-
- /*! This is put above each page as a link to all related pages. */
- QCString trRelatedPages()
- { return "Páginas relacionadas"; }
-
- /*! This is put above each page as a link to all examples. */
- QCString trExamples()
- { return "Exemplos"; }
-
- /*! This is put above each page as a link to the search engine. */
- QCString trSearch()
- { return "Localizar"; }
-
- /*! This is an introduction to the class hierarchy. */
- QCString trClassHierarchyDescription()
- { return "Esta lista de heranças está organizada, dentro do possível, por ordem alfabética:"; }
-
- /*! This is an introduction to the list with all files. */
- QCString trFileListDescription(bool extractAll)
- {
- QCString result="Lista de todos os ficheiros ";
- if (!extractAll) result+="documentados ";
- result+="com uma breve descrição:";
- return result;
- }
-
- /*! This is an introduction to the annotated compound list. */
- QCString trCompoundListDescription()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Lista das estruturas de dados com uma breve descrição:";
- }
- else
- {
- return "Lista de classes, estruturas, uniões e interfaces com uma breve descrição:";
- }
- }
-
- /*! This is an introduction to the page with all class members. */
- QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result="Lista de todas as";
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+=" estruturas e campos de uniões";
- }
- else
- {
- result+=" classes membro";
- }
- if (!extractAll)
- {
- result+=" documentadas";
- }
- result+=" com referência para ";
- if (!extractAll)
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="a respectiva documentação:";
- }
- else
- {
- result+="a documentação de cada membro:";
- }
- }
- else
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="as estruturas/uniões a que pertencem:";
- }
- else
- {
- result+="as classes a que pertencem:";
- }
- }
- return result;
- }
-
- /*! This is an introduction to the page with all file members. */
- QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="Lista de ";
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="todas as funções, variáveis, definições, enumerações e definições de tipo ";
- if (!extractAll) result+="documentadas ";
- }
- else
- {
- result+="todos os ficheiros membro ";
- if (!extractAll) result+="documentados ";
- }
- result+="com referência para ";
- if (extractAll)
- result+="o ficheiro a que pertecem:";
- else
- result+="a respectiva documentação:";
- return result;
- }
-
- /*! This is an introduction to the page with the list of all header files. */
- QCString trHeaderFilesDescription()
- { return "Lista de todos os ficheiros cabeçalho que constituem a API:"; }
-
- /*! This is an introduction to the page with the list of all examples */
- QCString trExamplesDescription()
- { return "Lista de todos os exemplos:"; }
-
- /*! This is an introduction to the page with the list of related pages */
- QCString trRelatedPagesDescription()
- { return "Lista de documentação relacionada:"; }
-
- /*! This is an introduction to the page with the list of class/file groups */
- QCString trModulesDescription()
- { return "Lista de todos os módulos:"; }
-
- /*! This sentences is used in the annotated class/file lists if no brief
- * description is given.
- */
- QCString trNoDescriptionAvailable()
- { return "Nenhuma descrição disponível"; }
-
- // index titles (the project name is prepended for these)
-
-
- /*! This is used in HTML as the title of index.html. */
- QCString trDocumentation()
- { return "Documentação"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all groups.
- */
- QCString trModuleIndex()
- { return "Índice dos módulos"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * class hierarchy.
- */
- QCString trHierarchicalIndex()
- { return "Índice da hierarquia"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * annotated compound index.
- */
- QCString trCompoundIndex()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Índice das estruturas de dados";
- }
- else
- {
- return "Índice dos componentes";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * list of all files.
- */
- QCString trFileIndex()
- { return "Índice dos ficheiros"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all groups.
- */
- QCString trModuleDocumentation()
- { return "Documentação do módulo"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all classes, structs and unions.
- */
- QCString trClassDocumentation()
- { return "Documentação da classe"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all files.
- */
- QCString trFileDocumentation()
- { return "Documentação do ficheiro"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all examples.
- */
- QCString trExampleDocumentation()
- { return "Documentação do exemplo"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all related pages.
- */
- QCString trPageDocumentation()
- { return "Documentação da página"; }
-
- /*! This is used in LaTeX as the title of the document */
- QCString trReferenceManual()
- { return "Manual de referência"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of defines
- */
- QCString trDefines()
- { return "Macros"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of function prototypes
- */
- QCString trFuncProtos()
- { return "Protótipos de funções"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of typedefs
- */
- QCString trTypedefs()
- { return "Definições de tipos"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of enumerations
- */
- QCString trEnumerations()
- { return "Enumerações"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) functions
- */
- QCString trFunctions()
- { return "Funções"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- QCString trVariables()
- { return "Variáveis"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- QCString trEnumerationValues()
- { return "Valores da enumeração"; }
-
- /*! This is used in the documentation of a file before the list of
- * documentation blocks for defines
- */
- QCString trDefineDocumentation()
- { return "Documentação das macros"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for function prototypes
- */
- QCString trFunctionPrototypeDocumentation()
- { return "Documentação dos protótipos de funções"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for typedefs
- */
- QCString trTypedefDocumentation()
- { return "Documentação dos tipos"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration types
- */
- QCString trEnumerationTypeDocumentation()
- { return "Documentação dos valores da enumeração"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration values
- */
- QCString trEnumerationValueDocumentation()
- { return "Documentação dos elementos da enumeração"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for functions
- */
- QCString trFunctionDocumentation()
- { return "Documentação das funções"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for variables
- */
- QCString trVariableDocumentation()
- { return "Documentação das variáveis"; }
-
- /*! This is used in the documentation of a file/namespace/group before
- * the list of links to documented compounds
- */
- QCString trCompounds()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Estruturas de Dados";
- }
- else
- {
- return "Componentes";
- }
- }
-
- /*! This is used in the standard footer of each page and indicates when
- * the page was generated
- */
- QCString trGeneratedAt(const char *date,const char *projName)
- {
- QCString result=(QCString)"Gerado em "+date;
- if (projName) result+=(QCString)" para "+projName;
- result+=(QCString)" por";
- return result;
- }
- /*! This is part of the sentence used in the standard footer of each page.
- */
- QCString trWrittenBy()
- {
- return "escrito por";
- }
-
- /*! this text is put before a class diagram */
- QCString trClassDiagram(const char *clName)
- {
- return (QCString)"Diagrama de heranças da classe "+clName;
- }
-
- /*! this text is generated when the \\internal command is used. */
- QCString trForInternalUseOnly()
- { return "Apenas para uso interno."; }
-
- /*! this text is generated when the \\reimp command is used. */
- QCString trReimplementedForInternalReasons()
- { return "Redefinido por razões internas; A interface não foi afectada.";
- }
-
- /*! this text is generated when the \\warning command is used. */
- QCString trWarning()
- { return "Aviso"; }
-
- /*! this text is generated when the \\bug command is used. */
- QCString trBugsAndLimitations()
- { return "Bugs e limitações"; }
-
- /*! this text is generated when the \\version command is used. */
- QCString trVersion()
- { return "Versão"; }
-
- /*! this text is generated when the \\date command is used. */
- QCString trDate()
- { return "Data"; }
-
- /*! this text is generated when the \\return command is used. */
- QCString trReturns()
- { return "Retorna"; }
-
- /*! this text is generated when the \\sa command is used. */
- QCString trSeeAlso()
- { return "Veja também"; }
-
- /*! this text is generated when the \\param command is used. */
- QCString trParameters()
- { return "Parâmetros"; }
-
- /*! this text is generated when the \\exception command is used. */
- QCString trExceptions()
- { return "Excepções"; }
-
- /*! this text is used in the title page of a LaTeX document. */
- QCString trGeneratedBy()
- { return "Gerado por"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of page containing all the index of all namespaces. */
- virtual QCString trNamespaceList()
- { return "Lista de namespaces"; }
-
- /*! used as an introduction to the namespace list */
- virtual QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="Lista ";
- if (!extractAll) result+="de toda a documentação ";
- result+="dos namespaces com uma breve descrição:";
- return result;
- }
-
- /*! used in the class documentation as a header before the list of all
- * friends of a class
- */
- virtual QCString trFriends()
- { return "Amigos"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in the class documentation as a header before the list of all
- * related classes
- */
- virtual QCString trRelatedFunctionDocumentation()
- { return "Documentação das classes amigas e funções relacionadas"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of the HTML page of a class/struct/union */
- virtual QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- {
- QCString result="Referência ";
- switch(compType)
- {
- case ClassDef::Class: result+="à classe "; break;
- case ClassDef::Struct: result+="à estrutura "; break;
- case ClassDef::Union: result+="à união "; break;
- case ClassDef::Interface: result+="ao interface "; break;
- case ClassDef::Protocol: result+="protocol "; break; // translate me!
- case ClassDef::Category: result+="category "; break; // translate me!
- case ClassDef::Exception: result+="à excepção "; break;
- }
- if (isTemplate) result+="Template ";
- result+=(QCString)clName;
- return result;
- }
-
- /*! used as the title of the HTML page of a file */
- virtual QCString trFileReference(const char *fileName)
- {
- QCString result= "Referência ao ficheiro ";
- result += fileName;
- return result;
- }
-
- /*! used as the title of the HTML page of a namespace */
- virtual QCString trNamespaceReference(const char *namespaceName)
- {
- QCString result= "Referência ao namespace ";
- result += namespaceName;
- return result;
- }
-
- /* these are for the member sections of a class, struct or union */
- virtual QCString trPublicMembers()
- { return "Membros públicos"; }
- virtual QCString trPublicSlots()
- { return "Slots públicos"; }
- virtual QCString trSignals()
- { return "Sinais"; }
- virtual QCString trStaticPublicMembers()
- { return "Membros públicos estáticos"; }
- virtual QCString trProtectedMembers()
- { return "Membros protegidos"; }
- virtual QCString trProtectedSlots()
- { return "Slots protegidos"; }
- virtual QCString trStaticProtectedMembers()
- { return "Membros protegidos estáticos"; }
- virtual QCString trPrivateMembers()
- { return "Membros privados"; }
- virtual QCString trPrivateSlots()
- { return "Slots privados"; }
- virtual QCString trStaticPrivateMembers()
- { return "Membros privados estáticos"; }
-
- /*! this function is used to produce a comma-separated list of items.
- * use generateMarker(i) to indicate where item i should be put.
- */
- virtual QCString trWriteList(int numEntries)
- {
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=" e ";
- }
- }
- return result;
- }
-
- /*! used in class documentation to produce a list of base classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritsList(int numEntries)
- {
- return "Derivada de "+trWriteList(numEntries)+".";
- }
-
- /*! used in class documentation to produce a list of super classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritedByList(int numEntries)
- {
- return "Herdado por "+trWriteList(numEntries)+".";
- }
-
- /*! used in member documentation blocks to produce a list of
- * members that are hidden by this one.
- */
- virtual QCString trReimplementedFromList(int numEntries)
- {
- return "Reimplementado de "+trWriteList(numEntries)+".";
- }
-
- /*! used in member documentation blocks to produce a list of
- * all member that overwrite the implementation of this member.
- */
- virtual QCString trReimplementedInList(int numEntries)
- {
- return "Reimplementado em "+trWriteList(numEntries)+".";
- }
-
- /*! This is put above each page as a link to all members of namespaces. */
- virtual QCString trNamespaceMembers()
- { return "Membros do namespace"; }
-
- /*! This is an introduction to the page with all namespace members */
- virtual QCString trNamespaceMemberDescription(bool extractAll)
- {
- QCString result="Lista ";
- if (extractAll) result+="de todos os ";
- else result+="de toda a documentação dos ";
- result+="membros do namespace com referência para ";
- if (extractAll)
- result+="a documentação de cada membro:";
- else
- result+="o namespace correspondente:";
- return result;
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all namespaces.
- */
- virtual QCString trNamespaceIndex()
- { return "Índice dos namespaces"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all namespaces.
- */
- virtual QCString trNamespaceDocumentation()
- { return "Documentação dos namespaces"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- virtual QCString trNamespaces()
- { return "Namespaces"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990728
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is put at the bottom of a class documentation page and is
- * followed by a list of files that were used to generate the page.
- */
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)"A documentação para ";
- switch(compType)
- {
- case ClassDef::Class: result+="esta classe"; break;
- case ClassDef::Struct: result+="esta estrutura"; break;
- case ClassDef::Union: result+="esta união"; break;
- case ClassDef::Interface: result+="este interface"; break;
- case ClassDef::Protocol: result+="protocol"; break; // translate me!
- case ClassDef::Category: result+="category"; break; // translate me!
- case ClassDef::Exception: result+="esta excepção"; break;
- }
- result+=" foi gerada a partir ";
- if (single) result+=" do seguinte ficheiro:";
- else result+="dos seguintes ficheiros:";
- return result;
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- virtual QCString trAlphabeticalList()
- {
- return "Lista alfabética";
- }
-
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- virtual QCString trReturnValues()
- { return "Valores retornados"; }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- virtual QCString trMainPage()
- { return "Página principal"; }
-
- /*! This is used in references to page that are put in the LaTeX
- * documentation. It should be an abbreviation of the word page.
- */
- virtual QCString trPageAbbreviation()
- { return "p. "; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991003
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trSources()
- {
- return "Fontes";
- }
- virtual QCString trDefinedAtLineInSourceFile()
- {
- return "Definido na linha @0 do ficheiro @1.";
- }
- virtual QCString trDefinedInSourceFile()
- {
- return "Definido no ficheiro @0.";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDeprecated()
- {
- return "Desaprovado";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- virtual QCString trCollaborationDiagram(const char *clName)
- {
- return (QCString)"Diagrama de colaboração para "+clName+":";
- }
- /*! this text is put before an include dependency graph */
- virtual QCString trInclDepGraph(const char *fName)
- {
- return (QCString)"Diagrama de dependências de inclusão para "+fName+":";
- }
- /*! header that is put before the list of constructor/destructors. */
- virtual QCString trConstructorDocumentation()
- {
- return "Documentação dos Construtores & Destrutor";
- }
- /*! Used in the file documentation to point to the corresponding sources. */
- virtual QCString trGotoSourceCode()
- {
- return "Ir para o código fonte deste ficheiro.";
- }
- /*! Used in the file sources to point to the corresponding documentation. */
- virtual QCString trGotoDocumentation()
- {
- return "Ir para a documentação deste ficheiro.";
- }
- /*! Text for the \\pre command */
- virtual QCString trPrecondition()
- {
- return "Precondição";
- }
- /*! Text for the \\post command */
- virtual QCString trPostcondition()
- {
- return "Poscondição";
- }
- /*! Text for the \\invariant command */
- virtual QCString trInvariant()
- {
- return "Invariante";
- }
- /*! Text shown before a multi-line variable/enum initialization */
- virtual QCString trInitialValue()
- {
- return "Valor inicial:";
- }
- /*! Text used the source code in the file index */
- virtual QCString trCode()
- {
- return "código";
- }
- virtual QCString trGraphicalHierarchy()
- {
- return "Representação gráfica da hiearquia da classe";
- }
- virtual QCString trGotoGraphicalHierarchy()
- {
- return "Ir para a representação gráfica da hierarquia da classe";
- }
- virtual QCString trGotoTextualHierarchy()
- {
- return "Ir para a representação textual da hierarquia da classe";
- }
- virtual QCString trPageIndex()
- {
- return "Índice da página";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trNote()
- {
- return "Nota";
- }
- virtual QCString trPublicTypes()
- {
- return "Tipos Públicos";
- }
- virtual QCString trPublicAttribs()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Campos de Dados";
- }
- else
- {
- return "Atributos Públicos";
- }
- }
- virtual QCString trStaticPublicAttribs()
- {
- return "Atributos Públicos Estáticos";
- }
- virtual QCString trProtectedTypes()
- {
- return "Tipos Protegidos";
- }
- virtual QCString trProtectedAttribs()
- {
- return "Atributos Protegidos";
- }
- virtual QCString trStaticProtectedAttribs()
- {
- return "Atributos Protegidos Estáticos";
- }
- virtual QCString trPrivateTypes()
- {
- return "Tipos Privados";
- }
- virtual QCString trPrivateAttribs()
- {
- return "Atributos Privados";
- }
- virtual QCString trStaticPrivateAttribs()
- {
- return "Atributos Privados Estáticos";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a todo item */
- virtual QCString trTodo()
- {
- return "Tarefa";
- }
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- {
- return "Lista de tarefas";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy()
- {
- return "Referenciado por";
- }
- virtual QCString trRemarks()
- {
- return "Observações";
- }
- virtual QCString trAttention()
- {
- return "Atenção";
- }
- virtual QCString trInclByDepGraph()
- {
- return "Este grafo mostra quais são os ficheiros que incluem directamente ou indirectamente este ficheiro:";
- }
- virtual QCString trSince()
- {
- return "Desde";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- virtual QCString trLegendTitle()
- {
- return "Legenda do grafo";
- }
- /*! page explaining how the dot graph's should be interpreted */
- virtual QCString trLegendDocs()
- {
- return
- "Esta página explica como interpretar os grafos gerados pelo doxygen.<p>\n"
- "Considere o seguinte exemplo:\n"
- "\\code\n"
- "/*! Esta classe vai estar escondida devido à truncação */\n"
- "class Invisible { };\n\n"
- "/*! Esta classe tem a relação de herança escondida */\n"
- "class Truncated : public Invisible { };\n\n"
- "/* Classe não documentada por comentários doxygen */\n"
- "class Undocumented { };\n\n"
- "/*! Classe derivada usando derivação pública */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! Classe derivada usando derivação protegida */\n"
- "class ProtectedBase { };\n\n"
- "/*! Classe derivada usando derivação privada */\n"
- "class PrivateBase { };\n\n"
- "/*! Classe usada pela classe Inherited */\n"
- "class Used { };\n\n"
- "/*! Super classe que deriva de várias classes */\n"
- "class Inherited : public PublicBase,\n"
- " protected ProtectedBase,\n"
- " private PrivateBase,\n"
- " public Undocumented\n"
- "{\n"
- " private:\n"
- " Used *m_usedClass;\n"
- "};\n"
- "\\endcode\n"
- "Se no ficheiro de configuração estiver a tag \\c MAX_DOT_GRAPH_HEIGHT "
- "com o valor de 200 então o seguinte grafo será gerado:"
- "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
- "As caixas no grafo anterior têm as seguintes interpretações:\n"
- "<ul>\n"
- "<li>Uma caixa inteiramente preta representa a estrutura ou a classe para "
- "a qual o grafo foi gerado.\n"
- "<li>Uma caixa com borda preta representa uma estrutura ou classe documentada.\n"
- "<li>Uma caixa com borda cinzenta representa uma estrutura ou classe não documentada.\n"
- "<li>Uma caixa com borda vermelha representa uma estrutura ou classe documentada onde "
- "nem todas as relações de herança/encapsulamento são exibidas. Um grafo é truncado "
- "quando não cabe na sua área predefinida.\n"
- "</ul>\n"
- "As setas têm a seguinte interpretação:\n"
- "<ul>\n"
- "<li>Uma seta azul escura representa uma relação de herança pública entre duas classes.\n"
- "<li>Uma seta verde escura representa uma relação de herança protegida.\n"
- "<li>Uma seta vermelha escura representa uma relação de herança privada.\n"
- "<li>Uma seta rocha em tracejado representa uma relação de encapsulamento ou uso por "
- "parte de outra classe. A legenda da seta contém o nome da variável ou variáveis da "
- "relação. A seta aponta da classe que estabelece a relação para a classe ou estrutura que "
- "é acessível.\n"
- "</ul>\n";
- }
- /*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return "legenda";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return "Teste";
- }
- /*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return "Lista de teste";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return "Métodos DCOP";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return "Propriedades";
- }
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return "Documentação das propriedades";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java interfaces in the summary section of Java packages */
- virtual QCString trInterfaces()
- {
- return "Interfaces";
- }
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Estruturas de dados";
- }
- else
- {
- return "Classes";
- }
- }
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
- {
- return (QCString)"Pacote "+name;
- }
- /*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return "Lista de pacotes";
- }
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return "Lista de pacotes com uma breve descrição (se disponível):";
- }
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return "Pacotes";
- }
- /*! Used as a chapter title for Latex & RTF output */
- virtual QCString trPackageDocumentation()
- {
- return "Documentação do pacote";
- }
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return "Valor:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return "Bug";
- }
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return "Lista de Bugs";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as ansicpg for RTF file
- *
- * The following table shows the correlation of Charset name, Charset Value and
- * <pre>
- * Codepage number:
- * Charset Name Charset Value(hex) Codepage number
- * ------------------------------------------------------
- * DEFAULT_CHARSET 1 (x01)
- * SYMBOL_CHARSET 2 (x02)
- * OEM_CHARSET 255 (xFF)
- * ANSI_CHARSET 0 (x00) 1252
- * RUSSIAN_CHARSET 204 (xCC) 1251
- * EE_CHARSET 238 (xEE) 1250
- * GREEK_CHARSET 161 (xA1) 1253
- * TURKISH_CHARSET 162 (xA2) 1254
- * BALTIC_CHARSET 186 (xBA) 1257
- * HEBREW_CHARSET 177 (xB1) 1255
- * ARABIC _CHARSET 178 (xB2) 1256
- * SHIFTJIS_CHARSET 128 (x80) 932
- * HANGEUL_CHARSET 129 (x81) 949
- * GB2313_CHARSET 134 (x86) 936
- * CHINESEBIG5_CHARSET 136 (x88) 950
- * </pre>
- *
- */
- virtual QCString trRTFansicp()
- {
- return "1252";
- }
-
-
- /*! Used as ansicpg for RTF fcharset
- * \see trRTFansicp() for a table of possible values.
- */
- virtual QCString trRTFCharSet()
- {
- return "0";
- }
-
- /*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return "Índice";
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trClass(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Classe" : "classe"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trFile(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Ficheiro" : "ficheiro"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trNamespace(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Namespace" : "namespace"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trGroup(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Grupo" : "grupo"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trPage(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Página" : "página"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trMember(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Membro" : "membro"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trField(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Campo" : "campo"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trGlobal(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Globa" : "globa"));
- result+= singular? "l" : "ais";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is generated when the \\author command is used and
- * for the author section in man pages. */
- virtual QCString trAuthor(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Autor" : "autor"));
- if (!singular) result+="es";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return "Referências";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Implementa "+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 "Implementado em "+trWriteList(numEntries)+".";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.16
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in RTF documentation as a heading for the Table
- * of Contents.
- */
- virtual QCString trRTFTableOfContents()
- {
- return "Índice";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.17
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as the header of the list of item that have been
- * flagged deprecated
- */
- virtual QCString trDeprecatedList()
- {
- return "Lista de Deprecados";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.18
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a header for declaration section of the events found in
- * a C# program
- */
- virtual QCString trEvents()
- {
- return "Eventos";
- }
- /*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- return "Documentação dos eventos";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a heading for a list of Java class types with package scope.
- */
- virtual QCString trPackageTypes()
- {
- return "Tipos do Pacote";
- }
- /*! Used as a heading for a list of Java class functions with package
- * scope.
- */
- virtual QCString trPackageMembers()
- {
- return "Funções do Pacote";
- }
- /*! Used as a heading for a list of static Java class functions with
- * package scope.
- */
- virtual QCString trStaticPackageMembers()
- {
- return "Funções Estáticas do Pacote";
- }
- /*! Used as a heading for a list of Java class variables with package
- * scope.
- */
- virtual QCString trPackageAttribs()
- {
- return "Atributos do Pacote";
- }
- /*! Used as a heading for a list of static Java class variables with
- * package scope.
- */
- virtual QCString trStaticPackageAttribs()
- {
- return "Atributos Estáticos do Pacote";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Tudo";
- }
- /*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- return "Grafo de chamadas desta função:";
- }
-
-};
-
-#endif
diff --git a/src/translator_ro.h b/src/translator_ro.h
deleted file mode 100644
index 1ab2b7b..0000000
--- a/src/translator_ro.h
+++ /dev/null
@@ -1,1621 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-
-/* The translation from English to Romanian by Alexandru Iosup [aiosup@yahoo.com].
- *
- * Disclaimer: I hope I translated these to Romanian keeping
- * the meaning of the sentences intact. I used C-words were possible,
- * (e.g. the Romanian "definire de tip" for "typedef" is too long and
- * unexpressive).
- *
- * If you have suggestions, please mail the comments and text proposals to the address
- * shown aprox.10 lines above
- *
- * -------------------------------------------
- * Project start : 20.Sep.2k
- * Last Doxygen version covered : 1.4.1
- * Last revision : 01.Mar.2k5
- * -------------------------------------------
- *
- * Revision history
- * ----------------
- * 01.Mar.2k5 Third revision, covering Doxygen 1.4.1
- *
- * 07.Mar.2k2 Second revision, covering Doxygen 1.2.14
- * - fixed some bugs
- *
- * 20.Sep.2k First version, covering Doxygen 1.2.1
- *
- */
-#ifndef TRANSLATOR_RO_H
-#define TRANSLATOR_RO_H
-
-
-class TranslatorRomanian : public TranslatorAdapter_1_4_1
-{
- public:
-
- // --- Language control methods -------------------
-
- /*! Used for identification of the language. The identification
- * should not be translated. It should be replaced by the name
- * of the language in English using lower-case characters only
- * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
- * the identification used in language.cpp.
- */
- virtual QCString idLanguage()
- { return "romanian"; }
- /*! Used to get the LaTeX command(s) for the language support.
- * This method should return string with commands that switch
- * LaTeX to the desired language. For example
- * <pre>"\\usepackage[german]{babel}\n"
- * </pre>
- * or
- * <pre>"\\usepackage{polski}\n"
- * "\\usepackage[latin2]{inputenc}\n"
- * "\\usepackage[T1]{fontenc}\n"
- * </pre>
- *
- * The English LaTeX does not use such commands. Because of this
- * the empty string is returned in this implementation.
- */
- virtual QCString latexLanguageSupportCommand()
- {
- return "\\usepackage{romanian}\n";
- }
-
- /*! return the language charset. This will be used for the HTML output */
- virtual QCString idLanguageCharset()
- {
- return "iso-8859-2";
- }
-
- // --- Language translation methods -------------------
-
- /*! used in the compound documentation before a list of related functions. */
- virtual QCString trRelatedFunctions()
- { return "Funcþii înrudite"; }
-
- /*! subscript for the related functions. */
- virtual QCString trRelatedSubscript()
- { return "(Atenþie: NU sunt funcþii membre.)"; }
-
- /*! header that is put before the detailed description of files, classes and namespaces. */
- virtual QCString trDetailedDescription()
- { return "Descriere Detaliatã"; }
-
- /*! header that is put before the list of typedefs. */
- virtual QCString trMemberTypedefDocumentation()
- { return "Documentaþia Declaraþiilor Typedef membre"; }
-
- /*! header that is put before the list of enumerations. */
- virtual QCString trMemberEnumerationDocumentation()
- { return "Documentaþia membrilor Enum"; }
-
- /*! header that is put before the list of member functions. */
- virtual QCString trMemberFunctionDocumentation()
- { return "Documentaþia Funcþiilor membre"; }
-
- /*! header that is put before the list of member attributes. */
- virtual QCString trMemberDataDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Documentaþia Câmpurilor";
- }
- else
- {
- return "Documentaþia Datelor membre";
- }
-
- }
-
- /*! this is the text of a link put after brief descriptions. */
- virtual QCString trMore()
- { return "Mai mult..."; }
-
- /*! put in the class documentation */
- virtual QCString trListOfAllMembers()
- { return "Lista tuturor membrilor."; }
-
- /*! used as the title of the "list of all members" page of a class */
- virtual QCString trMemberList()
- { return "Lista Membrilor"; }
-
- /*! this is the first part of a sentence that is followed by a class name */
- virtual QCString trThisIsTheListOfAllMembers()
- { return "Lista completã a membrilor din "; }
-
- /*! this is the remainder of the sentence after the class name */
- virtual QCString trIncludingInheritedMembers()
- { return ", inclusiv a tuturor membrilor moºteniþi."; }
-
- /*! 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="Generat automat de Doxygen";
- if (s) result+=(QCString)" pentru "+s;
- result+=" din codul sursã.";
- return result;
- }
-
- /*! put after an enum name in the list of all members */
- virtual QCString trEnumName()
- { return "nume enum"; }
-
- /*! put after an enum value in the list of all members */
- virtual QCString trEnumValue()
- { return "valoare enum"; }
-
- /*! put after an undocumented member in the list of all members */
- virtual QCString trDefinedIn()
- { return "definit în"; }
-
- // 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 "Module"; }
-
- /*! This is put above each page as a link to the class hierarchy */
- virtual QCString trClassHierarchy()
- { return "Ierarhia Claselor"; }
-
- /*! This is put above each page as a link to the list of annotated classes */
- virtual QCString trCompoundList()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Structuri de Date";
- }
- else
- {
- return "Lista Membrilor Componenþi";
- }
-
- }
-
- /*! This is put above each page as a link to the list of documented files */
- virtual QCString trFileList()
- { return "Lista fiºierelor"; }
-
- /*! This is put above each page as a link to the list of all verbatim headers */
- virtual QCString trHeaderFiles()
- { return "Fiºiere Header"; }
-
- /*! This is put above each page as a link to all members of compounds. */
- virtual QCString trCompoundMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Câmpurile de Date";
- }
- else
- {
- return "Membrii Componenþi"; //cu articol hotarat
- }
-
- }
-
- /*! This is put above each page as a link to all members of files. */
- virtual QCString trFileMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Globale";
- }
- else
- {
- return "Membrii din Fiºier"; //cu articol hotarat
- }
-
- }
-
- /*! This is put above each page as a link to all related pages. */
- virtual QCString trRelatedPages()
- { return "Pagini înrudite"; }
-
- /*! This is put above each page as a link to all examples. */
- virtual QCString trExamples()
- { return "Exemples"; }
-
- /*! This is put above each page as a link to the search engine. */
- virtual QCString trSearch()
- { return "Cautã"; }
-
- /*! This is an introduction to the class hierarchy. */
- virtual QCString trClassHierarchyDescription()
- { return "Aceastã listã de legãturi este sortatã în general, "
- "dar nu complet, în ordine alfabeticã:";
- }
-
- /*! This is an introduction to the list with all files. */
- virtual QCString trFileListDescription(bool extractAll)
- {
- QCString result="Lista tuturor ";
- result+="fiºierelor";
- if (!extractAll) result+=" documentate";
- result+=", cu scurte descrieri:";
- return result;
- }
-
- /*! This is an introduction to the annotated compound list. */
- virtual QCString trCompoundListDescription()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Lista structurilor de date, cu scurte descrieri:";
- }
- else
- {
- return "Lista claselor, structurilor, uniunilor ºi interfeþelor"
- ", cu scurte descrieri:";
- }
-
- }
-
- /*! This is an introduction to the page with all class members. */
- virtual QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result="Lista tuturor ";
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="câmpurilor ";
- if (!extractAll) result+=" documentate ";
- result+="din structuri si uniuni ";
- }
- else
- {
- result+="membrilor ";
- if (!extractAll) result+="documentaþi ";
- result+="din toate clasele ";
- }
- result+=", cu legãturi cãtre ";
- if (!extractAll)
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="documentaþia structurii/uniunii pentru fiecare câmp în parte:";
- }
- else
- {
- result+="documentaþia clasei pentru fiecare membru în parte:";
- }
- }
- else
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="structurile/uniunile de care aparþin:";
- }
- else
- {
- result+="clasele de care aparþin:";
- }
- }
-
- return result;
- }
-
- /*! This is an introduction to the page with all file members. */
- virtual QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="Lista tuturor ";
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="funcþiilor, variabilelor, define-urilor, enum-urilor ºi typedef-urilor";
- if (!extractAll) result+=" documentate";
- }
- else
- {
- result+="membrilor ";
- if (!extractAll) result+="documentaþi ";
- result+="din toate fiºierele";
- }
- result+=", cu legãturi cãtre ";
- if (extractAll)
- result+="fiºierele de care aparþin:";
- else
- result+="documentaþia aferentã:";
-
- return result;
- }
-
- /*! This is an introduction to the page with the list of all header files. */
- virtual QCString trHeaderFilesDescription()
- { return "Lista fiºierele Header care fac parte din API:"; }
-
- /*! This is an introduction to the page with the list of all examples */
- virtual QCString trExamplesDescription()
- { return "Lista tuturor exemplelor:"; }
-
- /*! This is an introduction to the page with the list of related pages */
- virtual QCString trRelatedPagesDescription()
- { return "Lista tuturor documentaþiilor înrudite:"; }
-
- /*! This is an introduction to the page with the list of class/file groups */
- virtual QCString trModulesDescription()
- { return "Lista tuturor modulelor:"; }
-
- /*! This sentences is used in the annotated class/file lists if no brief
- * description is given.
- */
- virtual QCString trNoDescriptionAvailable()
- { return "Nici o descriere disponibilã"; }
-
- // index titles (the project name is prepended for these)
-
-
- /*! This is used in HTML as the title of index.html. */
- virtual QCString trDocumentation()
- { return "Documentaþie"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all groups.
- */
- virtual QCString trModuleIndex()
- { return "Indexul Modulelor"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * class hierarchy.
- */
- virtual QCString trHierarchicalIndex()
- { return "Index Ierarhic"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * annotated compound index.
- */
- virtual QCString trCompoundIndex()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Indexul Structurilor de Date";
- }
- else
- {
- return "Indexul Claselor";
- }
-
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * list of all files.
- */
- virtual QCString trFileIndex()
- { return "Indexul Fiºierelor"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all groups.
- */
- virtual QCString trModuleDocumentation()
- { return "Documentaþia Modulelor"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all classes, structs and unions.
- */
- virtual QCString trClassDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Documentaþia Structurilor de Date";
- }
- else
- {
- return "Documentaþia Claselor";
- }
-
- }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all files.
- */
- virtual QCString trFileDocumentation()
- { return "Documentaþia Fiºierelor"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all examples.
- */
- virtual QCString trExampleDocumentation()
- { return "Documentaþia Exemplelor"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all related pages.
- */
- virtual QCString trPageDocumentation()
- { return "Documentaþii înrudite"; }
-
- /*! This is used in LaTeX as the title of the document */
- virtual QCString trReferenceManual()
- { return "Manual de utilizare"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of defines
- */
- virtual QCString trDefines()
- { return "Definiþii"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of function prototypes
- */
- virtual QCString trFuncProtos()
- { return "Prototipuri de funcþii"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of typedefs
- */
- virtual QCString trTypedefs()
- { return "Declaraþii Typedef"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of enumerations
- */
- virtual QCString trEnumerations()
- { return "Enumeraþii"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) functions
- */
- virtual QCString trFunctions()
- { return "Funcþii"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trVariables()
- { return "Variabile"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trEnumerationValues()
- { return "Valori enum"; }
-
- /*! This is used in the documentation of a file before the list of
- * documentation blocks for defines
- */
- virtual QCString trDefineDocumentation()
- { return "Documentaþia definiþiilor"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for function prototypes
- */
- virtual QCString trFunctionPrototypeDocumentation()
- { return "Documentaþia prototipurilor de funcþii"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for typedefs
- */
- virtual QCString trTypedefDocumentation()
- { return "Documentaþia definiþiilor Typedef"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration types
- */
- virtual QCString trEnumerationTypeDocumentation()
- { return "Documentaþia tipurilor enum"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration values
- */
- virtual QCString trEnumerationValueDocumentation()
- { return "Documentaþia valorilor enum"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for functions
- */
- virtual QCString trFunctionDocumentation()
- { return "Documentaþia funcþiilor"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for variables
- */
- virtual QCString trVariableDocumentation()
- { return "Documentaþia variabilelor"; }
-
- /*! This is used in the documentation of a file/namespace/group before
- * the list of links to documented compounds
- */
- virtual QCString trCompounds()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Structuri de Date";
- }
- else
- {
- return "Membri";
- }
-
- }
-
- /*! 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)"Generat "+date;
- if (projName) result+=(QCString)" pentru "+projName;
- result+=(QCString)" de cãtre";
- return result;
- }
- /*! This is part of the sentence used in the standard footer of each page.
- */
- virtual QCString trWrittenBy()
- {
- return "scris de";
- }
-
- /*! this text is put before a class diagram */
- virtual QCString trClassDiagram(const char *clName)
- {
- return (QCString)"Diagrama de relaþii pentru "+clName;
- }
-
- /*! this text is generated when the \\internal command is used. */
- virtual QCString trForInternalUseOnly()
- { return "Doar pentru uz intern."; }
-
- /*! this text is generated when the \\reimp command is used. */
- virtual QCString trReimplementedForInternalReasons()
- { return "Reimplementat din motive interne; API-ul nu este afectat."; }
-
- /*! this text is generated when the \\warning command is used. */
- virtual QCString trWarning()
- { return "Atenþie"; }
-
- /*! this text is generated when the \\bug command is used. */
- virtual QCString trBugsAndLimitations()
- { return "Buguri ºi limitãri"; }
-
- /*! this text is generated when the \\version command is used. */
- virtual QCString trVersion()
- { return "Versiunea"; }
-
- /*! this text is generated when the \\date command is used. */
- virtual QCString trDate()
- { return "Data"; }
-
- /*! this text is generated when the \\return command is used. */
- virtual QCString trReturns()
- { return "Întoarce"; }
-
- /*! this text is generated when the \\sa command is used. */
- virtual QCString trSeeAlso()
- { return "Vezi ºi"; }
-
- /*! this text is generated when the \\param command is used. */
- virtual QCString trParameters()
- { return "Parametri"; }
-
- /*! this text is generated when the \\exception command is used. */
- virtual QCString trExceptions()
- { return "Excepþii"; }
-
- /*! this text is used in the title page of a LaTeX document. */
- virtual QCString trGeneratedBy()
- { return "Generat de"; }
-
- // new since 0.49-990307
-
- /*! used as the title of page containing all the index of all namespaces. */
- virtual QCString trNamespaceList()
- { return "Lista Namespace"; }
-
- /*! used as an introduction to the namespace list */
- virtual QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="Lista tuturor ";
- result+="namespace-urilor ";
- if (!extractAll) result+="documentate ";
- result+=", cu scurte descrieri:";
- return result;
- }
-
- /*! used in the class documentation as a header before the list of all
- * friends of a class
- */
- virtual QCString trFriends()
- { return "Prieteni"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in the class documentation as a header before the list of all
- * related classes
- */
- virtual QCString trRelatedFunctionDocumentation()
- { return "Documentaþia funcþiilor prietene sau înrudite"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of the HTML page of a class/struct/union */
- virtual QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- {
- QCString result="Referinþã la ";
- switch(compType)
- {
- case ClassDef::Class: result+="clasa"; break;
- case ClassDef::Struct: result+="structura"; break;
- case ClassDef::Union: result+="uniunea"; break;
- case ClassDef::Interface: result+="interfaþa"; break;
- case ClassDef::Protocol: result+="protocol"; break; // translate me!
- case ClassDef::Category: result+="category"; break; // translate me!
- case ClassDef::Exception: result+="excepþia"; break;
- }
- if (isTemplate) result+=" (Template) ";
- result+=(QCString)clName;
-
- return result;
- }
-
- /*! used as the title of the HTML page of a file */
- virtual QCString trFileReference(const char *fileName)
- {
- QCString result="Referinþã la fiºierul";
- result+=fileName;
- return result;
- }
-
- /*! used as the title of the HTML page of a namespace */
- virtual QCString trNamespaceReference(const char *namespaceName)
- {
- QCString result="Referinþã la Namespace-ul ";
- result+=namespaceName;
- return result;
- }
-
- /* these are for the member sections of a class, struct or union */
- virtual QCString trPublicMembers()
- { return "Metode Publice"; }
- virtual QCString trPublicSlots()
- { return "Conectori (slots) Publici"; }
- virtual QCString trSignals()
- { return "Semnale"; }
- virtual QCString trStaticPublicMembers()
- { return "Metode Statice Publice"; }
- virtual QCString trProtectedMembers()
- { return "Metode Protejate"; }
- virtual QCString trProtectedSlots()
- { return "Sloturi Protejate"; }
- virtual QCString trStaticProtectedMembers()
- { return "Metode Statice Protejate"; }
- virtual QCString trPrivateMembers()
- { return "Metode Private"; }
- virtual QCString trPrivateSlots()
- { return "Conectori (slots) Privaþi"; }
- virtual QCString trStaticPrivateMembers()
- { return "Metode Statice Private"; }
-
- /*! this function is used to produce a comma-separated list of items.
- * use generateMarker(i) to indicate where item i should be put.
- */
- virtual QCString trWriteList(int numEntries)
- {
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=" ºi ";
- }
- }
- return result;
- }
-
- /*! used in class documentation to produce a list of base classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritsList(int numEntries)
- {
- return "Moºteneºte "+trWriteList(numEntries)+".";
- }
-
- /*! used in class documentation to produce a list of super classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritedByList(int numEntries)
- {
- return "Moºtenit de "+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 "Reimplementat din "+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 "Reimplementat în "+trWriteList(numEntries)+".";
- }
-
- /*! This is put above each page as a link to all members of namespaces. */
- virtual QCString trNamespaceMembers()
- { return "Membrii Namespace-ului"; }
-
- /*! This is an introduction to the page with all namespace members */
- virtual QCString trNamespaceMemberDescription(bool extractAll)
- {
- QCString result="Lista tuturor membrilor ";
- if (!extractAll) result+="documentaþi ";
- result+="din toate namespace-urile, cu legãturi cãtre ";
-
- if (extractAll)
- result+="documentaþia namespace-ului pentru fiecare membru în parte:";
- else
- result+="namespace-urile de care aparþin:";
- return result;
- }
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all namespaces.
- */
- virtual QCString trNamespaceIndex()
- { return "Indexul Namespace-ului"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all namespaces.
- */
- virtual QCString trNamespaceDocumentation()
- { return "Documentaþia Namespace-ului"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- virtual QCString trNamespaces()
- { return "Namespace-uri"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990728
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is put at the bottom of a class documentation page and is
- * followed by a list of files that were used to generate the page.
- */
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)"Documentaþia pentru aceastã ";
- switch(compType)
- {
- case ClassDef::Class: result+="clasã"; break;
- case ClassDef::Struct: result+="structurã"; break;
- case ClassDef::Union: result+="uniune"; break;
- case ClassDef::Interface: result+="interfaþã"; break;
- case ClassDef::Protocol: result+="protocol"; break; // translate me!
- case ClassDef::Category: result+="category"; break; // translate me!
- case ClassDef::Exception: result+="excepþie"; break;
- }
- result+=" a fost generatã din fiºier";
- if (single) result+="ul:"; else result+="ele:";
- return result;
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- virtual QCString trAlphabeticalList()
- { return "Listã Alfabeticã"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- virtual QCString trReturnValues()
- { return "Valori returnate"; }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- virtual QCString trMainPage()
- { return "Pagina principalã"; }
-
- /*! This is used in references to page that are put in the LaTeX
- * documentation. It should be an abbreviation of the word page.
- */
- virtual QCString trPageAbbreviation()
- { return "pg."; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991003
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trSources()
- {
- return "Surse";
- }
- virtual QCString trDefinedAtLineInSourceFile()
- {
- return "Definiþia în linia @0 a fiºierului @1.";
- }
- virtual QCString trDefinedInSourceFile()
- {
- return "Definiþia în fiºierul @0.";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDeprecated()
- {
- return "Învechitã(Deprecated)";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- virtual QCString trCollaborationDiagram(const char *clName)
- {
- return (QCString)"Diagrama de relaþii pentru "+clName+":";
- }
- /*! this text is put before an include dependency graph */
- virtual QCString trInclDepGraph(const char *fName)
- {
- return (QCString)"Graful dependenþelor prin incluziune pentru "+fName+":";
- }
- /*! header that is put before the list of constructor/destructors. */
- virtual QCString trConstructorDocumentation()
- {
- return "Documentaþia pentru Constructori ºi Destructori";
- }
- /*! Used in the file documentation to point to the corresponding sources. */
- virtual QCString trGotoSourceCode()
- {
- return "Vezi sursele.";
- }
- /*! Used in the file sources to point to the corresponding documentation. */
- virtual QCString trGotoDocumentation()
- {
- return "Vezi documentaþia.";
- }
- /*! Text for the \\pre command */
- virtual QCString trPrecondition()
- {
- return "Precondiþie";
- }
- /*! Text for the \\post command */
- virtual QCString trPostcondition()
- {
- return "Postcondiþie";
- }
- /*! Text for the \\invariant command */
- virtual QCString trInvariant()
- {
- return "Invariant";
- }
- /*! Text shown before a multi-line variable/enum initialization */
- virtual QCString trInitialValue()
- {
- return "Iniþializare:";
- }
- /*! Text used the source code in the file index */
- virtual QCString trCode()
- {
- return "cod";
- }
- virtual QCString trGraphicalHierarchy()
- {
- return "Ierarhia claselor în mod grafic";
- }
- virtual QCString trGotoGraphicalHierarchy()
- {
- return "Vezi ierarhia claselor în mod grafic";
- }
- virtual QCString trGotoTextualHierarchy()
- {
- return "Vezi ierarhia claselor în mod text";
- }
- virtual QCString trPageIndex()
- {
- return "Indexul Paginilor";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trNote()
- {
- return "Notã";
- }
- virtual QCString trPublicTypes()
- {
- return "Tipuri Publice";
- }
- virtual QCString trPublicAttribs()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Câmpuri de Date";
- }
- else
- {
- return "Atribute Publice";
- }
-
- }
- virtual QCString trStaticPublicAttribs()
- {
- return "Atribute Statice Publice";
- }
- virtual QCString trProtectedTypes()
- {
- return "Tipuri Protejate";
- }
- virtual QCString trProtectedAttribs()
- {
- return "Atribute Protejate";
- }
- virtual QCString trStaticProtectedAttribs()
- {
- return "Atribute Statice Protejate";
- }
- virtual QCString trPrivateTypes()
- {
- return "Tipuri Private";
- }
- virtual QCString trPrivateAttribs()
- {
- return "Atribute Private";
- }
- virtual QCString trStaticPrivateAttribs()
- {
- return "Atribute Statice Private";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a todo item */
- virtual QCString trTodo()
- {
- return "De fãcut";
- }
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- {
- return "Lista lucrurilor de fãcut";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy()
- {
- return "Semnalat de";
- }
- virtual QCString trRemarks()
- {
- return "Observaþii";
- }
- virtual QCString trAttention()
- {
- return "Atenþie";
- }
- virtual QCString trInclByDepGraph()
- {
- return "Acest graf aratã care fiºiere includ, "
- "direct sau indirect, acest fiºier:";
- }
- virtual QCString trSince()
- {
- return "Din";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- virtual QCString trLegendTitle()
- {
- return "Legenda grafului";
- }
- /*! page explaining how the dot graph's should be interpreted */
- virtual QCString trLegendDocs()
- {
- return
- "Aceastã paginã aratã modul în care trebuie sã interpretaþi "
- "grafurile generate de doxygen.<p>\n"
- "Consideraþi urmãtorul exemplu:\n"
- "\\code\n"
- "/*! Clasã invizibilã, tãiatã din cauza depãºirii spaþiului */\n"
- "class Invisible { };\n\n"
- "/*! Altã clasã tãiatã, relaþia de moºtenire este ascunsã */\n"
- "class Truncated : public Invisible { };\n\n"
- "/* Clasã necomentatã în stil doxygen */\n"
- "class Undocumented { };\n\n"
- "/*! Clasã care este moºtenitã în mod public */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! Clasã care este moºtenitã în mod protejat */\n"
- "class ProtectedBase { };\n\n"
- "/*! Clasã care este moºtenitã în mod privat */\n"
- "class PrivateBase { };\n\n"
- "/*! Clasã care este folositã de clasa Inherited */\n"
- "class Used { };\n\n"
- "/*! Superclasã care moºteneºte un numãr de alte clase */\n"
- "class Inherited : public PublicBase,\n"
- " protected ProtectedBase,\n"
- " private PrivateBase,\n"
- " public Undocumented\n"
- "{\n"
- " private:\n"
- " Used *m_usedClass;\n"
- "};\n"
- "\\endcode\n"
- "Dacã tagul \\c MAX_DOT_GRAPH_HEIGHT din fiºierul de configuraþie "
- "Este setat la 200 acesta este graful rezultat:"
- "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
- "Cãsuþele din partea de sus au urmãtoarea semnificaþie:\n"
- "<ul>\n"
- "<li>O cãsuþã neagrã reprezintã structura sau clasa pentru care "
- "graful este generat.\n"
- "<li>O cãsuþã cu marginea neagrã reprezintã o structurã sau o clasã documentate.\n"
- "<li>O cãsuþã cu marginea gri reprezintã o structurã sau o clasã nedocumentate.\n"
- "<li>O cãsuþã cu marginea roºie reprezintã o structurã sau o clasã documentate, pentru\n"
- "care nu toate relaþiile de moºtenire/incluziune sunt arãtate. Un graf este "
- "tãiat dacã nu încape în marginile specificate."
- "</ul>\n"
- "Sãgeþile au urmãtoarea semnificaþie:\n"
- "<ul>\n"
- "<li>O sãgeatã de un albastru închis este folositã când avem o relaþie de "
- "moºtenire publicã între douã clase.\n"
- "<li>O sãgeatã de un verde închis este folositã când avem o moºtenire protejatã.\n"
- "<li>O sãgeatã de un roºu închis este folositã când avem o moºtenire privatã.\n"
- "<li>O sãgeatã violetã punctatã este folositã pentru o clasã conþinutã sau folositã "
- "de o altã clasã. Sãgeata este marcatã cu variabila(e) "
- "prin care este accesibilã clasa sau structura spre care este îndreptatã. \n"
- "</ul>\n";
- }
- /*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return "legenda";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return "Test";
- }
- /*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return "Listã de teste";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return "Metode DCOP";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return "Proprietãþi";
- }
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return "Documentaþia Proprietãþilor";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java interfaces in the summary section of Java packages */
- virtual QCString trInterfaces()
- {
- return "Interfeþe";
- }
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Structuri de Date";
- }
- else
- {
- return "Clase";
- }
- }
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
- {
- return (QCString)"Pachet "+name;
- }
- /*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return "Lista Pachetelor";
- }
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return "Lista pachetelor, însoþitã de scurte explicaþii, acolo unde acestea existã:";
- }
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return "Pachete";
- }
- /*! Used as a chapter title for Latex & RTF output */
- virtual QCString trPackageDocumentation()
- {
- return "Documentaþia Pachetelor";
- }
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return "Valoare:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return "Problema (Bug)";
- }
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return "Lista de Probleme (Bugs)";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as ansicpg for RTF file
- *
- * The following table shows the correlation of Charset name, Charset Value and
- * <pre>
- * Codepage number:
- * Charset Name Charset Value(hex) Codepage number
- * ------------------------------------------------------
- * DEFAULT_CHARSET 1 (x01)
- * SYMBOL_CHARSET 2 (x02)
- * OEM_CHARSET 255 (xFF)
- * ANSI_CHARSET 0 (x00) 1252
- * RUSSIAN_CHARSET 204 (xCC) 1251
- * EE_CHARSET 238 (xEE) 1250
- * GREEK_CHARSET 161 (xA1) 1253
- * TURKISH_CHARSET 162 (xA2) 1254
- * BALTIC_CHARSET 186 (xBA) 1257
- * HEBREW_CHARSET 177 (xB1) 1255
- * ARABIC _CHARSET 178 (xB2) 1256
- * SHIFTJIS_CHARSET 128 (x80) 932
- * HANGEUL_CHARSET 129 (x81) 949
- * GB2313_CHARSET 134 (x86) 936
- * CHINESEBIG5_CHARSET 136 (x88) 950
- * </pre>
- *
- */
- virtual QCString trRTFansicp()
- {
- return "1250"; //EASTEUROPE_CHARSET [don't know if this is correct:Ro has a 0x418 index in that file]
- }
-
-
- /*! Used as ansicpg for RTF fcharset
- * \see trRTFansicp() for a table of possible values.
- */
- virtual QCString trRTFCharSet()
- {
- return "0x418"; // well, I could not find a decent doc about this one - I think Ro code is 0x418
- }
-
- /*! Used as header RTF general 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 ? "Clas" : "clas"));
- result+= singular ? "a":"ele";
- 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 ? "Fiºier" : "fiºier"));
- result+= singular ? "ul":"ele";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trNamespace(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Namespace" : "namespace"));
- result+= singular ? "-ul":"-urile";
- 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 ? "Grupu" : "grupu"));
- result+= singular ? "l":"rile";
- 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 ? "Pagin" : "pagin"));
- result+= singular ? "a":"ile";
- 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 ? "Membr" : "membr"));
- result+= singular ? "ul":"ii";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trField(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Câmp" : "câmp"));
- result+= singular ? "ul":"urile";
- 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 ? "Global" : "global"));
- if (!singular) result+="e";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is generated when the \\author command is used and
- * for the author section in man pages. */
- virtual QCString trAuthor(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Autor" : "autor"));
- result+= singular ? "ul":"ii";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return "Referinþe";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Implementeazã "+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 "Implementat în "+trWriteList(numEntries)+".";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.16
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in RTF documentation as a heading for the Table
- * of Contents.
- */
- virtual QCString trRTFTableOfContents()
- {
- return "Conþinut";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.17
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as the header of the list of item that have been
- * flagged deprecated
- */
- virtual QCString trDeprecatedList()
- {
- return "Lista elementelor învechite (deprecated)";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.18
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a header for declaration section of the events found in
- * a C# program
- */
- virtual QCString trEvents()
- {
- return "Evenimente";
- }
- /*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- return "Documentaþia aferentã evenimentelor";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a heading for a list of Java class types with package scope.
- */
- virtual QCString trPackageTypes()
- {
- return "Tipuri în pachet";
- }
- /*! Used as a heading for a list of Java class functions with package
- * scope.
- */
- virtual QCString trPackageMembers()
- {
- return "Funcþii în pachet";
- }
- /*! Used as a heading for a list of static Java class functions with
- * package scope.
- */
- virtual QCString trStaticPackageMembers()
- {
- return "Funcþii statice în pachet";
- }
- /*! Used as a heading for a list of Java class variables with package
- * scope.
- */
- virtual QCString trPackageAttribs()
- {
- return "Atribute în pachet";
- }
- /*! Used as a heading for a list of static Java class variables with
- * package scope.
- */
- virtual QCString trStaticPackageAttribs()
- {
- return "Atribute statice în pachet";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Toate";
- }
- /*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- return "Graful de apel al acestei funcþii:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! When the search engine is enabled this text is put in the header
- * of each page before the field where one can enter the text to search
- * for.
- */
- virtual QCString trSearchForIndex()
- {
- return "Cautã";
- }
- /*! This string is used as the title for the page listing the search
- * results.
- */
- virtual QCString trSearchResultsTitle()
- {
- return "Rezultatele cãutarii";
- }
- /*! 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
- * the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
- * value 2 represents 2 or more matches. HTML markup is allowed inside
- * the returned string.
- */
- virtual QCString trSearchResults(int numDocuments)
- {
- if (numDocuments==0)
- {
- return "Din pacate nu am gãsit nici un document care sã corespundã cererii.";
- }
- else if (numDocuments==1)
- {
- return "Am gãsit <b>1</b> document corespunzând cererii.";
- }
- else
- {
- return "Am gãsit <b>$num</b> documente corespunzând cererii. "
- "Lista documentelor gãsite, sortate dupã relevanþã.";
- }
- }
- /*! 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 "Gãsite:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 " Fiºierul sursã " + filename;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.9
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the name of the chapter containing the directory
- * hierarchy.
- */
- virtual QCString trDirIndex()
- { return "Ierarhia directoarelor"; }
-
- /*! This is used as the name of the chapter containing the documentation
- * of the directories.
- */
- virtual QCString trDirDocumentation()
- { return "Documentaþia directoarelor"; }
-
- /*! 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 "Directoare"; }
-
- /*! This returns a sentences that introduces the directory hierarchy.
- * and the fact that it is sorted alphabetically per level
- */
- virtual QCString trDirDescription()
- { return "Aceastã ierarhie de directoare este sortatã, "
- "per nivel, in ordine alfabeticã:";
- }
-
- /*! 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="Director-referinþã "; result+=dirName;
- return result;
- }
-
- /*! This returns the word directory with or without starting capital
- * (\a first_capital) and in sigular or plural form (\a singular).
- */
- virtual QCString trDir(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Directo" : "directo"));
- if (singular) result+="r"; else result="are";
- return result;
- }
-
-};
-
-#endif
diff --git a/src/translator_ru.h b/src/translator_ru.h
deleted file mode 100644
index 900e87c..0000000
--- a/src/translator_ru.h
+++ /dev/null
@@ -1,1580 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- */
-
-/*
- *
- * Nickolay Semyonov
- * Andrey V. Stolyarov released Feb 14, 2001
- * Alexandr V. Chelpanov <cav@cryptopro.ru> released Sep 25, 2004
- *
- * ðÒÉ ÐÅÒÅ×ÏÄÅ ÚÁÇÏÌÏ×ËÏ× ÓÌÏ×Á list É documentation ÕÂÒÁÎÙ.
- *
- * Modules ÐÅÒÅ×ÅÄÅÎÏ ËÁË ÇÒÕÐÐÙ, ÔÁË ËÁË ÍÏÄÕÌÉ ÞÁÝÅ ×ÓÅÇÏ × ÒÕÓÓËÏÍ
- * ÐÅÒÅ×ÏÄÅ ×ÓÔÒÅÞÁÅÔÓÑ × ËÏÎÔÅËÓÔÅ ÍÏÄÕÌÑ ËÁË ÅÄÉÎÉÃÙ ÔÒÁÎÓÌÑÃÉÉ, ÆÁÊÌÁ
- * É ÄÒ., ÞÔÏ × ÄÁÎÎÏÍ ÓÌÕÞÁÅ ÎÅ ÓÏ×ÓÅÍ ÐÏÄÈÏÄÉÔ, ÔÅÍ ÂÏÌÅÅ ÞÔÏ
- * ÓÏÏÔ×ÅÔÓÔ×ÕÀÝÁÑ ËÏÍÁÎÄÁ × doxygen ÉÍÅÎÕÅÔÓÑ \group.
- *
- * ðÒÏÓØÂÁ ÎÅ ÏÐÔÉÍÉÚÉÒÏ×ÁÔØ decode ÏÂÒÁÍÌÑÑ ÒÅÚÕÌØÔÁÔ, ÜÔÏ ÍÏÖÅÔ ÐÒÉ×ÅÓÔÉ
- * Ë ÐÅÒÅËÏÄÉÒÏ×ËÅ ×ÈÏÄÁ × ÔÏÍ ÞÉÓÌÅ ÒÕÓÓËÉÈ ÉÍÅÎ ÆÁÊÌÏ×.
- *
- * ïÔÄÁÎÏ ÐÒÅÄÐÏÞÔÅÎÉÅ ÐÒÉ ÐÅÒÅ×ÏÄÅ related functions - "ÏÔÎÏÓÑÝÉÅÓÑ Ë ËÌÁÓÓÕ
- * ÆÕÎËÃÉÉ", Á ÎÅ "Ó×ÑÚÁÎÎÙÅ ÆÕÎËÃÉÉ", ÞÔÏ ×ÅÒÎÏ ÄÏ ÔÅÈ ÐÏÒ ÐÏËÁ ÅÓÔØ ÔÏÌØËÏ
- * related to class, É ÎÅÔ related to template, package É Ô.Ä. ðÏÓÌÅÄÎÅÅ
- * ÚÁÍÅÞÁÎÉÅ ËÁÓÁÅÔÓÑ ÂÏÌØÛÉÎÓÔ×Á member.
- *
- * ðÏ ×ÏÚÍÏÖÎÏÓÔÉ ÐÒÉ ÐÅÒÅ×ÏÄÅ members ÕËÁÚÙ×ÁÅÔÓÑ ÞÌÅÎÏÍ ÞÅÇÏ ÜÔÏÔ member
- * Ñ×ÌÑÅÔÓÑ.
- *
- * Compounds ÐÅÒÅ×ÅÄÅÎÏ ËÁË ËÌÁÓÓÙ, ÓÍ óÔÒÏÕÓÔÒÁÐ.
- *
- * ïÐÒÅÄÅÌÅÎÉÑ ÐÏÍÅÞÅÎÎÙÅ ?? Ñ×ÌÑÀÔÓÑ ÓÐÏÒÎÙÍÉ.
- *
- * âÌÁÇÏÄÁÒÎÏÓÔÉ: Vitaly A. Repin <vitaly@radio.hop.stu.neva.ru>,
- * íÉÈÁÉÌ çÌÕÛÅÎËÏ× <bbman@mail.ru>
- */
-
-#ifndef TRANSLATOR_RU_H
-#define TRANSLATOR_RU_H
-
-class TranslatorRussian : public Translator
-{
- private:
- /*! The decode() inline assumes the source written in the
- Koi8-R encoding (maintainer dependent).
- */
- inline QCString decode(const QCString & sInput)
- {
- if (Config_getBool("USE_WINDOWS_ENCODING"))
- {
- return Koi8RToWindows1251(sInput);
- }
- else
- {
- return sInput;
- }
- }
-
- public:
- /*! Used for identification of the language. */
- virtual QCString idLanguage()
- { return "russian"; }
-
- /* Used to get the command(s) for the language support. */
- virtual QCString latexLanguageSupportCommand()
- {
- if (Config_getBool("USE_WINDOWS_ENCODING"))
- {
- return "\\usepackage[cp1251]{inputenc}\n\\usepackage[russian]{babel}\n";
- }
- else
- {
- return "\\usepackage[koi8-r]{inputenc}\n\\usepackage[russian]{babel}\n";
- }
- }
-
- /*! return the language charset. This will be used for the HTML output */
- virtual QCString idLanguageCharset()
- {
- if (Config_getBool("USE_WINDOWS_ENCODING"))
- {
- return "Windows-1251";
- }
- else
- {
- return "koi8-r";
- }
- }
-
- // --- Language translation methods -------------------
-
- /*! used in the compound documentation before a list of related functions. */
- virtual QCString trRelatedFunctions()
- { return decode("ïÔÎÏÓÑÝÉÅÓÑ Ë ËÌÁÓÓÕ ÆÕÎËÃÉÉ"); }
-
- /*! subscript for the related functions. */
- virtual QCString trRelatedSubscript()
- { return decode("(ÎÅ ÞÌÅÎÙ ËÌÁÓÓÁ)"); }
-
- /*! header that is put before the detailed description of files, classes and namespaces. */
- virtual QCString trDetailedDescription()
- { return decode("ðÏÄÒÏÂÎÏÅ ÏÐÉÓÁÎÉÅ"); }
-
- /*! header that is put before the list of typedefs. */
- virtual QCString trMemberTypedefDocumentation()
- { return decode("ïÐÒÅÄÅÌÅÎÉÑ ÔÉÐÏ×"); }
-
- /*! header that is put before the list of enumerations. */
- virtual QCString trMemberEnumerationDocumentation()
- { return decode("ðÅÒÅÞÉÓÌÅÎÉÑ"); }
-
- /*! header that is put before the list of member functions. */
- virtual QCString trMemberFunctionDocumentation()
- { return decode("íÅÔÏÄÙ"); }
-
- /*! header that is put before the list of member attributes. */
- virtual QCString trMemberDataDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode( "ðÏÌÑ" );
- }
- else
- {
- return decode( "äÁÎÎÙÅ ËÌÁÓÓÁ" );
- }
- }
-
- /*! this is the text of a link put after brief descriptions. */
- virtual QCString trMore()
- { return decode("ðÏÄÒÏÂÎÅÅ..."); }
-
- /*! put in the class documentation */
- /* Dosn't use when optimization for C is on. */
- virtual QCString trListOfAllMembers()
- {
- return decode( "ðÏÌÎÙÊ ÓÐÉÓÏË ÞÌÅÎÏ× ËÌÁÓÓÁ" );
- }
-
- /*! used as the title of the "list of all members" page of a class */
- /* Dosn't use when optimization for C is on. */
- virtual QCString trMemberList()
- {
- return decode( "CÐÉÓÏË ÞÌÅÎÏ× ËÌÁÓÓÁ" );
- }
-
- /*! this is the first part of a sentence that is followed by a class name */
- /* Dosn't use when optimization for C is on. */
- virtual QCString trThisIsTheListOfAllMembers()
- { return decode("ðÏÌÎÙÊ ÓÐÉÓÏË ÞÌÅÎÏ× ËÌÁÓÓÁ "); }
-
- /*! this is the remainder of the sentence after the class name */
- /* Dosn't use when optimization for C is on. */
- virtual QCString trIncludingInheritedMembers()
- { return decode(", ×ËÌÀÞÁÑ ÎÁÓÌÅÄÕÅÍÙÅ ÉÚ ÂÁÚÏ×ÏÇÏ ËÌÁÓÓÁ"); }
-
- /*! this is put at the author sections at the bottom of man pages.
- * parameter s is name of the project name.
- */
- virtual QCString trGeneratedAutomatically(const char *s)
- { QCString result=decode("á×ÔÏÍÁÔÉÞÅÓËÉ ÓÏÚÄÁÎÏ Doxygen");
- if (s) result+=decode(" ÄÌÑ ")+s;
- result+=decode(" ÉÚ ÉÓÈÏÄÎÏÇÏ ÔÅËÓÔÁ.");
- return result;
- }
-
- /*! put after an enum name in the list of all members */
- virtual QCString trEnumName()
- { return decode("ÐÅÒÅÞÉÓÌÅÎÉÅ"); }
-
- /*! put after an enum value in the list of all members */
- virtual QCString trEnumValue()
- { return decode("ÜÌÅÍÅÎÔÙ ÐÅÒÅÞÉÓÌÅÎÉÑ"); }
-
- /*! put after an undocumented member in the list of all members */
- virtual QCString trDefinedIn()
- { return decode("ÏÐÒÅÄÅÌÅÎÏ ×"); }
-
- // quick reference sections
-
- /*! This is put above each page as a link to the list of all groups of
- * compounds or files (see the \\group command).
- */
- virtual QCString trModules()
- { return decode("çÒÕÐÐÙ"); }
-
- /*! This is put above each page as a link to the class hierarchy */
- virtual QCString trClassHierarchy()
- { return decode("éÅÒÁÒÈÉÑ ËÌÁÓÓÏ×"); }
-
- /*! This is put above each page as a link to the list of annotated classes */
- virtual QCString trCompoundList()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode( "óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ" );
- }
- else
- {
- return decode( "ëÌÁÓÓÙ" );
- }
- }
-
- /*! This is put above each page as a link to the list of documented files */
- virtual QCString trFileList()
- { return decode("æÁÊÌÙ"); }
-
- /*! This is put above each page as a link to all members of compounds. */
- virtual QCString trCompoundMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode( "ðÏÌÑ ÓÔÒÕËÔÕÒ" );
- }
- else
- {
- return decode( "þÌÅÎÙ ËÌÁÓÓÏ×" );
- }
- }
-
- /*! This is put above each page as a link to all members of files. */
- /*??*/
- virtual QCString trFileMembers()
- {
- return decode( "óÐÉÓÏË ÞÌÅÎÏ× ×ÓÅÈ ÆÁÊÌÏ×" );
- }
-
- /*! This is put above each page as a link to all related pages. */
- virtual QCString trRelatedPages()
- /* ?? ÷ÁÒÉÁÎÔ ÐÅÒÅ×ÏÄÁ "óÍ. ÔÁËÖÅ: " ÂÏÌÅÅ ÕÄÁÞÎÙÊ, ÎÏ ÎÅ × ÚÁÇÏÌÏ×ËÅ,
- ËÁË × ÄÁÎÎÏÍ ÓÌÕÞÁÅ. */
- { return decode("ïÐÉÓÁÎÉÑ"); }
-
- /*! This is put above each page as a link to all examples. */
- virtual QCString trExamples()
- { return decode("ðÒÉÍÅÒÙ"); }
-
- /*! This is put above each page as a link to the search engine. */
- virtual QCString trSearch()
- { return decode("ðÏÉÓË"); }
-
- /*! This is an introduction to the class hierarchy. */
- virtual QCString trClassHierarchyDescription()
- { return decode("éÅÒÁÒÈÉÑ ËÌÁÓÓÏ×."); }
-
- /*! This is an introduction to the list with all files. */
- virtual QCString trFileListDescription(bool extractAll)
- {
- QCString result="ðÏÌÎÙÊ ÓÐÉÓÏË ";
- if (!extractAll) result+="ÄÏËÕÍÅÎÔÉÒÏ×ÁÎÎÙÈ ";
- result+="ÆÁÊÌÏ×.";
- return decode(result);
- }
-
- /*! This is an introduction to the annotated compound list. */
- virtual QCString trCompoundListDescription()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode( "óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ Ó ÉÈ ËÒÁÔËÉÍ ÏÐÉÓÁÎÉÅÍ." );
- }
- else
- {
- return decode( "ëÌÁÓÓÙ Ó ÉÈ ËÒÁÔËÉÍ ÏÐÉÓÁÎÉÅÍ." );
- }
- }
-
- /*! This is an introduction to the page with all class members. */
- virtual QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result="óÐÉÓÏË ×ÓÅÈ ";
- if(!extractAll) result+="ÄÏËÕÍÅÎÔÉÒÏ×ÁÎÎÙÈ ";
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- result+="ÞÌÅÎÏ× ÓÔÒÕËÔÕÒ ÄÁÎÎÙÈ ÓÏ ÓÓÙÌËÁÍÉ ÎÁ ";
- else
- result+="ÞÌÅÎÏ× ËÌÁÓÓÏ× ÓÏ ÓÓÙÌËÁÍÉ ÎÁ ";
- if(!extractAll)
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- result+="ÄÏËÕÍÅÎÔÁÃÉÀ ÐÏ ÓÔÒÕËÔÕÒÅ ÄÌÑ ËÁÖÄÏÇÏ ÞÌÅÎÁ.";
- else
- result+="ÄÏËÕÍÅÎÔÁÃÉÀ ÐÏ ËÌÁÓÓÕ ÄÌÑ ËÁÖÄÏÇÏ ÞÌÅÎÁ.";
- }
- else
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- result += "ÓÔÒÕËÔÕÒÙ";
- else
- result += "ËÌÁÓÓÙ";
- result+=", Ë ËÏÔÏÒÙÍ ÏÎÉ ÐÒÉÎÁÄÌÅÖÁÔ.";
- }
- return decode( result );
- }
-
- /*! This is an introduction to the page with all file members. */
- virtual QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="óÐÉÓÏË ×ÓÅÈ ";
- if (!extractAll) result+="ÄÏËÕÍÅÎÔÉÒÏ×ÁÎÎÙÈ ";
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="ÆÕÎËÃÉÊ, ÐÅÒÅÍÅÎÎÙÈ, ÍÁËÒÏÏÐÒÅÄÅÌÅÎÉÊ, "
- "ÐÅÒÅÞÉÓÌÅÎÉÊ É ÏÐÒÅÄÅÌÅÎÉÊ ÔÉÐÏ×";
- }
- else
- {
- result+="ÞÌÅÎÏ× ÆÁÊÌÏ× ";
- }
- result+=" ÓÏ ÓÓÙÌËÁÍÉ ÎÁ ";
- if (extractAll)
- result+="ÆÁÊÌÙ, Ë ËÏÔÏÒÙÍ ÏÎÉ ÐÒÉÎÁÄÌÅÖÁÔ.";
- else
- result+="ÄÏËÕÍÅÎÔÁÃÉÀ.";
- return decode( result );
- }
-
- /*! This is an introduction to the page with the list of all examples */
- virtual QCString trExamplesDescription()
- { return decode("ðÏÌÎÙÊ ÓÐÉÓÏË ÐÒÉÍÅÒÏ×."); }
-
- /*! This is an introduction to the page with the list of related pages */
- virtual QCString trRelatedPagesDescription()
- { return decode("ðÏÌÎÙÊ ÓÐÉÓÏË ÄÏÐÏÌÎÉÔÅÌØÎÙÈ ÏÐÉÓÁÎÉÊ."); }
-
- /*! This is an introduction to the page with the list of class/file groups */
- virtual QCString trModulesDescription()
- { return decode("ðÏÌÎÙÊ ÓÐÉÓÏË ÇÒÕÐÐ."); }
-
- // index titles (the project name is prepended for these)
-
-
- /*! This is used in HTML as the title of index.html. */
- virtual QCString trDocumentation()
- { return decode("äÏËÕÍÅÎÔÁÃÉÑ"); }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all groups.
- */
- virtual QCString trModuleIndex()
- { return decode("áÌÆÁ×ÉÔÎÙÊ ÕËÁÚÁÔÅÌØ ÇÒÕÐÐ"); }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * class hierarchy.
- */
- virtual QCString trHierarchicalIndex()
- { return decode("éÅÒÁÒÈÉÞÅÓËÉÊ ÓÐÉÓÏË ËÌÁÓÓÏ×"); }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * annotated compound index.
- */
- virtual QCString trCompoundIndex()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode( "áÌÆÁ×ÉÔÎÙÊ ÕËÁÚÁÔÅÌØ ÓÔÒÕËÔÕÒ ÄÁÎÎÙÈ" );
- }
- else
- {
- return decode( "áÌÆÁ×ÉÔÎÙÊ ÕËÁÚÁÔÅÌØ ËÌÁÓÓÏ×" );
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * list of all files.
- */
- virtual QCString trFileIndex()
- { return decode( "óÐÉÓÏË ÆÁÊÌÏ×" ); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all groups.
- */
- virtual QCString trModuleDocumentation()
- { return decode("çÒÕÐÐÙ"); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all classes, structs and unions.
- */
- virtual QCString trClassDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode( "óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ" );
- }
- else
- {
- return decode( "ëÌÁÓÓÙ" );
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all files.
- */
- virtual QCString trFileDocumentation()
- { return decode("æÁÊÌÙ"); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all examples.
- */
- virtual QCString trExampleDocumentation()
- { return decode("ðÒÉÍÅÒÙ"); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all related pages.
- */
- virtual QCString trPageDocumentation()
- { return decode("ôÅÍÁÔÉÞÅÓËÉÅ ÏÐÉÓÁÎÉÑ"); }
-
- /*! This is used in LaTeX as the title of the document */
- virtual QCString trReferenceManual()
- { return decode("ïÇÌÁ×ÌÅÎÉÅ"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of defines
- */
- virtual QCString trDefines()
- { return decode("íÁËÒÏÓÙ"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of function prototypes
- */
- virtual QCString trFuncProtos()
- { return decode("ðÒÏÔÏÔÉÐÙ ÆÕÎËÃÉÊ"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of typedefs
- */
- virtual QCString trTypedefs()
- { return decode("ïÐÒÅÄÅÌÅÎÉÑ ÔÉÐÏ×"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of enumerations
- */
- virtual QCString trEnumerations()
- { return decode("ðÅÒÅÞÉÓÌÅÎÉÑ"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) functions
- */
- virtual QCString trFunctions()
- { return decode("æÕÎËÃÉÉ"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trVariables()
- { return decode("ðÅÒÅÍÅÎÎÙÅ"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trEnumerationValues()
- { return decode("üÌÅÍÅÎÔÙ ÐÅÒÅÞÉÓÌÅÎÉÊ"); }
-
- /*! This is used in the documentation of a file before the list of
- * documentation blocks for defines
- */
- virtual QCString trDefineDocumentation()
- { return decode("íÁËÒÏÓÙ"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for function prototypes
- */
- virtual QCString trFunctionPrototypeDocumentation()
- { return decode("ðÒÏÔÏÔÉÐÙ ÆÕÎËÃÉÊ"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for typedefs
- */
- virtual QCString trTypedefDocumentation()
- { return decode("ôÉÐÙ"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration types
- */
- virtual QCString trEnumerationTypeDocumentation()
- { return decode("ðÅÒÅÞÉÓÌÅÎÉÑ"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for functions
- */
- virtual QCString trFunctionDocumentation()
- { return decode("æÕÎËÃÉÉ"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for variables
- */
- virtual QCString trVariableDocumentation()
- { return decode("ðÅÒÅÍÅÎÎÙÅ"); }
-
- /*! This is used in the documentation of a file/namespace/group before
- * the list of links to documented compounds
- */
- virtual QCString trCompounds()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode( "óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ" );
- }
- else
- {
- return decode( "ëÌÁÓÓÙ" );
- }
-
- }
-
- /*! This is used in the documentation of a group before the list of
- * links to documented files
- */
- /*! This is used in the standard footer of each page and indicates when
- * the page was generated
- */
- virtual QCString trGeneratedAt(const char *date,const char *projName)
- {
- QCString result=decode("äÏËÕÍÅÎÔÁÃÉÑ ");
- if (projName) result+=decode("ÐÏ ")+projName;
- result+=decode(". ðÏÓÌÅÄÎÉÅ ÉÚÍÅÎÅÎÉÑ: ")+date;
- result+=decode(". óÏÚÄÁÎÏ ÓÉÓÔÅÍÏÊ");
- return result;
- }
- /*! This is part of the sentence used in the standard footer of each page.
- */
- virtual QCString trWrittenBy()
- {
- return decode("á×ÔÏÒ:");
- }
-
- /*! this text is put before a class diagram */
- virtual QCString trClassDiagram(const char *clName)
- {
- return decode("çÒÁÆ ÎÁÓÌÅÄÏ×ÁÎÉÑ:")+clName+":";
- }
-
- /*! this text is generated when the \\internal command is used. */
- virtual QCString trForInternalUseOnly()
- { return decode("ôÏÌØËÏ ÄÌÑ ×ÎÕÔÒÅÎÎÅÇÏ ÉÓÐÏÌØÚÏ×ÁÎÉÑ"); }
-
- /*! this text is generated when the \\warning command is used. */
- virtual QCString trWarning()
- { return decode("ðÒÅÄÕÐÒÅÖÄÅÎÉÑ"); }
-
- /*! this text is generated when the \\version command is used. */
- virtual QCString trVersion()
- { return decode("÷ÅÒÓÉÑ"); }
-
- /*! this text is generated when the \\date command is used. */
- virtual QCString trDate()
- { return decode("äÁÔÁ"); }
-
- /*! this text is generated when the \\return command is used. */
- virtual QCString trReturns()
- { return decode("÷ÏÚ×ÒÁÝÁÅÔ"); }
-
- /*! this text is generated when the \\sa command is used. */
- virtual QCString trSeeAlso()
- { return decode("óÍ. ÔÁËÖÅ"); }
-
- /*! this text is generated when the \\param command is used. */
- virtual QCString trParameters()
- { return decode("áÒÇÕÍÅÎÔÙ"); }
-
- /*! this text is generated when the \\exception command is used. */
- virtual QCString trExceptions()
- { return decode("éÓËÌÀÞÅÎÉÑ"); }
-
- /*! this text is used in the title page of a LaTeX document. */
- virtual QCString trGeneratedBy()
- { return decode("óÏÚÄÁÎÏ ÓÉÓÔÅÍÏÊ"); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of page containing all the index of all namespaces. */
- virtual QCString trNamespaceList()
- { return decode("ðÒÏÓÔÒÁÎÓÔ×Á ÉÍÅÎ"); }
-
- /*! used as an introduction to the namespace list */
- virtual QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="ðÏÌÎÙÊ ÓÐÉÓÏË ";
- if (!extractAll) result+="ÄÏËÕÍÅÎÔÉÒÏ×ÁÎÎÙÈ ";
- result+="ÐÒÏÓÔÒÁÎÓÔ× ÉÍÅÎ.";
- return decode(result);
- }
-
- /*! used in the class documentation as a header before the list of all
- * friends of a class
- */
- virtual QCString trFriends()
- { return decode("äÒÕÚØÑ"); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in the class documentation as a header before the list of all
- * related classes
- */
- virtual QCString trRelatedFunctionDocumentation()
- { return decode("äÏËÕÍÅÎÔÁÃÉÑ ÐÏ ÄÒÕÚØÑÍ ËÌÁÓÓÁ É ÆÕÎËÃÉÑÍ, ÏÔÎÏÎÏÓÑÝÉÍÓÑ"
- " Ë ËÌÁÓÓÕ"); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of the HTML page of a class/struct/union */
- virtual QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- {
- QCString result;
- if (isTemplate)
- {
- result="ûÁÂÌÏÎ ";
- switch(compType)
- {
- case ClassDef::Class: result+="ËÌÁÓÓÁ"; break;
- case ClassDef::Struct: result+="ÓÔÒÕËÔÕÒÙ"; break;
- case ClassDef::Union: result+="ÏÂßÅÄÉÎÅÎÉÑ"; break;
- case ClassDef::Interface: result+="ÉÎÔÅÒÆÅÊÓÁ"; break;
- case ClassDef::Protocol: result+="protocol"; break; // translate me!
- case ClassDef::Category: result+="category"; break; // translate me!
- case ClassDef::Exception: result+="ÉÓËÌÀÞÅÎÉÑ"; break;
- }
- }
- else
- {
- switch(compType)
- {
- case ClassDef::Class: result+="ëÌÁÓÓ"; break;
- case ClassDef::Struct: result+="óÔÒÕËÔÕÒÁ"; break;
- case ClassDef::Union: result+="ïÂßÅÄÉÎÅÎÉÅ"; break;
- case ClassDef::Interface: result+="éÎÔÅÒÆÅÊÓ"; break;
- case ClassDef::Protocol: result+="protocol"; break; // translate me!
- case ClassDef::Category: result+="category"; break; // translate me!
- case ClassDef::Exception: result+="éÓËÌÀÞÅÎÉÅ"; break;
- }
- }
- result+=" ";
- return decode(result)+clName;
- }
-
- /*! used as the title of the HTML page of a file */
- virtual QCString trFileReference(const char *fileName)
- {
- return decode("æÁÊÌ ")+fileName;
- }
-
- /*! used as the title of the HTML page of a namespace */
- virtual QCString trNamespaceReference(const char *namespaceName)
- {
- return decode("ðÒÏÓÔÒÁÎÓÔ×Ï ÉÍÅÎ ")+namespaceName;
- }
-
- virtual QCString trPublicMembers()
- { return decode("ïÔËÒÙÔÙÅ ÞÌÅÎÙ"); }
- virtual QCString trPublicSlots()
- { return decode("ïÔËÒÙÔÙÅ ÓÌÏÔÙ"); }
- virtual QCString trSignals()
- { return decode("óÉÇÎÁÌÙ"); }
- virtual QCString trStaticPublicMembers()
- { return decode("ïÔËÒÙÔÙÅ ÓÔÁÔÉÞÅÓËÉÅ ÞÌÅÎÙ"); }
- virtual QCString trProtectedMembers()
- { return decode("úÁÝÉÝÅÎÎÙÅ ÞÌÅÎÙ"); }
- virtual QCString trProtectedSlots()
- { return decode("úÁÝÉÝÅÎÎÙÅ ÓÌÏÔÙ"); }
- virtual QCString trStaticProtectedMembers()
- { return decode("úÁÝÉÝÅÎÎÙÅ ÓÔÁÔÉÞÅÓËÉÅ ÞÌÅÎÙ"); }
- virtual QCString trPrivateMembers()
- { return decode("úÁËÒÙÔÙÅ ÞÌÅÎÙ"); }
- virtual QCString trPrivateSlots()
- { return decode("úÁËÒÙÔÙÅ ÓÌÏÔÙ"); }
- virtual QCString trStaticPrivateMembers()
- { return decode("úÁËÒÙÔÙÅ ÓÔÁÔÉÞÅÓËÉÅ ÞÌÅÎÙ"); }
-
- /*! this function is used to produce a comma-separated list of items.
- * use generateMarker(i) to indicate where item i should be put.
- */
- virtual QCString trWriteList(int numEntries)
- {
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=decode( " É " );
- }
- }
- return result;
- }
-
- /*! used in class documentation to produce a list of base classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritsList(int numEntries)
- {
- return decode("âÁÚÏ×ÙÅ ËÌÁÓÓÙ:")+trWriteList(numEntries)+".";
- }
-
- /*! used in class documentation to produce a list of super classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritedByList(int numEntries)
- {
- return decode("ðÒÏÉÚ×ÏÄÎÙÅ ËÌÁÓÓÙ:")+trWriteList(numEntries)+".";
- }
-
- /*! used in member documentation blocks to produce a list of
- * members that are hidden by this one.
- */
- virtual QCString trReimplementedFromList(int numEntries)
- {
- QCString result="ðÅÒÅÏÐÒÅÄÅÌÑÅÔ ÍÅÔÏÄ";
- if(numEntries>1)
- result+="Ù ÐÒÅÄËÏ×";
- else
- result+=" ÐÒÅÄËÁ";
- return decode(result+" ")+trWriteList(numEntries)+".";
- }
-
- /*! used in member documentation blocks to produce a list of
- * all member that overwrite the implementation of this member.
- */
- virtual QCString trReimplementedInList(int numEntries)
- {
- return decode("ðÅÒÅÏÐÒÅÄÅÌÑÅÔÓÑ × ")+trWriteList(numEntries)+".";
- }
-
- /*! This is put above each page as a link to all members of namespaces. */
- virtual QCString trNamespaceMembers()
- { return decode("þÌÅÎÙ ÐÒÏÓÔÒÁÎÓÔ× ÉÍÅÎ"); }
-
- /*! This is an introduction to the page with all namespace members */
- virtual QCString trNamespaceMemberDescription(bool extractAll)
- {
- QCString result="ðÏÌÎÙÊ ÓÐÉÓÏË ";
- if (!extractAll) result+="ÄÏËÕÍÅÎÔÉÒÏ×ÁÎÎÙÈ ";
- result+="ÞÌÅÎÏ× ÐÒÏÓÔÁÎÓÔ× ÉÍÅÎ.";
- return decode(result);
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all namespaces.
- */
- virtual QCString trNamespaceIndex()
- { return decode("áÌÆÁ×ÉÔÎÙÊ ÕËÁÚÁÔÅÌØ ÐÒÏÓÔÒÁÎÓÔ× ÉÍÅÎ"); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all namespaces.
- */
- virtual QCString trNamespaceDocumentation()
- { return decode("ðÒÏÓÔÒÁÎÓÔ×Á ÉÍÅÎ"); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- virtual QCString trNamespaces()
- { return decode( "ðÒÏÓÔÒÁÎÓÔ×Á ÉÍÅÎ" ); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990728
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is put at the bottom of a class documentation page and is
- * followed by a list of files that were used to generate the page.
- */
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)"ïÂßÑ×ÌÅÎÉÑ É ÏÐÉÓÁÎÉÑ ÞÌÅÎÏ× ";
- switch(compType)
- {
- case ClassDef::Class: result+="ËÌÁÓÓ";
- if (single) result+='Á'; else result+="Ï×";
- break;
- case ClassDef::Struct: result+="ÓÔÒÕËÔÕÒ";
- if (single) result+='Ù';
- break;
- case ClassDef::Union: result+="ÏÂßÅÄÉÎÅÎÉ";
- if (single) result+='Ñ'; else result+='Ê';
- break;
- case ClassDef::Interface: result+="ÉÎÔÅÒÆÅÊÓ";
- if (single) result+='Á'; else result+="Ï×";
- break;
- case ClassDef::Protocol: result+="Protocol"; // translate me!
- break;
- case ClassDef::Category: result+="Category"; // translate me!
- break;
- case ClassDef::Exception: result+="ÉÓËÌÀÞÅÎÉ";
- if (single) result+='Ñ'; else result+='Ê';
- break;
- }
- result+=" ÎÁÈÏÄÑÔÓÑ × ÆÁÊÌ";
- if (single) result+="Å:"; else result+="ÁÈ:";
- return decode(result);
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- virtual QCString trAlphabeticalList()
- { return decode("áÌÆÁ×ÉÔÎÙÊ ÕËÁÚÁÔÅÌØ"); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- virtual QCString trReturnValues()
- { return decode("÷ÏÚ×ÒÁÝÁÅÍÙÅ ÚÎÁÞÅÎÉÑ"); }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- virtual QCString trMainPage()
- { return decode("ôÉÔÕÌØÎÁÑ ÓÔÒÁÎÉÃÁ"); }
-
- /*! This is used in references to page that are put in the LaTeX
- * documentation. It should be an abbreviation of the word page.
- */
- virtual QCString trPageAbbreviation()
- { return decode("ÓÔÒ."); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991106
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDefinedAtLineInSourceFile()
- {
- return decode("óÍ. ÏÐÒÅÄÅÌÅÎÉÅ × ÆÁÊÌÅ @1 ÓÔÒÏËÁ @0");
- }
- virtual QCString trDefinedInSourceFile()
- {
- return decode("óÍ. ÏÐÒÅÄÅÌÅÎÉÅ × ÆÁÊÌÅ @0");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDeprecated()
- {
- return decode("õÓÔ.");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- virtual QCString trCollaborationDiagram(const char *clName)
- {
- return (QCString)decode("çÒÁÆ Ó×ÑÚÅÊ ËÌÁÓÓÁ ")+clName+":";
- }
- /*! this text is put before an include dependency graph */
- virtual QCString trInclDepGraph(const char *fName)
- {
- return decode("çÒÁÆ ×ËÌÀÞÁÅÍÙÈ ÚÁÇÏÌÏ×ÏÞÎÙÈ ÆÁÊÌÏ× ÄÌÑ ")+fName+":";
- }
- /*! header that is put before the list of constructor/destructors. */
- virtual QCString trConstructorDocumentation()
- {
- return decode("ëÏÎÓÔÒÕËÔÏÒ(Ù)");
- }
- /*! Used in the file documentation to point to the corresponding sources. */
- virtual QCString trGotoSourceCode()
- {
- return decode("óÍ. ÉÓÈÏÄÎÙÅ ÔÅËÓÔÙ.");
- }
- /*! Used in the file sources to point to the corresponding documentation. */
- virtual QCString trGotoDocumentation()
- {
- return decode("óÍ. ÄÏËÕÍÅÎÔÁÃÉÀ.");
- }
- /*! Text for the \\pre command */
- virtual QCString trPrecondition()
- {
- return decode("ðÒÅÄÕÓÌÏ×ÉÅ");
- }
- /*! Text for the \\post command */
- virtual QCString trPostcondition()
- {
- return decode("ðÏÓÔÕÓÌÏ×ÉÅ");
- }
- /*! Text for the \\invariant command */
- virtual QCString trInvariant()
- {
- return decode("éÎ×ÁÒÉÁÎÔ");
- }
- /*! Text shown before a multi-line variable/enum initialization */
- virtual QCString trInitialValue()
- {
- return decode("éÎÉÃÉÁÌÉÚÁÔÏÒ");
- }
- /*! Text used the source code in the file index */
- virtual QCString trCode()
- {
- return decode("éÓÈÏÄÎÙÅ ÔÅËÓÔÙ");
- }
- virtual QCString trGraphicalHierarchy()
- {
- return decode("éÅÒÁÒÈÉÑ ËÌÁÓÓÏ×. çÒÁÆÉÞÅÓËÉÊ ×ÉÄ.");
- }
- virtual QCString trGotoGraphicalHierarchy()
- {
- return decode("ÓÍ. ÇÒÁÆÉÞÅÓËÉÊ ×ÉÄ.");
- }
- virtual QCString trGotoTextualHierarchy()
- {
- return decode("ÓÍ. ÔÅËÓÔÏ×ÙÊ ×ÉÄ.");
- }
- virtual QCString trPageIndex()
- {
- return decode("áÌÆÁ×ÉÔÎÙÊ ÕËÁÚÁÔÅÌØ ÔÅÍÁÔÉÞÅÓËÉÈ ÏÐÉÓÁÎÉÊ");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trNote()
- {
- return decode("úÁÍÅÔËÉ");
- }
- virtual QCString trPublicTypes()
- {
- return decode("ïÔËÒÙÔÙÅ ÔÉÐÙ");
- }
- virtual QCString trPublicAttribs()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode( "ðÏÌÑ ÄÁÎÎÙÈ" );
- }
- else
- {
- return decode( "ïÔËÒÙÔÙÅ ÁÔÒÉÂÕÔÙ" );
- }
- }
- virtual QCString trStaticPublicAttribs()
- {
- return decode("óÔÁÔÉÞÅÓËÉÅ ÏÔËÒÙÔÙÅ ÄÁÎÎÙÅ");
- }
- virtual QCString trProtectedTypes()
- {
- return decode("úÁÝÉÝÅÎÎÙÅ ÔÉÐÙ");
- }
- virtual QCString trProtectedAttribs()
- {
- return decode("úÁÝÉÝÅÎÎÙÅ ÄÁÎÎÙÅ");
- }
- virtual QCString trStaticProtectedAttribs()
- {
- return decode("óÔÁÔÉÞÅÓËÉÅ ÚÁÝÉÝÅÎÎÙÅ ÄÁÎÎÙÅ");
- }
- virtual QCString trPrivateTypes()
- {
- return decode("úÁËÒÙÔÙÅ ÔÉÐÙ");
- }
- virtual QCString trPrivateAttribs()
- {
- return decode("úÁËÒÙÔÙÅ ÄÁÎÎÙÅ");
- }
- virtual QCString trStaticPrivateAttribs()
- {
- return decode("úÁËÒÙÔÙÅ ÓÔÁÔÉÞÅÓËÉÅ ÄÁÎÎÙÅ");
- }
-
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a todo item */
- virtual QCString trTodo()
- /*??*/
- {
- return decode("îÅÏÂÈÏÄÉÍÏ ÓÄÅÌÁÔØ");
- }
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- /*??*/
- {
- return decode("óÐÉÓÏË ÚÁÄÁÞ");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy()
- {
- return decode("éÓÐÏÌØÚÕÅÔÓÑ ×");
- }
- virtual QCString trRemarks()
- {
- return decode("ðÒÉÍ.");
- }
- virtual QCString trAttention()
- {
- return decode("÷ÎÉÍÁÎÉÅ");
- }
- virtual QCString trInclByDepGraph()
- {
- return decode("çÒÁÆ ÆÁÊÌÏ×, × ËÏÔÏÒÙÅ ×ËÌÀÞÁÅÔÓÑ ÜÔÏÔ ÆÁÊÌ:");
- }
- virtual QCString trSince()
- /*??*/
- {
- return decode("îÁÞÉÎÁÑ Ó");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- virtual QCString trLegendTitle()
- {
- return decode("ìÅÇÅÎÄÁ");
- }
- /*! page explaining how the dot graph's should be interpreted */
- virtual QCString trLegendDocs()
- {
- return decode(
- "ïÂÏÚÎÁÞÅÎÉÑ, ÉÓÐÏÌØÚÕÅÍÙÅ × ÇÒÁÆÁÈ.<p>\n"
- "òÁÓÓÍÏÔÒÉÍ ÓÌÅÄÕÀÝÉÊ ÐÒÉÍÅÒ:\n"
- "\\code\n"
- "/*! îÅ×ÉÄÉÍÙÊ ËÌÁÓÓ ÉÚ-ÚÁ ÕÓÅÞÅÎÉÑ */\n"
- "class Invisible { };\n\n"
- "/*! õÓÅÞÅÎÎÙÊ ËÌÁÓÓ, ÏÔÎÏÛÅÎÉÅ ÎÁÓÌÅÄÏ×ÁÎÉÑ ÓËÒÙÔÏ */\n"
- "class Truncated : public Invisible { };\n\n"
- "/* îÅÄÏËÕÍÅÎÔÉÒÏ×ÁÎÎÙÊ ËÌÁÓÓ */\n"
- "class Undocumented { };\n\n"
- "/*! ïÔËÒÙÔÏÅ ÎÁÓÌÅÄÏ×ÁÎÉÅ */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! ûÁÂÌÏÎ ËÌÁÓÓÁ */\n"
- "template<class T> class Templ {};\n\n"
- "/*! úÁÝÉÝÅÎÎÏÅ ÎÁÓÌÅÄÏ×ÁÎÉÅ */\n"
- "class ProtectedBase { };\n\n"
- "/*! úÁËÒÙÔÏÅ ÎÁÓÌÅÄÏ×ÁÎÉÅ */\n"
- "class PrivateBase { };\n\n"
- "/*! ëÌÁÓÓ, ÉÓÐÏÌØÚÕÅÍÙÊ ËÌÁÓÓÏÍ Inherited */\n"
- "class Used { };\n\n"
- "/*! ëÌÁÓÓ, ÐÏÒÏÖÄÅÎÎÙÊ ÏÔ ÄÒÕÇÉÈ ËÌÁÓÓÏ× */\n"
- "class Inherited : public PublicBase,\n"
- " protected ProtectedBase,\n"
- " private PrivateBase,\n"
- " public Undocumented,\n"
- " public Templ<int>\n"
- "{\n"
- " private:\n"
- " Used *m_usedClass;\n"
- "};\n"
- "\\endcode\n"
- "åÓÌÉ \\c MAX_DOT_GRAPH_HEIGHT × ËÏÎÆÉÇÕÒÁÃÉÏÎÎÏÍ ÆÁÊÌÅ "
- "ÕÓÔÁÎÏ×ÌÅÎ × 240, ÐÏÌÕÞÉÔÓÑ ÓÌÅÄÕÀÝÉÊ ÇÒÁÆ:"
- "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
- "ðÒÑÍÏÕÇÏÌØÎÉËÉ × ÜÔÏÍ ÇÒÁÆÅ ÉÍÅÀÔ ÓÌÅÄÕÀÝÅÅ ÚÎÁÞÅÎÉÅ:\n"
- "<ul>\n"
- "<li>úÁÐÏÌÎÅÎÎÙÊ ÞÅÒÎÙÊ ÐÒÑÍÏÕÇÏÌØÎÉË ÐÒÅÄÓÔÁ×ÌÑÅÔ ÓÔÒÕËÔÕÒÕ ÉÌÉ ËÌÁÓÓ, "
- "ÄÌÑ ËÏÔÏÒÏÇÏ ÓÏÚÄÁÎ ÇÒÁÆ.\n"
- "<li>ðÒÑÍÏÕÇÏÌØÎÉË Ó ÞÅÒÎÏÊ ÇÒÁÎÉÃÅÊ ÏÂÏÚÎÁÞÁÅÔ ÄÏËÕÍÅÎÔÉÒÏ×ÁÎÎÕÀ ÓÔÒÕËÔÕÒÕ ÉÌÉ ËÌÁÓÓ.\n"
- "<li>ðÒÑÍÏÕÇÏÌØÎÉË Ó ÓÅÒÏÊ ÇÒÁÎÉÃÅÊ ÏÂÏÚÎÁÞÁÅÔ ÎÅÄÏËÕÍÅÎÔÉÒÏ×ÁÎÎÕÀ ÓÔÒÕËÔÕÒÕ ÉÌÉ ËÌÁÓÓ.\n"
- "<li>ðÒÑÍÏÕÇÏÌØÎÉË Ó ËÒÁÓÎÏÊ ÇÒÁÎÉÃÅÊ ÏÂÏÚÎÁÞÁÅÔ ÄÏËÕÍÅÎÔÉÒÏ×ÁÎÎÕÀ ÓÔÒÕËÔÕÒÕ ÉÌÉ ËÌÁÓÓ, ÄÌÑ ËÏÔÏÒÏÇÏ\n"
- " ÎÅ ×ÓÅ ÏÔÎÏÛÅÎÉÑ ÎÁÓÌÅÄÏ×ÁÎÉÑ/ÓÏÄÅÒÖÁÎÉÑ ÐÏËÁÚÁÎÙ. çÒÁÆ ÕÓÅÞÅÎ, "
- "ÅÓÌÉ ÏÎ ÎÅ ÐÏÍÅÓÔÉÌÓÑ × ÕËÁÚÁÎÎÙÈ ÇÒÁÎÉÃÁÈ.\n"
- "</ul>\n"
- "óÔÒÅÌËÉ ÉÍÅÀÔ ÓÌÅÄÕÀÝÅÅ ÚÎÁÞÅÎÉÅ:\n"
- "<ul>\n"
- "<li>ôÅÍÎÏ-ÓÉÎÑÑ ÓÔÒÅÌËÁ ÉÓÐÏÌØÚÕÅÔÓÑ ÄÌÑ ÉÚÏÂÒÁÖÅÎÉÑ ÏÔÎÏÛÅÎÉÑ ÏÔËÒÙÔÏÇÏ ÎÁÓÌÅÄÏ×ÁÎÉÑ "
- "ÍÅÖÄÕ Ä×ÕÍÑ ËÌÁÓÓÁÍÉ.\n"
- "<li>ôÅÍÎÏ-ÚÅÌÅÎÁÑ ÓÔÒÅÌËÁ ÉÓÐÏÌØÚÕÅÔÓÑ ÐÒÉ ÚÁÝÉÝÅÎÎÏÍ ÎÁÓÌÅÄÏ×ÁÎÉÉ.\n"
- "<li>ôÅÍÎÏ-ËÒÁÓÎÁÑ ÓÔÒÅÌËÁ ÉÓÐÏÌØÚÕÅÔÓÑ ÐÒÉ ÚÁËÒÙÔÏÍ ÎÁÓÌÅÄÏ×ÁÎÉÉ.\n"
- "<li>æÉÏÌÅÔÏ×ÁÑ ÓÔÒÅÌËÁ ÉÓÐÏÌØÚÕÅÔÓÑ, ÅÓÌÉ ËÌÁÓÓ ÓÏÄÅÒÖÉÔÓÑ ×"
- "ÄÒÕÇÏÍ ËÌÁÓÅ ÉÌÉ ÉÓÐÏÌØÚÕÅÔÓÑ ÄÒÕÇÉÍ ËÌÁÓÓÏÍ."
- "óÏ ÓÔÒÅÌËÏÊ ÕËÁÚÙ×ÁÅÔÓÑ ÐÅÒÅÍÅÎÎÁÑ, "
- "ÞÅÒÅÚ ËÏÔÏÒÕÀ ÄÏÓÔÕÐÅÎ ÕËÁÚÙ×ÁÅÍÙÊ ËÌÁÓÓ ÉÌÉ ÓÔÒÕËÔÕÒÁ. \n"
- "<li>öÅÌÔÁÑ ÓÔÒÅÌËÁ ÉÓÐÏÌØÚÕÅÔÓÑ ÄÌÑ Ó×ÑÚÉ ÐÏÄÓÔÁÎÏ×ËÉ ÛÁÂÌÏÎÁ É "
- "ÛÁÂÌÏÎÁ, ÎÁ ÏÓÎÏ×Å ËÏÔÏÒÏÇÏ ÜÔÁ ÐÏÄÓÔÁÎÏ×ËÁ ×ÙÐÏÌÎÅÎÁ. ó ÛÁÂÌÏÎÏÍ"
- "ÕËÁÚÙ×ÁÅÔÓÑ ÐÁÒÁÍÅÔÒ ÐÏÄÓÔÁÎÏ×ËÉ.\n"
- "</ul>\n");
- }
- /*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return decode("ÓÍ. ÌÅÇÅÎÄÕ");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return decode("ôÅÓÔ");
- }
- /*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return decode("óÐÉÓÏË ÔÅÓÔÏ×");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return decode("DCOP íÅÔÏÄÙ");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return decode("ó×ÏÊÓÔ×Á");
- }
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return decode("ðÏÌÎÙÊ ÓÐÉÓÏË Ó×ÏÊÓÔ×");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode( "óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ" );
- }
- else
- {
- return decode( "ëÌÁÓÓÙ" );
- }
- }
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
- {
- return decode("ðÁËÅÔ ")+name;
- }
- /*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return decode("ðÏÌÎÙÊ ÓÐÉÓÏË ÐÁËÅÔÏ× ");
- }
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return decode("ðÏÌÎÙÊ ÓÐÉÓÏË ÄÏËÕÍÅÎÔÉÒÏ×ÁÎÎÙÈ ÐÁËÅÔÏ×.");
- }
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return decode("ðÁËÅÔÙ");
- }
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return decode("íÁËÒÏÏÐÒÅÄÅÌÅÎÉÅ:");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return decode("ïÛÉÂËÁ");
- }
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return decode("ïÛÉÂËÉ");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6
-//////////////////////////////////////////////////////////////////////////
- /*! Used as ansicpg for RTF file */
- virtual QCString trRTFansicp()
- {
- return "1251";
- }
- /*! Used as ansicpg for RTF fcharset */
- virtual QCString trRTFCharSet()
- {
- return "204";
- }
- /*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return decode("áÌÆÁ×ÉÔÎÙÊ ÕËÁÚÁÔÅÌØ");
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trClass(bool first_capital, bool singular)
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- QCString result((first_capital ? "óÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ" : "ÓÔÒÕËÔÕÒÙ ÄÁÎÎÙÈ"));
- return decode(result);
- }
- else
- {
- QCString result((first_capital ? "ëÌÁÓÓ" : "ËÌÁÓÓ"));
- if(!singular) result+="Ù";
- return decode(result);
- }
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trFile(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "æÁÊÌ" : "ÆÁÊÌ"));
- if (!singular) result+="Ù";
- return decode(result);
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trNamespace(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "ðÒÏÓÔÒÁÎÓÔ×" : "ÐÒÏÓÔÒÁÎÓÔ×"));
- result+=(singular?"Ï ÉÍÅÎ":"Á ÉÍÅÎ");
- return decode(result);
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trGroup(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "çÒÕÐÐ" : "ÇÒÕÐÐ"));
- result+=(singular ? "Á" : "Ù");
- return decode(result);
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trPage(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "óÔÒÁÎÉÃ" : "ÓÔÒÁÎÉÃ"));
- result+=(singular ? "Á" : "Ù");
- return decode(result);
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trMember(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "þÌÅÎ" : "ÞÌÅÎ"));
- if (!singular) result+="Ù";
- return decode(result);
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trGlobal(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "çÌÏÂÁÌØÎÙ" : "ÇÌÏÂÁÌØÎÙ"));
- result+=(singular ? "Ê" : "Å");
- return decode(result);
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is generated when the \\author command is used and
- * for the author section in man pages. */
- virtual QCString trAuthor(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "á×ÔÏÒ" : "Á×ÔÏÒ"));
- if (!singular) result+="Ù";
- return decode(result);
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return decode("ðÅÒÅËÒÅÓÔÎÙÅ ÓÓÙÌËÉ");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 decode("úÁÍÅÝÁÅÔ ")+trWriteList(numEntries)+".";
- }
-
- /*! used in member documentation blocks to produce a list of
- * all members that implementation this member.
- */
- virtual QCString trImplementedInList(int numEntries)
- {
- return decode("úÁÍÅÝÁÅÔÓÑ × ")+trWriteList(numEntries)+".";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.16
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in RTF documentation as a heading for the Table
- * of Contents.
- */
- virtual QCString trRTFTableOfContents()
- {
- return decode("ïÇÌÁ×ÌÅÎÉÅ");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.17
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as the header of the list of item that have been
- * flagged deprecated
- */
- virtual QCString trDeprecatedList()
- {
- return decode( "óÐÉÓÏË ÕÓÔÁÒÅ×ÛÉÈ ÏÐÒÅÄÅÌÅÎÉÊ É ÏÐÉÓÁÎÉÊ" );
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.18
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a header for declaration section of the events found in
- * a C# program
- */
- virtual QCString trEvents()
- {
- return decode( "óÏÂÙÔÉÑ" );
- }
- /*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- return decode( "CÏÂÙÔÉÑ" );
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a heading for a list of Java class types with package scope.
- */
- virtual QCString trPackageTypes()
- {
- return decode( "ôÉÐÙ Ó ÏÂÌÁÓÔØÀ ×ÉÄÉÍÏÓÔÉ ÐÁËÅÔÁ" );
- }
- /*! Used as a heading for a list of Java class functions with package
- * scope.
- */
- virtual QCString trPackageMembers()
- {
- return decode( "æÕÎËÃÉÉ Ó ÏÂÌÁÓÔØÀ ×ÉÄÉÍÏÓÔÉ ÐÁËÅÔÁ" );
- }
- /*! Used as a heading for a list of static Java class functions with
- * package scope.
- */
- virtual QCString trStaticPackageMembers()
- {
- return decode( "óÔÁÔÉÞÅÓËÉÅ ÆÕÎËÃÉÉ Ó ÏÂÌÁÓÔØÀ ×ÉÄÉÍÏÓÔÉ ÐÁËÅÔÁ" );
- }
- /*! Used as a heading for a list of Java class variables with package
- * scope.
- */
- virtual QCString trPackageAttribs()
- {
- return decode( "ðÅÒÅÍÅÎÎÙÅ Ó ÏÂÌÁÓÔØÀ ×ÉÄÉÍÏÓÔÉ ÐÁËÅÔÁ" );
- }
- /*! Used as a heading for a list of static Java class variables with
- * package scope.
- */
- virtual QCString trStaticPackageAttribs()
- {
- return decode( "óÔÁÔÉÞÅÓËÉÅ ÐÅÒÅÍÅÎÎÙÅ Ó ÏÂÌÁÓÔØÀ ×ÉÄÉÍÏÓÔÉ ÐÁËÅÔÁ" );
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 decode( "õËÁÚÁÔÅÌØ" );
- }
- /*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- return decode( "çÒÁÆ ×ÙÚÏ×Ï×:" );
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! When the search engine is enabled this text is put in the header
- * of each page before the field where one can enter the text to search
- * for.
- */
- virtual QCString trSearchForIndex()
- {
- return decode( "ðÏÉÓË" );
- }
- /*! This string is used as the title for the page listing the search
- * results.
- */
- virtual QCString trSearchResultsTitle()
- {
- return decode( "òÅÚÕÌØÔÁÔÙ ÐÏÉÓËÁ" );
- }
- /*! 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
- * the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
- * value 2 represents 2 or more matches. HTML markup is allowed inside
- * the returned string.
- */
- virtual QCString trSearchResults(int numDocuments)
- {
- if (numDocuments==0)
- {
- return decode( "ë ÓÏÖÁÌÅÎÉÀ, ÐÏ ÷ÁÛÅÍÕ ÚÁÐÒÏÓÕ ÎÉÞÅÇÏ ÎÅ ÎÁÊÄÅÎÏ." );
- }
- else if( numDocuments == 1 )
- {
- return decode( "îÁÊÄÅÎ 1 ÄÏËÕÍÅÎÔ." );
- }
- else
- {
- return decode( "îÁÊÄÅÎ(Ï) <b>$num</b> ÄÏËÕÍÅÎÔ(Ï×). "
- "äÏËÕÍÅÎÔÙ ÏÔÓÏÒÔÉÒÏ×ÁÎÙ ÐÏ ÒÅÌÅ×ÁÎÔÎÏÓÔÉ." );
- }
- }
- /*! 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 decode( "îÁÊÄÅÎÏ:" );
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 decode( "éÓÈÏÄÎÙÊ ÆÁÊÌ " + filename );
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.9
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the name of the chapter containing the directory
- * hierarchy.
- */
- virtual QCString trDirIndex()
- { return decode( "äÅÒÅ×Ï ÄÉÒÅËÔÏÒÉÊ" ); }
-
- /*! This is used as the name of the chapter containing the documentation
- * of the directories.
- */
- virtual QCString trDirDocumentation()
- { return decode( "äÉÒÅËÔÏÒÉÉ" ); }
-
- /*! 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 decode( "áÌÆÁ×ÉÔÎÙÊ ÕËÁÚÁÔÅÌØ ÄÉÒÅËÔÏÒÉÊ" ); }
-
- /*! This returns a sentences that introduces the directory hierarchy.
- * and the fact that it is sorted alphabetically per level
- */
- virtual QCString trDirDescription()
- { return decode( "äÅÒÅ×Ï ÄÉÒÅËÔÏÒÉÊ" ); }
-
- /*! 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=QCString("óÏÄÅÒÖÁÎÉÅ ÄÉÒÅËÔÏÒÉÉ ")+ dirName; return decode( result ); }
-
- /*! 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 ? "äÉÒÅËÔÏÒÉ" : "ÄÉÒÅËÔÏÒÉ"));
- if (singular) result+="Ñ"; else result+="É";
- return decode( 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 decode( "üÔÁ ÆÕÎËÃÉÑ ÐÅÒÅÇÒÕÖÅÎÁ É ÐÒÅÄÏÓÔÁ×ÌÑÅÔÓÑ ÉÓËÌÀÞÉÔÅÌØÎÏ "
- "ÄÌÑ ÕÄÏÂÓÔ×Á ÉÓÐÏÌØÚÏ×ÁÎÉÑ. ïÎÁ ÏÔÌÉÞÁÅÔÓÑ ÏÔ ×ÙÛÅÕÐÏÍÑÎÕÔÏÊ "
- "ÔÏÌØËÏ ÆÁËÔÉÞÅÓËÉÍÉ ÁÒÇÕÍÅÎÔÁÍÉ." );
- }
-};
-
-#endif
diff --git a/src/translator_se.h b/src/translator_se.h
deleted file mode 100644
index 6e80997..0000000
--- a/src/translator_se.h
+++ /dev/null
@@ -1,1437 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-
-/*
-==================================================================================
-Svensk översättning av:
-Samuel Hägglund <sahag96@ite.mh.se>
-Xet Erixon <xet@xeqt.com>
-Mikael Hallin <mikaelhallin@yahoo.se> 2003-07-28
-==================================================================================
-Uppdateringar.
-1999/04/29
-* Omskrivningar av en hel del ordval, t.ex.
- ENG INNAN EFTER
- compound inhängnad sammansatt
- structs structs strukter
- unions unions unioner
-
- osv...
-
-* Alla översättnings-strängar returnerar i alla fall en något så när vettig
- förklaring...
-
-1999/05/27
-* Det verkade som vi glömt en del mellanslag i vissa strängar vilket resulterade
- i att en del ord blev ihopskrivna.
-
-* Bytt en del ordval igen...
- ENG INNAN EFTER
- reference manual Uppslagsbok referensmanual
-
-* Skrivit ihop en del ord som innan hade bindestreck
-* En del nya översättningar är tillagda.
-* Gamla översättningar borttagna
-
-===================================================================================
-Problem!
- Slot: nån hygglig svensk översättning???
-
- Skicka gärna synpunkter.
-===================================================================================
-1999/09/01
-* Det verkar som om "namnrymd" är en hyggligt vedertagen svensk översättning
- av "namespace", så jag kör med det från och med nu.
-* "interface" heter numera "gränssnitt"
-
-2003/07/28
-* Jag har updaterat översättningen efter ett par års träda..
-Problem!
- Deprecated: nån hygglig svensk översättning???
-
- Skicka gärna synpunkter.
-*/
-
-#ifndef TRANSLATOR_SE_H
-#define TRANSLATOR_SE_H
-
-class TranslatorSwedish : public Translator
-{
- public:
-
- virtual QCString idLanguage()
- { return "swedish"; }
-
- /*! Used to get the LaTeX command(s) for the language support.
- * This method should return string with commands that switch
- * LaTeX to the desired language. For example
- * <pre>"\\usepackage[german]{babel}\n"
- * </pre>
- * or
- * <pre>"\\usepackage{polski}\n"
- * "\\usepackage[latin2]{inputenc}\n"
- * "\\usepackage[T1]{fontenc}\n"
- * </pre>
- *
- * The English LaTeX does not use such commands. Because of this
- * the empty string is returned in this implementation.
- */
- virtual QCString latexLanguageSupportCommand()
- {
- return "";
- }
-
- /*! return the language charset. This will be used for the HTML output */
- virtual QCString idLanguageCharset()
- {
- return "iso-8859-1";
- }
-
- virtual QCString trRelatedFunctions()
- { return "Besläktade funktioner"; }
-
- virtual QCString trRelatedSubscript()
- { return "(Observera att dessa inte är medlemsfunktioner)"; }
-
- virtual QCString trDetailedDescription()
- { return "Detaljerad beskrivning"; }
-
- virtual QCString trMemberTypedefDocumentation()
- { return "Dokumentation av typdefinierade medlemmar"; }
-
- virtual QCString trMemberEnumerationDocumentation()
- { return "Dokumentation av egenuppräknande medlemmar"; }
-
- virtual QCString trMemberFunctionDocumentation()
- { return "Dokumentation av medlemsfunktioner"; }
-
- virtual QCString trMemberDataDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Fält dokumentation";
- }
- else
- {
- return "Dokumentation av datamedlemmar";
- }
- }
-
- virtual QCString trMore()
- { return "Mer..."; }
-
- virtual QCString trListOfAllMembers()
- { return "Lista över alla medlemmar."; }
-
- virtual QCString trMemberList()
- { return "Medlemslista"; }
-
- virtual QCString trThisIsTheListOfAllMembers()
- { return "Det här är en fullständig lista över medlemmar för "; }
-
- virtual QCString trIncludingInheritedMembers()
- { return " med alla ärvda medlemmar."; }
-
- virtual QCString trGeneratedAutomatically(const char *s)
- { QCString result="Automatiskt skapad av Doxygen";
- if (s) result+=(QCString)" för "+s;
- result+=" från källkoden.";
- return result;
- }
-
- virtual QCString trEnumName()
- { return "enum namn"; }
-
- virtual QCString trEnumValue()
- { return "enum värde"; }
-
- virtual QCString trDefinedIn()
- { return "definierad i"; }
-
-/*
- QCString trVerbatimText(const char *f)
- { return (QCString)"Detta är den ordagranna texten från inkluderingsfilen "+f; }
-*/
- virtual QCString trModules()
- { return "Moduler"; }
-
- virtual QCString trClassHierarchy()
- { return "Klasshierarki"; }
-
- virtual QCString trCompoundList()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Datastrukturer";
- }
- else
- {
- return "Sammansatt klasslista";
- }
- }
-
- virtual QCString trFileList()
- { return "Fillista"; }
-
- virtual QCString trCompoundMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Data fält";
- }
- else
- {
- return "Sammansatta klassmedlemmar";
- }
- }
-
- virtual QCString trFileMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Globala symboler";
- }
- else
- {
- return "Filmedlemmar";
- }
- }
-
- virtual QCString trRelatedPages()
- { return "Besläktade sidor"; }
-
- virtual QCString trExamples()
- { return "Exempel"; }
-
- virtual QCString trSearch()
- { return "Sök"; }
-
- virtual QCString trClassHierarchyDescription()
- { return "Denna lista över arv är grovt, men inte helt, "
- "sorterad i alfabetisk ordning:";
- }
-
- virtual QCString trFileListDescription(bool extractAll)
- {
- QCString result="Här följer en lista över alla ";
- if (!extractAll) result+="dokumenterade ";
- result+="filer, med en kort beskrivning:";
- return result;
- }
-
- virtual QCString trCompoundListDescription()
- {
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Här följer datastrukturerna med korta beskrivningar:";
- }
- else
- {
- return "Här följer klasserna, strukterna, unionerna och "
- "gränssnitten med korta beskrivningar:";
- }
- }
-
- /*! This is an introduction to the page with all class members. */
- virtual QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result="Här är en lista över alla ";
- if (!extractAll)
- {
- result+="dokumenterade ";
- }
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="struktur- och unions-fält";
- }
- else
- {
- result+="klassmedlemmar";
- }
- result+=" med länkar till ";
- if (!extractAll)
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="struktur/unions-dokumentationen för varje fält:";
- }
- else
- {
- result+="klassdokumentationen för varje medlem:";
- }
- }
- else
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+=" strukturerna/unionerna de tillhör:";
- }
- else
- {
- result+="klasserna de tillhör:";
- }
- }
- return result;
- }
-
- virtual QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="Här följer en lista över alla ";
- if (!extractAll) result+="dokumenterade ";
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="funktioner, variabler, definitioner, enumerationer "
- "och typdefinitioner";
- }
- else
- {
- result+= "filmedlemmar";
- }
- result+= " med länkar till ";
- if (extractAll)
- result+= "filerna som de tillhör:";
- else
- result+= "dokumentationen:";
- return result;
- }
-
- virtual QCString trExamplesDescription()
- { return "Här följer en lista med alla exempel:"; }
-
- virtual QCString trRelatedPagesDescription()
- { return "Här följer en lista över alla besläktade dokumentationssidor:";}
-
- virtual QCString trModulesDescription()
- { return "Här följer en lista över alla moduler:"; }
-
- virtual QCString trDocumentation()
- { return "Dokumentation"; }
-
- virtual QCString trModuleIndex()
- { return "Modulindex"; }
-
- virtual QCString trHierarchicalIndex()
- { return "Hierarkiskt Index"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * annotated compound index.
- */
- virtual QCString trCompoundIndex()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C")) {
- return "Index över datastrukturer";
- } else {
- return "Index över sammensatta typer";
- }
- }
-
- virtual QCString trFileIndex()
- { return "Filindex"; }
-
- virtual QCString trModuleDocumentation()
- { return "Dokumentation över moduler"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all classes, structs and unions.
- */
- virtual QCString trClassDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Dokumentation över datastrukturer";
- }
- else
- {
- return "Documentation över klasser";
- }
- }
-
- virtual QCString trFileDocumentation()
- { return "Dokumentation över filer"; }
-
- virtual QCString trExampleDocumentation()
- { return "Dokumentation över exempel"; }
-
- virtual QCString trPageDocumentation()
- { return "Dokumentation av sidor"; }
-
- virtual QCString trReferenceManual()
- { return "Referensmanual"; }
-
- virtual QCString trDefines()
- { return "Definitioner"; }
- virtual QCString trFuncProtos()
- { return "Funktionsprototyper"; }
- virtual QCString trTypedefs()
- { return "Typdefinitioner"; }
- virtual QCString trEnumerations()
- { return "Egenuppräknande typer"; }
- virtual QCString trFunctions()
- { return "Funktioner"; }
- virtual QCString trVariables()
- { return "Variabler"; }
-
- virtual QCString trEnumerationValues()
- { return "Egenuppräknade typers värden"; }
-
- virtual QCString trDefineDocumentation()
- { return "Dokumentation över definitioner"; }
-
- virtual QCString trFunctionPrototypeDocumentation()
- { return "Dokumentation över funktionsprototyper"; }
-
- virtual QCString trTypedefDocumentation()
- { return "Dokumentation över typdefinitioner"; }
-
- virtual QCString trEnumerationTypeDocumentation()
- { return "Dokumentation över egenuppräknande typer"; }
-
- virtual QCString trFunctionDocumentation()
- { return "Dokumentation över funktioner"; }
-
- virtual QCString trVariableDocumentation()
- { return "Dokumentation över variabler"; }
-
- /*! This is used in the documentation of a file/namespace/group before
- * the list of links to documented compounds
- */
- virtual QCString trCompounds()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Datastrukturer";
- }
- else
- {
- return "Sammansättning";
- }
- }
-
- virtual QCString trGeneratedAt(const char *date,const char *projName)
- {
- QCString result=(QCString)"Skapad "+date;
- if (projName) result+=(QCString)" för "+projName;
- result+=(QCString)" av";
- return result;
- }
-
- virtual QCString trWrittenBy()
- {
- return "skriven av";
- }
-
- virtual QCString trClassDiagram(const char *clName)
- {
- return (QCString)"Klassdiagram för "+clName;
- }
-
- virtual QCString trForInternalUseOnly()
- { return "Endast för internt bruk."; }
-
- virtual QCString trWarning()
- { return "Varning"; }
-
- virtual QCString trVersion()
- { return "Version"; }
-
- virtual QCString trDate()
- { return "Datum"; }
-
- virtual QCString trReturns()
- { return "Returnerar"; }
-
- virtual QCString trSeeAlso()
- { return "Se även"; }
-
- virtual QCString trParameters()
- { return "Parametrar"; }
-
- virtual QCString trExceptions()
- { return "Undantag"; }
-
- virtual QCString trGeneratedBy()
- { return "Skapad av"; }
-
-// new since 0.49-990307
-
- virtual QCString trNamespaceList()
- { return "Namnrymdslista"; }
-
- virtual QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="Här är en lista över alla ";
- if (!extractAll) result+="dokumenterade ";
- result+="namnrymder med en kort beskrivning:";
- return result;
- }
-
- virtual QCString trFriends()
- { return "Vänner"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trRelatedFunctionDocumentation()
- { return "Vänners och besläktade funktioners dokumentation"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- {
- QCString result=(QCString)clName+" ";
- switch(compType)
- {
- case ClassDef::Class: result+=" klass"; break;
- case ClassDef::Struct: result+=" strukt"; break;
- case ClassDef::Union: result+=" union"; break;
- case ClassDef::Interface: result+=" gränssnitt"; break;
- case ClassDef::Protocol: result+=" protocol"; break; // translate me!
- case ClassDef::Category: result+=" category"; break; // translate me!
- case ClassDef::Exception: result+=" undantag"; break;
- }
- if (isTemplate) result+="template";
- result+="referens";
- return result;
- }
-
- virtual QCString trFileReference(const char *fileName)
- {
- QCString result=fileName;
- result+=" filreferens";
- return result;
- }
-
- virtual QCString trNamespaceReference(const char *namespaceName)
- {
- QCString result=namespaceName;
- result+=" namnrymdreferens";
- return result;
- }
-
- virtual QCString trPublicMembers()
- { return "Publika medlemmar"; }
- virtual QCString trPublicSlots()
- { return "Publika slots"; }
- virtual QCString trSignals()
- { return "Signaler"; }
- virtual QCString trStaticPublicMembers()
- { return "Statiska publika medlemmar"; }
- virtual QCString trProtectedMembers()
- { return "Skyddade medlemmar"; }
- virtual QCString trProtectedSlots()
- { return "Skyddade slots"; }
- virtual QCString trStaticProtectedMembers()
- { return "Statiska skyddade medlemmar"; }
- virtual QCString trPrivateMembers()
- { return "Privata medlemmar"; }
- virtual QCString trPrivateSlots()
- { return "Privata slots"; }
- virtual QCString trStaticPrivateMembers()
- { return "Statiska privata medlemmar"; }
- // end of member sections
-
- virtual QCString trWriteList(int numEntries)
- {
- // this function is used to produce a comma-separated list of items.
- // use generateMarker(i) to indicate where item i should be put.
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=", och ";
- }
- }
- return result;
- }
-
- virtual QCString trInheritsList(int numEntries)
- // used in class documentation to produce a list of base classes,
- // if class diagrams are disabled.
- {
- return "Ärver "+trWriteList(numEntries)+".";
- }
- virtual QCString trInheritedByList(int numEntries)
- // used in class documentation to produce a list of super classes,
- // if class diagrams are disabled.
- {
- return "Ärvd av "+trWriteList(numEntries)+".";
- }
- virtual QCString trReimplementedFromList(int numEntries)
- // used in member documentation blocks to produce a list of
- // members that are hidden by this one.
- {
- return "Återskapad från "+trWriteList(numEntries)+".";
- }
- virtual QCString trReimplementedInList(int numEntries)
- {
- // used in member documentation blocks to produce a list of
- // all member that overwrite the implementation of this member.
- return "Återskapad i "+trWriteList(numEntries)+".";
- }
-
- virtual QCString trNamespaceMembers()
- { return "Namnrymdsmedlemmar"; }
- virtual QCString trNamespaceMemberDescription(bool extractAll)
- {
- QCString result="Här är en lista över alla ";
- if (!extractAll) result+="dokumenterade ";
- result+="namnrymdsmedlemmar med länkar till ";
- if (extractAll)
- result+=" namnrymd-dokumentationen för varje medlem:";
- else
- result+="de namnrymder de tillhör:";
- return result;
- }
-
- virtual QCString trNamespaceIndex()
- { return "Namnrymdsindex"; }
-
- virtual QCString trNamespaceDocumentation()
- { return "Namnrymd-dokumentation"; }
- //////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- virtual QCString trNamespaces()
- { return "Namnrymder"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990728
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is put at the bottom of a class documentation page and is
- * followed by a list of files that were used to generate the page.
- */
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)"Dokumentationen för ";
- switch(compType)
- {
- case ClassDef::Class: result+="denna klass "; break;
- case ClassDef::Struct: result+="denna strukt "; break;
- case ClassDef::Union: result+="denna union "; break;
- case ClassDef::Interface: result+="detta gränssnitt "; break;
- case ClassDef::Protocol: result+="protocol"; break; // translate me!
- case ClassDef::Category: result+="category"; break; // translate me!
- case ClassDef::Exception: result+="detta undantag "; break;
- }
- result+="var genererad från följande fil";
- if (single) result+=":"; else result+="er:";
- return result;
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- virtual QCString trAlphabeticalList()
- {
- return "Alfabetisk lista";
- }
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- virtual QCString trReturnValues()
- { return "Returvärden"; }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- virtual QCString trMainPage()
- { return "Huvudsida"; }
-
- /*! 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 "s."; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991003
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDefinedAtLineInSourceFile()
- {
- return "Definition på rad @0 i filen @1.";
- }
- virtual QCString trDefinedInSourceFile()
- {
- return "Definition i filen @0.";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDeprecated()
- {
- return "Föråldrad";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- virtual QCString trCollaborationDiagram(const char *clName)
- {
- return (QCString)"Samarbetsdiagram för "+clName+":";
- }
-
- /*! this text is put before an include dependency graph */
- virtual QCString trInclDepGraph(const char *fName)
- {
- return (QCString)"Include-beroendediagram för "+fName+":";
- }
-
- /*! header that is put before the list of constructor/destructors. */
- virtual QCString trConstructorDocumentation()
- {
- return "Dokumentation av konstruktorer och destruktorer";
- }
-
- /*! Used in the file documentation to point to the corresponding sources. */
- virtual QCString trGotoSourceCode()
- {
- return "Gå till denna fils källkod.";
- }
-
- /*! Used in the file sources to point to the corresponding documentation. */
- virtual QCString trGotoDocumentation()
- {
- return "Gå till denna fils dokumentation.";
- }
-
- /*! Text for the \\pre command */
- virtual QCString trPrecondition()
- {
- return "Förhandsvillkor";
- }
-
- /*! Text for the \\post command */
- virtual QCString trPostcondition()
- {
- return "Resultat"; //"Postcondition";
- }
-
- /*! Text for the \\invariant command */
- virtual QCString trInvariant()
- {
- return "Invariant";
- }
-
- /*! Text shown before a multi-line variable/enum initialization */
- virtual QCString trInitialValue()
- {
- return "Begynnelsevärde:";
- }
- /*! Text used the source code in the file index */
- virtual QCString trCode()
- {
- return "källkod";
- }
-
- virtual QCString trGraphicalHierarchy()
- {
- return "Grafisk klasshierarki";
- }
- virtual QCString trGotoGraphicalHierarchy()
- {
- return "Gå till den grafiska klasshierarkin";
- }
- virtual QCString trGotoTextualHierarchy()
- {
- return "Gå till den textbaserade klasshierarkin";
- }
- virtual QCString trPageIndex()
- {
- return "Sidindex";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trNote()
- {
- return "Notera";
- }
- virtual QCString trPublicTypes()
- {
- return "Publika typer";
- }
- virtual QCString trPublicAttribs()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Datafält";
- }
- else
- {
- return "Publika attribut";
- }
- }
- virtual QCString trStaticPublicAttribs()
- {
- return "Statiska publika attribut";
- }
- virtual QCString trProtectedTypes()
- {
- return "Skyddade typer";
- }
- virtual QCString trProtectedAttribs()
- {
- return "Skyddade attribut";
- }
- virtual QCString trStaticProtectedAttribs()
- {
- return "Statiska skyddade attribut";
- }
- virtual QCString trPrivateTypes()
- {
- return "Privata typer";
- }
- virtual QCString trPrivateAttribs()
- {
- return "Privata attribut";
- }
- virtual QCString trStaticPrivateAttribs()
- {
- return "Statiska privata attribut";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\todo item */
- virtual QCString trTodo()
- {
- return "Att-göra";
- }
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- {
- return "Att-göra lista";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy()
- {
- return "Refererad av";
- }
- virtual QCString trRemarks()
- {
- return "Lägg märke till";
- }
- virtual QCString trAttention()
- {
- return "Observera";
- }
- virtual QCString trInclByDepGraph()
- {
- return "Den här grafen visar vilka filer som direkt eller "
- "indirekt inkluderar denna filen.";
- }
- virtual QCString trSince()
- {
- return "Sedan";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- virtual QCString trLegendTitle()
- {
- return "Grafförklaring";
- }
-
- /*! 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
- "Den här sidan förklarar hur man ska tolka de grafer som doxygen "
- "genererar.<p>\n"
- "Tag följande exempel:\n"
- "\\code\n"
- "/*! Osynlig klass på grund av stympning */\n"
- "class Invisible { };\n\n"
- "/*! Stympad klass, ärvningsrelationen är dold */\n"
- "class Truncated : public Invisible { };\n\n"
- "/* Klass utan doxygen-kommentarer */\n"
- "class Undocumented { };\n\n"
- "/*! Klass som ärvs med publikt arv */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! En template-klass */\n"
- "template<class T> class Templ { };\n\n"
- "/*! Klass som ärvs med skyddat arv */\n"
- "class ProtectedBase { };\n\n"
- "/*! Klass som ärvs med privat arv */\n"
- "class PrivateBase { };\n\n"
- "/*! Klass som används av Inherited klassen */\n"
- "class Used { };\n\n"
- "/*! Super klassen som ärver ett antal andra klasser */\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"
- "Om \\c MAX_DOT_GRAPH_HEIGHT är satt till 240 i konfigurationsfilen, "
- "kommer följande graf att generas:"
- "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
- "Rektanglarna i den ovanstående grafen har följande betydelser:\n"
- "<ul>\n"
- "<li>%En fylld svart rektangel representerar den strukt eller klass "
- "som har genererat grafen.\n"
- "<li>%En rektangel med svart kant symboliserar en dokumenterad "
- "strukt eller klass.\n"
- "<li>%En rektangel med grå kant symboliserar en odokumenterad strukt "
- "eller klass.\n"
- "<li>%En klass med röd kant symboliserar en strukt eller klass där "
- "alla dess relationer inte visas. %En graf stympas om den inte får "
- "plats inom de givna gränserna.\n"
- "</ul>\n"
- "Pilarna har följande betydelser:\n"
- "<ul>\n"
- "<li>%En mörkblå pil används för att visualisera en publik arvrelation "
- "mellan två klasser.\n"
- "<li>%En mörkgrön pil används för en skyddad arvsrelation.\n"
- "<li>%En mörkröd pil används för en privat arvsrelation.\n"
- "<li>%En sträckad lila pil används om en klass är innesluten eller "
- "använd av en annan klass. Vid pilen står namnet på den eller de "
- "variabler som klassen pilen pekar på kommer åt.\n"
- "<li>%En sträckad gul pil symboliserar förhållandet mellan en "
- "template-instans och template-klassen, som den instantierades från.\n"
- "Vid pilen står instansens template-parametrar.\n"
- "</ul>\n";
- }
-
- /*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return "förklaring";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return "Test";
- }
- /*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return "Testlista";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return "DCOP metoder";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return "Egenskaper";
- }
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return "Egenskapsdokumentation";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Datastrukturer";
- }
- else
- {
- return "Klasser";
- }
- }
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
- {
- return (QCString)"Paket "+name;
- }
- /*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return "Paketlista";
- }
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return "Här är en lista över paketen med en kort beskrivning "
- "(om sådan finns):";
- }
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return "Paket";
- }
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return "Värde:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return "Bugg";
- }
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return "Bugglista";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as ansicpg for RTF file
- * (used table extract:)
- * <pre>
- * Charset Name Charset Value(hex) Codepage number
- * ------------------------------------------------------
- * ANSI_CHARSET 0 (x00) 1252
- * </pre>
- */
- virtual QCString trRTFansicp()
- {
- return "1252";
- }
-
- /*! Used as ansicpg for RTF fcharset */
- virtual QCString trRTFCharSet()
- {
- return "0";
- }
-
- /*! Used as header RTF general 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 ? "Klass" : "klass"));
- if (!singular) result+="er";
- 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 ? "Fil" : "fil"));
- if (!singular) result+="er";
- 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 ? "Namnrymd" : "namnrynd"));
- if (!singular) result+="er";
- 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 ? "Grupp" : "grupp"));
- if (!singular) result+="er";
- 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 ? "Sid" : "sid"));
- if (singular)
- result+="a";
- else
- result+="or";
- 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 ? "Medlem" : "medlem"));
- if (!singular) result+="mar";
- 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 ? "Global" : "global"));
- if (!singular) result+="er";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is generated when the \\author command is used and
- * for the author section in man pages. */
- virtual QCString trAuthor(bool first_capital, bool /*singular*/)
- {
- QCString result((first_capital ? "Författare" : "författare"));
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return "Referenser";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Implementerar "+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 "Implementerad i "+trWriteList(numEntries)+".";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.16
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in RTF documentation as a heading for the Table
- * of Contents.
- */
- virtual QCString trRTFTableOfContents()
- {
- return "Innehållsförteckning";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.17
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as the header of the list of item that have been
- * flagged deprecated
- */
- virtual QCString trDeprecatedList()
- {
- return "Lista över föråldrade";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.18
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a header for declaration section of the events found in
- * a C# program
- */
- virtual QCString trEvents()
- {
- return "Händelser";
- }
- /*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- return "Händelse Dokumentation";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a heading for a list of Java class types with package scope.
- */
- virtual QCString trPackageTypes()
- {
- return "Paket typer";
- }
- /*! Used as a heading for a list of Java class functions with package
- * scope.
- */
- virtual QCString trPackageMembers()
- {
- return "Paket funktioner";
- }
- /*! Used as a heading for a list of static Java class functions with
- * package scope.
- */
- virtual QCString trStaticPackageMembers()
- {
- return "Statiska paket funktioner";
- }
- /*! Used as a heading for a list of Java class variables with package
- * scope.
- */
- virtual QCString trPackageAttribs()
- {
- return "Paket attribut";
- }
- /*! Used as a heading for a list of static Java class variables with
- * package scope.
- */
- virtual QCString trStaticPackageAttribs()
- {
- return "Statiska paket attribut";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Alla";
- }
- /*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- return "Här är anropnings diagrammet för den här funktionen:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! When the search engine is enabled this text is put in the header
- * of each page before the field where one can enter the text to search
- * for.
- */
- virtual QCString trSearchForIndex()
- {
- return "Sök efter";
- }
- /*! This string is used as the title for the page listing the search
- * results.
- */
- virtual QCString trSearchResultsTitle()
- {
- return "Sökresultat";
- }
- /*! 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
- * the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
- * value 2 represents 2 or more matches. HTML markup is allowed inside
- * the returned string.
- */
- virtual QCString trSearchResults(int numDocuments)
- {
- if (numDocuments==0)
- {
- return "Tyvärr finns det inga dokument som matchar din sökning.";
- }
- else if (numDocuments==1)
- {
- return "Hittade <b>1</b> dokument som matchar din sökning.";
- }
- else
- {
- return "Hittade <b>$num</b> dokument som matchar din sökning. "
- "Visar de bästa träffarna först.";
- }
- }
- /*! 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 "Träffar:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Källkodsfilen " + filename;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.9
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the name of the chapter containing the directory
- * hierarchy.
- */
- virtual QCString trDirIndex()
- { return "Katalogstruktur"; }
-
- /*! This is used as the name of the chapter containing the documentation
- * of the directories.
- */
- virtual QCString trDirDocumentation()
- { return "Katalogdokumentation"; }
-
- /*! 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 "Kataloger"; }
-
- /*! This returns a sentences that introduces the directory hierarchy.
- * and the fact that it is sorted alphabetically per level
- */
- virtual QCString trDirDescription()
- { return "Den här katalogen är grovt sorterad, "
- "men inte helt, i alfabetisk ordning:";
- }
-
- /*! 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=dirName; result+=" Katalogreferens"; return result; }
-
- /*! 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 ? "Katalog" : "katalog"));
- if (!singular) result+="er";
- 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 "Det här är en överlagrad medlemsfunktion "
- "tillhandahållen för bekvämlighet. Den enda som "
- "skiljer sig från ovanstående funktion är vilka "
- "argument den tar emot.";
- }
-
-
-};
-
-#endif
diff --git a/src/translator_si.h b/src/translator_si.h
deleted file mode 100644
index 96af0df..0000000
--- a/src/translator_si.h
+++ /dev/null
@@ -1,1028 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-
-// translation by Matjaz Ostroversnik <matjaz.ostroversnik@zrs-tk.si>
-
-#ifndef TRANSLATOR_SI_H
-#define TRANSLATOR_SI_H
-
-
-class TranslatorSlovene : public TranslatorAdapter_1_2_16
-{
- public:
- QCString idLanguage()
- { return "slovene"; }
- /*! Used to get the command(s) for the language support. This method
- * was designed for languages which do not prefer babel package.
- * If this methods returns empty string, then the latexBabelPackage()
- * method is used to generate the command for using the babel package.
- */
- QCString latexLanguageSupportCommand()
- {
- return "\\usepackage[slovene]{babel} \n\\usepackage[latin2]{inputenc} \n\\usepackage[T1]{fontenc}\n";
- }
- QCString idLanguageCharset()
- {
-#ifdef _WIN32
- return "windows-1250";
-#else
- return "iso-8859-2";
-#endif
- }
- QCString trRelatedFunctions()
- { return "Povezane funkcije"; }
- QCString trRelatedSubscript()
- { return "(To niso metode.)"; }
- QCString trDetailedDescription()
- { return "Podroben opis"; }
- QCString trMemberTypedefDocumentation()
- { return "Opis uporabni¹ko definiranih tipov"; }
- QCString trMemberEnumerationDocumentation()
- { return "Opis komponent na¹tevnih tipov"; }
- QCString trEnumerationValueDocumentation()
- { return "Opis vrednosti na¹tevnih tipov (enum) "; }
- QCString trMemberFunctionDocumentation()
- { return "Opis metod"; }
- QCString trMemberDataDocumentation()
- { return "Opis atributov"; }
- QCString trMore()
- { return "..."; }
- QCString trListOfAllMembers()
- { return "Seznam vseh metod / atributov."; }
- QCString trMemberList()
- { return " - seznam metod in atributov."; }
- QCString trThisIsTheListOfAllMembers()
- { return "Seznam metod razreda "; }
- QCString trIncludingInheritedMembers()
- { return ", vkljuèujoè dedovane metode in atribute."; }
- QCString trGeneratedAutomatically(const char *s)
- { QCString result="zgenerirano z Doxygen-om";
- if (s) result+=(QCString)" za "+s;
- result+=" iz izvorne kode.";
- return result;
- }
- QCString trEnumName()
- { return "na¹tevno ime"; }
- QCString trEnumValue()
- { return "na¹tevna vrednost"; }
- QCString trDefinedIn()
- { return "definirano v"; }
- QCString trModules()
- { return "moduli"; }
- QCString trClassHierarchy()
- { return "dedovalna hierarhija"; }
- QCString trCompoundList()
- { return "kratek opis razredov"; }
- QCString trFileList()
- { return "seznam datotek"; }
- QCString trHeaderFiles()
- { return "'Header' datoteka"; }
- QCString trCompoundMembers()
- { return "metode in atributi"; }
- QCString trFileMembers()
- { return "komponente v datotekah"; }
- QCString trRelatedPages()
- { return "dodatni opisi"; }
- QCString trExamples()
- { return "Primeri"; }
- QCString trSearch()
- { return "I¹èi"; }
- QCString trClassHierarchyDescription()
- { return "Hierarhièno drevo je (okvirno) sortirano po abecedi. ";
- }
- QCString trFileListDescription(bool extractAll)
- {
- QCString result="Seznam vseh ";
- if (!extractAll) result+="dokumentiranih ";
- result+="datotek s kratkim opisom:";
- return result;
- }
- QCString trCompoundListDescription()
- { return "Seznam razredov, mno¾ic in struktur "
- "s kratkim opisom :";
- }
- QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result="Seznam vseh ";
- if (!extractAll) result+="dokumentiranih ";
- result+="metod in atributov s povezavami na ";
- if (extractAll) result+="opis posamezne metode in/ali atributa:";
- else result+="opis razreda :";
- return result;
- }
- QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="Seznam ";
- if (!extractAll) result+="dokumentiranih ";
- result+="entitet v datotekah ";
- if (extractAll) result+="skupaj z opisom datoteke v kateri se nahajajo:";
- else result+="s povezavami na datoteke v katerih se nahajajo:";
- return result;
- }
- QCString trHeaderFilesDescription()
- { return "Seznam header datotek, ki tvorijo aplikacijski vmesnik (API) :"; }
- QCString trExamplesDescription()
- { return "Seznam primerov :"; }
- QCString trRelatedPagesDescription()
- { return "Seznam strani z dodatnimi opisi:"; }
- QCString trModulesDescription()
- { return "Seznam modulov:"; }
- QCString trNoDescriptionAvailable()
- { return "Opis ni dostopen"; }
-
- QCString trDocumentation()
- { return "Dokumentacija"; }
- QCString trModuleIndex()
- { return "seznam modulov"; }
- QCString trHierarchicalIndex()
- { return "Hierarhièni indeks"; }
- QCString trCompoundIndex()
- { return "abecedni seznam"; }
- QCString trFileIndex()
- { return "seznam datotek"; }
- QCString trModuleDocumentation()
- { return "Dokumentacija modulov"; }
- QCString trClassDocumentation()
- { return "Opis razreda"; }
- QCString trFileDocumentation()
- { return "Opis datoteke"; }
- QCString trExampleDocumentation()
- { return "Opis primera"; }
- QCString trPageDocumentation()
- { return "Opis povezanih strani"; }
- QCString trReferenceManual()
- { return "Priroènik"; }
-
- QCString trDefines()
- { return "Makro deklaracije"; }
- QCString trFuncProtos()
- { return "Prototipi funkcij"; }
- QCString trTypedefs()
- { return "Uporabni¹ko definirani tipi"; }
- QCString trEnumerations()
- { return "Na¹tevni tipi"; }
- QCString trFunctions()
- { return "Funkcije"; }
- QCString trVariables()
- { return "Spremenljivke"; }
- QCString trEnumerationValues()
- { return "Vrednosti na¹tevnih tipov"; }
- QCString trDefineDocumentation()
- { return "Opis makro definicije"; }
- QCString trFunctionPrototypeDocumentation()
- { return "Opis prototipa funkcije"; }
- QCString trTypedefDocumentation()
- { return "Opis uporabni¹ko definiranega tipa"; }
- QCString trEnumerationTypeDocumentation()
- { return "Opis na¹tevnega (enum) tipa"; }
- QCString trFunctionDocumentation()
- { return "Opis funkcije"; }
- QCString trVariableDocumentation()
- { return "Opis spremenljivke"; }
- QCString trCompounds()
- { return "Strukture"; }
- QCString trGeneratedAt(const char *date,const char *projName)
- {
- QCString result=(QCString)"Generirano "+date;
- if (projName) result+=(QCString)" projekt: "+projName;
- result+=(QCString)" generator: ";
- return result;
- }
- QCString trWrittenBy()
- {
- return "napisal ";
- }
- QCString trClassDiagram(const char *clName)
- {
- return (QCString)"Diagram razredov za "+clName;
- }
- QCString trForInternalUseOnly()
- { return "Samo za interno uporabo."; }
- QCString trReimplementedForInternalReasons()
- { return "Ponovno implementirano zaradi internih razlogov. "
- "Nima vpliva na API.";
- }
- QCString trWarning()
- { return "Opozorilo"; }
- QCString trBugsAndLimitations()
- { return "Napake in omejtive"; }
- QCString trVersion()
- { return "Verzija"; }
- QCString trDate()
- { return "Datum"; }
- QCString trReturns()
- { return "Rezultat(i)"; }
- QCString trSeeAlso()
- { return "Glej"; }
- QCString trParameters()
- { return "Parametri"; }
- QCString trExceptions()
- { return "Prekinitve"; }
- QCString trGeneratedBy()
- { return "Izdelano s pomoèjo"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307
-//////////////////////////////////////////////////////////////////////////
-
- QCString trNamespaceList()
- { return "imenski prostori"; }
- QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="Seznam ";
- if (!extractAll) result+="dokumentiranih ";
- result+="imenskih prostorov z opisom:";
- return result;
- }
- QCString trFriends()
- { return "Prijatelji (Friends) "; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- QCString trRelatedFunctionDocumentation()
- { return "Podatki o poveznih funkcijah"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool /*isTemplate*/)
- // used as the title of the HTML page of a class/struct/union
- {
- QCString result="";
- switch(compType)
- {
- case ClassDef::Class: result+=" Razred "; break;
- case ClassDef::Struct: result+=" Struktura "; break;
- case ClassDef::Union: result+=" Mno¾ica "; break;
- case ClassDef::Interface: result+=" IDL vmesnik "; break;
- case ClassDef::Protocol: result+=" protocol "; break; // translate me!
- case ClassDef::Category: result+=" category "; break; // translate me!
- case ClassDef::Exception: result+=" IDL prekinitev "; break;
- }
- result += (QCString)clName;
-
- return result;
- }
- QCString trFileReference(const char *fileName)
- // used as the title of the HTML page of a file
- {
- QCString result="Datoteka ";
- result+=fileName;
- return result;
- }
- QCString trNamespaceReference(const char *namespaceName)
- // used as the title of the HTML page of a namespace
- {
- QCString result ="Imenski prostor ";
- result+=namespaceName;
-
- return result;
- }
-
- // these are for the member sections of a class, struct or union
- QCString trPublicMembers()
- { return "Javne metode"; }
- QCString trPublicSlots()
- { return "Public slotovi"; }
- QCString trSignals()
- { return "Programske prekinitve"; }
- QCString trStaticPublicMembers()
- { return "Statiène javne metode in atributi"; }
- QCString trProtectedMembers()
- { return "Za¹èitene metode in atributi"; }
- QCString trProtectedSlots()
- { return "Za¹èiteni sloti"; }
- QCString trStaticProtectedMembers()
- { return "Statiène za¹èitene metode in atributi"; }
- QCString trPrivateMembers()
- { return "Skrite metode in atributi"; }
- QCString trPrivateSlots()
- { return "Skriti slotovi"; }
- QCString trStaticPrivateMembers()
- { return "Statiène skrite metode in atributi"; }
- // end of member sections
-
- QCString trWriteList(int numEntries)
- {
- // this function is used to produce a comma-separated list of items.
- // use generateMarker(i) to indicate where item i should be put.
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=" in ";
- }
- }
- return result;
- }
-
- QCString trInheritsList(int numEntries)
- // used in class documentation to produce a list of base classes,
- // if class diagrams are disabled.
- {
- return "Deduje od "+trWriteList(numEntries)+".";
- }
- QCString trInheritedByList(int numEntries)
- // used in class documentation to produce a list of super classes,
- // if class diagrams are disabled.
- {
- return "Naslijeðena u "+trWriteList(numEntries)+".";
- }
- QCString trReimplementedFromList(int numEntries)
- // used in member documentation blocks to produce a list of
- // members that are hidden by this one.
- {
- return "Skrije implementacijo iz "+trWriteList(numEntries)+".";
- }
- QCString trReimplementedInList(int numEntries)
- {
- // used in member documentation blocks to produce a list of
- // all member that overwrite the implementation of this member.
- return "Metodo skrijejo implementacije v razredih "+trWriteList(numEntries)+".";
- }
-
- QCString trNamespaceMembers()
- // This is put above each page as a link to all members of namespaces.
- { return "elementi imenskega prostora"; }
- QCString trNamespaceMemberDescription(bool extractAll)
- // This is an introduction to the page with all namespace members
- {
- QCString result="Seznam vseh ";
- if (!extractAll) result+="dokumentiranih ";
- result+="elementov imenskega prostora s povezavami na ";
- if (extractAll)
- result+="opis vsakega elementa:";
- else
- result+="imenski prostor, ki mu pripadajo:";
- return result;
- }
- QCString trNamespaceIndex()
- // This is used in LaTeX as the title of the chapter with the
- // index of all namespaces.
- { return "Indeks imenskih prostorov"; }
- QCString trNamespaceDocumentation()
- // This is used in LaTeX as the title of the chapter containing
- // the documentation of all namespaces.
- { return "Podatki o imenskih prostorih"; }
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- virtual QCString trNamespaces()
- { return "Imenski prostori"; }
-
-
-//////////////////////////////////////////////////////////////////////////
-// 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.
- */
- QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)"Opis ";
- switch(compType)
- {
- case ClassDef::Class: result+="razreda"; break;
- case ClassDef::Struct: result+="strukture"; break;
- case ClassDef::Union: result+="unije"; break;
- case ClassDef::Interface: result+="vmesnika (interface)"; break;
- case ClassDef::Protocol: result+="protocol"; break; // translate me!
- case ClassDef::Category: result+="category"; break; // translate me!
- case ClassDef::Exception: result+="prekinitve (exception)"; break;
- }
- result+=" je zgrajen na podlagi naslednj";
- if (single) result+="e "; else result+="ih";
- result+=" datotek";
- if (single) result+="e :"; else result+=" :";
- return result;
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- QCString trAlphabeticalList()
- { return "abecedni seznam"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- QCString trReturnValues()
- { return "Povratna vrednost"; }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- QCString trMainPage()
- { return "prva stran"; }
-
- /*! This is used in references to page that are put in the LaTeX
- * documentation. It should be an abbreviation of the word page.
- */
- QCString trPageAbbreviation()
- { return "str."; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991106
-//////////////////////////////////////////////////////////////////////////
-
- QCString trSources()
- {
- return "Izvorne datoteke";
- }
- QCString trDefinedAtLineInSourceFile()
- {
- return "Definirano v @0 vrstici datoteke @1.";
- }
- QCString trDefinedInSourceFile()
- {
- return "Definirano v datoteki @0.";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
- QCString trDeprecated()
- {
- return "Zastarelo";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- QCString trCollaborationDiagram(const char *clName)
- {
- return (QCString)"Kolaboracijski diagram razreda "+clName+":";
- }
- /*! this text is put before an include dependency graph */
- QCString trInclDepGraph(const char *fName)
- {
- return (QCString)"Graf prikazuje seznam datotek, "
- "ki jih datoteka \""+fName+"\" "
- "direktno ali indirektno vkljuèuje. Pravokotniki ponazarjajo datoteke, pu¹èice "
- "predstavljajo relacije med njimi. "
- "Èrn pravokotnik ponazarja datoteko "+fName+". Pu¹èice A->B ponazarjajo "
- "usmerjeno relacijo \"A vkljuèuje B\"."
-;
- }
- /*! header that is put before the list of constructor/destructors. */
- QCString trConstructorDocumentation()
- {
- return "Opis konstruktorjev in destruktorjev ";
- }
- /*! Used in the file documentation to point to the corresponding sources. */
- QCString trGotoSourceCode()
- {
- return "izvorna koda";
- }
- /*! Used in the file sources to point to the corresponding documentation. */
- QCString trGotoDocumentation()
- {
- return "dokumenacija tekoèe datoteke.";
- }
- /*! Text for the \pre command */
- QCString trPrecondition()
- {
- return "Predpogoji (preconditions)";
- }
- /*! Text for the \post command */
- QCString trPostcondition()
- {
- return "Naknadni pogoji (posconditions)";
- }
- /*! Text for the \invariant command */
- QCString trInvariant()
- {
- return "Invarianta";
- }
- /*! Text shown before a multi-line variable/enum initialization */
- QCString trInitialValue()
- {
- return "Zaèetna vrednost / definicija :";
- }
- /*! Text used the source code in the file index */
- QCString trCode()
- {
- return "koda";
- }
- QCString trGraphicalHierarchy()
- {
- return "Hierarhija razredov v grafièni obliki";
- }
- QCString trGotoGraphicalHierarchy()
- {
- return "Dedovalna hierarhija v grafièni obliki";
- }
- QCString trGotoTextualHierarchy()
- {
- return "Dedovalna hierarhija v tekstovni obliki";
- }
- QCString trPageIndex()
- {
- return "Indeks strani";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- QCString trNote()
- {
- return "Opomba";
- }
- QCString trPublicTypes()
- {
- return "Javni tipi";
- }
- QCString trPublicAttribs()
- {
- return "Javni atributi";
- }
- QCString trStaticPublicAttribs()
- {
- return "Statièni javni atributi";
- }
- QCString trProtectedTypes()
- {
- return "Za¹èiteni tipi";
- }
- QCString trProtectedAttribs()
- {
- return "Za¹èiteni atributi";
- }
- QCString trStaticProtectedAttribs()
- {
- return "Statièni za¹èiteni tipi";
- }
- QCString trPrivateTypes()
- {
- return "Skriti tipi";
- }
- QCString trPrivateAttribs()
- {
- return "Skriti atributi";
- }
- QCString trStaticPrivateAttribs()
- {
- return "Statièni skriti atributi";
- }
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a todo item */
- virtual QCString trTodo()
- {
- return "TODO";
- }
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- {
- return "Seznam nedokonèanih opravil";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy()
- {
- return "Uporabniki entitete: ";
- }
- virtual QCString trRemarks()
- {
- return "Opomba";
- }
- virtual QCString trAttention()
- {
- return "Pozor";
- }
- virtual QCString trInclByDepGraph()
- {
- return "Graf prikazuje datoteke, ki posredno ali neposredno "
- "vkljuèujejo tekoèo datoteko. Pravokotniki simbolizirajo datoteke, "
- "pu¹èice pa relacije med datotekami. Tekoèa datoteka je prikazana "
- "kot pravokotnik s èrno podlago, ostale pa kot pravokotnik brez podlage. "
- "Smer pu¹èice A->B definira relacijo \"A vkljuèuje B\". "
- "Vse datoteke, ki torej mejijo na tekoèo (t.j. obstaja povezava med èrnim in "
- "praznim pravokotnikom), jo direktno vkljuèujejo, medtem, ko jo ostale vkljuèujejo "
- "le posredno. "
- ;
- }
- virtual QCString trSince()
- {
- return "Od";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- virtual QCString trLegendTitle()
- {
- return "Legenda grafa";
- }
- /*! 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
- "Tekoèa stran pojasnjuje naèin interpretacije grafov, ki jih izri¹e "
- "doxygen.<p>\n"
- "Poglejmo si naslednji primer:\n"
- "\\code\n"
- "/*! Nevide razred zaradi rezanja */\n"
- "class Invisible { };\n\n"
- "/*! Odrezan razred, dedovalna relacija je skrita */\n"
- "class Truncated : public Invisible { };\n\n"
- "/* razred, ki ni opisan z doxygen komentarji */\n"
- "class Undocumented { };\n\n"
- "/*! Razred, ki ga dedujemo s pomoèjo javnega dedovanja */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! Razred, ki ga dedujemo s pomoèjo za¹èitenega dedovanja */\n"
- "class ProtectedBase { };\n\n"
- "/*! Razred, ki ga dedujemo s pomoèjo skritega dedovanja */\n"
- "class PrivateBase { };\n\n"
- "/*! Razred, ki ga uporablja dedovani razred */\n"
- "class Used { };\n\n"
- "/*! Super class that inherits a number of other classes */\n"
- "class Inherited : public PublicBase,\n"
- " protected ProtectedBase,\n"
- " private PrivateBase,\n"
- " public Undocumented\n"
- "{\n"
- " private:\n"
- " Used *m_usedClass;\n"
- "};\n"
- "\\endcode\n"
- "If the \\c MAX_DOT_GRAPH_HEIGHT tag in the configuration file "
- "is set to 200 this will result in the following graph:"
- "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
- "The boxes in the above graph have the following meaning:\n"
- "<ul>\n"
- "<li>%A filled black box represents the struct or class for which the "
- "graph is generated.\n"
- "<li>%A box with a black border denotes a documented struct or class.\n"
- "<li>%A box with a grey border denotes an undocumented struct or class.\n"
- "<li>%A box with a red border denotes a documented struct or class for\n"
- "which not all inheritance/containment relations are shown. %A graph is "
- "truncated if it does not fit within the specified boundaries."
- "</ul>\n"
- "The arrows have the following meaning:\n"
- "<ul>\n"
- "<li>%A dark blue arrow is used to visualize a public inheritance "
- "relation between two classes.\n"
- "<li>%A dark green arrow is used for protected inheritance.\n"
- "<li>%A dark red arrow is used for private inheritance.\n"
- "<li>%A purple dashed arrow is used if a class is contained or used "
- "by another class. The arrow is labeled with the variable(s) "
- "through which the pointed class or struct is accessible. \n"
- "</ul>\n";
- }
- /*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return "legenda";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return "Test";
- }
- /*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return "Test List";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return "DCOP metode";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return "IDL Lastnosti";
- }
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return "Opis IDL lastnosti";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java interfaces in the summary section of Java packages */
- virtual QCString trInterfaces()
- {
- return "Vmesniki";
- }
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Podatkovne strukture";
- }
- else
- {
- return "Razredi";
- }
- }
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
- {
- return (QCString)"JAVA paket "+name;
- }
- /*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return "Seznam JAVA paketov";
- }
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return "Seznam JAVA paketov in njihovih kratkih opisov v primeru, da obstajajo:";
- }
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return "JAVA paketi";
- }
- /*! Used as a chapter title for Latex & RTF output */
- virtual QCString trPackageDocumentation()
- {
- return "Opisi JAVA paketov";
- }
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return "Vrednost:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return "Programska napaka";
- }
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return "Seznam programskih napak";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as ansicpg for RTF file
- *
- * The following table shows the correlation of Charset name, Charset Value and
- * <pre>
- * Codepage number:
- * Charset Name Charset Value(hex) Codepage number
- * ------------------------------------------------------
- * DEFAULT_CHARSET 1 (x01)
- * SYMBOL_CHARSET 2 (x02)
- * OEM_CHARSET 255 (xFF)
- * ANSI_CHARSET 0 (x00) 1252
- * RUSSIAN_CHARSET 204 (xCC) 1251
- * EE_CHARSET 238 (xEE) 1250
- * GREEK_CHARSET 161 (xA1) 1253
- * TURKISH_CHARSET 162 (xA2) 1254
- * BALTIC_CHARSET 186 (xBA) 1257
- * HEBREW_CHARSET 177 (xB1) 1255
- * ARABIC _CHARSET 178 (xB2) 1256
- * SHIFTJIS_CHARSET 128 (x80) 932
- * HANGEUL_CHARSET 129 (x81) 949
- * GB2313_CHARSET 134 (x86) 936
- * CHINESEBIG5_CHARSET 136 (x88) 950
- * </pre>
- *
- */
- virtual QCString trRTFansicp()
- {
- return "1250";
- }
-
-
- /*! Used as ansicpg for RTF fcharset
- * \see trRTFansicp() for a table of possible values.
- */
- virtual QCString trRTFCharSet()
- {
- return "0";
- }
-
- /*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return "Indeks";
- }
-
- /*! 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 ? "Razred" : "razred"));
- if (!singular) result+="i";
- 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 ? "Datotek" : "datotek"));
- if (!singular) result+="e";
- else result += "a";
- 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 ? "Imenski prostor" : "imenski prostor"));
- if (!singular) result+="i";
- 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 ? "Skupina" : "skupina"));
- 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 ? "Stran" : "stran"));
- if (!singular) result+="i";
- 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 ? "Element" : "element"));
- if (!singular) result+="i";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trField(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Polj" : "polj"));
- if (!singular) result+="a";
- else result += "e";
- 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 ? "Global" : "global"));
- if (!singular) result+="s";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is generated when the \\author command is used and
- * for the author section in man pages. */
- virtual QCString trAuthor(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Avtor" : "avtor"));
- if (!singular) result+="ji";
- return result;
- }
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return "Reference";
- }
-//////////////////////////////////////////////////////////////////////////
-// 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 "Implementira "+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 "Implementirano v "+trWriteList(numEntries)+".";
- }
-
-};
-
-#endif
-
-
-
-
-
-
-
-
diff --git a/src/translator_sk.h b/src/translator_sk.h
deleted file mode 100644
index e442dd6..0000000
--- a/src/translator_sk.h
+++ /dev/null
@@ -1,1395 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- * ----------------------------------------------------------------------------
- *
- * Slovak translation by Stanislav Kudlac (skudlac@pobox.sk)
- *
- * ----------------------------------------------------------------------------
- */
-
-#ifndef TRANSLATOR_SK_H
-#define TRANSLATOR_SK_H
-
-class TranslatorSlovak : public TranslatorAdapter_1_2_18
-{
- private:
- /*! The Decode() inline assumes the source written in the
- Windows encoding (maintainer only dependent).
- */
- inline QCString Decode(const QCString & sInput)
- {
-#ifdef _WIN32
- return sInput;
-#else
- return Win1250ToISO88592(sInput);
-#endif
- }
-
- public:
- // --- Language control methods -------------------
-
- virtual QCString idLanguage()
- { return "slovak"; }
-
- virtual QCString latexLanguageSupportCommand()
- { return "\\usepackage{slovak}\n"; }
-
- /*! return the language charset. This will be used for the HTML output */
- virtual QCString idLanguageCharset()
- {
-#ifdef _WIN32
- return "windows-1250";
-#else
- return "iso-8859-2";
-#endif
- }
-
- // --- Language translation methods -------------------
-
- /*! used in the compound documentation before a list of related functions. */
- virtual QCString trRelatedFunctions()
- { return Decode("Súvisiace funkcie"); }
-
- /*! subscript for the related functions. */
- virtual QCString trRelatedSubscript()
- { return Decode("(Uvedené funkcie niesú èlenskými funkciami.)"); }
-
- /*! header that is put before the detailed description of files, classes and namespaces. */
- virtual QCString trDetailedDescription()
- { return Decode("Detailný popis"); }
-
- /*! header that is put before the list of typedefs. */
- virtual QCString trMemberTypedefDocumentation()
- { return Decode("Dokumentácia k èlenským typom"); }
-
- /*! header that is put before the list of enumerations. */
- virtual QCString trMemberEnumerationDocumentation()
- { return Decode("Dokumentácia k èlenským enumeráciám"); }
-
- /*! header that is put before the list of member functions. */
- virtual QCString trMemberFunctionDocumentation()
- { return Decode("Dokumentácia k metódam"); }
-
- /*! header that is put before the list of member attributes. */
- virtual QCString trMemberDataDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return Decode("Dokumentácia k položkám");
- }
- else
- {
- return Decode("Dokumentácia k dátovým èlenom");
- }
- }
-
- /*! this is the text of a link put after brief descriptions. */
- virtual QCString trMore()
- { return Decode("..."); }
-
- /*! put in the class documentation */
- virtual QCString trListOfAllMembers()
- { return Decode("Zoznam všetkých èlenov."); }
-
- /*! used as the title of the "list of all members" page of a class */
- virtual QCString trMemberList()
- { return Decode("Zoznam èlenov triedy"); }
-
- /*! this is the first part of a sentence that is followed by a class name */
- virtual QCString trThisIsTheListOfAllMembers()
- { return Decode("Tu nájdete úplný zoznam èlenov triedy "); }
-
- /*! this is the remainder of the sentence after the class name */
- virtual QCString trIncludingInheritedMembers()
- { return Decode(", vrátane všetkých zdedených èlenov."); }
-
- /*! 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="Generované automaticky programom Doxygen "
- "zo zdrojových textov";
- if (s) result+=(QCString)" projektu "+s;
- result+=".";
- return Decode(result);
- }
-
- /*! put after an enum name in the list of all members */
- virtual QCString trEnumName()
- { return Decode("meno enumerácie"); }
-
- /*! put after an enum value in the list of all members */
- virtual QCString trEnumValue()
- { return Decode("hodnota enumerácie"); }
-
- /*! put after an undocumented member in the list of all members */
- virtual QCString trDefinedIn()
- { return Decode("definovaný v"); }
-
- // quick reference sections
-
- /*! This is put above each page as a link to the list of all groups of
- * compounds or files (see the \\group command).
- */
- virtual QCString trModules()
- { return Decode("Moduly"); }
-
- /*! This is put above each page as a link to the class hierarchy */
- virtual QCString trClassHierarchy()
- { return Decode("Hierarchia tried"); }
-
- /*! This is put above each page as a link to the list of annotated classes */
- virtual QCString trCompoundList()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return Decode("Dátové štruktúry");
- }
- else
- {
- return Decode("Zoznam tried");
- }
- }
-
- /*! This is put above each page as a link to the list of documented files */
- virtual QCString trFileList()
- { return Decode("Zoznam súborov"); }
-
- /*! This is put above each page as a link to the list of all verbatim headers */
- virtual QCString trHeaderFiles()
- { return Decode("Zoznam hlavièkových súborov"); }
-
- /*! This is put above each page as a link to all members of compounds. */
- virtual QCString trCompoundMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return Decode("Dátové položky");
- }
- else
- {
- return Decode("Zoznam èlenov tried");
- }
- }
-
- /*! This is put above each page as a link to all members of files. */
- virtual QCString trFileMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return Decode("Globálne symboly");
- }
- else
- {
- return Decode("Symboly v súboroch");
- }
- }
-
- /*! This is put above each page as a link to all related pages. */
- virtual QCString trRelatedPages()
- { return Decode("Ostatné stránky"); }
-
- /*! This is put above each page as a link to all examples. */
- virtual QCString trExamples()
- { return Decode("Príklady"); }
-
- /*! This is put above each page as a link to the search engine. */
- virtual QCString trSearch()
- { return Decode("H¾ada"); }
-
- /*! This is an introduction to the class hierarchy. */
- virtual QCString trClassHierarchyDescription()
- { return Decode("Tu nájdete zoznam, vyjadrujúci vzah dediènosti tried. "
- "Je zoradený približne (ale nie úplne) pod¾a abecedy:");
- }
-
- /*! This is an introduction to the list with all files. */
- virtual QCString trFileListDescription(bool extractAll)
- {
- QCString result="Tu nájdete zoznam všetkých ";
- if (!extractAll) result+="dokumentovaných ";
- result+="súborov so struènými popismi:";
- return Decode(result);
- }
-
- /*! This is an introduction to the annotated compound list. */
- virtual QCString trCompoundListDescription()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return Decode("Nasledujúci zoznam obsahuje identifikáciu dátových "
- "štruktúr a ich struèné popisy:");
- }
- else
- {
- return Decode("Nasledujúci zoznam obsahuje predovšetkým identifikáciu "
- "tried, ale nachádzajú sa tu i ïalšie netriviálne prvky, "
- "ako sú štruktúry (struct), uniony (union) a rozhrania "
- "(interface). V zozname sú uvedené ich struèné "
- "popisy:");
- }
- }
-
- /*! This is an introduction to the page with all class members. */
- virtual QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result= "Tu nájdete zoznam všetkých ";
- if (!extractAll)
- {
- result += "dokumentovaných ";
- }
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result += "položiek štruktúr (struct) a unionov (union) ";
- }
- else
- {
- result += "èlenov tried ";
- }
-
- result += "s odkazmi na ";
-
- if (!extractAll)
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result += "dokumentáciu štruktúr/unionov, ku ktorým prislúchajú:";
- }
- else
- {
- result += "dokumentáciu tried, ku ktorým prislúchajú:";
- }
- }
- else
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="štruktúry/uniony, ku ktorým prislúchajú:";
- }
- else
- {
- result+="triedy, ku ktorým prislúchajú:";
- }
- }
-
- return Decode(result);
- }
-
- /*! This is an introduction to the page with all file members. */
- virtual QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="Tu nájdete zoznam všetkých ";
- if (!extractAll) result+="dokumentovaných ";
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="funkcií, premenných, makier, enumerácií a definícií typov (typedef) "
- "s odkazmi na ";
- }
- else
- {
- result+="symbolov, ktoré sú definované na úrovni svojich súborov. "
- "Pre každý symbol je uvedený odkaz na ";
- }
-
- if (extractAll)
- result+="súbory, ku ktorým prislúchajú:";
- else
- result+="dokumentáciu:";
-
- return Decode(result);
- }
-
- /*! This is an introduction to the page with the list of all header files. */
- virtual QCString trHeaderFilesDescription()
- { return Decode("Tu nájdete hlavièkové súbory, ktoré tvoria "
- "aplikaèné programové rozhranie (API):"); }
-
- /*! This is an introduction to the page with the list of all examples */
- virtual QCString trExamplesDescription()
- { return Decode("Tu nájdete zoznam všetkých príkladov:"); }
-
- /*! This is an introduction to the page with the list of related pages */
- virtual QCString trRelatedPagesDescription()
- { return Decode("Nasledujúci zoznam odkazuje na ïalšie stránky projektu, "
- "ktoré majú charakter usporiadaných zoznamov informácií, "
- "pozbieraných z rôznych miest v zdrojových súboroch:"); }
-
- /*! This is an introduction to the page with the list of class/file groups */
- virtual QCString trModulesDescription()
- { return Decode("Tu nájdete zoznam všetkých modulov:"); }
-
- /*! This sentences is used in the annotated class/file lists if no brief
- * description is given.
- */
- virtual QCString trNoDescriptionAvailable()
- { return Decode("Popis nieje k dispozícii"); }
-
- // index titles (the project name is prepended for these)
-
-
- /*! This is used in HTML as the title of index.html. */
- virtual QCString trDocumentation()
- { return Decode("Dokumentácia"); }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all groups.
- */
- virtual QCString trModuleIndex()
- { return Decode("Register modulov"); }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * class hierarchy.
- */
- virtual QCString trHierarchicalIndex()
- { return Decode("Register hierarchie tried"); }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * annotated compound index.
- */
- virtual QCString trCompoundIndex()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return Decode("Register dátových štruktúr");
- }
- else
- {
- return Decode("Register tried");
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * list of all files.
- */
- virtual QCString trFileIndex()
- { return Decode("Register súborov"); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all groups.
- */
- virtual QCString trModuleDocumentation()
- { return Decode("Dokumentácia modulov"); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all classes, structs and unions.
- */
- virtual QCString trClassDocumentation()
- { return Decode("Dokumentácia tried"); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all files.
- */
- virtual QCString trFileDocumentation()
- { return Decode("Dokumentácia súborov"); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all examples.
- */
- virtual QCString trExampleDocumentation()
- { return Decode("Dokumentácia príkladov"); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all related pages.
- */
- virtual QCString trPageDocumentation()
- { return Decode("Dokumentácia súvisiacich stránok"); }
-
- /*! This is used in LaTeX as the title of the document */
- virtual QCString trReferenceManual()
- { return Decode("Referenèná príruèka"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of defines
- */
- virtual QCString trDefines()
- { return Decode("Definícia makier"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of function prototypes
- */
- virtual QCString trFuncProtos()
- { return Decode("Prototypy"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of typedefs
- */
- virtual QCString trTypedefs()
- { return Decode("Definícia typov"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of enumerations
- */
- virtual QCString trEnumerations()
- { return Decode("Enumerácie"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) functions
- */
- virtual QCString trFunctions()
- { return Decode("Funkcie"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trVariables()
- { return Decode("Premenné"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trEnumerationValues()
- { return Decode("Hodnoty enumerácií"); }
-
- /*! This is used in the documentation of a file before the list of
- * documentation blocks for defines
- */
- virtual QCString trDefineDocumentation()
- { return Decode("Dokumentácia k definíciám makier"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for function prototypes
- */
- virtual QCString trFunctionPrototypeDocumentation()
- { return Decode("Dokumentácia prototypov"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for typedefs
- */
- virtual QCString trTypedefDocumentation()
- { return Decode("Dokumentácia definícií typov"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration types
- */
- virtual QCString trEnumerationTypeDocumentation()
- { return Decode("Dokumentácia enumeraèných typov"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration values
- */
- virtual QCString trEnumerationValueDocumentation()
- { return Decode("Dokumentácia enumeraèných hodnôt"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for functions
- */
- virtual QCString trFunctionDocumentation()
- { return Decode("Dokumentácia funkcií"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for variables
- */
- virtual QCString trVariableDocumentation()
- { return Decode("Dokumentácia premenných"); }
-
- /*! This is used in the documentation of a file/namespace/group before
- * the list of links to documented compounds
- */
- virtual QCString trCompounds()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return Decode("Dátové štruktúry");
- }
- else
- {
- return Decode("Triedy");
- }
- }
-
- /*! 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)"Generované "+date;
- if (projName) result+=(QCString)" pre projekt "+projName;
- result+=(QCString)" programom";
- return Decode(result);
- }
-
- /*! This is part of the sentence used in the standard footer of each page.
- */
- virtual QCString trWrittenBy()
- {
- return Decode(" -- autor ");
- }
-
- /*! this text is put before a class diagram */
- virtual QCString trClassDiagram(const char *clName)
- {
- return Decode((QCString)"Diagram dediènosti pre triedu "+clName);
- }
-
- /*! this text is generated when the \\internal command is used. */
- virtual QCString trForInternalUseOnly()
- { return Decode("Iba pre interné použitie."); }
-
- /*! this text is generated when the \\reimp command is used. */
- virtual QCString trReimplementedForInternalReasons()
- { return Decode("Reimplementované z interných dôvodov; "
- "aplikaèné rozhranie zachované."); }
-
- /*! this text is generated when the \\warning command is used. */
- virtual QCString trWarning()
- { return Decode("Pozor"); }
-
- /*! this text is generated when the \\bug command is used. */
- virtual QCString trBugsAndLimitations()
- { return Decode("Chyby a obmedzenia"); }
-
- /*! this text is generated when the \\version command is used. */
- virtual QCString trVersion()
- { return Decode("Verzia"); }
-
- /*! this text is generated when the \\date command is used. */
- virtual QCString trDate()
- { return Decode("Dátum"); }
-
- /*! this text is generated when the \\return command is used. */
- virtual QCString trReturns()
- { return Decode("Návratová hodnota"); }
-
- /*! this text is generated when the \\sa command is used. */
- virtual QCString trSeeAlso()
- { return Decode("Viz tiež"); }
-
- /*! this text is generated when the \\param command is used. */
- virtual QCString trParameters()
- { return Decode("Parametre"); }
-
- /*! this text is generated when the \\exception command is used. */
- virtual QCString trExceptions()
- { return Decode("Výnimky"); }
-
- /*! this text is used in the title page of a LaTeX document. */
- virtual QCString trGeneratedBy()
- { return Decode("Generované programom"); }
-
- // new since 0.49-990307
-
- /*! used as the title of page containing all the index of all namespaces. */
- virtual QCString trNamespaceList()
- { return Decode("Zoznam priestorov mien"); }
-
- /*! used as an introduction to the namespace list */
- virtual QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="Tu nájdete zoznam všetkých ";
- if (!extractAll) result+="dokumentovaných ";
- result+="priestorov mien so struèným popisom:";
- return Decode(result);
- }
-
- /*! used in the class documentation as a header before the list of all
- * friends of a class
- */
- virtual QCString trFriends()
- { return Decode("Priatelia (friends)"); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in the class documentation as a header before the list of all
- * related classes
- */
- virtual QCString trRelatedFunctionDocumentation()
- { return Decode("Dokumentácia k priate¾om (friends)"); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of the HTML page of a class/struct/union */
- virtual QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- {
- QCString result("Dokumentácia ");
- if (isTemplate) result+="šablóny ";
- switch(compType)
- {
- case ClassDef::Class: result+="triedy "; break;
- case ClassDef::Struct: result+="štruktúry "; break;
- case ClassDef::Union: result+="unionu "; break;
- case ClassDef::Interface: result+="rozhrania "; break;
- case ClassDef::Protocol: result+="protocol "; break; // translate me!
- case ClassDef::Category: result+="category "; break; // translate me!
- case ClassDef::Exception: result+="výnimky "; break;
- }
- result+=clName;
- return Decode(result);
- }
-
- /*! used as the title of the HTML page of a file */
- virtual QCString trFileReference(const char *fileName)
- {
- QCString result("Dokumentácia súboru ");
- result+=fileName;
- return Decode(result);
- }
-
- /*! used as the title of the HTML page of a namespace */
- virtual QCString trNamespaceReference(const char *namespaceName)
- {
- QCString result("Dokumentácia priestoru mien ");
- result+=namespaceName;
- return Decode(result);
- }
-
- /* these are for the member sections of a class, struct or union */
- virtual QCString trPublicMembers()
- { return Decode("Verejné metódy"); }
- virtual QCString trPublicSlots()
- { return Decode("Verejné sloty"); }
- virtual QCString trSignals()
- { return Decode("Signály"); }
- virtual QCString trStaticPublicMembers()
- { return Decode("Statické verejné metódy"); }
- virtual QCString trProtectedMembers()
- { return Decode("Chránené metódy"); }
- virtual QCString trProtectedSlots()
- { return Decode("Chránené sloty"); }
- virtual QCString trStaticProtectedMembers()
- { return Decode("Statické chránené metódy"); }
- virtual QCString trPrivateMembers()
- { return Decode("Privátne metódy"); }
- virtual QCString trPrivateSlots()
- { return Decode("Privátne sloty"); }
- virtual QCString trStaticPrivateMembers()
- { return Decode("Statické privátne metódy"); }
-
- /*! this function is used to produce a comma-separated list of items.
- * use generateMarker(i) to indicate where item i should be put.
- */
- virtual QCString trWriteList(int numEntries)
- {
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=" a ";
- }
- }
- return Decode(result);
- }
-
- /*! used in class documentation to produce a list of base classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritsList(int numEntries)
- {
- QCString result("Dedí od ");
- result += (numEntries == 1) ? "bázovej triedy " : "bázových tried ";
- result += trWriteList(numEntries)+".";
- return Decode(result);
- }
-
- /*! used in class documentation to produce a list of super classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritedByList(int numEntries)
- {
- QCString result("Zdedená ");
- result += (numEntries == 1) ? "triedou " : "triedami ";
- result += trWriteList(numEntries)+".";
- return Decode(result);
- }
-
- /*! used in member documentation blocks to produce a list of
- * members that are hidden by this one.
- */
- virtual QCString trReimplementedFromList(int numEntries)
- {
- QCString result("Reimplementuje ");
- result += (numEntries == 1) ? "metódu triedy " : "metódy tried ";
- result += trWriteList(numEntries)+".";
- return Decode(result);
- }
-
- /*! used in member documentation blocks to produce a list of
- * all member that overwrite the implementation of this member.
- */
- virtual QCString trReimplementedInList(int numEntries)
- {
- QCString result("Reimplementované ");
- result += (numEntries == 1) ? "triedou " : "triedami ";
- result += trWriteList(numEntries)+".";
- return Decode(result);
- }
-
- /*! This is put above each page as a link to all members of namespaces. */
- virtual QCString trNamespaceMembers()
- { return Decode("Symboly v priestoroch mien"); }
-
- /*! This is an introduction to the page with all namespace members */
- virtual QCString trNamespaceMemberDescription(bool extractAll)
- {
- QCString result="Tu nájdete zoznam všetkých ";
- if (!extractAll) result+="dokumentovaných ";
- result+="symbolov, ktoré sú definované vo svojich priestoroch mien. "
- "U každého je uvedený odkaz na ";
- if (extractAll)
- result+="dokumentáciu príslušného priestoru mien:";
- else
- result+="príslušný priestor mien:";
- return Decode(result);
- }
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all namespaces.
- */
- virtual QCString trNamespaceIndex()
- { return Decode("Register priestorov mien"); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all namespaces.
- */
- virtual QCString trNamespaceDocumentation()
- { return Decode("Dokumentácia priestorov mien"); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- virtual QCString trNamespaces()
- { return Decode("Priestory mien"); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990728
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is put at the bottom of a class documentation page and is
- * followed by a list of files that were used to generate the page.
- */
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)"Dokumentácia pre ";
- switch(compType)
- {
- case ClassDef::Class: result+="túto triedu"; break;
- case ClassDef::Struct: result+="túto štruktúru (struct)"; break;
- case ClassDef::Union: result+="tento union"; break;
- case ClassDef::Interface: result+="toto rozhranie"; break;
- case ClassDef::Protocol: result+="protocol"; break; // translate me!
- case ClassDef::Category: result+="category"; break; // translate me!
- case ClassDef::Exception: result+="túto výnimku"; break;
- }
- result+=" bola generovaná z ";
- if (single) result+="nasledujúceho súboru:";
- else result+="nasledujúcich súborov:";
- return Decode(result);
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- virtual QCString trAlphabeticalList()
- { return Decode("Register tried"); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- virtual QCString trReturnValues()
- { return Decode("Návratové hodnoty"); }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- virtual QCString trMainPage()
- { return Decode("Hlavná stránka"); }
-
- /*! This is used in references to page that are put in the LaTeX
- * documentation. It should be an abbreviation of the word page.
- */
- virtual QCString trPageAbbreviation()
- { return Decode("s."); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991003
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trSources()
- {
- return Decode("Zdroje");
- }
- virtual QCString trDefinedAtLineInSourceFile()
- {
- return Decode("Definícia je uvedená na riadku @0 v súbore @1.");
- }
- virtual QCString trDefinedInSourceFile()
- {
- return Decode("Definícia v súbore @0.");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDeprecated()
- {
- return Decode("Zastaralé");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- virtual QCString trCollaborationDiagram(const char *clName)
- {
- return Decode((QCString)"Diagram tried pre "+clName+":");
- }
- /*! this text is put before an include dependency graph */
- virtual QCString trInclDepGraph(const char *fName)
- {
- return Decode((QCString)"Graf závislostí na vkladaných súboroch "
- "pre "+fName+":");
- }
- /*! header that is put before the list of constructor/destructors. */
- virtual QCString trConstructorDocumentation()
- {
- return Decode("Dokumentácia konštruktoru a deštruktoru");
- }
- /*! Used in the file documentation to point to the corresponding sources. */
- virtual QCString trGotoSourceCode()
- {
- return Decode("Zobrazi zdrojový text tohoto súboru.");
- }
- /*! Used in the file sources to point to the corresponding documentation. */
- virtual QCString trGotoDocumentation()
- {
- return Decode("Zobrazi dokumentáciu tohoto súboru.");
- }
- /*! Text for the \\pre command */
- virtual QCString trPrecondition()
- {
- return Decode("Prepodmienka");
- }
- /*! Text for the \\post command */
- virtual QCString trPostcondition()
- {
- return Decode("Postpodmienka");
- }
- /*! Text for the \\invariant command */
- virtual QCString trInvariant()
- {
- return Decode("Invariant");
- }
- /*! Text shown before a multi-line variable/enum initialization */
- virtual QCString trInitialValue()
- {
- return Decode("Inicializátor:");
- }
- /*! Text used the source code in the file index */
- virtual QCString trCode()
- {
- return Decode("zdrojový text");
- }
- virtual QCString trGraphicalHierarchy()
- {
- return Decode("Grafické zobrazenie hierarchie tried");
- }
- virtual QCString trGotoGraphicalHierarchy()
- {
- return Decode("Zobrazi grafickú podobu hierarchie tried");
- }
- virtual QCString trGotoTextualHierarchy()
- {
- return Decode("Zobrazi textovú podobu hierarchie tried");
- }
- virtual QCString trPageIndex()
- {
- return Decode("Register stránok");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trNote()
- {
- return Decode("Poznámka");
- }
- virtual QCString trPublicTypes()
- {
- return Decode("Verejné typy");
- }
- virtual QCString trPublicAttribs()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return Decode("Dátové položky");
- }
- else
- {
- return Decode("Verejné atribúty");
- }
- }
- virtual QCString trStaticPublicAttribs()
- {
- return Decode("Statické verejné atribúty");
- }
- virtual QCString trProtectedTypes()
- {
- return Decode("Chránené typy");
- }
- virtual QCString trProtectedAttribs()
- {
- return Decode("Chránené atribúty");
- }
- virtual QCString trStaticProtectedAttribs()
- {
- return Decode("Statické chránené atribúty");
- }
- virtual QCString trPrivateTypes()
- {
- return Decode("Privátne typy");
- }
- virtual QCString trPrivateAttribs()
- {
- return Decode("Privátne atribúty");
- }
- virtual QCString trStaticPrivateAttribs()
- {
- return Decode("Statické privátne atribúty");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a todo item */
- virtual QCString trTodo()
- {
- return Decode("Plánované úpravy");
- }
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- {
- return Decode("Zoznam plánovaných úprav");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy()
- {
- return Decode("Používa sa v");
- }
- virtual QCString trRemarks()
- {
- return Decode("Poznámky"); // ??? not checked in a context
- }
- virtual QCString trAttention()
- {
- return Decode("Upozornenie"); // ??? not checked in a context
- }
- virtual QCString trInclByDepGraph()
- {
- return Decode("Nasledujúci graf ukazuje, ktoré súbory priamo alebo "
- "nepriamo vkladajú tento súbor:");
- }
- virtual QCString trSince()
- {
- return Decode("Od"); // ??? not checked in a context
- }
-
-////////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- virtual QCString trLegendTitle()
- {
- return Decode("Vysvetlivky ku grafu");
- }
- /*! page explaining how the dot graph's should be interpreted */
- virtual QCString trLegendDocs()
- {
- QCString result(
- "Tu nájdete vysvetlenie, ako majú by interpretované grafy, "
- "ktoré boli generované programom doxygen.<p>\n"
- "Uvažujte nasledujúci príklad:\n"
- "\\code\n"
- "/*! Neviditelná trieda, ktorá sa v grafe nezobrazuje, pretože "
- "došlo k orezaniu grafu. */\n"
- "class Invisible { };\n\n"
- "/*! Trieda, u ktorej došlo k orezaniu grafu. Vzah dediènosti "
- "je skrytý. */\n"
- "class Truncated : public Invisible { };\n\n"
- "/* Trieda, ktorá nieje dokumentovaná komentármi programu doxygen. */\n"
- "class Undocumented { };\n\n"
- "/*! Odvodená trieda s verejným (public) dedením bázovej triedy. */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! Odvodená trieda s chráneným (protected) dedením bázovej triedy. */\n"
- "class ProtectedBase { };\n\n"
- "/*! Odvodená trieda s privátnym dedením bázovej triedy. */\n"
- "class PrivateBase { };\n\n"
- "/*! Trieda, ktorá je využívaná triedou Inherited. */\n"
- "class Used { };\n\n"
- "/*! Odvodená trieda, ktorá rôznym spôsobom dedí od viacerých bázových "
- "tried. */\n"
- "class Inherited : public PublicBase,\n"
- " protected ProtectedBase,\n"
- " private PrivateBase,\n"
- " public Undocumented\n"
- "{\n"
- " private:\n"
- " Used *m_usedClass;\n"
- "};\n"
- "\\endcode\n"
- "Pokia¾ je položka \\c MAX_DOT_GRAPH_HEIGHT konfiguraèného súboru "
- "nastavená na hodnotu 200, bude vygenerovaný nasledujúci graf:"
- "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
- "Bloky (tj. uzly) v uvedenom grafe majú nasledujúci význam:\n"
- "<ul>\n"
- "<li>Èierne vyplnený obdåžnik reprezentuje štruktúru alebo triedu, "
- "pre ktorú bol graf generovaný.\n"
- "<li>Obdåžnik s èiernym obrysom oznaèuje dokumentovanú "
- "štruktúru alebo triedu.\n"
- "<li>Obdåžnik so šedým obrysom oznaèuje nedokumentovanú "
- "štruktúru alebo triedu.\n"
- "<li>Obdåžnik s èerveným obrysom oznaèuje dokumentovanú "
- "štruktúru alebo triedu, pre ktorú\n"
- "niesú zobrazené všetky vzahy dediènosti alebo obsiahnutia. "
- "Graf je orezaný v prípade, kedy ho\n"
- "nieje možné umiestni do vymedzených hraníc.\n"
- "</ul>\n"
- "Šípky (tj. hrany grafu) majú nasledujúcí význam:\n"
- "<ul>\n"
- "<li>Tmavo modrá šípka sa používa pre oznaèenie vzahu verejnej "
- "dediènosti medzi dvoma triedami.\n"
- "<li>Tmavo zelená šípka oznaèuje vzah chránenej dediènosti "
- "(protected).\n"
- "<li>Tmavo èervená šípka oznaèuje vzah privátnej dediènosti.\n"
- "<li>Purpurová šípka kreslená èiarkovane sa používa v prípade, "
- "ak je trieda obsiahnutá v inej triede,\n"
- "alebo ak je používaná inou triedou. Je oznaèená identifikátorom "
- "jednej alebo viacerých premenných (objektov), cez ktoré\n"
- "je trieda alebo štruktúra zprístupnena.\n"
- "</ul>\n");
-
- return Decode(result);
- }
- /*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return Decode("vysvetlivky");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return Decode("Test");
- }
-
- /*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return Decode("Zoznam testov");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return Decode("Metódy DCOP");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return Decode("Vlastnosti");
- }
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return Decode("Dokumentácia k vlastnosti");
- }
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java interfaces in the summary section of Java packages */
- virtual QCString trInterfaces()
- {
- return Decode("Rozhranie");
- }
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- return Decode("Triedy");
- }
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
- {
- return Decode((QCString)"Balík "+name);
- }
- /*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return Decode("Zoznam balíkov");
- }
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return Decode("Tu nájdete zoznam balíkov so struèným popisom "
- "(pokia¾ bol uvedený):");
- }
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return Decode("Balíky");
- }
- /*! Used as a chapter title for Latex & RTF output */
- virtual QCString trPackageDocumentation()
- {
- return Decode("Dokumentácia balíku");
- }
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return Decode("Hodnota:");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return Decode("Chyba");
- }
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return Decode("Zoznam chýb");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6-20010422
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as ansicpg for RTF file */
- virtual QCString trRTFansicp()
- {
- return "1250";
- }
-
- /*! Used as ansicpg for RTF fcharset */
- virtual QCString trRTFCharSet()
- {
- return "3";
- }
-
- /*! Used as header RTF general 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 ? "Tried" : "tried"));
- result+=(singular ? "a" : "y");
- return Decode(result);
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trFile(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Súbor" : "súbor"));
- if (!singular) result+="y";
- return Decode(result);
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trNamespace(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Priestor" : "priestor"));
- if (!singular) result+="y";
- result+=" mien";
- return Decode(result);
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trGroup(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Skupin" : "skupin"));
- result+=(singular ? "a" : "y");
- return Decode(result);
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trPage(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Stránk" : "stránk"));
- result+=(singular ? "a" : "y");
- return Decode(result);
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trMember(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Èlen" : "èlen"));
- if (!singular) result+="y";
- return Decode(result);
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trField(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Položk" : "položk"));
- result+=(singular ? "a" : "y");
- return Decode(result);
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trGlobal(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Globáln" : "globáln"));
- result+=(singular ? "y" : "e");
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is generated when the \\author command is used and
- * for the author section in man pages. */
- virtual QCString trAuthor(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Auto" : "auto"));
- result += (singular) ? "r" : "ri";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return Decode("Odkazuje sa na");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Implementuje " + trWriteList(numEntries) + ".";
- }
-
- /*! used in member documentation blocks to produce a list of
- * all members that implement this member.
- */
- virtual QCString trImplementedInList(int numEntries)
- {
- return Decode("Implementované v " + trWriteList(numEntries) + ".");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.16
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in RTF documentation as a heading for the Table
- * of Contents.
- */
- virtual QCString trRTFTableOfContents()
- {
- return "Obsah";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.17
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as the header of the list of item that have been
- * flagged deprecated
- */
- virtual QCString trDeprecatedList()
- {
- return "Zastarané metódy";
- }
-};
-
-#endif // TRANSLATOR_SK_H
diff --git a/src/translator_sr.h b/src/translator_sr.h
deleted file mode 100644
index ce14ae8..0000000
--- a/src/translator_sr.h
+++ /dev/null
@@ -1,1617 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 TRANSLATOR_SR_H
-#define TRANSLATOR_SR_H
-
-// translation by Dejan D. M. Milosavljevic <dmilos@email.com>;<dmilosx@ptt.yu>;<office@ddmrm.com>
-// // 10x 2 Ivana Miletic for gramatical consutation.
-
-class TranslatorSerbian : public TranslatorAdapter_1_4_1
-{
-private:
- QCString decode(const QCString& sInput)
- {
-#ifdef _WIN32
- return ISO88592ToWin1250(sInput);
-#else
- return sInput;
-#endif
- }
-
-
- public:
-
- // --- Language control methods -------------------
-
- /*! Used for identification of the language. The identification
- * should not be translated. It should be replaced by the name
- * of the language in English using lower-case characters only
- * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
- * the identification used in language.cpp.
- */
- virtual QCString idLanguage()
- { return "serbian"; }
-
- /*! Used to get the LaTeX command(s) for the language support.
- * This method should return string with commands that switch
- * LaTeX to the desired language. For example
- * <pre>"\\usepackage[german]{babel}\n"
- * </pre>
- * or
- * <pre>"\\usepackage{polski}\n"
- * "\\usepackage[latin2]{inputenc}\n"
- * "\\usepackage[T1]{fontenc}\n"
- * </pre>
- *
- * The English LaTeX does not use such commands. Because of this
- * the empty string is returned in this implementation.
- */
- virtual QCString latexLanguageSupportCommand()
- {
- return "";
- }
-
- /*! return the language charset. This will be used for the HTML output */
- virtual QCString idLanguageCharset()
- {
-#ifdef _WIN32
- { return "windows-1250"; }
-#else
- { return "iso-8859-2"; }
-#endif
- }
-
- // --- Language translation methods -------------------
-
- /*! used in the compound documentation before a list of related functions. */
- virtual QCString trRelatedFunctions()
- { return decode( "Povezane funkcije" ); }
-
- /*! subscript for the related functions. */
- virtual QCString trRelatedSubscript()
- { return decode( "(To nisu funkcije èlanice.)" ); }
-
- /*! header that is put before the detailed description of files, classes and namespaces. */
- virtual QCString trDetailedDescription()
- { return decode( "Op¹irnije obja¹njenje" ); } // detalj je francuska rec.
-
- /*! header that is put before the list of typedefs. */
- virtual QCString trMemberTypedefDocumentation()
- { return decode( "Dokumentacija typedef èlanova" ); }
-
- /*! header that is put before the list of enumerations. */
- virtual QCString trMemberEnumerationDocumentation()
- { return decode( "Dokumentacija enum èlanova" ); }
-
- /*! header that is put before the list of member functions. */
- virtual QCString trMemberFunctionDocumentation()
- { return decode( "Dokumentacija funkcija èlanica" ); }
-
- /*! header that is put before the list of member attributes. */
- virtual QCString trMemberDataDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode( "Dokumentacija èlanova" );
- }
- else
- {
- return decode( "Dokumentacija javnih èlanova" );
- }
- }
-
- /*! this is the text of a link put after brief descriptions. */
- virtual QCString trMore()
- { return decode( "Jo¹..." ); }
-
- /*! put in the class documentation */
- virtual QCString trListOfAllMembers()
- { return decode( "Spisak svih èlanova." ); }
-
- /*! used as the title of the "list of all members" page of a class */
- virtual QCString trMemberList()
- { return decode( "Spisak èlanova" ); }
-
- /*! this is the first part of a sentence that is followed by a class name */
- virtual QCString trThisIsTheListOfAllMembers()
- { return decode( "Ovo je spisak svih èlanova " ); }
-
- /*! this is the remainder of the sentence after the class name */
- virtual QCString trIncludingInheritedMembers()
- { return decode( ", ukljuèujuæi nasleðene èlanove." ); }
-
- /*! 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="Napravljeno automatski Doxygen-om";
- if( s ) result+=(QCString)" za " + s;
- result+=" od izvornog koda.";
- return decode( result );
- }
-
- /*! put after an enum name in the list of all members */
- virtual QCString trEnumName()
- { return decode( "ime enum-a " ); }
-
- /*! put after an enum value in the list of all members */
- virtual QCString trEnumValue()
- { return decode( "vrednost enum-a" ); }
-
- /*! put after an undocumented member in the list of all members */
- virtual QCString trDefinedIn()
- { return decode( "definisano u" ); }
-
- // quick reference sections
-
- /*! This is put above each page as a link to the list of all groups of
- * compounds or files (see the \\group command).
- */
- virtual QCString trModules()
- { return decode( "Moduli" ); }
-
- /*! This is put above each page as a link to the class hierarchy */
- virtual QCString trClassHierarchy()
- { return decode( "Stablo klasa" ); }
-
- /*! This is put above each page as a link to the list of annotated classes */
- virtual QCString trCompoundList()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode( "Sve strukture" );
- }
- else
- {
- return decode( "Sve klase" );
- }
- }
-
- /*! This is put above each page as a link to the list of documented files */
- virtual QCString trFileList()
- { return decode( "Spisak datoteka" ); }
-
- /*! This is put above each page as a link to the list of all verbatim headers */
- virtual QCString trHeaderFiles()
- { return decode( "Zaglavlja" ); }
-
- /*! This is put above each page as a link to all members of compounds. */
- virtual QCString trCompoundMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode( "Svi èlanovi struktura" );
- }
- else
- {
- return decode( "Svi èlanovi klasa" );
- }
- }
-
- /*! This is put above each page as a link to all members of files. */
- virtual QCString trFileMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode( "Èlanovi datoteke" );
- }
- else
- {
- return decode( "Èlanovi datoteke" );
- }
- }
-
- /*! This is put above each page as a link to all related pages. */
- virtual QCString trRelatedPages()
- { return decode( "Stranice povezane sa ovom" ); }
-
- /*! This is put above each page as a link to all examples. */
- virtual QCString trExamples()
- { return decode( "Primeri" ); }
-
- /*! This is put above each page as a link to the search engine. */
- virtual QCString trSearch()
- { return decode( "Tra¾i" ); }
-
- /*! This is an introduction to the class hierarchy. */
- virtual QCString trClassHierarchyDescription()
- { return decode( "Stablo nasleðivanja je slo¾eno "
- "pribli¾no po abecedi:" ); }
-
- /*! This is an introduction to the list with all files. */
- virtual QCString trFileListDescription(bool extractAll)
- {
- QCString result="Spisak svih ";
- if (!extractAll) result+="dokumetovanih ";
- result+="datoteka, sa kratkim opisom:";
- return decode( result );
- }
-
- /*! This is an introduction to the annotated compound list. */
- virtual QCString trCompoundListDescription()
- {
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode( "Spisak struktura sa kratkim opisom:" );
- }
- else
- {
- return decode( "Spisak klasa, struktura, unija i interjfejsa sa kratkim opisom:" );
-
- }
- }
-
- /*! This is an introduction to the page with all class members. */
- virtual QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result="Spisak svih ";
- if (!extractAll)
- {
- result+="dokumentovanih ";
- }
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="èlanova struktura ili unija";
- }
- else
- {
- result+="èlanova klasa";
- }
- result+=" sa linkovima na ";
- if (extractAll)
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="dokumentaciju èlanova struktura/unija:";
- }
- else
- {
- result+="dokumentaciju svakog èlana klase:";
- }
- }
- else
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="strukture/unije koje pripadaju:";
- }
- else
- {
- result+="klase koje pripadaju:";
- }
- }
- return decode( result );
- }
-
- /*! This is an introduction to the page with all file members. */
- virtual QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="Spisak svih ";
- if (!extractAll) result+="dokumentovanih ";
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="funkcija, promenjiva, makro zamena, enum-ova, i typedef-ova";
- }
- else
- {
- result+="èlanova";
- }
-
- result+=" sa linkovima na ";
-
- if (extractAll)
- result+="datoteke u kojima se nalaze:";
- else
- result+=" dokumentaciju:";
-
- return decode( result );
- }
-
- /*! This is an introduction to the page with the list of all header files. */
- virtual QCString trHeaderFilesDescription()
- { return decode( "Zaglavlja koje izgraðuju API:" ); }
-
- /*! This is an introduction to the page with the list of all examples */
- virtual QCString trExamplesDescription()
- { return decode( "Spisak primera:" ); }
-
- /*! This is an introduction to the page with the list of related pages */
- virtual QCString trRelatedPagesDescription()
- { return decode( "Spisak svih sliènih stranica:" ); }
-
- /*! This is an introduction to the page with the list of class/file groups */
- virtual QCString trModulesDescription()
- { return decode( "Spisak svih modula:" ); }
-
- /*! This sentences is used in the annotated class/file lists if no brief
- * description is given.
- */
- virtual QCString trNoDescriptionAvailable()
- { return decode( "Opis nije dostupan" ); }
-
- // index titles (the project name is prepended for these)
-
-
- /*! This is used in HTML as the title of index.html. */
- virtual QCString trDocumentation()
- { return decode("Dokumentacija" ); }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all groups.
- */
- virtual QCString trModuleIndex()
- { return decode( "Index modula" ); }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * class hierarchy.
- */
- virtual QCString trHierarchicalIndex()
- { return decode( "Hijerarhijski sad¾raj" ); }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * annotated compound index.
- */
- virtual QCString trCompoundIndex()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode( "Glavni sadr¾aj" );
- }
- else
- {
- return decode( "Glavni sadr¾aj" );
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * list of all files.
- */
- virtual QCString trFileIndex()
- { return decode( "Indeks datoteka" ); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all groups.
- */
- virtual QCString trModuleDocumentation()
- { return decode( "Dokumentacija modula" ); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all classes, structs and unions.
- */
- virtual QCString trClassDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Dokumentacija stuktura";
- }
- else
- {
- return "Dokumentacija klasa";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all files.
- */
- virtual QCString trFileDocumentation()
- { return "Dokumentacija datoteke"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all examples.
- */
- virtual QCString trExampleDocumentation()
- { return "Dokumentacija primera"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all related pages.
- */
- virtual QCString trPageDocumentation()
- { return "Dokumentacija stranice"; }
-
- /*! This is used in LaTeX as the title of the document */
- virtual QCString trReferenceManual()
- { return decode( "Priruènik" ); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of defines
- */
- virtual QCString trDefines()
- { return "Makro zamene"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of function prototypes
- */
- virtual QCString trFuncProtos()
- { return "Deklaracija funkcije"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of typedefs
- */
- virtual QCString trTypedefs()
- { return "Typedef-ovi"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of enumerations
- */
- virtual QCString trEnumerations()
- { return "Enum-ovi"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) functions
- */
- virtual QCString trFunctions()
- { return "Funkcije"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trVariables()
- { return "Promenjive"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trEnumerationValues()
- { return "Vrednosti enum-ova"; }
-
- /*! This is used in the documentation of a file before the list of
- * documentation blocks for defines
- */
- virtual QCString trDefineDocumentation()
- { return "Dokumentacija makro zamene"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for function prototypes
- */
- virtual QCString trFunctionPrototypeDocumentation()
- { return "Dokumentacija deklaracije funkcije"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for typedefs
- */
- virtual QCString trTypedefDocumentation()
- { return "Dokumentacija typedef-a"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration types
- */
- virtual QCString trEnumerationTypeDocumentation()
- { return "Dokumetacija enum-a"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration values
- */
- virtual QCString trEnumerationValueDocumentation()
- { return "Dokumentacija enum vrednosti"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for functions
- */
- virtual QCString trFunctionDocumentation()
- { return "Dokumentacija funkcije"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for variables
- */
- virtual QCString trVariableDocumentation()
- { return "Dokumentacija promenjive"; }
-
- /*! This is used in the documentation of a file/namespace/group before
- * the list of links to documented compounds
- */
- virtual QCString trCompounds()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Strukture";
- }
- else
- {
- return "Klase i strukture";
- }
- }
-
- /*! 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)"Napravljeno " + date;
- if ( projName ) result+=(QCString)" za " + projName;
- result+=(QCString)" od";
- return decode( result );
- }
- /*! This is part of the sentence used in the standard footer of each page.
- */
- virtual QCString trWrittenBy()
- {
- return "napisao";
- }
-
- /*! this text is put before a class diagram */
- virtual QCString trClassDiagram(const char *clName)
- {
- return decode( QCString("Dijagram nasleðivanja za klasu ") + clName + ":" );
- }
-
- /*! this text is generated when the \\internal command is used. */
- virtual QCString trForInternalUseOnly()
- { return decode( "Samo za unutra¹nju upotrebu." ); }
-
- /*! this text is generated when the \\reimp command is used. */
- virtual QCString trReimplementedForInternalReasons()
- { return decode("Preuraðeno zbog unutra¹njih razloga; Nema uticaja na API." ); }
-
- /*! this text is generated when the \\warning command is used. */
- virtual QCString trWarning()
- { return "Upozorenje"; }
-
- /*! this text is generated when the \\bug command is used. */
- virtual QCString trBugsAndLimitations()
- { return decode( "Gre¹ke i ogranièenja" ); }
-
- /*! this text is generated when the \\version command is used. */
- virtual QCString trVersion()
- { return "Verzija"; } // inacica
-
- /*! this text is generated when the \\date command is used. */
- virtual QCString trDate()
- { return "Datum"; }
-
- /*! this text is generated when the \\return command is used. */
- virtual QCString trReturns()
- { return decode( "Vraæene vrednosti" ); }
-
- /*! this text is generated when the \\sa command is used. */
- virtual QCString trSeeAlso()
- { return decode( "Takoðe pogledati" ); }
-
- /*! this text is generated when the \\param command is used. */
- virtual QCString trParameters()
- { return "Parametri"; }
-
- /*! this text is generated when the \\exception command is used. */
- virtual QCString trExceptions()
- { return "Izuzeci"; }
-
- /*! this text is used in the title page of a LaTeX document. */
- virtual QCString trGeneratedBy()
- { return "Napravio"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of page containing all the index of all namespaces. */
- virtual QCString trNamespaceList()
- { return "Spisak prostora imena"; }
-
- /*! used as an introduction to the namespace list */
- virtual QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="Spisak svih ";
- if (!extractAll) result+="dokumentovanih ";
- result+="prostora imena sa kratkim opisom:";
- return decode( result );
- }
-
- /*! used in the class documentation as a header before the list of all
- * friends of a class
- */
- virtual QCString trFriends()
- { return "Prijatelji"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in the class documentation as a header before the list of all
- * related classes
- */
- virtual QCString trRelatedFunctionDocumentation()
- { return decode( "Dokumentacija prijateljskih funkcija ili klasa" ); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of the HTML page of a class/struct/union */
- virtual QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- {
- QCString result( "Dokumentacija " );
-
- switch(compType)
- {
- case ClassDef::Class: result+="klase "; break;
- case ClassDef::Struct: result+="strukture "; break;
- case ClassDef::Union: result+="unije "; break;
- case ClassDef::Interface: result+="interfejsa "; break;
- case ClassDef::Protocol: result+="protokola "; break; // grcka rec
- case ClassDef::Category: result+="kategorije "; break; //
- case ClassDef::Exception: result+="izuzetka "; break;
- }
- if (isTemplate) result += "¹ablona ";
-
- result += clName;
- return decode( result );
- }
-
- /*! used as the title of the HTML page of a file */
- virtual QCString trFileReference(const char *fileName)
- {
- QCString result = "Opis datoteke ";
- result += fileName;
- return decode( result );
- }
-
- /*! used as the title of the HTML page of a namespace */
- virtual QCString trNamespaceReference(const char *namespaceName)
- {
- QCString result="Opis prostora imena ";
- result += namespaceName;
- return result;
- }
-
- virtual QCString trPublicMembers()
- { return decode("Javni èlanovi"); }
- virtual QCString trPublicSlots()
- { return "Javni slotovi"; }
- virtual QCString trSignals()
- { return "Signali"; }
- virtual QCString trStaticPublicMembers()
- { return decode("Zajednièki javni èlanovi"); }
- virtual QCString trProtectedMembers()
- { return decode("Za¹tiæeni èlanovi"); }
- virtual QCString trProtectedSlots()
- { return decode("Za¹tiæeni slotovi"); }
- virtual QCString trStaticProtectedMembers()
- { return decode("Zajednièki za¹tiæeni èlanovi"); }
- virtual QCString trPrivateMembers()
- { return decode("Privani èlanovi"); }
- virtual QCString trPrivateSlots()
- { return decode("Privatni slotovi"); }
- virtual QCString trStaticPrivateMembers()
- { return decode("Zajednièki privatni èlanovi"); }
-
- /*! this function is used to produce a comma-separated list of items.
- * use generateMarker(i) to indicate where item i should be put.
- */
- virtual QCString trWriteList(int numEntries)
- {
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=" i ";
- }
- }
- return result;
- }
-
- /*! used in class documentation to produce a list of base classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritsList(int numEntries)
- {
- return decode("Nasleðeno od "+trWriteList(numEntries)+".");
- }
-
- /*! used in class documentation to produce a list of super classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritedByList(int numEntries)
- {
- return decode( "Nasleðeno u "+trWriteList(numEntries)+"." );
- }
-
- /*! used in member documentation blocks to produce a list of
- * members that are hidden by this one.
- */
- virtual QCString trReimplementedFromList(int numEntries)
- {
- return decode("Preuraðeno od "+trWriteList(numEntries)+"." );
- }
-
- /*! used in member documentation blocks to produce a list of
- * all member that overwrite the implementation of this member.
- */
- virtual QCString trReimplementedInList(int numEntries)
- {
- return decode("Preuraðeno u "+trWriteList(numEntries)+"." );
- }
-
- /*! This is put above each page as a link to all members of namespaces. */
- virtual QCString trNamespaceMembers()
- { return decode("Èlanovi prostora imena"); }
-
- /*! This is an introduction to the page with all namespace members */
- virtual QCString trNamespaceMemberDescription(bool extractAll)
- {
- QCString result="Spisak svih ";
- if (!extractAll) result+="dokumentovanih ";
- result+="èlanova prostora imena sa linkovima na ";
- if (extractAll)
- result+="dokumentaciju svakog èlana prostora imena: ";
- else
- result+="prostor imena kojima pripadaju: ";
- return decode( result );
- }
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all namespaces.
- */
- virtual QCString trNamespaceIndex()
- { return "Index prostora imena"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all namespaces.
- */
- virtual QCString trNamespaceDocumentation()
- { return "Dokumentacija prostora imena"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- virtual QCString trNamespaces()
- { return "Prostori imena"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990728
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is put at the bottom of a class documentation page and is
- * followed by a list of files that were used to generate the page.
- */
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)"Dokumentacija ";
- switch(compType)
- {
- case ClassDef::Class: result+="ove klase"; break;
- case ClassDef::Struct: result+="ove strukture"; break;
- case ClassDef::Union: result+="ove unije"; break;
- case ClassDef::Interface: result+="ovog interfejsa"; break;
- case ClassDef::Protocol: result+="ovog protokola"; break;
- case ClassDef::Category: result+="ove kategorije"; break;
- case ClassDef::Exception: result+="ovog izuzetka"; break;
- }
- result+=" je napravljena iz ";
- if (single) result+=":"; else result+=":";
- return result;
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- virtual QCString trAlphabeticalList()
- { return "Abecedni spisak"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- virtual QCString trReturnValues()
- { return decode( "Vraæena vrednost" ); }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- virtual QCString trMainPage()
- { return "Glavna strana"; }
-
- /*! 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 "str."; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991003
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trSources()
- {
- return "Izvorne datoteke";
- }
- virtual QCString trDefinedAtLineInSourceFile()
- {
- return "Definisano u redu @0 datoteke @1.";
- }
- virtual QCString trDefinedInSourceFile()
- {
- return "Definisano u datoteci @0.";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDeprecated()
- {
- return "Zastarelo";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- virtual QCString trCollaborationDiagram(const char *clName)
- {
- return decode( (QCString)"Dijagram nasleðenih èlanova za "+clName+":" );
- }
- /*! this text is put before an include dependency graph */
- virtual QCString trInclDepGraph(const char *fName)
- {
- return decode( (QCString)"Graf zavisnosti datoteka za "+fName+":" );
- }
- /*! header that is put before the list of constructor/destructors. */
- virtual QCString trConstructorDocumentation()
- {
- return "Dokumentacija konstruktora i destruktora";
- }
- /*! Used in the file documentation to point to the corresponding sources. */
- virtual QCString trGotoSourceCode()
- {
- return "Izvorni kod.";
- }
- /*! Used in the file sources to point to the corresponding documentation. */
- virtual QCString trGotoDocumentation()
- {
- return "Dokumentacija.";
- }
- /*! Text for the \\pre command */
- virtual QCString trPrecondition()
- {
- return "Preduslovi";
- }
- /*! Text for the \\post command */
- virtual QCString trPostcondition()
- {
- return "Postuslovi";
- }
- /*! Text for the \\invariant command */
- virtual QCString trInvariant()
- {
- return "Invarijanta";
- }
- /*! Text shown before a multi-line variable/enum initialization */
- virtual QCString trInitialValue()
- {
- return decode( "Poèetna vriednost:" );
- }
- /*! Text used the source code in the file index */
- virtual QCString trCode()
- {
- return "kod";
- }
- virtual QCString trGraphicalHierarchy()
- {
- return decode("Grafièki prikaz stabla klasa");
- }
- virtual QCString trGotoGraphicalHierarchy()
- {
- return decode("Prika¾i stablo klasa u grafièkom obliku");
- }
- virtual QCString trGotoTextualHierarchy()
- {
- return decode( "Prika¾i stablo klasa u tekstualnom obliku" );
- }
- virtual QCString trPageIndex()
- {
- return "Indeks stranice";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trNote()
- {
- return "Primedba"; // ili Beleska ili Zapazanje. Primedba zvuci negativno
- }
- virtual QCString trPublicTypes()
- {
- return "Javni tipovi";
- }
- virtual QCString trPublicAttribs()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode( "Èlanovi" );
- }
- else
- {
- return decode( "Javni èlanovi" );
- }
- }
- virtual QCString trStaticPublicAttribs()
- {
- return decode( "Zajednièki javni èlanovi");
- }
- virtual QCString trProtectedTypes()
- {
- return decode( "Za¹tiæeni tipovi" );
- }
- virtual QCString trProtectedAttribs()
- {
- return decode( "Za¹tiæeni èlanovi" );
- }
- virtual QCString trStaticProtectedAttribs()
- {
- return decode( "Zajednièki za¹tiæeni èlanovi" );
- }
- virtual QCString trPrivateTypes()
- {
- return decode( "Privatni tipovi" );
- }
- virtual QCString trPrivateAttribs()
- {
- return decode( "Privatni èlanovi" );
- }
- virtual QCString trStaticPrivateAttribs()
- {
- return decode( "Zajednièki privatni èlanovi" );
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\todo item */
- virtual QCString trTodo()
- {
- return decode( "Neuraðeno" );
- }
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- {
- return decode("Spisak neuraðenog");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy()
- {
- return decode( "Kori¹æeno od" );
- }
- virtual QCString trRemarks()
- {
- return decode( "Zapa¾anja" );
- }
- virtual QCString trAttention()
- {
- return decode( "Pa¾nja" );
- }
- virtual QCString trInclByDepGraph()
- {
- return decode("Ovaj graf pokazuje koja datoteka direktno "
- "ili indirektno ukljuèuju ovu datoteku: ");
- }
- virtual QCString trSince()
- {
- return "Od";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- virtual QCString trLegendTitle()
- {
- return decode( "Obja¹njenje kori¹æenih simbola" );
- }
- /*! 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 decode(
- "Ova stranica obja¹njava kako tumaèiti grafikone koje je napravio "
- "doxygen.<p>\n"
- "Na primer:\n"
- "\\code\n"
- "/*! Nevidljiva klasa ( nemo¾e stati na graf zbog zadatih ogranièenja ) */\n"
- "class Invisible { };\n\n"
- "/*! Odseèena klasa, neke osnovne klase su sakrivene */\n"
- "class Truncated : public Invisible { };\n\n"
- "/* Nedokumentovana klasa */\n"
- "class Undocumented { };\n\n"
- "/*! Javno nasleðena klasa */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! Sablon klasa */\n"
- "template<class T> class Templ { };\n\n"
- "/*! Za¹tiæeno nasleðena klasa */\n"
- "class ProtectedBase { };\n\n"
- "/*! Privatno nasleðena klasa */\n"
- "class PrivateBase { };\n\n"
- "/*! Klasa koja je kori¹æena od drugih klasa*/\n"
- "class Used { };\n\n"
- "/*! Nadklasa koja nasleðuje/koristi ostale */\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"
- "Ako je \\c MAX_DOT_GRAPH_HEIGHT tag u konfiguracionoj datoteci "
- "postavljen na 200 gornje veze æe izgledati:"
- "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
-
- "Pravougaonici imaju sledeæa znaèenja:\n"
- "<ul>\n"
- "<li>Puni crni predstavlja strukturu ili klasu za koju je graf napravljen.\n"
- "<li>Sa crnom ivicom predstavlja dokumentovanu strukturu ili klasu.\n"
- "<li>Sa sivom ivicom predstavlja nedokumentovanu strukturu ili klasu.\n"
- "<li>Sa crvenom ivicom predstavlja dokumentovanu strukturu ili klasu\n"
- "za koju nije prikazan graf nasleðivanja/kori¹æenja. Graf je odseèen "
- "ako ne stane unutar odreðenih granica."
- "</ul>"
- "Strelice imaju sledeæa znaèenja:\n"
- "<ul>\n"
- "<li>Tamnoplava strelica oznaèava javno nasleðivanje.\n"
- "<li>Tamnozelena strelica oznaèava za¹tiæeno nasleðivanje.\n"
- "<li>Tamnocrvena strelica oznaèava privatno nasleðivanje.\n"
- "<li>Ljubièasta isprekidana strelica ako je klasa koristi ili je njen èlan. "
- "Strelica je oznaèena imenom èlana.\n"
- "<li>Zuta strelica oznaèava vezu izmeðu primerka ¹ablona"
- " i ¹ablon klase od koje je napravljena. "
- "Strelica je oznaèena imenom prarametra ¹ablona.\n"
- "</ul>\n"
- );
-
- }
- /*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return decode( "Obja¹njenje kori¹æenih simbola" );
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return "Test";
- }
- /*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return "Spisak testova";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return "DCOP metode";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return decode( "Osobine" );
- }
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return decode( "Dokumentacija osobina" );
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java interfaces in the summary section of Java packages */
- virtual QCString trInterfaces()
- {
- return "Interfejsi"; // Radna okruzenja. Ali to je dve reci.
- }
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Strikture";
- }
- else
- {
- return "Klase";
- }
- }
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
- {
- return (QCString)"Paket "+name;
- }
- /*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return "Spisak paketa";
- }
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return "Paketi s kratkim opisom (ukoliko postoji):";
- }
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return "Paketi";
- }
- /*! Used as a chapter title for Latex & RTF output */
- virtual QCString trPackageDocumentation()
- {
- return "Dokumentacija paketa";
- }
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return "Vrednost:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return decode( "Gre¹ka" );
- }
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return decode( "Spisak gre¹aka" );
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as ansicpg for RTF file
- *
- * The following table shows the correlation of Charset name, Charset Value and
- * <pre>
- * Codepage number:
- * Charset Name Charset Value(hex) Codepage number
- * ------------------------------------------------------
- * DEFAULT_CHARSET 1 (x01)
- * SYMBOL_CHARSET 2 (x02)
- * OEM_CHARSET 255 (xFF)
- * ANSI_CHARSET 0 (x00) 1252
- * RUSSIAN_CHARSET 204 (xCC) 1251
- * EE_CHARSET 238 (xEE) 1250
- * GREEK_CHARSET 161 (xA1) 1253
- * TURKISH_CHARSET 162 (xA2) 1254
- * BALTIC_CHARSET 186 (xBA) 1257
- * HEBREW_CHARSET 177 (xB1) 1255
- * ARABIC _CHARSET 178 (xB2) 1256
- * SHIFTJIS_CHARSET 128 (x80) 932
- * HANGEUL_CHARSET 129 (x81) 949
- * GB2313_CHARSET 134 (x86) 936
- * CHINESEBIG5_CHARSET 136 (x88) 950
- * </pre>
- *
- */
- virtual QCString trRTFansicp()
- {
- return "1252";
- }
-
-
- /*! Used as ansicpg for RTF fcharset
- * \see trRTFansicp() for a table of possible values.
- */
- virtual QCString trRTFCharSet()
- {
- return "238";
- }
-
- /*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return decode( "Sadr¾aj" );
- }
-
- /*! 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 ? "Klas" : "klas") );
- result+= (singular ? "a" : "e");
- 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 ? "Datotek" : "Datotek"));
- result+= (singular ? "a" : "e");
- 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 ? "Prostor" : "prostor"));
- result += (singular ? "" : "i");
- result += " imena";
- 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 ? "Grup" : "grup"));
- result+= (singular ? "a" : "e");
- 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 ? "Stran" : "stran"));
- result+= (singular ? "a" : "e");
- 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 ? "Èlan" : "èlan"));
- result+= (singular ? "" : "ovi");
- return decode( result );
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trField(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Polj" : "polj"));
- result+= (singular ? "e" : "a");
- 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 ? "Global" : "global"));
- result+= (singular ? "no" : "ni");
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is generated when the \\author command is used and
- * for the author section in man pages. */
- virtual QCString trAuthor(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Autor" : "autor"));
- result+= (singular ? "" : "i");
- return decode( result );
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return decode( "Koristi" );
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 decode( "Defini¹e "+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 decode( "Definisano u " + trWriteList(numEntries) + "." );
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.16
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in RTF documentation as a heading for the Table
- * of Contents.
- */
- virtual QCString trRTFTableOfContents()
- {
- return decode( "Sadr¾aj" );
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.17
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as the header of the list of item that have been
- * flagged deprecated
- */
- virtual QCString trDeprecatedList()
- {
- return decode( "Spisak zastarelih funkcija èlanica" );
- }
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.18
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a header for declaration section of the events found in
- * a C# program
- */
- virtual QCString trEvents()
- {
- return decode( "Dogaðaji" );
- }
- /*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- return decode( "Dokumentacija dogaðaja" );
- }
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a heading for a list of Java class types with package scope.
- */
- virtual QCString trPackageTypes()
- {
- return decode( "Tipovi u Paketu" );
- }
- /*! Used as a heading for a list of Java class functions with package
- * scope.
- */
- virtual QCString trPackageMembers()
- {
- return decode( "Funkcije u paketu" );
- }
- /*! Used as a heading for a list of static Java class functions with
- * package scope.
- */
- virtual QCString trStaticPackageMembers()
- {
- return decode( "Statièke funkcije u paketu" ); // Zajednicke funkcije u paketu
- }
- /*! Used as a heading for a list of Java class variables with package
- * scope.
- */
- virtual QCString trPackageAttribs()
- {
- return decode( "Atributi u paketu" ); // Clanovi u paketu
- }
- /*! Used as a heading for a list of static Java class variables with
- * package scope.
- */
- virtual QCString trStaticPackageAttribs()
- {
- return decode( "Statièki atributi u paketu" ); // Zajednicki clanovi u paketu
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 decode( "Sve" );
- }
- /*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- return decode( "Graf pozivanja funkcija:" );
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! When the search engine is enabled this text is put in the header
- * of each page before the field where one can enter the text to search
- * for.
- */
- virtual QCString trSearchForIndex()
- {
- return decode("Tra¾i");
- }
- /*! This string is used as the title for the page listing the search
- * results.
- */
- virtual QCString trSearchResultsTitle()
- {
- return decode( "Rezultati pretra¾ivanja" );
- }
- /*! 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
- * the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
- * value 2 represents 2 or more matches. HTML markup is allowed inside
- * the returned string.
- */
- virtual QCString trSearchResults(int numDocuments)
- {
- if (numDocuments==0)
- {
- return decode("Nema dokumenta koji odgovaraju va¹em upitu");
- }
- else if (numDocuments==1)
- { // 10x 2 Ivana Miletic 4 gramatical consutation.
- return decode("Naðen je <b>1</b> dokument koji odgovara va¹em upitu.");
- }
- else if (numDocuments<5)
- { // 10x 2 Ivana Miletic 4 gramatical consutation.
- return decode("Naðena su <b>$num</b> dokumenta koji odgovaraju va¹em upitu."
- "Najbolji su prikazani prvi.");
- }
- else
- { // 10x 2 Ivana Miletic 4 gramatical consutation.
- return decode("Naðeno je <b>$num</b> dokumenata koji odgovaraju va¹em upitu."
- "Najbolji su prikazani prvi.");
- }
- }
- /*! 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 decode( "Pronaðeno:" );
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 decode( "Izvorni kod datoteke " + filename ) ;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.9
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the name of the chapter containing the directory
- * hierarchy.
- */
- virtual QCString trDirIndex()
- { return decode( "Stablo direktorijuma" ); }
-
- /*! This is used as the name of the chapter containing the documentation
- * of the directories.
- */
- virtual QCString trDirDocumentation()
- { return decode( "Dokumentacija direktorijuma" ); }
-
- /*! 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 decode( "direktorijumi" ); }
-
- /*! This returns a sentences that introduces the directory hierarchy.
- * and the fact that it is sorted alphabetically per level
- */
- virtual QCString trDirDescription()
- { return decode( "Stablo direktorijuma slozeno priblizno abecednim redom" );
- }
-
- /*! 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=dirName; result+="Opis direktorijuma"; return decode( result ); }
-
- /*! 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 ? "Direktorijum" : "direktorijum"));
- if (!singular) result+="i";
- return decode( result );
- }
-
-
-};
-
-// sh - ¹ - shashavo (,š)
-// dj - ð - djordje
-// ch - È, è - chasha
-// cc - æ - cciccifu
-// zz - ¾ - zzaba
-
-#endif
diff --git a/src/translator_tw.h b/src/translator_tw.h
deleted file mode 100644
index 1ee6523..0000000
--- a/src/translator_tw.h
+++ /dev/null
@@ -1,1598 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- * The translation into Chinesetraditional was provided by
- * Daniel YC Lin (daniel@twpda.com) since v1.2.16
- */
-
-#ifndef TRANSLATOR_TW_H
-#define TRANSLATOR_TW_H
-
-// When defining a translator class for the new language, follow
-// the description in the documentation. One of the steps says
-// that you should copy the translator_en.h (this) file to your
-// translator_xx.h new file. Your new language should use the
-// Translator class as the base class. This means that you need to
-// implement exactly the same (pure virtual) methods as the
-// TranslatorEnglish does. Because of this, it is a good idea to
-// start with the copy of TranslatorEnglish and replace the strings
-// one by one.
-//
-// It is not necessary to include "translator.h" or
-// "translator_adapter.h" here. The files are included in the
-// language.cpp correctly. Not including any of the mentioned
-// files frees the maintainer from thinking about whether the
-// first, the second, or both files should be included or not, and
-// why. This holds namely for localized translators because their
-// base class is changed occasionaly to adapter classes when the
-// Translator class changes the interface, or back to the
-// Translator class (by the local maintainer) when the localized
-// translator is made up-to-date again.
-
-class TranslatorChinesetraditional : public Translator
-{
- public:
-
- // --- Language control methods -------------------
-
- /*! Used for identification of the language. The identification
- * should not be translated. It should be replaced by the name
- * of the language in English using lower-case characters only
- * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
- * the identification used in language.cpp.
- */
- virtual QCString idLanguage()
- { return "chinese-traditional"; }
-
- /*! Used to get the LaTeX command(s) for the language support.
- * This method should return string with commands that switch
- * LaTeX to the desired language. For example
- * <pre>"\\usepackage[german]{babel}\n"
- * </pre>
- * or
- * <pre>"\\usepackage{polski}\n"
- * "\\usepackage[latin2]{inputenc}\n"
- * "\\usepackage[T1]{fontenc}\n"
- * </pre>
- *
- * The English LaTeX does not use such commands. Because of this
- * the empty string is returned in this implementation.
- */
- virtual QCString latexLanguageSupportCommand()
- {
- return "";
- }
-
- /*! return the language charset. This will be used for the HTML output */
- virtual QCString idLanguageCharset()
- {
- return "big5";
- }
-
- // --- Language translation methods -------------------
-
- /*! used in the compound documentation before a list of related functions. */
- virtual QCString trRelatedFunctions()
- { return "¬ÛÃö¨ç¦¡"; }
-
- /*! subscript for the related functions. */
- virtual QCString trRelatedSubscript()
- { return "(µù¡G³o¨Ç¤£¬O¦¨­û¨ç¦¡)"; }
-
- /*! header that is put before the detailed description of files, classes and namespaces. */
- virtual QCString trDetailedDescription()
- { return "¸Ô²Ó´y­z"; }
-
- /*! header that is put before the list of typedefs. */
- virtual QCString trMemberTypedefDocumentation()
- { return "«¬ºA©w¸q¦¨­û»¡©ú¤å¥ó"; }
-
- /*! header that is put before the list of enumerations. */
- virtual QCString trMemberEnumerationDocumentation()
- { return "¦CÁ|«¬ºA¦¨­û»¡©ú¤å¥ó"; }
-
- /*! header that is put before the list of member functions. */
- virtual QCString trMemberFunctionDocumentation()
- { return "¨ç¦¡¦¨­û»¡©ú¤å¥ó"; }
-
- /*! header that is put before the list of member attributes. */
- virtual QCString trMemberDataDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Äæ¦ì»¡©ú¤å¥ó";
- }
- else
- {
- return "¸ê®Æ¦¨­û»¡©ú¤å¥ó";
- }
- }
-
- /*! this is the text of a link put after brief descriptions. */
- virtual QCString trMore()
- { return "§ó¦h..."; }
-
- /*! put in the class documentation */
- virtual QCString trListOfAllMembers()
- { return "¥þ³¡¦¨­û¦Cªí"; }
-
- /*! used as the title of the "list of all members" page of a class */
- virtual QCString trMemberList()
- { return "¦¨­û¦Cªí"; }
-
- /*! this is the first part of a sentence that is followed by a class name */
- virtual QCString trThisIsTheListOfAllMembers()
- { return "§¹¾ã¦¨­û¦Cªí¡AÃþ§O¬°"; }
-
- /*! this is the remainder of the sentence after the class name */
- virtual QCString trIncludingInheritedMembers()
- { return ", ¥]§t©Ò¦³Ä~©Óªº¦¨­û"; }
-
- /*! 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="¥»¤å¥ó¥ÑDoxygen";
- if (s) result+=(QCString)" ¦Û "+s;
- result+=" ªº­ì©l½X¤¤¦Û°Ê²£¥Í.";
- return result;
- }
-
- /*! put after an enum name in the list of all members */
- virtual QCString trEnumName()
- { return "¦CÁ|«¬ºA¦WºÙ"; }
-
- /*! put after an enum value in the list of all members */
- virtual QCString trEnumValue()
- { return "¦CÁ|­È"; }
-
- /*! put after an undocumented member in the list of all members */
- virtual QCString trDefinedIn()
- { return "³Q©w¸q©ó"; }
-
- // 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 "¼Ò²Õ"; }
-
- /*! This is put above each page as a link to the class hierarchy */
- virtual QCString trClassHierarchy()
- { return "Ãþ§O¶¥¼h"; }
-
- /*! This is put above each page as a link to the list of annotated classes */
- virtual QCString trCompoundList()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "¸ê®Æµ²ºc";
- }
- else
- {
- return "½Æ¦X¦Cªí";
- }
- }
-
- /*! This is put above each page as a link to the list of documented files */
- virtual QCString trFileList()
- { return "ÀɮצCªí"; }
-
- /*! This is put above each page as a link to the list of all verbatim headers */
- virtual QCString trHeaderFiles()
- { return "¼ÐÀYÀÉ®×"; }
-
- /*! This is put above each page as a link to all members of compounds. */
- virtual QCString trCompoundMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "¸ê®ÆÄæ¦ì";
- }
- else
- {
- return "½Æ¦X¦¨­û";
- }
- }
-
- /*! This is put above each page as a link to all members of files. */
- virtual QCString trFileMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "¥þ°ì¸ê®Æ";
- }
- else
- {
- return "Àɮצ¨­û";
- }
- }
-
- /*! This is put above each page as a link to all related pages. */
- virtual QCString trRelatedPages()
- { return "¬ÛÃö­¶­±"; }
-
- /*! This is put above each page as a link to all examples. */
- virtual QCString trExamples()
- { return "½d¨Ò"; }
-
- /*! This is put above each page as a link to the search engine. */
- virtual QCString trSearch()
- { return "·j´M"; }
-
- /*! This is an introduction to the class hierarchy. */
- virtual QCString trClassHierarchyDescription()
- { return "³o­ÓÄ~©Ó¦Cªí¸g¹L²²¤ªº¦r¥À±Æ§Ç: ";
- }
-
- /*! This is an introduction to the list with all files. */
- virtual QCString trFileListDescription(bool extractAll)
- {
- QCString result="³o¬Oªþ±a²²¤»¡©ú";
- if (!extractAll) result+="¥B¸g¹L¤å¥ó¤Æ";
- result+="ªºÀɮצCªí:";
- return result;
- }
-
- /*! This is an introduction to the annotated compound list. */
- virtual QCString trCompoundListDescription()
- {
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "³o¬Oªþ±a²²¤»¡©úªº¸ê®Æµ²ºc:";
- }
- else
- {
- return "³o¬Oªþ±a²²¤»¡©úªºÃþ§O¡Aµ²ºc¡A"
- "Áp¦X«¬ºA(unions)¤Î¤¶­±(interfaces):";
- }
- }
-
- /*! This is an introduction to the page with all class members. */
- virtual QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result="³o¬O¥þ³¡";
- if (!extractAll)
- {
- result+="¤å¥ó¤Æ¹L";
- }
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="µ²ºc¤ÎÁp¦X«¬ºAÄæ¦ì";
- }
- else
- {
- result+="Ãþ§O¦¨­û";
- }
- result+=", ¨Ã¥B±a¦³³sµ²¦Ü";
- if (!extractAll)
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="¨C­ÓÄæ¦ìªºµ²ºc/Áp¦X«¬ºA»¡©ú¤å¥ó:";
- }
- else
- {
- result+="¨C­Ó¦¨­ûªºÃþ§O»¡©ú¤å¥ó:";
- }
- }
- else
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="³o¨Çµ²ºc/Áp¦X«¬ºA©ÒÄÝ:";
- }
- else
- {
- result+="³o¨ÇÃþ§O©ÒÄÝ:";
- }
- }
- return result;
- }
-
- /*! This is an introduction to the page with all file members. */
- virtual QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="³o¬O¥þ³¡";
- if (!extractAll) result+="¤å¥ó¤Æªº";
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="¨ç¦¡¡AÅܼơA©w¸q¡A¦CÁ|¡A¤Î«¬ºA©w¸q";
- }
- else
- {
- result+="Àɮצ¨­û";
- }
- result+="¡A¨Ã¥B±a¦³³sµ²¦Ü";
- if (extractAll)
- result+="³o¨ÇÀɮשÒÄÝ:";
- else
- result+="»¡©ú¤å¥ó:";
- return result;
- }
-
- /*! This is an introduction to the page with the list of all header files. */
- virtual QCString trHeaderFilesDescription()
- { return "²Õ¦¨APIªº¼ÐÀYÀÉ:"; }
-
- /*! This is an introduction to the page with the list of all examples */
- virtual QCString trExamplesDescription()
- { return "©Ò¦³½d¨Ò¦Cªí:"; }
-
- /*! This is an introduction to the page with the list of related pages */
- virtual QCString trRelatedPagesDescription()
- { return "©Ò¦³¬ÛÃö¤å¥ó­¶­±¦Cªí:"; }
-
- /*! This is an introduction to the page with the list of class/file groups */
- virtual QCString trModulesDescription()
- { return "©Ò¦³¼Ò²Õ¦Cªí:"; }
-
- /*! This sentences is used in the annotated class/file lists if no brief
- * description is given.
- */
- virtual QCString trNoDescriptionAvailable()
- { return "¨S¦³¥i¥Îªº»¡©ú´y­z"; }
-
- // index titles (the project name is prepended for these)
-
-
- /*! This is used in HTML as the title of index.html. */
- virtual QCString trDocumentation()
- { return "»¡©ú¤å¥ó"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all groups.
- */
- virtual QCString trModuleIndex()
- { return "¼Ò²Õ¯Á¤Þ"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * class hierarchy.
- */
- virtual QCString trHierarchicalIndex()
- { return "¶¥¼h¯Á¤Þ"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * annotated compound index.
- */
- virtual QCString trCompoundIndex()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "¸ê®Æµ²ºc¯Á¤Þ";
- }
- else
- {
- return "½Æ¦X¯Á¤Þ";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * list of all files.
- */
- virtual QCString trFileIndex()
- { return "ÀɮׯÁ¤Þ"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all groups.
- */
- virtual QCString trModuleDocumentation()
- { return "¼Ò²Õ»¡©ú¤å¥ó"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all classes, structs and unions.
- */
- virtual QCString trClassDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "¸ê®Æµ²ºc»¡©ú¤å¥ó";
- }
- else
- {
- return "Ãþ§O»¡©ú¤å¥ó";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all files.
- */
- virtual QCString trFileDocumentation()
- { return "ÀÉ®×»¡©ú¤å¥ó"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all examples.
- */
- virtual QCString trExampleDocumentation()
- { return "½d¨Ò»¡©ú¤å¥ó"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all related pages.
- */
- virtual QCString trPageDocumentation()
- { return "­¶­±»¡©ú¤å¥ó"; }
-
- /*! This is used in LaTeX as the title of the document */
- virtual QCString trReferenceManual()
- { return "°Ñ¦Ò¤â¥U"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of defines
- */
- virtual QCString trDefines()
- { return "©w¸q"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of function prototypes
- */
- virtual QCString trFuncProtos()
- { return "¨ç¦¡­ì«¬"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of typedefs
- */
- virtual QCString trTypedefs()
- { return "«¬ºA©w¸q"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of enumerations
- */
- virtual QCString trEnumerations()
- { return "¦CÁ|«¬ºA"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) functions
- */
- virtual QCString trFunctions()
- { return "¨ç¦¡"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trVariables()
- { return "ÅܼÆ"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trEnumerationValues()
- { return "¦CÁ|­È"; }
-
- /*! This is used in the documentation of a file before the list of
- * documentation blocks for defines
- */
- virtual QCString trDefineDocumentation()
- { return "©w¸q¥¨¶°»¡©ú¤å¥ó"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for function prototypes
- */
- virtual QCString trFunctionPrototypeDocumentation()
- { return "¨ç¦¡­ì«¬»¡©ú¤å¥ó"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for typedefs
- */
- virtual QCString trTypedefDocumentation()
- { return "«¬ºA©w¸q»¡©ú¤å¥ó"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration types
- */
- virtual QCString trEnumerationTypeDocumentation()
- { return "¦CÁ|«¬ºA»¡©ú¤å¥ó"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration values
- */
- virtual QCString trEnumerationValueDocumentation()
- { return "¦CÁ|­È»¡©ú¤å¥ó"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for functions
- */
- virtual QCString trFunctionDocumentation()
- { return "¨ç¦¡»¡©ú¤å¥ó"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for variables
- */
- virtual QCString trVariableDocumentation()
- { return "Åܼƻ¡©ú¤å¥ó"; }
-
- /*! This is used in the documentation of a file/namespace/group before
- * the list of links to documented compounds
- */
- virtual QCString trCompounds()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "¸ê®Æµ²ºc";
- }
- else
- {
- return "½Æ¦X¶µ¥Ø";
- }
- }
-
- /*! 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)"²£¥Í¤é´Á:"+date;
- if (projName) result+=(QCString)", ±M®×:"+projName;
- result+=(QCString)", ²£¥Í¾¹:";
- return result;
- }
- /*! This is part of the sentence used in the standard footer of each page.
- */
- virtual QCString trWrittenBy()
- {
- return "¼¶¼g¤H:";
- }
-
- /*! this text is put before a class diagram */
- virtual QCString trClassDiagram(const char *clName)
- {
- return (QCString)"Ãþ§O"+clName+"ªºÄ~©Ó¹Ï:";
- }
-
- /*! this text is generated when the \\internal command is used. */
- virtual QCString trForInternalUseOnly()
- { return "¶È¨Ñ¤º³¡¨Ï¥Î."; }
-
- /*! this text is generated when the \\reimp command is used. */
- virtual QCString trReimplementedForInternalReasons()
- { return "¦]¤º³¡­ì¦]­«·s¹ê§@; ¤£¼vÅTAPI."; }
-
- /*! this text is generated when the \\warning command is used. */
- virtual QCString trWarning()
- { return "ĵ§i"; }
-
- /*! this text is generated when the \\bug command is used. */
- virtual QCString trBugsAndLimitations()
- { return "¯äÂΤέ­¨î"; }
-
- /*! this text is generated when the \\version command is used. */
- virtual QCString trVersion()
- { return "ª©¥»"; }
-
- /*! this text is generated when the \\date command is used. */
- virtual QCString trDate()
- { return "¤é´Á"; }
-
- /*! this text is generated when the \\return command is used. */
- virtual QCString trReturns()
- { return "¶Ç¦^­È"; }
-
- /*! this text is generated when the \\sa command is used. */
- virtual QCString trSeeAlso()
- { return "°Ñ¾\\"; }
-
- /*! this text is generated when the \\param command is used. */
- virtual QCString trParameters()
- { return "°Ñ¼Æ"; }
-
- /*! this text is generated when the \\exception command is used. */
- virtual QCString trExceptions()
- { return "¨Ò¥~"; }
-
- /*! this text is used in the title page of a LaTeX document. */
- virtual QCString trGeneratedBy()
- { return "²£¥ÍªÌ:"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of page containing all the index of all namespaces. */
- virtual QCString trNamespaceList()
- { return "©R¦WªÅ¶¡(name space)¦Cªí"; }
-
- /*! used as an introduction to the namespace list */
- virtual QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="³o¬O©Ò¦³ªþ±a²²¤»¡©úªº";
- if (!extractAll) result+="¤å¥ó¤Æªº";
- result+="©R¦WªÅ¶¡(namespaces):";
- return result;
- }
-
- /*! used in the class documentation as a header before the list of all
- * friends of a class
- */
- virtual QCString trFriends()
- { return "Ãþ§OªB¤Í(Friends)"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in the class documentation as a header before the list of all
- * related classes
- */
- virtual QCString trRelatedFunctionDocumentation()
- { return "Ãþ§OªB¤Í¤Î¬ÛÃö¨ç¦¡»¡©ú¤å¥ó"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of the HTML page of a class/struct/union */
- virtual QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- {
- QCString result=(QCString)clName+" ";
- switch(compType)
- {
- case ClassDef::Class: result+=" Ãþ§O"; break;
- case ClassDef::Struct: result+=" µ²ºc"; break;
- case ClassDef::Union: result+=" Áp¦X"; break;
- case ClassDef::Interface: result+=" ¤¶­±"; break;
- case ClassDef::Protocol: result+=" protocol"; break; // translate me!
- case ClassDef::Category: result+=" category"; break; // translate me!
- case ClassDef::Exception: result+=" ¨Ò¥~"; break;
- }
- if (isTemplate) result+=" ¼Ëª©";
- result+=" °Ñ¦Ò¤å¥ó";
- return result;
- }
-
- /*! used as the title of the HTML page of a file */
- virtual QCString trFileReference(const char *fileName)
- {
- QCString result=fileName;
- result+=" ÀɮװѦҤå¥ó";
- return result;
- }
-
- /*! used as the title of the HTML page of a namespace */
- virtual QCString trNamespaceReference(const char *namespaceName)
- {
- QCString result=namespaceName;
- result+=" ©R¦WªÅ¶¡(Namespace)°Ñ¦Ò¤å¥ó";
- return result;
- }
-
- virtual QCString trPublicMembers()
- { return "¤½¶}¤èªk(Public Methods)"; }
- virtual QCString trPublicSlots()
- { return "¤½¶}´¡¼Ñ(Public Slots)"; }
- virtual QCString trSignals()
- { return "°T¸¹(Signals)"; }
- virtual QCString trStaticPublicMembers()
- { return "ÀRºA¤½¶}¤èªk(Static Public Methods)"; }
- virtual QCString trProtectedMembers()
- { return "«OÅ@¤èªk(Protected Methods)"; }
- virtual QCString trProtectedSlots()
- { return "«OÅ@´¡¼Ñ(Protected Slots)"; }
- virtual QCString trStaticProtectedMembers()
- { return "ÀRºA«OÅ@¤èªk(Static Protected Methods)"; }
- virtual QCString trPrivateMembers()
- { return "¨p¦³¤èªk(Private Methods)"; }
- virtual QCString trPrivateSlots()
- { return "¨p¦³´¡¼Ñ(Private Slots)"; }
- virtual QCString trStaticPrivateMembers()
- { return "ÀRºA¨p¦³¤èªk(Static Private Methods)"; }
-
- /*! this function is used to produce a comma-separated list of items.
- * use generateMarker(i) to indicate where item i should be put.
- */
- virtual QCString trWriteList(int numEntries)
- {
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=", ¤Î ";
- }
- }
- return result;
- }
-
- /*! used in class documentation to produce a list of base classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritsList(int numEntries)
- {
- return "Ä~©Ó¦Û "+trWriteList(numEntries)+".";
- }
-
- /*! used in class documentation to produce a list of super classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritedByList(int numEntries)
- {
- return "³Q "+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 "¨Ì¾Ú"+trWriteList(numEntries)+"­«·s¹ê§@.";
- }
-
- /*! 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 "¦b"+trWriteList(numEntries)+"­«·s¹ê§@.";
- }
-
- /*! This is put above each page as a link to all members of namespaces. */
- virtual QCString trNamespaceMembers()
- { return "©R¦WªÅ¶¡(Namespace)¦¨­û"; }
-
- /*! This is an introduction to the page with all namespace members */
- virtual QCString trNamespaceMemberDescription(bool extractAll)
- {
- QCString result="¦¹³B¦Cªí¬°©Ò¦³ ";
- if (!extractAll) result+="¤å¥ó¤Æªº ";
- result+="©R¦WªÅ¶¡(namespace)¦¨­û¡A¨Ã¥Bªþ±a³sµ²¦Ü ";
- if (extractAll)
- result+="¨C­Ó¦¨­ûªº»¡©ú¤å¥ó:";
- else
- result+="¸Ó©R¦WªÅ¶¡©ÒÄݤ§³B:";
- return result;
- }
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all namespaces.
- */
- virtual QCString trNamespaceIndex()
- { return "©R¦WªÅ¶¡(Namespace)¯Á¤Þ"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all namespaces.
- */
- virtual QCString trNamespaceDocumentation()
- { return "©R¦WªÅ¶¡(Namespace)»¡©ú¤å¥ó"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- virtual QCString trNamespaces()
- { return "©R¦WªÅ¶¡(Namespaces)"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990728
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is put at the bottom of a class documentation page and is
- * followed by a list of files that were used to generate the page.
- */
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)"¦¹";
- switch(compType)
- {
- case ClassDef::Class: result+="Ãþ§O(class)"; break;
- case ClassDef::Struct: result+="µ²ºc(structure)"; break;
- case ClassDef::Union: result+="Áp¦X(union)"; break;
- case ClassDef::Interface: result+="¤¶­±(interface)"; break;
- case ClassDef::Protocol: result+="protocol"; break; // translate me!
- case ClassDef::Category: result+="category"; break; // translate me!
- case ClassDef::Exception: result+="¨Ò¥~(exception)"; break;
- }
- result+=" ¤å¥ó¬O¥Ñ¤U¦CÀɮפ¤²£¥Í";
- if (single) result+=":"; else result+=":";
- return result;
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- virtual QCString trAlphabeticalList()
- { return "¦r¥À¶¶§Ç¦Cªí"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- virtual QCString trReturnValues()
- { return "¶Ç¦^­È"; }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- virtual QCString trMainPage()
- { return "¥D­¶­±"; }
-
- /*! This is used in references to page that are put in the LaTeX
- * documentation. It should be an abbreviation of the word page.
- */
- virtual QCString trPageAbbreviation()
- { return "p."; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991003
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trSources()
- {
- return "­ì©l½X";
- }
- virtual QCString trDefinedAtLineInSourceFile()
- {
- return "©w¸q¦b @1 Àɮפ§²Ä @0 ¦æ.";
- }
- virtual QCString trDefinedInSourceFile()
- {
- return "©w¸q¦b @0 ÀÉ.";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDeprecated()
- {
- return "¹L®É";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- virtual QCString trCollaborationDiagram(const char *clName)
- {
- return (QCString)""+clName+"ªº¦X§@¹Ï:";
- }
- /*! this text is put before an include dependency graph */
- virtual QCString trInclDepGraph(const char *fName)
- {
- return (QCString)""+fName+"ªº¥]§t¬Û¨Ì¹Ï:";
- }
- /*! header that is put before the list of constructor/destructors. */
- virtual QCString trConstructorDocumentation()
- {
- return "«Øºc¤l»P¸Ñºc¤l»¡©ú¤å¥ó";
- }
- /*! Used in the file documentation to point to the corresponding sources. */
- virtual QCString trGotoSourceCode()
- {
- return "¬d¬Ý¥»Àɮתº­ì©l½X.";
- }
- /*! Used in the file sources to point to the corresponding documentation. */
- virtual QCString trGotoDocumentation()
- {
- return "¬d¬Ý¥»ÀÉ®×»¡©ú¤å¥ó.";
- }
- /*! Text for the \\pre command */
- virtual QCString trPrecondition()
- {
- return "«e¸m±ø¥ó";
- }
- /*! Text for the \\post command */
- virtual QCString trPostcondition()
- {
- return "«á¸m±ø¥ó";
- }
- /*! Text for the \\invariant command */
- virtual QCString trInvariant()
- {
- return "±`¼Æ";
- }
- /*! Text shown before a multi-line variable/enum initialization */
- virtual QCString trInitialValue()
- {
- return "ªì­È:";
- }
- /*! Text used the source code in the file index */
- virtual QCString trCode()
- {
- return "µ{¦¡½X";
- }
- virtual QCString trGraphicalHierarchy()
- {
- return "¹Ï§Î¤Æ¤§Ãþ§O¶¥¼h";
- }
- virtual QCString trGotoGraphicalHierarchy()
- {
- return "¬d¬Ý¹Ï§Î¤Æ¤§Ãþ§O¶¥¼h";
- }
- virtual QCString trGotoTextualHierarchy()
- {
- return "¬d¬Ý¤å¦r¤Æ¤§Ãþ§O¶¥¼h";
- }
- virtual QCString trPageIndex()
- {
- return "­¶­±¯Á¤Þ";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trNote()
- {
- return "µù";
- }
- virtual QCString trPublicTypes()
- {
- return "¤½¶}«¬ºA";
- }
- virtual QCString trPublicAttribs()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "¸ê®ÆÄæ¦ì";
- }
- else
- {
- return "¤½¶}ÄÝ©Ê";
- }
- }
- virtual QCString trStaticPublicAttribs()
- {
- return "ÀRºA¤½¶}ÄÝ©Ê";
- }
- virtual QCString trProtectedTypes()
- {
- return "«OÅ@«¬ºA";
- }
- virtual QCString trProtectedAttribs()
- {
- return "«OÅ@ÄÝ©Ê";
- }
- virtual QCString trStaticProtectedAttribs()
- {
- return "ÀRºA«OÅ@ÄÝ©Ê";
- }
- virtual QCString trPrivateTypes()
- {
- return "¨p¦³«¬ºA";
- }
- virtual QCString trPrivateAttribs()
- {
- return "¨p¦³ÄÝ©Ê";
- }
- virtual QCString trStaticPrivateAttribs()
- {
- return "ÀRºA¨p¦³ÄÝ©Ê";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\todo item */
- virtual QCString trTodo()
- {
- return "«Ý¿ì¨Æ¶µ";
- }
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- {
- return "«Ý¿ì¨Æ¶µ¦Cªí";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy()
- {
- return "³Q°Ñ¦Ò©ó";
- }
- virtual QCString trRemarks()
- {
- return "³Æµù";
- }
- virtual QCString trAttention()
- {
- return "ª`·N";
- }
- virtual QCString trInclByDepGraph()
- {
- return "¥»¹ÏÅã¥Ü¥X­þ¨ÇÀɮת½±µ©Î¶¡±µinclude¥»ÀÉ "
- ":";
- }
- virtual QCString trSince()
- {
- return "¦Û";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- virtual QCString trLegendTitle()
- {
- return "¹Ï¥Ü";
- }
- /*! 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
- "¥»­¶¸ÑÄÀ¦p¦ó¸ÑĶ³o¨Ç¥Ñdoxygen©Ò²£¥Íªº¹Ï¥Ü "
- ".<p>\n"
- "½Ð¬Ý¤U­±½d¨Ò:\n"
- "\\code\n"
- "/*! ¦]¬°ºIÂ_ªº¤£¥i¨£Ãþ§O */\n"
- "class Invisible { };\n\n"
- "/*! ºIÂ_ªºÃþ§O, Ä~©ÓÃö«Y³QÁôÂà */\n"
- "class Truncated : public Invisible { };\n\n"
- "/* ¥¼¸g¹Ldoxygenµù¸Ñ³B²z¹LªºÃþ§O */\n"
- "class Undocumented { };\n\n"
- "/*! ¸g¹L¤½¶}(Public)Ä~©ÓªºÃþ§O */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! ¤@­Ó¼Ëª©Ãþ§O */\n"
- "template<class T> class Templ { };\n\n"
- "/*! ¨Ï¥Î«OÅ@(Protected)Ä~©ÓªºÃþ§O */\n"
- "class ProtectedBase { };\n\n"
- "/*! ¨Ï¥Î¨p¦³(Private)Ä~©ÓªºÃþ§O */\n"
- "class PrivateBase { };\n\n"
- "/*! ¥Ñ³QÄ~©ÓÃþ§O©Ò¨Ï¥ÎªºÃþ§O */\n"
- "class Used { };\n\n"
- "/*! ¥Ñ¼Æ­Ó¨ä¥LÃþ§O©ÒÄ~©Ó¨Óªº¶WÃþ§O(Super Class) */\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"
- "­Y¦b²ÕºAÀɤ¤ªº \\c MAX_DOT_GRAPH_HEIGHT tag "
- "³]¬° 240¡A±N·|²£¥Í¤U¦Cªº¹Ï¥Ü:"
- "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
- "¤W¹Ï¤¤ªº¦U°Ï¶ô·N¸q¦p¤U:\n"
- "<ul>\n"
- "<li>%A ¶ñº¡¶Â¦âªº°Ï¶ô¥Nªí²£¥Í³o­Ó¹Ï¥ÜªºÃþ§O©Îµ²ºc "
- ".\n"
- "<li>%A ¶ÂÃ䪺°Ï¶ô¥Nªí¤å¥ó¤Æ¹Lªºµ²ºc©ÎÃþ§O.\n"
- "<li>%A ¦ÇÃ䪺°Ï¶ô¥Nªí¥¼¸g¤å¥ó¤Æªºµ²ºc©Î¬OÃþ§O.\n"
- "<li>%A ¬õÃ䪺°Ï¶ô¥Nªí¤å¥ó¤Æªºµ²ºc©Î¬OÃþ§O¡A"
- "³o¨Çµ²ºc©ÎÃþ§OªºÄ~©Ó©Î¥]§tÃö«Y¤£·|¥þ³¡Åã¥Ü. %A ¹Ï¥Ü "
- "­YµLªk¶ë¤J«ü©wªºÃä¬É¤¤±N·|³QºIÂ_.\n"
- "</ul>\n"
- "½bÀY¨ã¦³¤U­±ªº·N¸q:\n"
- "<ul>\n"
- "<li>%A ²`ÂŦâ½bÀY¥Î¨Ó¥Nªí¨â­ÓÃþ§O¶¡ªº¤½¶}Ä~©Ó "
- "Ãö«Y.\n"
- "<li>%A ²`ºñ¦â½bÀY¥Nªí«OÅ@Ä~©Ó.\n"
- "<li>%A ²`¬õ¦â½bÀY¥Nªí¨p¦³Ä~©Ó.\n"
- "<li>%A µµ¦â½bÀY¥Î¨Óªí¥ÜÃþ§O³Q¥t¤@­Ó¥]§t©Î¬O¨Ï¥Î."
- "½bÀY¤W¼Ð¥ÜµÛ¥i¦s¨ú¸ÓÃþ§O©Î¬Oµ²ºcªº¹ïÀ³ÅܼÆ"
- ".\n"
- "<li>%A ¶À¦â½bÀY¥Nªí¼Ëª©¹êÅé»P¼Ëª©Ãþ§O¤§¶¡ªºÃö«Y¡C"
- "½bÀY¤W¼Ð°OµÛ¼Ëª©¹êÅé¤Wªº°Ñ¼Æ"
- ".\n"
- "</ul>\n";
- }
- /*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return "¹Ï¥Ü";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return "´ú¸Õ¶µ¥Ø";
- }
- /*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return "´ú¸Õ¶µ¥Ø¦Cªí";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return "DCOP¤èªk";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return "ÄÝ©Ê(properties)";
- }
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return "ÄÝ©Ê(property)»¡©ú¤å¥ó";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java interfaces in the summary section of Java packages */
- virtual QCString trInterfaces()
- {
- return "¤¶­±";
- }
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "¸ê®Æµ²ºc";
- }
- else
- {
- return "Ãþ§O";
- }
- }
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
- {
- return (QCString)"Package "+name;
- }
- /*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return "Package¦Cªí";
- }
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return "¦¹³B¬°Packageªº·§²¤»¡©ú(¦pªG¦³ªº¸Ü):";
- }
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return "Packages";
- }
- /*! Used as a chapter title for Latex & RTF output */
- virtual QCString trPackageDocumentation()
- {
- return "Package»¡©ú¤å¥ó";
- }
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return "¥¨¶°¤º®e:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return "¯äÂÎ";
- }
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return "¯äÂΦCªí";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as ansicpg for RTF file
- *
- * The following table shows the correlation of Charset name, Charset Value and
- * <pre>
- * Codepage number:
- * Charset Name Charset Value(hex) Codepage number
- * ------------------------------------------------------
- * DEFAULT_CHARSET 1 (x01)
- * SYMBOL_CHARSET 2 (x02)
- * OEM_CHARSET 255 (xFF)
- * ANSI_CHARSET 0 (x00) 1252
- * RUSSIAN_CHARSET 204 (xCC) 1251
- * EE_CHARSET 238 (xEE) 1250
- * GREEK_CHARSET 161 (xA1) 1253
- * TURKISH_CHARSET 162 (xA2) 1254
- * BALTIC_CHARSET 186 (xBA) 1257
- * HEBREW_CHARSET 177 (xB1) 1255
- * ARABIC _CHARSET 178 (xB2) 1256
- * SHIFTJIS_CHARSET 128 (x80) 932
- * HANGEUL_CHARSET 129 (x81) 949
- * GB2313_CHARSET 134 (x86) 936
- * CHINESEBIG5_CHARSET 136 (x88) 950
- * </pre>
- *
- */
- virtual QCString trRTFansicp()
- {
- return "950";
- }
-
-
- /*! Used as ansicpg for RTF fcharset
- * \see trRTFansicp() for a table of possible values.
- */
- virtual QCString trRTFCharSet()
- {
- return "136";
- }
-
- /*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return "¯Á¤Þ";
- }
-
- /*! 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*/)
- {
- return QCString("Ãþ§O");
- }
-
- /*! 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*/)
- {
- return QCString("ÀÉ®×");
- }
-
- /*! 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*/)
- {
- return QCString("©R¦WªÅ¶¡");
- }
-
- /*! 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*/)
- {
- return QCString("¸s²Õ");
- }
-
- /*! 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*/)
- {
- return QCString("­¶­±");
- }
-
- /*! 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*/)
- {
- return QCString("¦¨­û");
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trField(bool /*first_capital*/, bool /*singular*/)
- {
- return QCString("Äæ¦ì");
- }
-
- /*! 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*/)
- {
- return QCString("¥þ°ì");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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*/)
- {
- return QCString("§@ªÌ");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return "°Ñ¦Ò";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "¹ê§@ "+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 "¹ê§@©ó "+trWriteList(numEntries)+".";
- }
-
- //////////////////////////////////////////////////////////////////////////
-// new since 1.2.16
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in RTF documentation as a heading for the Table
- * of Contents.
- */
- virtual QCString trRTFTableOfContents()
- {
- return "¥Ø¿ý";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.17
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as the header of the list of item that have been
- * flagged deprecated
- */
- virtual QCString trDeprecatedList()
- {
- return "¹L®É¶µ¥Ø(Deprecated) ¦Cªí";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.18
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a header for declaration section of the events found in
- * a C# program
- */
- virtual QCString trEvents()
- {
- return "Events";
- }
- /*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- return "Event ¤å¥ó";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a heading for a list of Java class types with package scope.
- */
- virtual QCString trPackageTypes()
- {
- return "Package «¬§O";
- }
- /*! Used as a heading for a list of Java class functions with package
- * scope.
- */
- virtual QCString trPackageMembers()
- {
- return "Package ¨ç¼Æ¦Cªí";
- }
- /*! Used as a heading for a list of static Java class functions with
- * package scope.
- */
- virtual QCString trStaticPackageMembers()
- {
- return "ÀRºA Package ¨ç¼Æ¦Cªí";
- }
- /*! Used as a heading for a list of Java class variables with package
- * scope.
- */
- virtual QCString trPackageAttribs()
- {
- return "Package ÄÝ©Ê";
- }
- /*! Used as a heading for a list of static Java class variables with
- * package scope.
- */
- virtual QCString trStaticPackageAttribs()
- {
- return "ÀRºA Package ÄÝ©Ê";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "¥þ³¡";
- }
- /*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- return "³o¬O¦¹¨ç¼Æªº¤Þ¥Î¨ç¼Æ¹Ï:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! When the search engine is enabled this text is put in the header
- * of each page before the field where one can enter the text to search
- * for.
- */
- virtual QCString trSearchForIndex()
- {
- return "·j´M¯Á¤Þ";
- }
- /*! This string is used as the title for the page listing the search
- * results.
- */
- virtual QCString trSearchResultsTitle()
- {
- return "·j´Mµ²ªG";
- }
- /*! 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
- * the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
- * value 2 represents 2 or more matches. HTML markup is allowed inside
- * the returned string.
- */
- virtual QCString trSearchResults(int numDocuments)
- {
- if (numDocuments==0)
- {
- return "§ä¤£¨ì²Å¦Xªº¸ê®Æ.";
- }
- else if (numDocuments==1)
- {
- return "§ä¨ì <b>1</b> µ§²Å¦Xªº¸ê®Æ.";
- }
- else
- {
- return "§ä¨ì <b>$num</b> µ§²Å¦Xªº¸ê®Æ. "
- "¶V²Å¦Xªºµ²ªGÅã¥Ü¦b¶V«e­±.";
- }
- }
- /*! 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 "²Å¦X:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 filename + " ­ì©lµ{¦¡ÀÉ";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.9
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the name of the chapter containing the directory
- * hierarchy.
- */
- virtual QCString trDirIndex()
- { return "¥Ø¿ý¶¥¼h"; }
-
- /*! This is used as the name of the chapter containing the documentation
- * of the directories.
- */
- virtual QCString trDirDocumentation()
- { return "¥Ø¿ý»¡©ú¤å¥ó"; }
-
- /*! 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 "¥Ø¿ý"; }
-
- /*! This returns a sentences that introduces the directory hierarchy.
- * and the fact that it is sorted alphabetically per level
- */
- virtual QCString trDirDescription()
- { return "³o­Ó¥Ø¿ý¶¥¼h¸g¹L²²¤ªº¦r¥À±Æ§Ç: ";
- }
-
- /*! 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=dirName; result+=" ¥Ø¿ý°Ñ¦Ò¤å¥ó"; return result; }
-
- /*! 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*/)
- {
- return QCString("¥Ø¿ý");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "³o¬O¤@­Ó¬°¤F«K§Q©Ê©Ò´£¨Ñ overload ¦¨­û¨ç¼Æ¡A"
- "¥u¦³¦b±µ¨üªº°Ñ¼Æ¤W¡A»P«e¤@­Ó¨ç¼Æ¤£¦P.";
- }
-};
-
-#endif
diff --git a/src/translator_ua.h b/src/translator_ua.h
deleted file mode 100644
index 132955c..0000000
--- a/src/translator_ua.h
+++ /dev/null
@@ -1,1586 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- * The translation into Ukrainian was provided by
- * Olexij Tkatchenko (olexij.tkatchenko@parcs.de)
- */
-
-#ifndef TRANSLATOR_UA_H
-#define TRANSLATOR_UA_H
-
-class TranslatorUkrainian : public TranslatorAdapter_1_4_1
-{
- private:
- /*! The Decode() inline assumes the source written in the
- Koi8-U encoding (maintainer dependent).
- */
- inline QCString decode(const QCString & sInput)
- {
-#ifdef _WIN32
- return Koi8RToWindows1251(sInput);
-#else
- return sInput;
-#endif
- }
-
- public:
- /*! Used for identification of the language. */
- virtual QCString idLanguage()
- { return "ukrainian"; }
-
- /* Used to get the command(s) for the language support. */
- virtual QCString latexLanguageSupportCommand()
- {
-#ifdef _WIN32
- return "\\usepackage[cp1251]{inputenc}\n\\usepackage[ukrainian]{babel}\n";
-#else
- return "\\usepackage[koi8-u]{inputenc}\n\\usepackage[ukrainian]{babel}\n";
-#endif
- }
-
- /*! return the language charset. This will be used for the HTML output */
- virtual QCString idLanguageCharset()
- {
-#ifdef _WIN32
- return "Windows-1251";
-#else
- return "koi8-u";
-#endif
- }
-
- // --- Language translation methods -------------------
-
- /*! used in the compound documentation before a list of related functions. */
- virtual QCString trRelatedFunctions()
- { return decode("óÐÏÒ¦ÄÎÅΦ ÆÕËæ§"); }
-
- /*! subscript for the related functions. */
- virtual QCString trRelatedSubscript()
- { return decode("(ÎÅ ÍÅÔÏÄÉ ËÏÍÐÏÎÅÎÔ)"); }
-
- /*! header that is put before the detailed description of files, classes and namespaces. */
- virtual QCString trDetailedDescription()
- { return decode("äÅÔÁÌØÎÉÊ ÏÐÉÓ"); }
-
- /*! header that is put before the list of typedefs. */
- virtual QCString trMemberTypedefDocumentation()
- { return decode("ïÐÉÓ ÔÉÐ¦× ËÏÒÉÓÔÕ×ÁÞÁ"); }
-
- /*! header that is put before the list of enumerations. */
- virtual QCString trMemberEnumerationDocumentation()
- { return decode("ïÐÉÓ ÐÅÒÅÌ¦Ë¦× ËÏÒÉÓÔÕ×ÁÞÁ"); }
-
- /*! header that is put before the list of member functions. */
- virtual QCString trMemberFunctionDocumentation()
- { return decode("ïÐÉÓ ÍÅÔÏÄ¦× ËÏÍÐÏÎÅÎÔ"); }
-
- /*! header that is put before the list of member attributes. */
- virtual QCString trMemberDataDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode( "ðÏÌÑ" );
- }
- else
- {
- return decode( "ëÏÍÐÏÎÅÎÔΦ ÄÁΦ" );
- }
- }
-
- /*! this is the text of a link put after brief descriptions. */
- virtual QCString trMore()
- { return decode("äÅÔÁÌØΦÛÅ..."); }
-
- /*! put in the class documentation */
- /* Dosn't use when optimization for C is on. */
- virtual QCString trListOfAllMembers()
- {
- return decode( "óÐÉÓÏË ×Ó¦È ÅÌÅÍÅÎÔ¦×" );
- }
-
- /*! used as the title of the "list of all members" page of a class */
- /* Dosn't use when optimization for C is on. */
- virtual QCString trMemberList()
- {
- return decode( "CÐÉÓÏË ÅÌÅÍÅÎÔ¦×" );
- }
-
- /*! this is the first part of a sentence that is followed by a class name */
- /* Dosn't use when optimization for C is on. */
- virtual QCString trThisIsTheListOfAllMembers()
- { return decode("ðÏ×ÎÉÊ ÓÐÉÓÏË ÅÌÅÍÅÎÔ¦×"); }
-
- /*! this is the remainder of the sentence after the class name */
- /* Dosn't use when optimization for C is on. */
- virtual QCString trIncludingInheritedMembers()
- { return decode(", ×ËÌÀÞÁÀÞÉ ×Ó¦ ÕÓÐÁÄËÏ×ÁΦ ÅÌÅÍÅÎÔÉ"); }
-
- /*! this is put at the author sections at the bottom of man pages.
- * parameter s is name of the project name.
- */
- virtual QCString trGeneratedAutomatically(const char *s)
- { QCString result=decode("á×ÔÏÍÁÔÉÞÎÏ ÓÔ×ÏÒÅÎÏ ÚÁ ÄÏÐÏÍÏÇÏÀ Doxygen");
- if (s) result+=decode(" ÄÌÑ ")+s;
- result+=decode(" Ú ÔÅËÓÔÕ ÐÒÏÇÒÁÍÉ.");
- return result;
- }
-
- /*! put after an enum name in the list of all members */
- virtual QCString trEnumName()
- { return decode("ðÅÒÅ̦Ë"); }
-
- /*! put after an enum value in the list of all members */
- virtual QCString trEnumValue()
- { return decode("åÌÅÍÅÎÔ ÐÅÒÅ̦ËÕ"); }
-
- /*! put after an undocumented member in the list of all members */
- virtual QCString trDefinedIn()
- { return decode("×ÉÚÎÁÞÅÎÏ × "); }
-
- // quick reference sections
-
- /*! This is put above each page as a link to the list of all groups of
- * compounds or files (see the \\group command).
- */
- virtual QCString trModules()
- { return decode("ðÒÏÇÒÁÍΦ ÍÏÄÕ̦"); }
-
- /*! This is put above each page as a link to the class hierarchy */
- virtual QCString trClassHierarchy()
- { return decode("¶¤ÒÁÒÈ¦Ñ ËÌÁÓ¦×"); }
-
- /*! This is put above each page as a link to the list of annotated classes */
- virtual QCString trCompoundList()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode( "óÔÒÕËÔÕÒÉ ÄÁÎÉÈ" );
- }
- else
- {
- return decode( "ëÌÁÓÉ" );
- }
- }
-
- /*! This is put above each page as a link to the list of documented files */
- virtual QCString trFileList()
- { return decode("æÁÊÌÉ"); }
-
- /*! This is put above each page as a link to the list of all verbatim headers */
- virtual QCString trHeaderFiles()
- { return decode("úÁÇÏÌÏ×ÏÞΦ ÆÁÊÌÉ"); }
-
- /*! This is put above each page as a link to all members of compounds. */
- virtual QCString trCompoundMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode( "ðÏÌÑ ÓÔÒÕËÔÕÒ" );
- }
- else
- {
- return decode( "åÌÅÍÅÎÔÉ ËÌÁÓ¦×" );
- }
- }
-
- /*! This is put above each page as a link to all members of files. */
- /*??*/
- virtual QCString trFileMembers()
- {
- return decode( "åÌÅÍÅÎÔÉ ÆÁÊÌÕ" );
- }
-
- /*! This is put above each page as a link to all related pages. */
- virtual QCString trRelatedPages()
- /* ?? ÷ÁÒÉÁÎÔ ÐÅÒÅ×ÏÄÁ "óÍ. ÔÁËÖÅ: " ÂÏÌÅÅ ÕÄÁÞÎÙÊ, ÎÏ ÎÅ × ÚÁÇÏÌÏ×ËÅ,
- ËÁË × ÄÁÎÎÏÍ ÓÌÕÞÁÅ. */
- { return decode("äÏÄÁÔËÏ×Á ¦ÎÆÏÒÍÁæÑ"); }
-
- /*! This is put above each page as a link to all examples. */
- virtual QCString trExamples()
- { return decode("ðÒÉËÌÁÄÉ"); }
-
- /*! This is put above each page as a link to the search engine. */
- virtual QCString trSearch()
- { return decode("ðÏÛÕË"); }
-
- /*! This is an introduction to the class hierarchy. */
- virtual QCString trClassHierarchyDescription()
- { return decode("óÐÉÓÏË ÕÓÐÁÄËÕ×ÁÎØ ×ÐÏÒÑÄËÏ×ÁÎÏ ÎÁÂÌÉÖÅÎÏ ÄÏ ÁÌÆÁצÔÕ"); }
-
- /*! This is an introduction to the list with all files. */
- virtual QCString trFileListDescription(bool extractAll)
- {
- QCString result="ðÏ×ÎÉÊ ÓÐÉÓÏË ";
- if (!extractAll) result+="ÄÏËÕÍÅÎÔÏ×ÁÎÉÈ ";
- result+="ÆÁÊ̦×.";
- return decode(result);
- }
-
- /*! This is an introduction to the annotated compound list. */
- virtual QCString trCompoundListDescription()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode( "óÔÒÕËÔÕÒÉ ÄÁÎÉÈ Ú ËÏÒÏÔËÉÍ ÏÐÉÓÏÍ." );
- }
- else
- {
- return decode( "ëÌÁÓÉ, ÓÔÒÕËÔÕÒÉ, ÏÂ'¤ÄÎÁÎÎÑ ÔÁ ¦ÎÔÅÒÆÅÊÓÉ Ú ËÏÒÏÔËÉÍ ÏÐÉÓÏÍ." );
- }
- }
-
- /*! This is an introduction to the page with all class members. */
- virtual QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result="óÐÉÓÏË ×Ó¦È ";
- if(!extractAll) result+="ÄÏËÕÍÅÎÔÏÁÎÉÈ ";
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- result+="ÅÌÅÍÅÎÔ¦× ÓÔÒÕËÔÕÒ ÄÁÎÉÈ Ú ÐÏÓÉÌÁÎÎÑÍ ÎÁ ";
- else
- result+="ÅÌÅÍÅÎÔ¦× ËÌÁÓ¦× ÄÁÎÉÈ Ú ÐÏÓÉÌÁÎÎÑÍ ÎÁ ";
- if(extractAll)
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- result+="ÄÏËÕÍÅÎÔÁæÀ ÐÏ ÓÔÒÕËÔÕÒ¦/ÏÂ'¤ÄÎÁÎÎÀ ËÏÖÎÏÇÏ ÅÌÅÍÅÎÔÕ.";
- else
- result+="ÄÏËÕÍÅÎÔÁæÀ ÐÏ ËÌÁÓÕ ËÏÖÎÏÇÏ ÅÌÅÍÅÎÔÕ.";
- }
- else
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- result += "צÄÐÏצÄΦ ÓÔÒÕËÔÕÒÉ";
- else
- result += "צÄÐÏצÄΦ ËÌÁÓÉ";
- result+=", ÄÏ ÑËÉÈ ×ÏÎÉ ÎÁÌÅÖÁÔØ.";
- }
- return decode( result );
- }
-
- /*! This is an introduction to the page with all file members. */
- virtual QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="óÐÉÓÏË ×Ó¦È ";
- if (!extractAll) result+="ÄÏËÕÍÅÎÔÏ×ÁÎÉÈ ";
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="ÆÕÎËæÊ, ÚͦÎÎÉÈ, ÍÁËÒÏÏÚÎÁÞÅÎØ, "
- "ÐÅÒÅÌ¦Ë¦× ¦ ÏÚÎÁÞÅÎØ ÔÉЦ×";
- }
- else
- {
- result+="ÅÌÅÍÅÎÔ¦× ÆÁÊÌ¦× ";
- }
- result+=" Ú ÐÏÓÉÌÁÎÑÍ ÎÁ ";
- if (extractAll)
- result+="ÆÁÊÌÉ, ÄÏ ÑËÉÈ ×ÏÎÉ ÎÁÌÅÖÁÔØ.";
- else
- result+="ÄÏËÕÍÅÎÔÁæÀ.";
- return decode( result );
- }
-
- /*! This is an introduction to the page with the list of all header files. */
- virtual QCString trHeaderFilesDescription()
- { return decode("ðÏ×ÎÉÊ ÓÐÉÓÏË ÚÁÇÏÌÏ×ÏÞÎÉÈ ÆÁÊ̦×."); }
-
- /*! This is an introduction to the page with the list of all examples */
- virtual QCString trExamplesDescription()
- { return decode("ðÏ×ÎÉÊ ÓÐÉÓÏË ÐÒÉËÌÁĦ×."); }
-
- /*! This is an introduction to the page with the list of related pages */
- virtual QCString trRelatedPagesDescription()
- { return decode("ðÏ×ÎÉÊ ÓÐÉÓÏË ÄÏÄÁÔËÏ×ÉÈ ÏÐÉÓ¦×."); }
-
- /*! This is an introduction to the page with the list of class/file groups */
- virtual QCString trModulesDescription()
- { return decode("ðÏ×ÎÉÊ ÓÐÉÓÏË ÍÏÄÕ̦×."); }
-
- /*! This sentences is used in the annotated class/file lists if no brief
- * description is given.
- */
- virtual QCString trNoDescriptionAvailable()
- { return decode("ïÐÉÓ ×¦ÄÓÕÔΦÊ"); }
-
- // index titles (the project name is prepended for these)
-
-
- /*! This is used in HTML as the title of index.html. */
- virtual QCString trDocumentation()
- { return decode("äÏËÕÍÅÎÔÁæÑ"); }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all groups.
- */
- virtual QCString trModuleIndex()
- { return decode("áÌÆÁצÔÎÉÊ ÐÏËÁÖÞÉË ÍÏÄÕ̦×"); }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * class hierarchy.
- */
- virtual QCString trHierarchicalIndex()
- { return decode("¶¤ÒÁÒȦÞÎÉÊ ÐÏËÁÖÞÉË ËÌÁÓ¦×"); }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * annotated compound index.
- */
- virtual QCString trCompoundIndex()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode( "áÌÆÁצÔÎÉÊ ÐÏËÁÖÞÉË ÓÔÒÕËÔÕÒ ÄÁÎÉÈ" );
- }
- else
- {
- return decode( "áÌÆÁצÔÎÉÊ ÐÏËÁÖÞÉË ËÌÁÓ¦×" );
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * list of all files.
- */
- virtual QCString trFileIndex()
- { return decode( "ðÏËÁÖÞÉË ÆÁÊÌ×" ); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all groups.
- */
- virtual QCString trModuleDocumentation()
- { return decode("ðÒÏÇÒÁÍΦ íÏÄÕ̦"); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all classes, structs and unions.
- */
- virtual QCString trClassDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode( "óÔÒÕËÔÕÒÉ ÄÁÎÉÈ" );
- }
- else
- {
- return decode( "ëÌÁÓÉ" );
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all files.
- */
- virtual QCString trFileDocumentation()
- { return decode("æÁÊÌÉ"); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all examples.
- */
- virtual QCString trExampleDocumentation()
- { return decode("ðÒÉËÌÁÄÉ"); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all related pages.
- */
- virtual QCString trPageDocumentation()
- { return decode("äÏËÕÍÅÎÔÁÃ¦Ñ ÐÏ ÔÅͦ"); }
-
- /*! This is used in LaTeX as the title of the document */
- virtual QCString trReferenceManual()
- { return decode("äÏצÄËÏ×ÉÊ ÐÏÓ¦ÂÎÉË"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of defines
- */
- virtual QCString trDefines()
- { return decode("íÁËÒÏÏÚÎÁÞÅÎÎÑ"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of function prototypes
- */
- virtual QCString trFuncProtos()
- { return decode("ðÒÏÔÏÔÉÐÉ ÆÕËæÊ"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of typedefs
- */
- virtual QCString trTypedefs()
- { return decode("ïÚÎÁÞÅÎÎÑ ÔÉЦ×"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of enumerations
- */
- virtual QCString trEnumerations()
- { return decode("ðÅÒÅ̦ËÉ"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) functions
- */
- virtual QCString trFunctions()
- { return decode("æÕÎËæ§"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trVariables()
- { return decode("úͦÎΦ"); }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trEnumerationValues()
- { return decode("åÌÅÍÅÎÔÉ ÐÅÒÅ̦˦×"); }
-
- /*! This is used in the documentation of a file before the list of
- * documentation blocks for defines
- */
- virtual QCString trDefineDocumentation()
- { return decode("ïÐÉÓ ÍÁËÒÏÏÚÎÁÞÅÎØ"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for function prototypes
- */
- virtual QCString trFunctionPrototypeDocumentation()
- { return decode("ïÐÉÓ ÐÒÏÔÏÔÉÐ¦× ÆÕÎËæÊ"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for typedefs
- */
- virtual QCString trTypedefDocumentation()
- { return decode("ïÐÉÓ ÏÚÎÁÞÅÎØ ÔÉЦ×"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration types
- */
- virtual QCString trEnumerationTypeDocumentation()
- { return decode("ïÐÉÓ ÐÅÒÅ̦˦×"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration values
- */
- virtual QCString trEnumerationValueDocumentation()
- { return decode("ïÐÉÓ ÅÌÅÍÅÎÔ¦× ÐÅÒÅ̦ËÕ"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for functions
- */
- virtual QCString trFunctionDocumentation()
- { return decode("ïÐÉÓ ÆÕÎËæÊ"); }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for variables
- */
- virtual QCString trVariableDocumentation()
- { return decode("ïÐÉÓ ÚͦÎÎÉÈ"); }
-
- /*! This is used in the documentation of a file/namespace/group before
- * the list of links to documented compounds
- */
- virtual QCString trCompounds()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode( "óÔÒÕËÔÕÒÉ ÄÁÎÉÈ" );
- }
- else
- {
- return decode( "ëÌÁÓÉ" );
- }
-
- }
-
- /*! This is used in the documentation of a group before the list of
- * links to documented files
- */
- /*! This is used in the standard footer of each page and indicates when
- * the page was generated
- */
- virtual QCString trGeneratedAt(const char *date,const char *projName)
- {
- QCString result=decode("äÏËÕÍÅÎÔÁÃ¦Ñ ");
- if (projName) result+=decode("ÄÏ ")+projName;
- result+=decode(" ÓÔ×ÏÒÅÎÁ ")+date;
- result+=decode(" ÓÉÓÔÅÍÏÀ");
- return result;
- }
- /*! This is part of the sentence used in the standard footer of each page.
- */
- virtual QCString trWrittenBy()
- {
- return decode("á×ÔÏÒ:");
- }
-
- /*! this text is put before a class diagram */
- virtual QCString trClassDiagram(const char *clName)
- {
- return decode("óÈÅÍÁ ÕÓÐÁÄËÕ×ÁÎØ ÄÌÑ ")+clName;
- }
-
- /*! this text is generated when the \\internal command is used. */
- virtual QCString trForInternalUseOnly()
- { return decode("ô¦ÌØËÉ ÄÌÑ ×ÎÕÔÒ¦ÛÎØÏÇÏ ËÏÒÉÓÔÕ×ÁÎÎÑ"); }
-
- /*! this text is generated when the \\reimp command is used. */
- virtual QCString trReimplementedForInternalReasons()
- /*??*/
- { return decode("úͦÎÅÎÏ Ú ×ÎÕÔÒ¦ÛÎ¦È ÐÒÉÞÉÎ. úͦÎÉ ÎÅ ÔÏÒËÁÀÔØÓÑ API.");
- }
-
- /*! this text is generated when the \\warning command is used. */
- virtual QCString trWarning()
- { return decode("úÁÓÔÅÒÅÖÅÎÎÑ"); }
-
- /*! this text is generated when the \\bug command is used. */
- virtual QCString trBugsAndLimitations()
- { return decode("ðÏÍÉÌËÉ ÔÁ ÏÂÍÅÖÅÎÎÑ ÚÁÓÔÏÓÕ×ÁÎÎÑ"); }
-
- /*! this text is generated when the \\version command is used. */
- virtual QCString trVersion()
- { return decode("÷ÅÒÓ¦Ñ"); }
-
- /*! this text is generated when the \\date command is used. */
- virtual QCString trDate()
- { return decode("äÁÔÁ"); }
-
- /*! this text is generated when the \\return command is used. */
- virtual QCString trReturns()
- { return decode("ðÏ×ÅÒÔÁ¤"); }
-
- /*! this text is generated when the \\sa command is used. */
- virtual QCString trSeeAlso()
- { return decode("äÉ×. ÔÁËÏÖ"); }
-
- /*! this text is generated when the \\param command is used. */
- virtual QCString trParameters()
- { return decode("áÒÇÕÍÅÎÔÉ"); }
-
- /*! this text is generated when the \\exception command is used. */
- virtual QCString trExceptions()
- { return decode("ïÂÒÏÂËÁ ×ÉÎÑÔËÏ×ÉÈ ÓÉÔÕÁæÊ"); }
-
- /*! this text is used in the title page of a LaTeX document. */
- virtual QCString trGeneratedBy()
- { return decode("óÔ×ÏÒÅÎÏ ÓÉÓÔÅÍÏÀ"); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of page containing all the index of all namespaces. */
- virtual QCString trNamespaceList()
- { return decode("ðÒÏÓÔ¦Ò ¦ÍÅÎ"); }
-
- /*! used as an introduction to the namespace list */
- virtual QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="ðÏ×ÎÉÊ ÐÅÒÅÌ¦Ë ";
- if (!extractAll) result+="ÄÏËÕÍÅÎÔÏ×ÁÎÉÈ ";
- result+="ÐÒÏÓÔÏÒ¦× ¦ÍÅÎ.";
- return decode(result);
- }
-
- /*! used in the class documentation as a header before the list of all
- * friends of a class
- */
- virtual QCString trFriends()
- { return decode("äÒÕÖΦ ËÌÁÓÉ"); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in the class documentation as a header before the list of all
- * related classes
- */
- virtual QCString trRelatedFunctionDocumentation()
- { return decode("äÏËÕÍÅÎÔÁÃÉÑ ÄÏ ÄÒÕÖÎ¦È ËÌÁÓ¦× ÔÁ צÄÐÏצÄÎÉÈ ÆÕÎËæÊ"); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of the HTML page of a class/struct/union */
- virtual QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- {
- QCString result;
- if (isTemplate)
- {
- result="ûÁÂÌÏÎ ";
- switch(compType)
- {
- case ClassDef::Class: result+="ËÌÁÓÕ"; break;
- case ClassDef::Struct: result+="ÓÔÒÕËÔÕÒÉ"; break;
- case ClassDef::Union: result+="ÏÂ'¤ÄÎÁÎÎÑ"; break;
- case ClassDef::Interface: result+="¦ÎÔÅÒÆÅÊÓÕ"; break;
- case ClassDef::Protocol: result+="ÐÒÏÔÏËÏÌÕ"; break;
- case ClassDef::Category: result+="ËÁÔÅÇÏÒ¦§"; break;
- case ClassDef::Exception: result+="÷ÉÎÑÔÏË"; break;
- }
- }
- else
- {
- switch(compType)
- {
- case ClassDef::Class: result+="ëÌÁÓ"; break;
- case ClassDef::Struct: result+="óÔÒÕËÔÕÒÁ"; break;
- case ClassDef::Union: result+="ïÂ'¤ÄÎÁÎÎÑ"; break;
- case ClassDef::Interface: result+="¶ÎÔÅÒÆÅÊÓ"; break;
- case ClassDef::Protocol: result+="ðÒÏÔÏËÏÌ"; break;
- case ClassDef::Category: result+="ëÁÔÅÇÏÒ¦Ñ"; break;
- case ClassDef::Exception: result+="÷ÉÎÑÔÏË"; break;
- }
- }
- result+=" ";
- return decode(result)+clName;
- }
-
- /*! used as the title of the HTML page of a file */
- virtual QCString trFileReference(const char *fileName)
- {
- return decode("æÁÊÌ ")+fileName;
- }
-
- /*! used as the title of the HTML page of a namespace */
- virtual QCString trNamespaceReference(const char *namespaceName)
- {
- return decode("ðÒÏÓÔ¦Ò ¦ÍÅÎ ")+namespaceName;
- }
-
- virtual QCString trPublicMembers()
- { return decode("úÁÇÁÌØÎÏÄÏÓÔÕÐΦ ÅÌÅÍÅÎÔÉ"); }
- virtual QCString trPublicSlots()
- { return decode("úÁÇÁÌØÎÏÄÏÓÔÕÐΦ ÓÌÏÔÉ"); }
- virtual QCString trSignals()
- { return decode("óÉÇÎÁÌÉ"); }
- virtual QCString trStaticPublicMembers()
- { return decode("úÁÇÁÌØÎÏÄÏÓÔÕÐΦ ÓÔÁÔÉÞΦ ÅÌÅÍÅÎÔÉ"); }
- virtual QCString trProtectedMembers()
- { return decode("úÁÈÉÝÅΦ ÅÌÅÍÅÎÔÉ"); }
- virtual QCString trProtectedSlots()
- { return decode("úÁÈÉÝÅΦ ÓÌÏÔÉ"); }
- virtual QCString trStaticProtectedMembers()
- { return decode("úÁÈÉÝÅΦ ÓÔÁÔÉÞΦ ÅÌÅÍÅÎÔÉ"); }
- virtual QCString trPrivateMembers()
- { return decode("ðÒÉ×ÁÔΦ ÅÌÅÍÅÎÔÉ"); }
- virtual QCString trPrivateSlots()
- { return decode("ðÒÉ×ÁÔΦ ÓÌÏÔÉ"); }
- virtual QCString trStaticPrivateMembers()
- { return decode("ðÒÉ×ÁÔΦ ÓÔÁÔÉÞΦ ÅÌÅÍÅÎÔÉ"); }
-
- /*! this function is used to produce a comma-separated list of items.
- * use generateMarker(i) to indicate where item i should be put.
- */
- virtual QCString trWriteList(int numEntries)
- {
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=decode( " ¦ " );
- }
- }
- return result;
- }
-
- /*! used in class documentation to produce a list of base classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritsList(int numEntries)
- {
- return decode("õÓÐÁÄËÏ×Õ¤ ËÌÁÓ ")+trWriteList(numEntries)+".";
- }
-
- /*! used in class documentation to produce a list of super classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritedByList(int numEntries)
- {
- return decode("õÓÐÁÄËÏ×ÁÎÏ ËÌÁÓÁÍÉ ")+trWriteList(numEntries)+".";
- }
-
- /*! used in member documentation blocks to produce a list of
- * members that are hidden by this one.
- */
- virtual QCString trReimplementedFromList(int numEntries)
- {
- return decode("ðÅÒÅÏÚÎÁÞÅÎÎÑ Ú ")+trWriteList(numEntries)+".";
- }
-
- /*! used in member documentation blocks to produce a list of
- * all member that overwrite the implementation of this member.
- */
- virtual QCString trReimplementedInList(int numEntries)
- {
- return decode("ðÅÒÅÏÚÎÁÞÁ¤ÔØÓÑ × ")+trWriteList(numEntries)+".";
- }
-
- /*! This is put above each page as a link to all members of namespaces. */
- virtual QCString trNamespaceMembers()
- { return decode("åÌÅÍÅÎÔÉ ÐÒÏÓÔÏÒÕ ¦ÍÅÎ"); }
-
- /*! This is an introduction to the page with all namespace members */
- virtual QCString trNamespaceMemberDescription(bool extractAll)
- {
- QCString result="ðÏ×ÎÉÊ ÐÅÒÅÌ¦Ë ";
- if (!extractAll) result+="ÄÏËÕÍÅÎÔÏ×ÁÎÉÈ ";
- result+="ÅÌÅÍÅÔ¦× ÐÒÏÓÔÏÒÕ ¦ÍÅÎ Ú ÐÏÓÉÌÁÎÎÑÍ ";
- if (extractAll)
- result+="ÎÁ ÄÏËÕÍÅÎÔÁæÀ ÄÌÑ ËÏÖÎÏÇÏ ÅÌÅÍÅÎÔÕ:";
- else
- result+="ÎÁ ÐÒÏÓÔ¦Ò ¦ÍÅÎ ÄÏ ÑËÏÇÏ ×ÏÎÉ ÎÁÌÅÖÁÔØ:";
- return decode(result);
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all namespaces.
- */
- virtual QCString trNamespaceIndex()
- { return decode("áÌÆÁצÔÎÉÊ ÐÏËÁÖÞÉË ÐÒÏÓÔÏÒÕ ¦ÍÅÎ"); }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all namespaces.
- */
- virtual QCString trNamespaceDocumentation()
- { return decode("ïÐÉÓ ÐÒÏÓÔÏÒÕ ¦ÍÅÎ"); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- virtual QCString trNamespaces()
- { return decode( "ðÒÏÓÔÏÒÉ ¦ÍÅÎ" ); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990728
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is put at the bottom of a class documentation page and is
- * followed by a list of files that were used to generate the page.
- */
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)"äÏËÕÍÅÎÔÁÃ¦Ñ ";
- switch(compType)
- {
- case ClassDef::Class:
- if (single) result+="ÃØÏÇÏ ËÌÁÓÕ"; else result+="ÃÉÈ ËÌÁÓ¦×";
- break;
- case ClassDef::Struct:
- if (single) result+="椧 ÓÔÒÕËÔÕÒÉ"; else result+="ÃÉÈ ÓÔÒÕËÔÕÒ";
- break;
- case ClassDef::Union:
- if (single) result+="ÃØÏÇÏ ÏÂ'¤ÄÎÁÎÎÑ"; else result+="ÃÉÈ ÏÂ'¤ÄÎÁÎØ";
- break;
- case ClassDef::Interface:
- if (single) result+="ÃØÏÇÏ ¦ÎÔÅÒÆÅÊÓÕ"; else result+="ÃÉÈ ¦ÎÔÅÒÆÅÊÓ¦×";
- break;
- case ClassDef::Protocol:
- if (single) result+="ÃØÏÇÏ ÐÒÏÔÏËÏÌÕ"; else result+="ÃÉÈ ÐÒÏÔÏËÏ̦×";
- break;
- case ClassDef::Category:
- if (single) result+="椧 ËÁÔÅÇÏÒ¦§"; else result+="ÃÉÈ ËÁÔÅÇÏÒ¦Ê";
- break;
- case ClassDef::Exception:
- if (single) result+="ÃØÏÇÏ ×ÉÎÑÔËÕ"; else result+="ÃÉÈ ×ÉÎÑÔ˦×";
- break;
- }
- result+=" ÂÕÌÁ ÓÔ×ÏÒÅÎÁ Ú ÆÁÊÌ";
- if (single) result+="Õ:"; else result+="¦×:";
- return decode(result);
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- virtual QCString trAlphabeticalList()
- { return decode("áÌÆÁצÔÎÉÊ ÐÏËÁÖÞÉË"); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- virtual QCString trReturnValues()
- { return decode("úÎÁÞÅÎÎÑ, ÝÏ ÐÏ×ÅÒÔÁÀÔØÓÑ"); }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- virtual QCString trMainPage()
- { return decode("ôÉÔÕÌØÎÁ ÓÔÏÒ¦ÎËÁ"); }
-
- /*! This is used in references to page that are put in the LaTeX
- * documentation. It should be an abbreviation of the word page.
- */
- virtual QCString trPageAbbreviation()
- { return decode("ÓÔÏÒ."); }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991106
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trSources()
- {
- return decode("÷ÉȦÄΦ ÔÅËÓÔÉ.");
- }
- virtual QCString trDefinedAtLineInSourceFile()
- {
- return decode("äÉ×. ÏÚÎÁÞÅÎÎÑ × ÆÁÊ̦ @1, ÒÑÄÏË @0");
- }
- virtual QCString trDefinedInSourceFile()
- {
- return decode("äÉ×. ÏÚÎÁÞÅÎÎÑ × ÆÁÊ̦ @0");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDeprecated()
- {
- return decode("îÅ ÒÅËÏÍÅÎÄÏ×ÁÎÏ");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- virtual QCString trCollaborationDiagram(const char *clName)
- {
- return (QCString)decode("ä¦ÁÇÒÁÍÁ Ú×'ÑÚË¦× ËÌÁÓÕ ")+clName+":";
- }
- /*! this text is put before an include dependency graph */
- virtual QCString trInclDepGraph(const char *fName)
- {
- return decode("ä¦ÁÇÒÁÍÁ ×ËÌÀÞÅÎÉÈ ÚÁÇÏÌÏ×ÏÞÎÉÈ ÆÁÊÌ¦× ÄÌÑ ")+fName+":";
- }
- /*! header that is put before the list of constructor/destructors. */
- virtual QCString trConstructorDocumentation()
- {
- return decode("ëÏÎÓÔÒÕËÔÏÒ(É)");
- }
- /*! Used in the file documentation to point to the corresponding sources. */
- virtual QCString trGotoSourceCode()
- {
- return decode("äÉ×. ×ÉȦÄΦ ÔÅËÓÔÉ.");
- }
- /*! Used in the file sources to point to the corresponding documentation. */
- virtual QCString trGotoDocumentation()
- {
- return decode("äÉ×. ÄÏËÕÍÅÎÔÁæÀ.");
- }
- /*! Text for the \\pre command */
- virtual QCString trPrecondition()
- {
- return decode("ðÅÒÅÄÕÍÏ×É");
- }
- /*! Text for the \\post command */
- virtual QCString trPostcondition()
- {
- return decode("ð¦ÓÌÑÕÍÏ×É");
- }
- /*! Text for the \\invariant command */
- virtual QCString trInvariant()
- {
- return decode("¶Î×ÁÒ¦ÁÎÔ");
- }
- /*! Text shown before a multi-line variable/enum initialization */
- virtual QCString trInitialValue()
- {
- return decode("ðÏÞÁÔËÏצ ÚÎÁÞÅÎÎÑ");
- }
- /*! Text used the source code in the file index */
- virtual QCString trCode()
- {
- return decode("÷ÉȦÄΦ ÔÅËÓÔÉ");
- }
- virtual QCString trGraphicalHierarchy()
- {
- return decode("çÒÁƦÞÎÁ ¦¤ÒÁÒÈ¦Ñ ËÌÁÓ¦×");
- }
- virtual QCString trGotoGraphicalHierarchy()
- {
- return decode("ÄÉ×. ÇÒÁƦÞÎÕ ¦¤ÒÁÒȦÀ");
- }
- virtual QCString trGotoTextualHierarchy()
- {
- return decode("ÄÉ×. ÔÅËÓÔÏ×Õ ¦¤ÒÁÒȦÀ");
- }
- virtual QCString trPageIndex()
- {
- return decode("áÌÆÁצÔÎÉÊ ÐÏËÁÖÞÉË ÔÅÍÁÔÉÞÎÉÈ ÏÐÉÓ¦×");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trNote()
- {
- return decode("îÏÔÁÔËÉ");
- }
- virtual QCString trPublicTypes()
- {
- return decode("úÁÇÁÌØÎÏÄÏÓÔÕÐΦ ÔÉÐÉ");
- }
- virtual QCString trPublicAttribs()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode( "ðÏÌÑ ÄÁÎÉÈ" );
- }
- else
- {
- return decode( "úÁÇÁÌØÎÏÄÏÓÔÕÐΦ ÁÔÒÉÂÕÔÉ" );
- }
- }
- virtual QCString trStaticPublicAttribs()
- {
- return decode("óÔÁÔÉÞΦ ÚÁÇÁÌØÎÏÄÏÓÔÕÐΦ ÄÁÎΦ");
- }
- virtual QCString trProtectedTypes()
- {
- return decode("úÁÈÉÝÅΦ ÔÉÐÉ");
- }
- virtual QCString trProtectedAttribs()
- {
- return decode("úÁÈÉÝÅΦ ÄÁΦ");
- }
- virtual QCString trStaticProtectedAttribs()
- {
- return decode("óÔÁÔÉÞΦ ÚÁÈÉÝÅΦ ÄÁΦ");
- }
- virtual QCString trPrivateTypes()
- {
- return decode("ðÒÉ×ÁÔΦ ÔÉÐÉ");
- }
- virtual QCString trPrivateAttribs()
- {
- return decode("ðÒÉ×ÁÔΦ ÄÁΦ");
- }
- virtual QCString trStaticPrivateAttribs()
- {
- return decode("ðÒÉ×ÁÔΦ ÓÔÁÔÉÞΦ ÄÁΦ");
- }
-
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a todo item */
- virtual QCString trTodo()
- /*??*/
- {
- return decode("îÅÏÂȦÄÎÏ ÚÒÏÂÉÔÉ");
- }
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- /*??*/
- {
- return decode("ðÅÒÅÌ¦Ë ÚÁ×ÄÁÎØ");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy()
- {
- return decode("÷ÖÉ×Á¤ÔØÓÑ ×");
- }
- virtual QCString trRemarks()
- {
- return decode("ðÒÉÍ.");
- }
- virtual QCString trAttention()
- {
- return decode("õ×ÁÇÁ");
- }
- virtual QCString trInclByDepGraph()
- {
- return decode("çÒÁÆ ÆÁÊ̦×, Ñ˦ ×ËÌÀÞÁÀÔØ ÃÅÊ ÆÁÊÌ:");
- }
- virtual QCString trSince()
- /*??*/
- {
- return decode("ðÏÞÉÎÁÀÞÉ Ú");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- virtual QCString trLegendTitle()
- {
- return decode("ìÅÇÅÎÄÁ");
- }
- /*! page explaining how the dot graph's should be interpreted */
- virtual QCString trLegendDocs()
- {
- return decode(
- "ðÏÚÎÁÞÅÎÎÑ, ÝÏ ×ÉËÏÒÉÓÔÏ×ÕÀÔØÓÑ Õ ÇÒÁÆÁÈ.<p>\n"
- "òÏÚÇÌÑÎÅÍÏ ÎÁÓÔÕÐÎÉÊ ÐÒÉËÌÁÄ:\n"
- "\\code\n"
- "/*! îÅ×ÉÄÉÍÉÊ ËÌÁÓ ÞÅÒÅÚ ÚÒ¦ÚÁÎÎÑ */\n"
- "class Invisible { };\n\n"
- "/*! ïÂÍÅÖÅÎÉÊ ËÌÁÓ, צÄÎÏÛÅÎÎÑ ÕÓÐÁÄËÕ×ÁÎÎÑ ÐÒÉÈÏ×ÁÎÅ */\n"
- "class Truncated : public Invisible { };\n\n"
- "/* îÅÄÏËÕÍÅÎÔÏ×ÁÎÉÊ ËÌÁÓ */\n"
- "class Undocumented { };\n\n"
- "/*! úÁÇÁÌØÎÏÄÏÓÔÕÐÎÅ ÕÓÐÁÄËÕ×ÁÎÎÑ */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! úÁÈÉÝÅÎÅ ÕÓÐÁÄËÕ×ÁÎÎÑ */\n"
- "class ProtectedBase { };\n\n"
- "/*! ðÒÉ×ÁÔÎÅ ÕÓÐÁÄËÕ×ÁÎÎÑ */\n"
- "class PrivateBase { };\n\n"
- "/*! ëÌÁÓ, ÝÏ ×ÉËÏÒÉÓÔÏ×Õ¤ÔØÓÑ ËÌÁÓÏÍ Inherited */\n"
- "class Used { };\n\n"
- "/*! ëÌÁÓ, ÝÏ ÕÓÐÁÄËÏ×Õ¤ ¦ÎÛ¦ ËÌÁÓÉ */\n"
- "class Inherited : public PublicBase,\n"
- " protected ProtectedBase,\n"
- " private PrivateBase,\n"
- " public Undocumented\n"
- "{\n"
- " private:\n"
- " Used *m_usedClass;\n"
- "};\n"
- "\\endcode\n"
- "ñËÝÏ \\c MAX_DOT_GRAPH_HEIGHT × ËÏÎƦÇÕÒÁæÊÎÏÍÕ ÆÁÊ̦ "
- "ÕÓÔÁÎÏ×ÌÅÎÅ ÎÁ 200, ÏÔÒÉÍÁ¤ÍÏ ÎÁÓÔÕÐÎÉÊ ÇÒÁÆ:"
- "<p><center><img src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
- "ðÒÑÍÏËÕÔÎÉËÉ × ÃØÏÍÕ ÇÒÁƦ ÍÁÀÔØ ÎÁÓÔÕÐÎÉÊ ÚͦÓÔ:\n"
- "<ul>\n"
- "<li>úÁÐÏ×ÎÅÎÉÊ ÞÏÒÎÉÊ ÐÒÑÍÏËÕÔÎÉË ×¦ÄÏÂÒÁÖÁ¤ ÓÔÒÕËÔÕÒÕ ÁÂÏ ËÌÁÓ, "
- "ÄÌÑ ÑËÏÇÏ ÓÔ×ÏÒÅÎÏ ÇÒÁÆ.\n"
- "<li>ðÒÑÍÏËÕÔÎÉË Ú ÞÏÒÎÏÀ ÍÅÖÅÀ צÄÏÂÒÁÖÁ¤ ÄÏËÕÍÅÎÔÏ×ÁÎÕ ÓÔÒÕËÔÕÒÕ ÁÂÏ ËÌÁÓ.\n"
- "<li>ðÒÑÍÏËÕÔÎÉË Ú Ó¦ÒÏÀ ÍÅÖÅÀ צÄÏÂÒÁÖÁ¤ ÎÅÄÏËÕÍÅÎÔÏ×ÁÎÕ ÓÔÒÕËÔÕÒÕ ÁÂÏ ËÌÁÓ.\n"
- "<li>ðÒÑÍÏËÕÔÎÉË Ú ÞÅÒ×ÏÎÏÀ ÍÅÖÅÀ צÄÏÂÒÁÖÁ¤ ÄÏËÕÍÅÎÔÏ×ÁÎÕ ÓÔÒÕËÔÕÒÕ ÁÂÏ ËÌÁÓ, ÄÌÑ ÑËÉÈ\n"
- " ÎÅ ×Ó¦ ÓЦ×צÄÎÏÛÅÎÎÑ ÕÓÐÁÄËÕ×ÁÎÎÑ/ÚͦÓÔÕ ÐÏËÁÚÁΦ. çÒÁÆ ÚÒ¦ÚÁÎÉê, "
- "ÑËÝÏ ×¦Î ÎÅ ×ͦÝÁ¤ÔØÓÑ Õ ×ËÁÚÁΦ ÍÅÖ¦."
- "</ul>\n"
- "óÔÒ¦ÌËÉ ÍÁÀÔØ ÎÁÓÔÕÐÎÉÊ ÚͦÓÔ:\n"
- "<ul>\n"
- "<li>ôÅÍÎÏÓÉÎÑ ÓÔÒ¦ÌËÁ צÄÏÂÒÁÖÁ¤ צÄÎÏÛÅÎÎÑ ÚÁÇÁÌØÎÏÄÏÓÔÕÐÎÏÇÏ ÕÓÐÁÄËÕ×ÁÎÎÑ "
- "Í¦Ö Ä×ÏÍÁ ËÌÁÓÁÍÉ.\n"
- "<li>ôÅÍÎÏÚÅÌÅÎÁ ÓÔÒ¦ÌËÁ ×ÉËÏÒÉÓÔÏ×Õ¤ÔØÓÑ ÐÒÉ ÚÁÈÉÝÅÎÏÍÕ ÕÓÐÁÄËÕ×ÁÎΦ.\n"
- "<li>ôÅÍÎÏÞÅÒ×ÏÎÁ ÓÔÒ¦ÌËÁ ×ÉËÏÒÉÓÔÏ×Õ¤ÔØÓÑ ÐÒÉ ÐÒÉ×ÁÔÎÏÍÕ ÕÓÐÁÄËÕ×ÁÎΦ.\n"
- "<li>ðÕÒÐÕÒÎÁ ÓÔÒ¦ÌËÁ ×ÉËÏÒÉÓÔÏ×Õ¤ÔØÓÑ, ÑËÝÏ ËÌÁÓ Í¦ÓÔÉÔØÓÑ ×"
- "¦ÎÛÏÍÕ ËÌÁÓ¦ ÁÂÏ ÎÉÍ ×ÉËÏÒÉÓÔÏ×Õ¤ÔØÓÑ."
- "óÔÒ¦ÌËÁ ÅÔÉËÅÔÕ¤ÔØÓÑ ÚͦÎÎÏÀ, "
- "ÞÅÒÅÚ ÑËÕ ×¦ÄÂÕ×Á¤ÔØÓÑ ÄÏÓÔÕÐ ÄÏ ×ËÁÚÁÎϧ ÓÔÒÕËÔÕÒÉ ÁÂÏ ËÌÁÓÕ. \n"
- "</ul>\n");
- }
- /*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return decode("ÄÉ×. ÌÅÇÅÎÄÕ");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return decode("ôÅÓÔ");
- }
- /*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return decode("ðÅÒÅÌ¦Ë ÔÅÓÔ¦×");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return decode("DCOP íÅÔÏÄÉ");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return decode("÷ÌÁÓÔÉ×ÏÓÔ¦");
- }
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return decode("ðÏ×ÎÉÊ ÐÅÒÅÌ¦Ë ×ÌÁÓÔÉ×ÏÓÔÅÊ");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java interfaces in the summary section of Java packages */
- virtual QCString trInterfaces()
- {
- return decode("¶ÎÔÅÒÆÅÊÓÉ");
- }
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return decode( "óÔÒÕËÔÕÒÉ ÄÁÎÉÈ" );
- }
- else
- {
- return decode( "ëÌÁÓÉ" );
- }
- }
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
- {
- return decode("ðÁËÅÔ ")+name;
- }
- /*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return decode("ðÏ×ÎÉÊ ÐÅÒÅÌ¦Ë ÐÁËÅÔ¦×");
- }
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return decode("ðÏ×ÎÉÊ ÐÅÒÅÌ¦Ë ÄÏËÕÍÅÎÔÏ×ÁÎÉÈ ÐÁËÅÔ¦×.");
- }
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return decode("ðÁËÅÔÉ");
- }
- /*! Used as a chapter title for Latex & RTF output */
- virtual QCString trPackageDocumentation()
- {
- return decode("ïÐÉÓ ÐÁËÅÔ¦×");
- }
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return decode("íÁËÒÏÏÚÎÁÞÅÎÎÑ:");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return decode("äÅÆÅËÔ");
- }
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return decode("ðÅÒÅÌ¦Ë ÄÅÆÅËÔ¦×");
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6
-//////////////////////////////////////////////////////////////////////////
- /*! Used as ansicpg for RTF file */
- virtual QCString trRTFansicp()
- {
- return "1251";
- }
- /*! Used as ansicpg for RTF fcharset */
- virtual QCString trRTFCharSet()
- {
- return "204";
- }
- /*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return decode("ðÒÅÄÍÅÔÎÉÊ ÐÏËÁÖÞÉË");
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trClass(bool first_capital, bool singular)
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- QCString result((first_capital ? "óÔÒÕËÔÕÒÉ ÄÁÎÉÈ" : "ÓÔÒÕËÔÕÒÉ ÄÁÎÉÈ"));
- return decode(result);
- }
- else
- {
- QCString result((first_capital ? "ëÌÁÓ" : "ËÌÁÓ"));
- if(!singular) result+="É";
- return decode(result);
- }
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trFile(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "æÁÊÌ" : "ÆÁÊÌ"));
- if (!singular) result+="É";
- return decode(result);
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trNamespace(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "ðÒÏÓÔ" : "ÐÒÏÓÔ"));
- result+=(singular?"¦Ò ¦ÍÅÎ":"ÏÒÉ ¦ÍÅÎ");
- return decode(result);
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trGroup(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "çÒÕÐ" : "ÇÒÕÐ"));
- result+=(singular ? "Á" : "É");
- return decode(result);
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trPage(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "óÔÏÒ¦ÎË" : "ÓÔÏÒ¦ÎË"));
- result+=(singular ? "Á" : "É");
- return decode(result);
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trMember(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "åÌÅÍÅÎÔ" : "ÅÌÅÍÅÎÔ"));
- if (!singular) result+="É";
- return decode(result);
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trField(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "ðÏÌ" : "ÐÏÌ"));
- result+=(singular ? "Å" : "Ñ");
- return decode(result);
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trGlobal(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "çÌÏÂÁÌØÎ" : "ÇÌÏÂÁÌØÎ"));
- result+=(singular ? "ÉÊ" : "¦");
- return decode(result);
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is generated when the \\author command is used and
- * for the author section in man pages. */
- virtual QCString trAuthor(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "á×ÔÏÒ" : "Á×ÔÏÒ"));
- if (!singular) result+="É";
- return decode(result);
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return "÷ÉËÏÒÉÓÔÏ×Õ¤";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "òÅÁ̦ÚÕ¤ " + 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 "òÅÁ̦ÚÕ¤ × " + trWriteList(numEntries) + ".";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.16
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in RTF documentation as a heading for the Table
- * of Contents.
- */
- virtual QCString trRTFTableOfContents()
- {
- return "úͦÓÔ";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.17
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as the header of the list of item that have been
- * flagged deprecated
- */
- virtual QCString trDeprecatedList()
- {
- return "úÁÓÔÁҦ̦ ÅÌÅÍÅÎÔÉ";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.18
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a header for declaration section of the events found in
- * a C# program
- */
- virtual QCString trEvents()
- {
- return "ðÏĦ§";
- }
-
- /*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- return "äÏËÕÍÅÎÔÁÃ¦Ñ ÐÏĦÊ";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a heading for a list of Java class types with package scope.
- */
- virtual QCString trPackageTypes()
- {
- return "ôÉÐÉ ÐÁËÅÔ¦×";
- }
-
- /*! Used as a heading for a list of Java class functions with package
- * scope.
- */
- virtual QCString trPackageMembers()
- {
- return "æÕÎËæ§ ÐÁËÅÔ¦×";
- }
-
- /*! Used as a heading for a list of static Java class functions with
- * package scope.
- */
- virtual QCString trStaticPackageMembers()
- {
- return "óÔÁÔÉÞΦ ÆÕÎËæÀ ÐÁËÅÔ¦×";
- }
-
- /*! Used as a heading for a list of Java class variables with package
- * scope.
- */
- virtual QCString trPackageAttribs()
- {
- return "áÔÒÉÂÕÔÉ ÐÁËÅÔ¦×";
- }
-
- /*! Used as a heading for a list of static Java class variables with
- * package scope.
- */
- virtual QCString trStaticPackageAttribs()
- {
- return "óÔÁÔÉÞΦ ÁÔÒÉÂÕÔÉ ÐÁËÅÔ¦×";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "÷Ó¦";
- }
- /*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- return "çÒÁÆ ×Ó¦È ×ÉËÌÉË¦× Ã¦¤§ ÆÕÎËæ§:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! When the search engine is enabled this text is put in the header
- * of each page before the field where one can enter the text to search
- * for.
- */
- virtual QCString trSearchForIndex()
- {
- return "ûÕËÁÔÉ";
- }
- /*! This string is used as the title for the page listing the search
- * results.
- */
- virtual QCString trSearchResultsTitle()
- {
- return "òÅÚÕÌØÔÁÔÉ ÐÏÛÕËÕ";
- }
- /*! 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
- * the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
- * value 2 represents 2 or more matches. HTML markup is allowed inside
- * the returned string.
- */
- virtual QCString trSearchResults(int numDocuments)
- {
- if (numDocuments==0)
- {
- return "îÅ ÚÎÁÊÄÅÎÏ ÄÏËÕÍÅÎÔ¦× ×¦ÄÐÏצÄÎÏ ÄÏ ×ÁÛÏÇÏ ÚÁÐÉÔÕ.";
- }
- else if (numDocuments==1)
- {
- return "âÕÌÏ ÚÎÁÊÄÅÎÏ <b>1</b> ÄÏËÕÍÅÎÔ ×¦ÄÐÏצÄÎÏ ÄÏ ×ÁÛÏÇÏ ÚÁÐÉÔÕ.";
- }
- else
- {
- return "âÕÌÏ ÚÎÁÊÄÅÎÏ <b>$num</b> ÄÏËÕÍÅÎÔ¦× ×¦ÄÐÏצÄÎÏ ÄÏ ×ÁÛÏÇÏ ÚÁÐÉÔÕ. "
- "îÁÊËÒÁݦ צÄÐÏצÄÎÏÓÔ¦ ÐÏËÁÚÁÎÏ ÓÐÏÞÁÔËÕ.";
- }
- }
- /*! 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 "÷¦ÄÐÏצÄΦÓÔØ:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "ôÅËÓÔ ÐÒÏÇÒÁÍÉ "+filename;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.9
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the name of the chapter containing the directory
- * hierarchy.
- */
- virtual QCString trDirIndex()
- { return "äÅÒÅ×Ï ËÁÔÁÌÏǦ×"; }
-
- /*! This is used as the name of the chapter containing the documentation
- * of the directories.
- */
- virtual QCString trDirDocumentation()
- { return "äÏËÕÍÅÎÔÁÃ¦Ñ ËÁÔÁÌÏǦ×"; }
-
- /*! 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 "ëÁÔÁÌÏÇÉ"; }
-
- /*! This returns a sentences that introduces the directory hierarchy.
- * and the fact that it is sorted alphabetically per level
- */
- virtual QCString trDirDescription()
- { return "äÅÒÅ×Ï ËÁÔÁÌÏÇ¦× ×ÐÏÒÑÄËÏ×ÁÎÏ ÎÁÂÌÉÖÅÎÏ "
- "ÄÏ ÁÌÆÁצÔÕ:";
- }
-
- /*! 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="äÏצÄÎÉË ËÁÔÁÌÏÇÕ "; result+=dirName; return result; }
-
- /*! This returns the word directory with or without starting capital
- * (\a first_capital) and in sigular or plural form (\a singular).
- */
- virtual QCString trDir(bool, bool singular)
- {
- QCString result("ëÁÔÁÌÏÇ");
- if (!singular) result+="É";
- return result;
- }
-
-};
-
-#endif
-
diff --git a/src/translator_za.h b/src/translator_za.h
deleted file mode 100644
index e09390d..0000000
--- a/src/translator_za.h
+++ /dev/null
@@ -1,1555 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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.
- *
- */
-
- /*
- * Bronne vir hierdie vertaling (Sources for this translation):
- * Die Stigting vir Afrikaans se rekenaartermelys:
- * - http://www.afrikaans.com/rekenaarterme.html
- * Werkgroep vir Afrikaanse IT-terme:
- * - http://www.vertaal.org/index.html
- */
-
-#ifndef TRANSLATOR_ZA_H
-#define TRANSLATOR_ZA_H
-
-class TranslatorAfrikaans : public Translator
-{
- public:
-
- // --- Language control methods -------------------
-
- /*! Used for identification of the language. The identification
- * should not be translated. It should be replaced by the name
- * of the language in English using lower-case characters only
- * (e.g. "czech", "japanese", "russian", etc.). It should be equal to
- * the identification used in language.cpp.
- */
- virtual QCString idLanguage()
- { return "afrikaans"; }
-
- /*! Used to get the LaTeX command(s) for the language support.
- * This method should return string with commands that switch
- * LaTeX to the desired language. For example
- * <pre>"\\usepackage[german]{babel}\n"
- * </pre>
- * or
- * <pre>"\\usepackage{polski}\n"
- * "\\usepackage[latin2]{inputenc}\n"
- * "\\usepackage[T1]{fontenc}\n"
- * </pre>
- *
- * The Afrikaans LaTeX does not use such commands. Because of this
- * the empty string is returned in this implementation.
- */
- virtual QCString latexLanguageSupportCommand()
- {
- //should we use return "\\usepackage[afrikaans]{babel}\n";
- // not sure - for now return an empty string
- return "";
- }
-
- /*! return the language charset. This will be used for the HTML output */
- virtual QCString idLanguageCharset()
- {
- return "iso-8859-1";
- }
-
- // --- Language translation methods -------------------
-
- /*! used in the compound documentation before a list of related functions. */
- virtual QCString trRelatedFunctions()
- { return "Verwante Funksies"; }
-
- /*! subscript for the related functions. */
- virtual QCString trRelatedSubscript()
- { return "(Let daarop dat hierdie nie lede funksies is nie.)"; }
-
- /*! header that is put before the detailed description of files, classes and namespaces. */
- virtual QCString trDetailedDescription()
- { return "Detail Beskrywing"; }
-
- /*! header that is put before the list of typedefs. */
- virtual QCString trMemberTypedefDocumentation()
- { return "Lede Typedef Dokumentasie"; }
-
- /*! header that is put before the list of enumerations. */
- virtual QCString trMemberEnumerationDocumentation()
- { return "Lede Enumerasie Dokumentasie"; }
-
- /*! header that is put before the list of member functions. */
- virtual QCString trMemberFunctionDocumentation()
- { return "Lede Funksie Dokumentasie"; }
-
- /*! header that is put before the list of member attributes. */
- virtual QCString trMemberDataDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Veld Dokumentasie";
- }
- else
- {
- return "Lede Data Dokumentasie";
- }
- }
-
- /*! this is the text of a link put after brief descriptions. */
- virtual QCString trMore()
- { return "Meer detail..."; }
-
- /*! put in the class documentation */
- virtual QCString trListOfAllMembers()
- { return "Lys van alle lede."; }
-
- /*! used as the title of the "list of all members" page of a class */
- virtual QCString trMemberList()
- { return "Lede Lys"; }
-
- /*! this is the first part of a sentence that is followed by a class name */
- virtual QCString trThisIsTheListOfAllMembers()
- { return "Hierdie is 'n volledige lys van lede vir "; }
-
- /*! this is the remainder of the sentence after the class name */
- virtual QCString trIncludingInheritedMembers()
- { return ", insluitend alle afgeleide lede."; }
-
- /*! 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="Automaties gegenereer deur Doxygen";
- if (s) result+=(QCString)" vir "+s;
- result+=" van die bron kode af.";
- return result;
- }
-
- /*! put after an enum name in the list of all members */
- virtual QCString trEnumName()
- { return "enum naam"; }
-
- /*! put after an enum value in the list of all members */
- virtual QCString trEnumValue()
- { return "enum waarde"; }
-
- /*! put after an undocumented member in the list of all members */
- virtual QCString trDefinedIn()
- { return "gedefinie&euml;r in"; }
-
- // 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"; }
-
- /*! This is put above each page as a link to the class hierarchy */
- virtual QCString trClassHierarchy()
- { return "Klas Hierargie"; }
-
- /*! This is put above each page as a link to the list of annotated classes */
- virtual QCString trCompoundList()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Data Strukture";
- }
- else
- {
- return "Klas Lys";
- }
- }
-
- /*! This is put above each page as a link to the list of documented files */
- virtual QCString trFileList()
- { return "Le&euml;r Lys"; }
-
- /*! This is put above each page as a link to all members of compounds. */
- virtual QCString trCompoundMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Data Velde";
- }
- else
- {
- return "Klas Lede";
- }
- }
-
- /*! This is put above each page as a link to all members of files. */
- virtual QCString trFileMembers()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Globals";
- }
- else
- {
- return "Le&euml;r Lede";
- }
- }
-
- /*! This is put above each page as a link to all related pages. */
- virtual QCString trRelatedPages()
- { return "Verwante Bladsye"; }
-
- /*! This is put above each page as a link to all examples. */
- virtual QCString trExamples()
- { return "Voorbeelde"; }
-
- /*! This is put above each page as a link to the search engine. */
- virtual QCString trSearch()
- { return "Soek"; }
-
- /*! This is an introduction to the class hierarchy. */
- virtual QCString trClassHierarchyDescription()
- {
- return "Hierdie afgeleide lys word rofweg gesorteer: ";
- }
-
- /*! This is an introduction to the list with all files. */
- virtual QCString trFileListDescription(bool extractAll)
- {
- QCString result="Hier is 'n lys van alle ";
- if (!extractAll) result+="gedokumenteerde ";
- result+="le&euml;rs met kort beskrywings:";
- return result;
- }
-
- /*! This is an introduction to the annotated compound list. */
- virtual QCString trCompoundListDescription()
- {
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return " Data strukture met kort beskrywings:";
- }
- else
- {
- return "Klasse, structs, "
- "unions en intervlakke met kort beskrywings:";
- }
- }
-
- /*! This is an introduction to the page with all class members. */
- virtual QCString trCompoundMembersDescription(bool extractAll)
- {
- QCString result="'n Lys van alle ";
- if (!extractAll)
- {
- result+="gedokumenteerde ";
- }
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="struct en union velde";
- }
- else
- {
- result+="klas lede";
- }
- result+=" met skakels na ";
- if (!extractAll)
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="die struct/union dokumentasie vir elke veld:";
- }
- else
- {
- result+="die klas dokumentasie vir elke lid:";
- }
- }
- else
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="die structures/unions waaraan hulle behoort:";
- }
- else
- {
- result+="die klasse waaraan hulle behoort:";
- }
- }
- return result;
- }
-
- /*! This is an introduction to the page with all file members. */
- virtual QCString trFileMembersDescription(bool extractAll)
- {
- QCString result="'n Lys van alle ";
- if (!extractAll) result+="gedokumenteerde ";
-
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- result+="funksies, veranderlikes, defines, enums, en typedefs";
- }
- else
- {
- result+="le&euml;r lede";
- }
- result+=" met skakels na ";
- if (extractAll)
- result+="die le&euml;rs waaraan hulle behoort:";
- else
- result+="die dokumentasie:";
- return result;
- }
-
- /*! This is an introduction to the page with the list of all examples */
- virtual QCString trExamplesDescription()
- { return "'n Lys van alle voorbeelde:"; }
-
- /*! This is an introduction to the page with the list of related pages */
- virtual QCString trRelatedPagesDescription()
- { return "'n Lys van alle verwante dokumentasie:"; }
-
- /*! This is an introduction to the page with the list of class/file groups */
- virtual QCString trModulesDescription()
- { return "'n Lys van alle modules:"; }
-
- /*! This is used in HTML as the title of index.html. */
- virtual QCString trDocumentation()
- { return "Dokumentasie"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all groups.
- */
- virtual QCString trModuleIndex()
- { return "Module Indeks"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * class hierarchy.
- */
- virtual QCString trHierarchicalIndex()
- { return "Hierargiese Indeks"; }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * annotated compound index.
- */
- virtual QCString trCompoundIndex()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Data Strukture Indeks";
- }
- else
- {
- return "Klas Indeks";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter with the
- * list of all files.
- */
- virtual QCString trFileIndex()
- { return "Le&euml;r Indeks"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all groups.
- */
- virtual QCString trModuleDocumentation()
- { return "Module Dokumentasie"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all classes, structs and unions.
- */
- virtual QCString trClassDocumentation()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Data Strukture Dokumentasie";
- }
- else
- {
- return "Klas Dokumentasie";
- }
- }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all files.
- */
- virtual QCString trFileDocumentation()
- { return "Le&euml;r Dokumentasie"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all examples.
- */
- virtual QCString trExampleDocumentation()
- { return "Voorbeeld Dokumentasie"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all related pages.
- */
- virtual QCString trPageDocumentation()
- { return "Bladsy Dokumentasie"; }
-
- /*! This is used in LaTeX as the title of the document */
- virtual QCString trReferenceManual()
- { return "Verwysings Handleiding"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of defines
- */
- virtual QCString trDefines()
- { return "Definiesies"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of function prototypes
- */
- virtual QCString trFuncProtos()
- { return "Funksie Prototipes"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of typedefs
- */
- virtual QCString trTypedefs()
- { return "Typedefs"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of enumerations
- */
- virtual QCString trEnumerations()
- { return "Enumerations"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) functions
- */
- virtual QCString trFunctions()
- { return "Funksies"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trVariables()
- { return "Veranderlikes"; }
-
- /*! This is used in the documentation of a file as a header before the
- * list of (global) variables
- */
- virtual QCString trEnumerationValues()
- { return "Enumeration waardes"; }
-
- /*! This is used in the documentation of a file before the list of
- * documentation blocks for defines
- */
- virtual QCString trDefineDocumentation()
- { return "Define Documentation"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for function prototypes
- */
- virtual QCString trFunctionPrototypeDocumentation()
- { return "Funksie Prototipe Dokumentasie"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for typedefs
- */
- virtual QCString trTypedefDocumentation()
- { return "Typedef Dokumentasie"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for enumeration types
- */
- virtual QCString trEnumerationTypeDocumentation()
- { return "Enumeration Type Dokumentasie"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for functions
- */
- virtual QCString trFunctionDocumentation()
- { return "Funksie Dokumentasie"; }
-
- /*! This is used in the documentation of a file/namespace before the list
- * of documentation blocks for variables
- */
- virtual QCString trVariableDocumentation()
- { return "Veranderlike Dokumentasie"; }
-
- /*! This is used in the documentation of a file/namespace/group before
- * the list of links to documented compounds
- */
- virtual QCString trCompounds()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Data Strukture";
- }
- else
- {
- return "Klasse";
- }
- }
-
- /*! 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)"Gegenereer op "+date;
- if (projName) result+=(QCString)" vir "+projName;
- result+=(QCString)" deur";
- return result;
- }
- /*! This is part of the sentence used in the standard footer of each page.
- */
- virtual QCString trWrittenBy()
- {
- return "geskryf deur";
- }
-
- /*! this text is put before a class diagram */
- virtual QCString trClassDiagram(const char *clName)
- {
- return (QCString)"Afleidings diagram vir "+clName+":";
- }
-
- /*! this text is generated when the \\internal command is used. */
- virtual QCString trForInternalUseOnly()
- { return "Slegs vir interne gebruik."; }
-
- /*! this text is generated when the \\warning command is used. */
- virtual QCString trWarning()
- { return "Waarskuwing"; }
-
- /*! this text is generated when the \\version command is used. */
- virtual QCString trVersion()
- { return "Weergawe"; }
-
- /*! this text is generated when the \\date command is used. */
- virtual QCString trDate()
- { return "Datum"; }
-
- /*! this text is generated when the \\return command is used. */
- virtual QCString trReturns()
- { return "Returns"; }
-
- /*! this text is generated when the \\sa command is used. */
- virtual QCString trSeeAlso()
- { return "Sien ook"; }
-
- /*! this text is generated when the \\param command is used. */
- virtual QCString trParameters()
- { return "Parameters"; }
-
- /*! this text is generated when the \\exception command is used. */
- virtual QCString trExceptions()
- { return "Exceptions"; }
-
- /*! this text is used in the title page of a LaTeX document. */
- virtual QCString trGeneratedBy()
- { return "Gegenereer deur"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990307
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of page containing all the index of all namespaces. */
- virtual QCString trNamespaceList()
- { return "Namespace Lys"; }
-
- /*! used as an introduction to the namespace list */
- virtual QCString trNamespaceListDescription(bool extractAll)
- {
- QCString result="'n Lys van alle ";
- if (!extractAll) result+="gedokumenteerde ";
- result+="namespaces met kort beskrywings:";
- return result;
- }
-
- /*! used in the class documentation as a header before the list of all
- * friends of a class
- */
- virtual QCString trFriends()
- { return "Friends"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990405
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in the class documentation as a header before the list of all
- * related classes
- */
- virtual QCString trRelatedFunctionDocumentation()
- { return "Friends En Verwante Funksie Dokumentasie"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990425
-//////////////////////////////////////////////////////////////////////////
-
- /*! used as the title of the HTML page of a class/struct/union */
- virtual QCString trCompoundReference(const char *clName,
- ClassDef::CompoundType compType,
- bool isTemplate)
- {
- QCString result=(QCString)clName;
- switch(compType)
- {
- case ClassDef::Class: result+=" klas"; break;
- case ClassDef::Struct: result+=" Struct"; break;
- case ClassDef::Union: result+=" Union"; break;
- case ClassDef::Interface: result+=" Intervlak"; break;
- case ClassDef::Protocol: result+=" Protocol"; break;
- case ClassDef::Category: result+=" Kategorie"; break;
- case ClassDef::Exception: result+=" Exception"; break;
- }
- if (isTemplate) result+=" Template";
- result+=" Verwysing";
- return result;
- }
-
- /*! used as the title of the HTML page of a file */
- virtual QCString trFileReference(const char *fileName)
- {
- QCString result=fileName;
- result+=" Le&euml;r Verwysing";
- return result;
- }
-
- /*! used as the title of the HTML page of a namespace */
- virtual QCString trNamespaceReference(const char *namespaceName)
- {
- QCString result=namespaceName;
- result+=" Namespace Verwysing";
- return result;
- }
-
- virtual QCString trPublicMembers()
- { return "Publieke Lede Funksies"; }
- virtual QCString trPublicSlots()
- { return "Publieke Slots"; }
- virtual QCString trSignals()
- { return "Signals"; }
- virtual QCString trStaticPublicMembers()
- { return "Statiese Publieke Lede Funksies"; }
- virtual QCString trProtectedMembers()
- { return "Beskermde Lede Funksies"; }
- virtual QCString trProtectedSlots()
- { return "Beskermde Slots"; }
- virtual QCString trStaticProtectedMembers()
- { return "Statiese Beskermde Lede Funksies"; }
- virtual QCString trPrivateMembers()
- { return "Private Lede Funksies"; }
- virtual QCString trPrivateSlots()
- { return "Private Slots"; }
- virtual QCString trStaticPrivateMembers()
- { return "Statiese Private Lede Funksies"; }
-
- /*! this function is used to produce a comma-separated list of items.
- * use generateMarker(i) to indicate where item i should be put.
- */
- virtual QCString trWriteList(int numEntries)
- {
- QCString result;
- int i;
- // the inherits list contain `numEntries' classes
- for (i=0;i<numEntries;i++)
- {
- // use generateMarker to generate placeholders for the class links!
- result+=generateMarker(i); // generate marker for entry i in the list
- // (order is left to right)
-
- if (i!=numEntries-1) // not the last entry, so we need a separator
- {
- if (i<numEntries-2) // not the fore last entry
- result+=", ";
- else // the fore last entry
- result+=", en ";
- }
- }
- return result;
- }
-
- /*! used in class documentation to produce a list of base classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritsList(int numEntries)
- {
- return "Afgelei van"+trWriteList(numEntries)+".";
- }
-
- /*! used in class documentation to produce a list of super classes,
- * if class diagrams are disabled.
- */
- virtual QCString trInheritedByList(int numEntries)
- {
- return "Afgelei van"+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 "Hergeimplimenteer van "+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 "Hergeimplimenter in "+trWriteList(numEntries)+".";
- }
-
- /*! This is put above each page as a link to all members of namespaces. */
- virtual QCString trNamespaceMembers()
- { return "Namespace Lede"; }
-
- /*! This is an introduction to the page with all namespace members */
- virtual QCString trNamespaceMemberDescription(bool extractAll)
- {
- QCString result="'n Lys van alle ";
- if (!extractAll) result+="gedokumenteerde ";
- result+="namespace lede met skakels na ";
- if (extractAll)
- result+="die namespace dokumentasie vir elke lid:";
- else
- result+="die namespaces waaraan hulle behoort:";
- return result;
- }
- /*! This is used in LaTeX as the title of the chapter with the
- * index of all namespaces.
- */
- virtual QCString trNamespaceIndex()
- { return "Namespace Indeks"; }
-
- /*! This is used in LaTeX as the title of the chapter containing
- * the documentation of all namespaces.
- */
- virtual QCString trNamespaceDocumentation()
- { return "Namespace Dokumentasie"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990522
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used in the documentation before the list of all
- * namespaces in a file.
- */
- virtual QCString trNamespaces()
- { return "Namespaces"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990728
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is put at the bottom of a class documentation page and is
- * followed by a list of files that were used to generate the page.
- */
- virtual QCString trGeneratedFromFiles(ClassDef::CompoundType compType,
- bool single)
- { // here s is one of " Class", " Struct" or " Union"
- // single is true implies a single file
- QCString result=(QCString)"Die dokumentasie vir hierdie ";
- switch(compType)
- {
- case ClassDef::Class: result+="klas"; break;
- case ClassDef::Struct: result+="struct"; break;
- case ClassDef::Union: result+="union"; break;
- case ClassDef::Interface: result+="intervlak"; break;
- case ClassDef::Protocol: result+="protokol"; break;
- case ClassDef::Category: result+="kategorie"; break;
- case ClassDef::Exception: result+="eksepsie"; break;
- }
- result+=" is gegenereer vanaf die volgende le&euml;r";
- if (single) result+=":"; else result+="s:";
- return result;
- }
-
- /*! This is in the (quick) index as a link to the alphabetical compound
- * list.
- */
- virtual QCString trAlphabeticalList()
- { return "Alfabetiese Lys"; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-990901
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the heading text for the retval command. */
- virtual QCString trReturnValues()
- { return "Return waardes"; }
-
- /*! This is in the (quick) index as a link to the main page (index.html)
- */
- virtual QCString trMainPage()
- { return "Hoof Bladsy"; }
-
- /*! This is used in references to page that are put in the LaTeX
- * documentation. It should be an abbreviation of the word page.
- */
- virtual QCString trPageAbbreviation()
- { return "p."; }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991003
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDefinedAtLineInSourceFile()
- {
- return "Gedefinie&euml;r by lyn @0 van le&euml;r @1.";
- }
- virtual QCString trDefinedInSourceFile()
- {
- return "Definisie in le&euml;r @0.";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 0.49-991205
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trDeprecated()
- {
- return "Verouderd";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.0.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! this text is put before a collaboration diagram */
- virtual QCString trCollaborationDiagram(const char *clName)
- {
- return (QCString)"Samewerkings diagram vir "+clName+":";
- }
- /*! this text is put before an include dependency graph */
- virtual QCString trInclDepGraph(const char *fName)
- {
- return (QCString)"Insluitings afhanklikheid diagram vir "+fName+":";
- }
- /*! header that is put before the list of constructor/destructors. */
- virtual QCString trConstructorDocumentation()
- {
- return "Konstruktor & Destruktor Dokumentasie";
- }
- /*! Used in the file documentation to point to the corresponding sources. */
- virtual QCString trGotoSourceCode()
- {
- return "Skakel na die bron kode van hierdie le&euml;r.";
- }
- /*! Used in the file sources to point to the corresponding documentation. */
- virtual QCString trGotoDocumentation()
- {
- return "Skakel na die dokumentasie van hierdie le&euml;r.";
- }
- /*! Text for the \\pre command */
- virtual QCString trPrecondition()
- {
- return "Prekondisie";
- }
- /*! Text for the \\post command */
- virtual QCString trPostcondition()
- {
- return "Postkondisie";
- }
- /*! Text for the \\invariant command */
- virtual QCString trInvariant()
- {
- return "Invariant";
- }
- /*! Text shown before a multi-line variable/enum initialization */
- virtual QCString trInitialValue()
- {
- return "Oorspronklike waarde:";
- }
- /*! Text used the source code in the file index */
- virtual QCString trCode()
- {
- return "kode";
- }
- virtual QCString trGraphicalHierarchy()
- {
- return "Grafiese Klasse Hierargie";
- }
- virtual QCString trGotoGraphicalHierarchy()
- {
- return "Skakel na die grafiese klasse hierargie";
- }
- virtual QCString trGotoTextualHierarchy()
- {
- return "Skakel na die teks klasse hierargie";
- }
- virtual QCString trPageIndex()
- {
- return "Bladsy Indeks";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.0
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trNote()
- {
- return "Nota";
- }
- virtual QCString trPublicTypes()
- {
- return "Publieke Tipes";
- }
- virtual QCString trPublicAttribs()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Data Velde";
- }
- else
- {
- return "Publieke Public Attributes";
- }
- }
- virtual QCString trStaticPublicAttribs()
- {
- return "Statiese Publieke Attribute";
- }
- virtual QCString trProtectedTypes()
- {
- return "Beskermde Tipes";
- }
- virtual QCString trProtectedAttribs()
- {
- return "Beskermde Attribute";
- }
- virtual QCString trStaticProtectedAttribs()
- {
- return "Statiese Beskermde Attribute";
- }
- virtual QCString trPrivateTypes()
- {
- return "Private Tipes";
- }
- virtual QCString trPrivateAttribs()
- {
- return "Private Attribute";
- }
- virtual QCString trStaticPrivateAttribs()
- {
- return "Statiese Private Attribute";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\todo item */
- virtual QCString trTodo()
- {
- return "Aksies";
- }
- /*! Used as the header of the todo list */
- virtual QCString trTodoList()
- {
- return "Aksie Lys";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.4
-//////////////////////////////////////////////////////////////////////////
-
- virtual QCString trReferencedBy()
- {
- return "Verwysing van";
- }
- virtual QCString trRemarks()
- {
- return "Opmerkings";
- }
- virtual QCString trAttention()
- {
- return "Aandag";
- }
- virtual QCString trInclByDepGraph()
- {
- return "Hierdie diagram verduidelik watter le&euml;rs direk of"
- "indirek hierdie le&euml;r insluit:";
- }
- virtual QCString trSince()
- {
- return "Sederd";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.1.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! title of the graph legend page */
- virtual QCString trLegendTitle()
- {
- return "Diagram beskrywing";
- }
- /*! 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
- "Hierdie bladsy beskryf die diagram konvensies wat gebruik word "
- "deur doxygen.<p>\n"
- "in hierdie voorbeeld:\n"
- "\\code\n"
- "/*! Onsigbare klas weens afkorting */\n"
- "class Invisible { };\n\n"
- "/*! Afgekorte klas, afgeleide verwantskap word versteek */\n"
- "class Truncated : public Invisible { };\n\n"
- "/* Ongedokumenteerde Klas, geen doxygen kommentaar nie */\n"
- "class Undocumented{ };\n\n"
- "/*! 'n Klas wat afgelei is met 'n publieke verwantskap */\n"
- "class PublicBase : public Truncated { };\n\n"
- "/*! 'n template klas */\n"
- "template<class T> class Templ { };\n\n"
- "/*! 'n Klas wat afgelei is met 'n beskermde verwantskap */\n"
- "class ProtectedBase { };\n\n"
- "/*! 'n Klas wat afgelei is met 'n private verwantskap */\n"
- "class PrivateBase { };\n\n"
- "/*! 'n Klas wat gebrui word deur die Afgeleide klas */\n"
- "class GebruikMy { };\n\n"
- "/*! 'n Super klas wat afgelei word van 'n aantal basis klasse */\n"
- "class Inherited : public PublicBase,\n"
- " protected ProtectedBase,\n"
- " private PrivateBase,\n"
- " public Ongedokumenteer\n"
- " public Templ<int>\n"
- "{\n"
- " private:\n"
- " Used *m_usedClass;\n"
- "};\n"
- "\\endcode\n"
- "As die \\c MAX_DOT_GRAPH_HEIGHT merker in die konfigurasie le&euml;r "
- "aan 240 gelyk gestel is, word die volgende diagram geproduseer:"
- "<p><center><img alt=\"\" src=\"graph_legend."+Config_getEnum("DOT_IMAGE_FORMAT")+"\"></center>\n"
- "<p>\n"
- "Die reghoeke in die diagram het die volgende betekenis:\n"
- "<ul>\n"
- "<li>%'n Soliede swart reghoek verteenwoordig die klas waarvoor "
- "die diagram gegenereer is.\n"
- "<li>%'n Reghoek met 'n swart omlyning verteenwoordig 'n gedokumenteerde klas.\n"
- "<li>%'n Reghoek met 'n grys omlyning verteenwoordig 'n ongedokumenteerde klas.\n"
- "<li>%'n Reghoek met 'n rooi omlyning verteenwoordig 'n gedokumenteerde klas waarvoor"
- "alle verwante klasse (afgeleide of gebruik) nie getoon word nie. %'n Diagram word "
- "op hierie manier afgekort as dit nie in die gespesifiseerde raam pas nie.\n"
- "</ul>\n"
- "Die pyltjies het die volgende betekenis:\n"
- "<ul>\n"
- "<li>%'n Donker blou pyltjie verteenwoordig 'n publieke afgeleide "
- "verwantskap tussen twee klasse.\n"
- "<li>%'n Donker groen pyltjie word gebruik vir 'n beskermde verwantskap.\n"
- "<li>%'n Donker rooi pyltjie verteenwoordig private verwantskappe.\n"
- "<li>%'n Pers pyltjie word gebruik as 'n klas gebruik of bevat word "
- "deur 'n ander klas. Die pyltjie word gemerk met die veranderlike(s) waar deur "
- "die verwysde klass verkrygbaar is.\n"
- "<li>%'n Geel stippel pyl verteenwoordig die verwantslap tussen 'n template instansie en "
- "die template waarvan die klas vervaardig is. Die pyltjie word gemerk met die "
- "template parameters van die instansie.\n"
- "</ul>\n";
- }
- /*! text for the link to the legend page */
- virtual QCString trLegend()
- {
- return "beskrywing";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.0
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a test item */
- virtual QCString trTest()
- {
- return "Toets";
- }
- /*! Used as the header of the test list */
- virtual QCString trTestList()
- {
- return "Toets Lys";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.1
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for KDE-2 IDL methods */
- virtual QCString trDCOPMethods()
- {
- return "DCOP Lede Funksies";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.2
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a section header for IDL properties */
- virtual QCString trProperties()
- {
- return "Eienskappe";
- }
- /*! Used as a section header for IDL property documentation */
- virtual QCString trPropertyDocumentation()
- {
- return "Eienskap Dokumentasie";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.4
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used for Java classes in the summary section of Java packages */
- virtual QCString trClasses()
- {
- if (Config_getBool("OPTIMIZE_OUTPUT_FOR_C"))
- {
- return "Data Strukture";
- }
- else
- {
- return "Klasse";
- }
- }
- /*! Used as the title of a Java package */
- virtual QCString trPackage(const char *name)
- {
- return (QCString)"Pakket "+name;
- }
- /*! Title of the package index page */
- virtual QCString trPackageList()
- {
- return "Pakket Lys";
- }
- /*! The description of the package index page */
- virtual QCString trPackageListDescription()
- {
- return "Die pakkette met kort beskrywings (indien beskikbaar):";
- }
- /*! The link name in the Quick links header for each page */
- virtual QCString trPackages()
- {
- return "Pakkette";
- }
- /*! Text shown before a multi-line define */
- virtual QCString trDefineValue()
- {
- return "Waarde:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.5
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a marker that is put before a \\bug item */
- virtual QCString trBug()
- {
- return "Bug";
- }
- /*! Used as the header of the bug list */
- virtual QCString trBugList()
- {
- return "Bug Lys";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.6
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as ansicpg for RTF file
- *
- * The following table shows the correlation of Charset name, Charset Value and
- * <pre>
- * Codepage number:
- * Charset Name Charset Value(hex) Codepage number
- * ------------------------------------------------------
- * DEFAULT_CHARSET 1 (x01)
- * SYMBOL_CHARSET 2 (x02)
- * OEM_CHARSET 255 (xFF)
- * ANSI_CHARSET 0 (x00) 1252
- * RUSSIAN_CHARSET 204 (xCC) 1251
- * EE_CHARSET 238 (xEE) 1250
- * GREEK_CHARSET 161 (xA1) 1253
- * TURKISH_CHARSET 162 (xA2) 1254
- * BALTIC_CHARSET 186 (xBA) 1257
- * HEBREW_CHARSET 177 (xB1) 1255
- * ARABIC _CHARSET 178 (xB2) 1256
- * SHIFTJIS_CHARSET 128 (x80) 932
- * HANGEUL_CHARSET 129 (x81) 949
- * GB2313_CHARSET 134 (x86) 936
- * CHINESEBIG5_CHARSET 136 (x88) 950
- * </pre>
- *
- */
- virtual QCString trRTFansicp()
- {
- return "1252";
- }
-
-
- /*! Used as ansicpg for RTF fcharset
- * \see trRTFansicp() for a table of possible values.
- */
- virtual QCString trRTFCharSet()
- {
- return "0";
- }
-
- /*! Used as header RTF general index */
- virtual QCString trRTFGeneralIndex()
- {
- return "Indeks";
- }
-
- /*! 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 ? "Klas" : "klas"));
- if (!singular) result+="se";
- 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 ? "Le&euml;r" : "le&euml;r"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trNamespace(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Namespace" : "namespace"));
- if (!singular) result+="s";
- return result;
- }
-
- /*! This is used for translation of the word that will possibly
- * be followed by a single name or by a list of names
- * of the category.
- */
- virtual QCString trGroup(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Groep" : "groep"));
- if (!singular) result+="e";
- 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 ? "Bladsy" : "bladsy"));
- if (!singular) result+="e";
- 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 ? "Lid" : "lid"));
- if (!singular) result = (first_capital ? "Lede" : "lede");
- 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 ? "Global" : "global"));
- if (!singular) result+="s";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.7
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is generated when the \\author command is used and
- * for the author section in man pages. */
- virtual QCString trAuthor(bool first_capital, bool singular)
- {
- QCString result((first_capital ? "Outeur" : "outeur"));
- if (!singular) result+="s";
- return result;
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.11
-//////////////////////////////////////////////////////////////////////////
-
- /*! This text is put before the list of members referenced by a member
- */
- virtual QCString trReferences()
- {
- return "Verwysings";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Implimenteer "+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 "Geimplimenteer in "+trWriteList(numEntries)+".";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.16
-//////////////////////////////////////////////////////////////////////////
-
- /*! used in RTF documentation as a heading for the Table
- * of Contents.
- */
- virtual QCString trRTFTableOfContents()
- {
- return "Inhoudsopgawe";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.17
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as the header of the list of item that have been
- * flagged deprecated
- */
- virtual QCString trDeprecatedList()
- {
- return "Verouderde Lys";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.2.18
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a header for declaration section of the events found in
- * a C# program
- */
- virtual QCString trEvents()
- {
- return "Events";
- }
- /*! Header used for the documentation section of a class' events. */
- virtual QCString trEventDocumentation()
- {
- return "Event Dokumentasie";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! Used as a heading for a list of Java class types with package scope.
- */
- virtual QCString trPackageTypes()
- {
- return "Pakket Tipes";
- }
- /*! Used as a heading for a list of Java class functions with package
- * scope.
- */
- virtual QCString trPackageMembers()
- {
- return "Pakket Funksies";
- }
- /*! Used as a heading for a list of static Java class functions with
- * package scope.
- */
- virtual QCString trStaticPackageMembers()
- {
- return "Statiese Pakket Funksies";
- }
- /*! Used as a heading for a list of Java class variables with package
- * scope.
- */
- virtual QCString trPackageAttribs()
- {
- return "Pakket Eienskappe";
- }
- /*! Used as a heading for a list of static Java class variables with
- * package scope.
- */
- virtual QCString trStaticPackageAttribs()
- {
- return "Statiese Pakket Eienskappe";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 "Alle Lede";
- }
- /*! Put in front of the call graph for a function. */
- virtual QCString trCallGraph()
- {
- return "'n gebruiks diagram vir hierdie funksie:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.3
-//////////////////////////////////////////////////////////////////////////
-
- /*! When the search engine is enabled this text is put in the header
- * of each page before the field where one can enter the text to search
- * for.
- */
- virtual QCString trSearchForIndex()
- {
- return "Soek vir";
- }
- /*! This string is used as the title for the page listing the search
- * results.
- */
- virtual QCString trSearchResultsTitle()
- {
- return "Soektog Resultate";
- }
- /*! 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
- * the number representing the actual number of search results.
- * The @a numDocuments parameter can be either 0, 1 or 2, where the
- * value 2 represents 2 or more matches. HTML markup is allowed inside
- * the returned string.
- */
- virtual QCString trSearchResults(int numDocuments)
- {
- if (numDocuments==0)
- {
- return "Geen dokumente na gelang van jou navraag nie.";
- }
- else if (numDocuments==1)
- {
- return "Die soektog het <b>1</b> dokument gevind na gelang van jou navraag.";
- }
- else
- {
- return "Die soektog het <b>$num</b> dokumente gevind na gelang van jou navraag. "
- "Beste resultate eerste.";
- }
- }
- /*! 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 "Teikens:";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// 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 filename + " Bron kode Le&euml;r";
- }
-
-//////////////////////////////////////////////////////////////////////////
-// new since 1.3.9
-//////////////////////////////////////////////////////////////////////////
-
- /*! This is used as the name of the chapter containing the directory
- * hierarchy.
- */
- virtual QCString trDirIndex()
- { return "Directory Hi&euml;rargie"; }
-
- /*! This is used as the name of the chapter containing the documentation
- * of the directories.
- */
- virtual QCString trDirDocumentation()
- { return "Directory Documentasie"; }
-
- /*! 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 "Directories"; }
-
- /*! This returns a sentences that introduces the directory hierarchy.
- * and the fact that it is sorted alphabetically per level
- */
- virtual QCString trDirDescription()
- { return "Hierdie directory hi&euml;rargie is min of meer alfabeties "
- "gesorteer:";
- }
-
- /*! 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=dirName; result+=" Directory Verwysing"; return result; }
-
- /*! 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 ? "Director" : "director"));
- if (singular) result+="y"; else result+="ies";
- 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 "Hierdie is 'n oorlaaide lede funksie, "
- "vertoon vir volledigheid. Dit verskil slegs van die bogegewe "
- "funksie in die argument(e) wat dit aanvaar.";
- }
-
-
-};
-
-#endif
-
diff --git a/src/unistd.h b/src/unistd.h
deleted file mode 100644
index 46a5fbc..0000000
--- a/src/unistd.h
+++ /dev/null
@@ -1,7 +0,0 @@
-/* this is a dummy file, that is needed for compiling files that are
- * generated with flex under Windows 95/NT.
- */
-#if defined(_MSC_VER)
-#include <io.h>
-#endif
-
diff --git a/src/util.cpp b/src/util.cpp
deleted file mode 100644
index 09dee55..0000000
--- a/src/util.cpp
+++ /dev/null
@@ -1,5616 +0,0 @@
-/*****************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-
-#include <stdlib.h>
-#include <ctype.h>
-#if defined(_WIN32) && !defined(__CYGWIN__)
-#include <windows.h>
-#endif
-
-#include <md5.h>
-
-#include "qtbc.h"
-#include <qregexp.h>
-#include <qfileinfo.h>
-#include <qdir.h>
-#include <qdatetime.h>
-#include <qcache.h>
-
-#include "util.h"
-#include "message.h"
-#include "classdef.h"
-#include "filedef.h"
-#include "doxygen.h"
-#include "outputlist.h"
-#include "defargs.h"
-#include "language.h"
-#include "config.h"
-#include "htmlhelp.h"
-#include "example.h"
-#include "version.h"
-#include "groupdef.h"
-#include "reflist.h"
-#include "pagedef.h"
-#include "debug.h"
-#include "searchindex.h"
-#include "doxygen.h"
-
-#if !defined(_WIN32) || defined(__CYGWIN__)
-#include <unistd.h>
-#include <stdlib.h>
-#include <sys/types.h>
-#include <sys/wait.h>
-#include <errno.h>
-extern char **environ;
-#endif
-
-#if defined(_MSC_VER) || defined(__BORLANDC__)
-#define popen _popen
-#define pclose _pclose
-#endif
-
-//------------------------------------------------------------------------
-
-// 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
-
-//------------------------------------------------------------------------
-// TextGeneratorOLImpl implementation
-//------------------------------------------------------------------------
-
-TextGeneratorOLImpl::TextGeneratorOLImpl(OutputDocInterface &od) : m_od(od)
-{
-}
-
-void TextGeneratorOLImpl::writeString(const char *s,bool keepSpaces) const
-{
- if (keepSpaces)
- {
- const char *p=s;
- if (p)
- {
- char cs[2];
- char c;
- cs[1]='\0';
- while ((c=*p++))
- {
- if (c==' ') m_od.writeNonBreakableSpace(1);
- else cs[0]=c,m_od.docify(cs);
- }
- }
- }
- else
- {
- m_od.docify(s);
- }
-}
-
-void TextGeneratorOLImpl::writeBreak() const
-{
- m_od.pushGeneratorState();
- m_od.disableAllBut(OutputGenerator::Html);
- m_od.lineBreak();
- m_od.popGeneratorState();
-}
-
-void TextGeneratorOLImpl::writeLink(const char *extRef,const char *file,
- const char *anchor,const char *text
- ) const
-{
- m_od.writeObjectLink(extRef,file,anchor,text);
-}
-
-//------------------------------------------------------------------------
-//------------------------------------------------------------------------
-
-
-/*! Implements an interruptable system call on Unix/Windows */
-int iSystem(const char *command,const char *args,bool isBatchFile)
-{
- QTime time;
- time.start();
-
- if (command==0) return 1;
-
- QCString fullCmd=command;
- fullCmd=fullCmd.stripWhiteSpace();
- if (fullCmd.at(0)!='"' && fullCmd.find(' ')!=-1)
- {
- // add quotes around command as it contains spaces and is not quoted already
- fullCmd="\""+fullCmd+"\"";
- }
- fullCmd += " ";
- fullCmd += args;
- Debug::print(Debug::ExtCmd,0,"Executing external command `%s`\n",fullCmd.data());
-
-#if !defined(_WIN32) || defined(__CYGWIN__)
- isBatchFile=isBatchFile;
- /*! taken from the system() manpage on my Linux box */
- int pid,status=0;
-
-
-#ifdef _OS_SOLARIS // for Solaris we use vfork since it is more memory efficient
-
- // on Solaris fork() duplicates the memory usage
- // so we use vfork instead
-
- // spawn shell
- if ((pid=vfork())<0)
- {
- status=-1;
- }
- else if (pid==0)
- {
- execl("/bin/sh","sh","-c",fullCmd.data(),(char*)0);
- _exit(127);
- }
- else
- {
- while (waitpid(pid,&status,0 )<0)
- {
- if (errno!=EINTR)
- {
- status=-1;
- break;
- }
- }
- }
- Doxygen::sysElapsedTime+=((double)time.elapsed())/1000.0;
- return status;
-
-#else // Other Unices just use fork
-
- pid = fork();
- if (pid==-1) return -1;
- if (pid==0)
- {
- const char * argv[4];
- argv[0] = "sh";
- argv[1] = "-c";
- argv[2] = fullCmd.data();
- argv[3] = 0;
- execve("/bin/sh",(char * const *)argv,environ);
- exit(127);
- }
- for (;;)
- {
- if (waitpid(pid,&status,0)==-1)
- {
- if (errno!=EINTR) return -1;
- }
- else
- {
- Doxygen::sysElapsedTime+=((double)time.elapsed())/1000.0;
- return status;
- }
- }
-#endif // _OS_SOLARIS
-
-#else // Win32 specific
- if (isBatchFile)
- {
- return system(fullCmd);
- }
- else
- {
- SHELLEXECUTEINFO sInfo = {
- sizeof(SHELLEXECUTEINFO), /* structure size */
- SEE_MASK_NOCLOSEPROCESS, /* leave the process running */
- NULL, /* window handle */
- NULL, /* action to perform: open */
- command, /* file to execute */
- args, /* argument list */
- NULL, /* use current working dir */
- SW_HIDE, /* minimize on start-up */
- 0, /* application instance handle */
- NULL, /* ignored: id list */
- NULL, /* ignored: class name */
- NULL, /* ignored: key class */
- 0, /* ignored: hot key */
- NULL, /* ignored: icon */
- NULL /* resulting application handle */
- };
- if (!ShellExecuteEx(&sInfo))
- {
- return -1;
- }
- else if (sInfo.hProcess) /* executable was launched, wait for it to finish */
- {
- WaitForSingleObject(sInfo.hProcess,INFINITE);
- CloseHandle(sInfo.hProcess);
- }
- }
- Doxygen::sysElapsedTime+=((double)time.elapsed())/1000.0;
- return 0;
-#endif
-
-}
-
-
-
-
-
-// an inheritance tree of depth of 100000 should be enough for everyone :-)
-const int maxInheritanceDepth = 100000;
-
-bool isId(char c)
-{
- return c=='_' || isalnum(c);
-}
-
-
-/*!
- Removes all anoymous scopes from string s
- Possible examples:
-\verbatim
- "bla::@10::blep" => "bla::blep"
- "bla::@10::@11::blep" => "bla::blep"
- "@10::blep" => "blep"
- " @10::blep" => "blep"
- "@9::@10::blep" => "blep"
- "bla::@1" => "bla"
- "bla::@1::@2" => "bla"
- "bla @1" => "bla"
-\endverbatim
- */
-QCString removeAnonymousScopes(const QCString &s)
-{
- QCString result;
- if (s.isEmpty()) return result;
- static QRegExp re("[ :]*@[0-9]+[: ]*");
- int i,l,sl=s.length();
- int p=0;
- while ((i=re.match(s,p,&l))!=-1)
- {
- result+=s.mid(p,i-p);
- int c=i;
- bool b1=FALSE,b2=FALSE;
- 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+="::";
- }
- p=i+l;
- }
- result+=s.right(sl-p);
- //printf("removeAnonymousScopes(`%s')=`%s'\n",s.data(),result.data());
- return result;
-}
-
-// replace anonymous scopes with __anonymous__
-QCString replaceAnonymousScopes(const QCString &s)
-{
- QCString result;
- if (s.isEmpty()) return result;
- static QRegExp re("@[0-9]+");
- int i,l,sl=s.length();
- int p=0;
- while ((i=re.match(s,p,&l))!=-1)
- {
- result+=s.mid(p,i-p);
- result+="__anonymous__";
- p=i+l;
- }
- result+=s.right(sl-p);
- //printf("replaceAnonymousScopes(`%s')=`%s'\n",s.data(),result.data());
- return result;
-}
-
-
-// strip annonymous left hand side part of the scope
-QCString stripAnonymousNamespaceScope(const QCString &s)
-{
- int i,p=0,l;
- QCString newScope;
- while ((i=getScopeFragment(s,p,&l))!=-1)
- {
- //printf("Scope fragment %s\n",s.mid(i,l).data());
- if (Doxygen::namespaceSDict[s.left(i+l)]!=0)
- {
- if (s.at(i)!='@')
- {
- if (!newScope.isEmpty()) newScope+="::";
- newScope+=s.mid(i,l);
- }
- }
- else
- {
- if (!newScope.isEmpty()) newScope+="::";
- newScope+=s.right(s.length()-i);
- goto done;
- }
- p=i+l;
- }
-done:
- //printf("stripAnonymousNamespaceScope(`%s')=`%s'\n",s.data(),newScope.data());
- return newScope;
-}
-
-void writePageRef(OutputDocInterface &od,const char *cn,const char *mn)
-{
- od.pushGeneratorState();
-
- od.disable(OutputGenerator::Html);
- od.disable(OutputGenerator::Man);
- if (Config_getBool("PDF_HYPERLINKS")) od.disable(OutputGenerator::Latex);
- if (Config_getBool("RTF_HYPERLINKS")) od.disable(OutputGenerator::RTF);
- od.startPageRef();
- od.docify(theTranslator->trPageAbbreviation());
- od.endPageRef(cn,mn);
-
- od.popGeneratorState();
-}
-
-/*! Generate a place holder for a position in a list. Used for
- * translators to be able to specify different elements orders
- * depending on whether text flows from left to right or visa versa.
- */
-QCString generateMarker(int id)
-{
- QCString result;
- result.sprintf("@%d",id);
- return result;
-}
-
-static QCString stripFromPath(const QCString &path,QStrList &l)
-{
- const char *s=l.first();
- while (s)
- {
- QCString prefix = s;
- if (stricmp(path.left(prefix.length()),prefix)==0) // case insensitive compare
- {
- return path.right(path.length()-prefix.length());
- }
- s = l.next();
- }
- return path;
-}
-
-/*! strip part of \a path if it matches
- * one of the paths in the Config_getList("STRIP_FROM_PATH") list
- */
-QCString stripFromPath(const QCString &path)
-{
- return stripFromPath(path,Config_getList("STRIP_FROM_PATH"));
-}
-
-/*! strip part of \a path if it matches
- * one of the paths in the Config_getList("INCLUDE_PATH") list
- */
-QCString stripFromIncludePath(const QCString &path)
-{
- return stripFromPath(path,Config_getList("STRIP_FROM_INC_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
- * lower case) If anyone knows or uses another extension please let me know :-)
- */
-int guessSection(const char *name)
-{
- QCString n=((QCString)name).lower();
- if (n.right(2)==".c" || // source
- n.right(3)==".cc" ||
- n.right(4)==".cxx" ||
- n.right(4)==".cpp" ||
- n.right(4)==".c++" ||
- n.right(5)==".java" ||
- n.right(3)==".ii" || // inline
- n.right(4)==".ixx" ||
- n.right(4)==".ipp" ||
- n.right(4)==".i++" ||
- n.right(4)==".inl"
- ) return Entry::SOURCE_SEC;
- if (n.right(2)==".h" || // header
- n.right(3)==".hh" ||
- n.right(4)==".hxx" ||
- n.right(4)==".hpp" ||
- n.right(4)==".h++" ||
- n.right(4)==".idl" ||
- n.right(5)==".pidl"
- ) return Entry::HEADER_SEC;
- return 0;
-}
-
-QCString resolveTypeDef(Definition *context,const QCString &qualifiedName,
- Definition **typedefContext)
-{
- //printf("<<resolveTypeDef(%s,%s)\n",
- // context ? context->name().data() : "<none>",qualifiedName.data());
- QCString result;
- if (qualifiedName.isEmpty()) return result;
-
- Definition *mContext=context;
- if (typedefContext) *typedefContext=context;
-
- // see if the qualified name has a scope part
- int scopeIndex = qualifiedName.findRev("::");
- QCString resName=qualifiedName;
- if (scopeIndex!=-1) // strip scope part for the name
- {
- resName=qualifiedName.right(qualifiedName.length()-scopeIndex-2);
- if (resName.isEmpty())
- {
- // qualifiedName was of form A:: !
- return result;
- }
- }
- MemberDef *md=0;
- while (mContext && md==0)
- {
- // step 1: get the right scope
- Definition *resScope=mContext;
- if (scopeIndex!=-1)
- {
- // split-off scope part
- QCString resScopeName = qualifiedName.left(scopeIndex);
- //printf("resScopeName=`%s'\n",resScopeName.data());
-
- // look-up scope in context
- int is,ps=0;
- int l;
- while ((is=getScopeFragment(resScopeName,ps,&l))!=-1)
- {
- QCString qualScopePart = resScopeName.mid(is,l);
- QCString tmp = resolveTypeDef(mContext,qualScopePart);
- if (!tmp.isEmpty()) qualScopePart=tmp;
- resScope = resScope->findInnerCompound(qualScopePart);
- //printf("qualScopePart=`%s' resScope=%p\n",qualScopePart.data(),resScope);
- if (resScope==0) break;
- ps=is+l;
- }
- }
- //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
- {
- //printf("scope found: %s, look for typedef %s\n",
- // resScope->qualifiedName().data(),resName.data());
- MemberNameSDict *mnd=0;
- if (resScope->definitionType()==Definition::TypeClass)
- {
- mnd=&Doxygen::memberNameSDict;
- }
- else
- {
- mnd=&Doxygen::functionNameSDict;
- }
- MemberName *mn=mnd->find(resName);
- if (mn)
- {
- MemberNameIterator mni(*mn);
- MemberDef *tmd=0;
- for (;(tmd=mni.current());++mni)
- {
- //printf("Found member %s resScope=%s outerScope=%s mContext=%p\n",
- // tmd->name().data(), resScope->name().data(),
- // tmd->getOuterScope()->name().data(), mContext);
- if (tmd->isTypedef() /*&& tmd->getOuterScope()==resScope*/)
- {
- // look if resScope is visible within tmd->getOuterScope()
- Definition *d = tmd->getOuterScope();
- while (d && d!=resScope) d=d->getOuterScope();
- if (d)
- {
- md=tmd;
- }
- }
- }
- }
- }
- mContext=mContext->getOuterScope();
- }
-
- // step 3: get the member's type
- if (md)
- {
- //printf(">>resolveTypeDef: Found typedef name `%s' in scope `%s' value=`%s'\n",
- // qualifiedName.data(),context->name().data(),md->typeString()
- // );
- result=md->typeString();
- if (typedefContext) *typedefContext=md->getOuterScope();
- }
- else
- {
- //printf(">>resolveTypeDef: Typedef `%s' not found in scope `%s'!\n",
- // qualifiedName.data(),context ? context->name().data() : "<global>");
- }
- return result;
-
-}
-
-
-/*! Get a class definition given its name.
- * Returns 0 if the class is not found.
- */
-ClassDef *getClass(const char *name)
-{
- if (name==0 || name[0]=='\0') return 0;
- return Doxygen::classSDict.find(name);
-}
-
-NamespaceDef *getResolvedNamespace(const char *name)
-{
- if (name==0 || name[0]=='\0') return 0;
- QCString *subst = Doxygen::namespaceAliasDict[name];
- if (subst)
- {
- int count=0; // recursion detection guard
- QCString *newSubst;
- while ((newSubst=Doxygen::namespaceAliasDict[*subst]) && count<10)
- {
- subst=newSubst;
- count++;
- }
- if (count==10)
- {
- warn_cont("Warning: possible recursive namespace alias detected for %s!\n",name);
- }
- return Doxygen::namespaceSDict[subst->data()];
- }
- else
- {
- return Doxygen::namespaceSDict[name];
- }
-}
-
-static QDict<MemberDef> g_resolvedTypedefs;
-static QDict<Definition> g_visitedNamespaces;
-
-// forward declaration
-ClassDef *getResolvedClassRec(Definition *scope,
- FileDef *fileScope,
- const char *n,
- MemberDef **pTypeDef,
- QCString *pTemplSpec
- );
-int isAccessibleFromWithExpScope(Definition *scope,FileDef *fileScope,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.
- */
-static ClassDef *newResolveTypedef(FileDef *fileScope,MemberDef *md,
- MemberDef **pMemType,QCString *pTemplSpec)
-{
- //printf("newResolveTypedef(md=%p,cachedVal=%p)\n",md,md->getCachedTypedefVal());
- bool isCached = md->isTypedefValCached(); // value already cached
- if (isCached)
- {
- //printf("Already cached %s->%s\n",
- // md->name().data(),
- // md->getCachedTypedefVal()?md->getCachedTypedefVal()->name().data():"<none>");
- if (pTemplSpec) *pTemplSpec = md->getCachedTypedefTemplSpec();
- return md->getCachedTypedefVal();
- }
- QCString qname = md->qualifiedName();
- if (g_resolvedTypedefs.find(qname)) return 0; // typedef already done
-
- g_resolvedTypedefs.insert(qname,md); // put on the trace list
-
- QCString type = md->typeString(); // get the "value" of the typedef
- int ip=type.length()-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"
- type=type.stripWhiteSpace(); // strip leading and trailing whitespace
- MemberDef *memTypeDef = 0;
- ClassDef *result = getResolvedClassRec(md->getOuterScope(),
- fileScope,type,&memTypeDef,0);
- // if type is a typedef than return what it resolves to.
- if (memTypeDef && memTypeDef->isTypedef())
- {
- return newResolveTypedef(fileScope,memTypeDef,pMemType,pTemplSpec);
- }
- 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
- {
- *pTemplSpec = type.mid(i);
- result = getResolvedClassRec(md->getOuterScope(),fileScope,type.left(i),0,0);
- }
- 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>
- {
- *pTemplSpec = type.mid(i);
- }
- result = getResolvedClassRec(md->getOuterScope(),fileScope,
- stripTemplateSpecifiersFromScope(type.left(i),FALSE),0,0);
- }
- }
-
- // 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());
- if (pTemplSpec)
- {
- md->cacheTypedefVal(result,*pTemplSpec);
- }
- else
- {
- md->cacheTypedefVal(result,"");
- }
- }
-
- 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.
- */
-QCString substTypedef(Definition *scope,FileDef *fileScope,const QCString &name)
-{
- QCString result=name;
- if (name.isEmpty()) return result;
-
- // lookup scope fragment in the symbol map
- DefinitionList *dl = Doxygen::symbolMap->find(name);
- if (dl==0) return result; // no matches
-
- // search for the best match
- DefinitionListIterator dli(*dl);
- Definition *d;
- int minDistance=10000; // init at "infinite"
- MemberDef *bestMatch=0;
- for (dli.toFirst();(d=dli.current());++dli) // foreach definition
- {
- // only look at members
- if (d->definitionType()==Definition::TypeMember)
- {
- // that are also typedefs
- MemberDef *md = (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;
- }
- }
- }
- }
- if (bestMatch) result = bestMatch->typeString();
- //printf("substTypedef(%s,%s)=%s\n",scope?scope->name().data():"<global>",
- // name.data(),result.data());
- return result;
-}
-
-/*! 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 Definition *followPath(Definition *start,FileDef *fileScope,const QCString &path)
-{
- int is,ps=0;
- int l;
- Definition *current=start;
- // for each part of the explicit scope
- while ((is=getScopeFragment(path,ps,&l))!=-1)
- {
- // try to resolve the part if it is a typedef
- QCString qualScopePart = substTypedef(current,fileScope,path.mid(is,l));
- current = current->findInnerCompound(qualScopePart);
- if (current==0) break; // failed to follow the path
- 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,
- FileDef *fileScope,
- Definition *item,
- const QCString &explicitScopePart=""
- )
-{
- 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());
- 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,
- FileDef *fileScope,
- Definition *item,
- const QCString &explicitScopePart="")
-{
- if (nl) // check used namespaces for the class
- {
- NamespaceSDict::Iterator nli(*nl);
- NamespaceDef *und;
- for (nli.toFirst();(und=nli.current());++nli)
- {
- //printf("Trying via used namespace %s\n",und->name().data());
- Definition *sc = explicitScopePart.isEmpty() ? und : followPath(und,fileScope,explicitScopePart);
- if (sc && item->getOuterScope()==sc) return TRUE;
- //printf("Try via used namespace done\n");
- }
- }
- return FALSE;
-}
-
-
-/* Returns the "distance" (=number of levels up) from item to scope, or -1
- * if item in not inside scope.
- */
-int isAccessibleFrom(Definition *scope,FileDef *fileScope,Definition *item)
-{
- //fprintf(stderr,"<isAccesibleFrom(scope=%s,item=%s itemScope=%s)\n",
- // scope->name().data(),item->name().data(),item->getOuterScope()->name().data());
-
- int result=0; // assume we found it
- int i;
-
- if (item->getOuterScope()==scope)
- {
- //fprintf(stderr,"> found it\n");
- }
- else if (scope==Doxygen::globalScope)
- {
- if (fileScope)
- {
- SDict<Definition> *cl = fileScope->getUsedClasses();
- if (accessibleViaUsingClass(cl,fileScope,item))
- {
- //fprintf(stderr,"> found via used class\n");
- goto done;
- }
- NamespaceSDict *nl = fileScope->getUsedNamespaces();
- if (accessibleViaUsingNamespace(nl,fileScope,item))
- {
- //fprintf(stderr,"> found via used namespace\n");
- goto done;
- }
- }
- //fprintf(stderr,"> 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)
- {
- NamespaceDef *nscope = (NamespaceDef*)scope;
- //printf(" %s is namespace with %d used classes\n",nscope->name().data(),nscope->getUsedClasses());
- SDict<Definition> *cl = nscope->getUsedClasses();
- if (accessibleViaUsingClass(cl,fileScope,item))
- {
- //fprintf(stderr,"> found via used class\n");
- goto done;
- }
- NamespaceSDict *nl = nscope->getUsedNamespaces();
- if (accessibleViaUsingNamespace(nl,fileScope,item))
- {
- //fprintf(stderr,"> found via used namespace\n");
- goto done;
- }
- }
- // repeat for the parent scope
- i=isAccessibleFrom(scope->getOuterScope(),fileScope,item);
- //fprintf(stderr,"> result=%d\n",i);
- result= (i==-1) ? -1 : i+1;
- }
-done:
- //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 plus the explicit part.
- */
-int isAccessibleFromWithExpScope(Definition *scope,FileDef *fileScope,Definition *item,
- const QCString &explicitScopePart)
-{
- if (explicitScopePart.isEmpty())
- {
- // handle degenerate case where there is no explicit scope.
- return isAccessibleFrom(scope,fileScope,item);
- }
- //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
- Definition *newScope = followPath(scope,fileScope,explicitScopePart);
- if (newScope) // explicitScope is inside scope => newScope is the result
- {
- //printf("scope traversal successful %s<->%s!\n",item->getOuterScope()->name().data(),newScope->name().data());
- if (item->getOuterScope()==newScope)
- {
- //printf("> found it\n");
- }
- 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());
- NamespaceDef *nscope = (NamespaceDef*)newScope;
- SDict<Definition> *cl = nscope->getUsedClasses();
- if (cl)
- {
- SDict<Definition>::Iterator cli(*cl);
- Definition *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
- {
- //printf("Trying for class %s\n",cd->name().data());
- i = isAccessibleFromWithExpScope(scope,fileScope,item,cd->name());
- if (i!=-1)
- {
- //printf("> found via explicit scope of used class\n");
- goto done;
- }
- }
- }
- NamespaceSDict *nl = nscope->getUsedNamespaces();
- if (nl)
- {
- NamespaceSDict::Iterator nli(*nl);
- 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+1;
- }
- }
- else // failed to resolve explicitScope
- {
- //printf("failed to resolve: scope=%s\n",scope->name().data());
- if (scope->definitionType()==Definition::TypeNamespace)
- {
- NamespaceDef *nscope = (NamespaceDef*)scope;
- SDict<Definition> *cl = nscope->getUsedClasses();
- if (accessibleViaUsingClass(cl,fileScope,item,explicitScopePart))
- {
- //printf("> found in used class\n");
- goto done;
- }
- NamespaceSDict *nl = nscope->getUsedNamespaces();
- if (accessibleViaUsingNamespace(nl,fileScope,item,explicitScopePart))
- {
- //printf("> found in used namespace\n");
- goto done;
- }
- }
- if (scope==Doxygen::globalScope)
- {
- if (fileScope)
- {
- SDict<Definition> *cl = fileScope->getUsedClasses();
- if (accessibleViaUsingClass(cl,fileScope,item,explicitScopePart))
- {
- //printf("> found in used class\n");
- goto done;
- }
- 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+1;
- }
- }
-done:
- //Doxygen::lookupCache.insert(key,new int(result));
- return result;
-}
-
-int computeQualifiedIndex(const QString &name)
-{
- int i = name.find('<');
- return name.findRev("::",i==-1 ? name.length() : i);
-}
-
-/* Find the fully qualified class name refered 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.
- */
-ClassDef *getResolvedClassRec(Definition *scope,
- FileDef *fileScope,
- const char *n,
- MemberDef **pTypeDef,
- QCString *pTemplSpec
- )
-{
- //printf("[getResolvedClassRec(%s,%s)\n",scope?scope->name().data():"<global>",n);
- QCString name=n;
- QCString explicitScopePart;
-
- 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
- }
-
- DefinitionList *dl = Doxygen::symbolMap->find(name);
- //printf("Looking for symbol %s result=%p\n",name.data(),dl);
- if (dl==0)
- {
- return 0;
- }
-
- 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.data();
- 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)
- {
- if (pTemplSpec) *pTemplSpec=pval->templSpec;
- if (pTypeDef) *pTypeDef=pval->typeDef;
- //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);
- }
-
- ClassDef *bestMatch=0;
-
- //printf(" found %d symbol(s) with name %s\n",dl->count(),name.data());
- // now we look int the list of Definitions and determine which one is the "best"
- DefinitionListIterator dli(*dl);
- Definition *d;
- MemberDef *bestTypedef=0;
- QCString bestTemplSpec;
- int minDistance=10000; // init at "infinite"
- int count=0;
- for (dli.toFirst();(d=dli.current());++dli,++count) // foreach definition
- {
- //printf(" found type %x name=%s (%d/%d) d=%p\n",
- // d->definitionType(),d->name().data(),count,dl->count(),d);
-
- // only look at classes and members
- if (d->definitionType()==Definition::TypeClass ||
- d->definitionType()==Definition::TypeMember)
- {
- g_visitedNamespaces.clear();
- // test accessibility of definition within scope.
- int distance = isAccessibleFromWithExpScope(scope,fileScope,d,explicitScopePart);
- //printf(" distance %s is %d\n",d->name().data(),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
- {
- if (!((ClassDef*)d)->isArtificial())
- {
- if (distance<minDistance) // found a definition that is "closer"
- {
- minDistance=distance;
- bestMatch = (ClassDef *)d;
- bestTypedef = 0;
- bestTemplSpec.resize(0);
- }
- 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 = (ClassDef *)d;
- bestTypedef = 0;
- bestTemplSpec.resize(0);
- }
- }
- }
- else if (d->definitionType()==Definition::TypeMember)
- {
- MemberDef *md = (MemberDef *)d;
- //printf(" member isTypedef()=%d\n",md->isTypedef());
- if (md->isTypedef()) // d is a typedef
- {
- //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;
- minDistance=distance;
- MemberDef *enumType = 0;
- ClassDef *cd = newResolveTypedef(fileScope,md,&enumType,&spec);
- if (cd) // shouldn't be 0, but could in some weird cases
- {
- //printf(" bestTypeDef=%p spec=%s\n",md,spec.data());
- bestMatch = cd;
- bestTypedef = md;
- bestTemplSpec = spec;
- }
- else if (enumType)
- {
- bestMatch = 0;
- bestTypedef = enumType;
- bestTemplSpec = "";
- }
- }
- }
- else if (md->isEnumerate())
- {
- if (distance<minDistance)
- {
- minDistance=distance;
- bestMatch = 0;
- bestTypedef = md;
- bestTemplSpec = "";
- }
- }
- }
- } // if definition accessible
- else
- {
- //printf(" Not accessible!\n");
- }
- } // if definition is a class or member
- } // foreach definition
- if (pTypeDef)
- {
- *pTypeDef = bestTypedef;
- }
- if (pTemplSpec)
- {
- *pTemplSpec = bestTemplSpec;
- }
-
- pval=Doxygen::lookupCache.find(key);
- if (pval)
- {
- pval->classDef = bestMatch;
- pval->typeDef = bestTypedef;
- pval->templSpec = bestTemplSpec;
- }
- else
- {
- Doxygen::lookupCache.insert(key,new LookupInfo(bestMatch,bestTypedef,bestTemplSpec));
- }
- //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 refered 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.
- */
-ClassDef *getResolvedClass(Definition *scope,
- FileDef *fileScope,
- const char *n,
- MemberDef **pTypeDef,
- QCString *pTemplSpec,
- bool mayBeUnlinkable
- )
-{
- g_resolvedTypedefs.clear();
- if (scope==0 ||
- (scope->definitionType()!=Definition::TypeClass &&
- scope->definitionType()!=Definition::TypeNamespace
- )
- )
- {
- 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
- // );
- ClassDef *result = getResolvedClassRec(scope,fileScope,n,pTypeDef,pTemplSpec);
- if (!mayBeUnlinkable && result && !result->isLinkable())
- {
- result=0; // don't link to artifical/hidden classes
- }
- //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 inbetween
- // the operator and the >
- {
- if (!isspace((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', ':' };
-
-QCString removeRedundantWhiteSpace(const QCString &s)
-{
- if (s.isEmpty()) return s;
- QCString result;
- uint i;
- uint l=s.length();
- uint csp=0;
- uint vsp=0;
- for (i=0;i<l;i++)
- {
-nextChar:
- char c=s.at(i);
- if (csp<6 && c==constScope[csp]) csp++; else csp=0;
- if (vsp<8 && c==virtualScope[vsp]) vsp++; else vsp=0;
- if (c=='"') // quoted string
- {
- i++;
- result+=c;
- while (i<l)
- {
- char cc=s.at(i);
- result+=cc;
- if (cc=='\\') // escaped character
- { result+=s.at(i+1); i+=2; }
- else if (cc=='"') // end of string
- { i++; goto nextChar; }
- else // any other character
- { i++; }
- }
- }
- else if (i<l-2 && c=='<' && // current char is a <
- (isId(s.at(i+1)) || isspace((uchar)s.at(i+1))) && // next char is an id char or space
- (i<8 || !findOperator(s,i)) // string in front is not "operator"
- )
- {
- result+="< "; // insert extra space for layouting (nested) templates
- }
- else if (i>0 && c=='>' && // current char is a >
- (isId(s.at(i-1)) || isspace((uchar)s.at(i-1)) || s.at(i-1)=='*' || s.at(i-1)=='&') && // prev char is an id char or space
- (i<8 || !findOperator(s,i)) // string in front is not "operator"
- )
- {
- result+=" >"; // insert extra space for layouting (nested) templates
- }
- else if (i>0 && c==',' && !isspace((uchar)s.at(i-1))
- && ((i<l-1 && isId(s.at(i+1)))
- || (i<l-2 && s.at(i+1)=='$' && isId(s.at(i+2))) // for PHP
- || (i<l-3 && s.at(i+1)=='&' && s.at(i+2)=='$' && isId(s.at(i+3))))) // for PHP
- {
- result+=", ";
- }
- else if (i>0 &&
- ((isId(s.at(i)) && s.at(i-1)==')') ||
- (s.at(i)=='\'' && s.at(i-1)==' ')
- )
- )
- {
- result+=' ';
- result+=s.at(i);
- }
- else if (c=='t' && csp==5 &&
- !(isId(s.at(i+1)) /*|| s.at(i+1)==' '*/ || s.at(i+1)==')' ||
- s.at(i+1)==',' || s.at(i+1)=='\0'))
- // prevent const ::A from being converted to const::A
- {
- result+="t ";
- if (s.at(i+1)==' ') i++;
- csp=0;
- }
- else if (c==':' && csp==6) // replace const::A by const ::A
- {
- result+=" :";
- csp=0;
- }
- else if (c=='l' && vsp==7 &&
- !(isId(s.at(i+1)) /*|| s.at(i+1)==' '*/ || s.at(i+1)==')' ||
- s.at(i+1)==',' || s.at(i+1)=='\0'))
- // prevent virtual ::A from being converted to virtual::A
- {
- result+="l ";
- if (s.at(i+1)==' ') i++;
- vsp=0;
- }
- else if (c==':' && vsp==8) // replace virtual::A by virtual ::A
- {
- result+=" :";
- vsp=0;
- }
- else if (!isspace((uchar)c) ||
- ( i>0 && i<l-1 &&
- (isId(s.at(i-1)) || s.at(i-1)==')' || s.at(i-1)==',' || s.at(i-1)=='>' || s.at(i-1)==']')
- && (isId(s.at(i+1)) || (i<l-2 && s.at(i+1)=='$' && isId(s.at(i+2)))
- || (i<l-3 && s.at(i+1)=='&' && s.at(i+2)=='$' && isId(s.at(i+3))))
- )
- )
- {
- if (c=='*' || c=='&' || c=='@' || c=='$')
- {
- uint rl=result.length();
- if (rl>0 && (isId(result.at(rl-1)) || result.at(rl-1)=='>')) result+=' ';
- }
- result+=c;
- }
- }
- //printf("removeRedundantWhiteSpace(`%s')=`%s'\n",s.data(),result.data());
- return result;
-}
-
-bool rightScopeMatch(const QCString &scope, const QCString &name)
-{
- return (name==scope || // equal
- (scope.right(name.length())==name && // substring
- scope.at(scope.length()-name.length()-1)==':' // scope
- )
- );
-}
-
-bool leftScopeMatch(const QCString &scope, const QCString &name)
-{
- return (name==scope || // equal
- (scope.left(name.length())==name && // substring
- scope.at(name.length())==':' // scope
- )
- );
-}
-
-
-void linkifyText(const TextGeneratorIntf &out,Definition *scope,
- FileDef *fileScope,const char *,
- const char *text, bool autoBreak,bool external,
- bool keepSpaces)
-{
- //printf("`%s'\n",text);
- static QRegExp regExp("[a-z_A-Z][~a-z_A-Z0-9.:]*");
- QCString txtStr=text;
- int strLen = txtStr.length();
- //printf("linkifyText scope=%s fileScope=%s strtxt=%s strlen=%d\n",
- // scope?scope->name().data():"<none>",
- // fileScope?fileScope->name().data():"<none>",
- // txtStr.data(),strLen);
- int matchLen;
- int index=0;
- 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 &&
- (newIndex==0 || !(txtStr.at(newIndex-1)>='0' && txtStr.at(newIndex-1)<='9')) // avoid matching part of hex numbers
- )
- {
- // add non-word part to the result
- floatingIndex+=newIndex-skipIndex;
- bool insideString=FALSE;
- int i;
- for (i=index;i<newIndex;i++)
- {
- if (txtStr.at(i)=='"') insideString=!insideString;
- }
-
- if (strLen>30 && floatingIndex>25 && autoBreak) // try to insert a split point
- {
- QCString splitText = txtStr.mid(skipIndex,newIndex-skipIndex);
- int splitLength = splitText.length();
- int i=splitText.find('<');
- if (i==-1) i=splitText.find(',');
- if (i==-1) i=splitText.find(' ');
- if (i!=-1) // add a link-break at i in case of Html output
- {
- out.writeString(splitText.left(i+1),keepSpaces);
- out.writeBreak();
- out.writeString(splitText.right(splitLength-i-1),keepSpaces);
- }
- else
- {
- out.writeString(splitText,keepSpaces);
- }
- floatingIndex=splitLength-i-1;
- }
- else
- {
- //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);
- QCString matchWord = substitute(word,".","::");
- //printf("linkifyText word=%s matchWord=%s scope=%s\n",
- // word.data(),matchWord.data(),scope?scope->name().data():"<none>");
- bool found=FALSE;
- if (!insideString)
- {
- ClassDef *cd=0;
- FileDef *fd=0;
- MemberDef *md=0;
- NamespaceDef *nd=0;
- GroupDef *gd=0;
-
- MemberDef *typeDef=0;
- if ((cd=getResolvedClass(scope,fileScope,matchWord,&typeDef)))
- {
- // add link to the result
- if (external ? cd->isLinkable() : cd->isLinkableInProject())
- {
- out.writeLink(cd->getReference(),cd->getOutputFileBase(),0,word);
- found=TRUE;
- }
- }
- else if (typeDef)
- {
- if (external ? typeDef->isLinkable() : typeDef->isLinkableInProject())
- {
- out.writeLink(typeDef->getReference(),
- typeDef->getOutputFileBase(),
- typeDef->anchor(),
- word);
- found=TRUE;
- }
- }
- else if ((cd=getClass(matchWord+"-p"))) // search for Obj-C protocols as well
- {
- // add link to the result
- if (external ? cd->isLinkable() : cd->isLinkableInProject())
- {
- out.writeLink(cd->getReference(),cd->getOutputFileBase(),0,word);
- found=TRUE;
- }
- }
-
- QCString scopeName;
- if (scope &&
- (scope->definitionType()==Definition::TypeClass ||
- scope->definitionType()==Definition::TypeNamespace
- )
- )
- {
- scopeName=scope->name();
- }
- //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() ||
- md->isReference() || md->isVariable()
- ) &&
- (external ? md->isLinkable() : md->isLinkableInProject())
- )
- {
- //printf("Found ref scope=%s\n",d?d->name().data():"<global>");
- if ((external ? md->isLinkable() : md->isLinkableInProject()))
- {
- //ol.writeObjectLink(d->getReference(),d->getOutputFileBase(),
- // md->anchor(),word);
- out.writeLink(md->getReference(),md->getOutputFileBase(),
- md->anchor(),word);
- found=TRUE;
- }
- }
- }
-
- if (!found) // add word to the result
- {
- out.writeString(word,keepSpaces);
- }
- // set next start point in the string
- //printf("index=%d/%d\n",index,txtStr.length());
- skipIndex=index=newIndex+matchLen;
- floatingIndex+=matchLen;
- }
- // add last part of the string to the result.
- //ol.docify(txtStr.right(txtStr.length()-skipIndex));
- out.writeString(txtStr.right(txtStr.length()-skipIndex),keepSpaces);
-}
-
-
-void writeExample(OutputList &ol,ExampleSDict *ed)
-{
- QCString exampleLine=theTranslator->trWriteList(ed->count());
-
- //bool latexEnabled = ol.isEnabled(OutputGenerator::Latex);
- //bool manEnabled = ol.isEnabled(OutputGenerator::Man);
- //bool htmlEnabled = ol.isEnabled(OutputGenerator::Html);
- QRegExp marker("@[0-9]+");
- int index=0,newIndex,matchLen;
- // now replace all markers in inheritLine with links to the classes
- while ((newIndex=marker.match(exampleLine,index,&matchLen))!=-1)
- {
- 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)
- {
- ol.pushGeneratorState();
- //if (latexEnabled) ol.disable(OutputGenerator::Latex);
- ol.disable(OutputGenerator::Latex);
- ol.disable(OutputGenerator::RTF);
- // link for Html / man
- ol.writeObjectLink(0,e->file,e->anchor,e->name);
- ol.popGeneratorState();
-
- ol.pushGeneratorState();
- //if (latexEnabled) ol.enable(OutputGenerator::Latex);
- ol.disable(OutputGenerator::Man);
- 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);
- //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(".");
-}
-
-
-QCString argListToString(ArgumentList *al,bool useCanonicalType)
-{
- QCString result;
- if (al==0) return result;
- Argument *a=al->first();
- result+="(";
- while (a)
- {
- QCString type1 = useCanonicalType && !a->canType.isEmpty() ?
- a->canType : a->type;
- QCString type2;
- int i=type1.find(")("); // hack to deal with function pointers
- if (i!=-1)
- {
- type2=type1.mid(i);
- type1=type1.left(i);
- }
- if (!a->attrib.isEmpty())
- {
- result+=a->attrib+" ";
- }
- if (!a->name.isEmpty() || !a->array.isEmpty())
- {
- result+= type1+" "+a->name+type2+a->array;
- }
- else
- {
- result+= type1+type2;
- }
- if (!a->defval.isEmpty())
- {
- result+="="+a->defval;
- }
- a = al->next();
- if (a) result+=", ";
- }
- result+=")";
- if (al->constSpecifier) result+=" const";
- if (al->volatileSpecifier) result+=" volatile";
- return removeRedundantWhiteSpace(result);
-}
-
-QCString tempArgListToString(ArgumentList *al)
-{
- QCString result;
- if (al==0) return result;
- result="<";
- Argument *a=al->first();
- while (a)
- {
- if (!a->name.isEmpty()) // add template argument 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)
- {
- result+=a->type.right(a->type.length()-i-1);
- }
- }
- a=al->next();
- if (a) result+=", ";
- }
- result+=">";
- return removeRedundantWhiteSpace(result);
-}
-
-
-// compute the HTML anchors for a list of members
-void setAnchors(ClassDef *cd,char id,MemberList *ml,int groupId)
-{
- int count=0;
- 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(anchor);
- //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 lenght \a len and converts CR LF (DOS)
- * or CR (MAC) line ending to LF (Unix). Returns the length of the
- * converted content (i.e. the same as \a len (Unix, MAC) or
- * smaller (DOS).
- */
-int filterCRLF(char *buf,int len)
-{
- int src = 0; // source index
- int dest = 0; // destination index
- char c; // current character
-
- while (src<len)
- {
- c = buf[src++]; // Remember the processed character.
- if (c == '\r') // CR to be solved (MAC, DOS)
- {
- c = '\n'; // each CR to LF
- if (src<len && buf[src] == '\n')
- ++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
- {
- c = ' '; // turn into a space
- }
- buf[dest++] = c; // copy the (modified) character to dest
- }
- return dest; // length of the valid part of the buf
-}
-
-
-/*! looks for a filter for the file \a name. Returns the name of the filter
- * if there is a match for the file name, otherwise an empty string.
- */
-QCString getFileFilter(const char* name)
-{
- // sanity check
- if (name==0) return "";
-
- // first look for filter pattern list
- QStrList& filterList = Config_getList("FILTER_PATTERNS");
-
- if (filterList.isEmpty())
- {
- // use INPUT_FILTER instead (For all files)
- return Config_getString("INPUT_FILTER");
- }
-
- // compare the file name to the filter pattern list
- QStrListIterator sli(filterList);
- char* filterStr;
- for (sli.toFirst(); (filterStr = sli.current()); ++sli)
- {
- QCString fs = filterStr;
- int i_equals=fs.find('=');
-
- if (i_equals!=-1)
- {
- QCString filterPattern = fs.left(i_equals);
-
-#if defined(_WIN32) || defined(_OS_MAC_) // windows or mac
- QRegExp fpat(filterPattern,FALSE,TRUE); // case insensitive match
-#else // unix
- QRegExp fpat(filterPattern,TRUE,TRUE); // case sensitive match
-#endif
-
- if (fpat.match(name)!=-1)
- {
- // found a match!
- QCString filterName = fs.mid(i_equals+1);
- if (filterName.find(' ')!=-1)
- { // add quotes if the name has spaces
- filterName="\""+filterName+"\"";
- }
- return filterName;
- }
- }
- }
-
- // no match
- return "";
-}
-
-/*! 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.
- */
-QCString fileToString(const char *name,bool filter)
-{
- if (name==0 || name[0]==0) return 0;
- QFile f;
-
- bool fileOpened=FALSE;
- if (name[0]=='-' && name[1]==0) // read from stdin
- {
- fileOpened=f.open(IO_ReadOnly,stdin);
- if (fileOpened)
- {
- const int bSize=4096;
- QCString contents(bSize);
- int totalSize=0;
- int size;
- while ((size=f.readBlock(contents.data()+totalSize,bSize))==bSize)
- {
- totalSize+=bSize;
- contents.resize(totalSize+bSize);
- }
- totalSize = filterCRLF(contents.data(),totalSize+size)+2;
- contents.resize(totalSize);
- contents.at(totalSize-2)='\n'; // to help the scanner
- contents.at(totalSize-1)='\0';
- return contents;
- }
- }
- else // read from file
- {
- QFileInfo fi(name);
- if (!fi.exists() || !fi.isFile())
- {
- err("Error: file `%s' not found\n",name);
- return "";
- }
- QCString filterName = getFileFilter(name);
- if (filterName.isEmpty() || !filter)
- {
- f.setName(name);
- fileOpened=f.open(IO_ReadOnly);
- if (fileOpened)
- {
- int fsize=f.size();
- QCString contents(fsize+2);
- f.readBlock(contents.data(),fsize);
- if (fsize==0 || contents[fsize-1]=='\n')
- contents[fsize]='\0';
- else
- contents[fsize]='\n'; // to help the scanner
- contents[fsize+1]='\0';
- f.close();
- int newSize = filterCRLF(contents.data(),fsize+2);
- if (newSize!=fsize+2)
- {
- contents.resize(newSize);
- }
- return contents;
- }
- }
- else // filter the input
- {
- QCString cmd=filterName+" \""+name+"\"";
- FILE *f=popen(cmd,"r");
- if (!f)
- {
- err("Error: could not execute filter %s\n",filterName.data());
- return "";
- }
- const int bSize=4096;
- QCString contents(bSize);
- int totalSize=0;
- int size;
- while ((size=fread(contents.data()+totalSize,1,bSize,f))==bSize)
- {
- totalSize+=bSize;
- contents.resize(totalSize+bSize);
- }
- totalSize = filterCRLF(contents.data(),totalSize+size)+2;
- contents.resize(totalSize);
- contents.at(totalSize-2)='\n'; // to help the scanner
- contents.at(totalSize-1)='\0';
- pclose(f);
- return contents;
- }
- }
- if (!fileOpened)
- {
- err("Error: cannot open file `%s' for reading\n",name);
- }
- return "";
-}
-
-QCString dateToString(bool includeTime)
-{
- if (includeTime)
- {
- return convertToQCString(QDateTime::currentDateTime().toString());
- }
- else
- {
- const QDate &d=QDate::currentDate();
- QCString result;
- result.sprintf("%d %s %d",
- d.day(),
- convertToQCString(d.monthName(d.month())).data(),
- d.year());
- return result;
- }
- //QDate date=dt.date();
- //QTime time=dt.time();
- //QCString dtString;
- //dtString.sprintf("%02d:%02d, %04d/%02d/%02d",
- // time.hour(),time.minute(),date.year(),date.month(),date.day());
- //return dtString;
-}
-
-QCString yearToString()
-{
- const QDate &d=QDate::currentDate();
- QCString result;
- result.sprintf("%d", d.year());
- return result;
-}
-
-
-//----------------------------------------------------------------------
-// recursive function that returns the number of branches in the
-// inheritance tree that the base class `bcd' is below the class `cd'
-
-int minClassDistance(ClassDef *cd,ClassDef *bcd,int level)
-{
- 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 (level==256)
- {
- err("Error: Internal inconsistency: found class %s seem to have a recursive "
- "inheritance relation! Please send a bug report to dimitri@stack.nl\n",cd->name().data());
- return -1;
- }
- BaseClassListIterator bcli(*cd->baseClasses());
- int m=maxInheritanceDepth;
- for ( ; bcli.current() ; ++bcli)
- {
- //printf("class %s base class %s\n",cd->name().data(),bcli.current()->classDef->name().data());
- int mc=minClassDistance(bcli.current()->classDef,bcd,level+1);
- if (mc<m) m=mc;
- if (m<0) break;
- }
- return m;
-}
-
-//static void printArgList(ArgumentList *al)
-//{
-// if (al==0) return;
-// ArgumentListIterator ali(*al);
-// Argument *a;
-// printf("(");
-// for (;(a=ali.current());++ali)
-// {
-// printf("t=`%s' n=`%s' v=`%s' ",a->type.data(),!a->name.isEmpty()>0?a->name.data():"",!a->defval.isEmpty()>0?a->defval.data():"");
-// }
-// printf(")");
-//}
-
-#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)
-{
- //printf("trimBaseClassScope level=%d `%s'\n",level,s.data());
- BaseClassListIterator bcli(*bcl);
- BaseClassDef *bcd;
- for (;(bcd=bcli.current());++bcli)
- {
- ClassDef *cd=bcd->classDef;
- //printf("Trying class %s\n",cd->name().data());
- int spos=s.find(cd->name()+"::");
- if (spos!=-1)
- {
- s = s.left(spos)+s.right(
- s.length()-spos-cd->name().length()-2
- );
- }
- //printf("base class `%s'\n",cd->name().data());
- if (cd->baseClasses()->count()>0)
- trimBaseClassScope(cd->baseClasses(),s,level+1);
- }
-}
-
-#if 0
-/*! if either t1 or t2 contains a namespace scope, then remove that
- * scope. If neither or both have a namespace scope, t1 and t2 remain
- * unchanged.
- */
-static void trimNamespaceScope(QCString &t1,QCString &t2,const QCString &nsName)
-{
- int p1=t1.length();
- int p2=t2.length();
- for (;;)
- {
- int i1=p1==0 ? -1 : t1.findRev("::",p1);
- int i2=p2==0 ? -1 : t2.findRev("::",p2);
- if (i1==-1 && i2==-1)
- {
- return;
- }
- if (i1!=-1 && i2==-1) // only t1 has a scope
- {
- QCString scope=t1.left(i1);
- replaceNamespaceAliases(scope,i1);
-
- int so=nsName.length();
- do
- {
- QCString fullScope=nsName.left(so);
- if (!fullScope.isEmpty() && !scope.isEmpty()) fullScope+="::";
- fullScope+=scope;
- if (!fullScope.isEmpty() && Doxygen::namespaceSDict[fullScope]!=0) // scope is a namespace
- {
- t1 = t1.right(t1.length()-i1-2);
- return;
- }
- if (so==0)
- {
- so=-1;
- }
- else if ((so=nsName.findRev("::",so-1))==-1)
- {
- so=0;
- }
- }
- while (so>=0);
- }
- else if (i1==-1 && i2!=-1) // only t2 has a scope
- {
- QCString scope=t2.left(i2);
- replaceNamespaceAliases(scope,i2);
-
- int so=nsName.length();
- do
- {
- QCString fullScope=nsName.left(so);
- if (!fullScope.isEmpty() && !scope.isEmpty()) fullScope+="::";
- fullScope+=scope;
- if (!fullScope.isEmpty() && Doxygen::namespaceSDict[fullScope]!=0) // scope is a namespace
- {
- t2 = t2.right(t2.length()-i2-2);
- return;
- }
- if (so==0)
- {
- so=-1;
- }
- else if ((so=nsName.findRev("::",so-1))==-1)
- {
- so=0;
- }
- }
- while (so>=0);
- }
- p1 = QMAX(i1-2,0);
- p2 = QMAX(i2-2,0);
- }
-}
-#endif
-
-static void stripIrrelevantString(QCString &target,const QCString &str)
-{
- if (target==str) { target.resize(0); return; }
- int i,p=0;
- int l=str.length();
- while ((i=target.find(str,p))!=-1)
- {
- bool isMatch = (i==0 || !isId(target.at(i-1))) && // not a character before str
- (i+l==(int)target.length() || !isId(target.at(i+l))); // not a character after str
- if (isMatch)
- {
- int i1=target.find('*',i+l);
- int i2=target.find('&',i+l);
- if (i1==-1 && i2==-1)
- {
- // strip str from target at index i
- target=target.left(i)+target.right(target.length()-i-l);
- i-=l;
- }
- else if ((i1!=-1 && i<i1) || (i2!=-1 && i<i2)) // str before * or &
- {
- // move str to front
- target=str+" "+target.left(i)+target.right(target.length()-i-l);
- i++;
- }
- }
- p = i+l;
- }
-}
-
-/*! According to the C++ spec and Ivan Vecerina:
-
- Parameter declarations that differ only in the presence or absence
- of const and/or volatile are equivalent.
-
- So the following example, show what is stripped by this routine
- for const. The same is done for volatile.
-
- \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
- \endcode
- */
-void stripIrrelevantConstVolatile(QCString &s)
-{
- //printf("stripIrrelevantConstVolatile(%s)=",s.data());
- stripIrrelevantString(s,"const");
- stripIrrelevantString(s,"volatile");
- //printf("%s\n",s.data());
-}
-
-
-// a bit of debug support for matchArguments
-#define MATCH
-#define NOMATCH
-//#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 distingishing "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 ofcourse, 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 (strncmp(srcAType,"typename ",9)==0)
- {
- srcAType = srcAType.right(srcAType.length()-9);
- }
- if (strncmp(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()->count()>0)
- {
- 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;
-}
-
-
-/*!
- * Matches the arguments list srcAl with the argument list dstAl
- * Returns TRUE if the argument lists are equal. Two argument list are
- * considered equal if the number of arguments is equal and the types of all
- * arguments are equal. Furthermore the const and volatile specifiers
- * stored in the list should be equal.
- */
-bool matchArguments(ArgumentList *srcAl,ArgumentList *dstAl,
- const char *cl,const char *ns,bool checkCV,
- NamespaceSDict *usingNamespaces,
- SDict<Definition> *usingClasses)
-{
- QCString className=cl;
- QCString namespaceName=ns;
-
- // strip template specialization from class name if present
- //int til=className.find('<'),tir=className.find('>');
- //if (til!=-1 && tir!=-1 && tir>til)
- //{
- // className=className.left(til)+className.right(className.length()-tir-1);
- //}
-
- //printf("matchArguments(%s,%s) className=%s namespaceName=%s checkCV=%d usingNamespaces=%d usingClasses=%d\n",
- // srcAl ? argListToString(srcAl).data() : "",
- // dstAl ? argListToString(dstAl).data() : "",
- // cl,ns,checkCV,
- // usingNamespaces?usingNamespaces->count():0,
- // usingClasses?usingClasses->count():0
- // );
-
- if (srcAl==0 || dstAl==0)
- {
- bool match = srcAl==dstAl; // at least one of the members is not a function
- if (match)
- {
- MATCH
- return TRUE;
- }
- else
- {
- NOMATCH
- return FALSE;
- }
- }
-
- // handle special case with void argument
- if ( srcAl->count()==0 && dstAl->count()==1 &&
- dstAl->getFirst()->type=="void" )
- { // special case for finding match between func() and func(void)
- Argument *a=new Argument;
- a->type = "void";
- srcAl->append(a);
- MATCH
- return TRUE;
- }
- if ( dstAl->count()==0 && srcAl->count()==1 &&
- srcAl->getFirst()->type=="void" )
- { // special case for finding match between func(void) and func()
- Argument *a=new Argument;
- a->type = "void";
- dstAl->append(a);
- MATCH
- return TRUE;
- }
-
- if (srcAl->count() != dstAl->count())
- {
- NOMATCH
- return FALSE; // different number of arguments -> no match
- }
-
- if (checkCV)
- {
- if (srcAl->constSpecifier != dstAl->constSpecifier)
- {
- NOMATCH
- return FALSE; // one member is const, the other not -> no match
- }
- if (srcAl->volatileSpecifier != dstAl->volatileSpecifier)
- {
- NOMATCH
- return FALSE; // one member is volatile, the other not -> no match
- }
- }
-
- // so far the argument list could match, so we need to compare the types of
- // all arguments.
- ArgumentListIterator srcAli(*srcAl),dstAli(*dstAl);
- Argument *srcA,*dstA;
- for (;(srcA=srcAli.current(),dstA=dstAli.current());++srcAli,++dstAli)
- {
- if (!matchArgument(srcA,dstA,className,namespaceName,
- usingNamespaces,usingClasses))
- {
- NOMATCH
- return FALSE;
- }
- }
- MATCH
- return TRUE; // all arguments match
-}
-
-#endif
-
-#if 0
-static QCString resolveSymbolName(FileDef *fs,Definition *symbol,QCString &templSpec)
-{
- ASSERT(symbol!=0);
- if (symbol->definitionType()==Definition::TypeMember &&
- ((MemberDef*)symbol)->isTypedef()) // if symbol is a typedef then try
- // to resolve it
- {
- MemberDef *md = 0;
- ClassDef *cd = newResolveTypedef(fs,(MemberDef*)symbol,&md,&templSpec);
- if (cd)
- {
- return cd->qualifiedName()+templSpec;
- }
- else if (md)
- {
- return md->qualifiedName();
- }
- }
- return symbol->qualifiedName();
-}
-#endif
-
-static QCString stripDeclKeywords(const QCString &s)
-{
- int i=s.find(" class ");
- if (i!=-1) return s.left(i)+s.mid(i+6);
- i=s.find(" typename ");
- if (i!=-1) return s.left(i)+s.mid(i+9);
- i=s.find(" union ");
- if (i!=-1) return s.left(i)+s.mid(i+6);
- i=s.find(" struct ");
- if (i!=-1) return s.left(i)+s.mid(i+7);
- return s;
-}
-
-static QCString getCanonicalTypeForIdentifier(
- Definition *d,FileDef *fs,const QCString &word,
- QCString *tSpec)
-{
- QCString symName,scope,result,templSpec,tmpName;
- //DefinitionList *defList=0;
- if (tSpec) templSpec = stripDeclKeywords(*tSpec);
-
- if (word.findRev("::")!=-1 && !(tmpName=stripScope(word)).isEmpty())
- {
- symName=tmpName;
- }
- else
- {
- symName=word;
- }
-
-#if 0 // I've commented this out because it leads to obscure errors
- // while not gaining much w.r.t. speed.
- if (!symName.isEmpty() && !templSpec.isEmpty() &&
- (defList=Doxygen::symbolMap->find(symName+templSpec)) &&
- defList->count()==1) // word without scope but with template specs
- // is a unique symbol in the symbol map
- {
- QCString ts;
- result = resolveSymbolName(fs,defList->first(),ts);
- if (tSpec) *tSpec="";
- }
- else if (!symName.isEmpty() &&
- (defList=Doxygen::symbolMap->find(symName)) &&
- defList->count()==1) // word without scope is a
- // unique symbol in the symbol map
- {
- QCString ts;
- //printf("unique symName=%s templSpec=%s\n",symName.data(),templSpec.data());
- result = resolveSymbolName(fs,defList->first(),ts)+templSpec;
- //printf("result=%s ts=%s\n",result.data(),ts.data());
- if (tSpec) *tSpec="";
- }
- else // symbol not unique, try to find the one in the right scope
-#endif
- {
- ClassDef *cd = 0;
- MemberDef *mType = 0;
- QCString ts;
- if (!templSpec.isEmpty())
- {
- cd = getResolvedClass(d,fs,word+templSpec,&mType,&ts,TRUE);
- if (cd && tSpec) *tSpec="";
- }
- if (cd==0)
- {
- cd = getResolvedClass(d,fs,word,&mType,&ts,TRUE);
- }
-
- if (!ts.isEmpty() && templSpec.isEmpty())
- {
- templSpec = stripDeclKeywords(ts);
- }
- //printf("symbol=%s word=%s cd=%s d=%s fs=%s\n",
- // symName.data(),
- // word.data(),
- // cd?cd->name().data():"<none>",
- // d?d->name().data():"<none>",
- // fs?fs->name().data():"<none>"
- // );
-
- //printf(">>>> word '%s' => '%s' templSpec=%s ts=%s\n",
- // (word+templSpec).data(),
- // cd?cd->qualifiedNameWithTemplateParameters().data():"<none>",
- // templSpec.data(),ts.data());
- if (cd) // known type
- {
- //result = cd->qualifiedNameWithTemplateParameters();
- result = removeRedundantWhiteSpace(cd->qualifiedName()+templSpec);
- if (cd->isTemplate() && tSpec)
- {
- *tSpec="";
- }
- }
- else if (mType && mType->isEnumerate()) // an enum
- {
- result = mType->qualifiedName();
- }
- else // not known as a class
- {
- QCString resolvedType = resolveTypeDef(d,word);
- if (resolvedType.isEmpty()) // not known as a typedef either
- {
- result = word;
- }
- else
- {
- result = resolvedType;
- }
- }
- }
- return result;
-}
-
-static QCString extractCanonicalType(Definition *d,FileDef *fs,const Argument *arg)
-{
- QCString type = arg->type.stripWhiteSpace();
- QCString name = arg->name;
- //printf("extractCanonicalType(type=%s,name=%s)\n",type.data(),name.data());
- 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+=" ";
- type+=name;
- }
-
- // strip const and volatile keywords that are not relatevant for the type
- stripIrrelevantConstVolatile(type);
-
- // strip leading keywords
- type.stripPrefix("class ");
- type.stripPrefix("struct ");
- type.stripPrefix("union ");
- type.stripPrefix("enum ");
- type.stripPrefix("typename ");
-
- type = removeRedundantWhiteSpace(type);
- //printf("extractCanonicalTyp2(type=%s,name=%s)\n",type.data(),name.data());
-
- static QRegExp id("[a-z_A-Z][:a-z_A-Z0-9]*");
-
- QCString canType,templSpec,word;
- int i,p=0,pp=0;
- while ((i=extractClassNameFromType(type,p,word,templSpec))!=-1)
- // foreach identifier in the type
- {
- //printf(" i=%d p=%d\n",i,p);
- canType += type.mid(pp,i-pp);
-
- //printf("word=%s templSpec=%s\n",word.data(),templSpec.data());
-
- canType += getCanonicalTypeForIdentifier(d,fs,word,&templSpec);
- 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.
- {
- static QRegExp re("[a-z_A-Z][a-z_A-Z0-9]*");
- int tp=0,tl,ti;
- // for each identifier template specifier
- while ((ti=re.match(templSpec,tp,&tl))!=-1)
- {
- canType += templSpec.mid(tp,ti-tp);
- canType += getCanonicalTypeForIdentifier(d,fs,templSpec.mid(ti,tl),0);
- tp=ti+tl;
- }
- canType+=templSpec.right(templSpec.length()-tp);
- }
-
- pp=p;
- }
- canType += type.right(type.length()-pp);
- //printf("extractCanonicalType = %s->%s\n",type.data(),canType.data());
-
- return removeRedundantWhiteSpace(canType);
-}
-
-static bool matchArgument2(
- Definition *srcScope,FileDef *srcFileScope,Argument *srcA,
- Definition *dstScope,FileDef *dstFileScope,Argument *dstA
- )
-{
- //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(),
- // dstScope ? dstScope->name().data() : "",
- // dstA->type.data(),dstA->name.data(),dstA->canType.data());
-
- if (srcA->array!=dstA->array) // nomatch for char[] against char
- {
- NOMATCH
- return FALSE;
- }
- QCString sSrcName=" "+srcA->name;
- QCString sDstName=" "+dstA->name;
- if (sSrcName==dstA->type.right(sSrcName.length()))
- { // case "unsigned int" <-> "unsigned int i"
- srcA->type+=sSrcName;
- srcA->name="";
- srcA->canType=""; // invalidate cached type value
- }
- else if (sDstName==srcA->type.right(sDstName.length()))
- { // case "unsigned int i" <-> "unsigned int"
- dstA->type+=sDstName;
- dstA->name="";
- dstA->canType=""; // invalidate cached type value
- }
-
- if (srcA->canType.isEmpty())
- {
- srcA->canType = extractCanonicalType(srcScope,srcFileScope,srcA);
- }
- if (dstA->canType.isEmpty())
- {
- dstA->canType = extractCanonicalType(dstScope,dstFileScope,dstA);
- }
-
- if (srcA->canType==dstA->canType)
- {
- MATCH
- return TRUE;
- }
- else
- {
- //printf(" Canonical types do not match [%s]<->[%s]\n",
- // srcA->canType.data(),dstA->canType.data());
- NOMATCH
- return FALSE;
- }
-}
-
-
-// new algorithm for argument matching
-bool matchArguments2(Definition *srcScope,FileDef *srcFileScope,ArgumentList *srcAl,
- Definition *dstScope,FileDef *dstFileScope,ArgumentList *dstAl,
- bool checkCV
- )
-{
- ASSERT(srcScope!=0 && dstScope!=0);
-
- if (srcAl==0 || dstAl==0)
- {
- bool match = srcAl==dstAl; // at least one of the members is not a function
- if (match)
- {
- MATCH
- return TRUE;
- }
- else
- {
- NOMATCH
- return FALSE;
- }
- }
-
- // handle special case with void argument
- if ( srcAl->count()==0 && dstAl->count()==1 &&
- dstAl->getFirst()->type=="void" )
- { // special case for finding match between func() and func(void)
- Argument *a=new Argument;
- a->type = "void";
- srcAl->append(a);
- MATCH
- return TRUE;
- }
- if ( dstAl->count()==0 && srcAl->count()==1 &&
- srcAl->getFirst()->type=="void" )
- { // special case for finding match between func(void) and func()
- Argument *a=new Argument;
- a->type = "void";
- dstAl->append(a);
- MATCH
- return TRUE;
- }
-
- if (srcAl->count() != dstAl->count())
- {
- NOMATCH
- return FALSE; // different number of arguments -> no match
- }
-
- if (checkCV)
- {
- if (srcAl->constSpecifier != dstAl->constSpecifier)
- {
- NOMATCH
- return FALSE; // one member is const, the other not -> no match
- }
- if (srcAl->volatileSpecifier != dstAl->volatileSpecifier)
- {
- NOMATCH
- return FALSE; // one member is volatile, the other not -> no match
- }
- }
-
- // so far the argument list could match, so we need to compare the types of
- // all arguments.
- ArgumentListIterator srcAli(*srcAl),dstAli(*dstAl);
- Argument *srcA,*dstA;
- for (;(srcA=srcAli.current(),dstA=dstAli.current());++srcAli,++dstAli)
- {
- if (!matchArgument2(srcScope,srcFileScope,srcA,
- dstScope,dstFileScope,dstA)
- )
- {
- NOMATCH
- return FALSE;
- }
- }
- MATCH
- return TRUE; // all arguments match
-}
-
-
-
-// merges the initializer of two argument lists
-// pre: the types of the arguments in the list should match.
-void mergeArguments(ArgumentList *srcAl,ArgumentList *dstAl,bool forceNameOverwrite)
-{
- //printf("mergeArguments `%s', `%s'\n",
- // argListToString(srcAl).data(),argListToString(dstAl).data());
-
- if (srcAl==0 || dstAl==0 || srcAl->count()!=dstAl->count())
- {
- return; // invalid argument lists -> do not merge
- }
-
- ArgumentListIterator srcAli(*srcAl),dstAli(*dstAl);
- Argument *srcA,*dstA;
- for (;(srcA=srcAli.current(),dstA=dstAli.current());++srcAli,++dstAli)
- {
- if (srcA->defval.isEmpty() && !dstA->defval.isEmpty())
- {
- //printf("Defval changing `%s'->`%s'\n",srcA->defval.data(),dstA->defval.data());
- srcA->defval=dstA->defval.copy();
- }
- else if (!srcA->defval.isEmpty() && dstA->defval.isEmpty())
- {
- //printf("Defval changing `%s'->`%s'\n",dstA->defval.data(),srcA->defval.data());
- dstA->defval=srcA->defval.copy();
- }
-
- // fix wrongly detected const or volatile specificiers before merging.
- // example: "const A *const" is detected as type="const A *" name="const"
- if (srcA->name=="const" || srcA->name=="volatile")
- {
- srcA->type+=" "+srcA->name;
- srcA->name.resize(0);
- }
- if (dstA->name=="const" || dstA->name=="volatile")
- {
- dstA->type+=" "+dstA->name;
- dstA->name.resize(0);
- }
-
- if (srcA->type==dstA->type)
- {
- if (srcA->name.isEmpty() && !dstA->name.isEmpty())
- {
- //printf("type: `%s':=`%s'\n",srcA->type.data(),dstA->type.data());
- //printf("name: `%s':=`%s'\n",srcA->name.data(),dstA->name.data());
- srcA->type = dstA->type.copy();
- srcA->name = dstA->name.copy();
- }
- else if (!srcA->name.isEmpty() && dstA->name.isEmpty())
- {
- //printf("type: `%s':=`%s'\n",dstA->type.data(),srcA->type.data());
- //printf("name: `%s':=`%s'\n",dstA->name.data(),srcA->name.data());
- dstA->type = srcA->type.copy();
- dstA->name = dstA->name.copy();
- }
- else if (!srcA->name.isEmpty() && !dstA->name.isEmpty())
- {
- //printf("srcA->name=%s dstA->name=%s\n",srcA->name.data(),dstA->name.data());
- if (forceNameOverwrite)
- {
- srcA->name = dstA->name;
- }
- else
- {
- if (srcA->docs.isEmpty() && !dstA->docs.isEmpty())
- {
- srcA->name = dstA->name;
- }
- else if (!srcA->docs.isEmpty() && dstA->docs.isEmpty())
- {
- dstA->name = srcA->name;
- }
- }
- }
- }
- else
- {
- //printf("merging %s:%s <-> %s:%s\n",srcA->type.data(),srcA->name.data(),dstA->type.data(),dstA->name.data());
- if (srcA->type+" "+srcA->name==dstA->type) // "unsigned long:int" <-> "unsigned long int:bla"
- {
- srcA->type+=" "+srcA->name;
- srcA->name=dstA->name;
- }
- else if (dstA->type+" "+dstA->name==srcA->type) // "unsigned long int bla" <-> "unsigned long int"
- {
- dstA->type+=" "+dstA->name;
- dstA->name=srcA->name;
- }
- else if (srcA->name.isEmpty() && !dstA->name.isEmpty())
- {
- srcA->name = dstA->name;
- }
- else if (dstA->name.isEmpty() && !srcA->name.isEmpty())
- {
- dstA->name = srcA->name;
- }
- }
- int i1=srcA->type.find("::"),
- i2=dstA->type.find("::"),
- j1=srcA->type.length()-i1-2,
- j2=dstA->type.length()-i2-2;
- if (i1!=-1 && i2==-1 && srcA->type.right(j1)==dstA->type)
- {
- //printf("type: `%s':=`%s'\n",dstA->type.data(),srcA->type.data());
- //printf("name: `%s':=`%s'\n",dstA->name.data(),srcA->name.data());
- dstA->type = srcA->type.left(i1+2)+dstA->type;
- dstA->name = dstA->name.copy();
- }
- else if (i1==-1 && i2!=-1 && dstA->type.right(j2)==srcA->type)
- {
- //printf("type: `%s':=`%s'\n",srcA->type.data(),dstA->type.data());
- //printf("name: `%s':=`%s'\n",dstA->name.data(),srcA->name.data());
- srcA->type = dstA->type.left(i2+2)+srcA->type;
- srcA->name = dstA->name.copy();
- }
- if (srcA->docs.isEmpty() && !dstA->docs.isEmpty())
- {
- srcA->docs = dstA->docs.copy();
- }
- else if (dstA->docs.isEmpty() && !srcA->docs.isEmpty())
- {
- dstA->docs = srcA->docs.copy();
- }
- //printf("Merge argument `%s|%s' `%s|%s'\n",
- // srcA->type.data(),srcA->name.data(),
- // dstA->type.data(),dstA->name.data());
- }
-}
-
-/*!
- * Searches for a member definition given its name `memberName' as a string.
- * 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
- * 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.
- * 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'
- * 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.
- * - if `fd' is non zero, the member was found in the global namespace of
- * file fd.
- */
-bool getDefs(const QCString &scName,const QCString &memberName,
- const char *args,
- MemberDef *&md,
- ClassDef *&cd, FileDef *&fd, NamespaceDef *&nd, GroupDef *&gd,
- bool forceEmptyScope,
- FileDef *currentFile,
- bool checkCV
- )
-{
- fd=0, md=0, cd=0, nd=0, gd=0;
- if (memberName.isEmpty()) return FALSE; /* empty name => nothing to link */
-
- QCString scopeName=scName;
- //printf("Search for name=%s args=%s in scope=%s\n",
- // memberName.data(),args,scopeName.data());
-
- int is,im=0,pm=0;
- // strip common part of the scope from the scopeName
- 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);
- pm=im+2;
- }
- //printf("result after scope corrections scope=%s name=%s\n",
- // scopeName.data(),memberName.data());
-
- QCString mName=memberName;
- QCString mScope;
- if (memberName.left(9)!="operator " && // treat operator conversion methods
- // as a special case
- (im=memberName.findRev("::"))!=-1 &&
- im<(int)memberName.length()-2 // not A::
- )
- {
- mScope=memberName.left(im);
- mName=memberName.right(memberName.length()-im-2);
- }
-
- // handle special the case where both scope name and member scope are equal
- if (mScope==scopeName) scopeName.resize(0);
-
- //printf("mScope=`%s' mName=`%s'\n",mScope.data(),mName.data());
-
- MemberName *mn = Doxygen::memberNameSDict[mName];
- //printf("mName=%s mn=%p\n",mName.data(),mn);
- if (!forceEmptyScope && mn && !(scopeName.isEmpty() && mScope.isEmpty()))
- {
- //printf(" >member name found\n");
- int scopeOffset=scopeName.length();
- do
- {
- QCString className = scopeName.left(scopeOffset);
- if (!className.isEmpty() && !mScope.isEmpty())
- {
- className+="::"+mScope;
- }
- else if (!mScope.isEmpty())
- {
- className=mScope.copy();
- }
- //printf("Trying class scope %s\n",className.data());
-
- ClassDef *fcd=0;
- // todo: fill in correct fileScope!
- if ((fcd=getResolvedClass(Doxygen::globalScope,0,className)) && // is it a documented class
- fcd->isLinkable()
- )
- {
- //printf(" Found fcd=%p\n",fcd);
- MemberListIterator mmli(*mn);
- MemberDef *mmd;
- int mdist=maxInheritanceDepth;
- ArgumentList *argList=0;
- if (args)
- {
- argList=new ArgumentList;
- stringToArgumentList(args,argList);
- }
- for (mmli.toFirst();(mmd=mmli.current());++mmli)
- {
- //if (mmd->isLinkable())
- //{
- bool match=args==0 ||
- matchArguments2(mmd->getOuterScope(),mmd->getFileDef(),mmd->argumentList(),
- fcd,fcd->getFileDef(),argList,
- checkCV
- );
- //printf("match=%d\n",match);
- if (match)
- {
- ClassDef *mcd=mmd->getClassDef();
- int m=minClassDistance(fcd,mcd);
- if (m<mdist && mcd->isLinkable())
- {
- mdist=m;
- cd=mcd;
- md=mmd;
- }
- }
- //}
- }
- if (argList)
- {
- delete argList; argList=0;
- }
- if (mdist==maxInheritanceDepth && args && strcmp(args,"()")==0)
- // 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)
- {
- //if (mmd->isLinkable())
- //{
- ClassDef *mcd=mmd->getClassDef();
- //printf(" >Class %s found\n",mcd->name().data());
- int m=minClassDistance(fcd,mcd);
- if (m<mdist /* && mcd->isLinkable()*/ )
- {
- //printf("Class distance %d\n",m);
- mdist=m;
- cd=mcd;
- md=mmd;
- }
- //}
- }
- }
- //printf(" >Succes=%d\n",mdist<maxInheritanceDepth);
- if (mdist<maxInheritanceDepth)
- {
- if (!md->isLinkable())
- {
- md=0; // avoid returning things we cannot link to
- cd=0;
- return FALSE; // match found, but was not linkable
- }
- else
- {
- gd=md->getGroupDef();
- if (gd) cd=0;
- return TRUE; /* found match */
- }
- }
- }
- /* go to the parent scope */
-
- if (scopeOffset==0)
- {
- scopeOffset=-1;
- }
- else if ((scopeOffset=scopeName.findRev("::",scopeOffset-1))==-1)
- {
- scopeOffset=0;
- }
- } while (scopeOffset>=0);
-
- // unknown or undocumented scope
- }
-
- // maybe an namespace, file or group member ?
- //printf("Testing for global function scopeName=`%s' mScope=`%s' :: mName=`%s'\n",
- // scopeName.data(),mScope.data(),mName.data());
- if ((mn=Doxygen::functionNameSDict[mName])) // name is known
- {
- //printf(" >function name found\n");
- NamespaceDef *fnd=0;
- int scopeOffset=scopeName.length();
- do
- {
- QCString namespaceName = scopeName.left(scopeOffset);
- if (!namespaceName.isEmpty() && !mScope.isEmpty())
- {
- namespaceName+="::"+mScope;
- }
- else if (!mScope.isEmpty())
- {
- namespaceName=mScope.copy();
- }
- //printf("Trying namespace %s\n",namespaceName.data());
- if (!namespaceName.isEmpty() &&
- (fnd=Doxygen::namespaceSDict[namespaceName]) &&
- fnd->isLinkable()
- )
- {
- //printf("Function inside existing namespace `%s'\n",namespaceName.data());
- bool found=FALSE;
- MemberListIterator mmli(*mn);
- MemberDef *mmd;
- for (mmli.toFirst();((mmd=mmli.current()) && !found);++mmli)
- {
- //printf("mmd->getNamespaceDef()=%p fnd=%p\n",
- // mmd->getNamespaceDef(),fnd);
- if (mmd->getNamespaceDef()==fnd /* && mmd->isLinkable() */ )
- { // namespace is found
- bool match=TRUE;
- ArgumentList *argList=0;
- if (args && strcmp(args,"()")!=0)
- {
- argList=new ArgumentList;
- stringToArgumentList(args,argList);
- match=matchArguments2(
- mmd->getOuterScope(),mmd->getFileDef(),mmd->argumentList(),
- fnd,mmd->getFileDef(),argList,
- checkCV);
- }
- if (match)
- {
- nd=fnd;
- md=mmd;
- found=TRUE;
- }
- if (args)
- {
- delete argList; argList=0;
- }
- }
- }
- if (!found && args && !strcmp(args,"()"))
- // no exact match found, but if args="()" an arbitrary
- // member will do
- {
- for (mmli.toFirst();((mmd=mmli.current()) && !found);++mmli)
- {
- if (mmd->getNamespaceDef()==fnd /*&& mmd->isLinkable() */ )
- {
- nd=fnd;
- md=mmd;
- found=TRUE;
- }
- }
- }
- if (found)
- {
- if (!md->isLinkable())
- {
- md=0; // avoid returning things we cannot link to
- nd=0;
- return FALSE; // match found but not linkable
- }
- else
- {
- gd=md->getGroupDef();
- if (gd && gd->isLinkable()) nd=0; else gd=0;
- return TRUE;
- }
- }
- }
- if (scopeOffset==0)
- {
- scopeOffset=-1;
- }
- else if ((scopeOffset=scopeName.findRev("::",scopeOffset-1))==-1)
- {
- scopeOffset=0;
- }
- } while (scopeOffset>=0);
-
- //else // no scope => global function
- {
- QList<MemberDef> members;
-
- //printf(" Function with global scope name `%s' args=`%s'\n",memberName.data(),args);
- MemberListIterator mli(*mn);
- for (mli.toFirst();(md=mli.current());++mli)
- {
- //if (md->isLinkable())
- //{
- fd=md->getFileDef();
- gd=md->getGroupDef();
- //printf(" md->name()=`%s' md->args=`%s' fd=%p gd=%p\n",
- // md->name().data(),args,fd,gd);
- if (
- (gd && gd->isLinkable()) || (fd && fd->isLinkable())
- )
- {
- //printf(" fd=%p gd=%p args=`%s'\n",fd,gd,args);
- bool match=TRUE;
- ArgumentList *argList=0;
- if (args && !md->isDefine() && strcmp(args,"()")!=0)
- {
- argList=new ArgumentList;
- stringToArgumentList(args,argList);
- match=matchArguments2(
- md->getOuterScope(),fd,md->argumentList(),
- Doxygen::globalScope,fd,argList,
- checkCV);
- delete argList; argList=0;
- }
- if (match)
- {
- //printf("Found match!\n");
- members.append(md);
- }
- }
- //}
- }
- if (members.count()!=1 && args && !strcmp(args,"()"))
- {
- // no exact match found, but if args="()" an arbitrary
- // member will do
- md=mn->last();
- while (md /* && md->isLinkable()*/)
- {
- //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();
- if (
- (gd && gd->isLinkable()) || (fd && fd->isLinkable())
- )
- {
- members.append(md);
- }
- md=mn->prev();
- }
- }
- //printf("found %d candidate members\n",members.count());
- if (members.count()==1 || currentFile!=0)
- {
- md=members.first();
- }
- else if (members.count()>1)
- {
- //printf("Found more than one matching member!\n");
- // use some C scoping rules to determine the correct link
- // 1. member in current file
- // 2. non-static member in different file
- if (currentFile==0)
- {
- bool ambig;
- currentFile = findFileDef(Doxygen::inputNameDict,0/*namespaceName*/,ambig);
- }
- MemberDef *bmd = 0;
- for (md=members.first(); md; md=members.next())
- {
- if (md->getFileDef() == currentFile)
- {
- bmd = 0;
- break;
- }
- if (!(md->isStatic()) || Config_getBool("EXTRACT_STATIC")) bmd = md;
- }
- if (bmd) md=bmd;
- }
- if (md && !md->isLinkable()) md=0; // ignore things we cannot link to
- if (md) // found a matching global member
- {
- fd=md->getFileDef();
- gd=md->getGroupDef();
- //printf("fd=%p gd=%p gd->isLinkable()=%d\n",fd,gd,gd->isLinkable());
- if (gd && gd->isLinkable()) fd=0; else gd=0;
- return TRUE;
- }
- }
- }
-
- // no nothing found
- return FALSE;
-}
-
-/*!
- * Searches for a scope definition given its name as a string via parameter
- * `scope'.
- *
- * 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'
- * 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.
- */
-bool getScopeDefs(const char *docScope,const char *scope,
- ClassDef *&cd, NamespaceDef *&nd)
-{
- cd=0;nd=0;
-
- QCString scopeName=scope;
- //printf("getScopeDefs: docScope=`%s' scope=`%s'\n",docScope,scope);
- if (scopeName.isEmpty()) return FALSE;
-
- bool explicitGlobalScope=FALSE;
- if (scopeName.at(0)==':' && scopeName.at(1)==':')
- {
- scopeName=scopeName.right(scopeName.length()-2);
- explicitGlobalScope=TRUE;
- }
-
- QCString docScopeName=docScope;
- int scopeOffset=explicitGlobalScope ? 0 : docScopeName.length();
-
- do // for each possible docScope (from largest to and including empty)
- {
- QCString fullName=scopeName.copy();
- if (scopeOffset>0) fullName.prepend(docScopeName.left(scopeOffset)+"::");
-
- if ((cd=getClass(fullName)) && cd->isLinkable())
- {
- return TRUE; // class link written => quit
- }
- else if ((nd=Doxygen::namespaceSDict[fullName]) && nd->isLinkable())
- {
- return TRUE; // namespace link written => quit
- }
- if (scopeOffset==0)
- {
- scopeOffset=-1;
- }
- else if ((scopeOffset=docScopeName.findRev("::",scopeOffset-1))==-1)
- {
- scopeOffset=0;
- }
- } while (scopeOffset>=0);
-
- return FALSE;
-}
-
-static bool isLowerCase(QCString &s)
-{
- char *p=s.data();
- if (p==0) return TRUE;
- int c;
- while ((c=*p++)) if (!islower(c)) return FALSE;
- return TRUE;
-}
-
-
-
-/*! 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,
- /* in */ const char *name,
- /* in */ bool inSeeBlock,
- /* out */ Definition **resContext,
- /* out */ MemberDef **resMember
- )
-{
- //printf("resolveRef(scName=%s,name=%s,inSeeBlock=%d)\n",scName,name,inSeeBlock);
-
- QCString tsName = name;
- bool memberScopeFirst = tsName.find('#')!=-1;
- QCString fullName = substitute(tsName,"#","::");
- fullName = removeRedundantWhiteSpace(substitute(fullName,".","::"));
-
- int bracePos=fullName.findRev('('); // reverse is needed for operator()(...)
- int endNamePos=bracePos!=-1 ? bracePos : fullName.length();
- int scopePos=fullName.findRev("::",endNamePos);
-
- // default result values
- *resContext=0;
- *resMember=0;
-
- if (bracePos==-1) // simple name
- {
- ClassDef *cd=0;
- NamespaceDef *nd=0;
-
- if (!inSeeBlock && scopePos==-1 && isLowerCase(tsName))
- { // link to lower case only name => do not try to autolink
- return FALSE;
- }
-
- //printf("scName=%s fullName=%s\n",scName,fullName.data());
-
- // check if this is a class or namespace reference
- if (scName!=fullName && getScopeDefs(scName,fullName,cd,nd))
- {
- if (cd) // scope matches that of a class
- {
- *resContext = cd;
- }
- else // scope matches that of a namespace
- {
- ASSERT(nd!=0);
- *resContext = nd;
- }
- return TRUE;
- }
- else if (scName==fullName || (!inSeeBlock && scopePos==-1))
- // nothing to link => output plain text
- {
- //printf("found scName=%s fullName=%s scName==fullName=%d "
- // "inSeeBlock=%d scopePos=%d!\n",
- // scName,fullName.data(),scName==fullName,inSeeBlock,scopePos);
- return FALSE;
- }
- // continue search...
- }
-
- // extract userscope+name
- QCString nameStr=fullName.left(endNamePos);
-
- // extract arguments
- QCString argsStr;
- if (bracePos!=-1) argsStr=fullName.right(fullName.length()-bracePos);
-
- // strip template specifier
- // TODO: match against the correct partial template instantiation
- int templPos=nameStr.find('<');
- if (templPos!=-1 && nameStr.find("operator")==-1)
- {
- int endTemplPos=nameStr.findRev('>');
- nameStr=nameStr.left(templPos)+nameStr.right(nameStr.length()-endTemplPos-1);
- }
-
- QCString scopeStr=scName;
-
- MemberDef *md = 0;
- ClassDef *cd = 0;
- FileDef *fd = 0;
- NamespaceDef *nd = 0;
- GroupDef *gd = 0;
-
- // check if nameStr is a member or global.
- //printf("getDefs(scope=%s,name=%s,args=%s)\n",scopeStr.data(),nameStr.data(),argsStr.data());
- if (getDefs(scopeStr,nameStr,argsStr,
- md,cd,fd,nd,gd,
- scopePos==0 && !memberScopeFirst,
- 0,
- TRUE
- )
- )
- {
- //printf("after getDefs md=%p cd=%p fd=%p nd=%p gd=%p\n",md,cd,fd,nd,gd);
- if (md) { *resMember=md; *resContext=md; }
- else if (cd) *resContext=cd;
- else if (nd) *resContext=nd;
- else if (fd) *resContext=fd;
- else if (gd) *resContext=gd;
- else { *resContext=0; *resMember=0; return FALSE; }
- //printf("member=%s (md=%p) anchor=%s linkable()=%d context=%s\n",
- // md->name().data(),md,md->anchor().data(),md->isLinkable(),(*resContext)->name().data());
- return TRUE;
- }
- else if (inSeeBlock && !nameStr.isEmpty() && (gd=Doxygen::groupSDict[nameStr]))
- { // group link
- *resContext=gd;
- return TRUE;
- }
- else if (tsName.find('.')!=-1) // maybe a link to a file
- {
- bool ambig;
- fd=findFileDef(Doxygen::inputNameDict,tsName,ambig);
- if (fd && !ambig)
- {
- *resContext=fd;
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-QCString linkToText(const char *link,bool isFileName)
-{
- static bool optimizeOutputJava = Config_getBool("OPTIMIZE_OUTPUT_JAVA");
- QCString result=link;
- if (!result.isEmpty())
- {
- // replace # by ::
- result=substitute(result,"#","::");
- // replace . by ::
- if (!isFileName) result=substitute(result,".","::");
- // strip leading :: prefix if present
- if (result.at(0)==':' && result.at(1)==':')
- {
- result=result.right(result.length()-2);
- }
- if (optimizeOutputJava)
- {
- result=substitute(result,"::",".");
- }
- }
- return result;
-}
-
-/*!
- * generate a reference to a class, namespace or member.
- * `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 five formats:
- * 1) "ScopeName"
- * 2) "memberName()" one of the (overloaded) function or define
- * with name memberName.
- * 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"
- * instead of :: the \# symbol may also be used.
- */
-
-bool generateRef(OutputDocInterface &od,const char *scName,
- const char *name,bool inSeeBlock,const char *rt)
-{
- //printf("generateRef(scName=%s,name=%s,rt=%s)\n",scName,name,rt);
-
- Definition *compound;
- MemberDef *md;
-
- // create default link text
- QCString linkText = linkToText(rt,FALSE);
-
- if (resolveRef(scName,name,inSeeBlock,&compound,&md))
- {
- if (md && md->isLinkable()) // link to member
- {
- od.writeObjectLink(md->getReference(),
- md->getOutputFileBase(),
- md->anchor(),linkText);
- // generate the page reference (for LaTeX)
- if (!md->isReference())
- {
- writePageRef(od,md->getOutputFileBase(),md->anchor());
- }
- return TRUE;
- }
- else if (compound && compound->isLinkable()) // link to compound
- {
- if (rt==0 && compound->definitionType()==Definition::TypeGroup)
- {
- linkText=((GroupDef *)compound)->groupTitle();
- }
- if (compound && compound->definitionType()==Definition::TypeFile)
- {
- linkText=linkToText(rt,TRUE);
- }
- od.writeObjectLink(compound->getReference(),
- compound->getOutputFileBase(),
- 0,linkText);
- if (!compound->isReference())
- {
- writePageRef(od,compound->getOutputFileBase(),0);
- }
- return TRUE;
- }
- }
- od.docify(linkText);
- return FALSE;
-}
-
-bool resolveLink(/* in */ const char *scName,
- /* in */ const char *lr,
- /* in */ bool inSeeBlock,
- /* out */ Definition **resContext,
- /* out */ QCString &resAnchor
- )
-{
- *resContext=0;
-
- QCString linkRef=lr;
- //printf("ResolveLink linkRef=%s\n",lr);
- FileDef *fd;
- GroupDef *gd;
- PageDef *pd;
- ClassDef *cd;
- NamespaceDef *nd;
- bool ambig;
- if (linkRef.isEmpty()) // no reference name!
- {
- return FALSE;
- }
- else if ((pd=Doxygen::pageSDict->find(linkRef))) // link to a page
- {
- GroupDef *gd = pd->getGroupDef();
- if (gd)
- {
- SectionInfo *si=0;
- if (!pd->name().isEmpty()) si=Doxygen::sectionDict[pd->name()];
- *resContext=gd;
- if (si) resAnchor = si->label;
- }
- else
- {
- *resContext=pd;
- }
- return TRUE;
- }
- else if ((pd=Doxygen::exampleSDict->find(linkRef))) // link to an example
- {
- *resContext=pd;
- return TRUE;
- }
- else if ((gd=Doxygen::groupSDict[linkRef])) // link to a group
- {
- *resContext=gd;
- return TRUE;
- }
- else if ((fd=findFileDef(Doxygen::inputNameDict,linkRef,ambig)) // file link
- && fd->isLinkable())
- {
- *resContext=fd;
- return TRUE;
- }
- else if ((cd=getClass(linkRef))) // class link
- {
- *resContext=cd;
- return TRUE;
- }
- else if ((cd=getClass(linkRef+"-p"))) // Obj-C protocol link
- {
- *resContext=cd;
- return TRUE;
- }
- else if ((nd=Doxygen::namespaceSDict.find(linkRef)))
- {
- *resContext=nd;
- return TRUE;
- }
- else // probably a member reference
- {
- MemberDef *md;
- bool res = resolveRef(scName,lr,inSeeBlock,resContext,&md);
- if (md) resAnchor=md->anchor();
- return res;
- }
-}
-
-
-//----------------------------------------------------------------------
-// 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'.
-// 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.
-
-bool generateLink(OutputDocInterface &od,const char *clName,
- const char *lr,bool inSeeBlock,const char *lt)
-{
- //printf("generateLink(clName=%s,lr=%s,lr=%s)\n",clName,lr,lt);
- Definition *compound;
- //PageDef *pageDef=0;
- QCString anchor,linkText=linkToText(lt,FALSE);
- //printf("generateLink linkText=%s\n",linkText.data());
- if (resolveLink(clName,lr,inSeeBlock,&compound,anchor))
- {
- if (compound) // link to compound
- {
- if (lt==0 && anchor.isEmpty() && /* compound link */
- compound->definitionType()==Definition::TypeGroup /* is group */
- )
- {
- linkText=((GroupDef *)compound)->groupTitle(); // use group's title as link
- }
- else if (compound->definitionType()==Definition::TypeFile)
- {
- linkText=linkToText(lt,TRUE);
- }
- od.writeObjectLink(compound->getReference(),
- compound->getOutputFileBase(),anchor,linkText);
- if (!compound->isReference())
- {
- writePageRef(od,compound->getOutputFileBase(),anchor);
- }
- }
- else
- {
- err("%s:%d: Internal error: resolveLink successful but no compound found!\n",__FILE__,__LINE__);
- }
- return TRUE;
- }
- else // link could not be found
- {
- od.docify(linkText);
- return FALSE;
- }
-}
-
-void generateFileRef(OutputDocInterface &od,const char *name,const char *text)
-{
- //printf("generateFileRef(%s,%s)\n",name,text);
- QCString linkText = text ? text : name;
- //FileInfo *fi;
- FileDef *fd;
- bool ambig;
- if ((fd=findFileDef(Doxygen::inputNameDict,name,ambig)) &&
- fd->isLinkable())
- // link to documented input file
- od.writeObjectLink(fd->getReference(),fd->getOutputFileBase(),0,linkText);
- else
- od.docify(linkText);
-}
-
-//----------------------------------------------------------------------
-
-#if 0
-QCString substituteClassNames(const QCString &s)
-{
- int i=0,l,p;
- QCString result;
- if (s.isEmpty()) return result;
- QRegExp r("[a-z_A-Z][a-z_A-Z0-9]*");
- while ((p=r.match(s,i,&l))!=-1)
- {
- QCString *subst;
- if (p>i) result+=s.mid(i,p-i);
- if ((subst=substituteDict[s.mid(p,l)]))
- {
- result+=*subst;
- }
- else
- {
- result+=s.mid(p,l);
- }
- i=p+l;
- }
- result+=s.mid(i,s.length()-i);
- return result;
-}
-#endif
-
-//----------------------------------------------------------------------
-// substitute all occurences of `src' in `s' by `dst'
-
-QCString substitute(const char *s,const char *src,const char *dst)
-{
- // TODO: optimize by using strstr() instead of find
- QCString input=s;
- QCString output;
- int i=0,p;
- while ((p=input.find(src,i))!=-1)
- {
- output+=input.mid(i,p-i);
- output+=dst;
- i=p+strlen(src);
- }
- output+=input.mid(i,input.length()-i);
- return output;
-}
-
-//----------------------------------------------------------------------
-
-struct FindFileCacheElem
-{
- FindFileCacheElem(FileDef *fd,bool ambig) : fileDef(fd), isAmbig(ambig) {}
- FileDef *fileDef;
- bool isAmbig;
-};
-
-static QCache<FindFileCacheElem> g_findFileDefCache(5000);
-
-FileDef *findFileDef(const FileNameDict *fnDict,const char *n,bool &ambig)
-{
- ambig=FALSE;
- if (n==0) return 0;
-
- QCString key;
- key.sprintf("%p:",fnDict);
- key+=n;
-
- g_findFileDefCache.setAutoDelete(TRUE);
- FindFileCacheElem *cachedResult = g_findFileDefCache.find(key);
- if (cachedResult)
- {
- ambig = cachedResult->isAmbig;
- return cachedResult->fileDef;
- }
- else
- {
- cachedResult = new FindFileCacheElem(0,FALSE);
- }
-
- QCString name=convertToQCString(QDir::cleanDirPath(n));
- QCString path;
- int slashPos;
- 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);
- }
- //printf("findFileDef path=`%s' name=`%s'\n",path.data(),name.data());
- if (name.isEmpty()) goto exit;
- if ((fn=(*fnDict)[name]))
- {
- if (fn->count()==1)
- {
- FileDef *fd = fn->getFirst();
- if (path.isEmpty() || fd->getPath().right(path.length())==path)
- {
- cachedResult->fileDef = fd;
- g_findFileDefCache.insert(key,cachedResult);
- return fd;
- }
- }
- else // file name alone is ambigious
- {
- int count=0;
- FileNameIterator fni(*fn);
- FileDef *fd;
- FileDef *lastMatch=0;
- for (fni.toFirst();(fd=fni.current());++fni)
- {
- if (path.isEmpty() || fd->getPath().right(path.length())==path)
- {
- count++;
- lastMatch=fd;
- }
- }
- ambig=(count>1);
- cachedResult->isAmbig = ambig;
- cachedResult->fileDef = lastMatch;
- g_findFileDefCache.insert(key,cachedResult);
- return lastMatch;
- }
- }
-exit:
- g_findFileDefCache.insert(key,cachedResult);
- return 0;
-}
-
-//----------------------------------------------------------------------
-
-QCString showFileDefMatches(const FileNameDict *fnDict,const char *n)
-{
- QCString result;
- QCString name=n;
- QCString path;
- int slashPos=QMAX(name.findRev('/'),name.findRev('\\'));
- if (slashPos!=-1)
- {
- path=name.left(slashPos+1);
- name=name.right(name.length()-slashPos-1);
- }
- FileName *fn;
- if ((fn=(*fnDict)[name]))
- {
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (fni.toFirst();(fd=fni.current());++fni)
- {
- if (path.isEmpty() || fd->getPath().right(path.length())==path)
- {
- result+=" "+fd->absFilePath()+"\n";
- }
- }
- }
- return result;
-}
-
-//----------------------------------------------------------------------
-
-QCString substituteKeywords(const QCString &s,const char *title,const QCString &relPath)
-{
- QCString result = s.copy();
- if (title) result = substitute(result,"$title",title);
- result = substitute(result,"$datetime",dateToString(TRUE));
- result = substitute(result,"$date",dateToString(FALSE));
- result = substitute(result,"$year",yearToString());
- result = substitute(result,"$doxygenversion",versionString);
- result = substitute(result,"$projectname",Config_getString("PROJECT_NAME"));
- result = substitute(result,"$projectnumber",Config_getString("PROJECT_NUMBER"));
- result = substitute(result,"$relpath$",relPath);
- return result;
-}
-
-//----------------------------------------------------------------------
-
-/*! 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;
- QStrList &sl = Config_getList("IGNORE_PREFIX");
- char *s = sl.first();
- while (s)
- {
- const char *ps=s;
- const char *pd=name.data();
- int i=0;
- while (*ps!=0 && *pd!=0 && *ps==*pd) ps++,pd++,i++;
- if (*ps==0 && *pd!=0)
- {
- return i;
- }
- s = sl.next();
- }
- return 0;
-}
-
-//----------------------------------------------------------------------------
-
-static void initBaseClassHierarchy(BaseClassList *bcl)
-{
- BaseClassListIterator bcli(*bcl);
- for ( ; bcli.current(); ++bcli)
- {
- ClassDef *cd=bcli.current()->classDef;
- if (cd->baseClasses()->count()==0) // no base classes => new root
- {
- initBaseClassHierarchy(cd->baseClasses());
- }
- cd->visited=FALSE;
- }
-}
-
-//----------------------------------------------------------------------------
-
-void initClassHierarchy(ClassSDict *cl)
-{
- ClassSDict::Iterator cli(*cl);
- ClassDef *cd;
- for ( ; (cd=cli.current()); ++cli)
- {
- cd->visited=FALSE;
- initBaseClassHierarchy(cd->baseClasses());
- }
-}
-
-//----------------------------------------------------------------------------
-
-bool hasVisibleRoot(BaseClassList *bcl)
-{
- BaseClassListIterator bcli(*bcl);
- for ( ; bcli.current(); ++bcli)
- {
- ClassDef *cd=bcli.current()->classDef;
- if (cd->isVisibleInHierarchy()) return TRUE;
- hasVisibleRoot(cd->baseClasses());
- }
- return FALSE;
-}
-
-//----------------------------------------------------------------------
-
-QCString escapeCharsInString(const char *name,bool allowDots)
-{
- static bool caseSenseNames = Config_getBool("CASE_SENSE_NAMES");
- QCString result;
- char c;
- const char *p=name;
- while ((c=*p++)!=0)
- {
- switch(c)
- {
- case '_': result+="__"; break;
- case '-': result+="-"; break;
- case ':': result+="_1"; break;
- case '/': result+="_2"; break;
- case '<': result+="_3"; break;
- case '>': result+="_4"; break;
- case '*': result+="_5"; break;
- case '&': result+="_6"; break;
- case '|': result+="_7"; break;
- case '.': if (allowDots) result+="."; else result+="_8"; break;
- case '!': result+="_9"; break;
- case ',': result+="_00"; break;
- case ' ': result+="_01"; break;
- default:
- if (caseSenseNames || !isupper(c))
- {
- result+=c;
- }
- else
- {
- result+="_";
- result+=tolower(c);
- }
- break;
- }
- }
- return result;
-}
-
-/*! This function determines the file name on disk of an item
- * 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)
-{
- static bool shortNames = Config_getBool("SHORT_NAMES");
- static bool createSubdirs = Config_getBool("CREATE_SUBDIRS");
- QCString result;
- if (shortNames)
- {
- static QDict<void> usedNames(10007);
- static int count=1;
-
- void *value=usedNames.find(name);
- int num;
- if (value==0)
- {
- usedNames.insert(name,(void *)count);
- num = count++;
- }
- else
- {
- num = *(int*)&value;
- }
- result.sprintf("a%05d",num);
- }
- else // long names
- {
- result=escapeCharsInString(name,allowDots);
- }
- 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
- 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));
- }
- return result;
-}
-
-QCString relativePathToRoot(const char *name)
-{
- QCString result;
- if (Config_getBool("CREATE_SUBDIRS"))
- {
- if (name==0)
- {
- return REL_PATH_TO_ROOT;
- }
- else
- {
- QCString n = name;
- int i = n.findRev('/');
- if (i!=-1)
- {
- result=REL_PATH_TO_ROOT;
- }
- }
- }
- return result;
-}
-
-void createSubDirs(QDir &d)
-{
- if (Config_getBool("CREATE_SUBDIRS"))
- {
- // create 4096 subdirectories
- int l1,l2;
- for (l1=0;l1<16;l1++)
- {
- d.mkdir(QString().sprintf("d%x",l1));
- for (l2=0;l2<256;l2++)
- {
- d.mkdir(QString().sprintf("d%x/d%02x",l1,l2));
- }
- }
- }
-}
-
-/*! Input is a scopeName, output is the scopename split into a
- * namespace part (as large as possible) and a classname part.
- */
-void extractNamespaceName(const QCString &scopeName,
- QCString &className,QCString &namespaceName,
- bool allowEmptyClass)
-{
- int i,p;
- QCString clName=scopeName;
- NamespaceDef *nd = 0;
- if (!clName.isEmpty() && (nd=getResolvedNamespace(clName)) && getClass(clName)==0)
- { // the whole name is a namespace (and not a class)
- namespaceName=nd->name().copy();
- className.resize(0);
- goto done;
- }
- p=clName.length()-2;
- 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());
- if (i>0 && (nd=getResolvedNamespace(clName.left(i))) && getClass(clName.left(i))==0)
- {
- //printf("found!\n");
- 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");
-
- // not found, so we just have to guess.
- className=scopeName.copy();
- namespaceName.resize(0);
-
-done:
- if (className.isEmpty() && !namespaceName.isEmpty() && !allowEmptyClass)
- {
- // class and namespace with the same name, correct to return the class.
- className=namespaceName.copy();
- namespaceName.resize(0);
- }
- //printf("extractNamespace `%s' => `%s|%s'\n",scopeName.data(),
- // className.data(),namespaceName.data());
- return;
-}
-
-QCString insertTemplateSpecifierInScope(const QCString &scope,const QCString &templ)
-{
- QCString result=scope.copy();
- if (!templ.isEmpty() && scope.find('<')==-1)
- {
- int si,pi=0;
- ClassDef *cd=0;
- while (
- (si=scope.find("::",pi))!=-1 && !getClass(scope.left(si)+templ) &&
- ((cd=getClass(scope.left(si)))==0 || cd->templateArguments()==0)
- )
- {
- //printf("Tried `%s'\n",(scope.left(si)+templ).data());
- pi=si+2;
- }
- if (si==-1) // not nested => append template specifier
- {
- result+=templ;
- }
- else // nested => insert template specifier before after first class name
- {
- result=scope.left(si) + templ + scope.right(scope.length()-si);
- }
- }
- //printf("insertTemplateSpecifierInScope(`%s',`%s')=%s\n",
- // scope.data(),templ.data(),result.data());
- return result;
-}
-
-/*! Strips the scope from a name. Examples: A::B will return A
- * and A<T>::B<N::C<D> > will return A<T>.
- * \todo deal with cases like A< s<<2 >::B
- */
-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;
-
-}
-
-/*! Convert nibble (range 0..15) to hex char */
-//static char nibbleToHex(int n)
-//{
-// return (n < 10) ? ('0'+n) : ('a'+n-10);
-//}
-
-/*! Converts a string to an XML-encoded string */
-QCString convertToXML(const char *s)
-{
- QCString result;
- if (s==0) return result;
- const char *p=s;
- char c;
- while ((c=*p++))
- {
- switch (c)
- {
- case '<': result+="&lt;"; break;
- case '>': result+="&gt;"; break;
- case '&': result+="&amp;"; break;
- case '\'': result+="&apos;"; break;
- case '"': result+="&quot;"; break;
- default:
- //if (c<0)
- //{ <- this doesn't work for languages that use
- // characters with codes beyond 255
- // result+=(QCString)"&#x" +
- // nibbleToHex((((uchar)c)>>4)&0xf)+
- // nibbleToHex(c&0xf)+";";
- //}
- //else
- //{
- result+=c;
- //}
- break;
- }
- }
- return result;
-}
-
-/*! Converts a string to a HTML-encoded string */
-QCString convertToHtml(const char *s)
-{
- return convertToXML(s);
-}
-
-/*! Returns the standard string that is generated when the \\overload
- * command is used.
- */
-QCString getOverloadDocs()
-{
- return theTranslator->trOverloadText();
- //"This is an overloaded member function, "
- // "provided for convenience. It differs from the above "
- // "function only in what argument(s) it accepts.";
-}
-
-void addMembersToMemberGroup(MemberList *ml,
- MemberGroupSDict *memberGroupSDict,
- Definition *context)
-{
- ASSERT(context!=0);
- //printf("addMemberToMemberGroup()\n");
- MemberListIterator mli(*ml);
- MemberDef *md;
- uint index;
- for (index=0;(md=mli.current());)
- {
- if (md->isEnumerate()) // insert enum value of this enum into groups
- {
- QList<MemberDef> *fmdl=md->enumFieldList();
- if (fmdl)
- {
- MemberDef *fmd=fmdl->first();
- while (fmd)
- {
- int groupId=fmd->getMemberGroupId();
- if (groupId!=-1)
- {
- MemberGroupInfo *info = Doxygen::memGrpInfoDict[groupId];
- //QCString *pGrpHeader = Doxygen::memberHeaderDict[groupId];
- //QCString *pDocs = Doxygen::memberDocDict[groupId];
- if (info)
- {
- MemberGroup *mg = memberGroupSDict->find(groupId);
- if (mg==0)
- {
- mg = new MemberGroup(
- context,
- groupId,
- info->header,
- info->doc,
- info->docFile
- );
- memberGroupSDict->append(groupId,mg);
- }
- mg->insertMember(fmd); // insert in member group
- fmd->setMemberGroup(mg);
- }
- }
- fmd=fmdl->next();
- }
- }
- }
- int groupId=md->getMemberGroupId();
- if (groupId!=-1)
- {
- MemberGroupInfo *info = Doxygen::memGrpInfoDict[groupId];
- //QCString *pGrpHeader = Doxygen::memberHeaderDict[groupId];
- //QCString *pDocs = Doxygen::memberDocDict[groupId];
- if (info)
- {
- MemberGroup *mg = memberGroupSDict->find(groupId);
- if (mg==0)
- {
- mg = new MemberGroup(
- context,
- groupId,
- info->header,
- info->doc,
- info->docFile
- );
- memberGroupSDict->append(groupId,mg);
- }
- md = ml->take(index); // remove from member list
- mg->insertMember(md); // insert in member group
- md->setMemberGroup(mg);
- continue;
- }
- }
- ++mli;++index;
- }
-}
-
-/*! Extracts a (sub-)string from \a type starting at \a pos that
- * could form a class. The index of the match is returned and the found
- * class \a name and a template argument list \a templSpec. If -1 is returned
- * there are no more matches.
- */
-int extractClassNameFromType(const QCString &type,int &pos,QCString &name,QCString &templSpec)
-{
- static const QRegExp re("[a-z_A-Z][a-z_A-Z0-9:]*");
- name.resize(0);
- templSpec.resize(0);
- int i,l;
- int typeLen=type.length();
- if (typeLen>0)
- {
- if ((i=re.match(type,pos,&l))!=-1) // for each class name in the type
- {
- int ts=i+l;
- int te=ts;
- int tl=0;
- while (type.at(ts)==' ' && ts<typeLen) ts++,tl++; // skip any whitespace
- if (type.at(ts)=='<') // assume template instance
- {
- // locate end of template
- te=ts+1;
- int brCount=1;
- while (te<typeLen && brCount!=0)
- {
- if (type.at(te)=='<')
- {
- if (te<typeLen-1 && type.at(te+1)=='<') te++; else brCount++;
- }
- if (type.at(te)=='>')
- {
- if (te<typeLen-1 && type.at(te+1)=='>') te++; else brCount--;
- }
- te++;
- }
- }
- name = type.mid(i,l);
- if (te>ts)
- {
- templSpec = type.mid(ts,te-ts),tl+=te-ts;
- pos=i+l+tl;
- }
- else // no template part
- {
- pos=i+l;
- }
- //printf("extractClassNameFromType([in] type=%s,[out] pos=%d,[out] name=%s,[out] templ=%s)=TRUE\n",
- // type.data(),pos,name.data(),templSpec.data());
- return i;
- }
- }
- pos = typeLen;
- //printf("extractClassNameFromType([in] type=%s,[out] pos=%d,[out] name=%s,[out] templ=%s)=FALSE\n",
- // type.data(),pos,name.data(),templSpec.data());
- return -1;
-}
-
-/*! Substitutes any occurrence of a formal argument from argument list
- * \a formalArgs in \a name by the corresponding actual argument in
- * argument list \a actualArgs. The result after substitution
- * is returned as a string. The argument \a name is used to
- * prevent recursive substitution.
- */
-QCString substituteTemplateArgumentsInString(
- const QCString &name,
- ArgumentList *formalArgs,
- ArgumentList *actualArgs)
-{
- //printf("substituteTemplateArgumentsInString(name=%s formal=%s actualArg=%s)\n",
- // name.data(),argListToString(formalArgs).data(),argListToString(actualArgs).data());
- if (formalArgs==0) return name;
- QCString result;
- static QRegExp re("[a-z_A-Z][a-z_A-Z0-9]*");
- int p=0,l,i;
- // for each identifier in the base class name (e.g. B<T> -> B and T)
- while ((i=re.match(name,p,&l))!=-1)
- {
- result += name.mid(p,i-p);
- QCString n = name.mid(i,l);
- ArgumentListIterator formAli(*formalArgs);
- Argument *formArg;
- Argument *actArg=actualArgs->first();
-
- // if n is a template argument, then we substitute it
- // for its template instance argument.
- bool found=FALSE;
- for (formAli.toFirst();
- (formArg=formAli.current()) && !found;
- ++formAli,actArg=actualArgs->next()
- )
- {
- //printf("formArg->type=%s\n",formArg->type.data());
- if (formArg->type=="class" || formArg->type=="typename" || formArg->type.left(8)=="template")
- {
- //printf("n=%s formArg->type='%s' formArg->name='%s' formArg->defval='%s'\n",
- // n.data(),formArg->type.data(),formArg->name.data(),formArg->defval.data());
- if (formArg->name==n && actArg && !actArg->type.isEmpty()) // base class is a template argument
- {
- // replace formal argument with the actual argument of the instance
- if (actArg->name.isEmpty())
- {
- result += actArg->type+" ";
- }
- else // for case where the actual arg is something like "unsigned int"
- // the "int" part is in actArg->name.
- {
- result += actArg->type+" "+actArg->name+" ";
- }
- found=TRUE;
- }
- else if (formArg->name==n && actArg==0 && !formArg->defval.isEmpty() &&
- formArg->defval!=name /* to prevent recursion */
- )
- {
- result += substituteTemplateArgumentsInString(formArg->defval,formalArgs,actualArgs)+" ";
- found=TRUE;
- }
- }
- else if (formArg->name==n && actArg==0 && !formArg->defval.isEmpty() &&
- formArg->defval!=name /* to prevent recursion */
- )
- {
- result += substituteTemplateArgumentsInString(formArg->defval,formalArgs,actualArgs)+" ";
- found=TRUE;
- }
- }
- if (!found) result += n;
- p=i+l;
- }
- result+=name.right(name.length()-p);
- //printf(" Inheritance relation %s -> %s\n",
- // name.data(),result.data());
- return result;
-}
-
-
-/*! Makes a deep copy of argument list \a src. Will allocate memory, that
- * is owned by the caller.
- */
-ArgumentList *copyArgumentList(const ArgumentList *src)
-{
- ASSERT(src!=0);
- ArgumentList *dst = new ArgumentList;
- dst->setAutoDelete(TRUE);
- ArgumentListIterator tali(*src);
- Argument *a;
- for (;(a=tali.current());++tali)
- {
- dst->append(new Argument(*a));
- }
- dst->constSpecifier = src->constSpecifier;
- dst->volatileSpecifier = src->volatileSpecifier;
- dst->pureSpecifier = src->pureSpecifier;
- return dst;
-}
-
-/*! Makes a deep copy of the list of argument lists \a srcLists.
- * Will allocate memory, that is owned by the caller.
- */
-QList<ArgumentList> *copyArgumentLists(const QList<ArgumentList> *srcLists)
-{
- ASSERT(srcLists!=0);
- QList<ArgumentList> *dstLists = new QList<ArgumentList>;
- dstLists->setAutoDelete(TRUE);
- QListIterator<ArgumentList> sli(*srcLists);
- ArgumentList *sl;
- for (;(sl=sli.current());++sli)
- {
- dstLists->append(copyArgumentList(sl));
- }
- return dstLists;
-}
-
-/*! Strips template specifiers from scope \a fullName, except those
- * that make up specialized classes. The switch \a parentOnly
- * determines whether or not a template "at the end" of a scope
- * should be considered, e.g. with \a parentOnly is \c TRUE, A<T>::B<S> will
- * try to strip \<T\> and not \<S\>, while \a parentOnly is \c FALSE will
- * strip both unless A<T> or B<S> are specialized template classes.
- */
-QCString stripTemplateSpecifiersFromScope(const QCString &fullName,
- bool parentOnly,
- QCString *pLastScopeStripped)
-{
- 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)
- {
- char c=fullName.at(e++);
- if (c=='<')
- {
- count++;
- }
- else if (c=='>')
- {
- count--;
- done = count==0;
- }
- }
- int si= fullName.find("::",e);
-
- if (parentOnly && si==-1) break;
- // we only do the parent scope, so we stop here if needed
-
- result+=fullName.mid(p,i-p);
- //printf(" trying %s\n",(result+fullName.mid(i,e-i)).data());
- if (getClass(result+fullName.mid(i,e-i))!=0)
- {
- result+=fullName.mid(i,e-i);
- //printf("2:result+=%s\n",fullName.mid(i,e-i-1).data());
- }
- else if (pLastScopeStripped)
- {
- *pLastScopeStripped=fullName.mid(i,e-i);
- }
- p=e;
- i=fullName.find('<',p);
- }
- result+=fullName.right(l-p);
- //printf("3:result+=%s\n",fullName.right(l-p).data());
- return result;
-}
-
-/*! Merges two scope parts together. The parts may (partially) overlap.
- * 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.
- */
-QCString mergeScopes(const QCString &leftScope,const QCString &rightScope)
-{
- // case leftScope=="A" rightScope=="A::B" => result = "A::B"
- if (leftScopeMatch(rightScope,leftScope)) return rightScope;
- QCString result;
- int i=0,p=leftScope.length();
-
- // case leftScope=="A::B" rightScope=="B::C" => result = "A::B::C"
- // case leftScope=="A::B" rightScope=="B" => result = "A::B"
- bool found=FALSE;
- while ((i=leftScope.findRev("::",p))!=-1)
- {
- if (leftScopeMatch(rightScope,leftScope.right(leftScope.length()-i-2)))
- {
- result = leftScope.left(i+2)+rightScope;
- found=TRUE;
- }
- p=i-1;
- }
- if (found) return result;
-
- // case leftScope=="A" rightScope=="B" => result = "A::B"
- result=leftScope.copy();
- if (!result.isEmpty() && !rightScope.isEmpty()) result+="::";
- result+=rightScope;
- return result;
-}
-
-/*! Returns a fragment from scope \a s, starting at position \a p.
- *
- * @param s the scope name as a string.
- * @param p the start position (0 is the first).
- * @param l the resulting length of the fragment.
- * @returns the location of the fragment, or -1 if non is found.
- */
-int getScopeFragment(const QCString &s,int p,int *l)
-{
- int sl=s.length();
- int sp=p;
- int count=0;
- bool done;
- if (sp>=sl) return -1;
- while (sp<sl)
- {
- char c=s.at(sp);
- if (c==':') sp++,p++; else break;
- }
- while (sp<sl)
- {
- char c=s.at(sp);
- switch (c)
- {
- case ':': // found next part
- goto found;
- case '<': // skip template specifier
- count=1;sp++;
- done=FALSE;
- while (sp<sl && !done)
- {
- // TODO: deal with << and >> operators!
- char c=s.at(sp++);
- switch(c)
- {
- case '<': count++; break;
- case '>': count--; if (count==0) done=TRUE; break;
- default: break;
- }
- }
- break;
- default:
- sp++;
- break;
- }
- }
-found:
- *l=sp-p;
- //printf("getScopeFragment(%s,%d)=%s\n",s.data(),p,s.mid(p,*l).data());
- return p;
-}
-
-//----------------------------------------------------------------------------
-
-PageDef *addRelatedPage(const char *name,const QCString &ptitle,
- const QCString &doc,
- QList<SectionInfo> * /*anchors*/,
- const char *fileName,int startLine,
- const QList<ListItemInfo> *sli,
- GroupDef *gd,
- TagInfo *tagInfo
- )
-{
- PageDef *pd=0;
- //printf("addRelatedPage(name=%s gd=%p)\n",name,gd);
- if ((pd=Doxygen::pageSDict->find(name)) && !tagInfo)
- {
- // append documentation block to the page.
- pd->setDocumentation(pd->documentation()+"\n\n"+doc,fileName,startLine);
- //printf("Adding page docs `%s' pi=%p name=%s\n",doc.data(),pi,name);
- }
- else // new page
- {
- QCString baseName=name;
- 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=new PageDef(fileName,startLine,baseName,doc,title);
-
- pd->setRefItems(sli);
-
- if (tagInfo)
- {
- pd->setReference(tagInfo->tagName);
- }
-
- QCString pageName;
- if (Config_getBool("CASE_SENSE_NAMES"))
- pageName=pd->name();
- else
- pageName=pd->name().lower();
- pd->setFileName(pageName);
-
- //printf("Appending page `%s'\n",baseName.data());
- Doxygen::pageSDict->append(baseName,pd);
-
- if (gd) gd->addPage(pd);
-
- if (!pd->title().isEmpty())
- {
- //outputList->writeTitle(pi->name,pi->title);
-
- // a page name is a label as well!
- QCString file;
- if (gd)
- {
- file=gd->getOutputFileBase();
- }
- else if (pd->getGroupDef())
- {
- file=pd->getGroupDef()->getOutputFileBase().copy();
- }
- else
- {
- file=pageName;
- }
- SectionInfo *si=new SectionInfo(
- file,pd->name(),pd->title(),SectionInfo::Page,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.insert(pageName,si);
- }
- }
- return pd;
-}
-
-//----------------------------------------------------------------------------
-
-void addRefItem(const QList<ListItemInfo> *sli,
- const char *prefix,
- const char *name,const char *title,const char *args)
-{
- //printf("addRefItem(sli=%p,prefix=%s,name=%s,title=%s,args=%s)\n",sli,prefix,name,title,args);
- if (sli)
- {
- QListIterator<ListItemInfo> slii(*sli);
- ListItemInfo *lii;
- for (slii.toFirst();(lii=slii.current());++slii)
- {
- 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);
- //printf("anchor=%s written=%d\n",item->listAnchor.data(),item->written);
- if (item->written) return;
-
- QCString doc(1000);
- doc = "\\anchor ";
- doc += item->listAnchor;
- doc += " <dl><dt>";
- doc += prefix;
- doc += " \\_internalref ";
- doc += name;
- doc += " \"";
- doc += title;
- doc += "\"";
- if (args) doc += args;
- doc += "</dt>\n<dd>";
- doc += item->text;
- doc += "</dd></dl>\n";
- addRelatedPage(refList->listName(),refList->pageTitle(),doc,0,refList->listName(),1,0,0,0);
- item->written=TRUE;
- }
- }
- }
-}
-
-void addGroupListToTitle(OutputList &ol,Definition *d)
-{
- if (d->partOfGroups()) // write list of group to which this definition belongs
- {
- ol.pushGeneratorState();
- ol.disableAllBut(OutputGenerator::Html);
- ol.lineBreak();
- ol.startSmall();
- ol.docify("[");
- GroupListIterator gli(*d->partOfGroups());
- GroupDef *gd;
- bool first=TRUE;
- for (gli.toFirst();(gd=gli.current());++gli)
- {
- if (!first) { ol.docify(","); ol.writeNonBreakableSpace(1); } else first=FALSE;
- ol.writeObjectLink(gd->getReference(),
- gd->getOutputFileBase(),0,gd->groupTitle());
- }
- ol.docify("]");
- ol.endSmall();
- ol.popGeneratorState();
- }
-}
-
-/*!
- * Function converts Latin1 character to latex string representin the same
- * character.
- */
-static void latin1ToLatex(QTextStream &t,unsigned char c)
-{
- switch (c)
- {
- // the Latin-1 characters
- case 161: t << "!`"; break;
- case 181: t << "$\\mu$"; break;
- case 191: t << "?`"; break;
- case 192: t << "\\`{A}"; break;
- case 193: t << "\\'{A}"; break;
- case 194: t << "\\^{A}"; break;
- case 195: t << "\\~{A}"; break;
- case 196: t << "\\\"{A}"; break;
- case 197: t << "\\AA{}"; break;
- case 198: t << "\\AE{}"; break;
- case 199: t << "\\c{C}"; break;
- case 200: t << "\\`{E}"; break;
- case 201: t << "\\'{E}"; break;
- case 202: t << "\\^{E}"; break;
- case 203: t << "\\\"{E}"; break;
- case 204: t << "\\`{I}"; break;
- case 205: t << "\\'{I}"; break;
- case 206: t << "\\^{I}"; break;
- case 207: t << "\\\"{I}"; break;
- case 208: t << "D "; break; // anyone know the real code?
- case 209: t << "\\~{N}"; break;
- case 210: t << "\\`{O}"; break;
- case 211: t << "\\'{O}"; break;
- case 212: t << "\\^{O}"; break;
- case 213: t << "\\~{O}"; break;
- case 214: t << "\\\"{O}"; break;
- case 215: t << "$\\times$"; break;
- case 216: t << "\\O"; break;
- case 217: t << "\\`{U}"; break;
- case 218: t << "\\'{U}"; break;
- case 219: t << "\\^{U}"; break;
- case 220: t << "\\\"{U}"; break;
- case 221: t << "\\'{Y}"; break;
- case 223: t << "\\ss{}"; break;
- case 224: t << "\\`{a}"; break;
- case 225: t << "\\'{a}"; break;
- case 226: t << "\\^{a}"; break;
- case 227: t << "\\~{a}"; break;
- case 228: t << "\\\"{a}"; break;
- case 229: t << "\\aa{}"; break;
- case 230: t << "\\ae{}"; break;
- case 231: t << "\\c{c}"; break;
- case 232: t << "\\`{e}"; break;
- case 233: t << "\\'{e}"; break;
- case 234: t << "\\^{e}"; break;
- case 235: t << "\\\"{e}"; break;
- case 236: t << "\\`{\\i}"; break;
- case 237: t << "\\'{\\i}"; break;
- case 238: t << "\\^{\\i}"; break;
- case 239: t << "\\\"{\\i}"; break;
- case 241: t << "\\~{n}"; break;
- case 242: t << "\\`{o}"; break;
- case 243: t << "\\'{o}"; break;
- case 244: t << "\\^{o}"; break;
- case 245: t << "\\~{o}"; break;
- case 246: t << "\\\"{o}"; break;
- case 248: t << "\\o{}"; break;
- case 249: t << "\\`{u}"; break;
- case 250: t << "\\'{u}"; break;
- case 251: t << "\\^{u}"; break;
- case 252: t << "\\\"{u}"; break;
- case 253: t << "\\'{y}"; break;
- case 255: t << "\\\"{y}"; break;
- default: t << (char)c;
- }
-}
-
-/*!
- * Function converts Latin2 character to latex string representin the same
- * character.
- */
-static void latin2ToLatex(QTextStream &t,unsigned char c)
-{
- switch (c)
- {
- case 0xA1: t << "\\k{A}"; break;
- case 0xA2: t << (char)c; break;
- case 0xA3: t << "\\L{}"; break;
- case 0xA4: t << (char)c; break;
- case 0xA5: t << (char)c; break;
- case 0xA6: t << "\\'{S}"; break;
- case 0xA7: t << (char)c; break;
- case 0xA8: t << (char)c; break;
- case 0xA9: t << "\\v{S}"; break;
- case 0xAA: t << "\\c{S}"; break;
- case 0xAB: t << "\\v{T}"; break;
- case 0xAC: t << "\\'{Z}"; break;
- case 0xAD: t << (char)c; break;
- case 0xAE: t << "\\v{Z}"; break;
- case 0xAF: t << "\\.{Z}"; break;
-
- case 0xB0: t << (char)c; break;
- case 0xB1: t << "\\k{a}"; break;
- case 0xB2: t << (char)c; break;
- case 0xB3: t << "\\l{}"; break;
- case 0xB4: t << (char)c; break;
- case 0xB5: t << (char)c; break;
- case 0xB6: t << "\\'{s}"; break;
- case 0xB7: t << (char)c; break;
- case 0xB8: t << (char)c; break;
- case 0xB9: t << "\\v{s}"; break;
- case 0xBA: t << "\\c{s}"; break;
- case 0xBB: t << "\\v{t}"; break;
- case 0xBC: t << "\\'{z}"; break;
- case 0xBD: t << (char)c; break;
- case 0xBE: t << "\\v{z}"; break;
- case 0xBF: t << "\\.{z}"; break;
-
- case 0xC0: t << "\\'{R}"; break;
- case 0xC1: t << "\\'{A}"; break;
- case 0xC2: t << "\\^{A}"; break;
- case 0xC3: t << "\\u{A}"; break;
- case 0xC4: t << "\\\"{A}"; break;
- case 0xC5: t << "\\'{L}"; break;
- case 0xC6: t << "\\'{C}"; break;
- case 0xC7: t << "\\c{C}"; break;
- case 0xC8: t << "\\v{C}"; break;
- case 0xC9: t << "\\'{E}"; break;
- case 0xCA: t << "\\k{E}"; break;
- case 0xCB: t << "\\\"{E}"; break;
- case 0xCC: t << "\\v{E}"; break;
- case 0xCD: t << "\\'{I}"; break;
- case 0xCE: t << "\\^{I}"; break;
- case 0xCF: t << "\\v{D}"; break;
-
- case 0xD0: t << "\\bar{D}"; break;
- case 0xD1: t << "\\'{N}"; break;
- case 0xD2: t << "\\v{N}"; break;
- case 0xD3: t << "\\'{O}"; break;
- case 0xD4: t << "\\^{O}"; break;
- case 0xD5: t << "\\H{O}"; break;
- case 0xD6: t << "\\\"{O}"; break;
- case 0xD7: t << (char)c; break;
- case 0xD8: t << "\\v{R}"; break;
- case 0xD9: t << (char)c; break;
- case 0xDA: t << "\\'{U}"; break;
- case 0xDB: t << "\\H{U}"; break;
- case 0xDC: t << "\\\"{U}"; break;
- case 0xDD: t << "\\'{Y}"; break;
- case 0xDE: t << "\\c{T}"; break;
- case 0xDF: t << "\\ss"; break;
-
- case 0xE0: t << "\\'{r}"; break;
- case 0xE1: t << "\\'{a}"; break;
- case 0xE2: t << "\\^{a}"; break;
- case 0xE3: t << (char)c; break;
- case 0xE4: t << "\\\"{a}"; break;
- case 0xE5: t << "\\'{l}"; break;
- case 0xE6: t << "\\'{c}"; break;
- case 0xE7: t << "\\c{c}"; break;
- case 0xE8: t << "\\v{c}"; break;
- case 0xE9: t << "\\'{e}"; break;
- case 0xEA: t << "\\k{e}"; break;
- case 0xEB: t << "\\\"{e}"; break;
- case 0xEC: t << "\\v{e}"; break;
- case 0xED: t << "\\'{\\i}"; break;
- case 0xEE: t << "\\^{\\i}"; break;
- case 0xEF: t << "\\v{d}"; break;
-
- case 0xF0: t << "\\bar{d}"; break;
- case 0xF1: t << "\\'{n}"; break;
- case 0xF2: t << "\\v{n}"; break;
- case 0xF3: t << "\\'{o}"; break;
- case 0xF4: t << "\\^{o}"; break;
- case 0xF5: t << "\\H{o}"; break;
- case 0xF6: t << "\\\"{o}"; break;
- case 0xF7: t << (char)c; break;
- case 0xF8: t << "\\v{r}"; break;
- case 0xF9: t << (char)c; break;
- case 0xFA: t << "\\'{u}"; break;
- case 0xFB: t << "\\H{u}"; break;
- case 0xFC: t << "\\\"{u}"; break;
- case 0xFD: t << "\\'{y}"; break;
- case 0xFE: t << (char)c; break;
- case 0xFF: t << (char)c; break;
-
- default: t << (char)c;
- }
-}
-
-void filterLatexString(QTextStream &t,const char *str,
- bool insideTabbing,bool insidePre,bool insideItem)
-{
- static bool isCzech = theTranslator->idLanguage()=="czech";
- static bool isJapanese = theTranslator->idLanguage()=="japanese" ||
- theTranslator->idLanguage()=="japanese-en";
- static bool isKorean = theTranslator->idLanguage()=="korean" ||
- theTranslator->idLanguage()=="korean-en";
- static bool isRussian = theTranslator->idLanguage()=="russian";
- static bool isUkrainian = theTranslator->idLanguage()=="ukrainian";
- static bool isSlovene = theTranslator->idLanguage()=="solvene";
- static bool isChinese = theTranslator->idLanguage()=="chinese" ||
- theTranslator->idLanguage()=="chinese-traditional";
- static bool isLatin2 = theTranslator->idLanguageCharset()=="iso-8859-2";
- static bool isGreek = theTranslator->idLanguage()=="greek";
- //printf("filterLatexString(%s)\n",str);
- if (str)
- {
- const unsigned char *p=(const unsigned char *)str;
- unsigned char c;
- unsigned char pc='\0';
- while (*p)
- {
- c=*p++;
-
- if (insidePre)
- {
- switch(c)
- {
- case '\\': t << "\\(\\backslash\\)"; break;
- case '{': t << "\\{"; break;
- case '}': t << "\\}"; break;
- case '_': t << "\\_"; break;
- default:
- {
- // Some languages use wide characters
- if (c>=128 && (isJapanese || isKorean || isChinese))
- {
- t << (char)c;
- if (*p)
- {
- c = *p++;
- t << (char)c;
- }
- }
- else
- {
- t << (char)c;
- }
- break;
- }
- }
- }
- else
- {
- switch(c)
- {
- case '#': t << "\\#"; break;
- case '$': t << "\\$"; break;
- case '%': t << "\\%"; break;
- case '^': t << "$^\\wedge$"; break;
- case '&': t << "\\&"; break;
- case '*': t << "$\\ast$"; break;
- case '_': t << "\\_";
- if (!insideTabbing) t << "\\-";
- break;
- case '{': t << "\\{"; break;
- case '}': t << "\\}"; break;
- case '<': t << "$<$"; break;
- case '>': t << "$>$"; break;
- case '|': t << "$|$"; break;
- case '~': t << "$\\sim$"; break;
- case '[': if (Config_getBool("PDF_HYPERLINKS") || insideItem)
- t << "\\mbox{[}";
- else
- t << "[";
- break;
- case ']': if (pc=='[') t << "$\\,$";
- if (Config_getBool("PDF_HYPERLINKS") || insideItem)
- t << "\\mbox{]}";
- else
- t << "]";
- break;
- case '-': if (*p=='>')
- { t << " $\\rightarrow$ "; p++; }
- else
- { t << (char)c; }
- break;
- case '\\': if (*p=='<')
- { t << "$<$"; p++; }
- else if (*p=='>')
- { t << "$>$"; p++; }
- else
- { t << "$\\backslash$"; }
- break;
- case '"': { t << "\\char`\\\"{}"; }
- break;
-
- default:
- {
- // Some languages use wide characters
- if (isJapanese || isKorean || isChinese)
- {
- if (c>=128)
- {
- t << (char)c;
- if (*p)
- {
- c = *p++;
- t << (char)c;
- }
- }
- else // ascii char => see if we can insert a hypenation hint
- {
- if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-";
- t << (char)c;
- }
- }
- else if (isCzech || isRussian || isUkrainian || isSlovene)
- {
- if (c>=128)
- {
- t << (char)c;
- }
- else // ascii char => see if we can insert a hypenation hint
- {
- if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-";
- t << (char)c;
- }
- }
- else if (isGreek)
- {
- if (c<128)
- {
- t << "\\textlatin{" << (char)c << "}";
- }
- else
- {
- t << (char)c;
- }
- }
- else if (isLatin2)
- {
- if (c>=128)
- {
- latin2ToLatex(t,c);
- }
- else
- {
- // see if we can insert an hyphenation hint
- if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-";
- t << (char)c;
- }
- }
- else // another language => assume latin1 charset
- {
- if (c>=128)
- {
- latin1ToLatex(t,c);
- }
- else
- {
- // see if we can insert an hyphenation hint
- if (isupper(c) && islower(pc) && !insideTabbing) t << "\\-";
- t << (char)c;
- }
- }
- }
- }
- }
- pc = c;
- }
- }
-}
-
-
-QCString rtfFormatBmkStr(const char *name)
-{
- static QCString g_nextTag( "AAAAAAAAAA" );
- static QDict<QCString> g_tagDict( 5003 );
-
- g_tagDict.setAutoDelete(TRUE);
-
- // To overcome the 40-character tag limitation, we
- // substitute a short arbitrary string for the name
- // supplied, and keep track of the correspondence
- // between names and strings.
- QCString key( name );
- QCString* tag = g_tagDict.find( key );
- if ( !tag )
- {
- // This particular name has not yet been added
- // to the list. Add it, associating it with the
- // next tag value, and increment the next tag.
- tag = new QCString( g_nextTag.copy() ); // Make sure to use a deep copy!
- g_tagDict.insert( key, tag );
-
- // This is the increment part
- char* nxtTag = g_nextTag.data() + g_nextTag.length() - 1;
- for ( unsigned int i = 0; i < g_nextTag.length(); ++i, --nxtTag )
- {
- if ( ( ++(*nxtTag) ) > 'Z' )
- {
- *nxtTag = 'A';
- }
- else
- {
- // Since there was no carry, we can stop now
- break;
- }
- }
- }
-
- return *tag;
-}
-
-QCString stripExtension(const char *fName)
-{
- QCString result=fName;
- if (result.right(Doxygen::htmlFileExtension.length())==Doxygen::htmlFileExtension)
- {
- result=result.left(result.length()-Doxygen::htmlFileExtension.length());
- }
- return result;
-}
-
-
-void replaceNamespaceAliases(QCString &scope,int i)
-{
- //printf("replaceNamespaceAliases(%s,%d)\n",scope.data(),i);
- while (i>0)
- {
- QCString *s = Doxygen::namespaceAliasDict[scope.left(i)];
- if (s)
- {
- scope=*s+scope.right(scope.length()-i);
- i=s->length();
- }
- i=scope.findRev("::",i-1);
- }
- //printf("replaceNamespaceAliases() result=%s\n",scope.data());
-}
-
-QCString stripPath(const char *s)
-{
- QCString result=s;
- int i=result.findRev('/');
- if (i!=-1)
- {
- result=result.mid(i+1);
- }
- return result;
-}
-
-/** returns \c TRUE iff string \a s contains word \a w */
-bool containsWord(const QCString &s,const QCString &word)
-{
- static QRegExp wordExp("[a-z_A-Z]+");
- int p=0,i,l;
- while ((i=wordExp.match(s,p,&l))!=-1)
- {
- if (s.mid(i,l)==word) return TRUE;
- p=i+l;
- }
- return FALSE;
-}
-
-bool findAndRemoveWord(QCString &s,const QCString &word)
-{
- static QRegExp wordExp("[a-z_A-Z]+");
- int p=0,i,l;
- while ((i=wordExp.match(s,p,&l))!=-1)
- {
- if (s.mid(i,l)==word)
- {
- if (i>0 && isspace(s.at(i-1)))
- i--,l++;
- else if (i+l<(int)s.length() && isspace(s.at(i+l)))
- l++;
- s = s.left(i)+s.mid(i+l); // remove word + spacing
- return TRUE;
- }
- p=i+l;
- }
- return FALSE;
-}
-
-/** Special version of QCString::stripWhiteSpace() that only strips
- * empty lines.
- */
-QCString stripLeadingAndTrailingEmptyLines(const QCString &s)
-{
- const char *p = s.data();
- if (p==0) return 0;
-
- // search for leading empty lines
- int i=0,li=-1,l=s.length();
- char c;
- while ((c=*p++))
- {
- if (c==' ' || c=='\t' || c=='\r') i++;
- else if (c=='\n') i++,li=i;
- else break;
- }
-
- // search for trailing empty lines
- int b=l-1,bi=-1;
- p=s.data()+b;
- while (b>=0)
- {
- c=*--p;
- if (c==' ' || c=='\t' || c=='\r') b--;
- else if (c=='\n') bi=b,b--;
- else break;
- }
-
- // return whole string if no leading or trailing lines where found
- if (li==-1 && bi==-1) return s;
-
- // return substring
- if (bi==-1) bi=l;
- if (li==-1) li=0;
- if (bi<=li) return 0; // only empty lines
- return s.mid(li,bi-li);
-}
-
-void stringToSearchIndex(const QCString &docBaseUrl,const QCString &title,
- const QCString &str,bool priority,const QCString &anchor)
-{
- static bool searchEngine = Config_getBool("SEARCHENGINE");
- if (searchEngine)
- {
- Doxygen::searchIndex->setCurrentDoc(title,docBaseUrl,anchor);
- static QRegExp wordPattern("[a-z_A-Z][a-z_A-Z0-9]*");
- int i,p=0,l;
- while ((i=wordPattern.match(str,p,&l))!=-1)
- {
- Doxygen::searchIndex->addWord(str.mid(i,l),priority);
- p=i+l;
- }
- }
-}
-
diff --git a/src/util.h b/src/util.h
deleted file mode 100644
index 75ef928..0000000
--- a/src/util.h
+++ /dev/null
@@ -1,243 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 UTIL_H
-#define UTIL_H
-
-/*! \file util.h
- * \brief A bunch of utility functions.
- */
-
-#include "qtbc.h"
-#include <qlist.h>
-#include <qtextstream.h>
-#include <ctype.h>
-#include "sortdict.h"
-
-class ClassDef;
-class FileDef;
-class MemberList;
-class NamespaceDef;
-class FileNameDict;
-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 QDir;
-class Definition;
-
-//--------------------------------------------------------------------
-
-class TextGeneratorIntf
-{
- public:
- virtual ~TextGeneratorIntf() {}
- virtual void writeString(const char *,bool) const = 0;
- virtual void writeBreak() const = 0;
- virtual void writeLink(const char *extRef,const char *file,
- const char *anchor,const char *text
- ) const = 0;
-};
-
-class TextGeneratorOLImpl : public TextGeneratorIntf
-{
- public:
- virtual ~TextGeneratorOLImpl() {}
- TextGeneratorOLImpl(OutputDocInterface &od);
- void writeString(const char *s,bool keepSpaces) const;
- void writeBreak() const;
- void writeLink(const char *extRef,const char *file,
- const char *anchor,const char *text
- ) const;
- private:
- OutputDocInterface &m_od;
-};
-
-//--------------------------------------------------------------------
-
-void linkifyText(const TextGeneratorIntf &ol,
- Definition *scope,
- FileDef *fileScope,
- const char *name,
- const char *text,
- bool autoBreak=FALSE,
- bool external=TRUE,
- bool keepSpaces=FALSE
- );
-void setAnchors(ClassDef *cd,char id,MemberList *ml,int groupId=-1);
-QCString fileToString(const char *name,bool filter=FALSE);
-QCString dateToString(bool);
-bool getDefs(const QCString &scopeName,
- const QCString &memberName,
- const char *,
- MemberDef *&md,
- ClassDef *&cd,
- FileDef *&fd,
- NamespaceDef *&nd,
- GroupDef *&gd,
- bool forceEmptyScope=FALSE,
- FileDef *currentFile=0,
- bool checkCV=FALSE
- );
-
-QCString getFileFilter(const char* name);
-
-bool resolveRef(/* in */ const char *scName,
- /* in */ const char *name,
- /* in */ bool inSeeBlock,
- /* out */ Definition **resContext,
- /* out */ MemberDef **resMember
- );
-
-bool resolveLink(/* in */ const char *scName,
- /* in */ const char *lr,
- /* in */ bool inSeeBlock,
- /* out */ Definition **resContext,
- /* out */ QCString &resAnchor
- );
-
-bool generateRef(OutputDocInterface &od,const char *,
- const char *,bool inSeeBlock,const char * =0);
-bool generateLink(OutputDocInterface &od,const char *,
- const char *,bool inSeeBlock,const char *);
-
-void generateFileRef(OutputDocInterface &od,const char *,
- const char *linkTxt=0);
-void writePageRef(OutputDocInterface &od,const char *cn,const char *mn);
-
-#if 0
-bool matchArguments(ArgumentList *,ArgumentList *,
- const char *cl=0,const char *ns=0,bool checkCV=TRUE,
- NamespaceSDict *usingNamespaces=0,
- SDict<Definition> *usingClasses=0);
-#endif
-bool matchArguments2(Definition *srcScope,FileDef *srcFileScope,ArgumentList *srcAl,
- Definition *dstScope,FileDef *dstFileScope,ArgumentList *dstAl,
- bool checkCV
- );
-void mergeArguments(ArgumentList *,ArgumentList *,bool forceNameOverwrite=FALSE);
-QCString substituteClassNames(const QCString &s);
-QCString substitute(const char *s,const char *src,const char *dst);
-QCString resolveDefines(const char *n);
-ClassDef *getClass(const char *key);
-ClassDef *getResolvedClass(Definition *scope,
- FileDef *fileScope,
- const char *key,
- MemberDef **pTypeDef=0,
- QCString *pTemplSpec=0,
- bool mayBeUnlinkable=FALSE);
-NamespaceDef *getResolvedNamespace(const char *key);
-FileDef *findFileDef(const FileNameDict *fnDict,const char *n,
- bool &ambig);
-QCString showFileDefMatches(const FileNameDict *fnDict,const char *n);
-int guessSection(const char *name);
-bool isId(char c);
-QCString removeRedundantWhiteSpace(const QCString &s);
-QCString argListToString(ArgumentList *al,bool useCanonicalType=FALSE);
-QCString tempArgListToString(ArgumentList *al);
-QCString generateMarker(int id);
-void writeExample(OutputList &ol,ExampleSDict *el);
-QCString stripAnonymousNamespaceScope(const QCString &s);
-QCString stripFromPath(const QCString &path);
-QCString stripFromIncludePath(const QCString &path);
-bool rightScopeMatch(const QCString &scope, const QCString &name);
-bool leftScopeMatch(const QCString &scope, const QCString &name);
-QCString substituteKeywords(const QCString &s,const char *title,const QCString &relPath="");
-int getPrefixIndex(const QCString &name);
-QCString removeAnonymousScopes(const QCString &s);
-QCString replaceAnonymousScopes(const QCString &s);
-void initClassHierarchy(ClassSDict *cl);
-bool hasVisibleRoot(BaseClassList *bcl);
-int minClassDistance(ClassDef *cd,ClassDef *bcd,int level=0);
-QCString convertNameToFile(const char *name,bool allowDots=FALSE);
-void extractNamespaceName(const QCString &scopeName,
- QCString &className,QCString &namespaceName,
- bool allowEmptyClass=FALSE);
-QCString insertTemplateSpecifierInScope(const QCString &scope,const QCString &templ);
-QCString stripScope(const char *name);
-int iSystem(const char *command,const char *args,bool isBatchFile=FALSE);
-QCString convertToHtml(const char *s);
-QCString convertToXML(const char *s);
-QCString getOverloadDocs();
-void addMembersToMemberGroup(MemberList *ml,
- MemberGroupSDict *memberGroupSDict,
- Definition *context);
-int extractClassNameFromType(const QCString &type,int &pos,
- QCString &name,QCString &templSpec);
-QCString substituteTemplateArgumentsInString(
- const QCString &name,
- ArgumentList *formalArgs,
- ArgumentList *actualArgs);
-
-ArgumentList *copyArgumentList(const ArgumentList *src);
-QList<ArgumentList> *copyArgumentLists(const QList<ArgumentList> *srcLists);
-QCString stripTemplateSpecifiersFromScope(const QCString &fullName,
- bool parentOnly=TRUE,
- QCString *lastScopeStripped=0);
-QCString resolveTypeDef(Definition *d,const QCString &name,
- Definition **typedefContext=0);
-QCString mergeScopes(const QCString &leftScope,const QCString &rightScope);
-int getScopeFragment(const QCString &s,int p,int *l);
-int filterCRLF(char *buf,int len);
-void addRefItem(const QList<ListItemInfo> *sli,const char *prefix,
- const char *name,const char *title,const char *args=0);
-PageDef *addRelatedPage(const char *name,const QCString &ptitle,
- const QCString &doc,QList<SectionInfo> *anchors,
- const char *fileName,int startLine,
- const QList<ListItemInfo> *sli,
- GroupDef *gd=0,
- TagInfo *tagInfo=0
- );
-QCString escapeCharsInString(const char *name,bool allowDots);
-void addGroupListToTitle(OutputList &ol,Definition *d);
-void filterLatexString(QTextStream &t,const char *str,
- bool insideTabbing=FALSE,bool insidePre=FALSE,
- bool insideItem=FALSE);
-QCString rtfFormatBmkStr(const char *name);
-QCString linkToText(const char *link,bool isFileName);
-QCString stripExtension(const char *fName);
-void replaceNamespaceAliases(QCString &scope,int i);
-int isAccessibleFrom(Definition *scope,FileDef *fileScope,Definition *item);
-int isAccessibleFromWithExpScope(Definition *scope,FileDef *fileScope,Definition *item,
- const QCString &explicitScopePart);
-int computeQualifiedIndex(const QString &name);
-void addDirPrefix(QCString &fileName);
-QCString relativePathToRoot(const char *name);
-#define REL_PATH_TO_ROOT "../../"
-void createSubDirs(QDir &d);
-QCString stripPath(const char *s);
-bool containsWord(const QCString &s,const QCString &word);
-bool findAndRemoveWord(QCString &s,const QCString &word);
-QCString stripLeadingAndTrailingEmptyLines(const QCString &s);
-void stringToSearchIndex(const QCString &docUrlBase,const QCString &title,
- const QCString &str, bool priority=FALSE,
- const QCString &anchor="");
-
-#endif
-
diff --git a/src/version.h b/src/version.h
deleted file mode 100644
index 0cbe12a..0000000
--- a/src/version.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 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 VERSION_H
-#define VERSION_H
-
-extern char versionString[];
-
-#endif
diff --git a/src/xmldocvisitor.cpp b/src/xmldocvisitor.cpp
deleted file mode 100644
index 04bfbe3..0000000
--- a/src/xmldocvisitor.cpp
+++ /dev/null
@@ -1,917 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 "xmldocvisitor.h"
-#include "docparser.h"
-#include "language.h"
-#include "doxygen.h"
-#include "outputgen.h"
-#include "xmlgen.h"
-#include "dot.h"
-#include "message.h"
-#include "util.h"
-#include <qfileinfo.h>
-#include "parserintf.h"
-
-XmlDocVisitor::XmlDocVisitor(QTextStream &t,CodeOutputInterface &ci)
- : DocVisitor(DocVisitor_XML), m_t(t), m_ci(ci), m_insidePre(FALSE), m_hide(FALSE)
-{
-}
-
- //--------------------------------------
- // visitor functions for leaf nodes
- //--------------------------------------
-
-void XmlDocVisitor::visit(DocWord *w)
-{
- if (m_hide) return;
- filter(w->word());
-}
-
-void XmlDocVisitor::visit(DocLinkedWord *w)
-{
- if (m_hide) return;
- startLink(w->ref(),w->file(),w->anchor());
- filter(w->word());
- endLink();
-}
-
-void XmlDocVisitor::visit(DocWhiteSpace *w)
-{
- if (m_hide) return;
- if (m_insidePre)
- {
- m_t << w->chars();
- }
- else
- {
- m_t << " ";
- }
-}
-
-void XmlDocVisitor::visit(DocSymbol *s)
-{
- if (m_hide) return;
- switch(s->symbol())
- {
- case DocSymbol::BSlash: m_t << "\\"; break;
- case DocSymbol::At: m_t << "@"; break;
- case DocSymbol::Less: m_t << "&lt;"; break;
- case DocSymbol::Greater: m_t << "&gt;"; break;
- case DocSymbol::Amp: m_t << "&amp;"; break;
- case DocSymbol::Dollar: m_t << "$"; break;
- case DocSymbol::Hash: m_t << "#"; break;
- case DocSymbol::Percent: m_t << "%"; break;
- case DocSymbol::Copy: m_t << "<copy/>"; break;
- case DocSymbol::Tm: m_t << "<trademark/>"; break;
- case DocSymbol::Reg: m_t << "<registered/>"; break;
- case DocSymbol::Apos: m_t << "'"; break;
- case DocSymbol::Quot: m_t << "\""; break;
- case DocSymbol::Uml: m_t << "<umlaut char=\"" << s->letter() << "\"/>"; break;
- case DocSymbol::Acute: m_t << "<acute char=\"" << s->letter() << "\"/>"; break;
- case DocSymbol::Grave: m_t << "<grave char=\"" << s->letter() << "\"/>"; break;
- case DocSymbol::Circ: m_t << "<circ char=\"" << s->letter() << "\"/>"; break;
- case DocSymbol::Tilde: m_t << "<tilde char=\"" << s->letter() << "\"/>"; break;
- case DocSymbol::Szlig: m_t << "<szlig/>"; break;
- case DocSymbol::Cedil: m_t << "<cedil char=\"" << s->letter() << "\"/>"; break;
- case DocSymbol::Ring: m_t << "<ring char=\"" << s->letter() << "\"/>"; break;
- case DocSymbol::Slash: m_t << "<slash char=\"" << s->letter() << "\"/>"; break;
- case DocSymbol::Nbsp: m_t << "<nonbreakablespace/>"; break;
- default:
- err("Error: unknown symbol found\n");
- }
-}
-
-void XmlDocVisitor::visit(DocURL *u)
-{
- if (m_hide) return;
- m_t << "<ulink url=\"";
- if (u->isEmail()) m_t << "mailto:";
- m_t << u->url() << "\">";
- filter(u->url());
- m_t << "</ulink>";
-}
-
-void XmlDocVisitor::visit(DocLineBreak *)
-{
- if (m_hide) return;
- m_t << "<linebreak/>\n";
-}
-
-void XmlDocVisitor::visit(DocHorRuler *)
-{
- if (m_hide) return;
- m_t << "<hruler/>\n";
-}
-
-void XmlDocVisitor::visit(DocStyleChange *s)
-{
- if (m_hide) return;
- switch (s->style())
- {
- case DocStyleChange::Bold:
- if (s->enable()) m_t << "<bold>"; else m_t << "</bold>";
- break;
- case DocStyleChange::Italic:
- if (s->enable()) m_t << "<emphasis>"; else m_t << "</emphasis>";
- break;
- case DocStyleChange::Code:
- if (s->enable()) m_t << "<computeroutput>"; else m_t << "</computeroutput>";
- break;
- case DocStyleChange::Subscript:
- if (s->enable()) m_t << "<subscript>"; else m_t << "</subscript>";
- break;
- case DocStyleChange::Superscript:
- if (s->enable()) m_t << "<superscript>"; else m_t << "</superscript>";
- break;
- case DocStyleChange::Center:
- if (s->enable()) m_t << "<center>"; else m_t << "</center>";
- break;
- case DocStyleChange::Small:
- if (s->enable()) m_t << "<small>"; else m_t << "</small>";
- break;
- case DocStyleChange::Preformatted:
- if (s->enable())
- {
- m_t << "<preformatted>";
- m_insidePre=TRUE;
- }
- else
- {
- m_t << "</preformatted>";
- m_insidePre=FALSE;
- }
- break;
- case DocStyleChange::Div: /* HTML only */ break;
- case DocStyleChange::Span: /* HTML only */ break;
- }
-}
-
-void XmlDocVisitor::visit(DocVerbatim *s)
-{
- if (m_hide) return;
- switch(s->type())
- {
- case DocVerbatim::Code: // fall though
- m_t << "<programlisting>";
- Doxygen::parserManager->getParser(m_langExt)
- ->parseCode(m_ci,s->context(),s->text().latin1(),
- s->isExample(),s->exampleFile());
- m_t << "</programlisting>";
- break;
- case DocVerbatim::Verbatim:
- m_t << "<verbatim>";
- filter(s->text());
- m_t << "</verbatim>";
- break;
- case DocVerbatim::HtmlOnly:
- m_t << "<htmlonly>";
- filter(s->text());
- m_t << "</htmlonly>";
- break;
- case DocVerbatim::ManOnly:
- m_t << "<manonly>";
- filter(s->text());
- m_t << "</manonly>";
- break;
- case DocVerbatim::LatexOnly:
- m_t << "<latexonly>";
- filter(s->text());
- m_t << "</latexonly>";
- break;
- case DocVerbatim::XmlOnly:
- m_t << s->text();
- break;
- case DocVerbatim::Dot:
- m_t << "<dot>";
- filter(s->text());
- m_t << "</dot>";
- break;
- }
-}
-
-void XmlDocVisitor::visit(DocAnchor *anc)
-{
- if (m_hide) return;
- m_t << "<anchor id=\"" << anc->file() << "_1" << anc->anchor() << "\"/>";
-}
-
-void XmlDocVisitor::visit(DocInclude *inc)
-{
- if (m_hide) return;
- switch(inc->type())
- {
- case DocInclude::IncWithLines:
- {
- m_t << "<programlisting>";
- QFileInfo cfi( inc->file() );
- FileDef fd( cfi.dirPath(), cfi.fileName() );
- Doxygen::parserManager->getParser(inc->extension())
- ->parseCode(m_ci,inc->context(),
- inc->text().latin1(),
- inc->isExample(),
- inc->exampleFile(), &fd);
- m_t << "</programlisting>";
- }
- break;
- case DocInclude::Include:
- m_t << "<programlisting>";
- Doxygen::parserManager->getParser(inc->extension())
- ->parseCode(m_ci,inc->context(),
- inc->text().latin1(),
- inc->isExample(),
- inc->exampleFile());
- m_t << "</programlisting>";
- break;
- case DocInclude::DontInclude:
- break;
- case DocInclude::HtmlInclude:
- m_t << "<htmlonly>";
- filter(inc->text());
- m_t << "</htmlonly>";
- break;
- case DocInclude::VerbInclude:
- m_t << "<verbatim>";
- filter(inc->text());
- m_t << "</verbatim>";
- break;
- }
-}
-
-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 (!m_hide)
- {
- m_t << "<programlisting>";
- }
- pushEnabled();
- m_hide = TRUE;
- }
- if (op->type()!=DocIncOperator::Skip)
- {
- popEnabled();
- if (!m_hide)
- {
- Doxygen::parserManager->getParser(m_langExt)
- ->parseCode(m_ci,op->context(),
- op->text().latin1(),op->isExample(),
- op->exampleFile());
- }
- pushEnabled();
- m_hide=TRUE;
- }
- if (op->isLast())
- {
- popEnabled();
- if (!m_hide) m_t << "</programlisting>";
- }
- else
- {
- if (!m_hide) m_t << endl;
- }
-}
-
-void XmlDocVisitor::visit(DocFormula *f)
-{
- if (m_hide) return;
- m_t << "<formula id=\"" << f->id() << "\">";
- filter(f->text());
- m_t << "</formula>";
-}
-
-void XmlDocVisitor::visit(DocIndexEntry *ie)
-{
- if (m_hide) return;
- m_t << "<indexentry>"
- "<primaryie>";
- filter(ie->entry());
- m_t << "</primaryie>"
- "<secondaryie></secondaryie>"
- "</indexentry>";
-}
-
-//--------------------------------------
-// visitor functions for compound nodes
-//--------------------------------------
-
-void XmlDocVisitor::visitPre(DocAutoList *l)
-{
- if (m_hide) return;
- if (l->isEnumList())
- {
- m_t << "<orderedlist>\n";
- }
- else
- {
- m_t << "<itemizedlist>\n";
- }
-}
-
-void XmlDocVisitor::visitPost(DocAutoList *l)
-{
- if (m_hide) return;
- if (l->isEnumList())
- {
- m_t << "</orderedlist>\n";
- }
- else
- {
- m_t << "</itemizedlist>\n";
- }
-}
-
-void XmlDocVisitor::visitPre(DocAutoListItem *)
-{
- if (m_hide) return;
- m_t << "<listitem>";
-}
-
-void XmlDocVisitor::visitPost(DocAutoListItem *)
-{
- if (m_hide) return;
- m_t << "</listitem>";
-}
-
-void XmlDocVisitor::visitPre(DocPara *)
-{
- if (m_hide) return;
- m_t << "<para>";
-}
-
-void XmlDocVisitor::visitPost(DocPara *)
-{
- if (m_hide) return;
- m_t << "</para>";
-}
-
-void XmlDocVisitor::visitPre(DocRoot *)
-{
- //m_t << "<hr><h4><font color=\"red\">New parser:</font></h4>\n";
-}
-
-void XmlDocVisitor::visitPost(DocRoot *)
-{
- //m_t << "<hr><h4><font color=\"red\">Old parser:</font></h4>\n";
-}
-
-void XmlDocVisitor::visitPre(DocSimpleSect *s)
-{
- if (m_hide) return;
- m_t << "<simplesect kind=\"";
- switch(s->type())
- {
- case DocSimpleSect::See:
- m_t << "see"; break;
- case DocSimpleSect::Return:
- m_t << "return"; break;
- case DocSimpleSect::Author:
- m_t << "author"; break;
- case DocSimpleSect::Authors:
- m_t << "authors"; break;
- case DocSimpleSect::Version:
- m_t << "version"; break;
- case DocSimpleSect::Since:
- m_t << "since"; break;
- case DocSimpleSect::Date:
- m_t << "date"; break;
- case DocSimpleSect::Note:
- m_t << "note"; break;
- case DocSimpleSect::Warning:
- m_t << "warning"; break;
- case DocSimpleSect::Pre:
- m_t << "pre"; break;
- case DocSimpleSect::Post:
- m_t << "post"; break;
- case DocSimpleSect::Invar:
- m_t << "invariant"; break;
- case DocSimpleSect::Remark:
- m_t << "remark"; break;
- case DocSimpleSect::Attention:
- m_t << "attention"; break;
- case DocSimpleSect::User:
- m_t << "par"; break;
- case DocSimpleSect::Rcs:
- m_t << "rcs"; break;
- case DocSimpleSect::Unknown: break;
- }
- m_t << "\">";
-}
-
-void XmlDocVisitor::visitPost(DocSimpleSect *)
-{
- if (m_hide) return;
- m_t << "</simplesect>\n";
-}
-
-void XmlDocVisitor::visitPre(DocTitle *)
-{
- if (m_hide) return;
- m_t << "<title>";
-}
-
-void XmlDocVisitor::visitPost(DocTitle *)
-{
- if (m_hide) return;
- m_t << "</title>";
-}
-
-void XmlDocVisitor::visitPre(DocSimpleList *)
-{
- if (m_hide) return;
- m_t << "<itemizedlist>\n";
-}
-
-void XmlDocVisitor::visitPost(DocSimpleList *)
-{
- if (m_hide) return;
- m_t << "</itemizedlist>\n";
-}
-
-void XmlDocVisitor::visitPre(DocSimpleListItem *)
-{
- if (m_hide) return;
- m_t << "<listitem>";
-}
-
-void XmlDocVisitor::visitPost(DocSimpleListItem *)
-{
- if (m_hide) return;
- m_t << "</listitem>\n";
-}
-
-void XmlDocVisitor::visitPre(DocSection *s)
-{
- if (m_hide) return;
- m_t << "<sect" << s->level() << " id=\"" << s->file();
- if (!s->anchor().isEmpty()) m_t << "_1" << s->anchor();
- m_t << "\">" << endl;
- m_t << "<title>";
- filter(s->title());
- m_t << "</title>" << endl;
-}
-
-void XmlDocVisitor::visitPost(DocSection *s)
-{
- m_t << "</sect" << s->level() << ">\n";
-}
-
-void XmlDocVisitor::visitPre(DocHtmlList *s)
-{
- if (m_hide) return;
- if (s->type()==DocHtmlList::Ordered)
- m_t << "<orderedlist>\n";
- else
- m_t << "<itemizedlist>\n";
-}
-
-void XmlDocVisitor::visitPost(DocHtmlList *s)
-{
- if (m_hide) return;
- if (s->type()==DocHtmlList::Ordered)
- m_t << "</orderedlist>\n";
- else
- m_t << "</itemizedlist>\n";
-}
-
-void XmlDocVisitor::visitPre(DocHtmlListItem *)
-{
- if (m_hide) return;
- m_t << "<listitem>\n";
-}
-
-void XmlDocVisitor::visitPost(DocHtmlListItem *)
-{
- if (m_hide) return;
- m_t << "</listitem>\n";
-}
-
-void XmlDocVisitor::visitPre(DocHtmlDescList *)
-{
- if (m_hide) return;
- m_t << "<variablelist>\n";
-}
-
-void XmlDocVisitor::visitPost(DocHtmlDescList *)
-{
- if (m_hide) return;
- m_t << "</variablelist>\n";
-}
-
-void XmlDocVisitor::visitPre(DocHtmlDescTitle *)
-{
- if (m_hide) return;
- m_t << "<varlistentry><term>";
-}
-
-void XmlDocVisitor::visitPost(DocHtmlDescTitle *)
-{
- if (m_hide) return;
- m_t << "</term></varlistentry>\n";
-}
-
-void XmlDocVisitor::visitPre(DocHtmlDescData *)
-{
- if (m_hide) return;
- m_t << "<listitem>";
-}
-
-void XmlDocVisitor::visitPost(DocHtmlDescData *)
-{
- if (m_hide) return;
- m_t << "</listitem>\n";
-}
-
-void XmlDocVisitor::visitPre(DocHtmlTable *t)
-{
- if (m_hide) return;
- m_t << "<table rows=\"" << t->numRows()
- << "\" cols=\"" << t->numCols() << "\">" ;
-}
-
-void XmlDocVisitor::visitPost(DocHtmlTable *)
-{
- if (m_hide) return;
- m_t << "</table>\n";
-}
-
-void XmlDocVisitor::visitPre(DocHtmlRow *)
-{
- if (m_hide) return;
- m_t << "<row>\n";
-}
-
-void XmlDocVisitor::visitPost(DocHtmlRow *)
-{
- if (m_hide) return;
- m_t << "</row>\n";
-}
-
-void XmlDocVisitor::visitPre(DocHtmlCell *c)
-{
- if (m_hide) return;
- if (c->isHeading()) m_t << "<entry thead=\"yes\">"; else m_t << "<entry thead=\"no\">";
-}
-
-void XmlDocVisitor::visitPost(DocHtmlCell *)
-{
- if (m_hide) return;
- m_t << "</entry>";
-}
-
-void XmlDocVisitor::visitPre(DocHtmlCaption *)
-{
- if (m_hide) return;
- m_t << "<caption>";
-}
-
-void XmlDocVisitor::visitPost(DocHtmlCaption *)
-{
- if (m_hide) return;
- m_t << "</caption>\n";
-}
-
-void XmlDocVisitor::visitPre(DocInternal *)
-{
- if (m_hide) return;
- m_t << "<internal>";
-}
-
-void XmlDocVisitor::visitPost(DocInternal *)
-{
- if (m_hide) return;
- m_t << "</internal>" << endl;
-}
-
-void XmlDocVisitor::visitPre(DocHRef *href)
-{
- if (m_hide) return;
- m_t << "<ulink url=\"" << href->url() << "\">";
-}
-
-void XmlDocVisitor::visitPost(DocHRef *)
-{
- if (m_hide) return;
- m_t << "</ulink>";
-}
-
-void XmlDocVisitor::visitPre(DocHtmlHeader *header)
-{
- if (m_hide) return;
- m_t << "<heading level=\"" << header->level() << "\">";
-}
-
-void XmlDocVisitor::visitPost(DocHtmlHeader *)
-{
- if (m_hide) return;
- m_t << "</heading>\n";
-}
-
-void XmlDocVisitor::visitPre(DocImage *img)
-{
- if (m_hide) return;
- m_t << "<image type=\"";
- switch(img->type())
- {
- case DocImage::Html: m_t << "html"; break;
- case DocImage::Latex: m_t << "latex"; break;
- case DocImage::Rtf: m_t << "rtf"; break;
- }
- m_t << "\"";
-
- QString baseName=img->name();
- int i;
- if ((i=baseName.findRev('/'))!=-1 || (i=baseName.findRev('\\'))!=-1)
- {
- baseName=baseName.right(baseName.length()-i-1);
- }
- m_t << " name=\"" << baseName << "\"";
- if (!img->width().isEmpty())
- {
- m_t << " width=\"";
- filter(img->width());
- m_t << "\"";
- }
- else if (!img->height().isEmpty())
- {
- m_t << " height=\"";
- filter(img->height());
- m_t << "\"";
- }
- m_t << ">";
-
- // copy the image to the output dir
- QFile inImage(img->name());
- QFile outImage(Config_getString("XML_OUTPUT")+"/"+baseName.ascii());
- if (inImage.open(IO_ReadOnly))
- {
- if (outImage.open(IO_WriteOnly))
- {
- char *buffer = new char[inImage.size()];
- inImage.readBlock(buffer,inImage.size());
- outImage.writeBlock(buffer,inImage.size());
- outImage.flush();
- delete buffer;
- }
- }
-}
-
-void XmlDocVisitor::visitPost(DocImage *)
-{
- if (m_hide) return;
- m_t << "</image>" << endl;
-}
-
-void XmlDocVisitor::visitPre(DocDotFile *df)
-{
- if (m_hide) return;
- m_t << "<dotfile name=\"" << df->file() << "\">";
-}
-
-void XmlDocVisitor::visitPost(DocDotFile *)
-{
- if (m_hide) return;
- m_t << "</dotfile>" << endl;
-}
-
-void XmlDocVisitor::visitPre(DocLink *lnk)
-{
- if (m_hide) return;
- startLink(lnk->ref(),lnk->file(),lnk->anchor());
-}
-
-void XmlDocVisitor::visitPost(DocLink *)
-{
- if (m_hide) return;
- endLink();
-}
-
-void XmlDocVisitor::visitPre(DocRef *ref)
-{
- if (m_hide) return;
- if (!ref->file().isEmpty()) startLink(ref->ref(),ref->file(),ref->anchor());
- if (!ref->hasLinkText()) filter(ref->targetTitle());
-}
-
-void XmlDocVisitor::visitPost(DocRef *ref)
-{
- if (m_hide) return;
- if (!ref->file().isEmpty()) endLink();
- m_t << " ";
-}
-
-void XmlDocVisitor::visitPre(DocSecRefItem *ref)
-{
- if (m_hide) return;
- m_t << "<tocitem id=\"" << ref->file() << "_1" << ref->anchor() << "\">";
-}
-
-void XmlDocVisitor::visitPost(DocSecRefItem *)
-{
- if (m_hide) return;
- m_t << "</tocitem>" << endl;
-}
-
-void XmlDocVisitor::visitPre(DocSecRefList *)
-{
- if (m_hide) return;
- m_t << "<toclist>" << endl;
-}
-
-void XmlDocVisitor::visitPost(DocSecRefList *)
-{
- if (m_hide) return;
- m_t << "</toclist>" << endl;
-}
-
-//void XmlDocVisitor::visitPre(DocLanguage *l)
-//{
-// if (m_hide) return;
-// m_t << "<language langid=\"" << l->id() << "\">";
-//}
-//
-//void XmlDocVisitor::visitPost(DocLanguage *)
-//{
-// if (m_hide) return;
-// m_t << "</language>" << endl;
-//}
-
-void XmlDocVisitor::visitPre(DocParamSect *s)
-{
- if (m_hide) return;
- m_t << "<parameterlist kind=\"";
- switch(s->type())
- {
- case DocParamSect::Param:
- m_t << "param"; break;
- case DocParamSect::RetVal:
- m_t << "retval"; break;
- case DocParamSect::Exception:
- m_t << "exception"; break;
- default:
- ASSERT(0);
- }
- m_t << "\">";
-}
-
-void XmlDocVisitor::visitPost(DocParamSect *)
-{
- if (m_hide) return;
- m_t << "</parameterlist>" << endl;
-}
-
-void XmlDocVisitor::visitPre(DocParamList *pl)
-{
- if (m_hide) return;
- m_t << "<parameteritem>" << endl;
- m_t << "<parameternamelist>" << endl;
- //QStrListIterator li(pl->parameters());
- //const char *s;
- QListIterator<DocNode> li(pl->parameters());
- DocNode *param;
- for (li.toFirst();(param=li.current());++li)
- {
- m_t << "<parametername";
- if (pl->direction()!=DocParamSect::Unspecified)
- {
- m_t << " direction=\"";
- if (pl->direction()==DocParamSect::In)
- {
- m_t << "in";
- }
- else if (pl->direction()==DocParamSect::Out)
- {
- m_t << "out";
- }
- else if (pl->direction()==DocParamSect::InOut)
- {
- m_t << "inout";
- }
- m_t << "\"";
- }
- m_t << ">";
- if (param->kind()==DocNode::Kind_Word)
- {
- visit((DocWord*)param);
- }
- else if (param->kind()==DocNode::Kind_LinkedWord)
- {
- visit((DocLinkedWord*)param);
- }
- m_t << "</parametername>" << endl;
- }
- m_t << "</parameternamelist>" << endl;
- m_t << "<parameterdescription>" << endl;
-}
-
-void XmlDocVisitor::visitPost(DocParamList *)
-{
- if (m_hide) return;
- m_t << "</parameterdescription>" << endl;
- m_t << "</parameteritem>" << endl;
-}
-
-void XmlDocVisitor::visitPre(DocXRefItem *x)
-{
- if (m_hide) return;
- m_t << "<xrefsect id=\"";
- m_t << x->file() << "_1" << x->anchor();
- m_t << "\">";
- m_t << "<xreftitle>";
- filter(x->title());
- m_t << "</xreftitle>";
- m_t << "<xrefdescription>";
-}
-
-void XmlDocVisitor::visitPost(DocXRefItem *)
-{
- if (m_hide) return;
- m_t << "</xrefdescription>";
- m_t << "</xrefsect>";
-}
-
-void XmlDocVisitor::visitPre(DocInternalRef *ref)
-{
- if (m_hide) return;
- startLink(0,ref->file(),ref->anchor());
-}
-
-void XmlDocVisitor::visitPost(DocInternalRef *)
-{
- if (m_hide) return;
- endLink();
- m_t << " ";
-}
-
-void XmlDocVisitor::visitPre(DocCopy *c)
-{
- if (m_hide) return;
- m_t << "<copydoc link=\"" << c->link() << "\">";
-}
-
-void XmlDocVisitor::visitPost(DocCopy *)
-{
- if (m_hide) return;
- m_t << "</copydoc>" << endl;
-}
-
-void XmlDocVisitor::visitPre(DocText *)
-{
-}
-
-void XmlDocVisitor::visitPost(DocText *)
-{
-}
-
-void XmlDocVisitor::filter(const char *str)
-{
- m_t << convertToXML(str);
-}
-
-void XmlDocVisitor::startLink(const QString &ref,const QString &file,const QString &anchor)
-{
- m_t << "<ref refid=\"" << file;
- if (!anchor.isEmpty()) m_t << "_1" << anchor;
- m_t << "\" kindref=\"";
- if (!anchor.isEmpty()) m_t << "member"; else m_t << "compound";
- m_t << "\"";
- if (!ref.isEmpty()) m_t << " external=\"" << ref << "\"";
- m_t << ">";
-}
-
-void XmlDocVisitor::endLink()
-{
- m_t << "</ref>";
-}
-
-void XmlDocVisitor::pushEnabled()
-{
- m_enabled.push(new bool(m_hide));
-}
-
-void XmlDocVisitor::popEnabled()
-{
- bool *v=m_enabled.pop();
- ASSERT(v!=0);
- m_hide = *v;
- delete v;
-}
-
diff --git a/src/xmldocvisitor.h b/src/xmldocvisitor.h
deleted file mode 100644
index 60e0820..0000000
--- a/src/xmldocvisitor.h
+++ /dev/null
@@ -1,156 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 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 _XMLDOCVISITOR_H
-#define _XMLDOCVISITOR_H
-
-#include "docvisitor.h"
-#include <qstack.h>
-#include <qcstring.h>
-
-class QTextStream;
-class CodeOutputInterface;
-class QString;
-
-/*! @brief Concrete visitor implementation for XML output. */
-class XmlDocVisitor : public DocVisitor
-{
- public:
- XmlDocVisitor(QTextStream &t,CodeOutputInterface &ci);
-
- //--------------------------------------
- // visitor functions for leaf nodes
- //--------------------------------------
-
- void visit(DocWord *);
- void visit(DocLinkedWord *);
- void visit(DocWhiteSpace *);
- void visit(DocSymbol *);
- void visit(DocURL *);
- void visit(DocLineBreak *);
- void visit(DocHorRuler *);
- void visit(DocStyleChange *);
- void visit(DocVerbatim *);
- void visit(DocAnchor *);
- void visit(DocInclude *);
- void visit(DocIncOperator *);
- void visit(DocFormula *);
- void visit(DocIndexEntry *);
-
- //--------------------------------------
- // visitor functions for compound nodes
- //--------------------------------------
-
- void visitPre(DocAutoList *);
- void visitPost(DocAutoList *);
- void visitPre(DocAutoListItem *);
- void visitPost(DocAutoListItem *);
- void visitPre(DocPara *) ;
- void visitPost(DocPara *);
- void visitPre(DocRoot *);
- void visitPost(DocRoot *);
- void visitPre(DocSimpleSect *);
- void visitPost(DocSimpleSect *);
- void visitPre(DocTitle *);
- void visitPost(DocTitle *);
- void visitPre(DocSimpleList *);
- void visitPost(DocSimpleList *);
- void visitPre(DocSimpleListItem *);
- void visitPost(DocSimpleListItem *);
- void visitPre(DocSection *);
- void visitPost(DocSection *);
- void visitPre(DocHtmlList *);
- void visitPost(DocHtmlList *) ;
- void visitPre(DocHtmlListItem *);
- void visitPost(DocHtmlListItem *);
- //void visitPre(DocHtmlPre *);
- //void visitPost(DocHtmlPre *);
- void visitPre(DocHtmlDescList *);
- void visitPost(DocHtmlDescList *);
- void visitPre(DocHtmlDescTitle *);
- void visitPost(DocHtmlDescTitle *);
- void visitPre(DocHtmlDescData *);
- void visitPost(DocHtmlDescData *);
- void visitPre(DocHtmlTable *);
- void visitPost(DocHtmlTable *);
- void visitPre(DocHtmlRow *);
- void visitPost(DocHtmlRow *) ;
- void visitPre(DocHtmlCell *);
- void visitPost(DocHtmlCell *);
- void visitPre(DocHtmlCaption *);
- void visitPost(DocHtmlCaption *);
- void visitPre(DocInternal *);
- void visitPost(DocInternal *);
- void visitPre(DocHRef *);
- void visitPost(DocHRef *);
- void visitPre(DocHtmlHeader *);
- void visitPost(DocHtmlHeader *);
- void visitPre(DocImage *);
- void visitPost(DocImage *);
- void visitPre(DocDotFile *);
- void visitPost(DocDotFile *);
- void visitPre(DocLink *);
- void visitPost(DocLink *);
- void visitPre(DocRef *);
- void visitPost(DocRef *);
- void visitPre(DocSecRefItem *);
- void visitPost(DocSecRefItem *);
- void visitPre(DocSecRefList *);
- void visitPost(DocSecRefList *);
- //void visitPre(DocLanguage *);
- //void visitPost(DocLanguage *);
- void visitPre(DocParamSect *);
- void visitPost(DocParamSect *);
- void visitPre(DocParamList *);
- void visitPost(DocParamList *);
- void visitPre(DocXRefItem *);
- void visitPost(DocXRefItem *);
- void visitPre(DocInternalRef *);
- void visitPost(DocInternalRef *);
- void visitPre(DocCopy *);
- void visitPost(DocCopy *);
- void visitPre(DocText *);
- void visitPost(DocText *);
-
- private:
-
- //--------------------------------------
- // helper functions
- //--------------------------------------
-
- void filter(const char *str);
- void startLink(const QString &ref,const QString &file,
- const QString &anchor);
- void endLink();
-
- void pushEnabled();
- void popEnabled();
-
- //--------------------------------------
- // state variables
- //--------------------------------------
-
- QTextStream &m_t;
- CodeOutputInterface &m_ci;
- bool m_insidePre;
- bool m_hide;
- QStack<bool> m_enabled;
- QCString m_langExt;
-};
-
-#endif
diff --git a/src/xmlgen.cpp b/src/xmlgen.cpp
deleted file mode 100644
index 0126cc6..0000000
--- a/src/xmlgen.cpp
+++ /dev/null
@@ -1,1784 +0,0 @@
-/******************************************************************************
- *
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- * Documents produced by Doxygen are derivative works derived from the
- * input used in their production; they are not affected by this license.
- *
- */
-
-#include <stdlib.h>
-
-#include "qtbc.h"
-#include "xmlgen.h"
-#include "doxygen.h"
-#include "message.h"
-#include "config.h"
-#include "classlist.h"
-#include "util.h"
-#include "defargs.h"
-#include "outputgen.h"
-#include "dot.h"
-#include "pagedef.h"
-#include "filename.h"
-#include "version.h"
-#include "xmldocvisitor.h"
-#include "docparser.h"
-#include "language.h"
-#include "parserintf.h"
-
-#include <qdir.h>
-#include <qfile.h>
-#include <qtextstream.h>
-
-// no debug info
-#define XML_DB(x) do {} while(0)
-// debug to stdout
-//#define XML_DB(x) printf x
-// debug inside output
-//#define XML_DB(x) QCString __t;__t.sprintf x;m_t << __t
-
-//------------------
-
-static const char index_xsd[] =
-#include "index_xsd.h"
-;
-
-//------------------
-//
-static const char compound_xsd[] =
-#include "compound_xsd.h"
-;
-
-//------------------
-
-
-inline void writeXMLString(QTextStream &t,const char *s)
-{
- t << convertToXML(s);
-}
-
-inline void writeXMLCodeString(QTextStream &t,const char *s, int &col)
-{
- char c;
- while ((c=*s++))
- {
- switch(c)
- {
- case '\t':
- {
- int spacesToNextTabStop =
- Config_getInt("TAB_SIZE") - (col%Config_getInt("TAB_SIZE"));
- col+=spacesToNextTabStop;
- while (spacesToNextTabStop--) t << "<sp/>";
- break;
- }
- case ' ': t << "<sp/>"; col++; break;
- case '<': t << "&lt;"; col++; break;
- case '>': t << "&gt;"; col++; break;
- case '&': t << "&amp;"; col++; break;
- case '\'': t << "&apos;"; col++; break;
- case '"': t << "&quot;"; col++; break;
- default: t << c; col++; break;
- }
- }
-}
-
-
-static void writeXMLHeader(QTextStream &t)
-{
- t << "<?xml version='1.0' encoding='" << theTranslator->idLanguageCharset()
- << "' standalone='no'?>" << endl;;
- t << "<doxygen xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ";
- t << "xsi:noNamespaceSchemaLocation=\"compound.xsd\" ";
- t << "version=\"" << versionString << "\">" << endl;
-}
-
-static void writeCombineScript()
-{
- QCString outputDirectory = Config_getString("XML_OUTPUT");
- QCString fileName=outputDirectory+"/combine.xslt";
- QFile f(fileName);
- if (!f.open(IO_WriteOnly))
- {
- err("Cannot open file %s for writing!\n",fileName.data());
- return;
- }
- QTextStream t(&f);
- t.setEncoding(QTextStream::Latin1);
-
- t <<
- "<!-- XSLT script to combine the generated output into a single file. \n"
- " If you have xsltproc you could use:\n"
- " xsltproc combine.xslt index.xml >all.xml\n"
- "-->\n"
- "<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\" version=\"1.0\">\n"
- " <xsl:output method=\"xml\" version=\"1.0\" indent=\"yes\" standalone=\"yes\" />\n"
- " <xsl:template match=\"/\">\n"
- " <doxygen version=\"{doxygenindex/@version}\">\n"
- " <!-- Load all doxgen generated xml files -->\n"
- " <xsl:for-each select=\"doxygenindex/compound\">\n"
- " <xsl:copy-of select=\"document( concat( @refid, '.xml' ) )/doxygen/*\" />\n"
- " </xsl:for-each>\n"
- " </doxygen>\n"
- " </xsl:template>\n"
- "</xsl:stylesheet>\n";
-
-}
-
-void writeXMLLink(QTextStream &t,const char *extRef,const char *compoundId,
- const char *anchorId,const char *text)
-{
- t << "<ref refid=\"" << compoundId;
- if (anchorId) t << "_1" << anchorId;
- t << "\" kindref=\"";
- if (anchorId) t << "member"; else t << "compound";
- t << "\"";
- if (extRef) t << " external=\"" << extRef << "\"";
- t << ">";
- writeXMLString(t,text);
- t << "</ref>";
-}
-
-class TextGeneratorXMLImpl : public TextGeneratorIntf
-{
- public:
- TextGeneratorXMLImpl(QTextStream &t): m_t(t) {}
- void writeString(const char *s,bool /*keepSpaces*/) const
- {
- writeXMLString(m_t,s);
- }
- void writeBreak() const {}
- void writeLink(const char *extRef,const char *file,
- const char *anchor,const char *text
- ) const
- {
- writeXMLLink(m_t,extRef,file,anchor,text);
- }
- private:
- QTextStream &m_t;
-};
-
-template<class T> class ValStack
-{
- public:
- ValStack() : m_values(10), m_sp(0), m_size(10) {}
- virtual ~ValStack() {}
- ValStack(const ValStack<T> &s)
- {
- m_values=s.m_values.copy();
- m_sp=s.m_sp;
- m_size=s.m_size;
- }
- ValStack &operator=(const ValStack<T> &s)
- {
- m_values=s.m_values.copy();
- m_sp=s.m_sp;
- m_size=s.m_size;
- return *this;
- }
- void push(T v)
- {
- m_sp++;
- if (m_sp>=m_size)
- {
- m_size+=10;
- m_values.resize(m_size);
- }
- m_values[m_sp]=v;
- }
- T pop()
- {
- ASSERT(m_sp!=0);
- return m_values[m_sp--];
- }
- T& top()
- {
- ASSERT(m_sp!=0);
- return m_values[m_sp];
- }
- bool isEmpty()
- {
- return m_sp==0;
- }
- uint count() const
- {
- return m_sp;
- }
-
- private:
- QArray<T> m_values;
- int m_sp;
- int m_size;
-};
-
-
-class XMLCodeGenerator : public CodeOutputInterface
-{
- public:
-
- XMLCodeGenerator(QTextStream &t) : m_t(t), m_lineNumber(-1),
- m_insideCodeLine(FALSE), m_normalHLNeedStartTag(TRUE),
- m_insideSpecialHL(FALSE) {}
- virtual ~XMLCodeGenerator() { }
-
- void codify(const char *text)
- {
- XML_DB(("(codify \"%s\")\n",text));
- if (m_insideCodeLine && !m_insideSpecialHL && m_normalHLNeedStartTag)
- {
- m_t << "<highlight class=\"normal\">";
- m_normalHLNeedStartTag=FALSE;
- }
- writeXMLCodeString(m_t,text,col);
- }
- void writeCodeLink(const char *ref,const char *file,
- const char *anchor,const char *name)
- {
- XML_DB(("(writeCodeLink)\n"));
- if (m_insideCodeLine && !m_insideSpecialHL && m_normalHLNeedStartTag)
- {
- m_t << "<highlight class=\"normal\">";
- m_normalHLNeedStartTag=FALSE;
- }
- writeXMLLink(m_t,ref,file,anchor,name);
- col+=strlen(name);
- }
- void startCodeLine()
- {
- XML_DB(("(startCodeLine)\n"));
- m_t << "<codeline";
- if (m_lineNumber!=-1)
- {
- m_t << " lineno=\"" << m_lineNumber << "\"";
- if (!m_refId.isEmpty())
- {
- m_t << " refid=\"" << m_refId << "\"";
- if (m_isMemberRef)
- {
- m_t << " refkind=\"member\"";
- }
- else
- {
- m_t << " refkind=\"compound\"";
- }
- }
- if (!m_external.isEmpty())
- {
- m_t << " external=\"" << m_external << "\"";
- }
- }
- m_t << ">";
- m_insideCodeLine=TRUE;
- col=0;
- }
- void endCodeLine()
- {
- XML_DB(("(endCodeLine)\n"));
- if (!m_insideSpecialHL && !m_normalHLNeedStartTag)
- {
- m_t << "</highlight>";
- m_normalHLNeedStartTag=TRUE;
- }
- m_t << "</codeline>" << endl; // non DocBook
- m_lineNumber = -1;
- m_refId.resize(0);
- m_external.resize(0);
- m_insideCodeLine=FALSE;
- }
- void startCodeAnchor(const char *id)
- {
- XML_DB(("(startCodeAnchor)\n"));
- if (m_insideCodeLine && !m_insideSpecialHL && m_normalHLNeedStartTag)
- {
- m_t << "<highlight class=\"normal\">";
- m_normalHLNeedStartTag=FALSE;
- }
- m_t << "<anchor id=\"" << id << "\">";
- }
- void endCodeAnchor()
- {
- XML_DB(("(endCodeAnchor)\n"));
- m_t << "</anchor>";
- }
- void startFontClass(const char *colorClass)
- {
- XML_DB(("(startFontClass)\n"));
- if (m_insideCodeLine && !m_insideSpecialHL && !m_normalHLNeedStartTag)
- {
- m_t << "</highlight>";
- m_normalHLNeedStartTag=TRUE;
- }
- m_t << "<highlight class=\"" << colorClass << "\">"; // non DocBook
- m_insideSpecialHL=TRUE;
- }
- void endFontClass()
- {
- XML_DB(("(endFontClass)\n"));
- m_t << "</highlight>"; // non DocBook
- m_insideSpecialHL=FALSE;
- }
- void writeCodeAnchor(const char *)
- {
- XML_DB(("(writeCodeAnchor)\n"));
- }
- void writeLineNumber(const char *extRef,const char *compId,
- const char *anchorId,int l)
- {
- XML_DB(("(writeLineNumber)\n"));
- // we remember the information provided here to use it
- // at the <codeline> start tag.
- m_lineNumber = l;
- if (compId)
- {
- m_refId=compId;
- if (anchorId) m_refId+=(QCString)"_1"+anchorId;
- m_isMemberRef = anchorId!=0;
- if (extRef) m_external=extRef;
- }
- }
- void finish()
- {
- if (m_insideCodeLine) endCodeLine();
- }
-
- private:
- QTextStream &m_t;
- QCString m_refId;
- QCString m_external;
- int m_lineNumber;
- bool m_isMemberRef;
- int col;
-
- bool m_insideCodeLine;
- bool m_normalHLNeedStartTag;
- bool m_insideSpecialHL;
-};
-
-
-static void writeTemplateArgumentList(ArgumentList *al,
- QTextStream &t,
- Definition *scope,
- FileDef *fileScope,
- int indent)
-{
- QCString indentStr;
- indentStr.fill(' ',indent);
- if (al)
- {
- t << indentStr << "<templateparamlist>" << endl;
- ArgumentListIterator ali(*al);
- Argument *a;
- for (ali.toFirst();(a=ali.current());++ali)
- {
- t << indentStr << " <param>" << endl;
- if (!a->type.isEmpty())
- {
- t << indentStr << " <type>";
- linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a->type);
- t << "</type>" << endl;
- }
- if (!a->name.isEmpty())
- {
- t << indentStr << " <declname>" << a->name << "</declname>" << endl;
- t << indentStr << " <defname>" << a->name << "</defname>" << endl;
- }
- if (!a->defval.isEmpty())
- {
- t << indentStr << " <defval>";
- linkifyText(TextGeneratorXMLImpl(t),scope,fileScope,0,a->defval);
- t << "</defval>" << endl;
- }
- t << indentStr << " </param>" << endl;
- }
- t << indentStr << "</templateparamlist>" << endl;
- }
-}
-
-static void writeMemberTemplateLists(MemberDef *md,QTextStream &t)
-{
- if (md->templateArguments()) // function template prefix
- {
- writeTemplateArgumentList(md->templateArguments(),t,md->getClassDef(),md->getFileDef(),8);
- }
-}
-
-static void writeTemplateList(ClassDef *cd,QTextStream &t)
-{
- writeTemplateArgumentList(cd->templateArguments(),t,cd,0,4);
-}
-
-static void writeXMLDocBlock(QTextStream &t,
- const QCString &fileName,
- int lineNr,
- Definition *scope,
- MemberDef * md,
- const QCString &text)
-{
- 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+"\n",FALSE,FALSE);
- // create a code generator
- XMLCodeGenerator *xmlCodeGen = new XMLCodeGenerator(t);
- // create a parse tree visitor for XML
- XmlDocVisitor *visitor = new XmlDocVisitor(t,*xmlCodeGen);
- // visit all nodes
- root->accept(visitor);
- // clean up
- delete visitor;
- delete xmlCodeGen;
- delete root;
-
-}
-
-void writeXMLCodeBlock(QTextStream &t,FileDef *fd)
-{
- ParserInterface *pIntf=Doxygen::parserManager->getParser(fd->getDefFileExtension());
- pIntf->resetCodeParserState();
- XMLCodeGenerator *xmlGen = new XMLCodeGenerator(t);
- pIntf->parseCode(*xmlGen,
- 0,
- fileToString(fd->absFilePath(),Config_getBool("FILTER_SOURCE_FILES")),
- FALSE,
- 0,
- fd);
- xmlGen->finish();
- delete xmlGen;
-}
-
-static void writeMemberReference(QTextStream &t,Definition *def,MemberDef *rmd,const char *tagName)
-{
- QCString scope = rmd->getScopeString();
- QCString name = rmd->name();
- if (!scope.isEmpty() && scope!=def->name())
- {
- name.prepend(scope+"::");
- }
- t << " <" << tagName << " refid=\"";
- t << rmd->getOutputFileBase() << "_1" << rmd->anchor() << "\"";
- if (rmd->getStartBodyLine()!=-1 && rmd->getBodyDef())
- {
- t << " compoundref=\"" << rmd->getBodyDef()->getOutputFileBase() << "\"";
- t << " startline=\"" << rmd->getStartBodyLine() << "\"";
- if (rmd->getEndBodyLine()!=-1)
- {
- t << " endline=\"" << rmd->getEndBodyLine() << "\"";
- }
- }
- t << ">" << convertToXML(name) << "</" << tagName << ">" << endl;
-
-}
-
-static void stripQualifiers(QCString &typeStr)
-{
- bool done=FALSE;
- while (!done)
- {
- if (typeStr.stripPrefix("static "));
- else if (typeStr.stripPrefix("virtual "));
- else if (typeStr.stripPrefix("volatile "));
- else done=TRUE;
- }
-}
-
-static void generateXMLForMember(MemberDef *md,QTextStream &ti,QTextStream &t,Definition *def)
-{
-
- // + declaration/definition arg lists
- // + reimplements
- // + reimplementedBy
- // + exceptions
- // + const/volatile specifiers
- // - examples
- // + source definition
- // + source references
- // + source referenced by
- // - body code
- // + template arguments
- // (templateArguments(), definitionTemplateParameterLists())
- // - call graph
-
- // enum values are written as part of the enum
- if (md->memberType()==MemberDef::EnumValue) return;
-
- // group members are only visible in their group
- //if (def->definitionType()!=Definition::TypeGroup && md->getGroupDef()) return;
-
- QCString memType;
- bool isFunc=FALSE;
- switch (md->memberType())
- {
- case MemberDef::Define: memType="define"; break;
- case MemberDef::EnumValue: ASSERT(0); break;
- case MemberDef::Property: memType="property"; break;
- case MemberDef::Event: memType="event"; break;
- case MemberDef::Variable: memType="variable"; break;
- case MemberDef::Typedef: memType="typedef"; break;
- case MemberDef::Enumeration: memType="enum"; break;
- case MemberDef::Function: memType="function"; isFunc=TRUE; break;
- case MemberDef::Signal: memType="signal"; isFunc=TRUE; break;
- case MemberDef::Prototype: memType="prototype"; isFunc=TRUE; break;
- case MemberDef::Friend: memType="friend"; isFunc=TRUE; break;
- case MemberDef::DCOP: memType="dcop"; isFunc=TRUE; break;
- case MemberDef::Slot: memType="slot"; isFunc=TRUE; break;
- }
-
- ti << " <member refid=\"" << md->getOutputFileBase()
- << "_1" << md->anchor() << "\" kind=\"" << memType << "\"><name>"
- << convertToXML(md->name()) << "</name></member>" << endl;
-
- QCString scopeName;
- if (md->getClassDef())
- scopeName=md->getClassDef()->name();
- else if (md->getNamespaceDef())
- scopeName=md->getNamespaceDef()->name();
-
- t << " <memberdef kind=\"";
- //enum { define_t,variable_t,typedef_t,enum_t,function_t } xmlType = function_t;
- t << memType << "\" id=\"";
- if (md->getGroupDef() && def->definitionType()==Definition::TypeGroup)
- {
- t << md->getGroupDef()->getOutputFileBase();
- }
- else
- {
- t << md->getOutputFileBase();
- }
- t << "_1" // encoded `:' character (see util.cpp:convertNameToFile)
- << md->anchor();
- t << "\" prot=\"";
- switch(md->protection())
- {
- case Public: t << "public"; break;
- case Protected: t << "protected"; break;
- case Private: t << "private"; break;
- case Package: t << "package"; break;
- }
- t << "\"";
-
- t << " static=\"";
- if (md->isStatic()) t << "yes"; else t << "no";
- t << "\"";
-
- if (isFunc)
- {
- ArgumentList *al = md->argumentList();
- t << " const=\"";
- if (al && al->constSpecifier) t << "yes"; else t << "no";
- t << "\"";
-
- t << " explicit=\"";
- if (md->isExplicit()) t << "yes"; else t << "no";
- t << "\"";
-
- t << " inline=\"";
- if (md->isInline()) t << "yes"; else t << "no";
- t << "\"";
-
- t << " virt=\"";
- switch (md->virtualness())
- {
- case Normal: t << "non-virtual"; break;
- case Virtual: t << "virtual"; break;
- case Pure: t << "pure-virtual"; break;
- default: ASSERT(0);
- }
- t << "\"";
- }
-
- if (md->memberType() == MemberDef::Variable)
- {
- //ArgumentList *al = md->argumentList();
- //t << " volatile=\"";
- //if (al && al->volatileSpecifier) t << "yes"; else t << "no";
-
- t << " mutable=\"";
- if (md->isMutable()) t << "yes"; else t << "no";
- t << "\"";
- }
- else if (md->memberType() == MemberDef::Property)
- {
- t << " readable=\"";
- if (md->isReadable()) t << "yes"; else t << "no";
- t << "\"";
-
- t << "\" writable=\"";
- if (md->isWritable()) t << "yes"; else t << "no";
- t << "\"";
- }
-
-
- t << ">" << endl;
-
- if (md->memberType()!=MemberDef::Define &&
- md->memberType()!=MemberDef::Enumeration
- )
- {
- if (md->memberType()!=MemberDef::Typedef)
- {
- writeMemberTemplateLists(md,t);
- }
- QCString typeStr = md->typeString(); //replaceAnonymousScopes(md->typeString());
- stripQualifiers(typeStr);
- t << " <type>";
- linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md->name(),typeStr);
- t << "</type>" << endl;
- t << " <definition>" << convertToXML(md->definition()) << "</definition>" << endl;
- t << " <argsstring>" << convertToXML(md->argsString()) << "</argsstring>" << endl;
- }
-
- t << " <name>" << convertToXML(md->name()) << "</name>" << endl;
-
- if (md->memberType() == MemberDef::Property)
- {
- if (md->isReadable())
- t << " <read>" << convertToXML(md->getReadAccessor()) << "</read>" << endl;
- if (md->isWritable())
- t << " <write>" << convertToXML(md->getWriteAccessor()) << "</write>" << endl;
- }
-
- MemberDef *rmd = md->reimplements();
- if (rmd)
- {
- t << " <reimplements refid=\""
- << rmd->getOutputFileBase() << "_1" << rmd->anchor() << "\">"
- << convertToXML(rmd->name()) << "</reimplements>" << endl;
- }
- MemberList *rbml = md->reimplementedBy();
- if (rbml)
- {
- MemberListIterator mli(*rbml);
- for (mli.toFirst();(rmd=mli.current());++mli)
- {
- t << " <reimplementedby refid=\""
- << rmd->getOutputFileBase() << "_1" << rmd->anchor() << "\">"
- << convertToXML(rmd->name()) << "</reimplementedby>" << endl;
- }
- }
-
- if (isFunc) //function
- {
- ArgumentList *declAl = md->declArgumentList();
- ArgumentList *defAl = md->argumentList();
- if (declAl && declAl->count()>0)
- {
- ArgumentListIterator declAli(*declAl);
- ArgumentListIterator defAli(*defAl);
- Argument *a;
- for (declAli.toFirst();(a=declAli.current());++declAli)
- {
- Argument *defArg = defAli.current();
- t << " <param>" << endl;
- if (!a->attrib.isEmpty())
- {
- t << " <attributes>";
- writeXMLString(t,a->attrib);
- t << "</attributes>" << endl;
- }
- if (!a->type.isEmpty())
- {
- t << " <type>";
- linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md->name(),a->type);
- t << "</type>" << endl;
- }
- if (!a->name.isEmpty())
- {
- t << " <declname>";
- writeXMLString(t,a->name);
- t << "</declname>" << endl;
- }
- if (defArg && !defArg->name.isEmpty() && defArg->name!=a->name)
- {
- t << " <defname>";
- writeXMLString(t,defArg->name);
- t << "</defname>" << endl;
- }
- if (!a->array.isEmpty())
- {
- t << " <array>";
- writeXMLString(t,a->array);
- t << "</array>" << endl;
- }
- if (!a->defval.isEmpty())
- {
- t << " <defval>";
- linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md->name(),a->defval);
- t << "</defval>" << endl;
- }
- if (defArg && defArg->hasDocumentation())
- {
- t << " <briefdescription>";
- writeXMLDocBlock(t,md->getDefFileName(),md->getDefLine(),
- md->getOuterScope(),md,defArg->docs);
- t << "</briefdescription>" << endl;
- }
- t << " </param>" << endl;
- if (defArg) ++defAli;
- }
- }
- }
- else if (md->memberType()==MemberDef::Define &&
- md->argsString()) // define
- {
- if (md->argumentList()->count()==0) // special case for "foo()" to
- // disguish it from "foo".
- {
- t << " <param></param>" << endl;
- }
- else
- {
- ArgumentListIterator ali(*md->argumentList());
- Argument *a;
- for (ali.toFirst();(a=ali.current());++ali)
- {
- t << " <param><defname>" << a->type << "</defname></param>" << endl;
- }
- }
- }
- // avoid that extremely large tables are written to the output.
- // todo: it's better to adhere to MAX_INITIALIZER_LINES.
- if (!md->initializer().isEmpty() && md->initializer().length()<2000)
- {
- t << " <initializer>";
- linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md->name(),md->initializer());
- t << "</initializer>" << endl;
- }
-
- if (md->excpString())
- {
- t << " <exceptions>";
- linkifyText(TextGeneratorXMLImpl(t),def,md->getBodyDef(),md->name(),md->excpString());
- t << "</exceptions>" << endl;
- }
-
- if (md->memberType()==MemberDef::Enumeration) // enum
- {
- if (md->enumFieldList())
- {
- MemberListIterator emli(*md->enumFieldList());
- MemberDef *emd;
- for (emli.toFirst();(emd=emli.current());++emli)
- {
- ti << " <member refid=\"" << emd->getOutputFileBase()
- << "_1" << emd->anchor() << "\" kind=\"enumvalue\"><name>"
- << convertToXML(emd->name()) << "</name></member>" << endl;
-
- t << " <enumvalue id=\"" << emd->getOutputFileBase() << "_1"
- << emd->anchor() << "\" prot=\"";
- switch (emd->protection())
- {
- case Public: t << "public"; break;
- case Protected: t << "protected"; break;
- case Private: t << "private"; break;
- case Package: t << "package"; break;
- }
- t << "\">" << endl;
- t << " <name>";
- writeXMLString(t,emd->name());
- t << "</name>" << endl;
- if (!emd->initializer().isEmpty())
- {
- t << " <initializer>";
- writeXMLString(t,emd->initializer());
- t << "</initializer>" << endl;
- }
- t << " <briefdescription>" << endl;
- writeXMLDocBlock(t,emd->briefFile(),emd->briefLine(),emd->getOuterScope(),emd,emd->briefDescription());
- t << " </briefdescription>" << endl;
- t << " <detaileddescription>" << endl;
- writeXMLDocBlock(t,emd->docFile(),emd->docLine(),emd->getOuterScope(),emd,emd->documentation());
- t << " </detaileddescription>" << endl;
- t << " </enumvalue>" << endl;
- }
- }
- }
- t << " <briefdescription>" << endl;
- writeXMLDocBlock(t,md->briefFile(),md->briefLine(),md->getOuterScope(),md,md->briefDescription());
- t << " </briefdescription>" << endl;
- t << " <detaileddescription>" << endl;
- writeXMLDocBlock(t,md->docFile(),md->docLine(),md->getOuterScope(),md,md->documentation());
- t << " </detaileddescription>" << endl;
- t << " <inbodydescription>" << endl;
- writeXMLDocBlock(t,md->docFile(),md->inbodyLine(),md->getOuterScope(),md,md->inbodyDocumentation());
- t << " </inbodydescription>" << endl;
- if (md->getDefLine()!=-1)
- {
- t << " <location file=\""
- << md->getDefFileName() << "\" line=\""
- << md->getDefLine() << "\"";
- if (md->getStartBodyLine()!=-1)
- {
- FileDef *bodyDef = md->getBodyDef();
- if (bodyDef)
- {
- t << " bodyfile=\"" << bodyDef->absFilePath() << "\"";
- }
- t << " bodystart=\"" << md->getStartBodyLine() << "\" bodyend=\""
- << md->getEndBodyLine() << "\"";
- }
- t << "/>" << endl;
- }
-
- //printf("md->getReferencesMembers()=%p\n",md->getReferencesMembers());
- if (md->getReferencesMembers())
- {
- MemberSDict::Iterator mdi(*md->getReferencesMembers());
- MemberDef *rmd;
- for (mdi.toFirst();(rmd=mdi.current());++mdi)
- {
- writeMemberReference(t,def,rmd,"references");
- }
- }
- if (md->getReferencedByMembers())
- {
- MemberSDict::Iterator mdi(*md->getReferencedByMembers());
- MemberDef *rmd;
- for (mdi.toFirst();(rmd=mdi.current());++mdi)
- {
- writeMemberReference(t,def,rmd,"referencedby");
- }
- }
-
- t << " </memberdef>" << endl;
-}
-
-static void generateXMLSection(Definition *d,QTextStream &ti,QTextStream &t,
- MemberList *ml,const char *kind,const char *header=0,
- const char *documentation=0)
-{
- MemberListIterator mli(*ml);
- MemberDef *md;
- int count=0;
- for (mli.toFirst();(md=mli.current());++mli)
- {
- // namespace members are also inserted in the file scope, but
- // to prevent this duplication in the XML output, we filter those here.
- if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
- {
- count++;
- }
- }
- if (count==0) return; // empty list
-
- t << " <sectiondef kind=\"" << kind << "\">" << endl;
- if (header)
- {
- t << " <header>" << convertToXML(header) << "</header>" << endl;
- }
- if (documentation)
- {
- t << " <description>";
- writeXMLDocBlock(t,d->docFile(),d->docLine(),d,0,documentation);
- t << "</description>" << endl;
- }
- for (mli.toFirst();(md=mli.current());++mli)
- {
- // namespace members are also inserted in the file scope, but
- // to prevent this duplication in the XML output, we filter those here.
- if (d->definitionType()!=Definition::TypeFile || md->getNamespaceDef()==0)
- {
- generateXMLForMember(md,ti,t,d);
- }
- }
- t << " </sectiondef>" << endl;
-}
-
-static void writeListOfAllMembers(ClassDef *cd,QTextStream &t)
-{
- t << " <listofallmembers>" << endl;
- MemberNameInfoSDict::Iterator mnii(*cd->memberNameInfoSDict());
- MemberNameInfo *mni;
- for (mnii.toFirst();(mni=mnii.current());++mnii)
- {
- MemberNameInfoIterator mii(*mni);
- MemberInfo *mi;
- for (mii.toFirst();(mi=mii.current());++mii)
- {
- MemberDef *md=mi->memberDef;
- Protection prot = mi->prot;
- Specifier virt=md->virtualness();
- t << " <member refid=\"" << md->getOutputFileBase() << "_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;
- }
- }
- t << " </listofallmembers>" << endl;
-}
-
-static void writeInnerClasses(const ClassSDict *cl,QTextStream &t)
-{
- if (cl)
- {
- ClassSDict::Iterator cli(*cl);
- ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
- {
- if (cd->name().find('@')==-1) // skip anonymous scopes
- {
- t << " <innerclass refid=\"" << cd->getOutputFileBase()
- << "\">" << convertToXML(cd->name()) << "</innerclass>" << endl;
- }
- }
- }
-}
-
-static void writeInnerNamespaces(const NamespaceSDict *nl,QTextStream &t)
-{
- if (nl)
- {
- NamespaceSDict::Iterator nli(*nl);
- NamespaceDef *nd;
- for (nli.toFirst();(nd=nli.current());++nli)
- {
- if (nd->name().find('@')==-1) // skip anonymouse scopes
- {
- t << " <innernamespace refid=\"" << nd->getOutputFileBase()
- << "\">" << convertToXML(nd->name()) << "</innernamespace>" << endl;
- }
- }
- }
-}
-
-static void writeInnerFiles(const FileList *fl,QTextStream &t)
-{
- if (fl)
- {
- QListIterator<FileDef> fli(*fl);
- FileDef *fd;
- for (fli.toFirst();(fd=fli.current());++fli)
- {
- t << " <innerfile refid=\"" << fd->getOutputFileBase()
- << "\">" << convertToXML(fd->name()) << "</innerfile>" << endl;
- }
- }
-}
-
-static void writeInnerPages(const PageSDict *pl,QTextStream &t)
-{
- if (pl)
- {
- PageSDict::Iterator pli(*pl);
- PageDef *pd;
- for (pli.toFirst();(pd=pli.current());++pli)
- {
- t << " <innerpage refid=\"" << pd->getOutputFileBase();
- if (pd->getGroupDef())
- {
- t << "_" << pd->name();
- }
- t << "\">" << convertToXML(pd->title()) << "</innerpage>" << endl;
- }
- }
-}
-
-static void writeInnerGroups(const GroupList *gl,QTextStream &t)
-{
- if (gl)
- {
- GroupListIterator gli(*gl);
- GroupDef *sgd;
- for (gli.toFirst();(sgd=gli.current());++gli)
- {
- t << " <innergroup refid=\"" << sgd->getOutputFileBase()
- << "\">" << convertToXML(sgd->groupTitle())
- << "</innergroup>" << endl;
- }
- }
-}
-
-static void writeInnerDirs(const DirList *dl,QTextStream &t)
-{
- if (dl)
- {
- QListIterator<DirDef> subdirs(*dl);
- DirDef *subdir;
- for (subdirs.toFirst();(subdir=subdirs.current());++subdirs)
- {
- t << " <innerdir refid=\"" << subdir->getOutputFileBase()
- << "\">" << convertToXML(subdir->displayName()) << "</innerdir>" << endl;
- }
- }
-}
-
-
-static void generateXMLForClass(ClassDef *cd,QTextStream &ti)
-{
- // + brief description
- // + detailed description
- // + template argument list(s)
- // - include file
- // + member groups
- // + inheritance diagram
- // + list of direct super classes
- // + list of direct sub classes
- // + list of inner classes
- // + collaboration diagram
- // + list of all members
- // + user defined member sections
- // + standard member sections
- // + detailed member documentation
- // - examples using the class
-
- if (cd->isReference()) return; // skip external references.
- if (cd->name().find('@')!=-1) return; // skip anonymous compounds.
- if (cd->templateMaster()!=0) return; // skip generated template instances.
-
- ti << " <compound refid=\"" << cd->getOutputFileBase()
- << "\" kind=\"" << cd->compoundTypeString()
- << "\"><name>" << convertToXML(cd->name()) << "</name>" << endl;
-
- QCString outputDirectory = Config_getString("XML_OUTPUT");
- QCString fileName=outputDirectory+"/"+cd->getOutputFileBase()+".xml";
- QFile f(fileName);
- if (!f.open(IO_WriteOnly))
- {
- err("Cannot open file %s for writing!\n",fileName.data());
- return;
- }
- QTextStream t(&f);
- t.setEncoding(QTextStream::Latin1);
-
- writeXMLHeader(t);
- t << " <compounddef id=\""
- << cd->getOutputFileBase() << "\" kind=\""
- << cd->compoundTypeString() << "\" 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 << "\">" << endl;
- t << " <compoundname>";
- writeXMLString(t,cd->name());
- t << "</compoundname>" << endl;
- if (cd->baseClasses()->count()>0)
- {
- BaseClassListIterator bcli(*cd->baseClasses());
- BaseClassDef *bcd;
- for (bcli.toFirst();(bcd=bcli.current());++bcli)
- {
- t << " <basecompoundref ";
- if (bcd->classDef->isLinkable())
- {
- t << "refid=\"" << bcd->classDef->getOutputFileBase() << "\" ";
- }
- 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())
- {
- convertToXML(
- insertTemplateSpecifierInScope(
- bcd->classDef->displayName(),bcd->templSpecifiers)
- );
- }
- else
- {
- convertToXML(bcd->classDef->displayName());
- }
- t << "</basecompoundref>" << endl;
- }
- }
- if (cd->subClasses()->count()>0)
- {
- BaseClassListIterator bcli(*cd->subClasses());
- BaseClassDef *bcd;
- for (bcli.toFirst();(bcd=bcli.current());++bcli)
- {
- t << " <derivedcompoundref refid=\""
- << bcd->classDef->getOutputFileBase()
- << "\" 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;
- }
- }
-
- IncludeInfo *ii=cd->includeInfo();
- if (ii)
- {
- QCString nm = ii->includeName;
- if (nm.isEmpty() && ii->fileDef) nm = ii->fileDef->docName();
- if (!nm.isEmpty())
- {
- t << " <includes";
- if (ii->fileDef && !ii->fileDef->isReference()) // TODO: support external references
- {
- t << " refid=\"" << ii->fileDef->getOutputFileBase() << "\"";
- }
- t << " local=\"" << (ii->local ? "yes" : "no") << "\">";
- t << nm;
- t << "</includes>" << endl;
- }
- }
-
- writeInnerClasses(cd->getInnerClasses(),t);
-
- writeTemplateList(cd,t);
- MemberGroupSDict::Iterator mgli(*cd->memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- generateXMLSection(cd,ti,t,mg->members(),"user-defined",mg->header(),
- mg->documentation());
- }
-
- generateXMLSection(cd,ti,t,&cd->pubTypes,"public-type");
- generateXMLSection(cd,ti,t,&cd->pubMethods,"public-func");
- generateXMLSection(cd,ti,t,&cd->pubAttribs,"public-attrib");
- generateXMLSection(cd,ti,t,&cd->pubSlots,"public-slot");
- generateXMLSection(cd,ti,t,&cd->signals,"signal");
- generateXMLSection(cd,ti,t,&cd->dcopMethods,"dcop-func");
- generateXMLSection(cd,ti,t,&cd->properties,"property");
- generateXMLSection(cd,ti,t,&cd->events,"event");
- generateXMLSection(cd,ti,t,&cd->pubStaticMethods,"public-static-func");
- generateXMLSection(cd,ti,t,&cd->pubStaticAttribs,"public-static-attrib");
- generateXMLSection(cd,ti,t,&cd->proTypes,"protected-type");
- generateXMLSection(cd,ti,t,&cd->proMethods,"protected-func");
- generateXMLSection(cd,ti,t,&cd->proAttribs,"protected-attrib");
- generateXMLSection(cd,ti,t,&cd->proSlots,"protected-slot");
- generateXMLSection(cd,ti,t,&cd->proStaticMethods,"protected-static-func");
- generateXMLSection(cd,ti,t,&cd->proStaticAttribs,"protected-static-attrib");
- generateXMLSection(cd,ti,t,&cd->pacTypes,"package-type");
- generateXMLSection(cd,ti,t,&cd->pacMethods,"package-func");
- generateXMLSection(cd,ti,t,&cd->pacAttribs,"package-attrib");
- generateXMLSection(cd,ti,t,&cd->pacStaticMethods,"package-static-func");
- generateXMLSection(cd,ti,t,&cd->pacStaticAttribs,"package-static-attrib");
- generateXMLSection(cd,ti,t,&cd->priTypes,"private-type");
- generateXMLSection(cd,ti,t,&cd->priMethods,"private-func");
- generateXMLSection(cd,ti,t,&cd->priAttribs,"private-attrib");
- generateXMLSection(cd,ti,t,&cd->priSlots,"private-slot");
- generateXMLSection(cd,ti,t,&cd->priStaticMethods,"private-static-func");
- generateXMLSection(cd,ti,t,&cd->priStaticAttribs,"private-static-attrib");
- generateXMLSection(cd,ti,t,&cd->friends,"friend");
- generateXMLSection(cd,ti,t,&cd->related,"related");
-
- t << " <briefdescription>" << endl;
- writeXMLDocBlock(t,cd->briefFile(),cd->briefLine(),cd,0,cd->briefDescription());
- t << " </briefdescription>" << endl;
- t << " <detaileddescription>" << endl;
- writeXMLDocBlock(t,cd->docFile(),cd->docLine(),cd,0,cd->documentation());
- t << " </detaileddescription>" << endl;
- DotClassGraph inheritanceGraph(cd,DotNode::Inheritance,
- Config_getInt("MAX_DOT_GRAPH_DEPTH"));
- if (!inheritanceGraph.isTrivial())
- {
- t << " <inheritancegraph>" << endl;
- inheritanceGraph.writeXML(t);
- t << " </inheritancegraph>" << endl;
- }
- DotClassGraph collaborationGraph(cd,DotNode::Collaboration,
- Config_getInt("MAX_DOT_GRAPH_DEPTH"));
- if (!collaborationGraph.isTrivial())
- {
- t << " <collaborationgraph>" << endl;
- collaborationGraph.writeXML(t);
- t << " </collaborationgraph>" << endl;
- }
- t << " <location file=\""
- << cd->getDefFileName() << "\" line=\""
- << cd->getDefLine() << "\"";
- if (cd->getStartBodyLine()!=-1)
- {
- FileDef *bodyDef = cd->getBodyDef();
- if (bodyDef)
- {
- t << " bodyfile=\"" << bodyDef->absFilePath() << "\"";
- }
- t << " bodystart=\"" << cd->getStartBodyLine() << "\" bodyend=\""
- << cd->getEndBodyLine() << "\"";
- }
- t << "/>" << endl;
- writeListOfAllMembers(cd,t);
- t << " </compounddef>" << endl;
- t << "</doxygen>" << endl;
-
- ti << " </compound>" << endl;
-}
-
-static void generateXMLForNamespace(NamespaceDef *nd,QTextStream &ti)
-{
- // + contained class definitions
- // + contained namespace definitions
- // + member groups
- // + normal members
- // + brief desc
- // + detailed desc
- // + location
- // - files containing (parts of) the namespace definition
-
- if (nd->isReference()) return; // skip external references
-
- 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);
- if (!f.open(IO_WriteOnly))
- {
- err("Cannot open file %s for writing!\n",fileName.data());
- return;
- }
- QTextStream t(&f);
- t.setEncoding(QTextStream::Latin1);
-
- writeXMLHeader(t);
- t << " <compounddef id=\""
- << nd->getOutputFileBase() << "\" kind=\"namespace\">" << endl;
- t << " <compoundname>";
- writeXMLString(t,nd->name());
- t << "</compoundname>" << endl;
-
- writeInnerClasses(nd->classSDict,t);
- writeInnerNamespaces(nd->namespaceSDict,t);
-
- MemberGroupSDict::Iterator mgli(*nd->memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- generateXMLSection(nd,ti,t,mg->members(),"user-defined",mg->header(),
- mg->documentation());
- }
-
- generateXMLSection(nd,ti,t,&nd->decDefineMembers,"define");
- generateXMLSection(nd,ti,t,&nd->decProtoMembers,"prototype");
- generateXMLSection(nd,ti,t,&nd->decTypedefMembers,"typedef");
- generateXMLSection(nd,ti,t,&nd->decEnumMembers,"enum");
- generateXMLSection(nd,ti,t,&nd->decFuncMembers,"func");
- generateXMLSection(nd,ti,t,&nd->decVarMembers,"var");
-
- t << " <briefdescription>" << endl;
- writeXMLDocBlock(t,nd->briefFile(),nd->briefLine(),nd,0,nd->briefDescription());
- t << " </briefdescription>" << endl;
- t << " <detaileddescription>" << endl;
- writeXMLDocBlock(t,nd->docFile(),nd->docLine(),nd,0,nd->documentation());
- t << " </detaileddescription>" << endl;
- t << " <location file=\""
- << nd->getDefFileName() << "\" line=\""
- << nd->getDefLine() << "\"/>" << endl;
- t << " </compounddef>" << endl;
- t << "</doxygen>" << endl;
-
- ti << " </compound>" << endl;
-}
-
-static void generateXMLForFile(FileDef *fd,QTextStream &ti)
-{
- // + includes files
- // + includedby files
- // + include graph
- // + included by graph
- // + contained class definitions
- // + contained namespace definitions
- // + member groups
- // + normal members
- // + brief desc
- // + detailed desc
- // + source code
- // + location
- // - number of lines
-
- if (fd->isReference()) return; // skip external references
-
- 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);
- if (!f.open(IO_WriteOnly))
- {
- err("Cannot open file %s for writing!\n",fileName.data());
- return;
- }
- QTextStream t(&f);
- t.setEncoding(QTextStream::Latin1);
-
- writeXMLHeader(t);
- t << " <compounddef id=\""
- << fd->getOutputFileBase() << "\" kind=\"file\">" << endl;
- t << " <compoundname>";
- writeXMLString(t,fd->name());
- t << "</compoundname>" << endl;
-
- QListIterator<IncludeInfo> ili1(*fd->includeFileList());
- IncludeInfo *inc;
- for (ili1.toFirst();(inc=ili1.current());++ili1)
- {
- t << " <includes";
- if (inc->fileDef && !inc->fileDef->isReference()) // TODO: support external references
- {
- t << " refid=\"" << inc->fileDef->getOutputFileBase() << "\"";
- }
- t << " local=\"" << (inc->local ? "yes" : "no") << "\">";
- t << inc->includeName;
- t << "</includes>" << endl;
- }
-
- QListIterator<IncludeInfo> ili2(*fd->includedByFileList());
- for (ili2.toFirst();(inc=ili2.current());++ili2)
- {
- t << " <includedby";
- if (inc->fileDef && !inc->fileDef->isReference()) // TODO: support external references
- {
- t << " refid=\"" << inc->fileDef->getOutputFileBase() << "\"";
- }
- t << " local=\"" << (inc->local ? "yes" : "no") << "\">";
- t << inc->includeName;
- t << "</includedby>" << endl;
- }
-
- DotInclDepGraph incDepGraph(fd,Config_getInt("MAX_DOT_GRAPH_DEPTH"),FALSE);
- if (!incDepGraph.isTrivial())
- {
- t << " <incdepgraph>" << endl;
- incDepGraph.writeXML(t);
- t << " </incdepgraph>" << endl;
- }
-
- DotInclDepGraph invIncDepGraph(fd,Config_getInt("MAX_DOT_GRAPH_DEPTH"),TRUE);
- if (!invIncDepGraph.isTrivial())
- {
- t << " <invincdepgraph>" << endl;
- invIncDepGraph.writeXML(t);
- t << " </invincdepgraph>" << endl;
- }
-
- writeInnerClasses(fd->classSDict,t);
- writeInnerNamespaces(fd->namespaceSDict,t);
-
- MemberGroupSDict::Iterator mgli(*fd->memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- generateXMLSection(fd,ti,t,mg->members(),"user-defined",mg->header(),
- mg->documentation());
- }
-
- generateXMLSection(fd,ti,t,&fd->decDefineMembers,"define");
- generateXMLSection(fd,ti,t,&fd->decProtoMembers,"prototype");
- generateXMLSection(fd,ti,t,&fd->decTypedefMembers,"typedef");
- generateXMLSection(fd,ti,t,&fd->decEnumMembers,"enum");
- generateXMLSection(fd,ti,t,&fd->decFuncMembers,"func");
- generateXMLSection(fd,ti,t,&fd->decVarMembers,"var");
-
- t << " <briefdescription>" << endl;
- writeXMLDocBlock(t,fd->briefFile(),fd->briefLine(),fd,0,fd->briefDescription());
- t << " </briefdescription>" << endl;
- t << " <detaileddescription>" << endl;
- writeXMLDocBlock(t,fd->docFile(),fd->docLine(),fd,0,fd->documentation());
- t << " </detaileddescription>" << endl;
- if (Config_getBool("XML_PROGRAMLISTING"))
- {
- t << " <programlisting>" << endl;
- writeXMLCodeBlock(t,fd);
- t << " </programlisting>" << endl;
- }
- t << " <location file=\"" << fd->getDefFileName() << "\"/>" << endl;
- t << " </compounddef>" << endl;
- t << "</doxygen>" << endl;
-
- ti << " </compound>" << endl;
-}
-
-static void generateXMLForGroup(GroupDef *gd,QTextStream &ti)
-{
- // + members
- // + member groups
- // + files
- // + classes
- // + namespaces
- // - packages
- // + pages
- // + child groups
- // - examples
- // + brief description
- // + detailed description
-
- if (gd->isReference()) return; // skip external references
-
- 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);
- if (!f.open(IO_WriteOnly))
- {
- err("Cannot open file %s for writing!\n",fileName.data());
- return;
- }
-
- QTextStream t(&f);
- t.setEncoding(QTextStream::Latin1);
- writeXMLHeader(t);
- t << " <compounddef id=\""
- << gd->getOutputFileBase() << "\" kind=\"group\">" << endl;
- t << " <compoundname>" << convertToXML(gd->name()) << "</compoundname>" << endl;
- t << " <title>" << convertToXML(gd->groupTitle()) << "</title>" << endl;
-
- writeInnerFiles(gd->getFiles(),t);
- writeInnerClasses(gd->getClasses(),t);
- writeInnerNamespaces(gd->getNamespaces(),t);
- writeInnerPages(gd->getPages(),t);
- writeInnerGroups(gd->getSubGroups(),t);
-
- MemberGroupSDict::Iterator mgli(*gd->memberGroupSDict);
- MemberGroup *mg;
- for (;(mg=mgli.current());++mgli)
- {
- generateXMLSection(gd,ti,t,mg->members(),"user-defined",mg->header(),
- mg->documentation());
- }
-
- generateXMLSection(gd,ti,t,&gd->decDefineMembers,"define");
- generateXMLSection(gd,ti,t,&gd->decProtoMembers,"prototype");
- generateXMLSection(gd,ti,t,&gd->decTypedefMembers,"typedef");
- generateXMLSection(gd,ti,t,&gd->decEnumMembers,"enum");
- generateXMLSection(gd,ti,t,&gd->decFuncMembers,"func");
- generateXMLSection(gd,ti,t,&gd->decVarMembers,"var");
-
- t << " <briefdescription>" << endl;
- writeXMLDocBlock(t,gd->briefFile(),gd->briefLine(),gd,0,gd->briefDescription());
- t << " </briefdescription>" << endl;
- t << " <detaileddescription>" << endl;
- writeXMLDocBlock(t,gd->docFile(),gd->docLine(),gd,0,gd->documentation());
- t << " </detaileddescription>" << endl;
- t << " </compounddef>" << endl;
- t << "</doxygen>" << endl;
-
- ti << " </compound>" << endl;
-}
-
-static void generateXMLForDir(DirDef *dd,QTextStream &ti)
-{
- if (dd->isReference()) return; // skip external references
- ti << " <compound refid=\"" << dd->getOutputFileBase()
- << "\" kind=\"dir\"><name>" << convertToXML(dd->displayName())
- << "</name>" << endl;
-
- QCString outputDirectory = Config_getString("XML_OUTPUT");
- QCString fileName=outputDirectory+"/"+dd->getOutputFileBase()+".xml";
- QFile f(fileName);
- if (!f.open(IO_WriteOnly))
- {
- err("Cannot open file %s for writing!\n",fileName.data());
- return;
- }
-
- QTextStream t(&f);
- t.setEncoding(QTextStream::Latin1);
- writeXMLHeader(t);
- t << " <compounddef id=\""
- << dd->getOutputFileBase() << "\" kind=\"dir\">" << endl;
- t << " <compoundname>" << convertToXML(dd->displayName()) << "</compoundname>" << endl;
-
- writeInnerDirs(&dd->subDirs(),t);
- writeInnerFiles(dd->getFiles(),t);
-
- t << " <briefdescription>" << endl;
- writeXMLDocBlock(t,dd->briefFile(),dd->briefLine(),dd,0,dd->briefDescription());
- t << " </briefdescription>" << endl;
- t << " <detaileddescription>" << endl;
- writeXMLDocBlock(t,dd->docFile(),dd->docLine(),dd,0,dd->documentation());
- t << " </detaileddescription>" << endl;
- t << " <location file=\"" << dd->name() << "\"/>" << endl;
- t << " </compounddef>" << endl;
- t << "</doxygen>" << endl;
-
- ti << " </compound>" << endl;
-}
-
-static void generateXMLForPage(PageDef *pd,QTextStream &ti,bool isExample)
-{
- // + name
- // + title
- // + documentation
-
- 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())
- << "</name>" << endl;
-
- QCString outputDirectory = Config_getString("XML_OUTPUT");
- QCString fileName=outputDirectory+"/"+pageName+".xml";
- QFile f(fileName);
- if (!f.open(IO_WriteOnly))
- {
- err("Cannot open file %s for writing!\n",fileName.data());
- return;
- }
-
- QTextStream t(&f);
- t.setEncoding(QTextStream::Latin1);
- writeXMLHeader(t);
- t << " <compounddef id=\"" << pageName;
- t << "\" kind=\"" << kindName << "\">" << endl;
- t << " <compoundname>" << convertToXML(pd->name())
- << "</compoundname>" << endl;
-
- SectionInfo *si = Doxygen::sectionDict.find(pd->name());
- if (si)
- {
- t << " <title>" << convertToXML(si->title) << "</title>" << endl;
- }
- t << " <detaileddescription>" << endl;
- if (isExample)
- {
- writeXMLDocBlock(t,pd->docFile(),pd->docLine(),pd,0,
- pd->documentation()+"\n\\include "+pd->name());
- }
- else
- {
- writeXMLDocBlock(t,pd->docFile(),pd->docLine(),pd,0,
- pd->documentation());
- }
- t << " </detaileddescription>" << endl;
-
- t << " </compounddef>" << endl;
- t << "</doxygen>" << endl;
-
- ti << " </compound>" << endl;
-}
-
-void generateXML()
-{
-
- // + classes
- // + namespaces
- // + files
- // + groups
- // + related pages
- // - examples
-
- QCString outputDirectory = Config_getString("XML_OUTPUT");
- if (outputDirectory.isEmpty())
- {
- outputDirectory=QDir::currentDirPath();
- }
- else
- {
- QDir dir(outputDirectory);
- if (!dir.exists())
- {
- dir.setPath(QDir::currentDirPath());
- if (!dir.mkdir(outputDirectory))
- {
- err("Error: tag XML_OUTPUT: Output directory `%s' does not "
- "exist and cannot be created\n",outputDirectory.data());
- exit(1);
- }
- else if (!Config_getBool("QUIET"))
- {
- err("Notice: Output directory `%s' does not exist. "
- "I have created it for you.\n", outputDirectory.data());
- }
- dir.cd(outputDirectory);
- }
- outputDirectory=dir.absPath();
- }
-
- QDir dir(outputDirectory);
- if (!dir.exists())
- {
- dir.setPath(QDir::currentDirPath());
- if (!dir.mkdir(outputDirectory))
- {
- err("Cannot create directory %s\n",outputDirectory.data());
- return;
- }
- }
- QDir xmlDir(outputDirectory);
- createSubDirs(xmlDir);
- QCString fileName=outputDirectory+"/index.xsd";
- QFile f(fileName);
- if (!f.open(IO_WriteOnly))
- {
- err("Cannot open file %s for writing!\n",fileName.data());
- return;
- }
- f.writeBlock(index_xsd,strlen(index_xsd));
- f.close();
-
- fileName=outputDirectory+"/compound.xsd";
- f.setName(fileName);
- if (!f.open(IO_WriteOnly))
- {
- err("Cannot open file %s for writing!\n",fileName.data());
- return;
- }
- f.writeBlock(compound_xsd,strlen(compound_xsd));
- f.close();
-
- fileName=outputDirectory+"/index.xml";
- f.setName(fileName);
- if (!f.open(IO_WriteOnly))
- {
- err("Cannot open file %s for writing!\n",fileName.data());
- return;
- }
- QTextStream t(&f);
- t.setEncoding(QTextStream::Latin1);
-
- // write index header
- t << "<?xml version='1.0' encoding='" << theTranslator->idLanguageCharset()
- << "' standalone='no'?>" << endl;;
- t << "<doxygenindex xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" ";
- t << "xsi:noNamespaceSchemaLocation=\"index.xsd\" ";
- t << "version=\"" << versionString << "\">" << endl;
-
- {
- ClassSDict::Iterator cli(Doxygen::classSDict);
- ClassDef *cd;
- for (cli.toFirst();(cd=cli.current());++cli)
- {
- msg("Generating XML output for class %s\n",cd->name().data());
- generateXMLForClass(cd,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);
- NamespaceDef *nd;
- for (nli.toFirst();(nd=nli.current());++nli)
- {
- msg("Generating XML output for namespace %s\n",nd->name().data());
- generateXMLForNamespace(nd,t);
- }
- FileNameListIterator fnli(Doxygen::inputNameList);
- FileName *fn;
- for (;(fn=fnli.current());++fnli)
- {
- FileNameIterator fni(*fn);
- FileDef *fd;
- for (;(fd=fni.current());++fni)
- {
- msg("Generating XML output for file %s\n",fd->name().data());
- generateXMLForFile(fd,t);
- }
- }
- GroupSDict::Iterator gli(Doxygen::groupSDict);
- GroupDef *gd;
- for (;(gd=gli.current());++gli)
- {
- msg("Generating XML output for group %s\n",gd->name().data());
- generateXMLForGroup(gd,t);
- }
- {
- 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);
- }
- }
- {
- 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);
- }
- }
- {
- 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);
- }
- }
- if (Doxygen::mainPage)
- {
- msg("Generating XML output for the main page\n");
- generateXMLForPage(Doxygen::mainPage,t,FALSE);
- }
-
- //t << " </compoundlist>" << endl;
- t << "</doxygenindex>" << endl;
-
- writeCombineScript();
-}
-
-
diff --git a/src/xmlgen.h b/src/xmlgen.h
deleted file mode 100644
index 81b402d..0000000
--- a/src/xmlgen.h
+++ /dev/null
@@ -1,20 +0,0 @@
-/******************************************************************************
- *
- *
- *
- * Copyright (C) 1997-2005 by Dimitri van Heesch.
- *
- * Permission to use, copy, modify, and distribute this software and its
- * documentation under the terms of the GNU General Public License is hereby
- * granted. No representations are made about the suitability of this software
- * for any purpose. It is provided "as is" without express or implied warranty.
- * See the GNU General Public License for more details.
- *
- */
-
-#ifndef XMLGEN_H
-#define XMLGEN_H
-
-void generateXML();
-
-#endif
diff --git a/tmake/CHANGES b/tmake/CHANGES
deleted file mode 100644
index ce686e9..0000000
--- a/tmake/CHANGES
+++ /dev/null
@@ -1,49 +0,0 @@
- Changes from version 1.2 to 1.3
-
-* Improved Qt 2.0 support.
-
-* INCLUDEPATH can have directories containing whitespace (use semicolon)
- as separator.
-
-* Many, many code fixes and doc improvements.
-
-
- Changes from version 1.1 to 1.2
-
-* tmake is no longer restricted to C++ only. You can now use both C++
- and C files in your project. Thanks to Ulrich Ring for valuable feed-
- back and comments.
-
-* Added support for building DLL libraries under Windows.
- NOTE: Qt 1.42 and later now uses qtmain.lib in addition to qt.lib
- when your application uses the Qt DLL. Add "DEFINES = QT_DLL" to
- your project file to use the Qt DLL.
-
-* New dist target added in the app and lib templates.
- Run "make dist" to pack all files in your project using tar/gzip or zip.
- Thanks to Kalle Dalheimer for this patch.
-
-* Fixed bad command line interpretation bug in tmake.exe and progen.exe.
-
-* Added support for Borland C++ builder 3.
-
-* Initial support for QNX/g++ and the IBM Visual Age compiler on Win32.
- Thanks to Igor Kovalenko and Joost Kraaijeveld.
-
-* Many fixes in tmake.conf for several Unix configurations.
-
-
- Changes from version 1.0 to 1.1
-
-* Provides tmake.exe and progen.exe for Windows users without perl.
-
-* Added many new Unix templates.
-
-* Added subdirs.t templates.
-
-* Added system-dependent project settings
- (e.g. solaris-cc:TMAKE_CFLAGS = -pts)
-
-* Many bug fixes and improvements for existing templates.
-
-* Improved documentation.
diff --git a/tmake/LICENSE b/tmake/LICENSE
deleted file mode 100644
index 7262d5a..0000000
--- a/tmake/LICENSE
+++ /dev/null
@@ -1,9 +0,0 @@
- License Statement for tmake
-
-Copyright (C) 1996-1999 by Troll Tech AS. All rights reserved.
-
-Permission to use, copy, modify, and distribute this software and its
-documentation for any purpose and without fee is hereby granted, provided
-that the this copyright notice appears in all copies.
-No representations are made about the suitability of this software for any
-purpose. It is provided "as is" without express or implied warranty.
diff --git a/tmake/README b/tmake/README
deleted file mode 100644
index b049d32..0000000
--- a/tmake/README
+++ /dev/null
@@ -1,10 +0,0 @@
- tmake version 1.3
-
-tmake is an easy-to-use tool for creating and maintaining makefiles across
-many platforms and compilers. For information about installing and using
-tmake, see:
-
- doc/tmake.html -- User's Guide
- doc/tmake_ref.html -- Reference Manual
-
-Download the latest version from: <ftp://ftp.troll.no/freebies/tmake>
diff --git a/tmake/bin/progen b/tmake/bin/progen
deleted file mode 100755
index 5be6411..0000000
--- a/tmake/bin/progen
+++ /dev/null
@@ -1,249 +0,0 @@
-#!/usr/bin/perl
-############################################################################
-#
-#
-# Generates a tmake project file.
-#
-# Copyright (C) 1996-1998 by Troll Tech AS. All rights reserved.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose and without fee is hereby granted, provided
-# that this copyright notice appears in all copies.
-# No representations are made about the suitability of this software for any
-# purpose. It is provided "as is" without express or implied warranty.
-#
-############################################################################
-
-# Default project settings
-$project{"TEMPLATE"} = "app";
-$project{"CONFIG"} = "qt warn_on release";
-
-@project_extra = ();
-
-while ( @ARGV ) { # parse command line args
- $_ = shift @ARGV;
- if ( s/^-// ) {
- if ( /^o(.*)/ ) {
- $outfile = ($1 eq "") ? shift @ARGV : $1;
- ($outfile eq "-") && ($outfile = "");
- } elsif ( /^n(.*)/ ) {
- $project{"TARGET"} = ($1 eq "") ? shift @ARGV : $1;
- } elsif ( /^t(.*)/ ) {
- $project{"TEMPLATE"} = ($1 eq "") ? shift @ARGV : $1;
- $project{"TEMPLATE"} =~ s/\.t$//i;
- } elsif ( /lower/ ) {
- $tolower = 1;
- } else {
- &progen_usage;
- }
- } elsif ( /^\s*(?:[\w\-]+:)?\w+\s*[\+\-\*\/]?=/ ) { # project override
- push( @project_extra, $_ );
- } else {
- push (@files, $_ );
- }
-}
-
-$outfile eq "" || open(STDOUT,">" . $outfile) ||
- &progen_error("Can't create \"$outfile\"");
-
-if ( ! @files ) {
- @files = &find_files(".",".*",1);
-}
-
-if ( $tolower ) {
- foreach $f ( @files ) {
- $f =~ tr/A-Z/a-z/;
- }
-}
-
-@hdr = sort grep(/\.(h|hh|hpp|hxx)$/i,@files);
-@src = sort grep(/\.(c|cpp|cc|cxx)$/i && ! /moc_/i,@files);
-
-# Remove source files that are included by other source files
-foreach $f ( @src ) {
- $srcdict{$f} = 1;
-}
-foreach $f ( @src ) {
- if ( open(F,"< $f") ) {
- while ( <F> ) {
- if ( /^\s*#\s*include\s+\"([^\"]*)\"/ ) {
- $srcdict{$1} = 0;
- }
- }
- }
-}
-foreach $f( @src ) {
- $srcdict{$f} && (push(@src2,$f));
-}
-@src = @src2;
-
-$project{"HEADERS"} = join(" ",sort @hdr);
-$project{"SOURCES"} = join(" ",sort @src);
-
-foreach $p ( @project_extra ) {
- if ( $p =~ /^\s*((?:[\w\-]+:)?\w+)\s*([\+\-\*\/])?=\s*(.*)/ ) {
- if ( $project{$1} ne "" ) {
- Project($p);
- }
- }
-}
-
-$project{"HEADERS"} =~ s/\s+/ \\\n\t\t /g;
-$project{"SOURCES"} =~ s/\s+/ \\\n\t\t /g;
-
-print "TEMPLATE\t= " . $project{"TEMPLATE"} . "\n";
-print "CONFIG\t\t= " . $project{"CONFIG"} . "\n";
-print "HEADERS\t\t= " . $project{"HEADERS"} . "\n";
-print "SOURCES\t\t= " . $project{"SOURCES"} . "\n";
-if ( $project{"TARGET"} ne "" ) {
- print "TARGET\t\t= " . $project{"TARGET"} . "\n";
-}
-
-foreach ( @project_extra ) {
- if ( /^\s*((?:[\w\-]+:)?\w+)\s*([\+\-\*\/])?=\s*(.*)/ ) {
- if ( $project{$1} eq "" ) {
- $t = $1;
- if ( length($t) < 8 ) {
- $t .= "\t\t";
- } elsif ( length($t) < 16 ) {
- $t .= "\t";
- } else {
- $t .= " ";
- }
- print "$t$2= $3\n";
- }
- }
-}
-
-exit 0;
-
-
-#
-# progen_usage()
-#
-# Prints a message about program usage and exits
-#
-
-sub progen_usage {
- print STDERR "Usage:\n progen [options] [files]\n";
- print STDERR "Options:\n";
- print STDERR " -lower Lower-case letters filenames (useful for non-Unix)\n";
- print STDERR " -n name Specify a project name (= TARGET)\n";
- print STDERR " -o file Write output to \"file\"\n";
- print STDERR " -t file Specify a template file other than qtapp\n";
- exit 1;
-}
-
-
-#
-# progen_error(msg)
-#
-# Prints the message and exits
-#
-
-sub progen_error {
- my($msg) = @_;
- print STDERR "progen error: " . $msg . "\n";
- exit 1;
-}
-
-
-#
-# Finds files.
-#
-# Examples:
-# find_files("/usr","\.cpp$",1) - finds .cpp files in /usr and below
-# find_files("/tmp","^#",0) - finds #* files in /tmp
-#
-
-sub find_files {
- my($dir,$match,$descend) = @_;
- my($file,$p,@files);
- local(*D);
- $dir =~ s=\\=/=g;
- ($dir eq "") && ($dir = ".");
- if ( opendir(D,$dir) ) {
- if ( $dir eq "." ) {
- $dir = "";
- } else {
- ($dir =~ /\/$/) || ($dir .= "/");
- }
- foreach $file ( readdir(D) ) {
- next if ( $file =~ /^\.\.?$/ );
- $p = $dir . $file;
- ($file =~ /$match/i) && (push @files, $p);
- if ( $descend && -d $p && ! -l $p ) {
- push @files, &find_files($p,$match,$descend);
- }
- }
- closedir(D);
- }
- return @files;
-}
-
-
-#
-# strip_project_val(tag)
-#
-# Strips white space from project value strings.
-#
-
-sub strip_project_val {
- my($v) = @_;
- $v =~ s/^\s+//; # trim white space
- $v =~ s/\s+$//;
- return $v;
-}
-
-
-#
-# Project(strings)
-#
-# This is a powerful function for setting or reading project variables.
-# Returns the resulting project variables (joined with space between).
-#
-# This is a slightly modified version of the Project function in tmake.
-
-sub Project {
- my @settings = @_;
- my($r,$t,$s,$v,$p,$c);
- $r = "";
- foreach ( @settings ) {
- $v = $_;
- if ( $v =~ s/^\s*((?:[\w\-]+:)?\w+)\s*(\+=|\*=|\-=|\/=|=)\s*// ) {
- $t = $1;
- $s = $2;
- $v = strip_project_val($v);
- $p = $project{$t};
- if ( $s eq "=" ) { # set variable
- $p = $v;
- } elsif ( $s eq "+=" ) { # append
- if ( $p eq "" ) {
- $p = $v;
- } else {
- $p .= " " . $v;
- }
- } elsif ( $s eq "*=" ) { # append if not contained
- if ( !($p =~ /(?:^|\s)\Q$v\E(?:\s|$)/) ) {
- if ( $p eq "" ) {
- $p = $v;
- } else {
- $p .= " " . $v;
- }
- }
- } elsif ( $s eq "-=" ) { # subtract
- $p =~ s/$v//g;
- } elsif ( $s eq "/=" ) { # sed
- $cmd = '$p =~ ' . $v;
- eval $cmd;
- }
- $project{$t} = strip_project_val($p);
- } else {
- $p = strip_project_val($project{$v});
- }
- if ( $p ne "" ) {
- $r = ($r eq "") ? $p : ($r . " " . $p);
- }
- }
- return $r;
-}
diff --git a/tmake/bin/tmake b/tmake/bin/tmake
deleted file mode 100755
index 9158d7a..0000000
--- a/tmake/bin/tmake
+++ /dev/null
@@ -1,1262 +0,0 @@
-#!/usr/bin/perl
-############################################################################
-#
-#
-# Creates a Makefile from a template and a project file.
-#
-# Copyright (C) 1996-1998 by Troll Tech AS. All rights reserved.
-#
-# Permission to use, copy, modify, and distribute this software and its
-# documentation for any purpose and without fee is hereby granted, provided
-# that this copyright notice appears in all copies.
-# No representations are made about the suitability of this software for any
-# purpose. It is provided "as is" without express or implied warranty.
-#
-#
-# Some important, global variables in tmake:
-# cpp_ext C++ extension added to moc output (.cpp)
-# obj_ext Object file extension (.o on Unix, .obj otherwise)
-# moc_aware Will scan for files containing Qt signals/slots
-# moc_pre Moc prefix for generated moc file: x.h -> moc_x.cpp
-# moc_ext Moc extension for generated moc file: x.cpp -> x.moc
-# moc_cmd The moc command in your makefile, $(MOC)
-# linebreak Line break character (\)
-# dir_sep Directory separator (/ on Unix, \ on Windows)
-# is_unix Autodetected. If not Unix, assume Windows (Win32).
-#
-# If you need to customize any of these settings, do it before
-# calling StdInit() in the template file.
-#
-############################################################################
-
-$TMAKE_VERSION = "1.3";
-
-if ($] < 5.0) {
- &tmake_error("This program requires perl version 5 or newer");
-}
-
-$cpp_ext = "cpp";
-$moc_aware = 0;
-$moc_pre = "moc_";
-$moc_ext = "moc";
-$moc_cmd = '$(MOC)';
-$linebreak = "\\";
-$really_unix = &check_unix();
-$is_unix = $really_unix;
-$dir_sep = $is_unix ? "/" : "\\";
-$obj_ext = $is_unix ? "o" : "obj";
-$depend_path = "";
-$nodepend = 0;
-$output_count = 0;
-$notrim_whitespace = 0;
-$read_tmakeconf = 0;
-
-$template_name = "";
-$project_name = "";
-$outfile = "";
-%project = ();
-$eval_quit = 0;
-
-$project{"TMAKEPATH"} = $ENV{"TMAKEPATH"} . ";" . $ENV{"HOME"} . "/.tmake/";
-
-while ( @ARGV ) { # parse command line args
- $_ = shift @ARGV;
- if ( s/^-// ) {
- if ( /^e(.*)/ ) {
- if ( ! $read_tmakeconf ) {
- $read_tmakeconf = 1;
- &ScanProject( &find_template("tmake.conf") );
- }
- $text = "";
- eval( ($1 eq "") ? shift @ARGV : $1 );
- die $@ if $@;
- print $text . "\n" if ($text ne "");
- $eval_quit = 1;
- } elsif ( /^t(.*)/ ) {
- $template_name = ($1 eq "") ? shift @ARGV : $1;
- } elsif ( /^o(.*)/ ) {
- $outfile = ($1 eq "") ? shift @ARGV : $1;
- ($outfile eq "-") && ($outfile = "");
- if ( $outfile ne "" ) {
- open(STDOUT,">" . fix_path($outfile)) ||
- &tmake_error("Can't create \"$outfile\"");
- }
- } elsif ( /^p(.*)/ ) {
- #
- # The -p option is obsolete and will be removed in the next
- # tmake release.
- #
- &tmake_warning( "-p option obsolete, instead use \"tmake file1.pro file2.pro ...\"");
- my($pf) = ($1 eq "") ? shift @ARGV : $1;
- if ( ! $read_tmakeconf ) {
- $read_tmakeconf = 1;
- &ScanProject( &find_template("tmake.conf") );
- }
- if ( ! ($pf =~ /\.pro$/i) && -f fix_path($pf . ".pro") ) {
- $pf .= ".pro";
- }
- if ( $project_name eq "" ) {
- $project_name = $pf;
- $project{"PROJECT"} = $project_name;
- $project{"PROJECT"} =~ s/\.pro$//i;
- $project{"TARGET"} = $project{"PROJECT"};
- }
- if ( !&ScanProject($pf) ) {
- &tmake_error("Can't open project file \"$pf\"");
- }
- } elsif ( /^unix$/ ) {
- $is_unix = 1;
- $dir_sep = "/";
- $obj_ext = "o";
- } elsif ( /^win32$/ ) {
- $is_unix = 0;
- $dir_sep = "\\";
- $obj_ext = "obj";
- } elsif ( /^nodepend$/ ) {
- $nodepend = 1; # don't generate dependencies
- } elsif ( /^v$/ ) {
- $verbose = 1;
- } else {
- &tmake_usage();
- }
- } elsif ( /^\s*((?:[^:\s]*?:)?)(\w+)\s*(\+=|\*=|\-=|\/=|=)/ ) {
- if ( ! $read_tmakeconf && ! (/^\s*TMAKEPATH/) ) {
- $read_tmakeconf = 1;
- &ScanProject( &find_template("tmake.conf") );
- }
- Project( $_ ); # manual project setting
- } else {
- my($pf) = $_;
- if ( ! $read_tmakeconf ) {
- $read_tmakeconf = 1;
- &ScanProject( &find_template("tmake.conf") );
- }
- if ( ! ($pf =~ /\.pro$/i) && -f fix_path($pf . ".pro") ) {
- $pf .= ".pro";
- }
- if ( $project_name eq "" ) {
- $project_name = $pf;
- $project{"PROJECT"} = $project_name;
- $project{"PROJECT"} =~ s/\.pro$//i;
- $project{"TARGET"} = $project{"PROJECT"};
- }
- if ( !&ScanProject($pf) ) {
- &tmake_error("Can't open project file \"$pf\"");
- }
- }
-}
-
-&tmake_verb("Version $TMAKE_VERSION (runtime environment: " .
- ($really_unix ? "Unix" : "Win32") . ")\n" );
-
-if ( $eval_quit ) {
- &tmake_verb("Done!");
- exit 0;
-}
-($project_name eq "") && &tmake_usage();
-
-if ( $template_name eq "" ) {
- $template_name = $project{"TEMPLATE"} ?
- $project{"TEMPLATE"} : "default.t";
-}
-$template_name = &find_template($template_name);
-&IncludeTemplate($template_name);
-&tmake_verb("Done!");
-exit 0; # finished!
-
-
-
-##############################################################################
-# Subroutines from here
-##############################################################################
-
-#
-# tmake_usage()
-#
-# Prints a message about program usage and exits
-#
-
-sub tmake_usage {
- print STDERR "Usage:\n tmake [options] project-files\n";
- print STDERR "Options:\n";
- print STDERR " -e expr Evaluate expression, ignore template file\n";
- print STDERR " -nodepend Don't generate dependency information\n";
- print STDERR " -o file Write output to file\n";
- print STDERR " -t file Specify a template file\n";
- print STDERR " -unix Create output for Unix (auto detects)\n";
- print STDERR " -v Verbose/debug mode\n";
- print STDERR " -win32 Create output for Win32 (auto detects)\n";
- exit 1;
-}
-
-
-#
-# tmake_error(msg)
-#
-# Prints the message and exits
-#
-
-sub tmake_error {
- my($msg) = @_;
- print STDERR "tmake error: " . $msg . "\n";
- exit 1;
-}
-
-
-#
-# tmake_warning(msg)
-#
-# Prints the warning message
-#
-
-sub tmake_warning {
- my($msg) = @_;
- print STDERR "tmake warning: " . $msg . "\n";
-}
-
-
-#
-# tmake_verb()
-#
-# Prints a verbose message
-#
-
-sub tmake_verb {
- my($msg) = @_;
- $verbose && print STDERR "tmake: " . $msg . "\n";
-}
-
-
-#
-# check_unix()
-#
-# Returns 1 if this is a Unix, 0 otherwise.
-#
-
-sub check_unix {
- my($r);
- $r = 0;
- if ( -f "/bin/uname" ) {
- $r = 1;
- (-f "\\bin\\uname") && ($r = 0);
- }
- if ( -f "/usr/bin/uname" ) {
- $r = 1;
- (-f "\\usr\\bin\\uname") && ($r = 0);
- }
- return $r;
-}
-
-
-#
-# find_template(filename)
-#
-# Looks for the template file.
-# 1. search the current directory
-# 2. search the directories in TMAKEPATH
-# 3. search in $HOME/.tmake
-#
-
-sub find_template {
- my($filename) = @_;
- my($tb,$d,$p,@dirs);
- if ( !defined($template_base) || ($template_base eq "") ) {
- $tb = "";
- } else {
- $tb = $template_base . ";";
- }
- $d = $tb . $project{"TMAKEPATH"};
- @dirs = ("");
- push @dirs, &split_path( $d );
- $filename .= ".t" unless ($filename =~ /\.\w+$/);
- for $d ( @dirs ) {
- $p = $d . $filename;
- if ( -f fix_path($p) ) {
- if ( $filename eq "tmake.conf" ) {
- $tmake_platform = $d;
- $tmake_platform =~ s-.*[/\\]([^/\\]*)[/\\]-$1-;
- &tmake_verb("Detected platform $tmake_platform");
- }
- return $p;
- }
- return ($d . $filename) if ( -f fix_path($d . $filename) );
- }
- &tmake_error("Template file " . $filename . " not found");
-}
-
-
-##############################################################################
-# User functions
-##############################################################################
-
-#
-# StdInit()
-#
-# Standard initialization
-#
-
-sub StdInit {
- my($p);
- return if $stdinit_done;
- $stdinit_done = 1;
- if ( defined($project{"OBJECTS_DIR"}) ) {
- $project{"OBJECTS_DIR"} = FixPath($project{"OBJECTS_DIR"});
- &mkdirp($project{"OBJECTS_DIR"},0777);
- }
- if ( defined($project{"MOC_DIR"}) ) {
- $project{"MOC_DIR"} = FixPath($project{"MOC_DIR"});
- &mkdirp($project{"MOC_DIR"},0777);
- }
- if ( defined($project{"DESTDIR"}) ) {
- $project{"DESTDIR"} = FixPath($project{"DESTDIR"});
- &mkdirp($project{"DESTDIR"},0777);
- }
- $project{"OBJECTS"} = &Objects($project{"SOURCES"});
- if ( $moc_aware ) {
- $project{"_HDRMOC"} = &list_moc($project{"HEADERS"},$moc_pre,$cpp_ext);
- $project{"_SRCMOC"} = &list_moc($project{"SOURCES"},"",$moc_ext);
- $project{"OBJMOC"} = &Objects($project{"_HDRMOC"});
- $p = $project{"_HDRMOC"} . " " . $project{"_SRCMOC"};
- $p =~ s/(^\s+|\s+$)//g;
- $project{"SRCMOC"} = $p;
- }
- &AddIncludePath("");
-}
-
-
-sub FixPath {
- my($p) = @_;
- if ( !defined($p) || ($p eq "") || ($p eq ".") ) {
- $p = "";
- } else {
- $p .= $dir_sep;
- $p =~ s-[\\/]+-${dir_sep}-g;
- }
- return $p;
-}
-
-
-#
-# Config(name)
-#
-# Returns true if the project variable CONFIG contains the
-# configuration name.
-#
-
-sub Config {
- my($name) = @_;
- return $project{"CONFIG"} =~ /\b\Q$name\E\b/;
-}
-
-
-#
-# DisableOutput()
-#
-# Disables tmake output. Must be restored by calling a corresponding
-# EnableOutput().
-#
-
-sub DisableOutput {
- $output_count++;
-}
-
-
-#
-# EnableOutput()
-#
-# Enables tmake output again after DisableOutput() has been called.
-#
-
-sub EnableOutput {
- $output_count--;
-}
-
-
-#
-# Now() - sets $text
-#
-# Sets $text to the current date and time.
-#
-
-sub Now {
- my($sec,$min,$hour,$mday,$mon,$year);
- ($sec,$min,$hour,$mday,$mon,$year) = localtime(time());
- $text = sprintf("%02d:%02d, %4d/%02d/%02d",
- $hour, $min, 1900+$year, 1+$mon, $mday);
-}
-
-
-#
-# expand_project_var(var)
-#
-# Internal function for Project().
-# Expands a project value string.
-#
-
-sub expand_project_var {
- my($v) = @_;
- my($c);
- return "" if !defined($v);
- $c = 0;
- while ( $c < 100 ) { # expand $$
- if ( $v =~ s/(\$\$\w+)/\035/ ) {
- $_ = $1;
- s/\$\$//g;
- if ( !defined($project{$_}) ) {
- $v =~ s/\035//g;
- } else {
- $v =~ s/\035/$project{$_}/g;
- }
- $c++;
- } else {
- $c = 100;
- }
- }
- return $v;
-}
-
-
-#
-# Project(strings)
-#
-# This is a powerful function for setting or reading project variables.
-# Returns the resulting project variables (joined with space between).
-#
-# Get a project variable:
-# $s = Project("TEMPLATE"); -> $s = "TEMPLATE"
-#
-# Set a project variable:
-# Project("TEMPLATE = lib"); -> TEMPLATE = lib
-# Project("CONFIG =";) -> CONFIG empty
-#
-# Append to a project variable:
-# Project("CONFIG = qt"); -> CONFIG = qt
-# Project("CONFIG += debug"); -> CONFIG = qt debug
-#
-# Append to a project variable if it does not contain the value already:
-# Project("CONFIG = qt release"); -> CONFIG = qt release
-# Project("CONFIG *= qt"); -> CONFIG = qt release
-# Project("CONFIG *= opengl"); -> CONFIG = qt release opengl
-#
-# Subtract from a project variable:
-# Project("THINGS = abc xyz"); -> THINGS = abc xyz
-# Project("THINGS -= abc"); -> THINGS = xyz
-#
-# Search/replace on a project variable:
-# Project("CONFIG = tq opengl"); -> CONFIG = tq opengl
-# Project("CONFIG /= s/tq/qt/"); -> CONFIG = qt opengl
-#
-# The operations can be performed on several project variables at a time.
-#
-# Project("TEMPLATE = app", "CONFIG *= opengl", "THINGS += klm");
-#
-
-sub Project {
- my @settings = @_;
- my($r,$if_var,$t,$s,$v,$p,$c);
- $r = "";
- foreach ( @settings ) {
- $v = $_;
- if ( $v =~ s/^\s*([^:\r\n]+:)?(\w+)\s*(\+=|\*=|\-=|\/=|=)// ) {
- $if_var = $1;
- if ( $if_var ne "" ) {
- chop $if_var;
- if ( $if_var eq "unix" ) {
- return "" if !$is_unix;
- } elsif ( $if_var eq "win32" ) {
- return "" if $is_unix;
- } elsif ( ($if_var ne $tmake_platform) && !Config($if_var) ) {
- return "";
- }
- }
- $t = $2;
- $s = $3;
- if ( ! $notrim_whitespace ) {
- $v =~ s/^\s+//; # trim white space
- $v =~ s/\s+$//;
- }
- $v = expand_project_var($v);
- $p = $project{$t};
- if ( $s ne "=" && $v eq "" ) {
- # nothing to append, subtract or sed
- } elsif ( $s eq "=" ) { # set variable
- $p = $v;
- } elsif ( $s eq "+=" ) { # append
- if ( $p eq "" ) {
- $p = $v;
- } else {
- $p .= " " . $v;
- }
- } elsif ( $s eq "*=" ) { # append if not contained
- if ( !($p =~ /(?:^|\s)\Q$v\E(?:\s|$)/) ) {
- if ( $p eq "" ) {
- $p = $v;
- } else {
- $p .= " " . $v;
- }
- }
- } elsif ( $s eq "-=" ) { # subtract
- $p =~ s/$v//g;
- } elsif ( $s eq "/=" ) { # sed
- $cmd = '$p =~ ' . $v;
- eval $cmd;
- }
- $project{$t} = expand_project_var($p);
- } else {
- $p = expand_project_var($project{$v});
- }
- if ( $p ne "" ) {
- $r = ($r eq "") ? $p : ($r . " " . $p);
- }
- }
- return $r;
-}
-
-
-#
-# Substitute(string)
-#
-# This function substitutes project variables in a text.
-#
-# Example:
-# Substitute('The project name is "$$PROJECT"')
-#
-
-sub Substitute {
- my($subst) = @_;
- $text = expand_project_var($subst);
- return $text;
-}
-
-
-#
-# ScanProject(file)
-#
-# Scans a project file. Inserts project variables into the global
-# associative project array.
-#
-
-sub ScanProject {
- my($file) = @_;
- my($var,$val,@v,$more,$line,$endmark);
-
- $var = "";
- $line = 0;
- open(TMP,fix_path($file)) || return 0;
-
- &tmake_verb("Reading the project file $file");
- while ( <TMP> ) {
- $line++;
- s/\#.*//; # strip comment
- s/^\s+//; # strip white space
- s/\s+$//;
- if ( /^(([^:\r\n]+:)?\w+\s*(\+|\-|\*|\/)?=)/ ) {
- $var = $1; # var also contains the ".="
- s/^.*?=\s*//;
- if ( /^\<\<(.*)$/ ) {
- $endmark = $1;
- $val = "";
- while ( <TMP> ) {
- $line++;
- if ( /^\Q$endmark\E$/ ) {
- $endmark = "";
- last;
- }
- $val .= $_;
- }
- if ( $endmark ne "" ) {
- tmake_error("$file:$line: End marker $endmark not found");
- }
- chop $val if ( $val ne "" );
- $notrim_whitespace++;
- Project( $var . $val );
- $notrim_whitespace--;
- $var = "";
- $_ = "";
- }
- }
- if ( $var ne "" ) {
- $more = ( $_ =~ s/\s*\\\s*$// ); # more if \ at end of line
- push( @v, split( /\s+/, $_ ) );
- if ( ! $more ) {
- $val = join(" ",@v);
- Project( $var . $val );
- $var = "";
- @v = ();
- }
- } elsif ( $_ ne "" ) {
- tmake_error("$file:$line: Syntax error");
- }
- }
- close(TMP);
- &tmake_verb("Done reading the project file $file");
- return 1;
-}
-
-
-#
-# IncludeTemplate(template_name)
-#
-# Includes and processes a template file.
-#
-# Below, we read the template file and executes any perl code found.
-# Perl code comes after "#$". The variable $text contains the text
-# to replace the perl code that was executed.
-# Template comments begin with "#!".
-#
-
-sub IncludeTemplate {
- my($t_name) = @_;
- my($cmd,$cmd_block,$cmd_end,$is_cmd_block,$saveline,$spaceonly);
- local($text);
- local(*T);
-
- $t_name = &find_template($t_name);
- if ( $tmake_template_dict{$t_name} ) {
- &tmake_error("Cyclic template inclusion for $t_name");
- } else {
- $tmake_template_dict{$t_name} = 1;
- }
- $template_base = $t_name;
- $template_base =~ s-(.*[/\\]).*-$1-;
- &tmake_verb("Reading the template $t_name");
- open(T,fix_path($t_name)) ||
- &tmake_error("Can't open template file \"$t_name\"");
-
- while ( <T> ) {
- if ( /\#\!/ ) { # tmake comment
- s/\s*\#\!.*//;
- next if /^$/;
- }
- if ( /\#\$(\{)?\s*(.*)\n/ ) { # code
- $cmd = $2;
- $is_cmd_block = defined($1) && ($1 eq "{");
- s/\#\$.*\n//;
- if ( $is_cmd_block ) { # code block #${ ...
- $saveline = $_;
- $cmd_block = $cmd;
- $cmd_end = 0;
- while ( <T> ) {
- $cmd = $_;
- $cmd =~ s/\s*\#\!.*//; # tmake comment
- if ( $cmd =~ /^\s*\#\$\}/ ) {
- $_ = "";
- $cmd_end = 1;
- last;
- }
- $cmd =~ s/^\s*\#(\$)?\s*//;
- $cmd_block .= $cmd;
- }
- $cmd_end || &tmake_error('#$} expected but not found');
- $cmd = $cmd_block;
- $_ = $saveline;
- }
- $spaceonly = /^\s*$/;
- $saveline = $_;
- &tmake_verb("Evaluate: $cmd");
- $text = "";
- eval $cmd;
- die $@ if $@;
- next if $spaceonly && ($text =~ /^\s*$/);
- print $saveline . $text . "\n" if $output_count <= 0;
- } else { # something else
- print if $output_count <= 0;
- }
- }
- close( T );
-}
-
-
-#
-# Expand(var) - appends to $text
-#
-# Expands a list of $project{} variables with a space character between them.
-#
-
-sub Expand {
- my @vars = @_;
- my($t);
- $t = Project(@vars);
- if ( $text eq "" ) {
- $text = $t;
- } elsif ( $t ne "" ) {
- $text .= " " . $t;
- }
- return $text;
-}
-
-
-#
-# ExpandGlue(var,prepend,glue,append) - appends to $text
-#
-# Expands a $project{} variable, splits on whitespace
-# and joins with $glue. $prepend is put at the start
-# of the string and $append is put at the end of the
-# string. The resulting string becomes "" if the project
-# var is empty or not defined.
-#
-# Example:
-#
-# The project file defines:
-# SOURCES = a b c
-#
-# ExpandGlue("SOURCES","<","-",">")
-#
-# The result:
-# $text = "<a-b-c>"
-#
-
-sub ExpandGlue {
- my($var,$prepend,$glue,$append) = @_;
- my($t,$v);
- $v = Project($var);
- if ( $v eq "" ) {
- $t = "";
- } else {
- $t = $prepend . join($glue,split(/\s+/,$v)) . $append;
- }
- if ( $text eq "" ) {
- $text = $t;
- } elsif ( $t ne "" ) {
- $text .= " " . $t;
- }
- return $text;
-}
-
-
-#
-# ExpandList(var) - sets $text.
-#
-# Suitable for expanding HEADERS = ... etc. in a Makefile
-#
-
-sub ExpandList {
- my($var) = @_;
- return ExpandGlue($var,""," ${linebreak}\n\t\t","");
-}
-
-
-#
-# ExpandPath(var,prepend,glue,append) - appends to $text
-#
-# Expands a $project{} variable, splits on either ';' or
-# whitespace and joins with $glue. $prepend is put at the
-# start of the string and $append is put at the end of the
-# string. The resulting string becomes "" if the project
-# variable is empty or not defined.
-#
-# If the variable contains at least one semicolon or tmake
-# is running on Windows, the resulting items are put in
-# double-quotes.
-#
-# Example:
-#
-# The project file defines:
-# INCLUDEPATH = "C:\qt\include;c:\program files\msdev\include
-#
-# ExpandGlue("INCLUDEPATH","-I","-I","")
-#
-# The result:
-# $text = -I"c:\qt\include" -I"c:\program files\msdev\include"
-#
-
-sub ExpandPath {
- my($var,$prepend,$glue,$append) = @_;
- my($t,$v);
- my($s);
- $v = Project($var);
- if ( $v eq "" ) {
- $t = "";
- } else {
- if ( $v =~ /;/ || !$is_unix ) {
- $prepend .= '"';
- $glue = '"' . $glue . '"';
- $append = '"' . $append;
- }
-
- if ( $v =~ /;/ ) {
- $t = $prepend . join($glue,split(/;+/,$v)) . $append;
- } else {
- $t = $prepend . join($glue,split(/\s+/,$v)) . $append;
- }
- }
- if ( $text eq "" ) {
- $text = $t;
- } elsif ( $t ne "" ) {
- $text .= " " . $t;
- }
- return $text;
-}
-
-
-#
-# TmakeSelf()
-#
-# Generates makefile rule to regenerate the makefile using tmake.
-#
-
-sub TmakeSelf {
- my $a = "tmake $project_name";
- if ( $nodepend ) {
- $a .= " -nodepend";
- }
- if ( $outfile ) {
- $text = "tmake: $outfile\n\n$outfile: $project_name\n\t";
- $a .= " -o $outfile";
- } else {
- $text = "tmake:\n\t";
- }
- $text .= $a
-}
-
-
-#
-# Objects(files)
-#
-# Replaces any extension with .o ($obj_ext).
-#
-
-sub Objects {
- local($_) = @_;
- my(@a);
- @a = split(/\s+/,$_);
- foreach ( @a ) {
- s-\.\w+$-.${obj_ext}-;
- if ( defined($project{"OBJECTS_DIR"}) ) {
- s-^.*[\\/]--;
- $_ = $project{"OBJECTS_DIR"} . $_;
- }
- }
- return join(" ",@a);
-}
-
-
-#
-# list_moc(files,prefix,extension)
-#
-# Scans all files and selects all files that contain Q_OBJECT.
-# Insert a prefix before the filename and replaces the filename extention.
-#
-
-sub list_moc {
- my($files,$pre,$ext) = @_;
- my(@v,@m,@lines,$contents,$n,$f,$t);
- @v = split(/\s+/,$files);
- undef $/;
- foreach $f ( @v ) {
- if ( open(TMP,fix_path($f)) ) {
- $contents = <TMP>;
- close(TMP);
- $n = 0;
- @lines = split(/\n/,$contents);
- grep( /tmake\s+ignore\s+Q_OBJECT/ && $n--, @lines );
- $contents =~ s-/\*.*?\*/--gs; # strip C/C++ comments
- $contents =~ s-//.*\n--g;
- @lines = split(/\n/,$contents);
- grep( /(^|\W)Q_OBJECT(\W|$)/ && $n++, @lines );
- if ( $n > 0 ) {
- $t = $f;
- $t =~ s-^(.*[/\\])?([^/\\]*?)\.(\w+)$-$1${pre}$2.${ext}-;
- if ( defined($project{"MOC_DIR"}) ) {
- $t =~ s-^.*[\\/]--;
- $t = $project{"MOC_DIR"} . $t;
- }
- $moc_output{$f} = $t;
- $moc_input{$t} = $f;
- push(@m,$t);
- }
- $contents = "";
- }
- }
- $/ = "\n";
- return join(" ",@m);
-}
-
-
-#
-# BuildObj(objects,sources)
-#
-# Builds the object files.
-#
-
-sub BuildObj {
- my($obj,$src) = @_;
- my(@objv,$srcv,$i,$s,$o,$d,$c,$comp,$cimp);
- @objv = split(/\s+/,$obj);
- @srcv = split(/\s+/,$src);
- for $i ( 0..$#objv ) {
- $s = $srcv[$i];
- $o = $objv[$i];
- next if $s eq "";
- $text .= $o . ": " . $s;
- if ( defined($moc_output{$s}) && ($moc_output{$s} ne "") ) {
- $text .= " ${linebreak}\n\t\t" . $moc_output{$s};
- }
- $d = &make_depend($s);
- $text .= " ${linebreak}\n\t\t" . $d if $d ne "";
- if ( ($s =~ /\.c$/) ) {
- $comp = "TMAKE_RUN_CC";
- $cimp = "TMAKE_RUN_CC_IMP";
- } else {
- $comp = "TMAKE_RUN_CXX";
- $cimp = "TMAKE_RUN_CXX_IMP";
- }
- if ( defined($project{"OBJECTS_DIR"}) ||
- !defined($project{$cimp}) ) {
- $c = $project{$comp};
- $c =~ s/\$src/$s/;
- $c =~ s/\$obj/$o/;
- $text .= "\n\t$c";
- }
- $text .= "\n\n";
- }
- chop $text;
-}
-
-
-#
-# BuildMocObj(objects,sources)
-#
-# Builds the moc object files.
-#
-
-sub BuildMocObj {
- my($obj,$src) = @_;
- my(@objv,$srcv,$i,$s,$o,$hdr,$d);
- @objv = split(/\s+/,$obj);
- @srcv = split(/\s+/,$src);
- for $i ( 0..$#objv ) {
- $s = $srcv[$i];
- $o = $objv[$i];
- $hdr = $moc_input{$srcv[$i]};
- $text .= $o . ": " . $s . " ${linebreak}\n\t\t" . $hdr;
- $d = &make_depend($hdr);
- $text .= " ${linebreak}\n\t\t" . $d if $d ne "";
- if ( defined($project{"OBJECTS_DIR"}) || defined($project{"MOC_DIR"})||
- !defined($project{"TMAKE_RUN_CXX_IMP"}) ) {
- $c = $project{"TMAKE_RUN_CXX"};
- $c =~ s/\$src/$s/;
- $c =~ s/\$obj/$o/;
- $text .= "\n\t$c";
- }
- $text .= "\n\n";
- }
- chop $text;
-}
-
-
-#
-# BuildMocSrc(files)
-#
-# Builds the moc source files from headers and sources.
-#
-
-sub BuildMocSrc {
- my($f) = @_;
- my(@v,$m,$o);
- @v = split(/\s+/,$f);
- foreach $m ( @v ) {
- $o = $moc_output{$m};
- if ( defined($o) && ($o ne "") ) {
- $text .= "$o: $m\n\t$moc_cmd $m -o $o\n\n";
- }
- }
- chop $text;
-}
-
-
-#
-# AddIncludePath(path)
-#
-# Adds path to the current include path, $project{"INCLUDEPATH"}.
-#
-
-sub AddIncludePath {
- my($path) = @_;
- my($p);
- if ( $project{"INCPATH"} &&
- ($project{"INCPATH"} =~ /(?:^|\s)\Q$path\E(?:\s|$)/) ) {
- return;
- }
- $project{"INCLUDEPATH"} = "" if !defined($project{"INCLUDEPATH"});
- if ( !defined($project{"INCPATH_SEP"}) ) {
- if ( $project{"INCLUDEPATH"} =~ /;/ ) {
- $project{"INCPATH_SEP"} = ";";
- } else {
- $project{"INCPATH_SEP"} = " ";
- }
- }
- $p = $project{"INCLUDEPATH"};
- $p = ($p && $path) ? ($p . ";" . $path) : ($p . $path);
- $project{"INCLUDEPATH"} = $p;
- $p = join($project{"INCPATH_SEP"},&split_path($p));
- $p =~ s=[\\/]($project{"INCPATH_SEP"}|$)=$project{"INCPATH_SEP"}=g;
- $project{"INCPATH"} = $p;
-}
-
-
-#
-# FindHighestLibVersion(dir,name)
-#
-# Returns the newest library version. Scans all the files in the specifies
-# directory and returns the highest version number.
-#
-# Used on Windows only.
-#
-# Example:
-# FindHighestLibVersion("c:\qt\lib","qt") returns "200" if
-# the c:\qt\lib directory contains qt141.lib and qt200.lib.
-#
-
-sub FindHighestLibVersion {
- my($dir,$name) = @_;
- my(@files,$f,$v,$highest);
- $highest = "";
- @files = find_files($dir,"${name}.*\.lib");
- for $f ( @files ) {
- if ( $f =~ /(\d+)\.lib/i ) {
- $v = $1;
- if ( $highest eq "" || $v > $highest ) {
- $highest = $v;
- }
- }
- }
- return $highest;
-}
-
-
-#
-# Finds files.
-#
-# Examples:
-# find_files("/usr","\.cpp$",1) - finds .cpp files in /usr and below
-# find_files("/tmp","^#",0) - finds #* files in /tmp
-#
-
-sub find_files {
- my($dir,$match,$descend) = @_;
- my($file,$p,@files);
- local(*D);
- $dir =~ s=\\=/=g;
- ($dir eq "") && ($dir = ".");
- if ( opendir(D,fix_path($dir)) ) {
- if ( $dir eq "." ) {
- $dir = "";
- } else {
- ($dir =~ /\/$/) || ($dir .= "/");
- }
- foreach $file ( readdir(D) ) {
- next if ( $file =~ /^\.\.?$/ );
- $p = $dir . $file;
- if ( $is_unix ) {
- ($file =~ /$match/) && (push @files, $p);
- } else {
- ($file =~ /$match/i) && (push @files, $p);
- }
- if ( $descend && -d $p && ! -l $p ) {
- push @files, &find_files($p,$match,$descend);
- }
- }
- closedir(D);
- }
- return @files;
-}
-
-
-#
-# make_depend(file)
-#
-# Returns a list of included files.
-# Uses the global $depend_path variable.
-#
-
-sub make_depend {
- my($file) = @_;
- my($i,$count);
- if ( $nodepend ) {
- return "";
- }
- if ( ! $depend_path_fixed ) {
- $depend_path_fixed = 1;
- if ( defined($project{"DEPENDPATH"}) ) {
- $depend_path = $project{"DEPENDPATH"};
- } else {
- $depend_path = "";
- }
- $count = 0;
- while ( $count < 100 ) {
- if ( $depend_path =~ s/(\$[\{\(]?\w+[\}\)]?)/035/ ) {
- $_ = $1;
- s/[\$\{\}\(\)]//g;
- $depend_path =~ s/035/$ENV{$_}/g;
- } else {
- $count = 100;
- }
- }
- @dep_path = &split_path($depend_path);
- }
- @cur_dep_path = @dep_path;
- if ( $file =~ /(.*[\/\\])/ ) {
- $dep_curdir = $1;
- push @cur_dep_path, $dep_curdir;
- } else {
- $dep_curdir = "";
- }
- $dep_file = $file;
- &canonical_dep($file);
- %dep_dict = ();
- $i = &build_dep($file);
- chop $i;
- $i =~ s=/=$dir_sep=g unless $is_unix;
- $i =~ s=([a-zA-Z]):/=//$1/=g if (defined($gnuwin32) && $gnuwin32);
- return join(" ${linebreak}\n\t\t",split(/ /,$i) );
-}
-
-#
-# build_dep() - Internal for make_depend()
-#
-
-sub build_dep {
- my($file) = @_;
- my(@i,$a,$n);
- $a = "";
- return $a if !(defined $depend_dict{$file});
- @i = split(/ /,$depend_dict{$file});
- for $n ( @i ) {
- if ( !defined($dep_dict{$n}) && defined($full_path{$n}) ) {
- $dep_dict{$n} = 1;
- $a .= $full_path{$n} . " " . &build_dep($n);
- }
- }
- return $a;
-}
-
-#
-# canonical_dep(file) - Internal for make_depend()
-#
-# Reads the file and all included files recursively.
-# %depend_dict associates a file name to a list of included files.
-#
-
-sub canonical_dep {
- my($file) = @_;
- my(@inc,$i);
- @inc = &scan_dep($file);
- if ( @inc ) {
- $depend_dict{$file} = join(" ",@inc);
- for $i ( @inc ) {
- &canonical_dep($i) if !defined($depend_dict{$i});
- }
- }
-}
-
-#
-# scan_dep(file) - Internal for make_depend()
-#
-# Returns an array of included files.
-#
-
-sub scan_dep {
- my($file) = @_;
- my($dir,$path,$found,@allincs,@includes,%incs);
- $path = $file;
- @includes = ();
- return @includes if $file =~ /\.$moc_ext$/; # avoid .moc files
- if ( ! (-f fix_path($path)) ) {
- $found = 0;
- for $dir ( @cur_dep_path ) {
- $path = $dir . $file;
- last if ( $found = (-f fix_path($path)) );
- }
- return @includes if ! $found;
- }
- undef $/;
- if ( open(TMP,fix_path($path)) ) {
- $full_path{$file} = $path;
- $_ = <TMP>;
- s-/\*.*?\*/--gs; # strip C/C++ comments
- s-//.*\n-\n-g;
- @allincs = split(/\n/,$_);
- @allincs = grep(/^\s*#\s*include/,@allincs);
- foreach ( @allincs ) { # all #include lines
- next if !(/^\s*#\s*include\s+[<"]([^>"]*)[>"]/) || defined($incs{$1});
- push(@includes,$1);
- $incs{$1} = "1";
- }
- close(TMP);
- }
- $/ = "\n";
- return @includes;
-}
-
-
-#
-# split_path(path)
-#
-# Splits a path containing : (Unix) or ; (MSDOS, NT etc.) separators.
-# Returns an array.
-#
-
-sub split_path {
- my($p) = @_;
- my($s,@d);
- @d = ();
- return @d if !defined($p) || $p eq "";
- $p =~ s=:=;=g if $is_unix;
- $p =~ s=[/\\]+=/=g;
- if ( !($p =~ /;/) ) {
- $p =~ s/\s+/;/g;
- }
- $p =~ s/\s*;\s*/;/g;
- while( $p =~ /(?:(?:[^\"\;][^\;]*;*)|(?:\"[^\"]*\";*))/g ) {
- $s = $&;
- $s =~ s=\"==g;
- $s =~ s=[\s\;]+$==g;
- $s =~ s=([^/:])$=$1/=g;
- $s =~ s=/=$dir_sep=g unless $is_unix;
- push @d, $s;
- }
- return @d;
-}
-
-
-#
-# fix_path(path)
-#
-# Converts all '\' to '/' if this really seems to be a Unix box.
-#
-
-sub fix_path {
- my($p) = @_;
- if ( $really_unix ) {
- $p =~ s-\\-/-g;
- } else {
- $p =~ s-/-\\-g;
- }
- return $p;
-}
-
-
-#
-# mkdirp(filename,mode) - Internal for StdInit()
-#
-# Creates the directory specified by $filename, with permissions
-# specified by mode (as modified by umask). Recursively calls
-# mkdir, similar to 'mkdir -p'.
-#
-
-sub mkdirp {
- my($filename,$mode) = @_;
- if ( $filename =~ /\$\(\w+\)/ ) { # ignore "$(something)"
- return 0;
- }
- $filename =~ s-[\\:/]+-/-g;
- if ( -d $filename ) {
- return 1;
- }
- $filename =~ m-^((.*)/)?(.*)-;
- if ( defined($2) && ! mkdirp($2,$mode) ) {
- return 0;
- }
- return mkdir($filename,$mode);
-}
diff --git a/tmake/doc/m-linux-gcc.html b/tmake/doc/m-linux-gcc.html
deleted file mode 100644
index 300ef35..0000000
--- a/tmake/doc/m-linux-gcc.html
+++ /dev/null
@@ -1,85 +0,0 @@
-<!doctype HTML public "-//W3C//DTD HTML 3.2//EN">
-<html><head><title>
-Generated Makefile for Linux / GNU g++
-</title></head><body bgcolor="#ffffff">
-<h2 align=center>Generated Makefile for Linux / GNU gcc</h2>
-
-<pre>
-#############################################################################
-# Makefile for building hello
-# Generated by tmake at 10:11, 1998/07/07
-# Project: hello
-# Template: app
-#############################################################################
-
-####### Compiler, tools and options
-
-CC = g++
-CFLAGS = -Wall -W -O2 -fno-strength-reduce
-INCPATH = -I$(QTDIR)/include
-LINK = g++
-LFLAGS =
-LIBS = -L$(QTDIR)/lib -lqt -L/usr/X11R6/lib -lX11
-MOC = moc
-
-####### Files
-
-HEADERS = hello.h
-SOURCES = hello.cpp \
- main.cpp
-OBJECTS = hello.o \
- main.o
-SRCMOC = moc_hello.cpp
-OBJMOC = moc_hello.o
-TARGET = hello
-
-####### Implicit rules
-
-.SUFFIXES: .cpp .cxx .cc .C .c
-
-.cpp.o:
- $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
-
-.cxx.o:
- $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
-
-.cc.o:
- $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
-
-.C.o:
- $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
-
-.c.o:
- $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
-
-####### Build rules
-
-all: $(TARGET)
-
-$(TARGET): $(OBJECTS) $(OBJMOC)
- $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS)
-
-moc: $(SRCMOC)
-
-tmake:
- tmake hello.pro
-
-clean:
- -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(TARGET)
- -rm -f *~ core
-
-####### Compile
-
-hello.o: hello.cpp \
- hello.h
-
-main.o: main.cpp \
- hello.h
-
-moc_hello.o: moc_hello.cpp \
- hello.h
-
-moc_hello.cpp: hello.h
- $(MOC) hello.h -o moc_hello.cpp
-</pre>
-</body></html>
diff --git a/tmake/doc/m-win32-msvc.html b/tmake/doc/m-win32-msvc.html
deleted file mode 100644
index 24097cc..0000000
--- a/tmake/doc/m-win32-msvc.html
+++ /dev/null
@@ -1,89 +0,0 @@
-<!doctype HTML public "-//W3C//DTD HTML 3.2//EN">
-<html><head><title>
-Generated Makefile for Win32 / Microsoft Visual C++
-</title></head><body bgcolor="#ffffff">
-<h2 align=center>Generated Makefile for Win32 / Microsoft Visual C++</h2>
-
-<pre>
-#############################################################################
-# Makefile for building hello
-# Generated by tmake at 20:40, 1998/02/27
-# Project: hello
-# Template: app
-#############################################################################
-
-####### Compiler, tools and options
-
-CC = cl
-CFLAGS = -nologo -W3 -O2
-INCPATH = -I"$(QTDIR)\include"
-LINK = link
-LFLAGS = /NOLOGO /SUBSYSTEM:windows
-LIBS = $(QTDIR)\lib\qt.lib user32.lib gdi32.lib comdlg32.lib wsock32.lib
-MOC = moc
-
-####### Files
-
-HEADERS = hello.h
-SOURCES = hello.cpp \
- main.cpp
-OBJECTS = hello.obj \
- main.obj
-SRCMOC = moc_hello.cpp
-OBJMOC = moc_hello.obj
-TARGET = hello.exe
-
-####### Implicit rules
-
-.SUFFIXES: .cpp .cxx .cc .c
-
-.cpp.obj:
- $(CC) -c $(CFLAGS) $(INCPATH) -Fo$@ $<
-
-.cxx.obj:
- $(CC) -c $(CFLAGS) $(INCPATH) -Fo$@ $<
-
-.cc.obj:
- $(CC) -c $(CFLAGS) $(INCPATH) -Fo$@ $<
-
-.c.obj:
- $(CC) -c $(CFLAGS) $(INCPATH) -Fo$@ $<
-
-####### Build rules
-
-all: $(TARGET)
-
-$(TARGET): $(OBJECTS) $(OBJMOC)
- $(LINK) $(LFLAGS) /OUT:$(TARGET) @<<
- $(OBJECTS) $(OBJMOC) $(LIBS)
-<<
-
-moc: $(SRCMOC)
-
-tmake: Makefile
-
-Makefile: hello.pro
- tmake hello.pro -o Makefile
-
-clean:
- -del hello.obj
- -del main.obj
- -del moc_hello.cpp
- -del moc_hello.obj
- -del $(TARGET)
-
-####### Compile
-
-hello.obj: hello.cpp \
- hello.h
-
-main.obj: main.cpp \
- hello.h
-
-moc_hello.obj: moc_hello.cpp \
- hello.h
-
-moc_hello.cpp: hello.h
- $(MOC) hello.h -o moc_hello.cpp
-</pre>
-</body></html>
diff --git a/tmake/doc/tmake.html b/tmake/doc/tmake.html
deleted file mode 100644
index 1b14809..0000000
--- a/tmake/doc/tmake.html
+++ /dev/null
@@ -1,727 +0,0 @@
-<!doctype HTML public "-//W3C//DTD HTML 3.2//EN">
-<html><head><title>
-User's Guide - tmake
-</title></head><body bgcolor="#ffffff">
-<p><h1 align=center>User's Guide - tmake</h1>
-
-
-<hr>
-<h2>Introduction</h2>
-
-tmake is an easy-to-use tool from Troll Tech to create and maintain
-makefiles for software projects. It can be a painful task to manage
-makefiles manually, especially if you develop for more than one platform
-or use more than one compiler. tmake automates and streamlines this
-process and lets you spend your valuable time on writing code, not
-makefiles.
-
-<p>
-Our main motivation for developing tmake was that we spent far too much
-time maintaining makefiles for <a href="http://www.troll.no/qt">Qt</a>,
-our cross-platform GUI toolkit. Qt supports around 15 flavors of Unix,
-Microsoft Windows, and around 15 different C++ compilers. We looked at
-GNU autoconf, but it was Unix-specific and not flexible enough in our
-opinion. Our makefile system also had to deal with Qt <a
-href="http://www.troll.no/qt/metaobjects.html">meta object compiler</a>
-(moc) issues. The moc program extracts meta information from C++ files and
-generates a C++ file with data tables etc. It takes extra work to add
-makefile rules for the moc and wanted to automate this task.
-
-<p>
-tmake is written in Perl and requires that you have installed perl version
-5 or newer. Basic use of tmake requires no perl knowledge, but if you know
-perl you can extend tmake and write your own makefile templates.
-
-<p>
-<b>Windows users:</b> The tmake distribution for Win32 includes tmake.exe
-(built by the perl2exe utility) and you do not need to download and
-install perl unless you want to modify the tmake source code or run other
-perl scripts. You can download perl for Win32 (Windows NT and 95) from <a
-href="http://www.activestate.com">www.activestate.com</a>
-
-<p>
-tmake is free software and you may use, copy, modify and distribute tmake
-and its documentation for any purpose and without any fee. See the
-LICENSE file for details.
-
-<p>
-Feedback is highly appreciated. Contact the author, Haavard Nord <a
-href="mailto:hanord@troll.no">(hanord@troll.no)</a>, if you have ideas,
-patches etc. for tmake.
-
-<hr>
-<h2>Installation</h2>
-
-<ol>
-<li>Make sure you have perl version 5 or later installed (optional
-for Windows users).
-<li>Unpack the tmake tar.gz archive for Unix or the tmake .zip file for Windows.
-<li>Set the TMAKEPATH environment variable to the directories
-containing the template files (see below).
-<li>Add the tmake/bin directory to your PATH.
-</ol>
-
-Here are some examples:<p>
-<strong>Unix Bourne shell:</strong><pre>
- TMAKEPATH=/local/tmake/lib/linux-g++
- PATH=$PATH:/local/tmake/bin
- export TMAKEPATH PATH
-</pre>
-
-<strong>Unix C shell:</strong><pre>
- setenv TMAKEPATH /local/tmake/lib/linux-g++
- setenv PATH $PATH:/local/tmake/bin
-</pre>
-
-<strong>Microsoft Windows:</strong><pre>
- set TMAKEPATH=c:\tmake\lib\win32-msvc
- set PATH=%PATH%;c:\tmake\bin
-</pre>
-
-<p>
-The template directory name has the form <em>platform</em>-<em>compiler</em>
-and contains a platform configuration file (tmake.conf) and tmake template
-files.
-
-<p>
-Supported platforms: AIX, Data General, FreeBSD, HPUX, SGI Irix, Linux,
-NetBSD, OpenBSD, OSF1/DEC, SCO, Solaris, SunOS, Ultrix, Unixware and
-Win32.
-
-<p>
-You can find your platform-compiler combination in the <tt>tmake/lib</tt>.
-
-<p>
-<b>Unix users:</b> tmake requires that perl is in /usr/bin. If your
-version of perl is elsewehere, either change the first line of tmake or
-make a small shell script which invokes tmake with the correct perl.
-
-
-<hr>
-<h2>Getting Started</h2>
-
-Let's assume you have a small Qt application consisting of one C++ header
-file and two source files.
-
-First you need to create a tmake project file, e.g. hello.pro:<pre>
- HEADERS = hello.h
- SOURCES = hello.cpp main.cpp
- TARGET = hello
-</pre>
-
-Then run tmake to create a Makefile:<pre>
- tmake hello.pro -o Makefile
-</pre>
-And finally:<pre>
- make
-</pre>
-This builds the hello program. Remember to set the <code>TMAKEPATH</code>
-environment variable before you run tmake.
-<p>
-See <a href="m-linux-gcc.html">Makefile for Linux/g++</a>.<br>
-See <a href="m-win32-msvc.html">Makefile for Win32/msvc</a>
-(Microsoft Visual C++).<br>
-
-
-<hr>
-<h2>Makefile Templates</h2>
-
-The tmake distribution includes three makefile templates and one
-configuration file for each platform/compiler combination. The
-<code>TMAKEPATH</code> environment variable tells tmake where to find
-these files:
-<p>
-<table border="0">
- <tr>
- <td>&nbsp;</td>
- <td>app.t</td>
- <td>&nbsp;</td>
- <td>Creates a makefile for building applications.</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>lib.t</td>
- <td>&nbsp;</td>
- <td>Creates a makefile for building libraries.</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>subdirs.t</td>
- <td>&nbsp;</td>
- <td>Creates a makefile for building targets in subdirectories.</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>tmake.conf</td>
- <td>&nbsp;</td>
- <td>This configuration file contains compiler options and lists
- tools and libraries.
- </tr>
-</table>
-
-
-<p>
-The hello.pro project file above does not have a <code>TEMPLATE</code> or
-a <code>CONFIG</code> variable. The default template is <tt>app</tt> (the .t
-extension is optional) and the default configuration is <tt>qt warn_on
-release</tt>.
-
-This project file produces exactly the same result as the hello.pro
-above:<pre>
- TEMPLATE = app
- CONFIG = qt warn_on release
- HEADERS = hello.h
- SOURCES = hello.cpp main.cpp
- TARGET = hello
-</pre>
-
-
-
-<h4>Makefile Configuration</h4>
-
-<p>
-The <code>CONFIG</code> variable is recognized by both the app.t and lib.t
-templates and specifies what compiler options to use and which extra
-libraries to link in.
-
-These options control the compilation flags:
-<p>
-<table border="0">
- <tr>
- <td>&nbsp;</td>
- <td>release</td>
- <td>&nbsp;</td>
- <td>Compile with optimization enabled, ignored if
- "debug" is specified.</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>debug</td>
- <td>&nbsp;</td>
- <td>Compile with debug options enabled.</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>warn_on</td>
- <td>&nbsp;</td>
- <td>The compiler should emit more warnings than normally, ignored if
- "warn_off" is specified.</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>warn_off</td>
- <td>&nbsp;</td>
- <td>The compiler should emit no warnings or as few as possible.</td>
- </tr>
-</table>
-
-<p>
-These options defines the application/library type:
-<p>
-<table border="0">
- <tr>
- <td>&nbsp;</td>
- <td>qt</td>
- <td>&nbsp;</td>
- <td>The target is a Qt application/library and requires Qt header
- files/library.</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>opengl</td>
- <td>&nbsp;</td>
- <td>The target requires the OpenGL (or Mesa) headers/libraries.</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>x11</td>
- <td>&nbsp;</td>
- <td>The target is a X11 application or library.</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>windows</td>
- <td>&nbsp;</td>
- <td>The target is a Win32 window application (app.t only).</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>console</td>
- <td>&nbsp;</td>
- <td>The target is a Win32 console application (app.t only).</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>dll</td>
- <td>&nbsp;</td>
- <td>The target is a shared object/DLL.</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>staticlib</td>
- <td>&nbsp;</td>
- <td>The target is a static library (lib.t only).</td>
- </tr>
-</table>
-
-<p>
-As an example, if the hello application uses both Qt and OpenGL and you
-want to compile it for debugging, your <code>CONFIG</code> line should
-read:<pre>
- CONFIG = qt opengl debug
-</pre>
-
-<p>
-The most common tmake options and project variables are described here.
-See the tmake <a href="tmake_ref.html">reference manual</a> for
-details.<p>
-
-
-
-<h4>The Application Template</h4>
-
-The application template, app.t, lets you compile and link executable
-programs or shared objects (DLLs).
-
-This template recognizes several variabless.
-<p>
-<table border="0">
- <tr>
- <td>&nbsp;</td>
- <td>HEADERS</td>
- <td>&nbsp;</td>
- <td>Header files.</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>SOURCES</td>
- <td>&nbsp;</td>
- <td>Source files.</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>TARGET</td>
- <td>&nbsp;</td>
- <td>Name of executable (adds .exe if on Windows).</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>DESTDIR</td>
- <td>&nbsp;</td>
- <td>Where to put the target.</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>DEFINES</td>
- <td>&nbsp;</td>
- <td>Tell compiler to define C preprocessor macros (-D option).</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>INCLUDEPATH</td>
- <td>&nbsp;</td>
- <td>Sets the include file search path for the compiler (-I
- option).
- </td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>DEPENDPATH</td>
- <td>&nbsp;</td>
- <td>Sets the dependency search path for tmake.</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>DEF_FILE</td>
- <td>&nbsp;</td>
- <td>Win32 only: Link with a .def file.</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>RC_FILE</td>
- <td>&nbsp;</td>
- <td>Win32 only: Use a .rc file (compile to temporary .res).
- </td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>RES_FILE</td>
- <td>&nbsp;</td>
- <td>Win32 only: Link with a .res file.
- </td>
- </tr>
-</table>
-
-<p>
-
-
-<h4>The Library Template</h4>
-
-The library template, lib.t, lets you compile and create static or shared
-libraries.
-
-<p>
-The lib.t template supports the same project variables as app.t, but also
-<code>VERSION</code>. <code>VERSION</code> is the version number of the
-target library, e.g. 1.40. The version is important for shared libraries.
-
-
-
-<h4>The Subdirs Template</h4>
-
-The subdirs template, subdirs.t, lets you invoke make in subdirectories.
-
-<p>The <code>SUBDIRS</code> variable contains the name of all subdirectories to
-be processed.
-
-
-<h4>Special Templates for Microsoft Visual C++</h4>
-
-If you have Microsoft Visual C++ 5.0, you can use two special templates to
-generate a MSVC++ IDE project (.dsp file). After you have generated
-e.g. hello.dsp, choose "File"->"Open Workspace" and select the hello.dsp
-file. Visual C++ will then create a workspace (.dsw file) for you.<p>
-<table border="0">
- <tr>
- <td>&nbsp;</td>
- <td>vcapp.t</td>
- <td>&nbsp;</td>
- <td>Creates an application project file (Microsoft Visual C++ 5.0
- only).</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>vclib.t</td>
- <td>&nbsp;</td>
- <td>Creates a library project file (Microsoft Visual C++ 5.0
- only).</td>
- </tr>
-</table>
-
-<p>
-Run tmake to create a hello.dsp file (use -t to override the default
-template):<pre>
- tmake -t vcapp -o hello.dsp hello.pro
-</pre>
-
-
-<hr>
-<h2>Project File Syntax</h2>
-
-The tmake project file has a very simple syntax. You may set
-project variables, append to project variables, remove from
-project variable and substitute project variables.
-
-To set a project variable:<pre>
- HEADERS = gui.h xml.h url.h
-</pre>
-
-If you cannot fit everything on one line, use '\' to split it up:<pre>
- HEADERS = gui.h \
- xml.h \
- url.h
-</pre>
-
-<p>
-Project variables contains lists of items (such as header files,
-compiler options etc.) and use whitespace to separate the items.
-This means that tmake cannot deal with items containing whitespace.
-The INCLUDEPATH variable is an exception. If INCLUDEPATH contains
-one or more semicolons (;), tmake uses the semicolon to separate
-the include directories, hence you can have include directories
-containing whitespace (this is quite common on Windows).
-
-<p>
-Here is an example:<pre>
- INCLUDEPATH = C:\Program Files\DBLib\Include;C:\qt\include
-</pre>
-
-<p>
-tmake supports <em>project variable expension</em>. Use $$ to expand
-any project variable:<pre>
- ALLFILES = $$HEADERS $$SOURCES
-</pre>
-
-<p>
-Most often you assign some value to a project variable, but you can
-also add to, remove from or replace parts of a project variable.<pre>
- A = abc
- X = xyz
- A += def # A = abc def
- X *= xyz # X = xyz
- B = $$A # B = abc def
- B -= abc # B = def
- X /= s/y/Y/ # X = xYz
-</pre>
-The *= operation adds the value if the variable does not already contain it.
-The /= operation performs regular expression substitution.
-
-<p>
-You can also set variables from the command line when running the tmake
-program. For instance, if you want to generate a makefile with debug
-information:<pre>
- tmake "CONFIG+=debug" hello.pro
-</pre>
-
-<p>
-Use the <tt>unix:</tt> or <tt>win32:</tt> (conditional) qualifier if you want a
-platform-specific variable:<pre>
- SOURCES = common.cpp # common for all platforms
- unix:SOURCES += unix.cpp # additional sources for Unix
- win32:SOURCES += win32.cpp # additional sources for Windows
- unix:LIBS += -lm # on Unix we need the math lib
-</pre>
-If none of the platforms match, tmake looks for the variable in CONFIG
-variable:<pre>
- debug:SOURCES += dbgstuff.cpp # additional source for debugging
-</pre>
-
-Finally, you can set platform and compiler-dependent variables:<pre>
- linux-g++:TMAKE_CFLAGS = -fno-rtti
-</pre>
-
-<p>
-You may define your own project variables to be used by custom templates. A
-project variable is stored in <code>%project</code>, which is an associative
-Perl array. Access it like this: <code>$project{"var"}</code> or via the
-function <code>Project("var")</code>. For example, after reading
-"hello.pro", <code>$project{"SOURCES"}</code> contains "hello.cpp
-main.cpp".<p>
-
-
-<hr>
-<h2><a name="usage"></a>Running tmake</h2>
-
-Usage:<pre>
- tmake [options] <em>project files or project settings</em>
-</pre>
-Options:<pre>
- -e expr Evaluate the Perl expression. Ignores the template file.
- -nodepend Don't generate dependency information.
- -o <em>file</em> Write output to <em>file</em> instead of stdout.
- -t <em>file</em> Specify a template <em>file</em>.
- -unix Force tmake into Unix mode.
- -v Verbose/debugging on.
- -win32 Force tmake into Win32 mode.
-</pre>
-
-The -t option overrides any <code>TEMPLATE</code> variable in the project file.
-<p>
-The default project file extension is ".pro". The default template file
-extension is ".t". If you do not specify these extension tmake will
-automatically add them for you.
-
-<p>
-Example of basic use:<pre>
- tmake hello -o Makefile
-</pre>
-
-<p>
-Example of how to create a makefile with debugging information:<pre>
- tmake "CONFIG+=debug" hello -o Makefile
-</pre>
-
-<p>
-Exmaple of how to specify a TMAKEPATH:<pre>
- tmake "TMAKEPATH=/local/tmake/lib/hpux-g++" hello.pro -o Makefile
-</pre>
-
-Example of how to evaluate a perl expression (print names of headers
-and source files):<pre>
- tmake hello -e 'Expand("HEADERS","SOURCES")'
-</pre>
-
-<hr>
-<h2><a name="progen"></a>The progen Utility</h2>
-
-The progen utility creates project files for you. It can be used like
-this:<pre>
- progen -n hello -o hello.pro
-</pre>
-If no .cpp or .h files are specified on the command line, progen
-searches for .cpp and .h (except moc_*.cpp) in the current directory
-and below.
-<p>
-Usage:<pre>
- progen [options] [<em>C/C++ header files and source files</em>]
-</pre>
-Options:<pre>
- -lower Lower-case letters in filenames (useful on Windows).
- -n <em>name</em> Specify a project name (<code>TARGET</code>).
- -o <em>file</em> Write output to <em>file</em> instead of stdout.
- -t <em>file</em> Specify a template <em>file</em>.
-</pre>
-
-
-<hr>
-<h2>Advanced Topics</h2>
-
-In most cases you will be happy with using tmake as described above, but
-sometimes you need to add special compiler options or even add new
-makefile rules. This chapter describes how to customize your makefiles.
-
-<h4>Conditional Project Settings</h4>
-
-If you need a special compiler option etc., you can add platform-dependent
-settings in your project file:<pre>
- solaris-cc:TMAKE_CC = /opt/bin/CC_5.0
- solaris-cc:TMAKE_CFLAGS = -pts
- unix:TMAKE_LIBS = -lXext
- win32:INCLUDEPATH = c:\myinclude
- win32-borland:DEFINES = NO_BOOL
-</pre>
-
-You can prefix a project variable with unix: or win32: to make it specific for
-either Unix or Windows. You can also prefix a variable with
-<em>platform-compiler</em>
-
-<h4>Your Own Templates</h4>
-
-If you know Perl programming, there is virtually no limitation to what you
-can do with tmake. First you need to know how tmake works.
-
-<h4>Template Processing</h4>
-
-When you run tmake, it first reads the <tt>tmake.conf</tt> file.
-This configuration file has the same syntax as the project file.
-
-tmake then reads the project file and sets the project variables it
-finds, e.g. <code>HEADERS</code>, <code>SOURCES</code> etc.
-
-All variables and values are stored in a global associative Perl hash
-array called <code>project</code>. For example,
-<code>$project{"SOURCES"}</code> contains "hello.cpp main.cpp"
-after processing hello.pro.
-
-When both the <tt>tmake.conf</tt> and the project files have been
-read, tmake starts reading the template file line by line and
-executes any Perl code it finds in the template.
-
-<ul>
-<li>Anything after <code>#$</code> until newline is
- evaluated as perl code. The perl code is substituted
- with the contents of the <code>$text</code>
- variable.
-<li>Block of perl code: <code>#${</code> until
- <code>#$}</code>.
-<li>Comments; <code>#!</code> until newline is stripped.
-<li>Anything else is copied directly from the template to
- the output.
-</ul>
-
-<p>
-Example:<pre>
- #! This is a comment which will be removed.
- This text will appear in the output.
- #$ $text = "The header file(s) are: " . $project{"HEADERS"};
- # This text also appears in the output.
- #${
- $a = 12;
- $b = 13;
- $text = $a * $b;
- #$}
- That's all.
-</pre>
-Output:<pre>
- This text will appear in the output.
- The header file(s) are: hello.h
- # This text also appears in the output.
- 156
- That's all.
-</pre>
-
-
-<h3>Using tmake With Lex and Yacc</h3>
-
-The standard tmake templates knows how to process C and C++ files, but
-sometimes you need to process additional files and link them into your
-project. A typical example is to process lex and yacc files when you're
-building a parser.
-
-<p>
-Parser template:<pre>
- #!
- #! parser.t: This is a custom template for building a parser
- #!
- #$ IncludeTemplate("app.t");
-
- ####### Lex/yacc programs and options
-
- LEX = flex
- YACC = #$ $text = ($is_unix ? "yacc -d" : "byacc -d");
-
- ####### Lex/yacc files
-
- LEXIN = #$ Expand("LEXINPUT");
- LEXOUT = lex.yy.c
- YACCIN = #$ Expand("YACCINPUT");
- YACCOUT = y.tab.c
- YACCHDR = y.tab.h
- PARSER = #$ Expand("PARSER");
-
- ####### Process lex/yacc files
-
- $(LEXOUT): $(LEXIN)
- $(LEX) $(LEXIN)
-
- $(PARSER): $(YACCIN) $(LEXOUT)
- $(YACC) $(YACCIN)
- #$ $text = ($is_unix ? "-rm -f " : "-del ") . '$(PARSER)';
- #$ $text = ($is_unix ? "-mv " : "-ren ") . '$(YACCOUT) $(PARSER)';
-</pre>
-
-The parser template adds some extra rules to the application template
-in order to build the lex and yacc portions of the project. This
-template is portable across Unix and Windows since it generates different
-commands depending on the <code>$is_unix</code> variable.
-
-<p>
-To learn more about the Expand() function and other Perl functions which
-tmake provides, consult the <a href="tmake_ref.html">reference manual</a>.
-
-<p>
-Example project file:<pre>
- TEMPLATE = parser.t
- CONFIG = console release
- LEXINPUT = lexer.l
- YACCINPUT = grammar.y
- PARSER = parser.cpp
- SOURCES = $$PARSER \
- node.cpp \
- asmgen.cpp
- TARGET = parser
-</pre>
-
-Here we use macro expansion <code>$$PARSER</code> to avoid writing parser.cpp
-two places.
-
-
-<h3>Counting the Number of Code Lines</h3>
-
-tmake is generic since it is based on Perl. You can create your own
-templates for other purposes than producing makefiles. Here is an example
-template that counts the number of code lines in our project.
-
-<p>
-Template wc.t:<pre>
- #! Template that count number of C++ lines.
- The number of C++ code lines for #$ $text=$project_name;
- #${
- $files = $project{"HEADERS"} . " " . $project{"SOURCES"};
- $text = `wc -l $files`;
- #$}
-</pre>
-Run it:<pre>
- tmake -t wc hello
-</pre>
-Output:<pre>
- The number of C++ code lines for hello.pro
- 25 hello.h
- 98 hello.cpp
- 38 main.cpp
- 161 total
-</pre>
-This will only work if the wc program is installed on your system.
-
-
-</body></html>
diff --git a/tmake/doc/tmake_ref.html b/tmake/doc/tmake_ref.html
deleted file mode 100644
index c9124c4..0000000
--- a/tmake/doc/tmake_ref.html
+++ /dev/null
@@ -1,463 +0,0 @@
-<!doctype HTML public "-//W3C//DTD HTML 3.2//EN">
-<html><head><title>
-Reference Manual - tmake
-</title></head><body bgcolor="#ffffff">
-<p><h1 align=center>Reference Manual - tmake</h1>
-
-<hr>
-<h2>Project Variable Reference</h2>
-
-<h4><a name="ALL_DEPS"></a>ALL_DEPS</h4>
-Specifies additional dependencies for the makefile target "all:".<p>
-
-
-<h4><a name="CLEAN_FILES"></a>CLEAN_FILES</h4>
-Specifies additional files to be removed for "make clean".<p>
-Example:<pre>
- CLEAN_FILES = core *~
-</pre>
-
-
-<h4><a name="CONFIG"></a>CONFIG</h4>
-Sets the make configuration. It tells the tmake templates what compiler
-options to use and which extra libraries to link in.<p>
-These options control the compilation flags:
-<p>
-<table border="0">
- <tr>
- <td>&nbsp;</td>
- <td>release</td>
- <td>&nbsp;</td>
- <td>Compile with optimization enabled, ignored if
- "debug" is specified.</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>debug</td>
- <td>&nbsp;</td>
- <td>Compile with debug options enabled.</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>warn_on</td>
- <td>&nbsp;</td>
- <td>The compiler should emit more warnings than normally, ignored if
- "warn_off" is specified.</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>warn_off</td>
- <td>&nbsp;</td>
- <td>The compiler should emit no warnings or as few as possible.</td>
- </tr>
-</table>
-
-<p>
-These options defines the application/library type:
-<p>
-<table border="0">
- <tr>
- <td>&nbsp;</td>
- <td>qt</td>
- <td>&nbsp;</td>
- <td>The target is a Qt application/library and requires Qt header
- files/library.</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>opengl</td>
- <td>&nbsp;</td>
- <td>The target requires the OpenGL (or Mesa) headers/libraries.</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>x11</td>
- <td>&nbsp;</td>
- <td>The target is a X11 application (app.t only).</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>windows</td>
- <td>&nbsp;</td>
- <td>The target is a Win32 window application (app.t only).</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>console</td>
- <td>&nbsp;</td>
- <td>The target is a Win32 console application (app.t only).</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>dll</td>
- <td>&nbsp;</td>
- <td>The target is a shared object/DLL (app.t only).</td>
- </tr>
- <tr>
- <td>&nbsp;</td>
- <td>staticlib</td>
- <td>&nbsp;</td>
- <td>The target is a static library (lib.t only).</td>
- </tr>
-</table>
-
-
-<h4><a name="DEFINES"></a>DEFINES</h4>
-Specifies C/C++ macros (-D compiler option). On Windows you need
-to let DEFINES contain "QT_DLL" if you are building a Qt program
-which should link with the Qt DLL.
-
-
-<h4><a name="DEF_FILE"></a>DEF_FILE</h4>
-Win32/app.t only: Specifies a .def file.
-
-
-<h4><a name="DESTDIR"></a>DESTDIR</h4>
-Specifies where to put the target file.
-Example:<pre>
- DESTDIR = ../../lib
-</pre>
-You must create this directory before running make.
-
-
-<h4><a name="HEADERS"></a>HEADERS</h4>
-Defines the header files of the project.
-
-
-<h4><a name="INCPATH"></a>INCPATH</h4>
-This variable is generated from <code>INCLUDEPATH</code>. The ';' or ':'
-separators have been replaced by ' ' (single space). This makes it
-easier to split. qtapp.t and other templates expand
-<code>INCPATH</code> to set -I options for the C++ compiler.
-
-
-<h4><a name="INCLUDEPATH"></a>INCLUDEPATH</h4>
-This variable specifies the #include directories. It can be set in the
-project file, or by the <a href="#AddIncludePath">AddIncludePath()</a>
-function.<p>
-Example:<pre>
- INCLUDEPATH = c:\msdev\include d:\stl\include
-</pre>
-Use ';' or space as the directory separator.
-
-
-<h4><a name="LIBS"></a>LIBS</h4>
-Defines additional libraries to be linked in when creating an application
-or a shared library. You probably want to use a platform qualifier since
-libraries are specified differently on Unix and Win32.<p>
-Example:<pre>
- unix:LIBS = -lXext -lm
- win32:LIBS = ole32.lib
-</pre>
-
-
-<h4><a name="MOC_DIR"></a>MOC_DIR</h4>
-Specifies where to put the temporary moc output files. By default they
-are stored in the directory where the moc input files are.
-<p>
-Example:<pre>
- MOC_DIR = tmp
-</pre>
-You must create this directory before running make.
-<p>
-See also: <a href="#OBJECTS_DIR">OBJECTS_DIR</a>.
-
-
-<h4><a name="OBJECTS"></a>OBJECTS</h4>
-This varialble is generated from <code>SOURCES</code> by the StdInit() function.
-The extension of each source file has been replaced by .o (Unix) or .obj
-(Win32).<p>
-Example:<pre>
- SOURCES = a.x b.y
-</pre>
-Then <code>OBJECTS</code> become "a.o b.o" on Unix and "a.obj b.obj" on
-Win32.
-
-
-<h4><a name="OBJECTS_DIR"></a>OBJECTS_DIR</h4>
-Specifies where to put object files. By default they are stored in
-the directory where the source files are.<p>
-Example:<pre>
- OBJECTS_DIR = tmp
-</pre>
-You must create this directory before running make.
-<p>
-See also: <a href="#MOC_DIR">MOC_DIR</a>.
-
-
-<h4><a name="OBJMOC"></a>OBJMOC</h4>
-This variable is generated by the <a href="#StdInit">StdInit()</a> function if
-<code>$moc_aware</code> is true. <code>OBJMOC</code> contains the name of
-all intermediate moc object files.<p>
-Example:<pre>
- HEADERS = demo.h
- SOURCES = demo.cpp main.cpp
-</pre>
-If <tt>demo.h</tt> and <tt>main.cpp</tt> define classes that use signals
-and slots (i.e. the <code>Q_OBJECT</code> "keyword" is found in these two
-files), <code>OBJMOC</code> becomes:<pre>
- OBJMOC = moc_demo.obj
-</pre>
-See also: <a href="#SRCMOC">SRCMOC</a>.
-
-
-<h4><a name="PROJECT"></a>PROJECT</h4>
-This is the name of the project. It defaults to the name of the project
-file, excluding the .pro extension.
-
-
-<h4><a name="RC_FILE"></a>RC_FILE</h4>
-Win32/app.t only: Specifies a .rc file. Cannot be used with the RES_FILE
-variable.
-
-
-<h4><a name="RES_FILE"></a>RES_FILE</h4>
-Win32/app.t only: Specifies a .res file. You can either specify a
-.rc file or one or more .res files.
-
-
-<h4><a name="SOURCES"></a>SOURCES</h4>
-Defines the source files of the project.
-
-
-<h4><a name="SRCMOC"></a>SRCMOC</h4>
-This variable is generated by the <a href="#StdInit">StdInit()</a> function if
-<code>CONFIG</code> contains "qt". <code>SRCMOC</code> contains the name of
-all intermediate moc files.<p>
-Example:<pre>
- HEADERS = demo.h
- SOURCES = demo.cpp main.cpp
-</pre>
-If <tt>demo.h</tt> and <tt>main.cpp</tt> define classes that use signals
-and slots (i.e. the <code>Q_OBJECT</code> "keyword" is found in these two
-files), <code>SRCMOC</code> becomes:<pre>
- SRCMOC = moc_demo.cpp main.moc
-</pre>
-See also: <a href="#OBJMOC">OBJMOC</a>.
-
-
-<h4><a name="TARGET"></a>TARGET</h4>
-Sets the makefile target, i.e. what program to build.
-
-
-<h4><a name="TEMPLATE"></a>TEMPLATE</h4>
-Sets the default template. This can be overridden by the tmake -t
-<a href="tmake.html#usage">option</a>.
-
-
-<h4><a name="TMAKE_CC"></a>TMAKE_CC</h4>
-Contains the name of the compiler.
-
-
-<h4><a name="TMAKE_CFLAGS"></a>TMAKE_CFLAGS</h4>
-Contains the default compiler flags.
-
-
-<h4><a name="TMAKE_FILEVARS"></a>TMAKE_FILEVARS</h4>
-Tells tmake which variables contain file names. This is because tmake
-on Windows replace the directory separator / with \.
-
-
-<hr>
-<h2>Function Reference</h2>
-This section contains a brief description of some important
-tmake functions used by the templates.
-
-
-<h3><a name="AddIncludePath"></a>AddIncludePath(path)</h3>
-Adds <em>path</em> to the include path variable,
-<a href="#INCLUDEPATH">INCLUDEPATH</a>. The include path is used
-for two purposes:<ol>
-<li>Searching files when generating include dependencies.
-<li>Setting -I options for the C/C++ compiler.
-</ol>
-<p>
-Example:<pre>
- #$ AddIncludePath('$QTDIR/include;/local/include');
-</pre>
-
-
-<h3>BuildMocObj(objects,sources)</h3>
-Creates build rules for moc source files. Generates
-include dependencies.<p>
-Example:<pre>
- #$ BuildMocObj($project{"OBJMOC"},$project{"SRCMOC"});
-</pre>Output:<pre>
- moc_hello.o: moc_hello.cpp \
- hello.h \
- ...
-</pre>
-
-<h3>BuildMocSrc(files)</h3>
-Creates moc source files from C++ files containing classes that
-define signals and slots. For a header file <tt>x.h</tt>, the
-generated moc file is called <tt>moc_x.h</tt>. For a source file
-<tt>y.cpp</tt>, the generates moc file is called <tt>y.moc</tt> and
-should be #include'd by <tt>y.cpp</tt>.<p>
-Example:<pre>
- #$ BuildMocSrc($project{"HEADERS"});
- #$ BuildMocSrc($project{"SOURCES"});
-</pre>Output:<pre>
- moc_hello.cpp: hello.h
- $(MOC) hello.h -o moc_hello.cpp
-</pre>
-
-
-<h3>BuildObj(objects,sources)</h3>
-Creates build rules for source files. Generates
-include dependencies.<p>
-Example:<pre>
- #$ BuildObj($project{"OBJECTS"},$project{"SOURCES"});
-</pre>Output:<pre>
- hello.o: hello.cpp \
- hello.h \
- ...
-
- main.o: main.cpp \
- hello.h \
- ...
-</pre>
-
-
-<h3>Config(string)</h3>
-Returns true if the <code>CONFIG</code> variable contains the given string.
-<p>Example:<pre>
- #$ if ( Config("release") { }
-</pre>
-
-
-<h3>DisableOutput()</h3>
-Call this function to force tmake to generate no output until
-EnableOutput() is called.
-<p>Example:<pre>
- #$ Config("debug") && DisableOutput();
- Anything here is skipped if CONFIG contains "debug".
- #$ Config("debug") && EnableOutput();
-</pre>
-
-
-<h3>EnableOutput()</h3>
-Enables tmake output after DisableOutput() was called.
-
-
-<h3>Expand(var)</h3>
-Expands a project variable. Equivalent to <code>$text = $project{$var}</code>.
-<p>Example:<pre>
- VERSION = #$ Expand("VERSION");
-</pre>Output:<pre>
- VERSION = 1.1
-</pre>
-
-<h3>ExpandGlue(var,prepend,glue,append)</h3>
-Expands a $project{} variable, splits on whitespace
-and joins with $glue. $prepend is put at the start
-of the string and $append is put at the end of the
-string. The resulting string ($text) becomes "" if
-the project variable is empty or not defined.<p>
-Example:<pre>
- clear:
- #$ ExpandGlue("OBJECTS","-del","\n\t-del ","");
-</pre>Output (Windows NT):<pre>
- clear:
- -del hello.obj
- -del main.obj
-</pre>
-
-
-<h3>ExpandList(var)</h3>
-This function is suitable for expanding lists of files.
-Equivalent with <code>ExpandGlue($var,""," \\\n\t\t","")</code>.<p>
-Example:<pre>
- OBJECTS = #$ ExpandList("OBJECTS");
-</pre>Output:<pre>
- OBJECTS = hello.o \
- main.o
-</pre>
-
-
-<h3>ExpandPath(var,prepend,glue,append)</h3>
-Similar to ExpandGlue, except that it splits the items on a semicolon
-instead of space (if the variable contains at least one semicolon).
-
-
-<h3>IncludeTemplate(file)</h3>
-Includes a template file. The ".t" extension is optional.<p>
-Example:<pre>
- #$ IncludeTemplate("mytemplate");
-</pre>
-
-
-<h3>Now()</h3>
-Sets $text to the current date and time.<p>
-Example:<pre>
- # Generated at #$ Now()
-</pre>Output:<pre>
- # Generated at 12:58, 1996/11/19
-</pre>
-
-
-<h3>Project(strings)</h3>
-This is a powerful function for setting and reading project
-variables. Returns the resulting project variables (joined with space
-between).
-<p>Examples:<pre>
-# Get a project variable:
- $s = Project("TEMPLATE"); -> $s = "TEMPLATE"
-
-# Set a project variable:
- Project("TEMPLATE = lib"); -> TEMPLATE = lib
- Project("CONFIG =";) -> CONFIG empty
-
-# Append to a project variable:
- Project("CONFIG = qt"); -> CONFIG = qt
- Project("CONFIG += debug"); -> CONFIG = qt debug
-
-# Append to a project variable if it does not contain the value already:
- Project("CONFIG = qt release"); -> CONFIG = qt release
- Project("CONFIG *= qt"); -> CONFIG = qt release
- Project("CONFIG *= opengl"); -> CONFIG = qt release opengl
-
-# Subtract from a project variable:
- Project("THINGS = abc xyz"); -> THINGS = abc xyz
- Project("THINGS -= abc"); -> THINGS = xyz
-
-# Search/replace on a project variable:
- Project("CONFIG = tq opengl"); -> CONFIG = tq opengl
- Project("CONFIG /= s/tq/qt/"); -> CONFIG = qt opengl
-
-# The operations can be performed on several project variables at a time.
-
- Project("TEMPLATE = app", "CONFIG *= opengl", "THINGS += klm");
-</pre>
-
-
-<h3><a name="ScanProject"></a>ScanProject(file)</h3>
-Scans a project file and stores the project variables and values in the
-global associative <code>%project</code> array.
-
-
-<h3><a name="StdInit"></a>StdInit()</h3>
-Standard initialization of tmake. StdInit() should be
-called from one of the first lines in the template.<p>
-
-This function creates some new project variables:<ul>
-<li><code><a href="#OBJECTS">OBJECTS</a></code>
- - Object files corresponding to
- <code><a href="#SOURCES">SOURCES</a></code>.
-<li><code><a href="#SRCMOC">SRCMOC</a></code> - moc source files.
-<li><code><a href="#OBJMOC">OBJMOC</a></code> - moc object files.
-</ul>
-
-The moc-related variables are created only if <code>CONFIG</code> contains "qt"
-
-
-<h3>Substitute(string)</h3>
-This function takes a string and substitutes any occurrence of $$var
-with the actual content of the variable. Returns the substituted string.
-Also sets $text.
-<p>
-Important: Use single quotes around the string, otherwise perl will expand
-any $vars it finds.
-<p>Example:<pre>
- Substitute('Project name: $$PROJECT, uses template $$TEMPLATE');
-</pre>
diff --git a/tmake/example/hello.cpp b/tmake/example/hello.cpp
deleted file mode 100644
index 4868c4d..0000000
--- a/tmake/example/hello.cpp
+++ /dev/null
@@ -1,102 +0,0 @@
-/****************************************************************************
-**
-**
-** Copyright (C) 1992-1998 Troll Tech AS. All rights reserved.
-**
-** This file is part of an example program for Qt. This example
-** program may be used, distributed and modified without limitation.
-**
-*****************************************************************************/
-
-#include "hello.h"
-#include <qpushbutton.h>
-#include <qtimer.h>
-#include <qpainter.h>
-#include <qpixmap.h>
-
-
-/*
- Constructs a Hello widget. Starts a 40 ms animation timer.
-*/
-
-Hello::Hello( const char *text, QWidget *parent, const char *name )
- : QWidget(parent,name), t(text), b(0)
-{
- QTimer *timer = new QTimer(this);
- connect( timer, SIGNAL(timeout()), SLOT(animate()) );
- timer->start( 40 );
-
- resize( 200, 100 );
-}
-
-
-/*
- This private slot is called each time the timer fires.
-*/
-
-void Hello::animate()
-{
- b = (b + 1) & 15;
- repaint( FALSE );
-}
-
-
-/*
- Handles mouse button release events for the Hello widget.
-
- We emit the clicked() signal when the mouse is released inside
- the widget.
-*/
-
-void Hello::mouseReleaseEvent( QMouseEvent *e )
-{
- if ( rect().contains( e->pos() ) )
- emit clicked();
-}
-
-
-/*
- Handles paint events for the Hello widget.
-
- Flicker-free update. The text is first drawn in the pixmap and the
- pixmap is then blt'ed to the screen.
-*/
-
-void Hello::paintEvent( QPaintEvent * )
-{
- static int sin_tbl[16] = {
- 0, 38, 71, 92, 100, 92, 71, 38, 0, -38, -71, -92, -100, -92, -71, -38};
-
- if ( t.isEmpty() )
- return;
-
- // 1: Compute some sizes, positions etc.
- QFontMetrics fm = fontMetrics();
- int w = fm.width(t) + 20;
- int h = fm.height() * 2;
- int pmx = width()/2 - w/2;
- int pmy = height()/2 - h/2;
-
- // 2: Create the pixmap and fill it with the widget's background
- QPixmap pm( w, h );
- pm.fill( this, pmx, pmy );
-
- // 3: Paint the pixmap. Cool wave effect
- QPainter p;
- int x = 10;
- int y = h/2 + fm.descent();
- int i = 0;
- p.begin( &pm );
- p.setFont( font() );
- while ( t[i] ) {
- int i16 = (b+i) & 15;
- p.setPen( QColor((15-i16)*16,255,255,QColor::Hsv) );
- p.drawText( x, y-sin_tbl[i16]*h/800, &t[i], 1 );
- x += fm.width( t[i] );
- i++;
- }
- p.end();
-
- // 4: Copy the pixmap to the Hello widget
- bitBlt( this, pmx, pmy, &pm );
-}
diff --git a/tmake/example/hello.h b/tmake/example/hello.h
deleted file mode 100644
index 07fb8c5..0000000
--- a/tmake/example/hello.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/****************************************************************************
-**
-**
-** Copyright (C) 1992-1998 Troll Tech AS. All rights reserved.
-**
-** This file is part of an example program for Qt. This example
-** program may be used, distributed and modified without limitation.
-**
-*****************************************************************************/
-
-#ifndef HELLO_H
-#define HELLO_H
-
-#include <qwidget.h>
-
-
-class Hello : public QWidget
-{
- Q_OBJECT
-public:
- Hello( const char *text, QWidget *parent=0, const char *name=0 );
-signals:
- void clicked();
-protected:
- void mouseReleaseEvent( QMouseEvent * );
- void paintEvent( QPaintEvent * );
-private slots:
- void animate();
-private:
- QString t;
- int b;
-};
-
-#endif
diff --git a/tmake/example/hello.pro b/tmake/example/hello.pro
deleted file mode 100644
index a299923..0000000
--- a/tmake/example/hello.pro
+++ /dev/null
@@ -1,3 +0,0 @@
-HEADERS = hello.h
-SOURCES = hello.cpp main.cpp
-TARGET = hello
diff --git a/tmake/example/main.cpp b/tmake/example/main.cpp
deleted file mode 100644
index 4b55a58..0000000
--- a/tmake/example/main.cpp
+++ /dev/null
@@ -1,38 +0,0 @@
-//
-// File: main.cpp
-//
-// A small Qt example application written by Troll Tech.
-//
-// It displays a text in a window and quits when you click
-// the mouse in the window.
-//
-
-#include "hello.h"
-#include <qapp.h>
-
-
-/*
- The program starts here. It parses the command line and build a message
- string to be displayed by the Hello widget.
-*/
-
-int main( int argc, char **argv )
-{
- QApplication a(argc,argv);
- QString s;
- for ( int i=1; i<argc; i++ ) {
- s += argv[i];
- if ( i<argc-1 )
- s += " ";
- }
- if ( s.isEmpty() )
- s = "Hello, World";
- Hello h( s );
- h.setCaption( "Qt says hello" );
- QObject::connect( &h, SIGNAL(clicked()), &a, SLOT(quit()) );
- h.setFont( QFont("times",32,QFont::Bold) ); // default font
- h.setBackgroundColor( white ); // default bg color
- a.setMainWidget( &h );
- h.show();
- return a.exec();
-}
diff --git a/tmake/example/wc.t b/tmake/example/wc.t
deleted file mode 100644
index dc041b5..0000000
--- a/tmake/example/wc.t
+++ /dev/null
@@ -1,6 +0,0 @@
-#! Template that count number of C++ lines
-The number of C++ code lines for #$ $text=$project_name;
-#${
- $files = $project{"HEADERS"} . " " . $project{"SOURCES"};
- $text = `wc -l $files`;
-#$}
diff --git a/tmake/lib/aix-g++/app.t b/tmake/lib/aix-g++/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/aix-g++/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/aix-g++/lib.t b/tmake/lib/aix-g++/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/aix-g++/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/aix-g++/subdirs.t b/tmake/lib/aix-g++/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/aix-g++/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/aix-g++/tmake.conf b/tmake/lib/aix-g++/tmake.conf
deleted file mode 100755
index 897d509..0000000
--- a/tmake/lib/aix-g++/tmake.conf
+++ /dev/null
@@ -1,58 +0,0 @@
-#
-#
-#
-# tmake configuration for aix-g++
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = gcc
-TMAKE_CFLAGS =
-TMAKE_CFLAGS_WARN_ON = -Wall -W
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O2
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB =
-TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
-
-TMAKE_CXX = g++
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 = /usr/X11R6/include
-TMAKE_LIBDIR_X11 = /usr/X11R6/lib
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL = /usr/X11R6/include
-TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
-
-TMAKE_LINK = g++
-TMAKE_LINK_SHLIB =
-TMAKE_LFLAGS =
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHLIB =
-TMAKE_LFLAGS_SONAME =
-
-TMAKE_LIBS =
-TMAKE_LIBS_X11 = -lXext -lX11 -lm
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cqs
-TMAKE_RANLIB =
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/aix-xlc/app.t b/tmake/lib/aix-xlc/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/aix-xlc/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/aix-xlc/lib.t b/tmake/lib/aix-xlc/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/aix-xlc/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/aix-xlc/subdirs.t b/tmake/lib/aix-xlc/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/aix-xlc/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/aix-xlc/tmake.conf b/tmake/lib/aix-xlc/tmake.conf
deleted file mode 100755
index 04d5f15..0000000
--- a/tmake/lib/aix-xlc/tmake.conf
+++ /dev/null
@@ -1,66 +0,0 @@
-#
-#
-#
-# tmake configuration for aix-xlc
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = xlc
-#TMAKE_CC = xlC
-TMAKE_CFLAGS = -+ -qstrict -D_BSD
-TMAKE_CFLAGS_WARN_ON =
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O
-#TMAKE_CFLAGS_RELEASE = -O3
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB =
-TMAKE_CFLAGS_YACC =
-
-TMAKE_CXX = xlC
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 =
-TMAKE_LIBDIR_X11 =
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL =
-TMAKE_LIBDIR_OPENGL =
-
-TMAKE_LINK = xlC
-TMAKE_LINK_SHLIB = ld
-TMAKE_LINK_SHLIB_CMD = /usr/lpp/xlC/bin/makeC++SharedLib -p 0 \
- -o lib$(TARGET).so.$(VER_MAJ).$(VER_MIN) \
- -lXext -lX11 $(OBJECTS) $(OBJMOC); \
- ar q lib$(TARGET).a lib$(TARGET).so.$(VER_MAJ).$(VER_MIN); \
- ranlib lib$(TARGET).a; \
- mv lib$(TARGET).a $(DESTDIR)
-TMAKE_LFLAGS =
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHLIB =
-TMAKE_LFLAGS_SONAME =
-
-TMAKE_LIBS =
-TMAKE_LIBS_X11 = -lXext -lX11 -lm
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cq
-TMAKE_RANLIB = ranlib
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/beos-g++/app.t b/tmake/lib/beos-g++/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/beos-g++/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/beos-g++/lib.t b/tmake/lib/beos-g++/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/beos-g++/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/beos-g++/subdirs.t b/tmake/lib/beos-g++/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/beos-g++/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/beos-g++/tmake.conf b/tmake/lib/beos-g++/tmake.conf
deleted file mode 100755
index b6649c9..0000000
--- a/tmake/lib/beos-g++/tmake.conf
+++ /dev/null
@@ -1,51 +0,0 @@
-#
-#
-#
-# tmake configuration for linux-g++
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = gcc
-TMAKE_CFLAGS =
-TMAKE_CFLAGS_WARN_ON = -Wall -W
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE =
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB = -fPIC
-TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
-
-TMAKE_CXX = g++
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-
-TMAKE_LINK = g++
-TMAKE_LINK_SHLIB = g++
-TMAKE_LFLAGS = -Wl,-rpath=/lib:$(QTDIR)/lib
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHLIB = -shared
-TMAKE_LFLAGS_SONAME = -Wl,-soname,
-
-TMAKE_LIBS =
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cqs
-TMAKE_RANLIB =
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/bsdi-g++/app.t b/tmake/lib/bsdi-g++/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/bsdi-g++/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/bsdi-g++/lib.t b/tmake/lib/bsdi-g++/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/bsdi-g++/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/bsdi-g++/subdirs.t b/tmake/lib/bsdi-g++/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/bsdi-g++/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/bsdi-g++/tmake.conf b/tmake/lib/bsdi-g++/tmake.conf
deleted file mode 100755
index 65f7316..0000000
--- a/tmake/lib/bsdi-g++/tmake.conf
+++ /dev/null
@@ -1,61 +0,0 @@
-#
-#
-#
-# tmake configuration for bsdi-shlicc++, bsdi 4.0
-#
-# shlicc/++ is a BSDI wrapper around cc/g++ that enables shared libs
-# (info/7367)
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = gcc
-TMAKE_CFLAGS =
-TMAKE_CFLAGS_WARN_ON = -Wall -W
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O2
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB = -fPIC
-TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
-
-TMAKE_CXX = shlicc++
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 = /usr/X11R6/include
-TMAKE_LIBDIR_X11 = /usr/X11R6/lib
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL = /usr/X11R6/include
-TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
-
-TMAKE_LINK = shlicc++
-TMAKE_LINK_SHLIB = shlicc++
-TMAKE_LFLAGS = -Wl,-rpath=/lib:/usr/X11R6/lib:$(QTDIR)/lib
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHLIB = -shared
-TMAKE_LFLAGS_SONAME = -Wl,-soname,
-
-TMAKE_LIBS =
-TMAKE_LIBS_X11 = -lXext -lX11 -lm
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cqs
-TMAKE_RANLIB =
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/dgux-g++/app.t b/tmake/lib/dgux-g++/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/dgux-g++/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/dgux-g++/lib.t b/tmake/lib/dgux-g++/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/dgux-g++/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/dgux-g++/subdirs.t b/tmake/lib/dgux-g++/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/dgux-g++/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/dgux-g++/tmake.conf b/tmake/lib/dgux-g++/tmake.conf
deleted file mode 100755
index f4132d1..0000000
--- a/tmake/lib/dgux-g++/tmake.conf
+++ /dev/null
@@ -1,59 +0,0 @@
-#
-#
-#
-# tmake configuration for linux-g++
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = gcc
-TMAKE_CFLAGS =
-TMAKE_CFLAGS_WARN_ON = -Wall -W
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O2
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB = -fPIC
-TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
-
-TMAKE_CXX = g++
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 = /usr/X11R6/include
-TMAKE_LIBDIR_X11 = /usr/X11R6/lib
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL = /usr/X11R6/include
-TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
-
-TMAKE_LINK = g++
-TMAKE_LINK_SHLIB = g++
-TMAKE_LFLAGS =
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHLIB = -shared
-# "Frithjof.Brestrich" <brest@infp.fzk.de> suggests -h not -soname
-TMAKE_LFLAGS_SONAME = -Wl,-h,
-
-TMAKE_LIBS =
-TMAKE_LIBS_X11 = -lXext -lX11 -lm
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cq
-TMAKE_RANLIB =
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/freebsd-g++/app.t b/tmake/lib/freebsd-g++/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/freebsd-g++/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/freebsd-g++/lib.t b/tmake/lib/freebsd-g++/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/freebsd-g++/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/freebsd-g++/subdirs.t b/tmake/lib/freebsd-g++/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/freebsd-g++/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/freebsd-g++/tmake.conf b/tmake/lib/freebsd-g++/tmake.conf
deleted file mode 100755
index 0b3c497..0000000
--- a/tmake/lib/freebsd-g++/tmake.conf
+++ /dev/null
@@ -1,60 +0,0 @@
-#
-#
-#
-# tmake configuration for freebsd-g++
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = gcc
-TMAKE_CFLAGS = -pipe
-TMAKE_CFLAGS_WARN_ON = -Wall -W
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O2
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB = -fPIC
-TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
-
-TMAKE_CXX = g++
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 = /usr/X11R6/include
-TMAKE_LIBDIR_X11 = /usr/X11R6/lib
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL = /usr/X11R6/include
-TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
-
-TMAKE_LINK = g++
-TMAKE_LINK_SHLIB = g++
-TMAKE_LFLAGS =
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHLIB = -shared
-
-# soname does not work on fbsd 2.x
-#TMAKE_LFLAGS_SONAME = -Wl,-soname
-
-TMAKE_LIBS =
-TMAKE_LIBS_X11 = -lXext -lX11 -lm
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cqs
-TMAKE_RANLIB =
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/gnu-g++/app.t b/tmake/lib/gnu-g++/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/gnu-g++/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/gnu-g++/lib.t b/tmake/lib/gnu-g++/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/gnu-g++/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/gnu-g++/subdirs.t b/tmake/lib/gnu-g++/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/gnu-g++/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/gnu-g++/tmake.conf b/tmake/lib/gnu-g++/tmake.conf
deleted file mode 100755
index 635bc5c..0000000
--- a/tmake/lib/gnu-g++/tmake.conf
+++ /dev/null
@@ -1,58 +0,0 @@
-#
-#
-#
-# tmake configuration for linux-g++
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = gcc
-TMAKE_CFLAGS =
-TMAKE_CFLAGS_WARN_ON = -Wall -W
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O2
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB = -fPIC
-TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
-
-TMAKE_CXX = g++
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 = /usr/X11R6/include
-TMAKE_LIBDIR_X11 = /usr/X11R6/lib
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL = /usr/X11R6/include
-TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
-
-TMAKE_LINK = g++
-TMAKE_LINK_SHLIB = g++
-TMAKE_LFLAGS = -Wl,-rpath=/lib:/usr/X11R6/lib:$(QTDIR)/lib
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHLIB = -shared
-TMAKE_LFLAGS_SONAME = -Wl,-soname,
-
-TMAKE_LIBS =
-TMAKE_LIBS_X11 = -lXext -lX11 -lm
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cqs
-TMAKE_RANLIB =
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/hpux-acc/app.t b/tmake/lib/hpux-acc/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/hpux-acc/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/hpux-acc/lib.t b/tmake/lib/hpux-acc/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/hpux-acc/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/hpux-acc/subdirs.t b/tmake/lib/hpux-acc/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/hpux-acc/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/hpux-acc/tmake.conf b/tmake/lib/hpux-acc/tmake.conf
deleted file mode 100755
index dbd0c8e..0000000
--- a/tmake/lib/hpux-acc/tmake.conf
+++ /dev/null
@@ -1,60 +0,0 @@
-#
-#
-#
-# tmake configuration for hpux-acc
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = aCC
-TMAKE_CFLAGS = -w -D__STRICT_ANSI__ -DPNG_USE_LOCAL_ARRAYS
-TMAKE_CFLAGS_WARN_ON =
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB = +Z
-TMAKE_CFLAGS_YACC =
-
-TMAKE_CXX = aCC
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 = /usr/include/X11R6
-TMAKE_LIBDIR_X11 = /usr/lib/X11R6
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL =
-TMAKE_LIBDIR_OPENGL = /opt/graphics/OpenGL/lib
-
-TMAKE_LINK = aCC
-TMAKE_LINK_SHLIB = aCC
-TMAKE_LFLAGS =
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHLIB = -b
-TMAKE_LFLAGS_SONAME =
-TMAKE_HPUX_SHLIB = 1
-
-TMAKE_LIBS =
-TMAKE_LIBS_X11 = -lXext -lX11 -lm -lICE -lSM
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl -lGL
-TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu
-TMAKE_LIBS_YACC = -ly
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cq
-TMAKE_RANLIB =
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/hpux-cc/app.t b/tmake/lib/hpux-cc/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/hpux-cc/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/hpux-cc/lib.t b/tmake/lib/hpux-cc/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/hpux-cc/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/hpux-cc/subdirs.t b/tmake/lib/hpux-cc/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/hpux-cc/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/hpux-cc/tmake.conf b/tmake/lib/hpux-cc/tmake.conf
deleted file mode 100755
index b5881ec..0000000
--- a/tmake/lib/hpux-cc/tmake.conf
+++ /dev/null
@@ -1,59 +0,0 @@
-#
-#
-#
-# tmake configuration for hpux-cc
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = cc
-TMAKE_CFLAGS = -w +a1 -DAportable
-TMAKE_CFLAGS_WARN_ON =
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB = +Z
-TMAKE_CFLAGS_YACC =
-
-TMAKE_CXX = CC
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 = /usr/include/X11R6
-TMAKE_LIBDIR_X11 = /usr/lib/X11R6
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL =
-TMAKE_LIBDIR_OPENGL =
-
-TMAKE_LINK = CC
-TMAKE_LINK_SHLIB = CC
-TMAKE_LFLAGS =
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHLIB = -b
-TMAKE_LFLAGS_SONAME =
-TMAKE_HPUX_SHLIB = 1
-
-TMAKE_LIBS =
-TMAKE_LIBS_X11 = -lXext -lX11 -lm
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cq
-TMAKE_RANLIB =
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/hpux-g++/app.t b/tmake/lib/hpux-g++/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/hpux-g++/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/hpux-g++/lib.t b/tmake/lib/hpux-g++/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/hpux-g++/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/hpux-g++/subdirs.t b/tmake/lib/hpux-g++/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/hpux-g++/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/hpux-g++/tmake.conf b/tmake/lib/hpux-g++/tmake.conf
deleted file mode 100755
index fb39414..0000000
--- a/tmake/lib/hpux-g++/tmake.conf
+++ /dev/null
@@ -1,60 +0,0 @@
-#
-#
-#
-# tmake configuration for hpux-g++
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = gcc
-TMAKE_CFLAGS =
-TMAKE_CFLAGS_WARN_ON = -Wall -W
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O0
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB = -fPIC
-TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
-
-TMAKE_CXX = g++
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 = /usr/include/X11R6
-TMAKE_LIBDIR_X11 = /usr/lib/X11R6
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL =
-TMAKE_LIBDIR_OPENGL =
-
-TMAKE_LINK = g++
-TMAKE_LINK_SHLIB = g++
-TMAKE_LFLAGS =
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHLIB = -fPIC -shared
-TMAKE_LFLAGS_SONAME =
-TMAKE_HPUX_SHLIB = 1
-
-TMAKE_LIBS =
-TMAKE_LIBS_X11 = -lXext -lX11 -lm
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL =
-TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cq
-TMAKE_RANLIB =
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/irix-64/app.t b/tmake/lib/irix-64/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/irix-64/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/irix-64/lib.t b/tmake/lib/irix-64/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/irix-64/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/irix-64/subdirs.t b/tmake/lib/irix-64/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/irix-64/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/irix-64/tmake.conf b/tmake/lib/irix-64/tmake.conf
deleted file mode 100755
index ac0e2fa..0000000
--- a/tmake/lib/irix-64/tmake.conf
+++ /dev/null
@@ -1,60 +0,0 @@
-#
-#
-#
-# tmake configuration for irix-64
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = cc
-TMAKE_CFLAGS = -64 LANG:bool=ON -woff 1209,1233,1314,1355,1375,1506
-TMAKE_CFLAGS_WARN_ON = -fullwarn
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O2 -OPT:Olimit=3000
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB =
-TMAKE_CFLAGS_YACC = -woff 1110,1174,3262
-
-TMAKE_CXX = CC
-TMAKE_CXXFLAGS = -64 LANG:bool=ON -woff 1209,1233,1314,1355,1375,1506
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 =
-TMAKE_LIBDIR_X11 =
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL =
-TMAKE_LIBDIR_OPENGL =
-
-TMAKE_LINK = CC
-TMAKE_LINK_SHLIB = CC
-TMAKE_LFLAGS = -64
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHLIB = -shared
-TMAKE_LFLAGS_SONAME = -Wl,-soname,
-
-TMAKE_LIBS =
-TMAKE_LIBS_X11 = -lXext -lX11 -lm
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cq
-TMAKE_RANLIB =
-
-TMAKE_CLEAN = -r so_locations ii_files
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/irix-dcc/app.t b/tmake/lib/irix-dcc/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/irix-dcc/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/irix-dcc/lib.t b/tmake/lib/irix-dcc/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/irix-dcc/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/irix-dcc/subdirs.t b/tmake/lib/irix-dcc/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/irix-dcc/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/irix-dcc/tmake.conf b/tmake/lib/irix-dcc/tmake.conf
deleted file mode 100755
index 0fcbaa8..0000000
--- a/tmake/lib/irix-dcc/tmake.conf
+++ /dev/null
@@ -1,60 +0,0 @@
-#
-#
-#
-# tmake configuration for irix-dcc
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = DCC
-TMAKE_CFLAGS =
-TMAKE_CFLAGS_WARN_ON = -fullwarn
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O2
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB =
-TMAKE_CFLAGS_YACC =
-
-TMAKE_CXX = DCC
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 =
-TMAKE_LIBDIR_X11 =
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL =
-TMAKE_LIBDIR_OPENGL =
-
-TMAKE_LINK = DCC
-TMAKE_LINK_SHLIB = DCC
-TMAKE_LFLAGS =
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHLIB = -shared
-TMAKE_LFLAGS_SONAME = -Wl,-soname,
-
-TMAKE_LIBS =
-TMAKE_LIBS_X11 = -lXext -lX11 -lm
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cq
-TMAKE_RANLIB =
-
-TMAKE_CLEAN = so_locations
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/irix-g++/app.t b/tmake/lib/irix-g++/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/irix-g++/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/irix-g++/lib.t b/tmake/lib/irix-g++/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/irix-g++/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/irix-g++/subdirs.t b/tmake/lib/irix-g++/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/irix-g++/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/irix-g++/tmake.conf b/tmake/lib/irix-g++/tmake.conf
deleted file mode 100755
index 2192c71..0000000
--- a/tmake/lib/irix-g++/tmake.conf
+++ /dev/null
@@ -1,60 +0,0 @@
-#
-#
-#
-# tmake configuration for irix-g++
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = gcc
-TMAKE_CFLAGS =
-TMAKE_CFLAGS_WARN_ON = -Wall -W
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O0
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB = -fPIC
-TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
-
-TMAKE_CXX = g++
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 =
-TMAKE_LIBDIR_X11 =
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL =
-TMAKE_LIBDIR_OPENGL =
-
-TMAKE_LINK = g++
-TMAKE_LINK_SHLIB = g++
-TMAKE_LFLAGS =
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHLIB = -shared
-TMAKE_LFLAGS_SONAME = -Wl,-soname,
-
-TMAKE_LIBS =
-TMAKE_LIBS_X11 = -lXext -lX11 -lm
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cq
-TMAKE_RANLIB = ranlib
-
-TMAKE_CLEAN = so_locations
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/irix-n32/app.t b/tmake/lib/irix-n32/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/irix-n32/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/irix-n32/lib.t b/tmake/lib/irix-n32/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/irix-n32/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/irix-n32/subdirs.t b/tmake/lib/irix-n32/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/irix-n32/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/irix-n32/tmake.conf b/tmake/lib/irix-n32/tmake.conf
deleted file mode 100755
index 9d8bcb4..0000000
--- a/tmake/lib/irix-n32/tmake.conf
+++ /dev/null
@@ -1,60 +0,0 @@
-#
-#
-#
-# tmake configuration for irix-n32
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = cc
-TMAKE_CFLAGS = -n32 -mips3 LANG:bool=ON -woff 1209,1233,1314,1355,1375,1506
-TMAKE_CFLAGS_WARN_ON = -fullwarn
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O2
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB =
-TMAKE_CFLAGS_YACC = -woff 1110,1174,3262
-
-TMAKE_CXX = CC
-TMAKE_CXXFLAGS = -n32 -mips3 LANG:bool=ON -woff 1209,1233,1314,1355,1375,1506
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 =
-TMAKE_LIBDIR_X11 =
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL =
-TMAKE_LIBDIR_OPENGL =
-
-TMAKE_LINK = CC
-TMAKE_LINK_SHLIB = CC
-TMAKE_LFLAGS = -n32
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHLIB = -shared
-TMAKE_LFLAGS_SONAME = -Wl,-soname,
-
-TMAKE_LIBS =
-TMAKE_LIBS_X11 = -lXext -lX11 -lm
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl -lGL
-TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cq
-TMAKE_RANLIB =
-
-TMAKE_CLEAN = -r so_locations ii_files
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/irix-o32/app.t b/tmake/lib/irix-o32/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/irix-o32/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/irix-o32/lib.t b/tmake/lib/irix-o32/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/irix-o32/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/irix-o32/subdirs.t b/tmake/lib/irix-o32/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/irix-o32/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/irix-o32/tmake.conf b/tmake/lib/irix-o32/tmake.conf
deleted file mode 100755
index 89b8728..0000000
--- a/tmake/lib/irix-o32/tmake.conf
+++ /dev/null
@@ -1,60 +0,0 @@
-#
-#
-#
-# tmake configuration for irix-o32
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = cc
-TMAKE_CFLAGS = -32 LANG:bool=ON -woff 1209,1233,1314,1355,1375,1506
-TMAKE_CFLAGS_WARN_ON = -fullwarn
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O2 -OPT:Olimit=3000
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB =
-TMAKE_CFLAGS_YACC = -woff 1110,1174,3262
-
-TMAKE_CXX = CC
-TMAKE_CXXFLAGS = -32 LANG:bool=ON -woff 1209,1233,1314,1355,1375,1506
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 =
-TMAKE_LIBDIR_X11 =
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL =
-TMAKE_LIBDIR_OPENGL =
-
-TMAKE_LINK = CC
-TMAKE_LINK_SHLIB = CC
-TMAKE_LFLAGS = -32
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHLIB = -shared
-TMAKE_LFLAGS_SONAME = -Wl,-soname,
-
-TMAKE_LIBS =
-TMAKE_LIBS_X11 = -lXext -lX11 -lm
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cq
-TMAKE_RANLIB =
-
-TMAKE_CLEAN = -r so_locations ii_files
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/linux-g++/app.t b/tmake/lib/linux-g++/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/linux-g++/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/linux-g++/lib.t b/tmake/lib/linux-g++/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/linux-g++/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/linux-g++/subdirs.t b/tmake/lib/linux-g++/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/linux-g++/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/linux-g++/tmake.conf b/tmake/lib/linux-g++/tmake.conf
deleted file mode 100755
index 9f69008..0000000
--- a/tmake/lib/linux-g++/tmake.conf
+++ /dev/null
@@ -1,59 +0,0 @@
-#
-#
-#
-# tmake configuration for linux-g++
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = gcc
-TMAKE_CFLAGS = -pipe
-TMAKE_CFLAGS_WARN_ON = -Wall -W -fno-exceptions
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O2
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB = -fPIC
-TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
-
-TMAKE_CXX = g++
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 = /usr/X11R6/include
-TMAKE_LIBDIR_X11 = /usr/X11R6/lib
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL = /usr/X11R6/include
-TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
-
-TMAKE_LINK = g++
-TMAKE_LINK_SHLIB = g++
-TMAKE_LFLAGS =
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG = -g
-TMAKE_LFLAGS_SHLIB = -shared
-TMAKE_LFLAGS_SONAME = -Wl,-soname,
-
-TMAKE_LIBS =
-TMAKE_LIBS_X11 = -lXext -lX11 -lm
-TMAKE_LIBS_X11SM = -lICE -lSM
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cqs
-TMAKE_RANLIB =
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/m68k-atari-mint-g++/app.t b/tmake/lib/m68k-atari-mint-g++/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/m68k-atari-mint-g++/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/m68k-atari-mint-g++/lib.t b/tmake/lib/m68k-atari-mint-g++/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/m68k-atari-mint-g++/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/m68k-atari-mint-g++/subdirs.t b/tmake/lib/m68k-atari-mint-g++/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/m68k-atari-mint-g++/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/m68k-atari-mint-g++/tmake.conf b/tmake/lib/m68k-atari-mint-g++/tmake.conf
deleted file mode 100755
index 2de619f..0000000
--- a/tmake/lib/m68k-atari-mint-g++/tmake.conf
+++ /dev/null
@@ -1,59 +0,0 @@
-#
-#
-#
-# tmake configuration for linux-g++
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = gcc
-TMAKE_CFLAGS =
-TMAKE_CFLAGS_WARN_ON = -Wall -W -fno-exceptions
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O0
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB = -fPIC
-TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
-
-TMAKE_CXX = g++
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 = /usr/X11R6/include
-TMAKE_LIBDIR_X11 = /usr/X11R6/lib
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL = /usr/X11R6/include
-TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
-
-TMAKE_LINK = g++
-TMAKE_LINK_SHLIB = g++
-TMAKE_LFLAGS =
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG = -g
-TMAKE_LFLAGS_SHLIB = -shared
-TMAKE_LFLAGS_SONAME = -Wl,-soname,
-
-TMAKE_LIBS =
-TMAKE_LIBS_X11 = -lXext -lX11 -lm
-TMAKE_LIBS_X11SM = -lICE -lSM
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cqs
-TMAKE_RANLIB =
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/macosx-c++/app.t b/tmake/lib/macosx-c++/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/macosx-c++/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/macosx-c++/lib.t b/tmake/lib/macosx-c++/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/macosx-c++/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/macosx-c++/subdirs.t b/tmake/lib/macosx-c++/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/macosx-c++/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/macosx-c++/tmake.conf b/tmake/lib/macosx-c++/tmake.conf
deleted file mode 100755
index 9bbf8bc..0000000
--- a/tmake/lib/macosx-c++/tmake.conf
+++ /dev/null
@@ -1,60 +0,0 @@
-#
-#
-#
-# tmake configuration for macosx-c++
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = cc
-TMAKE_CFLAGS = -pipe
-TMAKE_CFLAGS_WARN_ON = -Wall -W
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O2
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB = -fPIC
-TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
-
-TMAKE_CXX = c++
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS -D__FreeBSD__=6
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 =
-TMAKE_LIBDIR_X11 =
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL = /usr/X11R6/include
-TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
-
-TMAKE_LINK = c++
-TMAKE_LINK_SHLIB = c++
-TMAKE_LFLAGS =
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHLIB = -shared
-
-# soname does not work on fbsd 2.x
-#TMAKE_LFLAGS_SONAME = -Wl,-soname
-
-TMAKE_LIBS =
-TMAKE_LIBS_X11 =
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cq
-TMAKE_RANLIB = ranlib
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/netbsd-g++/app.t b/tmake/lib/netbsd-g++/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/netbsd-g++/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/netbsd-g++/lib.t b/tmake/lib/netbsd-g++/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/netbsd-g++/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/netbsd-g++/subdirs.t b/tmake/lib/netbsd-g++/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/netbsd-g++/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/netbsd-g++/tmake.conf b/tmake/lib/netbsd-g++/tmake.conf
deleted file mode 100755
index cad7876..0000000
--- a/tmake/lib/netbsd-g++/tmake.conf
+++ /dev/null
@@ -1,61 +0,0 @@
-#
-#
-#
-# tmake configuration for netbsd-g++
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = gcc
-TMAKE_CFLAGS =
-TMAKE_CFLAGS_WARN_ON = -Wall -W
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O2
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB = -fPIC
-TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
-
-TMAKE_CXX = g++
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 = /usr/X11R6/include
-TMAKE_LIBDIR_X11 = /usr/X11R6/lib
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL = /usr/X11R6/include
-TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
-
-TMAKE_LINK = g++
-TMAKE_LINK_SHLIB = ld
-TMAKE_LINK_SHLIB_CMD = $(SYSCONF_LINK_SHLIB) -Bshareable $(LFLAGS) -o $(DESTDIR)$(SYSCONF_LINK_TARGET_SHARED) \
- `lorder /usr/lib/c++rt0.o $(OBJECTS) $(OBJMOC) | \
- tsort` $(LIBS)
-TMAKE_LFLAGS =
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHLIB = -Bshareable
-TMAKE_LFLAGS_SONAME =
-
-TMAKE_LIBS =
-TMAKE_LIBS_X11 = -lXext -lX11 -lm
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cqs
-TMAKE_RANLIB =
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/openbsd-g++/app.t b/tmake/lib/openbsd-g++/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/openbsd-g++/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/openbsd-g++/lib.t b/tmake/lib/openbsd-g++/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/openbsd-g++/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/openbsd-g++/subdirs.t b/tmake/lib/openbsd-g++/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/openbsd-g++/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/openbsd-g++/tmake.conf b/tmake/lib/openbsd-g++/tmake.conf
deleted file mode 100755
index 89cdc9b..0000000
--- a/tmake/lib/openbsd-g++/tmake.conf
+++ /dev/null
@@ -1,61 +0,0 @@
-#
-#
-#
-# tmake configuration for netbsd-g++
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = gcc
-TMAKE_CFLAGS =
-TMAKE_CFLAGS_WARN_ON = -Wall -W
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O2
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB = -fPIC
-TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
-
-TMAKE_CXX = g++
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 = /usr/X11R6/include
-TMAKE_LIBDIR_X11 = /usr/X11R6/lib
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL = /usr/X11R6/include
-TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
-
-TMAKE_LINK = g++
-TMAKE_LINK_SHLIB = ld
-TMAKE_LINK_SHLIB_CMD = $(SYSCONF_LINK_SHLIB) -Bshareable $(LFLAGS) -o $(DESTDIR)$(SYSCONF_LINK_TARGET_SHARED) \
- `lorder /usr/lib/c++rt0.o $(OBJECTS) $(OBJMOC) | \
- tsort` $(LIBS)
-TMAKE_LFLAGS =
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHLIB = -Bshareable
-TMAKE_LFLAGS_SONAME =
-
-TMAKE_LIBS =
-TMAKE_LIBS_X11 = -lXext -lX11 -lm
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar q
-TMAKE_RANLIB = ranlib
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/osf1-cxx/app.t b/tmake/lib/osf1-cxx/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/osf1-cxx/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/osf1-cxx/lib.t b/tmake/lib/osf1-cxx/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/osf1-cxx/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/osf1-cxx/subdirs.t b/tmake/lib/osf1-cxx/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/osf1-cxx/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/osf1-cxx/tmake.conf b/tmake/lib/osf1-cxx/tmake.conf
deleted file mode 100755
index b3f9a5d..0000000
--- a/tmake/lib/osf1-cxx/tmake.conf
+++ /dev/null
@@ -1,60 +0,0 @@
-#
-#
-#
-# tmake configuration for osf1-cxx (a.k.a. DEC Unix)
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = cxx
-TMAKE_CFLAGS = -x cc -w -D_POSIX_SOURCE -D_OSF_SOURCE -D_AES_SOURCE
-TMAKE_CFLAGS_WARN_ON =
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O2
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB =
-TMAKE_CFLAGS_YACC = -Olimit 1000
-
-TMAKE_CXX = cxx
-TMAKE_CXXFLAGS = -x cxx -w -D_POSIX_SOURCE -D_OSF_SOURCE -D_AES_SOURCE
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 = /usr/X11R6/include
-TMAKE_LIBDIR_X11 = /usr/X11R6/lib
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL = /usr/X11R6/include
-TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
-
-TMAKE_LINK = cxx
-TMAKE_LINK_SHLIB = cxx
-TMAKE_LFLAGS =
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHLIB = -shared
-TMAKE_LFLAGS_SONAME = <<END
--soname
-END
-
-TMAKE_LIBS =
-TMAKE_LIBS_X11 = -lXext -lX11 -lm
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cqs
-TMAKE_RANLIB =
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/osf1-g++/app.t b/tmake/lib/osf1-g++/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/osf1-g++/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/osf1-g++/lib.t b/tmake/lib/osf1-g++/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/osf1-g++/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/osf1-g++/subdirs.t b/tmake/lib/osf1-g++/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/osf1-g++/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/osf1-g++/tmake.conf b/tmake/lib/osf1-g++/tmake.conf
deleted file mode 100755
index e23713e..0000000
--- a/tmake/lib/osf1-g++/tmake.conf
+++ /dev/null
@@ -1,58 +0,0 @@
-#
-#
-#
-# tmake configuration for osf1-g++ (a.k.a. DEC Unix)
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = gcc
-TMAKE_CFLAGS = -D_POSIX_SOURCE -D_OSF_SOURCE -D_AES_SOURCE
-TMAKE_CFLAGS_WARN_ON = -Wall -W
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O2
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB = -fPIC
-TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
-
-TMAKE_CXX = g++
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 = /usr/X11R6/include
-TMAKE_LIBDIR_X11 = /usr/X11R6/lib
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL = /usr/X11R6/include
-TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
-
-TMAKE_LINK = g++
-TMAKE_LINK_SHLIB = g++
-TMAKE_LFLAGS =
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHLIB = -shared
-TMAKE_LFLAGS_SONAME = -Wl,-soname,
-
-TMAKE_LIBS =
-TMAKE_LIBS_X11 = -lXext -lX11 -lm
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cqs
-TMAKE_RANLIB =
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/qnx-g++/app.t b/tmake/lib/qnx-g++/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/qnx-g++/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/qnx-g++/lib.t b/tmake/lib/qnx-g++/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/qnx-g++/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/qnx-g++/subdirs.t b/tmake/lib/qnx-g++/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/qnx-g++/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/qnx-g++/tmake.conf b/tmake/lib/qnx-g++/tmake.conf
deleted file mode 100755
index 4846d68..0000000
--- a/tmake/lib/qnx-g++/tmake.conf
+++ /dev/null
@@ -1,58 +0,0 @@
-#
-#
-#
-# tmake configuration for qnx-g++
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = gcc
-TMAKE_CFLAGS = -pipe
-TMAKE_CFLAGS_WARN_ON = -Wall -W
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O -fno-inline -fno-pack-struct
-TMAKE_CFLAGS_DEBUG = -g -fno-inline -fno-pack-struct
-TMAKE_CFLAGS_SHLIB =
-TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses -fno-inline -fno-pack-struct
-
-TMAKE_CXX = g++
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 = /usr/X11R6/include
-TMAKE_LIBDIR_X11 = /usr/X11R6/lib
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL = /usr/X11R6/include
-TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
-
-TMAKE_LINK = g++
-TMAKE_LINK_SHLIB = g++
-TMAKE_LFLAGS =
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHLIB =
-TMAKE_LFLAGS_SONAME =
-
-TMAKE_LIBS = -lunix
-TMAKE_LIBS_X11 = -lXext -lX11 -lm
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cqs
-TMAKE_RANLIB =
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/sco-g++/app.t b/tmake/lib/sco-g++/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/sco-g++/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/sco-g++/lib.t b/tmake/lib/sco-g++/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/sco-g++/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/sco-g++/subdirs.t b/tmake/lib/sco-g++/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/sco-g++/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/sco-g++/tmake.conf b/tmake/lib/sco-g++/tmake.conf
deleted file mode 100755
index c571f98..0000000
--- a/tmake/lib/sco-g++/tmake.conf
+++ /dev/null
@@ -1,58 +0,0 @@
-#
-#
-#
-# tmake configuration for sco-g++
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = gcc
-TMAKE_CFLAGS =
-TMAKE_CFLAGS_WARN_ON = -Wall -W
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O2
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB = -fPIC
-TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
-
-TMAKE_CXX = g++
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 =
-TMAKE_LIBDIR_X11 =
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL =
-TMAKE_LIBDIR_OPENGL =
-
-TMAKE_LINK = g++
-TMAKE_LINK_SHLIB = g++
-TMAKE_LFLAGS =
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHLIB = -shared
-TMAKE_LFLAGS_SONAME =
-
-TMAKE_LIBS =
-TMAKE_LIBS_X11 = -lXext -lX11 -lsocket -lm
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cq
-TMAKE_RANLIB = ranlib
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/solaris-cc-gcc/app.t b/tmake/lib/solaris-cc-gcc/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/solaris-cc-gcc/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/solaris-cc-gcc/lib.t b/tmake/lib/solaris-cc-gcc/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/solaris-cc-gcc/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/solaris-cc-gcc/subdirs.t b/tmake/lib/solaris-cc-gcc/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/solaris-cc-gcc/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/solaris-cc-gcc/tmake.conf b/tmake/lib/solaris-cc-gcc/tmake.conf
deleted file mode 100755
index de013a0..0000000
--- a/tmake/lib/solaris-cc-gcc/tmake.conf
+++ /dev/null
@@ -1,62 +0,0 @@
-#
-#
-#
-# tmake configuration for solaris-cc-gcc
-# (Using SunPro CC for C++ code and gcc for C code.)
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = gcc
-TMAKE_CFLAGS =
-TMAKE_CFLAGS_WARN_ON = -Wall -W
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O2
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB = -fPIC
-TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
-
-TMAKE_CXX = CC
-TMAKE_CXXFLAGS =
-TMAKE_CXXFLAGS_WARN_ON =
-TMAKE_CXXFLAGS_WARN_OFF = -w
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = -PIC
-TMAKE_CXXFLAGS_YACC =
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 = /usr/openwin/include
-TMAKE_LIBDIR_X11 = /usr/openwin/lib
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL =
-TMAKE_LIBDIR_OPENGL =
-
-TMAKE_LINK = CC
-# Jan Wortelboer <janw@wins.uva.nl> suggests avoiding $LD_LIBRARY_PATH:
-TMAKE_LINK_SHLIB = CC -R$(QTDIR)/lib:/usr/openwin/lib
-TMAKE_LFLAGS =
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHLIB = -G -h $(TARGET1)
-TMAKE_LFLAGS_SONAME =
-
-TMAKE_LIBS = -lC
-TMAKE_LIBS_X11 = -lXext -lX11 -lm
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu
-
-TMAKE_MOC = moc
-
-TMAKE_AR = CC -xar -o
-TMAKE_RANLIB =
-
-TMAKE_CLEAN = -r Templates.DB
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/solaris-cc/app.t b/tmake/lib/solaris-cc/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/solaris-cc/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/solaris-cc/lib.t b/tmake/lib/solaris-cc/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/solaris-cc/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/solaris-cc/subdirs.t b/tmake/lib/solaris-cc/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/solaris-cc/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/solaris-cc/tmake.conf b/tmake/lib/solaris-cc/tmake.conf
deleted file mode 100755
index 3dbe810..0000000
--- a/tmake/lib/solaris-cc/tmake.conf
+++ /dev/null
@@ -1,61 +0,0 @@
-#
-#
-#
-# tmake configuration for solaris-cc
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = cc
-TMAKE_CFLAGS =
-TMAKE_CFLAGS_WARN_ON =
-TMAKE_CFLAGS_WARN_OFF = -w
-TMAKE_CFLAGS_RELEASE = -O
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB = -KPIC
-TMAKE_CFLAGS_YACC =
-
-TMAKE_CXX = CC
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = -O2
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = -PIC
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 = /usr/openwin/include
-TMAKE_LIBDIR_X11 = /usr/openwin/lib
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL =
-TMAKE_LIBDIR_OPENGL =
-
-TMAKE_LINK = CC
-# Jan Wortelboer <janw@wins.uva.nl> suggests avoiding $LD_LIBRARY_PATH:
-TMAKE_LINK_SHLIB = CC -R$(QTDIR)/lib:/usr/openwin/lib
-TMAKE_LFLAGS =
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHLIB = -G -h $(TARGET1)
-TMAKE_LFLAGS_SONAME =
-
-TMAKE_LIBS =
-TMAKE_LIBS_X11 = -lXext -lX11 -lm -lICE -lSM
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl -lGL
-TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu
-
-TMAKE_MOC = moc
-
-TMAKE_AR = CC -xar -o
-TMAKE_RANLIB =
-
-TMAKE_CLEAN = -r Templates.DB
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/solaris-g++/app.t b/tmake/lib/solaris-g++/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/solaris-g++/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/solaris-g++/lib.t b/tmake/lib/solaris-g++/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/solaris-g++/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/solaris-g++/subdirs.t b/tmake/lib/solaris-g++/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/solaris-g++/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/solaris-g++/tmake.conf b/tmake/lib/solaris-g++/tmake.conf
deleted file mode 100755
index f4adbcd..0000000
--- a/tmake/lib/solaris-g++/tmake.conf
+++ /dev/null
@@ -1,59 +0,0 @@
-#
-#
-#
-# tmake configuration for solaris-g++
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = gcc
-TMAKE_CFLAGS =
-TMAKE_CFLAGS_WARN_ON = -Wall -W
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O2
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB = -fPIC
-TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
-
-TMAKE_CXX = g++
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 = /usr/openwin/include
-TMAKE_LIBDIR_X11 = /usr/openwin/lib
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL =
-TMAKE_LIBDIR_OPENGL =
-
-TMAKE_LINK = g++
-TMAKE_LINK_SHLIB = g++
-TMAKE_LFLAGS =
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHAPP = -shared
-TMAKE_LFLAGS_SHLIB = -shared -h $(TARGET1)
-TMAKE_LFLAGS_SONAME =
-
-TMAKE_LIBS =
-TMAKE_LIBS_X11 = -lXext -lX11 -lm
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cq
-TMAKE_RANLIB =
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/sunos-g++/app.t b/tmake/lib/sunos-g++/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/sunos-g++/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/sunos-g++/lib.t b/tmake/lib/sunos-g++/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/sunos-g++/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/sunos-g++/subdirs.t b/tmake/lib/sunos-g++/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/sunos-g++/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/sunos-g++/tmake.conf b/tmake/lib/sunos-g++/tmake.conf
deleted file mode 100755
index 52f9e2d..0000000
--- a/tmake/lib/sunos-g++/tmake.conf
+++ /dev/null
@@ -1,58 +0,0 @@
-#
-#
-#
-# tmake configuration for sunos-g++
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = gcc
-TMAKE_CFLAGS =
-TMAKE_CFLAGS_WARN_ON = -Wall -W
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O2
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB = -fPIC
-TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
-
-TMAKE_CXX = g++
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 = /usr/openwin/include
-TMAKE_LIBDIR_X11 = /usr/openwin/lib
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL =
-TMAKE_LIBDIR_OPENGL =
-
-TMAKE_LINK = g++
-TMAKE_LINK_SHLIB = g++
-TMAKE_LFLAGS =
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHLIB = -fPIC -shared
-TMAKE_LFLAGS_SONAME =
-
-TMAKE_LIBS =
-TMAKE_LIBS_X11 = -lXext -lX11 -lm
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lGL -lGLU -lXmu
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cq
-TMAKE_RANLIB = ranlib
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/ultrix-g++/app.t b/tmake/lib/ultrix-g++/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/ultrix-g++/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/ultrix-g++/lib.t b/tmake/lib/ultrix-g++/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/ultrix-g++/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/ultrix-g++/subdirs.t b/tmake/lib/ultrix-g++/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/ultrix-g++/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/ultrix-g++/tmake.conf b/tmake/lib/ultrix-g++/tmake.conf
deleted file mode 100755
index 59813eb..0000000
--- a/tmake/lib/ultrix-g++/tmake.conf
+++ /dev/null
@@ -1,58 +0,0 @@
-#
-#
-#
-# tmake configuration for ultrix-g++
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = gcc
-TMAKE_CFLAGS =
-TMAKE_CFLAGS_WARN_ON = -Wall -W
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O2
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB =
-TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
-
-TMAKE_CXX = g++
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 = /usr/X11R6/include
-TMAKE_LIBDIR_X11 = /usr/X11R6/lib
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL = /usr/X11R6/include
-TMAKE_LIBDIR_OPENGL = /usr/X11R6/lib
-
-TMAKE_LINK = g++
-#TMAKE_LINK_SHLIB = g++
-TMAKE_LFLAGS =
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-#TMAKE_LFLAGS_SHLIB = -shared
-#TMAKE_LFLAGS_SONAME = -Wl,-soname,
-
-TMAKE_LIBS =
-TMAKE_LIBS_X11 = -lXext -lX11 -lm
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cqs
-TMAKE_RANLIB =
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/unix/app.t b/tmake/lib/unix/app.t
deleted file mode 100755
index f59c9f9..0000000
--- a/tmake/lib/unix/app.t
+++ /dev/null
@@ -1,6 +0,0 @@
-#############################################################################
-#!
-#! This is a tmake template for building Unix applications.
-#!
-#$ Project('TMAKE_APP_FLAG = 1');
-#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/unix/generic.t b/tmake/lib/unix/generic.t
deleted file mode 100755
index 04f7b97..0000000
--- a/tmake/lib/unix/generic.t
+++ /dev/null
@@ -1,283 +0,0 @@
-#!
-#! This is a tmake template for building UNIX applications or libraries.
-#!
-#${
- if ( Project("TMAKE_LIB_FLAG") && !Config("staticlib") ) {
- Project('CONFIG *= dll');
- } elsif ( Project("TMAKE_APP_FLAG") || Config("dll") ) {
- Project('CONFIG -= staticlib');
- }
- if ( Config("warn_off") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_OFF');
- Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_WARN_OFF');
- } elsif ( Config("warn_on") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_ON');
- Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_WARN_ON');
- }
- if ( Config("debug") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_DEBUG');
- Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_DEBUG');
- Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_DEBUG');
- } elsif ( Config("release") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_RELEASE');
- Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_RELEASE');
- Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_RELEASE');
- }
- if ( Config("qt") || Config("opengl") ) {
- Project('CONFIG *= x11lib');
- if ( Config("opengl") ) {
- Project('CONFIG *= x11inc');
- }
- }
- if ( Config("x11") ) {
- Project('CONFIG *= x11lib');
- Project('CONFIG *= x11inc');
- }
- if ( Config("qt") ) {
- Project('CONFIG *= moc');
- AddIncludePath(Project("TMAKE_INCDIR_QT"));
- if ( Config("release") ) {
- Project('DEFINES += NO_DEBUG');
- }
- if ( Config("opengl") ) {
- Project("TMAKE_LIBDIR_QT") &&
- Project('TMAKE_LIBS *= -L$$TMAKE_LIBDIR_QT');
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_OPENGL');
- }
- if ( !((Project("TARGET") eq "qt") && Project("TMAKE_LIB_FLAG")) ) {
- Project("TMAKE_LIBDIR_QT") &&
- Project('TMAKE_LIBS *= -L$$TMAKE_LIBDIR_QT');
- if ( Config("thread") ) {
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_MT');
- } else {
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT');
- }
- }
- }
- if ( Config("opengl") ) {
- AddIncludePath(Project("TMAKE_INCDIR_OPENGL"));
- Project("TMAKE_LIBDIR_OPENGL") &&
- Project('TMAKE_LIBS *= -L$$TMAKE_LIBDIR_OPENGL');
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_OPENGL');
- }
- if ( Config("x11inc") ) {
- AddIncludePath(Project("TMAKE_INCDIR_X11"));
- }
- if ( Config("x11lib") ) {
- Project("TMAKE_LIBDIR_X11") &&
- Project('TMAKE_LIBS *= -L$$TMAKE_LIBDIR_X11');
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_X11');
- }
- if ( Config("moc") ) {
- $moc_aware = 1;
- }
- Project('TMAKE_LIBS = $$LIBS $$TMAKE_LIBS');
- if ( !Project("TMAKE_RUN_CC") ) {
- Project('TMAKE_RUN_CC = $(CC) -c $(CFLAGS) $(INCPATH) -o $obj $src');
- }
- if ( !Project("TMAKE_RUN_CC_IMP") ) {
- Project('TMAKE_RUN_CC_IMP = $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<');
- }
- if ( !Project("TMAKE_RUN_CXX") ) {
- Project('TMAKE_RUN_CXX = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $obj $src');
- }
- if ( !Project("TMAKE_RUN_CXX_IMP") ) {
- Project('TMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<');
- }
- Project('TMAKE_FILETAGS = HEADERS SOURCES TARGET DESTDIR $$FILETAGS');
- StdInit();
- $project{"VERSION"} || ($project{"VERSION"} = "1.0");
- $project{"VER_MAJ"} = $project{"VERSION"};
- $project{"VER_MAJ"} =~ s/\.\d+$//;
- $project{"VER_MIN"} = $project{"VERSION"};
- $project{"VER_MIN"} =~ s/^\d+\.//;
- Project('DESTDIR_TARGET = $(TARGET)');
- if ( Project("TMAKE_APP_FLAG") ) {
- if ( Config("dll") ) {
- Project('TARGET = $$TARGET.so');
- Project("TMAKE_LFLAGS_SHAPP") ||
- ($project{"TMAKE_LFLAGS_SHAPP"} = $project{"TMAKE_LFLAGS_SHLIB"});
- Project("TMAKE_LFLAGS_SONAME") &&
- ($project{"TMAKE_LFLAGS_SONAME"} .= $project{"TARGET"});
- }
- $project{"TARGET"} = $project{"DESTDIR"} . $project{"TARGET"};
- } elsif ( Config("staticlib") ) {
- $project{"TARGET"} = $project{"DESTDIR"} . "lib" .
- $project{"TARGET"} . ".a";
- Project("TMAKE_AR_CMD") ||
- Project('TMAKE_AR_CMD = $(AR) $(TARGET) $(OBJECTS) $(OBJMOC)');
- } else {
- $project{"TARGETA"} = $project{"DESTDIR"} . "lib" .
- $project{"TARGET"} . ".a";
- if ( Project("TMAKE_AR_CMD") ) {
- $project{"TMAKE_AR_CMD"} =~ s/\(TARGET\)/\(TARGETA\)/g;
- } else {
- Project('TMAKE_AR_CMD = $(AR) $(TARGETA) $(OBJECTS) $(OBJMOC)');
- }
- if ( $project{"TMAKE_HPUX_SHLIB"} ) {
- $project{"TARGET_x.y"} = "lib" . $project{"TARGET"} . ".sl";
- } else {
- $project{"TARGET_"} = "lib" . $project{"TARGET"} . ".so";
- $project{"TARGET_x"} = $project{"TARGET_"} . "." .
- $project{"VER_MAJ"};
- $project{"TARGET_x.y"} = $project{"TARGET_"} . "." .
- $project{"VERSION"};
- $project{"TMAKE_LN_SHLIB"} = "-ln -s";
- }
- $project{"TARGET"} = $project{"TARGET_x.y"};
- if ( $project{"DESTDIR"} ) {
- $project{"DESTDIR_TARGET"} = $project{"DESTDIR"} .
- $project{"TARGET"};
- }
- Project("TMAKE_LFLAGS_SONAME") &&
- ($project{"TMAKE_LFLAGS_SONAME"} .= $project{"TARGET_x"});
- $project{"TMAKE_LINK_SHLIB_CMD"} ||
- ($project{"TMAKE_LINK_SHLIB_CMD"} =
- '$(LINK) $(LFLAGS) -o $(TARGETD) $(OBJECTS) $(OBJMOC) $(LIBS)');
- }
- if ( Config("dll") ) {
- Project('TMAKE_CFLAGS *= $$TMAKE_CFLAGS_SHLIB' );
- Project('TMAKE_CXXFLAGS *= $$TMAKE_CXXFLAGS_SHLIB' );
- if ( Project("TMAKE_APP_FLAG") ) {
- Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_SHAPP');
- } else {
- Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_SHLIB $$TMAKE_LFLAGS_SONAME');
- }
- }
-#$}
-#!
-# Makefile for building #$ Expand("TARGET")
-# Generated by tmake at #$ Now();
-# Project: #$ Expand("PROJECT");
-# Template: #$ Expand("TEMPLATE");
-#############################################################################
-
-####### Compiler, tools and options
-
-CC = #$ Expand("TMAKE_CC");
-CXX = #$ Expand("TMAKE_CXX");
-CFLAGS = #$ Expand("TMAKE_CFLAGS"); ExpandGlue("DEFINES","-D"," -D","");
-CXXFLAGS= #$ Expand("TMAKE_CXXFLAGS"); ExpandGlue("DEFINES","-D"," -D","");
-INCPATH = #$ ExpandPath("INCPATH","-I"," -I","");
-#$ Config("staticlib") && DisableOutput();
-LINK = #$ Expand("TMAKE_LINK");
-LFLAGS = #$ Expand("TMAKE_LFLAGS");
-LIBS = #$ Expand("TMAKE_LIBS");
-#$ Config("staticlib") && EnableOutput();
-#$ Project("TMAKE_LIB_FLAG") || DisableOutput();
-AR = #$ Expand("TMAKE_AR");
-RANLIB = #$ Expand("TMAKE_RANLIB");
-#$ Project("TMAKE_LIB_FLAG") || EnableOutput();
-MOC = #$ Expand("TMAKE_MOC");
-
-TAR = #$ Expand("TMAKE_TAR");
-GZIP = #$ Expand("TMAKE_GZIP");
-
-####### Files
-
-HEADERS = #$ ExpandList("HEADERS");
-SOURCES = #$ ExpandList("SOURCES");
-OBJECTS = #$ ExpandList("OBJECTS");
-SRCMOC = #$ ExpandList("SRCMOC");
-OBJMOC = #$ ExpandList("OBJMOC");
-DIST = #$ ExpandList("DISTFILES");
-TARGET = #$ Expand("TARGET");
-#$ (Project("TMAKE_APP_FLAG") || Config("staticlib")) && DisableOutput();
-TARGETA = #$ Expand("TARGETA");
-TARGETD = #$ Expand("TARGET_x.y");
-TARGET0 = #$ Expand("TARGET_");
-TARGET1 = #$ Expand("TARGET_x");
-#$ (Project("TMAKE_APP_FLAG") || Config("staticlib")) && EnableOutput();
-
-####### Implicit rules
-
-.SUFFIXES: .cpp .cxx .cc .C .c
-
-.cpp.o:
- #$ Expand("TMAKE_RUN_CXX_IMP");
-
-.cxx.o:
- #$ Expand("TMAKE_RUN_CXX_IMP");
-
-.cc.o:
- #$ Expand("TMAKE_RUN_CXX_IMP");
-
-.C.o:
- #$ Expand("TMAKE_RUN_CXX_IMP");
-
-.c.o:
- #$ Expand("TMAKE_RUN_CC_IMP");
-
-####### Build rules
-
-#$ Project("TMAKE_APP_FLAG") || DisableOutput();
-all: #$ ExpandGlue("ALL_DEPS",""," "," "); $text .= '$(TARGET)';
-
-$(TARGET): $(OBJECTS) $(OBJMOC) #$ Expand("TARGETDEPS");
- $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS)
-#$ Project("TMAKE_APP_FLAG") || EnableOutput();
-#$ (Config("staticlib") || Project("TMAKE_APP_FLAG")) && DisableOutput();
-all: #$ ExpandGlue("ALL_DEPS",""," ",""); Expand("DESTDIR_TARGET");
-
-#$ Substitute('$$DESTDIR_TARGET: $(OBJECTS) $(OBJMOC) $$TARGETDEPS');
- -rm -f $(TARGET) $(TARGET0) $(TARGET1)
- #$ Expand("TMAKE_LINK_SHLIB_CMD");
- #$ ExpandGlue("TMAKE_LN_SHLIB",""," "," \$(TARGET) \$(TARGET0)");
- #$ ExpandGlue("TMAKE_LN_SHLIB",""," "," \$(TARGET) \$(TARGET1)");
- #${
- $d = Project("DESTDIR");
- if ( $d ) {
- $d =~ s-([^/])$-$1/-;
- if ( Project("TMAKE_HPUX_SHLIB") ) {
- $text = "-rm -f $d\$(TARGET)\n\t" .
- "-mv \$(TARGET) $d";
- } else {
- $text = "-rm -f $d\$(TARGET)\n\t" .
- "-rm -f $d\$(TARGET0)\n\t" .
- "-rm -f $d\$(TARGET1)\n\t" .
- "-mv \$(TARGET) \$(TARGET0) \$(TARGET1) $d";
- }
- }
- #$}
-
-staticlib: $(TARGETA)
-
-$(TARGETA): $(OBJECTS) $(OBJMOC) #$ Expand("TARGETDEPS");
- -rm -f $(TARGETA)
- #$ Expand("TMAKE_AR_CMD");
- #$ ExpandGlue("TMAKE_RANLIB","",""," \$(TARGETA)");
-#$ (Config("staticlib") || Project("TMAKE_APP_FLAG")) && EnableOutput();
-#$ Config("staticlib") || DisableOutput();
-all: #$ ExpandGlue("ALL_DEPS",""," "," "); $text .= '$(TARGET)';
-
-staticlib: $(TARGET)
-
-$(TARGET): $(OBJECTS) $(OBJMOC) #$ Expand("TARGETDEPS");
- -rm -f $(TARGET)
- #$ Expand("TMAKE_AR_CMD");
- #$ ExpandGlue("TMAKE_RANLIB","",""," \$(TARGET)");
-#$ Config("staticlib") || EnableOutput();
-
-moc: $(SRCMOC)
-
-#$ TmakeSelf();
-
-dist:
- #$ Substitute('$(TAR) $$PROJECT.tar $$PROJECT.pro $(SOURCES) $(HEADERS) $(DIST)');
- #$ Substitute('$(GZIP) $$PROJECT.tar');
-
-clean:
- -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(TARGET)
-#$ (Config("staticlib") || Project("TMAKE_APP_FLAG")) && DisableOutput();
- -rm -f $(TARGET0) $(TARGET1) $(TARGETA)
-#$ (Config("staticlib") || Project("TMAKE_APP_FLAG")) && EnableOutput();
- #$ ExpandGlue("TMAKE_CLEAN","-rm -f "," ","");
- -rm -f *~ core
- #$ ExpandGlue("CLEAN_FILES","-rm -f "," ","");
-
-####### Compile
-
-#$ BuildObj(Project("OBJECTS"),Project("SOURCES"));
-#$ BuildMocObj(Project("OBJMOC"),Project("SRCMOC"));
-#$ BuildMocSrc(Project("HEADERS"));
-#$ BuildMocSrc(Project("SOURCES"));
diff --git a/tmake/lib/unix/lib.t b/tmake/lib/unix/lib.t
deleted file mode 100755
index dd24c63..0000000
--- a/tmake/lib/unix/lib.t
+++ /dev/null
@@ -1,6 +0,0 @@
-#############################################################################
-#!
-#! This is a tmake template for building Unix libraries.
-#!
-#$ Project('TMAKE_LIB_FLAG = 1');
-#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/unix/subdirs.t b/tmake/lib/unix/subdirs.t
deleted file mode 100755
index e2b58a7..0000000
--- a/tmake/lib/unix/subdirs.t
+++ /dev/null
@@ -1,38 +0,0 @@
-#############################################################################
-#!
-#! This is a tmake template for creating a makefile that invokes make in
-#! sub directories - for Unix.
-#!
-#${
- StdInit();
- Project('MAKEFILE') || Project('MAKEFILE = Makefile');
- Project('TMAKE') || Project('TMAKE = tmake');
-#$}
-#!
-# Makefile for building targets in sub directories.
-# Generated by tmake at #$ Now();
-# Project: #$ Expand("PROJECT");
-# Template: #$ Expand("TEMPLATE");
-#############################################################################
-
-MAKEFILE= #$ Expand("MAKEFILE");
-TMAKE = #$ Expand("TMAKE");
-
-SUBDIRS = #$ ExpandList("SUBDIRS");
-
-all: $(SUBDIRS)
-
-$(SUBDIRS): FORCE
- cd $@; $(MAKE)
-
-#$ TmakeSelf();
-
-tmake_all:
-#${
- $text = "\t" . 'for i in $(SUBDIRS); do ( cd $$i ; $(TMAKE) $$i.pro -o $(MAKEFILE); grep "TEMPLATE.*subdirs" $$i.pro 2>/dev/null >/dev/null && $(MAKE) -f $(MAKEFILE) tmake ) ; done';
-#$}
-
-clean:
- for i in $(SUBDIRS); do ( cd $$i ; $(MAKE) clean ) ; done
-
-FORCE:
diff --git a/tmake/lib/unixware-g++/app.t b/tmake/lib/unixware-g++/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/unixware-g++/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/unixware-g++/lib.t b/tmake/lib/unixware-g++/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/unixware-g++/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/unixware-g++/subdirs.t b/tmake/lib/unixware-g++/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/unixware-g++/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/unixware-g++/tmake.conf b/tmake/lib/unixware-g++/tmake.conf
deleted file mode 100755
index d4e063f..0000000
--- a/tmake/lib/unixware-g++/tmake.conf
+++ /dev/null
@@ -1,60 +0,0 @@
-#
-#
-#
-# tmake configuration for sco-g++
-#
-# incl. UnixWare 7
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = gcc
-TMAKE_CFLAGS = -D_UNIXWARE
-TMAKE_CFLAGS_WARN_ON = -Wall -W
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O2
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB = -fPIC
-TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
-
-TMAKE_CXX = g++
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 =
-TMAKE_LIBDIR_X11 = /usr/X/lib
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL =
-TMAKE_LIBDIR_OPENGL =
-
-TMAKE_LINK = g++
-TMAKE_LINK_SHLIB = g++
-TMAKE_LFLAGS =
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHLIB = -shared
-TMAKE_LFLAGS_SONAME =
-
-TMAKE_LIBS = -lc
-TMAKE_LIBS_X11 = -lXext -lX11 -lsocket -lnsl -lm
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu -lXt
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cq
-TMAKE_RANLIB =
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/unixware7-cc/app.t b/tmake/lib/unixware7-cc/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/unixware7-cc/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/unixware7-cc/lib.t b/tmake/lib/unixware7-cc/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/unixware7-cc/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/unixware7-cc/subdirs.t b/tmake/lib/unixware7-cc/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/unixware7-cc/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/unixware7-cc/tmake.conf b/tmake/lib/unixware7-cc/tmake.conf
deleted file mode 100755
index 6e239dc..0000000
--- a/tmake/lib/unixware7-cc/tmake.conf
+++ /dev/null
@@ -1,60 +0,0 @@
-#
-#
-#
-# tmake configuration for sco-g++
-#
-# (UnixWare file, with different -D)
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = cc
-TMAKE_CFLAGS =
-TMAKE_CFLAGS_WARN_ON = -Wall -W
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O -T used
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB = -K PIC
-TMAKE_CFLAGS_YACC =
-
-TMAKE_CXX = CC
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 =
-TMAKE_LIBDIR_X11 = /usr/X/lib
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL =
-TMAKE_LIBDIR_OPENGL =
-
-TMAKE_LINK = CC
-TMAKE_LINK_SHLIB = CC
-TMAKE_LFLAGS =
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHLIB = -G
-TMAKE_LFLAGS_SONAME =
-
-TMAKE_LIBS =
-TMAKE_LIBS_X11 = -lXext -lX11 -lsocket -lnsl -lm
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu -lXt
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cq
-TMAKE_RANLIB =
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/unixware7-g++/app.t b/tmake/lib/unixware7-g++/app.t
deleted file mode 100755
index 867725e..0000000
--- a/tmake/lib/unixware7-g++/app.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/app.t");
diff --git a/tmake/lib/unixware7-g++/lib.t b/tmake/lib/unixware7-g++/lib.t
deleted file mode 100755
index 2523b2f..0000000
--- a/tmake/lib/unixware7-g++/lib.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/lib.t");
diff --git a/tmake/lib/unixware7-g++/subdirs.t b/tmake/lib/unixware7-g++/subdirs.t
deleted file mode 100755
index 5e888af..0000000
--- a/tmake/lib/unixware7-g++/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Unix template
-#$ IncludeTemplate("../unix/subdirs.t");
diff --git a/tmake/lib/unixware7-g++/tmake.conf b/tmake/lib/unixware7-g++/tmake.conf
deleted file mode 100755
index 44f30a5..0000000
--- a/tmake/lib/unixware7-g++/tmake.conf
+++ /dev/null
@@ -1,60 +0,0 @@
-#
-#
-#
-# tmake configuration for sco-g++
-#
-# (UnixWare file, with different -D)
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = gcc
-TMAKE_CFLAGS = -D_UNIXWARE7
-TMAKE_CFLAGS_WARN_ON = -Wall -W
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O2
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_SHLIB = -fPIC
-TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
-
-TMAKE_CXX = g++
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_SHLIB = $$TMAKE_CFLAGS_SHLIB
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_LIBDIR =
-TMAKE_INCDIR_X11 =
-TMAKE_LIBDIR_X11 = /usr/X/lib
-TMAKE_INCDIR_QT = $(QTDIR)/include
-TMAKE_LIBDIR_QT = $(QTDIR)/lib
-TMAKE_INCDIR_OPENGL =
-TMAKE_LIBDIR_OPENGL =
-
-TMAKE_LINK = g++
-TMAKE_LINK_SHLIB = g++
-TMAKE_LFLAGS =
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_SHLIB = -shared
-TMAKE_LFLAGS_SONAME =
-
-TMAKE_LIBS = -lc
-TMAKE_LIBS_X11 = -lXext -lX11 -lsocket -lnsl -lm
-TMAKE_LIBS_QT = -lqt
-TMAKE_LIBS_QT_MT = -lqt-mt
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lMesaGL -lMesaGLU -lXmu -lXt
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cq
-TMAKE_RANLIB =
-
-TMAKE_TAR = tar -cf
-TMAKE_GZIP = gzip -9f
diff --git a/tmake/lib/win32-borland/app.t b/tmake/lib/win32-borland/app.t
deleted file mode 100755
index fc4dc2c..0000000
--- a/tmake/lib/win32-borland/app.t
+++ /dev/null
@@ -1,6 +0,0 @@
-#############################################################################
-#!
-#! This is a tmake template for building Win32 applications.
-#!
-#$ Project('TMAKE_APP_FLAG = 1');
-#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/win32-borland/generic.t b/tmake/lib/win32-borland/generic.t
deleted file mode 100755
index 0cf8711..0000000
--- a/tmake/lib/win32-borland/generic.t
+++ /dev/null
@@ -1,237 +0,0 @@
-#!
-#! This is a tmake template for building Win32 applications or libraries.
-#!
-#${
- if ( Config("qt") ) {
- if ( !(Project("DEFINES") =~ /QT_NODLL/) &&
- ((Project("DEFINES") =~ /QT_(?:MAKE)?DLL/) ||
- ($ENV{"QT_DLL"} && !$ENV{"QT_NODLL"})) ) {
- Project('TMAKE_QT_DLL = 1');
- if ( (Project("TARGET") eq "qt") && Project("TMAKE_LIB_FLAG") ) {
- Project('CONFIG += dll');
- }
- }
- }
- if ( Config("dll") || Project("TMAKE_APP_FLAG") ) {
- Project('CONFIG -= staticlib');
- Project('TMAKE_APP_OR_DLL = 1');
- } else {
- Project('CONFIG += staticlib');
- }
- if ( Config("warn_off") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_OFF');
- Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_WARN_OFF');
- } elsif ( Config("warn_on") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_ON');
- Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_WARN_ON');
- }
- if ( Config("debug") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_DEBUG');
- Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_DEBUG');
- Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_DEBUG');
- } elsif ( Config("release") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_RELEASE');
- Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_RELEASE');
- Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_RELEASE');
- }
- if ( Config("qt") || Config("opengl") ) {
- Project('CONFIG += windows' );
- }
- if ( Config("qt") ) {
- Project('CONFIG *= moc');
- AddIncludePath(Project("TMAKE_INCDIR_QT"));
- if ( Config("release") ) {
- Project('DEFINES += NO_DEBUG');
- }
- if ( Config("opengl") ) {
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_OPENGL');
- }
- if ( (Project("TARGET") eq "qt") && Project("TMAKE_LIB_FLAG") ) {
- if ( Project("TMAKE_QT_DLL") ) {
- Project('DEFINES -= QT_DLL');
- Project('DEFINES *= QT_MAKEDLL');
- Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_QT_DLL');
- }
- } else {
- if ( Project("TMAKE_QT_DLL") ) {
- Project('DEFINES *= QT_DLL');
- }
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT');
- if ( Project("TMAKE_QT_DLL") ) {
- my $qtver =FindHighestLibVersion($ENV{"QTDIR"} . "/lib", "qt");
- Project("TMAKE_LIBS /= s/qt.lib/qt${qtver}.lib/");
- if ( !Config("dll") ) {
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_DLL');
- }
- }
- }
- }
- if ( Config("opengl") ) {
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_OPENGL');
- }
- if ( Config("dll") ) {
- Project('TMAKE_LFLAGS_CONSOLE_ANY = $$TMAKE_LFLAGS_CONSOLE_DLL');
- Project('TMAKE_LFLAGS_WINDOWS_ANY = $$TMAKE_LFLAGS_WINDOWS_DLL');
- if ( Project("TMAKE_LIB_FLAG") ) {
- my $ver = Project("VERSION");
- $ver =~ s/\.//g;
- $project{"TARGET_EXT"} = "${ver}.dll";
- } else {
- $project{"TARGET_EXT"} = ".dll";
- }
- } else {
- Project('TMAKE_LFLAGS_CONSOLE_ANY = $$TMAKE_LFLAGS_CONSOLE');
- Project('TMAKE_LFLAGS_WINDOWS_ANY = $$TMAKE_LFLAGS_WINDOWS');
- if ( Project("TMAKE_APP_FLAG") ) {
- $project{"TARGET_EXT"} = ".exe";
- } else {
- $project{"TARGET_EXT"} = ".lib";
- }
- }
- if ( Config("windows") ) {
- if ( Config("console") ) {
- Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_CONSOLE_ANY');
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_CONSOLE');
- } else {
- Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_WINDOWS_ANY');
- }
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_WINDOWS');
- } else {
- Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_CONSOLE_ANY');
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_CONSOLE');
- }
- if ( Config("moc") ) {
- $moc_aware = 1;
- }
- Project('TMAKE_LIBS += $$LIBS');
- Project('TMAKE_FILETAGS = HEADERS SOURCES DEF_FILE RC_FILE TARGET TMAKE_LIBS DESTDIR DLLDESTDIR $$FILETAGS');
- foreach ( split(/\s/,Project("TMAKE_FILETAGS")) ) {
- $project{$_} =~ s-[/\\]+-\\-g;
- }
- if ( Project("DEF_FILE") ) {
- Project('TMAKE_LFLAGS *= /DEF:$$DEF_FILE');
- }
- if ( Project("RC_FILE") ) {
- if ( Project("RES_FILE") ) {
- tmake_error("Both .rc and .res file specified.\n" .
- "Please specify one of them, not both.");
- }
- $project{"RES_FILE"} = $project{"RC_FILE"};
- $project{"RES_FILE"} =~ s/\.rc$/.res/i;
- Project('TARGETDEPS += $$RES_FILE');
- }
- if ( Project("RES_FILE") ) {
- Project('TMAKE_LIBS *= $$RES_FILE');
- }
- StdInit();
- if ( Project("VERSION") ) {
- $project{"VER_MAJ"} = $project{"VERSION"};
- $project{"VER_MAJ"} =~ s/\.\d+$//;
- $project{"VER_MIN"} = $project{"VERSION"};
- $project{"VER_MIN"} =~ s/^\d+\.//;
- }
- Project('TMAKE_CLEAN += $$TARGET.tds');
-#$}
-#!
-# Makefile for building #$ Expand("TARGET")
-# Generated by tmake at #$ Now();
-# Project: #$ Expand("PROJECT");
-# Template: #$ Expand("TEMPLATE");
-#############################################################################
-
-!if !$d(BCB)
-BCB = $(MAKEDIR)\..
-!endif
-
-####### Compiler, tools and options
-
-CC = #$ Expand("TMAKE_CC");
-CXX = #$ Expand("TMAKE_CXX");
-CFLAGS = #$ Expand("TMAKE_CFLAGS"); ExpandGlue("DEFINES","-D"," -D","");
-CXXFLAGS= #$ Expand("TMAKE_CXXFLAGS"); ExpandGlue("DEFINES","-D"," -D","");
-INCPATH = #$ ExpandPath("INCPATH",'-I',' -I','');
-#$ !Project("TMAKE_APP_OR_DLL") && DisableOutput();
-LINK = #$ Expand("TMAKE_LINK");
-LFLAGS = #$ Expand("TMAKE_LFLAGS");
-LIBS = #$ Expand("TMAKE_LIBS");
-#$ !Project("TMAKE_APP_OR_DLL") && EnableOutput();
-#$ Project("TMAKE_APP_OR_DLL") && DisableOutput();
-LIB = #$ Expand("TMAKE_LIB");
-#$ Project("TMAKE_APP_OR_DLL") && EnableOutput();
-MOC = #$ Expand("TMAKE_MOC");
-
-ZIP = #$ Expand("TMAKE_ZIP");
-
-####### Files
-
-HEADERS = #$ ExpandList("HEADERS");
-SOURCES = #$ ExpandList("SOURCES");
-OBJECTS = #$ ExpandList("OBJECTS");
-SRCMOC = #$ ExpandList("SRCMOC");
-OBJMOC = #$ ExpandList("OBJMOC");
-DIST = #$ ExpandList("DISTFILES");
-TARGET = #$ ExpandGlue("TARGET",$project{"DESTDIR"},"",$project{"TARGET_EXT"});
-
-####### Implicit rules
-
-.SUFFIXES: .cpp .cxx .cc .c
-
-.cpp.obj:
- #$ Expand("TMAKE_RUN_CXX_IMP");
-
-.cxx.obj:
- #$ Expand("TMAKE_RUN_CXX_IMP");
-
-.cc.obj:
- #$ Expand("TMAKE_RUN_CXX_IMP");
-
-.c.obj:
- #$ Expand("TMAKE_RUN_CC_IMP");
-
-####### Build rules
-
-all: #$ ExpandGlue("ALL_DEPS",""," "," "); $text .= '$(TARGET)';
-
-$(TARGET): $(OBJECTS) $(OBJMOC) #$ Expand("TARGETDEPS");
-#$ Project("TMAKE_APP_OR_DLL") || DisableOutput();
- $(LINK) @&&|
- $(LFLAGS) $(OBJECTS) $(OBJMOC), $(TARGET),,$(LIBS)
-#$ Project("TMAKE_APP_OR_DLL") || EnableOutput();
-#$ Project("TMAKE_APP_OR_DLL") && DisableOutput();
- -del $(TARGET)
- $(LIB) $(TARGET) @&&|
-#${
-# $text = "+" . join(" \\\n+",split(/\s+/,$project{"OBJECTS"})) . " \\\n+"
-# . join(" \\\n+",split(/\s+/,$project{"OBJMOC"}));
-#$}
-#$ Project("TMAKE_APP_OR_DLL") && EnableOutput();
-|
-#$ (Config("dll") && Project("DLLDESTDIR")) || DisableOutput();
- -copy $(TARGET) #$ Expand("DLLDESTDIR");
-#$ (Config("dll") && Project("DLLDESTDIR")) || EnableOutput();
-#$ Project("RC_FILE") || DisableOutput();
-
-#$ Substitute("\$\$RES_FILE: \$\$RC_FILE\n\t\$\$TMAKE_RC \$\$RC_FILE");
-#$ Project("RC_FILE") || EnableOutput();
-
-moc: $(SRCMOC)
-
-#$ TmakeSelf();
-
-dist:
- #$ Substitute('$(ZIP) $$PROJECT.zip $$PROJECT.pro $(SOURCES) $(HEADERS) $(DIST)');
-
-clean:
- #$ ExpandGlue("OBJECTS","-del ","\n\t-del ","");
- #$ ExpandGlue("SRCMOC" ,"-del ","\n\t-del ","");
- #$ ExpandGlue("OBJMOC" ,"-del ","\n\t-del ","");
- -del $(TARGET)
- #$ ExpandGlue("TMAKE_CLEAN","-del ","\n\t-del ","");
- #$ ExpandGlue("CLEAN_FILES","-del ","\n\t-del ","");
-
-####### Compile
-
-#$ BuildObj(Project("OBJECTS"),Project("SOURCES"));
-#$ BuildMocObj(Project("OBJMOC"),Project("SRCMOC"));
-#$ BuildMocSrc(Project("HEADERS"));
-#$ BuildMocSrc(Project("SOURCES"));
diff --git a/tmake/lib/win32-borland/lib.t b/tmake/lib/win32-borland/lib.t
deleted file mode 100755
index d8ac6c7..0000000
--- a/tmake/lib/win32-borland/lib.t
+++ /dev/null
@@ -1,6 +0,0 @@
-#############################################################################
-#!
-#! This is a tmake template for building Win32 libraries.
-#!
-#$ Project('TMAKE_LIB_FLAG = 1');
-#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/win32-borland/subdirs.t b/tmake/lib/win32-borland/subdirs.t
deleted file mode 100755
index f08e41f..0000000
--- a/tmake/lib/win32-borland/subdirs.t
+++ /dev/null
@@ -1,3 +0,0 @@
-#! Use the common Win32 template
-#$ Project("TMAKE_NOFORCE = 1");
-#$ IncludeTemplate("../win32/subdirs.t");
diff --git a/tmake/lib/win32-borland/tmake.conf b/tmake/lib/win32-borland/tmake.conf
deleted file mode 100755
index bce6f1a..0000000
--- a/tmake/lib/win32-borland/tmake.conf
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-#
-#
-# tmake configuration for Win32/Borland C++
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = bcc32
-TMAKE_CFLAGS =
-TMAKE_CFLAGS_WARN_ON = -w
-TMAKE_CFLAGS_WARN_OFF = -w-
-TMAKE_CFLAGS_RELEASE = -O2
-TMAKE_CFLAGS_DEBUG = -v
-TMAKE_CFLAGS_YACC =
-
-TMAKE_CXX = $$TMAKE_CC
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_INCDIR_QT = $(QTDIR)\include
-
-TMAKE_RUN_CC = $(CC) -c $(CFLAGS) $(INCPATH) -o$obj $src
-TMAKE_RUN_CC_IMP = $(CC) -c $(CFLAGS) $(INCPATH) -o$@ $<
-TMAKE_RUN_CXX = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o$obj $src
-TMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o$@ $<
-
-TMAKE_LINK = ilink32
-TMAKE_LFLAGS = -L$(BCB)\lib -c -x -Gn
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG = -v
-TMAKE_LFLAGS_CONSOLE = -ap -Tpe c0x32.obj
-TMAKE_LFLAGS_WINDOWS = -aa -Tpe c0w32.obj
-TMAKE_LFLAGS_CONSOLE_DLL= -Gi -ap -Tpd c0d32.obj
-TMAKE_LFLAGS_WINDOWS_DLL= -Gi -aa -Tpd c0d32.obj
-
-TMAKE_LIBS = import32.lib cw32.lib
-TMAKE_LIBS_CONSOLE =
-TMAKE_LIBS_WINDOWS =
-TMAKE_LIBS_QT = $(QTDIR)\lib\qt.lib
-TMAKE_LIBS_QT_DLL = $(QTDIR)\lib\qtmain.lib
-TMAKE_LIBS_QT_OPENGL = $(QTDIR)\lib\qgl.lib
-TMAKE_LIBS_OPENGL =
-
-TMAKE_MOC = moc
-
-TMAKE_LIB = tlib /C /P256
-TMAKE_RC = brc32
-
-TMAKE_ZIP = zip -r -9
diff --git a/tmake/lib/win32-g++/app.t b/tmake/lib/win32-g++/app.t
deleted file mode 100755
index fc4dc2c..0000000
--- a/tmake/lib/win32-g++/app.t
+++ /dev/null
@@ -1,6 +0,0 @@
-#############################################################################
-#!
-#! This is a tmake template for building Win32 applications.
-#!
-#$ Project('TMAKE_APP_FLAG = 1');
-#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/win32-g++/generic.t b/tmake/lib/win32-g++/generic.t
deleted file mode 100755
index edc7a47..0000000
--- a/tmake/lib/win32-g++/generic.t
+++ /dev/null
@@ -1,241 +0,0 @@
-#!
-#! This is a tmake template for building Win32 applications or libraries.
-#!
-#${
- if ( Config("qt") ) {
- if ( !(Project("DEFINES") =~ /QT_NODLL/) &&
- ((Project("DEFINES") =~ /QT_(?:MAKE)?DLL/) ||
- ($ENV{"QT_DLL"} && !$ENV{"QT_NODLL"})) ) {
- Project('TMAKE_QT_DLL = 1');
- if ( (Project("TARGET") eq "qt") && Project("TMAKE_LIB_FLAG") ) {
- Project('CONFIG += dll');
- }
- }
- }
- if ( Config("dll") || Project("TMAKE_APP_FLAG") ) {
- Project('CONFIG -= staticlib');
- Project('TMAKE_APP_OR_DLL = 1');
- } else {
- Project('CONFIG += staticlib');
- }
- if ( Config("warn_off") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_OFF');
- Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_WARN_OFF');
- } elsif ( Config("warn_on") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_ON');
- Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_WARN_ON');
- }
- if ( Config("debug") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_DEBUG');
- Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_DEBUG');
- Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_DEBUG');
- } elsif ( Config("release") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_RELEASE');
- Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_RELEASE');
- Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_RELEASE');
- }
- if ( Config("qt") || Config("opengl") ) {
- Project('CONFIG += windows' );
- }
- if ( Config("qt") ) {
- Project('CONFIG *= moc');
- AddIncludePath(Project("TMAKE_INCDIR_QT"));
- if ( Config("release") ) {
- Project('DEFINES += NO_DEBUG');
- }
- if ( Config("opengl") ) {
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_OPENGL');
- }
- if ( (Project("TARGET") eq "qt") && Project("TMAKE_LIB_FLAG") ) {
- if ( Project("TMAKE_QT_DLL") ) {
- Project('DEFINES -= QT_DLL');
- Project('DEFINES *= QT_MAKEDLL');
- Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_QT_DLL');
- }
- } else {
- if ( Project("TMAKE_QT_DLL") ) {
- Project('DEFINES *= QT_DLL');
- }
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT');
- if ( Project("TMAKE_QT_DLL") ) {
- my $qtver =FindHighestLibVersion($ENV{"QTDIR"} . "/lib", "qt");
- Project("TMAKE_LIBS /= s/qt.lib/qt${qtver}.lib/");
- if ( !Config("dll") ) {
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_DLL');
- }
- }
- }
- }
- if ( Config("opengl") ) {
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_OPENGL');
- }
- if ( Config("dll") ) {
- Project('TMAKE_LFLAGS_CONSOLE_ANY = $$TMAKE_LFLAGS_CONSOLE_DLL');
- Project('TMAKE_LFLAGS_WINDOWS_ANY = $$TMAKE_LFLAGS_WINDOWS_DLL');
- if ( Project("TMAKE_LIB_FLAG") ) {
- my $ver = Project("VERSION");
- $ver =~ s/\.//g;
- $project{"TARGET_EXT"} = "${ver}.dll";
- } else {
- $project{"TARGET_EXT"} = ".dll";
- }
- } else {
- Project('TMAKE_LFLAGS_CONSOLE_ANY = $$TMAKE_LFLAGS_CONSOLE');
- Project('TMAKE_LFLAGS_WINDOWS_ANY = $$TMAKE_LFLAGS_WINDOWS');
- if ( Project("TMAKE_APP_FLAG") ) {
- $project{"TARGET_EXT"} = ".exe";
- } else {
- $project{"TARGET_EXT"} = ".a";
- }
- }
- if ( Config("windows") ) {
- if ( Config("console") ) {
- Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_CONSOLE_ANY');
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_CONSOLE');
- } else {
- Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_WINDOWS_ANY');
- }
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_WINDOWS');
- } else {
- Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_CONSOLE_ANY');
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_CONSOLE');
- }
- if ( Config("moc") ) {
- $moc_aware = 1;
- }
- Project('TMAKE_LIBS += $$LIBS');
- Project('TMAKE_FILETAGS = HEADERS SOURCES DEF_FILE RC_FILE TARGET TMAKE_LIBS DESTDIR DLLDESTDIR $$FILETAGS');
- foreach ( split(/\s/,Project("TMAKE_FILETAGS")) ) {
- $project{$_} =~ s-[/\\]+-/-g;
- }
- if ( Project("DEF_FILE") ) {
- Project('TMAKE_LFLAGS *= $$DEF_FILE');
- }
- if ( Project("RC_FILE") ) {
- if ( Project("RES_FILE") ) {
- tmake_error("Both .rc and .res file specified.\n" .
- "Please specify one of them, not both.");
- }
- $project{"RES_FILE"} = $project{"RC_FILE"};
- $project{"RES_FILE"} =~ s/\.rc$/.res/i;
- Project('TARGETDEPS += $$RES_FILE');
- }
- if ( Project("RES_FILE") ) {
- Project('TMAKE_LIBS *= $$RES_FILE');
- }
- $obj_ext = "o";
- $dir_sep = "/";
- $gnuwin32 = 1;
- if ( Config("qt") ) {
- $qtdir = $ENV{"QTDIR"};
- $project{"INCPATH"} =~ s/\$\(QTDIR\)/$qtdir/;
- $project{"INCPATH"} =~ s/\\/\//g;
- $project{"TMAKE_LIBS"} =~ s/\$\(QTDIR\)/$qtdir/;
- $project{"TMAKE_LIBS"} =~ s/\\/\//g;
- }
- StdInit();
- if ( Project("VERSION") ) {
- $project{"VER_MAJ"} = $project{"VERSION"};
- $project{"VER_MAJ"} =~ s/\.\d+$//;
- $project{"VER_MIN"} = $project{"VERSION"};
- $project{"VER_MIN"} =~ s/^\d+\.//;
- }
- if ( Config("staticlib") ) {
- $project{"TARGET"} = $project{"DESTDIR"} . "lib" . $project{"TARGET"}
- } else {
- $project{"TARGET"} = $project{"DESTDIR"} . $project{"TARGET"}
- }
-#$}
-#!
-# Makefile for building #$ Expand("TARGET")
-# Generated by tmake at #$ Now();
-# Project: #$ Expand("PROJECT");
-# Template: #$ Expand("TEMPLATE");
-#############################################################################
-
-####### Compiler, tools and options
-
-CC = #$ Expand("TMAKE_CC");
-CXX = #$ Expand("TMAKE_CXX");
-CFLAGS = #$ Expand("TMAKE_CFLAGS"); ExpandGlue("DEFINES","-D"," -D","");
-CXXFLAGS= #$ Expand("TMAKE_CXXFLAGS"); ExpandGlue("DEFINES","-D"," -D","");
-INCPATH = #$ ExpandPath("INCPATH",'-I',' -I','');
-#$ !Project("TMAKE_APP_OR_DLL") && DisableOutput();
-LINK = #$ Expand("TMAKE_LINK");
-LFLAGS = #$ Expand("TMAKE_LFLAGS");
-LIBS = #$ Expand("TMAKE_LIBS");
-#$ !Project("TMAKE_APP_OR_DLL") && EnableOutput();
-#$ Project("TMAKE_APP_OR_DLL") && DisableOutput();
-AR = #$ Expand("TMAKE_AR");
-RANLIB = #$ Expand("TMAKE_RANLIB");
-#$ Project("TMAKE_APP_OR_DLL") && EnableOutput();
-MOC = #$ Expand("TMAKE_MOC");
-
-ZIP = #$ Expand("TMAKE_ZIP");
-
-####### Files
-
-HEADERS = #$ ExpandList("HEADERS");
-SOURCES = #$ ExpandList("SOURCES");
-OBJECTS = #$ ExpandList("OBJECTS");
-SRCMOC = #$ ExpandList("SRCMOC");
-OBJMOC = #$ ExpandList("OBJMOC");
-DIST = #$ ExpandList("DISTFILES");
-TARGET = #$ ExpandGlue("TARGET",$project{"DESTDIR"},"",$project{"TARGET_EXT"});
-
-####### Implicit rules
-
-.SUFFIXES: .cpp .cxx .cc .c
-
-.cpp.o:
- #$ Expand("TMAKE_RUN_CXX_IMP");
-
-.cxx.o:
- #$ Expand("TMAKE_RUN_CXX_IMP");
-
-.cc.o:
- #$ Expand("TMAKE_RUN_CXX_IMP");
-
-.c.o:
- #$ Expand("TMAKE_RUN_CC_IMP");
-
-####### Build rules
-
-all: #$ ExpandGlue("ALL_DEPS",""," "," "); $text .= '$(TARGET)';
-
-$(TARGET): $(OBJECTS) $(OBJMOC) #$ Expand("TARGETDEPS");
-#$ Project("TMAKE_APP_OR_DLL") || DisableOutput();
- $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS)
-#$ Project("TMAKE_APP_OR_DLL") || EnableOutput();
-#$ Project("TMAKE_APP_OR_DLL") && DisableOutput();
- -rm -f $(TARGET)
- $(AR) $(TARGET) $(OBJECTS) $(OBJMOC)
- #$ ExpandGlue("TMAKE_RANLIB","",""," \$(TARGET)");
-#$ Project("TMAKE_APP_OR_DLL") && EnableOutput();
-#$ (Config("dll") && Project("DLLDESTDIR")) || DisableOutput();
- -cp $(TARGET) #$ Expand("DLLDESTDIR");
-#$ (Config("dll") && Project("DLLDESTDIR")) || EnableOutput();
-#$ Project('RC_FILE') || DisableOutput();
-
-#$ Substitute("\$\$RES_FILE: \$\$RC_FILE\n\t\$\$TMAKE_RC \$\$RC_FILE");
-#$ Project('RC_FILE') || EnableOutput();
-
-moc: $(SRCMOC)
-
-#$ TmakeSelf();
-
-dist:
- #$ Substitute('$(ZIP) $$PROJECT.zip $$PROJECT.pro $(SOURCES) $(HEADERS) $(DIST)');
-
-clean:
- -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(TARGET)
- #$ ExpandGlue("TMAKE_CLEAN","-rm -f "," ","");
- -rm -f *~ core
- #$ ExpandGlue("CLEAN_FILES","-rm -f "," ","");
-
-####### Compile
-
-#$ BuildObj(Project("OBJECTS"),Project("SOURCES"));
-#$ BuildMocObj(Project("OBJMOC"),Project("SRCMOC"));
-#$ BuildMocSrc(Project("HEADERS"));
-#$ BuildMocSrc(Project("SOURCES"));
diff --git a/tmake/lib/win32-g++/lib.t b/tmake/lib/win32-g++/lib.t
deleted file mode 100755
index d8ac6c7..0000000
--- a/tmake/lib/win32-g++/lib.t
+++ /dev/null
@@ -1,6 +0,0 @@
-#############################################################################
-#!
-#! This is a tmake template for building Win32 libraries.
-#!
-#$ Project('TMAKE_LIB_FLAG = 1');
-#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/win32-g++/subdirs.t b/tmake/lib/win32-g++/subdirs.t
deleted file mode 100755
index 8b881ab..0000000
--- a/tmake/lib/win32-g++/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Win32 template
-#$ IncludeTemplate("../win32/subdirs.t");
diff --git a/tmake/lib/win32-g++/tmake.conf b/tmake/lib/win32-g++/tmake.conf
deleted file mode 100755
index d313a44..0000000
--- a/tmake/lib/win32-g++/tmake.conf
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-#
-#
-# tmake configuration for Win32/g++ (Cygnus gnu-win32)
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = gcc
-TMAKE_CFLAGS =
-TMAKE_CFLAGS_WARN_ON =
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
-
-TMAKE_CXX = g++
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_INCDIR_QT = $(QTDIR)/include
-
-TMAKE_RUN_CC = $(CC) -c $(CFLAGS) $(INCPATH) -o $obj $src
-TMAKE_RUN_CC_IMP = $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
-TMAKE_RUN_CXX = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $obj $src
-TMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
-
-TMAKE_LINK = g++
-TMAKE_LFLAGS =
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_CONSOLE = -Wl,-subsystem,console
-TMAKE_LFLAGS_WINDOWS = -Wl,-subsystem,windows
-TMAKE_LFLAGS_CONSOLE_DLL= -Wl,-subsystem,console
-TMAKE_LFLAGS_WINDOWS_DLL= -Wl,-subsystem,windows
-
-TMAKE_LIBS =
-TMAKE_LIBS_CONSOLE =
-TMAKE_LIBS_WINDOWS = -luser32 -lgdi32 -lcomdlg32 -limm32 -lole32 -luuid -lwsock32
-TMAKE_LIBS_QT = -L$(QTDIR)/lib -lqt
-TMAKE_LIBS_QT_DLL = -lqtmain
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lopengl32
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cqs
-TMAKE_RANLIB =
-
-TMAKE_ZIP = zip -r -9
diff --git a/tmake/lib/win32-mingw/app.t b/tmake/lib/win32-mingw/app.t
deleted file mode 100755
index fc4dc2c..0000000
--- a/tmake/lib/win32-mingw/app.t
+++ /dev/null
@@ -1,6 +0,0 @@
-#############################################################################
-#!
-#! This is a tmake template for building Win32 applications.
-#!
-#$ Project('TMAKE_APP_FLAG = 1');
-#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/win32-mingw/generic.t b/tmake/lib/win32-mingw/generic.t
deleted file mode 100755
index 4d333c1..0000000
--- a/tmake/lib/win32-mingw/generic.t
+++ /dev/null
@@ -1,241 +0,0 @@
-#!
-#! This is a tmake template for building Win32 applications or libraries.
-#!
-#${
- if ( Config("qt") ) {
- if ( !(Project("DEFINES") =~ /QT_NODLL/) &&
- ((Project("DEFINES") =~ /QT_(?:MAKE)?DLL/) ||
- ($ENV{"QT_DLL"} && !$ENV{"QT_NODLL"})) ) {
- Project('TMAKE_QT_DLL = 1');
- if ( (Project("TARGET") eq "qt") && Project("TMAKE_LIB_FLAG") ) {
- Project('CONFIG += dll');
- }
- }
- }
- if ( Config("dll") || Project("TMAKE_APP_FLAG") ) {
- Project('CONFIG -= staticlib');
- Project('TMAKE_APP_OR_DLL = 1');
- } else {
- Project('CONFIG += staticlib');
- }
- if ( Config("warn_off") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_OFF');
- Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_WARN_OFF');
- } elsif ( Config("warn_on") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_ON');
- Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_WARN_ON');
- }
- if ( Config("debug") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_DEBUG');
- Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_DEBUG');
- Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_DEBUG');
- } elsif ( Config("release") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_RELEASE');
- Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_RELEASE');
- Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_RELEASE');
- }
- if ( Config("qt") || Config("opengl") ) {
- Project('CONFIG += windows' );
- }
- if ( Config("qt") ) {
- Project('CONFIG *= moc');
- AddIncludePath(Project("TMAKE_INCDIR_QT"));
- if ( Config("release") ) {
- Project('DEFINES += NO_DEBUG');
- }
- if ( Config("opengl") ) {
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_OPENGL');
- }
- if ( (Project("TARGET") eq "qt") && Project("TMAKE_LIB_FLAG") ) {
- if ( Project("TMAKE_QT_DLL") ) {
- Project('DEFINES -= QT_DLL');
- Project('DEFINES *= QT_MAKEDLL');
- Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_QT_DLL');
- }
- } else {
- if ( Project("TMAKE_QT_DLL") ) {
- Project('DEFINES *= QT_DLL');
- }
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT');
- if ( Project("TMAKE_QT_DLL") ) {
- my $qtver =FindHighestLibVersion($ENV{"QTDIR"} . "/lib", "qt");
- Project("TMAKE_LIBS /= s/qt.lib/qt${qtver}.lib/");
- if ( !Config("dll") ) {
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_DLL');
- }
- }
- }
- }
- if ( Config("opengl") ) {
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_OPENGL');
- }
- if ( Config("dll") ) {
- Project('TMAKE_LFLAGS_CONSOLE_ANY = $$TMAKE_LFLAGS_CONSOLE_DLL');
- Project('TMAKE_LFLAGS_WINDOWS_ANY = $$TMAKE_LFLAGS_WINDOWS_DLL');
- if ( Project("TMAKE_LIB_FLAG") ) {
- my $ver = Project("VERSION");
- $ver =~ s/\.//g;
- $project{"TARGET_EXT"} = "${ver}.dll";
- } else {
- $project{"TARGET_EXT"} = ".dll";
- }
- } else {
- Project('TMAKE_LFLAGS_CONSOLE_ANY = $$TMAKE_LFLAGS_CONSOLE');
- Project('TMAKE_LFLAGS_WINDOWS_ANY = $$TMAKE_LFLAGS_WINDOWS');
- if ( Project("TMAKE_APP_FLAG") ) {
- $project{"TARGET_EXT"} = ".exe";
- } else {
- $project{"TARGET_EXT"} = ".a";
- }
- }
- if ( Config("windows") ) {
- if ( Config("console") ) {
- Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_CONSOLE_ANY');
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_CONSOLE');
- } else {
- Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_WINDOWS_ANY');
- }
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_WINDOWS');
- } else {
- Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_CONSOLE_ANY');
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_CONSOLE');
- }
- if ( Config("moc") ) {
- $moc_aware = 1;
- }
- Project('TMAKE_LIBS += $$LIBS');
- Project('TMAKE_FILETAGS = HEADERS SOURCES DEF_FILE RC_FILE TARGET TMAKE_LIBS DESTDIR DLLDESTDIR $$FILETAGS');
- foreach ( split(/\s/,Project("TMAKE_FILETAGS")) ) {
- $project{$_} =~ s-[/\\]+-/-g;
- }
- if ( Project("DEF_FILE") ) {
- Project('TMAKE_LFLAGS *= $$DEF_FILE');
- }
- if ( Project("RC_FILE") ) {
- if ( Project("RES_FILE") ) {
- tmake_error("Both .rc and .res file specified.\n" .
- "Please specify one of them, not both.");
- }
- $project{"RES_FILE"} = $project{"RC_FILE"};
- $project{"RES_FILE"} =~ s/\.rc$/.res/i;
- Project('TARGETDEPS += $$RES_FILE');
- }
- if ( Project("RES_FILE") ) {
- Project('TMAKE_LIBS *= $$RES_FILE');
- }
- $obj_ext = "o";
- $dir_sep = "/";
- $gnuwin32 = 1;
- if ( Config("qt") ) {
- $qtdir = $ENV{"QTDIR"};
- $project{"INCPATH"} =~ s/\$\(QTDIR\)/$qtdir/;
- $project{"INCPATH"} =~ s/\\/\//g;
- $project{"TMAKE_LIBS"} =~ s/\$\(QTDIR\)/$qtdir/;
- $project{"TMAKE_LIBS"} =~ s/\\/\//g;
- }
- StdInit();
- if ( Project("VERSION") ) {
- $project{"VER_MAJ"} = $project{"VERSION"};
- $project{"VER_MAJ"} =~ s/\.\d+$//;
- $project{"VER_MIN"} = $project{"VERSION"};
- $project{"VER_MIN"} =~ s/^\d+\.//;
- }
- if ( Config("staticlib") ) {
- $project{"TARGET"} = $project{"DESTDIR"} . "lib" . $project{"TARGET"};
- } else {
- $project{"TARGET"} = $project{"DESTDIR"} . $project{"TARGET"};
- }
-#$}
-#!
-# Makefile for building #$ Expand("TARGET")
-# Generated by tmake at #$ Now();
-# Project: #$ Expand("PROJECT");
-# Template: #$ Expand("TEMPLATE");
-#############################################################################
-
-####### Compiler, tools and options
-
-CC = #$ Expand("TMAKE_CC");
-CXX = #$ Expand("TMAKE_CXX");
-CFLAGS = #$ Expand("TMAKE_CFLAGS"); ExpandGlue("DEFINES","-D"," -D","");
-CXXFLAGS= #$ Expand("TMAKE_CXXFLAGS"); ExpandGlue("DEFINES","-D"," -D","");
-INCPATH = #$ ExpandPath("INCPATH",'-I',' -I','');
-#$ !Project("TMAKE_APP_OR_DLL") && DisableOutput();
-LINK = #$ Expand("TMAKE_LINK");
-LFLAGS = #$ Expand("TMAKE_LFLAGS");
-LIBS = #$ Expand("TMAKE_LIBS");
-#$ !Project("TMAKE_APP_OR_DLL") && EnableOutput();
-#$ Project("TMAKE_APP_OR_DLL") && DisableOutput();
-AR = #$ Expand("TMAKE_AR");
-RANLIB = #$ Expand("TMAKE_RANLIB");
-#$ Project("TMAKE_APP_OR_DLL") && EnableOutput();
-MOC = #$ Expand("TMAKE_MOC");
-
-ZIP = #$ Expand("TMAKE_ZIP");
-
-####### Files
-
-HEADERS = #$ ExpandList("HEADERS");
-SOURCES = #$ ExpandList("SOURCES");
-OBJECTS = #$ ExpandList("OBJECTS");
-SRCMOC = #$ ExpandList("SRCMOC");
-OBJMOC = #$ ExpandList("OBJMOC");
-DIST = #$ ExpandList("DISTFILES");
-TARGET = #$ ExpandGlue("TARGET",$project{"DESTDIR"},"",$project{"TARGET_EXT"});
-
-####### Implicit rules
-
-.SUFFIXES: .cpp .cxx .cc .c
-
-.cpp.o:
- #$ Expand("TMAKE_RUN_CXX_IMP");
-
-.cxx.o:
- #$ Expand("TMAKE_RUN_CXX_IMP");
-
-.cc.o:
- #$ Expand("TMAKE_RUN_CXX_IMP");
-
-.c.o:
- #$ Expand("TMAKE_RUN_CC_IMP");
-
-####### Build rules
-
-all: #$ ExpandGlue("ALL_DEPS",""," "," "); $text .= '$(TARGET)';
-
-$(TARGET): $(OBJECTS) $(OBJMOC) #$ Expand("TARGETDEPS");
-#$ Project("TMAKE_APP_OR_DLL") || DisableOutput();
- $(LINK) $(LFLAGS) -o $(TARGET) $(OBJECTS) $(OBJMOC) $(LIBS)
-#$ Project("TMAKE_APP_OR_DLL") || EnableOutput();
-#$ Project("TMAKE_APP_OR_DLL") && DisableOutput();
- -rm -f $(TARGET)
- $(AR) $(TARGET) $(OBJECTS) $(OBJMOC)
- #$ ExpandGlue("TMAKE_RANLIB","",""," \$(TARGET)");
-#$ Project("TMAKE_APP_OR_DLL") && EnableOutput();
-#$ (Config("dll") && Project("DLLDESTDIR")) || DisableOutput();
- -cp $(TARGET) #$ Expand("DLLDESTDIR");
-#$ (Config("dll") && Project("DLLDESTDIR")) || EnableOutput();
-#$ Project('RC_FILE') || DisableOutput();
-
-#$ Substitute("\$\$RES_FILE: \$\$RC_FILE\n\t\$\$TMAKE_RC \$\$RC_FILE");
-#$ Project('RC_FILE') || EnableOutput();
-
-moc: $(SRCMOC)
-
-#$ TmakeSelf();
-
-dist:
- #$ Substitute('$(ZIP) $$PROJECT.zip $$PROJECT.pro $(SOURCES) $(HEADERS) $(DIST)');
-
-clean:
- -rm -f $(OBJECTS) $(OBJMOC) $(SRCMOC) $(TARGET)
- #$ ExpandGlue("TMAKE_CLEAN","-rm -f "," ","");
- -rm -f *~ core
- #$ ExpandGlue("CLEAN_FILES","-rm -f "," ","");
-
-####### Compile
-
-#$ BuildObj(Project("OBJECTS"),Project("SOURCES"));
-#$ BuildMocObj(Project("OBJMOC"),Project("SRCMOC"));
-#$ BuildMocSrc(Project("HEADERS"));
-#$ BuildMocSrc(Project("SOURCES"));
diff --git a/tmake/lib/win32-mingw/lib.t b/tmake/lib/win32-mingw/lib.t
deleted file mode 100755
index d8ac6c7..0000000
--- a/tmake/lib/win32-mingw/lib.t
+++ /dev/null
@@ -1,6 +0,0 @@
-#############################################################################
-#!
-#! This is a tmake template for building Win32 libraries.
-#!
-#$ Project('TMAKE_LIB_FLAG = 1');
-#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/win32-mingw/subdirs.t b/tmake/lib/win32-mingw/subdirs.t
deleted file mode 100755
index 8b881ab..0000000
--- a/tmake/lib/win32-mingw/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Win32 template
-#$ IncludeTemplate("../win32/subdirs.t");
diff --git a/tmake/lib/win32-mingw/tmake.conf b/tmake/lib/win32-mingw/tmake.conf
deleted file mode 100755
index c6d1918..0000000
--- a/tmake/lib/win32-mingw/tmake.conf
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-#
-#
-# tmake configuration for Win32/mingw (MINGW gnu-win32)
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = gcc
-TMAKE_CFLAGS =
-TMAKE_CFLAGS_WARN_ON =
-TMAKE_CFLAGS_WARN_OFF =
-TMAKE_CFLAGS_RELEASE = -O2 -s
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_YACC = -Wno-unused -Wno-parentheses
-
-TMAKE_CXX = g++
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_INCDIR_QT = $(QTDIR)/include
-
-TMAKE_RUN_CC = $(CC) -c $(CFLAGS) $(INCPATH) -o $obj $src
-TMAKE_RUN_CC_IMP = $(CC) -c $(CFLAGS) $(INCPATH) -o $@ $<
-TMAKE_RUN_CXX = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $obj $src
-TMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $<
-
-TMAKE_LINK = g++
-TMAKE_LFLAGS =
-TMAKE_LFLAGS_RELEASE = -s
-TMAKE_LFLAGS_DEBUG =
-TMAKE_LFLAGS_CONSOLE = -Wl,-subsystem,console
-TMAKE_LFLAGS_WINDOWS = -Wl,-subsystem,windows
-TMAKE_LFLAGS_CONSOLE_DLL= -Wl,-subsystem,console
-TMAKE_LFLAGS_WINDOWS_DLL= -Wl,-subsystem,windows
-
-TMAKE_LIBS =
-TMAKE_LIBS_CONSOLE =
-TMAKE_LIBS_WINDOWS = -luser32 -lgdi32 -lcomdlg32 -limm32 -lole32 -luuid -lwsock32
-TMAKE_LIBS_QT = -L$(QTDIR)/lib -lqt
-TMAKE_LIBS_QT_DLL = -lqtmain
-TMAKE_LIBS_QT_OPENGL = -lqgl
-TMAKE_LIBS_OPENGL = -lopengl32
-
-TMAKE_MOC = moc
-
-TMAKE_AR = ar cqs
-TMAKE_RANLIB =
-
-TMAKE_ZIP = zip -r -9
diff --git a/tmake/lib/win32-msvc/app.t b/tmake/lib/win32-msvc/app.t
deleted file mode 100755
index fc4dc2c..0000000
--- a/tmake/lib/win32-msvc/app.t
+++ /dev/null
@@ -1,6 +0,0 @@
-#############################################################################
-#!
-#! This is a tmake template for building Win32 applications.
-#!
-#$ Project('TMAKE_APP_FLAG = 1');
-#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/win32-msvc/generic.t b/tmake/lib/win32-msvc/generic.t
deleted file mode 100755
index 388db4b..0000000
--- a/tmake/lib/win32-msvc/generic.t
+++ /dev/null
@@ -1,229 +0,0 @@
-#!
-#! This is a tmake template for building Win32 applications or libraries.
-#!
-#${
- if ( Config("qt") ) {
- if ( !(Project("DEFINES") =~ /QT_NODLL/) &&
- ((Project("DEFINES") =~ /QT_(?:MAKE)?DLL/) ||
- ($ENV{"QT_DLL"} && !$ENV{"QT_NODLL"})) ) {
- Project('TMAKE_QT_DLL = 1');
- if ( (Project("TARGET") eq "qt") && Project("TMAKE_LIB_FLAG") ) {
- Project('CONFIG += dll');
- }
- }
- }
- if ( Config("dll") || Project("TMAKE_APP_FLAG") ) {
- Project('CONFIG -= staticlib');
- Project('TMAKE_APP_OR_DLL = 1');
- } else {
- Project('CONFIG += staticlib');
- }
- if ( Config("warn_off") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_OFF');
- Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_WARN_OFF');
- } elsif ( Config("warn_on") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_ON');
- Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_WARN_ON');
- }
- if ( Config("debug") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_DEBUG');
- Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_DEBUG');
- Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_DEBUG');
- } elsif ( Config("release") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_RELEASE');
- Project('TMAKE_CXXFLAGS += $$TMAKE_CXXFLAGS_RELEASE');
- Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_RELEASE');
- }
- if ( Config("qt") || Config("opengl") ) {
- Project('CONFIG += windows' );
- }
- if ( Config("qt") ) {
- Project('CONFIG *= moc');
- AddIncludePath(Project("TMAKE_INCDIR_QT"));
- if ( Config("release") ) {
- Project('DEFINES += NO_DEBUG');
- }
- if ( Config("opengl") ) {
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_OPENGL');
- }
- if ( (Project("TARGET") eq "qt") && Project("TMAKE_LIB_FLAG") ) {
- if ( Project("TMAKE_QT_DLL") ) {
- Project('DEFINES -= QT_DLL');
- Project('DEFINES *= QT_MAKEDLL');
- Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_QT_DLL');
- }
- } else {
- if ( Project("TMAKE_QT_DLL") ) {
- Project('DEFINES *= QT_DLL');
- }
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT');
- if ( Project("TMAKE_QT_DLL") ) {
- my $qtver =FindHighestLibVersion($ENV{"QTDIR"} . "/lib", "qt");
- Project("TMAKE_LIBS /= s/qt.lib/qt${qtver}.lib/");
- if ( !Config("dll") ) {
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_DLL');
- }
- }
- }
- }
- if ( Config("opengl") ) {
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_OPENGL');
- }
- if ( Config("dll") ) {
- Project('TMAKE_LFLAGS_CONSOLE_ANY = $$TMAKE_LFLAGS_CONSOLE_DLL');
- Project('TMAKE_LFLAGS_WINDOWS_ANY = $$TMAKE_LFLAGS_WINDOWS_DLL');
- if ( Project("TMAKE_LIB_FLAG") ) {
- my $ver = Project("VERSION");
- $ver =~ s/\.//g;
- $project{"TARGET_EXT"} = "${ver}.dll";
- } else {
- $project{"TARGET_EXT"} = ".dll";
- }
- } else {
- Project('TMAKE_LFLAGS_CONSOLE_ANY = $$TMAKE_LFLAGS_CONSOLE');
- Project('TMAKE_LFLAGS_WINDOWS_ANY = $$TMAKE_LFLAGS_WINDOWS');
- if ( Project("TMAKE_APP_FLAG") ) {
- $project{"TARGET_EXT"} = ".exe";
- } else {
- $project{"TARGET_EXT"} = ".lib";
- }
- }
- if ( Config("windows") ) {
- if ( Config("console") ) {
- Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_CONSOLE_ANY');
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_CONSOLE');
- } else {
- Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_WINDOWS_ANY');
- }
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_WINDOWS');
- } else {
- Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_CONSOLE_ANY');
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_CONSOLE');
- }
- if ( Config("moc") ) {
- $moc_aware = 1;
- }
- Project('TMAKE_LIBS += $$LIBS');
- Project('TMAKE_FILETAGS = HEADERS SOURCES DEF_FILE RC_FILE TARGET TMAKE_LIBS DESTDIR DLLDESTDIR $$FILETAGS');
- foreach ( split(/\s/,Project("TMAKE_FILETAGS")) ) {
- $project{$_} =~ s-[/\\]+-\\-g;
- }
- if ( Project("DEF_FILE") ) {
- Project('TMAKE_LFLAGS *= /DEF:$$DEF_FILE');
- }
- if ( Project("RC_FILE") ) {
- if ( Project("RES_FILE") ) {
- tmake_error("Both .rc and .res file specified.\n" .
- "Please specify one of them, not both.");
- }
- $project{"RES_FILE"} = $project{"RC_FILE"};
- $project{"RES_FILE"} =~ s/\.rc$/.res/i;
- Project('TARGETDEPS += $$RES_FILE');
- }
- if ( Project("RES_FILE") ) {
- Project('TMAKE_LIBS *= $$RES_FILE');
- }
- StdInit();
- if ( Project("VERSION") ) {
- $project{"VER_MAJ"} = $project{"VERSION"};
- $project{"VER_MAJ"} =~ s/\.\d+$//;
- $project{"VER_MIN"} = $project{"VERSION"};
- $project{"VER_MIN"} =~ s/^\d+\.//;
- }
- Project('debug:TMAKE_CLEAN += $$TARGET.pdb vc*.pdb $$TARGET.ilk');
-#$}
-#!
-# Makefile for building #$ Expand("TARGET")
-# Generated by tmake at #$ Now();
-# Project: #$ Expand("PROJECT");
-# Template: #$ Expand("TEMPLATE");
-#############################################################################
-
-####### Compiler, tools and options
-
-CC = #$ Expand("TMAKE_CC");
-CXX = #$ Expand("TMAKE_CXX");
-CFLAGS = #$ Expand("TMAKE_CFLAGS"); ExpandGlue("DEFINES","-D"," -D","");
-CXXFLAGS= #$ Expand("TMAKE_CXXFLAGS"); ExpandGlue("DEFINES","-D"," -D","");
-INCPATH = #$ ExpandPath("INCPATH",'-I',' -I','');
-#$ !Project("TMAKE_APP_OR_DLL") && DisableOutput();
-LINK = #$ Expand("TMAKE_LINK");
-LFLAGS = #$ Expand("TMAKE_LFLAGS");
-LIBS = #$ Expand("TMAKE_LIBS");
-#$ !Project("TMAKE_APP_OR_DLL") && EnableOutput();
-#$ Project("TMAKE_APP_OR_DLL") && DisableOutput();
-LIB = #$ Expand("TMAKE_LIB");
-#$ Project("TMAKE_APP_OR_DLL") && EnableOutput();
-MOC = #$ Expand("TMAKE_MOC");
-
-ZIP = #$ Expand("TMAKE_ZIP");
-
-####### Files
-
-HEADERS = #$ ExpandList("HEADERS");
-SOURCES = #$ ExpandList("SOURCES");
-OBJECTS = #$ ExpandList("OBJECTS");
-SRCMOC = #$ ExpandList("SRCMOC");
-OBJMOC = #$ ExpandList("OBJMOC");
-DIST = #$ ExpandList("DISTFILES");
-TARGET = #$ ExpandGlue("TARGET",$project{"DESTDIR"},"",$project{"TARGET_EXT"});
-
-####### Implicit rules
-
-.SUFFIXES: .cpp .cxx .cc .c
-
-.cpp.obj:
- #$ Expand("TMAKE_RUN_CXX_IMP");
-
-.cxx.obj:
- #$ Expand("TMAKE_RUN_CXX_IMP");
-
-.cc.obj:
- #$ Expand("TMAKE_RUN_CXX_IMP");
-
-.c.obj:
- #$ Expand("TMAKE_RUN_CC_IMP");
-
-####### Build rules
-
-all: #$ ExpandGlue("ALL_DEPS",""," "," "); $text .= '$(TARGET)';
-
-$(TARGET): $(OBJECTS) $(OBJMOC) #$ Expand("TARGETDEPS");
-#$ Project("TMAKE_APP_OR_DLL") || DisableOutput();
- $(LINK) $(LFLAGS) /OUT:$(TARGET) @<<
- $(OBJECTS) $(OBJMOC) $(LIBS)
-#$ Project("TMAKE_APP_OR_DLL") || EnableOutput();
-#$ Project("TMAKE_APP_OR_DLL") && DisableOutput();
- $(LIB) /OUT:$(TARGET) @<<
- $(OBJECTS) $(OBJMOC)
-#$ Project("TMAKE_APP_OR_DLL") && EnableOutput();
-<<
-#$ (Config("dll") && Project("DLLDESTDIR")) || DisableOutput();
- -copy $(TARGET) #$ Expand("DLLDESTDIR");
-#$ (Config("dll") && Project("DLLDESTDIR")) || EnableOutput();
-#$ Project("RC_FILE") || DisableOutput();
-
-#$ Substitute("\$\$RES_FILE: \$\$RC_FILE\n\t\$\$TMAKE_RC \$\$RC_FILE");
-#$ Project("RC_FILE") || EnableOutput();
-
-moc: $(SRCMOC)
-
-#$ TmakeSelf();
-
-dist:
- #$ Substitute('$(ZIP) $$PROJECT.zip $$PROJECT.pro $(SOURCES) $(HEADERS) $(DIST)');
-
-clean:
- #$ ExpandGlue("OBJECTS","-del ","\n\t-del ","");
- #$ ExpandGlue("SRCMOC" ,"-del ","\n\t-del ","");
- #$ ExpandGlue("OBJMOC" ,"-del ","\n\t-del ","");
- -del $(TARGET)
- #$ ExpandGlue("TMAKE_CLEAN","-del ","\n\t-del ","");
- #$ ExpandGlue("CLEAN_FILES","-del ","\n\t-del ","");
-
-####### Compile
-
-#$ BuildObj(Project("OBJECTS"),Project("SOURCES"));
-#$ BuildMocObj(Project("OBJMOC"),Project("SRCMOC"));
-#$ BuildMocSrc(Project("HEADERS"));
-#$ BuildMocSrc(Project("SOURCES"));
diff --git a/tmake/lib/win32-msvc/lib.t b/tmake/lib/win32-msvc/lib.t
deleted file mode 100755
index d8ac6c7..0000000
--- a/tmake/lib/win32-msvc/lib.t
+++ /dev/null
@@ -1,6 +0,0 @@
-#############################################################################
-#!
-#! This is a tmake template for building Win32 libraries.
-#!
-#$ Project('TMAKE_LIB_FLAG = 1');
-#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/win32-msvc/subdirs.t b/tmake/lib/win32-msvc/subdirs.t
deleted file mode 100755
index 8b881ab..0000000
--- a/tmake/lib/win32-msvc/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Win32 template
-#$ IncludeTemplate("../win32/subdirs.t");
diff --git a/tmake/lib/win32-msvc/tmake.conf b/tmake/lib/win32-msvc/tmake.conf
deleted file mode 100755
index e3191a3..0000000
--- a/tmake/lib/win32-msvc/tmake.conf
+++ /dev/null
@@ -1,65 +0,0 @@
-#
-#
-#
-# tmake configuration for Win32/Microsoft C++
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = cl
-TMAKE_CFLAGS = -nologo
-TMAKE_CFLAGS_WARN_ON = -W3
-TMAKE_CFLAGS_WARN_OFF = -W0
-TMAKE_CFLAGS_RELEASE = -O2
-TMAKE_CFLAGS_DEBUG = -Zi
-TMAKE_CFLAGS_MT = -MT
-TMAKE_CFLAGS_MT_DBG = -MTd
-TMAKE_CFLAGS_MT_DLL = -MD
-TMAKE_CFLAGS_MT_DLLDBG = -MDd
-TMAKE_CFLAGS_YACC =
-
-TMAKE_CXX = $$TMAKE_CC
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_MT = $$TMAKE_CFLAGS_MT
-TMAKE_CXXFLAGS_MT_DBG = $$TMAKE_CFLAGS_MT_DBG
-TMAKE_CXXFLAGS_MT_DLL = $$TMAKE_CFLAGS_MT_DLL
-TMAKE_CXXFLAGS_MT_DLLDBG= $$TMAKE_CFLAGS_MT_DLLDBG
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_INCDIR_QT = $(QTDIR)\include
-
-TMAKE_RUN_CC = $(CC) -c $(CFLAGS) $(INCPATH) -Fo$obj $src
-TMAKE_RUN_CC_IMP = $(CC) -c $(CFLAGS) $(INCPATH) -Fo$@ $<
-TMAKE_RUN_CXX = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$obj $src
-TMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo$@ $<
-
-TMAKE_LINK = link
-TMAKE_LFLAGS = /NOLOGO
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG = /DEBUG
-TMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:console
-TMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:windows
-TMAKE_LFLAGS_CONSOLE_DLL= /SUBSYSTEM:console /DLL
-TMAKE_LFLAGS_WINDOWS_DLL= /SUBSYSTEM:windows /DLL
-TMAKE_LFLAGS_QT_DLL = /BASE:0x39D00000
-
-TMAKE_LIBS =
-TMAKE_LIBS_CONSOLE =
-TMAKE_LIBS_WINDOWS = user32.lib gdi32.lib comdlg32.lib imm32.lib ole32.lib uuid.lib wsock32.lib
-TMAKE_LIBS_QT = $(QTDIR)\lib\qt.lib
-TMAKE_LIBS_QT_DLL = $(QTDIR)\lib\qtmain.lib
-TMAKE_LIBS_QT_OPENGL = $(QTDIR)\lib\qgl.lib
-TMAKE_LIBS_OPENGL = opengl32.lib glu32.lib
-
-TMAKE_MOC = moc
-
-TMAKE_LIB = lib /NOLOGO
-TMAKE_RC = rc
-
-TMAKE_ZIP = zip -r -9
diff --git a/tmake/lib/win32-msvc/vcapp.t b/tmake/lib/win32-msvc/vcapp.t
deleted file mode 100755
index ac7ae23..0000000
--- a/tmake/lib/win32-msvc/vcapp.t
+++ /dev/null
@@ -1,244 +0,0 @@
-#!
-#! This TMAKE template - Microsoft Visual C++ 5.0 applications
-#!
-#${
- if ( Config("qt") ) {
- if ( !(Project("DEFINES") =~ /QT_NODLL/) &&
- ((Project("DEFINES") =~ /QT_(?:MAKE)?DLL/) ||
- ($ENV{"QT_DLL"} && !$ENV{"QT_NODLL"})) ) {
- Project('TMAKE_QT_DLL = 1');
- if ( (Project("TARGET") eq "qt") && Project("TMAKE_LIB_FLAG") ) {
- Project('CONFIG += dll');
- }
- }
- }
- if ( Config("qt") || Config("opengl") ) {
- Project('CONFIG += windows');
- }
- if ( Config("qt") ) {
- $moc_aware = 1;
- AddIncludePath(Project('TMAKE_INCDIR_QT'));
- if ( Config("opengl") ) {
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_OPENGL');
- }
- if ( Project("TMAKE_QT_DLL") ) {
- Project('DEFINES *= QT_DLL');
- }
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT');
- if ( Project("TMAKE_QT_DLL") ) {
- my $qtver =FindHighestLibVersion($ENV{"QTDIR"} . "/lib", "qt");
- Project("TMAKE_LIBS /= s/qt.lib/qt${qtver}.lib/");
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_DLL');
- }
- }
- if ( Config("opengl") ) {
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_OPENGL');
- }
- Project('TMAKE_LIBS += $$LIBS');
-
- if ( Config("console") ) {
- $project{"VC_PROJ_TYPE"} = 'Win32 (x86) Console Application';
- $project{"VC_PROJ_CODE"} = '0x0103';
- $vc_base_libs = 'kernel32.lib user32.lib gdi32.lib winspool.lib ' .
- 'comdlg32.lib advapi32.lib shell32.lib ole32.lib ' .
- 'oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ';
- $vc_libs = $vc_base_libs;
- $vc_link_release = '/nologo /subsystem:console /machine:I386';
- $vc_link_debug = '/nologo /subsystem:console /debug /machine:I386 /pdbtype:sept';
- $vc_cpp_def_release = '/D "NDEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" ';
- $vc_cpp_def_debug = '/D "_DEBUG" /D "WIN32" /D "_CONSOLE" /D "_MBCS" ';
- } else {
- $project{"VC_PROJ_TYPE"} = 'Win32 (x86) Application';
- $project{"VC_PROJ_CODE"} = '0x0101';
- $vc_base_libs = 'kernel32.lib user32.lib gdi32.lib winspool.lib ' .
- 'comdlg32.lib advapi32.lib shell32.lib ole32.lib ' .
- 'oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ';
- $vc_libs = $vc_base_libs . 'wsock32.lib ';
- $vc_link_release = '/nologo /subsystem:windows /machine:I386';
- $vc_link_debug = '/nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept';
- $vc_cpp_def_release = '/D "NDEBUG" /D "WIN32" /D "_WINDOWS" ';
- $vc_cpp_def_debug = '/D "_DEBUG" /D "WIN32" /D "_WINDOWS" ';
- }
- $project{"VC_BASE_LINK_RELEASE"} = $vc_base_libs . $vc_link_release;
- $project{"VC_BASE_LINK_DEBUG"} = $vc_base_libs . $vc_link_debug;
- $tmake_libs = Project('TMAKE_LIBS') ? (Project('TMAKE_LIBS') . " ") : "";
- $project{"VC_LINK_RELEASE"} = $vc_libs . $tmake_libs . $vc_link_release;
- $project{"VC_LINK_DEBUG"} = $vc_libs . $tmake_libs . $vc_link_debug;
-
- $vc_cpp_opt_release = '/nologo /W3 /GX /O2 ';
- $vc_cpp_opt_debug = '/nologo /W3 /Gm /GX /Zi /Od ';
- $vc_cpp_opt_common = '/YX /FD /c';
- $project{"VC_BASE_CPP_RELEASE"} = $vc_cpp_opt_release . $vc_cpp_def_release . $vc_cpp_opt_common;
- $project{"VC_BASE_CPP_DEBUG"} = $vc_cpp_opt_debug . $vc_cpp_def_debug . $vc_cpp_opt_common;
- ExpandPath("INCPATH",'/I ',' /I ','');
- if ( $text ne "" ) { $vc_inc = $text . " "; $text = ""; } else { $vc_inc = ""; }
- ExpandGlue("DEFINES",'/D "','" /D "','"');
- if ( $text ne "" ) { $vc_def = $text . " "; $text = ""; } else { $vc_def = ""; }
- $project{"VC_CPP_RELEASE"} = $vc_cpp_opt_release . $vc_inc . $vc_cpp_def_release . $vc_def . $vc_cpp_opt_common;
- $project{"VC_CPP_DEBUG"} = $vc_cpp_opt_debug . $vc_inc . $vc_cpp_def_debug . $vc_def . $vc_cpp_opt_common;
-
- $project{"MAKEFILE"} = $project{"PROJECT"} . ".mak";
- $project{"TARGETAPP"} = $project{"TARGET"} . ".exe";
- Project('TMAKE_FILETAGS = HEADERS SOURCES TARGET DESTDIR $$FILETAGS');
- foreach ( split(/\s/,Project('TMAKE_FILETAGS')) ) {
- $project{$_} =~ s-/-\\-g;
- }
- StdInit();
- if ( defined($project{"DESTDIR"}) ) {
- $project{"TARGETAPP"} = $project{"DESTDIR"} . "\\" . $project{"TARGETAPP"};
- $project{"TARGETAPP"} =~ s/\\+/\\/g;
- }
- %all_files = ();
- @files = split(/\s+/,$project{"HEADERS"});
- foreach ( @files ) { $all_files{$_} = "h" };
- @files = split(/\s+/,$project{"SOURCES"});
- foreach ( @files ) { $all_files{$_} = "s" };
- if ( $moc_aware ) {
- @files = split(/\s+/,$project{"_HDRMOC"});
- foreach ( @files ) { $all_files{$_} = "m"; }
- @files = split(/\s+/,$project{"_SRCMOC"});
- foreach ( @files ) { $all_files{$_} = "i"; }
- }
- %file_names = ();
- foreach $f ( %all_files ) {
- $n = $f;
- $n =~ s/^.*\\//;
- $file_names{$n} = $f;
- $file_path{$n} = ".\\" . $f;
- $file_path2{$n} = (($f =~ /^\./) ? "" : ".\\") . $f;
- }
-#$}
-# Microsoft Developer Studio Project File - #$ Substitute('Name="$$TARGET" - Package Owner=<4>');
-# Microsoft Developer Studio Generated Build File, Format Version 5.00
-# ** DO NOT EDIT **
-
-# TARGTYPE #$ Substitute('"$$VC_PROJ_TYPE" $$VC_PROJ_CODE');
-
-CFG=#$ Substitute('$$TARGET - Win32 Debug');
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "#$ ExpandGlue('MAKEFILE','','','".');
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f #$ Substitute('"$$MAKEFILE" CFG="$$TARGET - Win32 Debug"');
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE #$ Substitute('"$$TARGET - Win32 Release" (based on "$$VC_PROJ_TYPE")');
-!MESSAGE #$ Substitute('"$$TARGET - Win32 Debug" (based on "$$VC_PROJ_TYPE")');
-!MESSAGE
-
-# Begin Project
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-#$ Config("windows") && ($text='MTL=midl.exe');
-RSC=rc.exe
-
-!IF "$(CFG)" == #$ Substitute('"$$TARGET - Win32 Release"');
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "Release"
-# PROP Intermediate_Dir "Release"
-#$ Config("windows") && ($text='# PROP Ignore_Export_Lib 0');
-# PROP Target_Dir ""
-# ADD BASE CPP #$ Expand("VC_BASE_CPP_RELEASE");
-# ADD CPP #$ Expand("VC_CPP_RELEASE");
-#$ Config("windows") || DisableOutput();
-# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
-# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /o NUL /win32
-#$ Config("windows") || EnableOutput();
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 #$ Expand("VC_BASE_LINK_RELEASE");
-# ADD LINK32 #$ Expand("VC_LINK_RELEASE");
-
-!ELSEIF "$(CFG)" == #$ Substitute('"$$TARGET - Win32 Debug"');
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug"
-# PROP Intermediate_Dir "Debug"
-#$ Config("windows") && ($text='# PROP Ignore_Export_Lib 0');
-# PROP Target_Dir ""
-# ADD BASE CPP #$ Expand("VC_BASE_CPP_DEBUG");
-# ADD CPP #$ Expand("VC_CPP_DEBUG");
-#$ Config("windows") || DisableOutput();
-# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
-# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /o NUL /win32
-#$ Config("windows") || EnableOutput();
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 #$ Expand("VC_BASE_LINK_DEBUG");
-# ADD LINK32 #$ Expand("VC_LINK_DEBUG");
-
-!ENDIF
-
-# Begin Target
-
-# Name #$Substitute('"$$TARGET - Win32 Release"');
-# Name #$Substitute('"$$TARGET - Win32 Debug"');
-#${
- foreach $n ( sort keys %file_names ) {
- $f = $file_names{$n};
- $p = $file_path{$n};
- $p2 = $file_path2{$n};
- $t = $all_files{$f};
- if ( ($t eq "h") && $moc_output{$f} ) {
- my($build);
- $build = "\n\n# Begin Custom Build - Running moc...\nInputPath=" . $p2 . "\n\n"
- . '"' . $moc_output{$f} . '" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"'
- . "\n\tmoc $p2 -o " . $moc_output{$f} . "\n\n"
- . "# End Custom Build\n\n";
- $text .= ("# Begin Source File\n\nSOURCE=$p\n\n"
- . '!IF "$(CFG)" == "' . $project{"TARGET"} . ' - Win32 Release"'
- . $build);
- $text .= ('!ELSEIF "$(CFG)" == "' . $project{"TARGET"} . ' - Win32 Debug"'
- . $build
- . "!ENDIF \n\n# End Source File\n");
- } elsif ( $t eq "i" ) {
- my($build,$dn);
- $build = "\n\n# Begin Custom Build - Running moc...\nInputPath=" . $p2 . "\n\n"
- . '"' . $f . '" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"'
- . "\n\tmoc ". $moc_input{$f} . " -o $f\n\n"
- . "# End Custom Build\n\n";
- $dn = $n;
- $dn =~ s/\..*//;
- $dn =~ tr/a-z/A-Z/;
- $text .= ("# Begin Source File\n\nSOURCE=$p\n"
- . "USERDEP__$dn=" . '"' . $moc_input{$f} . '"' . "\n\n"
- . '!IF "$(CFG)" == "' . $project{"TARGET"} . ' - Win32 Release"'
- . $build);
- $text .= ('!ELSEIF "$(CFG)" == "' . $project{"TARGET"} . ' - Win32 Debug"'
- . $build
- . "!ENDIF \n\n# End Source File\n");
- } elsif ( $t eq "s" || $t eq "m" || $t eq "h" ) {
- $text .= "# Begin Source File\n\nSOURCE=$p\n# End Source File\n";
- }
- }
- chop $text;
-#$}
-# End Target
-# End Project
diff --git a/tmake/lib/win32-msvc/vclib.t b/tmake/lib/win32-msvc/vclib.t
deleted file mode 100755
index 11cd1d7..0000000
--- a/tmake/lib/win32-msvc/vclib.t
+++ /dev/null
@@ -1,178 +0,0 @@
-#!
-#! This TMAKE template - Microsoft Visual C++ 5.0 libraries
-#!
-#${
- if ( Config("qt") || Config("opengl") ) {
- Project('CONFIG += windows');
- }
- if ( Config("qt") ) {
- $moc_aware = 1;
- AddIncludePath(Project('TMAKE_INCDIR_QT'));
- }
-
- $project{"VC_PROJ_TYPE"} = 'Win32 (x86) Static Library';
- $project{"VC_PROJ_CODE"} = '0x0104';
-
- $vc_cpp_def_release = '/D "NDEBUG" /D "WIN32" /D "_WINDOWS" ';
- $vc_cpp_def_debug = '/D "_DEBUG" /D "WIN32" /D "_WINDOWS" ';
- $vc_cpp_opt_release = '/nologo /W3 /GX /O2 ';
- $vc_cpp_opt_debug = '/nologo /W3 /Gm /GX /Zi /Od ';
- $vc_cpp_opt_common = '/YX /FD /c';
- $project{"VC_BASE_CPP_RELEASE"} = $vc_cpp_opt_release . $vc_cpp_def_release . $vc_cpp_opt_common;
- $project{"VC_BASE_CPP_DEBUG"} = $vc_cpp_opt_debug . $vc_cpp_def_debug . $vc_cpp_opt_common;
- ExpandPath("INCPATH",'/I ',' /I ','');
- if ( $text ne "" ) { $vc_inc = $text . " "; $text = ""; } else { $vc_inc = ""; }
- ExpandGlue("DEFINES",'/D "','" /D "','"');
- if ( $text ne "" ) { $vc_def = $text . " "; $text = ""; } else { $vc_def = ""; }
- $project{"VC_CPP_RELEASE"} = $vc_cpp_opt_release . $vc_inc . $vc_cpp_def_release . $vc_def . $vc_cpp_opt_common;
- $project{"VC_CPP_DEBUG"} = $vc_cpp_opt_debug . $vc_inc . $vc_cpp_def_debug . $vc_def . $vc_cpp_opt_common;
-
- $project{"MAKEFILE"} = $project{"PROJECT"} . ".mak";
- $project{"TARGETLIB"} = $project{"TARGET"} . ".lib";
- Project('TMAKE_FILETAGS = HEADERS SOURCES TARGET DESTDIR $$FILETAGS');
- foreach ( split(/\s/,Project('TMAKE_FILETAGS')) ) {
- $project{$_} =~ s-/-\\-g;
- }
- StdInit();
- if ( defined($project{"DESTDIR"}) ) {
- $project{"TARGETLIB"} = $project{"DESTDIR"} . "\\" . $project{"TARGETLIB"};
- $project{"TARGETLIB"} =~ s/\\+/\\/g;
- }
- %all_files = ();
- @files = split(/\s+/,$project{"HEADERS"});
- foreach ( @files ) { $all_files{$_} = "h" };
- @files = split(/\s+/,$project{"SOURCES"});
- foreach ( @files ) { $all_files{$_} = "s" };
- if ( $moc_aware ) {
- @files = split(/\s+/,$project{"_HDRMOC"});
- foreach ( @files ) { $all_files{$_} = "m"; }
- @files = split(/\s+/,$project{"_SRCMOC"});
- foreach ( @files ) { $all_files{$_} = "i"; }
- }
- %file_names = ();
- foreach $f ( %all_files ) {
- $n = $f;
- $n =~ s/^.*\\//;
- $file_names{$n} = $f;
- $file_path{$n} = ".\\" . $f;
- $file_path2{$n} = (($f =~ /^\./) ? "" : ".\\") . $f;
- }
-#$}
-# Microsoft Developer Studio Project File - #$ Substitute('Name="$$TARGET" - Package Owner=<4>');
-# Microsoft Developer Studio Generated Build File, Format Version 5.00
-# ** DO NOT EDIT **
-
-# TARGTYPE #$ Substitute('"$$VC_PROJ_TYPE" $$VC_PROJ_CODE');
-
-CFG=#$ Substitute('$$TARGET - Win32 Debug');
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "#$ ExpandGlue('MAKEFILE','','','".');
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f #$ Substitute('"$$MAKEFILE" CFG="$$TARGET - Win32 Debug"');
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE #$ Substitute('"$$TARGET - Win32 Release" (based on "$$VC_PROJ_TYPE")');
-!MESSAGE #$ Substitute('"$$TARGET - Win32 Debug" (based on "$$VC_PROJ_TYPE")');
-!MESSAGE
-
-# Begin Project
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-
-!IF "$(CFG)" == #$ Substitute('"$$TARGET - Win32 Release"');
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "Release"
-# PROP Intermediate_Dir "Release"
-# PROP Target_Dir ""
-# ADD BASE CPP #$ Expand("VC_BASE_CPP_RELEASE");
-# ADD CPP #$ Expand("VC_CPP_RELEASE");
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo #$ Project("TARGETLIB") && Substitute('/out:"$$TARGETLIB"');
-
-!ELSEIF "$(CFG)" == #$ Substitute('"$$TARGET - Win32 Debug"');
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug"
-# PROP Intermediate_Dir "Debug"
-# PROP Target_Dir ""
-# ADD BASE CPP #$ Expand("VC_BASE_CPP_DEBUG");
-# ADD CPP #$ Expand("VC_CPP_DEBUG");
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo #$ Project("TARGETLIB") && Substitute('/out:"$$TARGETLIB"');
-
-!ENDIF
-
-# Begin Target
-
-# Name #$Substitute('"$$TARGET - Win32 Release"');
-# Name #$Substitute('"$$TARGET - Win32 Debug"');
-#${
- foreach $n ( sort keys %file_names ) {
- $f = $file_names{$n};
- $p = $file_path{$n};
- $p2 = $file_path2{$n};
- $t = $all_files{$f};
- if ( ($t eq "h") && $moc_output{$f} ) {
- my($build);
- $build = "\n\n# Begin Custom Build - Running moc...\nInputPath=" . $p2 . "\n\n"
- . '"' . $moc_output{$f} . '" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"'
- . "\n\tmoc $p2 -o " . $moc_output{$f} . "\n\n"
- . "# End Custom Build\n\n";
- $text .= ("# Begin Source File\n\nSOURCE=$p\n\n"
- . '!IF "$(CFG)" == "' . $project{"TARGET"} . ' - Win32 Release"'
- . $build);
- $text .= ('!ELSEIF "$(CFG)" == "' . $project{"TARGET"} . ' - Win32 Debug"'
- . $build
- . "!ENDIF \n\n# End Source File\n");
- } elsif ( $t eq "i" ) {
- my($build,$dn);
- $build = "\n\n# Begin Custom Build - Running moc...\nInputPath=" . $p2 . "\n\n"
- . '"' . $f . '" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"'
- . "\n\tmoc ". $moc_input{$f} . " -o $f\n\n"
- . "# End Custom Build\n\n";
- $dn = $n;
- $dn =~ s/\..*//;
- $dn =~ tr/a-z/A-Z/;
- $text .= ("# Begin Source File\n\nSOURCE=$p\n"
- . "USERDEP__$dn=" . '"' . $moc_input{$f} . '"' . "\n\n"
- . '!IF "$(CFG)" == "' . $project{"TARGET"} . ' - Win32 Release"'
- . $build);
- $text .= ('!ELSEIF "$(CFG)" == "' . $project{"TARGET"} . ' - Win32 Debug"'
- . $build
- . "!ENDIF \n\n# End Source File\n");
- } elsif ( $t eq "s" || $t eq "m" || $t eq "h" ) {
- $text .= "# Begin Source File\n\nSOURCE=$p\n# End Source File\n";
- }
- }
- chop $text;
-#$}
-# End Target
-# End Project
diff --git a/tmake/lib/win32-symantec/app.t b/tmake/lib/win32-symantec/app.t
deleted file mode 100755
index fc4dc2c..0000000
--- a/tmake/lib/win32-symantec/app.t
+++ /dev/null
@@ -1,6 +0,0 @@
-#############################################################################
-#!
-#! This is a tmake template for building Win32 applications.
-#!
-#$ Project('TMAKE_APP_FLAG = 1');
-#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/win32-symantec/generic.t b/tmake/lib/win32-symantec/generic.t
deleted file mode 100755
index 78e1d77..0000000
--- a/tmake/lib/win32-symantec/generic.t
+++ /dev/null
@@ -1,211 +0,0 @@
-#!
-#! This is a tmake template for building Win32 applications or libraries.
-#!
-#${
- if ( Config("qt") ) {
- if ( $ENV{"QT_DLL"} && !$ENV{"QT_NODLL"} ) {
- Project('TMAKE_QT_DLL = 1');
- if ( Project("TARGET") eq "qt" ) {
- Project('CONFIG += dll');
- }
- }
- }
- if ( Config("dll") || Project("TMAKE_APP_FLAG") ) {
- Project('CONFIG -= staticlib');
- Project('TMAKE_APP_OR_DLL = 1');
- } else {
- Project('CONFIG += staticlib');
- }
- if ( Config("warn_off") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_OFF');
- } elsif ( Config("warn_on") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_ON');
- }
- if ( Config("debug") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_DEBUG');
- Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_DEBUG');
- } elsif ( Config("release") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_RELEASE');
- Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_RELEASE');
- }
- if ( Config("qt") || Config("opengl") ) {
- Project('CONFIG += windows' );
- }
- if ( Config("qt") ) {
- $moc_aware = 1;
- AddIncludePath(Project('TMAKE_INCDIR_QT'));
- if ( Config("opengl") ) {
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_OPENGL');
- }
- if ( Project("TARGET") eq "qt" ) {
- if ( Project("TMAKE_QT_DLL") && !(Project("DEFINES") =~ /QT_NODLL/) ) {
- Project('DEFINES *= QT_MAKEDLL');
- }
- } else {
- if ( Project("TMAKE_QT_DLL") && !(Project("DEFINES") =~ /QT_NODLL/) ) {
- Project('DEFINES *= QT_DLL');
- }
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT');
- if ( (Project("DEFINES") =~ /QT_DLL/) ) {
- my $qtver =FindHighestLibVersion($ENV{"QTDIR"} . "/lib", "qt");
- Project("TMAKE_LIBS /= s/qt.lib/qt${qtver}.lib/");
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_DLL');
- }
- }
- }
- if ( Config("opengl") ) {
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_OPENGL');
- }
- if ( Config("dll") ) {
- Project('TMAKE_LFLAGS_CONSOLE_ANY = $$TMAKE_LFLAGS_CONSOLE_DLL');
- Project('TMAKE_LFLAGS_WINDOWS_ANY = $$TMAKE_LFLAGS_WINDOWS_DLL');
- if ( Project("TMAKE_LIB_FLAG") ) {
- my $ver = Project("VERSION");
- $ver =~ s/\.//g;
- $project{"TARGET_EXT"} = "${ver}.dll";
- } else {
- $project{"TARGET_EXT"} = ".dll";
- }
- } else {
- Project('TMAKE_LFLAGS_CONSOLE_ANY = $$TMAKE_LFLAGS_CONSOLE');
- Project('TMAKE_LFLAGS_WINDOWS_ANY = $$TMAKE_LFLAGS_WINDOWS');
- if ( Project('TMAKE_APP_FLAG') ) {
- $project{"TARGET_EXT"} = ".exe";
- } else {
- $project{"TARGET_EXT"} = ".lib";
- }
- }
- if ( Config("windows") ) {
- if ( Config("console") ) {
- Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_CONSOLE_ANY');
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_CONSOLE');
- } else {
- Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_WINDOWS_ANY');
- }
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_WINDOWS');
- } else {
- Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_CONSOLE_ANY');
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_CONSOLE');
- }
- Project('TMAKE_LIBS += $$LIBS');
- Project('TMAKE_FILETAGS = HEADERS SOURCES DEF_FILE RC_FILE TARGET TMAKE_LIBS DESTDIR DLLDESTDIR $$FILETAGS');
- foreach ( split(/\s/,Project('TMAKE_FILETAGS')) ) {
- $project{$_} =~ s-[/\\]+-\\-g;
- }
- if ( Project('DEF_FILE') ) {
- Project('TMAKE_LFLAGS *= /DEF:$$DEF_FILE');
- }
- if ( Project('RC_FILE') ) {
- if ( Project('RES_FILE') ) {
- tmake_error("Both .rc and .res file specified.\n" .
- "Please specify one of them, not both.");
- }
- $project{"RES_FILE"} = $project{"RC_FILE"};
- $project{"RES_FILE"} =~ s/\.rc$/.res/i;
- Project('TARGETDEPS += $$RES_FILE');
- }
- if ( Project('RES_FILE') ) {
- Project('TMAKE_LIBS *= $$RES_FILE');
- }
- StdInit();
- if ( Project("VERSION") ) {
- $project{"VER_MAJ"} = $project{"VERSION"};
- $project{"VER_MAJ"} =~ s/\.\d+$//;
- $project{"VER_MIN"} = $project{"VERSION"};
- $project{"VER_MIN"} =~ s/^\d+\.//;
- }
-#$}
-#!
-# Makefile for building #$ Expand("TARGET")
-# Generated by tmake at #$ Now();
-# Project: #$ Expand("PROJECT");
-# Template: #$ Expand("TEMPLATE");
-#############################################################################
-
-####### Compiler, tools and options
-
-CC = #$ Expand("TMAKE_CC");
-CFLAGS = #$ Expand("TMAKE_CFLAGS"); ExpandGlue("DEFINES","-D"," -D","");
-INCPATH = #$ ExpandPath("INCPATH",'-I',' -I','');
-#$ !Project("TMAKE_APP_OR_DLL") && DisableOutput();
-LINK = #$ Expand("TMAKE_LINK");
-LFLAGS = #$ Expand("TMAKE_LFLAGS");
-LIBS = #$ Expand("TMAKE_LIBS");
-#$ !Project("TMAKE_APP_OR_DLL") && EnableOutput();
-#$ Project("TMAKE_APP_OR_DLL") && DisableOutput();
-LIB = #$ Expand("TMAKE_LIB");
-#$ Project("TMAKE_APP_OR_DLL") && EnableOutput();
-MOC = #$ Expand("TMAKE_MOC");
-
-ZIP = #$ Expand("TMAKE_ZIP");
-
-####### Files
-
-HEADERS = #$ ExpandList("HEADERS");
-SOURCES = #$ ExpandList("SOURCES");
-OBJECTS = #$ ExpandList("OBJECTS");
-SRCMOC = #$ ExpandList("SRCMOC");
-OBJMOC = #$ ExpandList("OBJMOC");
-DIST = #$ ExpandList("DISTFILES");
-TARGET = #$ ExpandGlue("TARGET",$project{"DESTDIR"},"",$project{"TARGET_EXT"});
-
-####### Implicit rules
-
-.SUFFIXES: .cpp .cxx .cc .c
-
-.cpp.obj:
- #$ Expand("TMAKE_COMPILE_IMP");
-
-.cxx.obj:
- #$ Expand("TMAKE_COMPILE_IMP");
-
-.cc.obj:
- #$ Expand("TMAKE_COMPILE_IMP");
-
-.c.obj:
- #$ Expand("TMAKE_COMPILE_IMP");
-
-####### Build rules
-
-all: #$ ExpandGlue("ALL_DEPS",""," "," "); $text .= '$(TARGET)';
-
-$(TARGET): $(OBJECTS) $(OBJMOC) #$ Expand("TARGETDEPS");
-#$ Project("TMAKE_APP_OR_DLL") || DisableOutput();
- $(LINK) $(LFLAGS) $(OBJECTS) $(OBJMOC), $(TARGET),, $(LIBS)
-#$ Project("TMAKE_APP_OR_DLL") || EnableOutput();
-#$ Project("TMAKE_APP_OR_DLL") && DisableOutput();
- -del $(TARGET)
-#${
-# $text = "\t\$(LIB) \$(TARGET) "
-# . join(" \\\n+",split(/\s+/,$project{"OBJECTS"})) . " \\\n+"
-# . join(" \\\n+",split(/\s+/,$project{"OBJMOC"})) . ",;";
-#$}
-#$ Project("TMAKE_APP_OR_DLL") && EnableOutput();
-#$ (Config("dll") && Project("DLLDESTDIR")) || DisableOutput();
- -copy $(TARGET) #$ Expand("DLLDESTDIR");
-#$ (Config("dll") && Project("DLLDESTDIR")) || EnableOutput();
-#$ Project('RC_FILE') || DisableOutput();
-
-#$ Substitute("\$\$RES_FILE: \$\$RC_FILE\n\t\$\$TMAKE_RC \$\$RC_FILE");
-#$ Project('RC_FILE') || EnableOutput();
-
-moc: $(SRCMOC)
-
-#$ TmakeSelf();
-
-dist:
- #$ Substitute('$(ZIP) $$PROJECT.zip $$PROJECT.pro $(SOURCES) $(HEADERS) $(DIST)');
-
-clean:
- #$ ExpandGlue("OBJECTS","-del ","\n\t-del ","");
- #$ ExpandGlue("SRCMOC" ,"-del ","\n\t-del ","");
- #$ ExpandGlue("OBJMOC" ,"-del ","\n\t-del ","");
- -del $(TARGET)
- #$ ExpandGlue("CLEAN_FILES","-del ","\n\t-del ","");
-
-####### Compile
-
-#$ BuildObj(Project("OBJECTS"),Project("SOURCES"));
-#$ BuildMocObj(Project("OBJMOC"),Project("SRCMOC"));
-#$ BuildMocSrc(Project("HEADERS"));
-#$ BuildMocSrc(Project("SOURCES"));
diff --git a/tmake/lib/win32-symantec/lib.t b/tmake/lib/win32-symantec/lib.t
deleted file mode 100755
index d8ac6c7..0000000
--- a/tmake/lib/win32-symantec/lib.t
+++ /dev/null
@@ -1,6 +0,0 @@
-#############################################################################
-#!
-#! This is a tmake template for building Win32 libraries.
-#!
-#$ Project('TMAKE_LIB_FLAG = 1');
-#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/win32-symantec/subdirs.t b/tmake/lib/win32-symantec/subdirs.t
deleted file mode 100755
index 8b881ab..0000000
--- a/tmake/lib/win32-symantec/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Win32 template
-#$ IncludeTemplate("../win32/subdirs.t");
diff --git a/tmake/lib/win32-symantec/tmake.conf b/tmake/lib/win32-symantec/tmake.conf
deleted file mode 100755
index 81f88c2..0000000
--- a/tmake/lib/win32-symantec/tmake.conf
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-#
-#
-# tmake configuration for Win32/Symantec C++
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = sc
-TMAKE_CFLAGS = -mn -w2
-TMAKE_CFLAGS_WARN_ON =
-TMAKE_CFLAGS_WARN_OFF = -w
-TMAKE_CFLAGS_RELEASE = -o
-TMAKE_CFLAGS_DEBUG = -g
-TMAKE_CFLAGS_YACC =
-
-TMAKE_CXX = $$TMAKE_CC
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_INCDIR_QT = $(QTDIR)\include
-
-TMAKE_RUN_CC = $(CC) -c $(CFLAGS) $(INCPATH) -o$obj $src
-TMAKE_RUN_CC_IMP = $(CC) -c $(CFLAGS) $(INCPATH) -o$@ $<
-TMAKE_RUN_CXX = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o$obj $src
-TMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -o$@ $<
-
-TMAKE_LINK = link
-TMAKE_LFLAGS = /NOLOGO /NOI
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG = /DEBUG
-TMAKE_LFLAGS_CONSOLE = /SUBSYSTEM:console
-TMAKE_LFLAGS_WINDOWS = /SUBSYSTEM:windows
-TMAKE_LFLAGS_CONSOLE_DLL= /SUBSYSTEM:console /DLL
-TMAKE_LFLAGS_WINDOWS_DLL= /SUBSYSTEM:windows /DLL
-
-TMAKE_LIBS =
-TMAKE_LIBS_CONSOLE =
-TMAKE_LIBS_WINDOWS = user32.lib gdi32.lib comdlg32.lib imm32.lib ole32.lib uuid.lib wsock32.lib
-TMAKE_LIBS_QT = $(QTDIR)\lib\qt.lib
-TMAKE_LIBS_QT_DLL = $(QTDIR)\lib\qtmain.lib
-TMAKE_LIBS_QT_OPENGL = $(QTDIR)\lib\qgl.lib
-TMAKE_LIBS_OPENGL = opengl32.lib
-
-TMAKE_MOC = moc
-
-TMAKE_LIB = lib /C /N /NOI /P:32
-TMAKE_RC = rc
-
-TMAKE_ZIP = zip -r -9
diff --git a/tmake/lib/win32-visage/app.t b/tmake/lib/win32-visage/app.t
deleted file mode 100755
index fc4dc2c..0000000
--- a/tmake/lib/win32-visage/app.t
+++ /dev/null
@@ -1,6 +0,0 @@
-#############################################################################
-#!
-#! This is a tmake template for building Win32 applications.
-#!
-#$ Project('TMAKE_APP_FLAG = 1');
-#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/win32-visage/generic.t b/tmake/lib/win32-visage/generic.t
deleted file mode 100755
index aeec8db..0000000
--- a/tmake/lib/win32-visage/generic.t
+++ /dev/null
@@ -1,207 +0,0 @@
-#!
-#! This is a tmake template for building Win32 applications or libraries.
-#!
-#${
- if ( Config("qt") ) {
- if ( $ENV{"QT_DLL"} && !$ENV{"QT_NODLL"} ) {
- Project('TMAKE_QT_DLL = 1');
- if ( Project("TARGET") eq "qt" ) {
- Project('CONFIG += dll');
- }
- }
- }
- if ( Config("dll") || Project("TMAKE_APP_FLAG") ) {
- Project('CONFIG -= staticlib');
- Project('TMAKE_APP_OR_DLL = 1');
- } else {
- Project('CONFIG += staticlib');
- }
- if ( Config("warn_off") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_OFF');
- } elsif ( Config("warn_on") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_ON');
- }
- if ( Config("debug") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_DEBUG');
- Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_DEBUG');
- } elsif ( Config("release") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_RELEASE');
- Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_RELEASE');
- }
- if ( Config("qt") || Config("opengl") ) {
- Project('CONFIG += windows' );
- }
- if ( Config("qt") ) {
- $moc_aware = 1;
- AddIncludePath(Project('TMAKE_INCDIR_QT'));
- if ( Config("opengl") ) {
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_OPENGL');
- }
- if ( Project("TARGET") eq "qt" ) {
- if ( Project("TMAKE_QT_DLL") && !(Project("DEFINES") =~ /QT_NODLL/) ) {
- Project('DEFINES *= QT_MAKEDLL');
- }
- } else {
- if ( Project("TMAKE_QT_DLL") && !(Project("DEFINES") =~ /QT_NODLL/) ) {
- Project('DEFINES *= QT_DLL');
- }
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT');
- if ( (Project("DEFINES") =~ /QT_DLL/) ) {
- my $qtver =FindHighestLibVersion($ENV{"QTDIR"} . "/lib", "qt");
- Project("TMAKE_LIBS /= s/qt.lib/qt${qtver}.lib/");
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_DLL');
- }
- }
- }
- if ( Config("opengl") ) {
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_OPENGL');
- }
- if ( Config("dll") ) {
- Project('TMAKE_LFLAGS_CONSOLE_ANY = $$TMAKE_LFLAGS_CONSOLE_DLL');
- Project('TMAKE_LFLAGS_WINDOWS_ANY = $$TMAKE_LFLAGS_WINDOWS_DLL');
- if ( Project("TMAKE_LIB_FLAG") ) {
- my $ver = Project("VERSION");
- $ver =~ s/\.//g;
- $project{"TARGET_EXT"} = "${ver}.dll";
- } else {
- $project{"TARGET_EXT"} = ".dll";
- }
- } else {
- Project('TMAKE_LFLAGS_CONSOLE_ANY = $$TMAKE_LFLAGS_CONSOLE');
- Project('TMAKE_LFLAGS_WINDOWS_ANY = $$TMAKE_LFLAGS_WINDOWS');
- if ( Project('TMAKE_APP_FLAG') ) {
- $project{"TARGET_EXT"} = ".exe";
- } else {
- $project{"TARGET_EXT"} = ".lib";
- }
- }
- if ( Config("windows") ) {
- if ( Config("console") ) {
- Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_CONSOLE_ANY');
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_CONSOLE');
- } else {
- Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_WINDOWS_ANY');
- }
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_WINDOWS');
- } else {
- Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_CONSOLE_ANY');
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_CONSOLE');
- }
- Project('TMAKE_LIBS += $$LIBS');
- Project('TMAKE_FILETAGS = HEADERS SOURCES DEF_FILE RC_FILE TARGET TMAKE_LIBS DESTDIR DLLDESTDIR $$FILETAGS');
- foreach ( split(/\s/,Project('TMAKE_FILETAGS')) ) {
- $project{$_} =~ s-[/\\]+-\\-g;
- }
- if ( Project('DEF_FILE') ) {
- Project('TMAKE_LFLAGS *= /DEF:$$DEF_FILE');
- }
- if ( Project('RC_FILE') ) {
- if ( Project('RES_FILE') ) {
- tmake_error("Both .rc and .res file specified.\n" .
- "Please specify one of them, not both.");
- }
- $project{"RES_FILE"} = $project{"RC_FILE"};
- $project{"RES_FILE"} =~ s/\.rc$/.res/i;
- Project('TARGETDEPS += $$RES_FILE');
- }
- if ( Project('RES_FILE') ) {
- Project('TMAKE_LIBS *= $$RES_FILE');
- }
- StdInit();
- if ( Project("VERSION") ) {
- $project{"VER_MAJ"} = $project{"VERSION"};
- $project{"VER_MAJ"} =~ s/\.\d+$//;
- $project{"VER_MIN"} = $project{"VERSION"};
- $project{"VER_MIN"} =~ s/^\d+\.//;
- }
-#$}
-#!
-# Makefile for building #$ Expand("TARGET")
-# Generated by tmake at #$ Now();
-# Project: #$ Expand("PROJECT");
-# Template: #$ Expand("TEMPLATE");
-#############################################################################
-
-####### Compiler, tools and options
-
-CC = #$ Expand("TMAKE_CC");
-CFLAGS = #$ Expand("TMAKE_CFLAGS"); ExpandGlue("DEFINES","-D"," -D","");
-INCPATH = #$ ExpandGlue("INCPATH",'-I',' -I','');
-#$ !Project("TMAKE_APP_OR_DLL") && DisableOutput();
-LINK = #$ Expand("TMAKE_LINK");
-LFLAGS = #$ Expand("TMAKE_LFLAGS");
-LIBS = #$ Expand("TMAKE_LIBS");
-#$ !Project("TMAKE_APP_OR_DLL") && EnableOutput();
-#$ Project("TMAKE_APP_OR_DLL") && DisableOutput();
-LIB = #$ Expand("TMAKE_LIB");
-#$ Project("TMAKE_APP_OR_DLL") && EnableOutput();
-MOC = #$ Expand("TMAKE_MOC");
-
-ZIP = #$ Expand("TMAKE_ZIP");
-
-####### Files
-
-HEADERS = #$ ExpandList("HEADERS");
-SOURCES = #$ ExpandList("SOURCES");
-OBJECTS = #$ ExpandList("OBJECTS");
-SRCMOC = #$ ExpandList("SRCMOC");
-OBJMOC = #$ ExpandList("OBJMOC");
-DIST = #$ ExpandList("DISTFILES");
-TARGET = #$ ExpandGlue("TARGET",$project{"DESTDIR"},"",$project{"TARGET_EXT"});
-
-####### Implicit rules
-
-.SUFFIXES: .cpp .cxx .cc .c
-
-.cpp.obj:
- #$ Expand("TMAKE_COMPILE_IMP");
-
-.cxx.obj:
- #$ Expand("TMAKE_COMPILE_IMP");
-
-.cc.obj:
- #$ Expand("TMAKE_COMPILE_IMP");
-
-.c.obj:
- #$ Expand("TMAKE_COMPILE_IMP");
-
-####### Build rules
-
-all: #$ ExpandGlue("ALL_DEPS",""," "," "); $text .= '$(TARGET)';
-
-$(TARGET): $(OBJECTS) $(OBJMOC) #$ Expand("TARGETDEPS");
-#$ Project("TMAKE_APP_OR_DLL") || DisableOutput();
-$(TARGET): $(OBJECTS) $(LIBS) #$ Expand("TARGETDEPS");
- $(LINK) -B"$(LFLAGS)" $(OBJECTS) $(LIBS) -Fe$(TARGET)
-#$ Project("TMAKE_APP_OR_DLL") || EnableOutput();
-#$ Project("TMAKE_APP_OR_DLL") && DisableOutput();
- $(LIB) /OUT:$(TARGET) $(OBJECTS) $(OBJMOC)
-#$ Project("TMAKE_APP_OR_DLL") && EnableOutput();
-#$ (Config("dll") && Project("DLLDESTDIR")) || DisableOutput();
- -copy $(TARGET) #$ Expand("DLLDESTDIR");
-#$ (Config("dll") && Project("DLLDESTDIR")) || EnableOutput();
-#$ Project('RC_FILE') || DisableOutput();
-
-#$ Substitute("\$\$RES_FILE: \$\$RC_FILE\n\t\$\$TMAKE_RC \$\$RC_FILE");
-#$ Project('RC_FILE') || EnableOutput();
-
-moc: $(SRCMOC)
-
-#$ TmakeSelf();
-
-dist:
- #$ Substitute('$(ZIP) $$PROJECT.zip $$PROJECT.pro $(SOURCES) $(HEADERS) $(DIST)');
-
-clean:
- #$ ExpandGlue("OBJECTS","-del ","\n\t-del ","");
- #$ ExpandGlue("SRCMOC" ,"-del ","\n\t-del ","");
- #$ ExpandGlue("OBJMOC" ,"-del ","\n\t-del ","");
- -del $(TARGET)
- #$ ExpandGlue("CLEAN_FILES","-del ","\n\t-del ","");
-
-####### Compile
-
-#$ BuildObj(Project("OBJECTS"),Project("SOURCES"));
-#$ BuildMocObj(Project("OBJMOC"),Project("SRCMOC"));
-#$ BuildMocSrc(Project("HEADERS"));
-#$ BuildMocSrc(Project("SOURCES"));
diff --git a/tmake/lib/win32-visage/lib.t b/tmake/lib/win32-visage/lib.t
deleted file mode 100755
index d8ac6c7..0000000
--- a/tmake/lib/win32-visage/lib.t
+++ /dev/null
@@ -1,6 +0,0 @@
-#############################################################################
-#!
-#! This is a tmake template for building Win32 libraries.
-#!
-#$ Project('TMAKE_LIB_FLAG = 1');
-#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/win32-visage/subdirs.t b/tmake/lib/win32-visage/subdirs.t
deleted file mode 100755
index 8b881ab..0000000
--- a/tmake/lib/win32-visage/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Win32 template
-#$ IncludeTemplate("../win32/subdirs.t");
diff --git a/tmake/lib/win32-visage/tmake.conf b/tmake/lib/win32-visage/tmake.conf
deleted file mode 100755
index 69d3a82..0000000
--- a/tmake/lib/win32-visage/tmake.conf
+++ /dev/null
@@ -1,56 +0,0 @@
-#
-#
-#
-# tmake configuration for Win32/IBM Visual Age
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = icc -C
-TMAKE_CFLAGS = -Q -Ft -Gd -Gm+ -qrtti=all
-TMAKE_CFLAGS_WARN_ON = -W3
-TMAKE_CFLAGS_WARN_OFF = -W0
-TMAKE_CFLAGS_RELEASE = -Gl+ -O -Oc+
-TMAKE_CFLAGS_DEBUG = -Fb* -Ti -Tm
-TMAKE_CFLAGS_YACC =
-
-TMAKE_CXX = $$TMAKE_CC
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_INCDIR_QT = $(QTDIR)\include
-
-TMAKE_RUN_CC = $(CC) -c $(CFLAGS) $(INCPATH) -Fo"$obj" $src
-TMAKE_RUN_CC_IMP = $(CC) -c $(CFLAGS) $(INCPATH) -Fo"$@" $<
-TMAKE_RUN_CXX = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo"$obj" $src
-TMAKE_RUN_CXX_IMP = $(CXX) -c $(CXXFLAGS) $(INCPATH) -Fo"$@" $<
-
-TMAKE_LINK = icc -Tdp $(CFLAGS)
-TMAKE_LFLAGS = -nologo -code:RX -data:RW -def -noe
-TMAKE_LFLAGS_RELEASE = -OPTF
-TMAKE_LFLAGS_DEBUG = -de -br
-TMAKE_LFLAGS_CONSOLE = -pmtype:vio
-TMAKE_LFLAGS_WINDOWS = -pmtype:pm
-TMAKE_LFLAGS_CONSOLE_DLL= -DLL
-TMAKE_LFLAGS_WINDOWS_DLL= -DLL
-
-TMAKE_LIBS =
-TMAKE_LIBS_CONSOLE =
-TMAKE_LIBS_WINDOWS = user32.lib gdi32.lib comdlg32.lib imm32.lib ole32.lib uuid.lib wsock32.lib
-TMAKE_LIBS_QT = $(QTDIR)\lib\qt.lib
-TMAKE_LIBS_QT_DLL = $(QTDIR)\lib\qtmain.lib
-TMAKE_LIBS_QT_OPENGL = $(QTDIR)\lib\qgl.lib
-TMAKE_LIBS_OPENGL = opengl32.lib glu32.lib
-
-TMAKE_MOC = moc
-
-TMAKE_LIB = ilib
-TMAKE_RC = rc
-
-TMAKE_ZIP = zip -r -9
diff --git a/tmake/lib/win32-watcom/app.t b/tmake/lib/win32-watcom/app.t
deleted file mode 100755
index fc4dc2c..0000000
--- a/tmake/lib/win32-watcom/app.t
+++ /dev/null
@@ -1,6 +0,0 @@
-#############################################################################
-#!
-#! This is a tmake template for building Win32 applications.
-#!
-#$ Project('TMAKE_APP_FLAG = 1');
-#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/win32-watcom/generic.t b/tmake/lib/win32-watcom/generic.t
deleted file mode 100755
index 0cc47bb..0000000
--- a/tmake/lib/win32-watcom/generic.t
+++ /dev/null
@@ -1,201 +0,0 @@
-#!
-#! This is a tmake template for building Win32 applications or libraries.
-#!
-#${
- if ( Config("qt") ) {
- if ( $ENV{"QT_DLL"} && !$ENV{"QT_NODLL"} ) {
- Project('TMAKE_QT_DLL = 1');
- if ( Project("TARGET") eq "qt" ) {
- Project('CONFIG += dll');
- }
- }
- }
- if ( Config("dll") || Project("TMAKE_APP_FLAG") ) {
- Project('CONFIG -= staticlib');
- Project('TMAKE_APP_OR_DLL = 1');
- } else {
- Project('CONFIG += staticlib');
- }
- if ( Config("warn_off") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_OFF');
- } elsif ( Config("warn_on") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_WARN_ON');
- }
- if ( Config("debug") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_DEBUG');
- Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_DEBUG');
- } elsif ( Config("release") ) {
- Project('TMAKE_CFLAGS += $$TMAKE_CFLAGS_RELEASE');
- Project('TMAKE_LFLAGS += $$TMAKE_LFLAGS_RELEASE');
- }
- if ( Config("qt") || Config("opengl") ) {
- Project('CONFIG += windows' );
- }
- if ( Config("qt") ) {
- $moc_aware = 1;
- AddIncludePath(Project('TMAKE_INCDIR_QT'));
- if ( Config("opengl") ) {
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_OPENGL');
- }
- if ( Project("TARGET") eq "qt" ) {
- if ( Project("TMAKE_QT_DLL") && !(Project("DEFINES") =~ /QT_NODLL/) ) {
- Project('DEFINES *= QT_MAKEDLL');
- }
- } else {
- if ( Project("TMAKE_QT_DLL") && !(Project("DEFINES") =~ /QT_NODLL/) ) {
- Project('DEFINES *= QT_DLL');
- }
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT');
- if ( (Project("DEFINES") =~ /QT_DLL/) ) {
- my $qtver =FindHighestLibVersion($ENV{"QTDIR"} . "/lib", "qt");
- Project("TMAKE_LIBS /= s/qt.lib/qt${qtver}.lib/");
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_QT_DLL');
- }
- }
- }
- if ( Config("opengl") ) {
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_OPENGL');
- }
- if ( Config("dll") ) {
- Project('TMAKE_LFLAGS_CONSOLE_ANY = $$TMAKE_LFLAGS_CONSOLE_DLL');
- Project('TMAKE_LFLAGS_WINDOWS_ANY = $$TMAKE_LFLAGS_WINDOWS_DLL');
- if ( Project("TMAKE_LIB_FLAG") ) {
- my $ver = Project("VERSION");
- $ver =~ s/\.//g;
- $project{"TARGET_EXT"} = "${ver}.dll";
- } else {
- $project{"TARGET_EXT"} = ".dll";
- }
- } else {
- Project('TMAKE_LFLAGS_CONSOLE_ANY = $$TMAKE_LFLAGS_CONSOLE');
- Project('TMAKE_LFLAGS_WINDOWS_ANY = $$TMAKE_LFLAGS_WINDOWS');
- if ( Project('TMAKE_APP_FLAG') ) {
- $project{"TARGET_EXT"} = ".exe";
- } else {
- $project{"TARGET_EXT"} = ".lib";
- }
- }
- if ( Config("windows") ) {
- if ( Config("console") ) {
- Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_CONSOLE_ANY');
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_CONSOLE');
- } else {
- Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_WINDOWS_ANY');
- }
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_WINDOWS');
- } else {
- Project('TMAKE_LFLAGS *= $$TMAKE_LFLAGS_CONSOLE_ANY');
- Project('TMAKE_LIBS *= $$TMAKE_LIBS_CONSOLE');
- }
- Project('TMAKE_LIBS += $$LIBS');
- Project('TMAKE_FILETAGS = HEADERS SOURCES DEF_FILE RC_FILE TARGET TMAKE_LIBS DESTDIR DLLDESTDIR $$FILETAGS');
- foreach ( split(/\s/,Project('TMAKE_FILETAGS')) ) {
- $project{$_} =~ s-[/\\]+-\\-g;
- }
- if ( Project('DEF_FILE') ) {
- Project('TMAKE_LFLAGS *= /DEF:$$DEF_FILE');
- }
- if ( Project('RC_FILE') ) {
- if ( Project('RES_FILE') ) {
- tmake_error("Both .rc and .res file specified.\n" .
- "Please specify one of them, not both.");
- }
- $project{"RES_FILE"} = $project{"RC_FILE"};
- $project{"RES_FILE"} =~ s/\.rc$/.res/i;
- Project('TARGETDEPS += $$RES_FILE');
- }
- if ( Project('RES_FILE') ) {
- Project('TMAKE_LIBS *= $$RES_FILE');
- }
- $linebreak = '&';
- StdInit();
- if ( Project("VERSION") ) {
- $project{"VER_MAJ"} = $project{"VERSION"};
- $project{"VER_MAJ"} =~ s/\.\d+$//;
- $project{"VER_MIN"} = $project{"VERSION"};
- $project{"VER_MIN"} =~ s/^\d+\.//;
- }
-#$}
-#!
-# Makefile for building #$ Expand("TARGET")
-# Generated by tmake at #$ Now();
-# Project: #$ Expand("PROJECT");
-# Template: #$ Expand("TEMPLATE");
-#############################################################################
-
-####### Compiler, tools and options
-
-#$ Config("qt") || DisableOutput();
-QTDIR = #$ $text = $ENV{"QTDIR"};
-#$ Config("qt") || EnableOutput();
-CC = #$ Expand("TMAKE_CC");
-CFLAGS = #$ Expand("TMAKE_CFLAGS"); ExpandGlue("DEFINES","-d="," -d=","");
-INCPATH = #$ ExpandPath("INCPATH",'-i=',' -i=','');
-#$ !Project("TMAKE_APP_OR_DLL") && DisableOutput();
-LINK = #$ Expand("TMAKE_LINK");
-LFLAGS = #$ Expand("TMAKE_LFLAGS");
-LIBS = #$ Expand("TMAKE_LIBS");
-#$ !Project("TMAKE_APP_OR_DLL") && EnableOutput();
-#$ Project("TMAKE_APP_OR_DLL") && DisableOutput();
-LIB = #$ Expand("TMAKE_LIB");
-#$ Project("TMAKE_APP_OR_DLL") && EnableOutput();
-MOC = #$ Expand("TMAKE_MOC");
-
-ZIP = #$ Expand("TMAKE_ZIP");
-
-####### Files
-
-HEADERS = #$ ExpandList("HEADERS");
-SOURCES = #$ ExpandList("SOURCES");
-OBJECTS = #$ ExpandList("OBJECTS");
-SRCMOC = #$ ExpandList("SRCMOC");
-OBJMOC = #$ ExpandList("OBJMOC");
-DIST = #$ ExpandList("DISTFILES");
-TARGET = #$ ExpandGlue("TARGET",$project{"DESTDIR"},"",$project{"TARGET_EXT"});
-TMPLIST = #$ ExpandGlue("TARGET","","",".lst");
-####### Build rules
-
-all: #$ ExpandGlue("ALL_DEPS",""," "," "); $text .= '$(TARGET)';
-
-$(TARGET): $(OBJECTS) $(OBJMOC) #$ Expand("TARGETDEPS");
- @%create $(TMPLIST)
-#$ Project("TMAKE_APP_OR_DLL") || DisableOutput();
- @%append $(TMPLIST) NAME #$ Expand("TARGET");
- #$ ExpandGlue("OBJECTS",'@%append $(TMPLIST) FIL ',",","");
- #$ ExpandGlue("OBJMOC" ,'@%append $(TMPLIST) FIL ',",","");
- #$ ExpandGlue("TMAKE_LIBS" ,'@%append $(TMPLIST) LIBR ',",","");
- $(LINK) $(LFLAGS) @$(TMPLIST)
-#$ Project("TMAKE_APP_OR_DLL") || EnableOutput();
-#$ Project("TMAKE_APP_OR_DLL") && DisableOutput();
- @for %i in ( $(OBJECTS) $(OBJMOC) ) do @%append $(TMPLIST) +'%i'
- $(LIB) $(TARGET) @$(TMPLIST)
-#$ Project("TMAKE_APP_OR_DLL") && EnableOutput();
- del $(TMPLIST)
-#$ (Config("dll") && Project("DLLDESTDIR")) || DisableOutput();
- -copy $(TARGET) #$ Expand("DLLDESTDIR");
-#$ (Config("dll") && Project("DLLDESTDIR")) || EnableOutput();
-#$ Project('RC_FILE') || DisableOutput();
-
-#$ Substitute("\$\$RES_FILE: \$\$RC_FILE\n\t\$\$TMAKE_RC \$\$RC_FILE");
-#$ Project('RC_FILE') || EnableOutput();
-
-moc: $(SRCMOC)
-
-#$ TmakeSelf();
-
-dist:
- #$ Substitute('$(ZIP) $$PROJECT.zip $$PROJECT.pro $(SOURCES) $(HEADERS) $(DIST)');
-
-clean:
- #$ ExpandGlue("OBJECTS","-del ","\n\t-del ","");
- #$ ExpandGlue("SRCMOC" ,"-del ","\n\t-del ","");
- #$ ExpandGlue("OBJMOC" ,"-del ","\n\t-del ","");
- -del $(TARGET)
- #$ ExpandGlue("CLEAN_FILES","-del ","\n\t-del ","");
-
-####### Compile
-
-#$ BuildObj(Project("OBJECTS"),Project("SOURCES"));
-#$ BuildMocObj(Project("OBJMOC"),Project("SRCMOC"));
-#$ BuildMocSrc(Project("HEADERS"));
-#$ BuildMocSrc(Project("SOURCES"));
diff --git a/tmake/lib/win32-watcom/lib.t b/tmake/lib/win32-watcom/lib.t
deleted file mode 100755
index d8ac6c7..0000000
--- a/tmake/lib/win32-watcom/lib.t
+++ /dev/null
@@ -1,6 +0,0 @@
-#############################################################################
-#!
-#! This is a tmake template for building Win32 libraries.
-#!
-#$ Project('TMAKE_LIB_FLAG = 1');
-#$ IncludeTemplate("generic.t");
diff --git a/tmake/lib/win32-watcom/subdirs.t b/tmake/lib/win32-watcom/subdirs.t
deleted file mode 100755
index 8b881ab..0000000
--- a/tmake/lib/win32-watcom/subdirs.t
+++ /dev/null
@@ -1,2 +0,0 @@
-#! Use the common Win32 template
-#$ IncludeTemplate("../win32/subdirs.t");
diff --git a/tmake/lib/win32-watcom/tmake.conf b/tmake/lib/win32-watcom/tmake.conf
deleted file mode 100755
index 862e915..0000000
--- a/tmake/lib/win32-watcom/tmake.conf
+++ /dev/null
@@ -1,54 +0,0 @@
-#
-#
-#
-# tmake configuration for Win32/Watcom C++
-#
-
-TEMPLATE = app
-CONFIG = qt warn_on release
-
-TMAKE_CC = wcl386
-TMAKE_CFLAGS = -zq
-TMAKE_CFLAGS_WARN_ON = -w2
-TMAKE_CFLAGS_WARN_OFF = -w0
-TMAKE_CFLAGS_RELEASE = -ox
-TMAKE_CFLAGS_DEBUG = -d2
-TMAKE_CFLAGS_YACC =
-
-TMAKE_CXX = $$TMAKE_CC
-TMAKE_CXXFLAGS = $$TMAKE_CFLAGS
-TMAKE_CXXFLAGS_WARN_ON = $$TMAKE_CFLAGS_WARN_ON
-TMAKE_CXXFLAGS_WARN_OFF = $$TMAKE_CFLAGS_WARN_OFF
-TMAKE_CXXFLAGS_RELEASE = $$TMAKE_CFLAGS_RELEASE
-TMAKE_CXXFLAGS_DEBUG = $$TMAKE_CFLAGS_DEBUG
-TMAKE_CXXFLAGS_YACC = $$TMAKE_CFLAGS_YACC
-
-TMAKE_INCDIR =
-TMAKE_INCDIR_QT = $(QTDIR)\include
-
-TMAKE_RUN_CC = $(CC) -c $(CFLAGS) $(INCPATH) -fo=$obj $src
-TMAKE_RUN_CXX = $(CXX) -c $(CXXFLAGS) $(INCPATH) -fo=$obj $src
-
-TMAKE_LINK = wlink
-TMAKE_LFLAGS = op quiet op c
-TMAKE_LFLAGS_RELEASE =
-TMAKE_LFLAGS_DEBUG = d all
-TMAKE_LFLAGS_CONSOLE = sys nt
-TMAKE_LFLAGS_WINDOWS = sys nt_win
-TMAKE_LFLAGS_CONSOLE_DLL= sys nt
-TMAKE_LFLAGS_WINDOWS_DLL= sys nt_win
-
-TMAKE_LIBS =
-TMAKE_LIBS_CONSOLE =
-TMAKE_LIBS_WINDOWS =
-TMAKE_LIBS_QT = %QTDIR%\lib\qt.lib
-TMAKE_LIBS_QT_DLL = %QTDIR%\lib\qtmain.lib
-TMAKE_LIBS_QT_OPENGL = %QTDIR%\lib\qgl.lib
-TMAKE_LIBS_OPENGL = opengl32.lib
-
-TMAKE_MOC = moc
-
-TMAKE_LIB = wlib -b -c -n -q -p=512
-TMAKE_RC = rc
-
-TMAKE_ZIP = zip -r -9
diff --git a/tmake/lib/win32/subdirs.t b/tmake/lib/win32/subdirs.t
deleted file mode 100755
index 4c857fd..0000000
--- a/tmake/lib/win32/subdirs.t
+++ /dev/null
@@ -1,54 +0,0 @@
-#############################################################################
-#!
-#! This is a tmake template for creating a makefile that invokes make in
-#! sub directories - for Win32.
-#!
-#${
- StdInit();
- $m = "";
- foreach ( split(/\s+/,$project{"SUBDIRS"}) ) {
- $m = $m . "\tcd $_\n\tDOMAKE\n\t\@cd ..\n";
- }
- $project{"SUBMAKE"} = $m;
- Project('MAKEFILE') || Project('MAKEFILE = Makefile');
- Project('TMAKE') || Project('TMAKE = tmake');
-#$}
-#!
-# Makefile for building targets in sub directories.
-# Generated by tmake at #$ Now();
-# Project: #$ Expand("PROJECT");
-# Template: #$ Expand("TEMPLATE");
-#############################################################################
-
-MAKEFILE= #$ Expand("MAKEFILE");
-TMAKE = #$ Expand("TMAKE");
-
-SUBDIRS = #$ ExpandList("SUBDIRS");
-
-all: $(SUBDIRS)
-
-#${
- foreach ( split(/\s+/,$project{"SUBDIRS"}) ) {
- if ( Project("TMAKE_NOFORCE") ) {
- $text = $text . $_ . ":\n\t" .
- "cd $_\n\t\$(MAKE\)\n\t\@cd ..\n\n";
- } else {
- $text = $text . $_ . ": FORCE\n\t" .
- "cd $_\n\t\$(MAKE\)\n\t\@cd ..\n\n";
- }
- }
-#$}
-#$ TmakeSelf();
-
-tmake_all:
-#${
- foreach ( split(/\s+/,$project{"SUBDIRS"}) ) {
- $text .= "\tcd $_\n\t\$(TMAKE\) $_.pro -o \$(MAKEFILE)\n\t\@cd ..\n";
- }
-#$}
-
-clean:
-#$ $text = $project{"SUBMAKE"}; $text =~ s/DOMAKE/\$(MAKE\) clean/g;
-#$ Project("TMAKE_NOFORCE") && DisableOutput();
-FORCE:
-#$ Project("TMAKE_NOFORCE") && EnableOutput();
diff --git a/wintools/Doxygen.dsp b/wintools/Doxygen.dsp
deleted file mode 100644
index 7031cd6..0000000
--- a/wintools/Doxygen.dsp
+++ /dev/null
@@ -1,700 +0,0 @@
-# Microsoft Developer Studio Project File - Name="Doxygen" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Console Application" 0x0103
-
-CFG=Doxygen - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "Doxygen.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "Doxygen.mak" CFG="Doxygen - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "Doxygen - Win32 Release" (based on "Win32 (x86) Console Application")
-!MESSAGE "Doxygen - Win32 Debug" (based on "Win32 (x86) Console Application")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-# PROP Scc_ProjName ""
-# PROP Scc_LocalPath ""
-CPP=cl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "Doxygen - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "Release"
-# PROP Intermediate_Dir "Release"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD CPP /nologo /W3 /GX /O2 /I "..\src" /I "..\qtools" /I "..\libpng" /I "..\libmd5" /D "ENGLISH_ONLY" /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /FD /Zm200 /c
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
-# ADD LINK32 qtools.lib libpng.lib zlib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /libpath:"Release"
-
-!ELSEIF "$(CFG)" == "Doxygen - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug"
-# PROP Intermediate_Dir "Debug"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
-# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\src" /I "..\qtools" /I "..\libpng" /I "..\libmd5" /D "ENGLISH_ONLY" /D "_CONSOLE" /D "WIN32" /D "_DEBUG" /D "_MBCS" /FD /GZ /Zm200 /c
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-# SUBTRACT RSC /x
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 qtools.lib libpng.lib zlib.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ws2_32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"Debug"
-# SUBTRACT LINK32 /nodefaultlib
-
-!ENDIF
-
-# Begin Target
-
-# Name "Doxygen - Win32 Release"
-# Name "Doxygen - Win32 Debug"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
-# Begin Source File
-
-SOURCE=..\src\ce_lex.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\ce_parse.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\classdef.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\classlist.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\cmdmapper.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\code.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\commentcnv.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\commentscan.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\config.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\cppvalue.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\debug.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\declinfo.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\defargs.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\defgen.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\define.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\definition.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\diagram.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\dirdef.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\docparser.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\doctokenizer.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\dot.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\doxygen.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\entry.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\filedef.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\filename.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\formula.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\ftvhelp.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\groupdef.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\htags.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\htmldocvisitor.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\htmlgen.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\htmlhelp.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\image.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\index.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\instdox.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\language.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\latexdocvisitor.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\latexgen.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\logos.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\main.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\mandocvisitor.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\mangen.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\libmd5\md5.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\memberdef.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\membergroup.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\memberlist.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\membername.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\message.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\namespacedef.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\outputgen.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\outputlist.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\pagedef.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\perlmodgen.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\pngenc.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\pre.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\reflist.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\rtfdocvisitor.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\rtfgen.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\rtfstyle.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\scanner.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\searchindex.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\tagreader.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\translator.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\util.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\version.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\xmldocvisitor.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\xmlgen.cpp
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl"
-# Begin Source File
-
-SOURCE=..\src\bufstr.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\ce_parse.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\classdef.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\classlist.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\cmdmapper.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\code.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\commentcnv.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\config.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\constexp.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\cppvalue.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\debug.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\declinfo.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\defargs.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\defgen.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\define.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\definition.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\diagram.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\dirdef.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\docparser.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\doctokenizer.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\docvisitor.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\dot.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\doxygen.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\entry.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\example.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\filedef.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\filename.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\formula.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\ftvhelp.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\groupdef.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\htmlattrib.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\htmldocvisitor.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\htmlgen.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\htmlhelp.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\image.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\index.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\instdox.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\lang_cfg.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\language.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\latexdocvisitor.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\latexgen.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\logos.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\mandocvisitor.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\mangen.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\memberdef.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\membergroup.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\memberlist.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\membername.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\message.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\namespacedef.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\outputgen.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\outputlist.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\packagedef.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\pagedef.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\perlmodgen.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\parserintf.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\pngenc.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\pre.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\printdocvisitor.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\qtbc.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\reflist.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\rtfdocvisitor.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\rtfgen.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\rtfstyle.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\scanner.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\section.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\sortdict.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\tagreader.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\translator.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\translator_en.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\unistd.h
-
-!IF "$(CFG)" == "Doxygen - Win32 Release"
-
-USERDEP__UNIST="..\src\ce_lex.cpp" "..\src\code.cpp" "..\src\commentcnv.cpp" "..\src\config.cpp" "..\src\declinfo.cpp" "..\src\defargs.cpp" "..\src\doctokenizer.cpp" "..\src\formula.cpp" "..\src\pre.cpp" "..\src\scanner.cpp" "..\src\util.cpp"
-# Begin Custom Build
-InputPath=..\src\unistd.h
-
-"$(InputPath)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- echo /* this is a dummy file, that is needed for compiling files that are > $(InputPath)
- echo * generated with flex under Windows 95/NT. >> $(InputPath)
- echo */ >> $(InputPath)
- echo #if defined(_MSC_VER) >> $(InputPath)
- echo #include ^<io.h^> >> $(InputPath)
- echo #endif >> $(InputPath)
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "Doxygen - Win32 Debug"
-
-# PROP Ignore_Default_Tool 1
-USERDEP__UNIST="..\src\ce_lex.cpp" "..\src\code.cpp" "..\src\commentcnv.cpp" "..\src\config.cpp" "..\src\declinfo.cpp" "..\src\defargs.cpp" "..\src\doctokenizer.cpp" "..\src\formula.cpp" "..\src\pre.cpp" "..\src\scanner.cpp" "..\src\util.cpp"
-# Begin Custom Build
-InputPath=..\src\unistd.h
-
-"$(InputPath)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- echo /* this is a dummy file, that is needed for compiling files that are > $(InputPath)
- echo * generated with flex under Windows 95/NT. >> $(InputPath)
- echo */ >> $(InputPath)
- echo #if defined(_MSC_VER) >> $(InputPath)
- echo #include ^<io.h^> >> $(InputPath)
- echo #endif >> $(InputPath)
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\util.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\version.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\xmldocvisitor.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\xmlgen.h
-# End Source File
-# End Group
-# End Target
-# End Project
diff --git a/wintools/Doxygen.dsw b/wintools/Doxygen.dsw
deleted file mode 100644
index 76ca47e..0000000
--- a/wintools/Doxygen.dsw
+++ /dev/null
@@ -1,89 +0,0 @@
-Microsoft Developer Studio Workspace File, Format Version 6.00
-# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
-
-###############################################################################
-
-Project: "Doxygen"=".\Doxygen.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name libpng
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name zlib
- End Project Dependency
- Begin Project Dependency
- Project_Dep_Name qtools
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "Doxytag"=".\Doxytag.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
- Begin Project Dependency
- Project_Dep_Name qtools
- End Project Dependency
-}}}
-
-###############################################################################
-
-Project: "libpng"=".\libpng.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Project: "qtools"=".\qtools.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Project: "zlib"=".\zlib.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Global:
-
-Package=<5>
-{{{
-}}}
-
-Package=<3>
-{{{
-}}}
-
-###############################################################################
-
diff --git a/wintools/Doxytag.dsp b/wintools/Doxytag.dsp
deleted file mode 100644
index 1d4b024..0000000
--- a/wintools/Doxytag.dsp
+++ /dev/null
@@ -1,163 +0,0 @@
-# Microsoft Developer Studio Project File - Name="Doxytag" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Console Application" 0x0103
-
-CFG=Doxytag - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "Doxytag.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "Doxytag.mak" CFG="Doxytag - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "Doxytag - Win32 Release" (based on "Win32 (x86) Console Application")
-!MESSAGE "Doxytag - Win32 Debug" (based on "Win32 (x86) Console Application")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-CPP=cl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "Doxytag - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "Release"
-# PROP Intermediate_Dir "Release"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /c
-# ADD CPP /nologo /W3 /GX /O2 /I "..\src" /I "..\qtools" /D "_CONSOLE" /D "WIN32" /D "_MBCS" /D "NDEBUG" /FD /c
-# SUBTRACT CPP /YX
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
-# ADD LINK32 qtools.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /libpath:"Release"
-
-!ELSEIF "$(CFG)" == "Doxytag - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug"
-# PROP Intermediate_Dir "Debug"
-# PROP Ignore_Export_Lib 0
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_CONSOLE" /D "_MBCS" /YX /FD /GZ /c
-# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\src" /I "..\qtools" /D "_CONSOLE" /D "WIN32" /D "_MBCS" /D "_DEBUG" /FD /GZ /c
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-# SUBTRACT RSC /x
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LINK32=link.exe
-# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 qtools.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib ws2_32.lib /nologo /subsystem:console /debug /machine:I386 /pdbtype:sept /libpath:"Debug"
-# SUBTRACT LINK32 /nodefaultlib
-
-!ENDIF
-
-# Begin Target
-
-# Name "Doxytag - Win32 Release"
-# Name "Doxytag - Win32 Debug"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
-# Begin Source File
-
-SOURCE=..\src\doxytag.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\logos.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\version.cpp
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl"
-# Begin Source File
-
-SOURCE=..\src\logos.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\searchindex.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\suffixtree.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\unistd.h
-
-!IF "$(CFG)" == "Doxytag - Win32 Release"
-
-USERDEP__UNIST="..\src\doxytag.cpp"
-# Begin Custom Build
-InputPath=..\src\unistd.h
-
-"$(InputPath)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- echo /* this is a dummy file, that is needed for compiling files that are > $(InputPath)
- echo * generated with flex under Windows 95/NT. >> $(InputPath)
- echo */ >> $(InputPath)
- echo #if defined(_MSC_VER) >> $(InputPath)
- echo #include ^<io.h^> >> $(InputPath)
- echo #endif >> $(InputPath)
-
-# End Custom Build
-
-!ELSEIF "$(CFG)" == "Doxytag - Win32 Debug"
-
-# PROP Ignore_Default_Tool 1
-USERDEP__UNIST="..\src\doxytag.cpp"
-# Begin Custom Build
-InputPath=..\src\unistd.h
-
-"$(InputPath)" : $(SOURCE) "$(INTDIR)" "$(OUTDIR)"
- echo /* this is a dummy file, that is needed for compiling files that are > $(InputPath)
- echo * generated with flex under Windows 95/NT. >> $(InputPath)
- echo */ >> $(InputPath)
- echo #if defined(_MSC_VER) >> $(InputPath)
- echo #include ^<io.h^> >> $(InputPath)
- echo #endif >> $(InputPath)
-
-# End Custom Build
-
-!ENDIF
-
-# End Source File
-# Begin Source File
-
-SOURCE=..\src\version.h
-# End Source File
-# End Group
-# End Target
-# End Project
diff --git a/wintools/Doxytag.dsw b/wintools/Doxytag.dsw
deleted file mode 100644
index b64be4a..0000000
--- a/wintools/Doxytag.dsw
+++ /dev/null
@@ -1,33 +0,0 @@
-Microsoft Developer Studio Workspace File, Format Version 6.00
-# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
-
-###############################################################################
-
-Project: "Doxytag"=".\Doxytag.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
- begin source code control
- Doxytag
- .
- end source code control
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Global:
-
-Package=<5>
-{{{
-}}}
-
-Package=<3>
-{{{
-}}}
-
-###############################################################################
-
diff --git a/wintools/README b/wintools/README
deleted file mode 100644
index 36f9f57..0000000
--- a/wintools/README
+++ /dev/null
@@ -1,20 +0,0 @@
-The files Doxygen.dsw and Doxygen.dsp can
-be used to build Doxygen from within
-Microsoft's Developer Studio 6.0, and
-converted for use with DevStudio .NET.
-
-The project has since been partitioned
-so that there are also separate project
-files for the Doxysearch and Doxytag tools
-and for the three libraries zlib, libpng
-and qtools. Credit for this update is due
-to Jorge Ramos for the original idea, and
-Johan Eriksson <johan.r.eriksson@ericsson.com>
-for the current implementation.
-
-These files are maintained by Simon N Goodwin
-<simon.goodwin@atd.co.uk>. Please contact him
-in the event of questions or problems with
-these files.
-
-
diff --git a/wintools/libpng.dsp b/wintools/libpng.dsp
deleted file mode 100644
index a6a7f81..0000000
--- a/wintools/libpng.dsp
+++ /dev/null
@@ -1,188 +0,0 @@
-# Microsoft Developer Studio Project File - Name="libpng" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Static Library" 0x0104
-
-CFG=libpng - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "libpng.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "libpng.mak" CFG="libpng - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "libpng - Win32 Release" (based on "Win32 (x86) Static Library")
-!MESSAGE "libpng - Win32 Debug" (based on "Win32 (x86) Static Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-CPP=cl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "libpng - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "Release"
-# PROP Intermediate_Dir "Release"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
-# ADD CPP /nologo /W3 /GX /O2 /I "..\libpng" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /FD /c
-# SUBTRACT CPP /YX
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo
-
-!ELSEIF "$(CFG)" == "libpng - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug"
-# PROP Intermediate_Dir "Debug"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
-# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\libpng" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /FD /I /GZ /c
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo
-
-!ENDIF
-
-# Begin Target
-
-# Name "libpng - Win32 Release"
-# Name "libpng - Win32 Debug"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
-# Begin Source File
-
-SOURCE=..\libpng\png.c
-
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\pngerror.c
-
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\pnggccrd.c
-
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\pngget.c
-
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\pngmem.c
-
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\pngpread.c
-
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\pngread.c
-
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\pngrio.c
-
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\pngrtran.c
-
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\pngrutil.c
-
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\pngset.c
-
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\pngtrans.c
-
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\pngvcrd.c
-
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\pngwio.c
-
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\pngwrite.c
-
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\pngwtran.c
-
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\pngwutil.c
-
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl"
-# Begin Source File
-
-SOURCE=..\libpng\png.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\pngasmrd.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\pngconf.h
-# End Source File
-# End Group
-# End Target
-# End Project
diff --git a/wintools/libpng.dsw b/wintools/libpng.dsw
deleted file mode 100644
index 353ef6c..0000000
--- a/wintools/libpng.dsw
+++ /dev/null
@@ -1,29 +0,0 @@
-Microsoft Developer Studio Workspace File, Format Version 6.00
-# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
-
-###############################################################################
-
-Project: "libpng"=".\libpng.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Global:
-
-Package=<5>
-{{{
-}}}
-
-Package=<3>
-{{{
-}}}
-
-###############################################################################
-
diff --git a/wintools/make.pl b/wintools/make.pl
deleted file mode 100755
index 871c381..0000000
--- a/wintools/make.pl
+++ /dev/null
@@ -1,39 +0,0 @@
-# make script used to create a config file for windows
-
-$target = shift @ARGV;
-$make = "make";
-if ($target eq "msvc")
-{
- $make = "nmake";
-}
-
-use Cwd;
-
-# get current working directory
-$pwd=cwd();
-
-# work-around slashes problems for nmake
-if ($target eq "msvc")
-{
- $pwd=~s{/}{\\}g;
-}
-
-# create config file
-open(FILE,">makeconfig") || die "Cannot create file makeconfig!";
-
-print FILE "DOXYGEN = \"$pwd\"\n";
-print FILE "TMAKEPATH = \"$pwd\\tmake\\lib\\win32-$target\"\n";
-print FILE "TMAKE = \"$pwd\\tmake\\bin\\tmake\"\n";
-print FILE "MAKE = $make\n";
-print FILE "PERL = perl\n";
-print FILE "RM = del /s /q\n";
-print FILE "CP = copy\n";
-print FILE "VERSION = ";
-
-# copy contents of VERSION file to FILE
-open(VERFILE,"<VERSION") || die "Cannot open file VERSION for reading!";
-while (<VERFILE>) {
- print FILE $_;
-}
-close VERFILE;
-close FILE;
diff --git a/wintools/qtools.dsp b/wintools/qtools.dsp
deleted file mode 100644
index 83b6cb8..0000000
--- a/wintools/qtools.dsp
+++ /dev/null
@@ -1,359 +0,0 @@
-# Microsoft Developer Studio Project File - Name="qtools" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Static Library" 0x0104
-
-CFG=qtools - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "qtools.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "qtools.mak" CFG="qtools - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "qtools - Win32 Release" (based on "Win32 (x86) Static Library")
-!MESSAGE "qtools - Win32 Debug" (based on "Win32 (x86) Static Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-CPP=cl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "qtools - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "Release"
-# PROP Intermediate_Dir "Release"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
-# ADD CPP /nologo /W3 /GX /O2 /I "..\qtools" /D "QT_NO_CODECS" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /FD /c
-# SUBTRACT CPP /YX
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo
-
-!ELSEIF "$(CFG)" == "qtools - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug"
-# PROP Intermediate_Dir "Debug"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
-# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\qtools" /D "QT_NO_CODECS" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /FD /I /GZ /c
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo
-
-!ENDIF
-
-# Begin Target
-
-# Name "qtools - Win32 Release"
-# Name "qtools - Win32 Debug"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
-# Begin Source File
-
-SOURCE=..\qtools\qbuffer.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qcollection.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\scstring.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qdatastream.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qdatetime.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qdir.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qdir_win32.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qfile.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qfile_win32.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qfileinfo.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qfileinfo_win32.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qgarray.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qgdict.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qglist.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qglobal.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qgcache.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qgvector.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qiodevice.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qmap.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qregexp.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qstring.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qstringlist.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qtextcodec.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qtextstream.cpp
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qxml.cpp
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl"
-# Begin Source File
-
-SOURCE=..\qtools\qarray.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qasciidict.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qbuffer.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qcollection.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qconfig.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qcstring.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qdatastream.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qdatetime.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qdict.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qdir.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qfeatures.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qfile.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qfiledefs_p.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qfileinfo.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qgarray.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qgdict.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qgeneric.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qglist.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qglobal.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qgvector.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qintdict.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qiodevice.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qlist.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qmap.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qmodules.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qptrdict.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qqueue.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qregexp.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qshared.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qsortedlist.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qstack.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qstring.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qstringlist.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qstrlist.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qstrvec.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qtextcodec.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qtextstream.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qtl.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qvaluelist.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qvaluestack.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qvector.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\qtools\qxml.h
-# End Source File
-# End Group
-# End Target
-# End Project
diff --git a/wintools/qtools.dsw b/wintools/qtools.dsw
deleted file mode 100644
index 2549ea2..0000000
--- a/wintools/qtools.dsw
+++ /dev/null
@@ -1,33 +0,0 @@
-Microsoft Developer Studio Workspace File, Format Version 6.00
-# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
-
-###############################################################################
-
-Project: "qtools"=".\qtools.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
- begin source code control
- qtools
- .
- end source code control
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Global:
-
-Package=<5>
-{{{
-}}}
-
-Package=<3>
-{{{
-}}}
-
-###############################################################################
-
diff --git a/wintools/zlib.dsp b/wintools/zlib.dsp
deleted file mode 100644
index b80c5fc..0000000
--- a/wintools/zlib.dsp
+++ /dev/null
@@ -1,191 +0,0 @@
-# Microsoft Developer Studio Project File - Name="zlib" - Package Owner=<4>
-# Microsoft Developer Studio Generated Build File, Format Version 6.00
-# ** DO NOT EDIT **
-
-# TARGTYPE "Win32 (x86) Static Library" 0x0104
-
-CFG=zlib - Win32 Debug
-!MESSAGE This is not a valid makefile. To build this project using NMAKE,
-!MESSAGE use the Export Makefile command and run
-!MESSAGE
-!MESSAGE NMAKE /f "zlib.mak".
-!MESSAGE
-!MESSAGE You can specify a configuration when running NMAKE
-!MESSAGE by defining the macro CFG on the command line. For example:
-!MESSAGE
-!MESSAGE NMAKE /f "zlib.mak" CFG="zlib - Win32 Debug"
-!MESSAGE
-!MESSAGE Possible choices for configuration are:
-!MESSAGE
-!MESSAGE "zlib - Win32 Release" (based on "Win32 (x86) Static Library")
-!MESSAGE "zlib - Win32 Debug" (based on "Win32 (x86) Static Library")
-!MESSAGE
-
-# Begin Project
-# PROP AllowPerConfigDependencies 0
-CPP=cl.exe
-RSC=rc.exe
-
-!IF "$(CFG)" == "zlib - Win32 Release"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 0
-# PROP BASE Output_Dir "Release"
-# PROP BASE Intermediate_Dir "Release"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 0
-# PROP Output_Dir "Release"
-# PROP Intermediate_Dir "Release"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
-# ADD CPP /nologo /W3 /GX /O2 /I "..\libpng" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /FD /c
-# SUBTRACT CPP /YX
-# ADD BASE RSC /l 0x409 /d "NDEBUG"
-# ADD RSC /l 0x409 /d "NDEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo
-
-!ELSEIF "$(CFG)" == "zlib - Win32 Debug"
-
-# PROP BASE Use_MFC 0
-# PROP BASE Use_Debug_Libraries 1
-# PROP BASE Output_Dir "Debug"
-# PROP BASE Intermediate_Dir "Debug"
-# PROP BASE Target_Dir ""
-# PROP Use_MFC 0
-# PROP Use_Debug_Libraries 1
-# PROP Output_Dir "Debug"
-# PROP Intermediate_Dir "Debug"
-# PROP Target_Dir ""
-# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
-# ADD CPP /nologo /W3 /Gm /GX /ZI /Od /I "..\libpng" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /FD /I /GZ /c
-# ADD BASE RSC /l 0x409 /d "_DEBUG"
-# ADD RSC /l 0x409 /d "_DEBUG"
-BSC32=bscmake.exe
-# ADD BASE BSC32 /nologo
-# ADD BSC32 /nologo
-LIB32=link.exe -lib
-# ADD BASE LIB32 /nologo
-# ADD LIB32 /nologo
-
-!ENDIF
-
-# Begin Target
-
-# Name "zlib - Win32 Release"
-# Name "zlib - Win32 Debug"
-# Begin Group "Source Files"
-
-# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
-# Begin Source File
-
-SOURCE=..\libpng\adler32.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\compress.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\crc32.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\deflate.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\gzio.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\infblock.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\infcodes.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\inffast.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\inflate.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\inftrees.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\infutil.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\trees.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\uncompr.c
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\zutil.c
-# End Source File
-# End Group
-# Begin Group "Header Files"
-
-# PROP Default_Filter "h;hpp;hxx;hm;inl"
-# Begin Source File
-
-SOURCE=..\libpng\deflate.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\infblock.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\infcodes.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\inffast.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\inffixed.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\inftrees.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\infutil.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\trees.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\zconf.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\zlib.h
-# End Source File
-# Begin Source File
-
-SOURCE=..\libpng\zutil.h
-# End Source File
-# End Group
-# End Target
-# End Project
diff --git a/wintools/zlib.dsw b/wintools/zlib.dsw
deleted file mode 100644
index 7a57279..0000000
--- a/wintools/zlib.dsw
+++ /dev/null
@@ -1,33 +0,0 @@
-Microsoft Developer Studio Workspace File, Format Version 6.00
-# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
-
-###############################################################################
-
-Project: "zlib"=".\zlib.dsp" - Package Owner=<4>
-
-Package=<5>
-{{{
- begin source code control
- zlib
- .
- end source code control
-}}}
-
-Package=<4>
-{{{
-}}}
-
-###############################################################################
-
-Global:
-
-Package=<5>
-{{{
-}}}
-
-Package=<3>
-{{{
-}}}
-
-###############################################################################
-